diff --git a/src/bin/e_gadcon_popup.c b/src/bin/e_gadcon_popup.c index 0a35970db..f8ba4059a 100644 --- a/src/bin/e_gadcon_popup.c +++ b/src/bin/e_gadcon_popup.c @@ -6,6 +6,9 @@ /* local subsystem functions */ static void _e_gadcon_popup_free(E_Gadcon_Popup *pop); static void _e_gadcon_popup_locked_set(E_Gadcon_Popup *pop, Eina_Bool locked); +static void _e_gadcon_popup_size_recalc(E_Gadcon_Popup *pop, Evas_Object *obj, Eina_Bool skip_resize); +static void _e_gadcon_popup_position(E_Gadcon_Popup *pop); +static void _e_gadcon_popup_changed_size_hints_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); /* externally accessible functions */ @@ -40,7 +43,6 @@ e_gadcon_popup_new(E_Gadcon_Client *gcc, void (*resize_func) (Evas_Object *obj, EAPI void e_gadcon_popup_content_set(E_Gadcon_Popup *pop, Evas_Object *o) { - Evas_Coord w = 0, h = 0; Evas_Object *old_o; if (!pop) return; @@ -53,26 +55,16 @@ e_gadcon_popup_content_set(E_Gadcon_Popup *pop, Evas_Object *o) edje_object_part_unswallow(pop->o_bg, old_o); evas_object_del(old_o); } - e_widget_min_size_get(o, &w, &h); - if ((!w) || (!h)) evas_object_size_hint_min_get(o, &w, &h); - if ((!w) || (!h)) - { - edje_object_size_min_get(o, &w, &h); - edje_object_size_min_restricted_calc(o, &w, &h, w, h); - } - if (pop->resize_func) pop->resize_func(o, &w, &h); - edje_extern_object_min_size_set(o, w, h); edje_object_part_swallow(pop->o_bg, "e.swallow.content", o); - edje_object_size_min_calc(pop->o_bg, &pop->w, &pop->h); - evas_object_resize(pop->o_bg, pop->w, pop->h); + evas_object_event_callback_add(o, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _e_gadcon_popup_changed_size_hints_cb, pop); + + _e_gadcon_popup_size_recalc(pop, o, EINA_FALSE); } EAPI void e_gadcon_popup_show(E_Gadcon_Popup *pop) { - Evas_Coord gx, gy, gw, gh, zw, zh, zx, zy; - Evas_Coord px, py; - if (!pop) return; E_OBJECT_CHECK(pop); E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE); @@ -81,6 +73,103 @@ e_gadcon_popup_show(E_Gadcon_Popup *pop) e_popup_show(pop->win); + _e_gadcon_popup_position(pop); +} + +EAPI void +e_gadcon_popup_hide(E_Gadcon_Popup *pop) +{ + if (!pop) return; + E_OBJECT_CHECK(pop); + E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE); + if (pop->pinned) return; + e_popup_hide(pop->win); + if (pop->gadcon_was_locked) + _e_gadcon_popup_locked_set(pop, 0); +} + +EAPI void +e_gadcon_popup_toggle_pinned(E_Gadcon_Popup *pop) +{ + if (!pop) return; + E_OBJECT_CHECK(pop); + E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE); + + if (pop->pinned) + { + pop->pinned = 0; + edje_object_signal_emit(pop->o_bg, "e,state,unpinned", "e"); + } + else + { + pop->pinned = 1; + edje_object_signal_emit(pop->o_bg, "e,state,pinned", "e"); + } +} + +EAPI void +e_gadcon_popup_lock_set(E_Gadcon_Popup *pop, Eina_Bool setting) +{ + if (!pop) return; + E_OBJECT_CHECK(pop); + E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE); + + setting = !!setting; + if (pop->gadcon_lock == setting) return; + pop->gadcon_lock = setting; + + if (setting != pop->gadcon_was_locked) + _e_gadcon_popup_locked_set(pop, setting); +} + +/* local subsystem functions */ + +static void +_e_gadcon_popup_free(E_Gadcon_Popup *pop) +{ + if (pop->gadcon_was_locked) + _e_gadcon_popup_locked_set(pop, 0); + pop->gcc = NULL; + e_object_del(E_OBJECT(pop->win)); + free(pop); +} + +static void +_e_gadcon_popup_locked_set(E_Gadcon_Popup *pop, Eina_Bool locked) +{ + if (!pop->gcc) + return; + + e_gadcon_locked_set(pop->gcc->gadcon, locked); + pop->gadcon_was_locked = locked; +} + +static void +_e_gadcon_popup_size_recalc(E_Gadcon_Popup *pop, Evas_Object *obj, Eina_Bool skip_resize) +{ + Evas_Coord w = 0, h = 0; + + e_widget_min_size_get(obj, &w, &h); + if ((!w) || (!h)) evas_object_size_hint_min_get(obj, &w, &h); + if ((!w) || (!h)) + { + edje_object_size_min_get(obj, &w, &h); + edje_object_size_min_restricted_calc(obj, &w, &h, w, h); + } + if (pop->resize_func && !skip_resize) pop->resize_func(obj, &w, &h); + edje_extern_object_min_size_set(obj, w, h); + edje_object_size_min_calc(pop->o_bg, &pop->w, &pop->h); + evas_object_resize(pop->o_bg, pop->w, pop->h); + + if (pop->win->visible) + _e_gadcon_popup_position(pop); +} + +static void +_e_gadcon_popup_position(E_Gadcon_Popup *pop) +{ + Evas_Coord gx, gy, gw, gh, zw, zh, zx, zy, px, py; + /* Popup positioning */ e_gadcon_client_geometry_get(pop->gcc, &gx, &gy, &gw, &gh); zx = pop->gcc->gadcon->zone->x; @@ -150,70 +239,10 @@ e_gadcon_popup_show(E_Gadcon_Popup *pop) _e_gadcon_popup_locked_set(pop, 1); } -EAPI void -e_gadcon_popup_hide(E_Gadcon_Popup *pop) -{ - if (!pop) return; - E_OBJECT_CHECK(pop); - E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE); - if (pop->pinned) return; - e_popup_hide(pop->win); - if (pop->gadcon_was_locked) - _e_gadcon_popup_locked_set(pop, 0); -} - -EAPI void -e_gadcon_popup_toggle_pinned(E_Gadcon_Popup *pop) -{ - if (!pop) return; - E_OBJECT_CHECK(pop); - E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE); - - if (pop->pinned) - { - pop->pinned = 0; - edje_object_signal_emit(pop->o_bg, "e,state,unpinned", "e"); - } - else - { - pop->pinned = 1; - edje_object_signal_emit(pop->o_bg, "e,state,pinned", "e"); - } -} - -EAPI void -e_gadcon_popup_lock_set(E_Gadcon_Popup *pop, Eina_Bool setting) -{ - if (!pop) return; - E_OBJECT_CHECK(pop); - E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE); - - setting = !!setting; - if (pop->gadcon_lock == setting) return; - pop->gadcon_lock = setting; - - if (setting != pop->gadcon_was_locked) - _e_gadcon_popup_locked_set(pop, setting); -} - -/* local subsystem functions */ - static void -_e_gadcon_popup_free(E_Gadcon_Popup *pop) +_e_gadcon_popup_changed_size_hints_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { - if (pop->gadcon_was_locked) - _e_gadcon_popup_locked_set(pop, 0); - pop->gcc = NULL; - e_object_del(E_OBJECT(pop->win)); - free(pop); -} + E_Gadcon_Popup *pop = data; -static void -_e_gadcon_popup_locked_set(E_Gadcon_Popup *pop, Eina_Bool locked) -{ - if (!pop->gcc) - return; - - e_gadcon_locked_set(pop->gcc->gadcon, locked); - pop->gadcon_was_locked = locked; + _e_gadcon_popup_size_recalc(pop, obj, EINA_TRUE); }