IMPORTANT NOTICE

This website is an automatic import of all Enlightenment projects that come from SVN (svn.enlightenment.org).

They are NOT the official repositories. Don't consider them for packaging, it's intended for developers only.
Please refer to http://git.enlightenment.org for the new official repositories.
summaryrefslogtreecommitdiffstats
authordiscomfitor <discomfitor>2012-11-29 16:03:54 (GMT)
committer discomfitor <discomfitor@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>2012-11-29 16:03:54 (GMT)
commitb3c1112b6aca9fcace8c441f7f07be3a59e67b86 (patch) (side-by-side diff)
treee132c477f92320a903af4ed49bd0ff207f574763
parentokay, 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
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--trunk/e/src/modules/gadman/e_mod_gadman.c98
-rw-r--r--trunk/e/src/modules/gadman/e_mod_gadman.h13
-rw-r--r--trunk/e/src/modules/gadman/e_mod_main.c4
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;