| author | discomfitor <discomfitor> | 2012-11-29 16:03:54 (GMT) |
|---|---|---|
| committer | discomfitor <discomfitor@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33> | 2012-11-29 16:03:54 (GMT) |
| commit | b3c1112b6aca9fcace8c441f7f07be3a59e67b86 (patch) (side-by-side diff) | |
| tree | e132c477f92320a903af4ed49bd0ff207f574763 | |
| parent | okay, only try the gadcon config gcc unref if it's a custom gadcon that's edi... (diff) | |
more gadman dnd rewrites to fix this stupid, awful piece of garbage that I can't wait to delete.
ticket #1820 (again)
git-svn-id: http://svn.enlightenment.org/svn/e@79841 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33
| -rw-r--r-- | trunk/e/src/modules/gadman/e_mod_gadman.c | 98 | ||||
| -rw-r--r-- | trunk/e/src/modules/gadman/e_mod_gadman.h | 13 | ||||
| -rw-r--r-- | trunk/e/src/modules/gadman/e_mod_main.c | 4 |
3 files changed, 29 insertions, 86 deletions
diff --git a/trunk/e/src/modules/gadman/e_mod_gadman.c b/trunk/e/src/modules/gadman/e_mod_gadman.c index 6f2d17d..918b25e 100644 --- a/trunk/e/src/modules/gadman/e_mod_gadman.c +++ b/trunk/e/src/modules/gadman/e_mod_gadman.c @@ -52,57 +52,6 @@ Manager *Man = NULL; static Eina_List *_gadman_hdls = NULL; static Eina_Hash *_gadman_gadgets = NULL; -static void -gadman_popup_free(Gadman_Popup *gp) -{ - if (!gp) return; - if (gp->timer) ecore_timer_del(gp->timer); - e_object_data_set(E_OBJECT(gp->gcc), NULL); - e_object_del_attach_func_set(E_OBJECT(gp->gcc), NULL); - ecore_event_handler_del(gp->eh); - Man->gadman_popups = eina_inlist_remove(Man->gadman_popups, EINA_INLIST_GET(gp)); - e_object_del(E_OBJECT(gp->pop)); - free(gp); -} - -static void -_gadman_popup_del(void *obj) -{ - gadman_popup_free(e_object_data_get(obj)); -} - -static Eina_Bool -_gadman_popup_timer(Gadman_Popup *gp) -{ - gadman_popup_free(gp); - return EINA_FALSE; -} - -static Eina_Bool -_gadman_popup_mouse(Gadman_Popup *gp, int type __UNUSED__, Ecore_Event_Mouse_Button *ev) -{ - if (ev->event_window != gp->pop->win->evas_win) return ECORE_CALLBACK_RENEW; - gadman_popup_free(gp); - return ECORE_CALLBACK_RENEW; -} - -static Gadman_Popup * -gadman_popup_new(E_Gadcon_Client *gcc) -{ - Gadman_Popup *gp; - - gp = E_NEW(Gadman_Popup, 1); - gp->gcc = gcc; - gp->pop = e_gadcon_popup_new(gcc); - gp->timer = ecore_timer_add(5.0, (Ecore_Task_Cb)_gadman_popup_timer, gp); - e_object_data_set(E_OBJECT(gcc), gp); - e_object_del_attach_func_set(E_OBJECT(gcc), _gadman_popup_del); - Man->gadman_popups = eina_inlist_append(Man->gadman_popups, EINA_INLIST_GET(gp)); - gp->eh = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, (Ecore_Event_Handler_Cb)_gadman_popup_mouse, gp); - - return gp; -} - /* Implementation */ void gadman_reset(void) @@ -201,6 +150,7 @@ gadman_shutdown(void) E_FREE_LIST(Man->gadcons[layer], e_object_del); evas_object_del(Man->movers[layer]); Man->gadgets[layer] = eina_list_free(Man->gadgets[layer]); + e_gadcon_location_free(Man->location[layer]); } eina_stringshare_del(Man->icon_name); @@ -433,6 +383,10 @@ gadman_gadget_edit_start(E_Gadcon_Client *gcc) Eina_List *l; int x, y, w, h; + if (Man->drag_gcc[gcc->gadcon->id - ID_GADMAN_LAYER_BASE] == gcc) return; + else if (Man->drag_gcc[gcc->gadcon->id - ID_GADMAN_LAYER_BASE]) + gadman_gadget_edit_end(NULL, NULL, NULL, NULL); + EINA_LIST_FOREACH(Man->gadcons[gcc->gadcon->id - ID_GADMAN_LAYER_BASE], l, gc) gc->editing = 1; gc = gcc->gadcon; @@ -459,6 +413,7 @@ gadman_gadget_edit_end(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const unsigned int layer; E_Gadcon_Client *drag_gcc = NULL; + Man->dnd_entered = 0; for (layer = GADMAN_LAYER_COUNT - 1; layer < UINT_MAX; layer--) { const Eina_List *l; @@ -477,8 +432,10 @@ gadman_gadget_edit_end(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const break; } if (!drag_gcc) return; + drag_gcc->gadcon->drag_gcc = NULL; _save_widget_position(drag_gcc); - e_object_unref(E_OBJECT(drag_gcc)); + if (!e_object_is_del(E_OBJECT(drag_gcc))) + e_object_unref(E_OBJECT(drag_gcc)); } void @@ -668,7 +625,11 @@ _gadman_gadcon_dnd_enter_cb(E_Gadcon *gc, E_Gadcon_Client *gcc) /* only use this for dragging gadcons around the desktop */ if (gc != gcc->gadcon) return; - gadman_gadget_edit_start(gcc); + if (Man->dnd_entered && (Man->drag_gcc[gcc->gadcon->id - ID_GADMAN_LAYER_BASE] == gcc)) + e_object_ref(E_OBJECT(gcc)); + else + gadman_gadget_edit_start(gcc); + Man->dnd_entered = 1; } static void @@ -746,7 +707,6 @@ _gadman_gadcon_dnd_drop_cb(E_Gadcon *gc, E_Gadcon_Client *gcc) { unsigned int layer = gcc->gadcon->id - ID_GADMAN_LAYER_BASE; cf = gcc->cf; - gcc->gadcon->cf->clients = eina_list_remove(gcc->gadcon->cf->clients, cf); dst_gadcon = gadman_gadcon_get(dst_zone, layer); if (dst_gadcon) @@ -966,25 +926,19 @@ _apply_widget_position(E_Gadcon_Client *gcc) /* something broke the config's geom, make it visible so it can be * resized/deleted */ - if ((!x) && (!y) && (!w) && (!h)) + if ((!gcc->cf->geom.pos_x) && (!gcc->cf->geom.pos_y) && (!gcc->cf->geom.size_w) && (!gcc->cf->geom.size_h)) { - Gadman_Popup *pop; - Evas_Object *o; - char buf[4096]; - + gcc->cf->style = eina_stringshare_add(gcc->client_class->default_style ?: E_GADCON_CLIENT_STYLE_INSET); + gcc->style = eina_stringshare_ref(gcc->cf->style); gcc->cf->geom.pos_x = DEFAULT_POS_X; gcc->cf->geom.pos_y = DEFAULT_POS_Y; gcc->cf->geom.size_w = DEFAULT_SIZE_W; gcc->cf->geom.size_h = DEFAULT_SIZE_H; + if (!strcmp(gcc->style, E_GADCON_CLIENT_STYLE_INSET)) + edje_object_signal_emit(gcc->o_frame, "e,state,visibility,inset", "e"); + else + edje_object_signal_emit(gcc->o_frame, "e,state,visibility,plain", "e"); _apply_widget_position(gcc); - pop = gadman_popup_new(gcc); - o = edje_object_add(pop->pop->win->evas); - e_theme_edje_object_set(o, "base/theme/dialog", "e/widgets/dialog/text"); - snprintf(buf, sizeof(buf), "A gadget of type '%s' was detected without any stored geometry.<ps>" - "It has been relocated and resized for you.", gcc->client_class->name); - edje_object_part_text_set(o, "e.textblock.message", buf); - e_gadcon_popup_content_set(pop->pop, o); - e_gadcon_popup_show(pop->pop); gadman_gadget_edit_start(gcc); return; } @@ -1249,8 +1203,6 @@ on_frame_click(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void gcc = data; - if (gcc->gadcon->editing) gadman_gadget_edit_end(NULL, NULL, NULL, NULL); - if (ev->button == 5) { E_Menu *m; @@ -1478,17 +1430,17 @@ on_move(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const E_Drag *drag; const char *drag_types[] = { "enlightenment/gadcon_client" }; - gc = eina_list_data_get(Man->gadcons[Man->visible]); + /* DRAG_START */ + if (action != DRAG_START) return; drag_gcc = Man->drag_gcc[Man->visible]; if (!drag_gcc) return; + gc = drag_gcc->gadcon; mover = _get_mover(drag_gcc); - /* DRAG_START */ - if (action != DRAG_START) return; - drag_gcc->moving = 1; gc->cf->clients = eina_list_remove(gc->cf->clients, drag_gcc->cf); e_gadcon_client_drag_set(drag_gcc); + e_object_ref(E_OBJECT(drag_gcc)); evas_pointer_output_xy_get(gc->evas, &mx, &my); evas_object_geometry_get(mover, &ox, &oy, &ow, &oh); diff --git a/trunk/e/src/modules/gadman/e_mod_gadman.h b/trunk/e/src/modules/gadman/e_mod_gadman.h index b3b3274..b90131c 100644 --- a/trunk/e/src/modules/gadman/e_mod_gadman.h +++ b/trunk/e/src/modules/gadman/e_mod_gadman.h @@ -43,15 +43,6 @@ typedef enum #define ID_GADMAN_LAYER_BG (ID_GADMAN_LAYER_BASE + GADMAN_LAYER_BG) #define ID_GADMAN_LAYER_TOP (ID_GADMAN_LAYER_BASE + GADMAN_LAYER_TOP) -typedef struct Gadman_Popup -{ - EINA_INLIST; - E_Gadcon_Client *gcc; - E_Gadcon_Popup *pop; - Ecore_Timer *timer; - Ecore_Event_Handler *eh; -} Gadman_Popup; - struct _Manager { Eina_List *gadcons[GADMAN_LAYER_COUNT]; @@ -66,8 +57,6 @@ struct _Manager Eina_List *drag_handlers; - Eina_Inlist *gadman_popups; - Eina_List *waiting; Ecore_Event_Handler *add; @@ -87,6 +76,8 @@ struct _Manager E_Config_DD *conf_edd; Config *conf; + + Eina_Bool dnd_entered : 1; }; extern Manager *Man; diff --git a/trunk/e/src/modules/gadman/e_mod_main.c b/trunk/e/src/modules/gadman/e_mod_main.c index 6a3e350..7d015ba 100644 --- a/trunk/e/src/modules/gadman/e_mod_main.c +++ b/trunk/e/src/modules/gadman/e_mod_main.c @@ -221,8 +221,8 @@ gadman_gadget_add_handler(void *d __UNUSED__, int type __UNUSED__, E_Event_Gadco if (!Man->waiting) return ECORE_CALLBACK_RENEW; l = eina_list_data_find_list(Man->waiting, ev->gcc->gadcon); if (!l) return ECORE_CALLBACK_RENEW; - if (ev->gcc->cf != eina_list_last_data_get(ev->gcc->gadcon->cf->clients)) return ECORE_CALLBACK_RENEW; - Man->drag_gcc[ev->gcc->gadcon->id - ID_GADMAN_LAYER_BASE] = ev->gcc; + if (ev->gcc->cf->geom.pos_x || ev->gcc->cf->geom.pos_y || ev->gcc->cf->geom.size_w || ev->gcc->cf->geom.size_h) + return ECORE_CALLBACK_RENEW; ev->gcc->cf->style = eina_stringshare_add(ev->gcc->client_class->default_style ?: E_GADCON_CLIENT_STYLE_INSET); ev->gcc->style = eina_stringshare_ref(ev->gcc->cf->style); ev->gcc->cf->geom.pos_x = DEFAULT_POS_X; |
