forked from enlightenment/enlightenment
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:
parent
fd95d45c9b
commit
98a1ef6bd1
|
@ -52,57 +52,6 @@ Manager *Man = NULL;
|
||||||
static Eina_List *_gadman_hdls = NULL;
|
static Eina_List *_gadman_hdls = NULL;
|
||||||
static Eina_Hash *_gadman_gadgets = 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 */
|
/* Implementation */
|
||||||
void
|
void
|
||||||
gadman_reset(void)
|
gadman_reset(void)
|
||||||
|
@ -201,6 +150,7 @@ gadman_shutdown(void)
|
||||||
E_FREE_LIST(Man->gadcons[layer], e_object_del);
|
E_FREE_LIST(Man->gadcons[layer], e_object_del);
|
||||||
evas_object_del(Man->movers[layer]);
|
evas_object_del(Man->movers[layer]);
|
||||||
Man->gadgets[layer] = eina_list_free(Man->gadgets[layer]);
|
Man->gadgets[layer] = eina_list_free(Man->gadgets[layer]);
|
||||||
|
e_gadcon_location_free(Man->location[layer]);
|
||||||
}
|
}
|
||||||
|
|
||||||
eina_stringshare_del(Man->icon_name);
|
eina_stringshare_del(Man->icon_name);
|
||||||
|
@ -433,6 +383,10 @@ gadman_gadget_edit_start(E_Gadcon_Client *gcc)
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
int x, y, w, h;
|
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)
|
EINA_LIST_FOREACH(Man->gadcons[gcc->gadcon->id - ID_GADMAN_LAYER_BASE], l, gc)
|
||||||
gc->editing = 1;
|
gc->editing = 1;
|
||||||
gc = gcc->gadcon;
|
gc = gcc->gadcon;
|
||||||
|
@ -459,6 +413,7 @@ gadman_gadget_edit_end(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const
|
||||||
unsigned int layer;
|
unsigned int layer;
|
||||||
E_Gadcon_Client *drag_gcc = NULL;
|
E_Gadcon_Client *drag_gcc = NULL;
|
||||||
|
|
||||||
|
Man->dnd_entered = 0;
|
||||||
for (layer = GADMAN_LAYER_COUNT - 1; layer < UINT_MAX; layer--)
|
for (layer = GADMAN_LAYER_COUNT - 1; layer < UINT_MAX; layer--)
|
||||||
{
|
{
|
||||||
const Eina_List *l;
|
const Eina_List *l;
|
||||||
|
@ -477,8 +432,10 @@ gadman_gadget_edit_end(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!drag_gcc) return;
|
if (!drag_gcc) return;
|
||||||
|
drag_gcc->gadcon->drag_gcc = NULL;
|
||||||
_save_widget_position(drag_gcc);
|
_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
|
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 */
|
/* only use this for dragging gadcons around the desktop */
|
||||||
if (gc != gcc->gadcon) return;
|
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
|
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;
|
unsigned int layer = gcc->gadcon->id - ID_GADMAN_LAYER_BASE;
|
||||||
cf = gcc->cf;
|
cf = gcc->cf;
|
||||||
|
|
||||||
gcc->gadcon->cf->clients = eina_list_remove(gcc->gadcon->cf->clients, cf);
|
gcc->gadcon->cf->clients = eina_list_remove(gcc->gadcon->cf->clients, cf);
|
||||||
dst_gadcon = gadman_gadcon_get(dst_zone, layer);
|
dst_gadcon = gadman_gadcon_get(dst_zone, layer);
|
||||||
if (dst_gadcon)
|
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
|
/* something broke the config's geom, make it visible so it can be
|
||||||
* resized/deleted
|
* 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;
|
gcc->cf->style = eina_stringshare_add(gcc->client_class->default_style ?: E_GADCON_CLIENT_STYLE_INSET);
|
||||||
Evas_Object *o;
|
gcc->style = eina_stringshare_ref(gcc->cf->style);
|
||||||
char buf[4096];
|
|
||||||
|
|
||||||
gcc->cf->geom.pos_x = DEFAULT_POS_X;
|
gcc->cf->geom.pos_x = DEFAULT_POS_X;
|
||||||
gcc->cf->geom.pos_y = DEFAULT_POS_Y;
|
gcc->cf->geom.pos_y = DEFAULT_POS_Y;
|
||||||
gcc->cf->geom.size_w = DEFAULT_SIZE_W;
|
gcc->cf->geom.size_w = DEFAULT_SIZE_W;
|
||||||
gcc->cf->geom.size_h = DEFAULT_SIZE_H;
|
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);
|
_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);
|
gadman_gadget_edit_start(gcc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1249,8 +1203,6 @@ on_frame_click(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void
|
||||||
|
|
||||||
gcc = data;
|
gcc = data;
|
||||||
|
|
||||||
if (gcc->gadcon->editing) gadman_gadget_edit_end(NULL, NULL, NULL, NULL);
|
|
||||||
|
|
||||||
if (ev->button == 5)
|
if (ev->button == 5)
|
||||||
{
|
{
|
||||||
E_Menu *m;
|
E_Menu *m;
|
||||||
|
@ -1478,17 +1430,17 @@ on_move(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const
|
||||||
E_Drag *drag;
|
E_Drag *drag;
|
||||||
const char *drag_types[] = { "enlightenment/gadcon_client" };
|
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 */
|
/* DRAG_START */
|
||||||
if (action != DRAG_START) return;
|
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;
|
drag_gcc->moving = 1;
|
||||||
gc->cf->clients = eina_list_remove(gc->cf->clients, drag_gcc->cf);
|
gc->cf->clients = eina_list_remove(gc->cf->clients, drag_gcc->cf);
|
||||||
e_gadcon_client_drag_set(drag_gcc);
|
e_gadcon_client_drag_set(drag_gcc);
|
||||||
|
e_object_ref(E_OBJECT(drag_gcc));
|
||||||
evas_pointer_output_xy_get(gc->evas, &mx, &my);
|
evas_pointer_output_xy_get(gc->evas, &mx, &my);
|
||||||
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
||||||
|
|
||||||
|
|
|
@ -43,15 +43,6 @@ typedef enum
|
||||||
#define ID_GADMAN_LAYER_BG (ID_GADMAN_LAYER_BASE + GADMAN_LAYER_BG)
|
#define ID_GADMAN_LAYER_BG (ID_GADMAN_LAYER_BASE + GADMAN_LAYER_BG)
|
||||||
#define ID_GADMAN_LAYER_TOP (ID_GADMAN_LAYER_BASE + GADMAN_LAYER_TOP)
|
#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
|
struct _Manager
|
||||||
{
|
{
|
||||||
Eina_List *gadcons[GADMAN_LAYER_COUNT];
|
Eina_List *gadcons[GADMAN_LAYER_COUNT];
|
||||||
|
@ -66,8 +57,6 @@ struct _Manager
|
||||||
|
|
||||||
Eina_List *drag_handlers;
|
Eina_List *drag_handlers;
|
||||||
|
|
||||||
Eina_Inlist *gadman_popups;
|
|
||||||
|
|
||||||
Eina_List *waiting;
|
Eina_List *waiting;
|
||||||
Ecore_Event_Handler *add;
|
Ecore_Event_Handler *add;
|
||||||
|
|
||||||
|
@ -87,6 +76,8 @@ struct _Manager
|
||||||
|
|
||||||
E_Config_DD *conf_edd;
|
E_Config_DD *conf_edd;
|
||||||
Config *conf;
|
Config *conf;
|
||||||
|
|
||||||
|
Eina_Bool dnd_entered : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern Manager *Man;
|
extern Manager *Man;
|
||||||
|
|
|
@ -221,8 +221,8 @@ gadman_gadget_add_handler(void *d __UNUSED__, int type __UNUSED__, E_Event_Gadco
|
||||||
if (!Man->waiting) return ECORE_CALLBACK_RENEW;
|
if (!Man->waiting) return ECORE_CALLBACK_RENEW;
|
||||||
l = eina_list_data_find_list(Man->waiting, ev->gcc->gadcon);
|
l = eina_list_data_find_list(Man->waiting, ev->gcc->gadcon);
|
||||||
if (!l) return ECORE_CALLBACK_RENEW;
|
if (!l) return ECORE_CALLBACK_RENEW;
|
||||||
if (ev->gcc->cf != eina_list_last_data_get(ev->gcc->gadcon->cf->clients)) return ECORE_CALLBACK_RENEW;
|
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)
|
||||||
Man->drag_gcc[ev->gcc->gadcon->id - ID_GADMAN_LAYER_BASE] = ev->gcc;
|
return ECORE_CALLBACK_RENEW;
|
||||||
ev->gcc->cf->style = eina_stringshare_add(ev->gcc->client_class->default_style ?: E_GADCON_CLIENT_STYLE_INSET);
|
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->style = eina_stringshare_ref(ev->gcc->cf->style);
|
||||||
ev->gcc->cf->geom.pos_x = DEFAULT_POS_X;
|
ev->gcc->cf->geom.pos_x = DEFAULT_POS_X;
|
||||||
|
|
Loading…
Reference in New Issue