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 #include "vi_manager.h"
39 #define QP_WINDOW_PRIO 300
40 #define QP_ENABLE_HIDING_INDICATOR 1
42 static struct appdata *g_app_data = NULL;
44 /* binary information */
45 #define QP_EMUL_STR "Emulator"
47 static Ecore_X_Atom E_ILLUME_ATOM_MV_QUICKPANEL_STATE;
49 static void _quickpanel_cache_flush(void *evas);
50 static void _quickpanel_init_size_genlist(void *data);
51 static void _quickpanel_ui_update_height(void *data);
53 static void _quickpanel_ui_set_indicator_cover(void *data);
55 static void _quickpanel_move_data_to_service(const char *key, const char *val, void *data);
57 HAPI void *quickpanel_get_app_data(void)
62 HAPI int quickpanel_is_opened(void)
64 struct appdata *ad = quickpanel_get_app_data();
65 retif(ad == NULL, 0, "invalid data.");
70 HAPI int quickpanel_is_suspended(void)
72 struct appdata *ad = quickpanel_get_app_data();
73 retif(ad == NULL, 0, "invalid data.");
75 return ad->is_suspended;
78 HAPI int quickpanel_is_emul(void)
83 if (system_info_get_value_string(SYSTEM_INFO_KEY_MODEL, &info) == 0) {
84 if (info == NULL) return 0;
85 if (!strncmp(QP_EMUL_STR, info, strlen(info))) {
90 if (info != NULL) free(info);
95 HAPI void quickpanel_initial_resize(Evas_Object *obj, int height)
97 struct appdata *ad = quickpanel_get_app_data();
98 retif(ad == NULL, , "invalid data.");
100 if (ad->angle == 90 || ad->angle == 270) {
101 evas_object_resize(obj, ad->win_height, height * ad->scale);
103 evas_object_resize(obj, ad->win_width, height * ad->scale);
107 HAPI int quickpanel_launch_app(char *app_id, void *data)
109 int ret = SERVICE_ERROR_NONE;
110 service_h service = NULL;
112 retif(app_id == NULL && data == NULL, SERVICE_ERROR_INVALID_PARAMETER, "Invialid parameter!");
114 ret = service_create(&service);
115 if (ret != SERVICE_ERROR_NONE) {
116 ERR("service_create() return error : %d", ret);
119 retif(service == NULL, SERVICE_ERROR_INVALID_PARAMETER, "fail to create service handle!");
121 if (app_id != NULL) {
122 service_set_operation(service, SERVICE_OPERATION_DEFAULT);
123 service_set_app_id(service, app_id);
126 bundle_iterate((bundle *)data, _quickpanel_move_data_to_service, service);
129 service_import_from_bundle(service, data);
132 ret = service_send_launch_request(service, NULL, NULL);
133 if (ret != SERVICE_ERROR_NONE) {
134 ERR("service_send_launch_request() is failed : %d", ret);
135 service_destroy(service);
138 service_destroy(service);
142 HAPI void quickpanel_launch_app_inform_result(const char *pkgname, int retcode)
144 retif(retcode == SERVICE_ERROR_NONE, , "Invialid parameter!");
145 retif(pkgname == NULL && retcode != SERVICE_ERROR_APP_NOT_FOUND, , "Invialid parameter!");
147 const char *msg = NULL;
149 if (retcode == SERVICE_ERROR_APP_NOT_FOUND) {
150 notification_status_message_post(_S("IDS_COM_BODY_NO_APPLICATIONS_CAN_PERFORM_THIS_ACTION"));
152 Eina_Strbuf *strbuf = eina_strbuf_new();
154 if (strbuf != NULL) {
155 eina_strbuf_append_printf(strbuf, _S("IDS_IDLE_POP_UNABLE_TO_LAUNCH_PS"), pkgname);
156 eina_strbuf_append_printf(strbuf, "(%d)", retcode);
157 msg = eina_strbuf_string_get(strbuf);
160 notification_status_message_post(msg);
162 eina_strbuf_free(strbuf);
168 static Eina_Bool _anim_job_rotation(void *data) {
170 retif(vi == NULL, EINA_FALSE, "invalid parameter");
172 struct appdata *ad = vi->extra_data_1;
173 int new_angle = vi->extra_flag_1;
176 elm_win_rotation_with_resize_set(ad->win,
179 ad->angle = new_angle;
181 _quickpanel_ui_set_indicator_cover(ad);
185 quickpanel_vi_done(vi);
190 static Eina_Bool _anim_done_rotation(void *data) {
192 retif(vi == NULL, EINA_FALSE, "invalid parameter");
194 struct appdata *ad = vi->extra_data_1;
195 int new_angle = vi->extra_flag_1;
198 elm_win_rotation_with_resize_set(ad->win, new_angle);
200 ad->angle = new_angle;
202 _quickpanel_ui_set_indicator_cover(ad);
207 _quickpanel_init_size_genlist(ad);
208 _quickpanel_ui_update_height(ad);
215 static void _quickpanel_move_data_to_service(const char *key, const char *val, void *data)
217 retif(data == NULL || key == NULL || val == NULL, , "Invialid parameter!");
219 service_h service = data;
220 service_add_extra_data(service, key, val);
223 static void atoms_init_quickpanel(void)
225 E_ILLUME_ATOM_MV_QUICKPANEL_STATE = ecore_x_atom_get("_E_MOVE_QUICKPANEL_STATE");
228 /******************************************************************************
232 ****************************************************************************/
233 static Eina_Bool _quickpanel_ui_refresh_cb(void *data)
235 struct appdata *ad = NULL;
237 retif(data == NULL, QP_FAIL, "Invalid parameter!");
240 INFO(" >>>>>>>>>>>>>>> Refresh QP modules!! <<<<<<<<<<<<<<<< ");
241 refresh_modules(data);
243 _quickpanel_init_size_genlist(ad);
244 _quickpanel_ui_update_height(ad);
249 static void _quickpanel_cache_flush(void *evas)
252 int collection_cache;
256 retif(evas == NULL, , "Evas is NULL\n");
258 file_cache = edje_file_cache_get();
259 collection_cache = edje_collection_cache_get();
260 image_cache = evas_image_cache_get(evas);
261 font_cache = evas_font_cache_get(evas);
263 edje_file_cache_set(file_cache);
264 edje_collection_cache_set(collection_cache);
265 evas_image_cache_set(evas, 0);
266 evas_font_cache_set(evas, 0);
268 evas_image_cache_flush(evas);
269 evas_render_idle_flush(evas);
270 evas_font_cache_flush(evas);
272 edje_file_cache_flush();
273 edje_collection_cache_flush();
275 edje_file_cache_set(file_cache);
276 edje_collection_cache_set(collection_cache);
277 evas_image_cache_set(evas, image_cache);
278 evas_font_cache_set(evas, font_cache);
281 static int _quickpanel_ui_rotation_get_angle(void *data)
283 struct appdata *ad = (struct appdata *)data;
284 Ecore_X_Window xwin, root;
285 int ret = 0, angle = 0, count = 0;
286 unsigned char *prop_data = NULL;
288 retif(data == NULL, -1, "Invalid parameter!");
290 xwin = elm_win_xwindow_get(ad->win);
291 root = ecore_x_window_root_get(xwin);
293 ret = ecore_x_window_prop_property_get(root,
294 ECORE_X_ATOM_E_ILLUME_ROTATE_ROOT_ANGLE,
295 ECORE_X_ATOM_CARDINAL, 32,
298 if (ret && prop_data) {
299 memcpy(&angle, prop_data, sizeof(int));
306 ERR("Fail to get angle");
314 static void _quickpanel_ui_rotation(void *data, int new_angle)
316 struct appdata *ad = data;
317 retif(data == NULL, , "Invalid parameter!");
319 INFO("ROTATION: new:%d old:%d", new_angle, ad->angle);
321 if (new_angle == 0 || new_angle == 90 || new_angle == 180 || new_angle == 270) {
322 if (new_angle != ad->angle) {
323 ad->angle = new_angle;
325 _quickpanel_ui_set_indicator_cover(ad);
328 _quickpanel_init_size_genlist(ad);
329 _quickpanel_ui_update_height(ad);
334 static Eina_Bool quickpanel_ui_client_message_cb(void *data, int type,
337 struct appdata *ad = data;
338 Ecore_X_Event_Client_Message *ev = event;
340 retif(data == NULL || event == NULL,
341 ECORE_CALLBACK_RENEW, "Invalid parameter!");
343 if (ev->message_type == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE) {
344 if (ev->data.l[0] == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF) {
346 qp_closed_modules(data);
347 quickpanel_player_stop();
348 #if QP_ENABLE_HIDING_INDICATOR
349 elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_HIDE);
352 } else if (ad->E_ILLUME_ATOM_MV_QUICKPANEL_STATE != NULL) {
353 if (ev->message_type == *(ad->E_ILLUME_ATOM_MV_QUICKPANEL_STATE)) {
354 if (ev->data.l[0] == 1) {
355 if (ad->is_opened == 0) {
356 #if QP_ENABLE_HIDING_INDICATOR
357 elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
359 INFO("quickpanel going to be opened");
362 if (ev->data.l[0] == 0) {
363 if (ad->is_opened == 0) {
364 INFO("quickpanel is closed");
366 qp_opened_modules(data);
367 quickpanel_player_stop();
372 return ECORE_CALLBACK_RENEW;
375 static void _quickpanel_signal_handler(int signum, siginfo_t *info, void *unused)
377 ERR("quickpanel going to be terminated");
381 static Eina_Bool _quickpanel_ui_delayed_indicator_show_cb(void *data)
383 Evas_Object *win = data;
384 retif(win == NULL, EINA_FALSE, "Invalid parameter!");
386 elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_HIDE);
392 static void _quickpanel_app_rotate_cb(void *data, Evas_Object *obj, void *event)
395 struct appdata *ad = data;
396 retif(ad == NULL, , "Invalid parameter!");
398 DBG("ROTATE:%d", angle);
400 angle = elm_win_rotation_get((Evas_Object *)obj);
401 _quickpanel_ui_rotation(ad, angle);
404 static Evas_Object *_quickpanel_ui_window_add(const char *name, int prio)
406 Evas_Object *eo = NULL;
409 eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
412 elm_win_alpha_set(eo, EINA_TRUE);
413 #if QP_ENABLE_HIDING_INDICATOR
414 elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_SHOW);
415 ecore_idler_add(_quickpanel_ui_delayed_indicator_show_cb, eo);
417 elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_SHOW);
420 elm_win_title_set(eo, name);
421 elm_win_borderless_set(eo, EINA_TRUE);
422 elm_win_autodel_set(eo, EINA_TRUE);
424 /* set this window as a quickpanel */
425 elm_win_quickpanel_set(eo, 1);
426 elm_win_quickpanel_priority_major_set(eo, prio);
428 if (elm_win_wm_rotation_supported_get(eo))
430 int rots[4] = { 0, 90, 270 };
431 elm_win_wm_rotation_available_rotations_set(eo, rots, 3);
434 /* icccm name class set */
435 xwin = elm_win_xwindow_get(eo);
436 ecore_x_icccm_name_class_set(xwin, "QUICKPANEL", "QUICKPANEL");
438 unsigned int val = 1;
439 ecore_x_window_prop_card32_set
440 (xwin, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL, &val, 1);
442 evas_object_show(eo);
449 static void _quickpanel_add_debugging_bar(Evas_Object *list)
451 Eina_Bool ret = EINA_FALSE;
452 Evas_Object *bar = elm_layout_add(list);
454 ret = elm_layout_file_set(bar, DEFAULT_EDJ,
455 "quickpanel/seperator/default");
457 if (ret != EINA_FALSE) {
458 evas_object_size_hint_weight_set(bar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
459 evas_object_size_hint_align_set(bar, EVAS_HINT_FILL, EVAS_HINT_FILL);
462 = quickpanel_list_util_item_new(QP_ITEM_TYPE_BAR, NULL);
463 quickpanel_list_util_item_set_tag(bar, qid);
464 quickpanel_list_util_sort_insert(list, bar);
465 evas_object_show(bar);
470 HAPI Evas_Object *quickpanel_ui_load_edj(Evas_Object * parent, const char *file,
471 const char *group, int is_just_load)
474 Evas_Object *eo = NULL;
476 retif(parent == NULL, NULL, "Invalid parameter!");
478 eo = elm_layout_add(parent);
479 retif(eo == NULL, NULL, "Failed to add layout object!");
481 r = elm_layout_file_set(eo, file, group);
482 retif(r != EINA_TRUE, NULL,
483 "Failed to set edje object file[%s-%s]!", file, group);
485 evas_object_size_hint_weight_set(eo,
486 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
488 if (is_just_load == 1) {
489 elm_win_resize_object_add(parent, eo);
491 evas_object_show(eo);
496 static int _quickpanel_ui_create_win(void *data)
498 struct appdata *ad = data;
501 int initial_angle = 0;
503 retif(data == NULL, QP_FAIL, "Invialid parameter!");
505 ad->win = _quickpanel_ui_window_add("Quickpanel Window",
507 if (ad->win == NULL) {
508 ERR("ui create : failed to create window.");
512 evas_object_smart_callback_add(ad->win, "wm,rotation,changed",
513 _quickpanel_app_rotate_cb, ad);
515 #ifdef QP_INDICATOR_WIDGET_ENABLE
516 ad->comformant = elm_conformant_add(ad->win);
517 #if QP_ENABLE_HIDING_INDICATOR
518 elm_object_style_set(ad->comformant, "without_resize");
520 elm_object_style_set(ad->comformant, "nokeypad");
523 ad->ly = quickpanel_ui_load_edj(ad->comformant,
524 DEFAULT_EDJ, "quickpanel/gl_base", 0);
528 evas_object_size_hint_weight_set(ad->comformant,
529 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
530 elm_win_resize_object_add(ad->win, ad->comformant);
531 evas_object_show(ad->comformant);
532 elm_object_content_set(ad->comformant, ad->ly);
535 ad->ly = quickpanel_ui_load_edj(ad->win,
536 DEFAULT_EDJ, "quickpanel/gl_base", 0);
542 ad->evas = evas_object_evas_get(ad->win);
544 Evas_Object *sc = elm_scroller_add(ad->ly);
545 retif(!sc, EINA_FALSE, "fail to add scroller");
546 elm_scroller_bounce_set(sc, EINA_TRUE, EINA_TRUE);
547 elm_scroller_policy_set(sc,
548 ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
549 evas_object_size_hint_weight_set(sc,
550 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
551 evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
552 evas_object_show(sc);
554 Evas_Object *box = elm_box_add(sc);
556 ERR("fail to add box");
560 evas_object_size_hint_weight_set(box,
561 EVAS_HINT_EXPAND, 0);
562 elm_box_horizontal_set(box, EINA_FALSE);
567 _quickpanel_add_debugging_bar(ad->list);
570 elm_object_content_set(sc, box);
571 elm_object_part_content_set(ad->ly, "qp.gl_base.gl.swallow", ad->scroller);
572 evas_object_show(ad->list);
574 ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
575 evas_object_resize(ad->win, w, h);
580 _quickpanel_init_size_genlist(ad);
582 _quickpanel_ui_set_indicator_cover(ad);
585 initial_angle = _quickpanel_ui_rotation_get_angle(ad);
586 _quickpanel_ui_rotation(ad, initial_angle);
590 static void _quickpanel_ui_set_indicator_cover(void *data)
592 retif(data == NULL, , "data is NULL");
593 struct appdata *ad = data;
595 int x_2 = 0, y_2 = 0;
596 int angle = ad->angle;
598 int width = INDICATOR_COVER_W * ad->scale;
599 int height = INDICATOR_COVER_H * ad->scale;
603 x_2 = ad->win_width - width;
607 x_2 = ad->win_height - width;
611 x_2 = ad->win_width - width;
615 x_2 = ad->win_height - width;
620 if (ad->cover_indicator_right == NULL) {
621 Evas_Object *bg = evas_object_rectangle_add(ad->evas);
622 evas_object_color_set(bg, 52, 52, 50, 255); // opaque white background
623 evas_object_repeat_events_set(bg, EINA_FALSE);
624 evas_object_resize(bg, width, height); // covers full canvas
625 evas_object_move(bg, x_2, y_2);
626 evas_object_show(bg);
627 ad->cover_indicator_right = bg;
629 evas_object_move(ad->cover_indicator_right, x_2, y_2);
634 static void _quickpanel_ui_window_set_input_region(void *data, int contents_height)
636 struct appdata *ad = NULL;
638 Ecore_X_Atom atom_window_input_region = 0;
639 unsigned int window_input_region[4] = {0,};
641 retif(data == NULL, , "Invialid parameter!");
644 xwin = elm_win_xwindow_get(ad->win);
646 INFO("angle:%d", ad->angle);
649 window_input_region[0] = 0; //X
650 window_input_region[1] = contents_height; // Y
651 window_input_region[2] = ad->win_width; // Width
652 window_input_region[3] = ad->scale * QP_HANDLE_H; // height
655 window_input_region[0] = contents_height; //X
656 window_input_region[1] = 0; // Y
657 window_input_region[2] = ad->scale * QP_HANDLE_H; // Width
658 window_input_region[3] = ad->win_height; // height
661 window_input_region[0] = 0; //X
662 window_input_region[1] = ad->win_height - contents_height - ad->scale * QP_HANDLE_H; // Y
663 window_input_region[2] = ad->win_width; // Width
664 window_input_region[3] = ad->scale * QP_HANDLE_H; // height
667 window_input_region[0] = ad->win_width - contents_height - ad->scale * QP_HANDLE_H ; //X
668 window_input_region[1] = 0; // Y
669 window_input_region[2] = ad->scale * QP_HANDLE_H; // Width
670 window_input_region[3] = ad->win_height; // height
674 INFO("win_input_0:%d\nwin_input_1:%d\nwin_input_2:%d\nwin_input_3:%d\n"
675 ,window_input_region[0]
676 ,window_input_region[1]
677 ,window_input_region[2]
678 ,window_input_region[3]
681 atom_window_input_region = ecore_x_atom_get(STR_ATOM_WINDOW_INPUT_REGION);
682 ecore_x_window_prop_card32_set(xwin, atom_window_input_region, window_input_region, 4);
685 static void _quickpanel_ui_window_set_content_region(void *data, int contents_height)
687 struct appdata *ad = NULL;
689 Ecore_X_Atom atom_window_contents_region = 0;
690 unsigned int window_contents_region[4] = {0,};
692 retif(data == NULL, , "Invialid parameter!");
695 xwin = elm_win_xwindow_get(ad->win);
697 INFO("angle:%d", ad->angle);
700 window_contents_region[0] = 0; //X
701 window_contents_region[1] = 0; // Y
702 window_contents_region[2] = ad->win_width; // Width
703 window_contents_region[3] = contents_height; // height
706 window_contents_region[0] = 0; //X
707 window_contents_region[1] = 0; // Y
708 window_contents_region[2] = contents_height; // Width
709 window_contents_region[3] = ad->win_height; // height
712 window_contents_region[0] = 0; //X
713 window_contents_region[1] = ad->win_height - contents_height; // Y
714 window_contents_region[2] = ad->win_width; // Width
715 window_contents_region[3] = contents_height; // height
718 window_contents_region[0] = ad->win_width - contents_height ; //X
719 window_contents_region[1] = 0; // Y
720 window_contents_region[2] = contents_height; // Width
721 window_contents_region[3] = ad->win_height; // height
725 DBG("win_contents_0:%d\nwin_contents_1:%d\nwin_contents_2:%d\nwin_contents_3:%d\n"
726 ,window_contents_region[0]
727 ,window_contents_region[1]
728 ,window_contents_region[2]
729 ,window_contents_region[3]
732 atom_window_contents_region = ecore_x_atom_get(STR_ATOM_WINDOW_CONTENTS_REGION);
733 ecore_x_window_prop_card32_set(xwin, atom_window_contents_region, window_contents_region, 4);
736 static int _quickpanel_ui_delete_win(void *data)
738 struct appdata *ad = data;
739 retif(data == NULL, QP_FAIL, "Invialid parameter!");
741 if (ad->list != NULL) {
742 evas_object_del(ad->list);
745 if (ad->scroller != NULL) {
746 evas_object_del(ad->scroller);
749 if (ad->ly != NULL) {
750 evas_object_del(ad->ly);
753 if (ad->win != NULL) {
754 evas_object_del(ad->win);
761 static void _quickpanel_ui_vconf_event_powerff_cb(keynode_t *node,
765 if (vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &val) == 0 &&
766 (val == VCONFKEY_SYSMAN_POWER_OFF_DIRECT || val == VCONFKEY_SYSMAN_POWER_OFF_RESTART)) {
771 static void _quickpanel_ui_vconf_event_lcdoff_cb(keynode_t *node,
775 int pm_state = VCONFKEY_PM_STATE_NORMAL;
777 ret = vconf_get_int(VCONFKEY_PM_STATE, &pm_state);
779 if (ret == 0 && pm_state == VCONFKEY_PM_STATE_LCDOFF) {
780 quickpanel_close_quickpanel(false);
784 static void _quickpanel_ui_vconf_event_init(struct appdata *ad)
788 ret = vconf_notify_key_changed(VCONFKEY_PM_STATE,
789 _quickpanel_ui_vconf_event_lcdoff_cb, ad);
791 ERR("VCONFKEY_PM_STATE: %d", ret);
794 ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS,
795 _quickpanel_ui_vconf_event_powerff_cb, ad);
797 ERR("VCONFKEY_PM_STATE: %d", ret);
801 static void _quickpanel_ui_vconf_event_fini(struct appdata *ad)
805 ret = vconf_ignore_key_changed(VCONFKEY_PM_STATE,
806 _quickpanel_ui_vconf_event_lcdoff_cb);
808 ERR("VCONFKEY_PM_STATE: %d", ret);
811 ret = vconf_ignore_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS,
812 _quickpanel_ui_vconf_event_powerff_cb);
814 ERR("VCONFKEY_PM_STATE: %d", ret);
818 static void _quickpanel_ui_init_ecore_event(struct appdata *ad)
820 Ecore_Event_Handler *hdl = NULL;
822 /* Register window rotate event */
823 hdl = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
824 quickpanel_ui_client_message_cb, ad);
826 ERR("failed to add handler(ECORE_X_EVENT_CLIENT_MESSAGE)");
828 ad->hdl_client_message = hdl;
831 static void _quickpanel_ui_fini_ecore_event(struct appdata *ad)
833 if (ad->hdl_client_message != NULL) {
834 ecore_event_handler_del(ad->hdl_client_message);
835 ad->hdl_client_message = NULL;
839 static void _quickpanel_ui_setting_show(struct appdata *ad, int show)
848 static void _quickpanel_ui_update_height(void *data)
850 int contents_height = 0;
851 int height_genlist = 0;
853 struct appdata *ad = NULL;
855 retif(data == NULL, , "data is NULL");
858 height_genlist = ad->gl_limit_height;
859 contents_height = ad->gl_distance_from_top + height_genlist + ad->gl_distance_to_bottom - ad->scale * QP_HANDLE_H;
861 _quickpanel_ui_window_set_input_region(ad, contents_height);
862 _quickpanel_ui_window_set_content_region(ad, contents_height);
865 static void _quickpanel_init_size_genlist(void *data)
867 struct appdata *ad = NULL;
868 int max_height_window = 0;
869 Evas_Coord genlist_y = 0;
870 Evas_Coord spn_height = 0;
872 retif(data == NULL, , "data is NULL");
875 if (ad->angle == 90 || ad->angle == 270 )
876 max_height_window = ad->win_width;
878 max_height_window = ad->win_height;
880 edje_object_part_geometry_get(_EDJ(ad->ly), "qp.gl_base.gl.swallow", NULL, &genlist_y, NULL, NULL);
881 edje_object_part_geometry_get(_EDJ(ad->ly), "qp.base.spn.swallow", NULL, NULL, NULL, &spn_height);
883 ad->gl_distance_from_top = genlist_y;
884 ad->gl_distance_to_bottom = spn_height + (1 * ad->scale) + (ad->scale*QP_HANDLE_H) ;
885 ad->gl_limit_height = max_height_window - ad->gl_distance_from_top - ad->gl_distance_to_bottom;
888 /*****************************************************************************
890 * App efl main interface
892 ****************************************************************************/
893 static bool quickpanel_app_create(void *data)
901 struct sigaction act;
902 act.sa_sigaction = _quickpanel_signal_handler;
903 act.sa_flags = SA_SIGINFO;
905 int ret = sigemptyset(&act.sa_mask);
907 ERR("Failed to sigemptyset[%s]", strerror(errno));
909 ret = sigaddset(&act.sa_mask, SIGTERM);
911 ERR("Failed to sigaddset[%s]", strerror(errno));
913 ret = sigaction(SIGTERM, &act, NULL);
915 ERR("Failed to sigaction[%s]", strerror(errno));
920 WARN("Failed to set session id!");
924 WARN("Failed to set nice value!");
929 static void quickpanel_app_terminate(void *data)
933 struct appdata *ad = data;
934 retif(ad == NULL, , "invalid data.");
936 /* fini quickpanel modules */
939 _quickpanel_cache_flush(ad->evas);
941 feedback_deinitialize();
943 quickpanel_service_keyboard_fini(ad);
945 /* unregister system event callback */
946 _quickpanel_ui_vconf_event_fini(ad);
948 _quickpanel_ui_fini_ecore_event(ad);
950 if (ad->cover_indicator_right != NULL) {
951 evas_object_del(ad->cover_indicator_right);
952 ad->cover_indicator_right = NULL;
954 /* delete quickpanel window */
955 _quickpanel_ui_delete_win(ad);
957 INFO(" >>>>>>>>>>>>>>> QUICKPANEL IS TERMINATED!! <<<<<<<<<<<<<<<< ");
960 static void quickpanel_app_pause(void *data)
964 struct appdata *ad = data;
965 retif(ad == NULL,, "invalid data.");
968 quickpanel_ui_del_current_popup();
970 ad->is_suspended = 1;
972 _quickpanel_cache_flush(ad->evas);
975 static void quickpanel_app_resume(void *data)
979 struct appdata *ad = data;
980 retif(ad == NULL,, "invalid data.");
982 ad->is_suspended = 0;
984 resume_modules(data);
987 static void quickpanel_app_service(service_h service, void *data)
989 struct appdata *ad = data;
992 retif(ad == NULL, , "Invialid parameter!");
994 INFO(" >>>>>>>>>>>>>>> QUICKPANEL IS STARTED!! <<<<<<<<<<<<<<<< ");
997 ad->is_emul = quickpanel_is_emul();
998 INFO("quickpanel run in %s", ad->is_emul ? "Emul" : "Device");
1000 ad->scale = elm_config_scale_get();
1004 INFO("quickpanel scale %f", ad->scale);
1006 ad->is_suspended = 1;
1009 elm_theme_extension_add(NULL, DEFAULT_THEME_EDJ);
1011 /* create quickpanel window */
1012 ret = _quickpanel_ui_create_win(ad);
1013 retif(ret != QP_OK, , "Failed to create window!");
1015 atoms_init_quickpanel();
1017 ad->E_ILLUME_ATOM_MV_QUICKPANEL_STATE = &E_ILLUME_ATOM_MV_QUICKPANEL_STATE;
1019 _quickpanel_ui_init_ecore_event(ad);
1021 _quickpanel_ui_vconf_event_init(ad);
1023 feedback_initialize();
1025 #ifdef QP_SETTING_ENABLE
1026 _quickpanel_ui_setting_show(ad, 1);
1027 #else /* QP_SETTING_ENABLE */
1028 _quickpanel_ui_setting_show(ad, 0);
1029 #endif /* QP_SETTING_ENABLE */
1031 /* init quickpanel modules */
1034 quickpanel_service_keyboard_init(ad);
1036 ecore_idler_add(_quickpanel_ui_refresh_cb, ad);
1039 static void quickpanel_app_language_changed_cb(void *data)
1041 retif(data == NULL, , "Invalid parameter!");
1043 INFO(" >>>>>>>>>>>>>>> LANGUAGE CHANGED!! <<<<<<<<<<<<<<<< ");
1044 lang_change_modules(data);
1047 static void quickpanel_app_region_format_changed_cb(void *data)
1049 INFO(" >>>>>>>>>>>>>>> region_format CHANGED!! <<<<<<<<<<<<<<<< ");
1050 lang_change_modules(data);
1053 HAPI void quickpanel_open_quickpanel(void) {
1054 Ecore_X_Window xwin;
1055 Ecore_X_Window zone;
1056 struct appdata *ad = g_app_data;
1060 retif(ad == NULL, , "Invalid parameter!");
1061 retif(ad->win == NULL, , "Invalid parameter!");
1063 xwin = elm_win_xwindow_get(ad->win);
1065 if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) {
1066 if (ecore_x_e_illume_quickpanel_state_get(zone) == ECORE_X_ILLUME_QUICKPANEL_STATE_OFF) {
1067 ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_ON);
1070 ERR("failed to get zone");
1073 ERR("failed to get xwin");
1077 HAPI void quickpanel_close_quickpanel(bool is_check_lock) {
1078 Ecore_X_Window xwin;
1079 Ecore_X_Window zone;
1080 int is_lock_launched = VCONFKEY_IDLE_UNLOCK;
1081 struct appdata *ad = g_app_data;
1085 retif(ad == NULL, , "Invalid parameter!");
1086 retif(ad->win == NULL, , "Invalid parameter!");
1088 if (is_check_lock == true) {
1089 if (vconf_get_int(VCONFKEY_IDLE_LOCK_STATE, &is_lock_launched) == 0) {
1090 if (is_lock_launched == VCONFKEY_IDLE_LOCK) {
1091 vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK);
1097 xwin = elm_win_xwindow_get(ad->win);
1099 if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) {
1100 if (ecore_x_e_illume_quickpanel_state_get(zone) == ECORE_X_ILLUME_QUICKPANEL_STATE_ON) {
1101 ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_OFF);
1104 ERR("failed to get zone");
1107 ERR("failed to get xwin");
1111 HAPI void quickpanel_toggle_openning_quickpanel(void) {
1112 Ecore_X_Window xwin;
1113 Ecore_X_Window zone;
1114 struct appdata *ad = g_app_data;
1118 retif(ad == NULL, , "Invalid parameter!");
1119 retif(ad->win == NULL, , "Invalid parameter!");
1121 xwin = elm_win_xwindow_get(ad->win);
1123 if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) {
1124 if (ecore_x_e_illume_quickpanel_state_get(zone) == ECORE_X_ILLUME_QUICKPANEL_STATE_ON) {
1125 ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_OFF);
1127 ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_ON);
1130 ERR("failed to get zone");
1133 ERR("failed to get xwin");
1137 int main(int argc, char *argv[])
1141 app_event_callback_s app_callback = {0,};
1143 r = control_privilege();
1145 WARN("Failed to control privilege!");
1148 app_callback.create = quickpanel_app_create;
1149 app_callback.terminate = quickpanel_app_terminate;
1150 app_callback.pause = quickpanel_app_pause;
1151 app_callback.resume = quickpanel_app_resume;
1152 app_callback.service = quickpanel_app_service;
1153 app_callback.low_memory = NULL;
1154 app_callback.low_battery = NULL;
1155 app_callback.device_orientation = NULL;
1156 app_callback.language_changed = quickpanel_app_language_changed_cb;
1157 app_callback.region_format_changed = quickpanel_app_region_format_changed_cb;
1159 memset(&ad, 0x0, sizeof(struct appdata));
1163 return app_efl_main(&argc, &argv, &app_callback, (void *)&ad);