2 * Copyright (c) 2009-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 <sys/utsname.h>
22 #include <Elementary.h>
23 #include <Ecore_Input.h>
30 #include <tapi_common.h>
32 #include <tzsh_quickpanel_service.h>
33 #include <notification.h>
34 #include <sound_manager.h>
36 #include <system_settings.h>
38 /* quickpanel basics */
40 #include "common_uic.h"
41 #include "quickpanel-ui.h"
43 #include "quickpanel_def.h"
44 #include "list_util.h"
45 #include "noti_node.h"
46 #include "vi_manager.h"
48 #include "page_base.h"
49 #include "page_setting_all.h"
51 #include "sim_controller.h"
56 #include "uninstall.h"
57 #ifdef QP_REMINDER_ENABLE
60 #ifdef QP_EMERGENCY_MODE_ENABLE
61 #include "emergency_mode.h"
64 #include "util-time.h"
66 #define QP_WINDOW_PRIO 300
68 static struct appdata *g_app_data = NULL;
70 static void _ui_rotate(void *data, int new_angle);
71 static void _ui_geometry_info_set(void *data);
72 static void _ui_handler_info_set(void *data);
73 static void _ui_efl_cache_flush(void *evas);
75 HAPI void *quickpanel_get_app_data(void)
80 /******************************************************************************
84 ****************************************************************************/
85 static void _ui_efl_cache_flush(void *evas)
92 retif(evas == NULL, , "Evas is NULL\n");
93 file_cache = edje_file_cache_get();
94 collection_cache = edje_collection_cache_get();
95 image_cache = evas_image_cache_get(evas);
96 font_cache = evas_font_cache_get(evas);
98 edje_file_cache_set(file_cache);
99 edje_collection_cache_set(collection_cache);
100 evas_image_cache_set(evas, 0);
101 evas_font_cache_set(evas, 0);
103 evas_image_cache_flush(evas);
104 evas_render_idle_flush(evas);
105 evas_font_cache_flush(evas);
107 edje_file_cache_flush();
108 edje_collection_cache_flush();
110 edje_file_cache_set(file_cache);
111 edje_collection_cache_set(collection_cache);
112 evas_image_cache_set(evas, image_cache);
113 evas_font_cache_set(evas, font_cache);
115 elm_cache_all_flush();
119 static void _ui_handler_input_region_set(void *data, int contents_height)
121 struct appdata *ad = NULL;
122 tzsh_region_h region;
123 unsigned int window_input_region[4] = {0,};
125 retif(data == NULL, , "Invialid parameter!");
128 region = tzsh_region_create(ad->tzsh);
132 window_input_region[0] = 0; //X
133 window_input_region[1] = contents_height; // Y
134 window_input_region[2] = ad->win_width; // Width
135 window_input_region[3] = ELM_SCALE_SIZE(QP_HANDLE_H); // height
138 window_input_region[0] = contents_height; //X
139 window_input_region[1] = 0; // Y
140 window_input_region[2] = ELM_SCALE_SIZE(QP_HANDLE_H); // Width
141 window_input_region[3] = ad->win_height; // height
144 window_input_region[0] = 0; //X
145 window_input_region[1] = ad->win_height - contents_height - ELM_SCALE_SIZE(QP_HANDLE_H); // Y
146 window_input_region[2] = ad->win_width; // Width
147 window_input_region[3] = ELM_SCALE_SIZE(QP_HANDLE_H); // height
150 window_input_region[0] = ad->win_width - contents_height - ELM_SCALE_SIZE(QP_HANDLE_H); //X
151 window_input_region[1] = 0; // Y
152 window_input_region[2] = ELM_SCALE_SIZE(QP_HANDLE_H); // Width
153 window_input_region[3] = ad->win_height; // height
157 INFO("win_input_0:%d\nwin_input_1:%d\nwin_input_2:%d\nwin_input_3:%d\n"
158 ,window_input_region[0]
159 ,window_input_region[1]
160 ,window_input_region[2]
161 ,window_input_region[3]
164 tzsh_region_add(region, window_input_region[0], window_input_region[1], window_input_region[2], window_input_region[3]);
165 tzsh_quickpanel_service_handler_region_set(ad->quickpanel_service, ad->angle, region);
166 tzsh_region_destroy(region);
169 static void _ui_handler_content_region_set(void *data, int contents_height)
171 struct appdata *ad = NULL;
173 tzsh_region_h region;
175 unsigned int window_contents_region[4] = {0,};
177 retif(data == NULL, , "Invialid parameter!");
180 region = tzsh_region_create(ad->tzsh);
184 window_contents_region[0] = 0; //X
185 window_contents_region[1] = 0; // Y
186 window_contents_region[2] = ad->win_width; // Width
187 window_contents_region[3] = contents_height; // height
190 window_contents_region[0] = 0; //X
191 window_contents_region[1] = 0; // Y
192 window_contents_region[2] = contents_height; // Width
193 window_contents_region[3] = ad->win_height; // height
196 window_contents_region[0] = 0; //X
197 window_contents_region[1] = ad->win_height - contents_height; // Y
198 window_contents_region[2] = ad->win_width; // Width
199 window_contents_region[3] = contents_height; // height
202 window_contents_region[0] = ad->win_width - contents_height ; //X
203 window_contents_region[1] = 0; // Y
204 window_contents_region[2] = contents_height; // Width
205 window_contents_region[3] = ad->win_height; // height
209 DBG("win_contents_0:%d\nwin_contents_1:%d\nwin_contents_2:%d\nwin_contents_3:%d\n"
210 ,window_contents_region[0]
211 ,window_contents_region[1]
212 ,window_contents_region[2]
213 ,window_contents_region[3]
216 tzsh_region_add(region, window_contents_region[0], window_contents_region[1], window_contents_region[2], window_contents_region[3]);
217 tzsh_quickpanel_service_content_region_set(ad->quickpanel_service, ad->angle, region);
218 tzsh_region_destroy(region);
222 static void _ui_handler_info_set(void *data)
224 int contents_height = 0;
225 struct appdata *ad = NULL;
227 retif(data == NULL, , "data is NULL");
230 contents_height = ad->gl_distance_from_top + ad->gl_limit_height;
232 _ui_handler_input_region_set(ad, contents_height);
233 _ui_handler_content_region_set(ad, contents_height);
236 static void _ui_geometry_info_set(void *data)
238 struct appdata *ad = NULL;
239 int max_height_window = 0;
240 Evas_Coord genlist_y = 0;
242 retif(data == NULL, , "data is NULL");
245 if (ad->angle == 90 || ad->angle == 270 ) {
246 max_height_window = ad->win_width;
248 max_height_window = ad->win_height;
251 edje_object_part_geometry_get(_EDJ(ad->ly), "qp.base.list.swallow", NULL, &genlist_y, NULL, NULL);
253 ad->gl_distance_from_top = genlist_y;
254 ad->gl_distance_to_bottom = ELM_SCALE_SIZE(QP_HANDLE_H);
255 ad->gl_limit_height = max_height_window - ad->gl_distance_from_top - ad->gl_distance_to_bottom;
258 /*****************************************************************************
260 * ui rotation functions
262 ****************************************************************************/
263 static void _ui_rotation_wm_cb(void *data, Evas_Object *obj, void *event)
266 struct appdata *ad = data;
267 retif(ad == NULL, , "Invalid parameter!");
269 angle = elm_win_rotation_get((Evas_Object *)obj);
271 DBG("ROTATE:%d", angle);
273 quickpanel_minictrl_rotation_report(angle);
275 _ui_rotate(ad, angle);
278 static int _ui_rotation_angle_get(void *data)
280 struct appdata *ad = (struct appdata *)data;
281 retif(ad == NULL, 0, "Invalid parameter!");
282 retif(ad->win == NULL, 0, "Invalid parameter!");
284 return elm_win_rotation_get(ad->win);
287 static void _ui_handler_enable_set(Eina_Bool is_enable)
289 const char *signal = NULL;
290 struct appdata *ad = quickpanel_get_app_data();
291 retif(ad == NULL, , "invalid data.");
292 retif(ad->view_root == NULL, , "data is NULL");
294 if (is_enable == EINA_TRUE) {
295 signal = "mouse,down,1";
297 signal = "mouse,up,1";
300 elm_object_signal_emit(ad->view_root, signal, "qp.handler.bg");
303 static void _ui_rotation_handler(struct appdata *ad, int angle)
305 const char *signal = NULL;
307 retif(ad == NULL, , "data is NULL");
308 retif(ad->view_root == NULL, , "data is NULL");
311 if (angle == 90 || angle == 270) {
312 signal = "quickpanel.landscape";
314 signal = "quickpanel.portrait";
317 elm_object_signal_emit(ad->view_root, signal, "quickpanel.prog");
320 static void _ui_rotate(void *data, int new_angle)
322 struct appdata *ad = data;
323 retif(data == NULL, , "Invalid parameter!");
325 DBG("ROTATION: new:%d old:%d", new_angle, ad->angle);
327 if (new_angle == 0 || new_angle == 90 || new_angle == 180 || new_angle == 270) {
328 if (new_angle != ad->angle) {
329 ad->angle = new_angle;
330 quickpanel_modules_refresh(ad);
331 _ui_geometry_info_set(ad);
332 _ui_handler_info_set(ad);
333 _ui_rotation_handler(ad, ad->angle);
338 static int _tzsh_set(Evas_Object *win)
341 tzsh_quickpanel_service_h quickpanel_service = NULL;
344 retif(!win, QP_FAIL, "Invialid parameter!");
346 tzsh = tzsh_create(TZSH_TOOLKIT_TYPE_EFL);
347 retif(!tzsh, QP_FAIL, "tzsh_create ERROR!");
349 struct appdata *ad = quickpanel_get_app_data();
353 tz_win = elm_win_window_id_get(win);
359 quickpanel_service = tzsh_quickpanel_service_create(tzsh, tz_win);
360 if (!quickpanel_service) {
364 ad->quickpanel_service = quickpanel_service;
369 static void _tzsh_unset(void)
371 struct appdata *ad = quickpanel_get_app_data();
373 if (ad->quickpanel_service) {
374 tzsh_quickpanel_service_destroy(ad->quickpanel_service);
375 ad->quickpanel_service = NULL;
379 tzsh_destroy(ad->tzsh);
385 /*****************************************************************************
387 * ui creation/deletion functions
389 ****************************************************************************/
390 static Evas_Object *_ui_window_add(const char *name, int prio)
392 Evas_Object *eo = NULL;
394 eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
397 elm_win_alpha_set(eo, EINA_TRUE);
398 elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_HIDE);
400 elm_win_title_set(eo, name);
401 elm_win_borderless_set(eo, EINA_TRUE);
402 elm_win_autodel_set(eo, EINA_TRUE);
404 /* set this window as a quickpanel */
405 elm_win_quickpanel_set(eo, 1);
406 elm_win_quickpanel_priority_major_set(eo, prio);
408 if (elm_win_wm_rotation_supported_get(eo)) {
409 int rots[4] = { 0, 90, 180, 270 };
410 elm_win_wm_rotation_available_rotations_set(eo, rots, 4);
413 evas_object_show(eo);
415 if( QP_OK != _tzsh_set(eo)) {
416 ERR("Failed to set tzsh");
423 static int _ui_gui_create(void *data)
425 struct appdata *ad = data;
427 int initial_angle = 0;
428 Evas_Object *page_base = NULL;
430 retif(data == NULL, QP_FAIL, "Invialid parameter!");
432 ad->win = _ui_window_add("Quickpanel Window",
434 retif(ad->win == NULL, QP_FAIL, "Failed to create main window");
436 //elm_win_focus_allow_set(ad->win, EINA_TRUE);
438 evas_object_smart_callback_add(ad->win, "wm,rotation,changed",
439 _ui_rotation_wm_cb, ad);
441 ad->background = elm_bg_add(ad->win);
442 if (ad->background != NULL) {
443 evas_object_size_hint_weight_set(ad->background,
444 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
445 elm_win_resize_object_add(ad->win, ad->background);
446 evas_object_show(ad->background);
448 ERR("failed to create background");
451 ad->view_root = quickpanel_uic_load_edj(ad->background,
452 DEFAULT_EDJ, "quickpanel/root", 0);
453 retif(ad->view_root == NULL, QP_FAIL, "Failed to create main page");
455 Evas_Object *pager_scroller = quickpanel_pager_new(ad->view_root, NULL);
456 Evas_Object *pager_box = quickpanel_pager_view_get("BOX");
458 page_base = quickpanel_page_base_create(pager_box, NULL);
459 retif(page_base == NULL, QP_FAIL, "Failed to create main page");
460 ad->ly = quickpanel_page_base_view_get("LAYOUT");
461 retif(ad->ly == NULL, QP_FAIL, "Failed to create main page");
463 elm_box_pack_end(pager_box, page_base);
464 elm_win_resize_object_add(ad->win, ad->view_root);
465 elm_object_part_content_set(ad->view_root, "qp.root.swallow", pager_scroller);
468 ad->evas = evas_object_evas_get(ad->win);
469 ad->list = quickpanel_page_base_view_get("BOX");
470 ad->scroller = quickpanel_page_base_view_get("SCROLLER");
472 //ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
473 elm_win_screen_size_get(ad->win, NULL, NULL, &w, &h);
474 evas_object_resize(ad->win, w, h);
479 _ui_geometry_info_set(ad);
481 initial_angle = _ui_rotation_angle_get(ad);
482 _ui_rotate(ad, initial_angle);
484 quickpanel_pager_page_set(PAGE_IDX_MAIN, 1);
486 sim_controller_init(ad->ly);
488 quickpanel_noti_init_noti_section();
493 static int _ui_gui_destroy(void *data)
495 struct appdata *ad = data;
496 retif(data == NULL, QP_FAIL, "Invialid parameter!");
498 if (ad->list != NULL) {
499 evas_object_del(ad->list);
502 if (ad->scroller != NULL) {
503 evas_object_del(ad->scroller);
506 if (ad->ly != NULL) {
507 evas_object_del(ad->ly);
510 if (ad->win != NULL) {
511 evas_object_del(ad->win);
520 static void _ui_setting_visibility_set(struct appdata *ad, int show)
522 retif(ad == NULL, , "data is NULL");
523 retif(ad->ly == NULL, , "data is NULL");
525 elm_object_signal_emit(ad->ly, "quickpanel.setting.show",
529 /*****************************************************************************
531 * event handler initialization functions
533 ****************************************************************************/
534 static void _vconf_event_powerff_cb(keynode_t *node,
538 if (vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &val) == 0 &&
539 (val == VCONFKEY_SYSMAN_POWER_OFF_DIRECT || val == VCONFKEY_SYSMAN_POWER_OFF_RESTART)) {
544 static void _vconf_event_lcdoff_cb(keynode_t *node,
548 int pm_state = VCONFKEY_PM_STATE_NORMAL;
550 ret = vconf_get_int(VCONFKEY_PM_STATE, &pm_state);
552 if (ret == 0 && pm_state == VCONFKEY_PM_STATE_LCDOFF) {
553 quickpanel_uic_close_quickpanel(false, 0);
558 void _event_message_cb(void *data, Evas_Object *obj, void *event_info)
560 bool visiblity = (bool)event_info;
561 struct appdata *ad = data;
563 if(visiblity == 1) { // show
564 DBG("quickpanel is opened");
567 quickpanel_util_time_timer_enable_set(1);
568 quickpanel_keyboard_openning_init(ad);
569 quickpanel_modules_opened(data);
570 quickpanel_uic_opened_reason_set(OPENED_NO_REASON);
572 DBG("quickpanel is closed");
575 quickpanel_util_time_timer_enable_set(0);
576 quickpanel_keyboard_closing_fini(ad);
577 quickpanel_modules_closed(data);
579 quickpanel_media_player_stop();
582 static void _vconf_init(struct appdata *ad)
586 ret = vconf_notify_key_changed(VCONFKEY_PM_STATE,
587 _vconf_event_lcdoff_cb, ad);
589 ERR("VCONFKEY_PM_STATE: %d", ret);
592 ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS,
593 _vconf_event_powerff_cb, ad);
595 ERR("VCONFKEY_PM_STATE: %d", ret);
599 static void _vconf_fini(struct appdata *ad)
603 ret = vconf_ignore_key_changed(VCONFKEY_PM_STATE,
604 _vconf_event_lcdoff_cb);
606 ERR("VCONFKEY_PM_STATE: %d", ret);
609 ret = vconf_ignore_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS,
610 _vconf_event_powerff_cb);
612 ERR("VCONFKEY_PM_STATE: %d", ret);
616 static void _edbus_init(struct appdata *ad)
619 ad->dbus_connection = e_dbus_bus_get(DBUS_BUS_SYSTEM);
620 if (ad->dbus_connection == NULL) {
621 ERR("noti register : failed to get dbus bus");
625 static void _edbus_fini(struct appdata *ad)
627 if (ad->dbus_connection != NULL) {
628 e_dbus_connection_close(ad->dbus_connection);
629 ad->dbus_connection = NULL;
634 static void _ecore_event_init(struct appdata *ad)
637 evas_object_smart_callback_add(ad->win, "visibility,changed", _event_message_cb, ad);
640 static void _ecore_event_fini(struct appdata *ad)
642 if (ad->hdl_client_message != NULL) {
643 ecore_event_handler_del(ad->hdl_client_message);
644 ad->hdl_client_message = NULL;
648 /*****************************************************************************
650 * App efl main interface
652 ****************************************************************************/
653 static void _sigaction_terminate_handler(int signum, siginfo_t *info, void *unused)
655 ERR("quickpanel going to be terminated");
659 static void _service_request_process(app_control_h service, void *data)
662 retif(service == NULL, , "Invialid parameter!");
664 if (!app_control_get_extra_data(service, "HIDE_LAUNCH", &value))
667 ERR("HIDE_LAUNCH: %s", value);
668 if (!strcmp(value, "1")) {
669 quickpanel_uic_close_quickpanel(false, 0);
671 quickpanel_uic_open_quickpanel(OPENED_BY_CMD_HIDE_LAUNCH);
676 } else if (!app_control_get_extra_data(service, "SHOW_SETTINGS", &value)) {
678 ERR("SHOW_SETTINGS: %s", value);
679 if (!strcmp(value, "1")) {
680 quickpanel_pager_page_set(PAGE_IDX_EDITING, 0);
681 quickpanel_uic_open_quickpanel(OPENED_BY_CMD_SHOW_SETTINGS);
687 #ifdef QP_EMERGENCY_MODE_ENABLE
688 else if (!app_control_get_extra_data(service, "EMERGENCY_MODE_LAUNCH", &value)) {
690 ERR("EMERGENCY_MODE_LAUNCH: %s", value);
691 if (!strcmp(value, "1")) {
692 if (quickpanel_emergency_mode_syspopup_launch() == QP_FAIL) {
693 ERR("failed to launch emergency mode syspopup");
695 quickpanel_uic_close_quickpanel(true, 0);
705 static Eina_Bool _appcore_cache_flush_timer_cb(void *data)
707 if (!quickpanel_uic_is_suspended()) {
708 return ECORE_CALLBACK_CANCEL;
711 return ECORE_CALLBACK_CANCEL;
714 static Eina_Bool _ui_refresh_idler_cb(void *data)
717 struct appdata *ad = data;
718 retif(ad == NULL, QP_FAIL, "Invalid parameter!");
720 quickpanel_modules_refresh(ad);
721 _ui_geometry_info_set(ad);
722 _ui_handler_info_set(ad);
724 /* Cache memory is cleared when the application paused (every time, after 5 seconds (in appcore)),
725 * but after running in a minimized mode application have status AS_RUNNING.
726 * Application have status AS_PAUSED only after change of visibility to hidden condition by user (on hiding window)
727 * Cleaning must be performed only once after application loading in hidden condition
728 * (and stay in a hidden condition at time of cleaning).
730 ecore_timer_add(10, _appcore_cache_flush_timer_cb, NULL);
735 static void _quickpanel_initialize(void *data)
738 struct appdata *ad = data;
739 retif(ad == NULL, , "Invialid parameter!");
741 INFO(">> Creating Quickpanel");
743 ad->is_emul = quickpanel_uic_is_emul();
744 INFO("quickpanel run in %s", ad->is_emul ? "Emul" : "Device");
747 elm_win_screen_size_get(ad->win, NULL, NULL, &w, &h);
748 ad->scale = elm_config_scale_get();
753 INFO("quickpanel scale %f", ad->scale);
755 ad->is_suspended = 1;
758 elm_theme_extension_add(NULL, DEFAULT_THEME_EDJ);
759 /* create quickpanel window */
760 ret = _ui_gui_create(ad);
761 retif(ret != QP_OK, , "Failed to create window!");
763 quickpanel_media_init();
765 _ecore_event_init(ad);
769 quickpanel_uninstall_init(ad);
770 #ifdef QP_EMERGENCY_MODE_ENABLE
771 quickpanel_emergency_mode_init(ad);
773 quickpanel_keyboard_init(ad);
774 #ifdef QP_REMINDER_ENABLE
775 quickpanel_reminder_init(ad);
778 #ifdef QP_SETTING_ENABLE
779 _ui_setting_visibility_set(ad, 1);
780 #else /* QP_SETTING_ENABLE */
781 _ui_setting_visibility_set(ad, 0);
782 #endif /* QP_SETTING_ENABLE */
784 /* init quickpanel modules */
785 quickpanel_modules_init(ad);
786 ecore_idler_add(_ui_refresh_idler_cb, ad);
789 static bool _app_create_cb(void *data)
793 elm_app_base_scale_set(1.8);
797 char err_buf[128] = {0,};
800 struct sigaction act;
801 act.sa_sigaction = _sigaction_terminate_handler;
802 act.sa_flags = SA_SIGINFO;
804 int ret = sigemptyset(&act.sa_mask);
806 strerror_r(errno, err_buf, sizeof(err_buf));
807 ERR("Failed to sigemptyset[%d / %s]", errno, err_buf);
809 ret = sigaddset(&act.sa_mask, SIGTERM);
811 strerror_r(errno, err_buf, sizeof(err_buf));
812 ERR("Failed to sigaddset[%d / %s]", errno, err_buf);
814 ret = sigaction(SIGTERM, &act, NULL);
816 strerror_r(errno, err_buf, sizeof(err_buf));
817 ERR("Failed to sigaction[%d / %s]", errno, err_buf);
822 WARN("Failed to set session id!");
827 WARN("Failed to set nice value!");
833 static void _app_service_cb(app_control_h service, void *data)
835 struct appdata *ad = data;
836 retif(ad == NULL, , "Invialid parameter!");
838 if (ad->win == NULL && ad->ly == NULL) {
839 _quickpanel_initialize(data);
841 _service_request_process(service, data);
845 static void _app_terminate_cb(void *data)
849 struct appdata *ad = data;
850 retif(ad == NULL, , "invalid data.");
852 quickpanel_media_fini();
854 /* fini quickpanel modules */
855 quickpanel_modules_fini(ad);
858 _ecore_event_fini(ad);
860 quickpanel_keyboard_fini(ad);
861 quickpanel_uninstall_fini(ad);
862 #ifdef QP_REMINDER_ENABLE
863 quickpanel_reminder_fini(ad);
865 #ifdef QP_EMERGENCY_MODE_ENABLE
866 quickpanel_emergency_mode_fini(ad);
869 /* delete quickpanel window */
872 INFO("Quickpanel is terminated");
875 static void _app_resume_cb(void *data)
878 struct appdata *ad = data;
879 retif(ad == NULL,, "invalid data.");
881 ad->is_suspended = 0;
882 _ui_handler_enable_set(EINA_FALSE);
884 quickpanel_modules_resume(data);
886 sim_controller_resume();
889 static void _app_pause_cb(void *data)
892 struct appdata *ad = data;
893 retif(ad == NULL,, "invalid data.");
896 quickpanel_modules_suspend(ad);
898 ad->is_suspended = 1;
900 if (ad->evas != NULL) {
901 _ui_efl_cache_flush(ad->evas);
902 evas_event_feed_mouse_cancel(ad->evas, ecore_time_get(), NULL);
906 static void _app_language_changed_cb(app_event_info_h event_info, void *data)
909 quickpanel_modules_lang_change(data);
911 sim_controller_on_language_change();
914 static void _app_region_format_changed_cb(app_event_info_h event_info, void *data)
917 quickpanel_modules_lang_change(data);
920 int main(int argc, char *argv[])
922 INFO("BUILD START: %s %s", __DATE__, __TIME__);
923 ERR("BUILD START: %s %s", __DATE__, __TIME__);
927 ui_app_lifecycle_callback_s event_callback = {0,};
928 app_event_handler_h handlers[5] = {NULL, };
930 ERR("quickpanel is forked");
932 event_callback.create = _app_create_cb;
933 event_callback.terminate = _app_terminate_cb;
934 event_callback.pause = _app_pause_cb;
935 event_callback.resume = _app_resume_cb;
936 event_callback.app_control = _app_service_cb;
938 // ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, NULL, NULL);
939 // ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, NULL, NULL);
940 // ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, NULL, NULL);
941 ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, _app_language_changed_cb, &ad);
942 ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, _app_region_format_changed_cb, &ad);
944 memset(&ad, 0x0, sizeof(struct appdata));
948 ret = ui_app_main(argc, argv, &event_callback, (void *)&ad);
949 if (ret != APP_ERROR_NONE) {
950 ERR("ui_app_main() is failed. err = %d", ret);