4 * TODO: gadcon client ordering on drop
7 #define E_LAYOUT_ITEM_DRAG_RESIST_LEVEL 10
9 static void _e_gadcon_free(E_Gadcon *gc);
10 static void _e_gadcon_client_free(E_Gadcon_Client *gcc);
12 static void _e_gadcon_moveresize_handle(E_Gadcon_Client *gcc);
13 static Eina_Bool _e_gadcon_cb_client_scroll_timer(void *data);
14 static Eina_Bool _e_gadcon_cb_client_scroll_animator(void *data);
15 static void _e_gadcon_cb_client_frame_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
16 static void _e_gadcon_cb_client_frame_moveresize(void *data, Evas *e, Evas_Object *obj, void *event_info);
17 static void _e_gadcon_client_save(E_Gadcon_Client *gcc);
18 static void _e_gadcon_client_drag_begin(E_Gadcon_Client *gcc, int x, int y);
19 static void _e_gadcon_client_inject(E_Gadcon *gc, E_Gadcon_Client *gcc, int x, int y);
21 static void _e_gadcon_cb_min_size_request(void *data, Evas_Object *obj, void *event_info);
22 static void _e_gadcon_cb_size_request(void *data, Evas_Object *obj, void *event_info);
23 static void _e_gadcon_cb_moveresize(void *data, Evas *evas, Evas_Object *obj, void *event_info);
24 static void _e_gadcon_cb_client_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info);
25 static void _e_gadcon_cb_client_mouse_in(void *data, Evas *evas, Evas_Object *obj, void *event_info);
26 static void _e_gadcon_cb_client_mouse_out(void *data, Evas *evas, Evas_Object *obj, void *event_info);
27 static void _e_gadcon_cb_client_move(void *data, Evas *evas, Evas_Object *obj, void *event_info);
28 static void _e_gadcon_cb_client_resize(void *data, Evas *evas, Evas_Object *obj, void *event_info);
30 static void _e_gadcon_client_move_start(E_Gadcon_Client *gcc);
31 static void _e_gadcon_client_move_stop(E_Gadcon_Client *gcc);
32 static void _e_gadcon_client_move_go(E_Gadcon_Client *gcc);
34 static void _e_gadcon_cb_signal_move_start(void *data, Evas_Object *obj, const char *emission, const char *source);
35 static void _e_gadcon_cb_signal_move_stop(void *data, Evas_Object *obj, const char *emission, const char *source);
36 static void _e_gadcon_cb_signal_move_go(void *data, Evas_Object *obj, const char *emission, const char *source);
37 static void _e_gadcon_cb_signal_resize_left_start(void *data, Evas_Object *obj, const char *emission, const char *source);
38 static void _e_gadcon_cb_signal_resize_left_stop(void *data, Evas_Object *obj, const char *emission, const char *source);
39 static void _e_gadcon_cb_signal_resize_left_go(void *data, Evas_Object *obj, const char *emission, const char *source);
40 static void _e_gadcon_cb_signal_resize_right_start(void *data, Evas_Object *obj, const char *emission, const char *source);
41 static void _e_gadcon_cb_signal_resize_right_stop(void *data, Evas_Object *obj, const char *emission, const char *source);
42 static void _e_gadcon_cb_signal_resize_right_go(void *data, Evas_Object *obj, const char *emission, const char *source);
43 static void _e_gadcon_cb_drag_finished(E_Drag *drag, int dropped);
44 static void _e_gadcon_cb_dnd_enter(void *data, const char *type, void *event);
45 static void _e_gadcon_cb_dnd_move(void *data, const char *type, void *event);
46 static void _e_gadcon_cb_dnd_leave(void *data, const char *type, void *event);
47 static void _e_gadcon_cb_drop(void *data, const char *type, void *event);
49 static int _e_gadcon_client_class_feature_check(const E_Gadcon_Client_Class *cc, const char *name, void *feature);
50 static void _e_gadcon_client_cb_menu_post(void *data, E_Menu *m);
51 static void _e_gadcon_client_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
52 static void _e_gadcon_client_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
53 static void _e_gadcon_client_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
54 static void _e_gadcon_client_cb_menu_style_plain(void *data, E_Menu *m, E_Menu_Item *mi);
55 static void _e_gadcon_client_cb_menu_style_inset(void *data, E_Menu *m, E_Menu_Item *mi);
56 static void _e_gadcon_client_cb_menu_autoscroll(void *data, E_Menu *m, E_Menu_Item *mi);
57 /*static void _e_gadcon_client_cb_menu_resizable(void *data, E_Menu *m, E_Menu_Item *mi);*/
58 static void _e_gadcon_client_cb_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi);
59 static void _e_gadcon_client_cb_menu_remove(void *data, E_Menu *m, E_Menu_Item *mi);
60 static void _e_gadcon_client_cb_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi);
62 static void _e_gadcon_client_del_hook(void *data, Evas *e, Evas_Object *obj, void *event_info);
64 static Evas_Object *e_gadcon_layout_add(Evas *evas);
65 static void e_gadcon_layout_orientation_set(Evas_Object *obj, int horizontal);
66 static int e_gadcon_layout_orientation_get(Evas_Object *obj);
67 static void e_gadcon_layout_freeze(Evas_Object *obj);
68 static void e_gadcon_layout_thaw(Evas_Object *obj);
69 static void e_gadcon_layout_min_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h);
70 static void e_gadcon_layout_asked_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h);
71 static int e_gadcon_layout_pack(Evas_Object *obj, Evas_Object *child);
72 static void e_gadcon_layout_pack_size_set(Evas_Object *obj, int size);
73 static void e_gadcon_layout_pack_request_set(Evas_Object *obj, int pos, int size);
74 static void e_gadcon_layout_pack_options_set(Evas_Object *obj, E_Gadcon_Client *gcc);
75 static void e_gadcon_layout_pack_min_size_set(Evas_Object *obj, int w, int h);
76 static void e_gadcon_layout_pack_aspect_set(Evas_Object *obj, int w, int h);
77 static void e_gadcon_layout_pack_aspect_pad_set(Evas_Object *obj, int w, int h);
78 static void e_gadcon_layout_unpack(Evas_Object *obj);
79 static void _e_gadcon_provider_populate_request(const E_Gadcon_Client_Class *cc);
80 static void _e_gadcon_provider_populate_unrequest(const E_Gadcon_Client_Class *cc);
81 static Eina_Bool _e_gadcon_provider_populate_idler(void *data);
82 static Eina_Bool _e_gadcon_custom_populate_idler(void *data);
84 static int _e_gadcon_location_change(E_Gadcon_Client * gcc, E_Gadcon_Location *src, E_Gadcon_Location *dst);
86 typedef struct _E_Smart_Data E_Smart_Data;
87 typedef struct _E_Layout_Item_Container E_Layout_Item_Container;
89 static void _e_gadcon_client_current_position_sync(E_Gadcon_Client *gcc);
90 static void _e_gadcon_layout_smart_sync_clients(E_Gadcon *gc);
91 static void _e_gadcon_layout_smart_gadcon_position_shrinked_mode(E_Smart_Data *sd);
92 static void _e_gadcon_layout_smart_gadcons_asked_position_set(E_Smart_Data *sd);
93 static Eina_List *_e_gadcon_layout_smart_gadcons_wrap(E_Smart_Data *sd);
94 static void _e_gadcon_layout_smart_gadcons_position(E_Smart_Data *sd, Eina_List **list);
95 static void _e_gadcon_layout_smart_gadcons_position_static(E_Smart_Data *sd, Eina_List **list);
96 static E_Layout_Item_Container * _e_gadcon_layout_smart_containers_position_adjust(E_Smart_Data *sd, E_Layout_Item_Container *lc, E_Layout_Item_Container *lc2);
97 static void _e_gadcon_layout_smart_position_items_inside_container(E_Smart_Data *sd, E_Layout_Item_Container *lc);
98 static void _e_gadcon_layout_smart_containers_merge(E_Smart_Data *sd, E_Layout_Item_Container *lc, E_Layout_Item_Container *lc2);
99 static void _e_gadcon_layout_smart_restore_gadcons_position_before_move(E_Smart_Data *sd, E_Layout_Item_Container **lc_moving, E_Layout_Item_Container *lc_back, Eina_List **con_list);
101 typedef enum _E_Gadcon_Layout_Item_State
103 E_LAYOUT_ITEM_STATE_NONE,
104 E_LAYOUT_ITEM_STATE_POS_INC,
105 E_LAYOUT_ITEM_STATE_POS_DEC,
106 E_LAYOUT_ITEM_STATE_SIZE_MIN_END_INC,
107 E_LAYOUT_ITEM_STATE_SIZE_MIN_END_DEC,
108 E_LAYOUT_ITEM_STATE_SIZE_MAX_END_INC,
109 E_LAYOUT_ITEM_STATE_SIZE_MAX_END_DEC,
110 } E_Gadcon_Layout_Item_State;
112 typedef enum _E_Gadcon_Layout_Item_Flags
114 E_GADCON_LAYOUT_ITEM_LOCK_NONE = 0x00000000,
115 E_GADCON_LAYOUT_ITEM_LOCK_POSITION = 0x00000001,
116 E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE = 0x00000002
117 } E_Gadcon_Layout_Item_Flags;
119 typedef enum _E_Layout_Item_Container_State
121 E_LAYOUT_ITEM_CONTAINER_STATE_NONE,
122 E_LAYOUT_ITEM_CONTAINER_STATE_POS_INC,
123 E_LAYOUT_ITEM_CONTAINER_STATE_POS_DEC,
124 E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MIN_END_INC,
125 E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MIN_END_DEC,
126 E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MAX_END_INC,
127 E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MAX_END_DEC,
128 E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED
129 } E_Layout_Item_Container_State;
131 struct _E_Layout_Item_Container
133 int pos, size, prev_pos, prev_size;
137 int min_seq, max_seq;
143 E_Layout_Item_Container_State state;
146 #define LC_FREE(__lc) \
148 eina_list_free(__lc->items); \
151 #define E_LAYOUT_ITEM_CONTAINER_STATE_SET(__con_state, __bi_state) \
152 if (__bi_state == E_LAYOUT_ITEM_STATE_NONE) \
153 __con_state = E_LAYOUT_ITEM_CONTAINER_STATE_NONE; \
154 else if (__bi_state == E_LAYOUT_ITEM_STATE_POS_INC) \
155 __con_state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_INC; \
156 else if (__bi_state == E_LAYOUT_ITEM_STATE_POS_DEC) \
157 __con_state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_DEC; \
158 else if (__bi_state == E_LAYOUT_ITEM_STATE_SIZE_MIN_END_INC) \
159 __con_state = E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MIN_END_INC; \
160 else if (__bi_state == E_LAYOUT_ITEM_STATE_SIZE_MIN_END_DEC) \
161 __con_state = E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MIN_END_DEC; \
162 else if (__bi_state == E_LAYOUT_ITEM_STATE_SIZE_MAX_END_INC) \
163 __con_state = E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MAX_END_INC; \
164 else if (__bi_state == E_LAYOUT_ITEM_STATE_SIZE_MAX_END_DEC) \
165 __con_state = E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MAX_END_DEC
167 #define LC_OVERLAP(__lc, __lc2) \
168 ((((__lc2)->pos >= (__lc)->pos) && ((__lc2)->pos < ((__lc)->pos + (__lc)->size))) || \
169 (((__lc)->pos >= (__lc2)->pos) && ((__lc)->pos < ((__lc2)->pos + (__lc2)->size))))
171 #define E_LAYOUT_ITEM_CONTAINER_SIZE_CHANGE_BY(__lc, __bi, __increase) \
174 __lc->size += __bi->w; \
176 __lc->size -= __bi->w; \
179 /********************/
181 static Eina_Hash *providers = NULL;
182 static Eina_List *providers_list = NULL;
183 static Eina_List *gadcons = NULL;
184 static Eina_List *populate_requests = NULL;
185 static Ecore_Idler *populate_idler = NULL;
186 static Eina_List *custom_populate_requests = NULL;
187 static Ecore_Idler *custom_populate_idler = NULL;
188 static Eina_List *gadcon_locations = NULL;
190 /* This is the gadcon client which is currently dragged */
191 static E_Gadcon_Client *drag_gcc = NULL;
192 /* This is the gadcon client created on entering a new shelf */
193 static E_Gadcon_Client *new_gcc = NULL;
195 /* externally accessible functions */
203 e_gadcon_shutdown(void)
205 populate_requests = eina_list_free(populate_requests);
208 ecore_idler_del(populate_idler);
209 populate_idler = NULL;
211 custom_populate_requests = eina_list_free(custom_populate_requests);
212 if (custom_populate_idler)
214 ecore_idler_del(custom_populate_idler);
215 custom_populate_idler = NULL;
222 e_gadcon_provider_register(const E_Gadcon_Client_Class *cc)
224 if (!providers) providers = eina_hash_string_superfast_new(NULL);
225 eina_hash_direct_add(providers, cc->name, cc);
226 providers_list = eina_list_append(providers_list, cc);
227 _e_gadcon_provider_populate_request(cc);
231 e_gadcon_provider_unregister(const E_Gadcon_Client_Class *cc)
233 Eina_List *l, *ll, *dlist = NULL;
235 E_Gadcon_Client *gcc;
237 _e_gadcon_provider_populate_unrequest(cc);
239 EINA_LIST_FOREACH(gadcons, l, gc)
241 EINA_LIST_FOREACH(gc->clients, ll, gcc)
243 if (gcc->client_class == cc)
244 dlist = eina_list_append(dlist, gcc);
247 EINA_LIST_FREE(dlist, gcc)
248 e_object_del(E_OBJECT(gcc));
250 eina_hash_del(providers, cc->name, cc);
251 providers_list = eina_list_remove(providers_list, cc);
255 e_gadcon_provider_list(void)
257 return providers_list;
261 e_gadcon_custom_new(E_Gadcon *gc)
264 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
266 gadcons = eina_list_append(gadcons, gc);
268 if (!custom_populate_idler)
270 custom_populate_idler =
271 ecore_idler_add(_e_gadcon_custom_populate_idler, NULL);
273 if (!eina_list_data_find(custom_populate_requests, gc))
274 custom_populate_requests = eina_list_append(custom_populate_requests, gc);
278 e_gadcon_custom_del(E_Gadcon *gc)
281 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
282 gadcons = eina_list_remove(gadcons, gc);
286 e_gadcon_swallowed_new(const char *name, int id, Evas_Object *obj, const char *swallow_name)
289 E_Config_Gadcon *cf_gc;
291 Evas_Coord x, y, w, h;
292 const char *drop_types[] = { "enlightenment/gadcon_client" };
294 gc = E_OBJECT_ALLOC(E_Gadcon, E_GADCON_TYPE, _e_gadcon_free);
295 if (!gc) return NULL;
297 gc->name = eina_stringshare_add(name);
299 gc->layout_policy = E_GADCON_LAYOUT_POLICY_PANEL;
302 gc->edje.o_parent = obj;
303 gc->edje.swallow_name = eina_stringshare_add(swallow_name);
305 gc->orient = E_GADCON_ORIENT_HORIZ;
306 gc->evas = evas_object_evas_get(obj);
307 gc->o_container = e_gadcon_layout_add(gc->evas);
308 evas_object_geometry_get(gc->o_container, &x, &y, &w, &h);
310 e_drop_handler_add(E_OBJECT(gc), gc,
311 _e_gadcon_cb_dnd_enter, _e_gadcon_cb_dnd_move,
312 _e_gadcon_cb_dnd_leave, _e_gadcon_cb_drop,
313 drop_types, 1, x, y, w, h);
314 evas_object_event_callback_add(gc->o_container, EVAS_CALLBACK_MOVE,
315 _e_gadcon_cb_moveresize, gc);
316 evas_object_event_callback_add(gc->o_container, EVAS_CALLBACK_RESIZE,
317 _e_gadcon_cb_moveresize, gc);
318 evas_object_smart_callback_add(gc->o_container, "size_request",
319 _e_gadcon_cb_size_request, gc);
320 evas_object_smart_callback_add(gc->o_container, "min_size_request",
321 _e_gadcon_cb_min_size_request, gc);
322 evas_object_show(gc->o_container);
323 edje_object_part_swallow(gc->edje.o_parent, gc->edje.swallow_name,
325 gadcons = eina_list_append(gadcons, gc);
327 EINA_LIST_FOREACH(e_config->gadcons, l, cf_gc)
329 if ((!strcmp(cf_gc->name, gc->name)) && (cf_gc->id == gc->id))
337 gc->cf = E_NEW(E_Config_Gadcon, 1);
338 gc->cf->name = eina_stringshare_add(gc->name);
340 if (gc->zone) gc->cf->zone = gc->zone->num;
341 e_config->gadcons = eina_list_append(e_config->gadcons, gc->cf);
342 e_config_save_queue();
348 e_gadcon_swallowed_min_size_set(E_Gadcon *gc, Evas_Coord w, Evas_Coord h)
351 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
352 if (gc->edje.o_parent)
354 edje_extern_object_min_size_set(gc->o_container, w, h);
355 edje_object_part_swallow(gc->edje.o_parent, gc->edje.swallow_name,
361 e_gadcon_min_size_request_callback_set(E_Gadcon *gc, void (*func) (void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h), void *data)
364 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
365 gc->min_size_request.func = func;
366 gc->min_size_request.data = data;
370 e_gadcon_size_request_callback_set(E_Gadcon *gc, void (*func) (void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h), void *data)
373 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
374 gc->resize_request.func = func;
375 gc->resize_request.data = data;
379 e_gadcon_frame_request_callback_set(E_Gadcon *gc, Evas_Object *(*func) (void *data, E_Gadcon_Client *gcc, const char *style), void *data)
382 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
383 gc->frame_request.func = func;
384 gc->frame_request.data = data;
388 e_gadcon_populate_callback_set(E_Gadcon *gc, void (*func) (void *data, E_Gadcon *gc, const E_Gadcon_Client_Class *cc), void *data)
391 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
392 gc->populate_class.func = func;
393 gc->populate_class.data = data;
397 e_gadcon_layout_policy_set(E_Gadcon *gc, E_Gadcon_Layout_Policy layout_policy)
400 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
401 if (gc->layout_policy == layout_policy) return;
402 gc->layout_policy = layout_policy;
403 /* FIXME: delete container obj, re-pack all clients */
407 e_gadcon_populate(E_Gadcon *gc)
410 E_Config_Gadcon_Client *cf_gcc;
413 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
414 e_gadcon_layout_freeze(gc->o_container);
415 EINA_LIST_FOREACH(gc->cf->clients, l, cf_gcc)
417 E_Gadcon_Client_Class *cc;
419 if (!cf_gcc->name) continue;
420 cc = eina_hash_find(providers, cf_gcc->name);
423 E_Gadcon_Client *gcc;
425 if (eina_list_data_find(populate_requests, cc))
429 (_e_gadcon_client_class_feature_check(cc, "id_new", cc->func.id_new)))
430 cf_gcc->id = eina_stringshare_add(cc->func.id_new(cc));
433 gcc = cc->func.init(gc, cf_gcc->name, cf_gcc->id,
436 gcc = cc->func.init(gc, cf_gcc->name, cf_gcc->id,
442 gcc->client_class = cc;
443 gcc->config.pos = cf_gcc->geom.pos;
444 gcc->config.size = cf_gcc->geom.size;
445 gcc->config.res = cf_gcc->geom.res;
446 gcc->state_info.seq = cf_gcc->state_info.seq;
447 gcc->state_info.flags = cf_gcc->state_info.flags;
449 e_gadcon_layout_pack_options_set(gcc->o_frame, gcc);
450 else if (gcc->o_base)
451 e_gadcon_layout_pack_options_set(gcc->o_base, gcc);
453 if (!gcc->autoscroll_set)
454 e_gadcon_client_autoscroll_set(gcc, cf_gcc->autoscroll);
455 // e_gadcon_client_resizable_set(gcc, cf_gcc->resizable);
456 if (gcc->client_class->func.orient)
457 gcc->client_class->func.orient(gcc, gc->orient);
459 _e_gadcon_client_save(gcc);
460 if (gc->editing) e_gadcon_client_edit_begin(gcc);
461 if (gc->instant_edit)
462 e_gadcon_client_util_menu_attach(gcc);
466 e_gadcon_layout_thaw(gc->o_container);
470 e_gadcon_unpopulate(E_Gadcon *gc)
472 E_Gadcon_Client *gcc;
475 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
476 /* Be careful, e_object_del does remove gcc from gc->clients */
479 gcc = eina_list_data_get(gc->clients);
482 e_menu_post_deactivate_callback_set(gcc->menu, NULL, NULL);
483 e_object_del(E_OBJECT(gcc->menu));
486 e_object_del(E_OBJECT(gcc));
491 e_gadcon_populate_class(E_Gadcon *gc, const E_Gadcon_Client_Class *cc)
494 E_Config_Gadcon_Client *cf_gcc;
497 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
498 e_gadcon_layout_freeze(gc->o_container);
499 EINA_LIST_FOREACH(gc->cf->clients, l, cf_gcc)
501 if ((cf_gcc->name) && (cc->name) &&
502 (!strcmp(cf_gcc->name, cc->name)) &&
503 (cf_gcc->id) && (cf_gcc->style))
505 E_Gadcon_Client *gcc;
508 (_e_gadcon_client_class_feature_check((E_Gadcon_Client_Class *)cc, "id_new", cc->func.id_new)))
509 cf_gcc->id = eina_stringshare_add(cc->func.id_new((E_Gadcon_Client_Class *)cc));
511 gcc = cc->func.init(gc, cf_gcc->name, cf_gcc->id,
516 gcc->client_class = cc;
517 gcc->config.pos = cf_gcc->geom.pos;
518 gcc->config.size = cf_gcc->geom.size;
519 gcc->config.res = cf_gcc->geom.res;
520 gcc->state_info.seq = cf_gcc->state_info.seq;
521 gcc->state_info.flags = cf_gcc->state_info.flags;
523 e_gadcon_layout_pack_options_set(gcc->o_frame, gcc);
524 else if (gcc->o_base)
525 e_gadcon_layout_pack_options_set(gcc->o_base, gcc);
527 if (!gcc->autoscroll_set)
528 e_gadcon_client_autoscroll_set(gcc, cf_gcc->autoscroll);
529 // e_gadcon_client_resizable_set(gcc, cf_gcc->resizable);
530 if (gcc->client_class->func.orient)
531 gcc->client_class->func.orient(gcc, gc->orient);
533 _e_gadcon_client_save(gcc);
534 if (gc->editing) e_gadcon_client_edit_begin(gcc);
535 if (gc->instant_edit)
536 e_gadcon_client_util_menu_attach(gcc);
540 e_gadcon_layout_thaw(gc->o_container);
544 e_gadcon_orient(E_Gadcon *gc, E_Gadcon_Orient orient)
547 E_Gadcon_Client *gcc;
551 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
552 if (gc->orient == orient) return;
554 e_gadcon_layout_freeze(gc->o_container);
557 case E_GADCON_ORIENT_FLOAT:
558 case E_GADCON_ORIENT_HORIZ:
559 case E_GADCON_ORIENT_TOP:
560 case E_GADCON_ORIENT_BOTTOM:
561 case E_GADCON_ORIENT_CORNER_TL:
562 case E_GADCON_ORIENT_CORNER_TR:
563 case E_GADCON_ORIENT_CORNER_BL:
564 case E_GADCON_ORIENT_CORNER_BR:
567 case E_GADCON_ORIENT_VERT:
568 case E_GADCON_ORIENT_LEFT:
569 case E_GADCON_ORIENT_RIGHT:
570 case E_GADCON_ORIENT_CORNER_LT:
571 case E_GADCON_ORIENT_CORNER_RT:
572 case E_GADCON_ORIENT_CORNER_LB:
573 case E_GADCON_ORIENT_CORNER_RB:
579 e_gadcon_layout_orientation_set(gc->o_container, horiz);
580 EINA_LIST_FOREACH(gc->clients, l, gcc)
582 e_box_orientation_set(gcc->o_box, horiz);
583 if (gcc->client_class->func.orient)
584 gcc->client_class->func.orient(gcc, gc->orient);
586 e_gadcon_layout_thaw(gc->o_container);
590 e_gadcon_edit_begin(E_Gadcon *gc)
593 E_Gadcon_Client *gcc;
596 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
597 e_gadcon_layout_freeze(gc->o_container);
598 e_gadcon_locked_set(gc, 1);
600 EINA_LIST_FOREACH(gc->clients, l, gcc)
601 e_gadcon_client_edit_begin(gcc);
602 e_gadcon_layout_thaw(gc->o_container);
606 e_gadcon_edit_end(E_Gadcon *gc)
609 E_Gadcon_Client *gcc;
612 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
613 e_gadcon_layout_freeze(gc->o_container);
615 EINA_LIST_FOREACH(gc->clients, l, gcc)
616 e_gadcon_client_edit_end(gcc);
617 e_gadcon_layout_thaw(gc->o_container);
618 e_gadcon_locked_set(gc, 0);
622 e_gadcon_all_edit_begin(void)
627 EINA_LIST_FOREACH(gadcons, l, gc)
628 e_gadcon_edit_begin(gc);
632 e_gadcon_all_edit_end(void)
637 EINA_LIST_FOREACH(gadcons, l, gc)
638 e_gadcon_edit_end(gc);
642 e_gadcon_zone_set(E_Gadcon *gc, E_Zone *zone)
645 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
647 if (gc->cf) gc->cf->zone = zone->num;
651 e_gadcon_zone_get(E_Gadcon *gc)
653 E_OBJECT_CHECK_RETURN(gc, NULL);
654 E_OBJECT_TYPE_CHECK_RETURN(gc, E_GADCON_TYPE, NULL);
659 e_gadcon_ecore_evas_set(E_Gadcon *gc, Ecore_Evas *ee)
662 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
667 e_gadcon_canvas_zone_geometry_get(E_Gadcon *gc, int *x, int *y, int *w, int *h)
669 E_OBJECT_CHECK_RETURN(gc, 0);
670 E_OBJECT_TYPE_CHECK_RETURN(gc, E_GADCON_TYPE, 0);
671 if (!gc->ecore_evas) return 0;
672 ecore_evas_geometry_get(gc->ecore_evas, x, y, w, h);
673 // so much relies on this down here to have been broken... ie return container-relative coords.
676 // if (x) *x = *x - gc->zone->x;
677 // if (y) *y = *y - gc->zone->y;
683 e_gadcon_util_menu_attach_func_set(E_Gadcon *gc, void (*func) (void *data, E_Gadcon_Client *gcc, E_Menu *menu), void *data)
686 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
687 gc->menu_attach.func = func;
688 gc->menu_attach.data = data;
692 e_gadcon_util_lock_func_set(E_Gadcon *gc, void (*func) (void *data, int lock), void *data)
695 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
696 gc->locked_set.func = func;
697 gc->locked_set.data = data;
701 e_gadcon_util_urgent_show_func_set(E_Gadcon *gc, void (*func) (void *data), void *data)
704 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
705 gc->urgent_show.func = func;
706 gc->urgent_show.data = data;
710 e_gadcon_dnd_window_set(E_Gadcon *gc, Ecore_X_Window win)
713 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
718 e_gadcon_dnd_window_get(E_Gadcon *gc)
720 E_OBJECT_CHECK_RETURN(gc, 0);
721 E_OBJECT_TYPE_CHECK_RETURN(gc, E_GADCON_TYPE, 0);
726 e_gadcon_xdnd_window_set(E_Gadcon *gc, Ecore_X_Window win)
729 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
734 e_gadcon_xdnd_window_get(E_Gadcon *gc)
736 E_OBJECT_CHECK_RETURN(gc, 0);
737 E_OBJECT_TYPE_CHECK_RETURN(gc, E_GADCON_TYPE, 0);
742 e_gadcon_shelf_set(E_Gadcon *gc, E_Shelf *shelf)
745 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
750 e_gadcon_shelf_get(E_Gadcon *gc)
752 E_OBJECT_CHECK_RETURN(gc, NULL);
753 E_OBJECT_TYPE_CHECK_RETURN(gc, E_GADCON_TYPE, NULL);
758 e_gadcon_toolbar_set(E_Gadcon *gc, E_Toolbar *toolbar)
761 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
762 gc->toolbar = toolbar;
766 e_gadcon_toolbar_get(E_Gadcon *gc)
768 E_OBJECT_CHECK_RETURN(gc, NULL);
769 E_OBJECT_TYPE_CHECK_RETURN(gc, E_GADCON_TYPE, NULL);
773 EAPI E_Config_Gadcon_Client *
774 e_gadcon_client_config_new(E_Gadcon *gc, const char *name)
776 E_Gadcon_Client_Class *cc;
777 E_Config_Gadcon_Client *cf_gcc;
779 E_OBJECT_CHECK_RETURN(gc, NULL);
780 E_OBJECT_TYPE_CHECK_RETURN(gc, E_GADCON_TYPE, NULL);
781 if (!name) return NULL;
782 cc = eina_hash_find(providers, name);
783 if (!cc) return NULL;
784 if (!_e_gadcon_client_class_feature_check(cc, "id_new", cc->func.id_new))
787 cf_gcc = E_NEW(E_Config_Gadcon_Client, 1);
788 if (!cf_gcc) return NULL;
789 cf_gcc->id = eina_stringshare_add(cc->func.id_new(cc));
795 cf_gcc->name = eina_stringshare_add(name);
797 cf_gcc->geom.res = gc->zone->w;
799 cf_gcc->geom.res = 800;
800 cf_gcc->geom.size = 80;
801 cf_gcc->geom.pos = cf_gcc->geom.res - cf_gcc->geom.size;
802 cf_gcc->style = NULL;
803 cf_gcc->autoscroll = 0;
804 cf_gcc->resizable = 0;
805 gc->cf->clients = eina_list_append(gc->cf->clients, cf_gcc);
806 e_config_save_queue();
811 e_gadcon_client_config_del(E_Config_Gadcon *cf_gc, E_Config_Gadcon_Client *cf_gcc)
814 if (cf_gcc->name) eina_stringshare_del(cf_gcc->name);
815 if (cf_gcc->id) eina_stringshare_del(cf_gcc->id);
816 if (cf_gcc->style) eina_stringshare_del(cf_gcc->style);
817 if (cf_gc) cf_gc->clients = eina_list_remove(cf_gc->clients, cf_gcc);
821 EAPI E_Gadcon_Client *
822 e_gadcon_client_new(E_Gadcon *gc, const char *name, const char *id __UNUSED__, const char *style, Evas_Object *base_obj)
824 E_Gadcon_Client *gcc;
826 E_OBJECT_CHECK_RETURN(gc, NULL);
827 E_OBJECT_TYPE_CHECK_RETURN(gc, E_GADCON_TYPE, NULL);
828 gcc = E_OBJECT_ALLOC(E_Gadcon_Client, E_GADCON_CLIENT_TYPE,
829 _e_gadcon_client_free);
830 if (!gcc) return NULL;
831 gcc->name = eina_stringshare_add(name);
833 gcc->o_base = base_obj;
835 gcc->id = E_GADCON_CLIENT(eina_list_data_get(eina_list_last(gc->clients)))->id + 1;
836 gc->clients = eina_list_append(gc->clients, gcc);
837 /* This must only be unique during runtime */
839 evas_object_event_callback_add(gcc->o_base, EVAS_CALLBACK_DEL,
840 _e_gadcon_client_del_hook, gcc);
841 if ((gc->frame_request.func) && (style))
843 gcc->o_frame = gc->frame_request.func(gc->frame_request.data, gcc, style);
844 gcc->style = eina_stringshare_add(style);
847 edje_object_size_min_calc(gcc->o_frame, &(gcc->pad.w), &(gcc->pad.h));
848 gcc->o_box = e_box_add(gcc->gadcon->evas);
849 switch (gcc->gadcon->orient)
851 case E_GADCON_ORIENT_FLOAT:
852 case E_GADCON_ORIENT_HORIZ:
853 case E_GADCON_ORIENT_TOP:
854 case E_GADCON_ORIENT_BOTTOM:
855 case E_GADCON_ORIENT_CORNER_TL:
856 case E_GADCON_ORIENT_CORNER_TR:
857 case E_GADCON_ORIENT_CORNER_BL:
858 case E_GADCON_ORIENT_CORNER_BR:
859 e_box_orientation_set(gcc->o_box, 1);
861 case E_GADCON_ORIENT_VERT:
862 case E_GADCON_ORIENT_LEFT:
863 case E_GADCON_ORIENT_RIGHT:
864 case E_GADCON_ORIENT_CORNER_LT:
865 case E_GADCON_ORIENT_CORNER_RT:
866 case E_GADCON_ORIENT_CORNER_LB:
867 case E_GADCON_ORIENT_CORNER_RB:
868 e_box_orientation_set(gcc->o_box, 0);
873 evas_object_event_callback_add(gcc->o_box, EVAS_CALLBACK_MOVE,
874 _e_gadcon_cb_client_frame_moveresize, gcc);
875 evas_object_event_callback_add(gcc->o_box, EVAS_CALLBACK_RESIZE,
876 _e_gadcon_cb_client_frame_moveresize, gcc);
877 evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOUSE_MOVE,
878 _e_gadcon_cb_client_frame_mouse_move, gcc);
881 e_box_pack_end(gcc->o_box, gcc->o_base);
882 e_box_pack_options_set(gcc->o_base,
885 0.5, 0.5, /* align */
890 edje_object_part_swallow(gcc->o_frame, gc->edje.swallow_name, gcc->o_box);
891 evas_object_show(gcc->o_box);
892 evas_object_show(gcc->o_frame);
896 e_gadcon_layout_pack(gc->o_container, gcc->o_frame);
897 else if (gcc->o_base)
898 e_gadcon_layout_pack(gc->o_container, gcc->o_base);
899 if (gcc->o_base) evas_object_show(gcc->o_base);
904 e_gadcon_client_edit_begin(E_Gadcon_Client *gcc)
906 Evas_Coord x, y, w, h;
909 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
910 if (gcc->o_control) return;
913 evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h);
914 else if (gcc->o_base)
915 evas_object_geometry_get(gcc->o_base, &x, &y, &w, &h);
916 else return; /* make clang happy */
918 gcc->o_control = edje_object_add(gcc->gadcon->evas);
919 evas_object_layer_set(gcc->o_control, 100);
920 e_gadcon_locked_set(gcc->gadcon, 1);
921 gcc->gadcon->editing = 1;
923 evas_object_move(gcc->o_control, x, y);
924 evas_object_resize(gcc->o_control, w, h);
925 e_theme_edje_object_set(gcc->o_control, "base/theme/gadman",
928 if ((gcc->autoscroll)/* || (gcc->resizable)*/)
930 if (e_box_orientation_get(gcc->o_box))
931 edje_object_signal_emit(gcc->o_control, "e,state,hsize,on", "e");
933 edje_object_signal_emit(gcc->o_control, "e,state,vsize,on", "e");
937 edje_object_signal_emit(gcc->o_control, "e,state,hsize,off", "e");
938 edje_object_signal_emit(gcc->o_control, "e,state,vsize,off", "e");
940 edje_object_signal_emit(gcc->o_control, "e,state,move,on", "e");
942 gcc->o_event = evas_object_rectangle_add(gcc->gadcon->evas);
943 evas_object_color_set(gcc->o_event, 0, 0, 0, 0);
944 evas_object_repeat_events_set(gcc->o_event, 1);
945 evas_object_layer_set(gcc->o_event, 100);
946 evas_object_move(gcc->o_event, x, y);
947 evas_object_resize(gcc->o_event, w, h);
949 edje_object_signal_callback_add(gcc->o_control, "e,action,move,start", "",
950 _e_gadcon_cb_signal_move_start, gcc);
951 edje_object_signal_callback_add(gcc->o_control, "e,action,move,stop", "",
952 _e_gadcon_cb_signal_move_stop, gcc);
953 edje_object_signal_callback_add(gcc->o_control, "e,action,move,go", "",
954 _e_gadcon_cb_signal_move_go, gcc);
955 edje_object_signal_callback_add(gcc->o_control, "e,action,resize,left,start", "",
956 _e_gadcon_cb_signal_resize_left_start, gcc);
957 edje_object_signal_callback_add(gcc->o_control, "e,action,resize,left,stop", "",
958 _e_gadcon_cb_signal_resize_left_stop, gcc);
959 edje_object_signal_callback_add(gcc->o_control, "e,action,resize,left,go", "",
960 _e_gadcon_cb_signal_resize_left_go, gcc);
961 edje_object_signal_callback_add(gcc->o_control, "e,action,resize,right,start", "",
962 _e_gadcon_cb_signal_resize_right_start, gcc);
963 edje_object_signal_callback_add(gcc->o_control, "e,action,resize,right,stop", "",
964 _e_gadcon_cb_signal_resize_right_stop, gcc);
965 edje_object_signal_callback_add(gcc->o_control, "e,action,resize,right,go", "",
966 _e_gadcon_cb_signal_resize_right_go, gcc);
967 edje_object_signal_callback_add(gcc->o_control, "e,action,resize,up,start", "",
968 _e_gadcon_cb_signal_resize_left_start, gcc);
969 edje_object_signal_callback_add(gcc->o_control, "e,action,resize,up,stop", "",
970 _e_gadcon_cb_signal_resize_left_stop, gcc);
971 edje_object_signal_callback_add(gcc->o_control, "e,action,resize,up,go", "",
972 _e_gadcon_cb_signal_resize_left_go, gcc);
973 edje_object_signal_callback_add(gcc->o_control, "e,action,resize,down,start", "",
974 _e_gadcon_cb_signal_resize_right_start, gcc);
975 edje_object_signal_callback_add(gcc->o_control, "e,action,resize,down,stop", "",
976 _e_gadcon_cb_signal_resize_right_stop, gcc);
977 edje_object_signal_callback_add(gcc->o_control, "e,action,resize,down,go", "",
978 _e_gadcon_cb_signal_resize_right_go, gcc);
980 evas_object_event_callback_add(gcc->o_event, EVAS_CALLBACK_MOUSE_DOWN,
981 _e_gadcon_cb_client_mouse_down, gcc);
982 evas_object_event_callback_add(gcc->o_event, EVAS_CALLBACK_MOUSE_IN,
983 _e_gadcon_cb_client_mouse_in, gcc);
984 evas_object_event_callback_add(gcc->o_event, EVAS_CALLBACK_MOUSE_OUT,
985 _e_gadcon_cb_client_mouse_out, gcc);
989 evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOVE,
990 _e_gadcon_cb_client_move, gcc);
991 evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_RESIZE,
992 _e_gadcon_cb_client_resize, gcc);
994 else if (gcc->o_base)
996 evas_object_event_callback_add(gcc->o_base, EVAS_CALLBACK_MOVE,
997 _e_gadcon_cb_client_move, gcc);
998 evas_object_event_callback_add(gcc->o_base, EVAS_CALLBACK_RESIZE,
999 _e_gadcon_cb_client_resize, gcc);
1002 evas_object_show(gcc->o_event);
1003 evas_object_show(gcc->o_control);
1007 e_gadcon_client_edit_end(E_Gadcon_Client *gcc)
1009 Eina_List *l = NULL;
1010 E_Gadcon_Client *client = NULL;
1012 E_OBJECT_CHECK(gcc);
1013 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1017 evas_object_event_callback_del(gcc->o_frame, EVAS_CALLBACK_MOVE,
1018 _e_gadcon_cb_client_move);
1019 evas_object_event_callback_del(gcc->o_frame, EVAS_CALLBACK_RESIZE,
1020 _e_gadcon_cb_client_resize);
1022 else if (gcc->o_base)
1024 evas_object_event_callback_del(gcc->o_base, EVAS_CALLBACK_MOVE,
1025 _e_gadcon_cb_client_move);
1026 evas_object_event_callback_del(gcc->o_base, EVAS_CALLBACK_RESIZE,
1027 _e_gadcon_cb_client_resize);
1033 _e_gadcon_client_save(gcc);
1035 if (gcc->o_event) evas_object_del(gcc->o_event);
1036 gcc->o_event = NULL;
1037 if (gcc->o_control) evas_object_del(gcc->o_control);
1038 gcc->o_control = NULL;
1040 EINA_LIST_FOREACH(gcc->gadcon->clients, l, client)
1042 if (!client) continue;
1043 if (client->o_control) return;
1045 gcc->gadcon->editing = 0;
1046 e_gadcon_locked_set(gcc->gadcon, 0);
1050 e_gadcon_client_show(E_Gadcon_Client *gcc)
1052 E_OBJECT_CHECK(gcc);
1053 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1055 if (!gcc->hidden) return;
1056 if (gcc->o_box) evas_object_show(gcc->o_box);
1057 if (gcc->o_frame) evas_object_show(gcc->o_frame);
1058 if (gcc->o_base) evas_object_show(gcc->o_base);
1059 if (gcc->o_control) evas_object_show(gcc->o_control);
1060 if (gcc->o_event) evas_object_show(gcc->o_event);
1063 e_gadcon_layout_pack(gcc->gadcon->o_container, gcc->o_frame);
1064 e_gadcon_layout_pack_options_set(gcc->o_frame, gcc);
1066 else if (gcc->o_base)
1068 e_gadcon_layout_pack(gcc->gadcon->o_container, gcc->o_base);
1069 e_gadcon_layout_pack_options_set(gcc->o_base, gcc);
1075 e_gadcon_client_hide(E_Gadcon_Client *gcc)
1077 E_OBJECT_CHECK(gcc);
1078 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1080 if (gcc->hidden) return;
1081 if (gcc->o_box) evas_object_hide(gcc->o_box);
1082 if (gcc->o_frame) evas_object_hide(gcc->o_frame);
1083 if (gcc->o_base) evas_object_hide(gcc->o_base);
1084 if (gcc->o_control) evas_object_hide(gcc->o_control);
1085 if (gcc->o_event) evas_object_hide(gcc->o_event);
1087 e_gadcon_layout_unpack(gcc->o_frame);
1088 else if (gcc->o_base)
1089 e_gadcon_layout_unpack(gcc->o_base);
1094 e_gadcon_client_size_request(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h)
1096 E_OBJECT_CHECK(gcc);
1097 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1098 switch (gcc->gadcon->orient)
1100 case E_GADCON_ORIENT_HORIZ:
1101 case E_GADCON_ORIENT_TOP:
1102 case E_GADCON_ORIENT_BOTTOM:
1104 e_gadcon_layout_pack_size_set(gcc->o_frame, w + gcc->pad.w);
1105 else if (gcc->o_base)
1106 e_gadcon_layout_pack_size_set(gcc->o_base, w);
1108 case E_GADCON_ORIENT_VERT:
1109 case E_GADCON_ORIENT_LEFT:
1110 case E_GADCON_ORIENT_RIGHT:
1112 e_gadcon_layout_pack_size_set(gcc->o_frame, h + gcc->pad.h);
1113 else if (gcc->o_base)
1114 e_gadcon_layout_pack_size_set(gcc->o_base, h);
1116 case E_GADCON_ORIENT_FLOAT:
1117 case E_GADCON_ORIENT_CORNER_TL:
1118 case E_GADCON_ORIENT_CORNER_TR:
1119 case E_GADCON_ORIENT_CORNER_BL:
1120 case E_GADCON_ORIENT_CORNER_BR:
1121 case E_GADCON_ORIENT_CORNER_LT:
1122 case E_GADCON_ORIENT_CORNER_RT:
1123 case E_GADCON_ORIENT_CORNER_LB:
1124 case E_GADCON_ORIENT_CORNER_RB:
1131 e_gadcon_client_min_size_set(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h)
1133 E_OBJECT_CHECK(gcc);
1134 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1137 /* if (!gcc->resizable)*/
1140 e_gadcon_layout_pack_min_size_set(gcc->o_frame, w + gcc->pad.w,
1142 else if (gcc->o_base)
1143 e_gadcon_layout_pack_min_size_set(gcc->o_base, w, h);
1145 _e_gadcon_moveresize_handle(gcc);
1149 e_gadcon_client_aspect_set(E_Gadcon_Client *gcc, int w, int h)
1151 E_OBJECT_CHECK(gcc);
1152 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1155 // if ((!gcc->autoscroll)/* && (!gcc->resizable)*/)
1159 e_gadcon_layout_pack_aspect_pad_set(gcc->o_frame, gcc->pad.w,
1161 e_gadcon_layout_pack_aspect_set(gcc->o_frame, w, h);
1163 else if (gcc->o_base)
1164 e_gadcon_layout_pack_aspect_set(gcc->o_base, w, h);
1166 _e_gadcon_moveresize_handle(gcc);
1170 e_gadcon_client_autoscroll_set(E_Gadcon_Client *gcc, int autoscroll)
1172 E_OBJECT_CHECK(gcc);
1173 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1175 gcc->autoscroll = autoscroll;
1176 gcc->autoscroll_set = 1;
1178 if (gcc->autoscroll)
1182 e_gadcon_layout_pack_aspect_pad_set(gcc->o_frame, gcc->pad.w,
1184 e_gadcon_layout_pack_aspect_set(gcc->o_frame, 0, 0);
1185 e_gadcon_layout_pack_min_size_set(gcc->o_frame, 0, 0);
1187 else if (gcc->o_base)
1189 e_gadcon_layout_pack_aspect_set(gcc->o_base, 0, 0);
1190 e_gadcon_layout_pack_min_size_set(gcc->o_base, 0, 0);
1198 e_gadcon_layout_pack_aspect_pad_set(gcc->o_frame, gcc->pad.w,
1200 e_gadcon_layout_pack_aspect_set(gcc->o_frame, gcc->aspect.w,
1202 e_gadcon_layout_pack_min_size_set(gcc->o_frame, gcc->min.w,
1205 else if (gcc->o_base)
1207 e_gadcon_layout_pack_min_size_set(gcc->o_base, gcc->min.w,
1209 e_gadcon_layout_pack_aspect_set(gcc->o_base, gcc->aspect.w,
1216 e_gadcon_client_resizable_set(E_Gadcon_Client *gcc, int resizable)
1218 E_OBJECT_CHECK(gcc);
1219 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1221 gcc->resizable = resizable;
1226 e_gadcon_layout_pack_aspect_pad_set(gcc->o_frame, gcc->pad.w,
1228 e_gadcon_layout_pack_aspect_set(gcc->o_frame, 0, 0);
1229 e_gadcon_layout_pack_min_size_set(gcc->o_frame, 0, 0);
1231 else if (gcc->o_base)
1233 e_gadcon_layout_pack_min_size_set(gcc->o_base, 0, 0);
1234 e_gadcon_layout_pack_aspect_set(gcc->o_base, 0, 0);
1241 e_gadcon_layout_pack_aspect_pad_set(gcc->o_frame, gcc->pad.w,
1243 e_gadcon_layout_pack_aspect_set(gcc->o_frame, gcc->aspect.w,
1245 e_gadcon_layout_pack_min_size_set(gcc->o_frame, gcc->min.w,
1248 else if (gcc->o_base)
1250 e_gadcon_layout_pack_min_size_set(gcc->o_base, gcc->min.w,
1252 e_gadcon_layout_pack_aspect_set(gcc->o_base, gcc->aspect.w,
1262 e_gadcon_client_geometry_get(E_Gadcon_Client *gcc, int *x, int *y, int *w, int *h)
1266 E_OBJECT_CHECK(gcc);
1267 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1268 if (!e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &gx, &gy, NULL, NULL))
1270 if (gcc->o_base) evas_object_geometry_get(gcc->o_base, x, y, w, h);
1277 e_gadcon_client_viewport_geometry_get(E_Gadcon_Client *gcc, int *x, int *y, int *w, int *h)
1279 E_OBJECT_CHECK(gcc);
1280 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1282 if (gcc->o_box) evas_object_geometry_get(gcc->o_base, x, y, w, h);
1283 else if (gcc->o_base) evas_object_geometry_get(gcc->o_base, x, y, w, h);
1295 e_gadcon_client_zone_get(E_Gadcon_Client *gcc)
1297 E_OBJECT_CHECK_RETURN(gcc, NULL);
1298 E_OBJECT_TYPE_CHECK_RETURN(gcc, E_GADCON_CLIENT_TYPE, NULL);
1299 return e_gadcon_zone_get(gcc->gadcon);
1303 _e_gadcon_client_change_gadcon(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
1305 E_Gadcon_Location *src, *dst;
1306 E_Gadcon_Client * gcc;
1309 src = gcc->gadcon->location;
1310 dst = e_object_data_get(E_OBJECT(mi));
1311 _e_gadcon_location_change(gcc, src, dst);
1315 _e_gadcon_add_locations_menu_for_site(E_Menu *m, E_Gadcon_Client *gcc, E_Gadcon_Site site, int * count)
1319 E_Gadcon_Location * loc;
1322 EINA_LIST_FOREACH(gadcon_locations, l, loc)
1324 if (loc->site == site)
1329 mi = e_menu_item_new(m);
1330 e_menu_item_separator_set(mi, 1);
1333 mi = e_menu_item_new(m);
1334 e_menu_item_label_set(mi, loc->name);
1335 e_object_data_set(E_OBJECT(mi), loc);
1336 e_menu_item_callback_set(mi, _e_gadcon_client_change_gadcon, gcc);
1337 if (loc == gcc->gadcon->location) e_menu_item_disabled_set(mi, 1);
1339 e_util_menu_item_theme_icon_set(mi, loc->icon_name);
1346 _e_gadcon_gadget_move_to_pre_cb(void *data, E_Menu *m)
1348 E_Gadcon_Client *gcc;
1351 e_menu_pre_activate_callback_set(m, NULL, NULL);
1354 if (!gcc->client_class->func.is_site || gcc->client_class->func.is_site(E_GADCON_SITE_SHELF))
1355 _e_gadcon_add_locations_menu_for_site(m, gcc, E_GADCON_SITE_SHELF, &n);
1356 if (!gcc->client_class->func.is_site || gcc->client_class->func.is_site(E_GADCON_SITE_DESKTOP))
1357 _e_gadcon_add_locations_menu_for_site(m, gcc, E_GADCON_SITE_DESKTOP, &n);
1358 if (!gcc->client_class->func.is_site || gcc->client_class->func.is_site(E_GADCON_SITE_TOOLBAR))
1359 _e_gadcon_add_locations_menu_for_site(m, gcc, E_GADCON_SITE_TOOLBAR, &n);
1360 if (!gcc->client_class->func.is_site || gcc->client_class->func.is_site(E_GADCON_SITE_EFM_TOOLBAR))
1361 _e_gadcon_add_locations_menu_for_site(m, gcc, E_GADCON_SITE_EFM_TOOLBAR, &n);
1362 _e_gadcon_add_locations_menu_for_site(m, gcc, E_GADCON_SITE_UNKNOWN, &n);
1366 e_gadcon_client_add_location_menu(E_Gadcon_Client *gcc, E_Menu *menu)
1371 E_OBJECT_CHECK(gcc);
1372 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1374 if (gcc->gadcon->location)
1377 mi = e_menu_item_new(menu);
1378 e_menu_item_label_set(mi, _("Move to"));
1379 e_util_menu_item_theme_icon_set(mi, "preferences-look");
1380 e_menu_item_submenu_set(mi, mn);
1381 e_menu_pre_activate_callback_set(mn, _e_gadcon_gadget_move_to_pre_cb, gcc);
1386 e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu_gadget, int flags __UNUSED__)
1388 E_Menu *mo, *menu_main = NULL;
1392 E_OBJECT_CHECK(gcc);
1393 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1395 if (e_config->menu_gadcon_client_toplevel)
1396 menu_main = menu_gadget;
1398 menu_main = e_menu_new();
1400 if ((gcc->gadcon->shelf) || (gcc->gadcon->toolbar))
1402 if (e_menu_item_nth(menu_gadget, 0))
1404 mi = e_menu_item_new(menu_gadget);
1405 e_menu_item_separator_set(mi, 1);
1407 if (!gcc->o_control)
1409 mi = e_menu_item_new(menu_gadget);
1410 e_menu_item_label_set(mi, _("Move"));
1411 e_util_menu_item_theme_icon_set(mi, "transform-scale");
1412 e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_edit, gcc);
1415 mi = e_menu_item_new(menu_gadget);
1416 e_menu_item_label_set(mi, _("Resizeable"));
1417 e_util_menu_item_theme_icon_set(mi, "transform-scale");
1418 e_menu_item_check_set(mi, 1);
1419 if (gcc->resizable) e_menu_item_toggle_set(mi, 1);
1420 e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_resizable, gcc);
1422 mi = e_menu_item_new(menu_gadget);
1423 e_menu_item_label_set(mi, _("Automatically scroll contents"));
1424 e_util_menu_item_theme_icon_set(mi, "transform-move");
1425 e_menu_item_check_set(mi, 1);
1426 if (gcc->autoscroll) e_menu_item_toggle_set(mi, 1);
1427 e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_autoscroll, gcc);
1429 if (gcc->gadcon->shelf)
1433 mi = e_menu_item_new(mo);
1434 e_menu_item_label_set(mi, _("Plain"));
1435 e_util_menu_item_theme_icon_set(mi, "enlightenment/plain");
1436 e_menu_item_radio_group_set(mi, 1);
1437 e_menu_item_radio_set(mi, 1);
1438 if ((gcc->style) && (!strcmp(gcc->style, E_GADCON_CLIENT_STYLE_PLAIN)))
1439 e_menu_item_toggle_set(mi, 1);
1440 e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_style_plain, gcc);
1442 mi = e_menu_item_new(mo);
1443 e_menu_item_label_set(mi, _("Inset"));
1444 e_util_menu_item_theme_icon_set(mi, "enlightenment/inset");
1445 e_menu_item_radio_group_set(mi, 1);
1446 e_menu_item_radio_set(mi, 1);
1447 if ((gcc->style) && (!strcmp(gcc->style, E_GADCON_CLIENT_STYLE_INSET)))
1448 e_menu_item_toggle_set(mi, 1);
1449 e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_style_inset, gcc);
1451 mi = e_menu_item_new(menu_gadget);
1452 e_menu_item_label_set(mi, _("Look"));
1453 e_util_menu_item_theme_icon_set(mi, "preferences-look");
1454 e_menu_item_submenu_set(mi, mo);
1457 mi = e_menu_item_new(menu_gadget);
1458 e_menu_item_separator_set(mi, 1);
1460 e_gadcon_client_add_location_menu(gcc, menu_gadget);
1462 mi = e_menu_item_new(menu_gadget);
1463 e_menu_item_label_set(mi, _("Remove"));
1464 e_util_menu_item_theme_icon_set(mi, "list-remove");
1465 e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_remove, gcc);
1468 if (!e_config->menu_gadcon_client_toplevel)
1470 mi = e_menu_item_new(menu_main);
1471 if (gcc->client_class->func.label)
1472 snprintf(buf, sizeof(buf), "%s",
1473 gcc->client_class->func.label((E_Gadcon_Client_Class *)gcc->client_class));
1475 snprintf(buf, sizeof(buf), "%s", gcc->name);
1477 e_menu_item_label_set(mi, _(buf));
1478 e_menu_item_realize_callback_set(mi, _e_gadcon_client_cb_menu_pre, gcc);
1479 e_menu_item_submenu_set(mi, menu_gadget);
1482 if (gcc->gadcon->menu_attach.func)
1484 if ((gcc->gadcon->shelf) || (gcc->gadcon->toolbar))
1486 if (e_config->menu_gadcon_client_toplevel)
1488 mi = e_menu_item_new(menu_main);
1489 e_menu_item_separator_set(mi, 1);
1491 gcc->gadcon->menu_attach.func(gcc->gadcon->menu_attach.data, gcc, menu_main);
1494 gcc->gadcon->menu_attach.func(gcc->gadcon->menu_attach.data, gcc, menu_gadget);
1501 e_gadcon_client_util_menu_attach(E_Gadcon_Client *gcc)
1503 E_OBJECT_CHECK(gcc);
1504 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1507 evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOUSE_DOWN,
1508 _e_gadcon_client_cb_mouse_down, gcc);
1509 evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOUSE_UP,
1510 _e_gadcon_client_cb_mouse_up, gcc);
1511 evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOUSE_MOVE,
1512 _e_gadcon_client_cb_mouse_move, gcc);
1514 else if (gcc->o_base)
1516 evas_object_event_callback_add(gcc->o_base, EVAS_CALLBACK_MOUSE_DOWN,
1517 _e_gadcon_client_cb_mouse_down, gcc);
1518 evas_object_event_callback_add(gcc->o_base, EVAS_CALLBACK_MOUSE_UP,
1519 _e_gadcon_client_cb_mouse_up, gcc);
1520 evas_object_event_callback_add(gcc->o_base, EVAS_CALLBACK_MOUSE_MOVE,
1521 _e_gadcon_client_cb_mouse_move, gcc);
1526 e_gadcon_locked_set(E_Gadcon *gc, int lock)
1529 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
1530 if (gc->locked_set.func)
1531 gc->locked_set.func(gc->locked_set.data, lock);
1535 e_gadcon_urgent_show(E_Gadcon *gc)
1538 E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
1539 if (gc->urgent_show.func)
1540 gc->urgent_show.func(gc->urgent_show.data);
1544 * NOTE: x & y are relative to the o_box of the gadcon.
1547 e_gadcon_client_autoscroll_update(E_Gadcon_Client *gcc, Evas_Coord x, Evas_Coord y)
1549 E_OBJECT_CHECK(gcc);
1550 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1552 if (gcc->autoscroll)
1557 /* TODO: When using gadman there is no o_box! */
1558 evas_object_geometry_get(gcc->o_box, NULL, NULL, &w, &h);
1559 if (e_box_orientation_get(gcc->o_box))
1561 if (w > 1) d = (double)x / (double)(w - 1);
1566 if (h > 1) d = (double)y / (double)(h - 1);
1569 if (d < 0.0) d = 0.0;
1570 else if (d > 1.0) d = 1.0;
1571 if (!gcc->scroll_timer)
1573 ecore_timer_add(0.01, _e_gadcon_cb_client_scroll_timer, gcc);
1574 if (!gcc->scroll_animator)
1575 gcc->scroll_animator =
1576 ecore_animator_add(_e_gadcon_cb_client_scroll_animator, gcc);
1577 gcc->scroll_wanted = d;
1582 e_gadcon_client_autoscroll_cb_set(E_Gadcon_Client *gcc, void (*func)(void *data), void *data)
1584 E_OBJECT_CHECK(gcc);
1585 E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
1586 gcc->scroll_cb.func = func;
1587 gcc->scroll_cb.data = data;
1591 e_gadcon_site_is_shelf(E_Gadcon_Site site)
1593 return (site == E_GADCON_SITE_SHELF);
1597 e_gadcon_site_is_desktop(E_Gadcon_Site site)
1599 return (site == E_GADCON_SITE_DESKTOP);
1603 e_gadcon_site_is_efm_toolbar(E_Gadcon_Site site)
1605 return (site == E_GADCON_SITE_EFM_TOOLBAR);
1609 e_gadcon_site_is_any_toolbar(E_Gadcon_Site site)
1613 // there should be all toolbar sities identifiers
1614 case E_GADCON_SITE_TOOLBAR:
1615 case E_GADCON_SITE_EFM_TOOLBAR:
1624 e_gadcon_site_is_not_toolbar(E_Gadcon_Site site)
1628 // there should be all toolbar sities identifiers
1629 case E_GADCON_SITE_TOOLBAR:
1630 case E_GADCON_SITE_EFM_TOOLBAR:
1638 /* local subsystem functions */
1640 _e_gadcon_free(E_Gadcon *gc)
1642 e_gadcon_unpopulate(gc);
1643 gadcons = eina_list_remove(gadcons, gc);
1644 if (gc->o_container) evas_object_del(gc->o_container);
1645 eina_stringshare_del(gc->name);
1646 eina_stringshare_del(gc->edje.swallow_name);
1647 if (gc->config_dialog) e_object_del(E_OBJECT(gc->config_dialog));
1648 if (gc->drop_handler) e_drop_handler_del(gc->drop_handler);
1653 _e_gadcon_client_free(E_Gadcon_Client *gcc)
1655 if (gcc->instant_edit_timer)
1657 ecore_timer_del(gcc->instant_edit_timer);
1658 gcc->instant_edit_timer = NULL;
1661 evas_object_event_callback_del(gcc->o_base, EVAS_CALLBACK_DEL,
1662 _e_gadcon_client_del_hook);
1665 e_menu_post_deactivate_callback_set(gcc->menu, NULL, NULL);
1666 e_object_del(E_OBJECT(gcc->menu));
1669 e_gadcon_client_edit_end(gcc);
1670 gcc->client_class->func.shutdown(gcc);
1671 if ((gcc->client_class->func.id_del) && (gcc->cf))
1672 gcc->client_class->func.id_del((E_Gadcon_Client_Class *)gcc->client_class,
1674 gcc->gadcon->clients = eina_list_remove(gcc->gadcon->clients, gcc);
1675 if (gcc->o_box) evas_object_del(gcc->o_box);
1676 if (gcc->o_frame) evas_object_del(gcc->o_frame);
1677 eina_stringshare_del(gcc->name);
1678 if (gcc->scroll_timer) ecore_timer_del(gcc->scroll_timer);
1679 if (gcc->scroll_animator) ecore_animator_del(gcc->scroll_animator);
1680 if (gcc->style) eina_stringshare_del(gcc->style);
1685 _e_gadcon_moveresize_handle(E_Gadcon_Client *gcc)
1689 evas_object_geometry_get(gcc->o_box, NULL, NULL, &w, &h);
1693 if (e_box_orientation_get(gcc->o_box))
1695 if ((gcc->aspect.w > 0) && (gcc->aspect.h > 0))
1696 w = (h * gcc->aspect.w) / gcc->aspect.h;
1700 if ((gcc->aspect.w > 0) && (gcc->aspect.h > 0))
1701 h = (w * gcc->aspect.h) / gcc->aspect.w;
1705 if (gcc->autoscroll)
1707 if (e_box_orientation_get(gcc->o_box))
1709 if ((gcc->aspect.w > 0) && (gcc->aspect.h > 0))
1711 w = (h * gcc->aspect.w) / gcc->aspect.h; // ZZZZ
1721 if ((gcc->aspect.w > 0) && (gcc->aspect.h > 0))
1723 h = (w * gcc->aspect.h) / gcc->aspect.w; // ZZZZ
1733 e_box_pack_options_set(gcc->o_base,
1736 0.5, 0.5, /* align */
1743 _e_gadcon_cb_client_scroll_timer(void *data)
1745 E_Gadcon_Client *gcc;
1749 d = gcc->scroll_wanted - gcc->scroll_pos;
1753 gcc->scroll_pos = gcc->scroll_wanted;
1754 gcc->scroll_timer = NULL;
1755 return ECORE_CALLBACK_CANCEL;
1758 gcc->scroll_pos = (gcc->scroll_pos * (1.0 - v)) + (gcc->scroll_wanted * v);
1759 return ECORE_CALLBACK_RENEW;
1763 _e_gadcon_cb_client_scroll_animator(void *data)
1765 E_Gadcon_Client *gcc;
1768 if (e_box_orientation_get(gcc->o_box))
1769 e_box_align_set(gcc->o_box, 1.0 - gcc->scroll_pos, 0.5);
1771 e_box_align_set(gcc->o_box, 0.5, 1.0 - gcc->scroll_pos);
1772 if (!gcc->scroll_timer)
1774 gcc->scroll_animator = NULL;
1775 return ECORE_CALLBACK_CANCEL;
1778 if (gcc->scroll_cb.func)
1779 gcc->scroll_cb.func(gcc->scroll_cb.data);
1781 return ECORE_CALLBACK_RENEW;
1785 _e_gadcon_cb_client_frame_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1787 Evas_Event_Mouse_Move *ev;
1788 E_Gadcon_Client *gcc;
1793 evas_object_geometry_get(gcc->o_box, &x, &y, NULL, NULL);
1794 e_gadcon_client_autoscroll_update(gcc, ev->cur.output.x - x,
1795 ev->cur.output.y - y);
1799 _e_gadcon_cb_client_frame_moveresize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1801 E_Gadcon_Client *gcc;
1804 _e_gadcon_moveresize_handle(gcc);
1808 _e_gadcon_client_save(E_Gadcon_Client *gcc)
1810 gcc->cf->geom.pos = gcc->config.pos;
1811 gcc->cf->geom.size = gcc->config.size;
1812 gcc->cf->geom.res = gcc->config.res;
1813 gcc->cf->geom.pos_x = gcc->config.pos_x;
1814 gcc->cf->geom.pos_y = gcc->config.pos_y;
1815 gcc->cf->geom.size_w = gcc->config.size_w;
1816 gcc->cf->geom.size_h = gcc->config.size_h;
1817 gcc->cf->state_info.seq = gcc->state_info.seq;
1818 gcc->cf->state_info.flags = gcc->state_info.flags;
1819 gcc->cf->autoscroll = gcc->autoscroll;
1820 if (gcc->cf->style) eina_stringshare_del(gcc->cf->style);
1821 gcc->cf->style = NULL;
1823 gcc->cf->style = eina_stringshare_add(gcc->style);
1824 /* gcc->cf->resizable = gcc->resizable;*/
1825 gcc->cf->resizable = 0;
1826 e_config_save_queue();
1830 _e_gadcon_client_drag_begin(E_Gadcon_Client *gcc, int x, int y)
1833 Evas_Object *o = NULL;
1834 Evas_Coord w = 0, h = 0;
1835 const char *drag_types[] = { "enlightenment/gadcon_client" };
1837 if ((drag_gcc) || (!gcc->gadcon->zone) || (!gcc->gadcon->zone->container))
1842 e_object_ref(E_OBJECT(gcc));
1843 /* Remove this config from the current gadcon */
1844 gcc->gadcon->cf->clients =
1845 eina_list_remove(gcc->gadcon->cf->clients, gcc->cf);
1846 gcc->state_info.state = E_LAYOUT_ITEM_STATE_NONE;
1847 gcc->state_info.resist = 0;
1849 if (!e_drop_inside(gcc->gadcon->drop_handler, x, y))
1850 e_gadcon_client_hide(gcc);
1852 ecore_x_pointer_xy_get(gcc->gadcon->zone->container->win, &x, &y);
1854 drag = e_drag_new(gcc->gadcon->zone->container, x, y,
1855 drag_types, 1, gcc, -1, NULL,
1856 _e_gadcon_cb_drag_finished);
1859 o = gcc->client_class->func.icon((E_Gadcon_Client_Class *)gcc->client_class,
1860 e_drag_evas_get(drag));
1861 evas_object_geometry_get(o, NULL, NULL, &w, &h);
1864 /* FIXME: fallback icon for drag */
1865 o = evas_object_rectangle_add(e_drag_evas_get(drag));
1866 evas_object_color_set(o, 255, 255, 255, 100);
1870 e_drag_object_set(drag, o);
1871 e_drag_resize(drag, w, h);
1872 e_drag_start(drag, x + w/2, y + h/2);
1877 _e_gadcon_client_inject(E_Gadcon *gc, E_Gadcon_Client *gcc, int x, int y)
1880 E_Gadcon_Client *gcc2;
1881 Evas_Coord cx, cy, cw, ch;
1884 /* Check if the gadcon client is in place */
1888 evas_object_geometry_get(gcc->o_frame, &cx, &cy, &cw, &ch);
1889 else if (gcc->o_base)
1890 evas_object_geometry_get(gcc->o_base, &cx, &cy, &cw, &ch);
1891 else return; /* make clang happy */
1893 if (E_INSIDE(x, y, cx, cy, cw, ch)) return;
1896 /* If x, y is not inside any gadcon client, seq will be 0 and it's position
1897 * will later be used for placement. */
1898 gcc->state_info.seq = 0;
1899 EINA_LIST_FOREACH(gc->clients, l, gcc2)
1901 if (gcc == gcc2) continue;
1902 if (gcc2->hidden) continue;
1904 evas_object_geometry_get(gcc2->o_frame, &cx, &cy, &cw, &ch);
1905 else if (gcc2->o_base)
1906 evas_object_geometry_get(gcc2->o_base, &cx, &cy, &cw, &ch);
1907 else return; /* make clang happy */
1908 if (e_gadcon_layout_orientation_get(gc->o_container))
1910 if (E_INSIDE(x, y, cx, cy, cw / 2, ch))
1912 gcc->state_info.seq = seq++;
1913 gcc2->state_info.seq = seq++;
1915 else if (E_INSIDE(x, y, cx + cw / 2, cy, cw / 2, ch))
1917 gcc2->state_info.seq = seq++;
1918 gcc->state_info.seq = seq++;
1921 gcc2->state_info.seq = seq++;
1925 if (E_INSIDE(x, y, cx, cy, cw, ch / 2))
1927 gcc->state_info.seq = seq++;
1928 gcc2->state_info.seq = seq++;
1930 else if (E_INSIDE(x, y, cx, cy + ch / 2, cw, ch / 2))
1932 gcc2->state_info.seq = seq++;
1933 gcc->state_info.seq = seq++;
1936 gcc2->state_info.seq = seq++;
1942 _e_gadcon_cb_min_size_request(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1947 if (gc->min_size_request.func)
1949 Evas_Coord w = 0, h = 0;
1951 e_gadcon_layout_min_size_get(gc->o_container, &w, &h);
1952 gc->min_size_request.func(gc->min_size_request.data, gc, w, h);
1957 _e_gadcon_cb_size_request(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1962 if (gc->resize_request.func)
1964 Evas_Coord w = 0, h = 0;
1966 e_gadcon_layout_asked_size_get(gc->o_container, &w, &h);
1967 gc->resize_request.func(gc->resize_request.data, gc, w, h);
1972 _e_gadcon_cb_moveresize(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1975 Evas_Coord x, y, w, h;
1978 evas_object_geometry_get(gc->o_container, &x, &y, &w, &h);
1979 if (gc->drop_handler)
1980 e_drop_handler_geometry_set(gc->drop_handler, x, y, w, h);
1984 _e_gadcon_cb_client_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1986 Evas_Event_Mouse_Down *ev;
1987 E_Gadcon_Client *gcc;
1991 if (ev->button == 3)
1998 zone = e_util_zone_current_get(e_manager_current_get());
2000 e_gadcon_locked_set(gcc->gadcon, 1);
2002 e_menu_post_deactivate_callback_set(mn, _e_gadcon_client_cb_menu_post,
2006 mi = e_menu_item_new(mn);
2007 e_menu_item_label_set(mi, _("Stop moving"));
2008 e_util_menu_item_theme_icon_set(mi, "enlightenment/edit");
2009 e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_edit, gcc);
2011 if (gcc->gadcon->menu_attach.func)
2013 mi = e_menu_item_new(mn);
2014 e_menu_item_separator_set(mi, 1);
2016 gcc->gadcon->menu_attach.func(gcc->gadcon->menu_attach.data,
2020 if (gcc->gadcon->toolbar)
2021 ecore_x_pointer_xy_get(zone->container->win, &cx, &cy);
2024 e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &cx, &cy, NULL, NULL);
2025 cx = cx + ev->output.x;
2026 cy = cy + ev->output.y;
2028 e_menu_activate_mouse(mn, zone, cx, cy, 1, 1,
2029 E_MENU_POP_DIRECTION_AUTO, ev->timestamp);
2034 _e_gadcon_cb_client_mouse_in(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2036 E_Gadcon_Client *gcc;
2039 edje_object_signal_emit(gcc->o_control, "e,state,focused", "e");
2043 _e_gadcon_cb_client_mouse_out(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2045 E_Gadcon_Client *gcc;
2048 edje_object_signal_emit(gcc->o_control, "e,state,unfocused", "e");
2052 _e_gadcon_cb_client_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
2054 E_Gadcon_Client *gcc;
2058 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
2059 if (gcc->o_control) evas_object_move(gcc->o_control, x, y);
2060 if (gcc->o_event) evas_object_move(gcc->o_event, x, y);
2064 _e_gadcon_cb_client_resize(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
2066 E_Gadcon_Client *gcc;
2070 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
2071 if (gcc->o_control) evas_object_resize(gcc->o_control, w, h);
2072 if (gcc->o_event) evas_object_resize(gcc->o_event, w, h);
2076 _e_gadcon_client_move_start(E_Gadcon_Client *gcc)
2078 int x, y, gcx, gcy, gy ,gx;
2080 evas_object_raise(gcc->o_event);
2081 evas_object_stack_below(gcc->o_control, gcc->o_event);
2083 if (gcc->gadcon->toolbar)
2084 evas_pointer_canvas_xy_get(gcc->gadcon->evas, &gcc->dx, &gcc->dy);
2087 ecore_x_pointer_xy_get(gcc->gadcon->zone->container->win, &gcc->dx, &gcc->dy);
2088 e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &gcx, &gcy, NULL, NULL);
2089 evas_object_geometry_get(gcc->gadcon->o_container, &gx, &gy, NULL, NULL);
2090 gcc->dx -= (gcx + gx);
2091 gcc->dy -= (gcy + gy);
2095 evas_object_geometry_get(gcc->o_frame, &x, &y, NULL, NULL);
2096 else if (gcc->o_base)
2097 evas_object_geometry_get(gcc->o_base, &x, &y, NULL, NULL);
2101 /* using drag pos to calc offset between pointer and gcc pos */
2102 gcc->drag.x = (x - gcc->dx);
2103 gcc->drag.y = (y - gcc->dy);
2105 gcc->state_info.resist = 0;
2109 _e_gadcon_client_move_stop(E_Gadcon_Client *gcc)
2112 gcc->state_info.state = E_LAYOUT_ITEM_STATE_NONE;
2113 gcc->state_info.resist = 0;
2114 _e_gadcon_layout_smart_sync_clients(gcc->gadcon);
2118 _e_gadcon_client_move_go(E_Gadcon_Client *gcc)
2120 Evas_Coord x, y, w, h;
2123 int gcx = 0, gcy = 0;
2126 if (!gcc->moving) return;
2127 /* we need to get output not canvas because things like systray
2128 can reparent another window so we get no position here */
2129 /* maybe we should better grab mouse while move resize is active...*/
2130 //evas_pointer_canvas_xy_get(gcc->gadcon->evas, &cx, &cy);
2131 if (gcc->gadcon->toolbar)
2132 evas_pointer_canvas_xy_get(gcc->gadcon->evas, &cx, &cy);
2135 ecore_x_pointer_xy_get(gcc->gadcon->zone->container->win, &cx, &cy);
2136 e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &gcx, &gcy, NULL, NULL);
2139 evas_object_geometry_get(gcc->gadcon->o_container, &gx, &gy, &gw, &gh);
2147 gcc->state_info.flags = E_GADCON_LAYOUT_ITEM_LOCK_POSITION | E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
2148 _e_gadcon_client_current_position_sync(gcc);
2151 evas_object_geometry_get(gcc->o_frame, NULL, NULL, &w, &h);
2152 else if (gcc->o_base)
2153 evas_object_geometry_get(gcc->o_base, NULL, NULL, &w, &h);
2155 return; /* make clang happy */
2157 if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
2159 if (cy + e_config->drag_resist < 0 || cy - e_config->drag_resist > gh)
2161 _e_gadcon_client_drag_begin(gcc, cx, cy);
2165 if (x > 0 && (cx + gcc->drag.x > gcc->config.pos))
2167 if (gcc->state_info.state != E_LAYOUT_ITEM_STATE_POS_INC)
2168 gcc->state_info.resist = 0;
2169 gcc->state_info.state = E_LAYOUT_ITEM_STATE_POS_INC;
2172 else if (x < 0 && (cx + gcc->drag.x < gcc->config.pos))
2174 if (gcc->state_info.state != E_LAYOUT_ITEM_STATE_POS_DEC)
2175 gcc->state_info.resist = 0;
2176 gcc->state_info.state = E_LAYOUT_ITEM_STATE_POS_DEC;
2183 e_gadcon_layout_pack_request_set(gcc->o_frame, cx + gcc->drag.x, w);
2184 else if (gcc->o_base)
2185 e_gadcon_layout_pack_request_set(gcc->o_base, cx + gcc->drag.x, w);
2187 gcc->config.size = w;
2188 evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
2189 gcc->config.res = w;
2194 if (cx + e_config->drag_resist < 0 || cx - e_config->drag_resist > gw)
2196 _e_gadcon_client_drag_begin(gcc, cx, cy);
2200 if (y > 0 && (cy + gcc->drag.y > gcc->config.pos))
2202 if (gcc->state_info.state != E_LAYOUT_ITEM_STATE_POS_INC)
2203 gcc->state_info.resist = 0;
2204 gcc->state_info.state = E_LAYOUT_ITEM_STATE_POS_INC;
2207 else if (y < 0 && (cy + gcc->drag.y < gcc->config.pos))
2209 if (gcc->state_info.state != E_LAYOUT_ITEM_STATE_POS_DEC)
2210 gcc->state_info.resist = 0;
2211 gcc->state_info.state = E_LAYOUT_ITEM_STATE_POS_DEC;
2218 e_gadcon_layout_pack_request_set(gcc->o_frame, cy + gcc->drag.y, h);
2219 else if (gcc->o_base)
2220 e_gadcon_layout_pack_request_set(gcc->o_base, cy + gcc->drag.y, h);
2222 gcc->config.size = h;
2223 evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
2224 gcc->config.res = h;
2234 _e_gadcon_cb_signal_move_start(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2236 _e_gadcon_client_move_start(data);
2240 _e_gadcon_cb_signal_move_stop(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2242 _e_gadcon_client_move_stop(data);
2246 _e_gadcon_cb_signal_move_go(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2248 _e_gadcon_client_move_go(data);
2252 _e_gadcon_client_resize_start(E_Gadcon_Client *gcc)
2254 evas_object_raise(gcc->o_event);
2255 evas_object_stack_below(gcc->o_control, gcc->o_event);
2257 evas_pointer_canvas_xy_get(gcc->gadcon->evas, &gcc->dx, &gcc->dy);
2261 _e_gadconclient_resize_stop(E_Gadcon_Client *gcc)
2264 gcc->state_info.state = E_LAYOUT_ITEM_STATE_NONE;
2265 _e_gadcon_layout_smart_sync_clients(gcc->gadcon);
2266 _e_gadcon_client_save(gcc);
2270 _e_gadcon_cb_signal_resize_left_start(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2272 _e_gadcon_client_resize_start(data);
2276 _e_gadcon_cb_signal_resize_left_stop(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2278 _e_gadconclient_resize_stop(data);
2282 _e_gadcon_cb_signal_resize_left_go(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2284 E_Gadcon_Client *gcc;
2285 Evas_Coord x, y, w, h;
2288 if (!gcc->resizing) return;
2289 evas_pointer_canvas_xy_get(gcc->gadcon->evas, &x, &y);
2293 gcc->state_info.flags = E_GADCON_LAYOUT_ITEM_LOCK_POSITION |
2294 E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
2297 evas_object_geometry_get(gcc->o_frame, NULL, NULL, &w, &h);
2298 else if (gcc->o_base)
2299 evas_object_geometry_get(gcc->o_base, NULL, NULL, &w, &h);
2300 else return; /* make clang happy */
2302 _e_gadcon_client_current_position_sync(gcc);
2304 if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
2307 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MIN_END_INC;
2309 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MIN_END_DEC;
2314 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MIN_END_INC;
2316 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MIN_END_DEC;
2319 if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
2322 e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->config.pos + x, w - x);
2323 else if (gcc->o_base)
2324 e_gadcon_layout_pack_request_set(gcc->o_base, gcc->config.pos + x, w - x);
2325 evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
2326 gcc->config.res = w;
2331 e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->config.pos + y, h - y);
2332 else if (gcc->o_base)
2333 e_gadcon_layout_pack_request_set(gcc->o_base, gcc->config.pos + y, h - y);
2334 evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
2335 gcc->config.res = h;
2342 _e_gadcon_cb_signal_resize_right_start(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2344 _e_gadcon_client_resize_start(data);
2348 _e_gadcon_cb_signal_resize_right_stop(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2350 _e_gadconclient_resize_stop(data);
2354 _e_gadcon_cb_signal_resize_right_go(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2356 E_Gadcon_Client *gcc;
2357 Evas_Coord x, y, w, h;
2360 if (!gcc->resizing) return;
2361 evas_pointer_canvas_xy_get(gcc->gadcon->evas, &x, &y);
2365 gcc->state_info.flags = E_GADCON_LAYOUT_ITEM_LOCK_POSITION |
2366 E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
2369 evas_object_geometry_get(gcc->o_frame, NULL, NULL, &w, &h);
2370 else if (gcc->o_base)
2371 evas_object_geometry_get(gcc->o_base, NULL, NULL, &w, &h);
2372 else return; /* make clang happy */
2374 _e_gadcon_client_current_position_sync(gcc);
2376 if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
2379 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MAX_END_INC;
2381 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MAX_END_DEC;
2386 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MAX_END_INC;
2388 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MAX_END_INC;
2391 if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
2394 e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->config.pos, w + x);
2395 else if (gcc->o_base)
2396 e_gadcon_layout_pack_request_set(gcc->o_base, gcc->config.pos, w + x);
2397 evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
2398 gcc->config.res = w;
2403 e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->config.pos, h + y);
2404 else if (gcc->o_base)
2405 e_gadcon_layout_pack_request_set(gcc->o_base, gcc->config.pos, h + y);
2406 evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
2407 gcc->config.res = h;
2414 _e_gadcon_cb_drag_finished(E_Drag *drag, int dropped)
2416 E_Gadcon_Client *gcc;
2421 /* free client config */
2422 e_gadcon_client_config_del(NULL, gcc->cf);
2423 /* delete the gadcon client */
2424 /* TODO: Clean up module config too? */
2425 e_object_del(E_OBJECT(gcc));
2429 /* dropped on new gadcon, delete this one as it is no longer in use */
2430 e_object_del(E_OBJECT(gcc));
2432 e_object_unref(E_OBJECT(gcc));
2438 _e_gadcon_cb_dnd_enter(void *data, const char *type __UNUSED__, void *event)
2440 E_Event_Dnd_Enter *ev;
2442 E_Gadcon_Client *gcc;
2446 e_gadcon_layout_freeze(gc->o_container);
2449 if (gcc->gadcon == gc)
2451 /* We have re-entered the gadcon we left, revive gadcon client */
2455 if (e_gadcon_layout_orientation_get(gc->o_container))
2456 gcc->config.pos = ev->x - gcc->config.size / 2;
2458 gcc->config.pos = ev->y - gcc->config.size / 2;
2459 gcc->state_info.prev_pos = gcc->config.pos;
2461 evas_object_geometry_get(gc->o_container, &dx, &dy, NULL, NULL);
2462 _e_gadcon_client_inject(gc, gcc, ev->x + dx, ev->y + dy);
2463 e_gadcon_client_show(gcc);
2465 o = gcc->o_frame ? gcc->o_frame : gcc->o_base;
2468 if (e_gadcon_layout_orientation_get(gc->o_container))
2469 e_gadcon_layout_pack_request_set(o, gcc->config.pos, gcc->config.size);
2471 e_gadcon_layout_pack_request_set(o, gcc->config.pos, gcc->config.size);
2473 gcc->state_info.resist = 1;
2477 /* Create a new gadcon to show where the gadcon will end up */
2478 E_Gadcon_Client_Class *cc;
2481 cc = eina_hash_find(providers, gcc->name);
2486 new_gcc = cc->func.init(gc, gcc->name, gcc->cf->id,
2490 new_gcc = cc->func.init(gc, gcc->name, gcc->cf->id,
2495 new_gcc->cf = gcc->cf;
2496 new_gcc->client_class = cc;
2497 new_gcc->config.pos = gcc->config.pos;
2498 new_gcc->config.size = gcc->config.size;
2499 new_gcc->config.res = gcc->config.res;
2500 new_gcc->state_info.seq = gcc->state_info.seq;
2501 new_gcc->state_info.flags = gcc->state_info.flags;
2502 if (new_gcc->o_frame)
2503 e_gadcon_layout_pack_options_set(new_gcc->o_frame, new_gcc);
2504 else if (new_gcc->o_base)
2505 e_gadcon_layout_pack_options_set(new_gcc->o_base, new_gcc);
2507 e_gadcon_client_autoscroll_set(new_gcc, gcc->autoscroll);
2508 /* e_gadcon_client_resizable_set(new_gcc, gcc->resizable);*/
2509 if (new_gcc->client_class->func.orient)
2510 new_gcc->client_class->func.orient(new_gcc, gc->orient);
2511 new_gcc->state_info.resist = 1;
2512 if (gc->instant_edit)
2513 e_gadcon_client_util_menu_attach(new_gcc);
2519 /* TODO: Create a placeholder to show where the gadcon will end up */
2521 e_gadcon_layout_thaw(gc->o_container);
2525 _e_gadcon_cb_dnd_move(void *data, const char *type __UNUSED__, void *event)
2527 E_Event_Dnd_Move *ev;
2529 E_Gadcon_Client *gcc = NULL;
2534 /* If we move in the same gadcon as the client originates */
2535 if (drag_gcc->gadcon == gc) gcc = drag_gcc;
2536 /* If we move in the newly entered gadcon */
2537 else if (new_gcc->gadcon == gc) gcc = new_gcc;
2543 if (gcc->state_info.resist > 0)
2545 gcc->state_info.resist--;
2548 e_gadcon_layout_freeze(gc->o_container);
2550 if (e_gadcon_layout_orientation_get(gc->o_container))
2551 gcc->config.pos = ev->x - gcc->config.size / 2;
2553 gcc->config.pos = ev->y - gcc->config.size / 2;
2554 gcc->state_info.prev_pos = gcc->config.pos;
2556 evas_object_geometry_get(gc->o_container, &dx, &dy, NULL, NULL);
2557 _e_gadcon_client_inject(gc, gcc, ev->x + dx, ev->y + dy);
2559 o = gcc->o_frame ? gcc->o_frame : gcc->o_base;
2562 if (e_gadcon_layout_orientation_get(gc->o_container))
2563 e_gadcon_layout_pack_request_set(o, gcc->config.pos,
2566 e_gadcon_layout_pack_request_set(o, gcc->config.pos,
2569 e_gadcon_layout_thaw(gc->o_container);
2574 _e_gadcon_cb_dnd_leave(void *data, const char *type __UNUSED__, void *event __UNUSED__)
2579 /* If we exit the starting container hide the gadcon visual */
2580 if (drag_gcc->gadcon == gc) e_gadcon_client_hide(drag_gcc);
2582 /* Delete temporary object */
2585 e_object_del(E_OBJECT(new_gcc));
2591 _e_gadcon_cb_drop(void *data, const char *type __UNUSED__, void *event __UNUSED__)
2594 E_Gadcon_Client *gcc = NULL;
2597 if (drag_gcc->gadcon == gc) gcc = drag_gcc;
2598 else if ((new_gcc) && (new_gcc->gadcon == gc)) gcc = new_gcc;
2599 else return; /* make clang happy */
2601 gc->cf->clients = eina_list_append(gc->cf->clients, gcc->cf);
2603 if (gc->editing) e_gadcon_client_edit_begin(gcc);
2604 e_config_save_queue();
2608 _e_gadcon_client_class_feature_check(const E_Gadcon_Client_Class *cc, const char *name, void *feature)
2612 e_util_dialog_show("Insufficent gadcon support",
2613 "Module %s needs to support %s",
2621 _e_gadcon_client_cb_menu_post(void *data, E_Menu *m __UNUSED__)
2623 E_Gadcon_Client *gcc;
2625 if (!(gcc = data)) return;
2626 if (gcc->gadcon) e_gadcon_locked_set(gcc->gadcon, 0);
2627 if (!gcc->menu) return;
2628 e_object_del(E_OBJECT(gcc->menu));
2633 _e_gadcon_client_cb_instant_edit_timer(void *data)
2635 E_Gadcon_Client *gcc;
2638 e_gadcon_client_edit_begin(gcc);
2639 _e_gadcon_client_move_start(gcc);
2640 gcc->instant_edit_timer = NULL;
2641 return ECORE_CALLBACK_CANCEL;
2645 _e_gadcon_client_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
2647 Evas_Event_Mouse_Down *ev;
2648 E_Gadcon_Client *gcc;
2652 if (gcc->menu) return;
2653 if (ev->button == 3)
2659 e_gadcon_locked_set(gcc->gadcon, 1);
2662 m = e_gadcon_client_util_menu_items_append(gcc, m, 0);
2663 e_menu_post_deactivate_callback_set(m, _e_gadcon_client_cb_menu_post,
2667 e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &cx, &cy, &cw, &ch);
2668 zone = gcc->gadcon->zone;
2669 if (!zone) zone = e_util_zone_current_get(e_manager_current_get());
2670 e_menu_activate_mouse(m, zone,
2672 cy + ev->output.y, 1, 1,
2673 E_MENU_POP_DIRECTION_AUTO, ev->timestamp);
2675 else if (ev->button == 1)
2677 if ((!gcc->o_control) && (gcc->gadcon->instant_edit))
2679 if (gcc->instant_edit_timer)
2680 ecore_timer_del(gcc->instant_edit_timer);
2681 gcc->instant_edit_timer =
2682 ecore_timer_add(1.0, _e_gadcon_client_cb_instant_edit_timer,
2689 _e_gadcon_client_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
2691 Evas_Event_Mouse_Up *ev;
2692 E_Gadcon_Client *gcc;
2696 if ((ev->button == 1) && (gcc->gadcon->instant_edit))
2698 if (gcc->instant_edit_timer)
2700 ecore_timer_del(gcc->instant_edit_timer);
2701 gcc->instant_edit_timer = NULL;
2705 _e_gadcon_client_move_stop(gcc);
2706 e_gadcon_client_edit_end(gcc);
2712 _e_gadcon_client_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2714 E_Gadcon_Client *gcc;
2717 if ((gcc->gadcon->instant_edit))
2719 if (gcc->o_control) _e_gadcon_client_move_go(gcc);
2724 _e_gadcon_client_cb_menu_style_plain(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
2726 E_Gadcon_Client *gcc;
2731 if (gcc->style) eina_stringshare_del(gcc->style);
2732 gcc->style = eina_stringshare_add(E_GADCON_CLIENT_STYLE_PLAIN);
2733 _e_gadcon_client_save(gcc);
2734 e_gadcon_unpopulate(gc);
2735 e_gadcon_populate(gc);
2739 _e_gadcon_client_cb_menu_style_inset(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
2741 E_Gadcon_Client *gcc;
2746 if (gcc->style) eina_stringshare_del(gcc->style);
2747 gcc->style = eina_stringshare_add(E_GADCON_CLIENT_STYLE_INSET);
2748 _e_gadcon_client_save(gcc);
2749 e_gadcon_unpopulate(gc);
2750 e_gadcon_populate(gc);
2754 _e_gadcon_client_cb_menu_autoscroll(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
2756 E_Gadcon_Client *gcc;
2759 e_gadcon_layout_freeze(gcc->gadcon->o_container);
2760 if (gcc->autoscroll) gcc->autoscroll = 0;
2761 else gcc->autoscroll = 1;
2762 e_gadcon_client_autoscroll_set(gcc, gcc->autoscroll);
2763 _e_gadcon_client_save(gcc);
2764 e_gadcon_layout_thaw(gcc->gadcon->o_container);
2768 _e_gadcon_client_cb_menu_resizable(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
2770 E_Gadcon_Client *gcc;
2773 e_gadcon_layout_freeze(gcc->gadcon->o_container);
2774 if (gcc->resizable) gcc->resizable = 0;
2775 else gcc->resizable = 1;
2776 e_gadcon_client_resizable_set(gcc, gcc->resizable);
2777 _e_gadcon_client_save(gcc);
2778 e_gadcon_layout_thaw(gcc->gadcon->o_container);
2782 _e_gadcon_client_cb_menu_edit(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
2784 E_Gadcon_Client *gcc;
2788 e_gadcon_client_edit_end(gcc);
2790 e_gadcon_client_edit_begin(gcc);
2794 _e_gadcon_client_cb_menu_remove(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
2797 E_Gadcon_Client *gcc;
2802 e_gadcon_client_config_del(gc->cf, gcc->cf);
2803 e_gadcon_unpopulate(gc);
2804 e_gadcon_populate(gc);
2805 e_config_save_queue();
2809 _e_gadcon_client_cb_menu_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
2811 E_Gadcon_Client *gcc;
2813 if (!(gcc = data)) return;
2814 if (gcc->client_class->func.icon)
2818 // e menu ASSUMES... EXPECTS the icon to be an.... e_icon! make it so.
2819 ic = gcc->client_class->func.icon
2820 ((E_Gadcon_Client_Class *)gcc->client_class,
2822 mi->icon_object = e_icon_add(mi->menu->evas);
2823 e_icon_object_set(mi->icon_object, ic);
2826 e_util_menu_item_theme_icon_set(mi, "preferences-gadget"); // FIXME: Needs icon in theme
2830 _e_gadcon_client_del_hook(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2832 E_Gadcon_Client *gcc;
2838 evas_object_del(gcc->o_frame);
2839 gcc->o_frame = NULL;
2841 e_object_del(E_OBJECT(gcc));
2844 /* a smart object JUST for gadcon */
2846 typedef struct _E_Gadcon_Layout_Item E_Gadcon_Layout_Item;
2848 struct _E_Smart_Data
2850 Evas_Coord x, y, w, h;
2851 Evas_Object *obj, *clip;
2852 unsigned char horizontal : 1;
2853 unsigned char doing_config : 1;
2854 unsigned char redo_config : 1;
2857 Evas_Coord minw, minh, req;
2860 struct _E_Gadcon_Layout_Item
2865 int pos, size, size2, res, prev_pos, prev_size;
2871 } min, aspect, aspect_pad;
2873 E_Gadcon_Client *gcc;
2875 Evas_Coord x, y, w, h;
2877 unsigned char can_move : 1;
2880 /* local subsystem functions */
2881 static E_Gadcon_Layout_Item *_e_gadcon_layout_smart_adopt(E_Smart_Data *sd, Evas_Object *obj);
2882 static void _e_gadcon_layout_smart_disown(Evas_Object *obj);
2883 static void _e_gadcon_layout_smart_item_del_hook(void *data, Evas *e, Evas_Object *obj, void *event_info);
2884 static void _e_gadcon_layout_smart_reconfigure(E_Smart_Data *sd);
2885 static void _e_gadcon_layout_smart_init(void);
2886 static void _e_gadcon_layout_smart_add(Evas_Object *obj);
2887 static void _e_gadcon_layout_smart_del(Evas_Object *obj);
2888 static void _e_gadcon_layout_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
2889 static void _e_gadcon_layout_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
2890 static void _e_gadcon_layout_smart_show(Evas_Object *obj);
2891 static void _e_gadcon_layout_smart_hide(Evas_Object *obj);
2892 static void _e_gadcon_layout_smart_color_set(Evas_Object *obj, int r, int g, int b, int a);
2893 static void _e_gadcon_layout_smart_clip_set(Evas_Object *obj, Evas_Object *clip);
2894 static void _e_gadcon_layout_smart_clip_unset(Evas_Object *obj);
2895 static void _e_gadcon_layout_smart_min_cur_size_calc(E_Smart_Data *sd, int *min, int *mino, int *cur);
2896 static void _e_gadcon_layout_smart_gadcons_width_adjust(E_Smart_Data *sd, int min, int cur);
2897 static int _e_gadcon_layout_smart_sort_by_sequence_number_cb(const void *d1, const void *d2);
2898 static int _e_gadcon_layout_smart_sort_by_position_cb(const void *d1, const void *d2);
2900 /* local subsystem globals */
2901 static Evas_Smart *_e_smart = NULL;
2903 /* externally accessible functions */
2904 static Evas_Object *
2905 e_gadcon_layout_add(Evas *evas)
2907 _e_gadcon_layout_smart_init();
2908 return evas_object_smart_add(evas, _e_smart);
2912 e_gadcon_layout_orientation_set(Evas_Object *obj, int horizontal)
2917 sd = evas_object_smart_data_get(obj);
2919 if (((sd->horizontal) && (horizontal)) ||
2920 ((!sd->horizontal) && (!horizontal))) return;
2921 sd->horizontal = horizontal;
2922 _e_gadcon_layout_smart_reconfigure(sd);
2926 e_gadcon_layout_orientation_get(Evas_Object *obj)
2931 sd = evas_object_smart_data_get(obj);
2933 return sd->horizontal;
2937 e_gadcon_layout_freeze(Evas_Object *obj)
2942 sd = evas_object_smart_data_get(obj);
2948 e_gadcon_layout_thaw(Evas_Object *obj)
2953 sd = evas_object_smart_data_get(obj);
2956 _e_gadcon_layout_smart_reconfigure(sd);
2960 e_gadcon_layout_min_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
2966 Evas_Coord tw = 0, th = 0;
2969 sd = evas_object_smart_data_get(obj);
2973 if (w) *w = sd->minw;
2974 if (h) *h = sd->minh;
2978 if (w) *w = sd->minh;
2979 if (h) *h = sd->minw;
2983 EINA_LIST_FOREACH(sd->items, l, obj)
2985 E_Gadcon_Layout_Item *bi;
2987 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
2991 if (bi->min.h > th) th = bi->min.h;
2996 if (bi->min.w > tw) tw = bi->min.w;
3005 e_gadcon_layout_asked_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
3008 Evas_Coord tw = 0, th = 0;
3011 sd = evas_object_smart_data_get(obj);
3019 EINA_LIST_FOREACH(sd->items, l, obj)
3021 E_Gadcon_Layout_Item *bi;
3023 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3039 e_gadcon_layout_pack(Evas_Object *obj, Evas_Object *child)
3044 sd = evas_object_smart_data_get(obj);
3046 _e_gadcon_layout_smart_adopt(sd, child);
3047 sd->items = eina_list_prepend(sd->items, child);
3048 _e_gadcon_layout_smart_reconfigure(sd);
3053 e_gadcon_layout_pack_size_set(Evas_Object *obj, int size)
3057 * simplify this function until the is redone
3058 * _e_gadcon_layout_smart_gadcons_asked_position_set(E_Smart_Data *sd)
3060 E_Gadcon_Layout_Item *bi;
3064 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3066 pos = bi->ask.pos + (bi->ask.size / 2);
3067 if (pos < (bi->ask.res / 3))
3069 /* hooked to start */
3070 bi->ask.size = size;
3072 else if (pos > ((2 * bi->ask.res) / 3))
3075 bi->ask.pos = (bi->ask.pos + bi->ask.size) - size;
3076 bi->ask.size = size;
3080 /* hooked to middle */
3081 if ((bi->ask.pos <= (bi->ask.res / 2)) &&
3082 ((bi->ask.pos + bi->ask.size) > (bi->ask.res / 2)))
3084 /* straddles middle */
3085 if (bi->ask.res > 2)
3086 bi->ask.pos = (bi->ask.res / 2) +
3087 (((bi->ask.pos + (bi->ask.size / 2) -
3088 (bi->ask.res / 2)) *
3089 (bi->ask.res / 2)) /
3090 (bi->ask.res / 2)) - (bi->ask.size / 2);
3092 bi->x = bi->ask.res / 2;
3093 bi->ask.size = size;
3097 if (pos < (bi->ask.res / 2))
3099 bi->ask.pos = (bi->ask.pos + bi->ask.size) - size;
3100 bi->ask.size = size;
3103 bi->ask.size = size;
3105 bi->ask.size = size;
3107 _e_gadcon_layout_smart_reconfigure(bi->sd);
3110 /* called when a users moves/resizes the gadcon client explicitly */
3112 e_gadcon_layout_pack_request_set(Evas_Object *obj, int pos, int size)
3114 E_Gadcon_Layout_Item *bi;
3117 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3120 bi->ask.res = bi->sd->w;
3121 if (pos < 0) pos = 0;
3122 if ((bi->ask.res - pos) < size) pos = bi->ask.res - size;
3123 bi->ask.size = size;
3125 _e_gadcon_layout_smart_reconfigure(bi->sd);
3128 /* called when restoring config from saved config */
3130 e_gadcon_layout_pack_options_set(Evas_Object *obj, E_Gadcon_Client *gcc)
3135 E_Gadcon_Layout_Item *bi, *bi2;
3138 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3140 bi->ask.res = gcc->config.res;
3141 bi->ask.size = gcc->config.size;
3142 bi->ask.pos = gcc->config.pos;
3146 if (!gcc->state_info.seq) ok = 1;
3149 EINA_LIST_FOREACH(bi->sd->items, l, item)
3151 bi2 = evas_object_data_get(item, "e_gadcon_layout_data");
3152 if (bi == bi2) continue;
3153 if (bi->gcc->state_info.seq == bi2->gcc->state_info.seq)
3156 if (bi2->gcc->state_info.seq > seq)
3157 seq = bi2->gcc->state_info.seq;
3162 gcc->state_info.seq = seq + 1;
3163 gcc->state_info.want_save = 1;
3164 gcc->state_info.flags = E_GADCON_LAYOUT_ITEM_LOCK_NONE;
3166 _e_gadcon_layout_smart_reconfigure(bi->sd);
3170 e_gadcon_layout_pack_min_size_set(Evas_Object *obj, int w, int h)
3172 E_Gadcon_Layout_Item *bi;
3175 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3177 if (bi->sd->horizontal)
3188 _e_gadcon_layout_smart_reconfigure(bi->sd);
3192 e_gadcon_layout_pack_aspect_set(Evas_Object *obj, int w, int h)
3194 E_Gadcon_Layout_Item *bi;
3197 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3199 if (bi->sd->horizontal)
3210 _e_gadcon_layout_smart_reconfigure(bi->sd);
3214 e_gadcon_layout_pack_aspect_pad_set(Evas_Object *obj, int w, int h)
3216 E_Gadcon_Layout_Item *bi;
3219 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3221 if (bi->sd->horizontal)
3223 bi->aspect_pad.w = w;
3224 bi->aspect_pad.h = h;
3228 bi->aspect_pad.w = h;
3229 bi->aspect_pad.h = w;
3234 e_gadcon_layout_unpack(Evas_Object *obj)
3236 E_Gadcon_Layout_Item *bi;
3240 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3244 sd->items = eina_list_remove(sd->items, obj);
3245 _e_gadcon_layout_smart_disown(obj);
3246 _e_gadcon_layout_smart_reconfigure(sd);
3249 /* local subsystem functions */
3250 static E_Gadcon_Layout_Item *
3251 _e_gadcon_layout_smart_adopt(E_Smart_Data *sd, Evas_Object *obj)
3253 E_Gadcon_Layout_Item *bi;
3255 if (!obj) return NULL;
3256 bi = E_NEW(E_Gadcon_Layout_Item, 1);
3257 if (!bi) return NULL;
3261 evas_object_clip_set(obj, sd->clip);
3262 evas_object_smart_member_add(obj, bi->sd->obj);
3263 evas_object_data_set(obj, "e_gadcon_layout_data", bi);
3264 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
3265 _e_gadcon_layout_smart_item_del_hook, NULL);
3266 if ((!evas_object_visible_get(sd->clip)) &&
3267 (evas_object_visible_get(sd->obj)))
3268 evas_object_show(sd->clip);
3273 _e_gadcon_layout_smart_disown(Evas_Object *obj)
3275 E_Gadcon_Layout_Item *bi;
3278 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3282 if (evas_object_visible_get(bi->sd->clip))
3283 evas_object_hide(bi->sd->clip);
3285 evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL,
3286 _e_gadcon_layout_smart_item_del_hook);
3287 evas_object_smart_member_del(obj);
3288 evas_object_clip_unset(obj);
3289 evas_object_data_del(obj, "e_gadcon_layout_data");
3294 _e_gadcon_layout_smart_item_del_hook(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
3297 e_gadcon_layout_unpack(obj);
3301 _e_gadcon_layout_smart_reconfigure(E_Smart_Data *sd)
3307 Eina_List *list = NULL;
3308 E_Gadcon_Layout_Item *bi;
3309 E_Layout_Item_Container *lc;
3310 int i, set_prev_pos = 0;
3311 static int recurse = 0;
3313 if (sd->frozen) return;
3314 if (sd->doing_config)
3316 sd->redo_config = 1;
3321 min = mino = cur = 0;
3323 _e_gadcon_layout_smart_min_cur_size_calc(sd, &min, &mino, &cur);
3325 if ((sd->minw != min) || (sd->minh != mino))
3329 evas_object_smart_callback_call(sd->obj, "min_size_request", NULL);
3334 if (cur >= sd->minw)
3337 evas_object_smart_callback_call(sd->obj, "size_request", NULL);
3344 if (recurse == 1) _e_gadcon_layout_smart_gadcons_width_adjust(sd, min, cur);
3346 if (sd->w <= sd->req)
3348 _e_gadcon_layout_smart_gadcon_position_shrinked_mode(sd);
3353 _e_gadcon_layout_smart_gadcons_asked_position_set(sd);
3355 list = _e_gadcon_layout_smart_gadcons_wrap(sd);
3357 _e_gadcon_layout_smart_gadcons_position(sd, &list);
3359 EINA_LIST_FREE(list, lc)
3365 sd->items = eina_list_sort(sd->items, eina_list_count(sd->items),
3366 _e_gadcon_layout_smart_sort_by_position_cb);
3368 EINA_LIST_FOREACH(sd->items, l, obj)
3370 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3371 if (bi->gcc->gadcon->editing) bi->gcc->state_info.seq = i;
3375 bi->ask.prev_pos = bi->x;
3376 bi->ask.prev_size = bi->w;
3379 if ((bi->x == bi->ask.pos) &&
3380 (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_POSITION))
3381 bi->gcc->state_info.flags |= E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
3383 if ((bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_POSITION) &&
3384 (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE))
3386 if (bi->x != bi->ask.pos)
3387 bi->gcc->state_info.flags &= ~E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
3392 EINA_LIST_FOREACH(sd->items, l, obj)
3394 E_Gadcon_Layout_Item *bi;
3396 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3401 yy = sd->y; // + ((sd->h - bi->h) / 2);
3405 evas_object_move(obj, xx, yy);
3406 evas_object_resize(obj, bi->w, bi->h);
3410 evas_object_move(obj, yy, xx);
3411 evas_object_resize(obj, bi->h, bi->w);
3414 sd->doing_config = 0;
3415 if (sd->redo_config)
3417 _e_gadcon_layout_smart_reconfigure(sd);
3418 sd->redo_config = 0;
3421 if ((sd->minw != min) || (sd->minh != mino))
3425 evas_object_smart_callback_call(sd->obj, "min_size_request", NULL);
3430 if (cur >= sd->minw)
3433 evas_object_smart_callback_call(sd->obj, "size_request", NULL);
3440 _e_gadcon_layout_smart_init(void)
3442 if (_e_smart) return;
3444 static const Evas_Smart_Class sc =
3447 EVAS_SMART_CLASS_VERSION,
3448 _e_gadcon_layout_smart_add,
3449 _e_gadcon_layout_smart_del,
3450 _e_gadcon_layout_smart_move,
3451 _e_gadcon_layout_smart_resize,
3452 _e_gadcon_layout_smart_show,
3453 _e_gadcon_layout_smart_hide,
3454 _e_gadcon_layout_smart_color_set,
3455 _e_gadcon_layout_smart_clip_set,
3456 _e_gadcon_layout_smart_clip_unset,
3457 NULL, NULL, NULL, NULL, NULL, NULL, NULL
3459 _e_smart = evas_smart_class_new(&sc);
3464 _e_gadcon_layout_smart_add(Evas_Object *obj)
3469 sd = calloc(1, sizeof(E_Smart_Data));
3476 sd->clip = evas_object_rectangle_add(evas_object_evas_get(obj));
3478 evas_object_smart_member_add(sd->clip, obj);
3479 evas_object_move(sd->clip, -100005, -100005);
3480 evas_object_resize(sd->clip, 200010, 200010);
3481 evas_object_color_set(sd->clip, 255, 255, 255, 255);
3482 evas_object_smart_data_set(obj, sd);
3486 _e_gadcon_layout_smart_del(Evas_Object *obj)
3491 sd = evas_object_smart_data_get(obj);
3497 child = eina_list_data_get(sd->items);
3498 e_gadcon_layout_unpack(child);
3500 evas_object_del(sd->clip);
3505 _e_gadcon_layout_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
3510 sd = evas_object_smart_data_get(obj);
3512 if ((x == sd->x) && (y == sd->y)) return;
3529 EINA_LIST_FOREACH(sd->items, l, item)
3533 evas_object_geometry_get(item, &ox, &oy, NULL, NULL);
3534 evas_object_move(item, ox + dx, oy + dy);
3551 _e_gadcon_layout_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
3556 sd = evas_object_smart_data_get(obj);
3558 if ((w == sd->w) && (h == sd->h)) return;
3571 _e_gadcon_layout_smart_reconfigure(sd);
3575 _e_gadcon_layout_smart_show(Evas_Object *obj)
3580 sd = evas_object_smart_data_get(obj);
3582 if (sd->items) evas_object_show(sd->clip);
3586 _e_gadcon_layout_smart_hide(Evas_Object *obj)
3591 sd = evas_object_smart_data_get(obj);
3593 evas_object_hide(sd->clip);
3597 _e_gadcon_layout_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
3602 sd = evas_object_smart_data_get(obj);
3604 evas_object_color_set(sd->clip, r, g, b, a);
3608 _e_gadcon_layout_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
3613 sd = evas_object_smart_data_get(obj);
3615 evas_object_clip_set(sd->clip, clip);
3619 _e_gadcon_layout_smart_clip_unset(Evas_Object *obj)
3624 sd = evas_object_smart_data_get(obj);
3626 evas_object_clip_unset(sd->clip);
3630 * @min - the minimum width required by all the gadcons
3631 * @cur - the current width required by all the gadcons
3632 * @mino - the smalest width/height among all the objects
3635 _e_gadcon_layout_smart_min_cur_size_calc(E_Smart_Data *sd, int *min, int *mino, int *cur)
3637 E_Gadcon_Layout_Item *bi;
3641 EINA_LIST_FOREACH(sd->items, l, item)
3643 bi = evas_object_data_get(item, "e_gadcon_layout_data");
3644 bi->ask.size2 = bi->ask.size;
3646 if ((bi->aspect.w > 0) && (bi->aspect.h > 0))
3649 (((sd->h - bi->aspect_pad.h) * bi->aspect.w) / bi->aspect.h) + bi->aspect_pad.w;
3651 if (bi->ask.size2 > bi->min.w)
3653 *min += bi->ask.size2;
3654 *cur += bi->ask.size2;
3664 bi->ask.size2 = bi->ask.size = bi->min.w;
3666 if (bi->min.h > *mino) *mino = bi->min.h;
3667 if (bi->ask.size < bi->min.w)
3670 *cur += bi->ask.size;
3676 _e_gadcon_layout_smart_width_smart_sort_reverse_cb(const void *d1, const void *d2)
3678 const E_Gadcon_Layout_Item *bi, *bi2;
3680 bi = evas_object_data_get(d1, "e_gadcon_layout_data");
3681 bi2 = evas_object_data_get(d2, "e_gadcon_layout_data");
3683 if (bi->ask.size2 > bi->min.w)
3685 if (bi2->ask.size2 > bi2->min.w)
3687 if (bi->ask.size2 < bi2->ask.size2)
3694 if (bi->ask.size2 == bi2->ask.size2)
3698 if (bi->ask.size2 < bi2->ask.size2)
3707 if (bi2->ask.size2 > bi2->min.w)
3709 if (bi->ask.size2 == bi2->ask.size2)
3713 if (bi->ask.size2 < bi2->ask.size2)
3721 if (bi->ask.size2 < bi2->ask.size2)
3723 else if (bi->ask.size2 > bi2->ask.size2)
3732 _e_gadcon_layout_smart_gadcons_width_adjust(E_Smart_Data *sd, int min, int cur)
3734 E_Gadcon_Layout_Item *bi = NULL;
3739 int max_size, autosize = 0;
3743 if (sd->w < min) max_size = min;
3744 else max_size = cur;
3745 need = max_size - sd->w;
3750 sd->items = eina_list_sort(sd->items, eina_list_count(sd->items),
3751 _e_gadcon_layout_smart_width_smart_sort_reverse_cb);
3752 EINA_LIST_FOREACH(sd->items, l, item)
3754 bi = evas_object_data_get(item, "e_gadcon_layout_data");
3755 if (bi->gcc->autoscroll) autosize += bi->ask.size2;
3758 if (autosize < 1) autosize = 1;
3762 EINA_LIST_REVERSE_FOREACH(sd->items, l2, item)
3764 if (need <= 0) break;
3765 bi = evas_object_data_get(item, "e_gadcon_layout_data");
3766 if (bi->gcc->autoscroll)
3770 reduce_by = (need * bi->ask.size2) / autosize;
3771 if (reduce_by < 1) reduce_by = 1;
3772 if (bi->ask.size2 - reduce_by > 8)
3774 bi->ask.size2 -= reduce_by;
3779 need -= bi->ask.size2 - 8;
3784 /* If the 'needed' size change didn't get modified (no gadget has autoscroll)
3785 then we must break or we end up in an infinite loop */
3786 if (need == needed) break;
3791 _e_gadcon_layout_smart_sort_by_sequence_number_cb(const void *d1, const void *d2)
3793 const E_Gadcon_Layout_Item *bi, *bi2;
3795 bi = evas_object_data_get(d1, "e_gadcon_layout_data");
3796 bi2 = evas_object_data_get(d2, "e_gadcon_layout_data");
3798 if ((!bi->gcc->state_info.seq) && (!bi2->gcc->state_info.seq)) return 0;
3799 else if (!bi->gcc->state_info.seq) return 1;
3800 else if (!bi2->gcc->state_info.seq) return -1;
3801 return bi->gcc->state_info.seq - bi2->gcc->state_info.seq;
3805 _e_gadcon_layout_smart_sort_by_position_cb(const void *d1, const void *d2)
3807 const E_Gadcon_Layout_Item *bi, *bi2;
3809 bi = evas_object_data_get(d1, "e_gadcon_layout_data");
3810 bi2 = evas_object_data_get(d2, "e_gadcon_layout_data");
3812 return (bi->x - bi2->x);
3816 _e_gadcon_layout_smart_containers_sort_cb(const void *d1, const void *d2)
3818 const E_Layout_Item_Container *lc, *lc2;
3822 if (lc->pos < lc2->pos) return -1;
3823 else if (lc->pos > lc2->pos) return 1;
3828 _e_gadcon_layout_smart_seq_sort_cb(const void *d1, const void *d2)
3830 const E_Gadcon_Layout_Item *bi, *bi2;
3834 return (bi->gcc->state_info.seq - bi2->gcc->state_info.seq);
3838 _e_gadcon_layout_smart_sync_clients(E_Gadcon *gc)
3840 E_Gadcon_Client *gcc;
3843 EINA_LIST_FOREACH(gc->clients, l, gcc)
3845 _e_gadcon_client_save(gcc);
3850 _e_gadcon_client_current_position_sync(E_Gadcon_Client *gcc)
3852 E_Gadcon_Layout_Item *bi;
3855 o = gcc->o_frame ? gcc->o_frame : gcc->o_base;
3858 bi = evas_object_data_get(o, "e_gadcon_layout_data");
3861 else return; /* make clang happy */
3863 gcc->state_info.prev_pos = gcc->config.pos;
3864 gcc->state_info.prev_size = gcc->config.size;
3865 gcc->config.pos = bi->x;
3869 _e_gadcon_layout_smart_gadcon_position_shrinked_mode(E_Smart_Data *sd)
3873 E_Gadcon_Layout_Item *bi, *bi2;
3877 sd->items = eina_list_sort(sd->items, eina_list_count(sd->items),
3878 _e_gadcon_layout_smart_sort_by_sequence_number_cb);
3879 EINA_LIST_FOREACH(sd->items, l, item)
3881 bi = evas_object_data_get(item, "e_gadcon_layout_data");
3882 if (bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_POS_INC)
3884 if (bi->gcc->state_info.resist <= E_LAYOUT_ITEM_DRAG_RESIST_LEVEL)
3886 bi->gcc->state_info.resist++;
3887 bi->gcc->config.pos = bi->ask.pos = bi->gcc->state_info.prev_pos;
3891 bi->gcc->state_info.resist = 0;
3892 if (eina_list_next(l))
3894 tp = eina_list_data_get(eina_list_next(l));
3895 l->next->data = eina_list_data_get(l);
3898 bi2 = evas_object_data_get(tp, "e_gadcon_layout_data");
3900 if (bi2->x + bi2->w/2 > bi->ask.pos + bi->w)
3902 bi->gcc->config.pos = bi->ask.pos = bi->gcc->state_info.prev_pos;
3906 bi->gcc->config.pos = bi->ask.pos = bi2->ask.pos;
3907 bi->gcc->state_info.flags &= ~E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
3908 bi->gcc->state_info.want_save = 1;
3909 bi2->gcc->state_info.want_save = 1;
3913 bi->gcc->config.pos = bi->ask.pos = bi->gcc->state_info.prev_pos;
3916 else if (bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_POS_DEC)
3918 if (bi->gcc->state_info.resist <= E_LAYOUT_ITEM_DRAG_RESIST_LEVEL)
3920 bi->gcc->state_info.resist++;
3921 bi->gcc->config.pos = bi->ask.pos = bi->gcc->state_info.prev_pos;
3925 bi->gcc->state_info.resist = 0;
3926 if (eina_list_prev(l))
3928 E_Gadcon_Layout_Item *bi2;
3931 tp = eina_list_data_get(eina_list_prev(l));
3932 l->prev->data = eina_list_data_get(l);
3935 bi2 = evas_object_data_get(tp, "e_gadcon_layout_data");
3937 if (bi->ask.pos > bi2->x + bi2->w/2)
3939 bi->gcc->config.pos = bi->ask.pos = bi->gcc->state_info.prev_pos;
3943 bi->gcc->config.pos = bi->ask.pos = bi2->ask.pos;
3944 bi->gcc->state_info.flags &= ~E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
3945 bi->gcc->state_info.want_save = 1;
3946 bi2->gcc->state_info.want_save = 1;
3950 bi->gcc->config.pos = bi->ask.pos = bi->gcc->state_info.prev_pos;
3953 else if ((bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_SIZE_MIN_END_INC) ||
3954 (bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_SIZE_MAX_END_DEC) ||
3955 (bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_SIZE_MIN_END_DEC) ||
3956 (bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_SIZE_MAX_END_INC))
3958 if (bi->w < bi->min.w)
3959 bi->gcc->config.size = bi->w = bi->min.w;
3961 bi->gcc->config.size = bi->w;
3963 bi->gcc->config.pos = bi->gcc->state_info.prev_pos;
3967 EINA_LIST_FOREACH(sd->items, l, item)
3969 bi = evas_object_data_get(item, "e_gadcon_layout_data");
3972 bi->w = bi->ask.size2;
3973 bi->gcc->config.size = bi->w;
3974 pos = bi->x + bi->w;
3979 _e_gadcon_layout_smart_gadcons_asked_position_set(E_Smart_Data *sd)
3981 E_Gadcon_Layout_Item *bi;
3986 EINA_LIST_FOREACH(sd->items, l, item)
3988 bi = evas_object_data_get(item, "e_gadcon_layout_data");
3991 bi->x = bi->ask.pos;
3992 bi->w = bi->ask.size2;
3996 EINA_LIST_FOREACH(sd->items, l, item)
3998 bi = evas_object_data_get(item, "e_gadcon_layout_data");
4001 pos = bi->ask.pos + (bi->ask.size / 2);
4002 if (pos < (bi->ask.res / 3))
4004 /* hooked to start */
4005 bi->x = bi->ask.pos;
4006 bi->w = bi->ask.size2;
4009 else if (pos > ((2 * bi->ask.res) / 3))
4012 bi->x = (bi->ask.pos - bi->ask.res) + sd->w;
4013 bi->w = bi->ask.size2;
4014 bi->hookp = bi->ask.res;
4018 /* hooked to middle */
4019 if ((bi->ask.pos <= (bi->ask.res / 2)) &&
4020 ((bi->ask.pos + bi->ask.size2) > (bi->ask.res / 2)))
4022 /* straddles middle */
4023 if (bi->ask.res > 2)
4024 bi->x = (sd->w / 2) +
4025 (((bi->ask.pos + (bi->ask.size2 / 2) -
4026 (bi->ask.res / 2)) *
4027 (bi->ask.res / 2)) /
4028 (bi->ask.res / 2)) - (bi->ask.size2 / 2);
4031 bi->w = bi->ask.size2;
4035 /* either side of middle */
4036 bi->x = (bi->ask.pos - (bi->ask.res / 2)) + (sd->w / 2);
4037 bi->w = bi->ask.size2;
4039 bi->hookp = bi->ask.res / 2;
4046 * The function returns a list of E_Gadcon_Layout_Item_Container
4049 _e_gadcon_layout_smart_gadcons_wrap(E_Smart_Data *sd)
4051 Eina_List *l, *list = NULL;
4053 E_Layout_Item_Container *lc;
4054 E_Gadcon_Layout_Item *bi;
4057 EINA_LIST_FOREACH(sd->items, l, item)
4059 bi = evas_object_data_get(item, "e_gadcon_layout_data");
4060 lc = E_NEW(E_Layout_Item_Container, 1);
4061 lc->state_info.min_seq = lc->state_info.max_seq = bi->gcc->state_info.seq;
4067 lc->prev_pos = bi->ask.prev_pos;
4068 lc->prev_size = bi->ask.prev_size;
4070 E_LAYOUT_ITEM_CONTAINER_STATE_SET(lc->state, bi->gcc->state_info.state);
4072 if ((bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_POSITION) &&
4073 (lc->state == E_LAYOUT_ITEM_CONTAINER_STATE_NONE))
4074 lc->state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED;
4076 lc->items = eina_list_append(lc->items, bi);
4077 list = eina_list_append(list, lc);
4083 _e_gadcon_layout_smart_gadcons_position(E_Smart_Data *sd, Eina_List **list)
4085 int ok, lc_moving_prev_pos;
4086 Eina_List *l, *l2, *l3;
4087 E_Layout_Item_Container *lc_moving = NULL, *lc_back = NULL, *lc, *lc3;
4088 E_Gadcon_Layout_Item *bi, *bi_moving = NULL;
4090 if ((!list) || (!*list)) return;
4092 EINA_LIST_FOREACH(*list, l, lc_moving)
4094 if ((lc_moving->state != E_LAYOUT_ITEM_CONTAINER_STATE_NONE) &&
4095 (lc_moving->state != E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED))
4097 lc_back = E_NEW(E_Layout_Item_Container, 1);
4098 lc_back->pos = lc_moving->pos;
4099 lc_back->prev_pos = lc_moving->prev_pos;
4100 lc_back->size = lc_moving->size;
4101 lc_back->prev_size = lc_moving->prev_size;
4102 lc_back->state_info.min_seq = lc_moving->state_info.min_seq;
4103 lc_back->state_info.max_seq = lc_moving->state_info.max_seq;
4104 lc_back->sd = lc_moving->sd;
4105 EINA_LIST_FOREACH(lc_moving->items, l2, lc)
4106 lc_back->items = eina_list_append(lc_back->items, lc);
4107 lc_back->state = lc_moving->state;
4108 bi_moving = eina_list_data_get(lc_back->items);
4117 _e_gadcon_layout_smart_gadcons_position_static(sd, list);
4121 lc_moving_prev_pos = lc_moving->prev_pos;
4122 if (lc_moving->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_DEC)
4124 _e_gadcon_layout_smart_restore_gadcons_position_before_move(sd, &lc_moving, lc_back, list);
4125 EINA_LIST_FOREACH(*list, l, lc)
4126 if (lc == lc_moving) break;
4129 if ((l) && eina_list_prev(l))
4131 lc = eina_list_data_get(eina_list_prev(l));
4133 if (lc_moving->pos < (lc->pos + lc->size))
4135 bi = eina_list_data_get(lc_moving->items);
4136 if (bi->gcc->state_info.resist <= E_LAYOUT_ITEM_DRAG_RESIST_LEVEL)
4138 if (lc_moving->prev_pos == (lc->pos + lc->size))
4140 bi->gcc->state_info.resist++;
4141 lc_moving->pos = lc->pos + lc->size;
4142 _e_gadcon_layout_smart_position_items_inside_container(sd, lc_moving);
4146 bi->gcc->state_info.resist = 0;
4147 if (lc_moving->pos < lc->pos)
4149 lc_moving->pos = (lc->pos + lc->size) - 1;
4150 _e_gadcon_layout_smart_position_items_inside_container(sd, lc_moving);
4152 lc3 = _e_gadcon_layout_smart_containers_position_adjust(sd, lc, lc_moving);
4155 if (lc_moving->prev_pos == (lc->pos + lc->size))
4159 *list = eina_list_remove_list(*list, eina_list_prev(l));
4169 int pos, prev_pos, stop;
4171 EINA_LIST_FOREACH(*list, l, lc)
4172 if (lc == lc_moving) break;
4174 pos = lc_moving->pos + lc_moving->size;
4175 prev_pos = lc_moving_prev_pos;
4176 if ((l) && (eina_list_next(l)))
4179 EINA_LIST_FOREACH(eina_list_next(l), l2, lc)
4182 if (lc->pos != prev_pos) break;
4183 prev_pos = lc->pos + lc->size;
4185 EINA_LIST_FOREACH(lc->items, l3, bi)
4187 if (bi->ask.pos <= pos)
4190 pos = (bi->x) + (bi->w);
4192 else if (bi->ask.pos < bi->x)
4194 bi->x = bi->ask.pos;
4195 pos = (bi->x) + (bi->w);
4197 else if (bi->ask.pos == bi->x)
4207 else if (lc_moving->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_INC)
4209 _e_gadcon_layout_smart_restore_gadcons_position_before_move(sd, &lc_moving, lc_back, list);
4210 EINA_LIST_FOREACH(*list, l, lc)
4211 if (lc == lc_moving) break;
4214 if ((l) && eina_list_next(l))
4216 lc = eina_list_data_get(eina_list_next(l));
4218 if ((lc_moving->pos + lc_moving->size) > lc->pos)
4220 bi = eina_list_data_get(lc_moving->items);
4221 if (bi->gcc->state_info.resist <= E_LAYOUT_ITEM_DRAG_RESIST_LEVEL)
4223 if ((lc_moving->prev_pos + lc_moving->size) == lc->pos)
4225 bi->gcc->state_info.resist++;
4226 lc_moving->pos = lc->pos - lc_moving->size;
4227 _e_gadcon_layout_smart_position_items_inside_container(sd, lc_moving);
4231 bi->gcc->state_info.resist = 0;
4232 if ((lc_moving->pos + lc_moving->size) > lc->pos)
4234 lc_moving->pos = (lc->pos - lc_moving->size) + 1;
4235 _e_gadcon_layout_smart_position_items_inside_container(sd, lc_moving);
4237 lc3 = _e_gadcon_layout_smart_containers_position_adjust(sd, lc_moving, lc);
4240 if ((lc_moving->prev_pos + lc_moving->size) == lc->pos)
4244 *list = eina_list_remove_list(*list, eina_list_next(l));
4255 int pos, prev_pos, stop;
4257 EINA_LIST_FOREACH(*list, l, lc)
4258 if (lc == lc_moving) break;
4260 pos = lc_moving->pos;
4261 prev_pos = lc_moving_prev_pos;
4263 if ((l) && eina_list_prev(l))
4266 /* EINA_FUCK_REVERSE_FOREACH(eina_list_prev(l), l2, lc) */
4267 for (l2 = l->prev; l2; l2 = l2->prev)
4272 if ((lc->pos + lc->size) == prev_pos) break;
4275 EINA_LIST_REVERSE_FOREACH(lc->items, l3, bi)
4277 if ((bi->ask.pos + bi->w) >= pos)
4279 bi->x = pos - bi->w;
4282 else if (bi->ask.pos > bi->x)
4284 bi->x = bi->ask.pos;
4287 else if (bi->ask.pos == bi->x)
4297 else if (lc_moving->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MIN_END_DEC)
4299 _e_gadcon_layout_smart_restore_gadcons_position_before_move(sd, &lc_moving, lc_back, list);
4300 EINA_LIST_FOREACH(*list, l, lc)
4301 if (lc == lc_moving) break;
4303 if ((l) && eina_list_prev(l))
4308 new_pos = lc_moving->pos;
4309 /* EINA_FUCK_REVERSE_FOREACH(eina_list_prev(l), l2, lc) */
4310 for (l2 = l->prev; l2; l2 = l2->prev)
4313 if (new_pos >= (lc->pos + lc->size)) break;
4316 new_pos -= lc->size;
4321 lc_moving->size += new_pos;
4322 lc_moving->pos -= new_pos;
4324 bi = eina_list_data_get(lc_moving->items);
4325 bi->w = lc_moving->size;
4326 _e_gadcon_layout_smart_position_items_inside_container(sd, lc_moving);
4333 if (!l2) l2 = *list;
4334 else l2 = eina_list_next(l2);
4336 EINA_LIST_FOREACH(l2, l2, lc)
4340 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4341 EINA_LIST_FOREACH(lc->items, l3, bi)
4343 bi->gcc->state_info.flags &= ~E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
4345 new_pos += lc->size;
4349 else if ((l) && (!eina_list_prev(l)))
4351 if (lc_moving->pos <= 0)
4353 lc_moving->size = lc_moving->prev_size;
4356 bi = eina_list_data_get(lc_moving->items);
4357 bi->w = lc_moving->size;
4359 _e_gadcon_layout_smart_position_items_inside_container(sd, lc_moving);
4363 else if (lc_moving->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MIN_END_INC)
4365 lc_moving->state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED;
4366 _e_gadcon_layout_smart_gadcons_position_static(sd, list);
4367 if (lc_back) LC_FREE(lc_back);
4369 else if (lc_moving->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MAX_END_INC)
4371 _e_gadcon_layout_smart_restore_gadcons_position_before_move(sd, &lc_moving, lc_back, list);
4372 EINA_LIST_FOREACH(*list, l, lc)
4373 if (lc == lc_moving) break;
4375 if ((l) && eina_list_next(l))
4377 Eina_List *stop = NULL;
4381 new_pos = lc_moving->pos + lc_moving->size;
4382 EINA_LIST_FOREACH(eina_list_next(l), l2, lc)
4384 if (new_pos <= lc->pos)
4391 /* new_pos += lc->size; */
4394 if (new_pos > sd->w)
4396 lc_moving->size -= (new_pos - sd->w);
4397 bi = eina_list_data_get(lc_moving->items);
4398 bi->w = lc_moving->size;
4400 new_pos = lc_moving->pos + lc_moving->size;
4405 EINA_LIST_FOREACH(eina_list_next(l), l2, lc)
4407 if (l2 == stop) break;
4409 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4410 EINA_LIST_FOREACH(lc->items, l3, bi)
4412 bi->gcc->state_info.flags &= ~E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
4414 new_pos += lc->size;
4418 else if ((l) && (!eina_list_next(l)))
4420 if ((lc_moving->pos + lc_moving->size) >= sd->w)
4422 lc_moving->size = lc_moving->prev_size;
4423 bi = eina_list_data_get(lc_moving->items);
4424 bi->w = lc_moving->size;
4428 else if (lc_moving->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MAX_END_DEC)
4430 lc_moving->state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED;
4431 _e_gadcon_layout_smart_gadcons_position_static(sd, list);
4432 if (lc_back) LC_FREE(lc_back);
4437 bi_moving->gcc->config.pos = bi_moving->ask.pos = bi_moving->x;
4438 bi_moving->gcc->config.size = bi_moving->w;
4443 _e_gadcon_layout_smart_gadcons_position_static(E_Smart_Data *sd, Eina_List **list)
4447 E_Layout_Item_Container *lc, *lc2, *lc3;
4449 *list = eina_list_sort(*list, eina_list_count(*list), _e_gadcon_layout_smart_containers_sort_cb);
4452 EINA_LIST_FOREACH(*list, l, lc)
4454 if (!eina_list_next(l)) continue;
4456 lc2 = eina_list_data_get(eina_list_next(l));
4458 if (LC_OVERLAP(lc, lc2))
4460 lc3 = _e_gadcon_layout_smart_containers_position_adjust(sd, lc, lc2);
4464 *list = eina_list_remove_list(*list, eina_list_next(l));
4467 goto __reposition_again;
4473 EINA_LIST_FOREACH(*list, l, lc)
4479 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4483 if (((lc->pos + lc->size) > sd->w) && (lc->size <= sd->w))
4486 lc->pos = sd->w - lc->size;
4487 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4491 _e_gadcon_layout_smart_gadcons_position_static(sd, list);
4494 static E_Layout_Item_Container *
4495 _e_gadcon_layout_smart_containers_position_adjust(E_Smart_Data *sd, E_Layout_Item_Container *lc, E_Layout_Item_Container *lc2)
4499 E_Layout_Item_Container *lc3 = NULL;
4500 E_Layout_Item_Container_State new_state;
4501 E_Gadcon_Layout_Item *bi, *bi2;
4503 if ((lc->state == E_LAYOUT_ITEM_CONTAINER_STATE_NONE) &&
4504 (lc2->state == E_LAYOUT_ITEM_CONTAINER_STATE_NONE))
4506 if (lc->state_info.max_seq <= lc2->state_info.min_seq)
4508 lc2->pos = lc->pos + lc->size;
4509 _e_gadcon_layout_smart_position_items_inside_container(sd, lc2);
4511 else if (lc->state_info.min_seq > lc2->state_info.max_seq)
4513 lc->pos = lc2->pos + lc2->size;
4514 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4516 else if (((lc->state_info.min_seq > lc2->state_info.min_seq) &&
4517 (lc->state_info.min_seq < lc2->state_info.max_seq)) ||
4518 ((lc2->state_info.min_seq > lc->state_info.min_seq) &&
4519 (lc2->state_info.min_seq < lc->state_info.max_seq)))
4521 _e_gadcon_layout_smart_containers_merge(sd, lc, lc2);
4524 new_state = E_LAYOUT_ITEM_CONTAINER_STATE_NONE;
4526 else if ((lc->state != E_LAYOUT_ITEM_CONTAINER_STATE_NONE) &&
4527 (lc2->state == E_LAYOUT_ITEM_CONTAINER_STATE_NONE))
4529 if (lc->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_INC)
4533 bi = eina_list_data_get(lc->items);
4534 bi2 = eina_list_data_get(lc2->items);
4536 bi->x = ((bi2->x) + (bi2->w)) - (bi->w);
4537 bi->gcc->config.pos = bi->ask.pos = bi->x;
4538 bi->gcc->config.size = bi->w;
4539 bi2->x = (bi->x) - (bi2->w);
4541 bi2->gcc->state_info.flags &= ~E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
4543 t = bi->gcc->state_info.seq;
4544 bi->gcc->state_info.seq = bi2->gcc->state_info.seq;
4545 bi2->gcc->state_info.seq = t;
4547 _e_gadcon_layout_smart_containers_merge(sd, lc, lc2);
4549 else if (lc->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED)
4551 if (lc->state_info.max_seq < lc2->state_info.min_seq)
4553 lc2->pos = lc->pos + lc->size;
4554 _e_gadcon_layout_smart_position_items_inside_container(sd, lc2);
4556 else if (lc->state_info.min_seq > lc2->state_info.max_seq)
4558 lc2->pos = lc->pos - lc2->size;
4559 _e_gadcon_layout_smart_position_items_inside_container(sd, lc2);
4561 else if (((lc->state_info.min_seq > lc2->state_info.min_seq) &&
4562 (lc->state_info.min_seq < lc2->state_info.max_seq)) ||
4563 ((lc2->state_info.min_seq > lc->state_info.min_seq) &&
4564 (lc2->state_info.min_seq < lc->state_info.max_seq)))
4568 _e_gadcon_layout_smart_containers_merge(sd, lc, lc2);
4570 EINA_LIST_FOREACH(lc->items, l, bi)
4572 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_POSITION)
4574 shift = bi->ask.pos - bi->x;
4577 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE)
4583 EINA_LIST_FOREACH(lc->items, l, bi)
4594 new_state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED;
4596 else if ((lc->state == E_LAYOUT_ITEM_CONTAINER_STATE_NONE) &&
4597 (lc2->state != E_LAYOUT_ITEM_CONTAINER_STATE_NONE))
4599 if (lc2->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED)
4601 if (lc->state_info.max_seq < lc2->state_info.min_seq)
4603 lc->pos = lc2->pos - lc->size;
4604 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4606 else if (lc->state_info.min_seq > lc2->state_info.max_seq)
4608 lc->pos = lc2->pos + lc2->size;
4609 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4611 else if (((lc->state_info.min_seq > lc2->state_info.min_seq) &&
4612 (lc->state_info.min_seq < lc2->state_info.max_seq)) ||
4613 ((lc2->state_info.min_seq > lc->state_info.min_seq) &&
4614 (lc2->state_info.min_seq < lc->state_info.max_seq)))
4618 EINA_LIST_FOREACH(lc->items, l, bi)
4620 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_POSITION)
4622 shift = bi->ask.pos - bi->x;
4625 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE)
4631 EINA_LIST_FOREACH(lc->items, l, bi)
4641 else if (lc2->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_DEC)
4645 bi = eina_list_data_get(eina_list_last(lc->items));
4646 bi2 = eina_list_data_get(lc2->items);
4648 bi2->gcc->config.pos = bi2->ask.pos = (bi2->x) = (bi->x);
4649 bi2->gcc->config.size = bi2->w;
4650 bi->x = bi2->x + bi2->w;
4652 t = bi->gcc->state_info.seq;
4653 bi->gcc->state_info.seq = bi2->gcc->state_info.seq;
4654 bi2->gcc->state_info.seq = t;
4656 lc->items = eina_list_remove_list(lc->items, eina_list_last(lc->items));
4657 lc->items = eina_list_append(lc->items, bi2);
4658 lc->items = eina_list_append(lc->items, bi);
4659 lc2->items = eina_list_free(lc2->items);
4660 E_LAYOUT_ITEM_CONTAINER_SIZE_CHANGE_BY(lc, bi2, 1);
4661 lc2->pos = lc->pos + lc->size;
4665 new_state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED;
4667 else if ((lc->state != E_LAYOUT_ITEM_CONTAINER_STATE_NONE) &&
4668 (lc2->state != E_LAYOUT_ITEM_CONTAINER_STATE_NONE))
4670 if ((lc->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED) &&
4671 (lc2->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED))
4673 if (lc->state_info.max_seq < lc2->state_info.min_seq)
4678 EINA_LIST_FOREACH(lc->items, l, bi)
4680 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE)
4686 EINA_LIST_FOREACH(lc2->items, l, bi)
4688 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE)
4695 if ((move_lc1) && (!move_lc2))
4697 lc->pos = lc2->pos - lc->size;
4698 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4702 lc2->pos = lc->pos + lc->size;
4703 _e_gadcon_layout_smart_position_items_inside_container(sd, lc2);
4706 else if (lc->state_info.min_seq > lc2->state_info.max_seq)
4711 EINA_LIST_FOREACH(lc->items, l, bi)
4713 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE)
4719 EINA_LIST_FOREACH(lc2->items, l, bi)
4721 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE)
4728 if ((!move_lc1) && (move_lc2))
4730 lc2->pos = lc->pos - lc2->size;
4731 _e_gadcon_layout_smart_position_items_inside_container(sd, lc2);
4735 lc->pos = lc2->pos + lc2->size;
4736 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4739 else if (((lc->state_info.min_seq > lc2->state_info.min_seq) &&
4740 (lc->state_info.min_seq < lc2->state_info.max_seq)) ||
4741 ((lc2->state_info.min_seq > lc->state_info.min_seq) &&
4742 (lc2->state_info.min_seq < lc->state_info.max_seq)))
4746 _e_gadcon_layout_smart_containers_merge(sd, lc, lc2);
4748 EINA_LIST_FOREACH(lc->items, l, bi)
4750 if ((bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_POSITION) &&
4751 (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE))
4753 shift = bi->ask.pos - bi->x;
4760 EINA_LIST_FOREACH(lc->items, l, bi)
4770 new_state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED;
4776 lc3 = E_NEW(E_Layout_Item_Container, 1);
4778 if (lc->pos < lc2->pos)
4781 EINA_LIST_FOREACH(lc->items, l, bi)
4782 lc3->items = eina_list_append(lc3->items, bi);
4783 EINA_LIST_FOREACH(lc2->items, l, bi)
4784 lc3->items = eina_list_append(lc3->items, bi);
4786 lc3->state_info.min_seq = lc->state_info.min_seq;
4788 lc3->state_info.max_seq = lc2->state_info.max_seq;
4790 lc3->state_info.max_seq = lc->state_info.max_seq;
4794 lc3->pos = lc2->pos;
4795 EINA_LIST_FOREACH(lc2->items, l, bi)
4796 lc3->items = eina_list_append(lc3->items, bi);
4797 EINA_LIST_FOREACH(lc->items, l, bi)
4798 lc3->items = eina_list_append(lc3->items, bi);
4800 lc3->state_info.min_seq = lc2->state_info.min_seq;
4802 lc3->state_info.max_seq = lc->state_info.max_seq;
4804 lc3->state_info.max_seq = lc2->state_info.max_seq;
4806 lc3->size = lc->size + lc2->size;
4807 lc3->state = new_state;
4814 _e_gadcon_layout_smart_position_items_inside_container(E_Smart_Data *sd __UNUSED__, E_Layout_Item_Container *lc)
4818 E_Gadcon_Layout_Item *bi;
4820 if (!lc->items) return;
4822 bi = eina_list_data_get(lc->items);
4823 shift = lc->pos - bi->x;
4827 EINA_LIST_FOREACH(lc->items, l, bi)
4831 if ((bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_POS_DEC) ||
4832 (bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_POS_INC))
4834 bi->gcc->config.pos = bi->ask.pos = bi->x;
4840 _e_gadcon_layout_smart_containers_merge(E_Smart_Data *sd __UNUSED__, E_Layout_Item_Container *lc, E_Layout_Item_Container *lc2)
4842 int start = 0, size = 0, next = 0, min_seq = 0, max_seq = 0;
4843 Eina_List *l, *nl = NULL;
4844 E_Gadcon_Layout_Item *bi;
4846 EINA_LIST_FOREACH(lc->items, l, bi)
4847 nl = eina_list_append(nl, bi);
4848 EINA_LIST_FOREACH(lc2->items, l, bi)
4849 nl = eina_list_append(nl, bi);
4851 nl = eina_list_sort(nl, eina_list_count(nl), _e_gadcon_layout_smart_seq_sort_cb);
4853 EINA_LIST_FOREACH(nl, l, bi)
4857 min_seq = max_seq = bi->gcc->state_info.seq;
4860 next = bi->x + bi->w;
4865 max_seq = bi->gcc->state_info.seq;
4869 next = bi->x + bi->w;
4872 lc->items = eina_list_free(lc->items);
4873 lc2->items = eina_list_free(lc->items);
4877 lc->state_info.min_seq = min_seq;
4878 lc->state_info.max_seq = max_seq;
4879 lc2->pos = lc->pos + lc->size;
4884 _e_gadcon_layout_smart_restore_gadcons_position_before_move(E_Smart_Data *sd, E_Layout_Item_Container **lc_moving, E_Layout_Item_Container *lc_back, Eina_List **con_list)
4887 Eina_List *l, *l2, *l3;
4888 E_Gadcon_Layout_Item *bi, *bi2;
4889 E_Layout_Item_Container *lc, *lc2, *lc3;
4891 (*lc_moving)->pos = (*lc_moving)->prev_pos;
4892 if (((*lc_moving)->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MIN_END_INC) ||
4893 ((*lc_moving)->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MIN_END_DEC) ||
4894 ((*lc_moving)->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MAX_END_INC) ||
4895 ((*lc_moving)->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MAX_END_DEC))
4897 (*lc_moving)->size = (*lc_moving)->prev_size;
4898 bi = eina_list_data_get((*lc_moving)->items);
4900 bi->w = (*lc_moving)->prev_size;
4902 _e_gadcon_layout_smart_position_items_inside_container(sd, (*lc_moving));
4903 (*lc_moving)->state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED;
4904 _e_gadcon_layout_smart_gadcons_position_static(sd, con_list);
4909 EINA_LIST_FOREACH(*con_list, l, lc)
4911 if (lc->state == E_LAYOUT_ITEM_CONTAINER_STATE_NONE) continue;
4913 if (eina_list_count(lc->items) == 1)
4915 bi = eina_list_data_get(lc->items);
4916 if (bi->gcc->state_info.state != E_LAYOUT_ITEM_STATE_NONE)
4919 l->data = *lc_moving = lc_back;
4920 _e_gadcon_layout_smart_position_items_inside_container(sd, (*lc_moving));
4922 if (((*lc_moving)->state != E_LAYOUT_ITEM_CONTAINER_STATE_POS_INC) &&
4923 ((*lc_moving)->state != E_LAYOUT_ITEM_CONTAINER_STATE_POS_DEC))
4925 bi = eina_list_data_get((*lc_moving)->items);
4926 bi->w = (*lc_moving)->size;
4932 EINA_LIST_FOREACH(lc->items, l2, bi)
4934 if (bi->gcc->state_info.state != E_LAYOUT_ITEM_STATE_NONE)
4937 if (l2 != lc->items)
4939 lc2 = E_NEW(E_Layout_Item_Container, 1);
4941 lc2->state = E_LAYOUT_ITEM_CONTAINER_STATE_NONE;
4942 EINA_LIST_FOREACH(lc->items, l3, bi2)
4945 lc2->items = eina_list_append(lc2->items, bi2);
4946 if (l3 == lc->items)
4948 lc2->state_info.min_seq = bi2->gcc->state_info.seq;
4949 lc2->pos = lc2->prev_pos = bi2->x;
4951 lc2->state_info.max_seq = bi2->gcc->state_info.seq;
4952 E_LAYOUT_ITEM_CONTAINER_SIZE_CHANGE_BY(lc2, bi2, 1);
4956 if (eina_list_next(l2))
4958 lc3 = E_NEW(E_Layout_Item_Container, 1);
4960 lc3->state = E_LAYOUT_ITEM_CONTAINER_STATE_NONE;
4961 EINA_LIST_FOREACH(eina_list_next(l2), l3, bi2)
4963 lc3->items = eina_list_append(lc3->items, bi2);
4964 if (l3 == eina_list_next(l2))
4966 lc3->state_info.min_seq = bi2->gcc->state_info.seq;
4967 lc3->pos = lc3->prev_pos = bi2->x;
4969 lc3->state_info.max_seq = bi2->gcc->state_info.seq;
4970 E_LAYOUT_ITEM_CONTAINER_SIZE_CHANGE_BY(lc3, bi2, 1);
4973 *lc_moving = lc_back;
4974 _e_gadcon_layout_smart_position_items_inside_container(sd, *lc_moving);
4976 if (((*lc_moving)->state != E_LAYOUT_ITEM_CONTAINER_STATE_POS_INC) &&
4977 ((*lc_moving)->state != E_LAYOUT_ITEM_CONTAINER_STATE_POS_DEC))
4979 bi = eina_list_data_get((*lc_moving)->items);
4980 bi->w = (*lc_moving)->size;
4991 *con_list = eina_list_append(*con_list, *lc_moving);
4993 *con_list = eina_list_append(*con_list, lc3);
4994 *con_list = eina_list_sort(*con_list, eina_list_count(*con_list),
4995 _e_gadcon_layout_smart_containers_sort_cb);
4999 l->data = *lc_moving;
5002 *con_list = eina_list_append(*con_list, lc3);
5003 *con_list = eina_list_sort(*con_list, eina_list_count(*con_list),
5004 _e_gadcon_layout_smart_containers_sort_cb);
5012 EINA_LIST_FOREACH(*con_list, l, lc)
5014 if (lc == *lc_moving) continue;
5015 lc->state = E_LAYOUT_ITEM_CONTAINER_STATE_NONE;
5020 _e_gadcon_custom_populate_idler(void *data __UNUSED__)
5022 const E_Gadcon_Client_Class *cc;
5026 EINA_LIST_FREE(custom_populate_requests, gc)
5028 e_gadcon_layout_freeze(gc->o_container);
5029 EINA_LIST_FOREACH(providers_list, l, cc)
5031 if (gc->populate_class.func)
5032 gc->populate_class.func(gc->populate_class.data, gc, cc);
5034 e_gadcon_populate_class(gc, cc);
5036 e_gadcon_layout_thaw(gc->o_container);
5039 custom_populate_idler = NULL;
5040 return ECORE_CALLBACK_CANCEL;
5044 _e_gadcon_provider_populate_idler(void *data __UNUSED__)
5046 const E_Gadcon_Client_Class *cc;
5050 EINA_LIST_FOREACH(gadcons, l, gc)
5051 e_gadcon_layout_freeze(gc->o_container);
5053 EINA_LIST_FREE(populate_requests, cc)
5055 EINA_LIST_FOREACH(gadcons, l, gc)
5057 if (gc->populate_class.func)
5058 gc->populate_class.func(gc->populate_class.data, gc, cc);
5060 e_gadcon_populate_class(gc, cc);
5064 EINA_LIST_FOREACH(gadcons, l, gc)
5065 e_gadcon_layout_thaw(gc->o_container);
5067 populate_idler = NULL;
5068 return ECORE_CALLBACK_CANCEL;
5072 _e_gadcon_provider_populate_request(const E_Gadcon_Client_Class *cc)
5074 if (!populate_idler)
5075 populate_idler = ecore_idler_add(_e_gadcon_provider_populate_idler, NULL);
5076 if (!eina_list_data_find(populate_requests, cc))
5077 populate_requests = eina_list_append(populate_requests, cc);
5081 _e_gadcon_provider_populate_unrequest(const E_Gadcon_Client_Class *cc)
5083 populate_requests = eina_list_remove(populate_requests, cc);
5084 if ((!populate_requests) && (populate_idler))
5086 ecore_idler_del(populate_idler);
5087 populate_idler = NULL;
5091 /* gadgets movement between different gadcons */
5093 EAPI E_Gadcon_Location *
5094 e_gadcon_location_new(const char * name,
5096 int (*add_func) (void *data, const E_Gadcon_Client_Class *cc),
5098 void (*remove_func) (void *data, E_Gadcon_Client *cc),
5101 E_Gadcon_Location *loc;
5103 loc = E_NEW(E_Gadcon_Location, 1);
5104 loc->name = eina_stringshare_add(name);
5106 loc->gadget_add.func = add_func;
5107 loc->gadget_add.data = add_data;
5108 loc->gadget_remove.func = remove_func;
5109 loc->gadget_remove.data = remove_data;
5110 loc->icon_name = NULL;
5115 e_gadcon_location_set_icon_name(E_Gadcon_Location *loc, const char *name)
5117 if (loc->icon_name) eina_stringshare_del(loc->icon_name);
5119 loc->icon_name = eina_stringshare_add(name);
5121 loc->icon_name = NULL;
5125 e_gadcon_location_free(E_Gadcon_Location *loc)
5127 eina_stringshare_del(loc->name);
5128 if (loc->icon_name) eina_stringshare_del(loc->icon_name);
5133 e_gadcon_location_register(E_Gadcon_Location * loc)
5135 gadcon_locations = eina_list_append(gadcon_locations, loc);
5139 e_gadcon_location_unregister(E_Gadcon_Location * loc)
5141 gadcon_locations = eina_list_remove(gadcon_locations, loc);
5145 _e_gadcon_location_change(E_Gadcon_Client * gcc, E_Gadcon_Location *src, E_Gadcon_Location *dst)
5147 E_Gadcon_Client_Class *cc;
5149 cc = eina_hash_find(providers, gcc->cf->name);
5151 if (!dst->gadget_add.func(dst->gadget_add.data, cc)) return 0;
5152 src->gadget_remove.func(src->gadget_remove.data, gcc);