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