2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://floralicense.org/license/
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.
20 #include <system_info.h>
21 #include <sys/utsname.h>
24 #include <Ecore_Input.h>
27 #include <privilege-control.h>
29 #include <notification.h>
32 #include "quickpanel-ui.h"
34 #include "quickpanel_def.h"
35 #include "list_util.h"
37 #define QP_WINDOW_PRIO 300
38 #define QP_ENABLE_HIDING_INDICATOR 1
40 static struct appdata *g_app_data = NULL;
42 /* binary information */
43 #define QP_EMUL_STR "Emulator"
44 static Ecore_X_Atom E_ILLUME_ATOM_MV_QUICKPANEL_STATE;
46 static void _quickpanel_cache_flush(void *evas);
47 static void _quickpanel_init_size_genlist(void *data);
48 static void _quickpanel_ui_update_height(void *data);
49 static void _quickpanel_ui_set_indicator_cover(void *data);
50 static void _quickpanel_move_data_to_service(const char *key, const char *val, void *data);
52 HAPI void *quickpanel_get_app_data(void)
57 HAPI int quickpanel_is_suspended(void)
59 struct appdata *ad = quickpanel_get_app_data();
60 retif(ad == NULL, 0, "invalid data.");
62 return ad->is_suspended;
65 HAPI int quickpanel_is_emul(void)
70 if (system_info_get_value_string(SYSTEM_INFO_KEY_MODEL, &info) == 0) {
71 if (info == NULL) return 0;
72 if (!strncmp(QP_EMUL_STR, info, strlen(info))) {
77 if (info != NULL) free(info);
82 HAPI int quickpanel_launch_app(char *app_id, void *data)
84 int ret = SERVICE_ERROR_NONE;
85 service_h service = NULL;
87 retif(app_id == NULL && data == NULL, SERVICE_ERROR_INVALID_PARAMETER, "Invialid parameter!");
89 ret = service_create(&service);
90 if (ret != SERVICE_ERROR_NONE) {
91 ERR("service_create() return error : %d", ret);
94 retif(service == NULL, SERVICE_ERROR_INVALID_PARAMETER, "fail to create service handle!");
97 service_set_operation(service, SERVICE_OPERATION_DEFAULT);
98 service_set_app_id(service, app_id);
101 bundle_iterate((bundle *)data, _quickpanel_move_data_to_service, service);
104 service_import_from_bundle(service, data);
107 ret = service_send_launch_request(service, NULL, NULL);
108 if (ret != SERVICE_ERROR_NONE) {
109 ERR("service_send_launch_request() is failed : %d", ret);
110 service_destroy(service);
113 service_destroy(service);
117 HAPI void quickpanel_launch_app_inform_result(const char *pkgname, int retcode)
119 retif(retcode == SERVICE_ERROR_NONE, , "Invialid parameter!");
120 retif(pkgname == NULL && retcode != SERVICE_ERROR_APP_NOT_FOUND, , "Invialid parameter!");
122 const char *msg = NULL;
124 if (retcode == SERVICE_ERROR_APP_NOT_FOUND) {
125 notification_status_message_post(_S("IDS_COM_BODY_NO_APPLICATIONS_CAN_PERFORM_THIS_ACTION"));
127 Eina_Strbuf *strbuf = eina_strbuf_new();
129 if (strbuf != NULL) {
130 eina_strbuf_append_printf(strbuf, _S("IDS_IDLE_POP_UNABLE_TO_LAUNCH_PS"), pkgname);
131 eina_strbuf_append_printf(strbuf, "(%d)", retcode);
132 msg = eina_strbuf_string_get(strbuf);
135 notification_status_message_post(msg);
137 eina_strbuf_free(strbuf);
142 static void _quickpanel_move_data_to_service(const char *key, const char *val, void *data)
144 retif(data == NULL || key == NULL || val == NULL, , "Invialid parameter!");
146 service_h service = data;
147 service_add_extra_data(service, key, val);
150 static void atoms_init_quickpanel(void)
152 E_ILLUME_ATOM_MV_QUICKPANEL_STATE = ecore_x_atom_get("_E_MOVE_QUICKPANEL_STATE");
155 /******************************************************************************
159 ****************************************************************************/
160 static Eina_Bool _quickpanel_ui_refresh_cb(void *data)
162 struct appdata *ad = NULL;
164 retif(data == NULL, QP_FAIL, "Invalid parameter!");
167 INFO(" >>>>>>>>>>>>>>> Refresh QP modules!! <<<<<<<<<<<<<<<< ");
168 refresh_modules(data);
170 _quickpanel_init_size_genlist(ad);
171 _quickpanel_ui_update_height(ad);
176 static void _quickpanel_cache_flush(void *evas)
179 int collection_cache;
183 retif(evas == NULL, , "Evas is NULL\n");
185 file_cache = edje_file_cache_get();
186 collection_cache = edje_collection_cache_get();
187 image_cache = evas_image_cache_get(evas);
188 font_cache = evas_font_cache_get(evas);
190 edje_file_cache_set(file_cache);
191 edje_collection_cache_set(collection_cache);
192 evas_image_cache_set(evas, 0);
193 evas_font_cache_set(evas, 0);
195 evas_image_cache_flush(evas);
196 evas_render_idle_flush(evas);
197 evas_font_cache_flush(evas);
199 edje_file_cache_flush();
200 edje_collection_cache_flush();
202 edje_file_cache_set(file_cache);
203 edje_collection_cache_set(collection_cache);
204 evas_image_cache_set(evas, image_cache);
205 evas_font_cache_set(evas, font_cache);
208 static Eina_Bool _quickpanel_hardkey_cb(void *data, int type, void *event)
210 struct appdata *ad = NULL;
211 Ecore_Event_Key *key_event = NULL;
213 retif(data == NULL || event == NULL,
214 EINA_FALSE, "Invalid parameter!");
218 if (!strcmp(key_event->keyname, KEY_SELECT)) {
219 quickpanel_close_quickpanel(false);
224 static int _quickpanel_ui_rotation_get_angle(void *data)
226 struct appdata *ad = (struct appdata *)data;
227 Ecore_X_Window xwin, root;
228 int ret = 0, angle = 0, count = 0;
229 unsigned char *prop_data = NULL;
231 retif(data == NULL, -1, "Invalid parameter!");
233 xwin = elm_win_xwindow_get(ad->win);
234 root = ecore_x_window_root_get(xwin);
236 ret = ecore_x_window_prop_property_get(root,
237 ECORE_X_ATOM_E_ILLUME_ROTATE_ROOT_ANGLE,
238 ECORE_X_ATOM_CARDINAL, 32,
241 if (ret && prop_data) {
242 memcpy(&angle, prop_data, sizeof(int));
249 ERR("Fail to get angle");
257 static void _quickpanel_ui_rotation(void *data, int new_angle)
259 struct appdata *ad = data;
260 retif(data == NULL, , "Invalid parameter!");
262 INFO("ROTATION: new:%d old:%d", new_angle, ad->angle);
264 if (new_angle == 0 || new_angle == 90 || new_angle == 180 || new_angle == 270) {
265 if (new_angle != ad->angle) {
266 elm_win_rotation_with_resize_set(ad->win,
268 ad->angle = new_angle;
270 _quickpanel_ui_set_indicator_cover(ad);
271 ecore_idler_add(_quickpanel_ui_refresh_cb, ad);
276 static Eina_Bool quickpanel_ui_client_message_cb(void *data, int type,
279 struct appdata *ad = data;
280 Ecore_X_Event_Client_Message *ev = event;
283 retif(data == NULL || event == NULL,
284 ECORE_CALLBACK_RENEW, "Invalid parameter!");
286 if (ev->message_type == ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE) {
287 new_angle = ev->data.l[0];
288 _quickpanel_ui_rotation(ad, new_angle);
289 } else if (ev->message_type == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE) {
290 if (ev->data.l[0] == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF) {
292 qp_closed_modules(data);
293 quickpanel_player_stop();
294 #if QP_ENABLE_HIDING_INDICATOR
295 elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_HIDE);
298 } else if (ad->E_ILLUME_ATOM_MV_QUICKPANEL_STATE != NULL) {
299 if (ev->message_type == *(ad->E_ILLUME_ATOM_MV_QUICKPANEL_STATE)) {
300 if (ev->data.l[0] == 1) {
301 if (ad->is_opened == 0) {
302 #if QP_ENABLE_HIDING_INDICATOR
303 elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
305 INFO("quickpanel going to be opened");
308 if (ev->data.l[0] == 0) {
309 if (ad->is_opened == 0) {
310 INFO("quickpanel is closed");
312 qp_opened_modules(data);
313 quickpanel_player_stop();
318 return ECORE_CALLBACK_RENEW;
321 static void _quickpanel_signal_handler(int signum, siginfo_t *info, void *unused)
323 ERR("quickpanel going to be terminated");
327 static Evas_Object *_quickpanel_ui_window_add(const char *name, int prio)
329 Evas_Object *eo = NULL;
332 eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
335 elm_win_alpha_set(eo, EINA_TRUE);
336 #if QP_ENABLE_HIDING_INDICATOR
337 elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_HIDE);
339 elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_SHOW);
342 elm_win_title_set(eo, name);
343 elm_win_borderless_set(eo, EINA_TRUE);
344 elm_win_autodel_set(eo, EINA_TRUE);
346 /* set this window as a quickpanel */
347 elm_win_quickpanel_set(eo, 1);
348 elm_win_quickpanel_priority_major_set(eo, prio);
350 /* icccm name class set */
351 xwin = elm_win_xwindow_get(eo);
352 ecore_x_icccm_name_class_set(xwin, "QUICKPANEL", "QUICKPANEL");
353 evas_object_show(eo);
360 static void _quickpanel_add_debugging_bar(Evas_Object *list)
362 Eina_Bool ret = EINA_FALSE;
363 Evas_Object *bar = elm_layout_add(list);
365 ret = elm_layout_file_set(bar, DEFAULT_EDJ,
366 "quickpanel/seperator/default");
368 if (ret != EINA_FALSE) {
369 evas_object_size_hint_weight_set(bar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
370 evas_object_size_hint_align_set(bar, EVAS_HINT_FILL, EVAS_HINT_FILL);
373 = quickpanel_list_util_item_new(QP_ITEM_TYPE_BAR, NULL);
374 quickpanel_list_util_item_set_tag(bar, qid);
375 quickpanel_list_util_sort_insert(list, bar);
376 evas_object_show(bar);
381 HAPI Evas_Object *quickpanel_ui_load_edj(Evas_Object * parent, const char *file,
382 const char *group, int is_just_load)
385 Evas_Object *eo = NULL;
387 retif(parent == NULL, NULL, "Invalid parameter!");
389 eo = elm_layout_add(parent);
390 retif(eo == NULL, NULL, "Failed to add layout object!");
392 r = elm_layout_file_set(eo, file, group);
393 retif(r != EINA_TRUE, NULL,
394 "Failed to set edje object file[%s-%s]!", file, group);
396 evas_object_size_hint_weight_set(eo,
397 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
399 if (is_just_load == 1) {
400 elm_win_resize_object_add(parent, eo);
402 evas_object_show(eo);
407 static int _quickpanel_ui_create_win(void *data)
409 struct appdata *ad = data;
412 int initial_angle = 0;
414 retif(data == NULL, QP_FAIL, "Invialid parameter!");
416 ad->win = _quickpanel_ui_window_add("Quickpanel Window",
418 if (ad->win == NULL) {
419 ERR("ui create : failed to create window.");
422 #ifdef QP_INDICATOR_WIDGET_ENABLE
423 ad->comformant = elm_conformant_add(ad->win);
424 #if QP_ENABLE_HIDING_INDICATOR
425 elm_object_style_set(ad->comformant, "without_resize");
427 elm_object_style_set(ad->comformant, "nokeypad");
430 ad->ly = quickpanel_ui_load_edj(ad->comformant,
431 DEFAULT_EDJ, "quickpanel/gl_base", 0);
435 evas_object_size_hint_weight_set(ad->comformant,
436 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
437 elm_win_resize_object_add(ad->win, ad->comformant);
438 evas_object_show(ad->comformant);
439 elm_object_content_set(ad->comformant, ad->ly);
442 ad->ly = quickpanel_ui_load_edj(ad->win,
443 DEFAULT_EDJ, "quickpanel/gl_base", 0);
449 ad->evas = evas_object_evas_get(ad->win);
451 Evas_Object *sc = elm_scroller_add(ad->ly);
452 retif(!sc, EINA_FALSE, "fail to add scroller");
453 elm_scroller_bounce_set(sc, EINA_TRUE, EINA_TRUE);
454 elm_scroller_policy_set(sc,
455 ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
456 evas_object_size_hint_weight_set(sc,
457 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
458 evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
459 evas_object_show(sc);
461 Evas_Object *box = elm_box_add(sc);
463 ERR("fail to add box");
467 evas_object_size_hint_weight_set(box,
468 EVAS_HINT_EXPAND, 0);
469 elm_box_horizontal_set(box, EINA_FALSE);
474 _quickpanel_add_debugging_bar(ad->list);
477 elm_object_content_set(sc, box);
478 elm_object_part_content_set(ad->ly, "qp.gl_base.gl.swallow", ad->scroller);
479 evas_object_show(ad->list);
481 ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
482 evas_object_resize(ad->win, w, h);
487 _quickpanel_init_size_genlist(ad);
488 _quickpanel_ui_set_indicator_cover(ad);
491 utilx_grab_key(ecore_x_display_get(), elm_win_xwindow_get(ad->win), KEY_SELECT, SHARED_GRAB);
493 initial_angle = _quickpanel_ui_rotation_get_angle(ad);
494 _quickpanel_ui_rotation(ad, initial_angle);
498 static void _quickpanel_ui_set_indicator_cover(void *data)
500 retif(data == NULL, , "data is NULL");
501 struct appdata *ad = data;
503 int x_2 = 0, y_2 = 0;
504 int angle = ad->angle;
506 int width = INDICATOR_COVER_W * ad->scale;
507 int height = INDICATOR_COVER_H * ad->scale;
511 x_2 = ad->win_width - width;
515 x_2 = ad->win_height - width;
519 x_2 = ad->win_width - width;
523 x_2 = ad->win_height - width;
528 if (ad->cover_indicator_right == NULL) {
529 Evas_Object *bg = evas_object_rectangle_add(ad->evas);
530 evas_object_color_set(bg, 52, 52, 50, 255); // opaque white background
531 evas_object_repeat_events_set(bg, EINA_FALSE);
532 evas_object_resize(bg, width, height); // covers full canvas
533 evas_object_move(bg, x_2, y_2);
534 evas_object_show(bg);
535 ad->cover_indicator_right = bg;
537 evas_object_move(ad->cover_indicator_right, x_2, y_2);
541 static void _quickpanel_ui_window_set_input_region(void *data, int contents_height)
543 struct appdata *ad = NULL;
545 Ecore_X_Atom atom_window_input_region = 0;
546 unsigned int window_input_region[4] = {0,};
548 retif(data == NULL, , "Invialid parameter!");
551 xwin = elm_win_xwindow_get(ad->win);
553 INFO("angle:%d", ad->angle);
556 window_input_region[0] = 0; //X
557 window_input_region[1] = contents_height; // Y
558 window_input_region[2] = ad->win_width; // Width
559 window_input_region[3] = ad->scale * QP_HANDLE_H; // height
562 window_input_region[0] = contents_height; //X
563 window_input_region[1] = 0; // Y
564 window_input_region[2] = ad->scale * QP_HANDLE_H; // Width
565 window_input_region[3] = ad->win_height; // height
568 window_input_region[0] = 0; //X
569 window_input_region[1] = ad->win_height - contents_height - ad->scale * QP_HANDLE_H; // Y
570 window_input_region[2] = ad->win_width; // Width
571 window_input_region[3] = ad->scale * QP_HANDLE_H; // height
574 window_input_region[0] = ad->win_width - contents_height - ad->scale * QP_HANDLE_H ; //X
575 window_input_region[1] = 0; // Y
576 window_input_region[2] = ad->scale * QP_HANDLE_H; // Width
577 window_input_region[3] = ad->win_height; // height
581 INFO("win_input_0:%d\nwin_input_1:%d\nwin_input_2:%d\nwin_input_3:%d\n"
582 ,window_input_region[0]
583 ,window_input_region[1]
584 ,window_input_region[2]
585 ,window_input_region[3]
588 atom_window_input_region = ecore_x_atom_get(STR_ATOM_WINDOW_INPUT_REGION);
589 ecore_x_window_prop_card32_set(xwin, atom_window_input_region, window_input_region, 4);
592 static void _quickpanel_ui_window_set_content_region(void *data, int contents_height)
594 struct appdata *ad = NULL;
596 Ecore_X_Atom atom_window_contents_region = 0;
597 unsigned int window_contents_region[4] = {0,};
599 retif(data == NULL, , "Invialid parameter!");
602 xwin = elm_win_xwindow_get(ad->win);
604 INFO("angle:%d", ad->angle);
607 window_contents_region[0] = 0; //X
608 window_contents_region[1] = 0; // Y
609 window_contents_region[2] = ad->win_width; // Width
610 window_contents_region[3] = contents_height; // height
613 window_contents_region[0] = 0; //X
614 window_contents_region[1] = 0; // Y
615 window_contents_region[2] = contents_height; // Width
616 window_contents_region[3] = ad->win_height; // height
619 window_contents_region[0] = 0; //X
620 window_contents_region[1] = ad->win_height - contents_height; // Y
621 window_contents_region[2] = ad->win_width; // Width
622 window_contents_region[3] = contents_height; // height
625 window_contents_region[0] = ad->win_width - contents_height ; //X
626 window_contents_region[1] = 0; // Y
627 window_contents_region[2] = contents_height; // Width
628 window_contents_region[3] = ad->win_height; // height
632 DBG("win_contents_0:%d\nwin_contents_1:%d\nwin_contents_2:%d\nwin_contents_3:%d\n"
633 ,window_contents_region[0]
634 ,window_contents_region[1]
635 ,window_contents_region[2]
636 ,window_contents_region[3]
639 atom_window_contents_region = ecore_x_atom_get(STR_ATOM_WINDOW_CONTENTS_REGION);
640 ecore_x_window_prop_card32_set(xwin, atom_window_contents_region, window_contents_region, 4);
643 static int _quickpanel_ui_delete_win(void *data)
645 struct appdata *ad = data;
646 retif(data == NULL, QP_FAIL, "Invialid parameter!");
648 if (ad->ly != NULL) {
649 evas_object_del(ad->ly);
652 if (ad->win != NULL) {
653 evas_object_del(ad->win);
660 static void _quickpanel_ui_vconf_event_powerff_cb(keynode_t *node,
664 if (vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &val) == 0 &&
665 (val == VCONFKEY_SYSMAN_POWER_OFF_DIRECT || val == VCONFKEY_SYSMAN_POWER_OFF_RESTART)) {
670 static void _quickpanel_ui_vconf_event_lcdoff_cb(keynode_t *node,
674 int pm_state = VCONFKEY_PM_STATE_NORMAL;
676 ret = vconf_get_int(VCONFKEY_PM_STATE, &pm_state);
678 if (ret == 0 && pm_state == VCONFKEY_PM_STATE_LCDOFF) {
679 quickpanel_close_quickpanel(false);
683 static void _quickpanel_ui_vconf_event_init(struct appdata *ad)
687 ret = vconf_notify_key_changed(VCONFKEY_PM_STATE,
688 _quickpanel_ui_vconf_event_lcdoff_cb, ad);
690 ERR("VCONFKEY_PM_STATE: %d", ret);
693 ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS,
694 _quickpanel_ui_vconf_event_powerff_cb, ad);
696 ERR("VCONFKEY_PM_STATE: %d", ret);
700 static void _quickpanel_ui_vconf_event_fini(struct appdata *ad)
704 ret = vconf_ignore_key_changed(VCONFKEY_PM_STATE,
705 _quickpanel_ui_vconf_event_lcdoff_cb);
707 ERR("VCONFKEY_PM_STATE: %d", ret);
710 ret = vconf_ignore_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS,
711 _quickpanel_ui_vconf_event_powerff_cb);
713 ERR("VCONFKEY_PM_STATE: %d", ret);
717 static void _quickpanel_ui_init_ecore_event(struct appdata *ad)
719 Ecore_Event_Handler *hdl = NULL;
720 Ecore_Event_Handler *hdl_key = NULL;
722 /* Register window rotate event */
723 hdl = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
724 quickpanel_ui_client_message_cb, ad);
726 ERR("failed to add handler(ECORE_X_EVENT_CLIENT_MESSAGE)");
728 ad->hdl_client_message = hdl;
730 hdl_key = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _quickpanel_hardkey_cb, ad);
732 ERR("failed to add handler(ECORE_EVENT_KEY_UP)");
734 ad->hdl_hardkey = hdl_key;
737 static void _quickpanel_ui_fini_ecore_event(struct appdata *ad)
739 if (ad->hdl_client_message != NULL) {
740 ecore_event_handler_del(ad->hdl_client_message);
741 ad->hdl_client_message = NULL;
743 if (ad->hdl_hardkey != NULL) {
744 ecore_event_handler_del(ad->hdl_hardkey);
745 ad->hdl_hardkey = NULL;
749 static void _quickpanel_ui_setting_show(struct appdata *ad, int show)
758 static void _quickpanel_ui_update_height(void *data)
760 int contents_height = 0;
761 int height_genlist = 0;
763 struct appdata *ad = NULL;
765 retif(data == NULL, , "data is NULL");
768 height_genlist = ad->gl_limit_height;
769 contents_height = ad->gl_distance_from_top + height_genlist + ad->gl_distance_to_bottom - ad->scale * QP_HANDLE_H;
771 _quickpanel_ui_window_set_input_region(ad, contents_height);
772 _quickpanel_ui_window_set_content_region(ad, contents_height);
775 static void _quickpanel_init_size_genlist(void *data)
777 struct appdata *ad = NULL;
778 int max_height_window = 0;
779 Evas_Coord genlist_y = 0;
780 Evas_Coord spn_height = 0;
782 retif(data == NULL, , "data is NULL");
785 if (ad->angle == 90 || ad->angle == 270 )
786 max_height_window = ad->win_width;
788 max_height_window = ad->win_height;
790 edje_object_part_geometry_get(_EDJ(ad->ly), "qp.gl_base.gl.swallow", NULL, &genlist_y, NULL, NULL);
791 edje_object_part_geometry_get(_EDJ(ad->ly), "qp.base.spn.swallow", NULL, NULL, NULL, &spn_height);
793 ad->gl_distance_from_top = genlist_y;
794 ad->gl_distance_to_bottom = spn_height + (1 * ad->scale) + (ad->scale*QP_HANDLE_H) ;
795 ad->gl_limit_height = max_height_window - ad->gl_distance_from_top - ad->gl_distance_to_bottom;
798 /*****************************************************************************
800 * App efl main interface
802 ****************************************************************************/
803 static bool quickpanel_app_create(void *data)
811 struct sigaction act;
812 act.sa_sigaction = _quickpanel_signal_handler;
813 act.sa_flags = SA_SIGINFO;
815 int ret = sigemptyset(&act.sa_mask);
817 ERR("Failed to sigemptyset[%s]", strerror(errno));
819 ret = sigaddset(&act.sa_mask, SIGTERM);
821 ERR("Failed to sigaddset[%s]", strerror(errno));
823 ret = sigaction(SIGTERM, &act, NULL);
825 ERR("Failed to sigaction[%s]", strerror(errno));
830 WARN("Failed to set session id!");
834 WARN("Failed to set nice value!");
839 static void quickpanel_app_terminate(void *data)
843 struct appdata *ad = data;
844 retif(ad == NULL, , "invalid data.");
846 /* fini quickpanel modules */
849 _quickpanel_cache_flush(ad->evas);
851 feedback_deinitialize();
853 /* unregister system event callback */
854 _quickpanel_ui_vconf_event_fini(ad);
856 _quickpanel_ui_fini_ecore_event(ad);
858 if (ad->cover_indicator_right != NULL) {
859 evas_object_del(ad->cover_indicator_right);
860 ad->cover_indicator_right = NULL;
862 /* delete quickpanel window */
863 _quickpanel_ui_delete_win(ad);
865 INFO(" >>>>>>>>>>>>>>> QUICKPANEL IS TERMINATED!! <<<<<<<<<<<<<<<< ");
868 static void quickpanel_app_pause(void *data)
872 struct appdata *ad = data;
873 retif(ad == NULL,, "invalid data.");
876 quickpanel_ui_del_current_popup();
878 ad->is_suspended = 1;
880 _quickpanel_cache_flush(ad->evas);
883 static void quickpanel_app_resume(void *data)
887 struct appdata *ad = data;
888 retif(ad == NULL,, "invalid data.");
890 ad->is_suspended = 0;
892 resume_modules(data);
895 static void quickpanel_app_service(service_h service, void *data)
897 struct appdata *ad = data;
900 retif(ad == NULL, , "Invialid parameter!");
902 INFO(" >>>>>>>>>>>>>>> QUICKPANEL IS STARTED!! <<<<<<<<<<<<<<<< ");
905 ad->is_emul = quickpanel_is_emul();
906 INFO("quickpanel run in %s", ad->is_emul ? "Emul" : "Device");
908 ad->scale = elm_config_scale_get();
912 INFO("quickpanel scale %f", ad->scale);
915 elm_theme_extension_add(NULL, DEFAULT_THEME_EDJ);
917 /* create quickpanel window */
918 ret = _quickpanel_ui_create_win(ad);
919 retif(ret != QP_OK, , "Failed to create window!");
921 atoms_init_quickpanel();
923 ad->E_ILLUME_ATOM_MV_QUICKPANEL_STATE = &E_ILLUME_ATOM_MV_QUICKPANEL_STATE;
925 _quickpanel_ui_init_ecore_event(ad);
927 _quickpanel_ui_vconf_event_init(ad);
929 feedback_initialize();
931 #ifdef QP_SETTING_ENABLE
932 _quickpanel_ui_setting_show(ad, 1);
933 #else /* QP_SETTING_ENABLE */
934 _quickpanel_ui_setting_show(ad, 0);
935 #endif /* QP_SETTING_ENABLE */
937 /* init quickpanel modules */
940 ecore_idler_add(_quickpanel_ui_refresh_cb, ad);
943 static void quickpanel_app_language_changed_cb(void *data)
945 retif(data == NULL, , "Invalid parameter!");
947 INFO(" >>>>>>>>>>>>>>> LANGUAGE CHANGED!! <<<<<<<<<<<<<<<< ");
948 lang_change_modules(data);
951 static void quickpanel_app_region_format_changed_cb(void *data)
953 INFO(" >>>>>>>>>>>>>>> region_format CHANGED!! <<<<<<<<<<<<<<<< ");
956 HAPI void quickpanel_open_quickpanel(void) {
959 struct appdata *ad = g_app_data;
963 retif(ad == NULL, , "Invalid parameter!");
964 retif(ad->win == NULL, , "Invalid parameter!");
966 xwin = elm_win_xwindow_get(ad->win);
968 if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) {
969 ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_ON);
971 ERR("failed to get zone");
974 ERR("failed to get xwin");
978 HAPI void quickpanel_close_quickpanel(bool is_check_lock) {
981 int is_lock_launched = VCONFKEY_IDLE_UNLOCK;
982 struct appdata *ad = g_app_data;
986 retif(ad == NULL, , "Invalid parameter!");
987 retif(ad->win == NULL, , "Invalid parameter!");
989 if (is_check_lock == true) {
990 if (vconf_get_int(VCONFKEY_IDLE_LOCK_STATE, &is_lock_launched) == 0) {
991 if (is_lock_launched == VCONFKEY_IDLE_LOCK) {
992 vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK);
998 xwin = elm_win_xwindow_get(ad->win);
1000 if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) {
1001 ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_OFF);
1003 ERR("failed to get zone");
1006 ERR("failed to get xwin");
1010 HAPI void quickpanel_toggle_openning_quickpanel(void) {
1011 Ecore_X_Window xwin;
1012 Ecore_X_Window zone;
1013 struct appdata *ad = g_app_data;
1017 retif(ad == NULL, , "Invalid parameter!");
1018 retif(ad->win == NULL, , "Invalid parameter!");
1020 xwin = elm_win_xwindow_get(ad->win);
1022 if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) {
1023 if (ecore_x_e_illume_quickpanel_state_get(zone) == ECORE_X_ILLUME_QUICKPANEL_STATE_ON) {
1024 ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_OFF);
1026 ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_ON);
1029 ERR("failed to get zone");
1032 ERR("failed to get xwin");
1036 int main(int argc, char *argv[])
1040 app_event_callback_s app_callback = {0,};
1042 r = control_privilege();
1044 WARN("Failed to control privilege!");
1047 app_callback.create = quickpanel_app_create;
1048 app_callback.terminate = quickpanel_app_terminate;
1049 app_callback.pause = quickpanel_app_pause;
1050 app_callback.resume = quickpanel_app_resume;
1051 app_callback.service = quickpanel_app_service;
1052 app_callback.low_memory = NULL;
1053 app_callback.low_battery = NULL;
1054 app_callback.device_orientation = NULL;
1055 app_callback.language_changed = quickpanel_app_language_changed_cb;
1056 app_callback.region_format_changed = quickpanel_app_region_format_changed_cb;
1058 memset(&ad, 0x0, sizeof(struct appdata));
1062 return app_efl_main(&argc, &argv, &app_callback, (void *)&ad);