win - improve window engine choosing code to be simpler and support display
[platform/upstream/elementary.git] / src / lib / elm_win.c
1 #ifdef HAVE_CONFIG_H
2 # include "elementary_config.h"
3 #endif
4
5 #include <Elementary.h>
6 #include <Elementary_Cursor.h>
7
8 #include "elm_priv.h"
9 #include "elm_widget_menu.h"
10
11 EAPI Eo_Op ELM_OBJ_WIN_BASE_ID = EO_NOOP;
12
13 #define MY_CLASS ELM_OBJ_WIN_CLASS
14
15 #define MY_CLASS_NAME "Elm_Win"
16 #define MY_CLASS_NAME_LEGACY "elm_win"
17
18 static const Elm_Win_Trap *trap = NULL;
19
20 #define TRAP(sd, name, ...)                                             \
21   do                                                                    \
22     {                                                                   \
23        if ((!trap) || (!trap->name) ||                                  \
24            ((trap->name) &&                                             \
25             (trap->name(sd->trap_data, sd->obj, ## __VA_ARGS__)))) \
26          ecore_evas_##name(sd->ee, ##__VA_ARGS__);                      \
27     }                                                                   \
28   while (0)
29
30 #define ELM_WIN_DATA_GET(o, sd) \
31   Elm_Win_Smart_Data * sd = eo_data_scope_get(o, MY_CLASS)
32
33 #define ELM_WIN_DATA_GET_OR_RETURN(o, ptr)           \
34   ELM_WIN_DATA_GET(o, ptr);                          \
35   if (!ptr)                                          \
36     {                                                \
37        CRI("No widget data for object %p (%s)", \
38                 o, evas_object_type_get(o));         \
39        return;                                       \
40     }
41
42 #define ELM_WIN_DATA_GET_OR_RETURN_VAL(o, ptr, val)  \
43   ELM_WIN_DATA_GET(o, ptr);                          \
44   if (!ptr)                                          \
45     {                                                \
46        CRI("No widget data for object %p (%s)", \
47                 o, evas_object_type_get(o));         \
48        return val;                                   \
49     }
50
51 #define ELM_WIN_CHECK(obj)                                             \
52   if (!obj || !eo_isa(obj, MY_CLASS)) \
53     return
54
55 #define ENGINE_GET() (_elm_preferred_engine ? _elm_preferred_engine : (_elm_config->engine ? _elm_config->engine : ""))
56 #define ENGINE_COMPARE(name) (!strcmp(ENGINE_GET(), name))
57
58 typedef struct _Elm_Win_Smart_Data Elm_Win_Smart_Data;
59
60 struct _Elm_Win_Smart_Data
61 {
62    Ecore_Evas           *ee;
63    Evas                 *evas;
64    Evas_Object          *parent; /* parent *window* object*/
65    Evas_Object          *img_obj, *frame_obj;
66    Evas_Object          *client_obj; /* rect representing the client */
67    Evas_Object          *spacer_obj;
68    Eo                   *layout;
69    Eo                   *box;
70    Evas_Object          *obj; /* The object itself */
71 #ifdef HAVE_ELEMENTARY_X
72    struct
73    {
74       Ecore_X_Window       xwin;
75       Ecore_Event_Handler *client_message_handler;
76       Ecore_Event_Handler *property_handler;
77    } x;
78 #endif
79 #ifdef HAVE_ELEMENTARY_WAYLAND
80    struct
81    {
82       Ecore_Wl_Window *win;
83    } wl;
84 #endif
85
86    Ecore_Job                     *deferred_resize_job;
87    Ecore_Job                     *deferred_child_eval_job;
88
89    Elm_Win_Type                   type;
90    Elm_Win_Keyboard_Mode          kbdmode;
91    Elm_Win_Indicator_Mode         indmode;
92    Elm_Win_Indicator_Opacity_Mode ind_o_mode;
93    struct
94    {
95       const char  *info;
96       Ecore_Timer *timer;
97       int          repeat_count;
98       int          shot_counter;
99    } shot;
100    int                            resize_location;
101    int                           *autodel_clear, rot;
102    struct
103    {
104       int x, y;
105    } screen;
106    struct
107    {
108       Ecore_Evas  *ee;
109       Evas        *evas;
110       Evas_Object *obj, *hot_obj;
111       int          hot_x, hot_y;
112    } pointer;
113    struct
114    {
115       Evas_Object *fobj; /* focus highlight edje object */
116
117       struct
118       {
119          Evas_Object *target;
120          Eina_Bool    visible : 1;
121          Eina_Bool    in_theme: 1; /**< focus highlight is handled by theme.
122                                      this is set true if edc data item "focus_highlight" is set to "on" during focus in callback. */
123       } cur, prev;
124
125       const char  *style;
126       Ecore_Job   *reconf_job;
127
128       Eina_Bool    enabled : 1;
129       Eina_Bool    theme_changed : 1; /* set true when the focus theme is changed */
130       Eina_Bool    animate : 1; /* set true when the focus highlight animate is enabled */
131       Eina_Bool    animate_supported : 1; /* set true when the focus highlight animate is supported by theme */
132       Eina_Bool    geometry_changed : 1;
133    } focus_highlight;
134
135    Evas_Object *icon;
136    const char  *title;
137    const char  *icon_name;
138    const char  *role;
139
140    Evas_Object *main_menu;
141
142    struct
143    {
144       const char  *name;
145       const char **available_list;
146       unsigned int count;
147    } profile;
148    struct
149    {
150       int          preferred_rot; /* indicates preferred rotation value, -1 means invalid. */
151       int         *rots; /* indicates available rotations */
152       unsigned int count; /* number of elements in available rotations */
153       Eina_Bool    wm_supported : 1; /* set true when the window manager support window rotation */
154       Eina_Bool    use : 1; /* set ture when application use window manager rotation. */
155    } wm_rot;
156
157    void *trap_data;
158
159    double       aspect;
160    int          size_base_w, size_base_h;
161    int          size_step_w, size_step_h;
162    int          norender;
163    Eina_Bool    urgent : 1;
164    Eina_Bool    modal : 1;
165    Eina_Bool    demand_attention : 1;
166    Eina_Bool    autodel : 1;
167    Eina_Bool    constrain : 1;
168    Eina_Bool    resizing : 1;
169    Eina_Bool    iconified : 1;
170    Eina_Bool    withdrawn : 1;
171    Eina_Bool    sticky : 1;
172    Eina_Bool    fullscreen : 1;
173    Eina_Bool    maximized : 1;
174    Eina_Bool    skip_focus : 1;
175    Eina_Bool    floating : 1;
176 };
177
178 static const char SIG_DELETE_REQUEST[] = "delete,request";
179 static const char SIG_FOCUS_OUT[] = "focus,out"; // deprecated. use "focused" instead.
180 static const char SIG_FOCUS_IN[] = "focus,in"; // deprecated. use "unfocused" instead.
181 static const char SIG_MOVED[] = "moved";
182 static const char SIG_WITHDRAWN[] = "withdrawn";
183 static const char SIG_ICONIFIED[] = "iconified";
184 static const char SIG_NORMAL[] = "normal";
185 static const char SIG_STICK[] = "stick";
186 static const char SIG_UNSTICK[] = "unstick";
187 static const char SIG_FULLSCREEN[] = "fullscreen";
188 static const char SIG_UNFULLSCREEN[] = "unfullscreen";
189 static const char SIG_MAXIMIZED[] = "maximized";
190 static const char SIG_UNMAXIMIZED[] = "unmaximized";
191 static const char SIG_IOERR[] = "ioerr";
192 static const char SIG_INDICATOR_PROP_CHANGED[] = "indicator,prop,changed";
193 static const char SIG_ROTATION_CHANGED[] = "rotation,changed";
194 static const char SIG_PROFILE_CHANGED[] = "profile,changed";
195 static const char SIG_FOCUSED[] = "focused";
196 static const char SIG_UNFOCUSED[] = "unfocused";
197 static const char SIG_WM_ROTATION_CHANGED[] = "wm,rotation,changed";
198
199 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
200    {SIG_DELETE_REQUEST, ""},
201    {SIG_FOCUS_OUT, ""},
202    {SIG_FOCUS_IN, ""},
203    {SIG_MOVED, ""},
204    {SIG_WITHDRAWN, ""},
205    {SIG_ICONIFIED, ""},
206    {SIG_NORMAL, ""},
207    {SIG_STICK, ""},
208    {SIG_UNSTICK, ""},
209    {SIG_FULLSCREEN, ""},
210    {SIG_UNFULLSCREEN, ""},
211    {SIG_MAXIMIZED, ""},
212    {SIG_UNMAXIMIZED, ""},
213    {SIG_IOERR, ""},
214    {SIG_INDICATOR_PROP_CHANGED, ""},
215    {SIG_ROTATION_CHANGED, ""},
216    {SIG_PROFILE_CHANGED, ""},
217    {SIG_FOCUSED, ""},
218    {SIG_UNFOCUSED, ""},
219    {SIG_WM_ROTATION_CHANGED, ""},
220    {NULL, NULL}
221 };
222
223 Eina_List *_elm_win_list = NULL;
224 int _elm_win_deferred_free = 0;
225
226 static int _elm_win_count = 0;
227
228 static Eina_Bool _elm_win_auto_throttled = EINA_FALSE;
229
230 static Ecore_Job *_elm_win_state_eval_job = NULL;
231
232 static void
233 _elm_win_on_resize_obj_changed_size_hints(void *data,
234                                           Evas *e,
235                                           Evas_Object *obj,
236                                           void *event_info);
237 static void
238 _elm_win_img_callbacks_del(Evas_Object *obj, Evas_Object *imgobj);
239
240 #ifdef HAVE_ELEMENTARY_X
241 static void _elm_win_xwin_update(Elm_Win_Smart_Data *sd);
242 #endif
243
244 EAPI double _elm_startup_time = 0;
245
246 static void
247 _elm_win_first_frame_do(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
248 {
249    double end = ecore_time_unix_get();
250    char *first = data;
251
252    switch (*first)
253      {
254       case 'A': abort();
255       case 'E':
256       case 'D': exit(-1);
257       case 'T': fprintf(stderr, "Startup time: '%f' - '%f' = '%f' sec\n", end, _elm_startup_time, end - _elm_startup_time);
258                 break;
259      }
260
261    evas_event_callback_del_full(e, EVAS_CALLBACK_RENDER_POST, _elm_win_first_frame_do, data);
262 }
263
264 static void
265 _elm_win_state_eval(void *data EINA_UNUSED)
266 {
267    Eina_List *l;
268    Evas_Object *obj;
269    int _elm_win_count_shown = 0;
270    int _elm_win_count_iconified = 0;
271    int _elm_win_count_withdrawn = 0;
272
273    _elm_win_state_eval_job = NULL;
274
275    if (_elm_config->auto_norender_withdrawn)
276      {
277         EINA_LIST_FOREACH(_elm_win_list, l, obj)
278           {
279              if ((elm_win_withdrawn_get(obj)) ||
280                  ((elm_win_iconified_get(obj) &&
281                    (_elm_config->auto_norender_iconified_same_as_withdrawn))))
282                {
283                   if (!evas_object_data_get(obj, "__win_auto_norender"))
284                     {
285                        Evas *evas = evas_object_evas_get(obj);
286
287                        elm_win_norender_push(obj);
288                        evas_object_data_set(obj, "__win_auto_norender", obj);
289
290                        if (_elm_config->auto_flush_withdrawn)
291                          {
292                             edje_file_cache_flush();
293                             edje_collection_cache_flush();
294                             evas_image_cache_flush(evas);
295                             evas_font_cache_flush(evas);
296                          }
297                        if (_elm_config->auto_dump_withdrawn)
298                          {
299                             evas_render_dump(evas);
300                          }
301                     }
302                }
303              else
304                {
305                   if (evas_object_data_get(obj, "__win_auto_norender"))
306                     {
307                        elm_win_norender_pop(obj);
308                        evas_object_data_del(obj, "__win_auto_norender");
309                     }
310                }
311           }
312      }
313    if (((_elm_config->auto_throttle) &&
314         (elm_policy_get(ELM_POLICY_THROTTLE) != ELM_POLICY_THROTTLE_NEVER)) ||
315         (elm_policy_get(ELM_POLICY_THROTTLE) == ELM_POLICY_THROTTLE_HIDDEN_ALWAYS))
316      {
317         if (_elm_win_count == 0)
318           {
319              if (_elm_win_auto_throttled)
320                {
321                   ecore_throttle_adjust(-_elm_config->auto_throttle_amount);
322                   _elm_win_auto_throttled = EINA_FALSE;
323                }
324           }
325         else
326           {
327              EINA_LIST_FOREACH(_elm_win_list, l, obj)
328                {
329                   if (elm_win_withdrawn_get(obj))
330                     _elm_win_count_withdrawn++;
331                   else if (elm_win_iconified_get(obj))
332                     _elm_win_count_iconified++;
333                   else if (evas_object_visible_get(obj))
334                     _elm_win_count_shown++;
335                }
336              if (_elm_win_count_shown <= 0)
337                {
338                   if (!_elm_win_auto_throttled)
339                     {
340                        ecore_throttle_adjust(_elm_config->auto_throttle_amount);
341                        _elm_win_auto_throttled = EINA_TRUE;
342                     }
343                }
344              else
345                {
346                   if (_elm_win_auto_throttled)
347                     {
348                        ecore_throttle_adjust(-_elm_config->auto_throttle_amount);
349                        _elm_win_auto_throttled = EINA_FALSE;
350                     }
351                }
352           }
353      }
354 }
355
356 static void
357 _elm_win_state_eval_queue(void)
358 {
359    ecore_job_del(_elm_win_state_eval_job);
360    _elm_win_state_eval_job = ecore_job_add(_elm_win_state_eval, NULL);
361 }
362
363 // example shot spec (wait 0.1 sec then save as my-window.png):
364 // ELM_ENGINE="shot:delay=0.1:file=my-window.png"
365
366 static double
367 _shot_delay_get(Elm_Win_Smart_Data *sd)
368 {
369    char *p, *pd;
370    char *d = strdup(sd->shot.info);
371
372    if (!d) return 0.5;
373    for (p = (char *)sd->shot.info; *p; p++)
374      {
375         if (!strncmp(p, "delay=", 6))
376           {
377              double v;
378
379              for (pd = d, p += 6; (*p) && (*p != ':'); p++, pd++)
380                {
381                   *pd = *p;
382                }
383              *pd = 0;
384              v = _elm_atof(d);
385              free(d);
386              return v;
387           }
388      }
389    free(d);
390
391    return 0.5;
392 }
393
394 static char *
395 _shot_file_get(Elm_Win_Smart_Data *sd)
396 {
397    char *p;
398    char *tmp = strdup(sd->shot.info);
399    char *repname = NULL;
400
401    if (!tmp) return NULL;
402
403    for (p = (char *)sd->shot.info; *p; p++)
404      {
405         if (!strncmp(p, "file=", 5))
406           {
407              strcpy(tmp, p + 5);
408              if (!sd->shot.repeat_count) return tmp;
409              else
410                {
411                   char *dotptr = strrchr(tmp, '.');
412                   if (dotptr)
413                     {
414                        size_t size = sizeof(char) * (strlen(tmp) + 16);
415                        repname = malloc(size);
416                        strncpy(repname, tmp, dotptr - tmp);
417                        snprintf(repname + (dotptr - tmp), size -
418                                 (dotptr - tmp), "%03i",
419                                 sd->shot.shot_counter + 1);
420                        strcat(repname, dotptr);
421                        free(tmp);
422                        return repname;
423                     }
424                }
425           }
426      }
427    free(tmp);
428    if (!sd->shot.repeat_count) return strdup("out.png");
429
430    repname = malloc(sizeof(char) * 24);
431    snprintf(repname, sizeof(char) * 24, "out%03i.png",
432             sd->shot.shot_counter + 1);
433
434    return repname;
435 }
436
437 static int
438 _shot_repeat_count_get(Elm_Win_Smart_Data *sd)
439 {
440    char *p, *pd;
441    char *d = strdup(sd->shot.info);
442
443    if (!d) return 0;
444    for (p = (char *)sd->shot.info; *p; p++)
445      {
446         if (!strncmp(p, "repeat=", 7))
447           {
448              int v;
449
450              for (pd = d, p += 7; (*p) && (*p != ':'); p++, pd++)
451                {
452                   *pd = *p;
453                }
454              *pd = 0;
455              v = atoi(d);
456              if (v < 0) v = 0;
457              if (v > 1000) v = 999;
458              free(d);
459              return v;
460           }
461      }
462    free(d);
463
464    return 0;
465 }
466
467 static char *
468 _shot_key_get(Elm_Win_Smart_Data *sd EINA_UNUSED)
469 {
470    return NULL;
471 }
472
473 static char *
474 _shot_flags_get(Elm_Win_Smart_Data *sd EINA_UNUSED)
475 {
476    return NULL;
477 }
478
479 static void
480 _shot_do(Elm_Win_Smart_Data *sd)
481 {
482    Ecore_Evas *ee;
483    Evas_Object *o;
484    unsigned int *pixels;
485    int w, h;
486    char *file, *key, *flags;
487
488    ecore_evas_manual_render(sd->ee);
489    pixels = (void *)ecore_evas_buffer_pixels_get(sd->ee);
490    if (!pixels) return;
491
492    ecore_evas_geometry_get(sd->ee, NULL, NULL, &w, &h);
493    if ((w < 1) || (h < 1)) return;
494
495    file = _shot_file_get(sd);
496    if (!file) return;
497
498    key = _shot_key_get(sd);
499    flags = _shot_flags_get(sd);
500    ee = ecore_evas_buffer_new(1, 1);
501    o = evas_object_image_add(ecore_evas_get(ee));
502    evas_object_image_alpha_set(o, ecore_evas_alpha_get(sd->ee));
503    evas_object_image_size_set(o, w, h);
504    evas_object_image_data_set(o, pixels);
505    if (!evas_object_image_save(o, file, key, flags))
506      {
507         ERR("Cannot save window to '%s' (key '%s', flags '%s')",
508             file, key, flags);
509      }
510    free(file);
511    free(key);
512    free(flags);
513    ecore_evas_free(ee);
514    if (sd->shot.repeat_count) sd->shot.shot_counter++;
515 }
516
517 static Eina_Bool
518 _shot_delay(void *data)
519 {
520    ELM_WIN_DATA_GET(data, sd);
521
522    _shot_do(sd);
523    if (sd->shot.repeat_count)
524      {
525         int remainshot = (sd->shot.repeat_count - sd->shot.shot_counter);
526         if (remainshot > 0) return EINA_TRUE;
527      }
528    sd->shot.timer = NULL;
529    elm_exit();
530
531    return EINA_FALSE;
532 }
533
534 static void
535 _shot_init(Elm_Win_Smart_Data *sd)
536 {
537    if (!sd->shot.info) return;
538
539    sd->shot.repeat_count = _shot_repeat_count_get(sd);
540    sd->shot.shot_counter = 0;
541 }
542
543 static void
544 _shot_handle(Elm_Win_Smart_Data *sd)
545 {
546    if (!sd->shot.info) return;
547
548    if (!sd->shot.timer)
549      sd->shot.timer = ecore_timer_add(_shot_delay_get(sd), _shot_delay,
550                                       sd->obj);
551 }
552
553 /* elm-win specific associate, does the trap while ecore_evas_object_associate()
554  * does not.
555  */
556 static Elm_Win_Smart_Data *
557 _elm_win_associate_get(const Ecore_Evas *ee)
558 {
559    Evas_Object *obj = ecore_evas_data_get(ee, "elm_win");
560    if (!obj) return NULL;
561    ELM_WIN_DATA_GET(obj, sd);
562    return sd;
563 }
564
565 /* Interceptors Callbacks */
566 static void
567 _elm_win_obj_intercept_raise(void *data, Evas_Object *obj EINA_UNUSED)
568 {
569    ELM_WIN_DATA_GET(data, sd);
570    TRAP(sd, raise);
571 }
572
573 static void
574 _elm_win_obj_intercept_lower(void *data, Evas_Object *obj EINA_UNUSED)
575 {
576    ELM_WIN_DATA_GET(data, sd);
577    TRAP(sd, lower);
578 }
579
580 static void
581 _elm_win_obj_intercept_stack_above(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, Evas_Object *above EINA_UNUSED)
582 {
583    INF("TODO: %s", __FUNCTION__);
584 }
585
586 static void
587 _elm_win_obj_intercept_stack_below(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, Evas_Object *below EINA_UNUSED)
588 {
589    INF("TODO: %s", __FUNCTION__);
590 }
591
592 static void
593 _elm_win_obj_intercept_layer_set(void *data, Evas_Object *obj EINA_UNUSED, int l)
594 {
595    ELM_WIN_DATA_GET(data, sd);
596    TRAP(sd, layer_set, l);
597 }
598
599 /* Event Callbacks */
600
601 static void
602 _elm_win_obj_callback_changed_size_hints(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
603 {
604    ELM_WIN_DATA_GET(data, sd);
605    Evas_Coord w, h;
606
607    evas_object_size_hint_min_get(obj, &w, &h);
608    TRAP(sd, size_min_set, w, h);
609
610    evas_object_size_hint_max_get(obj, &w, &h);
611    if (w < 1) w = -1;
612    if (h < 1) h = -1;
613    TRAP(sd, size_max_set, w, h);
614 }
615 /* end of elm-win specific associate */
616
617 static void
618 _elm_win_move(Ecore_Evas *ee)
619 {
620    Elm_Win_Smart_Data *sd = _elm_win_associate_get(ee);
621    int x, y;
622
623    if (!sd) return;
624
625    ecore_evas_geometry_get(ee, &x, &y, NULL, NULL);
626    sd->screen.x = x;
627    sd->screen.y = y;
628    evas_object_smart_callback_call(sd->obj, SIG_MOVED, NULL);
629 }
630
631 static void
632 _elm_win_resize_job(void *data)
633 {
634    ELM_WIN_DATA_GET(data, sd);
635    int w, h;
636
637    sd->deferred_resize_job = NULL;
638    ecore_evas_request_geometry_get(sd->ee, NULL, NULL, &w, &h);
639    if (sd->constrain)
640      {
641         int sw, sh;
642         ecore_evas_screen_geometry_get(sd->ee, NULL, NULL, &sw, &sh);
643         w = MIN(w, sw);
644         h = MIN(h, sh);
645      }
646
647    if (sd->frame_obj)
648      {
649         int fx, fy, fw, fh;
650
651         evas_output_framespace_get(sd->evas, &fx, &fy, &fw, &fh);
652         evas_object_move(sd->frame_obj, -fx, -fy);
653         evas_object_resize(sd->frame_obj, w + fw, h + fh);
654      }
655
656    evas_object_resize(sd->obj, w, h);
657    evas_object_resize(sd->layout, w, h);
658 }
659
660 static void
661 _elm_win_resize(Ecore_Evas *ee)
662 {
663    Elm_Win_Smart_Data *sd = _elm_win_associate_get(ee);
664    if (!sd) return;
665
666    ecore_job_del(sd->deferred_resize_job);
667    sd->deferred_resize_job = ecore_job_add(_elm_win_resize_job, sd->obj);
668 }
669
670 static void
671 _elm_win_mouse_in(Ecore_Evas *ee)
672 {
673    Elm_Win_Smart_Data *sd = _elm_win_associate_get(ee);
674    if (!sd) return;
675
676    if (sd->resizing) sd->resizing = EINA_FALSE;
677 }
678
679 static void
680 _elm_win_focus_highlight_reconfigure_job_stop(Elm_Win_Smart_Data *sd)
681 {
682    ELM_SAFE_FREE(sd->focus_highlight.reconf_job, ecore_job_del);
683 }
684
685 static void
686 _elm_win_focus_highlight_visible_set(Elm_Win_Smart_Data *sd,
687                                      Eina_Bool visible)
688 {
689    Evas_Object *fobj = sd->focus_highlight.fobj;
690    if (!fobj) return;
691
692    if (visible)
693      {
694         evas_object_show(fobj);
695         edje_object_signal_emit(fobj, "elm,action,focus,show", "elm");
696      }
697    else
698      {
699         edje_object_signal_emit(fobj, "elm,action,focus,hide", "elm");
700      }
701 }
702
703 static void
704 _elm_win_focus_highlight_anim_setup(Elm_Win_Smart_Data *sd,
705                                     Evas_Object *obj)
706 {
707    Evas_Coord tx, ty, tw, th;
708    Evas_Coord w, h, px, py, pw, ph;
709    Edje_Message_Int_Set *m;
710    Evas_Object *previous = sd->focus_highlight.prev.target;
711    Evas_Object *target = sd->focus_highlight.cur.target;
712
713    evas_object_geometry_get(sd->obj, NULL, NULL, &w, &h);
714    elm_widget_focus_highlight_geometry_get(target, &tx, &ty, &tw, &th, EINA_TRUE);
715    elm_widget_focus_highlight_geometry_get(previous, &px, &py, &pw, &ph, EINA_FALSE);
716    evas_object_move(obj, tx, ty);
717    evas_object_resize(obj, tw, th);
718    evas_object_clip_unset(obj);
719
720    m = alloca(sizeof(*m) + (sizeof(int) * 8));
721    m->count = 8;
722    m->val[0] = px - tx;
723    m->val[1] = py - ty;
724    m->val[2] = pw;
725    m->val[3] = ph;
726    m->val[4] = 0;
727    m->val[5] = 0;
728    m->val[6] = tw;
729    m->val[7] = th;
730    edje_object_message_send(obj, EDJE_MESSAGE_INT_SET, 1, m);
731 }
732
733 static void
734 _elm_win_focus_highlight_simple_setup(Elm_Win_Smart_Data *sd,
735                                       Evas_Object *obj)
736 {
737    Evas_Object *clip, *target = sd->focus_highlight.cur.target;
738    Evas_Coord x, y, w, h;
739
740    clip = evas_object_clip_get(target);
741    elm_widget_focus_highlight_geometry_get(target, &x, &y, &w, &h, EINA_TRUE);
742
743    evas_object_move(obj, x, y);
744    evas_object_resize(obj, w, h);
745    if (clip) evas_object_clip_set(obj, clip);
746 }
747
748 static void
749 _elm_win_focus_highlight_reconfigure_job(void *data)
750 {
751    ELM_WIN_DATA_GET(data, sd);
752    Evas_Object *target = sd->focus_highlight.cur.target;
753    Evas_Object *previous = sd->focus_highlight.prev.target;
754    Evas_Object *fobj = sd->focus_highlight.fobj;
755    Eina_Bool visible_changed;
756    Eina_Bool common_visible;
757    const char *sig = NULL;
758    const char *focus_style_target = NULL;
759    const char *focus_style_previous = NULL;
760
761    _elm_win_focus_highlight_reconfigure_job_stop(sd);
762
763    visible_changed = (sd->focus_highlight.cur.visible !=
764                       sd->focus_highlight.prev.visible);
765
766    if ((target == previous) && (!visible_changed) &&
767        (!sd->focus_highlight.geometry_changed) &&
768        (!sd->focus_highlight.theme_changed))
769      return;
770
771    if ((previous) && (sd->focus_highlight.prev.in_theme))
772      elm_widget_signal_emit
773        (previous, "elm,action,focus_highlight,hide", "elm");
774
775    if (!target)
776      common_visible = EINA_FALSE;
777    else if (sd->focus_highlight.cur.in_theme)
778      {
779         common_visible = EINA_FALSE;
780         if (sd->focus_highlight.cur.visible)
781           sig = "elm,action,focus_highlight,show";
782         else
783           sig = "elm,action,focus_highlight,hide";
784      }
785    else
786      common_visible = sd->focus_highlight.cur.visible;
787
788    if (sig)
789      elm_widget_signal_emit(target, sig, "elm");
790
791    if ((!target) || (!common_visible) || (sd->focus_highlight.cur.in_theme))
792      goto the_end;
793
794    if (previous)
795      focus_style_previous = elm_widget_focus_highlight_style_get(previous);
796    focus_style_target = elm_widget_focus_highlight_style_get(target);
797
798    if (sd->focus_highlight.theme_changed ||
799        (focus_style_target != focus_style_previous))
800      {
801         const char *str;
802
803         if (focus_style_target)
804           str = focus_style_target;
805         else if (sd->focus_highlight.style)
806           str = sd->focus_highlight.style;
807         else
808           str = "default";
809
810         elm_widget_theme_object_set
811           (sd->obj, fobj, "focus_highlight", "top", str);
812         sd->focus_highlight.theme_changed = EINA_FALSE;
813
814         if (sd->focus_highlight.animate)
815           {
816              str = edje_object_data_get(sd->focus_highlight.fobj, "animate");
817              sd->focus_highlight.animate_supported = ((str) && (!strcmp(str, "on")));
818           }
819         else
820           sd->focus_highlight.animate_supported = EINA_FALSE;
821      }
822
823    if ((sd->focus_highlight.animate_supported) && (previous) &&
824        (!sd->focus_highlight.prev.in_theme))
825      _elm_win_focus_highlight_anim_setup(sd, fobj);
826    else
827      _elm_win_focus_highlight_simple_setup(sd, fobj);
828    evas_object_raise(fobj);
829
830 the_end:
831    _elm_win_focus_highlight_visible_set(sd, common_visible);
832    sd->focus_highlight.geometry_changed = EINA_FALSE;
833    sd->focus_highlight.prev = sd->focus_highlight.cur;
834 }
835
836 static void
837 _elm_win_focus_highlight_reconfigure_job_start(Elm_Win_Smart_Data *sd)
838 {
839    ecore_job_del(sd->focus_highlight.reconf_job);
840
841    sd->focus_highlight.reconf_job = ecore_job_add(
842        _elm_win_focus_highlight_reconfigure_job, sd->obj);
843 }
844
845 static void
846 _elm_win_focus_in(Ecore_Evas *ee)
847 {
848    Elm_Win_Smart_Data *sd = _elm_win_associate_get(ee);
849    Evas_Object *obj;
850    unsigned int order = 0;
851
852    if (!sd) return;
853
854    obj = sd->obj;
855
856    _elm_widget_top_win_focused_set(obj, EINA_TRUE);
857    if (!elm_widget_focus_order_get(obj)
858        || (obj == elm_widget_newest_focus_order_get(obj, &order, EINA_TRUE)))
859      {
860         elm_widget_focus_steal(obj);
861      }
862    else
863      elm_widget_focus_restore(obj);
864    evas_object_smart_callback_call(obj, SIG_FOCUS_IN, NULL);
865    evas_object_smart_callback_call(obj, SIG_FOCUSED, NULL);
866    sd->focus_highlight.cur.visible = EINA_TRUE;
867    _elm_win_focus_highlight_reconfigure_job_start(sd);
868    if (sd->frame_obj)
869      {
870         edje_object_signal_emit(sd->frame_obj, "elm,action,focus", "elm");
871      }
872
873    /* do nothing */
874    /* else if (sd->img_obj) */
875    /*   { */
876    /*   } */
877 }
878
879 static void
880 _elm_win_focus_out(Ecore_Evas *ee)
881 {
882    Elm_Win_Smart_Data *sd = _elm_win_associate_get(ee);
883    Evas_Object *obj;
884
885    if (!sd) return;
886
887    obj = sd->obj;
888
889    elm_object_focus_set(obj, EINA_FALSE);
890    _elm_widget_top_win_focused_set(obj, EINA_FALSE);
891    evas_object_smart_callback_call(obj, SIG_FOCUS_OUT, NULL);
892    evas_object_smart_callback_call(obj, SIG_UNFOCUSED, NULL);
893    sd->focus_highlight.cur.visible = EINA_FALSE;
894    _elm_win_focus_highlight_reconfigure_job_start(sd);
895    if (sd->frame_obj)
896      {
897         edje_object_signal_emit(sd->frame_obj, "elm,action,unfocus", "elm");
898      }
899
900    /* access */
901    _elm_access_object_highlight_disable(evas_object_evas_get(obj));
902
903    /* do nothing */
904    /* if (sd->img_obj) */
905    /*   { */
906    /*   } */
907 }
908
909 static void
910 _elm_win_available_profiles_del(Elm_Win_Smart_Data *sd)
911 {
912    if (!sd->profile.available_list) return;
913
914    unsigned int i;
915    for (i = 0; i < sd->profile.count; i++)
916      ELM_SAFE_FREE(sd->profile.available_list[i], eina_stringshare_del);
917    sd->profile.count = 0;
918    ELM_SAFE_FREE(sd->profile.available_list, free);
919 }
920
921 static void
922 _elm_win_profile_del(Elm_Win_Smart_Data *sd)
923 {
924    ELM_SAFE_FREE(sd->profile.name, eina_stringshare_del);
925 }
926
927 static Eina_Bool
928 _elm_win_profile_set(Elm_Win_Smart_Data *sd, const char *profile)
929 {
930    Eina_Bool changed = EINA_FALSE;
931    if (profile)
932      {
933         if (sd->profile.name)
934           {
935              if (strcmp(sd->profile.name, profile) != 0)
936                {
937                   eina_stringshare_replace(&(sd->profile.name), profile);
938                   changed = EINA_TRUE;
939                }
940           }
941         else
942           {
943              sd->profile.name = eina_stringshare_add(profile);
944              changed = EINA_TRUE;
945           }
946      }
947    else
948      _elm_win_profile_del(sd);
949
950    return changed;
951 }
952
953 static void
954 _elm_win_profile_update(Elm_Win_Smart_Data *sd)
955 {
956    if (sd->profile.available_list)
957      {
958         Eina_Bool found = EINA_FALSE;
959         if (sd->profile.name)
960           {
961              unsigned int i;
962              for (i = 0; i < sd->profile.count; i++)
963                {
964                   if (!strcmp(sd->profile.name,
965                               sd->profile.available_list[i]))
966                     {
967                        found = EINA_TRUE;
968                        break;
969                     }
970                }
971           }
972
973         /* If current profile is not present in an available profiles,
974          * change current profile to the 1st element of an array.
975          */
976         if (!found)
977           _elm_win_profile_set(sd, sd->profile.available_list[0]);
978      }
979
980    _elm_config_profile_set(sd->profile.name);
981
982    /* update sub ee */
983    Ecore_Evas *ee2;
984    Eina_List *sub, *l = NULL;
985
986    sub = ecore_evas_sub_ecore_evas_list_get(sd->ee);
987    EINA_LIST_FOREACH(sub, l, ee2)
988      ecore_evas_window_profile_set(ee2, sd->profile.name);
989
990    evas_object_smart_callback_call(sd->obj, SIG_PROFILE_CHANGED, NULL);
991 }
992
993 static void
994 _elm_win_state_change(Ecore_Evas *ee)
995 {
996    Elm_Win_Smart_Data *sd = _elm_win_associate_get(ee);
997    Evas_Object *obj;
998    Eina_Bool ch_withdrawn = EINA_FALSE;
999    Eina_Bool ch_sticky = EINA_FALSE;
1000    Eina_Bool ch_iconified = EINA_FALSE;
1001    Eina_Bool ch_fullscreen = EINA_FALSE;
1002    Eina_Bool ch_maximized = EINA_FALSE;
1003    Eina_Bool ch_profile = EINA_FALSE;
1004    Eina_Bool ch_wm_rotation = EINA_FALSE;
1005    const char *profile;
1006
1007    if (!sd) return;
1008
1009    obj = sd->obj;
1010
1011    if (sd->withdrawn != ecore_evas_withdrawn_get(sd->ee))
1012      {
1013         sd->withdrawn = ecore_evas_withdrawn_get(sd->ee);
1014         ch_withdrawn = EINA_TRUE;
1015      }
1016    if (sd->sticky != ecore_evas_sticky_get(sd->ee))
1017      {
1018         sd->sticky = ecore_evas_sticky_get(sd->ee);
1019         ch_sticky = EINA_TRUE;
1020      }
1021    if (sd->iconified != ecore_evas_iconified_get(sd->ee))
1022      {
1023         sd->iconified = ecore_evas_iconified_get(sd->ee);
1024         ch_iconified = EINA_TRUE;
1025      }
1026    if (sd->fullscreen != ecore_evas_fullscreen_get(sd->ee))
1027      {
1028         sd->fullscreen = ecore_evas_fullscreen_get(sd->ee);
1029         ch_fullscreen = EINA_TRUE;
1030      }
1031    if (sd->maximized != ecore_evas_maximized_get(sd->ee))
1032      {
1033         sd->maximized = ecore_evas_maximized_get(sd->ee);
1034         ch_maximized = EINA_TRUE;
1035      }
1036
1037    profile = ecore_evas_window_profile_get(sd->ee);
1038    ch_profile = _elm_win_profile_set(sd, profile);
1039
1040    if (sd->wm_rot.use)
1041      {
1042         if (sd->rot != ecore_evas_rotation_get(sd->ee))
1043           {
1044              sd->rot = ecore_evas_rotation_get(sd->ee);
1045              ch_wm_rotation = EINA_TRUE;
1046           }
1047      }
1048
1049    _elm_win_state_eval_queue();
1050
1051    if ((ch_withdrawn) || (ch_iconified))
1052      {
1053         if (sd->withdrawn)
1054           evas_object_smart_callback_call(obj, SIG_WITHDRAWN, NULL);
1055         else if (sd->iconified)
1056           evas_object_smart_callback_call(obj, SIG_ICONIFIED, NULL);
1057         else
1058           evas_object_smart_callback_call(obj, SIG_NORMAL, NULL);
1059      }
1060    if (ch_sticky)
1061      {
1062         if (sd->sticky)
1063           evas_object_smart_callback_call(obj, SIG_STICK, NULL);
1064         else
1065           evas_object_smart_callback_call(obj, SIG_UNSTICK, NULL);
1066      }
1067    if (ch_fullscreen)
1068      {
1069         if (sd->fullscreen)
1070           evas_object_smart_callback_call(obj, SIG_FULLSCREEN, NULL);
1071         else
1072           evas_object_smart_callback_call(obj, SIG_UNFULLSCREEN, NULL);
1073      }
1074    if (ch_maximized)
1075      {
1076         if (sd->maximized)
1077           evas_object_smart_callback_call(obj, SIG_MAXIMIZED, NULL);
1078         else
1079           evas_object_smart_callback_call(obj, SIG_UNMAXIMIZED, NULL);
1080      }
1081    if (ch_profile)
1082      {
1083         _elm_win_profile_update(sd);
1084      }
1085    if (ch_wm_rotation)
1086      {
1087         evas_object_size_hint_min_set(obj, -1, -1);
1088         evas_object_size_hint_max_set(obj, -1, -1);
1089 #ifdef HAVE_ELEMENTARY_X
1090         _elm_win_xwin_update(sd);
1091 #endif
1092         elm_widget_orientation_set(obj, sd->rot);
1093         evas_object_smart_callback_call(obj, SIG_ROTATION_CHANGED, NULL);
1094         evas_object_smart_callback_call(obj, SIG_WM_ROTATION_CHANGED, NULL);
1095      }
1096 }
1097
1098 static void
1099 _elm_win_smart_focus_next_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
1100 {
1101    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
1102    *ret = EINA_TRUE;
1103 }
1104
1105 static void
1106 _elm_win_smart_focus_next(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
1107 {
1108    Elm_Focus_Direction dir = va_arg(*list, Elm_Focus_Direction);
1109    Evas_Object **next = va_arg(*list, Evas_Object **);
1110    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
1111    if (ret) *ret = EINA_FALSE;
1112
1113    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
1114
1115    const Eina_List *items;
1116    void *(*list_data_get)(const Eina_List *list);
1117
1118    /* Focus chain */
1119    if (wd->subobjs)
1120      {
1121         if (!(items = elm_widget_focus_custom_chain_get(obj)))
1122           {
1123              items = wd->subobjs;
1124              if (!items)
1125                return;
1126           }
1127         list_data_get = eina_list_data_get;
1128
1129         elm_widget_focus_list_next_get(obj, items, list_data_get, dir, next);
1130
1131         if (*next)
1132           {
1133              if (ret) *ret = EINA_TRUE;
1134              return;
1135           }
1136      }
1137    *next = (Evas_Object *)obj;
1138    return;
1139 }
1140
1141 static void
1142 _elm_win_smart_focus_direction_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
1143 {
1144    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
1145    *ret = EINA_TRUE;
1146 }
1147
1148 static void
1149 _elm_win_smart_focus_direction(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
1150 {
1151    const Evas_Object *base = va_arg(*list, Evas_Object *);
1152    double degree = va_arg(*list, double);
1153    Evas_Object **direction = va_arg(*list, Evas_Object **);
1154    double *weight = va_arg(*list, double *);
1155    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
1156    if (ret) *ret = EINA_FALSE;
1157    Eina_Bool int_ret = EINA_FALSE;
1158
1159    const Eina_List *items;
1160    void *(*list_data_get)(const Eina_List *list);
1161
1162    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
1163
1164    /* Focus chain */
1165    if (wd->subobjs)
1166      {
1167         if (!(items = elm_widget_focus_custom_chain_get(obj)))
1168           items = wd->subobjs;
1169
1170         list_data_get = eina_list_data_get;
1171
1172         int_ret = elm_widget_focus_list_direction_get
1173                  (obj, base, items, list_data_get, degree, direction, weight);
1174         if (ret) *ret = int_ret;
1175      }
1176 }
1177
1178 static void
1179 _elm_win_smart_on_focus(Eo *obj, void *_pd, va_list *list)
1180 {
1181    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
1182    if (ret) *ret = EINA_TRUE;
1183    Elm_Win_Smart_Data *sd = _pd;
1184    Eina_Bool int_ret = EINA_FALSE;
1185
1186    eo_do_super(obj, MY_CLASS, elm_wdg_on_focus(&int_ret));
1187    if (!int_ret) return;
1188
1189    if (sd->img_obj)
1190      evas_object_focus_set(sd->img_obj, elm_widget_focus_get(obj));
1191    else
1192      evas_object_focus_set(obj, elm_widget_focus_get(obj));
1193 }
1194
1195 static void
1196 _elm_win_smart_event(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
1197 {
1198    Evas_Object *src = va_arg(*list, Evas_Object *);
1199    Evas_Callback_Type type = va_arg(*list, Evas_Callback_Type);
1200    Evas_Event_Key_Down *ev = va_arg(*list, void *);
1201    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
1202
1203    if (ret) *ret = EINA_FALSE;
1204    (void) src;
1205
1206    if (elm_widget_disabled_get(obj)) return;
1207    if (type != EVAS_CALLBACK_KEY_DOWN) return;
1208
1209    if ((!strcmp(ev->key, "Tab")) ||
1210        (!strcmp(ev->key, "ISO_Left_Tab")))
1211      {
1212         if (evas_key_modifier_is_set(ev->modifiers, "Control") ||
1213             evas_key_modifier_is_set(ev->modifiers, "Alt"))
1214           return;
1215         if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
1216           elm_widget_focus_cycle(obj, ELM_FOCUS_PREVIOUS);
1217         else
1218           elm_widget_focus_cycle(obj, ELM_FOCUS_NEXT);
1219
1220         goto success;
1221      }
1222    else if ((!strcmp(ev->key, "Left")) ||
1223             ((!strcmp(ev->key, "KP_Left")) && (!ev->string)))
1224      {
1225         elm_widget_focus_cycle(obj, ELM_FOCUS_LEFT);
1226
1227         goto success;
1228      }
1229    else if ((!strcmp(ev->key, "Right")) ||
1230             ((!strcmp(ev->key, "KP_Right")) && (!ev->string)))
1231      {
1232         elm_widget_focus_cycle(obj, ELM_FOCUS_RIGHT);
1233
1234         goto success;
1235      }
1236    else if ((!strcmp(ev->key, "Up")) ||
1237             ((!strcmp(ev->key, "KP_Up")) && (!ev->string)))
1238      {
1239         elm_widget_focus_cycle(obj, ELM_FOCUS_UP);
1240
1241         goto success;
1242      }
1243    else if ((!strcmp(ev->key, "Down")) ||
1244             ((!strcmp(ev->key, "KP_Down")) && (!ev->string)))
1245      {
1246         elm_widget_focus_cycle(obj, ELM_FOCUS_DOWN);
1247
1248         goto success;
1249      }
1250
1251    return;
1252
1253 success:
1254    ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
1255    if (ret) *ret = EINA_TRUE;
1256 }
1257
1258 static void
1259 _deferred_ecore_evas_free(void *data)
1260 {
1261    ecore_evas_free(data);
1262    _elm_win_deferred_free--;
1263 }
1264
1265 static void
1266 _elm_win_smart_show(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
1267 {
1268    Elm_Win_Smart_Data *sd = _pd;
1269
1270    if (!evas_object_visible_get(obj))
1271      _elm_win_state_eval_queue();
1272    eo_do_super(obj, MY_CLASS, evas_obj_smart_show());
1273
1274    TRAP(sd, show);
1275
1276    if (sd->shot.info) _shot_handle(sd);
1277 }
1278
1279 static void
1280 _elm_win_smart_hide(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
1281 {
1282    Elm_Win_Smart_Data *sd = _pd;
1283
1284    if (evas_object_visible_get(obj))
1285      _elm_win_state_eval_queue();
1286    eo_do_super(obj, MY_CLASS, evas_obj_smart_hide());
1287
1288    TRAP(sd, hide);
1289
1290    if (sd->frame_obj)
1291      {
1292         evas_object_hide(sd->frame_obj);
1293      }
1294    if (sd->img_obj)
1295      {
1296         evas_object_hide(sd->img_obj);
1297      }
1298    if (sd->pointer.obj)
1299      {
1300         evas_object_hide(sd->pointer.obj);
1301         ecore_evas_hide(sd->pointer.ee);
1302      }
1303 }
1304
1305 static void
1306 _elm_win_on_parent_del(void *data,
1307                        Evas *e EINA_UNUSED,
1308                        Evas_Object *obj,
1309                        void *event_info EINA_UNUSED)
1310 {
1311    ELM_WIN_DATA_GET(data, sd);
1312
1313    if (obj == sd->parent) sd->parent = NULL;
1314 }
1315
1316 static void
1317 _elm_win_focus_target_move(void *data,
1318                            Evas *e EINA_UNUSED,
1319                            Evas_Object *obj EINA_UNUSED,
1320                            void *event_info EINA_UNUSED)
1321 {
1322    ELM_WIN_DATA_GET(data, sd);
1323
1324    sd->focus_highlight.geometry_changed = EINA_TRUE;
1325    _elm_win_focus_highlight_reconfigure_job_start(sd);
1326 }
1327
1328 static void
1329 _elm_win_focus_target_resize(void *data,
1330                              Evas *e EINA_UNUSED,
1331                              Evas_Object *obj EINA_UNUSED,
1332                              void *event_info EINA_UNUSED)
1333 {
1334    ELM_WIN_DATA_GET(data, sd);
1335
1336    sd->focus_highlight.geometry_changed = EINA_TRUE;
1337    _elm_win_focus_highlight_reconfigure_job_start(sd);
1338 }
1339
1340 static void
1341 _elm_win_focus_target_del(void *data,
1342                           Evas *e EINA_UNUSED,
1343                           Evas_Object *obj EINA_UNUSED,
1344                           void *event_info EINA_UNUSED)
1345 {
1346    ELM_WIN_DATA_GET(data, sd);
1347
1348    sd->focus_highlight.cur.target = NULL;
1349
1350    _elm_win_focus_highlight_reconfigure_job_start(sd);
1351 }
1352
1353 static Evas_Object *
1354 _elm_win_focus_target_get(Evas_Object *obj)
1355 {
1356    Evas_Object *o = obj;
1357
1358    do
1359      {
1360         if (elm_widget_is(o))
1361           {
1362              if (!elm_widget_highlight_ignore_get(o))
1363                break;
1364              o = elm_widget_parent_get(o);
1365              if (!o)
1366                o = evas_object_smart_parent_get(o);
1367           }
1368         else
1369           {
1370              o = elm_widget_parent_widget_get(o);
1371              if (!o)
1372                o = evas_object_smart_parent_get(o);
1373           }
1374      }
1375    while (o);
1376
1377    return o;
1378 }
1379
1380 static void
1381 _elm_win_focus_target_callbacks_add(Elm_Win_Smart_Data *sd)
1382 {
1383    Evas_Object *obj = sd->focus_highlight.cur.target;
1384    if (!obj) return;
1385
1386    evas_object_event_callback_add
1387      (obj, EVAS_CALLBACK_MOVE, _elm_win_focus_target_move, sd->obj);
1388    evas_object_event_callback_add
1389      (obj, EVAS_CALLBACK_RESIZE, _elm_win_focus_target_resize, sd->obj);
1390    evas_object_event_callback_add
1391      (obj, EVAS_CALLBACK_DEL, _elm_win_focus_target_del, sd->obj);
1392 }
1393
1394 static void
1395 _elm_win_focus_target_callbacks_del(Elm_Win_Smart_Data *sd)
1396 {
1397    Evas_Object *obj = sd->focus_highlight.cur.target;
1398
1399    evas_object_event_callback_del_full
1400      (obj, EVAS_CALLBACK_MOVE, _elm_win_focus_target_move, sd->obj);
1401    evas_object_event_callback_del_full
1402      (obj, EVAS_CALLBACK_RESIZE, _elm_win_focus_target_resize, sd->obj);
1403    evas_object_event_callback_del_full
1404      (obj, EVAS_CALLBACK_DEL, _elm_win_focus_target_del, sd->obj);
1405 }
1406
1407 static void
1408 _elm_win_object_focus_in(void *data,
1409                          Evas *e EINA_UNUSED,
1410                          void *event_info)
1411 {
1412    Evas_Object *obj = event_info, *target;
1413    ELM_WIN_DATA_GET(data, sd);
1414
1415    if (sd->focus_highlight.cur.target == obj)
1416      return;
1417
1418    target = _elm_win_focus_target_get(obj);
1419    sd->focus_highlight.cur.target = target;
1420    if (target && elm_widget_highlight_in_theme_get(target))
1421      sd->focus_highlight.cur.in_theme = EINA_TRUE;
1422    else
1423      _elm_win_focus_target_callbacks_add(sd);
1424
1425    _elm_win_focus_highlight_reconfigure_job_start(sd);
1426 }
1427
1428 static void
1429 _elm_win_object_focus_out(void *data,
1430                           Evas *e EINA_UNUSED,
1431                           void *event_info EINA_UNUSED)
1432 {
1433    ELM_WIN_DATA_GET(data, sd);
1434
1435    if (!sd->focus_highlight.cur.target)
1436      return;
1437
1438    if (!sd->focus_highlight.cur.in_theme)
1439      _elm_win_focus_target_callbacks_del(sd);
1440
1441    sd->focus_highlight.cur.target = NULL;
1442    sd->focus_highlight.cur.in_theme = EINA_FALSE;
1443
1444    _elm_win_focus_highlight_reconfigure_job_start(sd);
1445 }
1446
1447 static void
1448 _elm_win_focus_highlight_shutdown(Elm_Win_Smart_Data *sd)
1449 {
1450    _elm_win_focus_highlight_reconfigure_job_stop(sd);
1451    if (sd->focus_highlight.cur.target)
1452      {
1453         elm_widget_signal_emit(sd->focus_highlight.cur.target,
1454                                "elm,action,focus_highlight,hide", "elm");
1455         _elm_win_focus_target_callbacks_del(sd);
1456         sd->focus_highlight.cur.target = NULL;
1457      }
1458    ELM_SAFE_FREE(sd->focus_highlight.fobj, evas_object_del);
1459
1460    evas_event_callback_del_full
1461      (sd->evas, EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_IN,
1462      _elm_win_object_focus_in, sd->obj);
1463    evas_event_callback_del_full
1464      (sd->evas, EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_OUT,
1465      _elm_win_object_focus_out, sd->obj);
1466 }
1467
1468 static void
1469 _win_img_hide(void *data,
1470               Evas *e EINA_UNUSED,
1471               Evas_Object *obj EINA_UNUSED,
1472               void *event_info EINA_UNUSED)
1473 {
1474    elm_widget_focus_hide_handle(data);
1475 }
1476
1477 static void
1478 _win_img_mouse_up(void *data,
1479                   Evas *e EINA_UNUSED,
1480                   Evas_Object *obj EINA_UNUSED,
1481                   void *event_info)
1482 {
1483    Evas_Event_Mouse_Up *ev = event_info;
1484    if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
1485      elm_widget_focus_mouse_up_handle(data);
1486 }
1487
1488 static void
1489 _win_img_focus_in(void *data,
1490                   Evas *e EINA_UNUSED,
1491                   Evas_Object *obj EINA_UNUSED,
1492                   void *event_info EINA_UNUSED)
1493 {
1494    elm_widget_focus_steal(data);
1495 }
1496
1497 static void
1498 _win_img_focus_out(void *data,
1499                    Evas *e EINA_UNUSED,
1500                    Evas_Object *obj EINA_UNUSED,
1501                    void *event_info EINA_UNUSED)
1502 {
1503    elm_widget_focused_object_clear(data);
1504 }
1505
1506 static void
1507 _elm_win_on_img_obj_del(void *data,
1508                         Evas *e EINA_UNUSED,
1509                         Evas_Object *obj EINA_UNUSED,
1510                         void *event_info EINA_UNUSED)
1511 {
1512    ELM_WIN_DATA_GET(data, sd);
1513    _elm_win_img_callbacks_del(sd->obj, sd->img_obj);
1514    sd->img_obj = NULL;
1515 }
1516
1517 static void
1518 _elm_win_img_callbacks_del(Evas_Object *obj, Evas_Object *imgobj)
1519 {
1520    evas_object_event_callback_del_full
1521      (imgobj, EVAS_CALLBACK_DEL, _elm_win_on_img_obj_del, obj);
1522    evas_object_event_callback_del_full
1523      (imgobj, EVAS_CALLBACK_HIDE, _win_img_hide, obj);
1524    evas_object_event_callback_del_full
1525      (imgobj, EVAS_CALLBACK_MOUSE_UP, _win_img_mouse_up, obj);
1526    evas_object_event_callback_del_full
1527      (imgobj, EVAS_CALLBACK_FOCUS_IN, _win_img_focus_in, obj);
1528    evas_object_event_callback_del_full
1529      (imgobj, EVAS_CALLBACK_FOCUS_OUT, _win_img_focus_out, obj);
1530 }
1531
1532 static void
1533 _elm_win_smart_del(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
1534 {
1535    Elm_Win_Smart_Data *sd = _pd;
1536
1537    evas_object_event_callback_del_full(sd->layout,
1538                                        EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1539                                        _elm_win_on_resize_obj_changed_size_hints,
1540                                        obj);
1541    evas_object_del(sd->box);
1542    evas_object_del(sd->layout);
1543
1544    /* NB: child deletion handled by parent's smart del */
1545
1546    if ((trap) && (trap->del))
1547      trap->del(sd->trap_data, obj);
1548
1549    if (sd->parent)
1550      {
1551         evas_object_event_callback_del_full
1552           (sd->parent, EVAS_CALLBACK_DEL, _elm_win_on_parent_del, obj);
1553         sd->parent = NULL;
1554      }
1555
1556    if (sd->autodel_clear) *(sd->autodel_clear) = -1;
1557
1558    _elm_win_list = eina_list_remove(_elm_win_list, obj);
1559    _elm_win_count--;
1560    _elm_win_state_eval_queue();
1561
1562    if (sd->ee)
1563      {
1564         ecore_evas_callback_delete_request_set(sd->ee, NULL);
1565         ecore_evas_callback_resize_set(sd->ee, NULL);
1566      }
1567
1568    ecore_job_del(sd->deferred_resize_job);
1569    ecore_job_del(sd->deferred_child_eval_job);
1570    eina_stringshare_del(sd->shot.info);
1571    ecore_timer_del(sd->shot.timer);
1572
1573 #ifdef HAVE_ELEMENTARY_X
1574    ecore_event_handler_del(sd->x.client_message_handler);
1575    ecore_event_handler_del(sd->x.property_handler);
1576 #endif
1577
1578    if (sd->img_obj)
1579      {
1580         _elm_win_img_callbacks_del(obj, sd->img_obj);
1581         sd->img_obj = NULL;
1582      }
1583    else
1584      {
1585         if (sd->ee)
1586           {
1587              ecore_job_add(_deferred_ecore_evas_free, sd->ee);
1588              _elm_win_deferred_free++;
1589           }
1590      }
1591
1592    _elm_win_focus_highlight_shutdown(sd);
1593    eina_stringshare_del(sd->focus_highlight.style);
1594
1595    eina_stringshare_del(sd->title);
1596    eina_stringshare_del(sd->icon_name);
1597    eina_stringshare_del(sd->role);
1598    evas_object_del(sd->icon);
1599    evas_object_del(sd->main_menu);
1600
1601    _elm_win_profile_del(sd);
1602    _elm_win_available_profiles_del(sd);
1603
1604    /* Don't let callback in the air that point to sd */
1605    ecore_evas_callback_delete_request_set(sd->ee, NULL);
1606    ecore_evas_callback_resize_set(sd->ee, NULL);
1607    ecore_evas_callback_mouse_in_set(sd->ee, NULL);
1608    ecore_evas_callback_focus_in_set(sd->ee, NULL);
1609    ecore_evas_callback_focus_out_set(sd->ee, NULL);
1610    ecore_evas_callback_move_set(sd->ee, NULL);
1611    ecore_evas_callback_state_change_set(sd->ee, NULL);
1612
1613    eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
1614
1615    if ((!_elm_win_list) &&
1616        (elm_policy_get(ELM_POLICY_QUIT) == ELM_POLICY_QUIT_LAST_WINDOW_CLOSED))
1617      {
1618         edje_file_cache_flush();
1619         edje_collection_cache_flush();
1620         evas_image_cache_flush(evas_object_evas_get(obj));
1621         evas_font_cache_flush(evas_object_evas_get(obj));
1622         elm_exit();
1623      }
1624 }
1625
1626 static void
1627 _elm_win_obj_intercept_show(void *data,
1628                             Evas_Object *obj)
1629 {
1630    ELM_WIN_DATA_GET(data, sd);
1631
1632    // this is called to make sure all smart containers have calculated their
1633    // sizes BEFORE we show the window to make sure it initially appears at
1634    // our desired size (ie min size is known first)
1635    evas_smart_objects_calculate(evas_object_evas_get(obj));
1636    if (sd->frame_obj)
1637      {
1638         evas_object_show(sd->frame_obj);
1639      }
1640    if (sd->img_obj)
1641      {
1642         evas_object_show(sd->img_obj);
1643      }
1644    if (sd->pointer.obj)
1645      {
1646         ecore_evas_show(sd->pointer.ee);
1647         evas_object_show(sd->pointer.obj);
1648      }
1649    evas_object_show(obj);
1650 }
1651
1652 static void
1653 _elm_win_smart_move(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
1654 {
1655    Evas_Coord x = va_arg(*list, Evas_Coord);
1656    Evas_Coord y = va_arg(*list, Evas_Coord);
1657    Elm_Win_Smart_Data *sd = _pd;
1658
1659    if (sd->img_obj)
1660      {
1661         if ((x != sd->screen.x) || (y != sd->screen.y))
1662           {
1663              sd->screen.x = x;
1664              sd->screen.y = y;
1665              evas_object_smart_callback_call(obj, SIG_MOVED, NULL);
1666           }
1667         return;
1668      }
1669    else
1670      {
1671         TRAP(sd, move, x, y);
1672         if (!ecore_evas_override_get(sd->ee))  return;
1673      }
1674
1675    eo_do_super(obj, MY_CLASS, evas_obj_smart_move(x, y));
1676
1677    if (ecore_evas_override_get(sd->ee))
1678      {
1679         sd->screen.x = x;
1680         sd->screen.y = y;
1681         evas_object_smart_callback_call(obj, SIG_MOVED, NULL);
1682      }
1683    if (sd->frame_obj)
1684      {
1685         /* FIXME: We should update ecore_wl_window_location here !! */
1686         sd->screen.x = x;
1687         sd->screen.y = y;
1688      }
1689    if (sd->img_obj)
1690      {
1691         sd->screen.x = x;
1692         sd->screen.y = y;
1693      }
1694 }
1695
1696 static void
1697 _elm_win_smart_resize(Eo *obj, void *_pd, va_list *list)
1698 {
1699    Evas_Coord w = va_arg(*list, Evas_Coord);
1700    Evas_Coord h = va_arg(*list, Evas_Coord);
1701
1702    Elm_Win_Smart_Data *sd = _pd;
1703
1704    eo_do_super(obj, MY_CLASS, evas_obj_smart_resize(w, h));
1705
1706    if (sd->img_obj)
1707      {
1708         if (sd->constrain)
1709           {
1710              int sw, sh;
1711
1712              ecore_evas_screen_geometry_get(sd->ee, NULL, NULL, &sw, &sh);
1713              w = MIN(w, sw);
1714              h = MIN(h, sh);
1715           }
1716         if (w < 1) w = 1;
1717         if (h < 1) h = 1;
1718
1719         evas_object_image_size_set(sd->img_obj, w, h);
1720      }
1721
1722    TRAP(sd, resize, w, h);
1723 }
1724
1725 static void
1726 _elm_win_delete_request(Ecore_Evas *ee)
1727 {
1728    Elm_Win_Smart_Data *sd = _elm_win_associate_get(ee);
1729    Evas_Object *obj;
1730
1731    if (!sd) return;
1732
1733    obj = sd->obj;
1734
1735    int autodel = sd->autodel;
1736    sd->autodel_clear = &autodel;
1737    evas_object_ref(obj);
1738    evas_object_smart_callback_call(obj, SIG_DELETE_REQUEST, NULL);
1739    // FIXME: if above callback deletes - then the below will be invalid
1740    if (autodel) evas_object_del(obj);
1741    else sd->autodel_clear = NULL;
1742    evas_object_unref(obj);
1743 }
1744
1745 Ecore_X_Window
1746 _elm_ee_xwin_get(const Ecore_Evas *ee)
1747 {
1748 #ifdef HAVE_ELEMENTARY_X
1749    const char *engine_name;
1750    if (!ee) return 0;
1751
1752    engine_name = ecore_evas_engine_name_get(ee);
1753    if (EINA_UNLIKELY(!engine_name)) return 0;
1754
1755    if (!strcmp(engine_name, ELM_SOFTWARE_X11))
1756      {
1757         return ecore_evas_software_x11_window_get(ee);
1758      }
1759    else if (!strcmp(engine_name, ELM_OPENGL_X11))
1760      {
1761         return ecore_evas_gl_x11_window_get(ee);
1762      }
1763 #else
1764    (void)ee;
1765 #endif
1766    return 0;
1767 }
1768
1769 #ifdef HAVE_ELEMENTARY_X
1770 static void
1771 _elm_win_xwindow_get(Elm_Win_Smart_Data *sd)
1772 {
1773    sd->x.xwin = _elm_ee_xwin_get(sd->ee);
1774 }
1775 #endif
1776
1777 Ecore_Wl_Window *
1778 _elm_ee_wlwin_get(const Ecore_Evas *ee)
1779 {
1780 #ifdef HAVE_ELEMENTARY_WAYLAND
1781    const char *engine_name;
1782
1783    if (!ee) return NULL;
1784
1785    engine_name = ecore_evas_engine_name_get(ee);
1786    if (EINA_UNLIKELY(!engine_name)) return NULL;
1787
1788    if ((!strcmp(engine_name, ELM_WAYLAND_SHM)) ||
1789        (!strcmp(engine_name, ELM_WAYLAND_EGL)))
1790      {
1791         return ecore_evas_wayland_window_get(ee);
1792      }
1793 #else
1794    (void)ee;
1795 #endif
1796    return NULL;
1797 }
1798
1799 #ifdef HAVE_ELEMENTARY_WAYLAND
1800 static void
1801 _elm_win_wlwindow_get(Elm_Win_Smart_Data *sd)
1802 {
1803    sd->wl.win = _elm_ee_wlwin_get(sd->ee);
1804 }
1805 #endif
1806
1807 #ifdef HAVE_ELEMENTARY_X
1808 static void
1809 _elm_win_xwin_update(Elm_Win_Smart_Data *sd)
1810 {
1811    const char *s;
1812
1813    _elm_win_xwindow_get(sd);
1814    if (sd->parent)
1815      {
1816         ELM_WIN_DATA_GET(sd->parent, sdp);
1817         if (sdp)
1818           {
1819              if (sd->x.xwin)
1820                ecore_x_icccm_transient_for_set(sd->x.xwin, sdp->x.xwin);
1821           }
1822      }
1823
1824    if (!sd->x.xwin) return;  /* nothing more to do */
1825
1826    s = sd->title;
1827    if (!s) s = _elm_appname;
1828    if (!s) s = "";
1829    if (sd->icon_name) s = sd->icon_name;
1830    ecore_x_icccm_icon_name_set(sd->x.xwin, s);
1831    ecore_x_netwm_icon_name_set(sd->x.xwin, s);
1832
1833    s = sd->role;
1834    if (s) ecore_x_icccm_window_role_set(sd->x.xwin, s);
1835
1836    // set window icon
1837    if (sd->icon)
1838      {
1839         void *data;
1840
1841         data = evas_object_image_data_get(sd->icon, EINA_FALSE);
1842         if (data)
1843           {
1844              Ecore_X_Icon ic;
1845              int w = 0, h = 0, stride, x, y;
1846              unsigned char *p;
1847              unsigned int *p2;
1848
1849              evas_object_image_size_get(sd->icon, &w, &h);
1850              stride = evas_object_image_stride_get(sd->icon);
1851              if ((w > 0) && (h > 0) &&
1852                  (stride >= (int)(w * sizeof(unsigned int))))
1853                {
1854                   ic.width = w;
1855                   ic.height = h;
1856                   ic.data = malloc(w * h * sizeof(unsigned int));
1857
1858                   if (ic.data)
1859                     {
1860                        p = (unsigned char *)data;
1861                        p2 = (unsigned int *)ic.data;
1862                        for (y = 0; y < h; y++)
1863                          {
1864                             for (x = 0; x < w; x++)
1865                               {
1866                                  *p2 = *((unsigned int *)p);
1867                                  p += sizeof(unsigned int);
1868                                  p2++;
1869                               }
1870                             p += (stride - (w * sizeof(unsigned int)));
1871                          }
1872                        ecore_x_netwm_icons_set(sd->x.xwin, &ic, 1);
1873                        free(ic.data);
1874                     }
1875                }
1876              evas_object_image_data_set(sd->icon, data);
1877           }
1878      }
1879
1880    switch (sd->type)
1881      {
1882       case ELM_WIN_BASIC:
1883         ecore_x_netwm_window_type_set(sd->x.xwin, ECORE_X_WINDOW_TYPE_NORMAL);
1884         break;
1885
1886       case ELM_WIN_DIALOG_BASIC:
1887         ecore_x_netwm_window_type_set(sd->x.xwin, ECORE_X_WINDOW_TYPE_DIALOG);
1888         break;
1889
1890       case ELM_WIN_DESKTOP:
1891         ecore_x_netwm_window_type_set(sd->x.xwin, ECORE_X_WINDOW_TYPE_DESKTOP);
1892         break;
1893
1894       case ELM_WIN_DOCK:
1895         ecore_x_netwm_window_type_set(sd->x.xwin, ECORE_X_WINDOW_TYPE_DOCK);
1896         break;
1897
1898       case ELM_WIN_TOOLBAR:
1899         ecore_x_netwm_window_type_set(sd->x.xwin, ECORE_X_WINDOW_TYPE_TOOLBAR);
1900         break;
1901
1902       case ELM_WIN_MENU:
1903         ecore_x_netwm_window_type_set(sd->x.xwin, ECORE_X_WINDOW_TYPE_MENU);
1904         break;
1905
1906       case ELM_WIN_UTILITY:
1907         ecore_x_netwm_window_type_set(sd->x.xwin, ECORE_X_WINDOW_TYPE_UTILITY);
1908         break;
1909
1910       case ELM_WIN_SPLASH:
1911         ecore_x_netwm_window_type_set(sd->x.xwin, ECORE_X_WINDOW_TYPE_SPLASH);
1912         break;
1913
1914       case ELM_WIN_DROPDOWN_MENU:
1915         ecore_x_netwm_window_type_set
1916           (sd->x.xwin, ECORE_X_WINDOW_TYPE_DROPDOWN_MENU);
1917         break;
1918
1919       case ELM_WIN_POPUP_MENU:
1920         ecore_x_netwm_window_type_set
1921           (sd->x.xwin, ECORE_X_WINDOW_TYPE_POPUP_MENU);
1922         break;
1923
1924       case ELM_WIN_TOOLTIP:
1925         ecore_x_netwm_window_type_set(sd->x.xwin, ECORE_X_WINDOW_TYPE_TOOLTIP);
1926         break;
1927
1928       case ELM_WIN_NOTIFICATION:
1929         ecore_x_netwm_window_type_set
1930           (sd->x.xwin, ECORE_X_WINDOW_TYPE_NOTIFICATION);
1931         break;
1932
1933       case ELM_WIN_COMBO:
1934         ecore_x_netwm_window_type_set(sd->x.xwin, ECORE_X_WINDOW_TYPE_COMBO);
1935         break;
1936
1937       case ELM_WIN_DND:
1938         ecore_x_netwm_window_type_set(sd->x.xwin, ECORE_X_WINDOW_TYPE_DND);
1939         break;
1940
1941       default:
1942         break;
1943      }
1944    ecore_x_e_virtual_keyboard_state_set
1945      (sd->x.xwin, (Ecore_X_Virtual_Keyboard_State)sd->kbdmode);
1946    if (sd->indmode == ELM_WIN_INDICATOR_SHOW)
1947      ecore_x_e_illume_indicator_state_set
1948        (sd->x.xwin, ECORE_X_ILLUME_INDICATOR_STATE_ON);
1949    else if (sd->indmode == ELM_WIN_INDICATOR_HIDE)
1950      ecore_x_e_illume_indicator_state_set
1951        (sd->x.xwin, ECORE_X_ILLUME_INDICATOR_STATE_OFF);
1952 }
1953
1954 #endif
1955
1956 /**
1957   * @internal
1958   *
1959   * Resize the window according to window layout's min and weight.
1960   * If the window layout's weight is 0.0, the window max is limited to layout's
1961   * min size.
1962   *
1963   * This is called when the window layout's weight hint is changed or when the
1964   * window is rotated.
1965   *
1966   * @param obj window object
1967   */
1968 static void
1969 _elm_win_resize_objects_eval(Evas_Object *obj)
1970 {
1971    ELM_WIN_DATA_GET(obj, sd);
1972    Evas_Coord w, h, minw, minh, maxw, maxh;
1973    double wx, wy;
1974
1975    evas_object_size_hint_min_get(sd->layout, &minw, &minh);
1976    if (minw < 1) minw = 1;
1977    if (minh < 1) minh = 1;
1978
1979    evas_object_size_hint_weight_get(sd->layout, &wx, &wy);
1980    if (!wx) maxw = minw;
1981    else maxw = 32767;
1982    if (!wy) maxh = minh;
1983    else maxh = 32767;
1984
1985    evas_object_size_hint_min_set(obj, minw, minh);
1986    evas_object_size_hint_max_set(obj, maxw, maxh);
1987    evas_object_geometry_get(obj, NULL, NULL, &w, &h);
1988    if (w < minw) w = minw;
1989    if (h < minh) h = minh;
1990    if (w > maxw) w = maxw;
1991    if (h > maxh) h = maxh;
1992    evas_object_move(obj, 0, 0);
1993    evas_object_resize(obj, w, h);
1994 }
1995
1996 static void
1997 _elm_win_on_resize_obj_changed_size_hints(void *data,
1998                                           Evas *e EINA_UNUSED,
1999                                           Evas_Object *obj EINA_UNUSED,
2000                                           void *event_info EINA_UNUSED)
2001 {
2002    _elm_win_resize_objects_eval(data);
2003 }
2004
2005 void
2006 _elm_win_shutdown(void)
2007 {
2008    while (_elm_win_list) evas_object_del(_elm_win_list->data);
2009    ELM_SAFE_FREE(_elm_win_state_eval_job, ecore_job_del);
2010 }
2011
2012 void
2013 _elm_win_rescale(Elm_Theme *th,
2014                  Eina_Bool use_theme)
2015 {
2016    const Eina_List *l;
2017    Evas_Object *obj;
2018
2019    if (!use_theme)
2020      {
2021         EINA_LIST_FOREACH(_elm_win_list, l, obj)
2022           elm_widget_theme(obj);
2023      }
2024    else
2025      {
2026         EINA_LIST_FOREACH(_elm_win_list, l, obj)
2027           elm_widget_theme_specific(obj, th, EINA_FALSE);
2028      }
2029 }
2030
2031 void
2032 _elm_win_access(Eina_Bool is_access)
2033 {
2034    Evas *evas;
2035    const Eina_List *l;
2036    Evas_Object *obj;
2037    Evas_Object *fobj;
2038
2039    EINA_LIST_FOREACH(_elm_win_list, l, obj)
2040      {
2041         elm_widget_access(obj, is_access);
2042
2043          /* floating orphan object. if there are A, B, C objects and user does
2044             as below, then there would be floating orphan objects.
2045
2046               1. elm_object_content_set(layout, A);
2047               2. elm_object_content_set(layout, B);
2048               3. elm_object_content_set(layout, C);
2049
2050             now, the object A and B are floating orphan objects */
2051
2052         fobj = obj;
2053         for (;;)
2054           {
2055              fobj = evas_object_below_get(fobj);
2056              if (!fobj) break;
2057
2058              if (elm_widget_is(fobj) && !elm_widget_parent_get(fobj))
2059                {
2060                   elm_widget_access(fobj, is_access);
2061                }
2062           }
2063
2064         if (!is_access)
2065           {
2066              evas = evas_object_evas_get(obj);
2067             if (evas) _elm_access_object_highlight_disable(evas);
2068           }
2069      }
2070 }
2071
2072 void
2073 _elm_win_translate(void)
2074 {
2075    const Eina_List *l;
2076    Evas_Object *obj;
2077
2078    EINA_LIST_FOREACH(_elm_win_list, l, obj)
2079      elm_widget_translate(obj);
2080 }
2081
2082 #ifdef HAVE_ELEMENTARY_X
2083 static Eina_Bool
2084 _elm_win_client_message(void *data,
2085                         int type EINA_UNUSED,
2086                         void *event)
2087 {
2088    ELM_WIN_DATA_GET(data, sd);
2089    Ecore_X_Event_Client_Message *e = event;
2090
2091    if (e->format != 32) return ECORE_CALLBACK_PASS_ON;
2092    if (e->message_type == ECORE_X_ATOM_E_COMP_FLUSH)
2093      {
2094         if ((unsigned int)e->data.l[0] == sd->x.xwin)
2095           {
2096              Evas *evas = evas_object_evas_get(sd->obj);
2097              if (evas)
2098                {
2099                   edje_file_cache_flush();
2100                   edje_collection_cache_flush();
2101                   evas_image_cache_flush(evas);
2102                   evas_font_cache_flush(evas);
2103                }
2104           }
2105      }
2106    else if (e->message_type == ECORE_X_ATOM_E_COMP_DUMP)
2107      {
2108         if ((unsigned int)e->data.l[0] == sd->x.xwin)
2109           {
2110              Evas *evas = evas_object_evas_get(sd->obj);
2111              if (evas)
2112                {
2113                   edje_file_cache_flush();
2114                   edje_collection_cache_flush();
2115                   evas_image_cache_flush(evas);
2116                   evas_font_cache_flush(evas);
2117                   evas_render_dump(evas);
2118                }
2119           }
2120      }
2121    else if (e->message_type == ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL)
2122      {
2123         if ((unsigned int)e->data.l[0] == sd->x.xwin)
2124           {
2125              if ((unsigned int)e->data.l[1] ==
2126                  ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_NEXT)
2127                {
2128                   // XXX: call right access func
2129                }
2130              else if ((unsigned int)e->data.l[1] ==
2131                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_PREV)
2132                {
2133                   // XXX: call right access func
2134                }
2135              else if ((unsigned int)e->data.l[1] ==
2136                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_ACTIVATE)
2137                {
2138                   _elm_access_highlight_object_activate
2139                     (sd->obj, ELM_ACTIVATE_DEFAULT);
2140                }
2141              else if ((unsigned int)e->data.l[1] ==
2142                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ)
2143                {
2144                   /* there would be better way to read highlight object */
2145                   Evas *evas;
2146                   evas = evas_object_evas_get(sd->obj);
2147                   if (!evas) return ECORE_CALLBACK_PASS_ON;
2148
2149                   _elm_access_mouse_event_enabled_set(EINA_TRUE);
2150
2151                   evas_event_feed_mouse_in(evas, 0, NULL);
2152                   evas_event_feed_mouse_move
2153                     (evas, e->data.l[2], e->data.l[3], 0, NULL);
2154
2155                   _elm_access_mouse_event_enabled_set(EINA_FALSE);
2156                }
2157              else if ((unsigned int)e->data.l[1] ==
2158                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ_NEXT)
2159                {
2160                   _elm_access_highlight_cycle(sd->obj, ELM_FOCUS_NEXT);
2161                }
2162              else if ((unsigned int)e->data.l[1] ==
2163                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ_PREV)
2164                {
2165                   _elm_access_highlight_cycle(sd->obj, ELM_FOCUS_PREVIOUS);
2166                }
2167              else if ((unsigned int)e->data.l[1] ==
2168                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_UP)
2169                {
2170                   _elm_access_highlight_object_activate
2171                     (sd->obj, ELM_ACTIVATE_UP);
2172                }
2173              else if ((unsigned int)e->data.l[1] ==
2174                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_DOWN)
2175                {
2176                   _elm_access_highlight_object_activate
2177                     (sd->obj, ELM_ACTIVATE_DOWN);
2178                }
2179           }
2180      }
2181    return ECORE_CALLBACK_PASS_ON;
2182 }
2183
2184 static Eina_Bool
2185 _elm_win_property_change(void *data,
2186                          int type EINA_UNUSED,
2187                          void *event)
2188 {
2189    ELM_WIN_DATA_GET(data, sd);
2190    Ecore_X_Event_Window_Property *e = event;
2191
2192    if (e->atom == ECORE_X_ATOM_E_ILLUME_INDICATOR_STATE)
2193      {
2194         if (e->win == sd->x.xwin)
2195           {
2196              sd->indmode = (Elm_Win_Indicator_Mode)ecore_x_e_illume_indicator_state_get(e->win);
2197              evas_object_smart_callback_call(sd->obj, SIG_INDICATOR_PROP_CHANGED, NULL);
2198           }
2199      }
2200    return ECORE_CALLBACK_PASS_ON;
2201 }
2202 #endif
2203
2204 static void
2205 _elm_win_focus_highlight_hide(void *data EINA_UNUSED,
2206                               Evas_Object *obj,
2207                               const char *emission EINA_UNUSED,
2208                               const char *source EINA_UNUSED)
2209 {
2210    evas_object_hide(obj);
2211 }
2212
2213 static void
2214 _elm_win_focus_highlight_anim_end(void *data,
2215                                   Evas_Object *obj,
2216                                   const char *emission EINA_UNUSED,
2217                                   const char *source EINA_UNUSED)
2218 {
2219    ELM_WIN_DATA_GET(data, sd);
2220
2221    _elm_win_focus_highlight_simple_setup(sd, obj);
2222 }
2223
2224 static void
2225 _elm_win_focus_highlight_init(Elm_Win_Smart_Data *sd)
2226 {
2227    evas_event_callback_add(sd->evas, EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_IN,
2228                            _elm_win_object_focus_in, sd->obj);
2229    evas_event_callback_add(sd->evas,
2230                            EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_OUT,
2231                            _elm_win_object_focus_out, sd->obj);
2232
2233    sd->focus_highlight.cur.target = evas_focus_get(sd->evas);
2234    sd->focus_highlight.fobj = edje_object_add(sd->evas);
2235    sd->focus_highlight.theme_changed = EINA_TRUE;
2236
2237    edje_object_signal_callback_add(sd->focus_highlight.fobj,
2238                                    "elm,action,focus,hide,end", "*",
2239                                    _elm_win_focus_highlight_hide, NULL);
2240    edje_object_signal_callback_add(sd->focus_highlight.fobj,
2241                                    "elm,action,focus,anim,end", "*",
2242                                    _elm_win_focus_highlight_anim_end, sd->obj);
2243    _elm_win_focus_highlight_reconfigure_job_start(sd);
2244 }
2245
2246 static void
2247 _elm_win_frame_cb_move_start(void *data,
2248                              Evas_Object *obj EINA_UNUSED,
2249                              const char *sig EINA_UNUSED,
2250                              const char *source)
2251 {
2252    ELM_WIN_DATA_GET(data, sd);
2253
2254    if (!sd) return;
2255
2256 #ifdef HAVE_ELEMENTARY_WAYLAND
2257    if (!strcmp(source, "elm"))
2258      ecore_wl_window_cursor_from_name_set(sd->wl.win, ELM_CURSOR_HAND1);
2259    else
2260      ecore_wl_window_cursor_default_restore(sd->wl.win);
2261 #else
2262    (void)source;
2263 #endif
2264
2265    /* FIXME: Change mouse pointer */
2266
2267    /* NB: Wayland handles moving surfaces by itself so we cannot
2268     * specify a specific x/y we want. Instead, we will pass in the
2269     * existing x/y values so they can be recorded as 'previous'
2270     * position. The new position will get updated automatically when
2271     * the move is finished */
2272
2273    ecore_evas_wayland_move(sd->ee, sd->screen.x, sd->screen.y);
2274 }
2275
2276 static void
2277 _elm_win_frame_cb_move_stop(void *data,
2278                             Evas_Object *obj EINA_UNUSED,
2279                             const char *sig EINA_UNUSED,
2280                             const char *source EINA_UNUSED)
2281 {
2282    ELM_WIN_DATA_GET(data, sd);
2283
2284    if (!sd) return;
2285
2286 #ifdef HAVE_ELEMENTARY_WAYLAND
2287    ecore_wl_window_cursor_default_restore(sd->wl.win);
2288 #endif
2289 }
2290
2291 #ifdef HAVE_ELEMENTARY_WAYLAND
2292 struct _resize_info
2293 {
2294    const char *name;
2295    int location;
2296 };
2297
2298 static struct _resize_info _border_side[4] =
2299 {
2300      { ELM_CURSOR_TOP_SIDE, 1 },
2301      { ELM_CURSOR_LEFT_SIDE, 4 },
2302      { ELM_CURSOR_BOTTOM_SIDE, 2 },
2303      { ELM_CURSOR_RIGHT_SIDE, 8 },
2304 };
2305
2306 static struct _resize_info _border_corner[4] =
2307 {
2308      { ELM_CURSOR_TOP_LEFT_CORNER, 5 },
2309      { ELM_CURSOR_BOTTOM_LEFT_CORNER, 6 },
2310      { ELM_CURSOR_BOTTOM_RIGHT_CORNER, 10 },
2311      { ELM_CURSOR_TOP_RIGHT_CORNER, 9 },
2312 };
2313 #endif
2314
2315 static void
2316 _elm_win_frame_obj_update(Elm_Win_Smart_Data *sd)
2317 {
2318    int fx, fy, fw, fh;
2319    int ox, oy, ow, oh;
2320    int sx, sy, sw, sh;
2321    int x, y, w, h;
2322    evas_object_geometry_get(sd->frame_obj, &fx, &fy, &fw, &fh);
2323    evas_object_geometry_get(sd->client_obj, &ox, &oy, &ow, &oh);
2324    evas_object_geometry_get(sd->spacer_obj, &sx, &sy, &sw, &sh);
2325
2326    evas_output_framespace_get(sd->evas, &x, &y, &w, &h);
2327
2328    if ((x != (ox - fx)) || (y != (oy - fy)) ||
2329        (w != (fw - ow)) || (h != (fh - oh)))
2330      {
2331         evas_output_framespace_set(sd->evas, (ox - fx), (oy - fy),
2332                                    (fw - ow), (fh - oh));
2333      }
2334
2335 #ifdef HAVE_ELEMENTARY_WAYLAND
2336    ecore_wl_window_opaque_region_set(sd->wl.win, -fx, -(fy - sy), sw, sh);
2337 #endif
2338 }
2339
2340 static void
2341 _elm_win_frame_obj_move(void *data,
2342                         Evas *e EINA_UNUSED,
2343                         Evas_Object *obj EINA_UNUSED,
2344                         void *event_info EINA_UNUSED)
2345 {
2346    Elm_Win_Smart_Data *sd;
2347
2348    if (!(sd = data)) return;
2349    if (!sd->client_obj) return;
2350
2351    _elm_win_frame_obj_update(sd);
2352 }
2353
2354 static void
2355 _elm_win_frame_obj_resize(void *data,
2356                           Evas *e EINA_UNUSED,
2357                           Evas_Object *obj EINA_UNUSED,
2358                           void *event_info EINA_UNUSED)
2359 {
2360    Elm_Win_Smart_Data *sd;
2361
2362    if (!(sd = data)) return;
2363    if (!sd->client_obj) return;
2364
2365    _elm_win_frame_obj_update(sd);
2366 }
2367
2368 static void
2369 _elm_win_frame_cb_resize_show(void *data,
2370                               Evas_Object *obj EINA_UNUSED,
2371                               const char *sig EINA_UNUSED,
2372                               const char *source)
2373 {
2374    ELM_WIN_DATA_GET(data, sd);
2375
2376    if (!sd) return;
2377    if (sd->resizing) return;
2378
2379 #ifdef HAVE_ELEMENTARY_WAYLAND
2380    int i;
2381    i = sd->rot / 90;
2382    if (!strcmp(source, "elm.event.resize.t"))
2383      ecore_wl_window_cursor_from_name_set(sd->wl.win,
2384                                           _border_side[(0 + i) % 4].name);
2385    else if (!strcmp(source, "elm.event.resize.b"))
2386      ecore_wl_window_cursor_from_name_set(sd->wl.win,
2387                                           _border_side[(2 + i) % 4].name);
2388    else if (!strcmp(source, "elm.event.resize.l"))
2389      ecore_wl_window_cursor_from_name_set(sd->wl.win,
2390                                           _border_side[(1 + i) % 4].name);
2391    else if (!strcmp(source, "elm.event.resize.r"))
2392      ecore_wl_window_cursor_from_name_set(sd->wl.win,
2393                                           _border_side[(3 + i) % 4].name);
2394    else if (!strcmp(source, "elm.event.resize.tl"))
2395      ecore_wl_window_cursor_from_name_set(sd->wl.win,
2396                                           _border_corner[(0 + i) % 4].name);
2397    else if (!strcmp(source, "elm.event.resize.tr"))
2398      ecore_wl_window_cursor_from_name_set(sd->wl.win,
2399                                           _border_corner[(3 + i) % 4].name);
2400    else if (!strcmp(source, "elm.event.resize.bl"))
2401      ecore_wl_window_cursor_from_name_set(sd->wl.win,
2402                                           _border_corner[(1 + i) % 4].name);
2403    else if (!strcmp(source, "elm.event.resize.br"))
2404      ecore_wl_window_cursor_from_name_set(sd->wl.win,
2405                                           _border_corner[(2 + i) % 4].name);
2406    else
2407      ecore_wl_window_cursor_default_restore(sd->wl.win);
2408 #else
2409    (void)source;
2410 #endif
2411 }
2412
2413 static void
2414 _elm_win_frame_cb_resize_hide(void *data,
2415                               Evas_Object *obj EINA_UNUSED,
2416                               const char *sig EINA_UNUSED,
2417                               const char *source EINA_UNUSED)
2418 {
2419    ELM_WIN_DATA_GET(data, sd);
2420
2421    if (!sd) return;
2422    if (sd->resizing) return;
2423
2424 #ifdef HAVE_ELEMENTARY_WAYLAND
2425    ecore_wl_window_cursor_default_restore(sd->wl.win);
2426 #endif
2427 }
2428
2429 static void
2430 _elm_win_frame_cb_resize_start(void *data,
2431                                Evas_Object *obj EINA_UNUSED,
2432                                const char *sig EINA_UNUSED,
2433                                const char *source)
2434 {
2435 #ifdef HAVE_ELEMENTARY_WAYLAND
2436    ELM_WIN_DATA_GET(data, sd);
2437    int i;
2438
2439    if (!sd) return;
2440    if (sd->resizing) return;
2441
2442    sd->resizing = EINA_TRUE;
2443    i = sd->rot / 90;
2444    if (!strcmp(source, "elm.event.resize.t"))
2445      sd->resize_location = _border_side[(0 + i) % 4].location;
2446    else if (!strcmp(source, "elm.event.resize.b"))
2447      sd->resize_location = _border_side[(2 + i) % 4].location;
2448    else if (!strcmp(source, "elm.event.resize.l"))
2449      sd->resize_location = _border_side[(1 + i) % 4].location;
2450    else if (!strcmp(source, "elm.event.resize.r"))
2451      sd->resize_location = _border_side[(3 + i) % 4].location;
2452    else if (!strcmp(source, "elm.event.resize.tl"))
2453      sd->resize_location = _border_corner[(0 + i) % 4].location;
2454    else if (!strcmp(source, "elm.event.resize.tr"))
2455      sd->resize_location = _border_corner[(3 + i) % 4].location;
2456    else if (!strcmp(source, "elm.event.resize.bl"))
2457      sd->resize_location = _border_corner[(1 + i) % 4].location;
2458    else if (!strcmp(source, "elm.event.resize.br"))
2459      sd->resize_location = _border_corner[(2 + i) % 4].location;
2460    else
2461      sd->resize_location = 0;
2462
2463    if (sd->resize_location > 0)
2464      ecore_evas_wayland_resize(sd->ee, sd->resize_location);
2465 #else
2466    (void)data;
2467    (void)source;
2468 #endif
2469 }
2470
2471 static void
2472 _elm_win_frame_cb_minimize(void *data,
2473                            Evas_Object *obj EINA_UNUSED,
2474                            const char *sig EINA_UNUSED,
2475                            const char *source EINA_UNUSED)
2476 {
2477    ELM_WIN_DATA_GET(data, sd);
2478
2479    if (!sd) return;
2480 //   sd->iconified = EINA_TRUE;
2481    TRAP(sd, iconified_set, EINA_TRUE);
2482 }
2483
2484 static void
2485 _elm_win_frame_maximized_state_update(Elm_Win_Smart_Data *sd, Eina_Bool maximized)
2486 {
2487    const char *emission;
2488
2489    if (maximized)
2490      emission = "elm,state,maximized";
2491    else
2492      emission = "elm,state,unmaximized";
2493
2494    edje_object_signal_emit(sd->frame_obj, emission, "elm");
2495    edje_object_message_signal_process(sd->frame_obj);
2496    evas_object_smart_calculate(sd->frame_obj);
2497
2498    _elm_win_frame_obj_update(sd);
2499 }
2500
2501 static void
2502 _elm_win_frame_cb_maximize(void *data,
2503                            Evas_Object *obj EINA_UNUSED,
2504                            const char *sig EINA_UNUSED,
2505                            const char *source EINA_UNUSED)
2506 {
2507    Eina_Bool value;
2508    ELM_WIN_DATA_GET(data, sd);
2509
2510    if (!sd) return;
2511    if (sd->maximized) value = EINA_FALSE;
2512    else value = EINA_TRUE;
2513
2514    _elm_win_frame_maximized_state_update(sd, value);
2515
2516    TRAP(sd, maximized_set, value);
2517 }
2518
2519 static void
2520 _elm_win_frame_cb_close(void *data,
2521                         Evas_Object *obj EINA_UNUSED,
2522                         const char *sig EINA_UNUSED,
2523                         const char *source EINA_UNUSED)
2524 {
2525    ELM_WIN_DATA_GET(data, sd);
2526    Evas_Object *win;
2527
2528    /* FIXME: After the current freeze, this should be handled differently.
2529     *
2530     * Ideally, we would want to mimic the X11 backend and use something
2531     * like ECORE_WL_EVENT_WINDOW_DELETE and handle the delete_request
2532     * inside of ecore_evas. That would be the 'proper' way, but since we are
2533     * in a freeze right now, I cannot add a new event value, or a new
2534     * event structure to ecore_wayland.
2535     *
2536     * So yes, this is a temporary 'stop-gap' solution which will be fixed
2537     * when the freeze is over, but it does fix a trac bug for now, and in a
2538     * way which does not break API or the freeze. - dh
2539     */
2540
2541    if (!sd) return;
2542
2543    win = sd->obj;
2544
2545    int autodel = sd->autodel;
2546    sd->autodel_clear = &autodel;
2547    evas_object_ref(win);
2548    evas_object_smart_callback_call(win, SIG_DELETE_REQUEST, NULL);
2549    // FIXME: if above callback deletes - then the below will be invalid
2550    if (autodel) evas_object_del(win);
2551    else sd->autodel_clear = NULL;
2552    evas_object_unref(win);
2553 }
2554
2555 static void
2556 _elm_win_frame_add(Elm_Win_Smart_Data *sd,
2557                    const char *style)
2558 {
2559    Evas_Object *obj = sd->obj;
2560    int w, h, mw, mh;
2561    short layer;
2562
2563    sd->frame_obj = edje_object_add(sd->evas);
2564    layer = evas_object_layer_get(obj);
2565    evas_object_layer_set(sd->frame_obj, layer + 1);
2566    if (!elm_widget_theme_object_set
2567        (sd->obj, sd->frame_obj, "border", "base", style))
2568      {
2569         ELM_SAFE_FREE(sd->frame_obj, evas_object_del);
2570         return;
2571      }
2572
2573    sd->spacer_obj = evas_object_rectangle_add(sd->evas);
2574    evas_object_color_set(sd->spacer_obj, 0, 0, 0, 0);
2575    evas_object_repeat_events_set(sd->spacer_obj, EINA_TRUE);
2576    edje_object_part_swallow(sd->frame_obj, "elm.swallow.frame_spacer",
2577                             sd->spacer_obj);
2578
2579    sd->client_obj = evas_object_rectangle_add(sd->evas);
2580    evas_object_color_set(sd->client_obj, 0, 0, 0, 0);
2581    /* NB: Tried pass_events here, but that fails to send events */
2582    evas_object_repeat_events_set(sd->client_obj, EINA_TRUE);
2583    edje_object_part_swallow(sd->frame_obj, "elm.swallow.client",
2584                             sd->client_obj);
2585
2586    evas_object_is_frame_object_set(sd->frame_obj, EINA_TRUE);
2587
2588    evas_object_event_callback_add
2589      (sd->frame_obj, EVAS_CALLBACK_MOVE, _elm_win_frame_obj_move, sd);
2590    evas_object_event_callback_add
2591      (sd->frame_obj, EVAS_CALLBACK_RESIZE, _elm_win_frame_obj_resize, sd);
2592
2593    /* NB: Do NOT remove these calls !! Needed to calculate proper
2594     * framespace on inital show of the window */
2595    edje_object_size_min_calc(sd->frame_obj, &mw, &mh);
2596    evas_object_move(sd->frame_obj, 0, 0);
2597    evas_object_resize(sd->frame_obj, mw, mh);
2598    evas_object_smart_calculate(sd->frame_obj);
2599
2600    edje_object_signal_callback_add
2601      (sd->frame_obj, "elm,action,move,start", "elm",
2602      _elm_win_frame_cb_move_start, obj);
2603    edje_object_signal_callback_add
2604      (sd->frame_obj, "elm,action,move,stop", "elm",
2605      _elm_win_frame_cb_move_stop, obj);
2606    edje_object_signal_callback_add
2607      (sd->frame_obj, "elm,action,resize,show", "*",
2608      _elm_win_frame_cb_resize_show, obj);
2609    edje_object_signal_callback_add
2610      (sd->frame_obj, "elm,action,resize,hide", "*",
2611      _elm_win_frame_cb_resize_hide, obj);
2612    edje_object_signal_callback_add
2613      (sd->frame_obj, "elm,action,resize,start", "*",
2614      _elm_win_frame_cb_resize_start, obj);
2615    edje_object_signal_callback_add
2616      (sd->frame_obj, "elm,action,minimize", "elm",
2617      _elm_win_frame_cb_minimize, obj);
2618    edje_object_signal_callback_add
2619      (sd->frame_obj, "elm,action,maximize", "elm",
2620      _elm_win_frame_cb_maximize, obj);
2621    edje_object_signal_callback_add
2622      (sd->frame_obj, "elm,action,close", "elm", _elm_win_frame_cb_close, obj);
2623
2624    if (sd->title)
2625      {
2626         edje_object_part_text_escaped_set
2627           (sd->frame_obj, "elm.text.title", sd->title);
2628      }
2629
2630    ecore_evas_geometry_get(sd->ee, NULL, NULL, &w, &h);
2631    ecore_evas_resize(sd->ee, w, h);
2632 }
2633
2634 static void
2635 _elm_win_frame_del(Elm_Win_Smart_Data *sd)
2636 {
2637    int w, h;
2638
2639    ELM_SAFE_FREE(sd->client_obj, evas_object_del);
2640
2641    if (sd->frame_obj)
2642      {
2643         evas_object_event_callback_del_full
2644           (sd->frame_obj, EVAS_CALLBACK_MOVE, _elm_win_frame_obj_move, sd);
2645         evas_object_event_callback_del_full
2646           (sd->frame_obj, EVAS_CALLBACK_RESIZE, _elm_win_frame_obj_resize, sd);
2647
2648         edje_object_signal_callback_del
2649           (sd->frame_obj, "elm,action,move,start", "elm",
2650               _elm_win_frame_cb_move_start);
2651         edje_object_signal_callback_del
2652           (sd->frame_obj, "elm,action,move,stop", "elm",
2653               _elm_win_frame_cb_move_stop);
2654         edje_object_signal_callback_del
2655           (sd->frame_obj, "elm,action,resize,show", "*",
2656               _elm_win_frame_cb_resize_show);
2657         edje_object_signal_callback_del
2658           (sd->frame_obj, "elm,action,resize,hide", "*",
2659               _elm_win_frame_cb_resize_hide);
2660         edje_object_signal_callback_del
2661           (sd->frame_obj, "elm,action,resize,start", "*",
2662               _elm_win_frame_cb_resize_start);
2663         edje_object_signal_callback_del
2664           (sd->frame_obj, "elm,action,minimize", "elm",
2665               _elm_win_frame_cb_minimize);
2666         edje_object_signal_callback_del
2667           (sd->frame_obj, "elm,action,maximize", "elm",
2668               _elm_win_frame_cb_maximize);
2669         edje_object_signal_callback_del
2670           (sd->frame_obj, "elm,action,close", "elm",
2671               _elm_win_frame_cb_close);
2672
2673         ELM_SAFE_FREE(sd->frame_obj, evas_object_del);
2674      }
2675
2676    evas_output_framespace_set(sd->evas, 0, 0, 0, 0);
2677    ecore_evas_geometry_get(sd->ee, NULL, NULL, &w, &h);
2678    ecore_evas_resize(sd->ee, w, h);
2679 }
2680
2681 #ifdef ELM_DEBUG
2682 static void
2683 _debug_key_down(void *data EINA_UNUSED,
2684                 Evas *e EINA_UNUSED,
2685                 Evas_Object *obj,
2686                 void *event_info)
2687 {
2688    Evas_Event_Key_Down *ev = event_info;
2689
2690    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
2691      return;
2692
2693    if ((strcmp(ev->key, "F12")) ||
2694        (!evas_key_modifier_is_set(ev->modifiers, "Control")))
2695      return;
2696
2697    INF("Tree graph generated.");
2698    elm_object_tree_dot_dump(obj, "./dump.dot");
2699 }
2700
2701 #endif
2702
2703 static void
2704 _win_inlined_image_set(Elm_Win_Smart_Data *sd)
2705 {
2706    evas_object_image_alpha_set(sd->img_obj, EINA_FALSE);
2707    evas_object_image_filled_set(sd->img_obj, EINA_TRUE);
2708
2709    evas_object_event_callback_add
2710      (sd->img_obj, EVAS_CALLBACK_DEL, _elm_win_on_img_obj_del, sd->obj);
2711    evas_object_event_callback_add
2712      (sd->img_obj, EVAS_CALLBACK_HIDE, _win_img_hide, sd->obj);
2713    evas_object_event_callback_add
2714      (sd->img_obj, EVAS_CALLBACK_MOUSE_UP, _win_img_mouse_up, sd->obj);
2715    evas_object_event_callback_add
2716      (sd->img_obj, EVAS_CALLBACK_FOCUS_IN, _win_img_focus_in, sd->obj);
2717    evas_object_event_callback_add
2718      (sd->img_obj, EVAS_CALLBACK_FOCUS_OUT, _win_img_focus_out, sd->obj);
2719 }
2720
2721 static void
2722 _elm_win_on_icon_del(void *data,
2723                      Evas *e EINA_UNUSED,
2724                      Evas_Object *obj,
2725                      void *event_info EINA_UNUSED)
2726 {
2727    ELM_WIN_DATA_GET(data, sd);
2728
2729    if (sd->icon == obj) sd->icon = NULL;
2730 }
2731
2732 static void
2733 _elm_win_smart_add(Eo *obj, void *_pd EINA_UNUSED, va_list *list EINA_UNUSED)
2734 {
2735    eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
2736
2737    elm_widget_can_focus_set(obj, EINA_TRUE);
2738
2739    elm_widget_highlight_ignore_set(obj, EINA_TRUE);
2740 }
2741
2742 #ifdef HAVE_ELEMENTARY_X
2743 static void
2744 _elm_x_io_err(void *data EINA_UNUSED)
2745 {
2746    Eina_List *l;
2747    Evas_Object *obj;
2748
2749    EINA_LIST_FOREACH(_elm_win_list, l, obj)
2750      evas_object_smart_callback_call(obj, SIG_IOERR, NULL);
2751    elm_exit();
2752 }
2753 #endif
2754
2755 EAPI Evas_Object *
2756 elm_win_add(Evas_Object *parent,
2757             const char *name,
2758             Elm_Win_Type type)
2759 {
2760    Evas_Object *obj = eo_add_custom(MY_CLASS, parent, elm_obj_win_constructor(name, type));
2761    eo_unref(obj);
2762    return obj;
2763 }
2764
2765 static void
2766 _elm_win_cb_hide(void *data EINA_UNUSED,
2767                  Evas *e EINA_UNUSED,
2768                  Evas_Object *obj EINA_UNUSED,
2769                  void *event_info EINA_UNUSED)
2770 {
2771    _elm_win_state_eval_queue();
2772 }
2773
2774 static void
2775 _elm_win_cb_show(void *data EINA_UNUSED,
2776                  Evas *e EINA_UNUSED,
2777                  Evas_Object *obj EINA_UNUSED,
2778                  void *event_info EINA_UNUSED)
2779 {
2780    _elm_win_state_eval_queue();
2781 }
2782
2783 /**
2784   * @internal
2785   *
2786   * Recalculate the size of window considering its resize objects' weight and
2787   * min size. If any of its resize objects' weight equals to 0.0, window
2788   * layout's weight will be set to 0.0.
2789   *
2790   * @param o box object
2791   * @param p box's private data
2792   * @param data window object
2793   */
2794 static void
2795 _window_layout_stack(Evas_Object *o, Evas_Object_Box_Data *p, void *data)
2796 {
2797    const Eina_List *l;
2798    Evas_Object *child;
2799    Evas_Object_Box_Option *opt;
2800    Evas_Coord x, y, w, h;
2801    double wx, wy;
2802    Evas_Coord minw = -1, minh = -1;
2803    double weight_x = EVAS_HINT_EXPAND;
2804    double weight_y = EVAS_HINT_EXPAND;
2805
2806    EINA_LIST_FOREACH(p->children, l, opt)
2807      {
2808         child = opt->obj;
2809         evas_object_size_hint_weight_get(child, &wx, &wy);
2810         if (wx == 0.0) weight_x = 0;
2811         if (wy == 0.0) weight_y = 0;
2812
2813         evas_object_size_hint_min_get(child, &w, &h);
2814         if (w > minw) minw = w;
2815         if (h > minh) minh = h;
2816      }
2817
2818    evas_object_size_hint_min_set(o, minw, minh);
2819    evas_object_geometry_get(o, &x, &y, &w, &h);
2820    if (w < minw) w = minw;
2821    if (h < minh) h = minh;
2822    evas_object_resize(o, w, h);
2823
2824    EINA_LIST_FOREACH(p->children, l, opt)
2825      {
2826         child = opt->obj;
2827         evas_object_move(child, x, y);
2828         evas_object_resize(child, w, h);
2829      }
2830
2831    ELM_WIN_DATA_GET(data, sd);
2832    evas_object_size_hint_weight_set(sd->layout, weight_x, weight_y);
2833    evas_object_smart_changed(sd->layout);
2834 }
2835
2836 static void
2837 _win_constructor(Eo *obj, void *_pd, va_list *list)
2838 {
2839    Elm_Win_Smart_Data *sd = _pd;
2840    sd->obj = obj; // in ctor
2841
2842    const char *name = va_arg(*list, const char *);
2843    Elm_Win_Type type = va_arg(*list, Elm_Win_Type);
2844    Evas_Object *parent;
2845    Evas *e;
2846    const Eina_List *l;
2847    const char *fontpath, *engine = NULL, *enginelist[32], *disp;
2848    int i;
2849
2850    Elm_Win_Smart_Data tmp_sd;
2851
2852    eo_do(obj, eo_parent_get(&parent));
2853
2854    /* just to store some data while trying out to create a canvas */
2855    memset(&tmp_sd, 0, sizeof(Elm_Win_Smart_Data));
2856
2857    switch (type)
2858      {
2859       case ELM_WIN_INLINED_IMAGE:
2860         if (!parent) break;
2861           {
2862              e = evas_object_evas_get(parent);
2863              Ecore_Evas *ee;
2864
2865              if (!e) break;
2866
2867              ee = ecore_evas_ecore_evas_get(e);
2868              if (!ee) break;
2869
2870              tmp_sd.img_obj = ecore_evas_object_image_new(ee);
2871              if (!tmp_sd.img_obj) break;
2872
2873              tmp_sd.ee = ecore_evas_object_ecore_evas_get(tmp_sd.img_obj);
2874              if (!tmp_sd.ee)
2875                {
2876                   ELM_SAFE_FREE(tmp_sd.img_obj, evas_object_del);
2877                }
2878           }
2879         break;
2880
2881       case ELM_WIN_SOCKET_IMAGE:
2882         tmp_sd.ee = ecore_evas_extn_socket_new(1, 1);
2883         break;
2884
2885       default:
2886         disp = getenv("ELM_DISPLAY");
2887         if ((disp) && (!strcmp(disp, "x11")))
2888           {
2889              enginelist[0] = ENGINE_GET();
2890              enginelist[1] = ELM_SOFTWARE_X11;
2891              enginelist[2] = ELM_OPENGL_X11;
2892              enginelist[3] = NULL;
2893           }
2894         else if ((disp) && (!strcmp(disp, "wl")))
2895           {
2896              enginelist[0] = ENGINE_GET();
2897              enginelist[1] = ELM_WAYLAND_SHM;
2898              enginelist[2] = ELM_WAYLAND_EGL;
2899              enginelist[3] = NULL;
2900           }
2901         else if ((disp) && (!strcmp(disp, "win")))
2902           {
2903              enginelist[0] = ENGINE_GET();
2904              enginelist[1] = ELM_SOFTWARE_WIN32;
2905              enginelist[2] = NULL;
2906           }
2907         else if ((disp) && (!strcmp(disp, "sdl")))
2908           {
2909              enginelist[0] = ENGINE_GET();
2910              enginelist[1] = ELM_SOFTWARE_SDL;
2911              enginelist[2] = ELM_OPENGL_SDL;
2912              enginelist[3] = NULL;
2913           }
2914         else if ((disp) && (!strcmp(disp, "mac")))
2915           {
2916              enginelist[0] = ENGINE_GET();
2917              enginelist[1] = ELM_OPENGL_COCOA;
2918              enginelist[2] = NULL;
2919           }
2920         else if ((disp) && (!strcmp(disp, "ews")))
2921           {
2922              enginelist[0] = ENGINE_GET();
2923              enginelist[1] = ELM_EWS;
2924              enginelist[2] = NULL;
2925           }
2926         else if ((disp) && (!strcmp(disp, "fb")))
2927           {
2928              enginelist[0] = ENGINE_GET();
2929              enginelist[1] = ELM_SOFTWARE_FB;
2930              enginelist[2] = NULL;
2931           }
2932         else if ((disp) && (!strcmp(disp, "buffer")))
2933           {
2934              enginelist[0] = ENGINE_GET();
2935              enginelist[1] = ELM_BUFFER;
2936              enginelist[2] = NULL;
2937           }
2938         else if ((disp) && (!strcmp(disp, "ps3")))
2939           {
2940              enginelist[0] = ENGINE_GET();
2941              enginelist[1] = ELM_SOFTWARE_PSL1GHT;
2942              enginelist[2] = NULL;
2943           }
2944         else if ((disp) && (!strcmp(disp, "shot")))
2945           {
2946              enginelist[0] = ENGINE_GET();
2947              enginelist[1] = NULL;
2948           }
2949         else
2950           {
2951              enginelist[0] = ENGINE_GET();
2952              enginelist[1] = ELM_SOFTWARE_X11;
2953              enginelist[2] = ELM_WAYLAND_SHM;
2954              enginelist[3] = ELM_SOFTWARE_FB;
2955              enginelist[4] = ELM_OPENGL_COCOA;
2956              enginelist[5] = ELM_SOFTWARE_SDL;
2957              enginelist[6] = NULL;
2958           }
2959         for (i = 0; i < 30; i++)
2960           {
2961              if ((i > 0) && (!enginelist[i])) break;
2962              if (!strcmp(enginelist[i], ELM_SOFTWARE_X11))
2963                tmp_sd.ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, 1, 1);
2964              else if (!strcmp(enginelist[i], ELM_OPENGL_X11))
2965                {
2966                   int opt[10], opt_i = 0;
2967
2968                   if (_elm_config->vsync)
2969                     {
2970                        opt[opt_i++] = ECORE_EVAS_GL_X11_OPT_VSYNC;
2971                        opt[opt_i++] = 1;
2972                        opt[opt_i++] = 0;
2973                     }
2974                   if (opt_i > 0)
2975                     tmp_sd.ee = ecore_evas_gl_x11_options_new(NULL, 0, 0, 0, 1, 1, opt);
2976                   else
2977                     tmp_sd.ee = ecore_evas_gl_x11_new(NULL, 0, 0, 0, 1, 1);
2978                }
2979              else if (!strcmp(enginelist[i], ELM_WAYLAND_SHM))
2980                tmp_sd.ee = ecore_evas_wayland_shm_new(NULL, 0, 0, 0, 1, 1, 0);
2981              else if (!strcmp(enginelist[i], ELM_WAYLAND_EGL))
2982                tmp_sd.ee = ecore_evas_wayland_egl_new(NULL, 0, 0, 0, 1, 1, 0);
2983              else if (!strcmp(enginelist[i], ELM_SOFTWARE_WIN32))
2984                tmp_sd.ee = ecore_evas_software_gdi_new(NULL, 0, 0, 1, 1);
2985              else if (!strcmp(enginelist[i], ELM_SOFTWARE_SDL))
2986                tmp_sd.ee = ecore_evas_sdl_new(NULL, 0, 0, 0, 0, 0, 1);
2987              else if (!strcmp(enginelist[i], ELM_OPENGL_SDL))
2988                tmp_sd.ee = ecore_evas_gl_sdl_new(NULL, 1, 1, 0, 0);
2989              else if (!strcmp(enginelist[i], ELM_OPENGL_COCOA))
2990                tmp_sd.ee = ecore_evas_cocoa_new(NULL, 1, 1, 0, 0);
2991              else if (!strcmp(enginelist[i], ELM_EWS))
2992                tmp_sd.ee = ecore_evas_ews_new(0, 0, 1, 1);
2993              else if (!strcmp(enginelist[i], ELM_SOFTWARE_FB))
2994                tmp_sd.ee = ecore_evas_fb_new(NULL, 0, 1, 1);
2995              else if (!strcmp(enginelist[i], ELM_BUFFER))
2996                tmp_sd.ee = ecore_evas_buffer_new(1, 1);
2997              else if (!strcmp(enginelist[i], ELM_SOFTWARE_PSL1GHT))
2998                tmp_sd.ee = ecore_evas_psl1ght_new(NULL, 1, 1);
2999              else if (!strncmp(enginelist[i], "shot:", 5))
3000                {
3001                   tmp_sd.ee = ecore_evas_buffer_new(1, 1);
3002                   ecore_evas_manual_render_set(tmp_sd.ee, EINA_TRUE);
3003                   tmp_sd.shot.info = eina_stringshare_add(ENGINE_GET() + 5);
3004                }
3005              engine = enginelist[i];
3006              if (tmp_sd.ee) break;
3007           }
3008         break;
3009      }
3010
3011    if (!tmp_sd.ee)
3012      {
3013         ERR("Cannot create window.");
3014         eo_error_set(obj);
3015         return;
3016      }
3017
3018    eo_do(obj, eo_parent_set(ecore_evas_get(tmp_sd.ee)));
3019    eo_do_super(obj, MY_CLASS, eo_constructor());
3020    eo_do(obj,
3021          evas_obj_type_set(MY_CLASS_NAME_LEGACY),
3022          evas_obj_smart_callbacks_descriptions_set(_smart_callbacks, NULL));
3023
3024    if (getenv("ELM_FIRST_FRAME"))
3025      evas_event_callback_add(ecore_evas_get(tmp_sd.ee), EVAS_CALLBACK_RENDER_POST,
3026                              _elm_win_first_frame_do, getenv("ELM_FIRST_FRAME"));
3027
3028    /* copying possibly altered fields back */
3029 #define SD_CPY(_field)             \
3030   do                               \
3031     {                              \
3032        sd->_field = tmp_sd._field; \
3033     } while (0)
3034
3035    SD_CPY(ee);
3036    SD_CPY(img_obj);
3037    SD_CPY(shot.info);
3038 #undef SD_CPY
3039
3040    if ((trap) && (trap->add))
3041      sd->trap_data = trap->add(obj);
3042
3043    /* complementary actions, which depend on final smart data
3044     * pointer */
3045    if (type == ELM_WIN_INLINED_IMAGE)
3046      _win_inlined_image_set(sd);
3047
3048 #ifdef HAVE_ELEMENTARY_X
3049    else if (ENGINE_COMPARE(ELM_SOFTWARE_X11) ||
3050             ENGINE_COMPARE(ELM_OPENGL_X11))
3051      {
3052         sd->x.client_message_handler = ecore_event_handler_add
3053             (ECORE_X_EVENT_CLIENT_MESSAGE, _elm_win_client_message, obj);
3054         sd->x.property_handler = ecore_event_handler_add
3055             (ECORE_X_EVENT_WINDOW_PROPERTY, _elm_win_property_change, obj);
3056      }
3057 #endif
3058    else if (!strncmp(ENGINE_GET(), "shot:", 5))
3059      _shot_init(sd);
3060
3061    sd->kbdmode = ELM_WIN_KEYBOARD_UNKNOWN;
3062    sd->indmode = ELM_WIN_INDICATOR_UNKNOWN;
3063
3064 #ifdef HAVE_ELEMENTARY_X
3065    _elm_win_xwindow_get(sd);
3066    if (sd->x.xwin)
3067      {
3068         ecore_x_io_error_handler_set(_elm_x_io_err, NULL);
3069      }
3070 #endif
3071
3072 #ifdef HAVE_ELEMENTARY_WAYLAND
3073    if ((ENGINE_COMPARE(ELM_WAYLAND_SHM)) || (ENGINE_COMPARE(ELM_WAYLAND_EGL)))
3074      _elm_win_wlwindow_get(sd);
3075 #endif
3076
3077    if ((_elm_config->bgpixmap)
3078 #ifdef HAVE_ELEMENTARY_X
3079        &&
3080        (((sd->x.xwin) && (!ecore_x_screen_is_composited(0))) ||
3081            (!sd->x.xwin)))
3082 #else
3083       )
3084 #endif
3085      TRAP(sd, avoid_damage_set, ECORE_EVAS_AVOID_DAMAGE_EXPOSE);
3086    // bg pixmap done by x - has other issues like can be redrawn by x before it
3087    // is filled/ready by app
3088    //     TRAP(sd, avoid_damage_set, ECORE_EVAS_AVOID_DAMAGE_BUILT_IN);
3089
3090    sd->type = type;
3091    sd->parent = parent;
3092
3093    if (sd->parent)
3094      evas_object_event_callback_add
3095        (sd->parent, EVAS_CALLBACK_DEL, _elm_win_on_parent_del, obj);
3096
3097    sd->evas = ecore_evas_get(sd->ee);
3098
3099    evas_object_color_set(obj, 0, 0, 0, 0);
3100    evas_object_move(obj, 0, 0);
3101    evas_object_resize(obj, 1, 1);
3102    evas_object_layer_set(obj, 50);
3103    evas_object_pass_events_set(obj, EINA_TRUE);
3104
3105    if (type == ELM_WIN_INLINED_IMAGE)
3106      elm_widget_parent2_set(obj, parent);
3107
3108    /* use own version of ecore_evas_object_associate() that does TRAP() */
3109    ecore_evas_data_set(sd->ee, "elm_win", obj);
3110
3111    evas_object_event_callback_add
3112      (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
3113       _elm_win_obj_callback_changed_size_hints, obj);
3114
3115    evas_object_intercept_raise_callback_add
3116      (obj, _elm_win_obj_intercept_raise, obj);
3117    evas_object_intercept_lower_callback_add
3118      (obj, _elm_win_obj_intercept_lower, obj);
3119    evas_object_intercept_stack_above_callback_add
3120      (obj, _elm_win_obj_intercept_stack_above, obj);
3121    evas_object_intercept_stack_below_callback_add
3122      (obj, _elm_win_obj_intercept_stack_below, obj);
3123    evas_object_intercept_layer_set_callback_add
3124      (obj, _elm_win_obj_intercept_layer_set, obj);
3125    evas_object_intercept_show_callback_add
3126      (obj, _elm_win_obj_intercept_show, obj);
3127
3128    TRAP(sd, name_class_set, name, _elm_appname);
3129    ecore_evas_callback_delete_request_set(sd->ee, _elm_win_delete_request);
3130    ecore_evas_callback_resize_set(sd->ee, _elm_win_resize);
3131    ecore_evas_callback_mouse_in_set(sd->ee, _elm_win_mouse_in);
3132    ecore_evas_callback_focus_in_set(sd->ee, _elm_win_focus_in);
3133    ecore_evas_callback_focus_out_set(sd->ee, _elm_win_focus_out);
3134    ecore_evas_callback_move_set(sd->ee, _elm_win_move);
3135    ecore_evas_callback_state_change_set(sd->ee, _elm_win_state_change);
3136    evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _elm_win_cb_hide, NULL);
3137    evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _elm_win_cb_show, NULL);
3138
3139    evas_image_cache_set(sd->evas, (_elm_config->image_cache * 1024));
3140    evas_font_cache_set(sd->evas, (_elm_config->font_cache * 1024));
3141
3142    EINA_LIST_FOREACH(_elm_config->font_dirs, l, fontpath)
3143      evas_font_path_append(sd->evas, fontpath);
3144
3145    if (!_elm_config->font_hinting)
3146      evas_font_hinting_set(sd->evas, EVAS_FONT_HINTING_NONE);
3147    else if (_elm_config->font_hinting == 1)
3148      evas_font_hinting_set(sd->evas, EVAS_FONT_HINTING_AUTO);
3149    else if (_elm_config->font_hinting == 2)
3150      evas_font_hinting_set(sd->evas, EVAS_FONT_HINTING_BYTECODE);
3151
3152 #ifdef HAVE_ELEMENTARY_X
3153    _elm_win_xwin_update(sd);
3154 #endif
3155
3156    _elm_win_list = eina_list_append(_elm_win_list, obj);
3157    _elm_win_count++;
3158
3159    if (!strcmp(engine, ELM_SOFTWARE_FB))
3160      {
3161         TRAP(sd, fullscreen_set, 1);
3162      }
3163    else if ((type != ELM_WIN_INLINED_IMAGE) &&
3164             (!strcmp(engine, ELM_WAYLAND_SHM) ||
3165             (!strcmp(engine, ELM_WAYLAND_EGL))))
3166      _elm_win_frame_add(sd, "default");
3167
3168    if (_elm_config->focus_highlight_enable)
3169      elm_win_focus_highlight_enabled_set(obj, EINA_TRUE);
3170    if (_elm_config->focus_highlight_animate)
3171      elm_win_focus_highlight_animate_set(obj, EINA_TRUE);
3172
3173 #ifdef ELM_DEBUG
3174    Evas_Modifier_Mask mask = evas_key_modifier_mask_get(sd->evas, "Control");
3175    evas_object_event_callback_add
3176      (obj, EVAS_CALLBACK_KEY_DOWN, _debug_key_down, NULL);
3177
3178    if (evas_object_key_grab(obj, "F12", mask, 0, EINA_TRUE))
3179      INF("Ctrl+F12 key combination exclusive for dot tree generation\n");
3180    else
3181      ERR("failed to grab F12 key to elm widgets (dot) tree generation");
3182 #endif
3183
3184    if ((_elm_config->softcursor_mode == ELM_SOFTCURSOR_MODE_ON) ||
3185        ((_elm_config->softcursor_mode == ELM_SOFTCURSOR_MODE_AUTO) &&
3186         (!strcmp(engine, ELM_SOFTWARE_FB))))
3187      {
3188         Evas_Object *o;
3189         Evas_Coord mw = 1, mh = 1, hx = 0, hy = 0;
3190
3191         sd->pointer.obj = o = edje_object_add(ecore_evas_get(tmp_sd.ee));
3192         _elm_theme_object_set(obj, o, "pointer", "base", "default");
3193         edje_object_size_min_calc(o, &mw, &mh);
3194         evas_object_resize(o, mw, mh);
3195         edje_object_part_geometry_get(o, "elm.swallow.hotspot",
3196                                       &hx, &hy, NULL, NULL);
3197         sd->pointer.hot_x = hx;
3198         sd->pointer.hot_y = hy;
3199         evas_object_show(o);
3200         ecore_evas_object_cursor_set(tmp_sd.ee, o, EVAS_LAYER_MAX, hx, hy);
3201      }
3202    else if (_elm_config->softcursor_mode == ELM_SOFTCURSOR_MODE_OFF)
3203      {
3204         // do nothing
3205      }
3206
3207    sd->wm_rot.wm_supported = ecore_evas_wm_rotation_supported_get(sd->ee);
3208    sd->wm_rot.preferred_rot = -1; // it means that elm_win doesn't use preferred rotation.
3209
3210    sd->layout = edje_object_add(sd->evas);
3211    _elm_theme_object_set(obj, sd->layout, "win", "base", "default");
3212    sd->box = evas_object_box_add(sd->evas);
3213    evas_object_box_layout_set(sd->box, _window_layout_stack, obj, NULL);
3214    edje_object_part_swallow(sd->layout, "elm.swallow.contents", sd->box);
3215    evas_object_move(sd->layout, 0, 0);
3216    evas_object_resize(sd->layout, 1, 1);
3217    edje_object_update_hints_set(sd->layout, EINA_TRUE);
3218    evas_object_event_callback_add(sd->layout, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
3219                                   _elm_win_on_resize_obj_changed_size_hints, obj);
3220    evas_object_show(sd->layout);
3221 }
3222
3223 static void
3224 _constructor(Eo *obj, void *_pd EINA_UNUSED, va_list *list EINA_UNUSED)
3225 {
3226    eo_error_set(obj);
3227    ERR("only custom constructor can be used with '%s' class", MY_CLASS_NAME);
3228 }
3229
3230 EAPI Elm_Win_Type
3231 elm_win_type_get(const Evas_Object *obj)
3232 {
3233    ELM_WIN_CHECK(obj) ELM_WIN_UNKNOWN;
3234    Elm_Win_Type ret = ELM_WIN_UNKNOWN;
3235    eo_do((Eo *) obj, elm_obj_win_type_get(&ret));
3236    return ret;
3237 }
3238
3239 static void
3240 _type_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3241 {
3242    Elm_Win_Type *ret = va_arg(*list, Elm_Win_Type *);
3243    Elm_Win_Smart_Data *sd = _pd;
3244    *ret = sd->type;
3245 }
3246
3247 EAPI Evas_Object *
3248 elm_win_util_standard_add(const char *name,
3249                           const char *title)
3250 {
3251    Evas_Object *win, *bg;
3252
3253    win = elm_win_add(NULL, name, ELM_WIN_BASIC);
3254    if (!win) return NULL;
3255
3256    elm_win_title_set(win, title);
3257    bg = elm_bg_add(win);
3258    if (!bg)
3259      {
3260         evas_object_del(win);
3261         return NULL;
3262      }
3263    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3264    elm_win_resize_object_add(win, bg);
3265    evas_object_show(bg);
3266
3267    return win;
3268 }
3269
3270 EAPI void
3271 elm_win_resize_object_add(Evas_Object *obj,
3272                           Evas_Object *subobj)
3273 {
3274    ELM_WIN_CHECK(obj);
3275    eo_do(obj, elm_obj_win_resize_object_add(subobj));
3276 }
3277
3278 static void
3279 _resize_object_add(Eo *obj, void *_pd, va_list *list)
3280 {
3281    Evas_Object *subobj = va_arg(*list, Evas_Object *);
3282
3283    Elm_Win_Smart_Data *sd = _pd;
3284
3285    elm_widget_sub_object_add(obj, subobj);
3286
3287    if (!evas_object_box_append(sd->box, subobj))
3288      ERR("could not append %p to box", subobj);
3289 }
3290
3291 EAPI void
3292 elm_win_resize_object_del(Evas_Object *obj,
3293                           Evas_Object *subobj)
3294 {
3295    ELM_WIN_CHECK(obj);
3296    eo_do(obj, elm_obj_win_resize_object_del(subobj));
3297 }
3298
3299 static void
3300 _resize_object_del(Eo *obj, void *_pd, va_list *list)
3301 {
3302    Evas_Object *subobj = va_arg(*list, Evas_Object *);
3303    Elm_Win_Smart_Data *sd = _pd;
3304
3305    if (!elm_widget_sub_object_del(obj, subobj))
3306      ERR("could not remove sub object %p from %p", subobj, obj);
3307
3308    evas_object_box_remove(sd->box, subobj);
3309 }
3310
3311 EAPI void
3312 elm_win_title_set(Evas_Object *obj,
3313                   const char *title)
3314 {
3315    ELM_WIN_CHECK(obj);
3316    eo_do(obj, elm_obj_win_title_set(title));
3317 }
3318
3319 static void
3320 _title_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3321 {
3322    const char *title = va_arg(*list, const char *);
3323    Elm_Win_Smart_Data *sd = _pd;
3324
3325    if (!title) return;
3326    eina_stringshare_replace(&(sd->title), title);
3327    TRAP(sd, title_set, sd->title);
3328    if (sd->frame_obj)
3329      edje_object_part_text_escaped_set
3330        (sd->frame_obj, "elm.text.title", sd->title);
3331 }
3332
3333 EAPI const char *
3334 elm_win_title_get(const Evas_Object *obj)
3335 {
3336    ELM_WIN_CHECK(obj) NULL;
3337    const char *ret = NULL;
3338    eo_do((Eo *) obj, elm_obj_win_title_get(&ret));
3339    return ret;
3340 }
3341
3342 static void
3343 _title_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3344 {
3345    const char **ret = va_arg(*list, const char **);
3346    Elm_Win_Smart_Data *sd = _pd;
3347    *ret = sd->title;
3348 }
3349
3350 EAPI void
3351 elm_win_icon_name_set(Evas_Object *obj,
3352                       const char *icon_name)
3353 {
3354    ELM_WIN_CHECK(obj);
3355    eo_do(obj, elm_obj_win_icon_name_set(icon_name));
3356 }
3357
3358 static void
3359 _icon_name_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3360 {
3361    const char *icon_name = va_arg(*list, const char *);
3362    Elm_Win_Smart_Data *sd = _pd;
3363
3364    if (!icon_name) return;
3365    eina_stringshare_replace(&(sd->icon_name), icon_name);
3366 #ifdef HAVE_ELEMENTARY_X
3367    _elm_win_xwin_update(sd);
3368 #endif
3369 }
3370
3371 EAPI const char *
3372 elm_win_icon_name_get(const Evas_Object *obj)
3373 {
3374    ELM_WIN_CHECK(obj) NULL;
3375    const char *ret = NULL;
3376    eo_do((Eo *) obj, elm_obj_win_icon_name_get(&ret));
3377    return ret;
3378 }
3379
3380 static void
3381 _icon_name_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3382 {
3383    const char **ret = va_arg(*list, const char **);
3384    Elm_Win_Smart_Data *sd = _pd;
3385    *ret = sd->icon_name;
3386 }
3387
3388 EAPI void
3389 elm_win_role_set(Evas_Object *obj, const char *role)
3390 {
3391    ELM_WIN_CHECK(obj);
3392    eo_do(obj, elm_obj_win_role_set(role));
3393 }
3394
3395 static void
3396 _role_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3397 {
3398    const char *role = va_arg(*list, const char *);
3399    Elm_Win_Smart_Data *sd = _pd;
3400
3401    if (!role) return;
3402    eina_stringshare_replace(&(sd->role), role);
3403 #ifdef HAVE_ELEMENTARY_X
3404    _elm_win_xwin_update(sd);
3405 #endif
3406 }
3407
3408 EAPI const char *
3409 elm_win_role_get(const Evas_Object *obj)
3410 {
3411    ELM_WIN_CHECK(obj) NULL;
3412    const char *ret = NULL;
3413    eo_do((Eo *) obj, elm_obj_win_role_get(&ret));
3414    return ret;
3415 }
3416
3417 static void
3418 _role_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3419 {
3420    const char **ret = va_arg(*list, const char **);
3421    Elm_Win_Smart_Data *sd = _pd;
3422    *ret = sd->role;
3423 }
3424
3425 EAPI void
3426 elm_win_icon_object_set(Evas_Object *obj,
3427                         Evas_Object *icon)
3428 {
3429    ELM_WIN_CHECK(obj);
3430    eo_do(obj, elm_obj_win_icon_object_set(icon));
3431 }
3432
3433 static void
3434 _icon_object_set(Eo *obj, void *_pd, va_list *list)
3435 {
3436    Evas_Object *icon = va_arg(*list, Evas_Object *);
3437    Elm_Win_Smart_Data *sd = _pd;
3438
3439    if (sd->icon)
3440      evas_object_event_callback_del_full
3441        (sd->icon, EVAS_CALLBACK_DEL, _elm_win_on_icon_del, obj);
3442    sd->icon = icon;
3443    if (sd->icon)
3444      evas_object_event_callback_add
3445        (sd->icon, EVAS_CALLBACK_DEL, _elm_win_on_icon_del, obj);
3446 #ifdef HAVE_ELEMENTARY_X
3447    _elm_win_xwin_update(sd);
3448 #endif
3449 }
3450
3451 EAPI const Evas_Object *
3452 elm_win_icon_object_get(const Evas_Object *obj)
3453 {
3454    ELM_WIN_CHECK(obj) NULL;
3455    const Evas_Object *ret = NULL;
3456    eo_do((Eo *) obj, elm_obj_win_icon_object_get(&ret));
3457    return ret;
3458 }
3459
3460 static void
3461 _icon_object_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3462 {
3463    const Evas_Object **ret = va_arg(*list, const Evas_Object **);
3464    Elm_Win_Smart_Data *sd = _pd;
3465    *ret = sd->icon;
3466 }
3467
3468 EAPI void
3469 elm_win_autodel_set(Evas_Object *obj,
3470                     Eina_Bool autodel)
3471 {
3472    ELM_WIN_CHECK(obj);
3473    eo_do(obj, elm_obj_win_autodel_set(autodel));
3474 }
3475
3476 static void
3477 _autodel_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3478 {
3479    Eina_Bool autodel = va_arg(*list, int);
3480    Elm_Win_Smart_Data *sd = _pd;
3481    sd->autodel = autodel;
3482 }
3483
3484 EAPI Eina_Bool
3485 elm_win_autodel_get(const Evas_Object *obj)
3486 {
3487    ELM_WIN_CHECK(obj) EINA_FALSE;
3488    Eina_Bool ret = EINA_FALSE;
3489    eo_do((Eo *) obj, elm_obj_win_autodel_get(&ret));
3490    return ret;
3491 }
3492
3493 static void
3494 _autodel_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3495 {
3496    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
3497    Elm_Win_Smart_Data *sd = _pd;
3498    *ret = sd->autodel;
3499 }
3500
3501 EAPI void
3502 elm_win_activate(Evas_Object *obj)
3503 {
3504    ELM_WIN_CHECK(obj);
3505    eo_do(obj, elm_obj_win_activate());
3506 }
3507
3508 static void
3509 _activate(Eo *obj EINA_UNUSED, void *_pd, va_list *list EINA_UNUSED)
3510 {
3511    Elm_Win_Smart_Data *sd = _pd;
3512    TRAP(sd, activate);
3513 }
3514
3515 EAPI void
3516 elm_win_lower(Evas_Object *obj)
3517 {
3518    ELM_WIN_CHECK(obj);
3519    eo_do(obj, elm_obj_win_lower());
3520 }
3521
3522 static void
3523 _lower(Eo *obj EINA_UNUSED, void *_pd, va_list *list EINA_UNUSED)
3524 {
3525    Elm_Win_Smart_Data *sd = _pd;
3526    TRAP(sd, lower);
3527 }
3528
3529 EAPI void
3530 elm_win_raise(Evas_Object *obj)
3531 {
3532    ELM_WIN_CHECK(obj);
3533    eo_do(obj, elm_obj_win_raise());
3534 }
3535
3536 static void
3537 _raise(Eo *obj EINA_UNUSED, void *_pd, va_list *list EINA_UNUSED)
3538 {
3539    Elm_Win_Smart_Data *sd = _pd;
3540    TRAP(sd, raise);
3541 }
3542
3543 EAPI void
3544 elm_win_center(Evas_Object *obj,
3545                Eina_Bool h,
3546                Eina_Bool v)
3547 {
3548    ELM_WIN_CHECK(obj);
3549    eo_do(obj, elm_obj_win_center(h, v));
3550 }
3551
3552 static void
3553 _center(Eo *obj, void *_pd, va_list *list)
3554 {
3555    Eina_Bool h = va_arg(*list, int);
3556    Eina_Bool v = va_arg(*list, int);
3557    int win_w, win_h, screen_w, screen_h, nx, ny;
3558
3559    Elm_Win_Smart_Data *sd = _pd;
3560
3561    if ((trap) && (trap->center) && (!trap->center(sd->trap_data, obj)))
3562      return;
3563
3564    ecore_evas_screen_geometry_get(sd->ee, NULL, NULL, &screen_w, &screen_h);
3565    if ((!screen_w) || (!screen_h)) return;
3566
3567    evas_object_geometry_get(obj, NULL, NULL, &win_w, &win_h);
3568    if ((!win_w) || (!win_h)) return;
3569
3570    if (h) nx = win_w >= screen_w ? 0 : (screen_w / 2) - (win_w / 2);
3571    else nx = sd->screen.x;
3572    if (v) ny = win_h >= screen_h ? 0 : (screen_h / 2) - (win_h / 2);
3573    else ny = sd->screen.y;
3574    if (nx < 0) nx = 0;
3575    if (ny < 0) ny = 0;
3576
3577    evas_object_move(obj, nx, ny);
3578 }
3579
3580 EAPI void
3581 elm_win_borderless_set(Evas_Object *obj,
3582                        Eina_Bool borderless)
3583 {
3584    ELM_WIN_CHECK(obj);
3585    eo_do(obj, elm_obj_win_borderless_set(borderless));
3586 }
3587
3588 static void
3589 _borderless_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3590 {
3591    Eina_Bool borderless = va_arg(*list, int);
3592    Elm_Win_Smart_Data *sd = _pd;
3593
3594    Eina_Bool need_frame = EINA_FALSE;
3595
3596    const char *engine_name = ecore_evas_engine_name_get(sd->ee);
3597    need_frame = engine_name &&
3598                 ((!strcmp(engine_name, ELM_WAYLAND_SHM)) ||
3599                  (!strcmp(engine_name, ELM_WAYLAND_EGL)));
3600
3601    if (borderless)
3602      {
3603         if (need_frame)
3604           _elm_win_frame_del(sd);
3605      }
3606    else
3607      {
3608         if (need_frame)
3609           _elm_win_frame_add(sd, "default");
3610
3611         if (sd->frame_obj)
3612           evas_object_show(sd->frame_obj);
3613      }
3614
3615    TRAP(sd, borderless_set, borderless);
3616 #ifdef HAVE_ELEMENTARY_X
3617    _elm_win_xwin_update(sd);
3618 #endif
3619 }
3620
3621 EAPI Eina_Bool
3622 elm_win_borderless_get(const Evas_Object *obj)
3623 {
3624    ELM_WIN_CHECK(obj) EINA_FALSE;
3625    Eina_Bool ret = EINA_FALSE;
3626    eo_do((Eo *) obj, elm_obj_win_borderless_get(&ret));
3627    return ret;
3628 }
3629
3630 static void
3631 _borderless_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3632 {
3633    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
3634    Elm_Win_Smart_Data *sd = _pd;
3635    *ret = ecore_evas_borderless_get(sd->ee);
3636 }
3637
3638 EAPI void
3639 elm_win_shaped_set(Evas_Object *obj,
3640                    Eina_Bool shaped)
3641 {
3642    ELM_WIN_CHECK(obj);
3643    eo_do(obj, elm_obj_win_shaped_set(shaped));
3644 }
3645
3646 static void
3647 _shaped_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3648 {
3649    Eina_Bool shaped = va_arg(*list, int);
3650    Elm_Win_Smart_Data *sd = _pd;
3651
3652    TRAP(sd, shaped_set, shaped);
3653 #ifdef HAVE_ELEMENTARY_X
3654    _elm_win_xwin_update(sd);
3655 #endif
3656 }
3657
3658 EAPI Eina_Bool
3659 elm_win_shaped_get(const Evas_Object *obj)
3660 {
3661    ELM_WIN_CHECK(obj) EINA_FALSE;
3662    Eina_Bool ret = EINA_FALSE;
3663    eo_do((Eo *) obj, elm_obj_win_shaped_get(&ret));
3664    return ret;
3665 }
3666
3667 static void
3668 _shaped_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3669 {
3670    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
3671    Elm_Win_Smart_Data *sd = _pd;
3672    *ret = ecore_evas_shaped_get(sd->ee);
3673 }
3674
3675 EAPI void
3676 elm_win_alpha_set(Evas_Object *obj,
3677                   Eina_Bool enabled)
3678 {
3679    ELM_WIN_CHECK(obj);
3680    eo_do(obj, elm_obj_win_alpha_set(enabled));
3681 }
3682
3683 static void
3684 _alpha_set(Eo *obj, void *_pd, va_list *list)
3685 {
3686    Eina_Bool enabled = va_arg(*list, int);
3687    Elm_Win_Smart_Data *sd = _pd;
3688
3689    if (sd->img_obj)
3690      {
3691         evas_object_image_alpha_set(sd->img_obj, enabled);
3692         ecore_evas_alpha_set(sd->ee, enabled);
3693      }
3694    else
3695      {
3696 #ifdef HAVE_ELEMENTARY_X
3697         if (sd->x.xwin)
3698           {
3699              if (enabled)
3700                {
3701                   if (!ecore_x_screen_is_composited(0))
3702                     elm_win_shaped_set(obj, enabled);
3703                   else
3704                     TRAP(sd, alpha_set, enabled);
3705                }
3706              else
3707                TRAP(sd, alpha_set, enabled);
3708              _elm_win_xwin_update(sd);
3709           }
3710         else
3711 #endif
3712           TRAP(sd, alpha_set, enabled);
3713      }
3714 }
3715
3716 EAPI Eina_Bool
3717 elm_win_alpha_get(const Evas_Object *obj)
3718 {
3719    ELM_WIN_CHECK(obj) EINA_FALSE;
3720    Eina_Bool ret = EINA_FALSE;
3721    eo_do((Eo *) obj, elm_obj_win_alpha_get(&ret));
3722    return ret;
3723 }
3724
3725 static void
3726 _alpha_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3727 {
3728    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
3729    Elm_Win_Smart_Data *sd = _pd;
3730
3731    if (sd->img_obj)
3732      {
3733         *ret = evas_object_image_alpha_get(sd->img_obj);
3734      }
3735    else
3736      {
3737         *ret = ecore_evas_alpha_get(sd->ee);
3738      }
3739 }
3740
3741 EAPI void
3742 elm_win_override_set(Evas_Object *obj,
3743                      Eina_Bool override)
3744 {
3745    ELM_WIN_CHECK(obj);
3746    eo_do(obj, elm_obj_win_override_set(override));
3747 }
3748
3749 static void
3750 _override_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3751 {
3752    Eina_Bool override = va_arg(*list, int);
3753    Elm_Win_Smart_Data *sd = _pd;
3754
3755    TRAP(sd, override_set, override);
3756 #ifdef HAVE_ELEMENTARY_X
3757    _elm_win_xwin_update(sd);
3758 #endif
3759 }
3760
3761 EAPI Eina_Bool
3762 elm_win_override_get(const Evas_Object *obj)
3763 {
3764    ELM_WIN_CHECK(obj) EINA_FALSE;
3765    Eina_Bool ret = EINA_FALSE;
3766    eo_do((Eo *) obj, elm_obj_win_override_get(&ret));
3767    return ret;
3768 }
3769
3770 static void
3771 _override_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3772 {
3773    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
3774    Elm_Win_Smart_Data *sd = _pd;
3775    *ret = ecore_evas_override_get(sd->ee);
3776 }
3777
3778 EAPI void
3779 elm_win_fullscreen_set(Evas_Object *obj,
3780                        Eina_Bool fullscreen)
3781 {
3782    ELM_WIN_CHECK(obj);
3783    eo_do(obj, elm_obj_win_fullscreen_set(fullscreen));
3784 }
3785
3786 static void
3787 _fullscreen_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3788 {
3789    Eina_Bool fullscreen = va_arg(*list, int);
3790    Elm_Win_Smart_Data *sd = _pd;
3791    // YYY: handle if sd->img_obj
3792    if (ENGINE_COMPARE(ELM_SOFTWARE_FB) ||
3793        ENGINE_COMPARE(ELM_SOFTWARE_16_WINCE))
3794      {
3795         // these engines... can ONLY be fullscreen
3796         return;
3797      }
3798    else
3799      {
3800 //        sd->fullscreen = fullscreen;
3801
3802         Eina_Bool need_frame = EINA_FALSE;
3803
3804         const char *engine_name = ecore_evas_engine_name_get(sd->ee);
3805         need_frame = engine_name &&
3806                      ((!strcmp(engine_name, ELM_WAYLAND_SHM)) ||
3807                       (!strcmp(engine_name, ELM_WAYLAND_EGL)));
3808
3809         TRAP(sd, fullscreen_set, fullscreen);
3810
3811         if (fullscreen)
3812           {
3813              if (need_frame)
3814                _elm_win_frame_del(sd);
3815           }
3816         else
3817           {
3818              if (need_frame)
3819                _elm_win_frame_add(sd, "default");
3820
3821              if (sd->frame_obj)
3822                evas_object_show(sd->frame_obj);
3823           }
3824 #ifdef HAVE_ELEMENTARY_X
3825         _elm_win_xwin_update(sd);
3826 #endif
3827      }
3828 }
3829
3830 EAPI Eina_Bool
3831 elm_win_fullscreen_get(const Evas_Object *obj)
3832 {
3833    ELM_WIN_CHECK(obj) EINA_FALSE;
3834    Eina_Bool ret = EINA_FALSE;
3835    eo_do((Eo *) obj, elm_obj_win_fullscreen_get(&ret));
3836    return ret;
3837 }
3838
3839 static void
3840 _fullscreen_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3841 {
3842    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
3843    Elm_Win_Smart_Data *sd = _pd;
3844
3845    if (!ret) return;
3846
3847    const char* engine_name = ecore_evas_engine_name_get(sd->ee);
3848
3849    if (engine_name &&
3850        ((!strcmp(engine_name, ELM_SOFTWARE_FB)) ||
3851         (!strcmp(engine_name, ELM_SOFTWARE_16_WINCE))))
3852      {
3853         // these engines... can ONLY be fullscreen
3854         *ret = EINA_TRUE;
3855      }
3856    else
3857      {
3858         *ret = sd->fullscreen;
3859      }
3860 }
3861
3862 EAPI Evas_Object *
3863 elm_win_main_menu_get(const Evas_Object *obj)
3864 {
3865    ELM_WIN_CHECK(obj) NULL;
3866    Evas_Object *ret;
3867    eo_do((Eo *) obj, elm_obj_win_main_menu_get(&ret));
3868    return ret;
3869 }
3870
3871 static void
3872 _dbus_menu_set(Eina_Bool dbus_connect, void *data)
3873 {
3874    ELM_WIN_DATA_GET_OR_RETURN(data, sd);
3875
3876    if (dbus_connect)
3877      {
3878         DBG("Setting menu to D-Bus");
3879         edje_object_part_unswallow(sd->layout, sd->main_menu);
3880         edje_object_signal_emit(sd->layout, "elm,action,hide_menu", "elm");
3881         _elm_menu_menu_bar_hide(sd->main_menu);
3882      }
3883    else
3884      {
3885         DBG("Setting menu to local mode");
3886         edje_object_part_swallow(sd->layout, "elm.swallow.menu", sd->main_menu);
3887         edje_object_signal_emit(sd->layout, "elm,action,show_menu", "elm");
3888         evas_object_show(sd->main_menu);
3889      }
3890 }
3891
3892 static void
3893 _main_menu_get(Eo *obj, void *_pd, va_list *list)
3894 {
3895    Eo **ret = va_arg(*list, Eo **);
3896    Elm_Win_Smart_Data *sd = _pd;
3897    Eina_Bool use_dbus = EINA_FALSE;
3898
3899    if (sd->main_menu) goto end;
3900
3901    sd->main_menu = elm_menu_add(obj);
3902    _elm_menu_menu_bar_set(sd->main_menu, EINA_TRUE);
3903
3904 #ifdef HAVE_ELEMENTARY_X
3905    if (!_elm_config->disable_external_menu && sd->x.xwin) use_dbus = EINA_TRUE;
3906 #endif
3907
3908 #ifdef HAVE_ELEMENTARY_X
3909    if (use_dbus && _elm_dbus_menu_register(sd->main_menu))
3910      {
3911         _elm_dbus_menu_app_menu_register(sd->x.xwin, sd->main_menu,
3912                                          _dbus_menu_set, obj);
3913      }
3914    else
3915 #endif
3916      _dbus_menu_set(EINA_FALSE, obj);
3917
3918 end:
3919    *ret = sd->main_menu;
3920 }
3921
3922 EAPI void
3923 elm_win_maximized_set(Evas_Object *obj,
3924                       Eina_Bool maximized)
3925 {
3926    ELM_WIN_CHECK(obj);
3927    eo_do(obj, elm_obj_win_maximized_set(maximized));
3928 }
3929
3930 static void
3931 _maximized_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3932 {
3933    Eina_Bool maximized = va_arg(*list, int);
3934    Elm_Win_Smart_Data *sd = _pd;
3935
3936    _elm_win_frame_maximized_state_update(sd, maximized);
3937    // YYY: handle if sd->img_obj
3938    TRAP(sd, maximized_set, maximized);
3939 #ifdef HAVE_ELEMENTARY_X
3940    _elm_win_xwin_update(sd);
3941 #endif
3942 }
3943
3944 EAPI Eina_Bool
3945 elm_win_maximized_get(const Evas_Object *obj)
3946 {
3947    ELM_WIN_CHECK(obj) EINA_FALSE;
3948    Eina_Bool ret = EINA_FALSE;
3949    eo_do((Eo *) obj, elm_obj_win_maximized_get(&ret));
3950    return ret;
3951 }
3952
3953 static void
3954 _maximized_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3955 {
3956    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
3957    Elm_Win_Smart_Data *sd = _pd;
3958    *ret = sd->maximized;
3959 }
3960
3961 EAPI void
3962 elm_win_iconified_set(Evas_Object *obj,
3963                       Eina_Bool iconified)
3964 {
3965    ELM_WIN_CHECK(obj);
3966    eo_do(obj, elm_obj_win_iconified_set(iconified));
3967 }
3968
3969 static void
3970 _iconified_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3971 {
3972    Eina_Bool iconified = va_arg(*list, int);
3973    Elm_Win_Smart_Data *sd = _pd;
3974
3975 //   sd->iconified = iconified;
3976    TRAP(sd, iconified_set, iconified);
3977 #ifdef HAVE_ELEMENTARY_X
3978    _elm_win_xwin_update(sd);
3979 #endif
3980 }
3981
3982 EAPI Eina_Bool
3983 elm_win_iconified_get(const Evas_Object *obj)
3984 {
3985    ELM_WIN_CHECK(obj) EINA_FALSE;
3986    Eina_Bool ret = EINA_FALSE;
3987    eo_do((Eo *) obj, elm_obj_win_iconified_get(&ret));
3988    return ret;
3989 }
3990
3991 static void
3992 _iconified_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
3993 {
3994    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
3995    Elm_Win_Smart_Data *sd = _pd;
3996    *ret = sd->iconified;
3997 }
3998
3999 EAPI void
4000 elm_win_withdrawn_set(Evas_Object *obj,
4001                       Eina_Bool withdrawn)
4002 {
4003    ELM_WIN_CHECK(obj);
4004    eo_do(obj, elm_obj_win_withdrawn_set(withdrawn));
4005 }
4006
4007 static void
4008 _withdrawn_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4009 {
4010    Eina_Bool withdrawn = va_arg(*list, int);
4011    Elm_Win_Smart_Data *sd = _pd;
4012
4013 //   sd->withdrawn = withdrawn;
4014    TRAP(sd, withdrawn_set, withdrawn);
4015 #ifdef HAVE_ELEMENTARY_X
4016    _elm_win_xwin_update(sd);
4017 #endif
4018 }
4019
4020 EAPI Eina_Bool
4021 elm_win_withdrawn_get(const Evas_Object *obj)
4022 {
4023    ELM_WIN_CHECK(obj) EINA_FALSE;
4024    Eina_Bool ret = EINA_FALSE;
4025    eo_do((Eo *) obj, elm_obj_win_withdrawn_get(&ret));
4026    return ret;
4027 }
4028
4029 static void
4030 _withdrawn_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4031 {
4032    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
4033    Elm_Win_Smart_Data *sd = _pd;
4034    *ret = sd->withdrawn;
4035 }
4036
4037 EAPI void
4038 elm_win_available_profiles_set(Evas_Object  *obj,
4039                                const char  **profiles,
4040                                unsigned int  count)
4041 {
4042    ELM_WIN_CHECK(obj);
4043    eo_do((Eo *) obj, elm_obj_win_available_profiles_set(profiles, count));
4044 }
4045
4046 static void
4047 _available_profiles_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4048 {
4049    const char **profiles = va_arg(*list, const char **);
4050    unsigned int count = va_arg(*list, unsigned int);
4051    Elm_Win_Smart_Data *sd = _pd;
4052    Eina_Bool found = EINA_FALSE;
4053
4054    _elm_win_available_profiles_del(sd);
4055    if ((profiles) && (count >= 1))
4056      {
4057         sd->profile.available_list = calloc(count, sizeof(char *));
4058         if (sd->profile.available_list)
4059           {
4060              if (!sd->profile.name) found = EINA_TRUE;
4061
4062              unsigned int i;
4063              for (i = 0; i < count; i++)
4064                {
4065                   sd->profile.available_list[i] = eina_stringshare_add(profiles[i]);
4066
4067                   /* check to see if a given array has a current profile of elm_win */
4068                   if ((sd->profile.name) &&
4069                       (!strcmp(sd->profile.name, profiles[i])))
4070                     {
4071                        found = EINA_TRUE;
4072                     }
4073                }
4074              sd->profile.count = count;
4075           }
4076      }
4077
4078    if (ecore_evas_window_profile_supported_get(sd->ee))
4079      {
4080         ecore_evas_window_available_profiles_set(sd->ee,
4081                                                  sd->profile.available_list,
4082                                                  sd->profile.count);
4083
4084         /* current profile of elm_win is wrong, change profile */
4085         if ((sd->profile.available_list) && (!found))
4086           {
4087              eina_stringshare_replace(&(sd->profile.name),
4088                                       sd->profile.available_list[0]);
4089              ecore_evas_window_profile_set(sd->ee, sd->profile.name);
4090           }
4091
4092      }
4093    else
4094      {
4095         if (sd->profile.available_list)
4096           _elm_win_profile_update(sd);
4097      }
4098 }
4099
4100 EAPI Eina_Bool
4101 elm_win_available_profiles_get(Evas_Object   *obj,
4102                                char        ***profiles,
4103                                unsigned int  *count)
4104 {
4105    ELM_WIN_CHECK(obj) EINA_FALSE;
4106    Eina_Bool ret = EINA_FALSE;
4107    eo_do((Eo *) obj, elm_obj_win_available_profiles_get(profiles, count, &ret));
4108    return ret;
4109 }
4110
4111 static void
4112 _available_profiles_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4113 {
4114    char ***profiles = va_arg(*list, char ***);
4115    unsigned int *count = va_arg(*list, unsigned int *);
4116    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
4117    Elm_Win_Smart_Data *sd = _pd;
4118    Eina_Bool res;
4119
4120    if (ecore_evas_window_profile_supported_get(sd->ee))
4121      {
4122         res = ecore_evas_window_available_profiles_get(sd->ee,
4123                                                        profiles,
4124                                                        count);
4125      }
4126    else
4127      {
4128         if (profiles) *profiles = (char **)sd->profile.available_list;
4129         if (count) *count = sd->profile.count;
4130         res = EINA_TRUE;
4131      }
4132    if (ret) *ret = res;
4133 }
4134
4135 EAPI void
4136 elm_win_profile_set(Evas_Object *obj,
4137                     const char *profile)
4138 {
4139    ELM_WIN_CHECK(obj);
4140    eo_do((Eo *) obj, elm_obj_win_profile_set(profile));
4141 }
4142
4143 static void
4144 _profile_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4145 {
4146    const char *profile = va_arg(*list, const char *);
4147    Elm_Win_Smart_Data *sd = _pd;
4148
4149    /* check to see if a given profile is present in an available profiles */
4150    if ((profile) && (sd->profile.available_list))
4151      {
4152         Eina_Bool found = EINA_FALSE;
4153         unsigned int i;
4154         for (i = 0; i < sd->profile.count; i++)
4155           {
4156              if (!strcmp(profile,
4157                          sd->profile.available_list[i]))
4158                {
4159                   found = EINA_TRUE;
4160                   break;
4161                }
4162           }
4163         if (!found) return;
4164      }
4165
4166    if (ecore_evas_window_profile_supported_get(sd->ee))
4167      {
4168         if (!profile) _elm_win_profile_del(sd);
4169         ecore_evas_window_profile_set(sd->ee, profile);
4170      }
4171    else
4172      {
4173         if (_elm_win_profile_set(sd, profile))
4174           _elm_win_profile_update(sd);
4175      }
4176 }
4177
4178 EAPI const char *
4179 elm_win_profile_get(const Evas_Object *obj)
4180 {
4181    ELM_WIN_CHECK(obj) NULL;
4182    const char *ret = NULL;
4183    eo_do((Eo *) obj, elm_obj_win_profile_get(&ret));
4184    return ret;
4185 }
4186
4187 static void
4188 _profile_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4189 {
4190    const char **ret = va_arg(*list, const char **);
4191    Elm_Win_Smart_Data *sd = _pd;
4192    *ret = sd->profile.name;
4193 }
4194
4195 EAPI void
4196 elm_win_urgent_set(Evas_Object *obj,
4197                    Eina_Bool urgent)
4198 {
4199    ELM_WIN_CHECK(obj);
4200    eo_do(obj, elm_obj_win_urgent_set(urgent));
4201 }
4202
4203 static void
4204 _urgent_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4205 {
4206    Eina_Bool urgent = va_arg(*list, int);
4207    Elm_Win_Smart_Data *sd = _pd;
4208
4209    sd->urgent = urgent;
4210    TRAP(sd, urgent_set, urgent);
4211 #ifdef HAVE_ELEMENTARY_X
4212    _elm_win_xwin_update(sd);
4213 #endif
4214 }
4215
4216 EAPI Eina_Bool
4217 elm_win_urgent_get(const Evas_Object *obj)
4218 {
4219    ELM_WIN_CHECK(obj) EINA_FALSE;
4220    Eina_Bool ret = EINA_FALSE;
4221    eo_do((Eo *) obj, elm_obj_win_urgent_get(&ret));
4222    return ret;
4223 }
4224
4225 static void
4226 _urgent_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4227 {
4228    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
4229    Elm_Win_Smart_Data *sd = _pd;
4230    *ret = sd->urgent;
4231 }
4232
4233 EAPI void
4234 elm_win_demand_attention_set(Evas_Object *obj,
4235                              Eina_Bool demand_attention)
4236 {
4237    ELM_WIN_CHECK(obj);
4238    eo_do(obj, elm_obj_win_demand_attention_set(demand_attention));
4239 }
4240
4241 static void
4242 _demand_attention_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4243 {
4244    Eina_Bool demand_attention = va_arg(*list, int);
4245    Elm_Win_Smart_Data *sd = _pd;
4246
4247    sd->demand_attention = demand_attention;
4248    TRAP(sd, demand_attention_set, demand_attention);
4249 #ifdef HAVE_ELEMENTARY_X
4250    _elm_win_xwin_update(sd);
4251 #endif
4252 }
4253
4254 EAPI Eina_Bool
4255 elm_win_demand_attention_get(const Evas_Object *obj)
4256 {
4257    ELM_WIN_CHECK(obj) EINA_FALSE;
4258    Eina_Bool ret = EINA_FALSE;
4259    eo_do((Eo *) obj, elm_obj_win_demand_attention_get(&ret));
4260    return ret;
4261 }
4262
4263 static void
4264 _demand_attention_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4265 {
4266    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
4267    Elm_Win_Smart_Data *sd = _pd;
4268    *ret = sd->demand_attention;
4269 }
4270
4271 EAPI void
4272 elm_win_modal_set(Evas_Object *obj,
4273                   Eina_Bool modal)
4274 {
4275    ELM_WIN_CHECK(obj);
4276    eo_do(obj, elm_obj_win_modal_set(modal));
4277 }
4278
4279 static void
4280 _modal_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4281 {
4282    Eina_Bool modal = va_arg(*list, int);
4283    Elm_Win_Smart_Data *sd = _pd;
4284
4285    sd->modal = modal;
4286    TRAP(sd, modal_set, modal);
4287 #ifdef HAVE_ELEMENTARY_X
4288    _elm_win_xwin_update(sd);
4289 #endif
4290 }
4291
4292 EAPI Eina_Bool
4293 elm_win_modal_get(const Evas_Object *obj)
4294 {
4295    ELM_WIN_CHECK(obj) EINA_FALSE;
4296    Eina_Bool ret = EINA_FALSE;
4297    eo_do((Eo *) obj, elm_obj_win_modal_get(&ret));
4298    return ret;
4299 }
4300
4301 static void
4302 _modal_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4303 {
4304    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
4305    Elm_Win_Smart_Data *sd = _pd;
4306    *ret = sd->modal;
4307 }
4308
4309 EAPI void
4310 elm_win_aspect_set(Evas_Object *obj,
4311                    double aspect)
4312 {
4313    ELM_WIN_CHECK(obj);
4314    eo_do(obj, elm_obj_win_aspect_set(aspect));
4315 }
4316
4317 static void
4318 _aspect_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4319 {
4320    double aspect = va_arg(*list, double);
4321    Elm_Win_Smart_Data *sd = _pd;
4322
4323    sd->aspect = aspect;
4324    TRAP(sd, aspect_set, aspect);
4325 #ifdef HAVE_ELEMENTARY_X
4326    _elm_win_xwin_update(sd);
4327 #endif
4328 }
4329
4330 EAPI double
4331 elm_win_aspect_get(const Evas_Object *obj)
4332 {
4333    ELM_WIN_CHECK(obj) 0.0;
4334    double ret = 0.0;
4335    eo_do((Eo *) obj, elm_obj_win_aspect_get(&ret));
4336    return ret;
4337 }
4338
4339 static void
4340 _aspect_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4341 {
4342    double *ret = va_arg(*list, double *);
4343    Elm_Win_Smart_Data *sd = _pd;
4344    *ret = sd->aspect;
4345 }
4346
4347 EAPI void
4348 elm_win_size_base_set(Evas_Object *obj, int w, int h)
4349 {
4350    ELM_WIN_CHECK(obj);
4351    eo_do(obj, elm_obj_win_size_base_set(w, h));
4352 }
4353
4354 static void
4355 _size_base_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4356 {
4357    int w = va_arg(*list, int);
4358    int h = va_arg(*list, int);
4359    Elm_Win_Smart_Data *sd = _pd;
4360    sd->size_base_w = w;
4361    sd->size_base_h = h;
4362    TRAP(sd, size_base_set, w, h);
4363 #ifdef HAVE_ELEMENTARY_X
4364    _elm_win_xwin_update(sd);
4365 #endif
4366 }
4367
4368 EAPI void
4369 elm_win_size_base_get(Evas_Object *obj, int *w, int *h)
4370 {
4371    ELM_WIN_CHECK(obj);
4372    eo_do(obj, elm_obj_win_size_base_get(w, h));
4373 }
4374
4375 static void
4376 _size_base_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4377 {
4378    int *w = va_arg(*list, int *);
4379    int *h = va_arg(*list, int *);
4380
4381    Elm_Win_Smart_Data *sd = _pd;
4382    if (w) *w = sd->size_base_w;
4383    if (w) *h = sd->size_base_h;
4384 }
4385
4386 EAPI void
4387 elm_win_size_step_set(Evas_Object *obj, int w, int h)
4388 {
4389    ELM_WIN_CHECK(obj);
4390    eo_do(obj, elm_obj_win_size_step_set(w, h));
4391 }
4392
4393 static void
4394 _size_step_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4395 {
4396    int w = va_arg(*list, int);
4397    int h = va_arg(*list, int);
4398    Elm_Win_Smart_Data *sd = _pd;
4399    sd->size_step_w = w;
4400    sd->size_step_h = h;
4401    TRAP(sd, size_step_set, w, h);
4402 #ifdef HAVE_ELEMENTARY_X
4403    _elm_win_xwin_update(sd);
4404 #endif
4405 }
4406
4407 EAPI void
4408 elm_win_size_step_get(Evas_Object *obj, int *w, int *h)
4409 {
4410    ELM_WIN_CHECK(obj);
4411    eo_do(obj, elm_obj_win_size_step_get(w, h));
4412 }
4413
4414 static void
4415 _size_step_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4416 {
4417    int *w = va_arg(*list, int *);
4418    int *h = va_arg(*list, int *);
4419    Elm_Win_Smart_Data *sd = _pd;
4420    if (w) *w = sd->size_step_w;
4421    if (w) *h = sd->size_step_h;
4422 }
4423
4424 EAPI void
4425 elm_win_layer_set(Evas_Object *obj,
4426                   int layer)
4427 {
4428    ELM_WIN_CHECK(obj);
4429    eo_do(obj, elm_obj_win_layer_set(layer));
4430 }
4431
4432 static void
4433 _layer_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4434 {
4435    int layer = va_arg(*list, int);
4436    Elm_Win_Smart_Data *sd = _pd;
4437
4438    TRAP(sd, layer_set, layer);
4439 #ifdef HAVE_ELEMENTARY_X
4440    _elm_win_xwin_update(sd);
4441 #endif
4442 }
4443
4444 EAPI int
4445 elm_win_layer_get(const Evas_Object *obj)
4446 {
4447    ELM_WIN_CHECK(obj) - 1;
4448    int ret = - 1;
4449    eo_do((Eo *) obj, elm_obj_win_layer_get(&ret));
4450    return ret;
4451 }
4452
4453 static void
4454 _layer_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4455 {
4456    int *ret = va_arg(*list, int *);
4457    Elm_Win_Smart_Data *sd = _pd;
4458    *ret = ecore_evas_layer_get(sd->ee);
4459 }
4460
4461 EAPI void
4462 elm_win_norender_push(Evas_Object *obj)
4463 {
4464    ELM_WIN_CHECK(obj);
4465    ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
4466
4467    sd->norender++;
4468    if (sd->norender == 1) ecore_evas_manual_render_set(sd->ee, EINA_TRUE);
4469 }
4470
4471 EAPI void
4472 elm_win_norender_pop(Evas_Object *obj)
4473 {
4474    ELM_WIN_CHECK(obj);
4475    ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
4476
4477    if (sd->norender <= 0) return;
4478    sd->norender--;
4479    if (sd->norender == 0) ecore_evas_manual_render_set(sd->ee, EINA_FALSE);
4480 }
4481
4482 EAPI int
4483 elm_win_norender_get(Evas_Object *obj)
4484 {
4485    ELM_WIN_CHECK(obj) - 1;
4486    ELM_WIN_DATA_GET_OR_RETURN_VAL(obj, sd, -1);
4487    return sd->norender;
4488 }
4489
4490 EAPI void
4491 elm_win_render(Evas_Object *obj)
4492 {
4493    ELM_WIN_CHECK(obj);
4494    ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
4495    ecore_evas_manual_render(sd->ee);
4496 }
4497
4498 static int
4499 _win_rotation_degree_check(int rotation)
4500 {
4501    if ((rotation > 360) || (rotation < 0))
4502      {
4503         WRN("Rotation degree should be 0 ~ 360 (passed degree: %d)", rotation);
4504         rotation %= 360;
4505         if (rotation < 0) rotation += 360;
4506      }
4507    return rotation;
4508 }
4509
4510 /*
4511  * This API resizes the internal window(ex: X window) and evas_output.
4512  * But this does not resize the elm window object and its contents.
4513  */
4514 EAPI void
4515 elm_win_rotation_set(Evas_Object *obj,
4516                      int rotation)
4517 {
4518    ELM_WIN_CHECK(obj);
4519    eo_do(obj, elm_obj_win_rotation_set(rotation));
4520 }
4521
4522 static void
4523 _win_rotate(Evas_Object *obj, Elm_Win_Smart_Data *sd, int rotation, Eina_Bool resize)
4524 {
4525    rotation = _win_rotation_degree_check(rotation);
4526    if (sd->rot == rotation) return;
4527    sd->rot = rotation;
4528    if (resize) TRAP(sd, rotation_with_resize_set, rotation);
4529    else TRAP(sd, rotation_set, rotation);
4530    evas_object_size_hint_min_set(obj, -1, -1);
4531    evas_object_size_hint_max_set(obj, -1, -1);
4532    _elm_win_resize_objects_eval(obj);
4533 #ifdef HAVE_ELEMENTARY_X
4534    _elm_win_xwin_update(sd);
4535 #endif
4536    _elm_win_frame_obj_update(sd);
4537    elm_widget_orientation_set(obj, rotation);
4538    evas_object_smart_callback_call(obj, SIG_ROTATION_CHANGED, NULL);
4539 }
4540
4541 static void
4542 _rotation_set(Eo *obj, void *_pd, va_list *list)
4543 {
4544    int rotation = va_arg(*list, int);
4545    Elm_Win_Smart_Data *sd = _pd;
4546    _win_rotate(obj, sd, rotation, EINA_FALSE);
4547 }
4548
4549 /*
4550  * This API does not resize the internal window (ex: X window).
4551  * But this resizes evas_output, elm window, and its contents.
4552  */
4553 EAPI void
4554 elm_win_rotation_with_resize_set(Evas_Object *obj,
4555                                  int rotation)
4556 {
4557    ELM_WIN_CHECK(obj);
4558    eo_do(obj, elm_obj_win_rotation_with_resize_set(rotation));
4559 }
4560
4561 static void
4562 _rotation_with_resize_set(Eo *obj, void *_pd, va_list *list)
4563 {
4564    int rotation = va_arg(*list, int);
4565    Elm_Win_Smart_Data *sd = _pd;
4566    _win_rotate(obj, sd, rotation, EINA_TRUE);
4567 }
4568
4569 EAPI int
4570 elm_win_rotation_get(const Evas_Object *obj)
4571 {
4572    ELM_WIN_CHECK(obj) - 1;
4573    int ret = - 1;
4574    eo_do((Eo *) obj, elm_obj_win_rotation_get(&ret));
4575    return ret;
4576 }
4577
4578 static void
4579 _rotation_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4580 {
4581    int *ret = va_arg(*list, int *);
4582    Elm_Win_Smart_Data *sd = _pd;
4583    *ret = sd->rot;
4584 }
4585
4586 EAPI Eina_Bool
4587 elm_win_wm_rotation_supported_get(const Evas_Object *obj)
4588 {
4589    ELM_WIN_CHECK(obj) EINA_FALSE;
4590    Eina_Bool ret = EINA_FALSE;
4591    eo_do((Eo *) obj, elm_obj_win_wm_rotation_supported_get(&ret));
4592    return ret;
4593 }
4594
4595 static void
4596 _wm_rotation_supported_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4597 {
4598    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
4599    Elm_Win_Smart_Data *sd = _pd;
4600    *ret = sd->wm_rot.wm_supported;
4601 }
4602
4603 /* This will unset a preferred rotation, if given preferred rotation is '-1'.
4604  */
4605 EAPI void
4606 elm_win_wm_rotation_preferred_rotation_set(const Evas_Object *obj,
4607                                            int rotation)
4608 {
4609    ELM_WIN_CHECK(obj);
4610    eo_do((Eo *) obj, elm_obj_win_wm_preferred_rotation_set(rotation));
4611 }
4612
4613 static void
4614 _wm_preferred_rotation_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4615 {
4616    int rotation = va_arg(*list, int);
4617    int rot;
4618    Elm_Win_Smart_Data *sd = _pd;
4619
4620    if (!sd->wm_rot.use)
4621      sd->wm_rot.use = EINA_TRUE;
4622
4623    // '-1' means that elm_win doesn't use preferred rotation.
4624    if (rotation == -1)
4625      rot = -1;
4626    else
4627      rot = _win_rotation_degree_check(rotation);
4628
4629    if (sd->wm_rot.preferred_rot == rot) return;
4630    sd->wm_rot.preferred_rot = rot;
4631
4632    ecore_evas_wm_rotation_preferred_rotation_set(sd->ee, rot);
4633 }
4634
4635 EAPI int
4636 elm_win_wm_rotation_preferred_rotation_get(const Evas_Object *obj)
4637 {
4638    ELM_WIN_CHECK(obj) -1;
4639    int ret = -1;
4640    eo_do((Eo *) obj, elm_obj_win_wm_preferred_rotation_get(&ret));
4641    return ret;
4642 }
4643
4644 static void
4645 _wm_preferred_rotation_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4646 {
4647    int *ret = va_arg(*list, int *);
4648    Elm_Win_Smart_Data *sd = _pd;
4649    *ret = sd->wm_rot.preferred_rot;
4650 }
4651
4652 EAPI void
4653 elm_win_wm_rotation_available_rotations_set(Evas_Object *obj,
4654                                             const int   *rotations,
4655                                             unsigned int count)
4656 {
4657    ELM_WIN_CHECK(obj);
4658    eo_do((Eo *) obj, elm_obj_win_wm_available_rotations_set(rotations, count));
4659 }
4660
4661 static void
4662 _wm_available_rotations_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4663 {
4664    const int *rotations = va_arg(*list, const int *);
4665    unsigned int count = va_arg(*list, unsigned int);
4666    Elm_Win_Smart_Data *sd = _pd;
4667    unsigned int i;
4668    int r;
4669
4670    if (!sd->wm_rot.use)
4671      sd->wm_rot.use = EINA_TRUE;
4672
4673    ELM_SAFE_FREE(sd->wm_rot.rots, free);
4674    sd->wm_rot.count = 0;
4675
4676    if (count > 0)
4677      {
4678         sd->wm_rot.rots = calloc(count, sizeof(int));
4679         if (!sd->wm_rot.rots) return;
4680         for (i = 0; i < count; i++)
4681           {
4682              r = _win_rotation_degree_check(rotations[i]);
4683              sd->wm_rot.rots[i] = r;
4684           }
4685      }
4686
4687    sd->wm_rot.count = count;
4688
4689    ecore_evas_wm_rotation_available_rotations_set(sd->ee,
4690                                                   sd->wm_rot.rots,
4691                                                   sd->wm_rot.count);
4692 }
4693
4694 EAPI Eina_Bool
4695 elm_win_wm_rotation_available_rotations_get(const Evas_Object *obj,
4696                                             int              **rotations,
4697                                             unsigned int      *count)
4698 {
4699    ELM_WIN_CHECK(obj) EINA_FALSE;
4700    Eina_Bool ret = EINA_FALSE;
4701    eo_do((Eo *) obj, elm_obj_win_wm_available_rotations_get(rotations, count, &ret));
4702    return ret;
4703 }
4704
4705 static void
4706 _wm_available_rotations_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4707 {
4708    int **rotations = va_arg(*list, int **);
4709    unsigned int *count = va_arg(*list, unsigned int *);
4710    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
4711    Elm_Win_Smart_Data *sd = _pd;
4712    *ret = EINA_FALSE;
4713    if (!sd->wm_rot.use) return;
4714
4715    if (sd->wm_rot.count > 0)
4716      {
4717         if (rotations)
4718           {
4719              *rotations = calloc(sd->wm_rot.count, sizeof(int));
4720              if (*rotations)
4721                {
4722                   memcpy(*rotations,
4723                          sd->wm_rot.rots,
4724                          sizeof(int) * sd->wm_rot.count);
4725                }
4726           }
4727      }
4728
4729    if (count) *count = sd->wm_rot.count;
4730    *ret = EINA_TRUE;
4731 }
4732
4733 EAPI void
4734 elm_win_wm_rotation_manual_rotation_done_set(Evas_Object *obj,
4735                                              Eina_Bool    set)
4736 {
4737    ELM_WIN_CHECK(obj);
4738    eo_do((Eo *) obj, elm_obj_win_wm_manual_rotation_done_set(set));
4739 }
4740
4741 static void
4742 _wm_manual_rotation_done_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4743 {
4744    int set = va_arg(*list, int);
4745    Elm_Win_Smart_Data *sd = _pd;
4746    if (!sd->wm_rot.use) return;
4747    ecore_evas_wm_rotation_manual_rotation_done_set(sd->ee, set);
4748 }
4749
4750 EAPI Eina_Bool
4751 elm_win_wm_rotation_manual_rotation_done_get(const Evas_Object *obj)
4752 {
4753    ELM_WIN_CHECK(obj) EINA_FALSE;
4754    Eina_Bool ret = EINA_FALSE;
4755    eo_do((Eo *) obj, elm_obj_win_wm_manual_rotation_done_get(&ret));
4756    return ret;
4757 }
4758
4759 static void
4760 _wm_manual_rotation_done_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4761 {
4762    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
4763    Elm_Win_Smart_Data *sd = _pd;
4764    if (!sd->wm_rot.use) return;
4765    *ret = ecore_evas_wm_rotation_manual_rotation_done_get(sd->ee);
4766 }
4767
4768 EAPI void
4769 elm_win_wm_rotation_manual_rotation_done(Evas_Object *obj)
4770 {
4771    ELM_WIN_CHECK(obj);
4772    eo_do((Eo *) obj, elm_obj_win_wm_manual_rotation_done());
4773 }
4774
4775 static void
4776 _wm_manual_rotation_done(Eo *obj EINA_UNUSED, void *_pd, va_list *list EINA_UNUSED)
4777 {
4778    Elm_Win_Smart_Data *sd = _pd;
4779    if (!sd->wm_rot.use) return;
4780    ecore_evas_wm_rotation_manual_rotation_done(sd->ee);
4781 }
4782
4783 EAPI void
4784 elm_win_sticky_set(Evas_Object *obj,
4785                    Eina_Bool sticky)
4786 {
4787    ELM_WIN_CHECK(obj);
4788    eo_do(obj, elm_obj_win_sticky_set(sticky));
4789 }
4790
4791 static void
4792 _sticky_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4793 {
4794    Eina_Bool sticky = va_arg(*list, int);
4795    Elm_Win_Smart_Data *sd = _pd;
4796
4797 //   sd->sticky = sticky;
4798    TRAP(sd, sticky_set, sticky);
4799 #ifdef HAVE_ELEMENTARY_X
4800    _elm_win_xwin_update(sd);
4801 #endif
4802 }
4803
4804 EAPI Eina_Bool
4805 elm_win_sticky_get(const Evas_Object *obj)
4806 {
4807    ELM_WIN_CHECK(obj) EINA_FALSE;
4808    Eina_Bool ret = EINA_FALSE;
4809    eo_do((Eo *) obj, elm_obj_win_sticky_get(&ret));
4810    return ret;
4811 }
4812
4813 static void
4814 _sticky_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4815 {
4816    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
4817    Elm_Win_Smart_Data *sd = _pd;
4818    *ret = sd->sticky;
4819 }
4820
4821 EAPI void
4822 elm_win_keyboard_mode_set(Evas_Object *obj,
4823                           Elm_Win_Keyboard_Mode mode)
4824 {
4825    ELM_WIN_CHECK(obj);
4826    eo_do(obj, elm_obj_win_keyboard_mode_set(mode));
4827 }
4828
4829 static void
4830 _keyboard_mode_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4831 {
4832    Elm_Win_Keyboard_Mode mode = va_arg(*list, Elm_Win_Keyboard_Mode);
4833    Elm_Win_Smart_Data *sd = _pd;
4834
4835    if (mode == sd->kbdmode) return;
4836 #ifdef HAVE_ELEMENTARY_X
4837    _elm_win_xwindow_get(sd);
4838 #endif
4839    sd->kbdmode = mode;
4840 #ifdef HAVE_ELEMENTARY_X
4841    if (sd->x.xwin)
4842      ecore_x_e_virtual_keyboard_state_set
4843        (sd->x.xwin, (Ecore_X_Virtual_Keyboard_State)sd->kbdmode);
4844 #endif
4845 }
4846
4847 EAPI Elm_Win_Keyboard_Mode
4848 elm_win_keyboard_mode_get(const Evas_Object *obj)
4849 {
4850    ELM_WIN_CHECK(obj) ELM_WIN_KEYBOARD_UNKNOWN;
4851    Elm_Win_Keyboard_Mode ret = ELM_WIN_KEYBOARD_UNKNOWN;
4852    eo_do((Eo *) obj, elm_obj_win_keyboard_mode_get(&ret));
4853    return ret;
4854 }
4855
4856 static void
4857 _keyboard_mode_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4858 {
4859    Elm_Win_Keyboard_Mode *ret = va_arg(*list, Elm_Win_Keyboard_Mode *);
4860    Elm_Win_Smart_Data *sd = _pd;
4861    *ret = sd->kbdmode;
4862 }
4863
4864 EAPI void
4865 elm_win_keyboard_win_set(Evas_Object *obj,
4866                          Eina_Bool is_keyboard)
4867 {
4868    ELM_WIN_CHECK(obj);
4869    eo_do(obj, elm_obj_win_keyboard_win_set(is_keyboard));
4870 }
4871
4872 static void
4873 _keyboard_win_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4874 {
4875    Eina_Bool is_keyboard = va_arg(*list, int);
4876    Elm_Win_Smart_Data *sd = _pd;
4877
4878 #ifdef HAVE_ELEMENTARY_X
4879    _elm_win_xwindow_get(sd);
4880    if (sd->x.xwin)
4881      ecore_x_e_virtual_keyboard_set(sd->x.xwin, is_keyboard);
4882 #else
4883    (void)is_keyboard;
4884 #endif
4885 }
4886
4887 EAPI Eina_Bool
4888 elm_win_keyboard_win_get(const Evas_Object *obj)
4889 {
4890    ELM_WIN_CHECK(obj) EINA_FALSE;
4891    Eina_Bool ret = EINA_FALSE;
4892    eo_do((Eo *) obj, elm_obj_win_keyboard_win_get(&ret));
4893    return ret;
4894 }
4895
4896 static void
4897 _keyboard_win_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4898 {
4899    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
4900    Elm_Win_Smart_Data *sd = _pd;
4901
4902 #ifdef HAVE_ELEMENTARY_X
4903    _elm_win_xwindow_get(sd);
4904    if (sd->x.xwin)
4905      {
4906         *ret = ecore_x_e_virtual_keyboard_get(sd->x.xwin);
4907         return;
4908      }
4909 #endif
4910    *ret = EINA_FALSE;
4911 }
4912
4913 EAPI void
4914 elm_win_indicator_mode_set(Evas_Object *obj,
4915       Elm_Win_Indicator_Mode mode)
4916 {
4917    ELM_WIN_CHECK(obj);
4918    eo_do(obj, elm_obj_win_indicator_mode_set(mode));
4919 }
4920
4921 static void
4922 _indicator_mode_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4923 {
4924    Elm_Win_Indicator_Mode mode = va_arg(*list, Elm_Win_Indicator_Mode);
4925    Elm_Win_Smart_Data *sd = _pd;
4926
4927    if (mode == sd->indmode) return;
4928 #ifdef HAVE_ELEMENTARY_X
4929    _elm_win_xwindow_get(sd);
4930 #endif
4931    sd->indmode = mode;
4932 #ifdef HAVE_ELEMENTARY_X
4933    if (sd->x.xwin)
4934      {
4935         if (sd->indmode == ELM_WIN_INDICATOR_SHOW)
4936           ecore_x_e_illume_indicator_state_set
4937             (sd->x.xwin, ECORE_X_ILLUME_INDICATOR_STATE_ON);
4938         else if (sd->indmode == ELM_WIN_INDICATOR_HIDE)
4939           ecore_x_e_illume_indicator_state_set
4940             (sd->x.xwin, ECORE_X_ILLUME_INDICATOR_STATE_OFF);
4941      }
4942 #endif
4943    evas_object_smart_callback_call(obj, SIG_INDICATOR_PROP_CHANGED, NULL);
4944 }
4945
4946 EAPI Elm_Win_Indicator_Mode
4947 elm_win_indicator_mode_get(const Evas_Object *obj)
4948 {
4949    ELM_WIN_CHECK(obj) ELM_WIN_INDICATOR_UNKNOWN;
4950    Elm_Win_Indicator_Mode ret = ELM_WIN_INDICATOR_UNKNOWN;
4951    eo_do((Eo *) obj, elm_obj_win_indicator_mode_get(&ret));
4952    return ret;
4953 }
4954
4955 static void
4956 _indicator_mode_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4957 {
4958    Elm_Win_Indicator_Mode *ret = va_arg(*list, Elm_Win_Indicator_Mode *);
4959    Elm_Win_Smart_Data *sd = _pd;
4960    *ret = sd->indmode;
4961 }
4962
4963 EAPI void
4964 elm_win_indicator_opacity_set(Evas_Object *obj,
4965                               Elm_Win_Indicator_Opacity_Mode mode)
4966 {
4967    ELM_WIN_CHECK(obj);
4968    eo_do(obj, elm_obj_win_indicator_opacity_set(mode));
4969 }
4970
4971 static void
4972 _indicator_opacity_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
4973 {
4974    Elm_Win_Indicator_Opacity_Mode mode = va_arg(*list, Elm_Win_Indicator_Opacity_Mode);
4975    Elm_Win_Smart_Data *sd = _pd;
4976
4977    if (mode == sd->ind_o_mode) return;
4978    sd->ind_o_mode = mode;
4979 #ifdef HAVE_ELEMENTARY_X
4980    _elm_win_xwindow_get(sd);
4981    if (sd->x.xwin)
4982      {
4983         if (sd->ind_o_mode == ELM_WIN_INDICATOR_OPAQUE)
4984           ecore_x_e_illume_indicator_opacity_set
4985             (sd->x.xwin, ECORE_X_ILLUME_INDICATOR_OPAQUE);
4986         else if (sd->ind_o_mode == ELM_WIN_INDICATOR_TRANSLUCENT)
4987           ecore_x_e_illume_indicator_opacity_set
4988             (sd->x.xwin, ECORE_X_ILLUME_INDICATOR_TRANSLUCENT);
4989         else if (sd->ind_o_mode == ELM_WIN_INDICATOR_TRANSPARENT)
4990           ecore_x_e_illume_indicator_opacity_set
4991             (sd->x.xwin, ECORE_X_ILLUME_INDICATOR_TRANSPARENT);
4992      }
4993 #endif
4994    evas_object_smart_callback_call(obj, SIG_INDICATOR_PROP_CHANGED, NULL);
4995 }
4996
4997 EAPI Elm_Win_Indicator_Opacity_Mode
4998 elm_win_indicator_opacity_get(const Evas_Object *obj)
4999 {
5000    ELM_WIN_CHECK(obj) ELM_WIN_INDICATOR_OPACITY_UNKNOWN;
5001    Elm_Win_Indicator_Opacity_Mode ret = ELM_WIN_INDICATOR_OPACITY_UNKNOWN;
5002    eo_do((Eo *) obj, elm_obj_win_indicator_opacity_get(&ret));
5003    return ret;
5004 }
5005
5006 static void
5007 _indicator_opacity_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5008 {
5009    Elm_Win_Indicator_Opacity_Mode *ret = va_arg(*list, Elm_Win_Indicator_Opacity_Mode *);
5010    Elm_Win_Smart_Data *sd = _pd;
5011    *ret = sd->ind_o_mode;
5012 }
5013
5014 EAPI void
5015 elm_win_screen_position_get(const Evas_Object *obj,
5016                             int *x,
5017                             int *y)
5018 {
5019    ELM_WIN_CHECK(obj);
5020    eo_do((Eo *) obj, elm_obj_win_screen_position_get(x, y));
5021 }
5022
5023 static void
5024 _screen_position_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5025 {
5026    int *x = va_arg(*list, int *);
5027    int *y = va_arg(*list, int *);
5028    Elm_Win_Smart_Data *sd = _pd;
5029
5030    if (x) *x = sd->screen.x;
5031    if (y) *y = sd->screen.y;
5032 }
5033
5034 EAPI Eina_Bool
5035 elm_win_focus_get(const Evas_Object *obj)
5036 {
5037    ELM_WIN_CHECK(obj) EINA_FALSE;
5038    Eina_Bool ret = EINA_FALSE;
5039    eo_do((Eo *) obj, elm_obj_win_focus_get(&ret));
5040    return ret;
5041 }
5042
5043 static void
5044 _focus_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5045 {
5046    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
5047    Elm_Win_Smart_Data *sd = _pd;
5048    *ret = ecore_evas_focus_get(sd->ee);
5049 }
5050
5051 EAPI void
5052 elm_win_screen_constrain_set(Evas_Object *obj,
5053                              Eina_Bool constrain)
5054 {
5055    ELM_WIN_CHECK(obj);
5056    eo_do(obj, elm_obj_win_screen_constrain_set(constrain));
5057 }
5058
5059 static void
5060 _screen_constrain_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5061 {
5062    Eina_Bool constrain = va_arg(*list, int);
5063    Elm_Win_Smart_Data *sd = _pd;
5064    sd->constrain = !!constrain;
5065 }
5066
5067 EAPI Eina_Bool
5068 elm_win_screen_constrain_get(Evas_Object *obj)
5069 {
5070    ELM_WIN_CHECK(obj) EINA_FALSE;
5071    Eina_Bool ret = EINA_FALSE;
5072    eo_do(obj, elm_obj_win_screen_constrain_get(&ret));
5073    return ret;
5074 }
5075
5076 static void
5077 _screen_constrain_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5078 {
5079    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
5080    Elm_Win_Smart_Data *sd = _pd;
5081    *ret = sd->constrain;
5082 }
5083
5084 EAPI void
5085 elm_win_screen_size_get(const Evas_Object *obj,
5086                         int *x,
5087                         int *y,
5088                         int *w,
5089                         int *h)
5090 {
5091    ELM_WIN_CHECK(obj);
5092    eo_do((Eo *) obj, elm_obj_win_screen_size_get(x, y, w, h));
5093 }
5094
5095 static void
5096 _screen_size_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5097 {
5098    int *x = va_arg(*list, int *);
5099    int *y = va_arg(*list, int *);
5100    int *w = va_arg(*list, int *);
5101    int *h = va_arg(*list, int *);
5102    Elm_Win_Smart_Data *sd = _pd;
5103
5104    ecore_evas_screen_geometry_get(sd->ee, x, y, w, h);
5105 }
5106
5107 EAPI void
5108 elm_win_screen_dpi_get(const Evas_Object *obj,
5109                        int *xdpi,
5110                        int *ydpi)
5111 {
5112    ELM_WIN_CHECK(obj);
5113    eo_do((Eo *) obj, elm_obj_win_screen_dpi_get(xdpi, ydpi));
5114 }
5115
5116 static void
5117 _screen_dpi_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5118 {
5119    int *xdpi = va_arg(*list, int *);
5120    int *ydpi = va_arg(*list, int *);
5121    Elm_Win_Smart_Data *sd = _pd;
5122
5123    ecore_evas_screen_dpi_get(sd->ee, xdpi, ydpi);
5124 }
5125
5126 EAPI void
5127 elm_win_conformant_set(Evas_Object *obj,
5128                        Eina_Bool conformant)
5129 {
5130    ELM_WIN_CHECK(obj);
5131    eo_do(obj, elm_obj_win_conformant_set(conformant));
5132 }
5133
5134 static void
5135 _conformant_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5136 {
5137    Eina_Bool conformant = va_arg(*list, int);
5138    Elm_Win_Smart_Data *sd = _pd;
5139
5140 #ifdef HAVE_ELEMENTARY_X
5141    _elm_win_xwindow_get(sd);
5142    if (sd->x.xwin)
5143      ecore_x_e_illume_conformant_set(sd->x.xwin, conformant);
5144 #else
5145    (void)conformant;
5146 #endif
5147 }
5148
5149 EAPI Eina_Bool
5150 elm_win_conformant_get(const Evas_Object *obj)
5151 {
5152    ELM_WIN_CHECK(obj) EINA_FALSE;
5153    Eina_Bool ret = EINA_FALSE;
5154    eo_do((Eo *) obj, elm_obj_win_conformant_get(&ret));
5155    return ret;
5156 }
5157
5158 static void
5159 _conformant_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5160 {
5161    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
5162    Elm_Win_Smart_Data *sd = _pd;
5163    *ret = EINA_FALSE;
5164
5165 #ifdef HAVE_ELEMENTARY_X
5166    _elm_win_xwindow_get(sd);
5167    if (sd->x.xwin)
5168      *ret = ecore_x_e_illume_conformant_get(sd->x.xwin);
5169 #endif
5170 }
5171
5172 EAPI void
5173 elm_win_quickpanel_set(Evas_Object *obj,
5174                        Eina_Bool quickpanel)
5175 {
5176    ELM_WIN_CHECK(obj);
5177    eo_do(obj, elm_obj_win_quickpanel_set(quickpanel));
5178 }
5179
5180 static void
5181 _quickpanel_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5182 {
5183    Eina_Bool quickpanel = va_arg(*list, int);
5184    Elm_Win_Smart_Data *sd = _pd;
5185 #ifdef HAVE_ELEMENTARY_X
5186    _elm_win_xwindow_get(sd);
5187    if (sd->x.xwin)
5188      {
5189         ecore_x_e_illume_quickpanel_set(sd->x.xwin, quickpanel);
5190         if (quickpanel)
5191           {
5192              Ecore_X_Window_State states[2];
5193
5194              states[0] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
5195              states[1] = ECORE_X_WINDOW_STATE_SKIP_PAGER;
5196              ecore_x_netwm_window_state_set(sd->x.xwin, states, 2);
5197              ecore_x_icccm_hints_set(sd->x.xwin, 0, 0, 0, 0, 0, 0, 0);
5198           }
5199      }
5200 #else
5201    (void)quickpanel;
5202 #endif
5203 }
5204
5205 EAPI Eina_Bool
5206 elm_win_quickpanel_get(const Evas_Object *obj)
5207 {
5208    ELM_WIN_CHECK(obj) EINA_FALSE;
5209    Eina_Bool ret = EINA_FALSE;
5210    eo_do((Eo *) obj, elm_obj_win_quickpanel_get(&ret));
5211    return ret;
5212 }
5213
5214 static void
5215 _quickpanel_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5216 {
5217    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
5218    Elm_Win_Smart_Data *sd = _pd;
5219    *ret = EINA_FALSE;
5220
5221 #ifdef HAVE_ELEMENTARY_X
5222    _elm_win_xwindow_get(sd);
5223    if (sd->x.xwin)
5224      *ret = ecore_x_e_illume_quickpanel_get(sd->x.xwin);
5225 #endif
5226 }
5227
5228 EAPI void
5229 elm_win_quickpanel_priority_major_set(Evas_Object *obj,
5230                                       int priority)
5231 {
5232    ELM_WIN_CHECK(obj);
5233    eo_do(obj, elm_obj_win_quickpanel_priority_major_set(priority));
5234 }
5235
5236 static void
5237 _quickpanel_priority_major_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5238 {
5239    int priority = va_arg(*list, int);
5240    Elm_Win_Smart_Data *sd = _pd;
5241
5242 #ifdef HAVE_ELEMENTARY_X
5243    _elm_win_xwindow_get(sd);
5244    if (sd->x.xwin)
5245      ecore_x_e_illume_quickpanel_priority_major_set(sd->x.xwin, priority);
5246 #else
5247    (void)priority;
5248 #endif
5249 }
5250
5251 EAPI int
5252 elm_win_quickpanel_priority_major_get(const Evas_Object *obj)
5253 {
5254    ELM_WIN_CHECK(obj) - 1;
5255    int ret = - 1;
5256    eo_do((Eo *) obj, elm_obj_win_quickpanel_priority_major_get(&ret));
5257    return ret;
5258 }
5259
5260 static void
5261 _quickpanel_priority_major_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5262 {
5263    int *ret = va_arg(*list, int *);
5264    Elm_Win_Smart_Data *sd = _pd;
5265    *ret = -1;
5266
5267 #ifdef HAVE_ELEMENTARY_X
5268    _elm_win_xwindow_get(sd);
5269    if (sd->x.xwin)
5270      *ret = ecore_x_e_illume_quickpanel_priority_major_get(sd->x.xwin);
5271 #endif
5272 }
5273
5274 EAPI void
5275 elm_win_quickpanel_priority_minor_set(Evas_Object *obj,
5276                                       int priority)
5277 {
5278    ELM_WIN_CHECK(obj);
5279    eo_do(obj, elm_obj_win_quickpanel_priority_minor_set(priority));
5280 }
5281
5282 static void
5283 _quickpanel_priority_minor_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5284 {
5285    int priority = va_arg(*list, int);
5286    Elm_Win_Smart_Data *sd = _pd;
5287
5288 #ifdef HAVE_ELEMENTARY_X
5289    _elm_win_xwindow_get(sd);
5290    if (sd->x.xwin)
5291      ecore_x_e_illume_quickpanel_priority_minor_set(sd->x.xwin, priority);
5292 #else
5293    (void)priority;
5294 #endif
5295 }
5296
5297 EAPI int
5298 elm_win_quickpanel_priority_minor_get(const Evas_Object *obj)
5299 {
5300    ELM_WIN_CHECK(obj) - 1;
5301    int ret = - 1;
5302    eo_do((Eo *) obj, elm_obj_win_quickpanel_priority_minor_get(&ret));
5303    return ret;
5304 }
5305
5306 static void
5307 _quickpanel_priority_minor_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5308 {
5309    int *ret = va_arg(*list, int *);
5310    Elm_Win_Smart_Data *sd = _pd;
5311    *ret = -1;
5312
5313 #ifdef HAVE_ELEMENTARY_X
5314    _elm_win_xwindow_get(sd);
5315    if (sd->x.xwin)
5316      *ret = ecore_x_e_illume_quickpanel_priority_minor_get(sd->x.xwin);
5317 #endif
5318 }
5319
5320 EAPI void
5321 elm_win_quickpanel_zone_set(Evas_Object *obj,
5322                             int zone)
5323 {
5324    ELM_WIN_CHECK(obj);
5325    eo_do(obj, elm_obj_win_quickpanel_zone_set(zone));
5326 }
5327
5328 static void
5329 _quickpanel_zone_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5330 {
5331    int zone = va_arg(*list, int);
5332    Elm_Win_Smart_Data *sd = _pd;
5333
5334 #ifdef HAVE_ELEMENTARY_X
5335    _elm_win_xwindow_get(sd);
5336    if (sd->x.xwin)
5337      ecore_x_e_illume_quickpanel_zone_set(sd->x.xwin, zone);
5338 #else
5339    (void)zone;
5340 #endif
5341 }
5342
5343 EAPI int
5344 elm_win_quickpanel_zone_get(const Evas_Object *obj)
5345 {
5346    ELM_WIN_CHECK(obj) 0;
5347    int ret = 0;
5348    eo_do((Eo *) obj, elm_obj_win_quickpanel_zone_get(&ret));
5349    return ret;
5350 }
5351
5352 static void
5353 _quickpanel_zone_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5354 {
5355    int *ret = va_arg(*list, int *);
5356    Elm_Win_Smart_Data *sd = _pd;
5357    *ret = 0;
5358
5359 #ifdef HAVE_ELEMENTARY_X
5360    _elm_win_xwindow_get(sd);
5361    if (sd->x.xwin)
5362      *ret = ecore_x_e_illume_quickpanel_zone_get(sd->x.xwin);
5363 #endif
5364 }
5365
5366 EAPI void
5367 elm_win_prop_focus_skip_set(Evas_Object *obj,
5368                             Eina_Bool skip)
5369 {
5370    ELM_WIN_CHECK(obj);
5371    eo_do(obj, elm_obj_win_prop_focus_skip_set(skip));
5372 }
5373
5374 static void
5375 _prop_focus_skip_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5376 {
5377    Eina_Bool skip = va_arg(*list, int);
5378    Elm_Win_Smart_Data *sd = _pd;
5379
5380    sd->skip_focus = skip;
5381    TRAP(sd, focus_skip_set, skip);
5382 }
5383
5384 EAPI void
5385 elm_win_illume_command_send(Evas_Object *obj,
5386                             Elm_Illume_Command command,
5387                             void *params)
5388 {
5389    ELM_WIN_CHECK(obj);
5390    eo_do(obj, elm_obj_win_illume_command_send(command, params));
5391 }
5392
5393 static void
5394 _illume_command_send(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5395 {
5396    Elm_Illume_Command command = va_arg(*list, Elm_Illume_Command);
5397    void *params = va_arg(*list, void *);
5398    (void) params;
5399    Elm_Win_Smart_Data *sd = _pd;
5400
5401 #ifdef HAVE_ELEMENTARY_X
5402    _elm_win_xwindow_get(sd);
5403    if (sd->x.xwin)
5404      {
5405         switch (command)
5406           {
5407            case ELM_ILLUME_COMMAND_FOCUS_BACK:
5408              ecore_x_e_illume_focus_back_send(sd->x.xwin);
5409              break;
5410
5411            case ELM_ILLUME_COMMAND_FOCUS_FORWARD:
5412              ecore_x_e_illume_focus_forward_send(sd->x.xwin);
5413              break;
5414
5415            case ELM_ILLUME_COMMAND_FOCUS_HOME:
5416              ecore_x_e_illume_focus_home_send(sd->x.xwin);
5417              break;
5418
5419            case ELM_ILLUME_COMMAND_CLOSE:
5420              ecore_x_e_illume_close_send(sd->x.xwin);
5421              break;
5422
5423            default:
5424              break;
5425           }
5426      }
5427 #else
5428    (void)command;
5429 #endif
5430 }
5431
5432 EAPI Evas_Object *
5433 elm_win_inlined_image_object_get(Evas_Object *obj)
5434 {
5435    ELM_WIN_CHECK(obj) NULL;
5436    Evas_Object *ret = NULL;
5437    eo_do(obj, elm_obj_win_inlined_image_object_get(&ret));
5438    return ret;
5439 }
5440
5441 static void
5442 _inlined_image_object_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5443 {
5444    Evas_Object **ret = va_arg(*list, Evas_Object **);
5445    Elm_Win_Smart_Data *sd = _pd;
5446    *ret = sd->img_obj;
5447 }
5448
5449 EAPI void
5450 elm_win_focus_highlight_enabled_set(Evas_Object *obj,
5451                                     Eina_Bool enabled)
5452 {
5453    ELM_WIN_CHECK(obj);
5454    eo_do(obj, elm_obj_win_focus_highlight_enabled_set(enabled));
5455 }
5456
5457 static void
5458 _focus_highlight_enabled_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5459 {
5460    Eina_Bool enabled = va_arg(*list, int);
5461    Elm_Win_Smart_Data *sd = _pd;
5462
5463    enabled = !!enabled;
5464    if (sd->focus_highlight.enabled == enabled)
5465      return;
5466
5467    sd->focus_highlight.enabled = enabled;
5468
5469    if (sd->focus_highlight.enabled)
5470      _elm_win_focus_highlight_init(sd);
5471    else
5472      _elm_win_focus_highlight_shutdown(sd);
5473 }
5474
5475 EAPI Eina_Bool
5476 elm_win_focus_highlight_enabled_get(const Evas_Object *obj)
5477 {
5478    ELM_WIN_CHECK(obj) EINA_FALSE;
5479    Eina_Bool ret = EINA_FALSE;
5480    eo_do((Eo *) obj, elm_obj_win_focus_highlight_enabled_get(&ret));
5481    return ret;
5482 }
5483
5484 static void
5485 _focus_highlight_enabled_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5486 {
5487    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
5488    Elm_Win_Smart_Data *sd = _pd;
5489    *ret = sd->focus_highlight.enabled;
5490 }
5491
5492 EAPI void
5493 elm_win_focus_highlight_style_set(Evas_Object *obj,
5494                                   const char *style)
5495 {
5496    ELM_WIN_CHECK(obj);
5497    eo_do(obj, elm_obj_win_focus_highlight_style_set(style));
5498 }
5499
5500 static void
5501 _elm_win_smart_theme(Eo *obj EINA_UNUSED, void *_pd, va_list *list EINA_UNUSED)
5502 {
5503    Elm_Win_Smart_Data *sd = _pd;
5504    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
5505    Eina_Bool int_ret = EINA_FALSE;
5506
5507    if (ret) *ret = EINA_TRUE;
5508
5509    eo_do_super(obj, MY_CLASS, elm_wdg_theme_apply(&int_ret));
5510    if (!int_ret) return;
5511
5512    sd->focus_highlight.theme_changed = EINA_TRUE;
5513    _elm_win_focus_highlight_reconfigure_job_start(sd);
5514
5515    if (ret) *ret = EINA_TRUE;
5516 }
5517
5518 static void
5519 _focus_highlight_style_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5520 {
5521    const char *style = va_arg(*list, const char *);
5522    Elm_Win_Smart_Data *sd = _pd;
5523
5524    eina_stringshare_replace(&sd->focus_highlight.style, style);
5525    sd->focus_highlight.theme_changed = EINA_TRUE;
5526    _elm_win_focus_highlight_reconfigure_job_start(sd);
5527 }
5528
5529 EAPI const char *
5530 elm_win_focus_highlight_style_get(const Evas_Object *obj)
5531 {
5532    ELM_WIN_CHECK(obj) NULL;
5533    const char *ret = NULL;
5534    eo_do((Eo *) obj, elm_obj_win_focus_highlight_style_get(&ret));
5535    return ret;
5536 }
5537
5538 static void
5539 _focus_highlight_style_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5540 {
5541    const char **ret = va_arg(*list, const char **);
5542    Elm_Win_Smart_Data *sd = _pd;
5543    *ret = sd->focus_highlight.style;
5544 }
5545
5546 EAPI void
5547 elm_win_focus_highlight_animate_set(Evas_Object *obj,
5548                                     Eina_Bool animate)
5549 {
5550    ELM_WIN_CHECK(obj);
5551    eo_do(obj, elm_obj_win_focus_highlight_animate_set(animate));
5552 }
5553
5554 static void
5555 _focus_highlight_animate_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5556 {
5557    Eina_Bool animate = va_arg(*list, int);
5558    Elm_Win_Smart_Data *sd = _pd;
5559
5560    animate = !!animate;
5561    if (sd->focus_highlight.animate == animate)
5562      return;
5563
5564    sd->focus_highlight.animate = animate;
5565    sd->focus_highlight.theme_changed = EINA_TRUE;
5566    _elm_win_focus_highlight_reconfigure_job_start(sd);
5567 }
5568
5569 EAPI Eina_Bool
5570 elm_win_focus_highlight_animate_get(const Evas_Object *obj)
5571 {
5572    ELM_WIN_CHECK(obj) EINA_FALSE;
5573    Eina_Bool ret = EINA_FALSE;
5574    eo_do((Eo *) obj, elm_obj_win_focus_highlight_animate_get(&ret));
5575    return ret;
5576 }
5577
5578 static void
5579 _focus_highlight_animate_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5580 {
5581    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
5582    Elm_Win_Smart_Data *sd = _pd;
5583    *ret = sd->focus_highlight.animate;
5584 }
5585
5586 EAPI Eina_Bool
5587 elm_win_socket_listen(Evas_Object *obj,
5588                       const char *svcname,
5589                       int svcnum,
5590                       Eina_Bool svcsys)
5591 {
5592    ELM_WIN_CHECK(obj) EINA_FALSE;
5593    Eina_Bool ret = EINA_FALSE;
5594    eo_do(obj, elm_obj_win_socket_listen(svcname, svcnum, svcsys, &ret));
5595    return ret;
5596 }
5597
5598 static void
5599 _socket_listen(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5600 {
5601    const char *svcname = va_arg(*list, const char *);
5602    int svcnum = va_arg(*list, int);
5603    Eina_Bool svcsys = va_arg(*list, int);
5604    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
5605    Elm_Win_Smart_Data *sd = _pd;
5606    *ret = EINA_FALSE;
5607
5608    if (!sd->ee) return;
5609
5610    if (!ecore_evas_extn_socket_listen(sd->ee, svcname, svcnum, svcsys))
5611      return;
5612
5613    *ret = EINA_TRUE;
5614 }
5615
5616 /* windowing specific calls - shall we do this differently? */
5617
5618 EAPI Ecore_X_Window
5619 elm_win_xwindow_get(const Evas_Object *obj)
5620 {
5621    if (!obj) return 0;
5622
5623    if (!evas_object_smart_type_check_ptr(obj, MY_CLASS_NAME_LEGACY))
5624      {
5625         Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(obj));
5626         return _elm_ee_xwin_get(ee);
5627      }
5628
5629    ELM_WIN_CHECK(obj) 0;
5630    Ecore_X_Window ret = 0;
5631    eo_do((Eo *) obj, elm_obj_win_xwindow_get(&ret));
5632    return ret;
5633 }
5634
5635 static void
5636 _xwindow_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5637 {
5638    Ecore_X_Window *ret = va_arg(*list, Ecore_X_Window *);
5639    Elm_Win_Smart_Data *sd = _pd;
5640
5641 #ifdef HAVE_ELEMENTARY_X
5642    if (sd->x.xwin)
5643      {
5644         *ret = sd->x.xwin;
5645         return;
5646      }
5647    if (sd->parent)
5648      {
5649         *ret = elm_win_xwindow_get(sd->parent);
5650         return;
5651      }
5652 #endif
5653    *ret = 0;
5654 }
5655
5656 EAPI Ecore_Wl_Window *
5657 elm_win_wl_window_get(const Evas_Object *obj)
5658 {
5659    if (!obj) return NULL;
5660
5661    if ((!ENGINE_COMPARE(ELM_WAYLAND_SHM)) &&
5662        (!ENGINE_COMPARE(ELM_WAYLAND_EGL)))
5663      return NULL;
5664
5665    if (!evas_object_smart_type_check_ptr(obj, MY_CLASS_NAME_LEGACY))
5666      {
5667         Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(obj));
5668         return _elm_ee_wlwin_get(ee);
5669      }
5670
5671    ELM_WIN_CHECK(obj) NULL;
5672    Ecore_Wl_Window *ret = NULL;
5673    eo_do((Eo *) obj, elm_obj_win_wl_window_get(&ret));
5674    return ret;
5675 }
5676
5677 static void
5678 _wl_window_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5679 {
5680    Ecore_Wl_Window **ret = va_arg(*list, Ecore_Wl_Window **);
5681 #if HAVE_ELEMENTARY_WAYLAND
5682    Elm_Win_Smart_Data *sd = _pd;
5683    if (sd->wl.win)
5684      {
5685         *ret = sd->wl.win;
5686         return;
5687      }
5688    if (sd->parent)
5689      {
5690         *ret = elm_win_wl_window_get(sd->parent);
5691         return;
5692      }
5693 #else
5694    (void)_pd;
5695 #endif
5696    *ret = NULL;
5697 }
5698
5699 EAPI Eina_Bool
5700 elm_win_trap_set(const Elm_Win_Trap *t)
5701 {
5702    DBG("old %p, new %p", trap, t);
5703
5704    if ((t) && (t->version != ELM_WIN_TRAP_VERSION))
5705      {
5706         CRI("trying to set a trap version %lu while %lu was expected!",
5707                  t->version, ELM_WIN_TRAP_VERSION);
5708         return EINA_FALSE;
5709      }
5710
5711    trap = t;
5712    return EINA_TRUE;
5713 }
5714
5715 EAPI void
5716 elm_win_floating_mode_set(Evas_Object *obj, Eina_Bool floating)
5717 {
5718    ELM_WIN_CHECK(obj);
5719    ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
5720
5721    floating = !!floating;
5722    if (floating == sd->floating) return;
5723    sd->floating = floating;
5724 #ifdef HAVE_ELEMENTARY_X
5725    _elm_win_xwindow_get(sd);
5726    if (sd->x.xwin)
5727      {
5728         if (sd->floating)
5729           ecore_x_e_illume_window_state_set
5730              (sd->x.xwin, ECORE_X_ILLUME_WINDOW_STATE_FLOATING);
5731         else
5732           ecore_x_e_illume_window_state_set
5733              (sd->x.xwin, ECORE_X_ILLUME_WINDOW_STATE_NORMAL);
5734      }
5735 #endif
5736 }
5737
5738 EAPI Eina_Bool
5739 elm_win_floating_mode_get(const Evas_Object *obj)
5740 {
5741    ELM_WIN_CHECK(obj) EINA_FALSE;
5742    ELM_WIN_DATA_GET_OR_RETURN_VAL(obj, sd, EINA_FALSE);
5743
5744    return sd->floating;
5745 }
5746
5747 static void
5748 _window_id_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
5749 {
5750    Ecore_Window *ret = va_arg(*list, Ecore_Window *);
5751    Elm_Win_Smart_Data *sd = _pd;
5752
5753    if ((ENGINE_COMPARE(ELM_WAYLAND_SHM)) || (ENGINE_COMPARE(ELM_WAYLAND_EGL)))
5754      {
5755 #if HAVE_ELEMENTARY_WAYLAND
5756         if (sd->wl.win)
5757           {
5758              *ret = (Ecore_Window)ecore_wl_window_surface_id_get(sd->wl.win);
5759              return;
5760           }
5761         if (sd->parent)
5762           {
5763              Ecore_Wl_Window *parent;
5764
5765              parent = elm_win_wl_window_get(sd->parent);
5766              if (parent) *ret = (Ecore_Window)ecore_wl_window_surface_id_get(parent);
5767              return;
5768           }
5769 #endif
5770      }
5771    else
5772      {
5773 #ifdef HAVE_ELEMENTARY_X
5774         _elm_win_xwindow_get(sd);
5775         if (sd->x.xwin)
5776           {
5777              *ret = (Ecore_Window)sd->x.xwin;
5778              return;
5779           }
5780         if (sd->parent)
5781           {
5782              *ret = (Ecore_Window)elm_win_xwindow_get(sd->parent);
5783              return;
5784           }
5785 #endif
5786      }
5787
5788    *ret = 0;
5789 }
5790
5791 void
5792 _elm_win_focus_highlight_start(Evas_Object *obj)
5793 {
5794    ELM_WIN_DATA_GET(obj, sd);
5795
5796    if (!elm_win_focus_highlight_enabled_get(obj)) return;
5797    sd->focus_highlight.cur.visible = EINA_TRUE;
5798    sd->focus_highlight.geometry_changed = EINA_TRUE;
5799    _elm_win_focus_highlight_reconfigure_job(obj);
5800 }
5801
5802 EAPI Ecore_Window
5803 elm_win_window_id_get(const Evas_Object *obj)
5804 {
5805    if (!obj) return 0;
5806
5807    if (!evas_object_smart_type_check_ptr(obj, MY_CLASS_NAME_LEGACY))
5808      {
5809         Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(obj));
5810         return ecore_evas_window_get(ee);
5811      }
5812
5813    ELM_WIN_CHECK(obj) 0;
5814    Ecore_Window ret = 0;
5815    eo_do((Eo *) obj, elm_obj_win_window_id_get(&ret));
5816    return ret;
5817 }
5818
5819 static void
5820 _class_constructor(Eo_Class *klass)
5821 {
5822    const Eo_Op_Func_Description func_desc[] = {
5823         EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_CONSTRUCTOR), _constructor),
5824         EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_ADD), _elm_win_smart_add),
5825         EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_DEL), _elm_win_smart_del),
5826         EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_RESIZE), _elm_win_smart_resize),
5827         EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_MOVE), _elm_win_smart_move),
5828         EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_SHOW), _elm_win_smart_show),
5829         EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_HIDE), _elm_win_smart_hide),
5830
5831         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_ON_FOCUS), _elm_win_smart_on_focus),
5832         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_EVENT), _elm_win_smart_event),
5833         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_NEXT_MANAGER_IS), _elm_win_smart_focus_next_manager_is),
5834         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_NEXT), _elm_win_smart_focus_next),
5835         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_DIRECTION_MANAGER_IS), _elm_win_smart_focus_direction_manager_is),
5836         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_DIRECTION), _elm_win_smart_focus_direction),
5837         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_THEME_APPLY), _elm_win_smart_theme),
5838
5839         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_WIN_CONSTRUCTOR), _win_constructor),
5840         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_RESIZE_OBJECT_ADD), _resize_object_add),
5841         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_RESIZE_OBJECT_DEL), _resize_object_del),
5842         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_TYPE_GET), _type_get),
5843         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_TITLE_SET), _title_set),
5844         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_TITLE_GET), _title_get),
5845         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ICON_NAME_SET), _icon_name_set),
5846         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ICON_NAME_GET), _icon_name_get),
5847         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ROLE_SET), _role_set),
5848         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ROLE_GET), _role_get),
5849         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ICON_OBJECT_SET), _icon_object_set),
5850         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ICON_OBJECT_GET), _icon_object_get),
5851         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_AUTODEL_SET), _autodel_set),
5852         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_AUTODEL_GET), _autodel_get),
5853         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ACTIVATE), _activate),
5854         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_LOWER), _lower),
5855         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_RAISE), _raise),
5856         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_CENTER), _center),
5857         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_BORDERLESS_SET), _borderless_set),
5858         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_BORDERLESS_GET), _borderless_get),
5859         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_SHAPED_SET), _shaped_set),
5860         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_SHAPED_GET), _shaped_get),
5861         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ALPHA_SET), _alpha_set),
5862         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ALPHA_GET), _alpha_get),
5863         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_OVERRIDE_SET), _override_set),
5864         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_OVERRIDE_GET), _override_get),
5865         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_FULLSCREEN_SET), _fullscreen_set),
5866         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_FULLSCREEN_GET), _fullscreen_get),
5867         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_MAIN_MENU_GET), _main_menu_get),
5868         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_MAXIMIZED_SET), _maximized_set),
5869         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_MAXIMIZED_GET), _maximized_get),
5870         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ICONIFIED_SET), _iconified_set),
5871         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ICONIFIED_GET), _iconified_get),
5872         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_WITHDRAWN_SET), _withdrawn_set),
5873         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_WITHDRAWN_GET), _withdrawn_get),
5874         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_AVAILABLE_PROFILES_SET), _available_profiles_set),
5875         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_AVAILABLE_PROFILES_GET), _available_profiles_get),
5876         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_PROFILE_SET), _profile_set),
5877         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_PROFILE_GET), _profile_get),
5878         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_URGENT_SET), _urgent_set),
5879         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_URGENT_GET), _urgent_get),
5880         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_DEMAND_ATTENTION_SET), _demand_attention_set),
5881         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_DEMAND_ATTENTION_GET), _demand_attention_get),
5882         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_MODAL_SET), _modal_set),
5883         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_MODAL_GET), _modal_get),
5884         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ASPECT_SET), _aspect_set),
5885         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ASPECT_GET), _aspect_get),
5886         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_SIZE_BASE_SET), _size_base_set),
5887         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_SIZE_BASE_GET), _size_base_get),
5888         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_SIZE_STEP_SET), _size_step_set),
5889         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_SIZE_STEP_GET), _size_step_get),
5890         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_LAYER_SET), _layer_set),
5891         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_LAYER_GET), _layer_get),
5892         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ROTATION_SET), _rotation_set),
5893         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ROTATION_WITH_RESIZE_SET), _rotation_with_resize_set),
5894         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ROTATION_GET), _rotation_get),
5895         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_STICKY_SET), _sticky_set),
5896         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_STICKY_GET), _sticky_get),
5897         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_KEYBOARD_MODE_SET), _keyboard_mode_set),
5898         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_KEYBOARD_MODE_GET), _keyboard_mode_get),
5899         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_KEYBOARD_WIN_SET), _keyboard_win_set),
5900         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_KEYBOARD_WIN_GET), _keyboard_win_get),
5901         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_INDICATOR_MODE_SET), _indicator_mode_set),
5902         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_INDICATOR_MODE_GET), _indicator_mode_get),
5903         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_INDICATOR_OPACITY_SET), _indicator_opacity_set),
5904         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_INDICATOR_OPACITY_GET), _indicator_opacity_get),
5905         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_SCREEN_POSITION_GET), _screen_position_get),
5906         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_FOCUS_GET), _focus_get),
5907         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_SCREEN_CONSTRAIN_SET), _screen_constrain_set),
5908         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_SCREEN_CONSTRAIN_GET), _screen_constrain_get),
5909         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_SCREEN_SIZE_GET), _screen_size_get),
5910         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_SCREEN_DPI_GET), _screen_dpi_get),
5911         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_CONFORMANT_SET), _conformant_set),
5912         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_CONFORMANT_GET), _conformant_get),
5913         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_SET), _quickpanel_set),
5914         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_GET), _quickpanel_get),
5915         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_PRIORITY_MAJOR_SET), _quickpanel_priority_major_set),
5916         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_PRIORITY_MAJOR_GET), _quickpanel_priority_major_get),
5917         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_PRIORITY_MINOR_SET), _quickpanel_priority_minor_set),
5918         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_PRIORITY_MINOR_GET), _quickpanel_priority_minor_get),
5919         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_ZONE_SET), _quickpanel_zone_set),
5920         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_ZONE_GET), _quickpanel_zone_get),
5921         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_PROP_FOCUS_SKIP_SET), _prop_focus_skip_set),
5922         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_ILLUME_COMMAND_SEND), _illume_command_send),
5923         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_INLINED_IMAGE_OBJECT_GET), _inlined_image_object_get),
5924         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_FOCUS_HIGHLIGHT_ENABLED_SET), _focus_highlight_enabled_set),
5925         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_FOCUS_HIGHLIGHT_ENABLED_GET), _focus_highlight_enabled_get),
5926         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_FOCUS_HIGHLIGHT_STYLE_SET), _focus_highlight_style_set),
5927         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_FOCUS_HIGHLIGHT_STYLE_GET), _focus_highlight_style_get),
5928         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_FOCUS_HIGHLIGHT_ANIMATE_SET), _focus_highlight_animate_set),
5929         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_FOCUS_HIGHLIGHT_ANIMATE_GET), _focus_highlight_animate_get),
5930         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_SOCKET_LISTEN), _socket_listen),
5931         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_XWINDOW_GET), _xwindow_get),
5932         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_WL_WINDOW_GET), _wl_window_get),
5933         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_WINDOW_ID_GET), _window_id_get),
5934         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_WM_ROTATION_SUPPORTED_GET), _wm_rotation_supported_get),
5935         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_WM_PREFERRED_ROTATION_SET), _wm_preferred_rotation_set),
5936         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_WM_PREFERRED_ROTATION_GET), _wm_preferred_rotation_get),
5937         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_WM_AVAILABLE_ROTATIONS_SET), _wm_available_rotations_set),
5938         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_WM_AVAILABLE_ROTATIONS_GET), _wm_available_rotations_get),
5939         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_WM_MANUAL_ROTATION_DONE_SET), _wm_manual_rotation_done_set),
5940         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_WM_MANUAL_ROTATION_DONE_GET), _wm_manual_rotation_done_get),
5941         EO_OP_FUNC(ELM_OBJ_WIN_ID(ELM_OBJ_WIN_SUB_ID_WM_MANUAL_ROTATION_DONE), _wm_manual_rotation_done),
5942         EO_OP_FUNC_SENTINEL
5943    };
5944
5945    eo_class_funcs_set(klass, func_desc);
5946
5947    evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
5948 }
5949
5950 static const Eo_Op_Description op_desc[] = {
5951      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_WIN_CONSTRUCTOR, "Adds a window object."),
5952      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_RESIZE_OBJECT_ADD, "Add subobj as a resize object of window obj."),
5953      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_RESIZE_OBJECT_DEL, "Delete subobj as a resize object of window obj."),
5954      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_TYPE_GET, "Get the type of the window."),
5955      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_TITLE_SET, "Set the title of the window."),
5956      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_TITLE_GET, "Get the title of the window."),
5957      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ICON_NAME_SET, "Set the icon name of the window."),
5958      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ICON_NAME_GET, "Get the icon name of the window."),
5959      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ROLE_SET, "Set the role of the window."),
5960      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ROLE_GET, "Get the role of the window."),
5961      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ICON_OBJECT_SET, "Set a window object's icon."),
5962      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ICON_OBJECT_GET, "Get the icon object used for the window."),
5963      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_AUTODEL_SET, "Set the window's autodel state."),
5964      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_AUTODEL_GET, "Get the window's autodel state."),
5965      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ACTIVATE, "Activate a window object."),
5966      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_LOWER, "Lower a window object."),
5967      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_RAISE, "Raise a window object."),
5968      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_CENTER, "Center a window on its screen."),
5969      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_BORDERLESS_SET, "Set the borderless state of a window."),
5970      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_BORDERLESS_GET, "Get the borderless state of a window."),
5971      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_SHAPED_SET, "Set the shaped state of a window."),
5972      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_SHAPED_GET, "Get the shaped state of a window."),
5973      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ALPHA_SET, "Set the alpha channel state of a window."),
5974      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ALPHA_GET, "Get the alpha channel state of a window."),
5975      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_OVERRIDE_SET, "Set the override state of a window."),
5976      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_OVERRIDE_GET, "Get the override state of a window."),
5977      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_FULLSCREEN_SET, "Set the fullscreen state of a window."),
5978      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_FULLSCREEN_GET, "Get the fullscreen state of a window."),
5979      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_MAIN_MENU_GET, "Get the Main Menu of a window."),
5980      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_MAXIMIZED_SET, "Set the maximized state of a window."),
5981      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_MAXIMIZED_GET, "Get the maximized state of a window."),
5982      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ICONIFIED_SET, "Set the iconified state of a window."),
5983      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ICONIFIED_GET, "Get the iconified state of a window."),
5984      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_WITHDRAWN_SET, "Set the withdrawn state of a window."),
5985      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_WITHDRAWN_GET, "Get the withdrawn state of a window."),
5986      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_AVAILABLE_PROFILES_SET, "Set the array of available profiles to a window."),
5987      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_AVAILABLE_PROFILES_GET, "Get the array of available profiles of a window."),
5988      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_PROFILE_SET, "Set the profile of a window."),
5989      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_PROFILE_GET, "Get the profile of a window."),
5990      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_URGENT_SET, "Set the urgent state of a window."),
5991      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_URGENT_GET, "Get the urgent state of a window."),
5992      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_DEMAND_ATTENTION_SET, "Set the demand_attention state of a window."),
5993      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_DEMAND_ATTENTION_GET, "Get the demand_attention state of a window."),
5994      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_MODAL_SET, "Set the modal state of a window."),
5995      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_MODAL_GET, "Get the modal state of a window."),
5996      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ASPECT_SET, "Set the aspect ratio of a window."),
5997      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ASPECT_GET, "Get the aspect ratio of a window."),
5998      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_SIZE_BASE_SET, "Set the base window size used with stepping calculation."),
5999      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_SIZE_BASE_GET, "Get the base size of a window."),
6000      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_SIZE_STEP_SET, "Set the window stepping used with sizing calculation."),
6001      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_SIZE_STEP_GET, "Get the stepping of a window."),
6002      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_LAYER_SET, "Set the layer of the window."),
6003      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_LAYER_GET, "Get the layer of the window."),
6004      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ROTATION_SET, "Set the rotation of the window."),
6005      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ROTATION_WITH_RESIZE_SET, "Rotates the window and resizes it."),
6006      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ROTATION_GET, "Get the rotation of the window."),
6007      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_STICKY_SET, "Set the sticky state of the window."),
6008      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_STICKY_GET, "Get the sticky state of the window."),
6009      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_KEYBOARD_MODE_SET, "Sets the keyboard mode of the window."),
6010      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_KEYBOARD_MODE_GET, "Get the keyboard mode of the window."),
6011      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_KEYBOARD_WIN_SET, "Sets whether the window is a keyboard."),
6012      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_KEYBOARD_WIN_GET, "Get whether the window is a keyboard."),
6013      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_INDICATOR_MODE_SET, "Sets the indicator mode of the window."),
6014      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_INDICATOR_MODE_GET, "Get the indicator mode of the window."),
6015      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_INDICATOR_OPACITY_SET, "Sets the indicator opacity mode of the window."),
6016      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_INDICATOR_OPACITY_GET, "Get the indicator opacity mode of the window."),
6017      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_SCREEN_POSITION_GET, "Get the screen position of a window."),
6018      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_FOCUS_GET, "Determine whether a window has focus."),
6019      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_SCREEN_CONSTRAIN_SET, "Constrain the maximum width and height of a window to the width and height of its screen."),
6020      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_SCREEN_CONSTRAIN_GET, "Retrieve the constraints on the maximum width and height of a window relative to the width and height of its screen."),
6021      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_SCREEN_SIZE_GET, "Get screen geometry details for the screen that a window is on."),
6022      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_SCREEN_DPI_GET, "Get screen dpi for the screen that a window is on."),
6023      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_CONFORMANT_SET, "Set if this window is an illume conformant window."),
6024      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_CONFORMANT_GET, "Get if this window is an illume conformant window."),
6025      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_SET, "Set a window to be an illume quickpanel window."),
6026      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_GET, "Get if this window is a quickpanel or not."),
6027      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_PRIORITY_MAJOR_SET, "Set the major priority of a quickpanel window."),
6028      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_PRIORITY_MAJOR_GET, "Get the major priority of a quickpanel window."),
6029      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_PRIORITY_MINOR_SET, "Set the minor priority of a quickpanel window."),
6030      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_PRIORITY_MINOR_GET, "Get the minor priority of a quickpanel window."),
6031      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_ZONE_SET, "Set which zone this quickpanel should appear in."),
6032      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_QUICKPANEL_ZONE_GET, "Get which zone this quickpanel should appear in."),
6033      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_PROP_FOCUS_SKIP_SET, "Set the window to be skipped by keyboard focus."),
6034      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_ILLUME_COMMAND_SEND, "Send a command to the windowing environment."),
6035      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_INLINED_IMAGE_OBJECT_GET, "Get the inlined image object handle."),
6036      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_FOCUS_HIGHLIGHT_ENABLED_SET, "Set the enabled status for the focus highlight in a window."),
6037      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_FOCUS_HIGHLIGHT_ENABLED_GET, "Get the enabled value of the focus highlight for this window."),
6038      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_FOCUS_HIGHLIGHT_STYLE_SET, "Set the style for the focus highlight on this window."),
6039      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_FOCUS_HIGHLIGHT_STYLE_GET, "Get the style set for the focus highlight object."),
6040      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_FOCUS_HIGHLIGHT_ANIMATE_SET, "Set the animate status for the focus highlight for this window."),
6041      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_FOCUS_HIGHLIGHT_ANIMATE_GET, "Get the animate status for the focus highlight for this window."),
6042      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_SOCKET_LISTEN, "Create a socket to provide the service for Plug widget."),
6043      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_XWINDOW_GET, "Get the Ecore_X_Window of an Evas_Object."),
6044      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_WL_WINDOW_GET, "Get the Ecore_Wl_Window of an Evas_Object."),
6045      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_WINDOW_ID_GET, "Get the Ecore_Window of an Evas_Object."),
6046      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_WM_ROTATION_SUPPORTED_GET, "Query if the underlying windowing system supports the window manager rotation.."),
6047      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_WM_PREFERRED_ROTATION_SET, "Set the preferred rotation hint."),
6048      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_WM_PREFERRED_ROTATION_GET, "Get the preferred rotation hint."),
6049      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_WM_AVAILABLE_ROTATIONS_SET, "Set the array of available window rotations."),
6050      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_WM_AVAILABLE_ROTATIONS_GET, "Get the array of available window rotations."),
6051      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_WM_MANUAL_ROTATION_DONE_SET, "Set manual rotation done mode of obj window."),
6052      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_WM_MANUAL_ROTATION_DONE_GET, "Get manual rotation done mode of obj window."),
6053      EO_OP_DESCRIPTION(ELM_OBJ_WIN_SUB_ID_WM_MANUAL_ROTATION_DONE, "Set rotation finish manually"),
6054      EO_OP_DESCRIPTION_SENTINEL
6055 };
6056
6057 static const Eo_Class_Description class_desc = {
6058      EO_VERSION,
6059      MY_CLASS_NAME,
6060      EO_CLASS_TYPE_REGULAR,
6061      EO_CLASS_DESCRIPTION_OPS(&ELM_OBJ_WIN_BASE_ID, op_desc, ELM_OBJ_WIN_SUB_ID_LAST),
6062      NULL,
6063      sizeof(Elm_Win_Smart_Data),
6064      _class_constructor,
6065      NULL
6066 };
6067
6068 EO_DEFINE_CLASS(elm_obj_win_class_get, &class_desc, ELM_OBJ_WIDGET_CLASS, NULL);