3 typedef struct _E_Configure E_Configure;
4 typedef struct _E_Configure_CB E_Configure_CB;
5 typedef struct _E_Configure_Category E_Configure_Category;
6 typedef struct _E_Configure_Item E_Configure_Item;
8 #define E_CONFIGURE_TYPE 0xE0b01014
12 E_Object e_obj_inherit;
20 Evas_Object *cat_list;
21 Evas_Object *item_list;
25 Ecore_Event_Handler *mod_hdl;
28 struct _E_Configure_CB
34 struct _E_Configure_Category
41 struct _E_Configure_Item
45 const char *icon_file;
49 static void _e_configure_free(E_Configure *eco);
50 static void _e_configure_cb_del_req(E_Win *win);
51 static void _e_configure_cb_resize(E_Win *win);
52 static void _e_configure_cb_close(void *data, void *data2);
53 static E_Configure_Category *_e_configure_category_add(E_Configure *eco, const char *label, const char *icon_file, const char *icon);
54 static void _e_configure_category_cb(void *data, void *data2);
55 static void _e_configure_item_add(E_Configure_Category *cat, const char *label, const char *icon_file, const char *icon, const char *path);
56 static void _e_configure_item_cb(void *data);
57 static void _e_configure_focus_cb(void *data, Evas_Object *obj);
58 static void _e_configure_keydown_cb(void *data, Evas *e, Evas_Object *obj, void *event);
59 static void _e_configure_fill_cat_list(void *data, const char *sel);
60 static Eina_Bool _e_configure_module_update_cb(void *data, int type, void *event);
62 static E_Configure *_e_configure = NULL;
65 e_configure_show(E_Container *con, const char *params)
69 Evas_Coord ew, eh, mw, mh;
71 Evas_Modifier_Mask mask;
82 z = e_util_zone_current_get(e_manager_current_get());
83 z2 = eco->win->border->zone;
85 e_win_raise(eco->win);
86 if (z->container == z2->container)
87 e_border_desk_set(eco->win->border, e_desk_current_get(z));
90 if (!eco->win->border->sticky)
91 e_desk_show(eco->win->border->desk);
92 ecore_x_pointer_warp(z2->container->win,
93 z2->x + (z2->w / 2), z2->y + (z2->h / 2));
95 e_border_unshade(eco->win->border, E_DIRECTION_DOWN);
96 if ((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
97 (e_config->focus_setting == E_FOCUS_NEW_WINDOW))
98 e_border_focus_set(eco->win->border, 1, 1);
99 EINA_LIST_FOREACH(e_widget_toolbar_items_get(eco->cat_list), l, it)
101 if (e_widget_toolbar_item_label_get(it) == params)
103 e_widget_toolbar_item_select(eco->cat_list, x);
113 man = e_manager_current_get();
115 con = e_container_current_get(man);
116 if (!con) con = e_container_number_get(man, 0);
120 eco = E_OBJECT_ALLOC(E_Configure, E_CONFIGURE_TYPE, _e_configure_free);
122 eco->win = e_win_new(con);
128 eco->win->data = eco;
130 eco->evas = e_win_evas_get(eco->win);
132 /* Event Handler for Module Updates */
133 eco->mod_hdl = ecore_event_handler_add(E_EVENT_MODULE_UPDATE,
134 _e_configure_module_update_cb, eco);
136 e_win_title_set(eco->win, _("Settings"));
137 e_win_name_class_set(eco->win, "E", "_configure");
138 e_win_dialog_set(eco->win, 0);
139 e_win_delete_callback_set(eco->win, _e_configure_cb_del_req);
140 e_win_resize_callback_set(eco->win, _e_configure_cb_resize);
141 e_win_centered_set(eco->win, 1);
143 eco->edje = edje_object_add(eco->evas);
144 e_theme_edje_object_set(eco->edje, "base/theme/configure",
145 "e/widgets/configure/main");
146 edje_object_part_text_set(eco->edje, "e.text.title", _("Settings"));
148 eco->o_list = e_widget_list_add(eco->evas, 0, 0);
149 edje_object_part_swallow(eco->edje, "e.swallow.content", eco->o_list);
151 /* Event Obj for keydown */
152 o = evas_object_rectangle_add(eco->evas);
154 kg = evas_object_key_grab(o, "Tab", mask, ~mask, 0);
156 fprintf(stderr, "ERROR: unable to redirect \"Tab\" key events to object %p.\n", o);
157 mask = evas_key_modifier_mask_get(e_win_evas_get(eco->win), "Shift");
158 kg = evas_object_key_grab(o, "Tab", mask, ~mask, 0);
160 fprintf(stderr, "ERROR: unable to redirect \"Tab\" key events to object %p.\n", o);
162 kg = evas_object_key_grab(o, "Return", mask, ~mask, 0);
164 fprintf(stderr, "ERROR: unable to redirect \"Return\" key events to object %p.\n", o);
166 kg = evas_object_key_grab(o, "KP_Enter", mask, ~mask, 0);
168 fprintf(stderr, "ERROR: unable to redirect \"KP_Enter\" key events to object %p.\n", o);
170 kg = evas_object_key_grab(o, "Escape", mask, ~mask, 0);
172 fprintf(stderr, "ERROR: unable to redirect \"Escape\" key events to object %p.\n", o);
173 evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN,
174 _e_configure_keydown_cb, eco->win);
176 _e_configure_fill_cat_list(eco, params);
179 eco->close = e_widget_button_add(eco->evas, _("Close"), NULL,
180 _e_configure_cb_close, eco, NULL);
181 e_widget_on_focus_hook_set(eco->close, _e_configure_focus_cb, eco->win);
182 e_widget_size_min_get(eco->close, &mw, &mh);
183 edje_extern_object_min_size_set(eco->close, mw, mh);
184 edje_object_part_swallow(eco->edje, "e.swallow.button", eco->close);
185 edje_object_size_min_calc(eco->edje, &ew, &eh);
186 e_win_size_min_set(eco->win, ew, eh);
187 e_util_win_auto_resize_fill(eco->win);
189 evas_object_show(eco->edje);
190 e_win_show(eco->win);
191 e_win_border_icon_set(eco->win, "preferences-system");
193 /* Preselect "Appearance" */
194 e_widget_focus_set(eco->cat_list, 1);
195 if (!e_widget_toolbar_item_selected_get(eco->cat_list))
196 e_widget_toolbar_item_select(eco->cat_list, 0);
202 e_configure_del(void)
204 if (_e_configure) e_object_del(E_OBJECT(_e_configure));
209 _e_configure_free(E_Configure *eco)
211 if (_e_configure->mod_hdl)
212 ecore_event_handler_del(_e_configure->mod_hdl);
213 _e_configure->mod_hdl = NULL;
217 E_Configure_Category *cat;
219 if (!(cat = eco->cats->data)) return;
220 if (cat->label) eina_stringshare_del(cat->label);
224 E_Configure_Item *ci;
226 if (!(ci = cat->items->data)) continue;
227 if (ci->label) eina_stringshare_del(ci->label);
228 if (ci->icon_file) eina_stringshare_del(ci->icon_file);
229 if (ci->icon) eina_stringshare_del(ci->icon);
232 if (ci->cb->path) eina_stringshare_del(ci->cb->path);
235 cat->items = eina_list_remove_list(cat->items, cat->items);
238 eco->cats = eina_list_remove_list(eco->cats, eco->cats);
241 // evas_object_del(eco->close);
242 // evas_object_del(eco->cat_list);
243 // evas_object_del(eco->item_list);
244 // evas_object_del(eco->o_list);
245 // evas_object_del(eco->edje);
246 e_object_del(E_OBJECT(eco->win));
251 _e_configure_cb_del_req(E_Win *win)
255 if (!(eco = win->data)) return;
256 e_object_del(E_OBJECT(eco));
260 _e_configure_cb_resize(E_Win *win)
265 if (!(eco = win->data)) return;
266 ecore_evas_geometry_get(win->ecore_evas, NULL, NULL, &w, &h);
267 evas_object_resize(eco->edje, w, h);
271 _e_configure_cb_close(void *data, void *data2 __UNUSED__)
275 if (!(eco = data)) return;
276 e_util_defer_object_del(E_OBJECT(eco));
279 static E_Configure_Category *
280 _e_configure_category_add(E_Configure *eco, const char *label, const char *icon_file, const char *icon)
282 Evas_Object *o = NULL;
283 E_Configure_Category *cat;
285 if (!eco) return NULL;
286 if (!label) return NULL;
288 cat = E_NEW(E_Configure_Category, 1);
290 cat->label = eina_stringshare_add(label);
293 o = e_icon_add(eco->evas);
295 e_icon_file_edje_set(o, icon_file, icon);
296 else if (!e_util_icon_theme_set(o, icon))
299 o = e_util_icon_add(icon, eco->evas);
302 eco->cats = eina_list_append(eco->cats, cat);
304 e_widget_toolbar_item_append(eco->cat_list, o, label,
305 _e_configure_category_cb, cat, NULL);
310 _e_configure_category_cb(void *data, void *data2 __UNUSED__)
312 E_Configure_Category *cat;
317 if (!(cat = data)) return;
320 evas_event_freeze(evas_object_evas_get(eco->item_list));
322 e_widget_ilist_freeze(eco->item_list);
323 e_widget_ilist_clear(eco->item_list);
325 for (l = cat->items; l; l = l->next)
327 E_Configure_Item *ci;
328 Evas_Object *o = NULL;
330 if (!(ci = l->data)) continue;
333 o = e_icon_add(eco->evas);
335 e_icon_file_edje_set(o, ci->icon_file, ci->icon);
336 else if (!e_util_icon_theme_set(o, ci->icon))
339 o = e_util_icon_add(ci->icon, eco->evas);
342 e_widget_ilist_append(eco->item_list, o, ci->label,
343 _e_configure_item_cb, ci, NULL);
345 e_widget_ilist_go(eco->item_list);
346 e_widget_size_min_get(eco->item_list, &w, &h);
347 e_widget_size_min_set(eco->item_list, w, h);
348 e_widget_ilist_thaw(eco->item_list);
350 evas_event_thaw(evas_object_evas_get(eco->item_list));
354 _e_configure_item_add(E_Configure_Category *cat, const char *label, const char *icon_file, const char *icon, const char *path)
356 E_Configure_Item *ci;
359 if ((!cat) || (!label)) return;
361 ci = E_NEW(E_Configure_Item, 1);
362 cb = E_NEW(E_Configure_CB, 1);
364 cb->path = eina_stringshare_add(path);
366 ci->label = eina_stringshare_add(label);
367 if (icon_file) ci->icon_file = eina_stringshare_add(icon_file);
368 if (icon) ci->icon = eina_stringshare_add(icon);
369 cat->items = eina_list_append(cat->items, ci);
373 _e_configure_item_cb(void *data)
375 E_Configure_Item *ci;
378 if (!(ci = data)) return;
380 if (cb->path) e_configure_registry_call(cb->path, cb->eco->con, NULL);
384 _e_configure_focus_cb(void *data, Evas_Object *obj)
390 if (!(eco = win->data)) return;
391 if (obj == eco->close)
393 e_widget_focused_object_clear(eco->item_list);
394 e_widget_focused_object_clear(eco->cat_list);
396 else if (obj == eco->item_list)
398 e_widget_focused_object_clear(eco->cat_list);
399 e_widget_focused_object_clear(eco->close);
401 else if (obj == eco->cat_list)
403 e_widget_focused_object_clear(eco->item_list);
404 e_widget_focused_object_clear(eco->close);
409 _e_configure_keydown_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event)
411 Evas_Event_Key_Down *ev;
419 if (!strcmp(ev->keyname, "Tab"))
421 if (evas_key_modifier_is_set(evas_key_modifier_get(e_win_evas_get(win)), "Shift"))
423 if (e_widget_focus_get(eco->close))
424 e_widget_focus_set(eco->item_list, 0);
425 else if (e_widget_focus_get(eco->item_list))
426 e_widget_focus_set(eco->cat_list, 1);
427 else if (e_widget_focus_get(eco->cat_list))
428 e_widget_focus_set(eco->close, 0);
432 if (e_widget_focus_get(eco->close))
433 e_widget_focus_set(eco->cat_list, 1);
434 else if (e_widget_focus_get(eco->item_list))
435 e_widget_focus_set(eco->close, 0);
436 else if (e_widget_focus_get(eco->cat_list))
437 e_widget_focus_set(eco->item_list, 0);
440 else if (((!strcmp(ev->keyname, "Return")) ||
441 (!strcmp(ev->keyname, "KP_Enter")) ||
442 (!strcmp(ev->keyname, "space"))))
444 Evas_Object *o = NULL;
446 if (e_widget_focus_get(eco->cat_list))
448 else if (e_widget_focus_get(eco->item_list))
450 else if (e_widget_focus_get(eco->close))
455 if (!(o = e_widget_focused_object_get(o))) return;
456 e_widget_activate(o);
459 else if (!strcmp(ev->keyname, "Escape"))
460 e_widget_activate(eco->close);
464 _e_configure_fill_cat_list(void *data, const char *sel)
468 E_Configure_Category *cat;
470 E_Configure_Cat *ecat;
473 if (!(eco = data)) return;
475 if (eco->cat_list) evas_object_del(eco->cat_list);
476 if (eco->item_list) evas_object_del(eco->item_list);
477 eco->cat_list = NULL;
478 eco->item_list = NULL;
481 eco->cat_list = e_widget_toolbar_add(eco->evas, 32 * e_scale, 32 * e_scale);
482 e_widget_toolbar_scrollable_set(eco->cat_list, 1);
484 EINA_LIST_FOREACH(e_configure_registry, l, ecat)
486 if ((ecat->pri >= 0) && (ecat->items))
489 cat = _e_configure_category_add(eco, _(ecat->label),
490 ecat->icon_file, ecat->icon);
491 EINA_LIST_FOREACH(ecat->items, ll, eci)
498 snprintf(buf, sizeof(buf), "%s/%s", ecat->cat,
500 _e_configure_item_add(cat, _(eci->label),
501 eci->icon_file, eci->icon, buf);
504 if (sel && (ecat->cat == sel))
505 num = e_widget_toolbar_items_count(eco->cat_list) - 1;
508 e_widget_on_focus_hook_set(eco->cat_list, _e_configure_focus_cb, eco->win);
509 e_widget_list_object_append(eco->o_list, eco->cat_list, 1, 0, 0.5);
512 eco->item_list = e_widget_ilist_add(eco->evas, 32 * e_scale, 32 * e_scale, NULL);
513 e_widget_ilist_selector_set(eco->item_list, 1);
514 e_widget_ilist_go(eco->item_list);
515 e_widget_on_focus_hook_set(eco->item_list, _e_configure_focus_cb, eco->win);
516 e_widget_size_min_get(eco->item_list, &mw, &mh);
517 if (mw < (200 * e_scale)) mw = 200 * e_scale;
518 if (mh < (120 * e_scale)) mh = 120 * e_scale;
519 e_widget_size_min_set(eco->item_list, mw, mh);
520 e_widget_list_object_append(eco->o_list, eco->item_list, 1, 1, 0.5);
521 if (num != -1) e_widget_toolbar_item_select(eco->cat_list, num);
523 e_widget_size_min_get(eco->o_list, &mw, &mh);
524 edje_extern_object_min_size_set(eco->o_list, mw, mh);
528 _e_configure_module_update_cb(void *data, int type __UNUSED__, void *event __UNUSED__)
533 if (!(eco = data)) return ECORE_CALLBACK_PASS_ON;
534 if (!eco->cat_list) return ECORE_CALLBACK_PASS_ON;
535 sel = e_widget_toolbar_item_selected_get(eco->cat_list);
536 _e_configure_fill_cat_list(eco, NULL);
537 e_widget_toolbar_item_select(eco->cat_list, sel);
538 return ECORE_CALLBACK_PASS_ON;