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 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 ret = home_mgr_open_home(NULL);
130 dbus_util_send_home_raise_signal();
133 return ECORE_CALLBACK_CANCEL;
138 static Eina_Bool _home_multi_press_timer_cb(void *data)
140 _W("homekey count[%d]", key_info.homekey_count);
142 key_info.home_multi_press_timer = NULL;
144 if(0 == key_info.homekey_count % 2) {
145 key_info.homekey_count = 0;
146 return ECORE_CALLBACK_CANCEL;
147 } else if(key_info.homekey_count >= 3) {
148 key_info.homekey_count = 0;
149 return ECORE_CALLBACK_CANCEL;
152 /* Single homekey operation */
153 key_info.homekey_count = 0;
154 _launch_by_home_key(data);
156 return ECORE_CALLBACK_CANCEL;
162 #define SERVICE_OPERATION_POPUP_SEARCH "http://samsung.com/appcontrol/operation/search"
163 #define SEARCH_PKG_NAME "org.tizen.sfinder"
164 static int _launch_search(void)
166 app_control_h app_control;
167 int ret = APP_CONTROL_ERROR_NONE;
169 app_control_create(&app_control);
170 app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
171 app_control_set_app_id(app_control, SEARCH_PKG_NAME);
173 ret = app_control_send_launch_request(app_control, NULL, NULL);
175 if(ret != APP_CONTROL_ERROR_NONE) {
176 _E("Cannot launch search!! err[%d]", ret);
179 app_control_destroy(app_control);
185 static void _cancel_key_events(void)
187 key_info.homekey_count = 0;
189 if (key_info.home_long_press_timer) {
190 ecore_timer_del(key_info.home_long_press_timer);
191 key_info.home_long_press_timer = NULL;
194 if(key_info.home_multi_press_timer) {
195 ecore_timer_del(key_info.home_multi_press_timer);
196 key_info.home_multi_press_timer = NULL;
202 static Eina_Bool _key_release_cb(void *data, int type, void *event)
204 Evas_Event_Key_Up *ev = event;
206 retv_if(!ev, ECORE_CALLBACK_RENEW);
207 retv_if(!ev->keyname, ECORE_CALLBACK_RENEW);
209 _D("_key_release_cb : %s Released", ev->keyname);
211 /* Priority 1 : Cancel event */
212 if (!strcmp(ev->keyname, KEY_CANCEL)) {
213 _D("CANCEL Key is released");
214 key_info.cancel = EINA_FALSE;
215 return ECORE_CALLBACK_RENEW;
218 if (EINA_TRUE == key_info.cancel) {
220 return ECORE_CALLBACK_RENEW;
223 /* Priority 2 : Execute before checking the lock status */
224 if (!strcmp(ev->keyname, KEY_MEDIA)) {
225 _release_multimedia_key("KEY_PLAYCD");
226 return ECORE_CALLBACK_RENEW;
229 /* Priority 3 : Check the lock status */
230 if ((status_passive_get()->idle_lock_state == VCONFKEY_IDLE_LOCK)
231 && (status_active_get()->setappl_screen_lock_type_int > SETTING_SCREEN_LOCK_TYPE_NONE)) {
232 if (!strcmp(ev->keyname, KEY_BACK)) {
233 _D("Back key is released");
235 _D("phone lock state, ignore home key.");
237 return ECORE_CALLBACK_RENEW;
240 /* Priority 4 : These keys are only activated after checking the lock state */
241 if (!strcmp(ev->keyname, KEY_END)) {
242 } else if (!strcmp(ev->keyname, KEY_CONFIG)) {
243 } else if (!strcmp(ev->keyname, KEY_SEND)) {
244 } else if (!strcmp(ev->keyname, KEY_HOME)) {
245 _W("Home Key is released");
247 syspopup_destroy_all();
249 if(key_info.home_multi_press_timer) {
250 _D("delete homekey timer");
251 ecore_timer_del(key_info.home_multi_press_timer);
252 key_info.home_multi_press_timer = NULL;
255 if (key_info.home_long_press_timer) {
256 ecore_timer_del(key_info.home_long_press_timer);
257 key_info.home_long_press_timer = NULL;
259 key_info.homekey_count = 0;
260 return ECORE_CALLBACK_RENEW;
263 key_info.home_multi_press_timer = ecore_timer_add(HOMEKEY_TIMER_SEC, _home_multi_press_timer_cb, NULL);
264 if (!key_info.home_multi_press_timer) {
265 _E("Critical! cannot add a timer for home multi press");
267 return ECORE_CALLBACK_RENEW;
268 } else if (!strcmp(ev->keyname, KEY_PAUSE)) {
269 } else if (!strcmp(ev->keyname, KEY_APPS)) {
270 _D("App tray key is released");
271 } else if (!strcmp(ev->keyname, KEY_TASKSWITCH)) {
272 _D("Task switch key is released");
273 _launch_taskmgr_cb(NULL);
274 } else if (!strcmp(ev->keyname, KEY_WEBPAGE)) {
275 _D("Web page key is released");
276 process_mgr_must_open(APPID_BROWSER, NULL, NULL);
277 } else if (!strcmp(ev->keyname, KEY_MAIL)) {
278 _D("Mail key is released");
279 process_mgr_must_open(APPID_EMAIL, NULL, NULL);
280 } else if (!strcmp(ev->keyname, KEY_CONNECT)) {
281 _D("Connect key is released");
282 process_mgr_must_open(APPID_DIALER, NULL, NULL);
283 } else if (!strcmp(ev->keyname, KEY_SEARCH)) {
284 _D("Search key is released");
285 if (_launch_search() < 0) {
286 _E("Failed to launch the search");
288 } else if (!strcmp(ev->keyname, KEY_VOICE)) {
289 _D("Voice key is released");
292 return ECORE_CALLBACK_RENEW;
297 static Eina_Bool _key_press_cb(void *data, int type, void *event)
299 Evas_Event_Key_Down *ev = event;
301 retv_if(!ev, ECORE_CALLBACK_RENEW);
302 retv_if(!ev->keyname, ECORE_CALLBACK_RENEW);
304 _D("_key_press_cb : %s Pressed", ev->keyname);
306 /* Priority 1 : Cancel */
307 /* every reserved events have to be canceld when cancel key is pressed */
308 if (!strcmp(ev->keyname, KEY_CANCEL)) {
309 _D("Cancel button is pressed");
310 key_info.cancel = EINA_TRUE;
311 _cancel_key_events();
312 return ECORE_CALLBACK_RENEW;
315 if (EINA_TRUE == key_info.cancel) {
317 return ECORE_CALLBACK_RENEW;
320 /* Priority 2 : Check the lock status */
321 if ((status_passive_get()->idle_lock_state == VCONFKEY_IDLE_LOCK)
322 && (status_active_get()->setappl_screen_lock_type_int > SETTING_SCREEN_LOCK_TYPE_NONE)) {
323 _D("phone lock state, ignore key events.");
324 _cancel_key_events();
325 return ECORE_CALLBACK_RENEW;
328 /* Priority 3 : other keys */
329 if (!strcmp(ev->keyname, KEY_SEND)) {
330 _D("Launch calllog");
331 process_mgr_must_open(APPID_CALLLOG, NULL, NULL);
332 } else if(!strcmp(ev->keyname, KEY_CONFIG)) {
334 process_mgr_must_open(APPID_CAMERA, NULL, NULL);
335 } else if (!strcmp(ev->keyname, KEY_HOME)) {
336 _W("Home Key is pressed");
337 if (key_info.home_long_press_timer) {
338 ecore_timer_del(key_info.home_long_press_timer);
339 key_info.home_long_press_timer = NULL;
342 key_info.homekey_count++;
343 _W("homekey count : %d", key_info.homekey_count);
345 if(key_info.home_multi_press_timer) {
346 ecore_timer_del(key_info.home_multi_press_timer);
347 key_info.home_multi_press_timer = NULL;
348 _D("delete homekey timer");
351 _D("create long press timer");
352 key_info.home_long_press_timer = ecore_timer_add(LONG_PRESS_TIMER_SEC, _launch_taskmgr_cb, NULL);
353 if (!key_info.home_long_press_timer) {
354 _E("Failed to add timer for long press detection");
356 } else if (!strcmp(ev->keyname, KEY_MEDIA)) {
357 _D("Media key is pressed");
358 } else if (!strcmp(ev->keyname, KEY_APPS)) {
359 _D("App tray key is pressed");
360 } else if (!strcmp(ev->keyname, KEY_TASKSWITCH)) {
361 _D("Task switch key is pressed");
362 } else if (!strcmp(ev->keyname, KEY_WEBPAGE)) {
363 _D("Web page key is pressed");
364 } else if (!strcmp(ev->keyname, KEY_MAIL)) {
365 _D("Mail key is pressed");
366 } else if (!strcmp(ev->keyname, KEY_SEARCH)) {
367 _D("Search key is pressed");
368 } else if (!strcmp(ev->keyname, KEY_VOICE)) {
369 _D("Voice key is pressed");
370 } else if (!strcmp(ev->keyname, KEY_CONNECT)) {
371 _D("Connect key is pressed");
374 return ECORE_CALLBACK_RENEW;
379 void _media_key_event_cb(media_key_e key, media_key_event_e status, void *user_data)
381 _D("MEDIA KEY EVENT : %d", key);
382 if (MEDIA_KEY_STATUS_PRESSED == status) return;
385 case MEDIA_KEY_PAUSE:
386 _release_multimedia_key("KEY_PAUSECD");
389 _release_multimedia_key("KEY_PLAYCD");
391 case MEDIA_KEY_PLAYPAUSE:
392 _release_multimedia_key("KEY_PLAYPAUSECD");
395 _E("cannot reach here, key[%d]", key);
402 void hw_key_create_window(void)
405 Ecore_X_Atom atomNotiWindow;
406 Ecore_X_Window keyrouter_notiwindow;
408 key_info.win = ecore_x_window_input_new(0, 0, 0, 1, 1);
410 _D("Failed to create hidden window");
413 ecore_x_event_mask_unset(key_info.win, ECORE_X_EVENT_MASK_NONE);
414 ecore_x_icccm_title_set(key_info.win, "menudaemon,key,receiver");
415 ecore_x_netwm_name_set(key_info.win, "menudaemon,key,receiver");
416 ecore_x_netwm_pid_set(key_info.win, getpid());
418 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_HOME, SHARED_GRAB);
419 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_VOLUMEDOWN, SHARED_GRAB);
420 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_VOLUMEUP, SHARED_GRAB);
421 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_CONFIG, SHARED_GRAB);
422 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_MEDIA, SHARED_GRAB);
423 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_APPS, SHARED_GRAB);
424 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_TASKSWITCH, SHARED_GRAB);
425 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_WEBPAGE, SHARED_GRAB);
426 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_MAIL, SHARED_GRAB);
427 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_SEARCH, SHARED_GRAB);
428 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_VOICE, SHARED_GRAB);
429 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_CONNECT, SHARED_GRAB);
430 utilx_grab_key(ecore_x_display_get(), key_info.win, KEY_POWER, SHARED_GRAB);
432 key_info.key_up = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_release_cb, NULL);
433 if (!key_info.key_up)
434 _E("Failed to register a key up event handler");
436 key_info.key_down = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_press_cb, NULL);
437 if (!key_info.key_down)
438 _E("Failed to register a key down event handler");
440 /* Get notifwindow */
441 atomNotiWindow = ecore_x_atom_get(STR_ATOM_KEYROUTER_NOTIWINDOW);
442 ret = ecore_x_window_prop_window_get(ecore_x_window_root_first_get(), atomNotiWindow, &keyrouter_notiwindow, 1);
444 _D("Succeed to get keyrouter notiwindow ! ret = %d (win=0x%x)\n"
445 , ret, keyrouter_notiwindow);
446 ecore_x_window_sniff(keyrouter_notiwindow);
447 key_info.keyrouter_notiwindow = keyrouter_notiwindow;
449 _E("Failed to get keyrouter notiwindow! ret = %d, atomNotiWindow = 0x%x, keyrouter_notiwindow = 0x%x"
450 , ret, atomNotiWindow, keyrouter_notiwindow);
453 media_key_reserve(_media_key_event_cb, NULL);
458 void hw_key_destroy_window(void)
460 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_HOME);
461 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_VOLUMEDOWN);
462 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_VOLUMEUP);
463 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_CONFIG);
464 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_MEDIA);
465 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_APPS);
466 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_TASKSWITCH);
467 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_WEBPAGE);
468 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_MAIL);
469 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_SEARCH);
470 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_VOICE);
471 utilx_ungrab_key(ecore_x_display_get(), key_info.win, KEY_CONNECT);
473 if (key_info.key_up) {
474 ecore_event_handler_del(key_info.key_up);
475 key_info.key_up = NULL;
478 if (key_info.key_down) {
479 ecore_event_handler_del(key_info.key_down);
480 key_info.key_down = NULL;
483 ecore_x_window_delete_request_send(key_info.win);
493 #include <Elementary.h>
495 #include <Ecore_Wayland.h>
496 #include <Ecore_Input.h>
497 #include <dd-deviced.h>
498 #include <syspopup_caller.h>
500 #include <system/media_key.h>
502 #include <feedback.h>
503 #include <system_settings.h>
506 #include "home_mgr.h"
508 #include "dbus_util.h"
509 #include "lock_mgr.h"
511 #include "process_mgr.h"
513 #define APPID_CAMERA "org.tizen.camera-app"
514 #define APPID_CALLLOG "org.tizen.calllog"
515 #define APPID_MUSIC_PLAYER "org.tizen.music-player"
516 #define APPID_TASKMGR "org.tizen.task-mgr"
517 #define APPID_BROWSER "org.tizen.browser"
518 #define APPID_EMAIL "org.tizen.email"
519 #define APPID_DIALER "org.tizen.phone"
521 #define STR_ATOM_KEYROUTER_NOTIWINDOW "_KEYROUTER_NOTIWINDOW"
523 #define LONG_PRESS_TIMER_SEC 0.4
524 #define HOMEKEY_TIMER_SEC 0.2
525 #define CANCEL_KEY_TIMER_SEC 0.3
528 const char *key_name[KEY_NAME_MAX] = {
529 "XF86AudioRaiseVolume",
530 "XF86AudioLowerVolume",
546 "XF86AudioPlayPause",
557 "XF86MonBrightnessDown",
558 "XF86MonBrightnessUp",
564 "XF86VoiceWakeUp_LPSD",
570 Ecore_Event_Handler *key_up;
571 Ecore_Event_Handler *key_down;
572 Ecore_Timer *home_long_press_timer;
573 Ecore_Timer *home_multi_press_timer;
574 Ecore_Timer *keygrab_timer;
580 .home_long_press_timer = NULL,
581 .home_multi_press_timer = NULL,
582 .keygrab_timer = NULL,
583 .cancel = EINA_FALSE,
590 static void _cancel_key_events(void)
592 key_info.homekey_count = 0;
594 if (key_info.home_long_press_timer) {
595 ecore_timer_del(key_info.home_long_press_timer);
596 key_info.home_long_press_timer = NULL;
599 if(key_info.home_multi_press_timer) {
600 ecore_timer_del(key_info.home_multi_press_timer);
601 key_info.home_multi_press_timer = NULL;
607 #define SERVICE_OPERATION_POPUP_SEARCH "http://samsung.com/appcontrol/operation/search"
608 #define SEARCH_PKG_NAME "org.tizen.sfinder"
609 static int _launch_search(void)
611 app_control_h app_control;
612 int ret = APP_CONTROL_ERROR_NONE;
614 app_control_create(&app_control);
615 app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
616 app_control_set_app_id(app_control, SEARCH_PKG_NAME);
618 ret = app_control_send_launch_request(app_control, NULL, NULL);
620 if(ret != APP_CONTROL_ERROR_NONE) {
621 _E("Cannot launch search!! err[%d]", ret);
624 app_control_destroy(app_control);
630 static void _after_launch_taskmgr(int pid)
633 if(dbus_util_send_oomadj(pid, OOM_ADJ_VALUE_DEFAULT) < 0){
634 _E("failed to send oom dbus signal");
641 static Eina_Bool _launch_taskmgr_cb(void* data)
645 _D("Launch TASKMGR");
647 key_info.home_long_press_timer = NULL;
649 if (vconf_get_int(VCONFKEY_IDLE_LOCK_STATE, &val) < 0) {
650 _E("Cannot get VCONFKEY for lock state");
651 } else if (VCONFKEY_IDLE_LOCK == val) {
652 _E("lock state, ignore home key long press..!!");
653 return ECORE_CALLBACK_CANCEL;
656 process_mgr_must_launch(APPID_TASKMGR, NULL, NULL, NULL, _after_launch_taskmgr);
658 return ECORE_CALLBACK_CANCEL;
663 static Eina_Bool _launch_by_home_key(void *data)
667 if (status_passive_get()->idle_lock_state > VCONFKEY_IDLE_UNLOCK) {
668 return ECORE_CALLBACK_CANCEL;
671 ret = home_mgr_open_home(NULL);
673 dbus_util_send_home_raise_signal();
676 return ECORE_CALLBACK_CANCEL;
681 static Eina_Bool _home_multi_press_timer_cb(void *data)
683 _W("homekey count[%d]", key_info.homekey_count);
685 key_info.home_multi_press_timer = NULL;
687 if(0 == key_info.homekey_count % 2) {
688 key_info.homekey_count = 0;
689 return ECORE_CALLBACK_CANCEL;
690 } else if(key_info.homekey_count >= 3) {
691 key_info.homekey_count = 0;
692 return ECORE_CALLBACK_CANCEL;
695 /* Single homekey operation */
696 key_info.homekey_count = 0;
697 _launch_by_home_key(data);
699 return ECORE_CALLBACK_CANCEL;
705 static void _release_multimedia_key(const char *value)
707 ret_if(NULL == value);
708 _D("Multimedia key is released with %s", value);
709 process_mgr_must_launch(APPID_MUSIC_PLAYER, "multimedia_key", value, NULL, NULL);
714 static Eina_Bool _key_release_cb(void *data, int type, void *event)
716 Evas_Event_Key_Up *ev = event;
718 retv_if(!ev, ECORE_CALLBACK_RENEW);
719 retv_if(!ev->keyname, ECORE_CALLBACK_RENEW);
721 _D("_key_release_cb : %s Released", ev->keyname);
723 /* Priority 1 : Cancel event */
724 if (!strcmp(ev->keyname, key_name[KEY_CANCEL])) {
725 _D("CANCEL Key is released");
726 key_info.cancel = EINA_FALSE;
727 return ECORE_CALLBACK_RENEW;
730 if (EINA_TRUE == key_info.cancel) {
732 return ECORE_CALLBACK_RENEW;
735 /* Priority 2 : Execute before checking the lock status */
736 if (!strcmp(ev->keyname, key_name[KEY_MEDIA])) {
737 _release_multimedia_key("KEY_PLAYCD");
738 return ECORE_CALLBACK_RENEW;
741 /* Priority 3 : Check the lock status */
742 if ((status_passive_get()->idle_lock_state == VCONFKEY_IDLE_LOCK)
743 && (status_active_get()->setappl_screen_lock_type_int > SETTING_SCREEN_LOCK_TYPE_NONE)) {
744 if (!strcmp(ev->keyname, key_name[KEY_BACK])) {
745 _D("Back key is released");
747 _D("phone lock state, ignore home key.");
749 return ECORE_CALLBACK_RENEW;
752 /* Priority 4 : These keys are only activated after checking the lock state */
754 if (!strcmp(ev->keyname, key_name[KEY_END])) {
757 if (!strcmp(ev->keyname, key_name[KEY_CONFIG])) {
758 //} else if (!strcmp(ev->keyname, key_name[KEY_SEND])) {
759 } else if (!strcmp(ev->keyname, key_name[KEY_HOME])) {
760 _W("Home Key is released");
762 syspopup_destroy_all();
764 if(key_info.home_multi_press_timer) {
765 _D("delete homekey timer");
766 ecore_timer_del(key_info.home_multi_press_timer);
767 key_info.home_multi_press_timer = NULL;
770 if (key_info.home_long_press_timer) {
771 ecore_timer_del(key_info.home_long_press_timer);
772 key_info.home_long_press_timer = NULL;
774 key_info.homekey_count = 0;
775 return ECORE_CALLBACK_RENEW;
778 key_info.home_multi_press_timer = ecore_timer_add(HOMEKEY_TIMER_SEC, _home_multi_press_timer_cb, NULL);
779 if (!key_info.home_multi_press_timer) {
780 _E("Critical! cannot add a timer for home multi press");
782 return ECORE_CALLBACK_RENEW;
783 //} else if (!strcmp(ev->keyname, key_name[KEY_PAUSE])) {
784 } else if (!strcmp(ev->keyname, key_name[KEY_APPS])) {
785 _D("App tray key is released");
786 } else if (!strcmp(ev->keyname, key_name[KEY_TASKSWITCH])) {
787 _D("Task switch key is released");
788 _launch_taskmgr_cb(NULL);
789 } else if (!strcmp(ev->keyname, key_name[KEY_WEBPAGE])) {
790 _D("Web page key is released");
791 process_mgr_must_open(APPID_BROWSER, NULL, NULL);
792 } else if (!strcmp(ev->keyname, key_name[KEY_MAIL])) {
793 _D("Mail key is released");
794 process_mgr_must_open(APPID_EMAIL, NULL, NULL);
795 } else if (!strcmp(ev->keyname, key_name[KEY_CONNECT])) {
796 _D("Connect key is released");
797 process_mgr_must_open(APPID_DIALER, NULL, NULL);
798 } else if (!strcmp(ev->keyname, key_name[KEY_SEARCH])) {
799 _D("Search key is released");
800 if (_launch_search() < 0) {
801 _E("Failed to launch the search");
803 } else if (!strcmp(ev->keyname, key_name[KEY_VOICE])) {
804 _D("Voice key is released");
807 return ECORE_CALLBACK_RENEW;
812 static Eina_Bool _key_press_cb(void *data, int type, void *event)
814 Evas_Event_Key_Down *ev = event;
816 retv_if(!ev, ECORE_CALLBACK_RENEW);
817 retv_if(!ev->keyname, ECORE_CALLBACK_RENEW);
819 _D("_key_press_cb : %s Pressed", ev->keyname);
821 /* Priority 1 : Cancel */
822 /* every reserved events have to be canceld when cancel key is pressed */
823 if (!strcmp(ev->keyname, key_name[KEY_CANCEL])) {
824 _D("Cancel button is pressed");
825 key_info.cancel = EINA_TRUE;
826 _cancel_key_events();
827 return ECORE_CALLBACK_RENEW;
830 if (EINA_TRUE == key_info.cancel) {
832 return ECORE_CALLBACK_RENEW;
835 /* Priority 2 : Check the lock status */
836 if ((status_passive_get()->idle_lock_state == VCONFKEY_IDLE_LOCK)
837 && (status_active_get()->setappl_screen_lock_type_int > SETTING_SCREEN_LOCK_TYPE_NONE)) {
838 _D("phone lock state, ignore key events.");
839 _cancel_key_events();
840 return ECORE_CALLBACK_RENEW;
843 /* Priority 3 : other keys */
845 if (!strcmp(ev->keyname, key_name[KEY_SEND])) {
846 _D("Launch calllog");
847 process_mgr_must_open(APPID_CALLLOG, NULL, NULL);
850 if(!strcmp(ev->keyname, key_name[KEY_CONFIG])) {
852 process_mgr_must_open(APPID_CAMERA, NULL, NULL);
853 } else if (!strcmp(ev->keyname, key_name[KEY_HOME])) {
854 _W("Home Key is pressed");
855 if (key_info.home_long_press_timer) {
856 ecore_timer_del(key_info.home_long_press_timer);
857 key_info.home_long_press_timer = NULL;
860 key_info.homekey_count++;
861 _W("homekey count : %d", key_info.homekey_count);
863 if(key_info.home_multi_press_timer) {
864 ecore_timer_del(key_info.home_multi_press_timer);
865 key_info.home_multi_press_timer = NULL;
866 _D("delete homekey timer");
869 _D("create long press timer");
870 key_info.home_long_press_timer = ecore_timer_add(LONG_PRESS_TIMER_SEC, _launch_taskmgr_cb, NULL);
871 if (!key_info.home_long_press_timer) {
872 _E("Failed to add timer for long press detection");
874 } else if (!strcmp(ev->keyname, key_name[KEY_MEDIA])) {
875 _D("Media key is pressed");
876 } else if (!strcmp(ev->keyname, key_name[KEY_APPS])) {
877 _D("App tray key is pressed");
878 } else if (!strcmp(ev->keyname, key_name[KEY_TASKSWITCH])) {
879 _D("Task switch key is pressed");
880 } else if (!strcmp(ev->keyname, key_name[KEY_WEBPAGE])) {
881 _D("Web page key is pressed");
882 } else if (!strcmp(ev->keyname, key_name[KEY_MAIL])) {
883 _D("Mail key is pressed");
884 } else if (!strcmp(ev->keyname, key_name[KEY_SEARCH])) {
885 _D("Search key is pressed");
886 } else if (!strcmp(ev->keyname, key_name[KEY_VOICE])) {
887 _D("Voice key is pressed");
888 } else if (!strcmp(ev->keyname, key_name[KEY_CONNECT])) {
889 _D("Connect key is pressed");
892 return ECORE_CALLBACK_RENEW;
897 static Eina_Bool __keygrab_timer_cb(void *data)
902 for (i = 0; i < KEY_NAME_MAX; i++) {
903 ret = ecore_wl_window_keygrab_set(NULL, key_name[i], 0, 0, 0, ECORE_WL_WINDOW_KEYGRAB_SHARED);
904 _D("key grab : %s / ret : %d", key_name[i], ret);
907 key_info.key_up = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_release_cb, NULL);
908 if (!key_info.key_up) {
909 _E("Failed to register a key up event handler");
912 key_info.key_down = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_press_cb, NULL);
913 if (!key_info.key_down) {
914 _E("Failed to register a key down event handler");
917 return ECORE_CALLBACK_CANCEL;
922 void hw_key_create_window(void)
924 if (key_info.keygrab_timer) {
925 ecore_timer_del(key_info.keygrab_timer);
926 key_info.keygrab_timer = NULL;
929 key_info.keygrab_timer = ecore_timer_add(1.0f, __keygrab_timer_cb, NULL);
930 if (!key_info.keygrab_timer) {
931 _E("Failed to add timer for keygrab");
937 void hw_key_destroy_window(void)
941 for (i = 0; i < KEY_NAME_MAX; i++) {
942 ecore_wl_window_keygrab_unset(NULL, key_name[i], 0, 0);
945 if (key_info.keygrab_timer) {
946 ecore_timer_del(key_info.keygrab_timer);
947 key_info.keygrab_timer = NULL;
950 if (key_info.key_up) {
951 ecore_event_handler_del(key_info.key_up);
952 key_info.key_up = NULL;
955 if (key_info.key_down) {
956 ecore_event_handler_del(key_info.key_down);
957 key_info.key_down = NULL;