2 * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 #include <Elementary.h>
23 #include <Ecore_Input.h>
24 #include <dd-deviced.h>
25 #include <syspopup_caller.h>
28 #include <system/media_key.h>
31 #include <system_settings.h>
36 #include "dbus_util.h"
39 #include "process_mgr.h"
41 #define APPID_CAMERA "org.tizen.camera-app"
42 #define APPID_CALLLOG "org.tizen.calllog"
43 #define APPID_MUSIC_PLAYER "org.tizen.music-player"
44 #define APPID_TASKMGR "org.tizen.task-mgr"
45 #define APPID_BROWSER "org.tizen.browser"
46 #define APPID_EMAIL "org.tizen.email"
47 #define APPID_DIALER "org.tizen.phone"
49 #define STR_ATOM_XKEY_COMPOSITION "_XKEY_COMPOSITION"
50 #define STR_ATOM_KEYROUTER_NOTIWINDOW "_KEYROUTER_NOTIWINDOW"
52 #define LONG_PRESS_TIMER_SEC 0.4
53 #define HOMEKEY_TIMER_SEC 0.2
54 #define CANCEL_KEY_TIMER_SEC 0.3
58 Ecore_Event_Handler *key_up;
59 Ecore_Event_Handler *key_down;
60 Ecore_Timer *home_long_press_timer;
61 Ecore_Timer *home_multi_press_timer;
63 Ecore_X_Window keyrouter_notiwindow;
69 .home_long_press_timer = NULL,
70 .home_multi_press_timer = NULL,
72 .keyrouter_notiwindow = 0x0,
78 static void _after_launch_taskmgr(int pid)
81 if(dbus_util_send_oomadj(pid, OOM_ADJ_VALUE_DEFAULT) < 0){
82 _E("failed to send oom dbus signal");
89 static Eina_Bool _launch_taskmgr_cb(void* data)
95 key_info.home_long_press_timer = NULL;
97 if (vconf_get_int(VCONFKEY_IDLE_LOCK_STATE, &val) < 0) {
98 _E("Cannot get VCONFKEY for lock state");
99 } else if (VCONFKEY_IDLE_LOCK == val) {
100 _E("lock state, ignore home key long press..!!");
101 return ECORE_CALLBACK_CANCEL;
104 process_mgr_must_launch(APPID_TASKMGR, NULL, NULL, NULL, _after_launch_taskmgr);
106 return ECORE_CALLBACK_CANCEL;
111 static void _release_multimedia_key(const char *value)
113 ret_if(NULL == value);
114 _D("Multimedia key is released with %s", value);
115 process_mgr_must_launch(APPID_MUSIC_PLAYER, "multimedia_key", value, NULL, NULL);
120 #define HOME_OP_KEY "__HOME_OP__"
121 #define HOME_OP_VAL_LAUNCH_BY_HOME_KEY "__LAUNCH_BY_HOME_KEY__"
122 static Eina_Bool _launch_by_home_key(void *data)
124 if (status_passive_get()->idle_lock_state > VCONFKEY_IDLE_UNLOCK) {
125 return ECORE_CALLBACK_CANCEL;
128 home_mgr_open_home(NULL, HOME_OP_KEY, HOME_OP_VAL_LAUNCH_BY_HOME_KEY);
130 return ECORE_CALLBACK_CANCEL;
135 static Eina_Bool _home_multi_press_timer_cb(void *data)
137 _W("homekey count[%d]", key_info.homekey_count);
139 key_info.home_multi_press_timer = NULL;
141 if (0 == key_info.homekey_count % 2) {
142 key_info.homekey_count = 0;
143 return ECORE_CALLBACK_CANCEL;
144 } else if(key_info.homekey_count >= 3) {
145 key_info.homekey_count = 0;
146 return ECORE_CALLBACK_CANCEL;
149 /* Single homekey operation */
150 key_info.homekey_count = 0;
151 _launch_by_home_key(data);
153 return ECORE_CALLBACK_CANCEL;
159 #define SERVICE_OPERATION_POPUP_SEARCH "http://samsung.com/appcontrol/operation/search"
160 #define SEARCH_PKG_NAME "org.tizen.sfinder"
161 static int _launch_search(void)
163 app_control_h app_control;
164 int ret = APP_CONTROL_ERROR_NONE;
166 app_control_create(&app_control);
167 app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
168 app_control_set_app_id(app_control, SEARCH_PKG_NAME);
170 ret = app_control_send_launch_request(app_control, NULL, NULL);
172 if(ret != APP_CONTROL_ERROR_NONE) {
173 _E("Cannot launch search!! err[%d]", ret);
176 app_control_destroy(app_control);
182 static void _cancel_key_events(void)
184 key_info.homekey_count = 0;
186 if (key_info.home_long_press_timer) {
187 ecore_timer_del(key_info.home_long_press_timer);
188 key_info.home_long_press_timer = NULL;
191 if(key_info.home_multi_press_timer) {
192 ecore_timer_del(key_info.home_multi_press_timer);
193 key_info.home_multi_press_timer = NULL;
199 static Eina_Bool _key_release_cb(void *data, int type, void *event)
201 Evas_Event_Key_Up *ev = event;
203 retv_if(!ev, ECORE_CALLBACK_RENEW);
204 retv_if(!ev->keyname, ECORE_CALLBACK_RENEW);
206 _D("_key_release_cb : %s Released", ev->keyname);
208 /* Priority 1 : Cancel event */
209 if (!strcmp(ev->keyname, KEY_CANCEL)) {
210 _D("CANCEL Key is released");
211 key_info.cancel = EINA_FALSE;
212 return ECORE_CALLBACK_RENEW;
215 if (EINA_TRUE == key_info.cancel) {
217 return ECORE_CALLBACK_RENEW;
220 /* Priority 2 : Execute before checking the lock status */
221 if (!strcmp(ev->keyname, KEY_MEDIA)) {
222 _release_multimedia_key("KEY_PLAYCD");
223 return ECORE_CALLBACK_RENEW;
226 /* Priority 3 : Check the lock status */
227 if ((status_passive_get()->idle_lock_state == VCONFKEY_IDLE_LOCK)
228 && (status_active_get()->setappl_screen_lock_type_int > SETTING_SCREEN_LOCK_TYPE_NONE)) {
229 _D("phone lock state, ignore home key.");
230 return ECORE_CALLBACK_RENEW;
233 /* Priority 4 : These keys are only activated after checking the lock state */
234 if (!strcmp(ev->keyname, KEY_END)) {
235 } else if (!strcmp(ev->keyname, KEY_CONFIG)) {
236 } else if (!strcmp(ev->keyname, KEY_SEND)) {
237 } else if (!strcmp(ev->keyname, KEY_HOME)) {
238 _W("Home Key is released");
240 syspopup_destroy_all();
242 if(key_info.home_multi_press_timer) {
243 _D("delete homekey timer");
244 ecore_timer_del(key_info.home_multi_press_timer);
245 key_info.home_multi_press_timer = NULL;
248 if (key_info.home_long_press_timer) {
249 ecore_timer_del(key_info.home_long_press_timer);
250 key_info.home_long_press_timer = NULL;
252 key_info.homekey_count = 0;
253 return ECORE_CALLBACK_RENEW;
256 key_info.home_multi_press_timer = ecore_timer_add(HOMEKEY_TIMER_SEC, _home_multi_press_timer_cb, NULL);
257 if (!key_info.home_multi_press_timer) {
258 _E("Critical! cannot add a timer for home multi press");
260 return ECORE_CALLBACK_RENEW;
261 } else if (!strcmp(ev->keyname, KEY_PAUSE)) {
262 } else if (!strcmp(ev->keyname, KEY_APPS)) {
263 _D("App tray key is released");
264 } else if (!strcmp(ev->keyname, KEY_TASKSWITCH)) {
265 _D("Task switch key is released");
266 _launch_taskmgr_cb(NULL);
267 } else if (!strcmp(ev->keyname, KEY_WEBPAGE)) {
268 _D("Web page key is released");
269 process_mgr_must_open(APPID_BROWSER, NULL, NULL);
270 } else if (!strcmp(ev->keyname, KEY_MAIL)) {
271 _D("Mail key is released");
272 process_mgr_must_open(APPID_EMAIL, NULL, NULL);
273 } else if (!strcmp(ev->keyname, KEY_CONNECT)) {
274 _D("Connect key is released");
275 process_mgr_must_open(APPID_DIALER, NULL, NULL);
276 } else if (!strcmp(ev->keyname, KEY_SEARCH)) {
277 _D("Search key is released");
278 if (_launch_search() < 0) {
279 _E("Failed to launch the search");
281 } else if (!strcmp(ev->keyname, KEY_VOICE)) {
282 _D("Voice key is released");
285 return ECORE_CALLBACK_RENEW;
290 static Eina_Bool _key_press_cb(void *data, int type, void *event)
292 Evas_Event_Key_Down *ev = event;
294 retv_if(!ev, ECORE_CALLBACK_RENEW);
295 retv_if(!ev->keyname, ECORE_CALLBACK_RENEW);
297 _D("_key_press_cb : %s Pressed", ev->keyname);
299 /* Priority 1 : Cancel */
300 /* every reserved events have to be canceld when cancel key is pressed */
301 if (!strcmp(ev->keyname, KEY_CANCEL)) {
302 _D("Cancel button is pressed");
303 key_info.cancel = EINA_TRUE;
304 _cancel_key_events();
305 return ECORE_CALLBACK_RENEW;
308 if (EINA_TRUE == key_info.cancel) {
310 return ECORE_CALLBACK_RENEW;
313 /* Priority 2 : Check the lock status */
314 if ((status_passive_get()->idle_lock_state == VCONFKEY_IDLE_LOCK)
315 && (status_active_get()->setappl_screen_lock_type_int > SETTING_SCREEN_LOCK_TYPE_NONE)) {
316 _D("phone lock state, ignore key events.");
317 _cancel_key_events();
318 return ECORE_CALLBACK_RENEW;
321 /* Priority 3 : other keys */
322 if (!strcmp(ev->keyname, KEY_SEND)) {
323 _D("Launch calllog");
324 process_mgr_must_open(APPID_CALLLOG, NULL, NULL);
325 } else if(!strcmp(ev->keyname, KEY_CONFIG)) {
327 process_mgr_must_open(APPID_CAMERA, NULL, NULL);
328 } else if (!strcmp(ev->keyname, KEY_HOME)) {
329 _W("Home Key is pressed");
330 if (key_info.home_long_press_timer) {
331 ecore_timer_del(key_info.home_long_press_timer);
332 key_info.home_long_press_timer = NULL;
335 key_info.homekey_count++;
336 _W("homekey count : %d", key_info.homekey_count);
338 if(key_info.home_multi_press_timer) {
339 ecore_timer_del(key_info.home_multi_press_timer);
340 key_info.home_multi_press_timer = NULL;
341 _D("delete homekey timer");
344 _D("create long press timer");
345 key_info.home_long_press_timer = ecore_timer_add(LONG_PRESS_TIMER_SEC, _launch_taskmgr_cb, NULL);
346 if (!key_info.home_long_press_timer) {
347 _E("Failed to add timer for long press detection");
349 } else if (!strcmp(ev->keyname, KEY_MEDIA)) {
350 _D("Media key is pressed");
351 } else if (!strcmp(ev->keyname, KEY_APPS)) {
352 _D("App tray key is pressed");
353 } else if (!strcmp(ev->keyname, KEY_TASKSWITCH)) {
354 _D("Task switch key is pressed");
355 } else if (!strcmp(ev->keyname, KEY_WEBPAGE)) {
356 _D("Web page key is pressed");
357 } else if (!strcmp(ev->keyname, KEY_MAIL)) {
358 _D("Mail key is pressed");
359 } else if (!strcmp(ev->keyname, KEY_SEARCH)) {
360 _D("Search key is pressed");
361 } else if (!strcmp(ev->keyname, KEY_VOICE)) {
362 _D("Voice key is pressed");
363 } else if (!strcmp(ev->keyname, KEY_CONNECT)) {
364 _D("Connect key is pressed");
367 return ECORE_CALLBACK_RENEW;
372 void _media_key_event_cb(media_key_e key, media_key_event_e status, void *user_data)
374 _D("MEDIA KEY EVENT : %d", key);
375 if (MEDIA_KEY_STATUS_PRESSED == status) return;
378 case MEDIA_KEY_PAUSE:
379 _release_multimedia_key("KEY_PAUSECD");
382 _release_multimedia_key("KEY_PLAYCD");
384 case MEDIA_KEY_PLAYPAUSE:
385 _release_multimedia_key("KEY_PLAYPAUSECD");
388 _E("cannot reach here, key[%d]", key);
395 void hw_key_create_window(void)
398 Ecore_X_Atom atomNotiWindow;
399 Ecore_X_Window keyrouter_notiwindow;
401 key_info.win = ecore_x_window_input_new(0, 0, 0, 1, 1);
403 _D("Failed to create hidden window");
406 ecore_x_event_mask_unset(key_info.win, ECORE_X_EVENT_MASK_NONE);
407 ecore_x_icccm_title_set(key_info.win, "menudaemon,key,receiver");
408 ecore_x_netwm_name_set(key_info.win, "menudaemon,key,receiver");
409 ecore_x_netwm_pid_set(key_info.win, getpid());
411 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_HOME, SHARED_GRAB);
412 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_VOLUMEDOWN, SHARED_GRAB);
413 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_VOLUMEUP, SHARED_GRAB);
414 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_CONFIG, SHARED_GRAB);
415 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_MEDIA, SHARED_GRAB);
416 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_APPS, SHARED_GRAB);
417 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_TASKSWITCH, SHARED_GRAB);
418 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_WEBPAGE, SHARED_GRAB);
419 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_MAIL, SHARED_GRAB);
420 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_SEARCH, SHARED_GRAB);
421 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_VOICE, SHARED_GRAB);
422 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_CONNECT, SHARED_GRAB);
423 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_POWER, SHARED_GRAB);
425 key_info.key_up = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_release_cb, NULL);
426 if (!key_info.key_up)
427 _E("Failed to register a key up event handler");
429 key_info.key_down = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_press_cb, NULL);
430 if (!key_info.key_down)
431 _E("Failed to register a key down event handler");
433 /* Get notifwindow */
434 atomNotiWindow = ecore_x_atom_get(STR_ATOM_KEYROUTER_NOTIWINDOW);
435 ret = ecore_x_window_prop_window_get(ecore_x_window_root_first_get(), atomNotiWindow, &keyrouter_notiwindow, 1);
437 _D("Succeed to get keyrouter notiwindow ! ret = %d (win=0x%x)\n"
438 , ret, keyrouter_notiwindow);
439 ecore_x_window_sniff(keyrouter_notiwindow);
440 key_info.keyrouter_notiwindow = keyrouter_notiwindow;
442 _E("Failed to get keyrouter notiwindow! ret = %d, atomNotiWindow = 0x%x, keyrouter_notiwindow = 0x%x"
443 , ret, atomNotiWindow, keyrouter_notiwindow);
446 media_key_reserve(_media_key_event_cb, NULL);
451 void hw_key_destroy_window(void)
453 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_HOME);
454 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_VOLUMEDOWN);
455 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_VOLUMEUP);
456 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_CONFIG);
457 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_MEDIA);
458 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_APPS);
459 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_TASKSWITCH);
460 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_WEBPAGE);
461 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_MAIL);
462 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_SEARCH);
463 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_VOICE);
464 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_CONNECT);
466 if (key_info.key_up) {
467 ecore_event_handler_del(key_info.key_up);
468 key_info.key_up = NULL;
471 if (key_info.key_down) {
472 ecore_event_handler_del(key_info.key_down);
473 key_info.key_down = NULL;
476 ecore_x_window_delete_request_send(key_info.win);
486 #include <Elementary.h>
488 #include <Ecore_Wayland.h>
489 #include <Ecore_Input.h>
490 #include <dd-deviced.h>
491 #include <syspopup_caller.h>
493 #include <system/media_key.h>
495 #include <feedback.h>
496 #include <system_settings.h>
499 #include "home_mgr.h"
501 #include "dbus_util.h"
502 #include "lock_mgr.h"
504 #include "process_mgr.h"
506 #define APPID_CAMERA "org.tizen.camera-app"
507 #define APPID_CALLLOG "org.tizen.calllog"
508 #define APPID_MUSIC_PLAYER "org.tizen.music-player"
509 #define APPID_TASKMGR "org.tizen.task-mgr"
510 #define APPID_BROWSER "org.tizen.browser"
511 #define APPID_EMAIL "org.tizen.email"
512 #define APPID_DIALER "org.tizen.phone"
514 #define STR_ATOM_KEYROUTER_NOTIWINDOW "_KEYROUTER_NOTIWINDOW"
516 #define LONG_PRESS_TIMER_SEC 0.4
517 #define HOMEKEY_TIMER_SEC 0.2
518 #define CANCEL_KEY_TIMER_SEC 0.3
521 const char *key_name[KEY_NAME_MAX] = {
522 "XF86AudioRaiseVolume",
523 "XF86AudioLowerVolume",
539 "XF86AudioPlayPause",
550 "XF86MonBrightnessDown",
551 "XF86MonBrightnessUp",
557 "XF86VoiceWakeUp_LPSD",
563 Ecore_Event_Handler *key_up;
564 Ecore_Event_Handler *key_down;
565 Ecore_Event_Handler *global_added;
566 Ecore_Event_Handler *keymap_update;
567 Ecore_Timer *home_long_press_timer;
568 Ecore_Timer *home_multi_press_timer;
570 Eina_Bool keymap_update_flag;
571 Eina_Bool global_added_flag;
576 .global_added = NULL,
577 .keymap_update = NULL,
578 .home_long_press_timer = NULL,
579 .home_multi_press_timer = NULL,
580 .cancel = EINA_FALSE,
581 .keymap_update_flag = EINA_FALSE,
582 .global_added_flag = EINA_FALSE,
588 static void _destroy_precondition_handlers_for_keygrab(void);
592 static void _cancel_key_events(void)
594 key_info.homekey_count = 0;
596 if (key_info.home_long_press_timer) {
597 ecore_timer_del(key_info.home_long_press_timer);
598 key_info.home_long_press_timer = NULL;
601 if(key_info.home_multi_press_timer) {
602 ecore_timer_del(key_info.home_multi_press_timer);
603 key_info.home_multi_press_timer = NULL;
609 #define SERVICE_OPERATION_POPUP_SEARCH "http://samsung.com/appcontrol/operation/search"
610 #define SEARCH_PKG_NAME "org.tizen.sfinder"
611 static int _launch_search(void)
613 app_control_h app_control;
614 int ret = APP_CONTROL_ERROR_NONE;
616 app_control_create(&app_control);
617 app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
618 app_control_set_app_id(app_control, SEARCH_PKG_NAME);
620 ret = app_control_send_launch_request(app_control, NULL, NULL);
622 if(ret != APP_CONTROL_ERROR_NONE) {
623 _E("Cannot launch search!! err[%d]", ret);
626 app_control_destroy(app_control);
632 static void _after_launch_taskmgr(int pid)
635 if(dbus_util_send_oomadj(pid, OOM_ADJ_VALUE_DEFAULT) < 0){
636 _E("failed to send oom dbus signal");
643 static Eina_Bool _launch_taskmgr_cb(void* data)
647 _D("Launch TASKMGR");
649 key_info.home_long_press_timer = NULL;
651 if (vconf_get_int(VCONFKEY_IDLE_LOCK_STATE, &val) < 0) {
652 _E("Cannot get VCONFKEY for lock state");
653 } else if (VCONFKEY_IDLE_LOCK == val) {
654 _E("lock state, ignore home key long press..!!");
655 return ECORE_CALLBACK_CANCEL;
658 process_mgr_must_launch(APPID_TASKMGR, NULL, NULL, NULL, _after_launch_taskmgr);
660 return ECORE_CALLBACK_CANCEL;
665 #define HOME_OP_KEY "__HOME_OP__"
666 #define HOME_OP_VAL_LAUNCH_BY_HOME_KEY "__LAUNCH_BY_HOME_KEY__"
667 static Eina_Bool _launch_by_home_key(void *data)
669 if (status_passive_get()->idle_lock_state > VCONFKEY_IDLE_UNLOCK) {
670 return ECORE_CALLBACK_CANCEL;
673 home_mgr_open_home(NULL, HOME_OP_KEY, HOME_OP_VAL_LAUNCH_BY_HOME_KEY);
675 return ECORE_CALLBACK_CANCEL;
680 static Eina_Bool _home_multi_press_timer_cb(void *data)
682 _W("homekey count[%d]", key_info.homekey_count);
684 key_info.home_multi_press_timer = NULL;
686 if (0 == key_info.homekey_count % 2) {
687 key_info.homekey_count = 0;
688 return ECORE_CALLBACK_CANCEL;
689 } else if(key_info.homekey_count >= 3) {
690 key_info.homekey_count = 0;
691 return ECORE_CALLBACK_CANCEL;
694 /* Single homekey operation */
695 key_info.homekey_count = 0;
696 _launch_by_home_key(data);
698 return ECORE_CALLBACK_CANCEL;
704 static void _release_multimedia_key(const char *value)
706 ret_if(NULL == value);
707 _D("Multimedia key is released with %s", value);
708 process_mgr_must_launch(APPID_MUSIC_PLAYER, "multimedia_key", value, NULL, NULL);
713 static Eina_Bool _key_release_cb(void *data, int type, void *event)
715 Evas_Event_Key_Up *ev = event;
717 retv_if(!ev, ECORE_CALLBACK_RENEW);
718 retv_if(!ev->keyname, ECORE_CALLBACK_RENEW);
720 _D("_key_release_cb : %s Released", ev->keyname);
722 /* Priority 1 : Cancel event */
723 if (!strcmp(ev->keyname, key_name[KEY_CANCEL])) {
724 _D("CANCEL Key is released");
725 key_info.cancel = EINA_FALSE;
726 return ECORE_CALLBACK_RENEW;
729 if (EINA_TRUE == key_info.cancel) {
731 return ECORE_CALLBACK_RENEW;
734 /* Priority 2 : Execute before checking the lock status */
735 if (!strcmp(ev->keyname, key_name[KEY_MEDIA])) {
736 _release_multimedia_key("KEY_PLAYCD");
737 return ECORE_CALLBACK_RENEW;
740 /* Priority 3 : Check the lock status */
741 if ((status_passive_get()->idle_lock_state == VCONFKEY_IDLE_LOCK)
742 && (status_active_get()->setappl_screen_lock_type_int > SETTING_SCREEN_LOCK_TYPE_NONE)) {
743 _D("phone lock state, ignore home key.");
744 return ECORE_CALLBACK_RENEW;
747 /* Priority 4 : These keys are only activated after checking the lock state */
749 if (!strcmp(ev->keyname, key_name[KEY_END])) {
752 if (!strcmp(ev->keyname, key_name[KEY_CONFIG])) {
753 //} else if (!strcmp(ev->keyname, key_name[KEY_SEND])) {
754 } else if (!strcmp(ev->keyname, key_name[KEY_HOME])) {
755 _W("Home Key is released");
757 syspopup_destroy_all();
759 if(key_info.home_multi_press_timer) {
760 _D("delete homekey timer");
761 ecore_timer_del(key_info.home_multi_press_timer);
762 key_info.home_multi_press_timer = NULL;
765 if (key_info.home_long_press_timer) {
766 ecore_timer_del(key_info.home_long_press_timer);
767 key_info.home_long_press_timer = NULL;
769 key_info.homekey_count = 0;
770 return ECORE_CALLBACK_RENEW;
773 key_info.home_multi_press_timer = ecore_timer_add(HOMEKEY_TIMER_SEC, _home_multi_press_timer_cb, NULL);
774 if (!key_info.home_multi_press_timer) {
775 _E("Critical! cannot add a timer for home multi press");
777 return ECORE_CALLBACK_RENEW;
778 //} else if (!strcmp(ev->keyname, key_name[KEY_PAUSE])) {
779 } else if (!strcmp(ev->keyname, key_name[KEY_APPS])) {
780 _D("App tray key is released");
781 } else if (!strcmp(ev->keyname, key_name[KEY_TASKSWITCH])) {
782 _D("Task switch key is released");
783 _launch_taskmgr_cb(NULL);
784 } else if (!strcmp(ev->keyname, key_name[KEY_WEBPAGE])) {
785 _D("Web page key is released");
786 process_mgr_must_open(APPID_BROWSER, NULL, NULL);
787 } else if (!strcmp(ev->keyname, key_name[KEY_MAIL])) {
788 _D("Mail key is released");
789 process_mgr_must_open(APPID_EMAIL, NULL, NULL);
790 } else if (!strcmp(ev->keyname, key_name[KEY_CONNECT])) {
791 _D("Connect key is released");
792 process_mgr_must_open(APPID_DIALER, NULL, NULL);
793 } else if (!strcmp(ev->keyname, key_name[KEY_SEARCH])) {
794 _D("Search key is released");
795 if (_launch_search() < 0) {
796 _E("Failed to launch the search");
798 } else if (!strcmp(ev->keyname, key_name[KEY_VOICE])) {
799 _D("Voice key is released");
802 return ECORE_CALLBACK_RENEW;
807 static Eina_Bool _key_press_cb(void *data, int type, void *event)
809 Evas_Event_Key_Down *ev = event;
811 retv_if(!ev, ECORE_CALLBACK_RENEW);
812 retv_if(!ev->keyname, ECORE_CALLBACK_RENEW);
814 _D("_key_press_cb : %s Pressed", ev->keyname);
816 /* Priority 1 : Cancel */
817 /* every reserved events have to be canceld when cancel key is pressed */
818 if (!strcmp(ev->keyname, key_name[KEY_CANCEL])) {
819 _D("Cancel button is pressed");
820 key_info.cancel = EINA_TRUE;
821 _cancel_key_events();
822 return ECORE_CALLBACK_RENEW;
825 if (EINA_TRUE == key_info.cancel) {
827 return ECORE_CALLBACK_RENEW;
830 /* Priority 2 : Check the lock status */
831 if ((status_passive_get()->idle_lock_state == VCONFKEY_IDLE_LOCK)
832 && (status_active_get()->setappl_screen_lock_type_int > SETTING_SCREEN_LOCK_TYPE_NONE)) {
833 _D("phone lock state, ignore key events.");
834 _cancel_key_events();
835 return ECORE_CALLBACK_RENEW;
838 /* Priority 3 : other keys */
840 if (!strcmp(ev->keyname, key_name[KEY_SEND])) {
841 _D("Launch calllog");
842 process_mgr_must_open(APPID_CALLLOG, NULL, NULL);
845 if(!strcmp(ev->keyname, key_name[KEY_CONFIG])) {
847 process_mgr_must_open(APPID_CAMERA, NULL, NULL);
848 } else if (!strcmp(ev->keyname, key_name[KEY_HOME])) {
849 _W("Home Key is pressed");
850 if (key_info.home_long_press_timer) {
851 ecore_timer_del(key_info.home_long_press_timer);
852 key_info.home_long_press_timer = NULL;
855 key_info.homekey_count++;
856 _W("homekey count : %d", key_info.homekey_count);
858 if(key_info.home_multi_press_timer) {
859 ecore_timer_del(key_info.home_multi_press_timer);
860 key_info.home_multi_press_timer = NULL;
861 _D("delete homekey timer");
864 _D("create long press timer");
865 key_info.home_long_press_timer = ecore_timer_add(LONG_PRESS_TIMER_SEC, _launch_taskmgr_cb, NULL);
866 if (!key_info.home_long_press_timer) {
867 _E("Failed to add timer for long press detection");
869 } else if (!strcmp(ev->keyname, key_name[KEY_MEDIA])) {
870 _D("Media key is pressed");
871 } else if (!strcmp(ev->keyname, key_name[KEY_APPS])) {
872 _D("App tray key is pressed");
873 } else if (!strcmp(ev->keyname, key_name[KEY_TASKSWITCH])) {
874 _D("Task switch key is pressed");
875 } else if (!strcmp(ev->keyname, key_name[KEY_WEBPAGE])) {
876 _D("Web page key is pressed");
877 } else if (!strcmp(ev->keyname, key_name[KEY_MAIL])) {
878 _D("Mail key is pressed");
879 } else if (!strcmp(ev->keyname, key_name[KEY_SEARCH])) {
880 _D("Search key is pressed");
881 } else if (!strcmp(ev->keyname, key_name[KEY_VOICE])) {
882 _D("Voice key is pressed");
883 } else if (!strcmp(ev->keyname, key_name[KEY_CONNECT])) {
884 _D("Connect key is pressed");
887 return ECORE_CALLBACK_RENEW;
892 static void _set_keygrab(void)
897 if (key_info.keymap_update_flag != EINA_TRUE || key_info.global_added_flag != EINA_TRUE) {
898 _E("keygrab is not ready");
902 _destroy_precondition_handlers_for_keygrab();
904 for (i = 0; i < KEY_NAME_MAX; i++) {
905 ret = ecore_wl_window_keygrab_set(NULL, key_name[i], 0, 0, 0, ECORE_WL_WINDOW_KEYGRAB_SHARED);
906 _D("key grab : %s / ret : %d", key_name[i], ret);
909 key_info.key_up = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_release_cb, NULL);
910 if (!key_info.key_up) {
911 _E("Failed to register a key up event handler");
914 key_info.key_down = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_press_cb, NULL);
915 if (!key_info.key_down) {
916 _E("Failed to register a key down event handler");
922 static void _unset_keygrab(void)
926 if (key_info.keymap_update_flag == EINA_TRUE && key_info.global_added_flag == EINA_TRUE) {
927 for (i = 0; i < KEY_NAME_MAX; i++) {
928 ecore_wl_window_keygrab_unset(NULL, key_name[i], 0, 0);
931 key_info.keymap_update_flag = EINA_FALSE;
932 key_info.global_added_flag = EINA_FALSE;
938 static Eina_Bool _global_added_cb(void *data, int type, void *event)
940 Ecore_Wl_Event_Global *ev = NULL;
942 ev = (Ecore_Wl_Event_Global *) event;
944 _E("Failed to get global added event");
945 return ECORE_CALLBACK_CANCEL;
948 if (ev->interface && !strncmp(ev->interface, "tizen_keyrouter", strlen(ev->interface))) {
949 key_info.global_added_flag = EINA_TRUE;
953 return ECORE_CALLBACK_PASS_ON;
958 static Eina_Bool _keymap_update_cb(void *data, int type, void *event)
960 Ecore_Wl_Event_Keymap_Update *ev = NULL;
961 Ecore_Wl_Input *input = NULL;
962 struct xkb_keymap *keymap = NULL;
964 ev = (Ecore_Wl_Event_Keymap_Update *) event;
966 _E("Failed to get keymap event");
967 return ECORE_CALLBACK_CANCEL;
970 input = ecore_wl_input_get();
972 _E("Failed to get wl input");
973 return ECORE_CALLBACK_CANCEL;
976 keymap = ecore_wl_input_keymap_get(input);
977 if (ev->keymap && keymap) {
978 key_info.keymap_update_flag = EINA_TRUE;
982 return ECORE_CALLBACK_PASS_ON;
987 static void _create_precondition_handlers_for_keygrab(void)
989 key_info.global_added = ecore_event_handler_add(ECORE_WL_EVENT_GLOBAL_ADDED, _global_added_cb, NULL);
990 if (!key_info.global_added) {
991 _E("Failed to add handler for global added");
994 key_info.keymap_update = ecore_event_handler_add(ECORE_WL_EVENT_KEYMAP_UPDATE, _keymap_update_cb, NULL);
995 if (!key_info.keymap_update) {
996 _E("Failed to add handler for keymap update");
1002 static void _destroy_precondition_handlers_for_keygrab(void)
1004 if (key_info.global_added) {
1005 ecore_event_handler_del(key_info.global_added);
1006 key_info.global_added = NULL;
1009 if (key_info.keymap_update) {
1010 ecore_event_handler_del(key_info.keymap_update);
1011 key_info.keymap_update = NULL;
1017 void hw_key_create_window(void)
1019 _create_precondition_handlers_for_keygrab();
1024 void hw_key_destroy_window(void)
1026 if (key_info.key_up) {
1027 ecore_event_handler_del(key_info.key_up);
1028 key_info.key_up = NULL;
1031 if (key_info.key_down) {
1032 ecore_event_handler_del(key_info.key_down);
1033 key_info.key_down = NULL;
1036 _destroy_precondition_handlers_for_keygrab();