5 #include "ecore_wl2_private.h"
6 #include "efl-hints-client-protocol.h"
8 // TIZEN_ONLY(20200601): support sync between ui and video
9 #include <wayland-tbm-client.h>
12 //TIZEN_ONLY(20171216): add ecore_wl2_window_find
14 static Eina_Hash *_windows = NULL;
16 // TIZEN_ONLY(20190910)
17 static void _opaque_set(Ecore_Wl2_Window *window);
20 // TIZEN_ONLY(20201123)
21 static void _opaque_region_set(Ecore_Wl2_Window *window, struct wl_region *region);
24 // TIZEN_ONLY(20210330): for maintain internal aux hint list
25 typedef struct _Ecore_Wl2_Window_Aux_Hint Ecore_Wl2_Window_Aux_Hint;
26 struct _Ecore_Wl2_Window_Aux_Hint
29 Eina_Stringshare *hint;
30 Eina_Stringshare *val;
34 /* internal functions */
36 _ecore_wl2_window_init(void)
39 _windows = eina_hash_string_superfast_new(NULL);
43 _ecore_wl2_window_shutdown(void)
45 eina_hash_free(_windows);
50 _ecore_wl2_window_hash_get(void)
56 _ecore_wl2_window_id_str_get(int win_id)
58 const char *vals = "qWeRtYuIoP5$&<~";
62 val = (unsigned int)win_id;
63 id[0] = vals[(val >> 28) & 0xf];
64 id[1] = vals[(val >> 24) & 0xf];
65 id[2] = vals[(val >> 20) & 0xf];
66 id[3] = vals[(val >> 16) & 0xf];
67 id[4] = vals[(val >> 12) & 0xf];
68 id[5] = vals[(val >> 8) & 0xf];
69 id[6] = vals[(val >> 4) & 0xf];
70 id[7] = vals[(val) & 0xf];
76 static void _ecore_wl2_window_hide_send(Ecore_Wl2_Window *window);
79 _ecore_wl2_window_semi_free(Ecore_Wl2_Window *window)
81 if (window->xdg_popup) xdg_popup_destroy(window->xdg_popup);
82 window->xdg_popup = NULL;
84 if (window->xdg_toplevel) xdg_toplevel_destroy(window->xdg_toplevel);
85 window->xdg_toplevel = NULL;
87 if (window->xdg_surface) xdg_surface_destroy(window->xdg_surface);
88 window->xdg_surface = NULL;
90 if (window->zxdg_popup) zxdg_popup_v6_destroy(window->zxdg_popup);
91 window->zxdg_popup = NULL;
93 if (window->zxdg_toplevel) zxdg_toplevel_v6_destroy(window->zxdg_toplevel);
94 window->zxdg_toplevel = NULL;
96 if (window->zxdg_surface) zxdg_surface_v6_destroy(window->zxdg_surface);
97 window->zxdg_surface = NULL;
99 if (window->www_surface)
100 www_surface_destroy(window->www_surface);
101 window->www_surface = NULL;
103 if (window->surface) wl_surface_destroy(window->surface);
104 window->surface = NULL;
105 window->surface_id = -1;
107 if (window->callback) wl_callback_destroy(window->callback);
108 window->callback = NULL;
110 window->outputs = eina_list_free(window->outputs);
112 ecore_wl2_window_surface_flush(window, EINA_TRUE);
114 window->commit_pending = EINA_FALSE;
118 _ecore_wl2_window_activate_send(Ecore_Wl2_Window *window)
120 Ecore_Wl2_Event_Window_Activate *ev;
122 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Activate));
125 ev->win = window->id;
127 ev->parent_win = window->parent->id;
128 ev->event_win = window->id;
129 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ACTIVATE, ev, NULL, NULL);
133 _ecore_wl2_window_deactivate_send(Ecore_Wl2_Window *window)
135 Ecore_Wl2_Event_Window_Deactivate *ev;
137 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Deactivate));
140 ev->win = window->id;
142 ev->parent_win = window->parent->id;
143 ev->event_win = window->id;
144 ecore_event_add(ECORE_WL2_EVENT_WINDOW_DEACTIVATE, ev, NULL, NULL);
148 _ecore_wl2_window_configure_send(Ecore_Wl2_Window *win)
150 Ecore_Wl2_Event_Window_Configure *ev;
153 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Configure));
157 ev->event_win = win->id;
159 // TIZEN_ONLY(20171112): support tizen_position
160 ev->x = win->set_config.geometry.x;
161 ev->y = win->set_config.geometry.y;
164 // TIZEN_ONLY(220421/220905): modify event size
165 if (win->def_config.serial == win->req_config.serial)
167 // this means that this function is called by internal function not display server's configure
174 if (win->def_config.fullscreen || win->def_config.maximized)
176 ev->w = win->def_config.geometry.w;
177 ev->h = win->def_config.geometry.h;
182 if ((win->def_config.fullscreen != win->req_config.fullscreen) ||
183 (win->def_config.maximized != win->req_config.maximized))
185 // this means that window unset fullscreen or maximized.
186 // use saved geometry
187 ev->w = win->saved.w;
188 ev->h = win->saved.h;
193 if (win->pending.user_resize)
195 ev->w = win->pending.user_w;
196 ev->h = win->pending.user_h;
201 if (win->def_config.geometry.w || win->def_config.geometry.h)
203 ev->w = win->def_config.geometry.w;
204 ev->h = win->def_config.geometry.h;
209 // this means that display server didn't consider client's size.
217 win->pending.user_resize = EINA_FALSE;
220 if ((win->set_config.geometry.w == win->def_config.geometry.w) &&
221 (win->set_config.geometry.h == win->def_config.geometry.h))
223 else if ((!win->def_config.geometry.w) && (!win->def_config.geometry.h) &&
224 (!win->def_config.fullscreen) &&
225 (!win->def_config.maximized) &&
226 ((win->def_config.fullscreen != win->req_config.fullscreen) ||
227 (win->def_config.maximized != win->req_config.maximized)))
228 ev->w = win->saved.w, ev->h = win->saved.h;
230 ev->w = win->def_config.geometry.w, ev->h = win->def_config.geometry.h;
234 ev->edges = !!win->def_config.resizing;
235 if (win->def_config.fullscreen)
236 ev->states |= ECORE_WL2_WINDOW_STATE_FULLSCREEN;
237 if (win->def_config.maximized)
238 ev->states |= ECORE_WL2_WINDOW_STATE_MAXIMIZED;
240 win->req_config = win->def_config;
241 win->pending.configure_event++;
243 ERR("[WINDOW] Generate WINDOW_CONFIGURE event.. win:%d, states:%d, geo(%d,%d,%dx%d), type:%d", win->resource_id, ev->states, ev->x, ev->y, ev->w, ev->h, size_type);
244 ecore_event_add(ECORE_WL2_EVENT_WINDOW_CONFIGURE, ev, NULL, NULL);
246 if (win->def_config.focused)
247 _ecore_wl2_window_activate_send(win);
249 _ecore_wl2_window_deactivate_send(win);
252 //TIZEN_ONLY(20180201) : add function to set window size by client.
254 _ecore_wl2_window_configure_send_by_client(Ecore_Wl2_Window *win)
256 Ecore_Wl2_Event_Window_Configure *ev;
258 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Configure));
262 ev->event_win = win->id;
263 ev->x = win->set_config.geometry.x;
264 ev->y = win->set_config.geometry.y;
265 ev->w = win->set_config.geometry.w;
266 ev->h = win->set_config.geometry.h;
267 ev->edges = !!win->req_config.resizing;
269 ecore_event_add(ECORE_WL2_EVENT_WINDOW_CONFIGURE, ev, NULL, NULL);
274 _configure_complete(Ecore_Wl2_Window *window)
276 Ecore_Wl2_Event_Window_Configure_Complete *ev;
278 window->pending.configure = EINA_FALSE;
280 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Configure_Complete));
283 ev->win = window->id;
284 ecore_event_add(ECORE_WL2_EVENT_WINDOW_CONFIGURE_COMPLETE, ev, NULL, NULL);
288 #include "window_v6.x"
291 _www_surface_end_drag(void *data, struct www_surface *www_surface EINA_UNUSED)
293 Ecore_Wl2_Window *window = data;
294 Ecore_Wl2_Event_Window_WWW_Drag *ev;
296 ev = malloc(sizeof(Ecore_Wl2_Event_Window_WWW_Drag));
297 EINA_SAFETY_ON_NULL_RETURN(ev);
298 ev->window = window->id;
301 ecore_event_add(_ecore_wl2_event_window_www_drag, ev, NULL, NULL);
305 _www_surface_start_drag(void *data, struct www_surface *www_surface EINA_UNUSED)
307 Ecore_Wl2_Window *window = data;
308 Ecore_Wl2_Event_Window_WWW_Drag *ev;
310 ev = malloc(sizeof(Ecore_Wl2_Event_Window_WWW_Drag));
311 EINA_SAFETY_ON_NULL_RETURN(ev);
312 ev->window = window->id;
315 ecore_event_add(_ecore_wl2_event_window_www_drag, ev, NULL, NULL);
319 _www_surface_status(void *data, struct www_surface *www_surface EINA_UNUSED, int32_t x_rel, int32_t y_rel, uint32_t timestamp)
321 Ecore_Wl2_Window *window = data;
322 Ecore_Wl2_Event_Window_WWW *ev;
324 ev = malloc(sizeof(Ecore_Wl2_Event_Window_WWW));
325 EINA_SAFETY_ON_NULL_RETURN(ev);
326 ev->window = window->id;
329 ev->timestamp = timestamp;
331 ecore_event_add(_ecore_wl2_event_window_www, ev, NULL, NULL);
334 static struct www_surface_listener _www_surface_listener =
336 .status = _www_surface_status,
337 .start_drag = _www_surface_start_drag,
338 .end_drag = _www_surface_end_drag,
342 _ecore_wl2_window_www_surface_init(Ecore_Wl2_Window *window)
344 if (!window->surface) return;
345 if (!window->display->wl.www) return;
346 if (window->www_surface) return;
347 window->www_surface = www_create(window->display->wl.www, window->surface);
348 www_surface_set_user_data(window->www_surface, window);
349 www_surface_add_listener(window->www_surface, &_www_surface_listener,
355 _xdg_surface_cb_configure(void *data, struct xdg_surface *xdg_surface EINA_UNUSED, uint32_t serial)
357 Ecore_Wl2_Window *window;
360 window->def_config.serial = serial;
362 if (window->pending.configure)
364 window->saved.w = window->set_config.geometry.w;
365 window->saved.h = window->set_config.geometry.h;
367 if (window->pending.configure && window->updating)
368 ERR("Window shouldn't be rendering before initial configure");
370 // TIZEN_ONLY(20200922) : update window's saved size
371 if (!window->def_config.fullscreen && !window->def_config.maximized)
373 if (window->pending.geom)
375 window->saved.w = window->set_config.geometry.w;
376 window->saved.h = window->set_config.geometry.h;
381 if (!window->updating)
382 _ecore_wl2_window_configure_send(window);
384 if (window->pending.configure)
385 _configure_complete(window);
388 static const struct xdg_surface_listener _xdg_surface_listener =
390 _xdg_surface_cb_configure,
394 _xdg_toplevel_cb_configure(void *data, struct xdg_toplevel *xdg_toplevel EINA_UNUSED, int32_t width, int32_t height, struct wl_array *states)
396 Ecore_Wl2_Window *win = data;
399 win->def_config.minimized = EINA_FALSE;
400 win->def_config.maximized = EINA_FALSE;
401 win->def_config.fullscreen = EINA_FALSE;
402 win->def_config.focused = EINA_FALSE;
403 win->def_config.resizing = EINA_FALSE;
404 win->def_config.geometry.w = width;
405 win->def_config.geometry.h = height;
407 wl_array_for_each(s, states)
411 case ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED:
412 win->def_config.maximized = EINA_TRUE;
414 case ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN:
415 win->def_config.fullscreen = EINA_TRUE;
417 case ZXDG_TOPLEVEL_V6_STATE_RESIZING:
418 win->def_config.resizing = EINA_TRUE;
420 case ZXDG_TOPLEVEL_V6_STATE_ACTIVATED:
421 win->def_config.focused = EINA_TRUE;
422 win->def_config.minimized = EINA_FALSE;
428 if ((!width) && (!height) && (!win->def_config.fullscreen) && (!win->def_config.maximized) &&
429 ((win->def_config.fullscreen != win->set_config.fullscreen) || (win->def_config.maximized != win->set_config.maximized)))
430 width = win->saved.w, height = win->saved.h;
432 _ecore_wl2_window_configure_send(win);
433 //, width, height, !!win->def_config.resizing,
434 // win->def_config.fullscreen, win->def_config.maximized);
436 if (win->def_config.focused)
437 _ecore_wl2_window_activate_send(win);
439 _ecore_wl2_window_deactivate_send(win);
443 _xdg_toplevel_cb_close(void *data, struct xdg_toplevel *xdg_toplevel EINA_UNUSED)
445 Ecore_Wl2_Window *win;
451 win->cb_close(win->cb_close_data, win);
452 win->cb_close = NULL;
454 ecore_wl2_window_free(win);
457 static const struct xdg_toplevel_listener _xdg_toplevel_listener =
459 _xdg_toplevel_cb_configure,
460 _xdg_toplevel_cb_close,
464 _xdg_popup_cb_configure(void *data, struct xdg_popup *xdg_popup EINA_UNUSED, int32_t x EINA_UNUSED, int32_t y EINA_UNUSED, int32_t width, int32_t height)
466 Ecore_Wl2_Window *win = data;
467 win->def_config.geometry.w = width;
468 win->def_config.geometry.h = height;
472 _xdg_popup_cb_done(void *data, struct xdg_popup *xdg_popup EINA_UNUSED)
474 Ecore_Wl2_Window *win;
479 if (win->grab) _ecore_wl2_input_ungrab(win->grab);
481 _ecore_wl2_window_hide_send(win);
484 static const struct xdg_popup_listener _xdg_popup_listener =
486 _xdg_popup_cb_configure,
491 _ecore_wl2_window_xdg_popup_create(Ecore_Wl2_Window *win)
494 struct xdg_positioner *pos;
496 EINA_SAFETY_ON_NULL_RETURN(win->parent);
497 if (!win->parent->zxdg_surface) return;
499 pos = xdg_wm_base_create_positioner(win->display->wl.xdg_wm_base);
502 ecore_wl2_window_geometry_get(win, NULL, NULL, &gw, &gh);
503 xdg_positioner_set_anchor_rect(pos, 0, 0, 1, 1);
504 xdg_positioner_set_size(pos, gw, gh);
505 xdg_positioner_set_anchor(pos, XDG_POSITIONER_ANCHOR_TOP_LEFT);
506 xdg_positioner_set_gravity(pos, ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
507 ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
509 win->xdg_popup = xdg_surface_get_popup(win->xdg_surface,
510 win->parent->xdg_surface, pos);
512 xdg_positioner_destroy(pos);
514 xdg_popup_grab(win->xdg_popup, win->grab->wl.seat,
515 wl_display_get_serial(win->display->wl.display));
516 xdg_popup_set_user_data(win->xdg_popup, win);
517 xdg_popup_add_listener(win->xdg_popup, &_xdg_popup_listener, win);
519 win->pending.configure = EINA_TRUE;
521 ecore_wl2_window_commit(win, EINA_TRUE);
525 _window_shell_surface_create(Ecore_Wl2_Window *window)
527 if (window->xdg_surface) return;
528 window->xdg_surface =
529 xdg_wm_base_get_xdg_surface(window->display->wl.xdg_wm_base,
531 xdg_surface_set_user_data(window->xdg_surface, window);
532 xdg_surface_add_listener(window->xdg_surface,
533 &_xdg_surface_listener, window);
535 window->xdg_configure_ack = xdg_surface_ack_configure;
536 window->pending.configure = EINA_TRUE;
537 if (window->display->wl.efl_hints)
539 if (window->aspect.set)
540 efl_hints_set_aspect(window->display->wl.efl_hints, window->xdg_surface,
541 window->aspect.w, window->aspect.h, window->aspect.aspect);
542 if (window->weight.set)
543 efl_hints_set_weight(window->display->wl.efl_hints, window->xdg_surface,
544 window->weight.w, window->weight.h);
547 if (window->type == ECORE_WL2_WINDOW_TYPE_MENU)
548 _ecore_wl2_window_xdg_popup_create(window);
551 struct xdg_toplevel *ptop = NULL;
553 window->xdg_toplevel =
554 xdg_surface_get_toplevel(window->xdg_surface);
555 xdg_toplevel_set_user_data(window->xdg_toplevel, window);
556 xdg_toplevel_add_listener(window->xdg_toplevel,
557 &_xdg_toplevel_listener, window);
560 xdg_toplevel_set_title(window->xdg_toplevel, window->title);
562 xdg_toplevel_set_app_id(window->xdg_toplevel, window->class);
564 window->xdg_set_min_size = xdg_toplevel_set_min_size;
565 window->xdg_set_max_size = xdg_toplevel_set_max_size;
568 ptop = window->parent->xdg_toplevel;
571 xdg_toplevel_set_parent(window->xdg_toplevel, ptop);
573 if (window->set_config.maximized)
574 xdg_toplevel_set_maximized(window->xdg_toplevel);
576 if (window->set_config.fullscreen)
577 xdg_toplevel_set_fullscreen(window->xdg_toplevel, NULL);
580 ecore_wl2_window_commit(window, EINA_TRUE);
583 //TIZEN_ONLY(20150424) : tizen_visibility
585 _tizen_visibility_cb_notify(void *data, struct tizen_visibility *tizen_visibility EINA_UNUSED, uint32_t visibility)
587 Ecore_Wl2_Window *win;
588 Ecore_Wl2_Event_Window_Visibility_Change *ev;
590 if (!(win = data)) return;
591 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Visibility_Change)))) return;
594 if (visibility == TIZEN_VISIBILITY_VISIBILITY_FULLY_OBSCURED)
595 ev->fully_obscured = 1;
597 ev->fully_obscured = 0;
599 if (win->cb_visibility) win->cb_visibility(win->cb_visibility_data, win, !ev->fully_obscured);
601 ecore_event_add(ECORE_WL2_EVENT_WINDOW_VISIBILITY_CHANGE, ev, NULL, NULL);
605 _tizen_visibility_cb_changed(void *data, struct tizen_visibility *tizen_visibility EINA_UNUSED, uint32_t type, uint32_t option)
607 Ecore_Wl2_Window *win = (Ecore_Wl2_Window *)data;
608 Ecore_Wl2_Event_Window_Pre_Visibility_Change *ev;
610 EINA_SAFETY_ON_NULL_RETURN(win);
612 if (type == TIZEN_VISIBILITY_VISIBILITY_PRE_UNOBSCURED)
614 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Pre_Visibility_Change));
615 EINA_SAFETY_ON_NULL_RETURN(ev);
618 ev->type = ECORE_WL2_WINDOW_VISIBILITY_TYPE_PRE_UNOBSCURED;
621 ecore_event_add(ECORE_WL2_EVENT_WINDOW_PRE_VISIBILITY_CHANGE, ev, NULL, NULL);
625 static const struct tizen_visibility_listener _tizen_visibility_listener =
627 _tizen_visibility_cb_notify,
628 _tizen_visibility_cb_changed,
632 _tizen_position_cb_changed(void *data, struct tizen_position *tizen_position EINA_UNUSED, int32_t x, int32_t y)
634 Ecore_Wl2_Window *win;
636 if (!(win = data)) return;
638 win->def_config.geometry.x = x;
639 win->def_config.geometry.y = y;
641 if (win->set_config.fullscreen) return;
642 if (win->set_config.maximized) return;
644 if ((x != win->set_config.geometry.x) || (y != win->set_config.geometry.y))
646 win->set_config.geometry.x = x;
647 win->set_config.geometry.y = y;
651 static const struct tizen_position_listener _tizen_position_listener =
653 _tizen_position_cb_changed,
657 _tizen_rotation_preferred_angle_set(Ecore_Wl2_Window *window, int rot)
659 enum tizen_rotation_angle tz_angle = TIZEN_ROTATION_ANGLE_NONE;
666 tz_angle = TIZEN_ROTATION_ANGLE_0;
669 tz_angle = TIZEN_ROTATION_ANGLE_90;
672 tz_angle = TIZEN_ROTATION_ANGLE_180;
675 tz_angle = TIZEN_ROTATION_ANGLE_270;
681 if (window->tz_rotation)
682 tizen_rotation_set_preferred_angle(window->tz_rotation, (uint32_t)tz_angle);
686 _tizen_rotation_available_angles_set(Ecore_Wl2_Window *window, const int *rots, unsigned int count)
693 for (i = 0; i < count ; i++)
698 angles |= (uint32_t)TIZEN_ROTATION_ANGLE_0;
701 angles |= (uint32_t)TIZEN_ROTATION_ANGLE_90;
704 angles |= (uint32_t)TIZEN_ROTATION_ANGLE_180;
707 angles |= (uint32_t)TIZEN_ROTATION_ANGLE_270;
714 if (window->tz_rotation)
715 tizen_rotation_set_available_angles(window->tz_rotation, angles);
719 _ecore_wl_window_cb_available_angles_done(void *data EINA_UNUSED, struct tizen_rotation *tizen_rotation EINA_UNUSED, uint32_t angles EINA_UNUSED)
725 _ecore_wl_window_cb_preferred_angle_done(void *data EINA_UNUSED, struct tizen_rotation *tizen_rotation EINA_UNUSED, uint32_t angle EINA_UNUSED)
731 _ecore_wl_window_cb_angle_change(void *data, struct tizen_rotation *tizen_rotation EINA_UNUSED, uint32_t angle, uint32_t serial)
733 Ecore_Wl2_Window *win;
734 Ecore_Wl2_Event_Window_Rotation *ev;
737 if (!(win = data)) return;
738 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation)))) return;
739 DBG("PendingRotation: wayland rotation callback angle=%d serial=%d", angle, serial);
741 win->wm_rot.serial = serial;
744 if (win->def_config.serial == win->req_config.serial)
751 if (win->pending.user_resize)
753 ev->w = win->pending.user_w;
754 ev->h = win->pending.user_h;
758 ev->w = win->def_config.geometry.w;
759 ev->h = win->def_config.geometry.h;
765 case TIZEN_ROTATION_ANGLE_0:
768 case TIZEN_ROTATION_ANGLE_90:
771 case TIZEN_ROTATION_ANGLE_180:
774 case TIZEN_ROTATION_ANGLE_270:
783 if (win->wm_rot.geometry_hints[i].valid)
785 ev->w = win->wm_rot.geometry_hints[i].w;
786 ev->h = win->wm_rot.geometry_hints[i].h;
789 win->pending.configure_event++;
791 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATE, ev, NULL, NULL);
792 // TIZEN_ONLY(20170212): pend rotation until app set rotation
793 //this code don't need. This code will be added opensource code.
794 //ecore_wl2_window_rotation_set(win, ev->angle);
799 _ecore_wl_window_cb_angle_change_with_resize(void *data, struct tizen_rotation *tizen_rotation EINA_UNUSED, uint32_t angle, uint32_t serial, uint32_t width, uint32_t height)
801 Ecore_Wl2_Window *win = (Ecore_Wl2_Window *)data;
803 Ecore_Wl2_Event_Window_Rotation *ev = NULL;
805 EINA_SAFETY_ON_NULL_RETURN(win);
809 case TIZEN_ROTATION_ANGLE_0: rot = 0; break;
810 case TIZEN_ROTATION_ANGLE_90: rot = 90; break;
811 case TIZEN_ROTATION_ANGLE_180: rot = 180; break;
812 case TIZEN_ROTATION_ANGLE_270: rot = 270; break;
813 default: rot = 0; break;
816 if (win->cb_rot_changed)
818 win->wm_rot.serial = serial;
820 ecore_wl2_window_rotation_set(win, rot);
821 win->cb_rot_changed(win, rot, 0, width, height, win->cb_rot_changed_data);
824 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation)))) return;
826 win->wm_rot.serial = serial;
832 ev->resize = EINA_TRUE;
834 win->pending.configure_event++;
836 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATE, ev, NULL, NULL);
839 static const struct tizen_rotation_listener _ecore_tizen_rotation_listener =
841 _ecore_wl_window_cb_available_angles_done,
842 _ecore_wl_window_cb_preferred_angle_done,
843 _ecore_wl_window_cb_angle_change,
844 _ecore_wl_window_cb_angle_change_with_resize,
848 _tizen_resource_cb_resource_id(void *data, struct tizen_resource *tizen_resource EINA_UNUSED, uint32_t id)
850 Ecore_Wl2_Window *win;
851 Ecore_Wl2_Event_Window_Show *ev;
853 if (!(win = data)) return;
854 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Show)))) return;
858 ev->parent_win = win->parent->id;
861 ev->event_win = win->id;
862 ev->data[0] = (unsigned int)id;
863 win->resource_id = (unsigned int)id;
864 ecore_event_add(ECORE_WL2_EVENT_WINDOW_SHOW, ev, NULL, NULL);
867 static const struct tizen_resource_listener _tizen_resource_listener =
869 _tizen_resource_cb_resource_id,
873 //TIZEN_ONLY(20200707): support tizen_renderer_surface
875 _tizen_renderer_surface_cb_redraw_request(void *data, struct tizen_renderer_surface *renderer_surface EINA_UNUSED)
877 Ecore_Wl2_Window *win;
878 Ecore_Wl2_Event_Window_Redraw_Request *ev;
880 if (!(win = data)) return;
881 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Redraw_Request)))) return;
885 ecore_event_add(ECORE_WL2_EVENT_WINDOW_REDRAW_REQUEST, ev, NULL, NULL);
888 static const struct tizen_renderer_surface_listener _tizen_renderer_surface_listener =
890 _tizen_renderer_surface_cb_redraw_request,
894 // TIZEN_ONLY(20171112) : support tizen protocols
895 // to initialize wayland tizen extention protocols after surface creation
896 // such as tizen_policy, tizen_position, tizen_rotation, tizen_resource
897 // and handle transient parent(by tizen_policy) for surfaces without shell or xdg_shell
899 _ecore_wl2_window_tz_ext_init(Ecore_Wl2_Window *window)
902 if (!window->surface) return;
903 if (!window->display) return;
905 if (window->display->wl.tz_policy)
907 if (!window->tz_visibility)
909 window->tz_visibility =
910 tizen_policy_get_visibility(window->display->wl.tz_policy,
912 if (!window->tz_visibility) return;
913 tizen_visibility_add_listener(window->tz_visibility,
914 &_tizen_visibility_listener,
918 if (!window->tz_position)
921 window->tz_position =
922 tizen_policy_get_position(window->display->wl.tz_policy,
925 if (!window->tz_position) return;
926 tizen_position_add_listener(window->tz_position,
927 &_tizen_position_listener, window);
929 tizen_position_set(window->tz_position,
930 window->set_config.geometry.x, window->set_config.geometry.y);
936 tizen_policy_set_role(window->display->wl.tz_policy,
941 if (window->focus_skip)
944 tizen_policy_set_focus_skip(window->display->wl.tz_policy, window->surface);
949 tizen_policy_unset_focus_skip(window->display->wl.tz_policy, window->surface);
952 if (window->floating)
955 tizen_policy_set_floating_mode(window->display->wl.tz_policy,
960 if (window->display->wl.tz_policy_ext && !window->tz_rotation)
962 int i = 0, x, y, w, h, rot;
963 enum tizen_rotation_angle angle = TIZEN_ROTATION_ANGLE_NONE;
965 window->tz_rotation =
966 tizen_policy_ext_get_rotation(window->display->wl.tz_policy_ext,
968 if (!window->tz_rotation) return;
970 tizen_rotation_add_listener(window->tz_rotation,
971 &_ecore_tizen_rotation_listener, window);
973 if (window->wm_rot.preferred_rot != TIZEN_ROTATION_ANGLE_NONE)
975 _tizen_rotation_preferred_angle_set(window, window->wm_rot.preferred_rot);
978 if (window->wm_rot.count)
980 _tizen_rotation_available_angles_set(window, window->wm_rot.available_rots, window->wm_rot.count);
983 rot = ecore_wl2_window_rotation_get(window);
984 for (i = 0; i <= 3; i++)
986 if (!window->wm_rot.geometry_hints[i].valid) continue;
988 x = window->wm_rot.geometry_hints[i].x;
989 y = window->wm_rot.geometry_hints[i].y;
990 w = window->wm_rot.geometry_hints[i].w;
991 h = window->wm_rot.geometry_hints[i].h;
996 angle = TIZEN_ROTATION_ANGLE_0;
999 angle = TIZEN_ROTATION_ANGLE_90;
1002 angle = TIZEN_ROTATION_ANGLE_180;
1005 angle = TIZEN_ROTATION_ANGLE_270;
1008 tizen_rotation_set_geometry_hint(window->tz_rotation,
1009 (uint32_t)angle, x, y, w, h);
1011 if ((rot == (i * 90)) &&
1012 ((window->set_config.geometry.w != w) || (window->set_config.geometry.h != h)))
1014 //TIZEN_ONLY(20180201) : add function to set window size by client.
1015 window->set_config.geometry.w = w;
1016 window->set_config.geometry.h = h;
1017 _ecore_wl2_window_configure_send_by_client(window);
1023 if (window->display->wl.tz_surf && !window->tz_resource)
1025 window->tz_resource =
1026 tizen_surface_get_tizen_resource(window->display->wl.tz_surf, window->surface);
1027 if (!window->tz_resource) return;
1029 tizen_resource_add_listener(window->tz_resource,
1030 &_tizen_resource_listener, window);
1036 if (window->zxdg_surface && window->parent->zxdg_surface)
1038 // already handled above code
1040 else if (window->display->wl.tz_policy && window->surface && window->parent->surface)
1042 uint32_t ver = wl_proxy_get_version((struct wl_proxy *)window->display->wl.tz_policy);
1043 if (ver >= TIZEN_POLICY_SET_PARENT_WITH_BELOW_SINCE_VERSION)
1045 // for transient_for below
1046 if (window->below_child)
1047 tizen_policy_set_parent_with_below(window->display->wl.tz_policy, window->surface, window->parent->surface);
1049 tizen_policy_set_parent(window->display->wl.tz_policy, window->surface, window->parent->surface);
1052 tizen_policy_set_parent(window->display->wl.tz_policy, window->surface, window->parent->surface);
1056 if (window->display->wl.tz_renderer && !window->tz_renderer_surface)
1058 window->tz_renderer_surface =
1059 tizen_renderer_get_renderer_surface(window->display->wl.tz_renderer, window->surface);
1060 if (!window->tz_renderer_surface) return;
1062 tizen_renderer_surface_add_listener(window->tz_renderer_surface,
1063 &_tizen_renderer_surface_listener, window);
1066 // END of TIZEN_ONLY(20171112) : support tizen protocols
1069 _ecore_wl2_window_shell_surface_init(Ecore_Wl2_Window *window)
1071 if (!window->surface) return;
1072 if (window->display->wl.xdg_wm_base) _window_shell_surface_create(window);
1073 if (window->display->wl.zxdg_shell) _window_v6_shell_surface_create(window);
1075 if (window->display->wl.session_recovery)
1081 zwp_e_session_recovery_set_uuid(window->display->wl.session_recovery,
1082 window->surface, window->uuid);
1084 ecore_wl2_window_geometry_get(window, &gx, &gy, &gw, &gh);
1085 if (window->xdg_surface)
1086 xdg_surface_set_window_geometry(window->xdg_surface,
1088 if (window->zxdg_surface)
1089 zxdg_surface_v6_set_window_geometry(window->zxdg_surface,
1092 ecore_wl2_window_opaque_region_set(window,
1099 zwp_e_session_recovery_get_uuid(window->display->wl.session_recovery, window->surface);
1104 _surface_enter(void *data, struct wl_surface *surf EINA_UNUSED, struct wl_output *op)
1106 Ecore_Wl2_Window *win;
1107 Ecore_Wl2_Output *output;
1111 output = _ecore_wl2_output_find(win->display, op);
1112 EINA_SAFETY_ON_NULL_RETURN(output);
1114 win->outputs = eina_list_append(win->outputs, output);
1118 _surface_leave(void *data, struct wl_surface *surf EINA_UNUSED, struct wl_output *op)
1120 Ecore_Wl2_Window *win;
1121 Ecore_Wl2_Output *output;
1124 output = _ecore_wl2_output_find(win->display, op);
1125 EINA_SAFETY_ON_NULL_RETURN(output);
1127 win->outputs = eina_list_remove(win->outputs, output);
1130 Ecore_Wl2_Event_Window_Offscreen *ev;
1131 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Offscreen));
1135 ecore_event_add(ECORE_WL2_EVENT_WINDOW_OFFSCREEN, ev, NULL, NULL);
1140 static const struct wl_surface_listener _surface_listener =
1147 _ecore_wl2_window_surface_create(Ecore_Wl2_Window *window)
1149 if (!window->display->wl.compositor) return;
1151 if (!window->surface)
1154 wl_compositor_create_surface(window->display->wl.compositor);
1155 if (!window->surface)
1157 ERR("Failed to create surface for window");
1160 wl_surface_set_user_data(window->surface, window);
1162 //TIZEN_ONLY(20171115): support output transform
1163 if (window->display->wl.tz_screen_rotation)
1164 tizen_screen_rotation_get_ignore_output_transform(window->display->wl.tz_screen_rotation, window->surface);
1167 window->surface_id =
1168 wl_proxy_get_id((struct wl_proxy *)window->surface);
1170 wl_surface_add_listener(window->surface, &_surface_listener, window);
1171 if (window->display->wl.efl_aux_hints)
1173 efl_aux_hints_get_supported_aux_hints(window->display->wl.efl_aux_hints, window->surface);
1174 if (_ecore_wl2_display_sync_get())
1175 wl_display_roundtrip(window->display->wl.display);
1181 _ecore_wl2_window_show_send(Ecore_Wl2_Window *window)
1183 Ecore_Wl2_Event_Window_Show *ev;
1185 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Show));
1188 ev->win = window->id;
1190 ev->parent_win = window->parent->id;
1191 ev->event_win = window->id;
1192 window->visible = EINA_TRUE;
1193 ecore_event_add(ECORE_WL2_EVENT_WINDOW_SHOW, ev, NULL, NULL);
1197 _ecore_wl2_window_hide_send(Ecore_Wl2_Window *window)
1199 Ecore_Wl2_Event_Window_Hide *ev;
1201 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Hide));
1204 ev->win = window->id;
1206 ev->parent_win = window->parent->id;
1207 ev->event_win = window->id;
1208 window->visible = EINA_FALSE;
1209 ecore_event_add(ECORE_WL2_EVENT_WINDOW_HIDE, ev, NULL, NULL);
1213 _ecore_wl2_window_create_destroy_send(Ecore_Wl2_Window *window, Eina_Bool create)
1215 Ecore_Wl2_Event_Window_Common *ev;
1217 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Common));
1220 ev->win = window->id;
1222 ev->parent_win = window->parent->id;
1223 ev->event_win = window->id;
1225 if (create) ecore_event_add(ECORE_WL2_EVENT_WINDOW_CREATE, ev, NULL, NULL);
1226 else ecore_event_add(ECORE_WL2_EVENT_WINDOW_DESTROY, ev, NULL, NULL);
1229 EAPI Ecore_Wl2_Window *
1230 ecore_wl2_window_new(Ecore_Wl2_Display *display, Ecore_Wl2_Window *parent, int x, int y, int w, int h)
1232 Ecore_Wl2_Window *win;
1233 static int _win_id = 1;
1235 EINA_SAFETY_ON_NULL_RETURN_VAL(display, NULL);
1236 if (display->pid) CRI("CANNOT CREATE WINDOW WITH SERVER DISPLAY");
1238 /* try to allocate space for window structure */
1239 win = calloc(1, sizeof(Ecore_Wl2_Window));
1240 if (!win) return NULL;
1243 win->display = display;
1244 win->parent = parent;
1245 win->id = _win_id++;
1247 win->set_config.geometry.x = x;
1248 win->set_config.geometry.y = y;
1249 win->set_config.geometry.w = w;
1250 win->set_config.geometry.h = h;
1257 // TIZEN_ONLY(20180202) : Set default type to keep backward compat.
1258 win->type = ECORE_WL2_WINDOW_TYPE_TOPLEVEL;
1261 //TIZEN_ONLY(20171115): support output transform
1262 win->ignore_output_transform = EINA_TRUE;
1265 win->pending.configure = EINA_TRUE;
1267 eina_inlist_append(display->windows, EINA_INLIST_GET(win));
1269 _ecore_wl2_window_surface_create(win);
1271 //TIZEN_ONLY(20171216): add ecore_wl2_window_find
1272 eina_hash_add(_windows, _ecore_wl2_window_id_str_get(win->id), win);
1275 _ecore_wl2_input_devices_send(ecore_wl2_input_default_input_get(display), win);
1277 _ecore_wl2_window_create_destroy_send(win, EINA_TRUE);
1283 ecore_wl2_window_id_get(Ecore_Wl2_Window *window)
1285 EINA_SAFETY_ON_NULL_RETURN_VAL(window, -1);
1290 ecore_wl2_window_close_callback_set(Ecore_Wl2_Window *window, void (*cb) (void *data, Ecore_Wl2_Window *win), void *data)
1292 EINA_SAFETY_ON_NULL_RETURN(window);
1293 window->cb_close = cb;
1294 window->cb_close_data = data;
1298 ecore_wl2_window_visibility_callback_set(Ecore_Wl2_Window *window, void (*cb) (void *data, Ecore_Wl2_Window *win, Eina_Bool visibility), void *data)
1300 EINA_SAFETY_ON_NULL_RETURN(window);
1301 window->cb_visibility = cb;
1302 window->cb_visibility_data = data;
1305 EAPI struct wl_surface *
1306 ecore_wl2_window_surface_get(Ecore_Wl2_Window *window)
1308 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
1310 _ecore_wl2_window_surface_create(window);
1312 return window->surface;
1315 //TIZEN_ONLY(20200309): The 3rd party app may needs native surface handle.
1317 ecore_wl2_window_native_surface_get(Ecore_Wl2_Window *window)
1319 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
1321 _ecore_wl2_window_surface_create(window);
1323 return (void *)window->surface;
1328 ecore_wl2_window_surface_id_get(Ecore_Wl2_Window *window)
1330 EINA_SAFETY_ON_NULL_RETURN_VAL(window, -1);
1331 return window->surface_id;
1335 ecore_wl2_window_show(Ecore_Wl2_Window *window)
1337 EINA_SAFETY_ON_NULL_RETURN(window);
1339 _ecore_wl2_window_surface_create(window);
1341 if (window->input_set)
1342 ecore_wl2_window_input_region_set(window, window->input_rect.x,
1343 window->input_rect.y,
1344 window->input_rect.w,
1345 window->input_rect.h);
1346 if (window->opaque_set)
1347 ecore_wl2_window_opaque_region_set(window, window->opaque.x,
1348 window->opaque.y, window->opaque.w,
1351 if ((window->type != ECORE_WL2_WINDOW_TYPE_DND) &&
1352 (window->type != ECORE_WL2_WINDOW_TYPE_NONE))
1354 _ecore_wl2_window_shell_surface_init(window);
1355 _ecore_wl2_window_tz_ext_init(window); // TIZEN_ONLY(20171112) : support tizen protocols after surface creation
1356 _ecore_wl2_window_www_surface_init(window);
1357 _ecore_wl2_window_show_send(window);
1361 _ecore_wl2_window_tz_ext_init(window); // TIZEN_ONLY(20171112) : support tizen protocols after surface creation
1362 _configure_complete(window);
1365 // TIZEN_ONLY(20201125) : support tizen protocol to notify show request
1366 #ifdef TIZEN_POLICY_SHOW_SINCE_VERSION
1367 if (window->display->wl.tz_policy && window->surface)
1369 uint32_t ver = wl_proxy_get_version((struct wl_proxy *)window->display->wl.tz_policy);
1370 if (ver >= TIZEN_POLICY_SHOW_SINCE_VERSION)
1371 tizen_policy_show(window->display->wl.tz_policy, window->surface);
1378 ecore_wl2_window_hide(Ecore_Wl2_Window *window)
1380 EINA_SAFETY_ON_NULL_RETURN(window);
1382 // TIZEN_ONLY(20201125) : support tizen protocol to notify hide request
1383 #ifdef TIZEN_POLICY_HIDE_SINCE_VERSION
1384 if (window->display->wl.tz_policy && window->surface)
1386 uint32_t ver = wl_proxy_get_version((struct wl_proxy *)window->display->wl.tz_policy);
1387 if (ver >= TIZEN_POLICY_HIDE_SINCE_VERSION)
1388 tizen_policy_hide(window->display->wl.tz_policy, window->surface);
1393 _ecore_wl2_window_hide_send(window);
1395 // TIZEN_ONLY(20171112) : support tizen protocols
1396 if (window->tz_visibility) tizen_visibility_destroy(window->tz_visibility);
1397 window->tz_visibility = NULL;
1399 if (window->tz_resource) tizen_resource_destroy(window->tz_resource);
1400 window->tz_resource = NULL;
1403 if (window->commit_pending)
1405 /* We've probably been hidden while an animator
1406 * is ticking. Cancel the callback.
1408 window->commit_pending = EINA_FALSE;
1409 if (window->callback)
1411 wl_callback_destroy(window->callback);
1412 window->callback = NULL;
1416 if (window->surface)
1418 wl_surface_attach(window->surface, NULL, 0, 0);
1419 ecore_wl2_window_commit(window, EINA_TRUE);
1420 window->commit_pending = EINA_FALSE;
1423 /* The commit added a callback, disconnect it */
1424 if (window->callback)
1426 wl_callback_destroy(window->callback);
1427 window->callback = NULL;
1430 // TIZEN_ONLY(20180614) : destroy shell surface and its role
1431 if (window->zxdg_popup) zxdg_popup_v6_destroy(window->zxdg_popup);
1432 window->zxdg_popup = NULL;
1434 if (window->zxdg_toplevel) zxdg_toplevel_v6_destroy(window->zxdg_toplevel);
1435 window->zxdg_toplevel = NULL;
1437 if (window->zxdg_surface) zxdg_surface_v6_destroy(window->zxdg_surface);
1438 window->zxdg_surface = NULL;
1439 // END of TIZEN_ONLY(20180614)
1441 // TIZEN_ONLY(20181011) : destroy shell surface and its role
1442 if (window->xdg_popup) xdg_popup_destroy(window->xdg_popup);
1443 window->xdg_popup = NULL;
1445 if (window->xdg_toplevel) xdg_toplevel_destroy(window->xdg_toplevel);
1446 window->xdg_toplevel = NULL;
1448 if (window->xdg_surface) xdg_surface_destroy(window->xdg_surface);
1449 window->xdg_surface = NULL;
1450 // END of TIZEN_ONLY(20181011)
1452 window->set_config.serial = 0;
1453 window->req_config.serial = 0;
1454 window->def_config.serial = 0;
1455 window->zxdg_configure_ack = NULL;
1456 window->xdg_configure_ack = NULL;
1457 window->xdg_set_min_size = NULL;
1458 window->xdg_set_max_size = NULL;
1459 window->zxdg_set_min_size = NULL;
1460 window->zxdg_set_max_size = NULL;
1464 _ecore_wl2_window_aux_hint_free(Ecore_Wl2_Window *win)
1466 const char *supported;
1468 EINA_LIST_FREE(win->supported_aux_hints, supported)
1469 if (supported) eina_stringshare_del(supported);
1472 // TIZEN_ONLY(20200601): support sync between ui and video
1474 _ecore_wl2_window_video_surface_destroy(Ecore_Wl2_Window *win)
1476 if (win->video.viewport)
1478 tizen_viewport_destroy(win->video.viewport);
1479 win->video.viewport = NULL;
1481 if (win->video.wl_buffer)
1483 wayland_tbm_client_destroy_buffer(win->tbm_client, win->video.wl_buffer);
1484 win->video.wl_buffer = NULL;
1487 if (win->video.tbm_surface)
1489 tbm_surface_destroy(win->video.tbm_surface);
1490 win->video.tbm_surface = NULL;
1493 if (win->video.subsurface)
1495 wl_subsurface_destroy(win->video.subsurface);
1496 win->video.subsurface = NULL;
1498 if (win->video.surface)
1500 wl_surface_destroy(win->video.surface);
1501 win->video.surface = NULL;
1507 ecore_wl2_window_free(Ecore_Wl2_Window *window)
1509 Ecore_Wl2_Display *display;
1510 Ecore_Wl2_Input *input;
1511 Ecore_Wl2_Subsurface *subsurf;
1513 Ecore_Wl2_Window_Aux_Hint *hint;
1515 EINA_SAFETY_ON_NULL_RETURN(window);
1517 // TIZEN_ONLY(20210330): for maintain internal aux hint list
1518 EINA_LIST_FREE(window->aux_hints, hint)
1520 eina_stringshare_del(hint->hint);
1521 eina_stringshare_del(hint->val);
1525 //TIZEN_ONLY(20171216): add ecore_wl2_window_find
1526 eina_hash_del(_windows, _ecore_wl2_window_id_str_get(window->id), window);
1529 if (window->visible) _ecore_wl2_window_hide_send(window);
1531 _ecore_wl2_window_create_destroy_send(window, EINA_FALSE);
1533 display = window->display;
1535 EINA_INLIST_FOREACH(display->inputs, input)
1536 _ecore_wl2_input_window_remove(input, window);
1538 EINA_INLIST_FOREACH_SAFE(window->subsurfs, tmp, subsurf)
1539 _ecore_wl2_subsurf_free(subsurf);
1541 _ecore_wl2_window_aux_hint_free(window);
1543 // TIZEN_ONLY(20171112) : support tizen protocols
1544 if (window->tz_visibility) tizen_visibility_destroy(window->tz_visibility);
1545 window->tz_visibility = NULL;
1547 if (window->tz_position) tizen_position_destroy(window->tz_position);
1548 window->tz_position = NULL;
1550 if (window->tz_rotation) tizen_rotation_destroy(window->tz_rotation);
1551 window->tz_rotation = NULL;
1553 if (window->tz_resource) tizen_resource_destroy(window->tz_resource);
1554 window->tz_resource = NULL;
1557 // TIZEN_ONLY(20200601): support sync between ui and video
1558 _ecore_wl2_window_video_surface_destroy(window);
1560 if (window->tbm_client)
1562 wayland_tbm_client_deinit(window->tbm_client);
1563 window->tbm_client = NULL;
1567 if (window->callback) wl_callback_destroy(window->callback);
1568 window->callback = NULL;
1570 if (window->uuid && window->surface && window->display->wl.session_recovery)
1571 zwp_e_session_recovery_destroy_uuid(window->display->wl.session_recovery,
1572 window->surface, window->uuid);
1574 _ecore_wl2_window_semi_free(window);
1576 eina_stringshare_replace(&window->uuid, NULL);
1578 if (window->title) eina_stringshare_del(window->title);
1579 if (window->class) eina_stringshare_del(window->class);
1580 if (window->role) eina_stringshare_del(window->role);
1581 // TIZEN_ONLY(20160201) : support to handle input rectangle
1582 if (window->input_region) wl_region_destroy(window->input_region);
1583 window->input_region = NULL;
1586 if (window->wm_rot.available_rots) free(window->wm_rot.available_rots);
1587 window->wm_rot.available_rots = NULL;
1590 eina_inlist_remove(display->windows, EINA_INLIST_GET(window));
1592 ecore_wl2_display_disconnect(window->display);
1597 ecore_wl2_window_move(Ecore_Wl2_Window *window, Ecore_Wl2_Input *input)
1599 EINA_SAFETY_ON_NULL_RETURN(window);
1600 EINA_SAFETY_ON_NULL_RETURN(window->display->inputs);
1604 ERR("NULL input parameter is deprecated");
1605 input = EINA_INLIST_CONTAINER_GET(window->display->inputs, Ecore_Wl2_Input);
1607 if (window->xdg_toplevel)
1608 xdg_toplevel_move(window->xdg_toplevel, input->wl.seat,
1609 window->display->serial);
1610 if (window->zxdg_toplevel)
1611 zxdg_toplevel_v6_move(window->zxdg_toplevel, input->wl.seat,
1612 window->display->serial);
1613 ecore_wl2_display_flush(window->display);
1615 _ecore_wl2_input_ungrab(input);
1619 ecore_wl2_window_resize(Ecore_Wl2_Window *window, Ecore_Wl2_Input *input, int location)
1621 EINA_SAFETY_ON_NULL_RETURN(window);
1622 EINA_SAFETY_ON_NULL_RETURN(window->display->inputs);
1626 ERR("NULL input parameter is deprecated");
1627 input = EINA_INLIST_CONTAINER_GET(window->display->inputs, Ecore_Wl2_Input);
1630 if (window->xdg_toplevel)
1631 xdg_toplevel_resize(window->xdg_toplevel, input->wl.seat,
1632 window->display->serial, location);
1633 if (window->zxdg_toplevel)
1634 zxdg_toplevel_v6_resize(window->zxdg_toplevel, input->wl.seat,
1635 window->display->serial, location);
1636 ecore_wl2_display_flush(window->display);
1638 _ecore_wl2_input_ungrab(input);
1642 ecore_wl2_window_raise(Ecore_Wl2_Window *window)
1644 EINA_SAFETY_ON_NULL_RETURN(window);
1645 EINA_SAFETY_ON_NULL_RETURN(window->display);
1647 // TIZEN_ONLY(20171114)
1649 if (window->zxdg_toplevel)
1651 struct wl_array states;
1654 wl_array_init(&states);
1655 s = wl_array_add(&states, sizeof(*s));
1656 *s = ZXDG_TOPLEVEL_V6_STATE_ACTIVATED;
1657 _zxdg_toplevel_cb_configure(window, window->zxdg_toplevel,
1658 window->set_config.geometry.w,
1659 window->set_config.geometry.h, &states);
1660 wl_array_release(&states);
1663 if ((window->surface) && (window->display->wl.tz_policy))
1664 tizen_policy_raise(window->display->wl.tz_policy, window->surface);
1669 ecore_wl2_window_lower(Ecore_Wl2_Window *window)
1671 Ecore_Wl2_Event_Window_Lower *ev;
1673 EINA_SAFETY_ON_NULL_RETURN(window);
1674 EINA_SAFETY_ON_NULL_RETURN(window->display);
1676 /* FIXME: This should lower the xdg surface also */
1677 if (window->display->wl.tz_policy)
1679 tizen_policy_lower(window->display->wl.tz_policy, window->surface);
1681 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Lower)))) return;
1683 ev->win = window->id;
1684 ecore_event_add(ECORE_WL2_EVENT_WINDOW_LOWER, ev, NULL, NULL);
1689 ecore_wl2_window_activate(Ecore_Wl2_Window *window)
1693 EINA_SAFETY_ON_NULL_RETURN(window);
1694 EINA_SAFETY_ON_NULL_RETURN(window->display);
1696 iconic = ecore_wl2_window_iconified_get(window);
1698 ecore_wl2_window_iconified_set(window, EINA_FALSE);
1700 if (window->display->wl.tz_policy)
1701 tizen_policy_activate(window->display->wl.tz_policy, window->surface);
1705 ecore_wl2_window_parent_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window *parent)
1707 EINA_SAFETY_ON_NULL_RETURN(window);
1708 window->parent = parent;
1709 // TIZEN_ONLY(20210903): for transient_for below
1710 window->below_child = EINA_FALSE;
1713 // TIZEN_ONLY(20171114)
1716 if (window->zxdg_surface && window->parent->zxdg_surface)
1718 struct zxdg_toplevel_v6 *ptop = NULL;
1720 ptop = window->parent->zxdg_toplevel;
1722 zxdg_toplevel_v6_set_parent(window->zxdg_toplevel, ptop);
1724 else if (window->display->wl.tz_policy && window->surface && window->parent->surface)
1726 uint32_t ver = wl_proxy_get_version((struct wl_proxy *)window->display->wl.tz_policy);
1728 tizen_policy_set_parent(window->display->wl.tz_policy, window->surface, window->parent->surface);
1733 if (window->zxdg_surface)
1734 zxdg_toplevel_v6_set_parent(window->zxdg_toplevel, NULL);
1739 // TIZEN_ONLY(20210721) : for below child
1741 _ecore_wl2_window_parent_set_with_below(Ecore_Wl2_Window *window, Ecore_Wl2_Window *parent)
1743 window->parent = parent;
1744 window->below_child = EINA_TRUE;
1747 if (window->parent->surface)
1748 tizen_policy_set_parent_with_below(window->display->wl.tz_policy, window->surface, window->parent->surface);
1750 ERR("Fail to set parent below. Parent window's surface doesn't exist.");
1754 tizen_policy_set_parent_with_below(window->display->wl.tz_policy, window->surface, NULL);
1759 ecore_wl2_window_transient_parent_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window *parent, Eina_Bool place_below)
1761 EINA_SAFETY_ON_NULL_RETURN(window);
1762 EINA_SAFETY_ON_NULL_RETURN(window->surface);
1763 EINA_SAFETY_ON_NULL_RETURN(window->display->wl.tz_policy);
1765 uint32_t ver = wl_proxy_get_version((struct wl_proxy *)window->display->wl.tz_policy);
1766 if (ver < TIZEN_POLICY_SET_PARENT_WITH_BELOW_SINCE_VERSION)
1768 ERR("ecore_wl2_window_transient_parent_set is not supported in this version:%d (required version:%d)",
1769 ver, TIZEN_POLICY_SET_PARENT_WITH_BELOW_SINCE_VERSION);
1770 ecore_wl2_window_parent_set(window, parent);
1775 _ecore_wl2_window_parent_set_with_below(window, parent);
1777 ecore_wl2_window_parent_set(window, parent);
1782 ecore_wl2_window_stack_mode_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window_Stack_Mode mode)
1784 EINA_SAFETY_ON_NULL_RETURN(window);
1785 EINA_SAFETY_ON_NULL_RETURN(window->display);
1787 if ((window->surface) && (window->display->wl.tz_policy))
1788 tizen_policy_set_stack_mode(window->display->wl.tz_policy, window->surface, mode);
1792 ecore_wl2_window_position_set(Ecore_Wl2_Window *window, int x, int y)
1794 EINA_SAFETY_ON_NULL_RETURN(window);
1796 if ((window->set_config.geometry.x != x) ||
1797 (window->set_config.geometry.y != y))
1798 window->pending.geom = EINA_TRUE;
1800 window->set_config.geometry.x = x;
1801 window->set_config.geometry.y = y;
1803 if ((window->surface) && (window->tz_position))
1805 if ((window->def_config.geometry.x != x) || (window->def_config.geometry.y != y))
1806 tizen_position_set(window->tz_position, x, y);
1811 ecore_wl2_window_active_angle_get(Ecore_Wl2_Window *window)
1813 struct wl_surface *surface = NULL;
1815 EINA_SAFETY_ON_NULL_RETURN_VAL(window, 0);
1816 EINA_SAFETY_ON_NULL_RETURN_VAL(window->display, 0);
1818 if (!window->display->wl.tz_policy_ext) return 0;
1820 surface = ecore_wl2_window_surface_get(window);
1822 tizen_policy_ext_get_active_angle(window->display->wl.tz_policy_ext, surface);
1823 ecore_wl2_display_sync(window->display);
1825 return window->display->active_angle;
1830 ecore_wl2_window_alpha_get(Ecore_Wl2_Window *window)
1832 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
1834 return window->alpha;
1838 ecore_wl2_window_alpha_set(Ecore_Wl2_Window *window, Eina_Bool alpha)
1840 Ecore_Wl2_Surface *surf = NULL;
1842 EINA_SAFETY_ON_NULL_RETURN(window);
1844 if (window->alpha == alpha) return;
1846 window->alpha = alpha;
1847 surf = window->wl2_surface;
1849 ecore_wl2_surface_reconfigure(surf, surf->w, surf->h, 0, alpha);
1851 // TIZEN_ONLY(20170203)
1854 ecore_wl2_window_opaque_region_set(window, window->opaque.x,
1855 window->opaque.y, window->opaque.w,
1857 // TIZEN_ONLY(20190910) : set opaque_set and pending.opaque value by force
1858 window->opaque_set = window->opaque.x || window->opaque.y || window->opaque.w || window->opaque.h;
1859 _opaque_set(window);
1862 else if (window->surface)
1863 _opaque_region_set(window, NULL);
1868 ecore_wl2_window_transparent_set(Ecore_Wl2_Window *window, Eina_Bool transparent)
1870 EINA_SAFETY_ON_NULL_RETURN(window);
1872 if (window->transparent == transparent) return;
1874 window->transparent = transparent;
1876 if (!window->transparent)
1878 ecore_wl2_window_opaque_region_set(window, window->opaque.x,
1879 window->opaque.y, window->opaque.w,
1881 // TIZEN_ONLY(20190910) : set opaque_set and pending.opaque value by force
1882 window->opaque_set = window->opaque.x || window->opaque.y || window->opaque.w || window->opaque.h;
1883 _opaque_set(window);
1886 // TIZEN_ONLY(20170203)
1889 ecore_wl2_window_opaque_region_set(window, 0, 0, 0, 0);
1891 else if (window->surface)
1892 _opaque_region_set(window, NULL);
1896 // TIZEN_ONLY(20171108) : Get a window's transparent property
1898 ecore_wl2_window_transparent_get(Ecore_Wl2_Window *window)
1900 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
1902 return window->transparent;
1907 ecore_wl2_window_opaque_region_set(Ecore_Wl2_Window *window, int x, int y, int w, int h)
1909 int nx = 0, ny = 0, nw = 0, nh = 0;
1911 EINA_SAFETY_ON_NULL_RETURN(window);
1913 switch (window->rotation)
1943 if ((window->opaque.x == nx) && (window->opaque.y == ny) &&
1944 (window->opaque.w == nw) && (window->opaque.h == nh))
1947 window->opaque.x = nx;
1948 window->opaque.y = ny;
1949 window->opaque.w = nw;
1950 window->opaque.h = nh;
1952 // TIZEN_ONLY(20180412) : check transparent and alpha value
1953 if ((window->transparent) || (window->alpha))
1957 window->opaque_set = x || y || w || h;
1958 window->pending.opaque = EINA_TRUE;
1961 // TIZEN_ONLY(20160201) : support to handle input rectangle
1963 ecore_wl2_window_input_rect_set(Ecore_Wl2_Window *win, Eina_Rectangle *input_rect)
1966 if (!input_rect) return;
1967 if (win->input_region)
1969 wl_region_destroy(win->input_region);
1970 win->input_region = NULL;
1973 win->input_rect.x = input_rect->x;
1974 win->input_rect.y = input_rect->y;
1975 win->input_rect.w = input_rect->w;
1976 win->input_rect.h = input_rect->h;
1978 if (win->type != ECORE_WL2_WINDOW_TYPE_DND)
1980 struct wl_region *region;
1981 region = wl_compositor_create_region(win->display->wl.compositor);
1982 if (!region) return;
1984 wl_region_add(region, input_rect->x, input_rect->y, input_rect->w, input_rect->h);
1985 wl_surface_set_input_region(win->surface, region);
1986 wl_region_destroy(region);
1991 ecore_wl2_window_input_rect_add(Ecore_Wl2_Window *win, Eina_Rectangle *input_rect)
1994 if (!input_rect) return;
1995 if (input_rect->x < 0 || input_rect->y < 0) return;
1997 if (win->type != ECORE_WL2_WINDOW_TYPE_DND)
1999 if (!win->input_region)
2001 struct wl_region *region;
2002 region = wl_compositor_create_region(win->display->wl.compositor);
2003 if (!region) return;
2005 win->input_region = region;
2008 wl_region_add(win->input_region, input_rect->x, input_rect->y, input_rect->w, input_rect->h);
2009 wl_surface_set_input_region(win->surface, win->input_region);
2014 ecore_wl2_window_input_rect_subtract(Ecore_Wl2_Window *win, Eina_Rectangle *input_rect)
2017 if (!input_rect) return;
2018 if (input_rect->x < 0 || input_rect->y < 0) return;
2019 if (!win->input_region) return;
2021 if (win->type != ECORE_WL2_WINDOW_TYPE_DND)
2023 wl_region_subtract(win->input_region, input_rect->x, input_rect->y, input_rect->w, input_rect->h);
2024 wl_surface_set_input_region(win->surface, win->input_region);
2030 ecore_wl2_window_opaque_region_get(Ecore_Wl2_Window *window, int *x, int *y, int *w, int *h)
2032 EINA_SAFETY_ON_NULL_RETURN(window);
2034 if (x) *x = window->opaque.x;
2035 if (y) *y = window->opaque.y;
2036 if (w) *w = window->opaque.w;
2037 if (h) *h = window->opaque.h;
2041 ecore_wl2_window_input_region_set(Ecore_Wl2_Window *window, int x, int y, int w, int h)
2043 int nx = 0, ny = 0, nw = 0, nh = 0;
2045 EINA_SAFETY_ON_NULL_RETURN(window);
2047 switch (window->rotation)
2077 if ((window->input_rect.x == nx) && (window->input_rect.y == ny) &&
2078 (window->input_rect.w == nw) && (window->input_rect.h == nh))
2081 window->input_rect.x = nx;
2082 window->input_rect.y = ny;
2083 window->input_rect.w = nw;
2084 window->input_rect.h = nh;
2085 window->input_set = x || y || w || h;
2086 window->pending.input = EINA_TRUE;
2090 ecore_wl2_window_input_region_get(Ecore_Wl2_Window *window, int *x, int *y, int *w, int *h)
2092 EINA_SAFETY_ON_NULL_RETURN(window);
2094 if (x) *x = window->input_rect.x;
2095 if (y) *y = window->input_rect.y;
2096 if (w) *w = window->input_rect.w;
2097 if (h) *h = window->input_rect.h;
2101 ecore_wl2_window_maximized_get(Ecore_Wl2_Window *window)
2103 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2105 return window->set_config.maximized;
2109 _ecore_wl2_window_maximized_direction_set(Ecore_Wl2_Window *window, Ecore_Wl2_Maximize_Direction direction)
2111 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2112 EINA_SAFETY_ON_NULL_RETURN_VAL(window->surface, EINA_FALSE);
2113 EINA_SAFETY_ON_NULL_RETURN_VAL(window->display->wl.tz_policy, EINA_FALSE);
2114 EINA_SAFETY_ON_NULL_RETURN_VAL(window->zxdg_toplevel, EINA_FALSE);
2116 window->maximize_direction = direction;
2118 uint32_t ver = wl_proxy_get_version((struct wl_proxy *)window->display->wl.tz_policy);
2120 #ifdef TIZEN_POLICY_SET_MAXIMIZE_DIRECTION_SINCE_VERSION
2121 if (ver < TIZEN_POLICY_SET_MAXIMIZE_DIRECTION_SINCE_VERSION)
2123 ERR("[WINDOW] Maximize direction is not supported on this version(%d). It is supported since version %d.",
2124 ver, TIZEN_POLICY_SET_MAXIMIZE_DIRECTION_SINCE_VERSION);
2128 tizen_policy_set_maximize_direction(window->display->wl.tz_policy, window->surface, direction);
2137 ecore_wl2_window_maximized_set_with_direction(Ecore_Wl2_Window *window, Ecore_Wl2_Maximize_Direction direction)
2139 Eina_Bool maximized = EINA_TRUE;
2140 Eina_Bool changed_maximize_state = EINA_FALSE;
2142 EINA_SAFETY_ON_NULL_RETURN(window);
2144 if (window->maximize_direction == direction)
2146 ERR("[WINDOW] win:%d, SAME direction:%d... so return.......", window->resource_id, direction);
2150 _ecore_wl2_window_maximized_direction_set(window, direction);
2152 if (direction == ECORE_WL2_MAXIMIZE_DIRECTION_NONE)
2153 maximized = EINA_FALSE;
2155 if (window->set_config.maximized != maximized)
2156 changed_maximize_state = EINA_TRUE;
2158 window->set_config.maximized = maximized;
2159 if (window->updating)
2161 if (changed_maximize_state && maximized)
2163 window->saved = window->set_config.geometry;
2165 window->pending.maximized = EINA_TRUE;
2169 if (changed_maximize_state)
2173 if (!window->set_config.fullscreen)
2174 window->saved = window->set_config.geometry;
2176 if (window->xdg_toplevel)
2177 xdg_toplevel_set_maximized(window->xdg_toplevel);
2178 if (window->zxdg_toplevel)
2179 zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
2183 if (window->xdg_toplevel)
2184 xdg_toplevel_unset_maximized(window->xdg_toplevel);
2185 if (window->zxdg_toplevel)
2186 zxdg_toplevel_v6_unset_maximized(window->zxdg_toplevel);
2190 ecore_wl2_display_flush(window->display);
2194 ecore_wl2_window_maximized_set(Ecore_Wl2_Window *window, Eina_Bool maximized)
2197 ecore_wl2_window_maximized_set_with_direction(window, ECORE_WL2_MAXIMIZE_DIRECTION_ALL);
2199 ecore_wl2_window_maximized_set_with_direction(window, ECORE_WL2_MAXIMIZE_DIRECTION_NONE);
2203 ecore_wl2_window_fullscreen_get(Ecore_Wl2_Window *window)
2205 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2207 return window->set_config.fullscreen;
2211 ecore_wl2_window_fullscreen_set(Ecore_Wl2_Window *window, Eina_Bool fullscreen)
2215 EINA_SAFETY_ON_NULL_RETURN(window);
2217 prev = window->set_config.fullscreen;
2218 fullscreen = !!fullscreen;
2219 if (prev == fullscreen) return;
2221 window->set_config.fullscreen = fullscreen;
2222 if (window->updating)
2224 window->pending.fullscreen = EINA_TRUE;
2230 if (!window->set_config.maximized)
2231 window->saved = window->set_config.geometry;
2233 if (window->xdg_toplevel)
2234 xdg_toplevel_set_fullscreen(window->xdg_toplevel, NULL);
2235 if (window->zxdg_toplevel)
2236 zxdg_toplevel_v6_set_fullscreen(window->zxdg_toplevel, NULL);
2240 if (window->xdg_toplevel)
2241 xdg_toplevel_unset_fullscreen(window->xdg_toplevel);
2242 if (window->zxdg_toplevel)
2243 zxdg_toplevel_v6_unset_fullscreen(window->zxdg_toplevel);
2245 /* TIZEN_ONLY(20190522): The window properties of ecore_evas are updated in
2246 * _ecore_evas_wl_common_cb_window_configure.
2247 * To call _ecore_evas_wl_common_cb_window_configure,
2248 * ECORE_WL2_EVENT_WINDOW_CONFIGURE event is added.
2249 * To add ECORE_WL2_EVENT_WINDOW_CONFIGURE event,
2250 * _ecore_wl2_window_configure_send is called. */
2251 _ecore_wl2_window_configure_send(window);
2252 /* END of TIZEN_ONLY(20190522) */
2253 ecore_wl2_display_flush(window->display);
2257 ecore_wl2_window_rotation_get(Ecore_Wl2_Window *window)
2259 EINA_SAFETY_ON_NULL_RETURN_VAL(window, -1);
2261 return window->rotation;
2265 ecore_wl2_window_rotation_set(Ecore_Wl2_Window *window, int rotation)
2267 EINA_SAFETY_ON_NULL_RETURN(window);
2269 window->rotation = rotation;
2273 ecore_wl2_window_title_set(Ecore_Wl2_Window *window, const char *title)
2275 EINA_SAFETY_ON_NULL_RETURN(window);
2277 eina_stringshare_replace(&window->title, title);
2278 if (!window->title) return;
2279 if (!window->xdg_toplevel && !window->zxdg_toplevel) return;
2281 if (window->xdg_toplevel)
2282 xdg_toplevel_set_title(window->xdg_toplevel, window->title);
2283 if (window->zxdg_toplevel)
2284 zxdg_toplevel_v6_set_title(window->zxdg_toplevel, window->title);
2285 ecore_wl2_display_flush(window->display);
2289 ecore_wl2_window_title_get(Ecore_Wl2_Window *window)
2291 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2293 return window->title ? window->title : NULL;
2297 ecore_wl2_window_class_set(Ecore_Wl2_Window *window, const char *clas)
2299 EINA_SAFETY_ON_NULL_RETURN(window);
2301 eina_stringshare_replace(&window->class, clas);
2302 if (!window->class) return;
2303 if (!window->xdg_toplevel && !window->zxdg_toplevel) return;
2305 if (window->xdg_toplevel)
2306 xdg_toplevel_set_app_id(window->xdg_toplevel, window->class);
2307 if (window->zxdg_toplevel)
2308 zxdg_toplevel_v6_set_app_id(window->zxdg_toplevel, window->class);
2309 ecore_wl2_display_flush(window->display);
2313 ecore_wl2_window_class_get(Ecore_Wl2_Window *window)
2315 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2317 return window->class ? window->class : NULL;
2321 ecore_wl2_window_geometry_get(Ecore_Wl2_Window *window, int *x, int *y, int *w, int *h)
2323 EINA_SAFETY_ON_NULL_RETURN(window);
2325 if (x) *x = window->set_config.geometry.x;
2326 if (y) *y = window->set_config.geometry.y;
2327 if (w) *w = window->set_config.geometry.w;
2328 if (h) *h = window->set_config.geometry.h;
2332 ecore_wl2_window_geometry_set(Ecore_Wl2_Window *window, int x, int y, int w, int h)
2334 EINA_SAFETY_ON_NULL_RETURN(window);
2336 if ((window->set_config.geometry.x == x) &&
2337 (window->set_config.geometry.y == y) &&
2338 (window->set_config.geometry.w == w) &&
2339 (window->set_config.geometry.h == h))
2342 window->set_config.geometry.x = x;
2343 window->set_config.geometry.y = y;
2344 window->set_config.geometry.w = w;
2345 window->set_config.geometry.h = h;
2346 window->pending.geom = EINA_TRUE;
2349 //TIZEN_ONLY(20220325): added min / max size set to window
2351 ecore_wl2_window_minimum_size_set(Ecore_Wl2_Window *window, int w, int h)
2353 EINA_SAFETY_ON_NULL_RETURN(window);
2355 if (window->zxdg_set_min_size && window->zxdg_toplevel)
2357 window->zxdg_set_min_size(window->zxdg_toplevel, w, h);
2358 window->pending.min = 0;
2361 if (window->xdg_set_min_size && window->xdg_toplevel)
2363 window->xdg_set_min_size(window->xdg_toplevel, w, h);
2364 window->pending.min = 0;
2370 ecore_wl2_window_maximum_size_set(Ecore_Wl2_Window *window, int w, int h)
2372 EINA_SAFETY_ON_NULL_RETURN(window);
2374 if (window->zxdg_set_max_size && window->zxdg_toplevel)
2376 window->zxdg_set_max_size(window->zxdg_toplevel, w, h);
2377 window->pending.max = 0;
2380 if (window->xdg_set_max_size && window->xdg_toplevel)
2382 window->xdg_set_max_size(window->xdg_toplevel, w, h);
2383 window->pending.max = 0;
2390 ecore_wl2_window_iconified_get(Ecore_Wl2_Window *window)
2392 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2394 // TIZEN_ONLY(20150822)
2395 if (window->display->wl.tz_policy)
2396 return window->iconified;
2399 return window->set_config.minimized;
2402 // TIZEN_ONLY(20151231) : handling iconic state on tizen
2404 _ecore_wl2_window_iconified_set(Ecore_Wl2_Window *window, Eina_Bool iconified, Eina_Bool send_event)
2408 EINA_SAFETY_ON_NULL_RETURN(window);
2410 prev = window->set_config.minimized;
2411 iconified = !!iconified;
2412 if (prev == iconified) return;
2414 window->set_config.minimized = iconified;
2418 if ((window->surface) && (window->display->wl.tz_policy))
2421 tizen_policy_iconify(window->display->wl.tz_policy, window->surface);
2422 window->iconified = EINA_TRUE;
2425 else if (window->zxdg_toplevel)
2426 zxdg_toplevel_v6_set_minimized(window->zxdg_toplevel);
2430 if ((window->surface) && (window->display->wl.tz_policy))
2433 tizen_policy_uniconify(window->display->wl.tz_policy, window->surface);
2434 window->iconified = EINA_FALSE;
2437 else if (window->zxdg_toplevel)
2439 struct wl_array states;
2442 wl_array_init(&states);
2443 s = wl_array_add(&states, sizeof(*s));
2444 *s = ZXDG_TOPLEVEL_V6_STATE_ACTIVATED;
2445 _zxdg_toplevel_cb_configure(window, window->zxdg_toplevel,
2447 window->saved.h, &states);
2448 wl_array_release(&states);
2454 Ecore_Wl2_Event_Window_Iconify_State_Change *ev;
2456 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Iconify_State_Change)))) return;
2457 ev->win = window->id;
2458 ev->iconified = iconified;
2460 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE, ev, NULL, NULL);
2466 ecore_wl2_window_iconified_set(Ecore_Wl2_Window *window, Eina_Bool iconified)
2468 // TIZEN_ONLY(20151231) : handling iconic state on tizen
2472 EINA_SAFETY_ON_NULL_RETURN(window);
2474 prev = window->set_config.minimized;
2475 iconified = !!iconified;
2476 if (prev == iconified) return;
2478 window->set_config.minimized = iconified;
2482 if (window->xdg_toplevel)
2483 xdg_toplevel_set_minimized(window->xdg_toplevel);
2484 if (window->zxdg_toplevel)
2485 zxdg_toplevel_v6_set_minimized(window->zxdg_toplevel);
2486 ecore_wl2_display_flush(window->display);
2489 _ecore_wl2_window_iconified_set(window, iconified, EINA_TRUE);
2493 // TIZEN_ONLY(20151231) : handling iconic state on tizen
2495 ecore_wl2_window_iconify_state_update(Ecore_Wl2_Window *window, Eina_Bool iconified, Eina_Bool send_event)
2497 _ecore_wl2_window_iconified_set(window, iconified, send_event);
2501 //TIZEN_ONLY(20171216): add ecore_wl2_window_find
2502 EAPI Ecore_Wl2_Window *
2503 ecore_wl2_window_find(unsigned int id)
2505 Ecore_Wl2_Window *win = NULL;
2507 if (!_windows) return NULL;
2508 win = eina_hash_find(_windows, _ecore_wl2_window_id_str_get(id));
2513 //TIZEN_ONLY(20180202): Fix to send a proper window type value to the server
2514 static inline uint32_t
2515 _convert_to_tzsh_type(Ecore_Wl2_Window_Type type)
2519 case ECORE_WL2_WINDOW_TYPE_NONE:
2520 return TIZEN_POLICY_WIN_TYPE_NONE;
2521 case ECORE_WL2_WINDOW_TYPE_TOPLEVEL:
2522 return TIZEN_POLICY_WIN_TYPE_TOPLEVEL;
2523 case ECORE_WL2_WINDOW_TYPE_MENU:
2524 return TIZEN_POLICY_WIN_TYPE_MENU;
2525 case ECORE_WL2_WINDOW_TYPE_DND:
2526 return TIZEN_POLICY_WIN_TYPE_DND;
2527 case ECORE_WL2_WINDOW_TYPE_CUSTOM:
2528 return TIZEN_POLICY_WIN_TYPE_CUSTOM;
2529 case ECORE_WL2_WINDOW_TYPE_NOTIFICATION:
2530 return TIZEN_POLICY_WIN_TYPE_NOTIFICATION;
2531 case ECORE_WL2_WINDOW_TYPE_UTILITY:
2532 return TIZEN_POLICY_WIN_TYPE_UTILITY;
2533 case ECORE_WL2_WINDOW_TYPE_DIALOG:
2534 return TIZEN_POLICY_WIN_TYPE_DIALOG;
2535 case ECORE_WL2_WINDOW_TYPE_DOCK:
2536 return TIZEN_POLICY_WIN_TYPE_DOCK;
2537 case ECORE_WL2_WINDOW_TYPE_SPLASH:
2538 return TIZEN_POLICY_WIN_TYPE_SPLASH;
2539 case ECORE_WL2_WINDOW_TYPE_DESKTOP:
2540 return TIZEN_POLICY_WIN_TYPE_DESKTOP;
2542 return TIZEN_POLICY_WIN_TYPE_NONE;
2548 ecore_wl2_window_type_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window_Type type)
2550 EINA_SAFETY_ON_NULL_RETURN(window);
2551 window->type = type;
2553 // TIZEN_ONLY(20180202): Fix to send a proper window type value to the server
2555 tzsh_type = _convert_to_tzsh_type(type);
2558 // TIZEN_ONLY(20171114)
2559 if ((window->surface) && (window->display->wl.tz_policy))
2560 tizen_policy_set_type(window->display->wl.tz_policy, window->surface, (uint32_t)tzsh_type);
2565 ecore_wl2_window_popup_input_set(Ecore_Wl2_Window *window, Ecore_Wl2_Input *input)
2567 EINA_SAFETY_ON_NULL_RETURN(window);
2568 EINA_SAFETY_ON_NULL_RETURN(input);
2569 EINA_SAFETY_ON_TRUE_RETURN(window->type != ECORE_WL2_WINDOW_TYPE_MENU);
2570 window->grab = input;
2573 EAPI Ecore_Wl2_Input *
2574 ecore_wl2_window_popup_input_get(Ecore_Wl2_Window *window)
2576 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2578 return window->grab;
2581 EAPI Ecore_Wl2_Display *
2582 ecore_wl2_window_display_get(const Ecore_Wl2_Window *window)
2584 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2585 EINA_SAFETY_ON_NULL_RETURN_VAL(window->display, NULL);
2587 if (window->display->recovering) return NULL;
2589 return window->display;
2593 ecore_wl2_window_shell_surface_exists(Ecore_Wl2_Window *window)
2595 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2596 return !!window->zxdg_surface || !!window->xdg_surface;
2599 // TIZEN_ONLY(171108) : get shell surface of a given window
2600 EAPI struct zxdg_surface_v6 *
2601 ecore_wl2_window_shell_surface_get(Ecore_Wl2_Window *window)
2603 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2604 return window->zxdg_surface;
2609 ecore_wl2_window_activated_get(const Ecore_Wl2_Window *window)
2611 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2612 return window->req_config.focused;
2615 EAPI Ecore_Wl2_Output *
2616 ecore_wl2_window_output_find(Ecore_Wl2_Window *window)
2618 Ecore_Wl2_Output *out;
2622 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2624 x = window->set_config.geometry.x;
2625 y = window->set_config.geometry.y;
2627 EINA_INLIST_FOREACH_SAFE(window->display->outputs, tmp, out)
2631 ox = out->geometry.x;
2632 oy = out->geometry.y;
2634 switch (out->transform)
2636 case WL_OUTPUT_TRANSFORM_90:
2637 case WL_OUTPUT_TRANSFORM_270:
2638 case WL_OUTPUT_TRANSFORM_FLIPPED_90:
2639 case WL_OUTPUT_TRANSFORM_FLIPPED_270:
2640 ow = out->geometry.h;
2641 oh = out->geometry.w;
2644 ow = out->geometry.w;
2645 oh = out->geometry.h;
2649 if (((x >= ox) && (x < ow)) && ((y >= oy) && (y < oh)))
2657 ecore_wl2_window_buffer_transform_set(Ecore_Wl2_Window *window, int transform)
2659 EINA_SAFETY_ON_NULL_RETURN(window);
2661 wl_surface_set_buffer_transform(window->surface, transform);
2665 ecore_wl2_window_wm_rotation_supported_set(Ecore_Wl2_Window *window, Eina_Bool enabled)
2667 EINA_SAFETY_ON_NULL_RETURN(window);
2668 window->wm_rot.supported = enabled;
2672 ecore_wl2_window_wm_rotation_supported_get(Ecore_Wl2_Window *window)
2674 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2675 return window->wm_rot.supported;
2679 ecore_wl2_window_rotation_app_set(Ecore_Wl2_Window *window, Eina_Bool set)
2681 EINA_SAFETY_ON_NULL_RETURN(window);
2682 window->wm_rot.app_set = set;
2686 ecore_wl2_window_rotation_app_get(Ecore_Wl2_Window *window)
2688 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2689 return window->wm_rot.app_set;
2693 ecore_wl2_window_preferred_rotation_set(Ecore_Wl2_Window *window, int rot)
2695 EINA_SAFETY_ON_NULL_RETURN(window);
2696 window->wm_rot.preferred_rot = rot;
2699 _tizen_rotation_preferred_angle_set(window, window->wm_rot.preferred_rot);
2704 ecore_wl2_window_preferred_rotation_get(Ecore_Wl2_Window *window)
2706 EINA_SAFETY_ON_NULL_RETURN_VAL(window, 0);
2707 return window->wm_rot.preferred_rot;
2711 ecore_wl2_window_available_rotations_set(Ecore_Wl2_Window *window, const int *rots, unsigned int count)
2714 EINA_SAFETY_ON_NULL_RETURN(window);
2717 _tizen_rotation_available_angles_set(window, rots, count);
2720 if (window->wm_rot.available_rots)
2722 free(window->wm_rot.available_rots);
2723 window->wm_rot.available_rots = NULL;
2725 window->wm_rot.count = count;
2729 window->wm_rot.available_rots = calloc(count, sizeof(int));
2730 if (!window->wm_rot.available_rots) return;
2732 for (; i < count; i++)
2733 window->wm_rot.available_rots[i] = ((int *)rots)[i];
2738 ecore_wl2_window_available_rotations_get(Ecore_Wl2_Window *window, int **rots, unsigned int *count)
2743 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2746 *count = window->wm_rot.count;
2748 if (window->wm_rot.count >= 1)
2750 val = calloc(window->wm_rot.count, sizeof(int));
2751 if (!val) return EINA_FALSE;
2753 for (; i < window->wm_rot.count; i++)
2754 val[i] = ((int *)window->wm_rot.available_rots)[i];
2764 ecore_wl2_window_rotation_change_prepare_send(Ecore_Wl2_Window *window, int rot, int w, int h, Eina_Bool resize)
2766 Ecore_Wl2_Event_Window_Rotation_Change_Prepare *ev;
2768 EINA_SAFETY_ON_NULL_RETURN(window);
2770 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation_Change_Prepare));
2773 ev->win = window->id;
2777 ev->resize = resize;
2779 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_PREPARE, ev, NULL, NULL);
2783 ecore_wl2_window_rotation_change_prepare_done_send(Ecore_Wl2_Window *window, int rot)
2785 Ecore_Wl2_Event_Window_Rotation_Change_Prepare_Done *ev;
2787 EINA_SAFETY_ON_NULL_RETURN(window);
2789 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation_Change_Prepare_Done));
2792 ev->win = window->id;
2798 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_PREPARE_DONE,
2803 ecore_wl2_window_rotation_change_request_send(Ecore_Wl2_Window *window, int rot)
2805 Ecore_Wl2_Event_Window_Rotation_Change_Request *ev;
2807 EINA_SAFETY_ON_NULL_RETURN(window);
2809 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation_Change_Request));
2812 ev->win = window->id;
2818 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_REQUEST,
2823 ecore_wl2_window_rotation_change_done_send(Ecore_Wl2_Window *window, int rot, int w, int h)
2825 Ecore_Wl2_Event_Window_Rotation_Change_Done *ev;
2827 EINA_SAFETY_ON_NULL_RETURN(window);
2830 if (window->tz_rotation)
2831 tizen_rotation_ack_angle_change(window->tz_rotation, window->wm_rot.serial);
2834 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation_Change_Done));
2837 ev->win = window->id;
2843 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_DONE,
2849 ecore_wl2_window_rotation_geometry_set(Ecore_Wl2_Window *win, int rot, int x, int y, int w, int h)
2853 enum tizen_rotation_angle angle = TIZEN_ROTATION_ANGLE_NONE;
2857 if ((rot % 90 != 0) || (rot / 90 > 3) || (rot < 0)) return;
2860 win->wm_rot.geometry_hints[i].x = x;
2861 win->wm_rot.geometry_hints[i].y = y;
2862 win->wm_rot.geometry_hints[i].w = w;
2863 win->wm_rot.geometry_hints[i].h = h;
2864 win->wm_rot.geometry_hints[i].valid = EINA_TRUE;
2866 if (!win->tz_rotation) return;
2870 angle = TIZEN_ROTATION_ANGLE_0;
2873 angle = TIZEN_ROTATION_ANGLE_90;
2876 angle = TIZEN_ROTATION_ANGLE_180;
2879 angle = TIZEN_ROTATION_ANGLE_270;
2884 tizen_rotation_set_geometry_hint(win->tz_rotation,
2885 (uint32_t)angle, x, y, w, h);
2887 rotation = ecore_wl2_window_rotation_get(win);
2888 if ((rotation % 90 != 0) || (rotation / 90 > 3) || (rotation < 0)) return;
2889 if ((i == (rotation / 90)) &&
2890 ((win->set_config.geometry.w != w) || (win->set_config.geometry.h != h)))
2892 //TIZEN_ONLY(20180201) : add function to set window size by client.
2893 win->set_config.geometry.w = w;
2894 win->set_config.geometry.h = h;
2895 _ecore_wl2_window_configure_send_by_client(win);
2901 ecore_wl2_window_rotation_changed_callback_set(Ecore_Wl2_Window *win, void *data, void (*func)(Ecore_Wl2_Window *win, int rot, Eina_Bool resize, int w, int h, void *data))
2905 win->cb_rot_changed = func;
2906 win->cb_rot_changed_data = data;
2910 // TIZEN_ONLY(20210330): for maintain internal aux hint list
2911 static Ecore_Wl2_Window_Aux_Hint *
2912 _ecore_wl2_window_aux_hint_get_by_id(Ecore_Wl2_Window *win, int id)
2914 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
2915 Eina_List *l = NULL;
2917 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
2919 EINA_LIST_REVERSE_FOREACH(win->aux_hints, l, ewah)
2928 static Ecore_Wl2_Window_Aux_Hint *
2929 _ecore_wl2_window_aux_hint_get_by_hint(Ecore_Wl2_Window *win, const char *hint)
2931 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
2932 Eina_List *l = NULL;
2933 size_t hint_len = 0;
2935 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
2937 hint_len = strlen(hint);
2938 EINA_LIST_REVERSE_FOREACH(win->aux_hints, l, ewah)
2940 if ((strlen(ewah->hint) == hint_len) &&
2941 !strncmp(ewah->hint, hint, hint_len))
2949 _ecore_wl2_window_aux_hint_list_add(Ecore_Wl2_Window *win, int id, const char *hint, const char *val)
2951 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
2953 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
2955 ewah = _ecore_wl2_window_aux_hint_get_by_id(win, id);
2958 eina_stringshare_del(ewah->hint);
2959 eina_stringshare_del(ewah->val);
2960 ewah->hint = eina_stringshare_add(hint);
2961 ewah->val = eina_stringshare_add(val);
2965 ewah = (Ecore_Wl2_Window_Aux_Hint *)calloc(1, sizeof(Ecore_Wl2_Window_Aux_Hint));
2966 EINA_SAFETY_ON_NULL_RETURN_VAL(ewah, EINA_FALSE);
2968 ewah->hint = eina_stringshare_add(hint);
2969 ewah->val = eina_stringshare_add(val);
2971 win->aux_hints = eina_list_append(win->aux_hints, ewah);
2977 _ecore_wl2_window_aux_hint_list_change(Ecore_Wl2_Window *win, Ecore_Wl2_Window_Aux_Hint *ewah, const char *val)
2979 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
2980 EINA_SAFETY_ON_NULL_RETURN_VAL(ewah, EINA_FALSE);
2982 eina_stringshare_del(ewah->val);
2983 ewah->val = eina_stringshare_add(val);
2989 _ecore_wl2_window_aux_hint_list_del(Ecore_Wl2_Window *win, Ecore_Wl2_Window_Aux_Hint *ewah)
2991 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
2992 EINA_SAFETY_ON_NULL_RETURN_VAL(ewah, EINA_FALSE);
2994 eina_stringshare_del(ewah->hint);
2995 eina_stringshare_del(ewah->val);
2996 win->aux_hints = eina_list_remove(win->aux_hints, ewah);
3000 // END OF TIZEN_ONLY
3002 // TIZEN_ONLY(20210330): support aux hint generate
3004 _cb_aux_hint_sort(const void *data1, const void *data2)
3006 const Ecore_Wl2_Window_Aux_Hint *ewah1 = (const Ecore_Wl2_Window_Aux_Hint *) data1;
3007 const Ecore_Wl2_Window_Aux_Hint *ewah2 = (const Ecore_Wl2_Window_Aux_Hint *) data2;
3009 if (!ewah1 || !ewah2) return 0;
3011 if (ewah1->id > ewah2->id) return 1;
3012 else if (ewah1->id == ewah2->id) return 0;
3017 _ecore_wl2_window_aux_hint_id_assign(Ecore_Wl2_Window *win)
3019 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3020 Eina_List *ewah_sorted_list = NULL, *l = NULL;
3023 ewah_sorted_list = eina_list_clone(win->aux_hints);
3024 ewah_sorted_list = eina_list_sort(ewah_sorted_list, 0, _cb_aux_hint_sort);
3026 EINA_LIST_FOREACH(ewah_sorted_list, l, ewah)
3028 if (ewah->id < 0) continue;
3039 eina_list_free(ewah_sorted_list);
3045 ecore_wl2_window_aux_hint_generate(Ecore_Wl2_Window *win, const char *hint, const char *val)
3047 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3050 EINA_SAFETY_ON_NULL_RETURN_VAL(win, -1);
3052 ewah = _ecore_wl2_window_aux_hint_get_by_hint(win, hint);
3055 ecore_wl2_window_aux_hint_change(win, ewah->id, val);
3059 id = _ecore_wl2_window_aux_hint_id_assign(win);
3060 if (id < 0) return -1;
3062 if (!_ecore_wl2_window_aux_hint_list_add(win, id, hint, val))
3066 if ((win->surface) && (win->display->wl.tz_policy))
3067 tizen_policy_add_aux_hint(win->display->wl.tz_policy, win->surface, id, hint, val);
3069 if ((!win->surface) || (!win->display->wl.efl_aux_hints)) return id;
3071 efl_aux_hints_add_aux_hint(win->display->wl.efl_aux_hints, win->surface, id, hint, val);
3072 ecore_wl2_display_flush(win->display);
3078 ecore_wl2_window_aux_hint_id_get(Ecore_Wl2_Window *win, const char *hint)
3080 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3082 ewah = _ecore_wl2_window_aux_hint_get_by_hint(win, hint);
3089 ecore_wl2_window_aux_hint_value_get(Ecore_Wl2_Window *win, int id)
3091 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3093 ewah = _ecore_wl2_window_aux_hint_get_by_id(win, id);
3098 // END OF TIZEN_ONLY
3101 ecore_wl2_window_aux_hints_supported_get(Ecore_Wl2_Window *win)
3103 Eina_List *res = NULL;
3105 char *supported_hint = NULL;
3106 const char *hint = NULL;
3108 if (!win) return NULL;
3109 if (!win->surface) return NULL;
3111 // TIZEN_ONLY : To use tizen protocols
3112 if (win->display->wl.tz_policy)
3114 tizen_policy_get_supported_aux_hints(win->display->wl.tz_policy, win->surface);
3115 ecore_wl2_display_sync(win->display);
3119 EINA_LIST_FOREACH(win->supported_aux_hints, ll, supported_hint)
3121 hint = eina_stringshare_add(supported_hint);
3122 res = eina_list_append(res, hint);
3128 ecore_wl2_window_aux_hint_add(Ecore_Wl2_Window *win, int id, const char *hint, const char *val)
3132 // TIZEN_ONLY : To use tizen protocols
3133 if ((win->surface) && (win->display->wl.tz_policy))
3134 tizen_policy_add_aux_hint(win->display->wl.tz_policy, win->surface, id, hint, val);
3137 // TIZEN_ONLY(20210330): for maintain internal aux hint list
3138 _ecore_wl2_window_aux_hint_list_add(win, id, hint, val);
3141 if ((!win->surface) || (!win->display->wl.efl_aux_hints)) return;
3143 efl_aux_hints_add_aux_hint(win->display->wl.efl_aux_hints, win->surface, id, hint, val);
3144 ecore_wl2_display_flush(win->display);
3148 ecore_wl2_window_aux_hint_change(Ecore_Wl2_Window *win, int id, const char *val)
3152 // TIZEN_ONLY : To use tizen protocols
3153 if ((win->surface) && (win->display->wl.tz_policy))
3154 tizen_policy_change_aux_hint(win->display->wl.tz_policy, win->surface, id, val);
3157 // TIZEN_ONLY(20210330): for maintain internal aux hint list
3158 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3159 ewah = _ecore_wl2_window_aux_hint_get_by_id(win, id);
3161 _ecore_wl2_window_aux_hint_list_change(win, ewah, val);
3164 if ((!win->surface) || (!win->display->wl.efl_aux_hints)) return;
3166 efl_aux_hints_change_aux_hint(win->display->wl.efl_aux_hints, win->surface, id, val);
3167 ecore_wl2_display_flush(win->display);
3171 ecore_wl2_window_aux_hint_del(Ecore_Wl2_Window *win, int id)
3175 // TIZEN_ONLY : To use tizen protocols
3176 if ((win->surface) && (win->display->wl.tz_policy))
3177 tizen_policy_del_aux_hint(win->display->wl.tz_policy, win->surface, id);
3180 // TIZEN_ONLY(20210330): for maintain internal aux hint list
3181 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3182 ewah = _ecore_wl2_window_aux_hint_get_by_id(win, id);
3184 _ecore_wl2_window_aux_hint_list_del(win, ewah);
3187 if ((!win->surface) || (!win->display->wl.efl_aux_hints)) return;
3189 efl_aux_hints_del_aux_hint(win->display->wl.efl_aux_hints, win->surface, id);
3190 ecore_wl2_display_flush(win->display);
3194 ecore_wl2_window_focus_skip_set(Ecore_Wl2_Window *window, Eina_Bool focus_skip)
3196 EINA_SAFETY_ON_NULL_RETURN(window);
3198 // TIZEN_ONLY(20171112)
3199 if (window->focus_skip != focus_skip)
3201 if ((window->surface) && (window->display->wl.tz_policy))
3204 tizen_policy_set_focus_skip(window->display->wl.tz_policy, window->surface);
3206 tizen_policy_unset_focus_skip(window->display->wl.tz_policy, window->surface);
3211 window->focus_skip = focus_skip;
3215 ecore_wl2_window_focus_skip_get(Ecore_Wl2_Window *window)
3217 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
3218 return window->focus_skip;
3222 ecore_wl2_window_role_set(Ecore_Wl2_Window *window, const char *role)
3224 EINA_SAFETY_ON_NULL_RETURN(window);
3225 eina_stringshare_replace(&window->role, role);
3227 // TIZEN_ONLY(20171112)
3228 if ((window->surface) && (window->display->wl.tz_policy))
3229 tizen_policy_set_role(window->display->wl.tz_policy, window->surface, window->role);
3234 ecore_wl2_window_role_get(Ecore_Wl2_Window *window)
3236 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
3238 return window->role ? window->role : NULL;
3242 ecore_wl2_window_floating_mode_set(Ecore_Wl2_Window *window, Eina_Bool floating)
3244 EINA_SAFETY_ON_NULL_RETURN(window);
3245 window->floating = floating;
3247 // TIZEN_ONLY(20171112)
3248 if ((window->surface) && (window->display->wl.tz_policy))
3251 tizen_policy_set_floating_mode(window->display->wl.tz_policy,
3254 tizen_policy_unset_floating_mode(window->display->wl.tz_policy,
3261 ecore_wl2_window_floating_mode_get(Ecore_Wl2_Window *window)
3263 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
3264 return window->floating;
3267 // TIZEN_ONLY(20150703) : support conformant
3269 ecore_wl2_window_conformant_set(Ecore_Wl2_Window *win, unsigned int is_conformant)
3272 if (!win->surface) return;
3273 if (!win->display) return;
3274 if (!win->display->wl.tz_policy) return;
3277 tizen_policy_set_conformant(win->display->wl.tz_policy, win->surface);
3279 tizen_policy_unset_conformant(win->display->wl.tz_policy, win->surface);
3283 ecore_wl2_window_conformant_get(Ecore_Wl2_Window *win)
3285 if (!win) return EINA_FALSE;
3286 if (!win->surface) return EINA_FALSE;
3287 if (!win->display) return EINA_FALSE;
3288 if (!win->display->wl.tz_policy) return EINA_FALSE;
3290 tizen_policy_get_conformant(win->display->wl.tz_policy, win->surface);
3291 ecore_wl2_display_sync(win->display);
3293 return win->conformant;
3297 // TIZEN_ONLY(20171108) : add functions for indicator
3299 ecore_wl2_window_indicator_geometry_set(Ecore_Wl2_Window *win, int x, int y, int w, int h)
3303 win->indicator.x = x;
3304 win->indicator.y = y;
3305 win->indicator.w = w;
3306 win->indicator.h = h;
3310 ecore_wl2_window_indicator_geometry_get(Ecore_Wl2_Window *win, int *x, int *y, int *w, int *h)
3312 if(!win) return EINA_FALSE;
3315 *x = win->indicator.x;
3317 *y = win->indicator.y;
3319 *w = win->indicator.w;
3321 *h = win->indicator.h;
3327 ecore_wl2_window_indicator_state_set(Ecore_Wl2_Window *win, Ecore_Wl2_Indicator_State state)
3332 if (!win->surface) return;
3333 if (!win->display->wl.tz_indicator) return;
3335 if (state == ECORE_WL2_INDICATOR_STATE_ON)
3336 ind_state = TIZEN_INDICATOR_STATE_ON;
3337 else if (state == ECORE_WL2_INDICATOR_STATE_OFF)
3338 ind_state = TIZEN_INDICATOR_STATE_OFF;
3340 ind_state = TIZEN_INDICATOR_STATE_UNKNOWN;
3342 tizen_indicator_set_state(win->display->wl.tz_indicator, win->surface, ind_state);
3344 win->indicator.state = state;
3347 EAPI Ecore_Wl2_Indicator_State
3348 ecore_wl2_window_indicator_state_get(Ecore_Wl2_Window *win)
3350 if (!win) return EINA_FALSE;
3352 return win->indicator.state;
3356 ecore_wl2_window_indicator_opacity_set(Ecore_Wl2_Window *win, Ecore_Wl2_Indicator_Opacity_Mode mode)
3361 if (!win->surface) return;
3362 if (!win->display->wl.tz_indicator) return;
3366 case ECORE_WL2_INDICATOR_OPAQUE:
3367 op_mode = TIZEN_INDICATOR_OPACITY_MODE_OPAQUE;
3370 case ECORE_WL2_INDICATOR_TRANSLUCENT:
3371 op_mode = TIZEN_INDICATOR_OPACITY_MODE_TRANSLUCENT;
3374 case ECORE_WL2_INDICATOR_TRANSPARENT:
3375 op_mode = TIZEN_INDICATOR_OPACITY_MODE_TRANSPARENT;
3378 case ECORE_WL2_INDICATOR_BG_TRANSPARENT:
3379 op_mode = TIZEN_INDICATOR_OPACITY_MODE_BG_TRANSPARENT;
3383 op_mode = TIZEN_INDICATOR_OPACITY_MODE_OPAQUE;
3387 tizen_indicator_set_opacity_mode(win->display->wl.tz_indicator, win->surface, op_mode);
3389 win->indicator.mode = mode;
3392 EAPI Ecore_Wl2_Indicator_Opacity_Mode
3393 ecore_wl2_window_indicator_opacity_get(Ecore_Wl2_Window *win)
3395 if (!win) return EINA_FALSE;
3397 return win->indicator.mode;
3401 ecore_wl2_indicator_visible_type_set(Ecore_Wl2_Window *win, Ecore_Wl2_Indicator_Visible_Type type)
3406 if (!win->surface) return;
3407 if (!win->display->wl.tz_indicator) return;
3409 if (type == ECORE_WL2_INDICATOR_VISIBLE_TYPE_SHOWN)
3410 vis_type = TIZEN_INDICATOR_VISIBLE_TYPE_SHOWN;
3412 vis_type = TIZEN_INDICATOR_VISIBLE_TYPE_HIDDEN;
3414 tizen_indicator_set_visible_type(win->display->wl.tz_indicator, win->surface, vis_type);
3416 win->indicator.type = type;
3419 EAPI Ecore_Wl2_Indicator_Visible_Type
3420 ecore_wl2_indicator_visible_type_get(Ecore_Wl2_Window *win)
3422 if (!win) return EINA_FALSE;
3424 return win->indicator.type;
3428 // TIZEN_ONLY(20171108) : add functions for clipboard
3430 ecore_wl2_window_clipboard_geometry_set(Ecore_Wl2_Window *win, int x, int y, int w, int h)
3434 win->clipboard.x = x;
3435 win->clipboard.y = y;
3436 win->clipboard.w = w;
3437 win->clipboard.h = h;
3441 ecore_wl2_window_clipboard_geometry_get(Ecore_Wl2_Window *win, int *x, int *y, int *w, int *h)
3443 if (!win) return EINA_FALSE;
3446 *x = win->clipboard.x;
3448 *y = win->clipboard.y;
3450 *w = win->clipboard.w;
3452 *h = win->clipboard.h;
3458 ecore_wl2_window_clipboard_state_set(Ecore_Wl2_Window *win, Ecore_Wl2_Clipboard_State state)
3462 win->clipboard.state = state;
3465 EAPI Ecore_Wl2_Clipboard_State
3466 ecore_wl2_window_clipboard_state_get(Ecore_Wl2_Window *win)
3468 if (!win) return EINA_FALSE;
3470 return win->clipboard.state;
3474 ecore_wl2_clipboard_show(Ecore_Wl2_Window *win)
3477 if (!win->surface) return;
3478 if (!win->display->wl.tz_clipboard) return;
3480 tizen_clipboard_show(win->display->wl.tz_clipboard, win->surface);
3484 ecore_wl2_clipboard_hide(Ecore_Wl2_Window *win)
3487 if (!win->surface) return;
3488 if (!win->display->wl.tz_clipboard) return;
3490 tizen_clipboard_hide(win->display->wl.tz_clipboard, win->surface);
3494 ecore_wl2_clipboard_data_only_set(Eina_Bool data_only)
3496 Ecore_Wl2_Display *ewd = NULL;
3497 Ecore_Wl2_Input *input = NULL;
3499 ewd = ecore_wl2_connected_display_get(NULL);
3500 if (!ewd) return EINA_FALSE;
3501 input = ecore_wl2_input_default_input_get(ewd);
3502 if (!input) return EINA_FALSE;
3504 if (!ewd->wl.tz_clipboard) return EINA_FALSE;
3506 tizen_clipboard_set_data_only(ewd->wl.tz_clipboard, data_only);
3507 ecore_wl2_display_sync(ewd);
3509 return input->is_data_only;
3513 // TIZEN_ONLY(20171108) : add functions for keyboard
3515 ecore_wl2_window_keyboard_geometry_set(Ecore_Wl2_Window *win, int x, int y, int w, int h)
3520 win->keyboard.y = y;
3521 win->keyboard.w = w;
3522 win->keyboard.h = h;
3526 ecore_wl2_window_keyboard_geometry_get(Ecore_Wl2_Window *win, int *x, int *y, int *w, int *h)
3528 if (!win) return EINA_FALSE;
3531 *x = win->keyboard.x;
3533 *y = win->keyboard.y;
3535 *w = win->keyboard.w;
3537 *h = win->keyboard.h;
3543 ecore_wl2_window_keyboard_state_set(Ecore_Wl2_Window *win, Ecore_Wl2_Virtual_Keyboard_State state)
3547 win->keyboard.state = state;
3550 EAPI Ecore_Wl2_Virtual_Keyboard_State
3551 ecore_wl2_window_keyboard_state_get(Ecore_Wl2_Window *win)
3553 if (!win) return EINA_FALSE;
3555 return win->keyboard.state;
3560 ecore_wl2_window_aspect_set(Ecore_Wl2_Window *window, int w, int h, unsigned int aspect)
3562 EINA_SAFETY_ON_NULL_RETURN(window);
3563 EINA_SAFETY_ON_TRUE_RETURN(w < 1);
3564 EINA_SAFETY_ON_TRUE_RETURN(h < 1);
3566 if ((window->aspect.aspect == aspect) && (window->aspect.w == w) &&
3567 (window->aspect.h == h))
3570 window->aspect.w = w;
3571 window->aspect.h = h;
3572 window->aspect.aspect = aspect;
3573 window->aspect.set = 1;
3574 if (!window->display->wl.efl_hints) return;
3575 if (window->xdg_surface)
3576 efl_hints_set_aspect(window->display->wl.efl_hints,
3577 window->xdg_surface, w, h, aspect);
3578 ecore_wl2_display_flush(window->display);
3582 ecore_wl2_window_aspect_get(Ecore_Wl2_Window *window, int *w, int *h, unsigned int *aspect)
3584 EINA_SAFETY_ON_NULL_RETURN(window);
3586 if (w) *w = window->aspect.w;
3587 if (h) *h = window->aspect.h;
3588 if (aspect) *aspect = window->aspect.aspect;
3592 ecore_wl2_window_weight_set(Ecore_Wl2_Window *window, double w, double h)
3595 EINA_SAFETY_ON_NULL_RETURN(window);
3597 ww = lround(w * 100);
3598 hh = lround(h * 100);
3600 if ((window->weight.w == ww) && (window->weight.h == hh))
3603 window->weight.w = ww;
3604 window->weight.h = hh;
3605 window->weight.set = 1;
3606 if (!window->display->wl.efl_hints) return;
3607 if (window->xdg_surface)
3608 efl_hints_set_weight(window->display->wl.efl_hints,
3609 window->xdg_surface, ww, hh);
3610 ecore_wl2_display_flush(window->display);
3614 _frame_cb(void *data, struct wl_callback *callback, uint32_t timestamp)
3616 Ecore_Wl2_Frame_Cb_Handle *cb;
3617 Ecore_Wl2_Window *window;
3621 window->commit_pending = EINA_FALSE;
3622 wl_callback_destroy(callback);
3623 window->callback = NULL;
3624 EINA_INLIST_FOREACH_SAFE(window->frame_callbacks, l, cb)
3625 cb->cb(window, timestamp, cb->data);
3628 static struct wl_callback_listener _frame_listener =
3634 _maximized_set(Ecore_Wl2_Window *window)
3636 EINA_SAFETY_ON_FALSE_RETURN(window->zxdg_toplevel || window->xdg_toplevel);
3638 if (window->set_config.maximized)
3640 if (window->xdg_toplevel)
3641 xdg_toplevel_set_maximized(window->xdg_toplevel);
3642 if (window->zxdg_toplevel)
3643 zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
3647 if (window->xdg_toplevel)
3648 xdg_toplevel_unset_maximized(window->xdg_toplevel);
3649 if (window->zxdg_toplevel)
3650 zxdg_toplevel_v6_unset_maximized(window->zxdg_toplevel);
3655 _fullscreen_set(Ecore_Wl2_Window *window)
3657 EINA_SAFETY_ON_FALSE_RETURN(window->zxdg_toplevel || window->xdg_toplevel);
3659 if (window->set_config.fullscreen)
3661 window->saved = window->set_config.geometry;
3662 if (window->xdg_toplevel)
3663 xdg_toplevel_set_fullscreen(window->xdg_toplevel, NULL);
3664 if (window->zxdg_toplevel)
3665 zxdg_toplevel_v6_set_fullscreen(window->zxdg_toplevel, NULL);
3669 if (window->xdg_toplevel)
3670 xdg_toplevel_unset_fullscreen(window->xdg_toplevel);
3671 if (window->zxdg_toplevel)
3672 zxdg_toplevel_v6_unset_fullscreen(window->zxdg_toplevel);
3676 static struct wl_region *
3677 _region_create(struct wl_compositor *comp, int x, int y, int w, int h)
3679 struct wl_region *out;
3681 out = wl_compositor_create_region(comp);
3684 ERR("Failed to create region");
3688 wl_region_add(out, x, y, w, h);
3694 _regions_set(Ecore_Wl2_Window *window)
3696 struct wl_region *region = NULL;
3698 if (window->pending.opaque)
3700 if (window->opaque_set)
3702 region = _region_create(window->display->wl.compositor,
3703 window->opaque.x, window->opaque.y,
3704 window->opaque.w, window->opaque.h);
3705 if (!region) return;
3707 // TIZEN_ONLY(20201123)
3709 wl_surface_set_opaque_region(window->surface, region);
3711 _opaque_region_set(window, region);
3715 if (!window->pending.input) goto out;
3716 if (window->type == ECORE_WL2_WINDOW_TYPE_DND) goto out;
3718 if (!window->input_set)
3720 wl_surface_set_input_region(window->surface, NULL);
3724 if (region && (window->opaque.x == window->input_rect.x) &&
3725 (window->opaque.y == window->input_rect.y) &&
3726 (window->opaque.w == window->input_rect.w) &&
3727 (window->opaque.h == window->input_rect.h))
3729 wl_surface_set_input_region(window->surface, region);
3732 if (region) wl_region_destroy(region);
3734 region = _region_create(window->display->wl.compositor,
3735 window->input_rect.x, window->input_rect.y,
3736 window->input_rect.w, window->input_rect.h);
3737 if (!region) return;
3738 wl_surface_set_input_region(window->surface, region);
3741 if (region) wl_region_destroy(region);
3744 // TIZEN_ONLY(20201123)
3746 _opaque_region_set(Ecore_Wl2_Window *window, struct wl_region *region)
3748 if (!window) return;
3749 if (!window->surface) return;
3751 wl_surface_set_opaque_region(window->surface, region);
3753 window->pending.opaque = EINA_FALSE;
3757 // TIZEN_ONLY(20190910)
3759 _opaque_set(Ecore_Wl2_Window *window)
3761 struct wl_region *region;
3763 if (!window->opaque_set)
3765 if (window->surface)
3766 _opaque_region_set(window, NULL);
3770 region = wl_compositor_create_region(window->display->wl.compositor);
3773 ERR("Failed to create opaque region");
3777 wl_region_add(region, window->opaque.x, window->opaque.y,
3778 window->opaque.w, window->opaque.h);
3779 _opaque_region_set(window, region);
3780 wl_region_destroy(region);
3785 ecore_wl2_window_commit(Ecore_Wl2_Window *window, Eina_Bool flush)
3787 EINA_SAFETY_ON_NULL_RETURN(window);
3788 EINA_SAFETY_ON_NULL_RETURN(window->surface);
3790 if (window->commit_pending)
3792 if (window->callback)
3793 wl_callback_destroy(window->callback);
3794 window->callback = NULL;
3795 WRN("Commit before previous commit processed");
3797 if (!window->pending.configure)
3799 if (window->has_buffer)
3800 window->commit_pending = EINA_TRUE;
3801 if (!window->callback)
3803 window->callback = wl_surface_frame(window->surface);
3804 wl_callback_add_listener(window->callback, &_frame_listener, window);
3806 /* Dispatch any state we've been saving along the way */
3807 if (window->pending.geom)
3811 ecore_wl2_window_geometry_get(window, &gx, &gy, &gw, &gh);
3812 if (window->xdg_toplevel)
3813 xdg_surface_set_window_geometry(window->xdg_surface,
3815 if (window->zxdg_surface)
3816 zxdg_surface_v6_set_window_geometry(window->zxdg_surface,
3819 // TIZEN_ONLY(20220421) : update window's saved size only un-fullscreen and unmaximize state
3820 if (!window->set_config.fullscreen && !window->set_config.maximized)
3822 window->saved.w = window->set_config.geometry.w;
3823 window->saved.h = window->set_config.geometry.h;
3827 if (window->pending.opaque || window->pending.input)
3828 _regions_set(window);
3830 if (window->pending.maximized)
3831 _maximized_set(window);
3833 if (window->pending.fullscreen)
3834 _fullscreen_set(window);
3836 window->pending.geom = EINA_FALSE;
3837 window->pending.opaque = EINA_FALSE;
3838 window->pending.input = EINA_FALSE;
3839 window->pending.maximized = EINA_FALSE;
3840 window->pending.fullscreen = EINA_FALSE;
3843 if (window->req_config.serial != window->set_config.serial)
3845 if (window->xdg_configure_ack && window->xdg_surface)
3846 window->xdg_configure_ack(window->xdg_surface,
3847 window->req_config.serial);
3848 if (window->zxdg_configure_ack && window->zxdg_surface)
3849 window->zxdg_configure_ack(window->zxdg_surface,
3850 window->req_config.serial);
3851 window->set_config.serial = window->req_config.serial;
3855 wl_surface_commit(window->surface);
3856 ecore_wl2_display_flush(window->display);
3859 if (!window->updating) return;
3861 window->updating = EINA_FALSE;
3862 if (window->def_config.serial != window->set_config.serial)
3863 _ecore_wl2_window_configure_send(window);
3867 ecore_wl2_window_false_commit(Ecore_Wl2_Window *window)
3869 EINA_SAFETY_ON_NULL_RETURN(window);
3870 EINA_SAFETY_ON_NULL_RETURN(window->surface);
3871 EINA_SAFETY_ON_TRUE_RETURN(window->pending.configure);
3872 EINA_SAFETY_ON_TRUE_RETURN(window->commit_pending);
3874 if (!window->callback)
3876 window->callback = wl_surface_frame(window->surface);
3877 wl_callback_add_listener(window->callback, &_frame_listener, window);
3879 wl_surface_commit(window->surface);
3880 ecore_wl2_display_flush(window->display);
3881 if (window->has_buffer)
3882 window->commit_pending = EINA_TRUE;
3886 ecore_wl2_window_pending_get(Ecore_Wl2_Window *window)
3888 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
3890 return window->commit_pending;
3893 EAPI Ecore_Wl2_Frame_Cb_Handle *
3894 ecore_wl2_window_frame_callback_add(Ecore_Wl2_Window *window, Ecore_Wl2_Frame_Cb cb, void *data)
3896 Ecore_Wl2_Frame_Cb_Handle *callback;
3898 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
3899 EINA_SAFETY_ON_NULL_RETURN_VAL(cb, NULL);
3901 callback = malloc(sizeof(*callback));
3902 EINA_SAFETY_ON_NULL_RETURN_VAL(callback, NULL);
3904 callback->data = data;
3905 callback->win = window;
3906 window->frame_callbacks =
3907 eina_inlist_append(window->frame_callbacks, EINA_INLIST_GET(callback));
3912 ecore_wl2_window_frame_callback_del(Ecore_Wl2_Frame_Cb_Handle *handle)
3914 EINA_SAFETY_ON_NULL_RETURN(handle);
3916 handle->win->frame_callbacks =
3917 eina_inlist_remove(handle->win->frame_callbacks, EINA_INLIST_GET(handle));
3922 ecore_wl2_window_buffer_attach(Ecore_Wl2_Window *win, void *buffer, int x, int y, Eina_Bool implicit)
3924 EINA_SAFETY_ON_NULL_RETURN(win);
3925 EINA_SAFETY_ON_NULL_RETURN(win->surface);
3927 /* FIXME: Haven't given any thought to x and y since we always use 0... */
3928 if (!implicit) wl_surface_attach(win->surface, buffer, x, y);
3929 win->buffer = buffer;
3930 if (!implicit && !buffer)
3931 win->has_buffer = EINA_FALSE;
3933 win->has_buffer = EINA_TRUE;
3937 ecore_wl2_window_resizing_get(Ecore_Wl2_Window *window)
3939 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
3941 return window->req_config.resizing;
3945 ecore_wl2_window_update_begin(Ecore_Wl2_Window *window)
3947 EINA_SAFETY_ON_NULL_RETURN(window);
3948 EINA_SAFETY_ON_TRUE_RETURN(window->updating);
3950 window->updating = EINA_TRUE;
3954 ecore_wl2_window_damage(Ecore_Wl2_Window *window, Eina_Rectangle *rects, unsigned int count)
3956 void (*damage)(struct wl_surface *, int32_t, int32_t, int32_t, int32_t);
3958 int compositor_version;
3960 EINA_SAFETY_ON_NULL_RETURN(window);
3962 compositor_version = window->display->wl.compositor_version;
3964 if (compositor_version >= WL_SURFACE_DAMAGE_BUFFER_SINCE_VERSION)
3965 damage = wl_surface_damage_buffer;
3967 damage = wl_surface_damage;
3969 if ((rects) && (count > 0))
3970 for (k = 0; k < count; k++)
3971 damage(window->surface, rects[k].x, rects[k].y, rects[k].w, rects[k].h);
3973 damage(window->surface, 0, 0, INT_MAX, INT_MAX);
3977 ecore_wl2_window_surface_flush(Ecore_Wl2_Window *window, Eina_Bool purge)
3979 EINA_SAFETY_ON_NULL_RETURN(window);
3981 if (!window->wl2_surface) return;
3982 ecore_wl2_surface_flush(window->wl2_surface, purge);
3985 EAPI Ecore_Wl2_Window_Type
3986 ecore_wl2_window_type_get(Ecore_Wl2_Window *window)
3988 EINA_SAFETY_ON_NULL_RETURN_VAL(window, ECORE_WL2_WINDOW_TYPE_NONE);
3989 return window->type;
3992 EAPI Ecore_Wl2_Window *
3993 ecore_wl2_window_surface_find(struct wl_surface *surface)
3995 Ecore_Wl2_Display *ewd;
3996 Ecore_Wl2_Window *win;
3998 EINA_SAFETY_ON_NULL_RETURN_VAL(surface, NULL);
4000 ewd = ecore_wl2_connected_display_get(NULL);
4001 EINA_SAFETY_ON_NULL_RETURN_VAL(ewd, NULL);
4003 win = ecore_wl2_display_window_find_by_surface(ewd, surface);
4007 // TIZEN_ONLY(20171107): add ecore_wl2_window_input_get() EAPI
4008 EAPI Ecore_Wl2_Input *
4009 ecore_wl2_window_input_get(Ecore_Wl2_Window *win)
4011 Ecore_Wl2_Input *input;
4013 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
4014 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, NULL);
4016 EINA_INLIST_FOREACH(win->display->inputs, input)
4018 if (input->focus.pointer) return input;
4019 //This code will be changed after adding ecore_wl2_window_keyboard_get API
4020 if (input->focus.keyboard) return input;
4027 // TIZEN_ONLY(20200326): add ecore_wl2_window_pointer_get() EAPI
4028 EAPI Ecore_Wl2_Input *
4029 ecore_wl2_window_pointer_get(Ecore_Wl2_Window *win)
4031 Ecore_Wl2_Input *input;
4033 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
4034 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, NULL);
4036 EINA_INLIST_FOREACH(win->display->inputs, input)
4037 if (input->focus.pointer == win) return input;
4043 // TIZEN_ONLY(20200326): add ecore_wl2_window_keyboard_get() EAPI
4044 EAPI Ecore_Wl2_Input *
4045 ecore_wl2_window_keyboard_get(Ecore_Wl2_Window *win)
4047 Ecore_Wl2_Input *input;
4049 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
4050 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, NULL);
4052 EINA_INLIST_FOREACH(win->display->inputs, input)
4053 if (input->focus.keyboard == win) return input;
4059 // TIZEN_ONLY(20171114): support a pointer warp
4061 ecore_wl2_window_pointer_warp(Ecore_Wl2_Window *win, int x, int y)
4063 Ecore_Wl2_Display *ewd;
4065 /* FIXME: visible is not merged yet. */
4066 //if (!win || !win->surface || !win->visible) return EINA_FALSE;
4067 if (!win || !win->surface) return EINA_FALSE;
4070 if (!ewd || !ewd->wl.tz_input_device_manager) return EINA_FALSE;
4072 tizen_input_device_manager_pointer_warp(ewd->wl.tz_input_device_manager,
4073 win->surface, wl_fixed_from_int(x), wl_fixed_from_int(y));
4079 // TIZEN_ONLY(20200601): support sync between ui and video
4080 /* The video surface created in ecore_wl2 is used for informing the video area.
4081 And there is another video surface created on the player side. The player
4082 video surface is filled with video data, and the garbage data of ecore_wl2
4083 video surface can interfere with video data. So fill it with zero here. */
4085 buffer_fill_zero(tbm_surface_h surface)
4087 tbm_surface_info_s info;
4089 unsigned int height, stride;
4091 ret = tbm_surface_map(surface, TBM_OPTION_WRITE, &info);
4092 if (ret != TBM_SURFACE_ERROR_NONE)
4095 img = (int *)info.planes[0].ptr;
4096 height = tbm_surface_get_height(surface);
4097 stride = info.planes[0].stride;
4099 memset(img, 0x0, sizeof(int) * stride * height);
4101 tbm_surface_unmap(surface);
4108 ecore_wl2_window_video_surface_create(Ecore_Wl2_Window *win)
4110 Ecore_Wl2_Display *display;
4112 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
4113 if (win->video.surface) return EINA_TRUE;
4115 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, EINA_FALSE);
4116 display = win->display;
4118 EINA_SAFETY_ON_NULL_RETURN_VAL(display->wl.compositor, EINA_FALSE);
4119 EINA_SAFETY_ON_NULL_RETURN_VAL(display->wl.subcompositor, EINA_FALSE);
4120 EINA_SAFETY_ON_NULL_RETURN_VAL(display->wl.tz_policy, EINA_FALSE);
4122 win->video.surface = wl_compositor_create_surface(display->wl.compositor);
4124 if (!win->video.surface)
4126 ERR("Failed to create video surface");
4130 win->video.subsurface =
4131 wl_subcompositor_get_subsurface(display->wl.subcompositor,
4132 win->video.surface, win->surface);
4134 if (!win->video.subsurface)
4136 ERR("Failed to create video subsurface");
4137 goto get_subsurf_err;
4140 tizen_policy_place_subsurface_below_parent(display->wl.tz_policy, win->video.subsurface);
4142 if (!win->tbm_client)
4144 win->tbm_client = wayland_tbm_client_init(display->wl.display);
4145 if (!win->tbm_client)
4147 ERR("Failed to init wayland tbm client");
4148 goto client_init_err;
4152 win->video.tbm_surface = tbm_surface_create(1, 1, TBM_FORMAT_ARGB8888);
4153 if (!win->video.tbm_surface)
4155 ERR("Failed to create tbm surface");
4156 goto client_init_err;
4159 win->video.wl_buffer = wayland_tbm_client_create_buffer(win->tbm_client,
4160 win->video.tbm_surface);
4161 if (!win->video.wl_buffer)
4163 ERR("Failed to create buffer of tbm client");
4164 goto create_buf_err;
4167 if (!buffer_fill_zero(win->video.tbm_surface))
4169 ERR("Failed to fill buffer to zero");
4173 /* A sub-surface is initially in the synchronized mode. */
4174 win->video.sync = EINA_TRUE;
4176 /* need to attach surface */
4177 wl_surface_attach(win->video.surface, win->video.wl_buffer, 0, 0);
4178 wl_surface_commit(win->video.surface);
4183 wayland_tbm_client_destroy_buffer(win->tbm_client, win->video.wl_buffer);
4184 win->video.wl_buffer = NULL;
4187 tbm_surface_destroy(win->video.tbm_surface);
4188 win->video.tbm_surface = NULL;
4191 wl_subsurface_destroy(win->video.subsurface);
4192 win->video.subsurface = NULL;
4195 wl_surface_destroy(win->video.surface);
4196 win->video.surface = NULL;
4202 ecore_wl2_window_video_surface_get(Ecore_Wl2_Window *win)
4204 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
4205 return win->video.surface;
4209 ecore_wl2_window_video_surface_destroy(Ecore_Wl2_Window *win)
4211 Ecore_Wl2_Display *display;
4213 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
4214 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, EINA_FALSE);
4216 display = win->display;
4218 if (display->wl.tz_video)
4220 tizen_video_destroy(display->wl.tz_video);
4221 display->wl.tz_video = NULL;
4224 _ecore_wl2_window_video_surface_destroy(win);
4230 ecore_wl2_window_video_surface_sync_set(Ecore_Wl2_Window *win, Eina_Bool sync)
4232 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
4233 EINA_SAFETY_ON_NULL_RETURN_VAL(win->video.subsurface, EINA_FALSE);
4236 if (win->video.sync == sync) return EINA_TRUE;
4238 win->video.sync = sync;
4241 wl_subsurface_set_sync(win->video.subsurface);
4243 wl_subsurface_set_desync(win->video.subsurface);
4249 ecore_wl2_window_video_surface_destination_set(Ecore_Wl2_Window *win, int x, int y, int w, int h)
4251 Ecore_Wl2_Display *display;
4252 struct wl_registry *registry;
4253 Eina_Iterator *globals;
4254 Ecore_Wl2_Global *global;
4256 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
4257 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, EINA_FALSE);
4258 EINA_SAFETY_ON_NULL_RETURN_VAL(win->video.surface, EINA_FALSE);
4260 display = win->display;
4262 if (!win->video.viewport)
4264 if (!display->wl.tz_video)
4266 registry = ecore_wl2_display_registry_get(display);
4267 if (!registry) return EINA_FALSE;
4269 globals = ecore_wl2_display_globals_get(display);
4270 if (!globals) return EINA_FALSE;
4272 EINA_ITERATOR_FOREACH(globals, global)
4274 if (strcmp(global->interface, "tizen_video") == 0)
4276 display->wl.tz_video = wl_registry_bind(registry, global->id, &tizen_video_interface, 1);
4282 if (!display->wl.tz_video)
4284 ERR("Failed to bind tizen video interface");
4288 win->video.viewport = tizen_video_get_viewport(display->wl.tz_video, win->video.surface);
4291 if (!win->video.viewport)
4293 ERR("Failed to get video viewport");
4297 tizen_viewport_set_destination(win->video.viewport, x, y, w, h);
4298 wl_surface_commit(win->video.surface);
4304 ecore_wl2_window_render_sync_fd_create(Ecore_Wl2_Window *win, Ecore_Wl2_Window_Render_Sync_Type sync_type)
4308 EINA_SAFETY_ON_NULL_RETURN_VAL(win, sync_fd);
4309 EINA_SAFETY_ON_NULL_RETURN_VAL(win->egl_win, sync_fd);
4313 case ECORE_WL2_WINDOW_RENDER_SYNC_COMMIT:
4314 sync_fd = wl_egl_window_tizen_create_commit_sync_fd(win->egl_win->native_win);
4316 case ECORE_WL2_WINDOW_RENDER_SYNC_PRESENT:
4317 sync_fd = wl_egl_window_tizen_create_presentation_sync_fd(win->egl_win->native_win);
4327 //TIZEN_ONLY: ecore_wl2: add ecore_wl_window_video_has
4329 ecore_wl2_window_video_has(Ecore_Wl2_Window *window, Eina_Bool has)
4331 Ecore_Wl2_Display *display;
4334 EINA_SAFETY_ON_NULL_RETURN(window);
4336 display = window->display;
4337 if (!display->wl.tz_policy) return;
4339 ver = wl_proxy_get_version((struct wl_proxy *)display->wl.tz_policy);
4342 tizen_policy_has_video(display->wl.tz_policy, window->surface, has);
4346 //TIZEN_ONLY(20171115): support output transform
4348 _ecore_wl2_window_ignore_output_transform_set(Ecore_Wl2_Window *window, Eina_Bool ignore)
4350 if (!window) return;
4352 window->ignore_output_transform = ignore;
4356 ecore_wl2_window_ignore_output_transform_get(Ecore_Wl2_Window *window)
4358 return window->ignore_output_transform;
4362 // TIZEN_ONLY(20171207): add functions to set client's custom cursors
4364 ecore_wl2_window_pointer_set(Ecore_Wl2_Window *win, struct wl_surface *surface, int hot_x, int hot_y)
4366 Ecore_Wl2_Input *input;
4370 win->pointer.surface = surface;
4371 win->pointer.hot_x = hot_x;
4372 win->pointer.hot_y = hot_y;
4373 win->pointer.set = EINA_TRUE;
4375 if ((input = win->pointer.device))
4376 ecore_wl2_input_pointer_set(input, surface, hot_x, hot_y);
4380 ecore_wl2_window_cursor_from_name_set(Ecore_Wl2_Window *win, const char *cursor_name)
4382 Ecore_Wl2_Input *input;
4386 win->pointer.set = EINA_FALSE;
4388 if (!(input = win->pointer.device))
4391 eina_stringshare_replace(&win->pointer.cursor_name, cursor_name);
4393 if ((input->cursor.name) && (strcmp(input->cursor.name, win->pointer.cursor_name)))
4394 ecore_wl2_input_cursor_from_name_set(input, cursor_name);
4398 ecore_wl2_window_cursor_default_restore(Ecore_Wl2_Window *win)
4400 Ecore_Wl2_Input *input;
4404 win->pointer.set = EINA_FALSE;
4406 if ((input = win->pointer.device))
4407 ecore_wl2_input_cursor_default_restore(input);
4411 //TIZEN_ONLY(20180810): support client demand move resize
4413 ecore_wl2_window_sync_geometry_set(Ecore_Wl2_Window *window, uint32_t serial, int x, int y, int w, int h)
4415 if (!window) return;
4417 if ((window->set_config.geometry.x != x) ||
4418 (window->set_config.geometry.y != y) ||
4419 (window->set_config.geometry.w != w) ||
4420 (window->set_config.geometry.h != h))
4421 window->pending.geom = EINA_TRUE;
4423 window->set_config.geometry.x = x;
4424 window->set_config.geometry.y = y;
4425 window->set_config.geometry.w = w;
4426 window->set_config.geometry.h = h;
4428 window->pending.user_resize = EINA_TRUE;
4429 window->pending.user_w = w;
4430 window->pending.user_h = h;
4432 if (window->display->wl.tz_moveresize)
4433 tizen_move_resize_set_geometry(window->display->wl.tz_moveresize, window->surface, serial, x, y, w, h);
4435 // TIZEN_ONLY(20190807): Support for wl_egl interface
4436 if (window->egl_win)
4438 window->egl_win->sync_geom.serial = serial;
4439 window->egl_win->sync_geom.w = w;
4440 window->egl_win->sync_geom.h = h;
4442 wl_egl_window_tizen_set_window_serial(window->egl_win->native_win, serial);
4448 // TIZEN_ONLY(20190807): Support for wl_egl interface
4449 EAPI Ecore_Wl2_Egl_Window *
4450 ecore_wl2_egl_window_create(Ecore_Wl2_Window *window, int w, int h)
4452 Ecore_Wl2_Egl_Window *egl_win = NULL;
4453 struct wl_egl_window *native_win = NULL;
4454 int cap = WL_EGL_WINDOW_TIZEN_CAPABILITY_NONE;
4456 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
4457 EINA_SAFETY_ON_NULL_RETURN_VAL(window->surface, NULL);
4458 EINA_SAFETY_ON_FALSE_RETURN_VAL((window->egl_win == NULL), NULL);
4459 EINA_SAFETY_ON_FALSE_RETURN_VAL((w >= 0), NULL);
4460 EINA_SAFETY_ON_FALSE_RETURN_VAL((h >= 0), NULL);
4462 native_win = wl_egl_window_create(window->surface, w, h);
4463 EINA_SAFETY_ON_NULL_RETURN_VAL(native_win, NULL);
4465 egl_win = calloc(1, sizeof(Ecore_Wl2_Egl_Window));
4466 EINA_SAFETY_ON_NULL_GOTO(egl_win, failed);
4468 egl_win->win = window;
4469 egl_win->native_win = native_win;
4473 window->egl_win = egl_win;
4475 cap = wl_egl_window_tizen_get_capabilities(native_win);
4476 if (cap == WL_EGL_WINDOW_TIZEN_CAPABILITY_ROTATION_SUPPORTED)
4477 egl_win->support_pre_rotation = EINA_TRUE;
4482 if (native_win) wl_egl_window_destroy(native_win);
4487 ecore_wl2_egl_window_destroy(Ecore_Wl2_Egl_Window *egl_win)
4489 EINA_SAFETY_ON_NULL_RETURN(egl_win);
4491 if (egl_win->native_win)
4492 wl_egl_window_destroy(egl_win->native_win);
4495 egl_win->win->egl_win = NULL;
4497 memset(egl_win, 0, sizeof(Ecore_Wl2_Egl_Window));
4502 ecore_wl2_egl_window_native_get(Ecore_Wl2_Egl_Window *egl_win)
4504 EINA_SAFETY_ON_NULL_RETURN_VAL(egl_win, NULL);
4505 return (void *)egl_win->native_win;
4509 ecore_wl2_egl_window_resize_with_rotation(Ecore_Wl2_Egl_Window *egl_win, int dx, int dy, int w, int h, int rotation)
4511 int rot = rotation % 360;
4513 EINA_SAFETY_ON_NULL_RETURN(egl_win);
4515 egl_win->rot.buffer = rot;
4516 egl_win->rot.win = rot;
4522 if (egl_win->support_pre_rotation)
4523 wl_egl_window_tizen_set_rotation(egl_win->native_win, egl_win->rot.win);
4525 //TIZEN_ONLY(20171115): support output transform
4526 /* buffer_transform: screen rotation + window rotation
4527 * window_transform: window rotation only
4528 * We have to let the display server know the window rotation value
4529 * because the display server needs to calcuate the screen rotation value
4530 * from buffer_transform value.
4532 wl_egl_window_tizen_set_buffer_transform(egl_win->native_win, egl_win->rot.buffer / 90);
4533 wl_egl_window_tizen_set_window_transform(egl_win->native_win, egl_win->rot.win / 90);
4536 if ((egl_win->rot.buffer == 90) || (egl_win->rot.buffer == 270))
4537 wl_egl_window_resize(egl_win->native_win, h, w, dx, dy);
4539 wl_egl_window_resize(egl_win->native_win, w, h, dx, dy);
4543 //TIZEN_ONLY(20220322): add resource id to window attribute
4545 ecore_wl2_window_resource_id_get(Ecore_Wl2_Window *window)
4547 EINA_SAFETY_ON_NULL_RETURN_VAL(window, 0);
4548 return window->resource_id;
4552 //TIZEN_ONLY(20221228): add resize request set for ignoring configure event
4554 ecore_wl2_window_resize_request_set(Ecore_Wl2_Window *window, int w, int h)
4556 EINA_SAFETY_ON_NULL_RETURN(window);
4557 window->pending.user_resize = EINA_TRUE;
4558 window->pending.user_w = w;
4559 window->pending.user_h = h;