1 #include <Elementary.h>
3 #include "elm_widget_conform.h"
6 # define MIN(a, b) ((a) < (b)) ? (a) : (b)
10 # define MAX(a, b) ((a) < (b)) ? (b) : (a)
13 EAPI const char ELM_CONFORMANT_SMART_NAME[] = "elm_conformant";
14 static char CONFORMANT_KEY[] = "_elm_conform_key";
16 #ifdef HAVE_ELEMENTARY_X
17 #define SUB_TYPE_COUNT 2
18 static char *sub_type[SUB_TYPE_COUNT] = { "elm_scroller", "elm_genlist" };
22 static const char INDICATOR_PART[] = "elm.swallow.indicator";
23 static const char VIRTUALKEYPAD_PART[] = "elm.swallow.virtualkeypad";
24 static const char CLIPBOARD_PART[] = "elm.swallow.clipboard";
25 static const char SOFTKEY_PART[] = "elm.swallow.softkey";
27 static const char SIG_VIRTUALKEYPAD_STATE_ON[] = "virtualkeypad,state,on";
28 static const char SIG_VIRTUALKEYPAD_STATE_OFF[] = "virtualkeypad,state,off";
29 static const char SIG_CLIPBOARD_STATE_ON[] = "clipboard,state,on";
30 static const char SIG_CLIPBOARD_STATE_OFF[] = "clipboard,state,off";
32 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
33 {SIG_VIRTUALKEYPAD_STATE_ON, ""},
34 {SIG_VIRTUALKEYPAD_STATE_OFF, ""},
35 {SIG_CLIPBOARD_STATE_ON, ""},
36 {SIG_CLIPBOARD_STATE_OFF, ""},
40 static const Elm_Layout_Part_Alias_Description _content_aliases[] =
42 {"icon", "elm.swallow.content"},
46 EVAS_SMART_SUBCLASS_NEW
47 (ELM_CONFORMANT_SMART_NAME, _elm_conformant, Elm_Conformant_Smart_Class,
48 Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks);
50 /* Example of env vars:
51 * ILLUME_KBD="0, 0, 800, 301"
52 * ILLUME_IND="0, 0, 800, 32"
53 * ILLUME_STK="0, 568, 800, 32"
56 _conformant_part_geometry_get_from_env(const char *part,
62 const char delimiters[] = " ,;";
63 char *env_val, *token;
67 if (!(env_val = getenv(part))) return EINA_FALSE;
69 /* strtok would modify env var if not copied to a buffer */
70 strncpy(buf, env_val, sizeof(buf));
71 buf[PATH_MAX - 1] = '\0';
73 token = strtok(buf, delimiters);
74 if (!token) return EINA_FALSE;
77 token = strtok(NULL, delimiters);
78 if (!token) return EINA_FALSE;
81 token = strtok(NULL, delimiters);
82 if (!token) return EINA_FALSE;
85 token = strtok(NULL, delimiters);
86 if (!token) return EINA_FALSE;
97 _conformant_part_size_hints_set(Evas_Object *obj,
104 Evas_Coord cx, cy, cw, ch;
105 Evas_Coord part_height = 0, part_width = 0;
107 evas_object_geometry_get(obj, &cx, &cy, &cw, &ch);
109 /* Part overlapping with conformant */
110 if ((cx < (sx + sw)) && ((cx + cw) > sx)
111 && (cy < (sy + sh)) && ((cy + ch) > sy))
113 part_height = MIN((cy + ch), (sy + sh)) - MAX(cy, sy);
114 part_width = MIN((cx + cw), (sx + sw)) - MAX(cx, sx);
117 evas_object_size_hint_min_set(sobj, part_width, part_height);
118 evas_object_size_hint_max_set(sobj, part_width, part_height);
122 _conformant_part_sizing_eval(Evas_Object *obj,
123 Conformant_Part_Type part_type)
125 #ifdef HAVE_ELEMENTARY_X
126 Ecore_X_Window zone = 0;
130 int sx = -1, sy = -1, sw = -1, sh = -1;
132 ELM_CONFORMANT_DATA_GET(obj, sd);
134 #ifdef HAVE_ELEMENTARY_X
135 top = elm_widget_top_get(obj);
136 xwin = elm_win_xwindow_get(top);
139 zone = ecore_x_e_illume_zone_get(xwin);
142 if (part_type & ELM_CONFORMANT_INDICATOR_PART)
144 if ((!_conformant_part_geometry_get_from_env
145 ("ILLUME_IND", &sx, &sy, &sw, &sh)) && (xwin))
147 #ifdef HAVE_ELEMENTARY_X
148 //No information of the indicator geometry, reset the geometry.
149 if (!ecore_x_e_illume_indicator_geometry_get
150 (zone, &sx, &sy, &sw, &sh))
151 sx = sy = sw = sh = 0;
156 if (((sd->rot == 90) || (sd->rot == 270)) && sd->landscape_indicator)
157 _conformant_part_size_hints_set(obj, sd->landscape_indicator, sx, sy, sw, sh);
158 else if (((sd->rot == 0) || (sd->rot == 180)) && sd->portrait_indicator)
159 _conformant_part_size_hints_set(obj, sd->portrait_indicator, sx, sy, sw, sh);
162 if (part_type & ELM_CONFORMANT_VIRTUAL_KEYPAD_PART)
164 if ((!_conformant_part_geometry_get_from_env
165 ("ILLUME_KBD", &sx, &sy, &sw, &sh)) && (xwin))
167 #ifdef HAVE_ELEMENTARY_X
168 //No information of the keyboard geometry, reset the geometry.
170 DBG("[KEYPAD]:pid=%d, xwin=0x%x, zone=0x%x: no env value and check window property.", getpid(), xwin, zone);
172 if (!ecore_x_e_illume_keyboard_geometry_get(xwin, &sx, &sy, &sw, &sh))
174 DBG("[KEYPAD]:no window property, check zone property.");
175 if (!ecore_x_e_illume_keyboard_geometry_get(zone, &sx, &sy, &sw, &sh))
177 DBG("[KEYPAD]:no zone property, reset value.");
178 sx = sy = sw = sh = 0;
185 DBG("[KEYPAD]: size(%d,%d, %dx%d).", sx, sy, sw, sh);
186 _conformant_part_size_hints_set
187 (obj, sd->virtualkeypad, sx, sy, sw, sh);
190 if (part_type & ELM_CONFORMANT_SOFTKEY_PART)
192 if ((!_conformant_part_geometry_get_from_env
193 ("ILLUME_STK", &sx, &sy, &sw, &sh)) && (xwin))
195 #ifdef HAVE_ELEMENTARY_X
196 //No information of the softkey geometry, reset the geometry.
197 if (!ecore_x_e_illume_softkey_geometry_get
198 (zone, &sx, &sy, &sw, &sh))
199 sx = sy = sw = sh = 0;
204 _conformant_part_size_hints_set(obj, sd->softkey, sx, sy, sw, sh);
206 if (part_type & ELM_CONFORMANT_CLIPBOARD_PART)
208 if ((!_conformant_part_geometry_get_from_env
209 ("ILLUME_CB", &sx, &sy, &sw, &sh)) && (xwin))
211 #ifdef HAVE_ELEMENTARY_X
212 //No information of the clipboard geometry, reset the geometry.
213 if (!ecore_x_e_illume_clipboard_geometry_get
214 (zone, &sx, &sy, &sw, &sh))
215 sx = sy = sw = sh = 0;
220 _conformant_part_size_hints_set(obj, sd->clipboard, sx, sy, sw, sh);
225 _conformant_parts_swallow(Evas_Object *obj)
228 Elm_Widget_Smart_Data *wd;
230 ELM_CONFORMANT_DATA_GET(obj, sd);
232 wd = ELM_WIDGET_DATA(sd);
233 e = evas_object_evas_get(obj);
238 if (edje_object_part_exists(wd->resize_obj, VIRTUALKEYPAD_PART))
240 if (!sd->virtualkeypad)
242 sd->virtualkeypad = evas_object_rectangle_add(e);
243 elm_widget_sub_object_add(obj, sd->virtualkeypad);
244 evas_object_size_hint_max_set(sd->virtualkeypad, -1, 0);
247 _conformant_part_sizing_eval(obj, ELM_CONFORMANT_VIRTUAL_KEYPAD_PART);
249 evas_object_color_set(sd->virtualkeypad, 0, 0, 0, 0);
250 elm_layout_content_set(obj, VIRTUALKEYPAD_PART, sd->virtualkeypad);
252 else if (sd->virtualkeypad)
254 evas_object_del(sd->virtualkeypad);
255 sd->virtualkeypad = NULL;
259 if (edje_object_part_exists(wd->resize_obj, CLIPBOARD_PART))
263 sd->clipboard = evas_object_rectangle_add(e);
264 evas_object_size_hint_min_set(sd->clipboard, -1, 0);
265 evas_object_size_hint_max_set(sd->clipboard, -1, 0);
268 _conformant_part_sizing_eval(obj, ELM_CONFORMANT_CLIPBOARD_PART);
270 evas_object_color_set(sd->clipboard, 0, 0, 0, 0);
271 elm_layout_content_set(obj, CLIPBOARD_PART, sd->clipboard);
273 else if (sd->clipboard)
275 evas_object_del(sd->clipboard);
276 sd->clipboard = NULL;
280 if (edje_object_part_exists(wd->resize_obj, SOFTKEY_PART))
284 sd->softkey = evas_object_rectangle_add(e);
285 evas_object_size_hint_min_set(sd->softkey, -1, 0);
286 evas_object_size_hint_max_set(sd->softkey, -1, 0);
289 _conformant_part_sizing_eval(obj, ELM_CONFORMANT_SOFTKEY_PART);
291 evas_object_color_set(sd->softkey, 0, 0, 0, 0);
292 elm_layout_content_set(obj, SOFTKEY_PART, sd->softkey);
294 else if (sd->softkey)
296 evas_object_del(sd->softkey);
302 _port_indicator_connect_cb(void *data)
304 const char *indicator_serv_name;
305 Elm_Conformant_Smart_Data *sd = data;
308 if (!sd) return ECORE_CALLBACK_CANCEL;
309 if (sd->indmode != ELM_WIN_INDICATOR_SHOW)
311 sd->port_indi_timer = NULL;
312 return ECORE_CALLBACK_CANCEL;
314 rot = (int) evas_object_data_get(sd->portrait_indicator, CONFORMANT_KEY);
315 indicator_serv_name = elm_config_indicator_service_get(rot);
316 if (!indicator_serv_name)
318 DBG("Conformant cannot find indicator service name: Rotation=%d\n",rot);
319 sd->port_indi_timer = NULL;
320 return ECORE_CALLBACK_CANCEL;
322 if (elm_plug_connect(sd->portrait_indicator, indicator_serv_name, 0, EINA_FALSE))
324 DBG("Conformant connect to server[%s]\n", indicator_serv_name);
325 sd->port_indi_timer = NULL;
326 return ECORE_CALLBACK_CANCEL;
328 return ECORE_CALLBACK_RENEW;
333 _land_indicator_connect_cb(void *data)
335 const char *indicator_serv_name;
336 Elm_Conformant_Smart_Data *sd = data;
339 if (!sd) return ECORE_CALLBACK_CANCEL;
340 if (sd->indmode != ELM_WIN_INDICATOR_SHOW)
342 sd->land_indi_timer = NULL;
343 return ECORE_CALLBACK_CANCEL;
345 rot = (int) evas_object_data_get(sd->landscape_indicator, CONFORMANT_KEY);
346 indicator_serv_name = elm_config_indicator_service_get(rot);
347 if (!indicator_serv_name)
349 DBG("Conformant cannot find indicator service name: Rotation=%d\n",rot);
350 sd->land_indi_timer = NULL;
351 return ECORE_CALLBACK_CANCEL;
353 if (elm_plug_connect(sd->landscape_indicator, indicator_serv_name, 0, EINA_FALSE))
355 DBG("Conformant connect to server[%s]\n", indicator_serv_name);
356 sd->land_indi_timer = NULL;
357 return ECORE_CALLBACK_CANCEL;
359 return ECORE_CALLBACK_RENEW;
363 _land_indicator_disconnected(void *data,
364 Evas_Object *obj __UNUSED__,
365 void *event_info __UNUSED__)
367 Evas_Object *conform = data;
369 ELM_CONFORMANT_DATA_GET(conform, sd);
371 sd->land_indi_timer = ecore_timer_add(1, _land_indicator_connect_cb, sd);
375 _port_indicator_disconnected(void *data,
376 Evas_Object *obj __UNUSED__,
377 void *event_info __UNUSED__)
379 Evas_Object *conform = data;
381 ELM_CONFORMANT_DATA_GET(conform, sd);
383 sd->port_indi_timer = ecore_timer_add(1, _port_indicator_connect_cb, sd);
387 static const char PLUG_KEY[] = "__Plug_Ecore_Evas";
388 // procotol version - change this as needed
389 #define MSG_DOMAIN_CONTROL_INDICATOR 0x10001
390 #define MSG_ID_INDICATOR_REPEAT_EVENT 0x10002
391 #define MSG_ID_INDICATOR_ROTATION 0x10003
392 #define MSG_ID_INDICATOR_OPACITY 0X1004
393 #define MSG_ID_INDICATOR_TYPE 0X1005
396 _plug_msg_handle(Ecore_Evas *ee, int msg_domain, int msg_id, void *data, int size)
398 Evas_Object *conformant;
401 DBG("Receive msg from plug ee=%p msg_domain=%x msg_id=%x size=%d", ee, msg_domain, msg_id, size);
402 //get plug object form ee
403 conformant = (Evas_Object *)ecore_evas_data_get(ee, CONFORMANT_KEY);
404 ELM_CONFORMANT_DATA_GET(conformant, sd);
405 if (msg_domain == MSG_DOMAIN_CONTROL_INDICATOR)
407 if (msg_id == MSG_ID_INDICATOR_REPEAT_EVENT)
410 DBG("Receive repeat event change message:(%d)", *repeat);
412 evas_object_repeat_events_set(sd->landscape_indicator, EINA_TRUE);
414 evas_object_repeat_events_set(sd->landscape_indicator, EINA_FALSE);
416 if (msg_id == MSG_ID_INDICATOR_TYPE)
418 Elm_Win_Indicator_Type_Mode *indi_t_mode = data;
419 Evas_Object *win = elm_widget_top_get(conformant);
420 DBG("Receive indicator type change message:(%d)", *indi_t_mode);
421 elm_win_indicator_type_set(win, *indi_t_mode);
427 _create_portrait_indicator(Evas_Object *obj)
429 Evas_Object *port_indicator = NULL;
430 Ecore_Evas *indicator_ee = NULL;
431 const char *port_indicator_serv_name;
433 ELM_CONFORMANT_DATA_GET(obj, sd);
435 port_indicator_serv_name = elm_config_indicator_service_get(sd->rot);
436 if (!port_indicator_serv_name)
438 DBG("Conformant cannot get portrait indicator service name\n");
442 port_indicator = elm_plug_add(obj);
445 DBG("Conformant cannot create plug to server[%s]\n", port_indicator_serv_name);
449 if (!elm_plug_connect(port_indicator, port_indicator_serv_name, 0, EINA_FALSE))
451 DBG("Conformant cannot connect to server[%s]\n", port_indicator_serv_name);
455 //callback to deal with extn socket message
456 indicator_ee = ecore_evas_object_ecore_evas_get(elm_plug_image_object_get(port_indicator));
457 DBG("This is portrait indicator's ee=%p.", indicator_ee);
458 ecore_evas_callback_msg_handle_set(indicator_ee, _plug_msg_handle);
459 ecore_evas_data_set(indicator_ee, CONFORMANT_KEY, obj);
461 DBG("The rotation value of portrait indicator was changed:(%d)", sd->rot);
462 ecore_evas_msg_parent_send(indicator_ee, MSG_DOMAIN_CONTROL_INDICATOR, MSG_ID_INDICATOR_ROTATION, &(sd->rot), sizeof(int));
464 elm_widget_sub_object_add(obj, port_indicator);
465 evas_object_smart_callback_add(port_indicator, "image.deleted", _port_indicator_disconnected, obj);
467 evas_object_size_hint_min_set(port_indicator, -1, 0);
468 evas_object_size_hint_max_set(port_indicator, -1, 0);
470 return port_indicator;
474 _create_landscape_indicator(Evas_Object *obj)
476 Ecore_Evas *indicator_ee = NULL;
477 Evas_Object *land_indicator = NULL;
478 const char *land_indicator_serv_name;
480 ELM_CONFORMANT_DATA_GET(obj, sd);
482 land_indicator_serv_name = elm_config_indicator_service_get(sd->rot);
483 if (!land_indicator_serv_name)
485 DBG("Conformant cannot get portrait indicator service name\n");
489 land_indicator = elm_plug_add(obj);
492 DBG("Conformant cannot create plug to server[%s]\n", land_indicator_serv_name);
496 if (!elm_plug_connect(land_indicator, land_indicator_serv_name, 0, EINA_FALSE))
498 DBG("Conformant cannot connect to server[%s]\n", land_indicator_serv_name);
502 //callback to deal with extn socket message
503 indicator_ee = ecore_evas_object_ecore_evas_get(elm_plug_image_object_get(land_indicator));
504 ecore_evas_data_set(indicator_ee, CONFORMANT_KEY, obj);
505 DBG("This is landscape indicator's ee=%p.", indicator_ee);
506 ecore_evas_callback_msg_handle_set(indicator_ee, _plug_msg_handle);
507 DBG("The rotation value of landscape indicator was changed:(%d)", sd->rot);
508 ecore_evas_msg_parent_send(indicator_ee, MSG_DOMAIN_CONTROL_INDICATOR, MSG_ID_INDICATOR_ROTATION, &(sd->rot), sizeof(int));
510 elm_widget_sub_object_add(obj, land_indicator);
511 evas_object_smart_callback_add(land_indicator, "image.deleted",_land_indicator_disconnected, obj);
513 evas_object_size_hint_min_set(land_indicator, -1, 0);
514 evas_object_size_hint_max_set(land_indicator, -1, 0);
515 return land_indicator;
519 _indicator_mode_set(Evas_Object *conformant, Elm_Win_Indicator_Mode indmode)
521 Evas_Object *old_indi = NULL;
522 Elm_Widget_Smart_Data *wd;
523 ELM_CONFORMANT_DATA_GET(conformant, sd);
524 sd->indmode = indmode;
526 wd = ELM_WIDGET_DATA(sd);
528 if (!edje_object_part_exists(wd->resize_obj, INDICATOR_PART))
531 if (indmode == ELM_WIN_INDICATOR_SHOW)
533 old_indi = elm_layout_content_get(conformant, INDICATOR_PART);
535 //create new indicator
538 if ((sd->rot == 90)||(sd->rot == 270))
540 if (!sd->landscape_indicator)
541 sd->landscape_indicator = _create_landscape_indicator(conformant);
543 if (!sd->landscape_indicator) return;
545 evas_object_show(sd->landscape_indicator);
546 elm_layout_content_set(conformant, INDICATOR_PART, sd->landscape_indicator);
550 if (!sd->portrait_indicator)
551 sd->portrait_indicator = _create_portrait_indicator(conformant);
553 if (!sd->portrait_indicator) return;
555 evas_object_show(sd->portrait_indicator);
556 elm_layout_content_set(conformant, INDICATOR_PART, sd->portrait_indicator);
560 elm_object_signal_emit(conformant, "elm,state,indicator,show", "elm");
564 old_indi = elm_layout_content_get(conformant, INDICATOR_PART);
567 evas_object_hide(old_indi);
569 elm_object_signal_emit(conformant, "elm,state,indicator,hide", "elm");
574 _indicator_opacity_set(Evas_Object *conformant, Elm_Win_Indicator_Opacity_Mode ind_o_mode)
576 ELM_CONFORMANT_DATA_GET(conformant, sd);
577 sd->ind_o_mode = ind_o_mode;
578 //TODO: opacity change
579 //send indicator information
580 if (sd->landscape_indicator)
582 Ecore_Evas *indicator_ee = NULL;
583 DBG("The opacity mode of landscape indicator was changed:(%d)", ind_o_mode);
584 indicator_ee = ecore_evas_object_ecore_evas_get(elm_plug_image_object_get(sd->landscape_indicator));
585 ecore_evas_msg_parent_send(indicator_ee, MSG_DOMAIN_CONTROL_INDICATOR, MSG_ID_INDICATOR_OPACITY, &(sd->ind_o_mode), sizeof(Elm_Win_Indicator_Opacity_Mode));
587 if (sd->portrait_indicator)
589 Ecore_Evas *indicator_ee = NULL;
590 DBG("The opacity mode of portrait indicator was changed:(%d)", ind_o_mode);
591 indicator_ee = ecore_evas_object_ecore_evas_get(elm_plug_image_object_get(sd->portrait_indicator));
592 ecore_evas_msg_parent_send(indicator_ee, MSG_DOMAIN_CONTROL_INDICATOR, MSG_ID_INDICATOR_OPACITY, &(sd->ind_o_mode), sizeof(Elm_Win_Indicator_Opacity_Mode));
597 _on_indicator_mode_changed(void *data,
599 void *event_info __UNUSED__)
601 Evas_Object *conformant = data;
602 Evas_Object *win = obj;
604 Elm_Win_Indicator_Mode indmode;
605 Elm_Win_Indicator_Opacity_Mode ind_o_mode;
607 ELM_CONFORMANT_DATA_GET(conformant, sd);
609 indmode = elm_win_indicator_mode_get(win);
610 ind_o_mode = elm_win_indicator_opacity_get(win);
611 if (indmode != sd->indmode)
612 _indicator_mode_set(conformant, indmode);
613 if (ind_o_mode != sd->ind_o_mode)
614 _indicator_opacity_set(conformant, ind_o_mode);
618 _on_rotation_changed(void *data,
620 void *event_info __UNUSED__)
623 Evas_Object *win = obj;
624 Evas_Object *conformant = data;
625 Evas_Object *old_indi = NULL;
627 ELM_CONFORMANT_DATA_GET(data, sd);
629 rot = elm_win_rotation_get(win);
631 if (rot == sd->rot) return;
634 //send indicator information
635 if (sd->landscape_indicator)
637 Ecore_Evas *indicator_ee = NULL;
638 DBG("The rotation value of landscape indicator was changed:(%d)", rot);
639 indicator_ee = ecore_evas_object_ecore_evas_get(elm_plug_image_object_get(sd->landscape_indicator));
640 ecore_evas_msg_parent_send(indicator_ee, MSG_DOMAIN_CONTROL_INDICATOR, MSG_ID_INDICATOR_ROTATION, &(sd->rot), sizeof(int));
642 if (sd->portrait_indicator)
644 Ecore_Evas *indicator_ee = NULL;
645 DBG("The rotation value of portrait indicator was changed:(%d)", rot);
646 indicator_ee = ecore_evas_object_ecore_evas_get(elm_plug_image_object_get(sd->portrait_indicator));
647 ecore_evas_msg_parent_send(indicator_ee, MSG_DOMAIN_CONTROL_INDICATOR, MSG_ID_INDICATOR_ROTATION, &(sd->rot), sizeof(int));
649 old_indi = elm_layout_content_unset(conformant, INDICATOR_PART);
650 /* this means ELM_WIN_INDICATOR_SHOW never be set.we don't need to change indicator type*/
651 if (!old_indi) return;
652 evas_object_hide(old_indi);
654 if ((rot == 90) || (rot == 270))
656 if (!sd->landscape_indicator)
657 sd->landscape_indicator = _create_landscape_indicator(conformant);
659 if (!sd->landscape_indicator) return;
661 evas_object_show(sd->landscape_indicator);
662 evas_object_data_set(sd->landscape_indicator, CONFORMANT_KEY, (void *) rot);
663 elm_layout_content_set(conformant, INDICATOR_PART, sd->landscape_indicator);
667 if (!sd->portrait_indicator)
668 sd->portrait_indicator = _create_portrait_indicator(conformant);
670 if (!sd->portrait_indicator) return;
672 evas_object_show(sd->portrait_indicator);
673 evas_object_data_set(sd->portrait_indicator, CONFORMANT_KEY, (void *) rot);
674 elm_layout_content_set(conformant, INDICATOR_PART, sd->portrait_indicator);
679 _elm_conformant_smart_theme(Evas_Object *obj)
681 if (!ELM_WIDGET_CLASS(_elm_conformant_parent_sc)->theme(obj))
684 _conformant_parts_swallow(obj);
686 elm_layout_sizing_eval(obj);
691 // unused now - but meant to be for making sure the focused widget is always
692 // visible when the vkbd comes and goes by moving the conformant obj (and thus
693 // its children) to show the focused widget (and if focus changes follow)
696 _focus_object_get(const Evas_Object *obj)
698 Evas_Object *win, *foc;
700 win = elm_widget_top_get(obj);
701 if (!win) return NULL;
702 foc = elm_widget_top_get(win);
706 _focus_object_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
708 evas_object_geometry_get(obj, x, y, w, h);
712 _focus_change_del(void *data, Evas_Object *obj, void *event_info)
714 // called from toplevel when the focused window shanges
718 _autoscroll_move(Evas_Object *obj)
720 // move conformant edje by delta to show focused widget
724 _autoscroll_mode_enable(Evas_Object *obj)
726 // called when autoscroll mode should be on - content area smaller than
728 // 1. get focused object
729 // 2. if not in visible conformant area calculate delta needed to
731 // 3. store delta and call _autoscroll_move() which either asanimates
732 // or jumps right there
736 _autoscroll_mode_disable(Evas_Object *obj)
738 // called when autoscroll mode should be off - set delta to 0 and
739 // call _autoscroll_move()
744 _move_resize_cb(void *data __UNUSED__,
747 void *event_info __UNUSED__)
749 Conformant_Part_Type part_type;
751 part_type = (ELM_CONFORMANT_INDICATOR_PART |
752 ELM_CONFORMANT_SOFTKEY_PART |
753 ELM_CONFORMANT_VIRTUAL_KEYPAD_PART |
754 ELM_CONFORMANT_CLIPBOARD_PART);
756 _conformant_part_sizing_eval(obj, part_type);
760 _show_region_job(void *data)
762 Evas_Object *focus_obj;
764 ELM_CONFORMANT_DATA_GET(data, sd);
766 focus_obj = elm_widget_focused_object_get(data);
769 Evas_Coord x, y, w, h;
771 elm_widget_show_region_get(focus_obj, &x, &y, &w, &h);
774 if (h < _elm_config->finger_size)
775 h = _elm_config->finger_size;
777 elm_widget_show_region_set(focus_obj, x, y, w, h, EINA_TRUE);
780 sd->show_region_job = NULL;
783 // showing the focused/important region.
784 #ifdef HAVE_ELEMENTARY_X
786 _on_content_resize(void *data,
788 Evas_Object *obj __UNUSED__,
789 void *event_info __UNUSED__)
791 ELM_CONFORMANT_DATA_GET(data, sd);
793 if ((sd->vkb_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF) &&
794 (sd->clipboard_state == ECORE_X_ILLUME_CLIPBOARD_STATE_OFF))
797 if (sd->show_region_job) ecore_job_del(sd->show_region_job);
798 sd->show_region_job = ecore_job_add(_show_region_job, data);
803 #ifdef HAVE_ELEMENTARY_X
805 _autoscroll_objects_update(void *data)
809 Evas_Object *sub, *top_scroller = NULL;
811 ELM_CONFORMANT_DATA_GET(data, sd);
813 sub = elm_widget_focused_object_get(data);
814 //Look up for top most scroller in the focus object hierarchy
819 type = elm_widget_type_get(sub);
820 if (!strcmp(type, ELM_CONFORMANT_SMART_NAME)) break;
822 for (i = 0; i < SUB_TYPE_COUNT; i++)
823 if (!strcmp(type, sub_type[i]))
828 sub = elm_object_parent_widget_get(sub);
831 //If the scroller got changed by app, replace it.
832 if (top_scroller != sd->scroller)
835 evas_object_event_callback_del
836 (sd->scroller, EVAS_CALLBACK_RESIZE, _on_content_resize);
837 sd->scroller = top_scroller;
840 evas_object_event_callback_add
841 (sd->scroller, EVAS_CALLBACK_RESIZE, _on_content_resize, data);
846 _virtualkeypad_state_change(Evas_Object *obj, Ecore_X_Event_Window_Property *ev)
848 ELM_CONFORMANT_DATA_GET(obj, sd);
850 Ecore_X_Window zone = ecore_x_e_illume_zone_get(ev->win);
851 Ecore_X_Virtual_Keyboard_State state =
852 ecore_x_e_virtual_keyboard_state_get(ev->win);
854 DBG("[KEYPAD]:window's state win=0x%x, state=%d.", ev->win, state);
855 if (state == ECORE_X_VIRTUAL_KEYBOARD_STATE_UNKNOWN)
857 state = ecore_x_e_virtual_keyboard_state_get(zone);
858 DBG("[KEYPAD]:zone's state zone=0x%x, state=%d.", zone, state);
861 if (sd->vkb_state == state) return;
862 sd->vkb_state = state;
864 if (state == ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF)
866 DBG("[KEYPAD]:ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF");
867 _conformant_part_sizing_eval(obj, ELM_CONFORMANT_VIRTUAL_KEYPAD_PART);
868 // Tizen Only - SIP regions for virtual keypad and clipboard are the same in Tizen
869 if (sd->clipboard_state == ECORE_X_ILLUME_CLIPBOARD_STATE_OFF)
870 elm_widget_display_mode_set(obj, EVAS_DISPLAY_MODE_NONE);
871 evas_object_smart_callback_call(obj, SIG_VIRTUALKEYPAD_STATE_OFF, NULL);
873 else if (state == ECORE_X_VIRTUAL_KEYBOARD_STATE_ON)
875 DBG("[KEYPAD]:ECORE_X_VIRTUAL_KEYBOARD_STATE_ON");
876 _conformant_part_sizing_eval(obj, ELM_CONFORMANT_VIRTUAL_KEYPAD_PART);
877 elm_widget_display_mode_set(obj, EVAS_DISPLAY_MODE_COMPRESS);
878 _autoscroll_objects_update(obj);
879 evas_object_smart_callback_call(obj, SIG_VIRTUALKEYPAD_STATE_ON, NULL);
884 _clipboard_state_change(Evas_Object *obj, Ecore_X_Event_Window_Property *ev)
886 ELM_CONFORMANT_DATA_GET(obj, sd);
888 Ecore_X_Window zone = ecore_x_e_illume_zone_get(ev->win);
889 Ecore_X_Illume_Clipboard_State state =
890 ecore_x_e_illume_clipboard_state_get(ev->win);
892 DBG("[CLIPBOARD]:window's state win=0x%x, state=%d.", ev->win, state);
894 if (state == ECORE_X_ILLUME_CLIPBOARD_STATE_UNKNOWN)
896 state = ecore_x_e_illume_clipboard_state_get(ev->win);
897 DBG("[CLIPBOARD]:zone's state zone=0x%x, state=%d.", zone, state);
900 if (sd->clipboard_state == state) return;
901 sd->clipboard_state = state;
903 if (state == ECORE_X_ILLUME_CLIPBOARD_STATE_OFF)
905 // Tizen Only - SIP regions for virtual keypad and clipboard are the same in Tizen
906 edje_object_signal_emit(ELM_WIDGET_DATA(sd)->resize_obj, "elm,state,clipboard,off", "elm");
907 evas_object_size_hint_min_set(sd->clipboard, -1, 0);
908 evas_object_size_hint_max_set(sd->clipboard, -1, 0);
909 // Tizen Only - SIP regions for virtual keypad and clipboard are the same in Tizen
910 if (sd->vkb_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF)
911 elm_widget_display_mode_set(obj, EVAS_DISPLAY_MODE_NONE);
912 evas_object_smart_callback_call(obj, SIG_CLIPBOARD_STATE_OFF, NULL);
914 else if(state == ECORE_X_ILLUME_CLIPBOARD_STATE_ON)
916 elm_widget_display_mode_set(obj, EVAS_DISPLAY_MODE_COMPRESS);
917 _autoscroll_objects_update(obj);
918 // Tizen Only - SIP regions for virtual keypad and clipboard are the same in Tizen
919 edje_object_signal_emit(ELM_WIDGET_DATA(sd)->resize_obj, "elm,state,clipboard,on", "elm");
920 evas_object_smart_callback_call(obj, SIG_CLIPBOARD_STATE_ON, NULL);
925 _on_prop_change(void *data,
929 Ecore_X_Event_Window_Property *ev = event;
937 if (ev->atom == ECORE_X_ATOM_E_ILLUME_ZONE)
939 DBG("pid=%d, win=0x%x, ECORE_X_ATOM_E_ILLUME_ZONE.\n", pid, ev->win);
940 Conformant_Part_Type part_type;
942 part_type = (ELM_CONFORMANT_INDICATOR_PART |
943 ELM_CONFORMANT_SOFTKEY_PART |
944 ELM_CONFORMANT_VIRTUAL_KEYPAD_PART |
945 ELM_CONFORMANT_CLIPBOARD_PART);
947 _conformant_part_sizing_eval(data, part_type);
949 else if (ev->atom == ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY)
951 DBG("pid=%d, win=0x%x, ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY.", pid, ev->win);
952 _conformant_part_sizing_eval(data, ELM_CONFORMANT_INDICATOR_PART);
954 else if (ev->atom == ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY)
956 DBG("pid=%d, win=0x%x, ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY.", pid, ev->win);
957 _conformant_part_sizing_eval(data, ELM_CONFORMANT_SOFTKEY_PART);
959 else if (ev->atom == ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY)
961 DBG("[KEYPAD]:pid=%d, win=0x%x, ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY.", pid, ev->win);
962 _conformant_part_sizing_eval(data, ELM_CONFORMANT_VIRTUAL_KEYPAD_PART);
964 else if (ev->atom == ECORE_X_ATOM_E_ILLUME_CLIPBOARD_GEOMETRY)
966 DBG("pid=%d, win=0x%x, ECORE_X_ATOM_E_ILLUME_CLIPBOARD_GEOMETRY.", pid, ev->win);
967 _conformant_part_sizing_eval(data, ELM_CONFORMANT_CLIPBOARD_PART);
969 else if (ev->atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE)
971 DBG("[KEYPAD]:pid=%d, win=0x%x, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE.", pid, ev->win);
972 _virtualkeypad_state_change(data, ev);
974 else if (ev->atom == ECORE_X_ATOM_E_ILLUME_CLIPBOARD_STATE)
976 DBG("pid=%d, win=0x%x, ECORE_X_ATOM_E_ILLUME_CLIPBOARD_STATE.", pid, ev->win);
977 _clipboard_state_change(data, ev);
980 return ECORE_CALLBACK_PASS_ON;
986 _elm_conformant_smart_add(Evas_Object *obj)
988 EVAS_SMART_DATA_ALLOC(obj, Elm_Conformant_Smart_Data);
990 ELM_WIDGET_CLASS(_elm_conformant_parent_sc)->base.add(obj);
992 elm_widget_can_focus_set(obj, EINA_FALSE);
994 elm_layout_theme_set(obj, "conformant", "base", elm_widget_style_get(obj));
996 _conformant_parts_swallow(obj);
998 evas_object_event_callback_add
999 (obj, EVAS_CALLBACK_RESIZE, _move_resize_cb, obj);
1000 evas_object_event_callback_add
1001 (obj, EVAS_CALLBACK_MOVE, _move_resize_cb, obj);
1003 elm_layout_sizing_eval(obj);
1007 _elm_conformant_smart_del(Evas_Object *obj)
1010 ELM_CONFORMANT_DATA_GET(obj, sd);
1012 #ifdef HAVE_ELEMENTARY_X
1013 if (sd->prop_hdl) ecore_event_handler_del(sd->prop_hdl);
1016 if (sd->show_region_job) ecore_job_del(sd->show_region_job);
1017 if (sd->port_indi_timer) ecore_timer_del(sd->port_indi_timer);
1018 if (sd->land_indi_timer) ecore_timer_del(sd->land_indi_timer);
1019 if (sd->portrait_indicator)
1020 evas_object_del(sd->portrait_indicator);
1021 if (sd->landscape_indicator)
1022 evas_object_del(sd->landscape_indicator);
1023 top = elm_widget_top_get(obj);
1024 evas_object_data_set(top, "\377 elm,conformant", NULL);
1026 ELM_WIDGET_CLASS(_elm_conformant_parent_sc)->base.del(obj);
1030 _elm_conformant_smart_parent_set(Evas_Object *obj,
1031 Evas_Object *parent)
1033 #ifdef HAVE_ELEMENTARY_X
1034 Evas_Object *top = elm_widget_top_get(parent);
1035 Ecore_X_Window xwin = elm_win_xwindow_get(parent);
1037 if ((xwin) && (!elm_win_inlined_image_object_get(top)))
1039 ELM_CONFORMANT_DATA_GET(obj, sd);
1041 sd->prop_hdl = ecore_event_handler_add
1042 (ECORE_X_EVENT_WINDOW_PROPERTY, _on_prop_change, obj);
1043 sd->vkb_state = ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF;
1044 sd->clipboard_state = ECORE_X_ILLUME_CLIPBOARD_STATE_OFF;
1046 // FIXME: get kbd region prop
1051 _elm_conformant_smart_set_user(Elm_Conformant_Smart_Class *sc)
1053 ELM_WIDGET_CLASS(sc)->base.add = _elm_conformant_smart_add;
1054 ELM_WIDGET_CLASS(sc)->base.del = _elm_conformant_smart_del;
1056 ELM_WIDGET_CLASS(sc)->parent_set = _elm_conformant_smart_parent_set;
1057 ELM_WIDGET_CLASS(sc)->theme = _elm_conformant_smart_theme;
1059 ELM_LAYOUT_CLASS(sc)->content_aliases = _content_aliases;
1062 EAPI const Elm_Conformant_Smart_Class *
1063 elm_conformant_smart_class_get(void)
1065 static Elm_Conformant_Smart_Class _sc =
1066 ELM_CONFORMANT_SMART_CLASS_INIT_NAME_VERSION(ELM_CONFORMANT_SMART_NAME);
1067 static const Elm_Conformant_Smart_Class *class = NULL;
1068 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
1073 _elm_conformant_smart_set(&_sc);
1074 esc->callbacks = _smart_callbacks;
1081 elm_conformant_add(Evas_Object *parent)
1086 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1088 obj = elm_widget_add(_elm_conformant_smart_class_new(), parent);
1089 if (!obj) return NULL;
1091 if (!elm_widget_sub_object_add(parent, obj))
1092 ERR("could not add %p as sub object of %p", obj, parent);
1094 ELM_CONFORMANT_DATA_GET(obj, sd);
1096 top = elm_widget_top_get(obj);
1097 _on_indicator_mode_changed(obj, top, NULL);
1098 _on_rotation_changed(obj, top, NULL);
1100 sd->indmode = elm_win_indicator_mode_get(top);
1101 sd->ind_o_mode = elm_win_indicator_opacity_get(top);
1102 sd->rot = elm_win_rotation_get(top);
1103 evas_object_data_set(top, "\377 elm,conformant", obj);
1105 evas_object_smart_callback_add
1106 (top, "indicator,prop,changed", _on_indicator_mode_changed, obj);
1107 evas_object_smart_callback_add
1108 (top, "rotation,changed", _on_rotation_changed, obj);