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->id;
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->id;
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))
1717 e_box_pack_options_set(gcc->o_base,
1720 0.5, 0.5, /* align */
1727 _e_gadcon_cb_client_scroll_timer(void *data)
1729 E_Gadcon_Client *gcc;
1733 d = gcc->scroll_wanted - gcc->scroll_pos;
1737 gcc->scroll_pos = gcc->scroll_wanted;
1738 gcc->scroll_timer = NULL;
1739 return ECORE_CALLBACK_CANCEL;
1742 gcc->scroll_pos = (gcc->scroll_pos * (1.0 - v)) + (gcc->scroll_wanted * v);
1743 return ECORE_CALLBACK_RENEW;
1747 _e_gadcon_cb_client_scroll_animator(void *data)
1749 E_Gadcon_Client *gcc;
1752 if (e_box_orientation_get(gcc->o_box))
1753 e_box_align_set(gcc->o_box, 1.0 - gcc->scroll_pos, 0.5);
1755 e_box_align_set(gcc->o_box, 0.5, 1.0 - gcc->scroll_pos);
1756 if (!gcc->scroll_timer)
1758 gcc->scroll_animator = NULL;
1759 return ECORE_CALLBACK_CANCEL;
1762 if (gcc->scroll_cb.func)
1763 gcc->scroll_cb.func(gcc->scroll_cb.data);
1765 return ECORE_CALLBACK_RENEW;
1769 _e_gadcon_cb_client_frame_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1771 Evas_Event_Mouse_Move *ev;
1772 E_Gadcon_Client *gcc;
1777 evas_object_geometry_get(gcc->o_box, &x, &y, NULL, NULL);
1778 e_gadcon_client_autoscroll_update(gcc, ev->cur.output.x - x,
1779 ev->cur.output.y - y);
1783 _e_gadcon_cb_client_frame_moveresize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1785 E_Gadcon_Client *gcc;
1788 _e_gadcon_moveresize_handle(gcc);
1792 _e_gadcon_client_save(E_Gadcon_Client *gcc)
1794 gcc->cf->geom.pos = gcc->config.pos;
1795 gcc->cf->geom.size = gcc->config.size;
1796 gcc->cf->geom.res = gcc->config.res;
1797 gcc->cf->geom.pos_x = gcc->config.pos_x;
1798 gcc->cf->geom.pos_y = gcc->config.pos_y;
1799 gcc->cf->geom.size_w = gcc->config.size_w;
1800 gcc->cf->geom.size_h = gcc->config.size_h;
1801 gcc->cf->state_info.seq = gcc->state_info.seq;
1802 gcc->cf->state_info.flags = gcc->state_info.flags;
1803 gcc->cf->autoscroll = gcc->autoscroll;
1804 if (gcc->cf->style) eina_stringshare_del(gcc->cf->style);
1805 gcc->cf->style = NULL;
1807 gcc->cf->style = eina_stringshare_add(gcc->style);
1808 /* gcc->cf->resizable = gcc->resizable;*/
1809 gcc->cf->resizable = 0;
1810 e_config_save_queue();
1814 _e_gadcon_client_drag_begin(E_Gadcon_Client *gcc, int x, int y)
1817 Evas_Object *o = NULL;
1818 Evas_Coord w = 0, h = 0;
1819 const char *drag_types[] = { "enlightenment/gadcon_client" };
1821 if ((drag_gcc) || (!gcc->gadcon->zone) || (!gcc->gadcon->zone->container))
1826 e_object_ref(E_OBJECT(gcc));
1827 /* Remove this config from the current gadcon */
1828 gcc->gadcon->cf->clients =
1829 eina_list_remove(gcc->gadcon->cf->clients, gcc->cf);
1830 gcc->state_info.state = E_LAYOUT_ITEM_STATE_NONE;
1831 gcc->state_info.resist = 0;
1833 if (!e_drop_inside(gcc->gadcon->drop_handler, x, y))
1834 e_gadcon_client_hide(gcc);
1836 ecore_x_pointer_xy_get(gcc->gadcon->zone->container->win, &x, &y);
1838 drag = e_drag_new(gcc->gadcon->zone->container, x, y,
1839 drag_types, 1, gcc, -1, NULL,
1840 _e_gadcon_cb_drag_finished);
1843 o = gcc->client_class->func.icon((E_Gadcon_Client_Class *)gcc->client_class,
1844 e_drag_evas_get(drag));
1845 evas_object_geometry_get(o, NULL, NULL, &w, &h);
1848 /* FIXME: fallback icon for drag */
1849 o = evas_object_rectangle_add(e_drag_evas_get(drag));
1850 evas_object_color_set(o, 255, 255, 255, 100);
1854 e_drag_object_set(drag, o);
1855 e_drag_resize(drag, w, h);
1856 e_drag_start(drag, x + w/2, y + h/2);
1861 _e_gadcon_client_inject(E_Gadcon *gc, E_Gadcon_Client *gcc, int x, int y)
1864 E_Gadcon_Client *gcc2;
1865 Evas_Coord cx, cy, cw, ch;
1868 /* Check if the gadcon client is in place */
1872 evas_object_geometry_get(gcc->o_frame, &cx, &cy, &cw, &ch);
1873 else if (gcc->o_base)
1874 evas_object_geometry_get(gcc->o_base, &cx, &cy, &cw, &ch);
1875 else return; /* make clang happy */
1877 if (E_INSIDE(x, y, cx, cy, cw, ch)) return;
1880 /* If x, y is not inside any gadcon client, seq will be 0 and it's position
1881 * will later be used for placement. */
1882 gcc->state_info.seq = 0;
1883 EINA_LIST_FOREACH(gc->clients, l, gcc2)
1885 if (gcc == gcc2) continue;
1886 if (gcc2->hidden) continue;
1888 evas_object_geometry_get(gcc2->o_frame, &cx, &cy, &cw, &ch);
1889 else if (gcc2->o_base)
1890 evas_object_geometry_get(gcc2->o_base, &cx, &cy, &cw, &ch);
1891 else return; /* make clang happy */
1892 if (e_gadcon_layout_orientation_get(gc->o_container))
1894 if (E_INSIDE(x, y, cx, cy, cw / 2, ch))
1896 gcc->state_info.seq = seq++;
1897 gcc2->state_info.seq = seq++;
1899 else if (E_INSIDE(x, y, cx + cw / 2, cy, cw / 2, ch))
1901 gcc2->state_info.seq = seq++;
1902 gcc->state_info.seq = seq++;
1905 gcc2->state_info.seq = seq++;
1909 if (E_INSIDE(x, y, cx, cy, cw, ch / 2))
1911 gcc->state_info.seq = seq++;
1912 gcc2->state_info.seq = seq++;
1914 else if (E_INSIDE(x, y, cx, cy + ch / 2, cw, ch / 2))
1916 gcc2->state_info.seq = seq++;
1917 gcc->state_info.seq = seq++;
1920 gcc2->state_info.seq = seq++;
1926 _e_gadcon_cb_min_size_request(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1931 if (gc->min_size_request.func)
1933 Evas_Coord w = 0, h = 0;
1935 e_gadcon_layout_min_size_get(gc->o_container, &w, &h);
1936 gc->min_size_request.func(gc->min_size_request.data, gc, w, h);
1941 _e_gadcon_cb_size_request(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1946 if (gc->resize_request.func)
1948 Evas_Coord w = 0, h = 0;
1950 e_gadcon_layout_asked_size_get(gc->o_container, &w, &h);
1951 gc->resize_request.func(gc->resize_request.data, gc, w, h);
1956 _e_gadcon_cb_moveresize(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1959 Evas_Coord x, y, w, h;
1962 evas_object_geometry_get(gc->o_container, &x, &y, &w, &h);
1963 if (gc->drop_handler)
1964 e_drop_handler_geometry_set(gc->drop_handler, x, y, w, h);
1968 _e_gadcon_cb_client_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1970 Evas_Event_Mouse_Down *ev;
1971 E_Gadcon_Client *gcc;
1975 if (ev->button == 3)
1982 zone = e_util_zone_current_get(e_manager_current_get());
1984 e_gadcon_locked_set(gcc->gadcon, 1);
1986 e_menu_post_deactivate_callback_set(mn, _e_gadcon_client_cb_menu_post,
1990 mi = e_menu_item_new(mn);
1991 e_menu_item_label_set(mi, _("Stop moving"));
1992 e_util_menu_item_theme_icon_set(mi, "enlightenment/edit");
1993 e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_edit, gcc);
1995 if (gcc->gadcon->menu_attach.func)
1997 mi = e_menu_item_new(mn);
1998 e_menu_item_separator_set(mi, 1);
2000 gcc->gadcon->menu_attach.func(gcc->gadcon->menu_attach.data,
2004 if (gcc->gadcon->toolbar)
2005 ecore_x_pointer_xy_get(zone->container->win, &cx, &cy);
2008 e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &cx, &cy, NULL, NULL);
2009 cx = cx + ev->output.x;
2010 cy = cy + ev->output.y;
2012 e_menu_activate_mouse(mn, zone, cx, cy, 1, 1,
2013 E_MENU_POP_DIRECTION_AUTO, ev->timestamp);
2018 _e_gadcon_cb_client_mouse_in(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2020 E_Gadcon_Client *gcc;
2023 edje_object_signal_emit(gcc->o_control, "e,state,focused", "e");
2027 _e_gadcon_cb_client_mouse_out(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2029 E_Gadcon_Client *gcc;
2032 edje_object_signal_emit(gcc->o_control, "e,state,unfocused", "e");
2036 _e_gadcon_cb_client_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
2038 E_Gadcon_Client *gcc;
2042 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
2043 if (gcc->o_control) evas_object_move(gcc->o_control, x, y);
2044 if (gcc->o_event) evas_object_move(gcc->o_event, x, y);
2048 _e_gadcon_cb_client_resize(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
2050 E_Gadcon_Client *gcc;
2054 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
2055 if (gcc->o_control) evas_object_resize(gcc->o_control, w, h);
2056 if (gcc->o_event) evas_object_resize(gcc->o_event, w, h);
2060 _e_gadcon_client_move_start(E_Gadcon_Client *gcc)
2062 int x, y, gcx, gcy, gy ,gx;
2064 evas_object_raise(gcc->o_event);
2065 evas_object_stack_below(gcc->o_control, gcc->o_event);
2067 if (gcc->gadcon->toolbar)
2068 evas_pointer_canvas_xy_get(gcc->gadcon->evas, &gcc->dx, &gcc->dy);
2071 ecore_x_pointer_xy_get(gcc->gadcon->zone->container->win, &gcc->dx, &gcc->dy);
2072 e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &gcx, &gcy, NULL, NULL);
2073 evas_object_geometry_get(gcc->gadcon->o_container, &gx, &gy, NULL, NULL);
2074 gcc->dx -= (gcx + gx);
2075 gcc->dy -= (gcy + gy);
2079 evas_object_geometry_get(gcc->o_frame, &x, &y, NULL, NULL);
2080 else if (gcc->o_base)
2081 evas_object_geometry_get(gcc->o_base, &x, &y, NULL, NULL);
2085 /* using drag pos to calc offset between pointer and gcc pos */
2086 gcc->drag.x = (x - gcc->dx);
2087 gcc->drag.y = (y - gcc->dy);
2089 gcc->state_info.resist = 0;
2093 _e_gadcon_client_move_stop(E_Gadcon_Client *gcc)
2096 gcc->state_info.state = E_LAYOUT_ITEM_STATE_NONE;
2097 gcc->state_info.resist = 0;
2098 _e_gadcon_layout_smart_sync_clients(gcc->gadcon);
2102 _e_gadcon_client_move_go(E_Gadcon_Client *gcc)
2104 Evas_Coord x, y, w, h;
2107 int gcx = 0, gcy = 0;
2110 if (!gcc->moving) return;
2111 /* we need to get output not canvas because things like systray
2112 can reparent another window so we get no position here */
2113 /* maybe we should better grab mouse while move resize is active...*/
2114 //evas_pointer_canvas_xy_get(gcc->gadcon->evas, &cx, &cy);
2115 if (gcc->gadcon->toolbar)
2116 evas_pointer_canvas_xy_get(gcc->gadcon->evas, &cx, &cy);
2119 ecore_x_pointer_xy_get(gcc->gadcon->zone->container->win, &cx, &cy);
2120 e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &gcx, &gcy, NULL, NULL);
2123 evas_object_geometry_get(gcc->gadcon->o_container, &gx, &gy, &gw, &gh);
2131 gcc->state_info.flags = E_GADCON_LAYOUT_ITEM_LOCK_POSITION | E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
2132 _e_gadcon_client_current_position_sync(gcc);
2135 evas_object_geometry_get(gcc->o_frame, NULL, NULL, &w, &h);
2136 else if (gcc->o_base)
2137 evas_object_geometry_get(gcc->o_base, NULL, NULL, &w, &h);
2139 return; /* make clang happy */
2141 if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
2143 if (cy + e_config->drag_resist < 0 || cy - e_config->drag_resist > gh)
2145 _e_gadcon_client_drag_begin(gcc, cx, cy);
2149 if (x > 0 && (cx + gcc->drag.x > gcc->config.pos))
2151 if (gcc->state_info.state != E_LAYOUT_ITEM_STATE_POS_INC)
2152 gcc->state_info.resist = 0;
2153 gcc->state_info.state = E_LAYOUT_ITEM_STATE_POS_INC;
2156 else if (x < 0 && (cx + gcc->drag.x < gcc->config.pos))
2158 if (gcc->state_info.state != E_LAYOUT_ITEM_STATE_POS_DEC)
2159 gcc->state_info.resist = 0;
2160 gcc->state_info.state = E_LAYOUT_ITEM_STATE_POS_DEC;
2167 e_gadcon_layout_pack_request_set(gcc->o_frame, cx + gcc->drag.x, w);
2168 else if (gcc->o_base)
2169 e_gadcon_layout_pack_request_set(gcc->o_base, cx + gcc->drag.x, w);
2171 gcc->config.size = w;
2172 evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
2173 gcc->config.res = w;
2178 if (cx + e_config->drag_resist < 0 || cx - e_config->drag_resist > gw)
2180 _e_gadcon_client_drag_begin(gcc, cx, cy);
2184 if (y > 0 && (cy + gcc->drag.y > gcc->config.pos))
2186 if (gcc->state_info.state != E_LAYOUT_ITEM_STATE_POS_INC)
2187 gcc->state_info.resist = 0;
2188 gcc->state_info.state = E_LAYOUT_ITEM_STATE_POS_INC;
2191 else if (y < 0 && (cy + gcc->drag.y < gcc->config.pos))
2193 if (gcc->state_info.state != E_LAYOUT_ITEM_STATE_POS_DEC)
2194 gcc->state_info.resist = 0;
2195 gcc->state_info.state = E_LAYOUT_ITEM_STATE_POS_DEC;
2202 e_gadcon_layout_pack_request_set(gcc->o_frame, cy + gcc->drag.y, h);
2203 else if (gcc->o_base)
2204 e_gadcon_layout_pack_request_set(gcc->o_base, cy + gcc->drag.y, h);
2206 gcc->config.size = h;
2207 evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
2208 gcc->config.res = h;
2218 _e_gadcon_cb_signal_move_start(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2220 _e_gadcon_client_move_start(data);
2224 _e_gadcon_cb_signal_move_stop(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2226 _e_gadcon_client_move_stop(data);
2230 _e_gadcon_cb_signal_move_go(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2232 _e_gadcon_client_move_go(data);
2236 _e_gadcon_client_resize_start(E_Gadcon_Client *gcc)
2238 evas_object_raise(gcc->o_event);
2239 evas_object_stack_below(gcc->o_control, gcc->o_event);
2241 evas_pointer_canvas_xy_get(gcc->gadcon->evas, &gcc->dx, &gcc->dy);
2245 _e_gadconclient_resize_stop(E_Gadcon_Client *gcc)
2248 gcc->state_info.state = E_LAYOUT_ITEM_STATE_NONE;
2249 _e_gadcon_layout_smart_sync_clients(gcc->gadcon);
2250 _e_gadcon_client_save(gcc);
2254 _e_gadcon_cb_signal_resize_left_start(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2256 _e_gadcon_client_resize_start(data);
2260 _e_gadcon_cb_signal_resize_left_stop(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2262 _e_gadconclient_resize_stop(data);
2266 _e_gadcon_cb_signal_resize_left_go(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2268 E_Gadcon_Client *gcc;
2269 Evas_Coord x, y, w, h;
2272 if (!gcc->resizing) return;
2273 evas_pointer_canvas_xy_get(gcc->gadcon->evas, &x, &y);
2277 gcc->state_info.flags = E_GADCON_LAYOUT_ITEM_LOCK_POSITION |
2278 E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
2281 evas_object_geometry_get(gcc->o_frame, NULL, NULL, &w, &h);
2282 else if (gcc->o_base)
2283 evas_object_geometry_get(gcc->o_base, NULL, NULL, &w, &h);
2284 else return; /* make clang happy */
2286 _e_gadcon_client_current_position_sync(gcc);
2288 if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
2291 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MIN_END_INC;
2293 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MIN_END_DEC;
2298 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MIN_END_INC;
2300 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MIN_END_DEC;
2303 if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
2306 e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->config.pos + x, w - x);
2307 else if (gcc->o_base)
2308 e_gadcon_layout_pack_request_set(gcc->o_base, gcc->config.pos + x, w - x);
2309 evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
2310 gcc->config.res = w;
2315 e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->config.pos + y, h - y);
2316 else if (gcc->o_base)
2317 e_gadcon_layout_pack_request_set(gcc->o_base, gcc->config.pos + y, h - y);
2318 evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
2319 gcc->config.res = h;
2326 _e_gadcon_cb_signal_resize_right_start(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2328 _e_gadcon_client_resize_start(data);
2332 _e_gadcon_cb_signal_resize_right_stop(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2334 _e_gadconclient_resize_stop(data);
2338 _e_gadcon_cb_signal_resize_right_go(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
2340 E_Gadcon_Client *gcc;
2341 Evas_Coord x, y, w, h;
2344 if (!gcc->resizing) return;
2345 evas_pointer_canvas_xy_get(gcc->gadcon->evas, &x, &y);
2349 gcc->state_info.flags = E_GADCON_LAYOUT_ITEM_LOCK_POSITION |
2350 E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
2353 evas_object_geometry_get(gcc->o_frame, NULL, NULL, &w, &h);
2354 else if (gcc->o_base)
2355 evas_object_geometry_get(gcc->o_base, NULL, NULL, &w, &h);
2356 else return; /* make clang happy */
2358 _e_gadcon_client_current_position_sync(gcc);
2360 if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
2363 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MAX_END_INC;
2365 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MAX_END_DEC;
2370 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MAX_END_INC;
2372 gcc->state_info.state = E_LAYOUT_ITEM_STATE_SIZE_MAX_END_INC;
2375 if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
2378 e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->config.pos, w + x);
2379 else if (gcc->o_base)
2380 e_gadcon_layout_pack_request_set(gcc->o_base, gcc->config.pos, w + x);
2381 evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
2382 gcc->config.res = w;
2387 e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->config.pos, h + y);
2388 else if (gcc->o_base)
2389 e_gadcon_layout_pack_request_set(gcc->o_base, gcc->config.pos, h + y);
2390 evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
2391 gcc->config.res = h;
2398 _e_gadcon_cb_drag_finished(E_Drag *drag, int dropped)
2400 E_Gadcon_Client *gcc;
2405 /* free client config */
2406 e_gadcon_client_config_del(NULL, gcc->cf);
2407 /* delete the gadcon client */
2408 /* TODO: Clean up module config too? */
2409 e_object_del(E_OBJECT(gcc));
2413 /* dropped on new gadcon, delete this one as it is no longer in use */
2414 e_object_del(E_OBJECT(gcc));
2416 e_object_unref(E_OBJECT(gcc));
2422 _e_gadcon_cb_dnd_enter(void *data, const char *type __UNUSED__, void *event)
2424 E_Event_Dnd_Enter *ev;
2426 E_Gadcon_Client *gcc;
2430 e_gadcon_layout_freeze(gc->o_container);
2433 if (gcc->gadcon == gc)
2435 /* We have re-entered the gadcon we left, revive gadcon client */
2439 if (e_gadcon_layout_orientation_get(gc->o_container))
2440 gcc->config.pos = ev->x - gcc->config.size / 2;
2442 gcc->config.pos = ev->y - gcc->config.size / 2;
2443 gcc->state_info.prev_pos = gcc->config.pos;
2445 evas_object_geometry_get(gc->o_container, &dx, &dy, NULL, NULL);
2446 _e_gadcon_client_inject(gc, gcc, ev->x + dx, ev->y + dy);
2447 e_gadcon_client_show(gcc);
2449 o = gcc->o_frame ? gcc->o_frame : gcc->o_base;
2452 if (e_gadcon_layout_orientation_get(gc->o_container))
2453 e_gadcon_layout_pack_request_set(o, gcc->config.pos, gcc->config.size);
2455 e_gadcon_layout_pack_request_set(o, gcc->config.pos, gcc->config.size);
2457 gcc->state_info.resist = 1;
2461 /* Create a new gadcon to show where the gadcon will end up */
2462 E_Gadcon_Client_Class *cc;
2465 cc = eina_hash_find(providers, gcc->name);
2470 new_gcc = cc->func.init(gc, gcc->name, gcc->cf->id,
2474 new_gcc = cc->func.init(gc, gcc->name, gcc->cf->id,
2479 new_gcc->cf = gcc->cf;
2480 new_gcc->client_class = cc;
2481 new_gcc->config.pos = gcc->config.pos;
2482 new_gcc->config.size = gcc->config.size;
2483 new_gcc->config.res = gcc->config.res;
2484 new_gcc->state_info.seq = gcc->state_info.seq;
2485 new_gcc->state_info.flags = gcc->state_info.flags;
2486 if (new_gcc->o_frame)
2487 e_gadcon_layout_pack_options_set(new_gcc->o_frame, new_gcc);
2488 else if (new_gcc->o_base)
2489 e_gadcon_layout_pack_options_set(new_gcc->o_base, new_gcc);
2491 e_gadcon_client_autoscroll_set(new_gcc, gcc->autoscroll);
2492 /* e_gadcon_client_resizable_set(new_gcc, gcc->resizable);*/
2493 if (new_gcc->client_class->func.orient)
2494 new_gcc->client_class->func.orient(new_gcc, gc->orient);
2495 new_gcc->state_info.resist = 1;
2496 if (gc->instant_edit)
2497 e_gadcon_client_util_menu_attach(new_gcc);
2503 /* TODO: Create a placeholder to show where the gadcon will end up */
2505 e_gadcon_layout_thaw(gc->o_container);
2509 _e_gadcon_cb_dnd_move(void *data, const char *type __UNUSED__, void *event)
2511 E_Event_Dnd_Move *ev;
2513 E_Gadcon_Client *gcc = NULL;
2518 /* If we move in the same gadcon as the client originates */
2519 if (drag_gcc->gadcon == gc) gcc = drag_gcc;
2520 /* If we move in the newly entered gadcon */
2521 else if (new_gcc->gadcon == gc) gcc = new_gcc;
2527 if (gcc->state_info.resist > 0)
2529 gcc->state_info.resist--;
2532 e_gadcon_layout_freeze(gc->o_container);
2534 if (e_gadcon_layout_orientation_get(gc->o_container))
2535 gcc->config.pos = ev->x - gcc->config.size / 2;
2537 gcc->config.pos = ev->y - gcc->config.size / 2;
2538 gcc->state_info.prev_pos = gcc->config.pos;
2540 evas_object_geometry_get(gc->o_container, &dx, &dy, NULL, NULL);
2541 _e_gadcon_client_inject(gc, gcc, ev->x + dx, ev->y + dy);
2543 o = gcc->o_frame ? gcc->o_frame : gcc->o_base;
2546 if (e_gadcon_layout_orientation_get(gc->o_container))
2547 e_gadcon_layout_pack_request_set(o, gcc->config.pos,
2550 e_gadcon_layout_pack_request_set(o, gcc->config.pos,
2553 e_gadcon_layout_thaw(gc->o_container);
2558 _e_gadcon_cb_dnd_leave(void *data, const char *type __UNUSED__, void *event __UNUSED__)
2563 /* If we exit the starting container hide the gadcon visual */
2564 if (drag_gcc->gadcon == gc) e_gadcon_client_hide(drag_gcc);
2566 /* Delete temporary object */
2569 e_object_del(E_OBJECT(new_gcc));
2575 _e_gadcon_cb_drop(void *data, const char *type __UNUSED__, void *event __UNUSED__)
2578 E_Gadcon_Client *gcc = NULL;
2581 if (drag_gcc->gadcon == gc) gcc = drag_gcc;
2582 else if ((new_gcc) && (new_gcc->gadcon == gc)) gcc = new_gcc;
2583 else return; /* make clang happy */
2585 gc->cf->clients = eina_list_append(gc->cf->clients, gcc->cf);
2587 if (gc->editing) e_gadcon_client_edit_begin(gcc);
2588 e_config_save_queue();
2592 _e_gadcon_client_class_feature_check(const E_Gadcon_Client_Class *cc, const char *name, void *feature)
2596 e_util_dialog_show("Insufficent gadcon support",
2597 "Module %s needs to support %s",
2605 _e_gadcon_client_cb_menu_post(void *data, E_Menu *m __UNUSED__)
2607 E_Gadcon_Client *gcc;
2609 if (!(gcc = data)) return;
2610 if (gcc->gadcon) e_gadcon_locked_set(gcc->gadcon, 0);
2611 if (!gcc->menu) return;
2612 e_object_del(E_OBJECT(gcc->menu));
2617 _e_gadcon_client_cb_instant_edit_timer(void *data)
2619 E_Gadcon_Client *gcc;
2622 e_gadcon_client_edit_begin(gcc);
2623 _e_gadcon_client_move_start(gcc);
2624 gcc->instant_edit_timer = NULL;
2625 return ECORE_CALLBACK_CANCEL;
2629 _e_gadcon_client_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
2631 Evas_Event_Mouse_Down *ev;
2632 E_Gadcon_Client *gcc;
2636 if (gcc->menu) return;
2637 if (ev->button == 3)
2643 e_gadcon_locked_set(gcc->gadcon, 1);
2646 m = e_gadcon_client_util_menu_items_append(gcc, m, 0);
2647 e_menu_post_deactivate_callback_set(m, _e_gadcon_client_cb_menu_post,
2651 e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &cx, &cy, &cw, &ch);
2652 zone = gcc->gadcon->zone;
2653 if (!zone) zone = e_util_zone_current_get(e_manager_current_get());
2654 e_menu_activate_mouse(m, zone,
2656 cy + ev->output.y, 1, 1,
2657 E_MENU_POP_DIRECTION_AUTO, ev->timestamp);
2659 else if (ev->button == 1)
2661 if ((!gcc->o_control) && (gcc->gadcon->instant_edit))
2663 if (gcc->instant_edit_timer)
2664 ecore_timer_del(gcc->instant_edit_timer);
2665 gcc->instant_edit_timer =
2666 ecore_timer_add(1.0, _e_gadcon_client_cb_instant_edit_timer,
2673 _e_gadcon_client_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
2675 Evas_Event_Mouse_Up *ev;
2676 E_Gadcon_Client *gcc;
2680 if ((ev->button == 1) && (gcc->gadcon->instant_edit))
2682 if (gcc->instant_edit_timer)
2684 ecore_timer_del(gcc->instant_edit_timer);
2685 gcc->instant_edit_timer = NULL;
2689 _e_gadcon_client_move_stop(gcc);
2690 e_gadcon_client_edit_end(gcc);
2696 _e_gadcon_client_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2698 E_Gadcon_Client *gcc;
2701 if ((gcc->gadcon->instant_edit))
2703 if (gcc->o_control) _e_gadcon_client_move_go(gcc);
2708 _e_gadcon_client_cb_menu_style_plain(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
2710 E_Gadcon_Client *gcc;
2715 if (gcc->style) eina_stringshare_del(gcc->style);
2716 gcc->style = eina_stringshare_add(E_GADCON_CLIENT_STYLE_PLAIN);
2717 _e_gadcon_client_save(gcc);
2718 e_gadcon_unpopulate(gc);
2719 e_gadcon_populate(gc);
2723 _e_gadcon_client_cb_menu_style_inset(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
2725 E_Gadcon_Client *gcc;
2730 if (gcc->style) eina_stringshare_del(gcc->style);
2731 gcc->style = eina_stringshare_add(E_GADCON_CLIENT_STYLE_INSET);
2732 _e_gadcon_client_save(gcc);
2733 e_gadcon_unpopulate(gc);
2734 e_gadcon_populate(gc);
2738 _e_gadcon_client_cb_menu_autoscroll(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
2740 E_Gadcon_Client *gcc;
2743 e_gadcon_layout_freeze(gcc->gadcon->o_container);
2744 if (gcc->autoscroll) gcc->autoscroll = 0;
2745 else gcc->autoscroll = 1;
2746 e_gadcon_client_autoscroll_set(gcc, gcc->autoscroll);
2747 _e_gadcon_client_save(gcc);
2748 e_gadcon_layout_thaw(gcc->gadcon->o_container);
2752 _e_gadcon_client_cb_menu_resizable(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
2754 E_Gadcon_Client *gcc;
2757 e_gadcon_layout_freeze(gcc->gadcon->o_container);
2758 if (gcc->resizable) gcc->resizable = 0;
2759 else gcc->resizable = 1;
2760 e_gadcon_client_resizable_set(gcc, gcc->resizable);
2761 _e_gadcon_client_save(gcc);
2762 e_gadcon_layout_thaw(gcc->gadcon->o_container);
2766 _e_gadcon_client_cb_menu_edit(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
2768 E_Gadcon_Client *gcc;
2772 e_gadcon_client_edit_end(gcc);
2774 e_gadcon_client_edit_begin(gcc);
2778 _e_gadcon_client_cb_menu_remove(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
2781 E_Gadcon_Client *gcc;
2786 e_gadcon_client_config_del(gc->cf, gcc->cf);
2787 e_gadcon_unpopulate(gc);
2788 e_gadcon_populate(gc);
2789 e_config_save_queue();
2793 _e_gadcon_client_cb_menu_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
2795 E_Gadcon_Client *gcc;
2797 if (!(gcc = data)) return;
2798 if (gcc->client_class->func.icon)
2802 // e menu ASSUMES... EXPECTS the icon to be an.... e_icon! make it so.
2803 ic = gcc->client_class->func.icon
2804 ((E_Gadcon_Client_Class *)gcc->client_class,
2806 mi->icon_object = e_icon_add(mi->menu->evas);
2807 e_icon_object_set(mi->icon_object, ic);
2810 e_util_menu_item_theme_icon_set(mi, "preferences-gadget"); // FIXME: Needs icon in theme
2814 _e_gadcon_client_del_hook(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2816 E_Gadcon_Client *gcc;
2822 evas_object_del(gcc->o_frame);
2823 gcc->o_frame = NULL;
2825 e_object_del(E_OBJECT(gcc));
2828 /* a smart object JUST for gadcon */
2830 typedef struct _E_Gadcon_Layout_Item E_Gadcon_Layout_Item;
2832 struct _E_Smart_Data
2834 Evas_Coord x, y, w, h;
2835 Evas_Object *obj, *clip;
2836 unsigned char horizontal : 1;
2837 unsigned char doing_config : 1;
2838 unsigned char redo_config : 1;
2841 Evas_Coord minw, minh, req;
2844 struct _E_Gadcon_Layout_Item
2849 int pos, size, size2, res, prev_pos, prev_size;
2855 } min, aspect, aspect_pad;
2857 E_Gadcon_Client *gcc;
2859 Evas_Coord x, y, w, h;
2861 unsigned char can_move : 1;
2864 /* local subsystem functions */
2865 static E_Gadcon_Layout_Item *_e_gadcon_layout_smart_adopt(E_Smart_Data *sd, Evas_Object *obj);
2866 static void _e_gadcon_layout_smart_disown(Evas_Object *obj);
2867 static void _e_gadcon_layout_smart_item_del_hook(void *data, Evas *e, Evas_Object *obj, void *event_info);
2868 static void _e_gadcon_layout_smart_reconfigure(E_Smart_Data *sd);
2869 static void _e_gadcon_layout_smart_init(void);
2870 static void _e_gadcon_layout_smart_add(Evas_Object *obj);
2871 static void _e_gadcon_layout_smart_del(Evas_Object *obj);
2872 static void _e_gadcon_layout_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
2873 static void _e_gadcon_layout_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
2874 static void _e_gadcon_layout_smart_show(Evas_Object *obj);
2875 static void _e_gadcon_layout_smart_hide(Evas_Object *obj);
2876 static void _e_gadcon_layout_smart_color_set(Evas_Object *obj, int r, int g, int b, int a);
2877 static void _e_gadcon_layout_smart_clip_set(Evas_Object *obj, Evas_Object *clip);
2878 static void _e_gadcon_layout_smart_clip_unset(Evas_Object *obj);
2879 static void _e_gadcon_layout_smart_min_cur_size_calc(E_Smart_Data *sd, int *min, int *mino, int *cur);
2880 static void _e_gadcon_layout_smart_gadcons_width_adjust(E_Smart_Data *sd, int min, int cur);
2881 static int _e_gadcon_layout_smart_sort_by_sequence_number_cb(const void *d1, const void *d2);
2882 static int _e_gadcon_layout_smart_sort_by_position_cb(const void *d1, const void *d2);
2884 /* local subsystem globals */
2885 static Evas_Smart *_e_smart = NULL;
2887 /* externally accessible functions */
2888 static Evas_Object *
2889 e_gadcon_layout_add(Evas *evas)
2891 _e_gadcon_layout_smart_init();
2892 return evas_object_smart_add(evas, _e_smart);
2896 e_gadcon_layout_orientation_set(Evas_Object *obj, int horizontal)
2901 sd = evas_object_smart_data_get(obj);
2903 if (((sd->horizontal) && (horizontal)) ||
2904 ((!sd->horizontal) && (!horizontal))) return;
2905 sd->horizontal = horizontal;
2906 _e_gadcon_layout_smart_reconfigure(sd);
2910 e_gadcon_layout_orientation_get(Evas_Object *obj)
2915 sd = evas_object_smart_data_get(obj);
2917 return sd->horizontal;
2921 e_gadcon_layout_freeze(Evas_Object *obj)
2926 sd = evas_object_smart_data_get(obj);
2932 e_gadcon_layout_thaw(Evas_Object *obj)
2937 sd = evas_object_smart_data_get(obj);
2940 _e_gadcon_layout_smart_reconfigure(sd);
2944 e_gadcon_layout_min_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
2950 Evas_Coord tw = 0, th = 0;
2953 sd = evas_object_smart_data_get(obj);
2957 if (w) *w = sd->minw;
2958 if (h) *h = sd->minh;
2962 if (w) *w = sd->minh;
2963 if (h) *h = sd->minw;
2967 EINA_LIST_FOREACH(sd->items, l, obj)
2969 E_Gadcon_Layout_Item *bi;
2971 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
2975 if (bi->min.h > th) th = bi->min.h;
2980 if (bi->min.w > tw) tw = bi->min.w;
2989 e_gadcon_layout_asked_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
2992 Evas_Coord tw = 0, th = 0;
2995 sd = evas_object_smart_data_get(obj);
3003 EINA_LIST_FOREACH(sd->items, l, obj)
3005 E_Gadcon_Layout_Item *bi;
3007 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3023 e_gadcon_layout_pack(Evas_Object *obj, Evas_Object *child)
3028 sd = evas_object_smart_data_get(obj);
3030 _e_gadcon_layout_smart_adopt(sd, child);
3031 sd->items = eina_list_prepend(sd->items, child);
3032 _e_gadcon_layout_smart_reconfigure(sd);
3037 e_gadcon_layout_pack_size_set(Evas_Object *obj, int size)
3041 * simplify this function until the is redone
3042 * _e_gadcon_layout_smart_gadcons_asked_position_set(E_Smart_Data *sd)
3044 E_Gadcon_Layout_Item *bi;
3048 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3050 pos = bi->ask.pos + (bi->ask.size / 2);
3051 if (pos < (bi->ask.res / 3))
3053 /* hooked to start */
3054 bi->ask.size = size;
3056 else if (pos > ((2 * bi->ask.res) / 3))
3059 bi->ask.pos = (bi->ask.pos + bi->ask.size) - size;
3060 bi->ask.size = size;
3064 /* hooked to middle */
3065 if ((bi->ask.pos <= (bi->ask.res / 2)) &&
3066 ((bi->ask.pos + bi->ask.size) > (bi->ask.res / 2)))
3068 /* straddles middle */
3069 if (bi->ask.res > 2)
3070 bi->ask.pos = (bi->ask.res / 2) +
3071 (((bi->ask.pos + (bi->ask.size / 2) -
3072 (bi->ask.res / 2)) *
3073 (bi->ask.res / 2)) /
3074 (bi->ask.res / 2)) - (bi->ask.size / 2);
3076 bi->x = bi->ask.res / 2;
3077 bi->ask.size = size;
3081 if (pos < (bi->ask.res / 2))
3083 bi->ask.pos = (bi->ask.pos + bi->ask.size) - size;
3084 bi->ask.size = size;
3087 bi->ask.size = size;
3089 bi->ask.size = size;
3091 _e_gadcon_layout_smart_reconfigure(bi->sd);
3094 /* called when a users moves/resizes the gadcon client explicitly */
3096 e_gadcon_layout_pack_request_set(Evas_Object *obj, int pos, int size)
3098 E_Gadcon_Layout_Item *bi;
3101 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3104 bi->ask.res = bi->sd->w;
3105 if (pos < 0) pos = 0;
3106 if ((bi->ask.res - pos) < size) pos = bi->ask.res - size;
3107 bi->ask.size = size;
3109 _e_gadcon_layout_smart_reconfigure(bi->sd);
3112 /* called when restoring config from saved config */
3114 e_gadcon_layout_pack_options_set(Evas_Object *obj, E_Gadcon_Client *gcc)
3119 E_Gadcon_Layout_Item *bi, *bi2;
3122 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3124 bi->ask.res = gcc->config.res;
3125 bi->ask.size = gcc->config.size;
3126 bi->ask.pos = gcc->config.pos;
3130 if (!gcc->state_info.seq) ok = 1;
3133 EINA_LIST_FOREACH(bi->sd->items, l, item)
3135 bi2 = evas_object_data_get(item, "e_gadcon_layout_data");
3136 if (bi == bi2) continue;
3137 if (bi->gcc->state_info.seq == bi2->gcc->state_info.seq)
3140 if (bi2->gcc->state_info.seq > seq)
3141 seq = bi2->gcc->state_info.seq;
3146 gcc->state_info.seq = seq + 1;
3147 gcc->state_info.want_save = 1;
3148 gcc->state_info.flags = E_GADCON_LAYOUT_ITEM_LOCK_NONE;
3150 _e_gadcon_layout_smart_reconfigure(bi->sd);
3154 e_gadcon_layout_pack_min_size_set(Evas_Object *obj, int w, int h)
3156 E_Gadcon_Layout_Item *bi;
3159 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3161 if (bi->sd->horizontal)
3172 _e_gadcon_layout_smart_reconfigure(bi->sd);
3176 e_gadcon_layout_pack_aspect_set(Evas_Object *obj, int w, int h)
3178 E_Gadcon_Layout_Item *bi;
3181 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3183 if (bi->sd->horizontal)
3194 _e_gadcon_layout_smart_reconfigure(bi->sd);
3198 e_gadcon_layout_pack_aspect_pad_set(Evas_Object *obj, int w, int h)
3200 E_Gadcon_Layout_Item *bi;
3203 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3205 if (bi->sd->horizontal)
3207 bi->aspect_pad.w = w;
3208 bi->aspect_pad.h = h;
3212 bi->aspect_pad.w = h;
3213 bi->aspect_pad.h = w;
3218 e_gadcon_layout_unpack(Evas_Object *obj)
3220 E_Gadcon_Layout_Item *bi;
3224 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3228 sd->items = eina_list_remove(sd->items, obj);
3229 _e_gadcon_layout_smart_disown(obj);
3230 _e_gadcon_layout_smart_reconfigure(sd);
3233 /* local subsystem functions */
3234 static E_Gadcon_Layout_Item *
3235 _e_gadcon_layout_smart_adopt(E_Smart_Data *sd, Evas_Object *obj)
3237 E_Gadcon_Layout_Item *bi;
3239 if (!obj) return NULL;
3240 bi = E_NEW(E_Gadcon_Layout_Item, 1);
3241 if (!bi) return NULL;
3245 evas_object_clip_set(obj, sd->clip);
3246 evas_object_smart_member_add(obj, bi->sd->obj);
3247 evas_object_data_set(obj, "e_gadcon_layout_data", bi);
3248 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
3249 _e_gadcon_layout_smart_item_del_hook, NULL);
3250 if ((!evas_object_visible_get(sd->clip)) &&
3251 (evas_object_visible_get(sd->obj)))
3252 evas_object_show(sd->clip);
3257 _e_gadcon_layout_smart_disown(Evas_Object *obj)
3259 E_Gadcon_Layout_Item *bi;
3262 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3266 if (evas_object_visible_get(bi->sd->clip))
3267 evas_object_hide(bi->sd->clip);
3269 evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL,
3270 _e_gadcon_layout_smart_item_del_hook);
3271 evas_object_smart_member_del(obj);
3272 evas_object_clip_unset(obj);
3273 evas_object_data_del(obj, "e_gadcon_layout_data");
3278 _e_gadcon_layout_smart_item_del_hook(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
3281 e_gadcon_layout_unpack(obj);
3285 _e_gadcon_layout_smart_reconfigure(E_Smart_Data *sd)
3291 Eina_List *list = NULL;
3292 E_Gadcon_Layout_Item *bi;
3293 E_Layout_Item_Container *lc;
3294 int i, set_prev_pos = 0;
3295 static int recurse = 0;
3297 if (sd->frozen) return;
3298 if (sd->doing_config)
3300 sd->redo_config = 1;
3305 min = mino = cur = 0;
3307 _e_gadcon_layout_smart_min_cur_size_calc(sd, &min, &mino, &cur);
3309 if ((sd->minw != min) || (sd->minh != mino))
3313 evas_object_smart_callback_call(sd->obj, "min_size_request", NULL);
3318 if (cur >= sd->minw)
3321 evas_object_smart_callback_call(sd->obj, "size_request", NULL);
3328 if (recurse == 1) _e_gadcon_layout_smart_gadcons_width_adjust(sd, min, cur);
3330 if (sd->w <= sd->req)
3332 _e_gadcon_layout_smart_gadcon_position_shrinked_mode(sd);
3337 _e_gadcon_layout_smart_gadcons_asked_position_set(sd);
3339 list = _e_gadcon_layout_smart_gadcons_wrap(sd);
3341 _e_gadcon_layout_smart_gadcons_position(sd, &list);
3343 EINA_LIST_FREE(list, lc)
3349 sd->items = eina_list_sort(sd->items, eina_list_count(sd->items),
3350 _e_gadcon_layout_smart_sort_by_position_cb);
3352 EINA_LIST_FOREACH(sd->items, l, obj)
3354 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3355 if (bi->gcc->gadcon->editing) bi->gcc->state_info.seq = i;
3359 bi->ask.prev_pos = bi->x;
3360 bi->ask.prev_size = bi->w;
3363 if ((bi->x == bi->ask.pos) &&
3364 (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_POSITION))
3365 bi->gcc->state_info.flags |= E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
3367 if ((bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_POSITION) &&
3368 (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE))
3370 if (bi->x != bi->ask.pos)
3371 bi->gcc->state_info.flags &= ~E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
3376 EINA_LIST_FOREACH(sd->items, l, obj)
3378 E_Gadcon_Layout_Item *bi;
3380 bi = evas_object_data_get(obj, "e_gadcon_layout_data");
3385 yy = sd->y; // + ((sd->h - bi->h) / 2);
3389 evas_object_move(obj, xx, yy);
3390 evas_object_resize(obj, bi->w, bi->h);
3394 evas_object_move(obj, yy, xx);
3395 evas_object_resize(obj, bi->h, bi->w);
3398 sd->doing_config = 0;
3399 if (sd->redo_config)
3401 _e_gadcon_layout_smart_reconfigure(sd);
3402 sd->redo_config = 0;
3405 if ((sd->minw != min) || (sd->minh != mino))
3409 evas_object_smart_callback_call(sd->obj, "min_size_request", NULL);
3414 if (cur >= sd->minw)
3417 evas_object_smart_callback_call(sd->obj, "size_request", NULL);
3424 _e_gadcon_layout_smart_init(void)
3426 if (_e_smart) return;
3428 static const Evas_Smart_Class sc =
3431 EVAS_SMART_CLASS_VERSION,
3432 _e_gadcon_layout_smart_add,
3433 _e_gadcon_layout_smart_del,
3434 _e_gadcon_layout_smart_move,
3435 _e_gadcon_layout_smart_resize,
3436 _e_gadcon_layout_smart_show,
3437 _e_gadcon_layout_smart_hide,
3438 _e_gadcon_layout_smart_color_set,
3439 _e_gadcon_layout_smart_clip_set,
3440 _e_gadcon_layout_smart_clip_unset,
3441 NULL, NULL, NULL, NULL, NULL, NULL, NULL
3443 _e_smart = evas_smart_class_new(&sc);
3448 _e_gadcon_layout_smart_add(Evas_Object *obj)
3453 sd = calloc(1, sizeof(E_Smart_Data));
3460 sd->clip = evas_object_rectangle_add(evas_object_evas_get(obj));
3462 evas_object_smart_member_add(sd->clip, obj);
3463 evas_object_move(sd->clip, -100005, -100005);
3464 evas_object_resize(sd->clip, 200010, 200010);
3465 evas_object_color_set(sd->clip, 255, 255, 255, 255);
3466 evas_object_smart_data_set(obj, sd);
3470 _e_gadcon_layout_smart_del(Evas_Object *obj)
3475 sd = evas_object_smart_data_get(obj);
3481 child = eina_list_data_get(sd->items);
3482 e_gadcon_layout_unpack(child);
3484 evas_object_del(sd->clip);
3489 _e_gadcon_layout_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
3494 sd = evas_object_smart_data_get(obj);
3496 if ((x == sd->x) && (y == sd->y)) return;
3513 EINA_LIST_FOREACH(sd->items, l, item)
3517 evas_object_geometry_get(item, &ox, &oy, NULL, NULL);
3518 evas_object_move(item, ox + dx, oy + dy);
3535 _e_gadcon_layout_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
3540 sd = evas_object_smart_data_get(obj);
3542 if ((w == sd->w) && (h == sd->h)) return;
3555 _e_gadcon_layout_smart_reconfigure(sd);
3559 _e_gadcon_layout_smart_show(Evas_Object *obj)
3564 sd = evas_object_smart_data_get(obj);
3566 if (sd->items) evas_object_show(sd->clip);
3570 _e_gadcon_layout_smart_hide(Evas_Object *obj)
3575 sd = evas_object_smart_data_get(obj);
3577 evas_object_hide(sd->clip);
3581 _e_gadcon_layout_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
3586 sd = evas_object_smart_data_get(obj);
3588 evas_object_color_set(sd->clip, r, g, b, a);
3592 _e_gadcon_layout_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
3597 sd = evas_object_smart_data_get(obj);
3599 evas_object_clip_set(sd->clip, clip);
3603 _e_gadcon_layout_smart_clip_unset(Evas_Object *obj)
3608 sd = evas_object_smart_data_get(obj);
3610 evas_object_clip_unset(sd->clip);
3614 * @min - the minimum width required by all the gadcons
3615 * @cur - the current width required by all the gadcons
3616 * @mino - the smalest width/height among all the objects
3619 _e_gadcon_layout_smart_min_cur_size_calc(E_Smart_Data *sd, int *min, int *mino, int *cur)
3621 E_Gadcon_Layout_Item *bi;
3625 EINA_LIST_FOREACH(sd->items, l, item)
3627 bi = evas_object_data_get(item, "e_gadcon_layout_data");
3628 bi->ask.size2 = bi->ask.size;
3630 if ((bi->aspect.w > 0) && (bi->aspect.h > 0))
3633 (((sd->h - bi->aspect_pad.h) * bi->aspect.w) / bi->aspect.h) + bi->aspect_pad.w;
3635 if (bi->ask.size2 > bi->min.w)
3637 *min += bi->ask.size2;
3638 *cur += bi->ask.size2;
3648 bi->ask.size2 = bi->ask.size = bi->min.w;
3650 if (bi->min.h > *mino) *mino = bi->min.h;
3651 if (bi->ask.size < bi->min.w)
3654 *cur += bi->ask.size;
3660 _e_gadcon_layout_smart_width_smart_sort_reverse_cb(const void *d1, const void *d2)
3662 const E_Gadcon_Layout_Item *bi, *bi2;
3664 bi = evas_object_data_get(d1, "e_gadcon_layout_data");
3665 bi2 = evas_object_data_get(d2, "e_gadcon_layout_data");
3667 if (bi->ask.size2 > bi->min.w)
3669 if (bi2->ask.size2 > bi2->min.w)
3671 if (bi->ask.size2 < bi2->ask.size2)
3678 if (bi->ask.size2 == bi2->ask.size2)
3682 if (bi->ask.size2 < bi2->ask.size2)
3691 if (bi2->ask.size2 > bi2->min.w)
3693 if (bi->ask.size2 == bi2->ask.size2)
3697 if (bi->ask.size2 < bi2->ask.size2)
3705 if (bi->ask.size2 < bi2->ask.size2)
3707 else if (bi->ask.size2 > bi2->ask.size2)
3716 _e_gadcon_layout_smart_gadcons_width_adjust(E_Smart_Data *sd, int min, int cur)
3718 E_Gadcon_Layout_Item *bi = NULL;
3723 int max_size, autosize = 0;
3727 if (sd->w < min) max_size = min;
3728 else max_size = cur;
3729 need = max_size - sd->w;
3734 sd->items = eina_list_sort(sd->items, eina_list_count(sd->items),
3735 _e_gadcon_layout_smart_width_smart_sort_reverse_cb);
3736 EINA_LIST_FOREACH(sd->items, l, item)
3738 bi = evas_object_data_get(item, "e_gadcon_layout_data");
3739 if (bi->gcc->autoscroll) autosize += bi->ask.size2;
3742 if (autosize < 1) autosize = 1;
3746 EINA_LIST_REVERSE_FOREACH(sd->items, l2, item)
3748 if (need <= 0) break;
3749 bi = evas_object_data_get(item, "e_gadcon_layout_data");
3750 if (bi->gcc->autoscroll)
3754 reduce_by = (need * bi->ask.size2) / autosize;
3755 if (reduce_by < 1) reduce_by = 1;
3756 if (bi->ask.size2 - reduce_by > 8)
3758 bi->ask.size2 -= reduce_by;
3763 need -= bi->ask.size2 - 8;
3768 /* If the 'needed' size change didn't get modified (no gadget has autoscroll)
3769 then we must break or we end up in an infinite loop */
3770 if (need == needed) break;
3775 _e_gadcon_layout_smart_sort_by_sequence_number_cb(const void *d1, const void *d2)
3777 const E_Gadcon_Layout_Item *bi, *bi2;
3779 bi = evas_object_data_get(d1, "e_gadcon_layout_data");
3780 bi2 = evas_object_data_get(d2, "e_gadcon_layout_data");
3782 if ((!bi->gcc->state_info.seq) && (!bi2->gcc->state_info.seq)) return 0;
3783 else if (!bi->gcc->state_info.seq) return 1;
3784 else if (!bi2->gcc->state_info.seq) return -1;
3785 return bi->gcc->state_info.seq - bi2->gcc->state_info.seq;
3789 _e_gadcon_layout_smart_sort_by_position_cb(const void *d1, const void *d2)
3791 const E_Gadcon_Layout_Item *bi, *bi2;
3793 bi = evas_object_data_get(d1, "e_gadcon_layout_data");
3794 bi2 = evas_object_data_get(d2, "e_gadcon_layout_data");
3796 return (bi->x - bi2->x);
3800 _e_gadcon_layout_smart_containers_sort_cb(const void *d1, const void *d2)
3802 const E_Layout_Item_Container *lc, *lc2;
3806 if (lc->pos < lc2->pos) return -1;
3807 else if (lc->pos > lc2->pos) return 1;
3812 _e_gadcon_layout_smart_seq_sort_cb(const void *d1, const void *d2)
3814 const E_Gadcon_Layout_Item *bi, *bi2;
3818 return (bi->gcc->state_info.seq - bi2->gcc->state_info.seq);
3822 _e_gadcon_layout_smart_sync_clients(E_Gadcon *gc)
3824 E_Gadcon_Client *gcc;
3827 EINA_LIST_FOREACH(gc->clients, l, gcc)
3829 _e_gadcon_client_save(gcc);
3834 _e_gadcon_client_current_position_sync(E_Gadcon_Client *gcc)
3836 E_Gadcon_Layout_Item *bi;
3839 o = gcc->o_frame ? gcc->o_frame : gcc->o_base;
3842 bi = evas_object_data_get(o, "e_gadcon_layout_data");
3845 else return; /* make clang happy */
3847 gcc->state_info.prev_pos = gcc->config.pos;
3848 gcc->state_info.prev_size = gcc->config.size;
3849 gcc->config.pos = bi->x;
3853 _e_gadcon_layout_smart_gadcon_position_shrinked_mode(E_Smart_Data *sd)
3857 E_Gadcon_Layout_Item *bi, *bi2;
3861 sd->items = eina_list_sort(sd->items, eina_list_count(sd->items),
3862 _e_gadcon_layout_smart_sort_by_sequence_number_cb);
3863 EINA_LIST_FOREACH(sd->items, l, item)
3865 bi = evas_object_data_get(item, "e_gadcon_layout_data");
3866 if (bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_POS_INC)
3868 if (bi->gcc->state_info.resist <= E_LAYOUT_ITEM_DRAG_RESIST_LEVEL)
3870 bi->gcc->state_info.resist++;
3871 bi->gcc->config.pos = bi->ask.pos = bi->gcc->state_info.prev_pos;
3875 bi->gcc->state_info.resist = 0;
3876 if (eina_list_next(l))
3878 tp = eina_list_data_get(eina_list_next(l));
3879 l->next->data = eina_list_data_get(l);
3882 bi2 = evas_object_data_get(tp, "e_gadcon_layout_data");
3884 if (bi2->x + bi2->w/2 > bi->ask.pos + bi->w)
3886 bi->gcc->config.pos = bi->ask.pos = bi->gcc->state_info.prev_pos;
3890 bi->gcc->config.pos = bi->ask.pos = bi2->ask.pos;
3891 bi->gcc->state_info.flags &= ~E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
3892 bi->gcc->state_info.want_save = 1;
3893 bi2->gcc->state_info.want_save = 1;
3897 bi->gcc->config.pos = bi->ask.pos = bi->gcc->state_info.prev_pos;
3900 else if (bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_POS_DEC)
3902 if (bi->gcc->state_info.resist <= E_LAYOUT_ITEM_DRAG_RESIST_LEVEL)
3904 bi->gcc->state_info.resist++;
3905 bi->gcc->config.pos = bi->ask.pos = bi->gcc->state_info.prev_pos;
3909 bi->gcc->state_info.resist = 0;
3910 if (eina_list_prev(l))
3912 E_Gadcon_Layout_Item *bi2;
3915 tp = eina_list_data_get(eina_list_prev(l));
3916 l->prev->data = eina_list_data_get(l);
3919 bi2 = evas_object_data_get(tp, "e_gadcon_layout_data");
3921 if (bi->ask.pos > bi2->x + bi2->w/2)
3923 bi->gcc->config.pos = bi->ask.pos = bi->gcc->state_info.prev_pos;
3927 bi->gcc->config.pos = bi->ask.pos = bi2->ask.pos;
3928 bi->gcc->state_info.flags &= ~E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
3929 bi->gcc->state_info.want_save = 1;
3930 bi2->gcc->state_info.want_save = 1;
3934 bi->gcc->config.pos = bi->ask.pos = bi->gcc->state_info.prev_pos;
3937 else if ((bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_SIZE_MIN_END_INC) ||
3938 (bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_SIZE_MAX_END_DEC) ||
3939 (bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_SIZE_MIN_END_DEC) ||
3940 (bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_SIZE_MAX_END_INC))
3942 if (bi->w < bi->min.w)
3943 bi->gcc->config.size = bi->w = bi->min.w;
3945 bi->gcc->config.size = bi->w;
3947 bi->gcc->config.pos = bi->gcc->state_info.prev_pos;
3951 EINA_LIST_FOREACH(sd->items, l, item)
3953 bi = evas_object_data_get(item, "e_gadcon_layout_data");
3956 bi->w = bi->ask.size2;
3957 bi->gcc->config.size = bi->w;
3958 pos = bi->x + bi->w;
3963 _e_gadcon_layout_smart_gadcons_asked_position_set(E_Smart_Data *sd)
3965 E_Gadcon_Layout_Item *bi;
3970 EINA_LIST_FOREACH(sd->items, l, item)
3972 bi = evas_object_data_get(item, "e_gadcon_layout_data");
3975 bi->x = bi->ask.pos;
3976 bi->w = bi->ask.size2;
3980 EINA_LIST_FOREACH(sd->items, l, item)
3982 bi = evas_object_data_get(item, "e_gadcon_layout_data");
3985 pos = bi->ask.pos + (bi->ask.size / 2);
3986 if (pos < (bi->ask.res / 3))
3988 /* hooked to start */
3989 bi->x = bi->ask.pos;
3990 bi->w = bi->ask.size2;
3993 else if (pos > ((2 * bi->ask.res) / 3))
3996 bi->x = (bi->ask.pos - bi->ask.res) + sd->w;
3997 bi->w = bi->ask.size2;
3998 bi->hookp = bi->ask.res;
4002 /* hooked to middle */
4003 if ((bi->ask.pos <= (bi->ask.res / 2)) &&
4004 ((bi->ask.pos + bi->ask.size2) > (bi->ask.res / 2)))
4006 /* straddles middle */
4007 if (bi->ask.res > 2)
4008 bi->x = (sd->w / 2) +
4009 (((bi->ask.pos + (bi->ask.size2 / 2) -
4010 (bi->ask.res / 2)) *
4011 (bi->ask.res / 2)) /
4012 (bi->ask.res / 2)) - (bi->ask.size2 / 2);
4015 bi->w = bi->ask.size2;
4019 /* either side of middle */
4020 bi->x = (bi->ask.pos - (bi->ask.res / 2)) + (sd->w / 2);
4021 bi->w = bi->ask.size2;
4023 bi->hookp = bi->ask.res / 2;
4030 * The function returns a list of E_Gadcon_Layout_Item_Container
4033 _e_gadcon_layout_smart_gadcons_wrap(E_Smart_Data *sd)
4035 Eina_List *l, *list = NULL;
4037 E_Layout_Item_Container *lc;
4038 E_Gadcon_Layout_Item *bi;
4041 EINA_LIST_FOREACH(sd->items, l, item)
4043 bi = evas_object_data_get(item, "e_gadcon_layout_data");
4044 lc = E_NEW(E_Layout_Item_Container, 1);
4045 lc->state_info.min_seq = lc->state_info.max_seq = bi->gcc->state_info.seq;
4051 lc->prev_pos = bi->ask.prev_pos;
4052 lc->prev_size = bi->ask.prev_size;
4054 E_LAYOUT_ITEM_CONTAINER_STATE_SET(lc->state, bi->gcc->state_info.state);
4056 if ((bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_POSITION) &&
4057 (lc->state == E_LAYOUT_ITEM_CONTAINER_STATE_NONE))
4058 lc->state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED;
4060 lc->items = eina_list_append(lc->items, bi);
4061 list = eina_list_append(list, lc);
4067 _e_gadcon_layout_smart_gadcons_position(E_Smart_Data *sd, Eina_List **list)
4069 int ok, lc_moving_prev_pos;
4070 Eina_List *l, *l2, *l3;
4071 E_Layout_Item_Container *lc_moving = NULL, *lc_back = NULL, *lc, *lc3;
4072 E_Gadcon_Layout_Item *bi, *bi_moving = NULL;
4074 if ((!list) || (!*list)) return;
4076 EINA_LIST_FOREACH(*list, l, lc_moving)
4078 if ((lc_moving->state != E_LAYOUT_ITEM_CONTAINER_STATE_NONE) &&
4079 (lc_moving->state != E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED))
4081 lc_back = E_NEW(E_Layout_Item_Container, 1);
4082 lc_back->pos = lc_moving->pos;
4083 lc_back->prev_pos = lc_moving->prev_pos;
4084 lc_back->size = lc_moving->size;
4085 lc_back->prev_size = lc_moving->prev_size;
4086 lc_back->state_info.min_seq = lc_moving->state_info.min_seq;
4087 lc_back->state_info.max_seq = lc_moving->state_info.max_seq;
4088 lc_back->sd = lc_moving->sd;
4089 EINA_LIST_FOREACH(lc_moving->items, l2, lc)
4090 lc_back->items = eina_list_append(lc_back->items, lc);
4091 lc_back->state = lc_moving->state;
4092 bi_moving = eina_list_data_get(lc_back->items);
4101 _e_gadcon_layout_smart_gadcons_position_static(sd, list);
4105 lc_moving_prev_pos = lc_moving->prev_pos;
4106 if (lc_moving->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_DEC)
4108 _e_gadcon_layout_smart_restore_gadcons_position_before_move(sd, &lc_moving, lc_back, list);
4109 EINA_LIST_FOREACH(*list, l, lc)
4110 if (lc == lc_moving) break;
4113 if ((l) && eina_list_prev(l))
4115 lc = eina_list_data_get(eina_list_prev(l));
4117 if (lc_moving->pos < (lc->pos + lc->size))
4119 bi = eina_list_data_get(lc_moving->items);
4120 if (bi->gcc->state_info.resist <= E_LAYOUT_ITEM_DRAG_RESIST_LEVEL)
4122 if (lc_moving->prev_pos == (lc->pos + lc->size))
4124 bi->gcc->state_info.resist++;
4125 lc_moving->pos = lc->pos + lc->size;
4126 _e_gadcon_layout_smart_position_items_inside_container(sd, lc_moving);
4130 bi->gcc->state_info.resist = 0;
4131 if (lc_moving->pos < lc->pos)
4133 lc_moving->pos = (lc->pos + lc->size) - 1;
4134 _e_gadcon_layout_smart_position_items_inside_container(sd, lc_moving);
4136 lc3 = _e_gadcon_layout_smart_containers_position_adjust(sd, lc, lc_moving);
4139 if (lc_moving->prev_pos == (lc->pos + lc->size))
4143 *list = eina_list_remove_list(*list, eina_list_prev(l));
4153 int pos, prev_pos, stop;
4155 EINA_LIST_FOREACH(*list, l, lc)
4156 if (lc == lc_moving) break;
4158 pos = lc_moving->pos + lc_moving->size;
4159 prev_pos = lc_moving_prev_pos;
4160 if ((l) && (eina_list_next(l)))
4163 EINA_LIST_FOREACH(eina_list_next(l), l2, lc)
4166 if (lc->pos != prev_pos) break;
4167 prev_pos = lc->pos + lc->size;
4169 EINA_LIST_FOREACH(lc->items, l3, bi)
4171 if (bi->ask.pos <= pos)
4174 pos = (bi->x) + (bi->w);
4176 else if (bi->ask.pos < bi->x)
4178 bi->x = bi->ask.pos;
4179 pos = (bi->x) + (bi->w);
4181 else if (bi->ask.pos == bi->x)
4191 else if (lc_moving->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_INC)
4193 _e_gadcon_layout_smart_restore_gadcons_position_before_move(sd, &lc_moving, lc_back, list);
4194 EINA_LIST_FOREACH(*list, l, lc)
4195 if (lc == lc_moving) break;
4198 if ((l) && eina_list_next(l))
4200 lc = eina_list_data_get(eina_list_next(l));
4202 if ((lc_moving->pos + lc_moving->size) > lc->pos)
4204 bi = eina_list_data_get(lc_moving->items);
4205 if (bi->gcc->state_info.resist <= E_LAYOUT_ITEM_DRAG_RESIST_LEVEL)
4207 if ((lc_moving->prev_pos + lc_moving->size) == lc->pos)
4209 bi->gcc->state_info.resist++;
4210 lc_moving->pos = lc->pos - lc_moving->size;
4211 _e_gadcon_layout_smart_position_items_inside_container(sd, lc_moving);
4215 bi->gcc->state_info.resist = 0;
4216 if ((lc_moving->pos + lc_moving->size) > lc->pos)
4218 lc_moving->pos = (lc->pos - lc_moving->size) + 1;
4219 _e_gadcon_layout_smart_position_items_inside_container(sd, lc_moving);
4221 lc3 = _e_gadcon_layout_smart_containers_position_adjust(sd, lc_moving, lc);
4224 if ((lc_moving->prev_pos + lc_moving->size) == lc->pos)
4228 *list = eina_list_remove_list(*list, eina_list_next(l));
4239 int pos, prev_pos, stop;
4241 EINA_LIST_FOREACH(*list, l, lc)
4242 if (lc == lc_moving) break;
4244 pos = lc_moving->pos;
4245 prev_pos = lc_moving_prev_pos;
4247 if ((l) && eina_list_prev(l))
4250 /* EINA_FUCK_REVERSE_FOREACH(eina_list_prev(l), l2, lc) */
4251 for (l2 = l->prev; l2; l2 = l2->prev)
4256 if ((lc->pos + lc->size) == prev_pos) break;
4259 EINA_LIST_REVERSE_FOREACH(lc->items, l3, bi)
4261 if ((bi->ask.pos + bi->w) >= pos)
4263 bi->x = pos - bi->w;
4266 else if (bi->ask.pos > bi->x)
4268 bi->x = bi->ask.pos;
4271 else if (bi->ask.pos == bi->x)
4281 else if (lc_moving->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MIN_END_DEC)
4283 _e_gadcon_layout_smart_restore_gadcons_position_before_move(sd, &lc_moving, lc_back, list);
4284 EINA_LIST_FOREACH(*list, l, lc)
4285 if (lc == lc_moving) break;
4287 if ((l) && eina_list_prev(l))
4292 new_pos = lc_moving->pos;
4293 /* EINA_FUCK_REVERSE_FOREACH(eina_list_prev(l), l2, lc) */
4294 for (l2 = l->prev; l2; l2 = l2->prev)
4297 if (new_pos >= (lc->pos + lc->size)) break;
4300 new_pos -= lc->size;
4305 lc_moving->size += new_pos;
4306 lc_moving->pos -= new_pos;
4308 bi = eina_list_data_get(lc_moving->items);
4309 bi->w = lc_moving->size;
4310 _e_gadcon_layout_smart_position_items_inside_container(sd, lc_moving);
4317 if (!l2) l2 = *list;
4318 else l2 = eina_list_next(l2);
4320 EINA_LIST_FOREACH(l2, l2, lc)
4324 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4325 EINA_LIST_FOREACH(lc->items, l3, bi)
4327 bi->gcc->state_info.flags &= ~E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
4329 new_pos += lc->size;
4333 else if ((l) && (!eina_list_prev(l)))
4335 if (lc_moving->pos <= 0)
4337 lc_moving->size = lc_moving->prev_size;
4340 bi = eina_list_data_get(lc_moving->items);
4341 bi->w = lc_moving->size;
4343 _e_gadcon_layout_smart_position_items_inside_container(sd, lc_moving);
4347 else if (lc_moving->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MIN_END_INC)
4349 lc_moving->state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED;
4350 _e_gadcon_layout_smart_gadcons_position_static(sd, list);
4351 if (lc_back) LC_FREE(lc_back);
4353 else if (lc_moving->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MAX_END_INC)
4355 _e_gadcon_layout_smart_restore_gadcons_position_before_move(sd, &lc_moving, lc_back, list);
4356 EINA_LIST_FOREACH(*list, l, lc)
4357 if (lc == lc_moving) break;
4359 if ((l) && eina_list_next(l))
4361 Eina_List *stop = NULL;
4365 new_pos = lc_moving->pos + lc_moving->size;
4366 EINA_LIST_FOREACH(eina_list_next(l), l2, lc)
4368 if (new_pos <= lc->pos)
4375 /* new_pos += lc->size; */
4378 if (new_pos > sd->w)
4380 lc_moving->size -= (new_pos - sd->w);
4381 bi = eina_list_data_get(lc_moving->items);
4382 bi->w = lc_moving->size;
4384 new_pos = lc_moving->pos + lc_moving->size;
4389 EINA_LIST_FOREACH(eina_list_next(l), l2, lc)
4391 if (l2 == stop) break;
4393 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4394 EINA_LIST_FOREACH(lc->items, l3, bi)
4396 bi->gcc->state_info.flags &= ~E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
4398 new_pos += lc->size;
4402 else if ((l) && (!eina_list_next(l)))
4404 if ((lc_moving->pos + lc_moving->size) >= sd->w)
4406 lc_moving->size = lc_moving->prev_size;
4407 bi = eina_list_data_get(lc_moving->items);
4408 bi->w = lc_moving->size;
4412 else if (lc_moving->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MAX_END_DEC)
4414 lc_moving->state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED;
4415 _e_gadcon_layout_smart_gadcons_position_static(sd, list);
4416 if (lc_back) LC_FREE(lc_back);
4421 bi_moving->gcc->config.pos = bi_moving->ask.pos = bi_moving->x;
4422 bi_moving->gcc->config.size = bi_moving->w;
4427 _e_gadcon_layout_smart_gadcons_position_static(E_Smart_Data *sd, Eina_List **list)
4431 E_Layout_Item_Container *lc, *lc2, *lc3;
4433 *list = eina_list_sort(*list, eina_list_count(*list), _e_gadcon_layout_smart_containers_sort_cb);
4436 EINA_LIST_FOREACH(*list, l, lc)
4438 if (!eina_list_next(l)) continue;
4440 lc2 = eina_list_data_get(eina_list_next(l));
4442 if (LC_OVERLAP(lc, lc2))
4444 lc3 = _e_gadcon_layout_smart_containers_position_adjust(sd, lc, lc2);
4448 *list = eina_list_remove_list(*list, eina_list_next(l));
4451 goto __reposition_again;
4457 EINA_LIST_FOREACH(*list, l, lc)
4463 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4467 if (((lc->pos + lc->size) > sd->w) && (lc->size <= sd->w))
4470 lc->pos = sd->w - lc->size;
4471 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4475 _e_gadcon_layout_smart_gadcons_position_static(sd, list);
4478 static E_Layout_Item_Container *
4479 _e_gadcon_layout_smart_containers_position_adjust(E_Smart_Data *sd, E_Layout_Item_Container *lc, E_Layout_Item_Container *lc2)
4483 E_Layout_Item_Container *lc3 = NULL;
4484 E_Layout_Item_Container_State new_state;
4485 E_Gadcon_Layout_Item *bi, *bi2;
4487 if ((lc->state == E_LAYOUT_ITEM_CONTAINER_STATE_NONE) &&
4488 (lc2->state == E_LAYOUT_ITEM_CONTAINER_STATE_NONE))
4490 if (lc->state_info.max_seq <= lc2->state_info.min_seq)
4492 lc2->pos = lc->pos + lc->size;
4493 _e_gadcon_layout_smart_position_items_inside_container(sd, lc2);
4495 else if (lc->state_info.min_seq > lc2->state_info.max_seq)
4497 lc->pos = lc2->pos + lc2->size;
4498 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4500 else if (((lc->state_info.min_seq > lc2->state_info.min_seq) &&
4501 (lc->state_info.min_seq < lc2->state_info.max_seq)) ||
4502 ((lc2->state_info.min_seq > lc->state_info.min_seq) &&
4503 (lc2->state_info.min_seq < lc->state_info.max_seq)))
4505 _e_gadcon_layout_smart_containers_merge(sd, lc, lc2);
4508 new_state = E_LAYOUT_ITEM_CONTAINER_STATE_NONE;
4510 else if ((lc->state != E_LAYOUT_ITEM_CONTAINER_STATE_NONE) &&
4511 (lc2->state == E_LAYOUT_ITEM_CONTAINER_STATE_NONE))
4513 if (lc->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_INC)
4517 bi = eina_list_data_get(lc->items);
4518 bi2 = eina_list_data_get(lc2->items);
4520 bi->x = ((bi2->x) + (bi2->w)) - (bi->w);
4521 bi->gcc->config.pos = bi->ask.pos = bi->x;
4522 bi->gcc->config.size = bi->w;
4523 bi2->x = (bi->x) - (bi2->w);
4525 bi2->gcc->state_info.flags &= ~E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
4527 t = bi->gcc->state_info.seq;
4528 bi->gcc->state_info.seq = bi2->gcc->state_info.seq;
4529 bi2->gcc->state_info.seq = t;
4531 _e_gadcon_layout_smart_containers_merge(sd, lc, lc2);
4533 else if (lc->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED)
4535 if (lc->state_info.max_seq < lc2->state_info.min_seq)
4537 lc2->pos = lc->pos + lc->size;
4538 _e_gadcon_layout_smart_position_items_inside_container(sd, lc2);
4540 else if (lc->state_info.min_seq > lc2->state_info.max_seq)
4542 lc2->pos = lc->pos - lc2->size;
4543 _e_gadcon_layout_smart_position_items_inside_container(sd, lc2);
4545 else if (((lc->state_info.min_seq > lc2->state_info.min_seq) &&
4546 (lc->state_info.min_seq < lc2->state_info.max_seq)) ||
4547 ((lc2->state_info.min_seq > lc->state_info.min_seq) &&
4548 (lc2->state_info.min_seq < lc->state_info.max_seq)))
4552 _e_gadcon_layout_smart_containers_merge(sd, lc, lc2);
4554 EINA_LIST_FOREACH(lc->items, l, bi)
4556 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_POSITION)
4558 shift = bi->ask.pos - bi->x;
4561 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE)
4567 EINA_LIST_FOREACH(lc->items, l, bi)
4578 new_state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED;
4580 else if ((lc->state == E_LAYOUT_ITEM_CONTAINER_STATE_NONE) &&
4581 (lc2->state != E_LAYOUT_ITEM_CONTAINER_STATE_NONE))
4583 if (lc2->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED)
4585 if (lc->state_info.max_seq < lc2->state_info.min_seq)
4587 lc->pos = lc2->pos - lc->size;
4588 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4590 else if (lc->state_info.min_seq > lc2->state_info.max_seq)
4592 lc->pos = lc2->pos + lc2->size;
4593 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4595 else if (((lc->state_info.min_seq > lc2->state_info.min_seq) &&
4596 (lc->state_info.min_seq < lc2->state_info.max_seq)) ||
4597 ((lc2->state_info.min_seq > lc->state_info.min_seq) &&
4598 (lc2->state_info.min_seq < lc->state_info.max_seq)))
4602 EINA_LIST_FOREACH(lc->items, l, bi)
4604 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_POSITION)
4606 shift = bi->ask.pos - bi->x;
4609 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE)
4615 EINA_LIST_FOREACH(lc->items, l, bi)
4625 else if (lc2->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_DEC)
4629 bi = eina_list_data_get(eina_list_last(lc->items));
4630 bi2 = eina_list_data_get(lc2->items);
4632 bi2->gcc->config.pos = bi2->ask.pos = (bi2->x) = (bi->x);
4633 bi2->gcc->config.size = bi2->w;
4634 bi->x = bi2->x + bi2->w;
4636 t = bi->gcc->state_info.seq;
4637 bi->gcc->state_info.seq = bi2->gcc->state_info.seq;
4638 bi2->gcc->state_info.seq = t;
4640 lc->items = eina_list_remove_list(lc->items, eina_list_last(lc->items));
4641 lc->items = eina_list_append(lc->items, bi2);
4642 lc->items = eina_list_append(lc->items, bi);
4643 lc2->items = eina_list_free(lc2->items);
4644 E_LAYOUT_ITEM_CONTAINER_SIZE_CHANGE_BY(lc, bi2, 1);
4645 lc2->pos = lc->pos + lc->size;
4649 new_state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED;
4651 else if ((lc->state != E_LAYOUT_ITEM_CONTAINER_STATE_NONE) &&
4652 (lc2->state != E_LAYOUT_ITEM_CONTAINER_STATE_NONE))
4654 if ((lc->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED) &&
4655 (lc2->state == E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED))
4657 if (lc->state_info.max_seq < lc2->state_info.min_seq)
4662 EINA_LIST_FOREACH(lc->items, l, bi)
4664 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE)
4670 EINA_LIST_FOREACH(lc2->items, l, bi)
4672 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE)
4679 if ((move_lc1) && (!move_lc2))
4681 lc->pos = lc2->pos - lc->size;
4682 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4686 lc2->pos = lc->pos + lc->size;
4687 _e_gadcon_layout_smart_position_items_inside_container(sd, lc2);
4690 else if (lc->state_info.min_seq > lc2->state_info.max_seq)
4695 EINA_LIST_FOREACH(lc->items, l, bi)
4697 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE)
4703 EINA_LIST_FOREACH(lc2->items, l, bi)
4705 if (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE)
4712 if ((!move_lc1) && (move_lc2))
4714 lc2->pos = lc->pos - lc2->size;
4715 _e_gadcon_layout_smart_position_items_inside_container(sd, lc2);
4719 lc->pos = lc2->pos + lc2->size;
4720 _e_gadcon_layout_smart_position_items_inside_container(sd, lc);
4723 else if (((lc->state_info.min_seq > lc2->state_info.min_seq) &&
4724 (lc->state_info.min_seq < lc2->state_info.max_seq)) ||
4725 ((lc2->state_info.min_seq > lc->state_info.min_seq) &&
4726 (lc2->state_info.min_seq < lc->state_info.max_seq)))
4730 _e_gadcon_layout_smart_containers_merge(sd, lc, lc2);
4732 EINA_LIST_FOREACH(lc->items, l, bi)
4734 if ((bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_POSITION) &&
4735 (bi->gcc->state_info.flags & E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE))
4737 shift = bi->ask.pos - bi->x;
4744 EINA_LIST_FOREACH(lc->items, l, bi)
4754 new_state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED;
4760 lc3 = E_NEW(E_Layout_Item_Container, 1);
4762 if (lc->pos < lc2->pos)
4765 EINA_LIST_FOREACH(lc->items, l, bi)
4766 lc3->items = eina_list_append(lc3->items, bi);
4767 EINA_LIST_FOREACH(lc2->items, l, bi)
4768 lc3->items = eina_list_append(lc3->items, bi);
4770 lc3->state_info.min_seq = lc->state_info.min_seq;
4772 lc3->state_info.max_seq = lc2->state_info.max_seq;
4774 lc3->state_info.max_seq = lc->state_info.max_seq;
4778 lc3->pos = lc2->pos;
4779 EINA_LIST_FOREACH(lc2->items, l, bi)
4780 lc3->items = eina_list_append(lc3->items, bi);
4781 EINA_LIST_FOREACH(lc->items, l, bi)
4782 lc3->items = eina_list_append(lc3->items, bi);
4784 lc3->state_info.min_seq = lc2->state_info.min_seq;
4786 lc3->state_info.max_seq = lc->state_info.max_seq;
4788 lc3->state_info.max_seq = lc2->state_info.max_seq;
4790 lc3->size = lc->size + lc2->size;
4791 lc3->state = new_state;
4798 _e_gadcon_layout_smart_position_items_inside_container(E_Smart_Data *sd __UNUSED__, E_Layout_Item_Container *lc)
4802 E_Gadcon_Layout_Item *bi;
4804 if (!lc->items) return;
4806 bi = eina_list_data_get(lc->items);
4807 shift = lc->pos - bi->x;
4811 EINA_LIST_FOREACH(lc->items, l, bi)
4815 if ((bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_POS_DEC) ||
4816 (bi->gcc->state_info.state == E_LAYOUT_ITEM_STATE_POS_INC))
4818 bi->gcc->config.pos = bi->ask.pos = bi->x;
4824 _e_gadcon_layout_smart_containers_merge(E_Smart_Data *sd __UNUSED__, E_Layout_Item_Container *lc, E_Layout_Item_Container *lc2)
4826 int start = 0, size = 0, next = 0, min_seq = 0, max_seq = 0;
4827 Eina_List *l, *nl = NULL;
4828 E_Gadcon_Layout_Item *bi;
4830 EINA_LIST_FOREACH(lc->items, l, bi)
4831 nl = eina_list_append(nl, bi);
4832 EINA_LIST_FOREACH(lc2->items, l, bi)
4833 nl = eina_list_append(nl, bi);
4835 nl = eina_list_sort(nl, eina_list_count(nl), _e_gadcon_layout_smart_seq_sort_cb);
4837 EINA_LIST_FOREACH(nl, l, bi)
4841 min_seq = max_seq = bi->gcc->state_info.seq;
4844 next = bi->x + bi->w;
4849 max_seq = bi->gcc->state_info.seq;
4853 next = bi->x + bi->w;
4856 lc->items = eina_list_free(lc->items);
4857 lc2->items = eina_list_free(lc->items);
4861 lc->state_info.min_seq = min_seq;
4862 lc->state_info.max_seq = max_seq;
4863 lc2->pos = lc->pos + lc->size;
4868 _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)
4871 Eina_List *l, *l2, *l3;
4872 E_Gadcon_Layout_Item *bi, *bi2;
4873 E_Layout_Item_Container *lc, *lc2, *lc3;
4875 (*lc_moving)->pos = (*lc_moving)->prev_pos;
4876 if (((*lc_moving)->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MIN_END_INC) ||
4877 ((*lc_moving)->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MIN_END_DEC) ||
4878 ((*lc_moving)->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MAX_END_INC) ||
4879 ((*lc_moving)->state == E_LAYOUT_ITEM_CONTAINER_STATE_SIZE_MAX_END_DEC))
4881 (*lc_moving)->size = (*lc_moving)->prev_size;
4882 bi = eina_list_data_get((*lc_moving)->items);
4884 bi->w = (*lc_moving)->prev_size;
4886 _e_gadcon_layout_smart_position_items_inside_container(sd, (*lc_moving));
4887 (*lc_moving)->state = E_LAYOUT_ITEM_CONTAINER_STATE_POS_LOCKED;
4888 _e_gadcon_layout_smart_gadcons_position_static(sd, con_list);
4893 EINA_LIST_FOREACH(*con_list, l, lc)
4895 if (lc->state == E_LAYOUT_ITEM_CONTAINER_STATE_NONE) continue;
4897 if (eina_list_count(lc->items) == 1)
4899 bi = eina_list_data_get(lc->items);
4900 if (bi->gcc->state_info.state != E_LAYOUT_ITEM_STATE_NONE)
4903 l->data = *lc_moving = lc_back;
4904 _e_gadcon_layout_smart_position_items_inside_container(sd, (*lc_moving));
4906 if (((*lc_moving)->state != E_LAYOUT_ITEM_CONTAINER_STATE_POS_INC) &&
4907 ((*lc_moving)->state != E_LAYOUT_ITEM_CONTAINER_STATE_POS_DEC))
4909 bi = eina_list_data_get((*lc_moving)->items);
4910 bi->w = (*lc_moving)->size;
4916 EINA_LIST_FOREACH(lc->items, l2, bi)
4918 if (bi->gcc->state_info.state != E_LAYOUT_ITEM_STATE_NONE)
4921 if (l2 != lc->items)
4923 lc2 = E_NEW(E_Layout_Item_Container, 1);
4925 lc2->state = E_LAYOUT_ITEM_CONTAINER_STATE_NONE;
4926 EINA_LIST_FOREACH(lc->items, l3, bi2)
4929 lc2->items = eina_list_append(lc2->items, bi2);
4930 if (l3 == lc->items)
4932 lc2->state_info.min_seq = bi2->gcc->state_info.seq;
4933 lc2->pos = lc2->prev_pos = bi2->x;
4935 lc2->state_info.max_seq = bi2->gcc->state_info.seq;
4936 E_LAYOUT_ITEM_CONTAINER_SIZE_CHANGE_BY(lc2, bi2, 1);
4940 if (eina_list_next(l2))
4942 lc3 = E_NEW(E_Layout_Item_Container, 1);
4944 lc3->state = E_LAYOUT_ITEM_CONTAINER_STATE_NONE;
4945 EINA_LIST_FOREACH(eina_list_next(l2), l3, bi2)
4947 lc3->items = eina_list_append(lc3->items, bi2);
4948 if (l3 == eina_list_next(l2))
4950 lc3->state_info.min_seq = bi2->gcc->state_info.seq;
4951 lc3->pos = lc3->prev_pos = bi2->x;
4953 lc3->state_info.max_seq = bi2->gcc->state_info.seq;
4954 E_LAYOUT_ITEM_CONTAINER_SIZE_CHANGE_BY(lc3, bi2, 1);
4957 *lc_moving = lc_back;
4958 _e_gadcon_layout_smart_position_items_inside_container(sd, *lc_moving);
4960 if (((*lc_moving)->state != E_LAYOUT_ITEM_CONTAINER_STATE_POS_INC) &&
4961 ((*lc_moving)->state != E_LAYOUT_ITEM_CONTAINER_STATE_POS_DEC))
4963 bi = eina_list_data_get((*lc_moving)->items);
4964 bi->w = (*lc_moving)->size;
4975 *con_list = eina_list_append(*con_list, *lc_moving);
4977 *con_list = eina_list_append(*con_list, lc3);
4978 *con_list = eina_list_sort(*con_list, eina_list_count(*con_list),
4979 _e_gadcon_layout_smart_containers_sort_cb);
4983 l->data = *lc_moving;
4986 *con_list = eina_list_append(*con_list, lc3);
4987 *con_list = eina_list_sort(*con_list, eina_list_count(*con_list),
4988 _e_gadcon_layout_smart_containers_sort_cb);
4996 EINA_LIST_FOREACH(*con_list, l, lc)
4998 if (lc == *lc_moving) continue;
4999 lc->state = E_LAYOUT_ITEM_CONTAINER_STATE_NONE;
5004 _e_gadcon_custom_populate_idler(void *data __UNUSED__)
5006 const E_Gadcon_Client_Class *cc;
5010 EINA_LIST_FREE(custom_populate_requests, gc)
5012 e_gadcon_layout_freeze(gc->o_container);
5013 EINA_LIST_FOREACH(providers_list, l, cc)
5015 if (gc->populate_class.func)
5016 gc->populate_class.func(gc->populate_class.data, gc, cc);
5018 e_gadcon_populate_class(gc, cc);
5020 e_gadcon_layout_thaw(gc->o_container);
5023 custom_populate_idler = NULL;
5024 return ECORE_CALLBACK_CANCEL;
5028 _e_gadcon_provider_populate_idler(void *data __UNUSED__)
5030 const E_Gadcon_Client_Class *cc;
5034 EINA_LIST_FOREACH(gadcons, l, gc)
5035 e_gadcon_layout_freeze(gc->o_container);
5037 EINA_LIST_FREE(populate_requests, cc)
5039 EINA_LIST_FOREACH(gadcons, l, gc)
5041 if (gc->populate_class.func)
5042 gc->populate_class.func(gc->populate_class.data, gc, cc);
5044 e_gadcon_populate_class(gc, cc);
5048 EINA_LIST_FOREACH(gadcons, l, gc)
5049 e_gadcon_layout_thaw(gc->o_container);
5051 populate_idler = NULL;
5052 return ECORE_CALLBACK_CANCEL;
5056 _e_gadcon_provider_populate_request(const E_Gadcon_Client_Class *cc)
5058 if (!populate_idler)
5059 populate_idler = ecore_idler_add(_e_gadcon_provider_populate_idler, NULL);
5060 if (!eina_list_data_find(populate_requests, cc))
5061 populate_requests = eina_list_append(populate_requests, cc);
5065 _e_gadcon_provider_populate_unrequest(const E_Gadcon_Client_Class *cc)
5067 populate_requests = eina_list_remove(populate_requests, cc);
5068 if ((!populate_requests) && (populate_idler))
5070 ecore_idler_del(populate_idler);
5071 populate_idler = NULL;
5075 /* gadgets movement between different gadcons */
5077 EAPI E_Gadcon_Location *
5078 e_gadcon_location_new(const char * name,
5080 int (*add_func) (void *data, const E_Gadcon_Client_Class *cc),
5082 void (*remove_func) (void *data, E_Gadcon_Client *cc),
5085 E_Gadcon_Location *loc;
5087 loc = E_NEW(E_Gadcon_Location, 1);
5088 loc->name = eina_stringshare_add(name);
5090 loc->gadget_add.func = add_func;
5091 loc->gadget_add.data = add_data;
5092 loc->gadget_remove.func = remove_func;
5093 loc->gadget_remove.data = remove_data;
5094 loc->icon_name = NULL;
5099 e_gadcon_location_set_icon_name(E_Gadcon_Location *loc, const char *name)
5101 if (loc->icon_name) eina_stringshare_del(loc->icon_name);
5103 loc->icon_name = eina_stringshare_add(name);
5105 loc->icon_name = NULL;
5109 e_gadcon_location_free(E_Gadcon_Location *loc)
5111 eina_stringshare_del(loc->name);
5112 if (loc->icon_name) eina_stringshare_del(loc->icon_name);
5117 e_gadcon_location_register(E_Gadcon_Location * loc)
5119 gadcon_locations = eina_list_append(gadcon_locations, loc);
5123 e_gadcon_location_unregister(E_Gadcon_Location * loc)
5125 gadcon_locations = eina_list_remove(gadcon_locations, loc);
5129 _e_gadcon_location_change(E_Gadcon_Client * gcc, E_Gadcon_Location *src, E_Gadcon_Location *dst)
5131 E_Gadcon_Client_Class *cc;
5133 cc = eina_hash_find(providers, gcc->cf->name);
5135 if (!dst->gadget_add.func(dst->gadget_add.data, cc)) return 0;
5136 src->gadget_remove.func(src->gadget_remove.data, gcc);