diff --git a/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h b/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h index 248aedb561..e0c351b231 100644 --- a/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h +++ b/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h @@ -661,6 +661,26 @@ EAPI void ecore_evas_maximized_set(Ecore_Evas *ee, Eina_Bool on); * @see ecore_evas_maximized_set() */ EAPI Eina_Bool ecore_evas_maximized_get(const Ecore_Evas *ee); +/** + * @brief Set Ecore_Evas's window profile list. + * + * @param ee The Ecore_Evas + * @param profiles The profile name list + * @param num_profiles The number of profile names + * + * @warning Support for this depends on the underlying windowing system. + * @since 1.3.0 + */ +EAPI void ecore_evas_profiles_set(Ecore_Evas *ee, const char **profiles, unsigned int num_profiles); +/** + * @brief Get Ecore_Evas's window profile name. + * + * @param ee The Ecore_Evas + * @return The profile name + * + * @since 1.3.0 + */ +EAPI const char *ecore_evas_profile_get(const Ecore_Evas *ee); /** * @brief Move an Ecore_Evas. * 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 9067adf39c..105021b3bb 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c @@ -515,6 +515,7 @@ static Ecore_Evas_Engine_Func _ecore_buffer_engine_func = NULL, _ecore_evas_buffer_alpha_set, NULL, //transparent + NULL, // profiles_set NULL, NULL, 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 0947b11106..016e19eb26 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_cocoa.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_cocoa.c @@ -463,6 +463,7 @@ static Ecore_Evas_Engine_Func _ecore_cocoa_engine_func = NULL, NULL, NULL, //transparent + NULL, // profiles_set NULL, NULL, 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 c11167e7d0..074ce6706c 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c @@ -489,6 +489,7 @@ static Ecore_Evas_Engine_Func _ecore_directfb_engine_func = NULL, /* ignore events */ NULL, /* alpha */ NULL, //transparent + NULL, // profiles_set NULL, NULL, 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 47d90f0466..b612830283 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_ews.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_ews.c @@ -683,6 +683,7 @@ static const Ecore_Evas_Engine_Func _ecore_ews_engine_func = _ecore_evas_ews_ignore_events_set, _ecore_evas_ews_alpha_set, _ecore_evas_ews_transparent_set, + NULL, // profiles_set NULL, NULL, 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 032484a341..d80eca76f8 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_extn.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_extn.c @@ -2003,6 +2003,7 @@ static const Ecore_Evas_Engine_Func _ecore_extn_socket_engine_func = NULL, _ecore_evas_extn_socket_alpha_set, NULL, //transparent + NULL, // profiles_set NULL, NULL, 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 3fc8acfa1e..f8b8b867ba 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c @@ -551,6 +551,7 @@ static Ecore_Evas_Engine_Func _ecore_fb_engine_func = NULL, NULL, NULL, //transparent + NULL, // profiles_set NULL, NULL, 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 ba75e5561d..e478ad2183 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h @@ -177,6 +177,7 @@ struct _Ecore_Evas_Engine_Func void (*fn_ignore_events_set) (Ecore_Evas *ee, int ignore); void (*fn_alpha_set) (Ecore_Evas *ee, int alpha); void (*fn_transparent_set) (Ecore_Evas *ee, int transparent); + void (*fn_profiles_set) (Ecore_Evas *ee, const char **profiles, int num_profiles); void (*fn_window_group_set) (Ecore_Evas *ee, const Ecore_Evas *ee_group); void (*fn_aspect_set) (Ecore_Evas *ee, double aspect); @@ -330,6 +331,7 @@ struct _Ecore_Evas char *title; char *name; char *clas; + char *profile; struct { int w, h; } min, @@ -396,6 +398,7 @@ struct _Ecore_Evas unsigned char no_comp_sync : 1; unsigned char semi_sync : 1; unsigned char deleted : 1; + int gl_sync_draw_done; // added by gl77.lee }; void _ecore_evas_ref(Ecore_Evas *ee); 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 038654a9d5..02c6a69365 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_psl1ght.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_psl1ght.c @@ -395,6 +395,7 @@ static Ecore_Evas_Engine_Func _ecore_psl1ght_engine_func = NULL, NULL, NULL, //transparent + NULL, // profiles_set NULL, NULL, 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 d2503fe02d..1ca6f2b78c 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_sdl.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_sdl.c @@ -431,6 +431,7 @@ static Ecore_Evas_Engine_Func _ecore_sdl_engine_func = NULL, NULL, NULL, //transparent + NULL, // profiles_set NULL, NULL, 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 46bbf0f671..dd203b80c0 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 @@ -2,7 +2,7 @@ # include "config.h" #endif -#define LOGFNS 1 +//#define LOGFNS 1 #ifdef LOGFNS # include @@ -143,6 +143,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func = _ecore_evas_wl_ignore_events_set, _ecore_evas_wl_alpha_set, _ecore_evas_wl_transparent_set, + NULL, // func profiles set NULL, NULL, NULL, 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 a94c0f08d4..333c272251 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 @@ -148,6 +148,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func = _ecore_evas_wl_ignore_events_set, _ecore_evas_wl_alpha_set, _ecore_evas_wl_transparent_set, + NULL, // func profiles set NULL, // window group set NULL, // aspect set NULL, // urgent set 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 c0f70a24b0..ff3fe5c816 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_win32.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_win32.c @@ -1072,6 +1072,7 @@ static Ecore_Evas_Engine_Func _ecore_win32_engine_func = NULL, /* _ecore_evas_x_ignore_events_set */ _ecore_evas_win32_alpha_set, NULL, //transparent + NULL, // profiles_set NULL, NULL, 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 fecf26b26d..2bbd1bd115 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wince.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wince.c @@ -772,6 +772,7 @@ static Ecore_Evas_Engine_Func _ecore_wince_engine_func = NULL, /* _ecore_evas_x_ignore_events_set */ NULL, /* _ecore_evas_x_alpha_set */ NULL, //transparent + NULL, // profiles_set NULL, NULL, 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 c0ec2ba41f..feb812cc9b 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c @@ -102,6 +102,8 @@ _ecore_evas_x_protocols_set(Ecore_Evas *ee) static void _ecore_evas_x_sync_set(Ecore_Evas *ee) { + Ecore_X_Sync_Counter sync_counter = ee->engine.x.sync_counter; + if (((ee->should_be_visible) || (ee->visible)) && ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) && (!ee->no_comp_sync) && (_ecore_evas_app_comp_sync))) @@ -112,9 +114,13 @@ _ecore_evas_x_sync_set(Ecore_Evas *ee) else { if (ee->engine.x.sync_counter) + { ecore_x_sync_counter_free(ee->engine.x.sync_counter); + ee->engine.x.sync_val = 0; + } ee->engine.x.sync_counter = 0; } + if (sync_counter != ee->engine.x.sync_counter) ecore_x_e_comp_sync_counter_set(ee->prop.window, ee->engine.x.sync_counter); } @@ -123,6 +129,7 @@ _ecore_evas_x_sync_clear(Ecore_Evas *ee) { if (!ee->engine.x.sync_counter) return; ecore_x_sync_counter_free(ee->engine.x.sync_counter); + ee->engine.x.sync_val = 0; ee->engine.x.sync_counter = 0; } @@ -709,6 +716,34 @@ _ecore_evas_x_event_property_change(void *data __UNUSED__, int type __UNUSED__, break; } } + else if (e->atom == ECORE_X_ATOM_E_PROFILE) + { + char *p = ecore_x_e_window_profile_get(e->win); + if ((p) && (ee->prop.profile)) + { + if (strcmp(p, ee->prop.profile) != 0) + { + free(ee->prop.profile); + ee->prop.profile = strdup(p); + state_change = 1; + } + } + else if ((!p) && (ee->prop.profile)) + { + free(ee->prop.profile); + ee->prop.profile = NULL; + state_change = 1; + } + else if ((p) && (!ee->prop.profile)) + { + ee->prop.profile = strdup(p); + state_change = 1; + } + + if (p) + free(p); + } + if (state_change) { if (ee->func.fn_state_change) ee->func.fn_state_change(ee); @@ -1115,6 +1150,17 @@ _ecore_evas_x_event_window_show(void *data __UNUSED__, int type __UNUSED__, void ee = ecore_event_window_match(e->win); if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */ if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; + /* some GL drivers are doing buffer copy in a separate thread. + * we need to check whether GL driver sends SYNC_DRAW_DONE msg afger copying + * that are required in order to exactly render. - added by gl77.lee + */ + if (ee->gl_sync_draw_done < 0) + { + if (getenv("ECORE_EVAS_GL_SYNC_DRAW_DONE")) + ee->gl_sync_draw_done = atoi(getenv("ECORE_EVAS_GL_SYNC_DRAW_DONE")); + else + ee->gl_sync_draw_done = 0; + } if (first_map_bug < 0) { char *bug = NULL; @@ -1671,14 +1717,41 @@ _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize, } } +#define _USE_WIN_ROT_EFFECT 1 + +#if _USE_WIN_ROT_EFFECT +static void _ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__); + +typedef struct _Ecore_Evas_X_Rotation_Effect Ecore_Evas_X_Rotation_Effect; +struct _Ecore_Evas_X_Rotation_Effect +{ + Eina_Bool wait_for_comp_reply; +}; + +static Ecore_Evas_X_Rotation_Effect _rot_effect = +{ + EINA_FALSE +}; + +static void +_ecore_evas_x_rotation_effect_setup(void) +{ + _rot_effect.wait_for_comp_reply = EINA_TRUE; +} +#endif /* end of _USE_WIN_ROT_EFFECT */ + static void _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize) { + if (ee->rotation == rotation) return; + if (!strcmp(ee->driver, "xrender_x11")) return; + +#if _USE_WIN_ROT_EFFECT int angles[2]; angles[0] = rotation; angles[1] = ee->rotation; +#endif /* end of _USE_WIN_ROT_EFFECT */ - if (ee->rotation == rotation) return; if (!strcmp(ee->driver, "opengl_x11")) { #ifdef BUILD_ECORE_EVAS_OPENGL_X11 @@ -1689,9 +1762,15 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize) einfo->info.rotation = rotation; _ecore_evas_x_rotation_set_internal(ee, rotation, resize, (Evas_Engine_Info *)einfo); +# if _USE_WIN_ROT_EFFECT ecore_x_window_prop_property_set(ee->prop.window, ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, ECORE_X_ATOM_CARDINAL, 32, &angles, 2); +# else + ecore_x_window_prop_property_set(ee->prop.window, + ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, + ECORE_X_ATOM_CARDINAL, 32, &rotation, 1); +# endif #endif /* BUILD_ECORE_EVAS_OPENGL_X11 */ } else if (!strcmp(ee->driver, "software_x11")) @@ -1704,9 +1783,15 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize) einfo->info.rotation = rotation; _ecore_evas_x_rotation_set_internal(ee, rotation, resize, (Evas_Engine_Info *)einfo); +# if _USE_WIN_ROT_EFFECT ecore_x_window_prop_property_set(ee->prop.window, ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, ECORE_X_ATOM_CARDINAL, 32, &angles, 2); +# else + ecore_x_window_prop_property_set(ee->prop.window, + ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, + ECORE_X_ATOM_CARDINAL, 32, &rotation, 1); +# endif #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */ } else if (!strcmp(ee->driver, "software_16_x11")) @@ -1719,9 +1804,15 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize) einfo->info.rotation = rotation; _ecore_evas_x_rotation_set_internal(ee, rotation, resize, (Evas_Engine_Info *)einfo); +# if _USE_WIN_ROT_EFFECT ecore_x_window_prop_property_set(ee->prop.window, ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, ECORE_X_ATOM_CARDINAL, 32, &angles, 2); +# else + ecore_x_window_prop_property_set(ee->prop.window, + ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, + ECORE_X_ATOM_CARDINAL, 32, &rotation, 1); +# endif #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */ } else if (!strcmp(ee->driver, "software_8_x11")) @@ -1734,11 +1825,29 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize) einfo->info.rotation = rotation; _ecore_evas_x_rotation_set_internal(ee, rotation, resize, (Evas_Engine_Info *)einfo); +# if _USE_WIN_ROT_EFFECT ecore_x_window_prop_property_set(ee->prop.window, ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, ECORE_X_ATOM_CARDINAL, 32, &angles, 2); +# else + ecore_x_window_prop_property_set(ee->prop.window, + ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, + ECORE_X_ATOM_CARDINAL, 32, &rotation, 1); +# endif #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */ } + +#if _USE_WIN_ROT_EFFECT + if ((ee->visible) && + ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) && + (!ee->no_comp_sync) && (_ecore_evas_app_comp_sync)) && + (ee->engine.x.sync_counter) && + (ee->engine.x.sync_val > 0)) + { + _ecore_evas_x_rotation_effect_setup(); + _ecore_evas_x_flush_pre(ee, NULL, NULL); + } +#endif /* end of _USE_WIN_ROT_EFFECT */ } static void @@ -2663,6 +2772,13 @@ _ecore_evas_x_fullscreen_set(Ecore_Evas *ee, int on) _ecore_evas_x_state_update(ee); } +static void +_ecore_evas_x_profiles_set(Ecore_Evas *ee, const char **plist, int n) +{ + /* Ecore_Evas's profile will be updated when WM sets the E_PROFILE. */ + ecore_x_e_window_profile_list_set(ee->prop.window, plist, n); +} + static void _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on) { @@ -2910,6 +3026,7 @@ static Ecore_Evas_Engine_Func _ecore_x_engine_func = _ecore_evas_x_ignore_events_set, _ecore_evas_x_alpha_set, _ecore_evas_x_transparent_set, + _ecore_evas_x_profiles_set, _ecore_evas_x_window_group_set, _ecore_evas_x_aspect_set, @@ -2956,7 +3073,8 @@ _ecore_evas_x_flush_post(void *data, Evas *e __UNUSED__, void *event_info __UNUS { Ecore_Evas *ee = data; - if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync)) + if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync) && + (!ee->gl_sync_draw_done)) // added by gl77.lee { if (ee->engine.x.sync_counter) { @@ -3326,14 +3444,20 @@ ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent, ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS); + ee->gl_sync_draw_done = -1; // added by gl77.lee + _ecore_evas_x_init(); ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func; ee->driver = "opengl_x11"; +#if 1 + ee->semi_sync = 0; // gl engine doesn't need to sync - its whole swaps +#else if (!getenv("ECORE_EVAS_COMP_NOSEMISYNC")) ee->semi_sync = 1; // gl engine doesn't need to sync - its whole swaps // ee->no_comp_sync = 1; // gl engine doesn't need to sync - its whole swaps +#endif if (disp_name) ee->name = strdup(disp_name); if (w < 1) w = 1;