static Eina_Bool ehw_trace = EINA_FALSE;
static Eina_List *hwc_window_client_hooks = NULL;
+static Eina_List *hwc_window_comp_wl_hooks = NULL;
static Eina_List *hwc_window_event_hdlrs = NULL;
static int _e_hwc_window_hooks_delete = 0;
return ECORE_CALLBACK_PASS_ON;
}
+static void
+_e_hwc_window_cb_subsurface_synchronized_commit(void *data, E_Client *ec)
+{
+ E_Client *parent;
+ E_Hwc_Window_State state;
+ Eina_Bool need_sync = EINA_FALSE;
+
+ EINA_SAFETY_ON_NULL_RETURN(ec);
+ if ((!ec->hwc_window) || (!ec->comp_data) || (!ec->comp_data->sub.data)) return;
+
+ state = e_hwc_window_accepted_state_get(ec->hwc_window);
+ if ((state != E_HWC_WINDOW_STATE_DEVICE) && (state != E_HWC_WINDOW_STATE_VIDEO))
+ return;
+
+ parent = ec->comp_data->sub.data->parent;
+ while (parent)
+ {
+ state = e_hwc_window_accepted_state_get(parent->hwc_window);
+ if (state == E_HWC_WINDOW_STATE_CLIENT)
+ {
+ need_sync = EINA_TRUE;
+ break;
+ }
+
+ if ((!parent->comp_data) || (!parent->comp_data->sub.data))
+ break;
+
+ parent = parent->comp_data->sub.data->parent;
+ }
+
+ if (need_sync)
+ e_hwc_window_present_sync(ec->hwc_window);
+}
+
EINTERN Eina_Bool
e_hwc_window_init(void)
{
_e_hwc_window_client_cb_transform_change, NULL);
E_LIST_HANDLER_APPEND(hwc_window_event_hdlrs, E_EVENT_CLIENT_ZONE_SET,
_e_hwc_window_client_cb_zone_set, NULL);
+ E_COMP_WL_HOOK_APPEND(hwc_window_comp_wl_hooks, E_COMP_WL_HOOK_SUBSURFACE_SYNCHRONIZED_COMMIT,
+ _e_hwc_window_cb_subsurface_synchronized_commit, NULL);
return EINA_TRUE;
}
{
E_FREE_LIST(hwc_window_client_hooks, e_client_hook_del);
E_FREE_LIST(hwc_window_event_hdlrs, ecore_event_handler_del);
+ E_FREE_LIST(hwc_window_comp_wl_hooks, e_comp_wl_hook_del);
}
EINTERN E_Hwc_Window *