The source code moved from the SPIN with license changed to Flora 1.1
[apps/native/home/homescreen-efl.git] / src / key.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.1 (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://floralicense.org/license/
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 #include <Elementary.h>
18 #include <Ecore.h>
19 #include <Eina.h>
20
21 #include "homescreen-efl.h"
22 #include "option_menu.h"
23 #include "livebox/livebox_panel.h"
24 #include "livebox_all_pages.h"
25 #include "folder_panel.h"
26 #include "popup.h"
27 #include "util.h"
28
29 static Eina_Bool __key_release_cb(void *data, int type, void *event);
30 static Eina_Bool __key_press_cb(void *data, int type, void *event);
31
32
33 static struct {
34         Eina_Bool pressed;
35         Ecore_Event_Handler *press_handler;
36         Ecore_Event_Handler *release_handler;
37         Eina_Bool register_handler;
38 } key_info_s = {
39         .pressed = EINA_FALSE,
40         .press_handler = NULL,
41         .release_handler = NULL,
42         .register_handler = EINA_FALSE
43 };
44
45
46 HAPI void key_register(void)
47 {
48         if (!key_info_s.release_handler) {
49                 key_info_s.release_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, __key_release_cb, NULL);
50                 if (!key_info_s.release_handler)
51                         LOGE("Failed to register a key up event handler");
52         }
53
54         if (!key_info_s.press_handler) {
55                 key_info_s.press_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, __key_press_cb, NULL);
56                 if (!key_info_s.press_handler)
57                         LOGE("Failed to register a key down event handler");
58         }
59
60         key_info_s.pressed = EINA_FALSE;
61         key_info_s.register_handler = EINA_TRUE;
62 }
63
64
65 HAPI void key_unregister(void)
66 {
67         if (key_info_s.release_handler) {
68                 ecore_event_handler_del(key_info_s.release_handler);
69                 key_info_s.release_handler = NULL;
70         }
71
72         if (key_info_s.press_handler) {
73                 ecore_event_handler_del(key_info_s.press_handler);
74                 key_info_s.press_handler = NULL;
75         }
76
77         key_info_s.register_handler = EINA_FALSE;
78 }
79
80
81 static Eina_Bool __key_press_cb(void *data, int type, void *event)
82 {
83         Evas_Event_Key_Down *ev = event;
84
85         if (!key_info_s.register_handler || !ev)
86                 return ECORE_CALLBACK_RENEW;
87
88         key_info_s.pressed = EINA_TRUE;
89
90         return ECORE_CALLBACK_RENEW;
91 }
92
93
94 static Eina_Bool __key_release_cb(void *data, int type, void *event)
95 {
96         Evas_Event_Key_Up *ev = event;
97
98         if (!key_info_s.register_handler || !ev)
99                 return ECORE_CALLBACK_RENEW;
100
101         LOGD("Key(%s) released %d", ev->keyname, key_info_s.pressed);
102
103         if (key_info_s.pressed == EINA_FALSE)
104                 return ECORE_CALLBACK_RENEW;
105
106         if (!strcmp(ev->keyname, KEY_MENU)) {
107                 LOGD("Menu pressed");
108                 option_menu_change_state_on_hw_menu_key();
109
110                 return ECORE_CALLBACK_RENEW;
111         }
112
113         /*TODO: Keyname to key menu and key home are the same, so this code is doesn't execute*/
114         if (!strcmp(ev->keyname, KEY_HOME)) {
115                 LOGD("Home pressed");
116                 home_screen_set_view_type(HOMESCREEN_VIEW_HOME);
117
118                 return ECORE_CALLBACK_RENEW;
119         }
120
121         if (!strcmp(ev->keyname, KEY_BACK)) {
122                 homescreen_view_t view_t = home_screen_get_view_type();
123
124                 option_menu_hide();
125                 if (popup_destroy()) {
126                         /*we need to close only popup if it is visible. Dont change the view type.*/
127                         return ECORE_CALLBACK_RENEW;
128                 }
129
130                 if (folder_panel_is_folder_visible()) {
131                         folder_panel_close_folder();
132                         return ECORE_CALLBACK_RENEW;
133                 }
134
135                 switch (view_t) {
136                 case HOMESCREEN_VIEW_HOME:
137                         break;
138                 case HOMESCREEN_VIEW_HOME_EDIT:
139                         home_screen_set_view_type(HOMESCREEN_VIEW_HOME);
140                         /*TODO: option menu should not have any info about livebox panel. This logic should be invoked in homescreen-efl.c*/
141                         livebox_panel_set_edit_mode_layout(false);
142                         livebox_panel_change_edit_mode_state(true);
143                         break;
144                 case HOMESCREEN_VIEW_HOME_ALL_PAGES:
145                         /*TODO: this should be invoked in homescreen-efl.c*/
146                         livebox_all_pages_hide();
147                         home_screen_set_view_type(HOMESCREEN_VIEW_HOME);
148                         break;
149                 case HOMESCREEN_VIEW_ALL_APPS:
150                         home_screen_set_view_type(HOMESCREEN_VIEW_HOME);
151                         break;
152                 case HOMESCREEN_VIEW_ALL_APPS_CHOOSE:
153                         folder_panel_cancel_add_icon();
154                         folder_panel_set_click_ignore_state(false);
155                 case HOMESCREEN_VIEW_ALL_APPS_EDIT:
156                         home_screen_set_view_type(HOMESCREEN_VIEW_ALL_APPS);
157                         break;
158                 case HOMESCREEN_VIEW_UNKNOWN:
159                         break;
160                 default:
161                         break;
162                 }
163         }
164
165         if (!strcmp(ev->keyname, KEY_RETURN))
166                 folder_panel_hide_input_panel();
167
168
169         key_info_s.pressed = EINA_FALSE;
170
171         return ECORE_CALLBACK_RENEW;
172 }
173
174