Update keygrab API instead of UtilX
[apps/core/preloaded/quickpanel.git] / daemon / service / keyboard.c
1 /*
2  * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include <Elementary.h>
19 #include <vconf.h>
20 #include <Ecore_Input.h>
21 #include <feedback.h>
22 #include <tzsh.h>
23 #include <tzsh_quickpanel_service.h>
24 #include <notification.h>
25
26 #if defined(WINSYS_X11)
27 #include <Ecore_X.h>
28 #include <X11/Xlib.h>
29 #include <utilX.h>
30 #endif
31 #include <E_DBus.h>
32
33 #include "quickpanel-ui.h" // appdata
34 #include "common_uic.h"
35 #include "common.h"
36 #include "noti_util.h"
37 #include "keyboard.h"
38
39 #define KEY_BACK        "XF86Back"
40 #define KEY_CANCEL      "Cancel"
41 #define KEY_MENU        "XF86Menu"
42 #define KEY_QUICKPANEL  "XF86QuickPanel"
43 #define KEY_HOME        "XF86Home"
44
45 static Eina_Bool _service_hardkey_up_cb(void *data, int type, void *event)
46 {
47         struct appdata *ad = NULL;
48         Ecore_Event_Key *key_event = NULL;
49
50         retif(data == NULL || event == NULL, EINA_FALSE, "Invalid parameter!");
51         ad = data;
52         key_event = event;
53
54         if (!strcmp(key_event->keyname, KEY_HOME)) {
55                 if (ad->is_hardkey_cancel == EINA_FALSE) {
56                         quickpanel_uic_close_quickpanel(false, 0);
57                 } else {
58                         DBG("Cancel status, do nothing");
59                 }
60         } else if (!strcmp(key_event->keyname, KEY_CANCEL)) {
61                 ad->is_hardkey_cancel = EINA_FALSE;
62         } else if (!strcmp(key_event->keyname, KEY_BACK)) {
63                 if (ad->popup != NULL) {
64                         Evas_Smart_Cb back_cb = evas_object_data_get(ad->popup, EDATA_BACKKEY_CB);
65                         if (back_cb != NULL) {
66                                 back_cb(ad->popup, ad->popup, NULL);
67                         }
68                 } else {
69                         quickpanel_uic_close_quickpanel(false, 0);
70                 }
71         }
72         return EINA_FALSE;
73 }
74
75 static Eina_Bool _service_hardkey_down_cb(void *data, int type, void *event)
76 {
77         Ecore_Event_Key *key_event = event;
78         struct appdata *ad = data;
79         retif(key_event == NULL, EINA_FALSE, "Invalid parameter!");
80         retif(ad == NULL, EINA_FALSE, "Invalid parameter!");
81
82         if (!strcmp(key_event->keyname, KEY_CANCEL)) {
83                 ad->is_hardkey_cancel = EINA_TRUE;
84         } else if (!strcmp(key_event->keyname, KEY_QUICKPANEL)) {
85                 quickpanel_uic_toggle_openning_quickpanel();
86         }
87         return EINA_FALSE;
88 }
89
90 HAPI void quickpanel_keyboard_init(void *data)
91 {
92         struct appdata *ad = data;
93         Ecore_Event_Handler *hdl_key_down = NULL;
94         Ecore_Event_Handler *hdl_key_up = NULL;
95         retif(ad == NULL, , "Invalid parameter!");
96
97         if (elm_win_keygrab_set(ad->win, KEY_QUICKPANEL, 0, 0, 0, ELM_WIN_KEYGRAB_SHARED) == EINA_FALSE) {
98                 ERR("failed to grab KEY_QUICKPANEL");
99         }
100
101         hdl_key_down = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _service_hardkey_down_cb, ad);
102         if (hdl_key_down == NULL) {
103                 ERR("failed to add handler(ECORE_EVENT_KEY_DOWN)");
104         }
105         ad->hdl_hardkey_down = hdl_key_down;
106
107         hdl_key_up = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _service_hardkey_up_cb, ad);
108         if (hdl_key_up == NULL) {
109                 ERR("failed to add handler(ECORE_EVENT_KEY_UP)");
110         }
111         ad->hdl_hardkey_up = hdl_key_up;
112         ad->is_hardkey_cancel = EINA_FALSE;
113 }
114
115 HAPI void quickpanel_keyboard_fini(void *data)
116 {
117         struct appdata *ad = data;
118         retif(ad == NULL, , "Invalid parameter!");
119
120         if (ad->hdl_hardkey_up != NULL) {
121                 ecore_event_handler_del(ad->hdl_hardkey_up);
122                 ad->hdl_hardkey_up = NULL;
123         }
124
125         if (ad->hdl_hardkey_down != NULL) {
126                 ecore_event_handler_del(ad->hdl_hardkey_down);
127                 ad->hdl_hardkey_down = NULL;
128         }
129
130         if (elm_win_keygrab_unset(ad->win, KEY_QUICKPANEL, 0, 0) == EINA_FALSE) {
131                 ERR("failed to ungrab KEY_QUICKPANEL");
132         }
133 }
134
135 HAPI void quickpanel_keyboard_openning_init(void *data)
136 {
137         struct appdata *ad = data;
138         retif(ad == NULL, , "Invalid parameter!");
139
140         if (elm_win_keygrab_set(ad->win, KEY_BACK, 0, 0, 0, ELM_WIN_KEYGRAB_EXCLUSIVE)  == EINA_FALSE) {
141                 ERR("failed to grab KEY_BACK");
142         }
143
144         if (elm_win_keygrab_set(ad->win, KEY_MENU, 0, 0, 0, ELM_WIN_KEYGRAB_EXCLUSIVE) == EINA_FALSE) {
145                 ERR("failed to grab KEY_MENU");
146         }
147
148         if (elm_win_keygrab_set(ad->win, KEY_HOME, 0, 0, 0, ELM_WIN_KEYGRAB_SHARED)  == EINA_FALSE) {
149                 ERR("failed to grab KEY_HOME");
150         }
151
152 }
153
154 HAPI void quickpanel_keyboard_closing_fini(void *data)
155 {
156         struct appdata *ad = data;
157         retif(ad == NULL, , "Invalid parameter!");
158
159         if (elm_win_keygrab_unset(ad->win, KEY_BACK, 0, 0) == EINA_FALSE) {
160                 ERR("failed to ungrab KEY_BACK");
161         }
162
163         if (elm_win_keygrab_unset(ad->win, KEY_MENU, 0, 0) == EINA_FALSE) {
164                 ERR("failed to ungrab KEY_MENU");
165         }
166
167         if (elm_win_keygrab_unset(ad->win, KEY_HOME, 0, 0) == EINA_FALSE) {
168                 ERR("failed to ungrab KEY_HOME");
169         }
170 }
171
172