3 #define TEXT_NO_PARAMS _("<None>")
4 #define EXAMPLE_STRING "example : "
5 #define E_BINDING_CONTEXT_NUMBER 10
7 #define TEXT_PRESS_MOUSE_BINIDING_SEQUENCE _("Please hold any modifier you want<br>" \
8 "and press any button on your mouse,<br> or roll a" \
9 " wheel, to assign mouse binding." \
10 "<br>Press <hilight>Escape</highlight> to abort.")
12 static void *_create_data(E_Config_Dialog *cfd);
13 static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
14 static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
15 static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
17 static void _fill_data(E_Config_Dialog_Data *cfdata);
18 static void _fill_actions_list(E_Config_Dialog_Data *cfdata);
20 /******************* Callbacks *************/
21 static void _binding_change_cb(void *data);
22 static void _action_change_cb(void *data);
23 static void _delete_mouse_binding_cb(void *data, void *data2);
24 static void _delete_all_mouse_binding_cb(void *data, void *data2);
25 static void _restore_mouse_binding_defaults_cb(void *data, void *data2);
26 static void _add_mouse_binding_cb(void *data, void *data2);
27 static void _modify_mouse_binding_cb(void *data, void *data2);
29 /******************* Updates *****************/
30 static void _update_action_list(E_Config_Dialog_Data *cfdata);
31 static void _update_action_params(E_Config_Dialog_Data *cfdata);
32 static void _update_mouse_binding_list(E_Config_Dialog_Data *cfdata);
33 static void _update_buttons(E_Config_Dialog_Data *cfdata);
34 static void _update_binding_context(E_Config_Dialog_Data *cfdata);
36 /****************** Helper *****************/
37 static void _find_key_binding_action(const char *action, const char *params, int *g, int *a, int *n);
38 static char *_helper_button_name_get(E_Config_Binding_Mouse *eb);
39 static char *_helper_wheel_name_get(E_Config_Binding_Wheel *bw);
40 static char *_helper_modifier_name_get(int mod);
41 static void _auto_apply_changes(E_Config_Dialog_Data *cfdata);
43 /********* Sorting ***************/
44 static int _mouse_binding_sort_cb(const void *d1, const void *d2);
45 static int _wheel_binding_sort_cb(const void *d1, const void *d2);
47 /********* grab window **********/
48 static void _grab_wnd_show(E_Config_Dialog_Data *cfdata);
49 static void _grab_wnd_hide(E_Config_Dialog_Data *cfdata);
50 static Eina_Bool _grab_mouse_down_cb(void *data, int type, void *event);
51 static Eina_Bool _grab_mouse_wheel_cb(void *data, int type, void *event);
52 static Eina_Bool _grab_key_down_cb(void *data, int type, void *event);
54 struct _E_Config_Dialog_Data
74 int add; /*just to distinguesh among two buttons add/modify */
77 Ecore_X_Window bind_win;
83 Evas_Object *o_binding_list;
84 Evas_Object *o_action_list;
85 Evas_Object *o_params;
88 Evas_Object *o_del_all;
90 Evas_Object *o_any, *o_border, *o_menu, *o_winlist, *o_popup, *o_zone,
91 *o_container, *o_manager, *o_none;
97 e_int_config_mousebindings(E_Container *con, const char *params __UNUSED__)
100 E_Config_Dialog_View *v;
102 if (e_config_dialog_find("E", "keyboard_and_mouse/mouse_bindings")) return NULL;
103 v = E_NEW(E_Config_Dialog_View, 1);
105 v->create_cfdata = _create_data;
106 v->free_cfdata = _free_data;
107 v->basic.apply_cfdata = _basic_apply_data;
108 v->basic.create_widgets = _basic_create_widgets;
109 v->override_auto_apply = 0;
111 cfd = e_config_dialog_new(con,
112 _("Mouse Bindings Settings"),
113 "E", "keyboard_and_mouse/mouse_bindings",
114 "preferences-desktop-mouse", 0, v, NULL);
119 _fill_data(E_Config_Dialog_Data *cfdata)
122 E_Config_Binding_Mouse *eb, *eb2;
123 E_Config_Binding_Wheel *bw, *bw2;
125 cfdata->locals.binding = eina_stringshare_add("");
126 cfdata->locals.action = eina_stringshare_add("");
127 cfdata->locals.params = strdup("");
128 cfdata->locals.context = E_BINDING_CONTEXT_ANY;
129 cfdata->binding.mouse = NULL;
130 cfdata->binding.wheel = NULL;
131 cfdata->locals.bind_win = 0;
132 cfdata->locals.handlers = NULL;
133 cfdata->locals.dia = NULL;
135 EINA_LIST_FOREACH(e_config->mouse_bindings, l, eb)
137 eb2 = E_NEW(E_Config_Binding_Mouse, 1);
138 eb2->context = eb->context;
139 eb2->button = eb->button;
140 eb2->modifiers = eb->modifiers;
141 eb2->any_mod = eb->any_mod;
142 eb2->action = !eb->action ? NULL : eina_stringshare_add(eb->action);
143 eb2->params = !eb->params ? NULL : eina_stringshare_add(eb->params);
145 cfdata->binding.mouse = eina_list_append(cfdata->binding.mouse, eb2);
148 EINA_LIST_FOREACH(e_config->wheel_bindings, l, bw)
150 bw2 = E_NEW(E_Config_Binding_Wheel, 1);
151 bw2->context = bw->context;
152 bw2->direction = bw->direction;
154 bw2->modifiers = bw->modifiers;
155 bw2->any_mod = bw->any_mod;
156 bw2->action = !bw->action ? NULL : eina_stringshare_add(bw->action);
157 bw2->params = !bw->params ? NULL : eina_stringshare_add(bw->params);
159 cfdata->binding.wheel = eina_list_append(cfdata->binding.wheel, bw2);
164 _create_data(E_Config_Dialog *cfd)
166 E_Config_Dialog_Data *cfdata;
168 cfdata = E_NEW(E_Config_Dialog_Data, 1);
176 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
178 E_Config_Binding_Mouse *eb;
179 E_Config_Binding_Wheel *bw;
181 EINA_LIST_FREE(cfdata->binding.mouse, eb)
183 eina_stringshare_del(eb->action);
184 eina_stringshare_del(eb->params);
188 EINA_LIST_FREE(cfdata->binding.wheel, bw)
190 eina_stringshare_del(bw->action);
191 eina_stringshare_del(bw->params);
195 eina_stringshare_del(cfdata->locals.binding);
196 eina_stringshare_del(cfdata->locals.action);
197 eina_stringshare_del(cfdata->locals.cur);
199 if (cfdata->locals.params) free(cfdata->locals.params);
204 _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
207 E_Config_Binding_Mouse *eb, *eb2;
208 E_Config_Binding_Wheel *bw, *bw2;
210 _auto_apply_changes(cfdata);
212 e_border_button_bindings_ungrab_all();
213 EINA_LIST_FREE(e_config->mouse_bindings, eb)
215 e_bindings_mouse_del(eb->context, eb->button, eb->modifiers, eb->any_mod,
216 eb->action, eb->params);
217 eina_stringshare_del(eb->action);
218 eina_stringshare_del(eb->params);
222 EINA_LIST_FOREACH(cfdata->binding.mouse, l, eb)
224 eb2 = E_NEW(E_Config_Binding_Mouse, 1);
225 eb2->context = eb->context;
226 eb2->button = eb->button;
227 eb2->modifiers = eb->modifiers;
228 eb2->any_mod = eb->any_mod;
229 eb2->action = !eb->action ? NULL : eina_stringshare_add(eb->action);
230 eb2->params = !eb->params ? NULL : eina_stringshare_add(eb->params);
232 e_config->mouse_bindings = eina_list_append(e_config->mouse_bindings, eb2);
233 e_bindings_mouse_add(eb2->context, eb2->button, eb2->modifiers, eb2->any_mod,
234 eb2->action, eb2->params);
237 EINA_LIST_FREE(e_config->wheel_bindings, bw)
239 e_bindings_wheel_del(bw->context, bw->direction, bw->z, bw->modifiers, bw->any_mod,
240 bw->action, bw->params);
241 eina_stringshare_del(bw->action);
242 eina_stringshare_del(bw->params);
246 EINA_LIST_FOREACH(cfdata->binding.wheel, l, bw)
248 bw2 = E_NEW(E_Config_Binding_Wheel, 1);
249 bw2->context = bw->context;
250 bw2->direction = bw->direction;
252 bw2->modifiers = bw->modifiers;
253 bw2->any_mod = bw->any_mod;
254 bw2->action = !bw->action ? NULL : eina_stringshare_add(bw->action);
255 bw2->params = !bw->params ? NULL : eina_stringshare_add(bw->params);
257 e_config->wheel_bindings = eina_list_append(e_config->wheel_bindings, bw2);
258 e_bindings_wheel_add(bw2->context, bw2->direction, bw2->z, bw2->modifiers,
259 bw2->any_mod, bw2->action, bw2->params);
261 e_border_button_bindings_grab_all();
263 e_config_save_queue();
268 _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
270 Evas_Object *o, *of, *ot, *ob;
274 o = e_widget_list_add(evas, 0, 1);
275 ot = e_widget_frametable_add(evas, _("Mouse Bindings"), 0);
276 ob = e_widget_ilist_add(evas, 32, 32, &(cfdata->locals.binding));
277 cfdata->gui.o_binding_list = ob;
278 e_widget_size_min_set(ob, 200, 200);
279 e_widget_frametable_object_append(ot, ob, 0, 0, 2, 1, 1, 1, 1, 1);
281 ob = e_widget_button_add(evas, _("Add Binding"), NULL, _add_mouse_binding_cb, cfdata, NULL);
282 e_widget_frametable_object_append(ot, ob, 0, 1, 1, 1, 1, 0, 1, 0);
283 ob = e_widget_button_add(evas, _("Delete Binding"), NULL, _delete_mouse_binding_cb, cfdata, NULL);
284 cfdata->gui.o_del = ob;
285 e_widget_disabled_set(ob, 1);
286 e_widget_frametable_object_append(ot, ob, 1, 1, 1, 1, 1, 0, 1, 0);
287 ob = e_widget_button_add(evas, _("Modify Binding"), NULL, _modify_mouse_binding_cb, cfdata, NULL);
288 cfdata->gui.o_mod = ob;
289 e_widget_disabled_set(ob, 1);
290 e_widget_frametable_object_append(ot, ob, 0, 2, 1, 1, 1, 0, 1, 0);
291 ob = e_widget_button_add(evas, _("Delete All"), NULL, _delete_all_mouse_binding_cb, cfdata, NULL);
292 cfdata->gui.o_del_all = ob;
293 e_widget_disabled_set(ob, 1);
294 e_widget_frametable_object_append(ot, ob, 1, 2, 1, 1, 1, 0, 1, 0);
295 ob = e_widget_button_add(evas, _("Restore Default Bindings"), "enlightenment",
296 _restore_mouse_binding_defaults_cb, cfdata, NULL);
297 e_widget_frametable_object_append(ot, ob, 0, 3, 2, 1, 1, 0, 1, 0);
298 e_widget_list_object_append(o, ot, 1, 1, 0.5);
300 ot = e_widget_table_add(evas, 0);
301 of = e_widget_framelist_add(evas, _("Action"), 0);
302 ob = e_widget_ilist_add(evas, 24, 24, &(cfdata->locals.action));
303 cfdata->gui.o_action_list = ob;
304 e_widget_size_min_set(ob, 200, 200);
305 e_widget_framelist_object_append(of, ob);
306 e_widget_table_object_append(ot, of, 0, 0, 3, 1, 1, 1, 1, 1);
308 of = e_widget_framelist_add(evas, _("Action Params"), 0);
309 ob = e_widget_entry_add(evas, &(cfdata->locals.params), NULL, NULL, NULL);
310 e_widget_disabled_set(ob, 1);
311 cfdata->gui.o_params = ob;
312 e_widget_framelist_object_append(of, ob);
313 e_widget_table_object_append(ot, of, 0, 1, 3, 1, 1, 1, 1, 0);
315 of = e_widget_frametable_add(evas, _("Action Context"), 1);
316 rg = e_widget_radio_group_new(&(cfdata->locals.context));
317 ob = e_widget_radio_add(evas, _("Any"), E_BINDING_CONTEXT_ANY, rg);
318 cfdata->gui.context.o_any = ob;
319 e_widget_disabled_set(ob, 1);
320 e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 1);
321 ob = e_widget_radio_add(evas, _("Border"), E_BINDING_CONTEXT_BORDER, rg);
322 cfdata->gui.context.o_border = ob;
323 e_widget_disabled_set(ob, 1);
324 e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 1, 1, 1);
325 ob = e_widget_radio_add(evas, _("Menu"), E_BINDING_CONTEXT_MENU, rg);
326 cfdata->gui.context.o_menu = ob;
327 e_widget_disabled_set(ob, 1);
328 e_widget_frametable_object_append(of, ob, 0, 2, 1, 1, 1, 1, 1, 1);
329 ob = e_widget_radio_add(evas, _("Win List"), E_BINDING_CONTEXT_WINLIST, rg);
330 cfdata->gui.context.o_winlist = ob;
331 e_widget_disabled_set(ob, 1);
332 e_widget_frametable_object_append(of, ob, 1, 0, 1, 1, 1, 1, 1, 1);
333 ob = e_widget_radio_add(evas, _("Popup"), E_BINDING_CONTEXT_POPUP, rg);
334 cfdata->gui.context.o_popup = ob;
335 e_widget_disabled_set(ob, 1);
336 e_widget_frametable_object_append(of, ob, 1, 1, 1, 1, 1, 1, 1, 1);
337 ob = e_widget_radio_add(evas, _("Zone"), E_BINDING_CONTEXT_ZONE, rg);
338 cfdata->gui.context.o_zone = ob;
339 e_widget_disabled_set(ob, 1);
340 e_widget_frametable_object_append(of, ob, 1, 2, 1, 1, 1, 1, 1, 1);
341 ob = e_widget_radio_add(evas, _("Container"), E_BINDING_CONTEXT_CONTAINER, rg);
342 cfdata->gui.context.o_container = ob;
343 e_widget_disabled_set(ob, 1);
344 e_widget_frametable_object_append(of, ob, 2, 0, 1, 1, 1, 1, 1, 1);
345 ob = e_widget_radio_add(evas, _("Manager"), E_BINDING_CONTEXT_MANAGER, rg);
346 cfdata->gui.context.o_manager = ob;
347 e_widget_disabled_set(ob, 1);
348 e_widget_frametable_object_append(of, ob, 2, 1, 1, 1, 1, 1, 1, 1);
349 ob = e_widget_radio_add(evas, _("None"), E_BINDING_CONTEXT_NONE, rg);
350 cfdata->gui.context.o_none = ob;
351 e_widget_disabled_set(ob, 1);
352 e_widget_frametable_object_append(of, ob, 2, 2, 1, 1, 1, 1, 1, 1);
353 e_widget_table_object_append(ot, of, 0, 2, 3, 1, 1, 1, 1, 0);
354 e_widget_list_object_append(o, ot, 1, 1, 0.5);
356 _update_mouse_binding_list(cfdata);
357 _fill_actions_list(cfdata);
359 e_dialog_resizable_set(cfd->dia, 1);
364 _fill_actions_list(E_Config_Dialog_Data *cfdata)
368 E_Action_Group *actg;
369 E_Action_Description *actd;
372 evas_event_freeze(evas_object_evas_get(cfdata->gui.o_action_list));
374 e_widget_ilist_freeze(cfdata->gui.o_action_list);
376 e_widget_ilist_clear(cfdata->gui.o_action_list);
377 for (l = e_action_groups_get(), g = 0; l; l = l->next, g++)
381 if (!actg->acts) continue;
383 e_widget_ilist_header_append(cfdata->gui.o_action_list, NULL, _(actg->act_grp));
385 for (l2 = actg->acts, a = 0; l2; l2 = l2->next, a++)
389 snprintf(buf, sizeof(buf), "%d %d", g, a);
390 e_widget_ilist_append(cfdata->gui.o_action_list, NULL, _(actd->act_name),
391 _action_change_cb, cfdata, buf);
394 e_widget_ilist_go(cfdata->gui.o_action_list);
395 e_widget_ilist_thaw(cfdata->gui.o_action_list);
397 evas_event_thaw(evas_object_evas_get(cfdata->gui.o_action_list));
400 /******************* Callbacks *************/
402 _add_mouse_binding_cb(void *data, void *data2 __UNUSED__)
404 E_Config_Dialog_Data *cfdata;
407 _auto_apply_changes(cfdata);
409 cfdata->locals.add = 1;
410 _grab_wnd_show(cfdata);
414 _modify_mouse_binding_cb(void *data, void *data2 __UNUSED__)
416 E_Config_Dialog_Data *cfdata;
419 _auto_apply_changes(cfdata);
421 cfdata->locals.add = 0;
422 _grab_wnd_show(cfdata);
426 _action_change_cb(void *data)
428 E_Config_Dialog_Data *cfdata;
431 _update_action_params(cfdata);
435 _binding_change_cb(void *data)
437 E_Config_Dialog_Data *cfdata;
441 _auto_apply_changes(cfdata);
443 eina_stringshare_del(cfdata->locals.cur);
444 cfdata->locals.cur = NULL;
446 if (cfdata->locals.binding[0])
447 cfdata->locals.cur = eina_stringshare_ref(cfdata->locals.binding);
449 _update_buttons(cfdata);
450 _update_action_list(cfdata);
451 _update_binding_context(cfdata);
455 _delete_all_mouse_binding_cb(void *data, void *data2 __UNUSED__)
457 E_Config_Dialog_Data *cfdata;
458 E_Config_Binding_Mouse *eb;
459 E_Config_Binding_Wheel *bw;
463 /* FIXME: need confirmation dialog */
464 EINA_LIST_FREE(cfdata->binding.mouse, eb)
466 eina_stringshare_del(eb->action);
467 eina_stringshare_del(eb->params);
471 EINA_LIST_FREE(cfdata->binding.wheel, bw)
473 eina_stringshare_del(bw->action);
474 eina_stringshare_del(bw->params);
478 eina_stringshare_del(cfdata->locals.cur);
479 cfdata->locals.cur = NULL;
481 e_widget_ilist_clear(cfdata->gui.o_binding_list);
482 e_widget_ilist_go(cfdata->gui.o_binding_list);
483 e_widget_ilist_unselect(cfdata->gui.o_action_list);
484 e_widget_entry_clear(cfdata->gui.o_params);
485 e_widget_disabled_set(cfdata->gui.o_params, 1);
487 _update_buttons(cfdata);
488 _update_binding_context(cfdata);
492 _delete_mouse_binding_cb(void *data, void *data2 __UNUSED__)
496 E_Config_Dialog_Data *cfdata;
497 E_Config_Binding_Mouse *eb;
498 E_Config_Binding_Wheel *bw;
502 sel = e_widget_ilist_selected_get(cfdata->gui.o_binding_list);
503 if (cfdata->locals.binding[0] == 'm')
505 sscanf(cfdata->locals.binding, "m%d", &n);
506 l = eina_list_nth_list(cfdata->binding.mouse, n);
509 eb = eina_list_data_get(l);
510 eina_stringshare_del(eb->action);
511 eina_stringshare_del(eb->params);
514 cfdata->binding.mouse = eina_list_remove_list(cfdata->binding.mouse, l);
517 else if (cfdata->locals.binding[0] == 'w')
519 sscanf(cfdata->locals.binding, "w%d", &n);
520 l = eina_list_nth_list(cfdata->binding.wheel, n);
523 bw = eina_list_data_get(l);
524 eina_stringshare_del(bw->action);
525 eina_stringshare_del(bw->params);
528 cfdata->binding.wheel = eina_list_remove_list(cfdata->binding.wheel, l);
534 _update_mouse_binding_list(cfdata);
535 if (sel >= e_widget_ilist_count(cfdata->gui.o_binding_list))
536 sel = e_widget_ilist_count(cfdata->gui.o_binding_list) - 1;
538 eina_stringshare_del(cfdata->locals.cur);
539 cfdata->locals.cur = NULL;
541 if (!e_widget_ilist_count(cfdata->gui.o_binding_list))
543 _update_binding_context(cfdata);
544 _update_buttons(cfdata);
546 e_widget_ilist_unselect(cfdata->gui.o_action_list);
547 e_widget_entry_clear(cfdata->gui.o_params);
548 e_widget_disabled_set(cfdata->gui.o_params, 1);
552 if (e_widget_ilist_nth_is_header(cfdata->gui.o_binding_list, sel)) sel++;
553 e_widget_ilist_selected_set(cfdata->gui.o_binding_list, sel);
554 e_widget_ilist_nth_show(cfdata->gui.o_binding_list, sel, 0);
559 _restore_mouse_binding_defaults_cb(void *data, void *data2 __UNUSED__)
561 E_Config_Binding_Mouse *eb;
562 E_Config_Binding_Wheel *bw;
563 E_Config_Dialog_Data *cfdata;
567 EINA_LIST_FREE(cfdata->binding.mouse, eb)
569 eina_stringshare_del(eb->action);
570 eina_stringshare_del(eb->params);
574 EINA_LIST_FREE(cfdata->binding.wheel, bw)
576 if (bw->action) eina_stringshare_del(bw->action);
577 if (bw->params) eina_stringshare_del(bw->params);
580 #define CFG_MOUSEBIND_DFLT(_context, _button, _modifiers, _anymod, _action, _params) \
581 eb = E_NEW(E_Config_Binding_Mouse, 1); \
582 eb->context = _context; \
583 eb->button = _button; \
584 eb->modifiers = _modifiers; \
585 eb->any_mod = _anymod; \
586 eb->action = _action == NULL ? NULL : eina_stringshare_add(_action); \
587 eb->params = _params == NULL ? NULL : eina_stringshare_add(_params); \
588 cfdata->binding.mouse = eina_list_append(cfdata->binding.mouse, eb)
590 CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_BORDER, 1, E_BINDING_MODIFIER_ALT, 0, "window_move", NULL);
591 CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_BORDER, 2, E_BINDING_MODIFIER_ALT, 0, "window_resize", NULL);
592 CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_BORDER, 3, E_BINDING_MODIFIER_ALT, 0, "window_menu", NULL);
593 CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_ZONE, 1, 0, 0, "menu_show", "main");
594 CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_ZONE, 2, 0, 0, "menu_show", "clients");
595 CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_ZONE, 3, 0, 0, "menu_show", "favorites");
597 #define CFG_WHEELBIND_DFLT(_context, _direction, _z, _modifiers, _anymod, _action, _params) \
598 bw = E_NEW(E_Config_Binding_Wheel, 1); \
599 bw->context = _context; \
600 bw->direction = _direction; \
602 bw->modifiers = _modifiers; \
603 bw->any_mod = _anymod; \
604 bw->action = _action == NULL ? NULL : eina_stringshare_add(_action); \
605 bw->params = _params == NULL ? NULL : eina_stringshare_add(_params); \
606 cfdata->binding.wheel = eina_list_append(cfdata->binding.wheel, bw)
608 CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 0, -1, E_BINDING_MODIFIER_ALT, 0,
609 "desk_linear_flip_by", "-1");
610 CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 1, -1, E_BINDING_MODIFIER_ALT, 0,
611 "desk_linear_flip_by", "-1");
612 CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 0, 1, E_BINDING_MODIFIER_ALT, 0,
613 "desk_linear_flip_by", "1");
614 CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 1, 1, E_BINDING_MODIFIER_ALT, 0,
615 "desk_linear_flip_by", "1");
616 CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_BORDER, 0, -1, E_BINDING_MODIFIER_ALT, 0,
617 "desk_linear_flip_by", "-1");
618 CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_BORDER, 1, -1, E_BINDING_MODIFIER_ALT, 0,
619 "desk_linear_flip_by", "-1");
620 CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_BORDER, 0, 1, E_BINDING_MODIFIER_ALT, 0,
621 "desk_linear_flip_by", "1");
622 CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_BORDER, 1, 1, E_BINDING_MODIFIER_ALT, 0,
623 "desk_linear_flip_by", "1");
625 eina_stringshare_del(cfdata->locals.cur);
626 cfdata->locals.cur = NULL;
628 _update_mouse_binding_list(cfdata);
629 _update_buttons(cfdata);
630 _update_binding_context(cfdata);
632 e_widget_ilist_unselect(cfdata->gui.o_action_list);
633 e_widget_entry_clear(cfdata->gui.o_params);
634 e_widget_disabled_set(cfdata->gui.o_params, 1);
637 /******************* Updates *****************/
639 _update_action_list(E_Config_Dialog_Data *cfdata)
641 E_Config_Binding_Mouse *eb;
642 E_Config_Binding_Wheel *bw;
643 const char *action, *params;
646 if (!cfdata->locals.cur) return;
648 if (cfdata->locals.cur[0] == 'm')
650 sscanf(cfdata->locals.cur, "m%d", &n);
651 eb = eina_list_nth(cfdata->binding.mouse, n);
654 e_widget_ilist_unselect(cfdata->gui.o_action_list);
655 e_widget_entry_clear(cfdata->gui.o_params);
656 e_widget_disabled_set(cfdata->gui.o_params, 1);
662 else if (cfdata->locals.cur[0] == 'w')
664 sscanf(cfdata->locals.cur, "w%d", &n);
665 bw = eina_list_nth(cfdata->binding.wheel, n);
668 e_widget_ilist_unselect(cfdata->gui.o_action_list);
669 e_widget_entry_clear(cfdata->gui.o_params);
670 e_widget_disabled_set(cfdata->gui.o_params, 1);
679 _find_key_binding_action(action, params, NULL, NULL, &j);
682 for (i = 0; i < e_widget_ilist_count(cfdata->gui.o_action_list); i++)
685 if (e_widget_ilist_nth_is_header(cfdata->gui.o_action_list, i)) j++;
691 if (j == e_widget_ilist_selected_get(cfdata->gui.o_action_list))
692 _update_action_params(cfdata);
694 e_widget_ilist_selected_set(cfdata->gui.o_action_list, j);
698 e_widget_ilist_unselect(cfdata->gui.o_action_list);
699 eina_stringshare_del(cfdata->locals.action);
700 cfdata->locals.action = eina_stringshare_add("");
701 e_widget_entry_clear(cfdata->gui.o_params);
706 _update_mouse_binding_list(E_Config_Dialog_Data *cfdata)
708 char *icon = NULL, *button, *mods;
709 char label[1024], val[10];
712 E_Config_Binding_Mouse *eb;
713 E_Config_Binding_Wheel *bw;
715 evas_event_freeze(evas_object_evas_get(cfdata->gui.o_binding_list));
717 e_widget_ilist_freeze(cfdata->gui.o_binding_list);
719 e_widget_ilist_clear(cfdata->gui.o_binding_list);
721 if (cfdata->binding.mouse)
723 cfdata->binding.mouse = eina_list_sort(cfdata->binding.mouse,
724 eina_list_count(cfdata->binding.mouse), _mouse_binding_sort_cb);
726 e_widget_ilist_header_append(cfdata->gui.o_binding_list, NULL, "Mouse Buttons");
729 EINA_LIST_FOREACH(cfdata->binding.mouse, l, eb)
733 button = _helper_button_name_get(eb);
734 mods = _helper_modifier_name_get(eb->modifiers);
737 snprintf(label, sizeof(label), "%s + %s", button ? button : "", mods);
739 snprintf(label, sizeof(label), "%s", button ? button : "");
740 if (button) free(button);
741 if (mods) free(mods);
746 icon = "preferences-desktop-mouse-left";
749 icon = "preferences-desktop-mouse-middle";
752 icon = "preferences-desktop-mouse-right";
755 icon = "preferences-desktop-mouse-extra";
758 snprintf(val, sizeof(val), "m%d", i);
760 ic = e_icon_add(cfdata->evas);
761 e_util_icon_theme_set(ic, icon);
762 e_widget_ilist_append(cfdata->gui.o_binding_list, ic, label, _binding_change_cb,
768 if (cfdata->binding.wheel)
770 cfdata->binding.wheel = eina_list_sort(cfdata->binding.wheel,
771 eina_list_count(cfdata->binding.wheel), _wheel_binding_sort_cb);
773 e_widget_ilist_header_append(cfdata->gui.o_binding_list, NULL, "Mouse Wheels");
777 EINA_LIST_FOREACH(cfdata->binding.wheel, l, bw)
781 button = _helper_wheel_name_get(bw);
782 mods = _helper_modifier_name_get(bw->modifiers);
785 snprintf(label, sizeof(label), "%s + %s", button ? button : "", mods);
787 snprintf(label, sizeof(label), "%s", button ? button : "");
788 if (button) free(button);
789 if (mods) free(mods);
791 snprintf(val, sizeof(val), "w%d", i);
793 ic = e_icon_add(cfdata->evas);
794 e_util_icon_theme_set(ic, "preferences-desktop-mouse-wheel");
795 e_widget_ilist_append(cfdata->gui.o_binding_list, ic, label, _binding_change_cb,
801 e_widget_ilist_go(cfdata->gui.o_binding_list);
802 e_widget_ilist_thaw(cfdata->gui.o_binding_list);
804 evas_event_thaw(evas_object_evas_get(cfdata->gui.o_binding_list));
806 if (eina_list_count(cfdata->binding.mouse) + eina_list_count(cfdata->binding.wheel))
807 e_widget_disabled_set(cfdata->gui.o_del_all, 0);
809 e_widget_disabled_set(cfdata->gui.o_del_all, 1);
813 _update_action_params(E_Config_Dialog_Data *cfdata)
816 E_Action_Group *actg;
817 E_Action_Description *actd;
818 E_Config_Binding_Mouse *eb;
819 E_Config_Binding_Wheel *bw;
820 const char *action, *params;
822 #define MB_EXAMPLE_PARAMS \
823 if ((!actd->param_example) || (!actd->param_example[0])) \
824 e_widget_entry_text_set(cfdata->gui.o_params, TEXT_NO_PARAMS); \
826 e_widget_entry_text_set(cfdata->gui.o_params, actd->param_example)
828 if ((!cfdata->locals.action) || (!cfdata->locals.action[0]))
830 e_widget_disabled_set(cfdata->gui.o_params, 1);
831 e_widget_entry_clear(cfdata->gui.o_params);
833 sscanf(cfdata->locals.action, "%d %d", &g, &a);
835 actg = eina_list_nth(e_action_groups_get(), g);
837 actd = eina_list_nth(actg->acts, a);
840 if (actd->act_params)
842 e_widget_disabled_set(cfdata->gui.o_params, 1);
843 e_widget_entry_text_set(cfdata->gui.o_params, actd->act_params);
847 if ((!cfdata->locals.cur) || (!cfdata->locals.cur[0]))
849 e_widget_disabled_set(cfdata->gui.o_params, 1);
855 e_widget_disabled_set(cfdata->gui.o_params, 1);
857 e_widget_disabled_set(cfdata->gui.o_params, 0);
859 if (cfdata->locals.cur[0] == 'm')
861 sscanf(cfdata->locals.cur, "m%d", &b);
862 eb = eina_list_nth(cfdata->binding.mouse, b);
865 e_widget_disabled_set(cfdata->gui.o_params, 1);
872 else if (cfdata->locals.cur[0] == 'w')
874 sscanf(cfdata->locals.cur, "w%d", &b);
875 bw = eina_list_nth(cfdata->binding.wheel, b);
878 e_widget_disabled_set(cfdata->gui.o_params, 1);
887 e_widget_disabled_set(cfdata->gui.o_params, 1);
894 if (!strcmp(action, actd->act_cmd))
896 if ((!params) || (!params[0]))
899 e_widget_entry_text_set(cfdata->gui.o_params, params);
909 _update_buttons(E_Config_Dialog_Data *cfdata)
911 if (e_widget_ilist_count(cfdata->gui.o_binding_list))
912 e_widget_disabled_set(cfdata->gui.o_del_all, 0);
914 e_widget_disabled_set(cfdata->gui.o_del_all, 1);
916 if (!cfdata->locals.cur)
918 e_widget_disabled_set(cfdata->gui.o_mod, 1);
919 e_widget_disabled_set(cfdata->gui.o_del, 1);
923 e_widget_disabled_set(cfdata->gui.o_mod, 0);
924 e_widget_disabled_set(cfdata->gui.o_del, 0);
928 _update_binding_context(E_Config_Dialog_Data *cfdata)
931 E_Config_Binding_Mouse *eb;
932 E_Config_Binding_Wheel *bw;
933 E_Binding_Context ctxt;
935 /* disable all the radios. */
936 e_widget_radio_toggle_set(cfdata->gui.context.o_any, 1);
937 e_widget_disabled_set(cfdata->gui.context.o_any, 1);
938 e_widget_disabled_set(cfdata->gui.context.o_border, 1);
939 e_widget_disabled_set(cfdata->gui.context.o_menu, 1);
940 e_widget_disabled_set(cfdata->gui.context.o_winlist, 1);
941 e_widget_disabled_set(cfdata->gui.context.o_popup, 1);
942 e_widget_disabled_set(cfdata->gui.context.o_zone, 1);
943 e_widget_disabled_set(cfdata->gui.context.o_container, 1);
944 e_widget_disabled_set(cfdata->gui.context.o_manager, 1);
945 e_widget_disabled_set(cfdata->gui.context.o_none, 1);
947 if (!cfdata->locals.cur) return;
949 if (cfdata->locals.cur[0] == 'm')
951 sscanf(cfdata->locals.cur, "m%d", &n);
952 eb = eina_list_nth(cfdata->binding.mouse, n);
956 else if (cfdata->locals.cur[0] == 'w')
958 sscanf(cfdata->locals.cur, "w%d", &n);
959 bw = eina_list_nth(cfdata->binding.wheel, n);
966 e_widget_disabled_set(cfdata->gui.context.o_any, 0);
967 e_widget_disabled_set(cfdata->gui.context.o_border, 0);
968 e_widget_disabled_set(cfdata->gui.context.o_menu, 0);
969 e_widget_disabled_set(cfdata->gui.context.o_winlist, 0);
970 e_widget_disabled_set(cfdata->gui.context.o_popup, 0);
971 e_widget_disabled_set(cfdata->gui.context.o_zone, 0);
972 e_widget_disabled_set(cfdata->gui.context.o_container, 0);
973 e_widget_disabled_set(cfdata->gui.context.o_manager, 0);
974 e_widget_disabled_set(cfdata->gui.context.o_none, 0);
976 if (ctxt == E_BINDING_CONTEXT_ANY)
977 e_widget_radio_toggle_set(cfdata->gui.context.o_any, 1);
978 else if (ctxt == E_BINDING_CONTEXT_BORDER)
979 e_widget_radio_toggle_set(cfdata->gui.context.o_border, 1);
980 else if (ctxt == E_BINDING_CONTEXT_MENU)
981 e_widget_radio_toggle_set(cfdata->gui.context.o_menu, 1);
982 else if (ctxt == E_BINDING_CONTEXT_WINLIST)
983 e_widget_radio_toggle_set(cfdata->gui.context.o_winlist, 1);
984 else if (ctxt == E_BINDING_CONTEXT_POPUP)
985 e_widget_radio_toggle_set(cfdata->gui.context.o_popup, 1);
986 else if (ctxt == E_BINDING_CONTEXT_ZONE)
987 e_widget_radio_toggle_set(cfdata->gui.context.o_zone, 1);
988 else if (ctxt == E_BINDING_CONTEXT_CONTAINER)
989 e_widget_radio_toggle_set(cfdata->gui.context.o_container, 1);
990 else if (ctxt == E_BINDING_CONTEXT_MANAGER)
991 e_widget_radio_toggle_set(cfdata->gui.context.o_manager, 1);
992 else if (ctxt == E_BINDING_CONTEXT_NONE)
993 e_widget_radio_toggle_set(cfdata->gui.context.o_none, 1);
996 /****************** Helper *****************/
998 _auto_apply_changes(E_Config_Dialog_Data *cfdata)
1001 E_Config_Binding_Mouse *eb = NULL;
1002 E_Config_Binding_Wheel *bw = NULL;
1004 E_Action_Group *actg;
1005 E_Action_Description *actd;
1006 const char **action = NULL, **params = NULL;
1008 if ((!cfdata->locals.cur) || (!cfdata->locals.cur[0])) return;
1010 if (cfdata->locals.cur[0] == 'm')
1012 sscanf(cfdata->locals.cur, "m%d", &n);
1013 eb = eina_list_nth(cfdata->binding.mouse, n);
1016 eb->context = cfdata->locals.context;
1017 action = &(eb->action);
1018 params = &(eb->params);
1020 else if (cfdata->locals.cur[0] == 'w')
1022 sscanf(cfdata->locals.cur, "w%d", &n);
1023 bw = eina_list_nth(cfdata->binding.wheel, n);
1026 bw->context = cfdata->locals.context;
1027 action = &(bw->action);
1028 params = &(bw->params);
1032 if (action && *action) eina_stringshare_del(*action);
1033 if (params && *params) eina_stringshare_del(*params);
1034 if (action) *action = NULL;
1035 if (params) *params = NULL;
1037 if ((!cfdata->locals.action) || (!cfdata->locals.action[0])) return;
1039 sscanf(cfdata->locals.action, "%d %d", &g, &a);
1041 actg = eina_list_nth(e_action_groups_get(), g);
1043 actd = eina_list_nth(actg->acts, a);
1046 if (actd->act_cmd) *action = eina_stringshare_add(actd->act_cmd);
1047 if (actd->act_params)
1048 *params = eina_stringshare_add(actd->act_params);
1052 if (cfdata->locals.params)
1054 if (!strcmp(cfdata->locals.params, TEXT_NO_PARAMS)) ok = 0;
1056 if ((actd->param_example) && (!strcmp(cfdata->locals.params, actd->param_example)))
1063 *params = eina_stringshare_add(cfdata->locals.params);
1068 _find_key_binding_action(const char *action, const char *params, int *g, int *a, int *n)
1071 int gg = -1, aa = -1, nn = -1, found;
1072 E_Action_Group *actg;
1073 E_Action_Description *actd;
1080 for (l = e_action_groups_get(), gg = 0, nn = 0; l; l = l->next, gg++)
1084 for (l2 = actg->acts, aa = 0; l2; l2 = l2->next, aa++)
1088 if (!strcmp((!action ? "" : action), (!actd->act_cmd ? "" : actd->act_cmd)))
1090 if (!params || !params[0])
1092 if ((!actd->act_params) || (!actd->act_params[0]))
1104 if ((!actd->act_params) || (!actd->act_params[0]))
1113 if (!strcmp(params, actd->act_params))
1137 _helper_button_name_get(E_Config_Binding_Mouse *eb)
1145 name = strdup("Left Button");
1148 name = strdup("Middle Button");
1151 name = strdup("Right Button");
1159 snprintf(buf, sizeof(buf), "Extra Button (%d)", eb->button);
1166 _helper_wheel_name_get(E_Config_Binding_Wheel *bw)
1169 char buf[1024] = "";
1171 switch (bw->direction)
1175 name = strdup("Mouse Wheel Up");
1177 name = strdup("Mouse Wheel Down");
1181 snprintf(buf, sizeof(buf), "Extra Wheel (%d) Up", bw->direction);
1183 snprintf(buf, sizeof(buf), "Extra Wheel (%d) Down", bw->direction);
1190 _helper_modifier_name_get(int mod)
1192 char mods[1024] = "";
1194 if (mod & E_BINDING_MODIFIER_SHIFT)
1195 snprintf(mods, sizeof(mods), "SHIFT");
1197 if (mod & E_BINDING_MODIFIER_CTRL)
1199 if (mods[0]) strcat(mods, " + ");
1200 strcat(mods, "CTRL");
1203 if (mod & E_BINDING_MODIFIER_ALT)
1205 if (mods[0]) strcat(mods, " + ");
1206 strcat(mods, "ALT");
1209 if (mod & E_BINDING_MODIFIER_WIN)
1211 if (mods[0]) strcat(mods, " + ");
1212 strcat(mods, "WIN");
1215 return strdup(mods);
1218 /********* Sorting ***************/
1220 _mouse_binding_sort_cb(const void *d1, const void *d2)
1222 const E_Config_Binding_Mouse *eb, *eb2;
1227 if (eb->button < eb2->button) return -1;
1228 else if (eb->button > eb2->button) return 1;
1231 if (eb->modifiers < eb2->modifiers) return -1;
1232 else if (eb->modifiers > eb2->modifiers) return 1;
1238 _wheel_binding_sort_cb(const void *d1, const void *d2)
1240 const E_Config_Binding_Wheel *bw, *bw2;
1245 if (bw->direction < bw2->direction) return -1;
1246 else if (bw->direction > bw2->direction) return 1;
1249 if ((bw->z < 0) && (bw2->z > 0)) return 1;
1250 else if ((bw->z > 0) && (bw2->z < 0)) return -1;
1251 else if (((bw->z < 0) && (bw2->z < 0)) ||
1252 ((bw->z > 0) && (bw2->z > 0)))
1254 if (bw->modifiers < bw2->modifiers) return -1;
1255 else if (bw->modifiers > bw2->modifiers) return 1;
1262 _grab_wnd_show(E_Config_Dialog_Data *cfdata)
1266 if (cfdata->locals.bind_win != 0) return;
1268 man = e_manager_current_get();
1270 cfdata->locals.dia = e_dialog_new(e_container_current_get(man),
1271 "E", "_mousebind_getmouse_dialog");
1272 if (!cfdata->locals.dia) return;
1273 e_dialog_title_set(cfdata->locals.dia, _("Mouse Binding Sequence"));
1274 e_dialog_icon_set(cfdata->locals.dia, "preferences-desktop-mouse", 48);
1275 e_dialog_text_set(cfdata->locals.dia, TEXT_PRESS_MOUSE_BINIDING_SEQUENCE);
1276 e_win_centered_set(cfdata->locals.dia->win, 1);
1277 e_win_borderless_set(cfdata->locals.dia->win, 1);
1279 cfdata->locals.bind_win = ecore_x_window_input_new(man->root, 0, 0,
1281 ecore_x_window_show(cfdata->locals.bind_win);
1282 e_grabinput_get(cfdata->locals.bind_win, 0, cfdata->locals.bind_win);
1284 cfdata->locals.handlers = eina_list_append(cfdata->locals.handlers,
1285 ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
1286 _grab_key_down_cb, cfdata));
1288 cfdata->locals.handlers = eina_list_append(cfdata->locals.handlers,
1289 ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
1290 _grab_mouse_down_cb, cfdata));
1292 cfdata->locals.handlers = eina_list_append(cfdata->locals.handlers,
1293 ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL,
1294 _grab_mouse_wheel_cb, cfdata));
1296 e_dialog_show(cfdata->locals.dia);
1297 ecore_x_icccm_transient_for_set(cfdata->locals.dia->win->evas_win, cfdata->cfd->dia->win->evas_win);
1301 _grab_wnd_hide(E_Config_Dialog_Data *cfdata)
1303 while (cfdata->locals.handlers)
1305 ecore_event_handler_del(cfdata->locals.handlers->data);
1306 cfdata->locals.handlers =
1307 eina_list_remove_list(cfdata->locals.handlers, cfdata->locals.handlers);
1309 cfdata->locals.handlers = NULL;
1310 e_grabinput_release(cfdata->locals.bind_win, cfdata->locals.bind_win);
1311 ecore_x_window_free(cfdata->locals.bind_win);
1312 cfdata->locals.bind_win = 0;
1314 e_object_del(E_OBJECT(cfdata->locals.dia));
1315 cfdata->locals.dia = NULL;
1319 _grab_mouse_down_cb(void *data, __UNUSED__ int type, void *event)
1322 E_Config_Dialog_Data *cfdata;
1323 E_Config_Binding_Mouse *eb = NULL;
1324 E_Config_Binding_Wheel *bw;
1325 int mod = E_BINDING_MODIFIER_NONE, n;
1327 Ecore_Event_Mouse_Button *ev;
1332 if (ev->window != cfdata->locals.bind_win) return ECORE_CALLBACK_PASS_ON;
1334 if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)
1335 mod |= E_BINDING_MODIFIER_SHIFT;
1336 if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)
1337 mod |= E_BINDING_MODIFIER_CTRL;
1338 if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT)
1339 mod |= E_BINDING_MODIFIER_ALT;
1340 if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN)
1341 mod |= E_BINDING_MODIFIER_WIN;
1343 if (cfdata->locals.add)
1345 eb = E_NEW(E_Config_Binding_Mouse, 1);
1346 eb->context = E_BINDING_CONTEXT_ANY;
1347 eb->button = ev->buttons;
1348 eb->modifiers = mod;
1353 cfdata->binding.mouse = eina_list_append(cfdata->binding.mouse, eb);
1357 if (cfdata->locals.cur[0] == 'm')
1359 sscanf(cfdata->locals.cur, "m%d", &n);
1360 eb = eina_list_nth(cfdata->binding.mouse, n);
1363 eb->button = ev->buttons;
1364 eb->modifiers = mod;
1367 else if (cfdata->locals.cur[0] == 'w')
1369 sscanf(cfdata->locals.cur, "w%d", &n);
1370 l = eina_list_nth_list(cfdata->binding.wheel, n);
1371 bw = eina_list_data_get(l);
1373 eb = E_NEW(E_Config_Binding_Mouse, 1);
1374 eb->context = bw->context;
1375 eb->button = ev->buttons;
1376 eb->modifiers = mod;
1378 eb->action = bw->action;
1379 eb->params = bw->params;
1381 cfdata->binding.mouse = eina_list_append(cfdata->binding.mouse, eb);
1386 cfdata->binding.wheel = eina_list_remove_list(cfdata->binding.wheel, l);
1389 _update_mouse_binding_list(cfdata);
1391 if (cfdata->locals.add)
1393 for (l = cfdata->binding.mouse, n = 0; l; l = l->next, n++)
1394 if (l->data == eb) break;
1396 e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n + 1);
1398 eina_stringshare_del(cfdata->locals.action);
1399 cfdata->locals.action = eina_stringshare_add("");
1400 e_widget_ilist_unselect(cfdata->gui.o_action_list);
1401 e_widget_entry_clear(cfdata->gui.o_params);
1402 e_widget_disabled_set(cfdata->gui.o_params, 1);
1406 for (l = cfdata->binding.mouse, n = 0; l; l = l->next, n++)
1407 if (l->data == eb) break;
1409 eina_stringshare_del(cfdata->locals.cur);
1410 cfdata->locals.cur = NULL;
1412 e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n + 1);
1414 _update_buttons(cfdata);
1415 _grab_wnd_hide(cfdata);
1417 return ECORE_CALLBACK_PASS_ON;
1421 _grab_mouse_wheel_cb(void *data, __UNUSED__ int type, void *event)
1424 E_Config_Binding_Wheel *bw = NULL;
1425 E_Config_Binding_Mouse *eb = NULL;
1426 E_Config_Dialog_Data *cfdata;
1427 Ecore_Event_Mouse_Wheel *ev;
1428 int mod = E_BINDING_MODIFIER_NONE, n;
1433 if (ev->window != cfdata->locals.bind_win) return ECORE_CALLBACK_PASS_ON;
1435 if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)
1436 mod |= E_BINDING_MODIFIER_SHIFT;
1437 if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)
1438 mod |= E_BINDING_MODIFIER_CTRL;
1439 if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT)
1440 mod |= E_BINDING_MODIFIER_ALT;
1441 if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN)
1442 mod |= E_BINDING_MODIFIER_WIN;
1445 if (cfdata->locals.add)
1447 bw = E_NEW(E_Config_Binding_Wheel, 1);
1448 bw->context = E_BINDING_CONTEXT_ANY;
1449 bw->direction = ev->direction;
1451 bw->modifiers = mod;
1456 cfdata->binding.wheel = eina_list_append(cfdata->binding.wheel, bw);
1460 if (cfdata->locals.cur[0] == 'm')
1462 sscanf(cfdata->locals.cur, "m%d", &n);
1463 l = eina_list_nth_list(cfdata->binding.mouse, n);
1464 eb = eina_list_data_get(l);
1466 bw = E_NEW(E_Config_Binding_Wheel, 1);
1467 bw->context = eb->context;
1468 bw->direction = ev->direction;
1470 bw->modifiers = mod;
1472 bw->action = eb->action;
1473 bw->params = eb->params;
1475 cfdata->binding.wheel = eina_list_append(cfdata->binding.wheel, bw);
1478 cfdata->binding.mouse = eina_list_remove_list(cfdata->binding.mouse, l);
1480 else if (cfdata->locals.cur[0] == 'w')
1482 sscanf(cfdata->locals.cur, "w%d", &n);
1483 bw = eina_list_nth(cfdata->binding.wheel, n);
1486 bw->direction = ev->direction;
1488 bw->modifiers = mod;
1492 _update_mouse_binding_list(cfdata);
1494 if (cfdata->locals.add)
1496 for (l = cfdata->binding.wheel, n = 0; l; l = l->next, n++)
1497 if (l->data == bw) break;
1499 if (eina_list_count(cfdata->binding.mouse))
1501 n += eina_list_count(cfdata->binding.mouse) + 2;
1502 e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n);
1505 e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n + 1);
1507 e_widget_ilist_unselect(cfdata->gui.o_action_list);
1508 eina_stringshare_del(cfdata->locals.action);
1509 cfdata->locals.action = eina_stringshare_add("");
1510 e_widget_entry_clear(cfdata->gui.o_params);
1511 e_widget_disabled_set(cfdata->gui.o_params, 1);
1515 for (l = cfdata->binding.wheel, n = 0; l; l = l->next, n++)
1516 if (l->data == bw) break;
1518 eina_stringshare_del(cfdata->locals.cur);
1519 cfdata->locals.cur = NULL;
1521 if (eina_list_count(cfdata->binding.mouse))
1523 n += eina_list_count(cfdata->binding.mouse) + 2;
1524 e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n);
1527 e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n + 1);
1529 _update_buttons(cfdata);
1531 _grab_wnd_hide(cfdata);
1532 return ECORE_CALLBACK_PASS_ON;
1536 _grab_key_down_cb(void *data, __UNUSED__ int type, void *event)
1538 E_Config_Dialog_Data *cfdata;
1539 Ecore_Event_Key *ev = event;
1543 if (ev->window != cfdata->locals.bind_win) return ECORE_CALLBACK_PASS_ON;
1545 if (!strcmp(ev->keyname, "Escape") &&
1546 !(ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) &&
1547 !(ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
1548 !(ev->modifiers & ECORE_EVENT_MODIFIER_ALT) &&
1549 !(ev->modifiers & ECORE_EVENT_MODIFIER_WIN))
1551 _grab_wnd_hide(cfdata);
1553 return ECORE_CALLBACK_PASS_ON;