forked from enlightenment/enlightenment
yet another gadget overhaul, this time fixing:
* gadget dragging over windows (ticket #1563) * gadget dragging/resizing on the hover layer * yet another gadget refcount bug * lots of annoying inconsistencies when dragging around new desktop gadgets SVN revision: 77271
This commit is contained in:
parent
d905aa1cc9
commit
4c09bb330f
|
@ -46,7 +46,7 @@ static void _e_gadcon_cb_signal_resize_right_go(void *data,
|
|||
static void _e_gadcon_cb_dnd_enter(void *data, const char *type, void *event);
|
||||
static void _e_gadcon_cb_dnd_move(void *data, const char *type, void *event);
|
||||
static void _e_gadcon_cb_dnd_leave(void *data, const char *type, void *event);
|
||||
static void _e_gadcon_cb_drop(void *data, const char *type, void *event);
|
||||
static void _e_gadcon_cb_dnd_drop(void *data, const char *type, void *event);
|
||||
|
||||
static int _e_gadcon_client_class_feature_check(const E_Gadcon_Client_Class *cc, const char *name, void *feature);
|
||||
static void _e_gadcon_client_cb_menu_post(void *data, E_Menu *m);
|
||||
|
@ -419,7 +419,7 @@ e_gadcon_config_del(E_Gadcon *gc)
|
|||
}
|
||||
|
||||
EAPI void
|
||||
e_gadcon_drop_handler_add(E_Gadcon *gc, int x, int y, int w, int h)
|
||||
e_gadcon_drop_handler_add(E_Gadcon *gc, E_Gadcon_DND_Cb enter, E_Gadcon_DND_Cb leave, E_Gadcon_DND_Cb move, E_Gadcon_DND_Cb drop, int x, int y, int w, int h)
|
||||
{
|
||||
const char *drop_types[] = { "enlightenment/gadcon_client" };
|
||||
|
||||
|
@ -429,8 +429,12 @@ e_gadcon_drop_handler_add(E_Gadcon *gc, int x, int y, int w, int h)
|
|||
gc->drop_handler =
|
||||
e_drop_handler_add(E_OBJECT(gc), gc,
|
||||
_e_gadcon_cb_dnd_enter, _e_gadcon_cb_dnd_move,
|
||||
_e_gadcon_cb_dnd_leave, _e_gadcon_cb_drop,
|
||||
_e_gadcon_cb_dnd_leave, _e_gadcon_cb_dnd_drop,
|
||||
drop_types, 1, x, y, w, h);
|
||||
gc->dnd_enter_cb = enter;
|
||||
gc->dnd_leave_cb = leave;
|
||||
gc->dnd_move_cb = move;
|
||||
gc->dnd_drop_cb = drop;
|
||||
}
|
||||
|
||||
EAPI E_Gadcon *
|
||||
|
@ -456,7 +460,7 @@ e_gadcon_swallowed_new(const char *name, int id, Evas_Object *obj, const char *s
|
|||
gc->evas = evas_object_evas_get(obj);
|
||||
gc->o_container = e_gadcon_layout_add(gc->evas);
|
||||
evas_object_geometry_get(gc->o_container, &x, &y, &w, &h);
|
||||
e_gadcon_drop_handler_add(gc, x, y, w, h);
|
||||
e_gadcon_drop_handler_add(gc, NULL, NULL, NULL, NULL, x, y, w, h);
|
||||
evas_object_event_callback_add(gc->o_container, EVAS_CALLBACK_MOVE,
|
||||
_e_gadcon_cb_moveresize, gc);
|
||||
evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE,
|
||||
|
@ -604,7 +608,7 @@ e_gadcon_unpopulate(E_Gadcon *gc)
|
|||
* undetermined circumstances in gadman
|
||||
*/
|
||||
if (gcc != eina_list_data_get(gc->clients)) continue;
|
||||
WRN("DANGLING GADCON CLIENT %p! THIS IS A BUG!!!", gcc);
|
||||
CRI("DANGLING GADCON CLIENT %p! THIS IS A BUG!!!", gcc);
|
||||
e_object_unref(E_OBJECT(gcc));
|
||||
}
|
||||
if (gc->awaiting_classes)
|
||||
|
@ -998,8 +1002,7 @@ e_gadcon_drag_finished_cb(E_Drag *drag, int dropped)
|
|||
/* TODO: Clean up module config too? */
|
||||
e_object_del(E_OBJECT(gcc));
|
||||
}
|
||||
if (!gcc->gadcon->custom)
|
||||
e_gadcon_client_drag_set(NULL);
|
||||
e_gadcon_client_drag_set(NULL);
|
||||
gcc->gadcon->new_gcc = NULL;
|
||||
e_object_unref(E_OBJECT(gcc));
|
||||
}
|
||||
|
@ -2829,9 +2832,20 @@ _e_gadcon_cb_dnd_enter(void *data, const char *type __UNUSED__, void *event)
|
|||
gc = data;
|
||||
//INF("DND ENTER");
|
||||
gcc = gc->drag_gcc;
|
||||
if ((!gcc->hidden) && (gcc->gadcon == gc)) return;
|
||||
if ((!gcc->hidden) && (gcc->gadcon == gc))
|
||||
{
|
||||
if (gc->dnd_enter_cb) gc->dnd_enter_cb(gc, gc->drag_gcc);
|
||||
return;
|
||||
}
|
||||
if (gcc->gadcon != gc)
|
||||
e_gadcon_client_hide(gc->drag_gcc);
|
||||
else if (e_gadcon_site_is_desktop(gcc->gadcon->location->site))
|
||||
{
|
||||
e_gadcon_client_show(gc->drag_gcc);
|
||||
evas_object_hide(gc->drag_gcc->drag.drag->object);
|
||||
if (gc->dnd_enter_cb) gc->dnd_enter_cb(gc, gc->drag_gcc);
|
||||
return;
|
||||
}
|
||||
e_gadcon_layout_freeze(gc->o_container);
|
||||
|
||||
if (gc->new_gcc)
|
||||
|
@ -2922,6 +2936,7 @@ _e_gadcon_cb_dnd_enter(void *data, const char *type __UNUSED__, void *event)
|
|||
break;
|
||||
}
|
||||
e_gadcon_layout_thaw(gc->o_container);
|
||||
if (gc->dnd_enter_cb) gc->dnd_enter_cb(gc, gc->drag_gcc);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2935,8 +2950,8 @@ _e_gadcon_cb_dnd_move(void *data, const char *type __UNUSED__, void *event)
|
|||
|
||||
ev = event;
|
||||
gc = data;
|
||||
|
||||
gcc = gc->new_gcc;
|
||||
INF("DND (%d,%d)", ev->x, ev->y);
|
||||
gcc = gc->new_gcc ?: gc->drag_gcc;
|
||||
if (!gcc) return;
|
||||
|
||||
if (gcc->state_info.resist > 0)
|
||||
|
@ -2955,9 +2970,10 @@ _e_gadcon_cb_dnd_move(void *data, const char *type __UNUSED__, void *event)
|
|||
int w, h;
|
||||
w = gc->zone->w;
|
||||
h = gc->zone->h;
|
||||
gc->new_gcc->config.pos_x = (double)ev->x / (double)w;
|
||||
gc->new_gcc->config.pos_y = (double)ev->y / (double)h;
|
||||
if (gcc->o_base) evas_object_move(gcc->o_base, ev->x, ev->y);
|
||||
gcc->config.pos_x = (double)ev->x / (double)w;
|
||||
gcc->config.pos_y = (double)ev->y / (double)h;
|
||||
if (gcc->o_frame) evas_object_move(gcc->o_frame, ev->x, ev->y);
|
||||
else if (gcc->o_base) evas_object_move(gcc->o_base, ev->x, ev->y);
|
||||
}
|
||||
else
|
||||
evas_object_geometry_get(gc->o_container, &dx, &dy, NULL, NULL);
|
||||
|
@ -2974,6 +2990,7 @@ _e_gadcon_cb_dnd_move(void *data, const char *type __UNUSED__, void *event)
|
|||
gcc->config.size);
|
||||
}
|
||||
e_gadcon_layout_thaw(gc->o_container);
|
||||
if (gc->dnd_move_cb) gc->dnd_move_cb(gc, gcc);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2983,20 +3000,26 @@ _e_gadcon_cb_dnd_leave(void *data, const char *type __UNUSED__, void *event __UN
|
|||
|
||||
gc = data;
|
||||
//INF("DND LEAVE");
|
||||
|
||||
/* If we exit the starting container hide the gadcon visual */
|
||||
if (gc->drag_gcc->gadcon == gc) e_gadcon_client_hide(gc->drag_gcc);
|
||||
|
||||
/* Delete temporary object */
|
||||
if (!gc->new_gcc) return;
|
||||
if (!gc->new_gcc)
|
||||
{
|
||||
if (gc->dnd_leave_cb) gc->dnd_leave_cb(gc, gc->drag_gcc);
|
||||
return;
|
||||
}
|
||||
|
||||
//INF("DELETING new_gcc");
|
||||
e_object_del(E_OBJECT(gc->new_gcc));
|
||||
gc->new_gcc = NULL;
|
||||
evas_object_show(gc->drag_gcc->drag.drag->object);
|
||||
if (gc->dnd_leave_cb) gc->dnd_leave_cb(gc, gc->drag_gcc);
|
||||
}
|
||||
|
||||
static void
|
||||
_e_gadcon_cb_drop(void *data, const char *type __UNUSED__, void *event __UNUSED__)
|
||||
_e_gadcon_cb_dnd_drop(void *data, const char *type __UNUSED__, void *event __UNUSED__)
|
||||
{
|
||||
E_Gadcon *gc;
|
||||
E_Gadcon_Client *gcc = NULL;
|
||||
|
@ -3004,8 +3027,17 @@ _e_gadcon_cb_drop(void *data, const char *type __UNUSED__, void *event __UNUSED_
|
|||
gc = data;
|
||||
//INF("DND DROP");
|
||||
gc->cf->clients = eina_list_append(gc->cf->clients, gc->drag_gcc->cf);
|
||||
if (!gc->new_gcc)
|
||||
{
|
||||
/* using drag_gcc, so do things a bit differently
|
||||
* this only happens with gadman dnd, broken on shelves
|
||||
*/
|
||||
_e_gadcon_client_save(gc->drag_gcc);
|
||||
e_gadcon_client_show(gc->drag_gcc);
|
||||
if (gc->dnd_drop_cb) gc->dnd_drop_cb(gc, gc->drag_gcc);
|
||||
return;
|
||||
}
|
||||
/* still has refcount from drag */
|
||||
if (!gc->new_gcc) return;
|
||||
e_object_del(E_OBJECT(gc->drag_gcc));
|
||||
gcc = gc->new_gcc;
|
||||
|
||||
|
@ -3022,11 +3054,13 @@ _e_gadcon_cb_drop(void *data, const char *type __UNUSED__, void *event __UNUSED_
|
|||
gc->drag_gcc->moving = 0;
|
||||
e_gadcon_custom_populate_request(gc);
|
||||
e_config_save_queue();
|
||||
if (gc->dnd_drop_cb) gc->dnd_drop_cb(gc, gc->drag_gcc);
|
||||
return;
|
||||
}
|
||||
if (gc->editing) e_gadcon_client_edit_begin(gc->new_gcc);
|
||||
gc->new_gcc = NULL;
|
||||
e_config_save_queue();
|
||||
if (gc->dnd_drop_cb) gc->dnd_drop_cb(gc, gc->drag_gcc);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -51,6 +51,7 @@ typedef struct _E_Event_Gadcon_Client_Class E_Event_Gadcon_Client_Class_Add;
|
|||
typedef struct _E_Event_Gadcon_Client_Class E_Event_Gadcon_Client_Class_Del;
|
||||
typedef struct _E_Gadcon_Location E_Gadcon_Location;
|
||||
typedef struct _E_Event_Gadcon_Populate E_Event_Gadcon_Populate;
|
||||
typedef void (*E_Gadcon_DND_Cb)(E_Gadcon*, E_Gadcon_Client*);
|
||||
|
||||
#else
|
||||
#ifndef E_GADCON_H
|
||||
|
@ -132,6 +133,7 @@ struct _E_Gadcon
|
|||
|
||||
E_Drop_Handler *drop_handler;
|
||||
E_Gadcon_Client *drag_gcc, *new_gcc;
|
||||
E_Gadcon_DND_Cb dnd_enter_cb, dnd_leave_cb, dnd_move_cb, dnd_drop_cb;
|
||||
|
||||
E_Config_Gadcon *cf;
|
||||
|
||||
|
@ -276,7 +278,7 @@ EAPI void e_gadcon_provider_register(const E_Gadcon_Client_Cl
|
|||
EAPI void e_gadcon_provider_unregister(const E_Gadcon_Client_Class *cc);
|
||||
EAPI Eina_List *e_gadcon_provider_list(void);
|
||||
EAPI E_Gadcon *e_gadcon_dummy_new(int id);
|
||||
EAPI void e_gadcon_drop_handler_add(E_Gadcon *gc, int x, int y, int w, int h);
|
||||
EAPI void e_gadcon_drop_handler_add(E_Gadcon *gc, E_Gadcon_DND_Cb enter, E_Gadcon_DND_Cb leave, E_Gadcon_DND_Cb move, E_Gadcon_DND_Cb drop, int x, int y, int w, int h);
|
||||
EAPI void e_gadcon_config_del(E_Gadcon *gc);
|
||||
EAPI E_Gadcon *e_gadcon_swallowed_new(const char *name, int id, Evas_Object *obj, const char *swallow_name);
|
||||
EAPI void e_gadcon_custom_new(E_Gadcon *gc);
|
||||
|
|
|
@ -245,7 +245,7 @@ _gadman_gadget_free(void *data __UNUSED__, void *obj)
|
|||
}
|
||||
gcc->cf = NULL;
|
||||
}
|
||||
edit = (gcc == gcc->gadcon->drag_gcc);
|
||||
edit = (gcc == gcc->gadcon->drag_gcc) || (Man->drag_gcc[gcc->gadcon->id - ID_GADMAN_LAYER_BASE] == gcc);
|
||||
if (edit) gadman_gadget_edit_end(NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
|
@ -392,19 +392,20 @@ gadman_gadget_edit_start(E_Gadcon_Client *gcc)
|
|||
{
|
||||
E_Gadcon *gc;
|
||||
Evas_Object *mover;
|
||||
Eina_List *l;
|
||||
int x, y, w, h;
|
||||
|
||||
EINA_LIST_FOREACH(Man->gadcons[gcc->gadcon->id - ID_GADMAN_LAYER_BASE], l, gc)
|
||||
gc->editing = 1;
|
||||
gc = gcc->gadcon;
|
||||
if (gc->editing) return;
|
||||
gc->editing = 1;
|
||||
|
||||
/* this gets an unref in e_gadcon_drag_finished_cb() */
|
||||
e_object_ref(E_OBJECT(gcc));
|
||||
|
||||
/* Move/resize the correct mover */
|
||||
mover = _get_mover(gcc);
|
||||
if (!mover) return;
|
||||
evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h);
|
||||
Man->drag_gcc[gcc->gadcon->id - ID_GADMAN_LAYER_BASE] = gcc;
|
||||
|
||||
evas_object_move(mover, x, y);
|
||||
evas_object_resize(mover, w, h);
|
||||
|
@ -412,7 +413,6 @@ gadman_gadget_edit_start(E_Gadcon_Client *gcc)
|
|||
evas_object_show(mover);
|
||||
evas_object_event_callback_del(mover, EVAS_CALLBACK_HIDE, gadman_edit);
|
||||
evas_object_event_callback_add(mover, EVAS_CALLBACK_HIDE, gadman_edit, gcc);
|
||||
e_gadcon_client_drag_set(gcc);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -421,26 +421,26 @@ gadman_gadget_edit_end(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const
|
|||
unsigned int layer;
|
||||
E_Gadcon_Client *drag_gcc = NULL;
|
||||
|
||||
for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
|
||||
for (layer = GADMAN_LAYER_COUNT - 1; layer < UINT_MAX; layer--)
|
||||
{
|
||||
const Eina_List *l;
|
||||
E_Gadcon *gc;
|
||||
|
||||
gc = eina_list_data_get(Man->gadcons[layer]);
|
||||
if (!gc->editing) continue;
|
||||
|
||||
evas_object_event_callback_del(Man->movers[layer], EVAS_CALLBACK_HIDE, gadman_edit);
|
||||
evas_object_hide(Man->movers[layer]);
|
||||
|
||||
EINA_LIST_FOREACH(Man->gadcons[layer], l, gc)
|
||||
{
|
||||
gc->editing = 0;
|
||||
drag_gcc = gc->drag_gcc;
|
||||
}
|
||||
}
|
||||
e_gadcon_client_drag_set(NULL);
|
||||
if (drag_gcc)
|
||||
{
|
||||
_save_widget_position(drag_gcc);
|
||||
e_object_unref(E_OBJECT(drag_gcc));
|
||||
gc->editing = 0;
|
||||
drag_gcc = Man->drag_gcc[layer];
|
||||
Man->drag_gcc[layer] = NULL;
|
||||
break;
|
||||
}
|
||||
if (!drag_gcc) return;
|
||||
_save_widget_position(drag_gcc);
|
||||
e_object_unref(E_OBJECT(drag_gcc));
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -496,6 +496,7 @@ gadman_gadgets_hide(void)
|
|||
Eina_List *l, *ll;
|
||||
E_Gadcon_Client *gcc;
|
||||
E_Config_Gadcon_Client *cf_gcc;
|
||||
Eina_Bool editing = EINA_FALSE;
|
||||
|
||||
Man->visible = 0;
|
||||
|
||||
|
@ -527,6 +528,7 @@ gadman_gadgets_hide(void)
|
|||
Man->gadgets[GADMAN_LAYER_TOP] = eina_list_remove_list(Man->gadgets[GADMAN_LAYER_TOP], l);
|
||||
continue;
|
||||
}
|
||||
editing = gcc->gadcon->editing;
|
||||
if (Man->conf->anim_gad)
|
||||
edje_object_signal_emit(gcc->o_frame,
|
||||
"e,state,visibility,hide", "e");
|
||||
|
@ -534,6 +536,9 @@ gadman_gadgets_hide(void)
|
|||
edje_object_signal_emit(gcc->o_frame,
|
||||
"e,state,visibility,hide,now", "e");
|
||||
}
|
||||
if (editing)
|
||||
gadman_gadget_edit_end(NULL, NULL, NULL, NULL);
|
||||
E_FREE_LIST(Man->drag_handlers, ecore_event_handler_del);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -618,6 +623,101 @@ _gadman_gadcon_free(E_Gadcon *gc)
|
|||
free(gc);
|
||||
}
|
||||
|
||||
static void
|
||||
_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);
|
||||
}
|
||||
|
||||
static void
|
||||
_gadman_gadcon_dnd_leave_cb(E_Gadcon *gc, E_Gadcon_Client *gcc)
|
||||
{
|
||||
unsigned int layer;
|
||||
E_Gadcon_Client *drag_gcc = NULL;
|
||||
|
||||
/* only use this for dragging gadcons around the desktop */
|
||||
if (gc != gcc->gadcon) return;
|
||||
for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
|
||||
{
|
||||
const Eina_List *l;
|
||||
|
||||
evas_object_event_callback_del(Man->movers[layer], EVAS_CALLBACK_HIDE, gadman_edit);
|
||||
evas_object_hide(Man->movers[layer]);
|
||||
|
||||
EINA_LIST_FOREACH(Man->gadcons[layer], l, gc)
|
||||
{
|
||||
gc->editing = 0;
|
||||
drag_gcc = gc->drag_gcc;
|
||||
}
|
||||
}
|
||||
/* this is slightly different from edit_end because we don't save the position or unset the drag gcc */
|
||||
if (!drag_gcc) return;
|
||||
e_object_unref(E_OBJECT(drag_gcc));
|
||||
}
|
||||
|
||||
static void
|
||||
_gadman_gadcon_dnd_move_cb(E_Gadcon *gc, E_Gadcon_Client *gcc)
|
||||
{
|
||||
Evas_Object *mover;
|
||||
int x, y;
|
||||
int ox, oy, ow, oh;
|
||||
|
||||
/* only use this for dragging gadcons around the desktop */
|
||||
if (gc != gcc->gadcon) return;
|
||||
|
||||
mover = _get_mover(gcc);
|
||||
evas_object_geometry_get(gcc->o_frame, &x, &y, NULL, NULL);
|
||||
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
||||
|
||||
/* don't go out of the screen */
|
||||
if (x < 0) x = 0;
|
||||
if (x > (Man->width - ow)) x = Man->width - ow;
|
||||
if (y < 0) y = 0;
|
||||
if (y > (Man->height - oh)) y = Man->height - oh;
|
||||
|
||||
evas_object_move(gcc->o_frame, x - gcc->dx, y - gcc->dy);
|
||||
evas_object_move(mover, x - gcc->dx, y - gcc->dy);
|
||||
evas_object_raise(gcc->o_frame);
|
||||
evas_object_raise(mover);
|
||||
}
|
||||
|
||||
static void
|
||||
_gadman_gadcon_dnd_drop_cb(E_Gadcon *gc, E_Gadcon_Client *gcc)
|
||||
{
|
||||
E_Config_Gadcon_Client *cf;
|
||||
E_Zone *dst_zone = NULL;
|
||||
E_Gadcon *dst_gadcon;
|
||||
Evas_Object *mover;
|
||||
int gx, gy;
|
||||
|
||||
/* only use this for dragging gadcons around the desktop */
|
||||
if (gc != gcc->gadcon) return;
|
||||
|
||||
gcc->moving = 0;
|
||||
gcc->dx = gcc->dy = 0;
|
||||
|
||||
/* checking if zone was changed for dragged gadget */
|
||||
mover = _get_mover(gcc);
|
||||
evas_object_geometry_get(mover, &gx, &gy, NULL, NULL);
|
||||
dst_zone = e_container_zone_at_point_get(e_container_current_get(e_manager_current_get()), gx, gy);
|
||||
if (dst_zone && (gcc->gadcon->zone != dst_zone))
|
||||
{
|
||||
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)
|
||||
{
|
||||
dst_gadcon->cf->clients = eina_list_append(dst_gadcon->cf->clients, cf);
|
||||
e_config_save_queue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static E_Gadcon *
|
||||
_gadman_gadcon_new(const char *name, Gadman_Layer_Type layer, E_Zone *zone, E_Gadcon_Location *loc)
|
||||
{
|
||||
|
@ -686,10 +786,11 @@ _gadman_gadcon_new(const char *name, Gadman_Layer_Type layer, E_Zone *zone, E_Ga
|
|||
e_gadcon_ecore_evas_set(gc, Man->container->bg_ecore_evas);
|
||||
e_gadcon_xdnd_window_set(gc, Man->container->bg_win);
|
||||
e_gadcon_dnd_window_set(gc, Man->container->event_win);
|
||||
e_gadcon_drop_handler_add(gc, zone->x, zone->y, zone->w, zone->h);
|
||||
e_drop_xdnd_register_set(Man->container->bg_win, 1);
|
||||
}
|
||||
|
||||
e_gadcon_drop_handler_add(gc, _gadman_gadcon_dnd_enter_cb, _gadman_gadcon_dnd_leave_cb,
|
||||
_gadman_gadcon_dnd_move_cb, _gadman_gadcon_dnd_drop_cb,
|
||||
zone->x, zone->y, zone->w, zone->h);
|
||||
e_gadcon_zone_set(gc, zone);
|
||||
e_gadcon_util_menu_attach_func_set(gc, _attach_menu, NULL);
|
||||
e_gadcon_populate_callback_set(gc, gadman_populate_class, (void *)layer);
|
||||
|
@ -1247,50 +1348,51 @@ on_top(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const c
|
|||
int mx, my; //Mouse coord
|
||||
int action = (int)(long)data;
|
||||
Evas_Object *mover;
|
||||
E_Gadcon *gc;
|
||||
E_Gadcon_Client *drag_gcc;
|
||||
int layer = Man->visible;
|
||||
|
||||
gc = eina_list_data_get(Man->gadcons[0]);
|
||||
drag_gcc = Man->drag_gcc[layer];
|
||||
|
||||
mover = _get_mover(gc->drag_gcc);
|
||||
mover = _get_mover(drag_gcc);
|
||||
|
||||
if (action == DRAG_START)
|
||||
{
|
||||
gc->drag_gcc->resizing = 1;
|
||||
evas_pointer_output_xy_get(gc->drag_gcc->gadcon->evas, &mx, &my);
|
||||
drag_gcc->resizing = 1;
|
||||
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
||||
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
||||
gc->drag_gcc->dy = my - oy;
|
||||
drag_gcc->dy = my - oy;
|
||||
}
|
||||
else if (action == DRAG_STOP)
|
||||
{
|
||||
gc->drag_gcc->resizing = 0;
|
||||
gc->drag_gcc->dy = 0;
|
||||
_save_widget_position(gc->drag_gcc);
|
||||
drag_gcc->resizing = 0;
|
||||
drag_gcc->dy = 0;
|
||||
_save_widget_position(drag_gcc);
|
||||
}
|
||||
else if ((action == DRAG_MOVE) && gc->drag_gcc->resizing)
|
||||
else if ((action == DRAG_MOVE) && drag_gcc->resizing)
|
||||
{
|
||||
int h;
|
||||
|
||||
evas_pointer_output_xy_get(gc->drag_gcc->gadcon->evas, &mx, &my);
|
||||
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
||||
|
||||
h = oy + oh + gc->drag_gcc->dy - my;
|
||||
h = oy + oh + drag_gcc->dy - my;
|
||||
|
||||
if (h < gc->drag_gcc->min.h)
|
||||
if (h < drag_gcc->min.h)
|
||||
{
|
||||
my -= gc->drag_gcc->min.h - h;
|
||||
h = gc->drag_gcc->min.h;
|
||||
my -= drag_gcc->min.h - h;
|
||||
h = drag_gcc->min.h;
|
||||
}
|
||||
/* don't go out of the screen */
|
||||
if (my < gc->drag_gcc->dy)
|
||||
if (my < drag_gcc->dy)
|
||||
{
|
||||
h += my - gc->drag_gcc->dy;
|
||||
my = gc->drag_gcc->dy;
|
||||
h += my - drag_gcc->dy;
|
||||
my = drag_gcc->dy;
|
||||
}
|
||||
|
||||
evas_object_resize(mover, ow, h);
|
||||
evas_object_move(mover, ox, my - gc->drag_gcc->dy);
|
||||
evas_object_move(mover, ox, my - drag_gcc->dy);
|
||||
|
||||
evas_object_resize(gc->drag_gcc->o_frame, ow, h);
|
||||
evas_object_move(gc->drag_gcc->o_frame, ox, my - gc->drag_gcc->dy);
|
||||
evas_object_resize(drag_gcc->o_frame, ow, h);
|
||||
evas_object_move(drag_gcc->o_frame, ox, my - drag_gcc->dy);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1301,39 +1403,40 @@ on_right(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const
|
|||
static int ox, oy, ow, oh; //Object coord
|
||||
int mx, my; //Mouse coord
|
||||
int action;
|
||||
E_Gadcon *gc;
|
||||
E_Gadcon_Client *drag_gcc;
|
||||
int layer = Man->visible;
|
||||
|
||||
gc = eina_list_data_get(Man->gadcons[0]);
|
||||
drag_gcc = Man->drag_gcc[layer];
|
||||
|
||||
mover = _get_mover(gc->drag_gcc);
|
||||
mover = _get_mover(drag_gcc);
|
||||
|
||||
action = (int)(long)data;
|
||||
if (action == DRAG_START)
|
||||
{
|
||||
gc->drag_gcc->resizing = 1;
|
||||
evas_pointer_output_xy_get(gc->drag_gcc->gadcon->evas, &mx, &my);
|
||||
drag_gcc->resizing = 1;
|
||||
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
||||
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
||||
gc->drag_gcc->dx = mx - ow;
|
||||
drag_gcc->dx = mx - ow;
|
||||
}
|
||||
else if (action == DRAG_STOP)
|
||||
{
|
||||
gc->drag_gcc->resizing = 0;
|
||||
gc->drag_gcc->dx = 0;
|
||||
_save_widget_position(gc->drag_gcc);
|
||||
drag_gcc->resizing = 0;
|
||||
drag_gcc->dx = 0;
|
||||
_save_widget_position(drag_gcc);
|
||||
}
|
||||
else if ((action == DRAG_MOVE) && gc->drag_gcc->resizing)
|
||||
else if ((action == DRAG_MOVE) && drag_gcc->resizing)
|
||||
{
|
||||
int w;
|
||||
|
||||
evas_pointer_output_xy_get(gc->drag_gcc->gadcon->evas, &mx, &my);
|
||||
w = mx - gc->drag_gcc->dx;
|
||||
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
||||
w = mx - drag_gcc->dx;
|
||||
|
||||
if (w < gc->drag_gcc->min.w) w = gc->drag_gcc->min.w;
|
||||
if (w < drag_gcc->min.w) w = drag_gcc->min.w;
|
||||
/* don't go out of the screen */
|
||||
if (w > (Man->width - ox)) w = Man->width - ox;
|
||||
|
||||
evas_object_resize(mover, w, oh);
|
||||
evas_object_resize(gc->drag_gcc->o_frame, w, oh);
|
||||
evas_object_resize(drag_gcc->o_frame, w, oh);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1344,38 +1447,39 @@ on_down(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const
|
|||
static int ox, oy, ow, oh; //Object coord
|
||||
int mx, my; //Mouse coord
|
||||
int action = (int)(long)data;
|
||||
E_Gadcon *gc;
|
||||
E_Gadcon_Client *drag_gcc;
|
||||
int layer = Man->visible;
|
||||
|
||||
gc = eina_list_data_get(Man->gadcons[0]);
|
||||
drag_gcc = Man->drag_gcc[layer];
|
||||
|
||||
mover = _get_mover(gc->drag_gcc);
|
||||
mover = _get_mover(drag_gcc);
|
||||
|
||||
if (action == DRAG_START)
|
||||
{
|
||||
gc->drag_gcc->resizing = 1;
|
||||
evas_pointer_output_xy_get(gc->drag_gcc->gadcon->evas, &mx, &my);
|
||||
drag_gcc->resizing = 1;
|
||||
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
||||
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
||||
gc->drag_gcc->dy = my - oh;
|
||||
drag_gcc->dy = my - oh;
|
||||
}
|
||||
else if (action == DRAG_STOP)
|
||||
{
|
||||
gc->drag_gcc->resizing = 0;
|
||||
gc->drag_gcc->dy = 0;
|
||||
_save_widget_position(gc->drag_gcc);
|
||||
drag_gcc->resizing = 0;
|
||||
drag_gcc->dy = 0;
|
||||
_save_widget_position(drag_gcc);
|
||||
}
|
||||
else if ((action == DRAG_MOVE) && gc->drag_gcc->resizing)
|
||||
else if ((action == DRAG_MOVE) && drag_gcc->resizing)
|
||||
{
|
||||
int h;
|
||||
|
||||
evas_pointer_output_xy_get(gc->drag_gcc->gadcon->evas, &mx, &my);
|
||||
h = my - gc->drag_gcc->dy;
|
||||
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
||||
h = my - drag_gcc->dy;
|
||||
|
||||
if (h < gc->drag_gcc->min.h) h = gc->drag_gcc->min.h;
|
||||
if (h < drag_gcc->min.h) h = drag_gcc->min.h;
|
||||
/* don't go out of the screen */
|
||||
if (h > (Man->height - oy)) h = Man->height - oy;
|
||||
|
||||
evas_object_resize(mover, ow, h);
|
||||
evas_object_resize(gc->drag_gcc->o_frame, ow, h);
|
||||
evas_object_resize(drag_gcc->o_frame, ow, h);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1386,116 +1490,53 @@ on_left(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const
|
|||
static int ox, oy, ow, oh; //Object coord
|
||||
int mx, my; //Mouse coord
|
||||
int action = (int)(long)data;
|
||||
E_Gadcon *gc;
|
||||
E_Gadcon_Client *drag_gcc;
|
||||
int layer = Man->visible;
|
||||
|
||||
gc = eina_list_data_get(Man->gadcons[0]);
|
||||
drag_gcc = Man->drag_gcc[layer];
|
||||
|
||||
mover = _get_mover(gc->drag_gcc);
|
||||
mover = _get_mover(drag_gcc);
|
||||
if (action == DRAG_START)
|
||||
{
|
||||
gc->drag_gcc->resizing = 1;
|
||||
evas_pointer_output_xy_get(gc->drag_gcc->gadcon->evas, &mx, &my);
|
||||
drag_gcc->resizing = 1;
|
||||
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
||||
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
||||
gc->drag_gcc->dx = mx - ox;
|
||||
drag_gcc->dx = mx - ox;
|
||||
}
|
||||
else if (action == DRAG_STOP)
|
||||
{
|
||||
gc->drag_gcc->resizing = 0;
|
||||
gc->drag_gcc->dx = 0;
|
||||
_save_widget_position(gc->drag_gcc);
|
||||
drag_gcc->resizing = 0;
|
||||
drag_gcc->dx = 0;
|
||||
_save_widget_position(drag_gcc);
|
||||
}
|
||||
else if ((action == DRAG_MOVE) && gc->drag_gcc->resizing)
|
||||
else if ((action == DRAG_MOVE) && drag_gcc->resizing)
|
||||
{
|
||||
int w;
|
||||
|
||||
evas_pointer_output_xy_get(gc->drag_gcc->gadcon->evas, &mx, &my);
|
||||
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
||||
|
||||
w = ox + ow + gc->drag_gcc->dx - mx;
|
||||
w = ox + ow + drag_gcc->dx - mx;
|
||||
|
||||
if (w < gc->drag_gcc->min.w)
|
||||
if (w < drag_gcc->min.w)
|
||||
{
|
||||
mx -= gc->drag_gcc->min.w - w;
|
||||
w = gc->drag_gcc->min.w;
|
||||
mx -= drag_gcc->min.w - w;
|
||||
w = drag_gcc->min.w;
|
||||
}
|
||||
/* don't go out of the screen */
|
||||
if (mx < gc->drag_gcc->dx)
|
||||
if (mx < drag_gcc->dx)
|
||||
{
|
||||
w += mx - gc->drag_gcc->dx;
|
||||
mx = gc->drag_gcc->dx;
|
||||
w += mx - drag_gcc->dx;
|
||||
mx = drag_gcc->dx;
|
||||
}
|
||||
|
||||
evas_object_resize(mover, w, oh);
|
||||
evas_object_move(mover, mx - gc->drag_gcc->dx, oy);
|
||||
evas_object_move(mover, mx - drag_gcc->dx, oy);
|
||||
|
||||
evas_object_resize(gc->drag_gcc->o_frame, w, oh);
|
||||
evas_object_move(gc->drag_gcc->o_frame, mx - gc->drag_gcc->dx, oy);
|
||||
evas_object_resize(drag_gcc->o_frame, w, oh);
|
||||
evas_object_move(drag_gcc->o_frame, mx - drag_gcc->dx, oy);
|
||||
}
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_on_mouse_up_cb(void *data, int type __UNUSED__, void *event)
|
||||
{
|
||||
E_Gadcon_Client *gcc = data;
|
||||
Ecore_Event_Mouse_Button *ev = event;
|
||||
E_Config_Gadcon_Client *cf;
|
||||
E_Zone *dst_zone = NULL;
|
||||
E_Gadcon *dst_gadcon;
|
||||
Evas_Object *mover;
|
||||
int gx, gy;
|
||||
|
||||
if (ev->buttons != 1) return ECORE_CALLBACK_RENEW;
|
||||
|
||||
gcc->moving = 0;
|
||||
gcc->dx = gcc->dy = 0;
|
||||
|
||||
/* checking if zone was changed for dragged gadget */
|
||||
mover = _get_mover(gcc);
|
||||
evas_object_geometry_get(mover, &gx, &gy, NULL, NULL);
|
||||
dst_zone = e_container_zone_at_point_get(e_container_current_get(e_manager_current_get()), gx, gy);
|
||||
if (dst_zone && (gcc->gadcon->zone != dst_zone))
|
||||
{
|
||||
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)
|
||||
{
|
||||
dst_gadcon->cf->clients = eina_list_append(dst_gadcon->cf->clients, cf);
|
||||
e_config_save_queue();
|
||||
}
|
||||
}
|
||||
E_FREE_LIST(Man->drag_handlers, ecore_event_handler_del);
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_on_move_cb(void *data, int type __UNUSED__, void *event)
|
||||
{
|
||||
Ecore_Event_Mouse_Move *ev = event;
|
||||
E_Gadcon_Client *gcc = data;
|
||||
Evas_Object *mover;
|
||||
int x, y;
|
||||
int ox, oy, ow, oh;
|
||||
|
||||
mover = _get_mover(gcc);
|
||||
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
||||
|
||||
x = ev->x - gcc->dx;
|
||||
y = ev->y - gcc->dy;
|
||||
/* don't go out of the screen */
|
||||
if (x < 0) x = 0;
|
||||
if (x > (Man->width - ow)) x = Man->width - ow;
|
||||
if (y < 0) y = 0;
|
||||
if (y > (Man->height - oh)) y = Man->height - oh;
|
||||
|
||||
evas_object_move(gcc->o_frame, x, y);
|
||||
evas_object_move(mover, x, y);
|
||||
evas_object_raise(gcc->o_frame);
|
||||
evas_object_raise(mover);
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
|
||||
static void
|
||||
on_move(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
|
||||
{
|
||||
|
@ -1505,47 +1546,45 @@ on_move(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const
|
|||
int mx, my; //Mouse coord
|
||||
int action = (int)(long)data;
|
||||
E_Gadcon *gc;
|
||||
E_Gadcon_Client *drag_gcc;
|
||||
E_Drag *drag;
|
||||
const char *drag_types[] = { "enlightenment/gadcon_client" };
|
||||
|
||||
gc = eina_list_data_get(Man->gadcons[GADMAN_LAYER_BG]);
|
||||
if (!gc->drag_gcc) return;
|
||||
mover = _get_mover(gc->drag_gcc);
|
||||
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)
|
||||
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);
|
||||
evas_pointer_output_xy_get(gc->evas, &mx, &my);
|
||||
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
||||
|
||||
drag_gcc->dx = mx - ox;
|
||||
drag_gcc->dy = my - oy;
|
||||
|
||||
drag_gcc->drag.drag = drag = e_drag_new(gc->zone->container, mx, my,
|
||||
drag_types, 1, drag_gcc, -1, NULL,
|
||||
e_gadcon_drag_finished_cb);
|
||||
if (!drag) return;
|
||||
|
||||
o = drag_gcc->client_class->func.icon((E_Gadcon_Client_Class *)drag_gcc->client_class,
|
||||
e_drag_evas_get(drag));
|
||||
if (!o)
|
||||
{
|
||||
E_Drag *drag;
|
||||
const char *drag_types[] = { "enlightenment/gadcon_client" };
|
||||
|
||||
gc->drag_gcc->moving = 1;
|
||||
e_object_ref(E_OBJECT(gc->drag_gcc));
|
||||
gc->cf->clients = eina_list_remove(gc->cf->clients, gc->drag_gcc->cf);
|
||||
evas_pointer_output_xy_get(gc->drag_gcc->gadcon->evas, &mx, &my);
|
||||
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
||||
|
||||
gc->drag_gcc->dx = mx - ox;
|
||||
gc->drag_gcc->dy = my - oy;
|
||||
|
||||
gc->drag_gcc->drag.drag = drag = e_drag_new(gc->drag_gcc->gadcon->zone->container, mx, my,
|
||||
drag_types, 1, gc->drag_gcc, -1, NULL,
|
||||
e_gadcon_drag_finished_cb);
|
||||
if (!drag) return;
|
||||
|
||||
o = gc->drag_gcc->client_class->func.icon((E_Gadcon_Client_Class *)gc->drag_gcc->client_class,
|
||||
e_drag_evas_get(drag));
|
||||
if (!o)
|
||||
{
|
||||
/* FIXME: fallback icon for drag */
|
||||
o = evas_object_rectangle_add(e_drag_evas_get(drag));
|
||||
evas_object_color_set(o, 255, 255, 255, 100);
|
||||
}
|
||||
|
||||
E_LIST_HANDLER_APPEND(Man->drag_handlers, ECORE_EVENT_MOUSE_MOVE, _on_move_cb, gc->drag_gcc);
|
||||
E_LIST_HANDLER_APPEND(Man->drag_handlers, ECORE_EVENT_MOUSE_BUTTON_UP, _on_mouse_up_cb, gc->drag_gcc);
|
||||
e_drag_object_set(drag, o);
|
||||
e_drag_resize(drag, ow, oh);
|
||||
evas_object_hide(o);
|
||||
e_drag_start(drag, mx, my);
|
||||
/* FIXME: fallback icon for drag */
|
||||
o = evas_object_rectangle_add(e_drag_evas_get(drag));
|
||||
evas_object_color_set(o, 255, 255, 255, 100);
|
||||
}
|
||||
|
||||
e_drag_object_set(drag, o);
|
||||
e_drag_resize(drag, ow, oh);
|
||||
evas_object_hide(o);
|
||||
e_drag_start(drag, mx, my);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -51,6 +51,7 @@ struct _Manager
|
|||
Evas_Object *movers[GADMAN_LAYER_COUNT];
|
||||
Evas_Object *full_bg;
|
||||
const char *icon_name;
|
||||
E_Gadcon_Client *drag_gcc[GADMAN_LAYER_COUNT];
|
||||
|
||||
Eina_List *drag_handlers;
|
||||
|
||||
|
|
Loading…
Reference in New Issue