1.[E_BORDER] Change code to hide the client window in _e_border_cb_window_hide().
[platform/core/uifw/e17.git] / src / bin / e_grab_dialog.c
1 #include "e.h"
2
3 #define TEXT_PRESS_KEY_SEQUENCE _("Please press key sequence,<br><br>" \
4                                   "or <hilight>Escape</hilight> to abort.")
5 #define TEXT_PRESS_MOUSE_BINIDING_SEQUENCE _("Please hold any modifier you want<br>"             \
6                                              "and press any button on your mouse,<br> or roll a" \
7                                              " wheel, to assign mouse binding."                  \
8                                              "<br>Press <hilight>Escape</highlight> to abort.")
9
10 static Eina_Bool
11 _e_grab_dialog_key_handler(void *data, int type __UNUSED__, Ecore_Event_Key *ev)
12 {
13    E_Grab_Dialog *eg = data;
14
15    if (ev->window != eg->grab_win) return ECORE_CALLBACK_RENEW;
16    if (!strcmp(ev->keyname, "Escape") &&
17        !(ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) &&
18        !(ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
19        !(ev->modifiers & ECORE_EVENT_MODIFIER_ALT) &&
20        !(ev->modifiers & ECORE_EVENT_MODIFIER_WIN))
21      {
22         e_object_del(data);
23         return ECORE_CALLBACK_RENEW;
24      }
25    
26    if (eg->key)
27      {
28         e_object_ref(data);
29         eg->key(eg->data ?: eg, type, ev);
30         e_object_unref(data);
31      }
32    return ECORE_CALLBACK_RENEW;
33 }
34
35 static Eina_Bool
36 _e_grab_dialog_wheel_handler(void *data, int type __UNUSED__, Ecore_Event_Mouse_Wheel *ev)
37 {
38    E_Grab_Dialog *eg = data;
39
40    if (ev->window != eg->grab_win) return ECORE_CALLBACK_RENEW;
41
42    if (eg->wheel)
43      {
44         e_object_ref(data);
45         eg->wheel(eg->data ?: eg, type, ev);
46         e_object_unref(data);
47      }
48    return ECORE_CALLBACK_RENEW;
49 }
50
51 static Eina_Bool
52 _e_grab_dialog_mouse_handler(void *data, int type __UNUSED__, Ecore_Event_Mouse_Button *ev)
53 {
54    E_Grab_Dialog *eg = data;
55
56    if (ev->window != eg->grab_win) return ECORE_CALLBACK_RENEW;
57
58    if (eg->mouse)
59      {
60         e_object_ref(data);
61         eg->mouse(eg->data ?: eg, type, ev);
62         e_object_unref(data);
63      }
64    else
65      e_object_del(data);
66    return ECORE_CALLBACK_RENEW;
67 }
68
69 static void
70 _e_grab_dialog_free(E_Grab_Dialog *eg)
71 {
72    if (eg->grab_win)
73      {
74         e_grabinput_release(eg->grab_win, eg->grab_win);
75         ecore_x_window_free(eg->grab_win);
76      }
77    E_FREE_LIST(eg->handlers, ecore_event_handler_del);
78
79    e_object_del(E_OBJECT(eg->dia));
80    free(eg);
81 }
82
83 static void
84 _e_grab_dialog_delete(E_Win *win)
85 {
86    E_Dialog *dia;
87    E_Grab_Dialog *eg;
88
89    dia = win->data;
90    eg = dia->data;
91    e_object_del(E_OBJECT(eg));
92 }
93
94 static void
95 _e_grab_dialog_dia_del(void *data)
96 {
97    E_Dialog *dia = data;
98
99    e_object_del(dia->data);
100 }
101
102 EAPI E_Grab_Dialog *
103 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)
104 {
105    E_Manager *man;
106    E_Container *con;
107    E_Grab_Dialog *eg;
108    Ecore_Event_Handler *eh;
109
110    if (parent)
111      {
112         con = parent->container;
113         man = con->manager;
114         e_border_focus_set(parent->border, 0, 1);
115      }
116    else
117      {
118         man = e_manager_current_get();
119         con = e_container_current_get(man);
120      }
121
122    eg = E_OBJECT_ALLOC(E_Grab_Dialog, E_GRAB_DIALOG_TYPE, _e_grab_dialog_free);
123    if (!eg) return NULL;
124
125    if (is_mouse)
126      {
127         eg->dia = e_dialog_new(con, "E", "_mousebind_getmouse_dialog");
128         e_dialog_title_set(eg->dia, _("Mouse Binding Sequence"));
129         e_dialog_icon_set(eg->dia, "preferences-desktop-mouse", 48);
130         e_dialog_text_set(eg->dia, TEXT_PRESS_MOUSE_BINIDING_SEQUENCE);
131      }
132    else
133      {
134         eg->dia = e_dialog_new(con, "E", "_keybind_getkey_dialog");
135         e_dialog_title_set(eg->dia, _("Key Binding Sequence"));
136         e_dialog_icon_set(eg->dia, "preferences-desktop-keyboard-shortcuts", 48);
137         e_dialog_text_set(eg->dia, TEXT_PRESS_KEY_SEQUENCE);
138      }
139    eg->dia->data = eg;
140    e_win_centered_set(eg->dia->win, 1);
141    e_win_borderless_set(eg->dia->win, 1);
142    e_object_del_attach_func_set(E_OBJECT(eg->dia), _e_grab_dialog_dia_del);
143    e_win_delete_callback_set(eg->dia->win, _e_grab_dialog_delete);
144
145    eg->grab_win = ecore_x_window_input_new(man->root, 0, 0, 1, 1);
146    ecore_x_window_show(eg->grab_win);
147    e_grabinput_get(eg->grab_win, 0, eg->grab_win);
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    e_border_layer_set(eg->dia->win->border, 150);
165    e_hints_window_stacking_set(eg->dia->win->border, E_STACKING_ABOVE);
166    if (parent)
167      e_dialog_parent_set(eg->dia, parent);
168    return eg;
169 }