diff --git a/src/bin/e_desklock.c b/src/bin/e_desklock.c index 8f2d62689..8ec92342e 100644 --- a/src/bin/e_desklock.c +++ b/src/bin/e_desklock.c @@ -29,6 +29,7 @@ static Eina_List *show_hooks = NULL; static Eina_List *hide_hooks = NULL; static Evas_Object *block_rects[32] = {NULL}; +static Eina_Bool block_zone[32] = {EINA_FALSE}; static Eina_List *desklock_ifaces = NULL; static E_Desklock_Interface *current_iface = NULL; @@ -302,7 +303,8 @@ e_desklock_show(Eina_Bool suspend) evas_object_color_set(o, 0, 0, 0, 255); evas_object_geometry_set(o, zone->x, zone->y, zone->w, zone->h); evas_object_layer_set(o, E_LAYER_DESKLOCK); - evas_object_show(o); + if (!block_zone[zone->num]) + evas_object_show(o); } if (e_config->desklock_language) e_intl_language_set(e_config->desklock_language); @@ -390,7 +392,10 @@ e_desklock_hide(void) unsigned int n; for (n = 0; n < EINA_C_ARRAY_LENGTH(block_rects); n++) - E_FREE_FUNC(block_rects[n], evas_object_del); + { + E_FREE_FUNC(block_rects[n], evas_object_del); + block_zone[n] = EINA_FALSE; + } } //e_comp_block_window_del(); if (e_config->desklock_language) @@ -698,3 +703,20 @@ _e_desklock_cb_randr(void *data EINA_UNUSED, int type EINA_UNUSED, void *event E e_desklock_show(EINA_FALSE); return ECORE_CALLBACK_PASS_ON; } + +E_API void +e_desklock_zone_block_set(const E_Zone *zone, Eina_Bool block) +{ + EINA_SAFETY_ON_NULL_RETURN(zone); + if (zone->num >= EINA_C_ARRAY_LENGTH(block_rects)) + { + CRI("> %lu screens connected????", EINA_C_ARRAY_LENGTH(block_rects)); + return; + } + block_zone[zone->num] = !!block; + if (!block_rects[zone->num]) return; + if (block) + evas_object_show(block_rects[zone->num]); + else + evas_object_hide(block_rects[zone->num]); +} diff --git a/src/bin/e_desklock.h b/src/bin/e_desklock.h index 0af393236..6bc694e91 100644 --- a/src/bin/e_desklock.h +++ b/src/bin/e_desklock.h @@ -56,6 +56,8 @@ E_API void e_desklock_show_hook_del(E_Desklock_Show_Cb cb); E_API void e_desklock_hide_hook_add(E_Desklock_Hide_Cb cb); E_API void e_desklock_hide_hook_del(E_Desklock_Hide_Cb cb); +E_API void e_desklock_zone_block_set(const E_Zone *zone, Eina_Bool block); + extern E_API int E_EVENT_DESKLOCK; static inline Eina_Bool diff --git a/src/modules/lokker/lokker.c b/src/modules/lokker/lokker.c index 0dea67500..c5fe378b1 100644 --- a/src/modules/lokker/lokker.c +++ b/src/modules/lokker/lokker.c @@ -16,6 +16,8 @@ typedef struct Lokker_Popup Evas_Object *comp_object; Evas_Object *bg_object; Evas_Object *login_box; + Eina_Bool show_anim : 1; + Eina_Bool hide_anim : 1; } Lokker_Popup; typedef struct Lokker_Data @@ -395,6 +397,14 @@ _lokker_popup_add(E_Zone *zone) evas_object_move(lp->bg_object, zone->x, zone->y); evas_object_resize(lp->bg_object, zone->w, zone->h); evas_object_show(lp->bg_object); + { + const char *s; + s = edje_object_data_get(lp->bg_object, "show_signal"); + lp->show_anim = s && (atoi(s) == 1); + e_desklock_zone_block_set(zone, !lp->show_anim); + s = edje_object_data_get(lp->bg_object, "hide_signal"); + lp->hide_anim = s && (atoi(s) == 1); + } lp->comp_object = e_comp_object_util_add(lp->bg_object, 0); { char buf[1024]; @@ -469,11 +479,10 @@ _lokker_cb_hide_done(void *data, Evas_Object *obj, const char *sig EINA_UNUSED, static void _lokker_popup_free(Lokker_Popup *lp) { - const char *s; if (!lp) return; - s = edje_object_data_get(lp->bg_object, "hide_signal"); - if ((s) && (atoi(s) == 1)) + e_desklock_zone_block_set(lp->zone, !lp->hide_anim); + if (lp->hide_anim) { evas_object_data_set(lp->bg_object, "comp_object", lp->comp_object); evas_object_data_set(lp->bg_object, "login_box", lp->login_box);