Merge 2.4 to 3.0
[apps/native/menu-screen.git] / src / key.c
1 /*
2  * MENU-SCREEN
3  *
4  * Copyright (c) 2009-2014 Samsung Electronics Co., Ltd All Rights Reserved
5  *
6  * Contact: Jin Yoon <jinny.yoon@samsung.com>
7  *          Junkyu Han <junkyu.han@samsung.com>
8
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  * http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  */
22
23 #include <stdlib.h>
24 #include <Elementary.h>
25 //#include <utilX.h>
26 //#include <Ecore_X.h>
27
28 #include "conf.h"
29 #include "key.h"
30 #include "menu_screen.h"
31 #include "page_scroller.h"
32 #include "popup.h"
33 #include "util.h"
34 #include "all_apps/layout.h"
35 #include "key.h"
36
37
38
39 static struct {
40         Eina_Bool pressed;
41         Ecore_Event_Handler *press_handler;
42         Ecore_Event_Handler *release_handler;
43         Eina_Bool register_handler;
44         Ecore_Timer *long_press;
45         Eina_Bool home_grabbed;
46 } key_info = {
47         .pressed = 0,
48         .press_handler = NULL,
49         .release_handler = NULL,
50         .register_handler = EINA_FALSE,
51         .long_press = NULL,
52         .home_grabbed = EINA_FALSE,
53 };
54
55
56
57 #define KEY_LEFT "Left"
58 #define KEY_RIGHT "Right"
59 #define KEY_UP "Up"
60 #define KEY_DOWN "Down"
61 static Eina_Bool _key_release_cb(void *data, int type, void *event)
62 {
63         Evas_Event_Key_Up *ev = event;
64
65         retv_if(EINA_FALSE == key_info.register_handler, ECORE_CALLBACK_CANCEL);
66         retv_if(NULL == ev, ECORE_CALLBACK_CANCEL);
67
68         _D("Key(%s) released %d", ev->keyname, key_info.pressed);
69
70         if (key_info.pressed == EINA_FALSE) return ECORE_CALLBACK_CANCEL;
71
72         do {
73                 Evas_Object *win;
74                 win = menu_screen_get_win();
75                 break_if(NULL == win);
76
77                 Evas_Object *layout;
78                 layout = evas_object_data_get(win, "layout");
79                 break_if(NULL == layout);
80
81                 Evas_Object *all_apps;
82                 all_apps = evas_object_data_get(layout, "all_apps");
83                 break_if(NULL == all_apps);
84
85                 Evas_Object *scroller = evas_object_data_get(all_apps, "scroller");
86                 break_if(NULL == scroller);
87
88                 if (!strcmp(ev->keyname, KEY_SELECT) || !strcmp(ev->keyname, KEY_BACK)) {
89                         if (popup_exist()) {
90                                 popup_destroy_all();
91                                 break;
92                         }
93
94                         if (all_apps_layout_is_edited(all_apps)) {
95                                 all_apps_layout_unedit(all_apps);
96                         }
97                 } else if (!strcmp(ev->keyname, KEY_LEFT) ||
98                                         !strcmp(ev->keyname, KEY_RIGHT) ||
99                                         !strcmp(ev->keyname, KEY_UP) ||
100                                         !strcmp(ev->keyname, KEY_DOWN))
101                 {
102                         int cur_idx = page_scroller_get_current_page_no(scroller);
103                         int idx = 0, x = 0, w = 0;
104                         elm_scroller_region_get(scroller, &x, NULL, &w, NULL);
105
106                         if (w) idx = x / w;
107                         if (cur_idx != idx) {
108                                 page_scroller_bring_in(scroller, idx);
109                                 break;
110                         }
111
112                         /* If there are no items to be focused after pressing keys,
113                            Menu-screen forces to focus the first item of the other page */
114                         int rest = x % w;
115                         if (rest) {
116                                 page_scroller_focus_into_vector(scroller, rest > w / 2 ? -1 : 1);
117                         }
118                 }
119                 else if (!strcmp(ev->keyname, KEY_ESC))
120                 {
121                         if (popup_exist())
122                         {
123                                 popup_destroy_all();
124                                 break;
125                         }
126                         if (all_apps_layout_is_edited(all_apps)) {
127                                 all_apps_layout_unedit(all_apps);
128                         }
129                 }
130         } while (0);
131
132         key_info.pressed = EINA_FALSE;
133
134         return ECORE_CALLBACK_CANCEL;
135 }
136
137
138
139 static Eina_Bool _key_press_cb(void *data, int type, void *event)
140 {
141         Evas_Event_Key_Down *ev = event;
142
143         retv_if(EINA_FALSE == key_info.register_handler, ECORE_CALLBACK_CANCEL);
144         retv_if(NULL == ev, ECORE_CALLBACK_CANCEL);
145
146         key_info.pressed = EINA_TRUE;
147         _D("Key pressed %d", key_info.pressed);
148
149         return ECORE_CALLBACK_CANCEL;
150 }
151
152
153
154 HAPI void key_register(void)
155 {
156         if (!key_info.release_handler) {
157                 key_info.release_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_release_cb, NULL);
158                 if (!key_info.release_handler) {
159                         _E("Failed to register a key up event handler");
160                 }
161         }
162
163         if (!key_info.press_handler) {
164                 key_info.press_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_press_cb, NULL);
165                 if (!key_info.press_handler) {
166                         _E("Failed to register a key down event handler");
167                 }
168         }
169
170         key_info.pressed = EINA_FALSE;
171         key_info.register_handler = EINA_TRUE;
172 }
173
174
175
176 HAPI void key_unregister(void)
177 {
178         if (key_info.long_press) {
179                 ecore_timer_del(key_info.long_press);
180                 key_info.long_press = NULL;
181         }
182
183         if (key_info.release_handler) {
184                 ecore_event_handler_del(key_info.release_handler);
185                 key_info.release_handler = NULL;
186         }
187
188         if (key_info.press_handler) {
189                 ecore_event_handler_del(key_info.press_handler);
190                 key_info.press_handler = NULL;
191         }
192
193         key_info.register_handler = EINA_FALSE;
194 }
195
196
197
198 HAPI void key_grab_home(void)
199 {
200         if (EINA_TRUE == key_info.home_grabbed) return;
201
202         //Ecore_X_Window win = elm_win_xwindow_get(menu_screen_get_win());
203         //Display* dpy = ecore_x_display_get();
204
205         //int ret = utilx_grab_key(dpy, win, KEY_SELECT, TOP_POSITION_GRAB);
206         //ret_if(0 != ret);
207
208         //ret = utilx_grab_key(dpy, win, KEY_BACK, TOP_POSITION_GRAB);
209         //ret_if(0 != ret);
210
211         key_info.home_grabbed = EINA_TRUE;
212 }
213
214
215
216 HAPI void key_ungrab_home(void)
217 {
218         if (key_info.home_grabbed == EINA_FALSE) return;
219
220         /*Ecore_X_Window win = elm_win_xwindow_get(menu_screen_get_win());
221         Display* dpy = ecore_x_display_get();
222
223         int ret = utilx_ungrab_key(dpy, win, KEY_SELECT);
224         ret_if(0 != ret);
225
226         ret = utilx_ungrab_key(dpy, win, KEY_BACK);
227         ret_if(0 != ret);*/
228
229         key_info.home_grabbed = EINA_FALSE;
230 }
231
232
233
234 // End of a file