diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index be142940d..5c9f36625 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -91,6 +91,7 @@ e_font.h \ e_gadcon.h \ e_gadcon_popup.h \ e_grabinput.h \ +e_grab_dialog.h \ e.h \ e_hints.h \ e_icon.h \ @@ -246,6 +247,7 @@ e_font.c \ e_gadcon.c \ e_gadcon_popup.c \ e_grabinput.c \ +e_grab_dialog.c \ e_hints.c \ e_icon.c \ e_ilist.c \ diff --git a/src/bin/e_grab_dialog.c b/src/bin/e_grab_dialog.c new file mode 100644 index 000000000..d158f0067 --- /dev/null +++ b/src/bin/e_grab_dialog.c @@ -0,0 +1,166 @@ +#include "e.h" + +#define TEXT_PRESS_KEY_SEQUENCE _("Please press key sequence,

" \ + "or Escape to abort.") +#define TEXT_PRESS_MOUSE_BINIDING_SEQUENCE _("Please hold any modifier you want
" \ + "and press any button on your mouse,
or roll a" \ + " wheel, to assign mouse binding." \ + "
Press Escape to abort.") + +static Eina_Bool +_e_grab_dialog_key_handler(void *data, int type __UNUSED__, Ecore_Event_Key *ev) +{ + E_Grab_Dialog *eg = data; + + if (ev->window != eg->grab_win) return ECORE_CALLBACK_RENEW; + if (!strcmp(ev->keyname, "Escape") && + !(ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) && + !(ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) && + !(ev->modifiers & ECORE_EVENT_MODIFIER_ALT) && + !(ev->modifiers & ECORE_EVENT_MODIFIER_WIN)) + { + e_object_del(data); + return ECORE_CALLBACK_RENEW; + } + + if (eg->key) + { + e_object_ref(data); + eg->key(eg->data ?: eg, type, ev); + e_object_unref(data); + } + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool +_e_grab_dialog_wheel_handler(void *data, int type __UNUSED__, Ecore_Event_Mouse_Wheel *ev) +{ + E_Grab_Dialog *eg = data; + + if (ev->window != eg->grab_win) return ECORE_CALLBACK_RENEW; + + if (eg->wheel) + { + e_object_ref(data); + eg->wheel(eg->data ?: eg, type, ev); + e_object_unref(data); + } + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool +_e_grab_dialog_mouse_handler(void *data, int type __UNUSED__, Ecore_Event_Mouse_Button *ev) +{ + E_Grab_Dialog *eg = data; + + if (ev->window != eg->grab_win) return ECORE_CALLBACK_RENEW; + + if (eg->mouse) + { + e_object_ref(data); + eg->mouse(eg->data ?: eg, type, ev); + e_object_unref(data); + } + else + e_object_del(data); + return ECORE_CALLBACK_RENEW; +} + +static void +_e_grab_dialog_free(E_Grab_Dialog *eg) +{ + if (eg->grab_win) + { + e_grabinput_release(eg->grab_win, eg->grab_win); + ecore_x_window_free(eg->grab_win); + } + E_FREE_LIST(eg->handlers, ecore_event_handler_del); + + e_object_del(E_OBJECT(eg->dia)); + free(eg); +} + +static void +_e_grab_dialog_delete(E_Win *win) +{ + E_Dialog *dia; + E_Grab_Dialog *eg; + + dia = win->data; + eg = dia->data; + e_object_del(E_OBJECT(eg)); +} + +static void +_e_grab_dialog_dia_del(void *data) +{ + E_Dialog *dia = data; + + e_object_del(dia->data); +} + +EAPI E_Grab_Dialog * +e_grab_dialog_show(E_Win *parent, Eina_Bool is_mouse, Ecore_Event_Handler_Cb key, Ecore_Event_Handler_Cb mouse, Ecore_Event_Handler_Cb wheel, const void *data) +{ + E_Manager *man; + E_Container *con; + E_Grab_Dialog *eg; + Ecore_Event_Handler *eh; + + if (parent) + { + con = parent->container; + man = con->manager; + } + else + { + man = e_manager_current_get(); + e_container_current_get(man); + } + + eg = E_OBJECT_ALLOC(E_Grab_Dialog, E_GRAB_DIALOG_TYPE, _e_grab_dialog_free); + if (!eg) return NULL; + + if (is_mouse) + { + eg->dia = e_dialog_new(con, "E", "_mousebind_getmouse_dialog"); + e_dialog_title_set(eg->dia, _("Mouse Binding Sequence")); + e_dialog_icon_set(eg->dia, "preferences-desktop-mouse", 48); + e_dialog_text_set(eg->dia, TEXT_PRESS_MOUSE_BINIDING_SEQUENCE); + } + else + { + eg->dia = e_dialog_new(con, "E", "_keybind_getkey_dialog"); + e_dialog_title_set(eg->dia, _("Key Binding Sequence")); + e_dialog_icon_set(eg->dia, "preferences-desktop-keyboard-shortcuts", 48); + e_dialog_text_set(eg->dia, TEXT_PRESS_KEY_SEQUENCE); + } + eg->dia->data = eg; + e_win_centered_set(eg->dia->win, 1); + e_win_borderless_set(eg->dia->win, 1); + e_object_del_attach_func_set(E_OBJECT(eg->dia), _e_grab_dialog_dia_del); + e_win_delete_callback_set(eg->dia->win, _e_grab_dialog_delete); + + eg->grab_win = ecore_x_window_input_new(man->root, 0, 0, 1, 1); + ecore_x_window_show(eg->grab_win); + e_grabinput_get(eg->grab_win, 0, eg->grab_win); + + eg->key = key; + eg->mouse = mouse; + eg->wheel = wheel; + eg->data = (void*)data; + + eh = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, (Ecore_Event_Handler_Cb)_e_grab_dialog_key_handler, eg); + eg->handlers = eina_list_append(eg->handlers, eh); + eh = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, (Ecore_Event_Handler_Cb)_e_grab_dialog_mouse_handler, eg); + eg->handlers = eina_list_append(eg->handlers, eh); + if (wheel) + { + eh = ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL, (Ecore_Event_Handler_Cb)_e_grab_dialog_wheel_handler, eg); + eg->handlers = eina_list_append(eg->handlers, eh); + } + e_dialog_show(eg->dia); + if (parent) + e_dialog_parent_set(eg->dia, parent); + return eg; +} diff --git a/src/bin/e_grab_dialog.h b/src/bin/e_grab_dialog.h new file mode 100644 index 000000000..196ec9540 --- /dev/null +++ b/src/bin/e_grab_dialog.h @@ -0,0 +1,27 @@ +#ifdef E_TYPEDEFS + +typedef struct _E_Grab_Dialog E_Grab_Dialog; + +#else +#ifndef E_GRAB_DIALOG_H +#define E_GRAB_DIALOG_H + +#define E_GRAB_DIALOG_TYPE 0xE0b0104A + +struct _E_Grab_Dialog +{ + E_Object e_obj_inherit; + + E_Dialog *dia; + Ecore_X_Window grab_win; + Ecore_Event_Handler_Cb key; + Ecore_Event_Handler_Cb mouse; + Ecore_Event_Handler_Cb wheel; + Eina_List *handlers; + void *data; +}; + +EAPI E_Grab_Dialog *e_grab_dialog_show(E_Win *parent, Eina_Bool is_mouse, Ecore_Event_Handler_Cb key, Ecore_Event_Handler_Cb mouse, Ecore_Event_Handler_Cb wheel, const void *data); + +#endif +#endif diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h index fd5159e86..3af48de85 100644 --- a/src/bin/e_includes.h +++ b/src/bin/e_includes.h @@ -146,3 +146,4 @@ #include "e_log.h" #include "e_import_dialog.h" #include "e_import_config_dialog.h" +#include "e_grab_dialog.h" diff --git a/src/modules/conf_keybindings/e_int_config_keybindings.c b/src/modules/conf_keybindings/e_int_config_keybindings.c index 5d41fd5f3..1938ebfb8 100644 --- a/src/modules/conf_keybindings/e_int_config_keybindings.c +++ b/src/modules/conf_keybindings/e_int_config_keybindings.c @@ -73,9 +73,7 @@ struct _E_Config_Dialog_Data char *params; int cur_act, add; - E_Dialog *dia; - Ecore_X_Window bind_win; - Eina_List *handlers; + E_Grab_Dialog *eg; } locals; struct { @@ -127,9 +125,7 @@ _fill_data(E_Config_Dialog_Data *cfdata) cfdata->locals.params = strdup(""); cfdata->locals.cur = NULL; cfdata->binding.key = NULL; - cfdata->locals.bind_win = 0; - cfdata->locals.handlers = NULL; - cfdata->locals.dia = NULL; + cfdata->locals.eg = NULL; EINA_LIST_FOREACH(e_config->key_bindings, l, bi) { @@ -960,49 +956,23 @@ _key_binding_sort_cb(const void *d1, } /**************** grab window *******/ + static void -_grab_wnd_show(E_Config_Dialog_Data *cfdata) +_grab_wnd_hide(void *data) { - E_Manager *man; + E_Config_Dialog_Data *cfdata; - if (cfdata->locals.bind_win != 0) return; - - man = e_manager_current_get(); - - cfdata->locals.dia = e_dialog_new(e_container_current_get(man), - "E", "_keybind_getkey_dialog"); - if (!cfdata->locals.dia) return; - e_dialog_title_set(cfdata->locals.dia, _("Key Binding Sequence")); - e_dialog_icon_set(cfdata->locals.dia, "preferences-desktop-keyboard-shortcuts", 48); - e_dialog_text_set(cfdata->locals.dia, TEXT_PRESS_KEY_SEQUENCE); - e_win_centered_set(cfdata->locals.dia->win, 1); - e_win_borderless_set(cfdata->locals.dia->win, 1); - - cfdata->locals.bind_win = ecore_x_window_input_new(man->root, 0, 0, 1, 1); - ecore_x_window_show(cfdata->locals.bind_win); - e_grabinput_get(0, 0, cfdata->locals.bind_win); - - cfdata->locals.handlers = eina_list_append(cfdata->locals.handlers, - ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, - _grab_key_down_cb, cfdata)); - e_dialog_show(cfdata->locals.dia); - e_dialog_parent_set(cfdata->locals.dia, cfdata->cfd->dia->win); + cfdata = e_object_data_get(data); + cfdata->locals.eg = NULL; } static void -_grab_wnd_hide(E_Config_Dialog_Data *cfdata) +_grab_wnd_show(E_Config_Dialog_Data *cfdata) { - Ecore_Event_Handler *eh; - - EINA_LIST_FREE(cfdata->locals.handlers, eh) - ecore_event_handler_del(eh); - - e_object_del(E_OBJECT(cfdata->locals.dia)); - cfdata->locals.dia = NULL; - - e_grabinput_release(0, cfdata->locals.bind_win); - ecore_x_window_free(cfdata->locals.bind_win); - cfdata->locals.bind_win = 0; + if (cfdata->locals.eg) return; + cfdata->locals.eg = e_grab_dialog_show(cfdata->cfd->dia->win, EINA_FALSE, _grab_key_down_cb, NULL, NULL, cfdata); + e_object_data_set(E_OBJECT(cfdata->locals.eg), cfdata); + e_object_del_attach_func_set(E_OBJECT(cfdata->locals.eg), _grab_wnd_hide); } static Eina_Bool @@ -1016,183 +986,170 @@ _grab_key_down_cb(void *data, ev = event; cfdata = data; - if (ev->window != cfdata->locals.bind_win) return ECORE_CALLBACK_PASS_ON; - - if (!strcmp(ev->keyname, "Escape") && - !(ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) && - !(ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) && - !(ev->modifiers & ECORE_EVENT_MODIFIER_ALT) && - !(ev->modifiers & ECORE_EVENT_MODIFIER_WIN)) + if ((ev->keyname) && (ev->key) && (ev->compose)) + printf("'%s' '%s' '%s'\n", ev->keyname, ev->key, ev->compose); + else if ((ev->keyname) && (ev->key)) + printf("'%s' '%s'\n", ev->keyname, ev->key); + else + printf("unknown key!!!!\n"); + if (!strcmp(ev->keyname, "Control_L") || !strcmp(ev->keyname, "Control_R") || + !strcmp(ev->keyname, "Shift_L") || !strcmp(ev->keyname, "Shift_R") || + !strcmp(ev->keyname, "Alt_L") || !strcmp(ev->keyname, "Alt_R") || + !strcmp(ev->keyname, "Super_L") || !strcmp(ev->keyname, "Super_R")) { - _grab_wnd_hide(cfdata); + /* Do nothing */ } else { - if ((ev->keyname) && (ev->key) && (ev->compose)) - printf("'%s' '%s' '%s'\n", ev->keyname, ev->key, ev->compose); - else if ((ev->keyname) && (ev->key)) - printf("'%s' '%s'\n", ev->keyname, ev->key); - else - printf("unknown key!!!!\n"); - if (!strcmp(ev->keyname, "Control_L") || !strcmp(ev->keyname, "Control_R") || - !strcmp(ev->keyname, "Shift_L") || !strcmp(ev->keyname, "Shift_R") || - !strcmp(ev->keyname, "Alt_L") || !strcmp(ev->keyname, "Alt_R") || - !strcmp(ev->keyname, "Super_L") || !strcmp(ev->keyname, "Super_R")) - { - /* Do nothing */ - } - else - { - E_Config_Binding_Key *bi = NULL, *bi2 = NULL; - Eina_List *l = NULL; - unsigned int mod = E_BINDING_MODIFIER_NONE; - int found = 0, n; + E_Config_Binding_Key *bi = NULL, *bi2 = NULL; + Eina_List *l = NULL; + unsigned int mod = E_BINDING_MODIFIER_NONE; + int found = 0, n; - if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) - mod |= E_BINDING_MODIFIER_SHIFT; - if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) - mod |= E_BINDING_MODIFIER_CTRL; - if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) - mod |= E_BINDING_MODIFIER_ALT; - if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN) - mod |= E_BINDING_MODIFIER_WIN; - /* see comment in e_bindings on numlock - if (ev->modifiers & ECORE_X_LOCK_NUM) - mod |= ECORE_X_LOCK_NUM; - */ + if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) + mod |= E_BINDING_MODIFIER_SHIFT; + if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) + mod |= E_BINDING_MODIFIER_CTRL; + if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) + mod |= E_BINDING_MODIFIER_ALT; + if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN) + mod |= E_BINDING_MODIFIER_WIN; + /* see comment in e_bindings on numlock + if (ev->modifiers & ECORE_X_LOCK_NUM) + mod |= ECORE_X_LOCK_NUM; + */ + if (cfdata->locals.add) + { + found = 0; + for (l = cfdata->binding.key, n = 0; l && !found; l = l->next, n++) + { + bi = l->data; + if (bi->modifiers == mod && !strcmp(bi->key, ev->keyname)) + found = 1; + } + } + else if (cfdata->locals.cur && cfdata->locals.cur[0]) + { + found = 0; + sscanf(cfdata->locals.cur, "k%d", &n); + bi = eina_list_nth(cfdata->binding.key, n); + + for (l = cfdata->binding.key, n = 0; l && !found; l = l->next, n++) + { + bi2 = l->data; + if (bi == bi2) continue; + if (bi2->modifiers == mod && !strcmp(bi2->key, ev->keyname)) + found = 1; + } + } + + if (!found) + { if (cfdata->locals.add) { - found = 0; - for (l = cfdata->binding.key, n = 0; l && !found; l = l->next, n++) + bi = E_NEW(E_Config_Binding_Key, 1); + + bi->context = E_BINDING_CONTEXT_ANY; + bi->modifiers = mod; + bi->key = eina_stringshare_add(ev->keyname); + bi->action = NULL; + bi->params = NULL; + bi->any_mod = 0; + + cfdata->binding.key = eina_list_append(cfdata->binding.key, bi); + + n = _update_key_binding_list(cfdata, bi); + + e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n); + e_widget_ilist_nth_show(cfdata->gui.o_binding_list, n, 0); + e_widget_ilist_unselect(cfdata->gui.o_action_list); + eina_stringshare_del(cfdata->locals.action); + cfdata->locals.action = eina_stringshare_add(""); + if ((cfdata->params) && (cfdata->params[0])) { - bi = l->data; - if (bi->modifiers == mod && !strcmp(bi->key, ev->keyname)) - found = 1; + int j, g = -1; + _find_key_binding_action("exec", NULL, &g, NULL, &j); + if (j >= 0) + { + e_widget_ilist_unselect(cfdata->gui.o_action_list); + e_widget_ilist_selected_set(cfdata->gui.o_action_list, (j + g + 1)); + e_widget_entry_clear(cfdata->gui.o_params); + e_widget_entry_text_set(cfdata->gui.o_params, cfdata->params); + } + } + else + { + e_widget_entry_clear(cfdata->gui.o_params); + e_widget_disabled_set(cfdata->gui.o_params, 1); } } else if (cfdata->locals.cur && cfdata->locals.cur[0]) { - found = 0; + char *label; + E_Ilist_Item *it; + int i = 0; + sscanf(cfdata->locals.cur, "k%d", &n); bi = eina_list_nth(cfdata->binding.key, n); - for (l = cfdata->binding.key, n = 0; l && !found; l = l->next, n++) - { - bi2 = l->data; - if (bi == bi2) continue; - if (bi2->modifiers == mod && !strcmp(bi2->key, ev->keyname)) - found = 1; - } - } + bi->modifiers = mod; + if (bi->key) eina_stringshare_del(bi->key); + bi->key = eina_stringshare_add(ev->keyname); + printf("blub\n"); - if (!found) - { - if (cfdata->locals.add) - { - bi = E_NEW(E_Config_Binding_Key, 1); + label = _key_binding_text_get(bi); - bi->context = E_BINDING_CONTEXT_ANY; - bi->modifiers = mod; - bi->key = eina_stringshare_add(ev->keyname); - bi->action = NULL; - bi->params = NULL; - bi->any_mod = 0; - - cfdata->binding.key = eina_list_append(cfdata->binding.key, bi); - - n = _update_key_binding_list(cfdata, bi); - - e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n); - e_widget_ilist_nth_show(cfdata->gui.o_binding_list, n, 0); - e_widget_ilist_unselect(cfdata->gui.o_action_list); - eina_stringshare_del(cfdata->locals.action); - cfdata->locals.action = eina_stringshare_add(""); - if ((cfdata->params) && (cfdata->params[0])) - { - int j, g = -1; - _find_key_binding_action("exec", NULL, &g, NULL, &j); - if (j >= 0) - { - e_widget_ilist_unselect(cfdata->gui.o_action_list); - e_widget_ilist_selected_set(cfdata->gui.o_action_list, (j + g + 1)); - e_widget_entry_clear(cfdata->gui.o_params); - e_widget_entry_text_set(cfdata->gui.o_params, cfdata->params); - } - } - else - { - e_widget_entry_clear(cfdata->gui.o_params); - e_widget_disabled_set(cfdata->gui.o_params, 1); - } - } - else if (cfdata->locals.cur && cfdata->locals.cur[0]) - { - char *label; - E_Ilist_Item *it; - int i = 0; - - sscanf(cfdata->locals.cur, "k%d", &n); - bi = eina_list_nth(cfdata->binding.key, n); - - bi->modifiers = mod; - if (bi->key) eina_stringshare_del(bi->key); - bi->key = eina_stringshare_add(ev->keyname); - printf("blub\n"); - - label = _key_binding_text_get(bi); - - EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->gui.o_binding_list), l, it) - { - if (it->header) n++; - if (i++ >= n) break; - } - - e_widget_ilist_nth_label_set(cfdata->gui.o_binding_list, n, label); - free(label); - } - } - else - { - int i = 0; - E_Ilist_Item *it; -#if 0 - /* this advice is rather irritating as one sees that the - key is bound to an action. if you want to set a - keybinding you dont care about whether there is - sth else set to it. */ - int g, a, j; - const char *label = NULL; - E_Action_Group *actg = NULL; - E_Action_Description *actd = NULL; - - if (cfdata->locals.add) - _find_key_binding_action(bi->action, bi->params, &g, &a, &j); - else - _find_key_binding_action(bi2->action, bi2->params, &g, &a, &j); - - actg = eina_list_nth(e_action_groups_get(), g); - if (actg) actd = eina_list_nth(actg->acts, a); - - if (actd) label = _(actd->act_name); - - e_util_dialog_show(_("Binding Key Error"), - _("The binding key sequence, that you choose," - " is already used by
" - "%s action.
" - "Please choose another binding key sequence."), - label ? label : _("Unknown")); -#endif EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->gui.o_binding_list), l, it) { if (it->header) n++; if (i++ >= n) break; } - e_widget_ilist_nth_show(cfdata->gui.o_binding_list, n - 1, 1); - e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n - 1); + e_widget_ilist_nth_label_set(cfdata->gui.o_binding_list, n, label); + free(label); } - _grab_wnd_hide(cfdata); } + else + { + int i = 0; + E_Ilist_Item *it; +#if 0 + /* this advice is rather irritating as one sees that the + key is bound to an action. if you want to set a + keybinding you dont care about whether there is + sth else set to it. */ + int g, a, j; + const char *label = NULL; + E_Action_Group *actg = NULL; + E_Action_Description *actd = NULL; + + if (cfdata->locals.add) + _find_key_binding_action(bi->action, bi->params, &g, &a, &j); + else + _find_key_binding_action(bi2->action, bi2->params, &g, &a, &j); + + actg = eina_list_nth(e_action_groups_get(), g); + if (actg) actd = eina_list_nth(actg->acts, a); + + if (actd) label = _(actd->act_name); + + e_util_dialog_show(_("Binding Key Error"), + _("The binding key sequence, that you choose," + " is already used by
" + "%s action.
" + "Please choose another binding key sequence."), + label ? label : _("Unknown")); +#endif + EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->gui.o_binding_list), l, it) + { + if (it->header) n++; + if (i++ >= n) break; + } + + e_widget_ilist_nth_show(cfdata->gui.o_binding_list, n - 1, 1); + e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n - 1); + } + e_object_del(E_OBJECT(cfdata->locals.eg)); } return ECORE_CALLBACK_PASS_ON; } diff --git a/src/modules/conf_keybindings/e_int_config_mousebindings.c b/src/modules/conf_keybindings/e_int_config_mousebindings.c index 11fae0b6b..d90e8c304 100644 --- a/src/modules/conf_keybindings/e_int_config_mousebindings.c +++ b/src/modules/conf_keybindings/e_int_config_mousebindings.c @@ -46,10 +46,8 @@ static int _wheel_binding_sort_cb(const void *d1, const void *d2); /********* grab window **********/ static void _grab_wnd_show(E_Config_Dialog_Data *cfdata); -static void _grab_wnd_hide(E_Config_Dialog_Data *cfdata); static Eina_Bool _grab_mouse_down_cb(void *data, int type, void *event); static Eina_Bool _grab_mouse_wheel_cb(void *data, int type, void *event); -static Eina_Bool _grab_key_down_cb(void *data, int type, void *event); struct _E_Config_Dialog_Data { @@ -73,9 +71,7 @@ struct _E_Config_Dialog_Data const char *cur; int add; /*just to distinguesh among two buttons add/modify */ - E_Dialog *dia; - Ecore_X_Window bind_win; - Eina_List *handlers; + E_Grab_Dialog *eg; } locals; struct @@ -129,9 +125,7 @@ _fill_data(E_Config_Dialog_Data *cfdata) cfdata->locals.context = E_BINDING_CONTEXT_ANY; cfdata->binding.mouse = NULL; cfdata->binding.wheel = NULL; - cfdata->locals.bind_win = 0; - cfdata->locals.handlers = NULL; - cfdata->locals.dia = NULL; + cfdata->locals.eg = NULL; EINA_LIST_FOREACH(e_config->mouse_bindings, l, eb) { @@ -1287,59 +1281,23 @@ _wheel_binding_sort_cb(const void *d1, const void *d2) return 0; } + static void -_grab_wnd_show(E_Config_Dialog_Data *cfdata) +_grab_wnd_hide(void *data) { - E_Manager *man; + E_Config_Dialog_Data *cfdata; - if (cfdata->locals.bind_win != 0) return; - - man = e_manager_current_get(); - - cfdata->locals.dia = e_dialog_new(e_container_current_get(man), - "E", "_mousebind_getmouse_dialog"); - if (!cfdata->locals.dia) return; - e_dialog_title_set(cfdata->locals.dia, _("Mouse Binding Sequence")); - e_dialog_icon_set(cfdata->locals.dia, "preferences-desktop-mouse", 48); - e_dialog_text_set(cfdata->locals.dia, TEXT_PRESS_MOUSE_BINIDING_SEQUENCE); - e_win_centered_set(cfdata->locals.dia->win, 1); - e_win_borderless_set(cfdata->locals.dia->win, 1); - - cfdata->locals.bind_win = ecore_x_window_input_new(man->root, 0, 0, 1, 1); - /* man->w, man->h); */ - ecore_x_window_show(cfdata->locals.bind_win); - e_grabinput_get(cfdata->locals.bind_win, 0, cfdata->locals.bind_win); - - cfdata->locals.handlers = eina_list_append(cfdata->locals.handlers, - ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, - _grab_key_down_cb, cfdata)); - - cfdata->locals.handlers = eina_list_append(cfdata->locals.handlers, - ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, - _grab_mouse_down_cb, cfdata)); - - cfdata->locals.handlers = eina_list_append(cfdata->locals.handlers, - ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL, - _grab_mouse_wheel_cb, cfdata)); - - e_dialog_show(cfdata->locals.dia); - e_dialog_parent_set(cfdata->locals.dia, cfdata->cfd->dia->win); + cfdata = e_object_data_get(data); + cfdata->locals.eg = NULL; } static void -_grab_wnd_hide(E_Config_Dialog_Data *cfdata) +_grab_wnd_show(E_Config_Dialog_Data *cfdata) { - Ecore_Event_Handler *eh; - - EINA_LIST_FREE(cfdata->locals.handlers, eh) - ecore_event_handler_del(eh); - - e_object_del(E_OBJECT(cfdata->locals.dia)); - cfdata->locals.dia = NULL; - - e_grabinput_release(cfdata->locals.bind_win, cfdata->locals.bind_win); - ecore_x_window_free(cfdata->locals.bind_win); - cfdata->locals.bind_win = 0; + if (cfdata->locals.eg) return; + cfdata->locals.eg = e_grab_dialog_show(cfdata->cfd->dia->win, EINA_TRUE, NULL, _grab_mouse_down_cb, _grab_mouse_wheel_cb, cfdata); + e_object_data_set(E_OBJECT(cfdata->locals.eg), cfdata); + e_object_del_attach_func_set(E_OBJECT(cfdata->locals.eg), _grab_wnd_hide); } static Eina_Bool @@ -1355,9 +1313,6 @@ _grab_mouse_down_cb(void *data, __UNUSED__ int type, void *event) ev = event; cfdata = data; - if (!cfdata->locals.bind_win) return ECORE_CALLBACK_PASS_ON; - if (ev->window != cfdata->locals.bind_win) return ECORE_CALLBACK_PASS_ON; - if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT; if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) @@ -1439,7 +1394,7 @@ _grab_mouse_down_cb(void *data, __UNUSED__ int type, void *event) e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n + 1); } _update_buttons(cfdata); - _grab_wnd_hide(cfdata); + e_object_del(E_OBJECT(cfdata->locals.eg)); return ECORE_CALLBACK_PASS_ON; } @@ -1457,9 +1412,6 @@ _grab_mouse_wheel_cb(void *data, int type __UNUSED__, void *event) ev = event; cfdata = data; - if (!cfdata->locals.bind_win) return ECORE_CALLBACK_PASS_ON; - if (ev->window != cfdata->locals.bind_win) return ECORE_CALLBACK_PASS_ON; - if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT; if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) @@ -1555,29 +1507,6 @@ _grab_mouse_wheel_cb(void *data, int type __UNUSED__, void *event) } _update_buttons(cfdata); - _grab_wnd_hide(cfdata); - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_grab_key_down_cb(void *data, int type __UNUSED__, void *event) -{ - E_Config_Dialog_Data *cfdata; - Ecore_Event_Key *ev = event; - - cfdata = data; - - if (!cfdata->locals.bind_win) return ECORE_CALLBACK_PASS_ON; - if (ev->window != cfdata->locals.bind_win) return ECORE_CALLBACK_PASS_ON; - - if (!strcmp(ev->keyname, "Escape") && - !(ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) && - !(ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) && - !(ev->modifiers & ECORE_EVENT_MODIFIER_ALT) && - !(ev->modifiers & ECORE_EVENT_MODIFIER_WIN)) - { - _grab_wnd_hide(cfdata); - } - + e_object_del(E_OBJECT(cfdata->locals.eg)); return ECORE_CALLBACK_PASS_ON; }