static Eina_List *rot_cbs = NULL;
static Eina_List *rot_ec_hooks = NULL;
static Eina_List *rot_obj_hooks = NULL;
+static Eina_List *wl_hooks = NULL;
static Ecore_Idle_Enterer *rot_idle_enterer = NULL;
static E_Client *fg_ec = NULL;
if (rot.screen_lock)
{
// do call comp_wl's screen unlock
- DBG("RESUME Rendering");
+ ELOGF("ROTATION", "RENDERING resume", NULL, NULL);
e_comp_canvas_norender_pop();
rot.screen_lock = EINA_FALSE;
}
return ECORE_CALLBACK_RENEW;
}
+static void
+_rot_cb_wl_buffer_change(void *d EINA_UNUSED, E_Client *ec)
+{
+ Policy_Ext_Rotation *rot;
+
+ rot = eina_hash_find(rot_hash, &ec);
+ if (!rot) return;
+ if (ec->e.state.rot.nopending_render) return;
+
+ if (!rot->angle_change_done)
+ {
+ DBG("Update Buffer in progress of rotation ec '%s'(%p) HOOK",
+ ec->icccm.name ? ec->icccm.name : "", ec);
+
+ e_pixmap_image_clear(ec->pixmap, EINA_TRUE);
+ e_pixmap_resource_set(ec->pixmap, NULL);
+ }
+}
+
static Eina_Bool
_rot_cb_buffer_change(void *data EINA_UNUSED, int ev_type EINA_UNUSED, E_Event_Client *ev)
{
*/
if ((!rot->angle_change_done) || (!e_pixmap_resource_get(ev->ec->pixmap)))
{
- DBG("Update Buffer in progress of rotation ec '%s'(%p)",
+ DBG("Update Buffer in progress of rotation ec '%s'(%p) EVENT",
ev->ec->icccm.name ? ev->ec->icccm.name : "", ev->ec);
e_pixmap_image_clear(ev->ec->pixmap, EINA_TRUE);
static Eina_Bool
_rot_cb_idle_enterer(void *data EINA_UNUSED)
{
+ Eina_List *l;
+ E_Client *ec;
+ int n;
+
if (rot.cancel.state)
{
/* there is no border which supports window manager rotation */
if (rot.fetch)
{
- //TODO: consider rot.msgs , X WM use it for e_client message
+ n = eina_list_count(rot.list);
+ if (n == 1)
+ {
+ ec = eina_list_data_get(rot.list);
+ if (ec->e.state.rot.nopending_render == 0)
+ {
+ if (!rot.screen_lock)
+ {
+ ELOGF("ROTATION", "RENDERING pause", NULL, NULL);
+
+ e_pixmap_image_clear(ec->pixmap, 1);
+ e_comp_canvas_norender_push();
+ rot.screen_lock = EINA_TRUE;
+ }
+ }
+ else
+ {
+ if (rot.screen_lock)
+ {
+ ELOGF("ROTATION", "RENDERING resume", NULL, NULL);
+ e_comp_canvas_norender_pop();
+ rot.screen_lock = EINA_FALSE;
+ }
+ }
+ }
// if there is windows over 2 that has to be rotated or is existed window needs resizing,
// lock the screen.
- // but, DO NOT lock the screen when rotation block state
- if (eina_list_count(rot.list) > 1)
+ // but, DO NOT lock the screen when block state by E module
+ else if (n > 1)
{
- Eina_List *l;
- E_Client *ec;
Eina_Bool rot_block = EINA_FALSE;
EINA_LIST_FOREACH(rot.list, l, ec)
}
if ((!rot.screen_lock) && (!rot_block))
{
- DBG("STOP Rendering");
+ ELOGF("ROTATION", "RENDERING pause", NULL, NULL);
EINA_LIST_FOREACH(rot.list, l, ec)
e_pixmap_image_clear(ec->pixmap, 1);
rot.screen_lock = EINA_TRUE;
}
}
- else if (eina_list_count(rot.list) == 0)
+ else
{
- E_Client *ec;
+ /* n == 0 */
Eina_List *zlist = NULL;
- Eina_List *l = NULL;
E_Zone *zone = NULL;
if (rot.async_list)
E_CLIENT_HOOK_APPEND(rot_ec_hooks, E_CLIENT_HOOK_EVAL_FETCH, _rot_hook_eval_fetch, NULL);
E_COMP_OBJECT_INTERCEPT_HOOK_APPEND(rot_obj_hooks, E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER, _rot_intercept_hook_show_helper, NULL);
E_COMP_OBJECT_INTERCEPT_HOOK_APPEND(rot_obj_hooks, E_COMP_OBJECT_INTERCEPT_HOOK_HIDE, _rot_intercept_hook_hide, NULL);
+ E_COMP_WL_HOOK_APPEND(wl_hooks, E_COMP_WL_HOOK_BUFFER_CHANGE, _rot_cb_wl_buffer_change, NULL);
rot_idle_enterer = ecore_idle_enterer_add(_rot_cb_idle_enterer, NULL);
E_FREE_FUNC(rot_hash, eina_hash_free);
E_FREE_FUNC(rot.force_update_list, eina_list_free);
+ E_FREE_LIST(wl_hooks, e_comp_wl_hook_del);
E_FREE_LIST(rot_ec_hooks, e_client_hook_del);
E_FREE_LIST(rot_cbs, ecore_event_handler_del);
E_FREE_LIST(rot_obj_hooks, e_comp_object_intercept_hook_del);