struct _E_Policy_Cbhm
{
E_Client *ec; /* cbhm service client */
+ E_Zone *zone;
Eina_Bool show_block;
Eina_List *hooks;
Eina_List *intercept_hooks;
+ Eina_List *events;
};
static E_Policy_Cbhm *_pol_cbhm = NULL;
static void
_cbhm_free(E_Policy_Cbhm *cbhm)
{
+ E_FREE_LIST(cbhm->events, ecore_event_handler_del);
E_FREE_LIST(cbhm->hooks, e_client_hook_del);
E_FREE_LIST(cbhm->intercept_hooks, e_comp_object_intercept_hook_del);
E_FREE(_pol_cbhm);
}
static Eina_Bool
+_cbhm_cb_client_zone_set(void *data, int type EINA_UNUSED, void *event)
+{
+ E_Policy_Cbhm *cbhm;
+ E_Event_Client_Zone_Set *ev;
+
+ cbhm = data;
+ ev = event;
+
+ if (cbhm->ec != ev->ec)
+ goto end;
+
+ if (cbhm->zone == ev->zone)
+ goto end;
+
+ ELOGF("CBHM", "Change Zone | taskbar_service %p old(%p) new(%p)",
+ cbhm->ec, cbhm, cbhm->zone, ev->zone);
+
+ cbhm->zone = ev->zone;
+
+end:
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
_cbhm_intercept_hook_show(void *d, E_Client *ec)
{
E_Policy_Cbhm *cbhm;
_e_cbhm_vis_change(E_Policy_Cbhm *cbhm, Eina_Bool vis)
{
E_Client *ec;
+ E_Zone *zone;
Eina_Bool cur_vis = EINA_FALSE;
int x, y, w, h;
ec = cbhm->ec;
+ zone = cbhm->zone;
evas_object_geometry_get(ec->frame, &x, &y, &w, &h);
- if (E_INTERSECTS(x, y, w, h, ec->zone->x, ec->zone->y, ec->zone->w, ec->zone->h))
+ if (E_INTERSECTS(x, y, w, h, zone->x, zone->y, zone->w, zone->h))
cur_vis = evas_object_visible_get(ec->frame);
if (cur_vis == vis)
_pol_cbhm = cbhm;
cbhm->ec = ec;
+ cbhm->zone = e_comp_zone_find_by_ec(ec);
cbhm->show_block = EINA_TRUE;
// set skip iconify
evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_SHOW, _cbhm_cb_evas_show, cbhm);
E_CLIENT_HOOK_APPEND(cbhm->hooks, E_CLIENT_HOOK_DEL, _cbhm_hook_client_del, cbhm);
+ E_LIST_HANDLER_APPEND(cbhm->events, E_EVENT_CLIENT_ZONE_SET, _cbhm_cb_client_zone_set, cbhm);
E_COMP_OBJECT_INTERCEPT_HOOK_APPEND(cbhm->intercept_hooks, E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER, _cbhm_intercept_hook_show, cbhm);
}