From 3024562fccee4cc68e310ec4b46b3790f16f2754 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 13 Aug 2013 10:22:24 +0100 Subject: [PATCH] bugfix: setting min size on a gadget now propagates to desktop gadgets --- ChangeLog | 4 +++ NEWS | 1 + src/bin/e_gadcon.c | 7 ++++- src/modules/gadman/e_mod_gadman.c | 51 +++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index b8a07e70b..517d5a9b7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2013-07-26 Mike Blumenkrantz + + * fixed bug where setting min size on a gadget would not be passed to desktop gadgets + 2013-07-26 Mike Blumenkrantz * fixed bug where double clicking filemanager windows would not correctly autosize diff --git a/NEWS b/NEWS index 259e9214c..f3c50a2e5 100644 --- a/NEWS +++ b/NEWS @@ -227,3 +227,4 @@ Fixes: * fixed bug with filemanager setting path with too many spaces when opened from menu * fixed crash when multiple windows shared a remember * fixed bug where double clicking filemanager windows would not correctly autosize + * fixed bug where setting min size on a gadget would not be passed to desktop gadgets diff --git a/src/bin/e_gadcon.c b/src/bin/e_gadcon.c index ec32ab5d8..3f0c2ba5f 100644 --- a/src/bin/e_gadcon.c +++ b/src/bin/e_gadcon.c @@ -3678,7 +3678,12 @@ e_gadcon_layout_pack_min_size_set(Evas_Object *obj, int w, int h) if (!obj) return; bi = evas_object_data_get(obj, "e_gadcon_layout_data"); - if (!bi) return; + if (!bi) + { + evas_object_size_hint_min_set(obj, w, h); + edje_extern_object_min_size_set(obj, w, h); + return; + } if (bi->sd->horizontal) { bi->min.w = w; diff --git a/src/modules/gadman/e_mod_gadman.c b/src/modules/gadman/e_mod_gadman.c index ee77ca75c..5b7996cf0 100644 --- a/src/modules/gadman/e_mod_gadman.c +++ b/src/modules/gadman/e_mod_gadman.c @@ -45,6 +45,9 @@ Manager *Man = NULL; static Eina_List *_gadman_hdls = NULL; static Eina_Hash *_gadman_gadgets = NULL; +/* for locking geometry during our own move/resize */ +static Eina_Bool mover_lock = EINA_FALSE; + /* Implementation */ void gadman_reset(void) @@ -231,6 +234,19 @@ _gadman_gadget_free(void *data __UNUSED__, void *obj) gadman_gadget_edit_end(NULL, NULL, NULL, NULL); } +static void +_gadman_gadget_size_hints_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + E_Gadcon_Client *gcc = data; + int w, h; + + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + w = MAX(w, gcc->min.w); + h = MAX(h, gcc->min.h); + evas_object_resize(gcc->o_frame, w, h); + _save_widget_position(gcc); +} + static E_Gadcon_Client * gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Config_Gadcon_Client *cf, Gadman_Layer_Type layer, E_Zone *zone) { @@ -290,6 +306,8 @@ gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Con edje_object_part_swallow(gcc->o_frame, "e.swallow.content", gcc->o_base); evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOUSE_DOWN, on_frame_click, gcc); + evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _gadman_gadget_size_hints_cb, gcc); gcc->hidden = 1; if (gcc->gadcon->id == ID_GADMAN_LAYER_TOP) @@ -379,6 +397,24 @@ gadman_edit(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *e _apply_widget_position(data); } +static void +_gadman_gadget_edit_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + int w, h; + if (mover_lock) return; + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + evas_object_resize(_get_mover(data), w, h); +} + +static void +_gadman_gadget_edit_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + int x, y; + if (mover_lock) return; + evas_object_geometry_get(obj, &x, &y, NULL, NULL); + evas_object_move(_get_mover(data), x, y); +} + void gadman_gadget_edit_start(E_Gadcon_Client *gcc) { @@ -402,6 +438,8 @@ gadman_gadget_edit_start(E_Gadcon_Client *gcc) mover = _get_mover(gcc); if (!mover) return; evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h); + evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_RESIZE, _gadman_gadget_edit_resize_cb, gcc); + evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOVE, _gadman_gadget_edit_move_cb, gcc); Man->drag_gcc[gcc->gadcon->id - ID_GADMAN_LAYER_BASE] = gcc; evas_object_move(mover, x, y); @@ -434,6 +472,11 @@ gadman_gadget_edit_end(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const EINA_LIST_FOREACH(Man->gadcons[layer], l, gc) gc->editing = 0; drag_gcc = Man->drag_gcc[layer]; + if (drag_gcc) + { + evas_object_event_callback_del_full(drag_gcc->o_frame, EVAS_CALLBACK_RESIZE, _gadman_gadget_edit_resize_cb, drag_gcc); + evas_object_event_callback_del_full(drag_gcc->o_frame, EVAS_CALLBACK_MOVE, _gadman_gadget_edit_move_cb, drag_gcc); + } Man->drag_gcc[layer] = NULL; break; } @@ -1242,6 +1285,7 @@ on_top(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const c drag_gcc = Man->drag_gcc[layer]; mover = _get_mover(drag_gcc); + mover_lock = EINA_TRUE; if (action == DRAG_START) { @@ -1283,6 +1327,7 @@ on_top(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const c evas_object_move(drag_gcc->o_frame, ox, my - drag_gcc->dy); _save_widget_position(drag_gcc); } + mover_lock = EINA_FALSE; } static void @@ -1298,6 +1343,7 @@ on_right(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const drag_gcc = Man->drag_gcc[layer]; mover = _get_mover(drag_gcc); + mover_lock = EINA_TRUE; action = (int)(long)data; if (action == DRAG_START) @@ -1328,6 +1374,7 @@ on_right(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const evas_object_resize(drag_gcc->o_frame, w, oh); _save_widget_position(drag_gcc); } + mover_lock = EINA_FALSE; } static void @@ -1343,6 +1390,7 @@ on_down(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const drag_gcc = Man->drag_gcc[layer]; mover = _get_mover(drag_gcc); + mover_lock = EINA_TRUE; if (action == DRAG_START) { @@ -1372,6 +1420,7 @@ on_down(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const evas_object_resize(drag_gcc->o_frame, ow, h); _save_widget_position(drag_gcc); } + mover_lock = EINA_FALSE; } static void @@ -1387,6 +1436,7 @@ on_left(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const drag_gcc = Man->drag_gcc[layer]; mover = _get_mover(drag_gcc); + mover_lock = EINA_TRUE; if (action == DRAG_START) { drag_gcc->resizing = 1; @@ -1427,6 +1477,7 @@ on_left(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const evas_object_move(drag_gcc->o_frame, mx - drag_gcc->dx, oy); _save_widget_position(drag_gcc); } + mover_lock = EINA_FALSE; } static void