more gadman dnd rewrites to fix this stupid, awful piece of garbage that I can't wait to delete.

ticket #1820 (again)


SVN revision: 79841
This commit is contained in:
Mike Blumenkrantz 2012-11-29 16:03:54 +00:00
parent fd95d45c9b
commit 98a1ef6bd1
3 changed files with 30 additions and 87 deletions

View File

@ -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_gcc = Man->drag_gcc[Man->visible];
if (!drag_gcc) return;
mover = _get_mover(drag_gcc);
/* 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_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);

View File

@ -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;

View File

@ -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;