apply FSL(Flora Software License)
[apps/native/menu-screen.git] / src / menu_screen.c
1  /*
2   * Copyright 2012  Samsung Electronics Co., Ltd
3   *
4   * Licensed under the Flora License, Version 1.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
7   *
8   *     http://www.tizenopensource.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
18
19 #include <Elementary.h>
20 #include <Ecore_X.h>
21 #include <ail.h>
22 #include <app.h>
23 #include <stdbool.h>
24 #include <vconf.h>
25 #include <utilX.h>
26 #include <aul.h>
27
28 #include "conf.h"
29 #include "item.h"
30 #include "layout.h"
31 #include "mapbuf.h"
32 #include "menu_screen.h"
33 #include "mouse.h"
34 #include "page.h"
35 #include "page_scroller.h"
36 #include "util.h"
37
38 #define STR_ENV_ENGINE "LAUNCHER_ENGINE"
39 #define STR_ENV_FPS "LAUNCHER_FPS"
40
41 #define LAYOUT_EDJE_PORTRAIT EDJEDIR"/layout_portrait.edj"
42 #define LAYOUT_GROUP_NAME "layout"
43
44
45
46 // Define prototype of the "hidden API of AUL"
47 extern int aul_listen_app_dead_signal(int (*func)(int signal, void *data), void *data);
48 static struct {
49         int state;
50         int root_width;
51         int root_height;
52         double xscale;
53         double yscale;
54         Evas *evas;
55         Ecore_Evas *ee;
56         Evas_Object *win;
57         bool is_done;
58 } menu_screen_info = {
59         .state = APP_STATE_PAUSE,
60         .evas = NULL,
61         .ee = NULL,
62         .win = NULL,
63         .is_done = false,
64 };
65
66
67
68 Evas *menu_screen_get_evas(void)
69 {
70         return menu_screen_info.evas;
71 }
72
73
74
75 int menu_screen_get_root_width(void)
76 {
77         return menu_screen_info.root_width;
78 }
79
80
81
82 int menu_screen_get_root_height(void)
83 {
84         return menu_screen_info.root_height;
85 }
86
87
88
89 double menu_screen_get_yscale(void)
90 {
91         return menu_screen_info.yscale;
92 }
93
94
95
96 Evas_Object *menu_screen_get_win(void)
97 {
98         return menu_screen_info.win;
99 }
100
101
102
103 bool menu_screen_get_done(void)
104 {
105         return menu_screen_info.is_done;
106 }
107
108
109
110 void menu_screen_set_done(bool is_done)
111 {
112         menu_screen_info.is_done = is_done;
113 }
114
115
116
117 static menu_screen_error_e _create_canvas(char *name, char *title)
118 {
119         Ecore_X_Atom ATOM_WM_WINDOW_ROLE;
120
121         menu_screen_info.win = elm_win_add(NULL, name, ELM_WIN_BASIC);
122         retv_if(NULL == menu_screen_info.win, MENU_SCREEN_ERROR_FAIL);
123
124         if (title) {
125                 elm_win_title_set(menu_screen_info.win, title);
126         }
127         elm_win_borderless_set(menu_screen_info.win, EINA_TRUE);
128
129         ecore_x_icccm_name_class_set(elm_win_xwindow_get(menu_screen_info.win), "MENU_SCREEN", "MENU_SCREEN");
130         ATOM_WM_WINDOW_ROLE = ecore_x_atom_get("WM_WINDOW_ROLE");
131         if (ATOM_WM_WINDOW_ROLE) {
132                 ecore_x_window_prop_string_set(elm_win_xwindow_get(menu_screen_info.win), ATOM_WM_WINDOW_ROLE, "MENU_SCREEN");
133         } else {
134                 _D("Failed to set the window role as MENU_SCREEN");
135         }
136
137         menu_screen_info.evas = evas_object_evas_get(menu_screen_info.win);
138         if (!menu_screen_info.evas) {
139                 _E("[%s] Failed to get the evas object", __func__);
140         }
141
142         menu_screen_info.ee = ecore_evas_ecore_evas_get(menu_screen_info.evas);
143         if (!menu_screen_info.ee) {
144                 _E("[%s] Failed to get ecore_evas object", __func__);
145         }
146
147         evas_object_move(menu_screen_info.win, 0, 0);
148         evas_object_resize(menu_screen_info.win, menu_screen_info.root_width, menu_screen_info.root_height);
149         evas_object_show(menu_screen_info.win);
150
151         return MENU_SCREEN_ERROR_OK;
152 }
153
154
155
156 static void _destroy_canvas(void)
157 {
158         evas_object_del(menu_screen_info.win);
159 }
160
161
162
163 static int _dead_cb(int pid, void *data)
164 {
165         utilx_hide_fake_effect(
166                 ecore_x_display_get(),
167                 ecore_x_window_root_get(ecore_evas_window_get(menu_screen_info.ee))
168         );
169
170         return EXIT_SUCCESS;
171 }
172
173
174
175 static void _set_scale(void)
176 {
177         double scale;
178         Ecore_X_Window focus_win;
179         Ecore_X_Window root_win;
180
181         focus_win = ecore_x_window_focus_get();
182         root_win = ecore_x_window_root_get(focus_win);
183         ecore_x_window_size_get(root_win, &menu_screen_info.root_width, &menu_screen_info.root_height);
184
185         menu_screen_info.xscale = (double) menu_screen_info.root_width / (double) BASE_WIDTH;
186         menu_screen_info.yscale = (double) menu_screen_info.root_height / (double) BASE_HEIGHT;
187         scale = menu_screen_info.xscale < menu_screen_info.yscale ? menu_screen_info.xscale : menu_screen_info.yscale;
188         _D("width:%d, height:%d, scale:%f", menu_screen_info.root_width, menu_screen_info.root_height, scale);
189         elm_config_scale_set(scale);
190 }
191
192
193
194 static void _create_bg(void)
195 {
196         char *buf;
197         Evas_Coord w;
198         Evas_Coord h;
199         Evas_Object *bg;
200         double f, wf, hf;
201         static int trigger = 0;
202         const char *key;
203         int width;
204         int height;
205
206         buf = vconf_get_str(VCONFKEY_BGSET);
207         ret_if(NULL == buf);
208
209         width = menu_screen_get_root_width();
210         height = menu_screen_get_root_height();
211
212         bg = evas_object_data_get(menu_screen_get_win(), "bg");
213         if (NULL == bg) {
214                 Evas_Object *rect;
215
216                 rect = evas_object_rectangle_add(menu_screen_get_evas());
217                 ret_if(NULL == rect);
218                 evas_object_data_set(menu_screen_get_win(), "rect", rect);
219                 evas_object_color_set(rect, 0, 0, 0, 255);
220                 evas_object_size_hint_min_set(rect, width, height);
221                 evas_object_size_hint_max_set(rect, width, height);
222                 evas_object_resize(rect, width, height);
223                 evas_object_show(rect);
224
225                 bg = evas_object_image_add(menu_screen_get_evas());
226                 if (NULL == bg) {
227                         free(buf);
228                         return;
229                 }
230                 evas_object_data_set(menu_screen_get_win(), "bg", bg);
231         }
232
233         if (trigger == 0) {
234                 key = "/";
235                 trigger = 1;
236         } else {
237                 key = NULL;
238                 trigger = 0;
239         }
240
241         evas_object_image_file_set(bg, buf, key);
242         evas_object_image_size_get(bg, &w, &h);
243         evas_object_image_filled_set(bg, 1);
244
245         wf = (double) width / (double) w;
246         hf = (double) height / (double) h;
247
248         f = wf > hf ? hf : wf;
249
250         w = (int) ((double) f * (double) w);
251         h = (int) ((double) f * (double) h);
252
253         evas_object_image_load_size_set(bg, w, h);
254         evas_object_image_fill_set(bg, 0, 0, w, h);
255         evas_object_move(bg, (width - w) / 2, (height - h) / 2);
256         evas_object_resize(bg, w, h);
257         evas_object_show(bg);
258
259         free(buf);
260 }
261
262
263
264
265 static void _destroy_bg()
266 {
267         Evas_Object *rect;
268         Evas_Object *bg;
269
270         rect = evas_object_data_del(menu_screen_get_win(), "rect");
271         evas_object_del(rect);
272
273         bg = evas_object_data_del(menu_screen_get_win(), "bg");
274         evas_object_del(bg);
275 }
276
277
278
279 static void _change_bg_cb(keynode_t *node, void *data)
280 {
281         _D("Background image is changed.");
282         _create_bg();
283 }
284
285
286
287 static bool _create_cb(void *data)
288 {
289         Evas_Object *layout;
290
291         _set_scale();
292         retv_if(MENU_SCREEN_ERROR_FAIL == _create_canvas(PACKAGE, PACKAGE), EXIT_FAILURE);
293         elm_win_indicator_mode_set(menu_screen_info.win, ELM_WIN_INDICATOR_SHOW);
294
295         if (vconf_notify_key_changed(VCONFKEY_BGSET, _change_bg_cb, NULL) < 0) {
296                 _E("Failed to register a vconf cb for %s\n", VCONFKEY_BGSET);
297         }
298         _create_bg();
299
300         layout = layout_create(menu_screen_info.win, LAYOUT_EDJE_PORTRAIT,
301                                 LAYOUT_GROUP_NAME, MENU_SCREEN_ROTATE_PORTRAIT);
302         if (NULL == layout) {
303                 _E("Faield to load an edje object");
304                 evas_object_del(menu_screen_info.win);
305                 return EXIT_FAILURE;
306         }
307         evas_object_data_set(menu_screen_info.win, "layout", layout);
308         evas_object_show(layout);
309
310         mouse_register();
311         aul_listen_app_dead_signal(_dead_cb, NULL);
312
313         return true;
314 }
315
316
317
318 static void _terminate_cb(void *data)
319 {
320         Evas_Object *layout;
321
322         if (vconf_ignore_key_changed(VCONFKEY_BGSET, _change_bg_cb) < 0) {
323                 _E("Failed to remove bgset %s\n", VCONFKEY_BGSET);
324         }
325
326         evas_object_hide(menu_screen_info.win);
327
328         mouse_unregister();
329
330         layout = evas_object_data_del(menu_screen_info.win, "layout");
331         layout_destroy(layout);
332
333         _destroy_bg();
334         _destroy_canvas();
335         evas_object_del(menu_screen_info.win);
336 }
337
338
339
340 static void _pause_cb(void *data)
341 {
342         _D("Pause start");
343
344         if (vconf_set_int(VCONFKEY_IDLE_SCREEN_TOP, VCONFKEY_IDLE_SCREEN_TOP_FALSE) < 0) {
345                 _E("Failed to set memory/idle/top to 0");
346         }
347
348         menu_screen_info.state = APP_STATE_PAUSE;
349 }
350
351
352
353 static void _resume_cb(void *data)
354 {
355         _D("START RESUME");
356
357         if (vconf_set_int(VCONFKEY_IDLE_SCREEN_TOP, VCONFKEY_IDLE_SCREEN_TOP_TRUE) < 0) {
358                 _E("Failed to set memory/idle/top to 1");
359         }
360
361         utilx_hide_fake_effect(
362                 ecore_x_display_get(),
363                 ecore_x_window_root_get(ecore_evas_window_get(menu_screen_info.ee))
364         );
365
366         menu_screen_info.state = APP_STATE_RESUME;
367 }
368
369
370
371 static void _service_cb(service_h service, void *data)
372 {
373         _D("START RESET : %d", menu_screen_info.state);
374
375         if (vconf_set_int(VCONFKEY_IDLE_SCREEN_TOP, VCONFKEY_IDLE_SCREEN_TOP_TRUE) < 0) {
376                 _E("Failed to set memory/idle/top to 1");
377         }
378
379         utilx_hide_fake_effect(
380                 ecore_x_display_get(),
381                 ecore_x_window_root_get(ecore_evas_window_get(menu_screen_info.ee))
382         );
383 }
384
385
386
387 static void _language_changed_cb(void *data)
388 {
389         register unsigned int i;
390         register unsigned int j;
391         unsigned int count;
392         Evas_Object *layout;
393         Evas_Object *all_apps;
394         Evas_Object *scroller;
395         Evas_Object *page;
396         Evas_Object *item;
397         unsigned int page_max_app;
398
399         _D("Language is changed");
400
401         if (false == menu_screen_info.is_done) {
402                 elm_exit();
403         }
404
405         layout = evas_object_data_get(menu_screen_info.win, "layout");
406         ret_if(NULL == layout);
407         all_apps = evas_object_data_get(layout, "all_apps");
408         ret_if(NULL == all_apps);
409         scroller = elm_object_part_content_get(all_apps, "content");
410         ret_if(NULL == scroller);
411
412         count = page_scroller_count_page(scroller);
413         page_max_app = (unsigned int) evas_object_data_get(scroller, "page_max_app");
414         for (i = 0; i < count; i ++) {
415                 page = page_scroller_get_page_at(scroller, i);
416                 if (!page) continue;
417                 if (mapbuf_is_enabled(page)) {
418                         mapbuf_disable(page, 1);
419                 }
420
421                 for (j = 0; j < page_max_app; j ++) {
422                         ail_appinfo_h ai;
423                         char *name;
424
425                         item = page_get_item_at(page, j);
426                         if (!item) continue;
427
428                         if (ail_package_get_appinfo(item_get_package(item), &ai) < 0) continue;
429                         if (ail_appinfo_get_str(ai, AIL_PROP_NAME_STR, &name) < 0) {
430                                 ail_package_destroy_appinfo(ai);
431                                 continue;
432                         }
433
434                         if (!name) {
435                                 _D("Faield to get name for %s", item_get_package(item));
436                                 ail_package_destroy_appinfo(ai);
437                                 continue;
438                         }
439
440                         item_set_name(item, name, 0);
441                         ail_package_destroy_appinfo(ai);
442                 }
443
444                 mapbuf_enable(page, 1);
445         }
446 }
447
448
449
450 static void _init(app_event_callback_s *event_callback)
451 {
452         event_callback->create = _create_cb;
453         event_callback->terminate = _terminate_cb;
454         event_callback->pause = _pause_cb;
455         event_callback->resume = _resume_cb;
456         event_callback->service = _service_cb;
457         event_callback->low_memory = NULL;
458         event_callback->low_battery = NULL;
459         event_callback->device_orientation = NULL;
460         event_callback->language_changed = _language_changed_cb;
461         event_callback->region_format_changed = NULL;
462 }
463
464
465
466 static void _fini(void)
467 {
468 }
469
470
471
472 int main(int argc, char *argv[])
473 {
474         const char *env;
475         app_event_callback_s event_callback;
476
477         env = getenv(STR_ENV_ENGINE);
478         if (env) {
479                 _D("ELM_ENGINE is set as [%s]", env);
480                 setenv("ELM_ENGINE", env, 1);
481         } else {
482                 _D("ELM_ENGINE is set as [%s]", "gl");
483                 setenv("ELM_ENGINE", "gl", 1);
484         }
485
486         env = getenv(STR_ENV_FPS);
487         if (env) {
488                 _D("ELM_FPS is set as [%s]", env);
489                 setenv("ELM_FPS", env, 1);
490         } else {
491                 _D("ELM_FPS is set as [%s]", "6000");
492                 setenv("ELM_FPS", "6000", 1);
493         }
494
495         _init(&event_callback);
496         app_efl_main(&argc, &argv, &event_callback, NULL);
497         _fini();
498
499         return EXIT_SUCCESS;
500 }
501
502
503
504
505
506 // End of a file