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>
32 #include "common_uic.h"
33 #include "quickpanel-ui.h"
34 #include "quickpanel_def.h"
35 #include "list_util.h"
36 #include "quickpanel_debug_util.h"
38 #include "vi_manager.h"
40 #ifdef QP_SCREENREADER_ENABLE
41 #include "accessibility.h"
44 #define MINICONTROL_TYPE_STR_VIEWER "::[viewer="
45 #define MINICONTROL_TYPE_STR_QUICKPANEL "QUICKPANEL"
46 #define MINICONTROL_TYPE_STR_LOCKSCREEN "LOCKSCREEN"
47 #define MINICONTROL_TYPE_STR_ONGOING "_ongoing]"
48 #define MINICONTROL_VIEW_DATA "MINICONTROL_VIEW_DATA"
50 #define THRESHOLD_DELETE_START 30
51 #define THRESHOLD_DELETE_START_Y_LIMIT 60
52 #define THRESHOLD_DISTANCE (200)
53 #define THRESHOLD_DISTANCE_LOCK (500)
55 #define MINICONTROL_BUNDLE_KEY_WIDTH "width"
56 #define MINICONTROL_BUNDLE_KEY_HEIGHT "height"
58 #define BUNDLE_BUFFER_LENGTH 100
60 typedef enum _gesture_state_type {
63 STATE_GESTURE_CANCELED,
81 int need_to_cancel_press;
82 gesture_state_type state;
87 GHashTable *prov_table;
92 void _minictrl_sendview_rotation_event(const char* name, int angle);
94 static int _viewer_check(const char *name)
96 char *pos_start = NULL;
103 if ((pos_start = strstr(name, MINICONTROL_TYPE_STR_VIEWER)) != NULL) {
104 if (strstr(pos_start, MINICONTROL_TYPE_STR_QUICKPANEL) != NULL) {
109 } else if (strstr(name, MINICONTROL_TYPE_STR_LOCKSCREEN) != NULL) {
116 static void _viewer_unfreeze(Evas_Object *viewer)
118 int i = 0, freezed_count = 0;
121 ERR("Invalid parameter");
125 freezed_count = elm_object_scroll_freeze_get(viewer);
127 for (i = 0 ; i < freezed_count; i++) {
128 elm_object_scroll_freeze_pop(viewer);
132 static Evas_Object *_get_minictrl_obj(Evas_Object *layout)
135 ERR("Invalid parameter");
139 return elm_object_part_content_get(layout, "elm.icon");
142 static void _viewer_set_size(Evas_Object *layout, void *data, int width, int height)
150 if (!layout || !data || width < 0 || height < 0) {
151 ERR("Invalid parameters (%p, %p, %d, %d)", layout, data, width, height);
155 viewer = _get_minictrl_obj(layout);
157 ERR("Unable to get the 'viewer'");
163 if (ad->angle == 0 || ad->angle == 180) {
169 if (width > ad->win_width) {
170 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);
173 max_width = is_landscape ? ad->win_height : ad->win_width;
174 resized_width = (width > max_width) ? max_width : width;
176 SERR("minicontroller view is resized to w:%d/%d(%d) h:%d Landscape[%d]", resized_width, max_width, width, height, is_landscape);
178 evas_object_size_hint_min_set(viewer, resized_width, height);
179 evas_object_size_hint_max_set(viewer, resized_width, height);
182 static void _viewer_item_free(struct _viewer_item *item)
186 ad = quickpanel_get_app_data();
187 if (!ad || !ad->list || !item) {
188 ERR("Invalid paramter %p, %p, %p", ad, ad ? ad->list : NULL, item);
195 quickpanel_list_util_item_unpack_by_object(ad->list, item->viewer, 0, 0);
196 quickpanel_list_util_item_del_tag(item->viewer);
197 evas_object_del(item->viewer);
203 static bool _check_deletable(Evas_Object *obj)
205 struct _viewer_item *vit;
207 vit = evas_object_data_get(obj, MINICONTROL_VIEW_DATA);
209 return vit->deletable;
215 static void _mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
217 Evas_Event_Mouse_Down *ev;
218 struct _viewer_item *vit;
220 vit = evas_object_data_get(obj, MINICONTROL_VIEW_DATA);
221 ev = (Evas_Event_Mouse_Down *)event_info;
224 ERR("ev %p, vit %p");
228 evas_object_geometry_get(obj, NULL, NULL, &vit->obj_w, &vit->obj_h);
230 vit->press_x = ev->canvas.x;
231 vit->press_y = ev->canvas.y;
232 vit->state = STATE_NORMAL;
234 SDBG("mouse down:%d %d %d", vit->obj_w, vit->obj_h, vit->state);
236 if (vit->vi != NULL) {
237 quickpanel_vi_user_event_del(vit->vi);
241 vit->need_to_cancel_press = 0;
244 static void _mouse_move_cb(void* data, Evas* e, Evas_Object* obj, void* event_info)
246 static int vi_start_x = 0;
247 static int delta_prev = -1;
253 Evas_Event_Mouse_Move* ev;
254 struct _viewer_item *vit;
259 vit = evas_object_data_get(obj, MINICONTROL_VIEW_DATA);
260 if (!ev || !vit || !ad) {
261 ERR("ev: %p, vit: %p, ad: %p", ev, vit, ad);
265 if (vit->state == STATE_GESTURE_CANCELED) {
266 DBG("deletion has been canceled");
270 if (!_check_deletable(obj)) {
271 DBG("vit->deletable is false");
275 evas_object_geometry_get(obj, &x, &y, &w, &h);
276 delta_x = (ev->cur.output.x - vit->press_x) / 2;
278 switch (vit->state) {
280 if (abs(delta_x) >= THRESHOLD_DELETE_START) {
283 DBG("start a deletion");
284 vit->state = STATE_GESTURE_WAIT;
286 vi_start_x = delta_x;
288 vi = quickpanel_vi_new_with_data(
296 NULL, /* _drag_cancel_cb, */
297 NULL, /* vi == null */
304 quickpanel_vi_user_event_add(vi);
306 ERR("Unable to create a 'vi'");
309 vit->need_to_cancel_press = 1;
312 case STATE_GESTURE_WAIT:
313 if (delta_prev != delta_x) {
316 map = evas_map_new(4);
318 evas_map_util_points_populate_from_object(map, obj);
319 evas_map_util_points_populate_from_geometry(map, x + delta_x - vi_start_x, y, w, h, 0);
320 evas_object_map_enable_set(obj, EINA_TRUE);
321 evas_object_map_set(obj, map);
323 _viewer_unfreeze(ad->scroller);
325 delta_prev = delta_x;
332 vit->distance = delta_x;
335 static void _minictrl_remove(const char *name, void *data)
337 DBG("_minictrl_remove [%s]", name);
339 minicontrol_viewer_send_event(name, MINICONTROL_EVENT_REQUEST_HIDE, NULL);
341 if (s_info.prov_table) {
342 if (g_hash_table_remove(s_info.prov_table, name)) {
343 DBG("success to remove %s", name);
348 * Oh, this function doesn't handles "data".
349 * Why does this has to check its existence??
354 WARN("unknown provider name : %s", name);
359 static void _mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
361 struct _viewer_item *vit;
366 vit = evas_object_data_get(obj, MINICONTROL_VIEW_DATA);
368 ERR("vit: %p, ad: %p", vit, ad);
372 _viewer_unfreeze(ad->scroller);
374 if (!_check_deletable(obj)) {
375 swipe_distance = THRESHOLD_DISTANCE_LOCK;
377 swipe_distance = THRESHOLD_DISTANCE;
380 switch (vit->state) {
381 case STATE_GESTURE_WAIT:
382 if (abs(vit->distance) >= (swipe_distance - 10)) {
383 Elm_Transit *transit_flick;
386 x = abs(vit->distance) - THRESHOLD_DELETE_START;
388 if (vit->distance > 0) {
389 evas_object_map_set(obj, NULL);
390 transit_flick = elm_transit_add();
391 if (transit_flick != NULL) {
392 elm_transit_effect_translation_add(transit_flick, x, 0, 480, 0);
393 elm_transit_object_add(transit_flick, obj);
394 elm_transit_duration_set(transit_flick, 0.25 * (480 - x ) / 480);
395 elm_transit_tween_mode_set(transit_flick, ELM_TRANSIT_TWEEN_MODE_LINEAR);
396 elm_transit_objects_final_state_keep_set(transit_flick, EINA_TRUE);
397 elm_transit_go(transit_flick);
398 _minictrl_remove(vit->name, vit->data);
400 } else if (vit->distance < 0) {
401 evas_object_map_set(obj, NULL);
402 transit_flick = elm_transit_add();
403 if (transit_flick != NULL) {
404 elm_transit_effect_translation_add(transit_flick, -x, 0, -480, 0);
405 elm_transit_object_add(transit_flick, obj);
406 elm_transit_duration_set(transit_flick, 0.25 * ( 480 - x ) / 480);
407 elm_transit_tween_mode_set(transit_flick, ELM_TRANSIT_TWEEN_MODE_LINEAR);
408 elm_transit_objects_final_state_keep_set(transit_flick, EINA_TRUE);
409 elm_transit_go(transit_flick);
410 _minictrl_remove(vit->name, vit->data);
414 evas_object_map_enable_set(obj, EINA_FALSE);
417 if (vit->vi != NULL) {
418 quickpanel_vi_user_event_del(vit->vi);
422 case STATE_GESTURE_CANCELED:
423 evas_object_map_enable_set(obj, EINA_FALSE);
425 if (vit->vi != NULL) {
426 quickpanel_vi_user_event_del(vit->vi);
434 vit->state = STATE_NORMAL;
437 static Evas_Object *_minictrl_create_view(struct appdata *ad, const char *name)
443 if (!ad || !ad->list || !name) {
444 ERR("Invalid parameters: %p %p %p", ad, ad ? ad->list : NULL, name);
448 layout = elm_layout_add(ad->list);
450 ERR("Unable to create a layout");
454 elm_layout_file_set(layout, DEFAULT_EDJ, "quickpanel/minictrl/default");
455 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
456 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
457 evas_object_show(layout);
459 viewer = minicontrol_viewer_add(layout, name);
461 ERR("fail to add viewer - %s", name);
462 evas_object_del(layout);
465 elm_object_focus_allow_set(viewer, EINA_TRUE);
466 elm_object_part_content_set(layout, "elm.icon", viewer);
468 evas_object_event_callback_add(viewer, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, ad);
469 evas_object_event_callback_add(viewer, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, ad);
470 evas_object_event_callback_add(viewer, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, ad);
472 focus = quickpanel_accessibility_ui_get_focus_object(layout);
473 elm_object_part_content_set(layout, "focus", focus);
474 #ifdef QP_SCREENREADER_ENABLE
476 ao = quickpanel_accessibility_screen_reader_object_get(layout, SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", layout);
478 elm_access_info_cb_set(ao, ELM_ACCESS_TYPE, quickpanel_accessibility_info_cb, _NOT_LOCALIZED("Mini controller"));
485 static int _minictrl_is_ongoing(const char *str)
491 if (strstr(str, MINICONTROL_TYPE_STR_ONGOING) != NULL) {
498 static void _minictrl_add(const char *name, unsigned int width, unsigned int height, void *data)
500 qp_item_data *qid = NULL;
501 struct _viewer_item *vit = NULL;
504 Evas_Object *viewer = NULL;
506 if (!name || !data) {
507 ERR("name: %p, data: %p", name, data);
517 if (s_info.prov_table) {
518 struct _viewer_item *found;
520 found = g_hash_table_lookup(s_info.prov_table, name);
522 ERR("already have it : %s", name);
526 ERR("s_info.prov_table is NULL");
530 /* elm_plug receives 'server_del' event,
531 * if it repeats connect and disconnect frequently.
534 viewer = _minictrl_create_view(ad, name);
536 ERR("Failed to create view[%s]", name);
540 _viewer_set_size(viewer, ad, width, height);
541 quickpanel_uic_initial_resize(viewer,
542 (height > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
543 ? height : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
545 vit = malloc(sizeof(*vit));
547 ERR("fail to alloc vit");
548 evas_object_del(viewer);
552 if (_minictrl_is_ongoing(name) == 1) {
553 type = QP_ITEM_TYPE_MINICTRL_ONGOING;
555 type = QP_ITEM_TYPE_MINICTRL_MIDDLE;
558 qid = quickpanel_list_util_item_new(type, vit);
560 ERR("fail to alloc vit");
561 evas_object_del(viewer);
566 vit->name = strdup(name);
568 ERR("strdup: %d", errno);
569 quickpanel_list_util_item_del(qid);
570 evas_object_del(viewer);
575 vit->height = height;
576 vit->viewer = viewer;
579 quickpanel_list_util_item_set_tag(vit->viewer, qid);
580 quickpanel_list_util_sort_insert(ad->list, vit->viewer);
581 evas_object_data_set(_get_minictrl_obj(viewer), MINICONTROL_VIEW_DATA, vit);
583 g_hash_table_insert(s_info.prov_table, g_strdup(name), vit);
585 DBG("success to add minicontrol %s", name);
586 _minictrl_sendview_rotation_event(vit->name, ad->angle);
589 static void _anim_init_resize(void *data)
596 ERR("Invalid parameter");
602 ERR("Invalid target");
606 evas_object_color_set(item, 0, 0, 0, 0);
609 static Eina_Bool _anim_init_cb(void *data)
613 static qp_vi_op_table anim_init_table[] = {
615 .op_type = VI_OP_RESIZE,
616 .handler = _anim_init_resize,
619 .op_type = VI_OP_NONE,
626 ERR("Invalid parameter");
630 for (i = 0; anim_init_table[i].op_type != VI_OP_NONE; i++) {
631 if (anim_init_table[i].op_type != vi->op_type) {
635 anim_init_table[i].handler(vi);
642 static void _reorder_transit_del_cb(void *data, Elm_Transit *transit)
656 ERR("Target is null");
660 ad = quickpanel_get_app_data();
666 _viewer_set_size(item, ad, vi->extra_flag_1, vi->extra_flag_2);
667 quickpanel_uic_initial_resize(item,
668 (vi->extra_flag_2 > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
669 ? vi->extra_flag_2 : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
672 static void _anim_job_resize(void *data)
674 Elm_Transit *transit_layout_parent;
675 struct _viewer_item *viewer_item;
676 Elm_Transit *transit_fadein;
683 ad = quickpanel_get_app_data();
684 if (!ad || !vi || !vi->target || !vi->extra_data_2) {
685 ERR("Invalid parameters: %p %p %p %p", ad, vi, vi ? vi->target : NULL, vi ? vi->extra_data_2 : NULL);
690 to_w = vi->extra_flag_1;
691 to_h = vi->extra_flag_2;
692 viewer_item = vi->extra_data_2;
694 transit_layout_parent = quickpanel_list_util_get_reorder_transit(viewer_item->viewer, NULL, to_h - viewer_item->height);
695 if (transit_layout_parent != NULL) {
696 elm_transit_del_cb_set(transit_layout_parent, _reorder_transit_del_cb, vi);
698 _viewer_set_size(item, ad, to_w, to_h);
699 quickpanel_uic_initial_resize(item,
700 (to_h > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
701 ? to_h : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
704 transit_fadein = elm_transit_add();
705 if (transit_fadein != NULL) {
706 elm_transit_object_add(transit_fadein, item);
707 elm_transit_effect_color_add(transit_fadein, 0, 0, 0, 0, 255, 255, 255, 255);
708 elm_transit_duration_set(transit_fadein, 0.35);
709 elm_transit_tween_mode_set(transit_fadein, quickpanel_vim_get_tweenmode(VI_OP_INSERT));
710 elm_transit_del_cb_set(transit_fadein, quickpanel_vi_done_cb_for_transit, vi);
711 elm_transit_objects_final_state_keep_set(transit_fadein, EINA_TRUE);
713 if (transit_layout_parent != NULL) {
714 elm_transit_chain_transit_add(transit_layout_parent, transit_fadein);
715 elm_transit_go(transit_layout_parent);
717 elm_transit_go(transit_fadein);
720 ERR("Failed to create all the transit");
721 quickpanel_vi_done(vi);
725 static Eina_Bool _anim_job_cb(void *data)
729 static qp_vi_op_table anim_job_table[] = {
731 .op_type = VI_OP_RESIZE,
732 .handler = _anim_job_resize,
735 .op_type = VI_OP_NONE,
742 ERR("Invalid parameter");
746 for (i = 0; anim_job_table[i].op_type != VI_OP_NONE; i++) {
747 if (anim_job_table[i].op_type != vi->op_type) {
751 anim_job_table[i].handler(vi);
758 static void _anim_done_resize(void *data)
761 struct _viewer_item *viewer_item;
767 ERR("Invalid parameter");
771 ad = quickpanel_get_app_data();
779 ERR("Invalid target");
783 viewer_item = vi->extra_data_2;
785 ERR("viewer_item is null");
789 viewer_item->width = vi->extra_flag_1;
790 viewer_item->height = vi->extra_flag_2;
792 _viewer_set_size(item, ad, viewer_item->width, viewer_item->height);
793 quickpanel_uic_initial_resize(item,
794 (viewer_item->height > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
795 ? viewer_item->height : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
796 evas_object_color_set(item, 255, 255, 255, 255);
799 static Eina_Bool _anim_done_cb(void *data)
803 static qp_vi_op_table anim_done_table[] = {
805 .op_type = VI_OP_RESIZE,
806 .handler = _anim_done_resize,
809 .op_type = VI_OP_NONE,
816 ERR("Invalid parameter");
820 for (i = 0; anim_done_table[i].op_type != VI_OP_NONE; i++) {
821 if (anim_done_table[i].op_type != vi->op_type) {
825 anim_done_table[i].handler(vi);
832 static void _minictrl_resize_vi(Evas_Object *list, struct _viewer_item *item, int to_w, int to_h)
836 if (!list || !item) {
837 ERR("Invalid parameter: list: %p, item: %p", list, item);
841 vi = quickpanel_vi_new_with_data(
843 QP_ITEM_TYPE_MINICTRL_MIDDLE,
850 NULL, /* vi == NULL */
856 quickpanel_vi_start(vi);
858 ERR("Unable to create 'vi'");
862 static void _minictrl_update(const char *name, unsigned int width, unsigned int height, void *data)
864 struct appdata *ad = data;
865 struct _viewer_item *found = NULL;
867 if (!s_info.prov_table || !ad) {
868 ERR("name: %s, table: %p, ad: %p", name, s_info.prov_table, ad);
872 found = g_hash_table_lookup(s_info.prov_table, name);
874 WARN("unknown provider name : %s", name);
879 if (found->height != height || found->width != width) {
880 _minictrl_resize_vi(ad->list, found, width, height);
882 _viewer_set_size(found->viewer, ad, width, height);
883 quickpanel_uic_initial_resize(found->viewer,
884 (height > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT)
885 ? height : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT);
890 #if defined(WINSYS_X11)
891 static void _minictrl_lock(const char *name)
893 struct _viewer_item *found;
895 if (!s_info.prov_table) {
896 ERR("table is empty: %s", name);
900 DBG("minictrl_lock %s", name);
901 found = g_hash_table_lookup(s_info.prov_table, name);
903 WARN("unknown provider name : %s", name);
908 struct _viewer_item *vit;
910 vit = evas_object_data_del(_get_minictrl_obj(found->viewer), MINICONTROL_VIEW_DATA);
913 evas_object_data_set(_get_minictrl_obj(found->viewer), MINICONTROL_VIEW_DATA, vit);
921 static void _mctrl_viewer_event_cb(minicontrol_event_e event, const char *name, bundle *event_arg, void *data)
931 if (!data || !name) {
932 ERR("Invalid parameter");
938 if (_viewer_check(name) == 0) {
939 ERR("%s: ignored", name);
943 #if defined(WINSYS_X11)
945 if ((int)event == MINICONTROL_EVENT_REQUEST_LOCK) {
947 * This event type is extra one. not in the enumeration list.
949 _minictrl_lock(name);
953 case MINICONTROL_EVENT_START:
954 ret = bundle_get_byte(event_arg, MINICONTROL_BUNDLE_KEY_WIDTH, (void **)&width, &bundle_size);
955 if (ret != BUNDLE_ERROR_NONE || bundle_size != sizeof(int)) {
956 ERR("Failed to get bundle value(width) %d : %d", ret, bundle_size);
961 ret = bundle_get_byte(event_arg, MINICONTROL_BUNDLE_KEY_HEIGHT, (void **)&height, &bundle_size);
962 if (ret != BUNDLE_ERROR_NONE || bundle_size != sizeof(int)) {
963 ERR("Failed to get bundle value(height) : %d", ret);
968 DBG("Name: %s, Size: %dx%d", name, *width, *height);
969 _minictrl_add(name, *width, *height, data);
971 case MINICONTROL_EVENT_RESIZE:
972 ret = bundle_get_byte(event_arg, MINICONTROL_BUNDLE_KEY_WIDTH, (void **)&width, &bundle_size);
973 if (ret != BUNDLE_ERROR_NONE || bundle_size != sizeof(int)) {
974 ERR("Failed to get bundle value(width) %d : %d", ret, bundle_size);
979 ret = bundle_get_byte(event_arg, MINICONTROL_BUNDLE_KEY_HEIGHT, (void **)&height, &bundle_size);
980 if (ret != BUNDLE_ERROR_NONE || bundle_size != sizeof(int)) {
981 ERR("Failed to get bundle value(height) : %d", ret);
986 DBG("Name: %s, Size: %dx%d", name, *width, *height);
987 _minictrl_update(name, *width, *height, data);
989 case MINICONTROL_EVENT_STOP:
990 _minictrl_remove(name, data);
992 case MINICONTROL_EVENT_REQUEST_HIDE:
993 quickpanel_uic_close_quickpanel(true, 0);
995 case MINICONTROL_EVENT_REQUEST_ANGLE:
996 if (ad->list != NULL) {
997 SERR("need to broadcasting angle by %s ", name, event);
998 _minictrl_sendview_rotation_event(name, ad->angle);
1004 #if defined(WINSYS_X11)
1009 static int _init(void *data)
1011 minicontrol_error_e ret;
1014 ERR("Invalid parameter");
1018 s_info.prov_table = g_hash_table_new_full(g_str_hash, g_str_equal,
1019 (GDestroyNotify)g_free,
1020 (GDestroyNotify)_viewer_item_free);
1022 ret = minicontrol_viewer_set_event_cb(_mctrl_viewer_event_cb, data);
1023 if (ret != MINICONTROL_ERROR_NONE) {
1024 ERR("fail to minicontrol_viewer_set_event_cb()- %d", ret);
1031 static int _fini(void *data)
1033 minicontrol_error_e ret;
1035 ret = minicontrol_viewer_unset_event_cb();
1037 if (ret != MINICONTROL_ERROR_NONE) {
1038 ERR("fail to minicontrol_viewer_unset_event_cb()- %d", ret);
1041 if (s_info.prov_table) {
1042 g_hash_table_destroy(s_info.prov_table);
1043 s_info.prov_table = NULL;
1049 static int _suspend(void *data)
1055 ERR("Invalid parameter");
1059 if (ad->list != NULL) {
1060 _viewer_unfreeze(ad->scroller);
1066 static int _resume(void *data)
1072 ERR("Invalid parameter");
1076 if (ad->list != NULL) {
1077 _viewer_unfreeze(ad->scroller);
1083 HAPI void quickpanel_minictrl_rotation_report(int angle)
1085 bundle *event_arg_bundle;
1087 if (s_info.prov_table == NULL) {
1091 if (g_hash_table_size(s_info.prov_table) <= 0) {
1095 GHashTableIter iter;
1096 gpointer key, value;
1098 g_hash_table_iter_init (&iter, s_info.prov_table);
1099 while (g_hash_table_iter_next (&iter, &key, &value))
1101 SINFO("minicontrol name:%s rotation:%d", key, angle);
1102 event_arg_bundle = bundle_create();
1103 if (event_arg_bundle) {
1104 char bundle_value_buffer[BUNDLE_BUFFER_LENGTH] = { 0, };
1105 snprintf(bundle_value_buffer, sizeof(bundle_value_buffer) - 1, "%d", angle);
1106 bundle_add_str(event_arg_bundle, "angle", bundle_value_buffer);
1107 minicontrol_viewer_send_event(key, MINICONTROL_EVENT_REPORT_ANGLE, event_arg_bundle);
1108 bundle_free(event_arg_bundle);
1113 void _minictrl_sendview_rotation_event(const char* name, int angle)
1115 bundle *event_arg_bundle;
1118 ERR("Invalid parameter");
1122 if (s_info.prov_table == NULL) {
1126 if (g_hash_table_size(s_info.prov_table) <= 0) {
1130 SINFO("minicontrol name:%s rotation:%d", name, angle);
1131 event_arg_bundle = bundle_create();
1132 if (event_arg_bundle) {
1133 char bundle_value_buffer[BUNDLE_BUFFER_LENGTH] = { 0, };
1135 snprintf(bundle_value_buffer, sizeof(bundle_value_buffer) - 1, "%d", angle);
1136 bundle_add_str(event_arg_bundle, "angle", bundle_value_buffer);
1137 minicontrol_viewer_send_event(name, MINICONTROL_EVENT_REPORT_ANGLE, event_arg_bundle);
1138 bundle_free(event_arg_bundle);
1142 #if defined(WINSYS_X11)
1143 static void _minictrl_send_view_event_cb(gpointer key, gpointer value, gpointer user_data)
1150 bundle *event_arg_bundle;
1152 event_arg_bundle = bundle_create();
1153 if (event_arg_bundle) {
1154 minicontrol_viewer_event_e event;
1156 event = (minicontrol_viewer_event_e)user_data;
1157 minicontrol_viewer_send_event(key, event, event_arg_bundle);
1158 bundle_free(event_arg_bundle);
1163 static void _minictrl_opened(void *data)
1166 #if defined(WINSYS_X11)
1167 g_hash_table_foreach(s_info.prov_table, _minictrl_send_view_event_cb, (gpointer)MINICONTROL_VIEWER_EVENT_SHOW);
1171 static void _minictrl_closed(void *data)
1174 #if defined(WINSYS_X11)
1175 g_hash_table_foreach(s_info.prov_table, _minictrl_send_view_event_cb, (gpointer)MINICONTROL_VIEWER_EVENT_HIDE);
1179 QP_Module minictrl = {
1183 .suspend = _suspend,
1187 .lang_changed = NULL,
1190 .qp_opened = _minictrl_opened,
1191 .qp_closed = _minictrl_closed,