1 #include "e.h"
2 
3 #define TEXT_PRESS_KEY_SEQUENCE            _("Please press a key combination.<ps/><ps/>" \
4                                              "Press <hilight>Escape</hilight> to abort.")
5 #define TEXT_PRESS_MOUSE_BINDING_SEQUENCE _("Please hold any modifier you want<ps/>"            \
6                                              "and press any button on your mouse<ps/>" \
7                                              "or roll a wheel to assign mouse binding.<ps/><ps/>"      \
8                                              "Press <hilight>Escape</hilight> to abort.")
9 static Eina_Bool
_e_grab_dialog_key_handler(void * data,int type EINA_UNUSED,Ecore_Event_Key * ev)10 _e_grab_dialog_key_handler(void *data, int type EINA_UNUSED, Ecore_Event_Key *ev)
11 {
12    E_Grab_Dialog *eg = data;
13 
14    if (ev->window != eg->grab_win) return ECORE_CALLBACK_RENEW;
15    if (!strcmp(ev->key, "Escape") &&
16        !(ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) &&
17        !(ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
18        !(ev->modifiers & ECORE_EVENT_MODIFIER_ALT) &&
19        !(ev->modifiers & ECORE_EVENT_MODIFIER_WIN))
20      {
21         e_object_del(data);
22         return ECORE_CALLBACK_RENEW;
23      }
24 
25    if (eg->key)
26      {
27         e_object_ref(data);
28         eg->key(eg->data ? : eg, type, ev);
29         e_object_unref(data);
30      }
31    return ECORE_CALLBACK_RENEW;
32 }
33 
34 static Eina_Bool
_e_grab_dialog_wheel_handler(void * data,int type EINA_UNUSED,Ecore_Event_Mouse_Wheel * ev)35 _e_grab_dialog_wheel_handler(void *data, int type EINA_UNUSED, Ecore_Event_Mouse_Wheel *ev)
36 {
37    E_Grab_Dialog *eg = data;
38 
39    if (ev->window != eg->grab_win) return ECORE_CALLBACK_RENEW;
40 
41    if (eg->wheel)
42      {
43         e_object_ref(data);
44         eg->wheel(eg->data ? : eg, type, ev);
45         e_object_unref(data);
46      }
47    return ECORE_CALLBACK_RENEW;
48 }
49 
50 static Eina_Bool
_e_grab_dialog_mouse_handler(void * data,int type EINA_UNUSED,Ecore_Event_Mouse_Button * ev)51 _e_grab_dialog_mouse_handler(void *data, int type EINA_UNUSED, Ecore_Event_Mouse_Button *ev)
52 {
53    E_Grab_Dialog *eg = data;
54 
55    if (ev->window != eg->grab_win) return ECORE_CALLBACK_RENEW;
56 
57    if (eg->mouse)
58      {
59         e_object_ref(data);
60         eg->mouse(eg->data ? : eg, type, ev);
61         e_object_unref(data);
62      }
63    else
64      e_object_del(data);
65    return ECORE_CALLBACK_RENEW;
66 }
67 
68 static void
_e_grab_dialog_free(E_Grab_Dialog * eg)69 _e_grab_dialog_free(E_Grab_Dialog *eg)
70 {
71    if (eg->grab_win)
72      {
73         e_grabinput_release(eg->grab_win, eg->grab_win);
74 #ifndef HAVE_WAYLAND_ONLY
75         if (e_comp->comp_type == E_PIXMAP_TYPE_X)
76           ecore_x_window_free(eg->grab_win);
77         else
78 #endif
79           e_comp_ungrab_input(1, 1);
80      }
81    E_FREE_LIST(eg->handlers, ecore_event_handler_del);
82    e_bindings_disabled_set(0);
83 
84    e_object_del(E_OBJECT(eg->dia));
85    free(eg);
86 }
87 
88 static void
_e_grab_dialog_delete(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)89 _e_grab_dialog_delete(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
90 {
91    e_object_del(data);
92 }
93 
94 static void
_e_grab_dialog_dia_del(void * data)95 _e_grab_dialog_dia_del(void *data)
96 {
97    E_Dialog *dia = data;
98 
99    e_object_del(dia->data);
100 }
101 
102 E_API E_Grab_Dialog *
e_grab_dialog_show(Evas_Object * parent,Eina_Bool is_mouse,Ecore_Event_Handler_Cb key,Ecore_Event_Handler_Cb mouse,Ecore_Event_Handler_Cb wheel,const void * data)103 e_grab_dialog_show(Evas_Object *parent, Eina_Bool is_mouse, Ecore_Event_Handler_Cb key, Ecore_Event_Handler_Cb mouse, Ecore_Event_Handler_Cb wheel, const void *data)
104 {
105    E_Grab_Dialog *eg;
106    Ecore_Event_Handler *eh;
107 
108    if (parent)
109      evas_object_focus_set(e_win_client_get(parent)->frame, 0);
110 
111    eg = E_OBJECT_ALLOC(E_Grab_Dialog, E_GRAB_DIALOG_TYPE, _e_grab_dialog_free);
112    if (!eg) return NULL;
113 
114    if (is_mouse)
115      {
116         eg->dia = e_dialog_new(parent, "E", "_mousebind_getmouse_dialog");
117         e_dialog_title_set(eg->dia, _("Mouse Binding Combination"));
118         e_dialog_icon_set(eg->dia, "preferences-desktop-mouse", 48);
119         e_dialog_text_set(eg->dia, TEXT_PRESS_MOUSE_BINDING_SEQUENCE);
120      }
121    else
122      {
123         eg->dia = e_dialog_new(parent, "E", "_keybind_getkey_dialog");
124         e_dialog_title_set(eg->dia, _("Key Binding Combination"));
125         e_dialog_icon_set(eg->dia, "preferences-desktop-keyboard-shortcuts", 48);
126         e_dialog_text_set(eg->dia, TEXT_PRESS_KEY_SEQUENCE);
127      }
128    eg->dia->data = eg;
129    elm_win_center(eg->dia->win, 1, 1);
130    elm_win_borderless_set(eg->dia->win, 1);
131    e_dialog_resizable_set(eg->dia, 0);
132    e_object_del_attach_func_set(E_OBJECT(eg->dia), _e_grab_dialog_dia_del);
133    evas_object_event_callback_add(eg->dia->win, EVAS_CALLBACK_DEL, _e_grab_dialog_delete, eg);
134 
135 #ifndef HAVE_WAYLAND_ONLY
136    if (e_comp->comp_type == E_PIXMAP_TYPE_X)
137      {
138         eg->grab_win = ecore_x_window_input_new(e_comp->root, 0, 0, 1, 1);
139         ecore_x_window_show(eg->grab_win);
140         e_grabinput_get(eg->grab_win, 0, eg->grab_win);
141      }
142    else
143 #endif
144      {
145         e_comp_grab_input(1, 1);
146         eg->grab_win = e_comp->ee_win;
147      }
148 
149    eg->key = key;
150    eg->mouse = mouse;
151    eg->wheel = wheel;
152    eg->data = (void *)data;
153 
154    eh = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, (Ecore_Event_Handler_Cb)_e_grab_dialog_key_handler, eg);
155    eg->handlers = eina_list_append(eg->handlers, eh);
156    eh = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, (Ecore_Event_Handler_Cb)_e_grab_dialog_mouse_handler, eg);
157    eg->handlers = eina_list_append(eg->handlers, eh);
158    if (wheel)
159      {
160         eh = ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL, (Ecore_Event_Handler_Cb)_e_grab_dialog_wheel_handler, eg);
161         eg->handlers = eina_list_append(eg->handlers, eh);
162      }
163    e_dialog_show(eg->dia);
164    evas_object_layer_set(e_win_client_get(eg->dia->win)->frame, E_LAYER_CLIENT_PRIO);
165    e_bindings_disabled_set(1);
166    return eg;
167 }
168 
169