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 #if defined(WINSYS_X11)
42 #include <privilege-control.h>
45 /* quickpanel basics */
47 #include "common_uic.h"
48 #include "quickpanel-ui.h"
50 #include "quickpanel_def.h"
51 #include "list_util.h"
52 #include "noti_node.h"
53 #include "vi_manager.h"
55 #include "page_base.h"
56 #ifdef QP_ENABLE_PAGE_EDIT
57 #include "page_edit.h"
59 #include "page_setting_all.h"
62 #include "sim_controller.h"
67 #include "keyboard_x.h"
68 #include "uninstall.h"
69 #ifdef QP_REMINDER_ENABLE
72 #ifdef QP_EMERGENCY_MODE_ENABLE
73 #include "emergency_mode.h"
76 #include "util-time.h"
78 #define QP_WINDOW_PRIO 300
80 static struct appdata *g_app_data = NULL;
82 #if defined(WINSYS_X11)
83 static Ecore_X_Atom E_ILLUME_ATOM_MV_QUICKPANEL_STATE;
86 static void _ui_rotate(void *data, int new_angle);
87 static void _ui_geometry_info_set(void *data);
88 static void _ui_handler_info_set(void *data);
89 static void _ui_efl_cache_flush(void *evas);
91 HAPI void *quickpanel_get_app_data(void)
96 /******************************************************************************
100 ****************************************************************************/
101 static void _ui_efl_cache_flush(void *evas)
104 int collection_cache;
108 retif(evas == NULL, , "Evas is NULL\n");
109 file_cache = edje_file_cache_get();
110 collection_cache = edje_collection_cache_get();
111 image_cache = evas_image_cache_get(evas);
112 font_cache = evas_font_cache_get(evas);
114 edje_file_cache_set(file_cache);
115 edje_collection_cache_set(collection_cache);
116 evas_image_cache_set(evas, 0);
117 evas_font_cache_set(evas, 0);
119 evas_image_cache_flush(evas);
120 evas_render_idle_flush(evas);
121 evas_font_cache_flush(evas);
123 edje_file_cache_flush();
124 edje_collection_cache_flush();
126 edje_file_cache_set(file_cache);
127 edje_collection_cache_set(collection_cache);
128 evas_image_cache_set(evas, image_cache);
129 evas_font_cache_set(evas, font_cache);
131 elm_cache_all_flush();
135 static void _ui_handler_input_region_set(void *data, int contents_height)
137 struct appdata *ad = NULL;
138 #if defined(WINSYS_X11)
140 Ecore_X_Atom atom_window_input_region = 0;
142 tzsh_region_h region;
144 unsigned int window_input_region[4] = {0,};
146 retif(data == NULL, , "Invialid parameter!");
149 #if defined(WINSYS_X11)
150 xwin = elm_win_xwindow_get(ad->win);
152 region = tzsh_region_create(ad->tzsh);
157 window_input_region[0] = 0; //X
158 window_input_region[1] = contents_height; // Y
159 window_input_region[2] = ad->win_width; // Width
160 window_input_region[3] = ELM_SCALE_SIZE(QP_HANDLE_H); // height
163 window_input_region[0] = contents_height; //X
164 window_input_region[1] = 0; // Y
165 window_input_region[2] = ELM_SCALE_SIZE(QP_HANDLE_H); // Width
166 window_input_region[3] = ad->win_height; // height
169 window_input_region[0] = 0; //X
170 window_input_region[1] = ad->win_height - contents_height - ELM_SCALE_SIZE(QP_HANDLE_H); // Y
171 window_input_region[2] = ad->win_width; // Width
172 window_input_region[3] = ELM_SCALE_SIZE(QP_HANDLE_H); // height
175 window_input_region[0] = ad->win_width - contents_height - ELM_SCALE_SIZE(QP_HANDLE_H); //X
176 window_input_region[1] = 0; // Y
177 window_input_region[2] = ELM_SCALE_SIZE(QP_HANDLE_H); // Width
178 window_input_region[3] = ad->win_height; // height
182 INFO("win_input_0:%d\nwin_input_1:%d\nwin_input_2:%d\nwin_input_3:%d\n"
183 ,window_input_region[0]
184 ,window_input_region[1]
185 ,window_input_region[2]
186 ,window_input_region[3]
189 #if defined(WINSYS_X11)
190 atom_window_input_region = ecore_x_atom_get(STR_ATOM_WINDOW_INPUT_REGION);
191 ecore_x_window_prop_card32_set(xwin, atom_window_input_region, window_input_region, 4);
193 tzsh_region_add(region, 0, contents_height, ad->win_width, ELM_SCALE_SIZE(QP_HANDLE_H));
194 tzsh_quickpanel_service_handler_region_set(ad->quickpanel_service, ad->angle, region);
195 tzsh_region_destroy(region);
199 static void _ui_handler_content_region_set(void *data, int contents_height)
201 struct appdata *ad = NULL;
203 #if defined(WINSYS_X11)
205 Ecore_X_Atom atom_window_contents_region = 0;
207 tzsh_region_h region;
209 unsigned int window_contents_region[4] = {0,};
211 retif(data == NULL, , "Invialid parameter!");
214 #if defined(WINSYS_X11)
215 xwin = elm_win_xwindow_get(ad->win);
217 region = tzsh_region_create(ad->tzsh);
222 window_contents_region[0] = 0; //X
223 window_contents_region[1] = 0; // Y
224 window_contents_region[2] = ad->win_width; // Width
225 window_contents_region[3] = contents_height; // height
228 window_contents_region[0] = 0; //X
229 window_contents_region[1] = 0; // Y
230 window_contents_region[2] = contents_height; // Width
231 window_contents_region[3] = ad->win_height; // height
234 window_contents_region[0] = 0; //X
235 window_contents_region[1] = ad->win_height - contents_height; // Y
236 window_contents_region[2] = ad->win_width; // Width
237 window_contents_region[3] = contents_height; // height
240 window_contents_region[0] = ad->win_width - contents_height ; //X
241 window_contents_region[1] = 0; // Y
242 window_contents_region[2] = contents_height; // Width
243 window_contents_region[3] = ad->win_height; // height
247 DBG("win_contents_0:%d\nwin_contents_1:%d\nwin_contents_2:%d\nwin_contents_3:%d\n"
248 ,window_contents_region[0]
249 ,window_contents_region[1]
250 ,window_contents_region[2]
251 ,window_contents_region[3]
254 #if defined(WINSYS_X11)
255 atom_window_contents_region = ecore_x_atom_get(STR_ATOM_WINDOW_CONTENTS_REGION);
256 ecore_x_window_prop_card32_set(xwin, atom_window_contents_region, window_contents_region, 4);
258 tzsh_region_add(region, 0, contents_height, ad->win_width, ELM_SCALE_SIZE(QP_HANDLE_H));
259 tzsh_quickpanel_service_content_region_set(ad->quickpanel_service, ad->angle, region);
260 tzsh_region_destroy(region);
264 static void _ui_handler_info_set(void *data)
266 int contents_height = 0;
267 struct appdata *ad = NULL;
269 retif(data == NULL, , "data is NULL");
272 contents_height = ad->gl_distance_from_top + ad->gl_limit_height;
274 _ui_handler_input_region_set(ad, contents_height);
275 _ui_handler_content_region_set(ad, contents_height);
278 static void _ui_geometry_info_set(void *data)
280 struct appdata *ad = NULL;
281 int max_height_window = 0;
282 Evas_Coord genlist_y = 0;
284 retif(data == NULL, , "data is NULL");
287 if (ad->angle == 90 || ad->angle == 270 ) {
288 max_height_window = ad->win_width;
290 max_height_window = ad->win_height;
293 edje_object_part_geometry_get(_EDJ(ad->ly), "qp.base.list.swallow", NULL, &genlist_y, NULL, NULL);
295 ad->gl_distance_from_top = genlist_y;
296 ad->gl_distance_to_bottom = ELM_SCALE_SIZE(QP_HANDLE_H);
297 ad->gl_limit_height = max_height_window - ad->gl_distance_from_top - ad->gl_distance_to_bottom;
300 /*****************************************************************************
302 * ui rotation functions
304 ****************************************************************************/
305 static void _ui_rotation_wm_cb(void *data, Evas_Object *obj, void *event)
308 struct appdata *ad = data;
309 retif(ad == NULL, , "Invalid parameter!");
311 angle = elm_win_rotation_get((Evas_Object *)obj);
313 DBG("ROTATE:%d", angle);
315 quickpanel_minictrl_rotation_report(angle);
317 _ui_rotate(ad, angle);
320 static int _ui_rotation_angle_get(void *data)
322 struct appdata *ad = (struct appdata *)data;
323 retif(ad == NULL, 0, "Invalid parameter!");
324 retif(ad->win == NULL, 0, "Invalid parameter!");
326 return elm_win_rotation_get(ad->win);
329 static void _ui_handler_enable_set(Eina_Bool is_enable)
331 const char *signal = NULL;
332 struct appdata *ad = quickpanel_get_app_data();
333 retif(ad == NULL, , "invalid data.");
334 retif(ad->view_root == NULL, , "data is NULL");
336 if (is_enable == EINA_TRUE) {
337 signal = "mouse,down,1";
339 signal = "mouse,up,1";
342 elm_object_signal_emit(ad->view_root, signal, "qp.handler.bg");
345 static void _ui_rotation_handler(struct appdata *ad, int angle)
347 const char *signal = NULL;
349 retif(ad == NULL, , "data is NULL");
350 retif(ad->view_root == NULL, , "data is NULL");
353 if (angle == 90 || angle == 270) {
354 signal = "quickpanel.landscape";
356 signal = "quickpanel.portrait";
359 elm_object_signal_emit(ad->view_root, signal, "quickpanel.prog");
362 static void _ui_rotate(void *data, int new_angle)
364 struct appdata *ad = data;
365 retif(data == NULL, , "Invalid parameter!");
367 DBG("ROTATION: new:%d old:%d", new_angle, ad->angle);
369 if (new_angle == 0 || new_angle == 90 || new_angle == 180 || new_angle == 270) {
370 if (new_angle != ad->angle) {
371 ad->angle = new_angle;
372 quickpanel_modules_refresh(ad);
373 _ui_geometry_info_set(ad);
374 _ui_handler_info_set(ad);
375 _ui_rotation_handler(ad, ad->angle);
380 static int _tzsh_set(Evas_Object *win)
383 tzsh_quickpanel_service_h quickpanel_service = NULL;
386 retif(!win, QP_FAIL, "Invialid parameter!");
388 tzsh = tzsh_create(TZSH_TOOLKIT_TYPE_EFL);
389 retif(!tzsh, QP_FAIL, "tzsh_create ERROR!");
391 struct appdata *ad = quickpanel_get_app_data();
395 tz_win = elm_win_window_id_get(win);
401 quickpanel_service = tzsh_quickpanel_service_create(tzsh, tz_win);
402 if (!quickpanel_service) {
406 ad->quickpanel_service = quickpanel_service;
411 static void _tzsh_unset(void)
413 struct appdata *ad = quickpanel_get_app_data();
415 if (ad->quickpanel_service) {
416 tzsh_quickpanel_service_destroy(ad->quickpanel_service);
417 ad->quickpanel_service = NULL;
421 tzsh_destroy(ad->tzsh);
427 /*****************************************************************************
429 * ui creation/deletion functions
431 ****************************************************************************/
432 static Evas_Object *_ui_window_add(const char *name, int prio)
434 Evas_Object *eo = NULL;
436 eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
439 elm_win_alpha_set(eo, EINA_TRUE);
440 elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_HIDE);
442 elm_win_title_set(eo, name);
443 elm_win_borderless_set(eo, EINA_TRUE);
444 elm_win_autodel_set(eo, EINA_TRUE);
446 /* set this window as a quickpanel */
447 elm_win_quickpanel_set(eo, 1);
448 elm_win_quickpanel_priority_major_set(eo, prio);
450 if (elm_win_wm_rotation_supported_get(eo)) {
451 int rots[4] = { 0, 90, 180, 270 };
452 elm_win_wm_rotation_available_rotations_set(eo, rots, 4);
455 evas_object_show(eo);
457 if( QP_OK != _tzsh_set(eo)) {
458 ERR("Failed to set tzsh");
465 static int _ui_gui_create(void *data)
467 struct appdata *ad = data;
469 int initial_angle = 0;
470 Evas_Object *page_base = NULL;
472 retif(data == NULL, QP_FAIL, "Invialid parameter!");
474 ad->win = _ui_window_add("Quickpanel Window",
476 retif(ad->win == NULL, QP_FAIL, "Failed to create main window");
478 //elm_win_focus_allow_set(ad->win, EINA_TRUE);
480 evas_object_smart_callback_add(ad->win, "wm,rotation,changed",
481 _ui_rotation_wm_cb, ad);
483 ad->background = elm_bg_add(ad->win);
484 if (ad->background != NULL) {
485 evas_object_size_hint_weight_set(ad->background,
486 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
487 elm_win_resize_object_add(ad->win, ad->background);
488 evas_object_show(ad->background);
490 ERR("failed to create background");
493 ad->view_root = quickpanel_uic_load_edj(ad->background,
494 DEFAULT_EDJ, "quickpanel/root", 0);
495 retif(ad->view_root == NULL, QP_FAIL, "Failed to create main page");
497 Evas_Object *pager_scroller = quickpanel_pager_new(ad->view_root, NULL);
498 Evas_Object *pager_box = quickpanel_pager_view_get("BOX");
500 page_base = quickpanel_page_base_create(pager_box, NULL);
501 retif(page_base == NULL, QP_FAIL, "Failed to create main page");
502 ad->ly = quickpanel_page_base_view_get("LAYOUT");
503 retif(ad->ly == NULL, QP_FAIL, "Failed to create main page");
505 elm_box_pack_end(pager_box, page_base);
506 elm_win_resize_object_add(ad->win, ad->view_root);
507 elm_object_part_content_set(ad->view_root, "qp.root.swallow", pager_scroller);
510 ad->evas = evas_object_evas_get(ad->win);
511 ad->list = quickpanel_page_base_view_get("BOX");
512 ad->scroller = quickpanel_page_base_view_get("SCROLLER");
514 //ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
515 elm_win_screen_size_get(ad->win, NULL, NULL, &w, &h);
516 evas_object_resize(ad->win, w, h);
521 _ui_geometry_info_set(ad);
523 initial_angle = _ui_rotation_angle_get(ad);
524 _ui_rotate(ad, initial_angle);
526 quickpanel_pager_page_set(PAGE_IDX_MAIN, 1);
528 sim_controller_init(ad->ly);
530 quickpanel_noti_init_noti_section();
535 static int _ui_gui_destroy(void *data)
537 struct appdata *ad = data;
538 retif(data == NULL, QP_FAIL, "Invialid parameter!");
540 if (ad->list != NULL) {
541 evas_object_del(ad->list);
544 if (ad->scroller != NULL) {
545 evas_object_del(ad->scroller);
548 if (ad->ly != NULL) {
549 evas_object_del(ad->ly);
552 if (ad->win != NULL) {
553 evas_object_del(ad->win);
562 static void _ui_setting_visibility_set(struct appdata *ad, int show)
564 retif(ad == NULL, , "data is NULL");
565 retif(ad->ly == NULL, , "data is NULL");
567 elm_object_signal_emit(ad->ly, "quickpanel.setting.show",
571 /*****************************************************************************
573 * event handler initialization functions
575 ****************************************************************************/
576 static void _vconf_event_powerff_cb(keynode_t *node,
580 if (vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &val) == 0 &&
581 (val == VCONFKEY_SYSMAN_POWER_OFF_DIRECT || val == VCONFKEY_SYSMAN_POWER_OFF_RESTART)) {
586 static void _vconf_event_lcdoff_cb(keynode_t *node,
590 int pm_state = VCONFKEY_PM_STATE_NORMAL;
592 ret = vconf_get_int(VCONFKEY_PM_STATE, &pm_state);
594 if (ret == 0 && pm_state == VCONFKEY_PM_STATE_LCDOFF) {
595 quickpanel_uic_close_quickpanel(false, 0);
599 #if defined(WINSYS_X11)
600 static Eina_Bool _ecore_event_client_message_cb(void *data, int type,
603 struct appdata *ad = data;
605 Ecore_X_Event_Client_Message *ev = event;
607 retif(data == NULL || event == NULL,
608 ECORE_CALLBACK_RENEW, "Invalid parameter!");
610 if (ev->message_type == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE) {
611 if (ev->data.l[0] == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF) {
612 SERR("quickpanel is closed");
614 quickpanel_util_time_timer_enable_set(0);
615 quickpanel_keyboard_closing_fini(ad);
616 quickpanel_keyboard_x_closing_fini(ad);
617 quickpanel_modules_closed(data);
618 quickpanel_media_player_stop();
620 } else if (ev->message_type == E_ILLUME_ATOM_MV_QUICKPANEL_STATE) {
621 if (ev->data.l[0] == 1) {
623 if (ad->is_opened == 0) {
624 quickpanel_util_time_timer_enable_set(1);
625 quickpanel_keyboard_openning_init(ad);
626 quickpanel_keyboard_x_openning_init(ad);
627 if (quickpanel_uic_opened_reason_get() != OPENED_BY_CMD_SHOW_SETTINGS) {
628 quickpanel_pager_page_set(PAGE_IDX_MAIN, 0);
631 _ui_handler_enable_set(EINA_TRUE);
633 if (ev->data.l[0] == 0) {
635 if (ad->is_opened == 0) {
636 SERR("quickpanel is opened");
638 quickpanel_modules_opened(data);
639 quickpanel_media_player_stop();
640 quickpanel_uic_opened_reason_set(OPENED_NO_REASON);
642 _ui_handler_enable_set(EINA_FALSE);
645 return ECORE_CALLBACK_RENEW;
648 void _event_message_cb(void *data, Evas_Object *obj, void *event_info)
650 bool visiblity = (bool)event_info;
651 struct appdata *ad = data;
653 if(visiblity == 1) { // show
654 DBG("quickpanel is opened");
657 quickpanel_util_time_timer_enable_set(1);
658 quickpanel_keyboard_openning_init(ad);
659 quickpanel_modules_opened(data);
660 quickpanel_uic_opened_reason_set(OPENED_NO_REASON);
662 DBG("quickpanel is closed");
665 quickpanel_util_time_timer_enable_set(0);
666 quickpanel_keyboard_closing_fini(ad);
667 quickpanel_modules_closed(data);
669 quickpanel_media_player_stop();
673 static void _vconf_init(struct appdata *ad)
677 ret = vconf_notify_key_changed(VCONFKEY_PM_STATE,
678 _vconf_event_lcdoff_cb, ad);
680 ERR("VCONFKEY_PM_STATE: %d", ret);
683 ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS,
684 _vconf_event_powerff_cb, ad);
686 ERR("VCONFKEY_PM_STATE: %d", ret);
690 static void _vconf_fini(struct appdata *ad)
694 ret = vconf_ignore_key_changed(VCONFKEY_PM_STATE,
695 _vconf_event_lcdoff_cb);
697 ERR("VCONFKEY_PM_STATE: %d", ret);
700 ret = vconf_ignore_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS,
701 _vconf_event_powerff_cb);
703 ERR("VCONFKEY_PM_STATE: %d", ret);
707 static void _edbus_init(struct appdata *ad)
710 ad->dbus_connection = e_dbus_bus_get(DBUS_BUS_SYSTEM);
711 if (ad->dbus_connection == NULL) {
712 ERR("noti register : failed to get dbus bus");
716 static void _edbus_fini(struct appdata *ad)
718 if (ad->dbus_connection != NULL) {
719 e_dbus_connection_close(ad->dbus_connection);
720 ad->dbus_connection = NULL;
725 static void _ecore_event_init(struct appdata *ad)
727 #if defined(WINSYS_X11)
728 Ecore_Event_Handler *hdl = NULL;
730 /* Register window rotate event */
731 hdl = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
732 _ecore_event_client_message_cb, ad);
734 ERR("failed to add handler(ECORE_X_EVENT_CLIENT_MESSAGE)");
737 ad->hdl_client_message = hdl;
740 evas_object_smart_callback_add(ad->win, "visibility,changed", _event_message_cb, ad);
744 static void _ecore_event_fini(struct appdata *ad)
746 if (ad->hdl_client_message != NULL) {
747 ecore_event_handler_del(ad->hdl_client_message);
748 ad->hdl_client_message = NULL;
752 static void _x_atom_init(void)
754 #if defined(WINSYS_X11)
755 E_ILLUME_ATOM_MV_QUICKPANEL_STATE = ecore_x_atom_get("_E_MOVE_QUICKPANEL_STATE");
758 /*****************************************************************************
760 * App efl main interface
762 ****************************************************************************/
763 static void _sigaction_terminate_handler(int signum, siginfo_t *info, void *unused)
765 ERR("quickpanel going to be terminated");
769 static void _service_request_process(app_control_h service, void *data)
772 retif(service == NULL, , "Invialid parameter!");
774 if (!app_control_get_extra_data(service, "HIDE_LAUNCH", &value))
777 ERR("HIDE_LAUNCH: %s", value);
778 if (!strcmp(value, "1")) {
779 quickpanel_uic_close_quickpanel(false, 0);
781 quickpanel_uic_open_quickpanel(OPENED_BY_CMD_HIDE_LAUNCH);
786 } else if (!app_control_get_extra_data(service, "SHOW_SETTINGS", &value)) {
788 ERR("SHOW_SETTINGS: %s", value);
789 if (!strcmp(value, "1")) {
790 quickpanel_pager_page_set(PAGE_IDX_EDITING, 0);
791 quickpanel_uic_open_quickpanel(OPENED_BY_CMD_SHOW_SETTINGS);
797 #ifdef QP_EMERGENCY_MODE_ENABLE
798 else if (!app_control_get_extra_data(service, "EMERGENCY_MODE_LAUNCH", &value)) {
800 ERR("EMERGENCY_MODE_LAUNCH: %s", value);
801 if (!strcmp(value, "1")) {
802 if (quickpanel_emergency_mode_syspopup_launch() == QP_FAIL) {
803 ERR("failed to launch emergency mode syspopup");
805 quickpanel_uic_close_quickpanel(true, 0);
815 static Eina_Bool _appcore_cache_flush_timer_cb(void *data)
817 if (!quickpanel_uic_is_suspended()) {
818 return ECORE_CALLBACK_CANCEL;
821 return ECORE_CALLBACK_CANCEL;
824 static Eina_Bool _ui_refresh_idler_cb(void *data)
827 struct appdata *ad = data;
828 retif(ad == NULL, QP_FAIL, "Invalid parameter!");
830 quickpanel_modules_refresh(ad);
831 _ui_geometry_info_set(ad);
832 _ui_handler_info_set(ad);
834 /* Cache memory is cleared when the application paused (every time, after 5 seconds (in appcore)),
835 * but after running in a minimized mode application have status AS_RUNNING.
836 * Application have status AS_PAUSED only after change of visibility to hidden condition by user (on hiding window)
837 * Cleaning must be performed only once after application loading in hidden condition
838 * (and stay in a hidden condition at time of cleaning).
840 ecore_timer_add(10, _appcore_cache_flush_timer_cb, NULL);
845 static void _quickpanel_initialize(void *data)
848 struct appdata *ad = data;
849 retif(ad == NULL, , "Invialid parameter!");
851 INFO(">> Creating Quickpanel");
853 ad->is_emul = quickpanel_uic_is_emul();
854 INFO("quickpanel run in %s", ad->is_emul ? "Emul" : "Device");
857 elm_win_screen_size_get(ad->win, NULL, NULL, &w, &h);
858 ad->scale = elm_config_scale_get();
863 INFO("quickpanel scale %f", ad->scale);
865 ad->is_suspended = 1;
868 elm_theme_extension_add(NULL, DEFAULT_THEME_EDJ);
869 /* create quickpanel window */
870 ret = _ui_gui_create(ad);
871 retif(ret != QP_OK, , "Failed to create window!");
873 quickpanel_media_init();
876 _ecore_event_init(ad);
880 quickpanel_uninstall_init(ad);
881 #ifdef QP_EMERGENCY_MODE_ENABLE
882 quickpanel_emergency_mode_init(ad);
884 quickpanel_keyboard_init(ad);
885 #if defined(WINSYS_X11)
886 quickpanel_keyboard_x_init(ad);
888 #ifdef QP_REMINDER_ENABLE
889 quickpanel_reminder_init(ad);
892 #ifdef QP_SETTING_ENABLE
893 _ui_setting_visibility_set(ad, 1);
894 #else /* QP_SETTING_ENABLE */
895 _ui_setting_visibility_set(ad, 0);
896 #endif /* QP_SETTING_ENABLE */
898 /* init quickpanel modules */
899 quickpanel_modules_init(ad);
900 ecore_idler_add(_ui_refresh_idler_cb, ad);
903 static bool _app_create_cb(void *data)
906 #if defined(WINSYS_X11)
907 elm_config_engine_set("opengl_x11");
909 elm_app_base_scale_set(1.8);
915 struct sigaction act;
916 act.sa_sigaction = _sigaction_terminate_handler;
917 act.sa_flags = SA_SIGINFO;
919 int ret = sigemptyset(&act.sa_mask);
921 ERR("Failed to sigemptyset[%s]", strerror(errno));
923 ret = sigaddset(&act.sa_mask, SIGTERM);
925 ERR("Failed to sigaddset[%s]", strerror(errno));
927 ret = sigaction(SIGTERM, &act, NULL);
929 ERR("Failed to sigaction[%s]", strerror(errno));
934 WARN("Failed to set session id!");
939 WARN("Failed to set nice value!");
945 static void _app_service_cb(app_control_h service, void *data)
947 struct appdata *ad = data;
948 retif(ad == NULL, , "Invialid parameter!");
950 if (ad->win == NULL && ad->ly == NULL) {
951 _quickpanel_initialize(data);
953 _service_request_process(service, data);
957 static void _app_terminate_cb(void *data)
961 struct appdata *ad = data;
962 retif(ad == NULL, , "invalid data.");
964 quickpanel_media_fini();
966 /* fini quickpanel modules */
967 quickpanel_modules_fini(ad);
970 _ecore_event_fini(ad);
972 quickpanel_keyboard_fini(ad);
973 #if defined(WINSYS_X11)
974 quickpanel_keyboard_x_fini(ad);
976 quickpanel_uninstall_fini(ad);
977 #ifdef QP_REMINDER_ENABLE
978 quickpanel_reminder_fini(ad);
980 #ifdef QP_EMERGENCY_MODE_ENABLE
981 quickpanel_emergency_mode_fini(ad);
984 /* delete quickpanel window */
987 INFO("Quickpanel is terminated");
990 static void _app_resume_cb(void *data)
993 struct appdata *ad = data;
994 retif(ad == NULL,, "invalid data.");
996 ad->is_suspended = 0;
997 _ui_handler_enable_set(EINA_FALSE);
999 quickpanel_modules_resume(data);
1001 sim_controller_resume();
1004 static void _app_pause_cb(void *data)
1007 struct appdata *ad = data;
1008 retif(ad == NULL,, "invalid data.");
1011 quickpanel_modules_suspend(ad);
1013 ad->is_suspended = 1;
1015 if (ad->evas != NULL) {
1016 _ui_efl_cache_flush(ad->evas);
1017 evas_event_feed_mouse_cancel(ad->evas, ecore_time_get(), NULL);
1021 static void _app_language_changed_cb(app_event_info_h event_info, void *data)
1024 quickpanel_modules_lang_change(data);
1026 sim_controller_on_language_change();
1029 static void _app_region_format_changed_cb(app_event_info_h event_info, void *data)
1032 quickpanel_modules_lang_change(data);
1035 int main(int argc, char *argv[])
1037 INFO("BUILD START: %s %s", __DATE__, __TIME__);
1038 ERR("BUILD START: %s %s", __DATE__, __TIME__);
1042 ui_app_lifecycle_callback_s event_callback = {0,};
1043 app_event_handler_h handlers[5] = {NULL, };
1045 ERR("quickpanel is forked");
1047 #if defined(WINSYS_X11)
1048 ret = perm_app_set_privilege("org.tizen.", NULL, NULL);
1050 WARN("Failed to control privilege!");
1054 event_callback.create = _app_create_cb;
1055 event_callback.terminate = _app_terminate_cb;
1056 event_callback.pause = _app_pause_cb;
1057 event_callback.resume = _app_resume_cb;
1058 event_callback.app_control = _app_service_cb;
1060 // ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, NULL, NULL);
1061 // ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, NULL, NULL);
1062 // ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, NULL, NULL);
1063 ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, _app_language_changed_cb, &ad);
1064 ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, _app_region_format_changed_cb, &ad);
1066 memset(&ad, 0x0, sizeof(struct appdata));
1070 ret = ui_app_main(argc, argv, &event_callback, (void *)&ad);
1071 if (ret != APP_ERROR_NONE) {
1072 ERR("ui_app_main() is failed. err = %d", ret);