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 void _minictrl_sendview_rotation_event(const char* name, int angle);
93 static int _viewer_check(const char *name)
95 char *pos_start = NULL;
102 if ((pos_start = strstr(name, MINICONTROL_TYPE_STR_VIEWER)) != NULL) {
103 if (strstr(pos_start, MINICONTROL_TYPE_STR_QUICKPANEL) != NULL) {
108 } else if (strstr(name, MINICONTROL_TYPE_STR_LOCKSCREEN) != NULL) {
115 static void _viewer_unfreeze(Evas_Object *viewer)
117 int i = 0, freezed_count = 0;
120 ERR("Invalid parameter");
124 freezed_count = elm_object_scroll_freeze_get(viewer);
126 for (i = 0 ; i < freezed_count; i++) {
127 elm_object_scroll_freeze_pop(viewer);
131 static Evas_Object *_get_minictrl_obj(Evas_Object *layout)
134 ERR("Invalid parameter");
138 return elm_object_part_content_get(layout, "elm.icon");
141 static void _viewer_set_size(Evas_Object *layout, void *data, int width, int height)
149 if (!layout || !data || width < 0 || height < 0) {
150 ERR("Invalid parameters (%p, %p, %d, %d)", layout, data, width, height);
154 viewer = _get_minictrl_obj(layout);
156 ERR("Unable to get the 'viewer'");
162 if (ad->angle == 0 || ad->angle == 180) {
168 if (width > ad->win_width) {
169 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);
172 max_width = is_landscape ? ad->win_height : ad->win_width;
173 resized_width = (width > max_width) ? max_width : width;
175 SERR("minicontroller view is resized to w:%d/%d(%d) h:%d Landscape[%d]", resized_width, max_width, width, height, is_landscape);
177 evas_object_size_hint_min_set(viewer, resized_width, height);
178 evas_object_size_hint_max_set(viewer, resized_width, height);
181 static void _viewer_item_free(struct _viewer_item *item)
185 ad = quickpanel_get_app_data();
186 if (!ad || !ad->list || !item) {
187 ERR("Invalid paramter %p, %p, %p", ad, ad ? ad->list : NULL, item);
194 quickpanel_list_util_item_unpack_by_object(ad->list, item->viewer, 0, 0);
195 quickpanel_list_util_item_del_tag(item->viewer);
196 evas_object_del(item->viewer);
202 static bool _check_deletable(Evas_Object *obj)
204 struct _viewer_item *vit;
206 vit = evas_object_data_get(obj, MINICONTROL_VIEW_DATA);
208 return vit->deletable;
214 static void _mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
216 Evas_Event_Mouse_Down *ev;
217 struct _viewer_item *vit;
219 vit = evas_object_data_get(obj, MINICONTROL_VIEW_DATA);
220 ev = (Evas_Event_Mouse_Down *)event_info;
223 ERR("ev %p, vit %p");
227 evas_object_geometry_get(obj, NULL, NULL, &vit->obj_w, &vit->obj_h);
229 vit->press_x = ev->canvas.x;
230 vit->press_y = ev->canvas.y;
231 vit->state = STATE_NORMAL;
233 SDBG("mouse down:%d %d %d", vit->obj_w, vit->obj_h, vit->state);
235 if (vit->vi != NULL) {
236 quickpanel_vi_user_event_del(vit->vi);
240 vit->need_to_cancel_press = 0;
243 static void _mouse_move_cb(void* data, Evas* e, Evas_Object* obj, void* event_info)
245 static int vi_start_x = 0;
246 static int delta_prev = -1;
252 Evas_Event_Mouse_Move* ev;
253 struct _viewer_item *vit;
258 vit = evas_object_data_get(obj, MINICONTROL_VIEW_DATA);
259 if (!ev || !vit || !ad) {
260 ERR("ev: %p, vit: %p, ad: %p", ev, vit, ad);
264 if (vit->state == STATE_GESTURE_CANCELED) {
265 DBG("deletion has been canceled");
269 if (!_check_deletable(obj)) {
270 DBG("vit->deletable is false");
274 evas_object_geometry_get(obj, &x, &y, &w, &h);
275 delta_x = (ev->cur.output.x - vit->press_x) / 2;
277 switch (vit->state) {
279 if (abs(delta_x) >= THRESHOLD_DELETE_START) {
282 DBG("start a deletion");
283 vit->state = STATE_GESTURE_WAIT;
285 vi_start_x = delta_x;
287 vi = quickpanel_vi_new_with_data(
295 NULL, /* _drag_cancel_cb, */
296 NULL, /* vi == null */
303 quickpanel_vi_user_event_add(vi);
305 ERR("Unable to create a 'vi'");
308 vit->need_to_cancel_press = 1;
311 case STATE_GESTURE_WAIT:
312 if (delta_prev != delta_x) {
315 map = evas_map_new(4);
317 evas_map_util_points_populate_from_object(map, obj);
318 evas_map_util_points_populate_from_geometry(map, x + delta_x - vi_start_x, y, w, h, 0);
319 evas_object_map_enable_set(obj, EINA_TRUE);
320 evas_object_map_set(obj, map);
322 _viewer_unfreeze(ad->scroller);
324 delta_prev = delta_x;
331 vit->distance = delta_x;
334 static void _minictrl_remove(const char *name, void *data)
336 DBG("_minictrl_remove [%s]", name);
338 minicontrol_viewer_send_event(name, MINICONTROL_EVENT_REQUEST_HIDE, NULL);
340 if (s_info.prov_table) {
341 if (g_hash_table_remove(s_info.prov_table, name)) {
342 DBG("success to remove %s", name);
347 * Oh, this function doesn't handles "data".
348 * Why does this has to check its existence??
353 WARN("unknown provider name : %s", name);
358 static void _mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
360 struct _viewer_item *vit;
365 vit = evas_object_data_get(obj, MINICONTROL_VIEW_DATA);
367 ERR("vit: %p, ad: %p", vit, ad);
371 _viewer_unfreeze(ad->scroller);
373 if (!_check_deletable(obj)) {
374 swipe_distance = THRESHOLD_DISTANCE_LOCK;
376 swipe_distance = THRESHOLD_DISTANCE;
379 switch (vit->state) {
380 case STATE_GESTURE_WAIT:
381 if (abs(vit->distance) >= (swipe_distance - 10)) {
382 Elm_Transit *transit_flick;
385 x = abs(vit->distance) - THRESHOLD_DELETE_START;
387 if (vit->distance > 0) {
388 evas_object_map_set(obj, NULL);
389 transit_flick = elm_transit_add();
390 if (transit_flick != NULL) {
391 elm_transit_effect_translation_add(transit_flick, x, 0, 480, 0);
392 elm_transit_object_add(transit_flick, obj);
393 elm_transit_duration_set(transit_flick, 0.25 * (480 - x ) / 480);
394 elm_transit_tween_mode_set(transit_flick, ELM_TRANSIT_TWEEN_MODE_LINEAR);
395 elm_transit_objects_final_state_keep_set(transit_flick, EINA_TRUE);
396 elm_transit_go(transit_flick);
397 _minictrl_remove(vit->name, vit->data);
399 } else if (vit->distance < 0) {
400 evas_object_map_set(obj, NULL);
401 transit_flick = elm_transit_add();
402 if (transit_flick != NULL) {
403 elm_transit_effect_translation_add(transit_flick, -x, 0, -480, 0);
404 elm_transit_object_add(transit_flick, obj);
405 elm_transit_duration_set(transit_flick, 0.25 * ( 480 - x ) / 480);
406 elm_transit_tween_mode_set(transit_flick, ELM_TRANSIT_TWEEN_MODE_LINEAR);
407 elm_transit_objects_final_state_keep_set(transit_flick, EINA_TRUE);
408 elm_transit_go(transit_flick);
409 _minictrl_remove(vit->name, vit->data);
413 evas_object_map_enable_set(obj, EINA_FALSE);
416 if (vit->vi != NULL) {
417 quickpanel_vi_user_event_del(vit->vi);
421 case STATE_GESTURE_CANCELED:
422 evas_object_map_enable_set(obj, EINA_FALSE);
424 if (vit->vi != NULL) {
425 quickpanel_vi_user_event_del(vit->vi);
433 vit->state = STATE_NORMAL;
436 static Evas_Object *_minictrl_create_view(struct appdata *ad, const char *name)
442 if (!ad || !ad->list || !name) {
443 ERR("Invalid parameters: %p %p %p", ad, ad ? ad->list : NULL, name);
447 layout = elm_layout_add(ad->list);
449 ERR("Unable to create a layout");
453 elm_layout_file_set(layout, DEFAULT_EDJ, "quickpanel/minictrl/default");
454 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
455 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
456 evas_object_show(layout);
458 viewer = minicontrol_viewer_add(layout, name);
460 ERR("fail to add viewer - %s", name);
461 evas_object_del(layout);
464 elm_object_focus_allow_set(viewer, EINA_TRUE);
465 elm_object_part_content_set(layout, "elm.icon", viewer);
467 evas_object_event_callback_add(viewer, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, ad);
468 evas_object_event_callback_add(viewer, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, ad);
469 evas_object_event_callback_add(viewer, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, ad);
471 focus = quickpanel_accessibility_ui_get_focus_object(layout);
472 elm_object_part_content_set(layout, "focus", focus);
473 #ifdef QP_SCREENREADER_ENABLE
475 ao = quickpanel_accessibility_screen_reader_object_get(layout, SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", layout);
477 elm_access_info_cb_set(ao, ELM_ACCESS_TYPE, quickpanel_accessibility_info_cb, _NOT_LOCALIZED("Mini controller"));
484 static int _minictrl_is_ongoing(const char *str)
490 if (strstr(str, MINICONTROL_TYPE_STR_ONGOING) != NULL) {
497 static void _minictrl_add(const char *name, unsigned int width, unsigned int height, void *data)
499 qp_item_data *qid = NULL;
500 struct _viewer_item *vit = NULL;
503 Evas_Object *viewer = NULL;
505 if (!name || !data) {
506 ERR("name: %p, data: %p", name, data);
516 if (s_info.prov_table) {
517 struct _viewer_item *found;
519 found = g_hash_table_lookup(s_info.prov_table, name);
521 ERR("already have it : %s", name);
525 ERR("s_info.prov_table is NULL");
529 /* elm_plug receives 'server_del' event,
530 * if it repeats connect and disconnect frequently.
533 viewer = _minictrl_create_view(ad, name);
535 ERR("Failed to create view[%s]", name);
539 _viewer_set_size(viewer, ad, width, height);
540 quickpanel_uic_initial_resize(viewer,
541 (height > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
542 ? height : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
544 vit = malloc(sizeof(*vit));
546 ERR("fail to alloc vit");
547 evas_object_del(viewer);
551 if (_minictrl_is_ongoing(name) == 1) {
552 type = QP_ITEM_TYPE_MINICTRL_ONGOING;
554 type = QP_ITEM_TYPE_MINICTRL_MIDDLE;
557 qid = quickpanel_list_util_item_new(type, vit);
559 ERR("fail to alloc vit");
560 evas_object_del(viewer);
565 vit->name = strdup(name);
567 ERR("strdup: %d", errno);
568 quickpanel_list_util_item_del(qid);
569 evas_object_del(viewer);
574 vit->height = height;
575 vit->viewer = viewer;
578 quickpanel_list_util_item_set_tag(vit->viewer, qid);
579 quickpanel_list_util_sort_insert(ad->list, vit->viewer);
580 evas_object_data_set(_get_minictrl_obj(viewer), MINICONTROL_VIEW_DATA, vit);
582 g_hash_table_insert(s_info.prov_table, g_strdup(name), vit);
584 DBG("success to add minicontrol %s", name);
585 _minictrl_sendview_rotation_event(vit->name, ad->angle);
588 static void _anim_init_resize(void *data)
595 ERR("Invalid parameter");
601 ERR("Invalid target");
605 evas_object_color_set(item, 0, 0, 0, 0);
608 static Eina_Bool _anim_init_cb(void *data)
612 static qp_vi_op_table anim_init_table[] = {
614 .op_type = VI_OP_RESIZE,
615 .handler = _anim_init_resize,
618 .op_type = VI_OP_NONE,
625 ERR("Invalid parameter");
629 for (i = 0; anim_init_table[i].op_type != VI_OP_NONE; i++) {
630 if (anim_init_table[i].op_type != vi->op_type) {
634 anim_init_table[i].handler(vi);
641 static void _reorder_transit_del_cb(void *data, Elm_Transit *transit)
655 ERR("Target is null");
659 ad = quickpanel_get_app_data();
665 _viewer_set_size(item, ad, vi->extra_flag_1, vi->extra_flag_2);
666 quickpanel_uic_initial_resize(item,
667 (vi->extra_flag_2 > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
668 ? vi->extra_flag_2 : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
671 static void _anim_job_resize(void *data)
673 Elm_Transit *transit_layout_parent;
674 struct _viewer_item *viewer_item;
675 Elm_Transit *transit_fadein;
682 ad = quickpanel_get_app_data();
683 if (!ad || !vi || !vi->target || !vi->extra_data_2) {
684 ERR("Invalid parameters: %p %p %p %p", ad, vi, vi ? vi->target : NULL, vi ? vi->extra_data_2 : NULL);
689 to_w = vi->extra_flag_1;
690 to_h = vi->extra_flag_2;
691 viewer_item = vi->extra_data_2;
693 transit_layout_parent = quickpanel_list_util_get_reorder_transit(viewer_item->viewer, NULL, to_h - viewer_item->height);
694 if (transit_layout_parent != NULL) {
695 elm_transit_del_cb_set(transit_layout_parent, _reorder_transit_del_cb, vi);
697 _viewer_set_size(item, ad, to_w, to_h);
698 quickpanel_uic_initial_resize(item,
699 (to_h > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
700 ? to_h : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
703 transit_fadein = elm_transit_add();
704 if (transit_fadein != NULL) {
705 elm_transit_object_add(transit_fadein, item);
706 elm_transit_effect_color_add(transit_fadein, 0, 0, 0, 0, 255, 255, 255, 255);
707 elm_transit_duration_set(transit_fadein, 0.35);
708 elm_transit_tween_mode_set(transit_fadein, quickpanel_vim_get_tweenmode(VI_OP_INSERT));
709 elm_transit_del_cb_set(transit_fadein, quickpanel_vi_done_cb_for_transit, vi);
710 elm_transit_objects_final_state_keep_set(transit_fadein, EINA_TRUE);
712 if (transit_layout_parent != NULL) {
713 elm_transit_chain_transit_add(transit_layout_parent, transit_fadein);
714 elm_transit_go(transit_layout_parent);
716 elm_transit_go(transit_fadein);
719 ERR("Failed to create all the transit");
720 quickpanel_vi_done(vi);
724 static Eina_Bool _anim_job_cb(void *data)
728 static qp_vi_op_table anim_job_table[] = {
730 .op_type = VI_OP_RESIZE,
731 .handler = _anim_job_resize,
734 .op_type = VI_OP_NONE,
741 ERR("Invalid parameter");
745 for (i = 0; anim_job_table[i].op_type != VI_OP_NONE; i++) {
746 if (anim_job_table[i].op_type != vi->op_type) {
750 anim_job_table[i].handler(vi);
757 static void _anim_done_resize(void *data)
760 struct _viewer_item *viewer_item;
766 ERR("Invalid parameter");
770 ad = quickpanel_get_app_data();
778 ERR("Invalid target");
782 viewer_item = vi->extra_data_2;
784 ERR("viewer_item is null");
788 viewer_item->width = vi->extra_flag_1;
789 viewer_item->height = vi->extra_flag_2;
791 _viewer_set_size(item, ad, viewer_item->width, viewer_item->height);
792 quickpanel_uic_initial_resize(item,
793 (viewer_item->height > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
794 ? viewer_item->height : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
795 evas_object_color_set(item, 255, 255, 255, 255);
798 static Eina_Bool _anim_done_cb(void *data)
802 static qp_vi_op_table anim_done_table[] = {
804 .op_type = VI_OP_RESIZE,
805 .handler = _anim_done_resize,
808 .op_type = VI_OP_NONE,
815 ERR("Invalid parameter");
819 for (i = 0; anim_done_table[i].op_type != VI_OP_NONE; i++) {
820 if (anim_done_table[i].op_type != vi->op_type) {
824 anim_done_table[i].handler(vi);
831 static void _minictrl_resize_vi(Evas_Object *list, struct _viewer_item *item, int to_w, int to_h)
835 if (!list || !item) {
836 ERR("Invalid parameter: list: %p, item: %p", list, item);
840 vi = quickpanel_vi_new_with_data(
842 QP_ITEM_TYPE_MINICTRL_MIDDLE,
849 NULL, /* vi == NULL */
855 quickpanel_vi_start(vi);
857 ERR("Unable to create 'vi'");
861 static void _minictrl_update(const char *name, unsigned int width, unsigned int height, void *data)
863 struct appdata *ad = data;
864 struct _viewer_item *found = NULL;
866 if (!s_info.prov_table || !ad) {
867 ERR("name: %s, table: %p, ad: %p", name, s_info.prov_table, ad);
871 found = g_hash_table_lookup(s_info.prov_table, name);
873 WARN("unknown provider name : %s", name);
878 if (found->height != height || found->width != width) {
879 _minictrl_resize_vi(ad->list, found, width, height);
881 _viewer_set_size(found->viewer, ad, width, height);
882 quickpanel_uic_initial_resize(found->viewer,
883 (height > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
884 ? height : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
889 static void _minictrl_lock(const char *name)
891 struct _viewer_item *found;
893 if (!s_info.prov_table) {
894 ERR("table is empty: %s", name);
898 DBG("minictrl_lock %s", name);
899 found = g_hash_table_lookup(s_info.prov_table, name);
901 WARN("unknown provider name : %s", name);
906 struct _viewer_item *vit;
908 vit = evas_object_data_del(_get_minictrl_obj(found->viewer), MINICONTROL_VIEW_DATA);
911 evas_object_data_set(_get_minictrl_obj(found->viewer), MINICONTROL_VIEW_DATA, vit);
918 static void _mctrl_viewer_event_cb(minicontrol_event_e event, const char *name, bundle *event_arg, void *data)
928 if (!data || !name) {
929 ERR("Invalid parameter");
935 if (_viewer_check(name) == 0) {
936 ERR("%s: ignored", name);
940 if ((int)event == MINICONTROL_EVENT_REQUEST_LOCK) {
942 * This event type is extra one. not in the enumeration list.
944 _minictrl_lock(name);
947 case MINICONTROL_EVENT_START:
948 ret = bundle_get_byte(event_arg, MINICONTROL_BUNDLE_KEY_WIDTH, (void **)&width, &bundle_size);
949 if (ret != BUNDLE_ERROR_NONE || bundle_size != sizeof(int)) {
950 ERR("Failed to get bundle value(width) %d : %d", ret, bundle_size);
955 ret = bundle_get_byte(event_arg, MINICONTROL_BUNDLE_KEY_HEIGHT, (void **)&height, &bundle_size);
956 if (ret != BUNDLE_ERROR_NONE || bundle_size != sizeof(int)) {
957 ERR("Failed to get bundle value(height) : %d", ret);
962 DBG("Name: %s, Size: %dx%d", name, *width, *height);
963 _minictrl_add(name, *width, *height, data);
965 case MINICONTROL_EVENT_RESIZE:
966 ret = bundle_get_byte(event_arg, MINICONTROL_BUNDLE_KEY_WIDTH, (void **)&width, &bundle_size);
967 if (ret != BUNDLE_ERROR_NONE || bundle_size != sizeof(int)) {
968 ERR("Failed to get bundle value(width) %d : %d", ret, bundle_size);
973 ret = bundle_get_byte(event_arg, MINICONTROL_BUNDLE_KEY_HEIGHT, (void **)&height, &bundle_size);
974 if (ret != BUNDLE_ERROR_NONE || bundle_size != sizeof(int)) {
975 ERR("Failed to get bundle value(height) : %d", ret);
980 DBG("Name: %s, Size: %dx%d", name, *width, *height);
981 _minictrl_update(name, *width, *height, data);
983 case MINICONTROL_EVENT_STOP:
984 _minictrl_remove(name, data);
986 case MINICONTROL_EVENT_REQUEST_HIDE:
987 quickpanel_uic_close_quickpanel(true, 0);
989 case MINICONTROL_EVENT_REQUEST_ANGLE:
990 if (ad->list != NULL) {
991 SERR("need to broadcasting angle by %s ", name, event);
992 _minictrl_sendview_rotation_event(name, ad->angle);
1001 static int _init(void *data)
1003 minicontrol_error_e ret;
1006 ERR("Invalid parameter");
1010 s_info.prov_table = g_hash_table_new_full(g_str_hash, g_str_equal,
1011 (GDestroyNotify)g_free,
1012 (GDestroyNotify)_viewer_item_free);
1014 ret = minicontrol_viewer_set_event_cb(_mctrl_viewer_event_cb, data);
1015 if (ret != MINICONTROL_ERROR_NONE) {
1016 ERR("fail to minicontrol_viewer_set_event_cb()- %d", ret);
1023 static int _fini(void *data)
1025 minicontrol_error_e ret;
1027 ret = minicontrol_viewer_unset_event_cb();
1029 if (ret != MINICONTROL_ERROR_NONE) {
1030 ERR("fail to minicontrol_viewer_unset_event_cb()- %d", ret);
1033 if (s_info.prov_table) {
1034 g_hash_table_destroy(s_info.prov_table);
1035 s_info.prov_table = NULL;
1041 static int _suspend(void *data)
1047 ERR("Invalid parameter");
1051 if (ad->list != NULL) {
1052 _viewer_unfreeze(ad->scroller);
1058 static int _resume(void *data)
1064 ERR("Invalid parameter");
1068 if (ad->list != NULL) {
1069 _viewer_unfreeze(ad->scroller);
1075 HAPI void quickpanel_minictrl_rotation_report(int angle)
1077 bundle *event_arg_bundle;
1079 if (s_info.prov_table == NULL) {
1083 if (g_hash_table_size(s_info.prov_table) <= 0) {
1087 GHashTableIter iter;
1088 gpointer key, value;
1090 g_hash_table_iter_init (&iter, s_info.prov_table);
1091 while (g_hash_table_iter_next (&iter, &key, &value))
1093 SINFO("minicontrol name:%s rotation:%d", key, angle);
1094 event_arg_bundle = bundle_create();
1095 if (event_arg_bundle) {
1096 char bundle_value_buffer[BUNDLE_BUFFER_LENGTH] = { 0, };
1097 snprintf(bundle_value_buffer, sizeof(bundle_value_buffer) - 1, "%d", angle);
1098 bundle_add_str(event_arg_bundle, "angle", bundle_value_buffer);
1099 minicontrol_viewer_send_event(key, MINICONTROL_EVENT_REPORT_ANGLE, event_arg_bundle);
1100 bundle_free(event_arg_bundle);
1105 void _minictrl_sendview_rotation_event(const char* name, int angle)
1107 bundle *event_arg_bundle;
1110 ERR("Invalid parameter");
1114 if (s_info.prov_table == NULL) {
1118 if (g_hash_table_size(s_info.prov_table) <= 0) {
1122 SINFO("minicontrol name:%s rotation:%d", name, angle);
1123 event_arg_bundle = bundle_create();
1124 if (event_arg_bundle) {
1125 char bundle_value_buffer[BUNDLE_BUFFER_LENGTH] = { 0, };
1127 snprintf(bundle_value_buffer, sizeof(bundle_value_buffer) - 1, "%d", angle);
1128 bundle_add_str(event_arg_bundle, "angle", bundle_value_buffer);
1129 minicontrol_viewer_send_event(name, MINICONTROL_EVENT_REPORT_ANGLE, event_arg_bundle);
1130 bundle_free(event_arg_bundle);
1134 static void _minictrl_send_view_event_cb(gpointer key, gpointer value, gpointer user_data)
1141 bundle *event_arg_bundle;
1143 event_arg_bundle = bundle_create();
1144 if (event_arg_bundle) {
1145 minicontrol_viewer_event_e event;
1147 event = (minicontrol_viewer_event_e)user_data;
1148 minicontrol_viewer_send_event(key, event, event_arg_bundle);
1149 bundle_free(event_arg_bundle);
1153 static void _minictrl_opened(void *data)
1156 g_hash_table_foreach(s_info.prov_table, _minictrl_send_view_event_cb, (gpointer)MINICONTROL_VIEWER_EVENT_SHOW);
1159 static void _minictrl_closed(void *data)
1162 g_hash_table_foreach(s_info.prov_table, _minictrl_send_view_event_cb, (gpointer)MINICONTROL_VIEWER_EVENT_HIDE);
1165 QP_Module minictrl = {
1169 .suspend = _suspend,
1173 .lang_changed = NULL,
1176 .qp_opened = _minictrl_opened,
1177 .qp_closed = _minictrl_closed,