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.
19 #include <Elementary.h>
24 #include <minicontrol-viewer.h>
25 #include <minicontrol-internal.h>
28 #include <tzsh_quickpanel_service.h>
31 #include "common_uic.h"
32 #include "quickpanel-ui.h"
33 #include "quickpanel_def.h"
34 #include "list_util.h"
35 #include "quickpanel_debug_util.h"
37 #include "vi_manager.h"
39 #ifdef QP_SCREENREADER_ENABLE
40 #include "accessibility.h"
43 #define MINICONTROL_TYPE_STR_VIEWER "::[viewer="
44 #define MINICONTROL_TYPE_STR_QUICKPANEL "QUICKPANEL"
45 #define MINICONTROL_TYPE_STR_LOCKSCREEN "LOCKSCREEN"
46 #define MINICONTROL_TYPE_STR_ONGOING "_ongoing]"
47 #define MINICONTROL_VIEW_DATA "MINICONTROL_VIEW_DATA"
49 #define THRESHOLD_DELETE_START 30
50 #define THRESHOLD_DELETE_START_Y_LIMIT 60
51 #define THRESHOLD_DISTANCE (200)
52 #define THRESHOLD_DISTANCE_LOCK (500)
54 #define MINICONTROL_BUNDLE_KEY_WIDTH "width"
55 #define MINICONTROL_BUNDLE_KEY_HEIGHT "height"
57 #define BUNDLE_BUFFER_LENGTH 100
59 typedef enum _gesture_state_type {
62 STATE_GESTURE_CANCELED,
80 int need_to_cancel_press;
81 gesture_state_type state;
86 GHashTable *prov_table;
91 static int _viewer_check(const char *name)
93 char *pos_start = NULL;
100 if ((pos_start = strstr(name, MINICONTROL_TYPE_STR_VIEWER)) != NULL) {
101 if (strstr(pos_start, MINICONTROL_TYPE_STR_QUICKPANEL) != NULL) {
106 } else if (strstr(name, MINICONTROL_TYPE_STR_LOCKSCREEN) != NULL) {
113 static void _viewer_unfreeze(Evas_Object *viewer)
115 int i = 0, freezed_count = 0;
118 ERR("Invalid parameter");
122 freezed_count = elm_object_scroll_freeze_get(viewer);
124 for (i = 0 ; i < freezed_count; i++) {
125 elm_object_scroll_freeze_pop(viewer);
129 static Evas_Object *_get_minictrl_obj(Evas_Object *layout)
132 ERR("Invalid parameter");
136 return elm_object_part_content_get(layout, "elm.icon");
139 static void _viewer_set_size(Evas_Object *layout, void *data, int width, int height)
147 if (!layout || !data || width < 0 || height < 0) {
148 ERR("Invalid parameters (%p, %p, %d, %d)", layout, data, width, height);
152 viewer = _get_minictrl_obj(layout);
154 ERR("Unable to get the 'viewer'");
160 if (ad->angle == 0 || ad->angle == 180) {
166 if (width > ad->win_width) {
167 ERR("MC Size is not valid. it is larger than window size: %dx%d (%dx%d) %d", width, height, ad->win_width, ad->win_height, ad->angle);
170 max_width = is_landscape ? ad->win_height : ad->win_width;
171 resized_width = (width > max_width) ? max_width : width;
173 SERR("minicontroller view is resized to w:%d/%d(%d) h:%d Landscape[%d]", resized_width, max_width, width, height, is_landscape);
175 evas_object_size_hint_min_set(viewer, resized_width, height);
176 evas_object_size_hint_max_set(viewer, resized_width, height);
179 static void _viewer_item_free(struct _viewer_item *item)
183 ad = quickpanel_get_app_data();
184 if (!ad || !ad->list || !item) {
185 ERR("Invalid paramter %p, %p, %p", ad, ad ? ad->list : NULL, item);
192 quickpanel_list_util_item_unpack_by_object(ad->list, item->viewer, 0, 0);
193 quickpanel_list_util_item_del_tag(item->viewer);
194 evas_object_del(item->viewer);
200 static bool _check_deletable(Evas_Object *obj)
202 struct _viewer_item *vit;
204 vit = evas_object_data_get(obj, MINICONTROL_VIEW_DATA);
206 return vit->deletable;
212 static void _mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
214 Evas_Event_Mouse_Down *ev;
215 struct _viewer_item *vit;
217 vit = evas_object_data_get(obj, MINICONTROL_VIEW_DATA);
218 ev = (Evas_Event_Mouse_Down *)event_info;
221 ERR("ev %p, vit %p");
225 evas_object_geometry_get(obj, NULL, NULL, &vit->obj_w, &vit->obj_h);
227 vit->press_x = ev->canvas.x;
228 vit->press_y = ev->canvas.y;
229 vit->state = STATE_NORMAL;
231 SDBG("mouse down:%d %d %d", vit->obj_w, vit->obj_h, vit->state);
233 if (vit->vi != NULL) {
234 quickpanel_vi_user_event_del(vit->vi);
238 vit->need_to_cancel_press = 0;
241 static void _mouse_move_cb(void* data, Evas* e, Evas_Object* obj, void* event_info)
243 static int vi_start_x = 0;
244 static int delta_prev = -1;
250 Evas_Event_Mouse_Move* ev;
251 struct _viewer_item *vit;
256 vit = evas_object_data_get(obj, MINICONTROL_VIEW_DATA);
257 if (!ev || !vit || !ad) {
258 ERR("ev: %p, vit: %p, ad: %p", ev, vit, ad);
262 if (vit->state == STATE_GESTURE_CANCELED) {
263 DBG("deletion has been canceled");
267 if (!_check_deletable(obj)) {
268 DBG("vit->deletable is false");
272 evas_object_geometry_get(obj, &x, &y, &w, &h);
273 delta_x = (ev->cur.output.x - vit->press_x) / 2;
275 switch (vit->state) {
277 if (abs(delta_x) >= THRESHOLD_DELETE_START) {
280 DBG("start a deletion");
281 vit->state = STATE_GESTURE_WAIT;
283 vi_start_x = delta_x;
285 vi = quickpanel_vi_new_with_data(
293 NULL, /* _drag_cancel_cb, */
294 NULL, /* vi == null */
301 quickpanel_vi_user_event_add(vi);
303 ERR("Unable to create a 'vi'");
306 vit->need_to_cancel_press = 1;
309 case STATE_GESTURE_WAIT:
310 if (delta_prev != delta_x) {
313 map = evas_map_new(4);
315 evas_map_util_points_populate_from_object(map, obj);
316 evas_map_util_points_populate_from_geometry(map, x + delta_x - vi_start_x, y, w, h, 0);
317 evas_object_map_enable_set(obj, EINA_TRUE);
318 evas_object_map_set(obj, map);
320 _viewer_unfreeze(ad->scroller);
322 delta_prev = delta_x;
329 vit->distance = delta_x;
332 static void _minictrl_remove(const char *name, void *data)
334 DBG("_minictrl_remove [%s]", name);
336 minicontrol_viewer_send_event(name, MINICONTROL_EVENT_REQUEST_HIDE, NULL);
338 if (s_info.prov_table) {
339 if (g_hash_table_remove(s_info.prov_table, name)) {
340 DBG("success to remove %s", name);
345 * Oh, this function doesn't handles "data".
346 * Why does this has to check its existence??
351 WARN("unknown provider name : %s", name);
356 static void _mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
358 struct _viewer_item *vit;
363 vit = evas_object_data_get(obj, MINICONTROL_VIEW_DATA);
365 ERR("vit: %p, ad: %p", vit, ad);
369 _viewer_unfreeze(ad->scroller);
371 if (!_check_deletable(obj)) {
372 swipe_distance = THRESHOLD_DISTANCE_LOCK;
374 swipe_distance = THRESHOLD_DISTANCE;
377 switch (vit->state) {
378 case STATE_GESTURE_WAIT:
379 if (abs(vit->distance) >= (swipe_distance - 10)) {
380 Elm_Transit *transit_flick;
383 x = abs(vit->distance) - THRESHOLD_DELETE_START;
385 if (vit->distance > 0) {
386 evas_object_map_set(obj, NULL);
387 transit_flick = elm_transit_add();
388 if (transit_flick != NULL) {
389 elm_transit_effect_translation_add(transit_flick, x, 0, 480, 0);
390 elm_transit_object_add(transit_flick, obj);
391 elm_transit_duration_set(transit_flick, 0.25 * (480 - x ) / 480);
392 elm_transit_tween_mode_set(transit_flick, ELM_TRANSIT_TWEEN_MODE_LINEAR);
393 elm_transit_objects_final_state_keep_set(transit_flick, EINA_TRUE);
394 elm_transit_go(transit_flick);
395 _minictrl_remove(vit->name, vit->data);
397 } else if (vit->distance < 0) {
398 evas_object_map_set(obj, NULL);
399 transit_flick = elm_transit_add();
400 if (transit_flick != NULL) {
401 elm_transit_effect_translation_add(transit_flick, -x, 0, -480, 0);
402 elm_transit_object_add(transit_flick, obj);
403 elm_transit_duration_set(transit_flick, 0.25 * ( 480 - x ) / 480);
404 elm_transit_tween_mode_set(transit_flick, ELM_TRANSIT_TWEEN_MODE_LINEAR);
405 elm_transit_objects_final_state_keep_set(transit_flick, EINA_TRUE);
406 elm_transit_go(transit_flick);
407 _minictrl_remove(vit->name, vit->data);
411 evas_object_map_enable_set(obj, EINA_FALSE);
414 if (vit->vi != NULL) {
415 quickpanel_vi_user_event_del(vit->vi);
419 case STATE_GESTURE_CANCELED:
420 evas_object_map_enable_set(obj, EINA_FALSE);
422 if (vit->vi != NULL) {
423 quickpanel_vi_user_event_del(vit->vi);
431 vit->state = STATE_NORMAL;
434 static Evas_Object *_minictrl_create_view(struct appdata *ad, const char *name)
440 if (!ad || !ad->list || !name) {
441 ERR("Invalid parameters: %p %p %p", ad, ad ? ad->list : NULL, name);
445 layout = elm_layout_add(ad->list);
447 ERR("Unable to create a layout");
451 elm_layout_file_set(layout, DEFAULT_EDJ, "quickpanel/minictrl/default");
452 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
453 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
454 evas_object_show(layout);
456 viewer = minicontrol_viewer_add(layout, name);
458 ERR("fail to add viewer - %s", name);
459 evas_object_del(layout);
462 elm_object_focus_allow_set(viewer, EINA_TRUE);
463 elm_object_part_content_set(layout, "elm.icon", viewer);
465 evas_object_event_callback_add(viewer, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, ad);
466 evas_object_event_callback_add(viewer, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, ad);
467 evas_object_event_callback_add(viewer, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, ad);
469 focus = quickpanel_accessibility_ui_get_focus_object(layout);
470 elm_object_part_content_set(layout, "focus", focus);
471 #ifdef QP_SCREENREADER_ENABLE
473 ao = quickpanel_accessibility_screen_reader_object_get(layout, SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", layout);
475 elm_access_info_cb_set(ao, ELM_ACCESS_TYPE, quickpanel_accessibility_info_cb, _NOT_LOCALIZED("Mini controller"));
482 static int _minictrl_is_ongoing(const char *str)
488 if (strstr(str, MINICONTROL_TYPE_STR_ONGOING) != NULL) {
495 static void _minictrl_add(const char *name, unsigned int width, unsigned int height, void *data)
497 qp_item_data *qid = NULL;
498 struct _viewer_item *vit = NULL;
501 Evas_Object *viewer = NULL;
503 if (!name || !data) {
504 ERR("name: %p, data: %p", name, data);
514 if (s_info.prov_table) {
515 struct _viewer_item *found;
517 found = g_hash_table_lookup(s_info.prov_table, name);
519 ERR("already have it : %s", name);
523 ERR("s_info.prov_table is NULL");
527 /* elm_plug receives 'server_del' event,
528 * if it repeats connect and disconnect frequently.
531 viewer = _minictrl_create_view(ad, name);
533 ERR("Failed to create view[%s]", name);
537 _viewer_set_size(viewer, ad, width, height);
538 quickpanel_uic_initial_resize(viewer,
539 (height > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
540 ? height : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
542 vit = malloc(sizeof(*vit));
544 ERR("fail to alloc vit");
545 evas_object_del(viewer);
549 if (_minictrl_is_ongoing(name) == 1) {
550 type = QP_ITEM_TYPE_MINICTRL_ONGOING;
552 type = QP_ITEM_TYPE_MINICTRL_MIDDLE;
555 qid = quickpanel_list_util_item_new(type, vit);
557 ERR("fail to alloc vit");
558 evas_object_del(viewer);
563 vit->name = strdup(name);
565 ERR("strdup: %d", errno);
566 quickpanel_list_util_item_del(qid);
567 evas_object_del(viewer);
572 vit->height = height;
573 vit->viewer = viewer;
576 quickpanel_list_util_item_set_tag(vit->viewer, qid);
577 quickpanel_list_util_sort_insert(ad->list, vit->viewer);
578 evas_object_data_set(_get_minictrl_obj(viewer), MINICONTROL_VIEW_DATA, vit);
580 g_hash_table_insert(s_info.prov_table, g_strdup(name), vit);
582 DBG("success to add minicontrol %s", name);
583 quickpanel_minictrl_rotation_report(vit->name, ad->angle);
586 static void _anim_init_resize(void *data)
593 ERR("Invalid parameter");
599 ERR("Invalid target");
603 evas_object_color_set(item, 0, 0, 0, 0);
606 static Eina_Bool _anim_init_cb(void *data)
610 static qp_vi_op_table anim_init_table[] = {
612 .op_type = VI_OP_RESIZE,
613 .handler = _anim_init_resize,
616 .op_type = VI_OP_NONE,
623 ERR("Invalid parameter");
627 for (i = 0; anim_init_table[i].op_type != VI_OP_NONE; i++) {
628 if (anim_init_table[i].op_type != vi->op_type) {
632 anim_init_table[i].handler(vi);
639 static void _reorder_transit_del_cb(void *data, Elm_Transit *transit)
653 ERR("Target is null");
657 ad = quickpanel_get_app_data();
663 _viewer_set_size(item, ad, vi->extra_flag_1, vi->extra_flag_2);
664 quickpanel_uic_initial_resize(item,
665 (vi->extra_flag_2 > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
666 ? vi->extra_flag_2 : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
669 static void _anim_job_resize(void *data)
671 Elm_Transit *transit_layout_parent;
672 struct _viewer_item *viewer_item;
673 Elm_Transit *transit_fadein;
680 ad = quickpanel_get_app_data();
681 if (!ad || !vi || !vi->target || !vi->extra_data_2) {
682 ERR("Invalid parameters: %p %p %p %p", ad, vi, vi ? vi->target : NULL, vi ? vi->extra_data_2 : NULL);
687 to_w = vi->extra_flag_1;
688 to_h = vi->extra_flag_2;
689 viewer_item = vi->extra_data_2;
691 transit_layout_parent = quickpanel_list_util_get_reorder_transit(viewer_item->viewer, NULL, to_h - viewer_item->height);
692 if (transit_layout_parent != NULL) {
693 elm_transit_del_cb_set(transit_layout_parent, _reorder_transit_del_cb, vi);
695 _viewer_set_size(item, ad, to_w, to_h);
696 quickpanel_uic_initial_resize(item,
697 (to_h > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
698 ? to_h : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
701 transit_fadein = elm_transit_add();
702 if (transit_fadein != NULL) {
703 elm_transit_object_add(transit_fadein, item);
704 elm_transit_effect_color_add(transit_fadein, 0, 0, 0, 0, 255, 255, 255, 255);
705 elm_transit_duration_set(transit_fadein, 0.35);
706 elm_transit_tween_mode_set(transit_fadein, quickpanel_vim_get_tweenmode(VI_OP_INSERT));
707 elm_transit_del_cb_set(transit_fadein, quickpanel_vi_done_cb_for_transit, vi);
708 elm_transit_objects_final_state_keep_set(transit_fadein, EINA_TRUE);
710 if (transit_layout_parent != NULL) {
711 elm_transit_chain_transit_add(transit_layout_parent, transit_fadein);
712 elm_transit_go(transit_layout_parent);
714 elm_transit_go(transit_fadein);
717 ERR("Failed to create all the transit");
718 quickpanel_vi_done(vi);
722 static Eina_Bool _anim_job_cb(void *data)
726 static qp_vi_op_table anim_job_table[] = {
728 .op_type = VI_OP_RESIZE,
729 .handler = _anim_job_resize,
732 .op_type = VI_OP_NONE,
739 ERR("Invalid parameter");
743 for (i = 0; anim_job_table[i].op_type != VI_OP_NONE; i++) {
744 if (anim_job_table[i].op_type != vi->op_type) {
748 anim_job_table[i].handler(vi);
755 static void _anim_done_resize(void *data)
758 struct _viewer_item *viewer_item;
764 ERR("Invalid parameter");
768 ad = quickpanel_get_app_data();
776 ERR("Invalid target");
780 viewer_item = vi->extra_data_2;
782 ERR("viewer_item is null");
786 viewer_item->width = vi->extra_flag_1;
787 viewer_item->height = vi->extra_flag_2;
789 _viewer_set_size(item, ad, viewer_item->width, viewer_item->height);
790 quickpanel_uic_initial_resize(item,
791 (viewer_item->height > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
792 ? viewer_item->height : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
793 evas_object_color_set(item, 255, 255, 255, 255);
796 static Eina_Bool _anim_done_cb(void *data)
800 static qp_vi_op_table anim_done_table[] = {
802 .op_type = VI_OP_RESIZE,
803 .handler = _anim_done_resize,
806 .op_type = VI_OP_NONE,
813 ERR("Invalid parameter");
817 for (i = 0; anim_done_table[i].op_type != VI_OP_NONE; i++) {
818 if (anim_done_table[i].op_type != vi->op_type) {
822 anim_done_table[i].handler(vi);
829 static void _minictrl_resize_vi(Evas_Object *list, struct _viewer_item *item, int to_w, int to_h)
833 if (!list || !item) {
834 ERR("Invalid parameter: list: %p, item: %p", list, item);
838 vi = quickpanel_vi_new_with_data(
840 QP_ITEM_TYPE_MINICTRL_MIDDLE,
847 NULL, /* vi == NULL */
853 quickpanel_vi_start(vi);
855 ERR("Unable to create 'vi'");
859 static void _minictrl_update(const char *name, unsigned int width, unsigned int height, void *data)
861 struct appdata *ad = data;
862 struct _viewer_item *found = NULL;
864 if (!s_info.prov_table || !ad) {
865 ERR("name: %s, table: %p, ad: %p", name, s_info.prov_table, ad);
869 found = g_hash_table_lookup(s_info.prov_table, name);
871 WARN("unknown provider name : %s", name);
876 if (found->height != height || found->width != width) {
877 _minictrl_resize_vi(ad->list, found, width, height);
879 _viewer_set_size(found->viewer, ad, width, height);
880 quickpanel_uic_initial_resize(found->viewer,
881 (height > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
882 ? height : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
887 static void _minictrl_lock(const char *name)
889 struct _viewer_item *found;
891 if (!s_info.prov_table) {
892 ERR("table is empty: %s", name);
896 DBG("minictrl_lock %s", name);
897 found = g_hash_table_lookup(s_info.prov_table, name);
899 WARN("unknown provider name : %s", name);
904 struct _viewer_item *vit;
906 vit = evas_object_data_del(_get_minictrl_obj(found->viewer), MINICONTROL_VIEW_DATA);
909 evas_object_data_set(_get_minictrl_obj(found->viewer), MINICONTROL_VIEW_DATA, vit);
916 static void _mctrl_viewer_event_cb(minicontrol_event_e event, const char *name, bundle *event_arg, void *data)
926 if (!data || !name) {
927 ERR("Invalid parameter");
933 if (_viewer_check(name) == 0) {
934 ERR("%s: ignored", name);
938 if ((int)event == MINICONTROL_EVENT_REQUEST_LOCK) {
940 * This event type is extra one. not in the enumeration list.
942 _minictrl_lock(name);
945 case MINICONTROL_EVENT_START:
946 ret = bundle_get_byte(event_arg, MINICONTROL_BUNDLE_KEY_WIDTH, (void **)&width, &bundle_size);
947 if (ret != BUNDLE_ERROR_NONE || bundle_size != sizeof(int)) {
948 ERR("Failed to get bundle value(width) %d : %d", ret, bundle_size);
953 ret = bundle_get_byte(event_arg, MINICONTROL_BUNDLE_KEY_HEIGHT, (void **)&height, &bundle_size);
954 if (ret != BUNDLE_ERROR_NONE || bundle_size != sizeof(int)) {
955 ERR("Failed to get bundle value(height) : %d", ret);
960 DBG("Name: %s, Size: %dx%d", name, *width, *height);
961 _minictrl_add(name, *width, *height, data);
963 case MINICONTROL_EVENT_RESIZE:
964 ret = bundle_get_byte(event_arg, MINICONTROL_BUNDLE_KEY_WIDTH, (void **)&width, &bundle_size);
965 if (ret != BUNDLE_ERROR_NONE || bundle_size != sizeof(int)) {
966 ERR("Failed to get bundle value(width) %d : %d", ret, bundle_size);
971 ret = bundle_get_byte(event_arg, MINICONTROL_BUNDLE_KEY_HEIGHT, (void **)&height, &bundle_size);
972 if (ret != BUNDLE_ERROR_NONE || bundle_size != sizeof(int)) {
973 ERR("Failed to get bundle value(height) : %d", ret);
978 DBG("Name: %s, Size: %dx%d", name, *width, *height);
979 _minictrl_update(name, *width, *height, data);
981 case MINICONTROL_EVENT_STOP:
982 _minictrl_remove(name, data);
984 case MINICONTROL_EVENT_REQUEST_HIDE:
985 quickpanel_uic_close_quickpanel(true, 0);
987 case MINICONTROL_EVENT_REQUEST_ANGLE:
988 if (ad->list != NULL) {
989 SERR("need to broadcasting angle by %s ", name, event);
990 quickpanel_minictrl_rotation_report(name, ad->angle);
999 static int _init(void *data)
1001 minicontrol_error_e ret;
1004 ERR("Invalid parameter");
1008 s_info.prov_table = g_hash_table_new_full(g_str_hash, g_str_equal,
1009 (GDestroyNotify)g_free,
1010 (GDestroyNotify)_viewer_item_free);
1012 ret = minicontrol_viewer_set_event_cb(_mctrl_viewer_event_cb, data);
1013 if (ret != MINICONTROL_ERROR_NONE) {
1014 ERR("fail to minicontrol_viewer_set_event_cb()- %d", ret);
1021 static int _fini(void *data)
1023 minicontrol_error_e ret;
1025 ret = minicontrol_viewer_unset_event_cb();
1027 if (ret != MINICONTROL_ERROR_NONE) {
1028 ERR("fail to minicontrol_viewer_unset_event_cb()- %d", ret);
1031 if (s_info.prov_table) {
1032 g_hash_table_destroy(s_info.prov_table);
1033 s_info.prov_table = NULL;
1039 static int _suspend(void *data)
1045 ERR("Invalid parameter");
1049 if (ad->list != NULL) {
1050 _viewer_unfreeze(ad->scroller);
1056 static int _resume(void *data)
1062 ERR("Invalid parameter");
1066 if (ad->list != NULL) {
1067 _viewer_unfreeze(ad->scroller);
1073 HAPI void quickpanel_minictrl_rotation_report(const char* name, int angle)
1075 bundle *event_arg_bundle;
1078 ERR("Invalid parameter");
1082 SINFO("minicontrol name:%s rotation:%d", name, angle);
1084 if (s_info.prov_table == NULL) {
1088 if (g_hash_table_size(s_info.prov_table) <= 0) {
1092 event_arg_bundle = bundle_create();
1093 if (event_arg_bundle) {
1094 char bundle_value_buffer[BUNDLE_BUFFER_LENGTH] = { 0, };
1096 snprintf(bundle_value_buffer, sizeof(bundle_value_buffer) - 1, "%d", angle);
1097 bundle_add_str(event_arg_bundle, "angle", bundle_value_buffer);
1098 minicontrol_viewer_send_event(name, MINICONTROL_EVENT_REPORT_ANGLE, event_arg_bundle);
1099 bundle_free(event_arg_bundle);
1104 static void _minictrl_send_view_event_cb(gpointer key, gpointer value, gpointer user_data)
1111 bundle *event_arg_bundle;
1113 event_arg_bundle = bundle_create();
1114 if (event_arg_bundle) {
1115 minicontrol_viewer_event_e event;
1117 event = (minicontrol_viewer_event_e)user_data;
1118 minicontrol_viewer_send_event(key, event, event_arg_bundle);
1119 bundle_free(event_arg_bundle);
1123 static void _minictrl_opened(void *data)
1126 g_hash_table_foreach(s_info.prov_table, _minictrl_send_view_event_cb, (gpointer)MINICONTROL_VIEWER_EVENT_SHOW);
1129 static void _minictrl_closed(void *data)
1132 g_hash_table_foreach(s_info.prov_table, _minictrl_send_view_event_cb, (gpointer)MINICONTROL_VIEWER_EVENT_HIDE);
1135 QP_Module minictrl = {
1139 .suspend = _suspend,
1143 .lang_changed = NULL,
1146 .qp_opened = _minictrl_opened,
1147 .qp_closed = _minictrl_closed,