diff --git a/legacy/ecore/ChangeLog b/legacy/ecore/ChangeLog index d691bb7273..a5b73f53b3 100644 --- a/legacy/ecore/ChangeLog +++ b/legacy/ecore/ChangeLog @@ -804,3 +804,9 @@ * Add event callbacks for Ecore_Imf Input Panel * Add functions to retrieve input panel geometry & state from Ecore_Imf. +2012-07-05 Carsten Haitzler (The Rasterman) + + * Add ecore_evas_screen_dpi_get() + * Fix ecore_evas_screen_geometry_get(0 for x11 to return zone + pos/size as it should. + diff --git a/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h b/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h index e0c351b231..cab9d72cb4 100644 --- a/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h +++ b/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h @@ -1784,6 +1784,7 @@ EAPI void ecore_evas_input_event_unregister(Ecore_Evas *ee); EAPI void ecore_evas_manual_render(Ecore_Evas *ee); EAPI void ecore_evas_comp_sync_set(Ecore_Evas *ee, Eina_Bool do_sync); EAPI Eina_Bool ecore_evas_comp_sync_get(const Ecore_Evas *ee); + /** * @brief Get geometry of screen associated with this Ecore_Evas. * @@ -1797,6 +1798,17 @@ EAPI Eina_Bool ecore_evas_comp_sync_get(const Ecore_Evas *ee); */ EAPI void ecore_evas_screen_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h); +/** + * @brief Get the dpi of the screen the Ecore_Evas is primarily on. + * + * @param ee The Ecore_Evas whose window's to query. + * @param xdpi Pointer to integer to store horizontal DPI. May be @c NULL. + * @param ydpi Pointer to integer to store vertical DPI. May be @c NULL. + * + * @since 1.3 + */ +EAPI void ecore_evas_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi); + EAPI void ecore_evas_draw_frame_set(Ecore_Evas *ee, Eina_Bool draw_frame); EAPI Eina_Bool ecore_evas_draw_frame_get(const Ecore_Evas *ee); diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas.c index 0405cd2411..0cf75c2f51 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas.c @@ -2293,6 +2293,22 @@ ecore_evas_screen_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int IFE; } +EAPI void +ecore_evas_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi) +{ + if (xdpi) *xdpi = 0; + if (ydpi) *ydpi = 0; + if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) + { + ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, + "ecore_evas_screen_geometry_get"); + return; + } + + IFC(ee, fn_screen_dpi_get) (ee, xdpi, ydpi); + IFE; +} + EAPI void ecore_evas_draw_frame_set(Ecore_Evas *ee, Eina_Bool draw_frame) { diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c index 105021b3bb..f15436c5ef 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c @@ -525,7 +525,8 @@ static Ecore_Evas_Engine_Func _ecore_buffer_engine_func = NULL, _ecore_evas_buffer_render, - NULL // screen_geometry_get + NULL, // screen_geometry_get + NULL // screen_dpi_get }; #endif diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_cocoa.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_cocoa.c index 016e19eb26..96ea1d43de 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_cocoa.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_cocoa.c @@ -472,8 +472,9 @@ static Ecore_Evas_Engine_Func _ecore_cocoa_engine_func = NULL, NULL, - NULL, // render - NULL + NULL, // render + NULL, + NULL // screen_dpi_get }; #endif diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c index 074ce6706c..d9fb237bd7 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c @@ -499,7 +499,8 @@ static Ecore_Evas_Engine_Func _ecore_directfb_engine_func = NULL, NULL, // render - NULL // screen_geometry_get + NULL, // screen_geometry_get + NULL // screen_dpi_get }; #endif diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_ews.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_ews.c index b612830283..d6969cf10f 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_ews.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_ews.c @@ -693,7 +693,8 @@ static const Ecore_Evas_Engine_Func _ecore_ews_engine_func = NULL, _ecore_evas_ews_render, - _ecore_evas_ews_screen_geometry_get + _ecore_evas_ews_screen_geometry_get, + NULL // screen_dpi_get }; void diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_extn.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_extn.c index 9e6f07a5e1..5fff70d22f 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_extn.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_extn.c @@ -1128,7 +1128,8 @@ static const Ecore_Evas_Engine_Func _ecore_extn_plug_engine_func = NULL, NULL, // render - NULL // screen_geometry_get + NULL, // screen_geometry_get + NULL // screen_dpi_get }; static Eina_Bool @@ -2013,7 +2014,8 @@ static const Ecore_Evas_Engine_Func _ecore_extn_socket_engine_func = NULL, _ecore_evas_extn_socket_render, // render - NULL // screen_geometry_get + NULL, // screen_geometry_get + NULL, // screen_dpi_get }; #endif diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c index f8b8b867ba..a8200a9292 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c @@ -561,7 +561,8 @@ static Ecore_Evas_Engine_Func _ecore_fb_engine_func = NULL, NULL, // render - NULL // screen_geometry_get + NULL, // screen_geometry_get + NULL // screen_dpi_get }; #endif diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h index e478ad2183..6d45999bd5 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h @@ -188,6 +188,7 @@ struct _Ecore_Evas_Engine_Func int (*fn_render) (Ecore_Evas *ee); void (*fn_screen_geometry_get) (const Ecore_Evas *ee, int *x, int *y, int *w, int *h); + void (*fn_screen_dpi_get) (const Ecore_Evas *ee, int *xdpi, int *ydpi); }; struct _Ecore_Evas_Engine diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_psl1ght.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_psl1ght.c index 02c6a69365..98d570ed6e 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_psl1ght.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_psl1ght.c @@ -405,7 +405,8 @@ static Ecore_Evas_Engine_Func _ecore_psl1ght_engine_func = NULL, NULL, // render - _ecore_evas_screen_geometry_get // screen_geometry_get + _ecore_evas_screen_geometry_get, // screen_geometry_get + NULL // screen_dpi_get }; EAPI Ecore_Evas * diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_sdl.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_sdl.c index 1ca6f2b78c..01bd165e32 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_sdl.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_sdl.c @@ -441,7 +441,8 @@ static Ecore_Evas_Engine_Func _ecore_sdl_engine_func = NULL, NULL, // render - NULL // screen_geometry_get + NULL, // screen_geometry_get + NULL // screen_dpi_get }; static Ecore_Evas* diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c index dd203b80c0..ec21871606 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c @@ -151,7 +151,8 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func = NULL, NULL, _ecore_evas_wl_render, - _ecore_evas_wl_screen_geometry_get + _ecore_evas_wl_screen_geometry_get, + NULL // screen_dpi_get }; /* external variables */ diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c index 333c272251..4734338c39 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c @@ -156,7 +156,8 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func = NULL, // demand attention set NULL, // focus skip set _ecore_evas_wl_render, - _ecore_evas_wl_screen_geometry_get + _ecore_evas_wl_screen_geometry_get, + NULL // screen_dpi_get }; /* external variables */ diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_win32.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_win32.c index ff3fe5c816..4fc748151d 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_win32.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_win32.c @@ -1082,7 +1082,8 @@ static Ecore_Evas_Engine_Func _ecore_win32_engine_func = NULL, NULL, // render - NULL //screen_geometry_get + NULL, //screen_geometry_get + NULL // screen_dpi_get }; #endif /* BUILD_ECORE_EVAS_WIN32 */ diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wince.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wince.c index 2bbd1bd115..0976996f4c 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wince.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wince.c @@ -782,7 +782,8 @@ static Ecore_Evas_Engine_Func _ecore_wince_engine_func = NULL, NULL, // render - NULL // screen_geometry_get + NULL, // screen_geometry_get + NULL // screen_dpi_get }; /* API */ diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c index feb812cc9b..c86cecdda8 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c @@ -2954,9 +2954,63 @@ _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on) static void _ecore_evas_x_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h) { - if (x) *x = 0; - if (y) *y = 0; - ecore_x_screen_size_get(ecore_x_default_screen_get(), w, h); + int outnum = 0; + int px = 0, py = 0, pw = 0, ph = 0; + Ecore_X_Window root; + Ecore_X_Randr_Output *out = NULL; + Ecore_X_Randr_Crtc crtc; + + root = ecore_x_window_root_get(ee->prop.window); + out = ecore_x_randr_window_outputs_get(ee->prop.window, &outnum); + if (!out) + { +norandr: + if (out) free(out); + if (x) *x = 0; + if (y) *y = 0; + ecore_x_window_size_get(root, w, h); + return; + } + crtc = ecore_x_randr_output_crtc_get(root, out[0]); + if (!crtc) goto norandr; + ecore_x_randr_crtc_geometry_get(root, crtc, &px, &py, &pw, &ph); + if ((pw == 0) || (ph == 0)) goto norandr; + if (x) *x = px; + if (y) *y = py; + if (w) *w = pw; + if (h) *h = ph; + free(out); +} + +static void +_ecore_evas_x_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi) +{ + int scdpi, xmm = 0, ymm = 0, outnum = 0, w = 0, h = 0; + int px = 0, py = 0; + Ecore_X_Window root; + Ecore_X_Randr_Output *out = NULL; + Ecore_X_Randr_Crtc crtc; + + root = ecore_x_window_root_get(ee->prop.window); + out = ecore_x_randr_window_outputs_get(ee->prop.window, &outnum); + if (!out) + { +norandr: + if (out) free(out); + scdpi = ecore_x_dpi_get(); + if (xdpi) *xdpi = scdpi; + if (ydpi) *ydpi = scdpi; + return; + } + crtc = ecore_x_randr_output_crtc_get(root, out[0]); + if (!crtc) goto norandr; + ecore_x_randr_crtc_geometry_get(root, crtc, &px, &py, &w, &h); + if ((w == 0) || (h == 0)) goto norandr; + ecore_x_randr_output_size_mm_get(root, out[0], &xmm, &ymm); + if ((xmm == 0) || (ymm == 0)) goto norandr; + if (xdpi) *xdpi = (w * 254) / (xmm * 10); // 25.4mm / inch + if (ydpi) *ydpi = (h * 254) / (ymm * 10); // 25.4mm / inch + free(out); } int @@ -3036,7 +3090,8 @@ static Ecore_Evas_Engine_Func _ecore_x_engine_func = _ecore_evas_x_focus_skip_set, NULL, // render - _ecore_evas_x_screen_geometry_get + _ecore_evas_x_screen_geometry_get, + _ecore_evas_x_screen_dpi_get }; #endif /* BUILD_ECORE_EVAS_X11 */