4 * Copyright (c) 2009-2014 Samsung Electronics Co., Ltd All Rights Reserved
6 * Contact: Jin Yoon <jinny.yoon@samsung.com>
7 * Junkyu Han <junkyu.han@samsung.com>
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
13 * http://www.apache.org/licenses/LICENSE-2.0
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.
24 #include <Elementary.h>
26 //#include <Ecore_X.h>
30 #include "menu_screen.h"
31 #include "page_scroller.h"
34 #include "all_apps/layout.h"
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;
48 .press_handler = NULL,
49 .release_handler = NULL,
50 .register_handler = EINA_FALSE,
52 .home_grabbed = EINA_FALSE,
57 #define KEY_LEFT "Left"
58 #define KEY_RIGHT "Right"
60 #define KEY_DOWN "Down"
61 static Eina_Bool _key_release_cb(void *data, int type, void *event)
63 Evas_Event_Key_Up *ev = event;
65 retv_if(EINA_FALSE == key_info.register_handler, ECORE_CALLBACK_CANCEL);
66 retv_if(NULL == ev, ECORE_CALLBACK_CANCEL);
68 _D("Key(%s) released %d", ev->keyname, key_info.pressed);
70 if (key_info.pressed == EINA_FALSE) return ECORE_CALLBACK_CANCEL;
74 win = menu_screen_get_win();
75 break_if(NULL == win);
78 layout = evas_object_data_get(win, "layout");
79 break_if(NULL == layout);
81 Evas_Object *all_apps;
82 all_apps = evas_object_data_get(layout, "all_apps");
83 break_if(NULL == all_apps);
85 Evas_Object *scroller = evas_object_data_get(all_apps, "scroller");
86 break_if(NULL == scroller);
88 if (!strcmp(ev->keyname, KEY_SELECT) || !strcmp(ev->keyname, KEY_BACK)) {
94 if (all_apps_layout_is_edited(all_apps)) {
95 all_apps_layout_unedit(all_apps);
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))
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);
107 if (cur_idx != idx) {
108 page_scroller_bring_in(scroller, idx);
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 */
116 page_scroller_focus_into_vector(scroller, rest > w / 2 ? -1 : 1);
119 else if (!strcmp(ev->keyname, KEY_ESC))
126 if (all_apps_layout_is_edited(all_apps)) {
127 all_apps_layout_unedit(all_apps);
132 key_info.pressed = EINA_FALSE;
134 return ECORE_CALLBACK_CANCEL;
139 static Eina_Bool _key_press_cb(void *data, int type, void *event)
141 Evas_Event_Key_Down *ev = event;
143 retv_if(EINA_FALSE == key_info.register_handler, ECORE_CALLBACK_CANCEL);
144 retv_if(NULL == ev, ECORE_CALLBACK_CANCEL);
146 key_info.pressed = EINA_TRUE;
147 _D("Key pressed %d", key_info.pressed);
149 return ECORE_CALLBACK_CANCEL;
154 HAPI void key_register(void)
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");
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");
170 key_info.pressed = EINA_FALSE;
171 key_info.register_handler = EINA_TRUE;
176 HAPI void key_unregister(void)
178 if (key_info.long_press) {
179 ecore_timer_del(key_info.long_press);
180 key_info.long_press = NULL;
183 if (key_info.release_handler) {
184 ecore_event_handler_del(key_info.release_handler);
185 key_info.release_handler = NULL;
188 if (key_info.press_handler) {
189 ecore_event_handler_del(key_info.press_handler);
190 key_info.press_handler = NULL;
193 key_info.register_handler = EINA_FALSE;
198 HAPI void key_grab_home(void)
200 if (EINA_TRUE == key_info.home_grabbed) return;
202 //Ecore_X_Window win = elm_win_xwindow_get(menu_screen_get_win());
203 //Display* dpy = ecore_x_display_get();
205 //int ret = utilx_grab_key(dpy, win, KEY_SELECT, TOP_POSITION_GRAB);
208 //ret = utilx_grab_key(dpy, win, KEY_BACK, TOP_POSITION_GRAB);
211 key_info.home_grabbed = EINA_TRUE;
216 HAPI void key_ungrab_home(void)
218 if (key_info.home_grabbed == EINA_FALSE) return;
220 /*Ecore_X_Window win = elm_win_xwindow_get(menu_screen_get_win());
221 Display* dpy = ecore_x_display_get();
223 int ret = utilx_ungrab_key(dpy, win, KEY_SELECT);
226 ret = utilx_ungrab_key(dpy, win, KEY_BACK);
229 key_info.home_grabbed = EINA_FALSE;