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->def_config.geometry.w || win->def_config.geometry.h)
195 ev->w = win->def_config.geometry.w;
196 ev->h = win->def_config.geometry.h;
201 // this means that display server didn't consider client's size.
210 if ((win->set_config.geometry.w == win->def_config.geometry.w) &&
211 (win->set_config.geometry.h == win->def_config.geometry.h))
213 else if ((!win->def_config.geometry.w) && (!win->def_config.geometry.h) &&
214 (!win->def_config.fullscreen) &&
215 (!win->def_config.maximized) &&
216 ((win->def_config.fullscreen != win->req_config.fullscreen) ||
217 (win->def_config.maximized != win->req_config.maximized)))
218 ev->w = win->saved.w, ev->h = win->saved.h;
220 ev->w = win->def_config.geometry.w, ev->h = win->def_config.geometry.h;
224 ev->edges = !!win->def_config.resizing;
225 if (win->def_config.fullscreen)
226 ev->states |= ECORE_WL2_WINDOW_STATE_FULLSCREEN;
227 if (win->def_config.maximized)
228 ev->states |= ECORE_WL2_WINDOW_STATE_MAXIMIZED;
230 win->req_config = win->def_config;
232 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);
233 ecore_event_add(ECORE_WL2_EVENT_WINDOW_CONFIGURE, ev, NULL, NULL);
235 if (win->def_config.focused)
236 _ecore_wl2_window_activate_send(win);
238 _ecore_wl2_window_deactivate_send(win);
241 //TIZEN_ONLY(20180201) : add function to set window size by client.
243 _ecore_wl2_window_configure_send_by_client(Ecore_Wl2_Window *win)
245 Ecore_Wl2_Event_Window_Configure *ev;
247 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Configure));
251 ev->event_win = win->id;
252 ev->x = win->set_config.geometry.x;
253 ev->y = win->set_config.geometry.y;
254 ev->w = win->set_config.geometry.w;
255 ev->h = win->set_config.geometry.h;
256 ev->edges = !!win->req_config.resizing;
258 ecore_event_add(ECORE_WL2_EVENT_WINDOW_CONFIGURE, ev, NULL, NULL);
263 _configure_complete(Ecore_Wl2_Window *window)
265 Ecore_Wl2_Event_Window_Configure_Complete *ev;
267 window->pending.configure = EINA_FALSE;
269 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Configure_Complete));
272 ev->win = window->id;
273 ecore_event_add(ECORE_WL2_EVENT_WINDOW_CONFIGURE_COMPLETE, ev, NULL, NULL);
277 #include "window_v6.x"
280 _www_surface_end_drag(void *data, struct www_surface *www_surface EINA_UNUSED)
282 Ecore_Wl2_Window *window = data;
283 Ecore_Wl2_Event_Window_WWW_Drag *ev;
285 ev = malloc(sizeof(Ecore_Wl2_Event_Window_WWW_Drag));
286 EINA_SAFETY_ON_NULL_RETURN(ev);
287 ev->window = window->id;
290 ecore_event_add(_ecore_wl2_event_window_www_drag, ev, NULL, NULL);
294 _www_surface_start_drag(void *data, struct www_surface *www_surface EINA_UNUSED)
296 Ecore_Wl2_Window *window = data;
297 Ecore_Wl2_Event_Window_WWW_Drag *ev;
299 ev = malloc(sizeof(Ecore_Wl2_Event_Window_WWW_Drag));
300 EINA_SAFETY_ON_NULL_RETURN(ev);
301 ev->window = window->id;
304 ecore_event_add(_ecore_wl2_event_window_www_drag, ev, NULL, NULL);
308 _www_surface_status(void *data, struct www_surface *www_surface EINA_UNUSED, int32_t x_rel, int32_t y_rel, uint32_t timestamp)
310 Ecore_Wl2_Window *window = data;
311 Ecore_Wl2_Event_Window_WWW *ev;
313 ev = malloc(sizeof(Ecore_Wl2_Event_Window_WWW));
314 EINA_SAFETY_ON_NULL_RETURN(ev);
315 ev->window = window->id;
318 ev->timestamp = timestamp;
320 ecore_event_add(_ecore_wl2_event_window_www, ev, NULL, NULL);
323 static struct www_surface_listener _www_surface_listener =
325 .status = _www_surface_status,
326 .start_drag = _www_surface_start_drag,
327 .end_drag = _www_surface_end_drag,
331 _ecore_wl2_window_www_surface_init(Ecore_Wl2_Window *window)
333 if (!window->surface) return;
334 if (!window->display->wl.www) return;
335 if (window->www_surface) return;
336 window->www_surface = www_create(window->display->wl.www, window->surface);
337 www_surface_set_user_data(window->www_surface, window);
338 www_surface_add_listener(window->www_surface, &_www_surface_listener,
344 _xdg_surface_cb_configure(void *data, struct xdg_surface *xdg_surface EINA_UNUSED, uint32_t serial)
346 Ecore_Wl2_Window *window;
349 window->def_config.serial = serial;
351 if (window->pending.configure)
353 window->saved.w = window->set_config.geometry.w;
354 window->saved.h = window->set_config.geometry.h;
356 if (window->pending.configure && window->updating)
357 ERR("Window shouldn't be rendering before initial configure");
359 // TIZEN_ONLY(20200922) : update window's saved size
360 if (!window->def_config.fullscreen && !window->def_config.maximized)
362 if (window->pending.geom)
364 window->saved.w = window->set_config.geometry.w;
365 window->saved.h = window->set_config.geometry.h;
370 if (!window->updating)
371 _ecore_wl2_window_configure_send(window);
373 if (window->pending.configure)
374 _configure_complete(window);
377 static const struct xdg_surface_listener _xdg_surface_listener =
379 _xdg_surface_cb_configure,
383 _xdg_toplevel_cb_configure(void *data, struct xdg_toplevel *xdg_toplevel EINA_UNUSED, int32_t width, int32_t height, struct wl_array *states)
385 Ecore_Wl2_Window *win = data;
388 win->def_config.minimized = EINA_FALSE;
389 win->def_config.maximized = EINA_FALSE;
390 win->def_config.fullscreen = EINA_FALSE;
391 win->def_config.focused = EINA_FALSE;
392 win->def_config.resizing = EINA_FALSE;
393 win->def_config.geometry.w = width;
394 win->def_config.geometry.h = height;
396 wl_array_for_each(s, states)
400 case ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED:
401 win->def_config.maximized = EINA_TRUE;
403 case ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN:
404 win->def_config.fullscreen = EINA_TRUE;
406 case ZXDG_TOPLEVEL_V6_STATE_RESIZING:
407 win->def_config.resizing = EINA_TRUE;
409 case ZXDG_TOPLEVEL_V6_STATE_ACTIVATED:
410 win->def_config.focused = EINA_TRUE;
411 win->def_config.minimized = EINA_FALSE;
417 if ((!width) && (!height) && (!win->def_config.fullscreen) && (!win->def_config.maximized) &&
418 ((win->def_config.fullscreen != win->set_config.fullscreen) || (win->def_config.maximized != win->set_config.maximized)))
419 width = win->saved.w, height = win->saved.h;
421 _ecore_wl2_window_configure_send(win);
422 //, width, height, !!win->def_config.resizing,
423 // win->def_config.fullscreen, win->def_config.maximized);
425 if (win->def_config.focused)
426 _ecore_wl2_window_activate_send(win);
428 _ecore_wl2_window_deactivate_send(win);
432 _xdg_toplevel_cb_close(void *data, struct xdg_toplevel *xdg_toplevel EINA_UNUSED)
434 Ecore_Wl2_Window *win;
440 win->cb_close(win->cb_close_data, win);
441 win->cb_close = NULL;
443 ecore_wl2_window_free(win);
446 static const struct xdg_toplevel_listener _xdg_toplevel_listener =
448 _xdg_toplevel_cb_configure,
449 _xdg_toplevel_cb_close,
453 _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)
455 Ecore_Wl2_Window *win = data;
456 win->def_config.geometry.w = width;
457 win->def_config.geometry.h = height;
461 _xdg_popup_cb_done(void *data, struct xdg_popup *xdg_popup EINA_UNUSED)
463 Ecore_Wl2_Window *win;
468 if (win->grab) _ecore_wl2_input_ungrab(win->grab);
470 _ecore_wl2_window_hide_send(win);
473 static const struct xdg_popup_listener _xdg_popup_listener =
475 _xdg_popup_cb_configure,
480 _ecore_wl2_window_xdg_popup_create(Ecore_Wl2_Window *win)
483 struct xdg_positioner *pos;
485 EINA_SAFETY_ON_NULL_RETURN(win->parent);
486 if (!win->parent->zxdg_surface) return;
488 pos = xdg_wm_base_create_positioner(win->display->wl.xdg_wm_base);
491 ecore_wl2_window_geometry_get(win, NULL, NULL, &gw, &gh);
492 xdg_positioner_set_anchor_rect(pos, 0, 0, 1, 1);
493 xdg_positioner_set_size(pos, gw, gh);
494 xdg_positioner_set_anchor(pos, XDG_POSITIONER_ANCHOR_TOP_LEFT);
495 xdg_positioner_set_gravity(pos, ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
496 ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
498 win->xdg_popup = xdg_surface_get_popup(win->xdg_surface,
499 win->parent->xdg_surface, pos);
501 xdg_positioner_destroy(pos);
503 xdg_popup_grab(win->xdg_popup, win->grab->wl.seat,
504 wl_display_get_serial(win->display->wl.display));
505 xdg_popup_set_user_data(win->xdg_popup, win);
506 xdg_popup_add_listener(win->xdg_popup, &_xdg_popup_listener, win);
508 win->pending.configure = EINA_TRUE;
510 ecore_wl2_window_commit(win, EINA_TRUE);
514 _window_shell_surface_create(Ecore_Wl2_Window *window)
516 if (window->xdg_surface) return;
517 window->xdg_surface =
518 xdg_wm_base_get_xdg_surface(window->display->wl.xdg_wm_base,
520 xdg_surface_set_user_data(window->xdg_surface, window);
521 xdg_surface_add_listener(window->xdg_surface,
522 &_xdg_surface_listener, window);
524 window->xdg_configure_ack = xdg_surface_ack_configure;
525 window->pending.configure = EINA_TRUE;
526 if (window->display->wl.efl_hints)
528 if (window->aspect.set)
529 efl_hints_set_aspect(window->display->wl.efl_hints, window->xdg_surface,
530 window->aspect.w, window->aspect.h, window->aspect.aspect);
531 if (window->weight.set)
532 efl_hints_set_weight(window->display->wl.efl_hints, window->xdg_surface,
533 window->weight.w, window->weight.h);
536 if (window->type == ECORE_WL2_WINDOW_TYPE_MENU)
537 _ecore_wl2_window_xdg_popup_create(window);
540 struct xdg_toplevel *ptop = NULL;
542 window->xdg_toplevel =
543 xdg_surface_get_toplevel(window->xdg_surface);
544 xdg_toplevel_set_user_data(window->xdg_toplevel, window);
545 xdg_toplevel_add_listener(window->xdg_toplevel,
546 &_xdg_toplevel_listener, window);
549 xdg_toplevel_set_title(window->xdg_toplevel, window->title);
551 xdg_toplevel_set_app_id(window->xdg_toplevel, window->class);
553 window->xdg_set_min_size = xdg_toplevel_set_min_size;
554 window->xdg_set_max_size = xdg_toplevel_set_max_size;
557 ptop = window->parent->xdg_toplevel;
560 xdg_toplevel_set_parent(window->xdg_toplevel, ptop);
562 if (window->set_config.maximized)
563 xdg_toplevel_set_maximized(window->xdg_toplevel);
565 if (window->set_config.fullscreen)
566 xdg_toplevel_set_fullscreen(window->xdg_toplevel, NULL);
569 ecore_wl2_window_commit(window, EINA_TRUE);
572 //TIZEN_ONLY(20150424) : tizen_visibility
574 _tizen_visibility_cb_notify(void *data, struct tizen_visibility *tizen_visibility EINA_UNUSED, uint32_t visibility)
576 Ecore_Wl2_Window *win;
577 Ecore_Wl2_Event_Window_Visibility_Change *ev;
579 if (!(win = data)) return;
580 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Visibility_Change)))) return;
583 if (visibility == TIZEN_VISIBILITY_VISIBILITY_FULLY_OBSCURED)
584 ev->fully_obscured = 1;
586 ev->fully_obscured = 0;
588 if (win->cb_visibility) win->cb_visibility(win->cb_visibility_data, win, !ev->fully_obscured);
590 ecore_event_add(ECORE_WL2_EVENT_WINDOW_VISIBILITY_CHANGE, ev, NULL, NULL);
594 _tizen_visibility_cb_changed(void *data, struct tizen_visibility *tizen_visibility EINA_UNUSED, uint32_t type, uint32_t option)
596 Ecore_Wl2_Window *win = (Ecore_Wl2_Window *)data;
597 Ecore_Wl2_Event_Window_Pre_Visibility_Change *ev;
599 EINA_SAFETY_ON_NULL_RETURN(win);
601 if (type == TIZEN_VISIBILITY_VISIBILITY_PRE_UNOBSCURED)
603 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Pre_Visibility_Change));
604 EINA_SAFETY_ON_NULL_RETURN(ev);
607 ev->type = ECORE_WL2_WINDOW_VISIBILITY_TYPE_PRE_UNOBSCURED;
610 ecore_event_add(ECORE_WL2_EVENT_WINDOW_PRE_VISIBILITY_CHANGE, ev, NULL, NULL);
614 static const struct tizen_visibility_listener _tizen_visibility_listener =
616 _tizen_visibility_cb_notify,
617 _tizen_visibility_cb_changed,
621 _tizen_position_cb_changed(void *data, struct tizen_position *tizen_position EINA_UNUSED, int32_t x, int32_t y)
623 Ecore_Wl2_Window *win;
625 if (!(win = data)) return;
627 win->def_config.geometry.x = x;
628 win->def_config.geometry.y = y;
630 if (win->set_config.fullscreen) return;
631 if (win->set_config.maximized) return;
633 if ((x != win->set_config.geometry.x) || (y != win->set_config.geometry.y))
635 win->set_config.geometry.x = x;
636 win->set_config.geometry.y = y;
638 _ecore_wl2_window_configure_send(win);
642 static const struct tizen_position_listener _tizen_position_listener =
644 _tizen_position_cb_changed,
648 _tizen_rotation_preferred_angle_set(Ecore_Wl2_Window *window, int rot)
650 enum tizen_rotation_angle tz_angle = TIZEN_ROTATION_ANGLE_NONE;
657 tz_angle = TIZEN_ROTATION_ANGLE_0;
660 tz_angle = TIZEN_ROTATION_ANGLE_90;
663 tz_angle = TIZEN_ROTATION_ANGLE_180;
666 tz_angle = TIZEN_ROTATION_ANGLE_270;
672 if (window->tz_rotation)
673 tizen_rotation_set_preferred_angle(window->tz_rotation, (uint32_t)tz_angle);
677 _tizen_rotation_available_angles_set(Ecore_Wl2_Window *window, const int *rots, unsigned int count)
684 for (i = 0; i < count ; i++)
689 angles |= (uint32_t)TIZEN_ROTATION_ANGLE_0;
692 angles |= (uint32_t)TIZEN_ROTATION_ANGLE_90;
695 angles |= (uint32_t)TIZEN_ROTATION_ANGLE_180;
698 angles |= (uint32_t)TIZEN_ROTATION_ANGLE_270;
705 if (window->tz_rotation)
706 tizen_rotation_set_available_angles(window->tz_rotation, angles);
710 _ecore_wl_window_cb_available_angles_done(void *data EINA_UNUSED, struct tizen_rotation *tizen_rotation EINA_UNUSED, uint32_t angles EINA_UNUSED)
716 _ecore_wl_window_cb_preferred_angle_done(void *data EINA_UNUSED, struct tizen_rotation *tizen_rotation EINA_UNUSED, uint32_t angle EINA_UNUSED)
722 _ecore_wl_window_cb_angle_change(void *data, struct tizen_rotation *tizen_rotation EINA_UNUSED, uint32_t angle, uint32_t serial)
724 Ecore_Wl2_Window *win;
725 Ecore_Wl2_Event_Window_Rotation *ev;
728 if (!(win = data)) return;
729 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation)))) return;
730 DBG("PendingRotation: wayland rotation callback angle=%d serial=%d", angle, serial);
732 win->wm_rot.serial = serial;
735 ev->w = win->def_config.geometry.w;
736 ev->h = win->def_config.geometry.h;
738 //TIZEN_ONLY(20190128): Use set_config geometry
739 if (ev->w == 0 && ev->h == 0)
741 ev->w = win->set_config.geometry.w;
742 ev->h = win->set_config.geometry.h;
748 case TIZEN_ROTATION_ANGLE_0:
751 case TIZEN_ROTATION_ANGLE_90:
754 case TIZEN_ROTATION_ANGLE_180:
757 case TIZEN_ROTATION_ANGLE_270:
766 if (win->wm_rot.geometry_hints[i].valid)
768 ev->w = win->wm_rot.geometry_hints[i].w;
769 ev->h = win->wm_rot.geometry_hints[i].h;
772 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATE, ev, NULL, NULL);
773 // TIZEN_ONLY(20170212): pend rotation until app set rotation
774 //this code don't need. This code will be added opensource code.
775 //ecore_wl2_window_rotation_set(win, ev->angle);
780 _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)
782 Ecore_Wl2_Window *win = (Ecore_Wl2_Window *)data;
784 Ecore_Wl2_Event_Window_Rotation *ev = NULL;
786 EINA_SAFETY_ON_NULL_RETURN(win);
790 case TIZEN_ROTATION_ANGLE_0: rot = 0; break;
791 case TIZEN_ROTATION_ANGLE_90: rot = 90; break;
792 case TIZEN_ROTATION_ANGLE_180: rot = 180; break;
793 case TIZEN_ROTATION_ANGLE_270: rot = 270; break;
794 default: rot = 0; break;
797 if (win->cb_rot_changed)
799 win->wm_rot.serial = serial;
801 ecore_wl2_window_rotation_set(win, rot);
802 win->cb_rot_changed(win, rot, 0, width, height, win->cb_rot_changed_data);
805 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation)))) return;
807 win->wm_rot.serial = serial;
813 ev->resize = EINA_TRUE;
815 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATE, ev, NULL, NULL);
818 static const struct tizen_rotation_listener _ecore_tizen_rotation_listener =
820 _ecore_wl_window_cb_available_angles_done,
821 _ecore_wl_window_cb_preferred_angle_done,
822 _ecore_wl_window_cb_angle_change,
823 _ecore_wl_window_cb_angle_change_with_resize,
827 _tizen_resource_cb_resource_id(void *data, struct tizen_resource *tizen_resource EINA_UNUSED, uint32_t id)
829 Ecore_Wl2_Window *win;
830 Ecore_Wl2_Event_Window_Show *ev;
832 if (!(win = data)) return;
833 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Show)))) return;
837 ev->parent_win = win->parent->id;
840 ev->event_win = win->id;
841 ev->data[0] = (unsigned int)id;
842 win->resource_id = (unsigned int)id;
843 ecore_event_add(ECORE_WL2_EVENT_WINDOW_SHOW, ev, NULL, NULL);
846 static const struct tizen_resource_listener _tizen_resource_listener =
848 _tizen_resource_cb_resource_id,
852 //TIZEN_ONLY(20200707): support tizen_renderer_surface
854 _tizen_renderer_surface_cb_redraw_request(void *data, struct tizen_renderer_surface *renderer_surface EINA_UNUSED)
856 Ecore_Wl2_Window *win;
857 Ecore_Wl2_Event_Window_Redraw_Request *ev;
859 if (!(win = data)) return;
860 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Redraw_Request)))) return;
864 ecore_event_add(ECORE_WL2_EVENT_WINDOW_REDRAW_REQUEST, ev, NULL, NULL);
867 static const struct tizen_renderer_surface_listener _tizen_renderer_surface_listener =
869 _tizen_renderer_surface_cb_redraw_request,
873 // TIZEN_ONLY(20171112) : support tizen protocols
874 // to initialize wayland tizen extention protocols after surface creation
875 // such as tizen_policy, tizen_position, tizen_rotation, tizen_resource
876 // and handle transient parent(by tizen_policy) for surfaces without shell or xdg_shell
878 _ecore_wl2_window_tz_ext_init(Ecore_Wl2_Window *window)
881 if (!window->surface) return;
882 if (!window->display) return;
884 if (window->display->wl.tz_policy)
886 if (!window->tz_visibility)
888 window->tz_visibility =
889 tizen_policy_get_visibility(window->display->wl.tz_policy,
891 if (!window->tz_visibility) return;
892 tizen_visibility_add_listener(window->tz_visibility,
893 &_tizen_visibility_listener,
897 if (!window->tz_position)
900 window->tz_position =
901 tizen_policy_get_position(window->display->wl.tz_policy,
904 if (!window->tz_position) return;
905 tizen_position_add_listener(window->tz_position,
906 &_tizen_position_listener, window);
908 tizen_position_set(window->tz_position,
909 window->set_config.geometry.x, window->set_config.geometry.y);
915 tizen_policy_set_role(window->display->wl.tz_policy,
920 if (window->focus_skip)
923 tizen_policy_set_focus_skip(window->display->wl.tz_policy, window->surface);
928 tizen_policy_unset_focus_skip(window->display->wl.tz_policy, window->surface);
931 if (window->floating)
934 tizen_policy_set_floating_mode(window->display->wl.tz_policy,
939 if (window->display->wl.tz_policy_ext && !window->tz_rotation)
941 int i = 0, x, y, w, h, rot;
942 enum tizen_rotation_angle angle = TIZEN_ROTATION_ANGLE_NONE;
944 window->tz_rotation =
945 tizen_policy_ext_get_rotation(window->display->wl.tz_policy_ext,
947 if (!window->tz_rotation) return;
949 tizen_rotation_add_listener(window->tz_rotation,
950 &_ecore_tizen_rotation_listener, window);
952 if (window->wm_rot.preferred_rot != TIZEN_ROTATION_ANGLE_NONE)
954 _tizen_rotation_preferred_angle_set(window, window->wm_rot.preferred_rot);
957 if (window->wm_rot.count)
959 _tizen_rotation_available_angles_set(window, window->wm_rot.available_rots, window->wm_rot.count);
962 rot = ecore_wl2_window_rotation_get(window);
963 for (i = 0; i <= 3; i++)
965 if (!window->wm_rot.geometry_hints[i].valid) continue;
967 x = window->wm_rot.geometry_hints[i].x;
968 y = window->wm_rot.geometry_hints[i].y;
969 w = window->wm_rot.geometry_hints[i].w;
970 h = window->wm_rot.geometry_hints[i].h;
975 angle = TIZEN_ROTATION_ANGLE_0;
978 angle = TIZEN_ROTATION_ANGLE_90;
981 angle = TIZEN_ROTATION_ANGLE_180;
984 angle = TIZEN_ROTATION_ANGLE_270;
987 tizen_rotation_set_geometry_hint(window->tz_rotation,
988 (uint32_t)angle, x, y, w, h);
990 if ((rot == (i * 90)) &&
991 ((window->set_config.geometry.w != w) || (window->set_config.geometry.h != h)))
993 //TIZEN_ONLY(20180201) : add function to set window size by client.
994 window->set_config.geometry.w = w;
995 window->set_config.geometry.h = h;
996 _ecore_wl2_window_configure_send_by_client(window);
1002 if (window->display->wl.tz_surf && !window->tz_resource)
1004 window->tz_resource =
1005 tizen_surface_get_tizen_resource(window->display->wl.tz_surf, window->surface);
1006 if (!window->tz_resource) return;
1008 tizen_resource_add_listener(window->tz_resource,
1009 &_tizen_resource_listener, window);
1015 if (window->zxdg_surface && window->parent->zxdg_surface)
1017 // already handled above code
1019 else if (window->display->wl.tz_policy && window->surface && window->parent->surface)
1021 uint32_t ver = wl_proxy_get_version((struct wl_proxy *)window->display->wl.tz_policy);
1022 if (ver >= TIZEN_POLICY_SET_PARENT_WITH_BELOW_SINCE_VERSION)
1024 // for transient_for below
1025 if (window->below_child)
1026 tizen_policy_set_parent_with_below(window->display->wl.tz_policy, window->surface, window->parent->surface);
1028 tizen_policy_set_parent(window->display->wl.tz_policy, window->surface, window->parent->surface);
1031 tizen_policy_set_parent(window->display->wl.tz_policy, window->surface, window->parent->surface);
1035 if (window->display->wl.tz_renderer && !window->tz_renderer_surface)
1037 window->tz_renderer_surface =
1038 tizen_renderer_get_renderer_surface(window->display->wl.tz_renderer, window->surface);
1039 if (!window->tz_renderer_surface) return;
1041 tizen_renderer_surface_add_listener(window->tz_renderer_surface,
1042 &_tizen_renderer_surface_listener, window);
1045 // END of TIZEN_ONLY(20171112) : support tizen protocols
1048 _ecore_wl2_window_shell_surface_init(Ecore_Wl2_Window *window)
1050 if (!window->surface) return;
1051 if (window->display->wl.xdg_wm_base) _window_shell_surface_create(window);
1052 if (window->display->wl.zxdg_shell) _window_v6_shell_surface_create(window);
1054 if (window->display->wl.session_recovery)
1060 zwp_e_session_recovery_set_uuid(window->display->wl.session_recovery,
1061 window->surface, window->uuid);
1063 ecore_wl2_window_geometry_get(window, &gx, &gy, &gw, &gh);
1064 if (window->xdg_surface)
1065 xdg_surface_set_window_geometry(window->xdg_surface,
1067 if (window->zxdg_surface)
1068 zxdg_surface_v6_set_window_geometry(window->zxdg_surface,
1071 ecore_wl2_window_opaque_region_set(window,
1078 zwp_e_session_recovery_get_uuid(window->display->wl.session_recovery, window->surface);
1083 _surface_enter(void *data, struct wl_surface *surf EINA_UNUSED, struct wl_output *op)
1085 Ecore_Wl2_Window *win;
1086 Ecore_Wl2_Output *output;
1090 output = _ecore_wl2_output_find(win->display, op);
1091 EINA_SAFETY_ON_NULL_RETURN(output);
1093 win->outputs = eina_list_append(win->outputs, output);
1097 _surface_leave(void *data, struct wl_surface *surf EINA_UNUSED, struct wl_output *op)
1099 Ecore_Wl2_Window *win;
1100 Ecore_Wl2_Output *output;
1103 output = _ecore_wl2_output_find(win->display, op);
1104 EINA_SAFETY_ON_NULL_RETURN(output);
1106 win->outputs = eina_list_remove(win->outputs, output);
1109 Ecore_Wl2_Event_Window_Offscreen *ev;
1110 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Offscreen));
1114 ecore_event_add(ECORE_WL2_EVENT_WINDOW_OFFSCREEN, ev, NULL, NULL);
1119 static const struct wl_surface_listener _surface_listener =
1126 _ecore_wl2_window_surface_create(Ecore_Wl2_Window *window)
1128 if (!window->display->wl.compositor) return;
1130 if (!window->surface)
1133 wl_compositor_create_surface(window->display->wl.compositor);
1134 if (!window->surface)
1136 ERR("Failed to create surface for window");
1139 wl_surface_set_user_data(window->surface, window);
1141 //TIZEN_ONLY(20171115): support output transform
1142 if (window->display->wl.tz_screen_rotation)
1143 tizen_screen_rotation_get_ignore_output_transform(window->display->wl.tz_screen_rotation, window->surface);
1146 window->surface_id =
1147 wl_proxy_get_id((struct wl_proxy *)window->surface);
1149 wl_surface_add_listener(window->surface, &_surface_listener, window);
1150 if (window->display->wl.efl_aux_hints)
1152 efl_aux_hints_get_supported_aux_hints(window->display->wl.efl_aux_hints, window->surface);
1153 if (_ecore_wl2_display_sync_get())
1154 wl_display_roundtrip(window->display->wl.display);
1160 _ecore_wl2_window_show_send(Ecore_Wl2_Window *window)
1162 Ecore_Wl2_Event_Window_Show *ev;
1164 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Show));
1167 ev->win = window->id;
1169 ev->parent_win = window->parent->id;
1170 ev->event_win = window->id;
1171 window->visible = EINA_TRUE;
1172 ecore_event_add(ECORE_WL2_EVENT_WINDOW_SHOW, ev, NULL, NULL);
1176 _ecore_wl2_window_hide_send(Ecore_Wl2_Window *window)
1178 Ecore_Wl2_Event_Window_Hide *ev;
1180 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Hide));
1183 ev->win = window->id;
1185 ev->parent_win = window->parent->id;
1186 ev->event_win = window->id;
1187 window->visible = EINA_FALSE;
1188 ecore_event_add(ECORE_WL2_EVENT_WINDOW_HIDE, ev, NULL, NULL);
1192 _ecore_wl2_window_create_destroy_send(Ecore_Wl2_Window *window, Eina_Bool create)
1194 Ecore_Wl2_Event_Window_Common *ev;
1196 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Common));
1199 ev->win = window->id;
1201 ev->parent_win = window->parent->id;
1202 ev->event_win = window->id;
1204 if (create) ecore_event_add(ECORE_WL2_EVENT_WINDOW_CREATE, ev, NULL, NULL);
1205 else ecore_event_add(ECORE_WL2_EVENT_WINDOW_DESTROY, ev, NULL, NULL);
1208 EAPI Ecore_Wl2_Window *
1209 ecore_wl2_window_new(Ecore_Wl2_Display *display, Ecore_Wl2_Window *parent, int x, int y, int w, int h)
1211 Ecore_Wl2_Window *win;
1212 static int _win_id = 1;
1214 EINA_SAFETY_ON_NULL_RETURN_VAL(display, NULL);
1215 if (display->pid) CRI("CANNOT CREATE WINDOW WITH SERVER DISPLAY");
1217 /* try to allocate space for window structure */
1218 win = calloc(1, sizeof(Ecore_Wl2_Window));
1219 if (!win) return NULL;
1222 win->display = display;
1223 win->parent = parent;
1224 win->id = _win_id++;
1226 win->set_config.geometry.x = x;
1227 win->set_config.geometry.y = y;
1228 win->set_config.geometry.w = w;
1229 win->set_config.geometry.h = h;
1236 // TIZEN_ONLY(20180202) : Set default type to keep backward compat.
1237 win->type = ECORE_WL2_WINDOW_TYPE_TOPLEVEL;
1240 //TIZEN_ONLY(20171115): support output transform
1241 win->ignore_output_transform = EINA_TRUE;
1244 win->pending.configure = EINA_TRUE;
1246 eina_inlist_append(display->windows, EINA_INLIST_GET(win));
1248 _ecore_wl2_window_surface_create(win);
1250 //TIZEN_ONLY(20171216): add ecore_wl2_window_find
1251 eina_hash_add(_windows, _ecore_wl2_window_id_str_get(win->id), win);
1254 _ecore_wl2_input_devices_send(ecore_wl2_input_default_input_get(display), win);
1256 _ecore_wl2_window_create_destroy_send(win, EINA_TRUE);
1262 ecore_wl2_window_id_get(Ecore_Wl2_Window *window)
1264 EINA_SAFETY_ON_NULL_RETURN_VAL(window, -1);
1269 ecore_wl2_window_close_callback_set(Ecore_Wl2_Window *window, void (*cb) (void *data, Ecore_Wl2_Window *win), void *data)
1271 EINA_SAFETY_ON_NULL_RETURN(window);
1272 window->cb_close = cb;
1273 window->cb_close_data = data;
1277 ecore_wl2_window_visibility_callback_set(Ecore_Wl2_Window *window, void (*cb) (void *data, Ecore_Wl2_Window *win, Eina_Bool visibility), void *data)
1279 EINA_SAFETY_ON_NULL_RETURN(window);
1280 window->cb_visibility = cb;
1281 window->cb_visibility_data = data;
1284 EAPI struct wl_surface *
1285 ecore_wl2_window_surface_get(Ecore_Wl2_Window *window)
1287 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
1289 _ecore_wl2_window_surface_create(window);
1291 return window->surface;
1294 //TIZEN_ONLY(20200309): The 3rd party app may needs native surface handle.
1296 ecore_wl2_window_native_surface_get(Ecore_Wl2_Window *window)
1298 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
1300 _ecore_wl2_window_surface_create(window);
1302 return (void *)window->surface;
1307 ecore_wl2_window_surface_id_get(Ecore_Wl2_Window *window)
1309 EINA_SAFETY_ON_NULL_RETURN_VAL(window, -1);
1310 return window->surface_id;
1314 ecore_wl2_window_show(Ecore_Wl2_Window *window)
1316 EINA_SAFETY_ON_NULL_RETURN(window);
1318 _ecore_wl2_window_surface_create(window);
1320 if (window->input_set)
1321 ecore_wl2_window_input_region_set(window, window->input_rect.x,
1322 window->input_rect.y,
1323 window->input_rect.w,
1324 window->input_rect.h);
1325 if (window->opaque_set)
1326 ecore_wl2_window_opaque_region_set(window, window->opaque.x,
1327 window->opaque.y, window->opaque.w,
1330 if ((window->type != ECORE_WL2_WINDOW_TYPE_DND) &&
1331 (window->type != ECORE_WL2_WINDOW_TYPE_NONE))
1333 _ecore_wl2_window_shell_surface_init(window);
1334 _ecore_wl2_window_tz_ext_init(window); // TIZEN_ONLY(20171112) : support tizen protocols after surface creation
1335 _ecore_wl2_window_www_surface_init(window);
1336 _ecore_wl2_window_show_send(window);
1340 _ecore_wl2_window_tz_ext_init(window); // TIZEN_ONLY(20171112) : support tizen protocols after surface creation
1341 _configure_complete(window);
1344 // TIZEN_ONLY(20201125) : support tizen protocol to notify show request
1345 #ifdef TIZEN_POLICY_SHOW_SINCE_VERSION
1346 if (window->display->wl.tz_policy && window->surface)
1348 uint32_t ver = wl_proxy_get_version((struct wl_proxy *)window->display->wl.tz_policy);
1349 if (ver >= TIZEN_POLICY_SHOW_SINCE_VERSION)
1350 tizen_policy_show(window->display->wl.tz_policy, window->surface);
1357 ecore_wl2_window_hide(Ecore_Wl2_Window *window)
1359 EINA_SAFETY_ON_NULL_RETURN(window);
1361 // TIZEN_ONLY(20201125) : support tizen protocol to notify hide request
1362 #ifdef TIZEN_POLICY_HIDE_SINCE_VERSION
1363 if (window->display->wl.tz_policy && window->surface)
1365 uint32_t ver = wl_proxy_get_version((struct wl_proxy *)window->display->wl.tz_policy);
1366 if (ver >= TIZEN_POLICY_HIDE_SINCE_VERSION)
1367 tizen_policy_hide(window->display->wl.tz_policy, window->surface);
1372 _ecore_wl2_window_hide_send(window);
1374 // TIZEN_ONLY(20171112) : support tizen protocols
1375 if (window->tz_visibility) tizen_visibility_destroy(window->tz_visibility);
1376 window->tz_visibility = NULL;
1378 if (window->tz_resource) tizen_resource_destroy(window->tz_resource);
1379 window->tz_resource = NULL;
1382 if (window->commit_pending)
1384 /* We've probably been hidden while an animator
1385 * is ticking. Cancel the callback.
1387 window->commit_pending = EINA_FALSE;
1388 if (window->callback)
1390 wl_callback_destroy(window->callback);
1391 window->callback = NULL;
1395 if (window->surface)
1397 wl_surface_attach(window->surface, NULL, 0, 0);
1398 ecore_wl2_window_commit(window, EINA_TRUE);
1399 window->commit_pending = EINA_FALSE;
1402 /* The commit added a callback, disconnect it */
1403 if (window->callback)
1405 wl_callback_destroy(window->callback);
1406 window->callback = NULL;
1409 // TIZEN_ONLY(20180614) : destroy shell surface and its role
1410 if (window->zxdg_popup) zxdg_popup_v6_destroy(window->zxdg_popup);
1411 window->zxdg_popup = NULL;
1413 if (window->zxdg_toplevel) zxdg_toplevel_v6_destroy(window->zxdg_toplevel);
1414 window->zxdg_toplevel = NULL;
1416 if (window->zxdg_surface) zxdg_surface_v6_destroy(window->zxdg_surface);
1417 window->zxdg_surface = NULL;
1418 // END of TIZEN_ONLY(20180614)
1420 // TIZEN_ONLY(20181011) : destroy shell surface and its role
1421 if (window->xdg_popup) xdg_popup_destroy(window->xdg_popup);
1422 window->xdg_popup = NULL;
1424 if (window->xdg_toplevel) xdg_toplevel_destroy(window->xdg_toplevel);
1425 window->xdg_toplevel = NULL;
1427 if (window->xdg_surface) xdg_surface_destroy(window->xdg_surface);
1428 window->xdg_surface = NULL;
1429 // END of TIZEN_ONLY(20181011)
1431 window->set_config.serial = 0;
1432 window->req_config.serial = 0;
1433 window->def_config.serial = 0;
1434 window->zxdg_configure_ack = NULL;
1435 window->xdg_configure_ack = NULL;
1436 window->xdg_set_min_size = NULL;
1437 window->xdg_set_max_size = NULL;
1438 window->zxdg_set_min_size = NULL;
1439 window->zxdg_set_max_size = NULL;
1443 _ecore_wl2_window_aux_hint_free(Ecore_Wl2_Window *win)
1445 const char *supported;
1447 EINA_LIST_FREE(win->supported_aux_hints, supported)
1448 if (supported) eina_stringshare_del(supported);
1451 // TIZEN_ONLY(20200601): support sync between ui and video
1453 _ecore_wl2_window_video_surface_destroy(Ecore_Wl2_Window *win)
1455 if (win->video.viewport)
1457 tizen_viewport_destroy(win->video.viewport);
1458 win->video.viewport = NULL;
1460 if (win->video.wl_buffer)
1462 wayland_tbm_client_destroy_buffer(win->tbm_client, win->video.wl_buffer);
1463 win->video.wl_buffer = NULL;
1466 if (win->video.tbm_surface)
1468 tbm_surface_destroy(win->video.tbm_surface);
1469 win->video.tbm_surface = NULL;
1472 if (win->video.subsurface)
1474 wl_subsurface_destroy(win->video.subsurface);
1475 win->video.subsurface = NULL;
1477 if (win->video.surface)
1479 wl_surface_destroy(win->video.surface);
1480 win->video.surface = NULL;
1486 ecore_wl2_window_free(Ecore_Wl2_Window *window)
1488 Ecore_Wl2_Display *display;
1489 Ecore_Wl2_Input *input;
1490 Ecore_Wl2_Subsurface *subsurf;
1492 Ecore_Wl2_Window_Aux_Hint *hint;
1494 EINA_SAFETY_ON_NULL_RETURN(window);
1496 // TIZEN_ONLY(20210330): for maintain internal aux hint list
1497 EINA_LIST_FREE(window->aux_hints, hint)
1499 eina_stringshare_del(hint->hint);
1500 eina_stringshare_del(hint->val);
1504 //TIZEN_ONLY(20171216): add ecore_wl2_window_find
1505 eina_hash_del(_windows, _ecore_wl2_window_id_str_get(window->id), window);
1508 if (window->visible) _ecore_wl2_window_hide_send(window);
1510 _ecore_wl2_window_create_destroy_send(window, EINA_FALSE);
1512 display = window->display;
1514 EINA_INLIST_FOREACH(display->inputs, input)
1515 _ecore_wl2_input_window_remove(input, window);
1517 EINA_INLIST_FOREACH_SAFE(window->subsurfs, tmp, subsurf)
1518 _ecore_wl2_subsurf_free(subsurf);
1520 _ecore_wl2_window_aux_hint_free(window);
1522 // TIZEN_ONLY(20171112) : support tizen protocols
1523 if (window->tz_visibility) tizen_visibility_destroy(window->tz_visibility);
1524 window->tz_visibility = NULL;
1526 if (window->tz_position) tizen_position_destroy(window->tz_position);
1527 window->tz_position = NULL;
1529 if (window->tz_rotation) tizen_rotation_destroy(window->tz_rotation);
1530 window->tz_rotation = NULL;
1532 if (window->tz_resource) tizen_resource_destroy(window->tz_resource);
1533 window->tz_resource = NULL;
1536 // TIZEN_ONLY(20200601): support sync between ui and video
1537 _ecore_wl2_window_video_surface_destroy(window);
1539 if (window->tbm_client)
1541 wayland_tbm_client_deinit(window->tbm_client);
1542 window->tbm_client = NULL;
1546 if (window->callback) wl_callback_destroy(window->callback);
1547 window->callback = NULL;
1549 if (window->uuid && window->surface && window->display->wl.session_recovery)
1550 zwp_e_session_recovery_destroy_uuid(window->display->wl.session_recovery,
1551 window->surface, window->uuid);
1553 _ecore_wl2_window_semi_free(window);
1555 eina_stringshare_replace(&window->uuid, NULL);
1557 if (window->title) eina_stringshare_del(window->title);
1558 if (window->class) eina_stringshare_del(window->class);
1559 if (window->role) eina_stringshare_del(window->role);
1560 // TIZEN_ONLY(20160201) : support to handle input rectangle
1561 if (window->input_region) wl_region_destroy(window->input_region);
1562 window->input_region = NULL;
1565 if (window->wm_rot.available_rots) free(window->wm_rot.available_rots);
1566 window->wm_rot.available_rots = NULL;
1569 eina_inlist_remove(display->windows, EINA_INLIST_GET(window));
1571 ecore_wl2_display_disconnect(window->display);
1576 ecore_wl2_window_move(Ecore_Wl2_Window *window, Ecore_Wl2_Input *input)
1578 EINA_SAFETY_ON_NULL_RETURN(window);
1579 EINA_SAFETY_ON_NULL_RETURN(window->display->inputs);
1583 ERR("NULL input parameter is deprecated");
1584 input = EINA_INLIST_CONTAINER_GET(window->display->inputs, Ecore_Wl2_Input);
1586 if (window->xdg_toplevel)
1587 xdg_toplevel_move(window->xdg_toplevel, input->wl.seat,
1588 window->display->serial);
1589 if (window->zxdg_toplevel)
1590 zxdg_toplevel_v6_move(window->zxdg_toplevel, input->wl.seat,
1591 window->display->serial);
1592 ecore_wl2_display_flush(window->display);
1594 _ecore_wl2_input_ungrab(input);
1598 ecore_wl2_window_resize(Ecore_Wl2_Window *window, Ecore_Wl2_Input *input, int location)
1600 EINA_SAFETY_ON_NULL_RETURN(window);
1601 EINA_SAFETY_ON_NULL_RETURN(window->display->inputs);
1605 ERR("NULL input parameter is deprecated");
1606 input = EINA_INLIST_CONTAINER_GET(window->display->inputs, Ecore_Wl2_Input);
1609 if (window->xdg_toplevel)
1610 xdg_toplevel_resize(window->xdg_toplevel, input->wl.seat,
1611 window->display->serial, location);
1612 if (window->zxdg_toplevel)
1613 zxdg_toplevel_v6_resize(window->zxdg_toplevel, input->wl.seat,
1614 window->display->serial, location);
1615 ecore_wl2_display_flush(window->display);
1617 _ecore_wl2_input_ungrab(input);
1621 ecore_wl2_window_raise(Ecore_Wl2_Window *window)
1623 EINA_SAFETY_ON_NULL_RETURN(window);
1624 EINA_SAFETY_ON_NULL_RETURN(window->display);
1626 // TIZEN_ONLY(20171114)
1628 if (window->zxdg_toplevel)
1630 struct wl_array states;
1633 wl_array_init(&states);
1634 s = wl_array_add(&states, sizeof(*s));
1635 *s = ZXDG_TOPLEVEL_V6_STATE_ACTIVATED;
1636 _zxdg_toplevel_cb_configure(window, window->zxdg_toplevel,
1637 window->set_config.geometry.w,
1638 window->set_config.geometry.h, &states);
1639 wl_array_release(&states);
1642 if ((window->surface) && (window->display->wl.tz_policy))
1643 tizen_policy_raise(window->display->wl.tz_policy, window->surface);
1648 ecore_wl2_window_lower(Ecore_Wl2_Window *window)
1650 Ecore_Wl2_Event_Window_Lower *ev;
1652 EINA_SAFETY_ON_NULL_RETURN(window);
1653 EINA_SAFETY_ON_NULL_RETURN(window->display);
1655 /* FIXME: This should lower the xdg surface also */
1656 if (window->display->wl.tz_policy)
1658 tizen_policy_lower(window->display->wl.tz_policy, window->surface);
1660 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Lower)))) return;
1662 ev->win = window->id;
1663 ecore_event_add(ECORE_WL2_EVENT_WINDOW_LOWER, ev, NULL, NULL);
1668 ecore_wl2_window_activate(Ecore_Wl2_Window *window)
1672 EINA_SAFETY_ON_NULL_RETURN(window);
1673 EINA_SAFETY_ON_NULL_RETURN(window->display);
1675 iconic = ecore_wl2_window_iconified_get(window);
1677 ecore_wl2_window_iconified_set(window, EINA_FALSE);
1679 if (window->display->wl.tz_policy)
1680 tizen_policy_activate(window->display->wl.tz_policy, window->surface);
1684 ecore_wl2_window_parent_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window *parent)
1686 EINA_SAFETY_ON_NULL_RETURN(window);
1687 window->parent = parent;
1688 // TIZEN_ONLY(20210903): for transient_for below
1689 window->below_child = EINA_FALSE;
1692 // TIZEN_ONLY(20171114)
1695 if (window->zxdg_surface && window->parent->zxdg_surface)
1697 struct zxdg_toplevel_v6 *ptop = NULL;
1699 ptop = window->parent->zxdg_toplevel;
1701 zxdg_toplevel_v6_set_parent(window->zxdg_toplevel, ptop);
1703 else if (window->display->wl.tz_policy && window->surface && window->parent->surface)
1705 uint32_t ver = wl_proxy_get_version((struct wl_proxy *)window->display->wl.tz_policy);
1707 tizen_policy_set_parent(window->display->wl.tz_policy, window->surface, window->parent->surface);
1712 if (window->zxdg_surface)
1713 zxdg_toplevel_v6_set_parent(window->zxdg_toplevel, NULL);
1718 // TIZEN_ONLY(20210721) : for below child
1720 _ecore_wl2_window_parent_set_with_below(Ecore_Wl2_Window *window, Ecore_Wl2_Window *parent)
1722 window->parent = parent;
1723 window->below_child = EINA_TRUE;
1726 if (window->parent->surface)
1727 tizen_policy_set_parent_with_below(window->display->wl.tz_policy, window->surface, window->parent->surface);
1729 ERR("Fail to set parent below. Parent window's surface doesn't exist.");
1733 tizen_policy_set_parent_with_below(window->display->wl.tz_policy, window->surface, NULL);
1738 ecore_wl2_window_transient_parent_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window *parent, Eina_Bool place_below)
1740 EINA_SAFETY_ON_NULL_RETURN(window);
1741 EINA_SAFETY_ON_NULL_RETURN(window->surface);
1742 EINA_SAFETY_ON_NULL_RETURN(window->display->wl.tz_policy);
1744 uint32_t ver = wl_proxy_get_version((struct wl_proxy *)window->display->wl.tz_policy);
1745 if (ver < TIZEN_POLICY_SET_PARENT_WITH_BELOW_SINCE_VERSION)
1747 ERR("ecore_wl2_window_transient_parent_set is not supported in this version:%d (required version:%d)",
1748 ver, TIZEN_POLICY_SET_PARENT_WITH_BELOW_SINCE_VERSION);
1749 ecore_wl2_window_parent_set(window, parent);
1754 _ecore_wl2_window_parent_set_with_below(window, parent);
1756 ecore_wl2_window_parent_set(window, parent);
1761 ecore_wl2_window_stack_mode_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window_Stack_Mode mode)
1763 EINA_SAFETY_ON_NULL_RETURN(window);
1764 EINA_SAFETY_ON_NULL_RETURN(window->display);
1766 if ((window->surface) && (window->display->wl.tz_policy))
1767 tizen_policy_set_stack_mode(window->display->wl.tz_policy, window->surface, mode);
1771 ecore_wl2_window_position_set(Ecore_Wl2_Window *window, int x, int y)
1773 EINA_SAFETY_ON_NULL_RETURN(window);
1775 if ((window->set_config.geometry.x != x) ||
1776 (window->set_config.geometry.y != y))
1777 window->pending.geom = EINA_TRUE;
1779 window->set_config.geometry.x = x;
1780 window->set_config.geometry.y = y;
1782 if ((window->surface) && (window->tz_position))
1784 if ((window->def_config.geometry.x != x) || (window->def_config.geometry.y != y))
1785 tizen_position_set(window->tz_position, x, y);
1790 ecore_wl2_window_active_angle_get(Ecore_Wl2_Window *window)
1792 struct wl_surface *surface = NULL;
1794 EINA_SAFETY_ON_NULL_RETURN_VAL(window, 0);
1795 EINA_SAFETY_ON_NULL_RETURN_VAL(window->display, 0);
1797 if (!window->display->wl.tz_policy_ext) return 0;
1799 surface = ecore_wl2_window_surface_get(window);
1801 tizen_policy_ext_get_active_angle(window->display->wl.tz_policy_ext, surface);
1802 ecore_wl2_display_sync(window->display);
1804 return window->display->active_angle;
1809 ecore_wl2_window_alpha_get(Ecore_Wl2_Window *window)
1811 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
1813 return window->alpha;
1817 ecore_wl2_window_alpha_set(Ecore_Wl2_Window *window, Eina_Bool alpha)
1819 Ecore_Wl2_Surface *surf = NULL;
1821 EINA_SAFETY_ON_NULL_RETURN(window);
1823 if (window->alpha == alpha) return;
1825 window->alpha = alpha;
1826 surf = window->wl2_surface;
1828 ecore_wl2_surface_reconfigure(surf, surf->w, surf->h, 0, alpha);
1830 // TIZEN_ONLY(20170203)
1833 ecore_wl2_window_opaque_region_set(window, window->opaque.x,
1834 window->opaque.y, window->opaque.w,
1836 // TIZEN_ONLY(20190910) : set opaque_set and pending.opaque value by force
1837 window->opaque_set = window->opaque.x || window->opaque.y || window->opaque.w || window->opaque.h;
1838 _opaque_set(window);
1841 else if (window->surface)
1842 _opaque_region_set(window, NULL);
1847 ecore_wl2_window_transparent_set(Ecore_Wl2_Window *window, Eina_Bool transparent)
1849 EINA_SAFETY_ON_NULL_RETURN(window);
1851 if (window->transparent == transparent) return;
1853 window->transparent = transparent;
1855 if (!window->transparent)
1857 ecore_wl2_window_opaque_region_set(window, window->opaque.x,
1858 window->opaque.y, window->opaque.w,
1860 // TIZEN_ONLY(20190910) : set opaque_set and pending.opaque value by force
1861 window->opaque_set = window->opaque.x || window->opaque.y || window->opaque.w || window->opaque.h;
1862 _opaque_set(window);
1865 // TIZEN_ONLY(20170203)
1868 ecore_wl2_window_opaque_region_set(window, 0, 0, 0, 0);
1870 else if (window->surface)
1871 _opaque_region_set(window, NULL);
1875 // TIZEN_ONLY(20171108) : Get a window's transparent property
1877 ecore_wl2_window_transparent_get(Ecore_Wl2_Window *window)
1879 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
1881 return window->transparent;
1886 ecore_wl2_window_opaque_region_set(Ecore_Wl2_Window *window, int x, int y, int w, int h)
1888 int nx = 0, ny = 0, nw = 0, nh = 0;
1890 EINA_SAFETY_ON_NULL_RETURN(window);
1892 switch (window->rotation)
1922 if ((window->opaque.x == nx) && (window->opaque.y == ny) &&
1923 (window->opaque.w == nw) && (window->opaque.h == nh))
1926 window->opaque.x = nx;
1927 window->opaque.y = ny;
1928 window->opaque.w = nw;
1929 window->opaque.h = nh;
1931 // TIZEN_ONLY(20180412) : check transparent and alpha value
1932 if ((window->transparent) || (window->alpha))
1936 window->opaque_set = x || y || w || h;
1937 window->pending.opaque = EINA_TRUE;
1940 // TIZEN_ONLY(20160201) : support to handle input rectangle
1942 ecore_wl2_window_input_rect_set(Ecore_Wl2_Window *win, Eina_Rectangle *input_rect)
1945 if (!input_rect) return;
1946 if (win->input_region)
1948 wl_region_destroy(win->input_region);
1949 win->input_region = NULL;
1952 win->input_rect.x = input_rect->x;
1953 win->input_rect.y = input_rect->y;
1954 win->input_rect.w = input_rect->w;
1955 win->input_rect.h = input_rect->h;
1957 if (win->type != ECORE_WL2_WINDOW_TYPE_DND)
1959 struct wl_region *region;
1960 region = wl_compositor_create_region(win->display->wl.compositor);
1961 if (!region) return;
1963 wl_region_add(region, input_rect->x, input_rect->y, input_rect->w, input_rect->h);
1964 wl_surface_set_input_region(win->surface, region);
1965 wl_region_destroy(region);
1970 ecore_wl2_window_input_rect_add(Ecore_Wl2_Window *win, Eina_Rectangle *input_rect)
1973 if (!input_rect) return;
1974 if (input_rect->x < 0 || input_rect->y < 0) return;
1976 if (win->type != ECORE_WL2_WINDOW_TYPE_DND)
1978 if (!win->input_region)
1980 struct wl_region *region;
1981 region = wl_compositor_create_region(win->display->wl.compositor);
1982 if (!region) return;
1984 win->input_region = region;
1987 wl_region_add(win->input_region, input_rect->x, input_rect->y, input_rect->w, input_rect->h);
1988 wl_surface_set_input_region(win->surface, win->input_region);
1993 ecore_wl2_window_input_rect_subtract(Ecore_Wl2_Window *win, Eina_Rectangle *input_rect)
1996 if (!input_rect) return;
1997 if (input_rect->x < 0 || input_rect->y < 0) return;
1998 if (!win->input_region) return;
2000 if (win->type != ECORE_WL2_WINDOW_TYPE_DND)
2002 wl_region_subtract(win->input_region, input_rect->x, input_rect->y, input_rect->w, input_rect->h);
2003 wl_surface_set_input_region(win->surface, win->input_region);
2009 ecore_wl2_window_opaque_region_get(Ecore_Wl2_Window *window, int *x, int *y, int *w, int *h)
2011 EINA_SAFETY_ON_NULL_RETURN(window);
2013 if (x) *x = window->opaque.x;
2014 if (y) *y = window->opaque.y;
2015 if (w) *w = window->opaque.w;
2016 if (h) *h = window->opaque.h;
2020 ecore_wl2_window_input_region_set(Ecore_Wl2_Window *window, int x, int y, int w, int h)
2022 int nx = 0, ny = 0, nw = 0, nh = 0;
2024 EINA_SAFETY_ON_NULL_RETURN(window);
2026 switch (window->rotation)
2056 if ((window->input_rect.x == nx) && (window->input_rect.y == ny) &&
2057 (window->input_rect.w == nw) && (window->input_rect.h == nh))
2060 window->input_rect.x = nx;
2061 window->input_rect.y = ny;
2062 window->input_rect.w = nw;
2063 window->input_rect.h = nh;
2064 window->input_set = x || y || w || h;
2065 window->pending.input = EINA_TRUE;
2069 ecore_wl2_window_input_region_get(Ecore_Wl2_Window *window, int *x, int *y, int *w, int *h)
2071 EINA_SAFETY_ON_NULL_RETURN(window);
2073 if (x) *x = window->input_rect.x;
2074 if (y) *y = window->input_rect.y;
2075 if (w) *w = window->input_rect.w;
2076 if (h) *h = window->input_rect.h;
2080 ecore_wl2_window_maximized_get(Ecore_Wl2_Window *window)
2082 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2084 return window->set_config.maximized;
2088 _ecore_wl2_window_maximized_direction_set(Ecore_Wl2_Window *window, Ecore_Wl2_Maximize_Direction direction)
2090 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2091 EINA_SAFETY_ON_NULL_RETURN_VAL(window->surface, EINA_FALSE);
2092 EINA_SAFETY_ON_NULL_RETURN_VAL(window->display->wl.tz_policy, EINA_FALSE);
2094 window->maximize_direction = direction;
2096 uint32_t ver = wl_proxy_get_version((struct wl_proxy *)window->display->wl.tz_policy);
2098 #ifdef TIZEN_POLICY_SET_MAXIMIZE_DIRECTION_SINCE_VERSION
2099 if (ver < TIZEN_POLICY_SET_MAXIMIZE_DIRECTION_SINCE_VERSION)
2101 ERR("[WINDOW] Maximize direction is not supported on this version(%d). It is supported since version %d.",
2102 ver, TIZEN_POLICY_SET_MAXIMIZE_DIRECTION_SINCE_VERSION);
2106 tizen_policy_set_maximize_direction(window->display->wl.tz_policy, window->surface, direction);
2115 ecore_wl2_window_maximized_set_with_direction(Ecore_Wl2_Window *window, Ecore_Wl2_Maximize_Direction direction)
2117 Eina_Bool maximized = EINA_TRUE;
2118 Eina_Bool changed_maximize_state = EINA_FALSE;
2120 EINA_SAFETY_ON_NULL_RETURN(window);
2122 if (window->maximize_direction == direction)
2124 ERR("[WINDOW] win:%d, SAME direction:%d... so return.......", window->resource_id, direction);
2128 _ecore_wl2_window_maximized_direction_set(window, direction);
2130 if (direction == ECORE_WL2_MAXIMIZE_DIRECTION_NONE)
2131 maximized = EINA_FALSE;
2133 if (window->set_config.maximized != maximized)
2134 changed_maximize_state = EINA_TRUE;
2136 window->set_config.maximized = maximized;
2137 if (window->updating)
2139 window->pending.maximized = EINA_TRUE;
2143 if (changed_maximize_state)
2147 if (!window->set_config.fullscreen)
2148 window->saved = window->set_config.geometry;
2150 if (window->xdg_toplevel)
2151 xdg_toplevel_set_maximized(window->xdg_toplevel);
2152 if (window->zxdg_toplevel)
2153 zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
2157 if (window->xdg_toplevel)
2158 xdg_toplevel_unset_maximized(window->xdg_toplevel);
2159 if (window->zxdg_toplevel)
2160 zxdg_toplevel_v6_unset_maximized(window->zxdg_toplevel);
2164 /* TIZEN_ONLY(20190522): The window properties of ecore_evas are updated in
2165 * _ecore_evas_wl_common_cb_window_configure.
2166 * To call _ecore_evas_wl_common_cb_window_configure,
2167 * ECORE_WL2_EVENT_WINDOW_CONFIGURE event is added.
2168 * To add ECORE_WL2_EVENT_WINDOW_CONFIGURE event,
2169 * _ecore_wl2_window_configure_send is called. */
2170 _ecore_wl2_window_configure_send(window);
2171 /* END of TIZEN_ONLY(20190522) */
2172 ecore_wl2_display_flush(window->display);
2176 ecore_wl2_window_maximized_set(Ecore_Wl2_Window *window, Eina_Bool maximized)
2179 ecore_wl2_window_maximized_set_with_direction(window, ECORE_WL2_MAXIMIZE_DIRECTION_ALL);
2181 ecore_wl2_window_maximized_set_with_direction(window, ECORE_WL2_MAXIMIZE_DIRECTION_NONE);
2185 ecore_wl2_window_fullscreen_get(Ecore_Wl2_Window *window)
2187 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2189 return window->set_config.fullscreen;
2193 ecore_wl2_window_fullscreen_set(Ecore_Wl2_Window *window, Eina_Bool fullscreen)
2197 EINA_SAFETY_ON_NULL_RETURN(window);
2199 prev = window->set_config.fullscreen;
2200 fullscreen = !!fullscreen;
2201 if (prev == fullscreen) return;
2203 window->set_config.fullscreen = fullscreen;
2204 if (window->updating)
2206 window->pending.fullscreen = EINA_TRUE;
2212 if (!window->set_config.maximized)
2213 window->saved = window->set_config.geometry;
2215 if (window->xdg_toplevel)
2216 xdg_toplevel_set_fullscreen(window->xdg_toplevel, NULL);
2217 if (window->zxdg_toplevel)
2218 zxdg_toplevel_v6_set_fullscreen(window->zxdg_toplevel, NULL);
2222 if (window->xdg_toplevel)
2223 xdg_toplevel_unset_fullscreen(window->xdg_toplevel);
2224 if (window->zxdg_toplevel)
2225 zxdg_toplevel_v6_unset_fullscreen(window->zxdg_toplevel);
2227 /* TIZEN_ONLY(20190522): The window properties of ecore_evas are updated in
2228 * _ecore_evas_wl_common_cb_window_configure.
2229 * To call _ecore_evas_wl_common_cb_window_configure,
2230 * ECORE_WL2_EVENT_WINDOW_CONFIGURE event is added.
2231 * To add ECORE_WL2_EVENT_WINDOW_CONFIGURE event,
2232 * _ecore_wl2_window_configure_send is called. */
2233 _ecore_wl2_window_configure_send(window);
2234 /* END of TIZEN_ONLY(20190522) */
2235 ecore_wl2_display_flush(window->display);
2239 ecore_wl2_window_rotation_get(Ecore_Wl2_Window *window)
2241 EINA_SAFETY_ON_NULL_RETURN_VAL(window, -1);
2243 return window->rotation;
2247 ecore_wl2_window_rotation_set(Ecore_Wl2_Window *window, int rotation)
2249 EINA_SAFETY_ON_NULL_RETURN(window);
2251 window->rotation = rotation;
2255 ecore_wl2_window_title_set(Ecore_Wl2_Window *window, const char *title)
2257 EINA_SAFETY_ON_NULL_RETURN(window);
2259 eina_stringshare_replace(&window->title, title);
2260 if (!window->title) return;
2261 if (!window->xdg_toplevel && !window->zxdg_toplevel) return;
2263 if (window->xdg_toplevel)
2264 xdg_toplevel_set_title(window->xdg_toplevel, window->title);
2265 if (window->zxdg_toplevel)
2266 zxdg_toplevel_v6_set_title(window->zxdg_toplevel, window->title);
2267 ecore_wl2_display_flush(window->display);
2271 ecore_wl2_window_title_get(Ecore_Wl2_Window *window)
2273 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2275 return window->title ? window->title : NULL;
2279 ecore_wl2_window_class_set(Ecore_Wl2_Window *window, const char *clas)
2281 EINA_SAFETY_ON_NULL_RETURN(window);
2283 eina_stringshare_replace(&window->class, clas);
2284 if (!window->class) return;
2285 if (!window->xdg_toplevel && !window->zxdg_toplevel) return;
2287 if (window->xdg_toplevel)
2288 xdg_toplevel_set_app_id(window->xdg_toplevel, window->class);
2289 if (window->zxdg_toplevel)
2290 zxdg_toplevel_v6_set_app_id(window->zxdg_toplevel, window->class);
2291 ecore_wl2_display_flush(window->display);
2295 ecore_wl2_window_class_get(Ecore_Wl2_Window *window)
2297 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2299 return window->class ? window->class : NULL;
2303 ecore_wl2_window_geometry_get(Ecore_Wl2_Window *window, int *x, int *y, int *w, int *h)
2305 EINA_SAFETY_ON_NULL_RETURN(window);
2307 if (x) *x = window->set_config.geometry.x;
2308 if (y) *y = window->set_config.geometry.y;
2309 if (w) *w = window->set_config.geometry.w;
2310 if (h) *h = window->set_config.geometry.h;
2314 ecore_wl2_window_geometry_set(Ecore_Wl2_Window *window, int x, int y, int w, int h)
2316 EINA_SAFETY_ON_NULL_RETURN(window);
2318 if ((window->set_config.geometry.x == x) &&
2319 (window->set_config.geometry.y == y) &&
2320 (window->set_config.geometry.w == w) &&
2321 (window->set_config.geometry.h == h))
2324 window->set_config.geometry.x = x;
2325 window->set_config.geometry.y = y;
2326 window->set_config.geometry.w = w;
2327 window->set_config.geometry.h = h;
2328 window->pending.geom = EINA_TRUE;
2331 //TIZEN_ONLY(20220325): added min / max size set to window
2333 ecore_wl2_window_minimum_size_set(Ecore_Wl2_Window *window, int w, int h)
2335 EINA_SAFETY_ON_NULL_RETURN(window);
2337 if (window->zxdg_set_min_size && window->zxdg_toplevel)
2339 window->zxdg_set_min_size(window->zxdg_toplevel, w, h);
2340 window->pending.min = 0;
2343 if (window->xdg_set_min_size && window->xdg_toplevel)
2345 window->xdg_set_min_size(window->xdg_toplevel, w, h);
2346 window->pending.min = 0;
2352 ecore_wl2_window_maximum_size_set(Ecore_Wl2_Window *window, int w, int h)
2354 EINA_SAFETY_ON_NULL_RETURN(window);
2356 if (window->zxdg_set_max_size && window->zxdg_toplevel)
2358 window->zxdg_set_max_size(window->zxdg_toplevel, w, h);
2359 window->pending.max = 0;
2362 if (window->xdg_set_max_size && window->xdg_toplevel)
2364 window->xdg_set_max_size(window->xdg_toplevel, w, h);
2365 window->pending.max = 0;
2372 ecore_wl2_window_iconified_get(Ecore_Wl2_Window *window)
2374 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2376 // TIZEN_ONLY(20150822)
2377 if (window->display->wl.tz_policy)
2378 return window->iconified;
2381 return window->set_config.minimized;
2384 // TIZEN_ONLY(20151231) : handling iconic state on tizen
2386 _ecore_wl2_window_iconified_set(Ecore_Wl2_Window *window, Eina_Bool iconified, Eina_Bool send_event)
2390 EINA_SAFETY_ON_NULL_RETURN(window);
2392 prev = window->set_config.minimized;
2393 iconified = !!iconified;
2394 if (prev == iconified) return;
2396 window->set_config.minimized = iconified;
2400 if ((window->surface) && (window->display->wl.tz_policy))
2403 tizen_policy_iconify(window->display->wl.tz_policy, window->surface);
2404 window->iconified = EINA_TRUE;
2407 else if (window->zxdg_toplevel)
2408 zxdg_toplevel_v6_set_minimized(window->zxdg_toplevel);
2412 if ((window->surface) && (window->display->wl.tz_policy))
2415 tizen_policy_uniconify(window->display->wl.tz_policy, window->surface);
2416 window->iconified = EINA_FALSE;
2419 else if (window->zxdg_toplevel)
2421 struct wl_array states;
2424 wl_array_init(&states);
2425 s = wl_array_add(&states, sizeof(*s));
2426 *s = ZXDG_TOPLEVEL_V6_STATE_ACTIVATED;
2427 _zxdg_toplevel_cb_configure(window, window->zxdg_toplevel,
2429 window->saved.h, &states);
2430 wl_array_release(&states);
2436 Ecore_Wl2_Event_Window_Iconify_State_Change *ev;
2438 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Iconify_State_Change)))) return;
2439 ev->win = window->id;
2440 ev->iconified = iconified;
2442 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE, ev, NULL, NULL);
2448 ecore_wl2_window_iconified_set(Ecore_Wl2_Window *window, Eina_Bool iconified)
2450 // TIZEN_ONLY(20151231) : handling iconic state on tizen
2454 EINA_SAFETY_ON_NULL_RETURN(window);
2456 prev = window->set_config.minimized;
2457 iconified = !!iconified;
2458 if (prev == iconified) return;
2460 window->set_config.minimized = iconified;
2464 if (window->xdg_toplevel)
2465 xdg_toplevel_set_minimized(window->xdg_toplevel);
2466 if (window->zxdg_toplevel)
2467 zxdg_toplevel_v6_set_minimized(window->zxdg_toplevel);
2468 ecore_wl2_display_flush(window->display);
2471 _ecore_wl2_window_iconified_set(window, iconified, EINA_TRUE);
2475 // TIZEN_ONLY(20151231) : handling iconic state on tizen
2477 ecore_wl2_window_iconify_state_update(Ecore_Wl2_Window *window, Eina_Bool iconified, Eina_Bool send_event)
2479 _ecore_wl2_window_iconified_set(window, iconified, send_event);
2483 //TIZEN_ONLY(20171216): add ecore_wl2_window_find
2484 EAPI Ecore_Wl2_Window *
2485 ecore_wl2_window_find(unsigned int id)
2487 Ecore_Wl2_Window *win = NULL;
2489 if (!_windows) return NULL;
2490 win = eina_hash_find(_windows, _ecore_wl2_window_id_str_get(id));
2495 //TIZEN_ONLY(20180202): Fix to send a proper window type value to the server
2496 static inline uint32_t
2497 _convert_to_tzsh_type(Ecore_Wl2_Window_Type type)
2501 case ECORE_WL2_WINDOW_TYPE_NONE:
2502 return TIZEN_POLICY_WIN_TYPE_NONE;
2503 case ECORE_WL2_WINDOW_TYPE_TOPLEVEL:
2504 return TIZEN_POLICY_WIN_TYPE_TOPLEVEL;
2505 case ECORE_WL2_WINDOW_TYPE_MENU:
2506 return TIZEN_POLICY_WIN_TYPE_MENU;
2507 case ECORE_WL2_WINDOW_TYPE_DND:
2508 return TIZEN_POLICY_WIN_TYPE_DND;
2509 case ECORE_WL2_WINDOW_TYPE_CUSTOM:
2510 return TIZEN_POLICY_WIN_TYPE_CUSTOM;
2511 case ECORE_WL2_WINDOW_TYPE_NOTIFICATION:
2512 return TIZEN_POLICY_WIN_TYPE_NOTIFICATION;
2513 case ECORE_WL2_WINDOW_TYPE_UTILITY:
2514 return TIZEN_POLICY_WIN_TYPE_UTILITY;
2515 case ECORE_WL2_WINDOW_TYPE_DIALOG:
2516 return TIZEN_POLICY_WIN_TYPE_DIALOG;
2517 case ECORE_WL2_WINDOW_TYPE_DOCK:
2518 return TIZEN_POLICY_WIN_TYPE_DOCK;
2519 case ECORE_WL2_WINDOW_TYPE_SPLASH:
2520 return TIZEN_POLICY_WIN_TYPE_SPLASH;
2521 case ECORE_WL2_WINDOW_TYPE_DESKTOP:
2522 return TIZEN_POLICY_WIN_TYPE_DESKTOP;
2524 return TIZEN_POLICY_WIN_TYPE_NONE;
2530 ecore_wl2_window_type_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window_Type type)
2532 EINA_SAFETY_ON_NULL_RETURN(window);
2533 window->type = type;
2535 // TIZEN_ONLY(20180202): Fix to send a proper window type value to the server
2537 tzsh_type = _convert_to_tzsh_type(type);
2540 // TIZEN_ONLY(20171114)
2541 if ((window->surface) && (window->display->wl.tz_policy))
2542 tizen_policy_set_type(window->display->wl.tz_policy, window->surface, (uint32_t)tzsh_type);
2547 ecore_wl2_window_popup_input_set(Ecore_Wl2_Window *window, Ecore_Wl2_Input *input)
2549 EINA_SAFETY_ON_NULL_RETURN(window);
2550 EINA_SAFETY_ON_NULL_RETURN(input);
2551 EINA_SAFETY_ON_TRUE_RETURN(window->type != ECORE_WL2_WINDOW_TYPE_MENU);
2552 window->grab = input;
2555 EAPI Ecore_Wl2_Input *
2556 ecore_wl2_window_popup_input_get(Ecore_Wl2_Window *window)
2558 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2560 return window->grab;
2563 EAPI Ecore_Wl2_Display *
2564 ecore_wl2_window_display_get(const Ecore_Wl2_Window *window)
2566 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2567 EINA_SAFETY_ON_NULL_RETURN_VAL(window->display, NULL);
2569 if (window->display->recovering) return NULL;
2571 return window->display;
2575 ecore_wl2_window_shell_surface_exists(Ecore_Wl2_Window *window)
2577 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2578 return !!window->zxdg_surface || !!window->xdg_surface;
2581 // TIZEN_ONLY(171108) : get shell surface of a given window
2582 EAPI struct zxdg_surface_v6 *
2583 ecore_wl2_window_shell_surface_get(Ecore_Wl2_Window *window)
2585 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2586 return window->zxdg_surface;
2591 ecore_wl2_window_activated_get(const Ecore_Wl2_Window *window)
2593 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2594 return window->req_config.focused;
2597 EAPI Ecore_Wl2_Output *
2598 ecore_wl2_window_output_find(Ecore_Wl2_Window *window)
2600 Ecore_Wl2_Output *out;
2604 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2606 x = window->set_config.geometry.x;
2607 y = window->set_config.geometry.y;
2609 EINA_INLIST_FOREACH_SAFE(window->display->outputs, tmp, out)
2613 ox = out->geometry.x;
2614 oy = out->geometry.y;
2616 switch (out->transform)
2618 case WL_OUTPUT_TRANSFORM_90:
2619 case WL_OUTPUT_TRANSFORM_270:
2620 case WL_OUTPUT_TRANSFORM_FLIPPED_90:
2621 case WL_OUTPUT_TRANSFORM_FLIPPED_270:
2622 ow = out->geometry.h;
2623 oh = out->geometry.w;
2626 ow = out->geometry.w;
2627 oh = out->geometry.h;
2631 if (((x >= ox) && (x < ow)) && ((y >= oy) && (y < oh)))
2639 ecore_wl2_window_buffer_transform_set(Ecore_Wl2_Window *window, int transform)
2641 EINA_SAFETY_ON_NULL_RETURN(window);
2643 wl_surface_set_buffer_transform(window->surface, transform);
2647 ecore_wl2_window_wm_rotation_supported_set(Ecore_Wl2_Window *window, Eina_Bool enabled)
2649 EINA_SAFETY_ON_NULL_RETURN(window);
2650 window->wm_rot.supported = enabled;
2654 ecore_wl2_window_wm_rotation_supported_get(Ecore_Wl2_Window *window)
2656 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2657 return window->wm_rot.supported;
2661 ecore_wl2_window_rotation_app_set(Ecore_Wl2_Window *window, Eina_Bool set)
2663 EINA_SAFETY_ON_NULL_RETURN(window);
2664 window->wm_rot.app_set = set;
2668 ecore_wl2_window_rotation_app_get(Ecore_Wl2_Window *window)
2670 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2671 return window->wm_rot.app_set;
2675 ecore_wl2_window_preferred_rotation_set(Ecore_Wl2_Window *window, int rot)
2677 EINA_SAFETY_ON_NULL_RETURN(window);
2678 window->wm_rot.preferred_rot = rot;
2681 _tizen_rotation_preferred_angle_set(window, window->wm_rot.preferred_rot);
2686 ecore_wl2_window_preferred_rotation_get(Ecore_Wl2_Window *window)
2688 EINA_SAFETY_ON_NULL_RETURN_VAL(window, 0);
2689 return window->wm_rot.preferred_rot;
2693 ecore_wl2_window_available_rotations_set(Ecore_Wl2_Window *window, const int *rots, unsigned int count)
2696 EINA_SAFETY_ON_NULL_RETURN(window);
2699 _tizen_rotation_available_angles_set(window, rots, count);
2702 if (window->wm_rot.available_rots)
2704 free(window->wm_rot.available_rots);
2705 window->wm_rot.available_rots = NULL;
2707 window->wm_rot.count = count;
2711 window->wm_rot.available_rots = calloc(count, sizeof(int));
2712 if (!window->wm_rot.available_rots) return;
2714 for (; i < count; i++)
2715 window->wm_rot.available_rots[i] = ((int *)rots)[i];
2720 ecore_wl2_window_available_rotations_get(Ecore_Wl2_Window *window, int **rots, unsigned int *count)
2725 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2728 *count = window->wm_rot.count;
2730 if (window->wm_rot.count >= 1)
2732 val = calloc(window->wm_rot.count, sizeof(int));
2733 if (!val) return EINA_FALSE;
2735 for (; i < window->wm_rot.count; i++)
2736 val[i] = ((int *)window->wm_rot.available_rots)[i];
2746 ecore_wl2_window_rotation_change_prepare_send(Ecore_Wl2_Window *window, int rot, int w, int h, Eina_Bool resize)
2748 Ecore_Wl2_Event_Window_Rotation_Change_Prepare *ev;
2750 EINA_SAFETY_ON_NULL_RETURN(window);
2752 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation_Change_Prepare));
2755 ev->win = window->id;
2759 ev->resize = resize;
2761 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_PREPARE, ev, NULL, NULL);
2765 ecore_wl2_window_rotation_change_prepare_done_send(Ecore_Wl2_Window *window, int rot)
2767 Ecore_Wl2_Event_Window_Rotation_Change_Prepare_Done *ev;
2769 EINA_SAFETY_ON_NULL_RETURN(window);
2771 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation_Change_Prepare_Done));
2774 ev->win = window->id;
2780 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_PREPARE_DONE,
2785 ecore_wl2_window_rotation_change_request_send(Ecore_Wl2_Window *window, int rot)
2787 Ecore_Wl2_Event_Window_Rotation_Change_Request *ev;
2789 EINA_SAFETY_ON_NULL_RETURN(window);
2791 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation_Change_Request));
2794 ev->win = window->id;
2800 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_REQUEST,
2805 ecore_wl2_window_rotation_change_done_send(Ecore_Wl2_Window *window, int rot, int w, int h)
2807 Ecore_Wl2_Event_Window_Rotation_Change_Done *ev;
2809 EINA_SAFETY_ON_NULL_RETURN(window);
2812 if (window->tz_rotation)
2813 tizen_rotation_ack_angle_change(window->tz_rotation, window->wm_rot.serial);
2816 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation_Change_Done));
2819 ev->win = window->id;
2825 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_DONE,
2831 ecore_wl2_window_rotation_geometry_set(Ecore_Wl2_Window *win, int rot, int x, int y, int w, int h)
2835 enum tizen_rotation_angle angle = TIZEN_ROTATION_ANGLE_NONE;
2839 if ((rot % 90 != 0) || (rot / 90 > 3) || (rot < 0)) return;
2842 win->wm_rot.geometry_hints[i].x = x;
2843 win->wm_rot.geometry_hints[i].y = y;
2844 win->wm_rot.geometry_hints[i].w = w;
2845 win->wm_rot.geometry_hints[i].h = h;
2846 win->wm_rot.geometry_hints[i].valid = EINA_TRUE;
2848 if (!win->tz_rotation) return;
2852 angle = TIZEN_ROTATION_ANGLE_0;
2855 angle = TIZEN_ROTATION_ANGLE_90;
2858 angle = TIZEN_ROTATION_ANGLE_180;
2861 angle = TIZEN_ROTATION_ANGLE_270;
2866 tizen_rotation_set_geometry_hint(win->tz_rotation,
2867 (uint32_t)angle, x, y, w, h);
2869 rotation = ecore_wl2_window_rotation_get(win);
2870 if ((rotation % 90 != 0) || (rotation / 90 > 3) || (rotation < 0)) return;
2871 if ((i == (rotation / 90)) &&
2872 ((win->set_config.geometry.w != w) || (win->set_config.geometry.h != h)))
2874 //TIZEN_ONLY(20180201) : add function to set window size by client.
2875 win->set_config.geometry.w = w;
2876 win->set_config.geometry.h = h;
2877 _ecore_wl2_window_configure_send_by_client(win);
2883 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))
2887 win->cb_rot_changed = func;
2888 win->cb_rot_changed_data = data;
2892 // TIZEN_ONLY(20210330): for maintain internal aux hint list
2893 static Ecore_Wl2_Window_Aux_Hint *
2894 _ecore_wl2_window_aux_hint_get_by_id(Ecore_Wl2_Window *win, int id)
2896 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
2897 Eina_List *l = NULL;
2899 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
2901 EINA_LIST_REVERSE_FOREACH(win->aux_hints, l, ewah)
2910 static Ecore_Wl2_Window_Aux_Hint *
2911 _ecore_wl2_window_aux_hint_get_by_hint(Ecore_Wl2_Window *win, const char *hint)
2913 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
2914 Eina_List *l = NULL;
2915 size_t hint_len = 0;
2917 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
2919 hint_len = strlen(hint);
2920 EINA_LIST_REVERSE_FOREACH(win->aux_hints, l, ewah)
2922 if ((strlen(ewah->hint) == hint_len) &&
2923 !strncmp(ewah->hint, hint, hint_len))
2931 _ecore_wl2_window_aux_hint_list_add(Ecore_Wl2_Window *win, int id, const char *hint, const char *val)
2933 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
2935 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
2937 ewah = _ecore_wl2_window_aux_hint_get_by_id(win, id);
2940 eina_stringshare_del(ewah->hint);
2941 eina_stringshare_del(ewah->val);
2942 ewah->hint = eina_stringshare_add(hint);
2943 ewah->val = eina_stringshare_add(val);
2947 ewah = (Ecore_Wl2_Window_Aux_Hint *)calloc(1, sizeof(Ecore_Wl2_Window_Aux_Hint));
2948 EINA_SAFETY_ON_NULL_RETURN_VAL(ewah, EINA_FALSE);
2950 ewah->hint = eina_stringshare_add(hint);
2951 ewah->val = eina_stringshare_add(val);
2953 win->aux_hints = eina_list_append(win->aux_hints, ewah);
2959 _ecore_wl2_window_aux_hint_list_change(Ecore_Wl2_Window *win, Ecore_Wl2_Window_Aux_Hint *ewah, const char *val)
2961 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
2962 EINA_SAFETY_ON_NULL_RETURN_VAL(ewah, EINA_FALSE);
2964 eina_stringshare_del(ewah->val);
2965 ewah->val = eina_stringshare_add(val);
2971 _ecore_wl2_window_aux_hint_list_del(Ecore_Wl2_Window *win, Ecore_Wl2_Window_Aux_Hint *ewah)
2973 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
2974 EINA_SAFETY_ON_NULL_RETURN_VAL(ewah, EINA_FALSE);
2976 eina_stringshare_del(ewah->hint);
2977 eina_stringshare_del(ewah->val);
2978 win->aux_hints = eina_list_remove(win->aux_hints, ewah);
2982 // END OF TIZEN_ONLY
2984 // TIZEN_ONLY(20210330): support aux hint generate
2986 _cb_aux_hint_sort(const void *data1, const void *data2)
2988 const Ecore_Wl2_Window_Aux_Hint *ewah1 = (const Ecore_Wl2_Window_Aux_Hint *) data1;
2989 const Ecore_Wl2_Window_Aux_Hint *ewah2 = (const Ecore_Wl2_Window_Aux_Hint *) data2;
2991 if (!ewah1 || !ewah2) return 0;
2993 if (ewah1->id > ewah2->id) return 1;
2994 else if (ewah1->id == ewah2->id) return 0;
2999 _ecore_wl2_window_aux_hint_id_assign(Ecore_Wl2_Window *win)
3001 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3002 Eina_List *ewah_sorted_list = NULL, *l = NULL;
3005 ewah_sorted_list = eina_list_clone(win->aux_hints);
3006 ewah_sorted_list = eina_list_sort(ewah_sorted_list, 0, _cb_aux_hint_sort);
3008 EINA_LIST_FOREACH(ewah_sorted_list, l, ewah)
3010 if (ewah->id < 0) continue;
3021 eina_list_free(ewah_sorted_list);
3027 ecore_wl2_window_aux_hint_generate(Ecore_Wl2_Window *win, const char *hint, const char *val)
3029 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3032 EINA_SAFETY_ON_NULL_RETURN_VAL(win, -1);
3034 ewah = _ecore_wl2_window_aux_hint_get_by_hint(win, hint);
3037 ecore_wl2_window_aux_hint_change(win, ewah->id, val);
3041 id = _ecore_wl2_window_aux_hint_id_assign(win);
3042 if (id < 0) return -1;
3044 if (!_ecore_wl2_window_aux_hint_list_add(win, id, hint, val))
3048 if ((win->surface) && (win->display->wl.tz_policy))
3049 tizen_policy_add_aux_hint(win->display->wl.tz_policy, win->surface, id, hint, val);
3051 if ((!win->surface) || (!win->display->wl.efl_aux_hints)) return id;
3053 efl_aux_hints_add_aux_hint(win->display->wl.efl_aux_hints, win->surface, id, hint, val);
3054 ecore_wl2_display_flush(win->display);
3060 ecore_wl2_window_aux_hint_id_get(Ecore_Wl2_Window *win, const char *hint)
3062 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3064 ewah = _ecore_wl2_window_aux_hint_get_by_hint(win, hint);
3071 ecore_wl2_window_aux_hint_value_get(Ecore_Wl2_Window *win, int id)
3073 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3075 ewah = _ecore_wl2_window_aux_hint_get_by_id(win, id);
3080 // END OF TIZEN_ONLY
3083 ecore_wl2_window_aux_hints_supported_get(Ecore_Wl2_Window *win)
3085 Eina_List *res = NULL;
3087 char *supported_hint = NULL;
3088 const char *hint = NULL;
3090 if (!win) return NULL;
3091 if (!win->surface) return NULL;
3093 // TIZEN_ONLY : To use tizen protocols
3094 if (win->display->wl.tz_policy)
3096 tizen_policy_get_supported_aux_hints(win->display->wl.tz_policy, win->surface);
3097 ecore_wl2_display_sync(win->display);
3101 EINA_LIST_FOREACH(win->supported_aux_hints, ll, supported_hint)
3103 hint = eina_stringshare_add(supported_hint);
3104 res = eina_list_append(res, hint);
3110 ecore_wl2_window_aux_hint_add(Ecore_Wl2_Window *win, int id, const char *hint, const char *val)
3114 // TIZEN_ONLY : To use tizen protocols
3115 if ((win->surface) && (win->display->wl.tz_policy))
3116 tizen_policy_add_aux_hint(win->display->wl.tz_policy, win->surface, id, hint, val);
3119 // TIZEN_ONLY(20210330): for maintain internal aux hint list
3120 _ecore_wl2_window_aux_hint_list_add(win, id, hint, val);
3123 if ((!win->surface) || (!win->display->wl.efl_aux_hints)) return;
3125 efl_aux_hints_add_aux_hint(win->display->wl.efl_aux_hints, win->surface, id, hint, val);
3126 ecore_wl2_display_flush(win->display);
3130 ecore_wl2_window_aux_hint_change(Ecore_Wl2_Window *win, int id, const char *val)
3134 // TIZEN_ONLY : To use tizen protocols
3135 if ((win->surface) && (win->display->wl.tz_policy))
3136 tizen_policy_change_aux_hint(win->display->wl.tz_policy, win->surface, id, val);
3139 // TIZEN_ONLY(20210330): for maintain internal aux hint list
3140 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3141 ewah = _ecore_wl2_window_aux_hint_get_by_id(win, id);
3143 _ecore_wl2_window_aux_hint_list_change(win, ewah, val);
3146 if ((!win->surface) || (!win->display->wl.efl_aux_hints)) return;
3148 efl_aux_hints_change_aux_hint(win->display->wl.efl_aux_hints, win->surface, id, val);
3149 ecore_wl2_display_flush(win->display);
3153 ecore_wl2_window_aux_hint_del(Ecore_Wl2_Window *win, int id)
3157 // TIZEN_ONLY : To use tizen protocols
3158 if ((win->surface) && (win->display->wl.tz_policy))
3159 tizen_policy_del_aux_hint(win->display->wl.tz_policy, win->surface, id);
3162 // TIZEN_ONLY(20210330): for maintain internal aux hint list
3163 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3164 ewah = _ecore_wl2_window_aux_hint_get_by_id(win, id);
3166 _ecore_wl2_window_aux_hint_list_del(win, ewah);
3169 if ((!win->surface) || (!win->display->wl.efl_aux_hints)) return;
3171 efl_aux_hints_del_aux_hint(win->display->wl.efl_aux_hints, win->surface, id);
3172 ecore_wl2_display_flush(win->display);
3176 ecore_wl2_window_focus_skip_set(Ecore_Wl2_Window *window, Eina_Bool focus_skip)
3178 EINA_SAFETY_ON_NULL_RETURN(window);
3180 // TIZEN_ONLY(20171112)
3181 if (window->focus_skip != focus_skip)
3183 if ((window->surface) && (window->display->wl.tz_policy))
3186 tizen_policy_set_focus_skip(window->display->wl.tz_policy, window->surface);
3188 tizen_policy_unset_focus_skip(window->display->wl.tz_policy, window->surface);
3193 window->focus_skip = focus_skip;
3197 ecore_wl2_window_focus_skip_get(Ecore_Wl2_Window *window)
3199 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
3200 return window->focus_skip;
3204 ecore_wl2_window_role_set(Ecore_Wl2_Window *window, const char *role)
3206 EINA_SAFETY_ON_NULL_RETURN(window);
3207 eina_stringshare_replace(&window->role, role);
3209 // TIZEN_ONLY(20171112)
3210 if ((window->surface) && (window->display->wl.tz_policy))
3211 tizen_policy_set_role(window->display->wl.tz_policy, window->surface, window->role);
3216 ecore_wl2_window_role_get(Ecore_Wl2_Window *window)
3218 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
3220 return window->role ? window->role : NULL;
3224 ecore_wl2_window_floating_mode_set(Ecore_Wl2_Window *window, Eina_Bool floating)
3226 EINA_SAFETY_ON_NULL_RETURN(window);
3227 window->floating = floating;
3229 // TIZEN_ONLY(20171112)
3230 if ((window->surface) && (window->display->wl.tz_policy))
3233 tizen_policy_set_floating_mode(window->display->wl.tz_policy,
3236 tizen_policy_unset_floating_mode(window->display->wl.tz_policy,
3243 ecore_wl2_window_floating_mode_get(Ecore_Wl2_Window *window)
3245 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
3246 return window->floating;
3249 // TIZEN_ONLY(20150703) : support conformant
3251 ecore_wl2_window_conformant_set(Ecore_Wl2_Window *win, unsigned int is_conformant)
3254 if (!win->surface) return;
3255 if (!win->display) return;
3256 if (!win->display->wl.tz_policy) return;
3259 tizen_policy_set_conformant(win->display->wl.tz_policy, win->surface);
3261 tizen_policy_unset_conformant(win->display->wl.tz_policy, win->surface);
3265 ecore_wl2_window_conformant_get(Ecore_Wl2_Window *win)
3267 if (!win) return EINA_FALSE;
3268 if (!win->surface) return EINA_FALSE;
3269 if (!win->display) return EINA_FALSE;
3270 if (!win->display->wl.tz_policy) return EINA_FALSE;
3272 tizen_policy_get_conformant(win->display->wl.tz_policy, win->surface);
3273 ecore_wl2_display_sync(win->display);
3275 return win->conformant;
3279 // TIZEN_ONLY(20171108) : add functions for indicator
3281 ecore_wl2_window_indicator_geometry_set(Ecore_Wl2_Window *win, int x, int y, int w, int h)
3285 win->indicator.x = x;
3286 win->indicator.y = y;
3287 win->indicator.w = w;
3288 win->indicator.h = h;
3292 ecore_wl2_window_indicator_geometry_get(Ecore_Wl2_Window *win, int *x, int *y, int *w, int *h)
3294 if(!win) return EINA_FALSE;
3297 *x = win->indicator.x;
3299 *y = win->indicator.y;
3301 *w = win->indicator.w;
3303 *h = win->indicator.h;
3309 ecore_wl2_window_indicator_state_set(Ecore_Wl2_Window *win, Ecore_Wl2_Indicator_State state)
3314 if (!win->surface) return;
3315 if (!win->display->wl.tz_indicator) return;
3317 if (state == ECORE_WL2_INDICATOR_STATE_ON)
3318 ind_state = TIZEN_INDICATOR_STATE_ON;
3319 else if (state == ECORE_WL2_INDICATOR_STATE_OFF)
3320 ind_state = TIZEN_INDICATOR_STATE_OFF;
3322 ind_state = TIZEN_INDICATOR_STATE_UNKNOWN;
3324 tizen_indicator_set_state(win->display->wl.tz_indicator, win->surface, ind_state);
3326 win->indicator.state = state;
3329 EAPI Ecore_Wl2_Indicator_State
3330 ecore_wl2_window_indicator_state_get(Ecore_Wl2_Window *win)
3332 if (!win) return EINA_FALSE;
3334 return win->indicator.state;
3338 ecore_wl2_window_indicator_opacity_set(Ecore_Wl2_Window *win, Ecore_Wl2_Indicator_Opacity_Mode mode)
3343 if (!win->surface) return;
3344 if (!win->display->wl.tz_indicator) return;
3348 case ECORE_WL2_INDICATOR_OPAQUE:
3349 op_mode = TIZEN_INDICATOR_OPACITY_MODE_OPAQUE;
3352 case ECORE_WL2_INDICATOR_TRANSLUCENT:
3353 op_mode = TIZEN_INDICATOR_OPACITY_MODE_TRANSLUCENT;
3356 case ECORE_WL2_INDICATOR_TRANSPARENT:
3357 op_mode = TIZEN_INDICATOR_OPACITY_MODE_TRANSPARENT;
3360 case ECORE_WL2_INDICATOR_BG_TRANSPARENT:
3361 op_mode = TIZEN_INDICATOR_OPACITY_MODE_BG_TRANSPARENT;
3365 op_mode = TIZEN_INDICATOR_OPACITY_MODE_OPAQUE;
3369 tizen_indicator_set_opacity_mode(win->display->wl.tz_indicator, win->surface, op_mode);
3371 win->indicator.mode = mode;
3374 EAPI Ecore_Wl2_Indicator_Opacity_Mode
3375 ecore_wl2_window_indicator_opacity_get(Ecore_Wl2_Window *win)
3377 if (!win) return EINA_FALSE;
3379 return win->indicator.mode;
3383 ecore_wl2_indicator_visible_type_set(Ecore_Wl2_Window *win, Ecore_Wl2_Indicator_Visible_Type type)
3388 if (!win->surface) return;
3389 if (!win->display->wl.tz_indicator) return;
3391 if (type == ECORE_WL2_INDICATOR_VISIBLE_TYPE_SHOWN)
3392 vis_type = TIZEN_INDICATOR_VISIBLE_TYPE_SHOWN;
3394 vis_type = TIZEN_INDICATOR_VISIBLE_TYPE_HIDDEN;
3396 tizen_indicator_set_visible_type(win->display->wl.tz_indicator, win->surface, vis_type);
3398 win->indicator.type = type;
3401 EAPI Ecore_Wl2_Indicator_Visible_Type
3402 ecore_wl2_indicator_visible_type_get(Ecore_Wl2_Window *win)
3404 if (!win) return EINA_FALSE;
3406 return win->indicator.type;
3410 // TIZEN_ONLY(20171108) : add functions for clipboard
3412 ecore_wl2_window_clipboard_geometry_set(Ecore_Wl2_Window *win, int x, int y, int w, int h)
3416 win->clipboard.x = x;
3417 win->clipboard.y = y;
3418 win->clipboard.w = w;
3419 win->clipboard.h = h;
3423 ecore_wl2_window_clipboard_geometry_get(Ecore_Wl2_Window *win, int *x, int *y, int *w, int *h)
3425 if (!win) return EINA_FALSE;
3428 *x = win->clipboard.x;
3430 *y = win->clipboard.y;
3432 *w = win->clipboard.w;
3434 *h = win->clipboard.h;
3440 ecore_wl2_window_clipboard_state_set(Ecore_Wl2_Window *win, Ecore_Wl2_Clipboard_State state)
3444 win->clipboard.state = state;
3447 EAPI Ecore_Wl2_Clipboard_State
3448 ecore_wl2_window_clipboard_state_get(Ecore_Wl2_Window *win)
3450 if (!win) return EINA_FALSE;
3452 return win->clipboard.state;
3456 ecore_wl2_clipboard_show(Ecore_Wl2_Window *win)
3459 if (!win->surface) return;
3460 if (!win->display->wl.tz_clipboard) return;
3462 tizen_clipboard_show(win->display->wl.tz_clipboard, win->surface);
3466 ecore_wl2_clipboard_hide(Ecore_Wl2_Window *win)
3469 if (!win->surface) return;
3470 if (!win->display->wl.tz_clipboard) return;
3472 tizen_clipboard_hide(win->display->wl.tz_clipboard, win->surface);
3476 ecore_wl2_clipboard_data_only_set(Eina_Bool data_only)
3478 Ecore_Wl2_Display *ewd = NULL;
3479 Ecore_Wl2_Input *input = NULL;
3481 ewd = ecore_wl2_connected_display_get(NULL);
3482 if (!ewd) return EINA_FALSE;
3483 input = ecore_wl2_input_default_input_get(ewd);
3484 if (!input) return EINA_FALSE;
3486 if (!ewd->wl.tz_clipboard) return EINA_FALSE;
3488 tizen_clipboard_set_data_only(ewd->wl.tz_clipboard, data_only);
3489 ecore_wl2_display_sync(ewd);
3491 return input->is_data_only;
3495 // TIZEN_ONLY(20171108) : add functions for keyboard
3497 ecore_wl2_window_keyboard_geometry_set(Ecore_Wl2_Window *win, int x, int y, int w, int h)
3502 win->keyboard.y = y;
3503 win->keyboard.w = w;
3504 win->keyboard.h = h;
3508 ecore_wl2_window_keyboard_geometry_get(Ecore_Wl2_Window *win, int *x, int *y, int *w, int *h)
3510 if (!win) return EINA_FALSE;
3513 *x = win->keyboard.x;
3515 *y = win->keyboard.y;
3517 *w = win->keyboard.w;
3519 *h = win->keyboard.h;
3525 ecore_wl2_window_keyboard_state_set(Ecore_Wl2_Window *win, Ecore_Wl2_Virtual_Keyboard_State state)
3529 win->keyboard.state = state;
3532 EAPI Ecore_Wl2_Virtual_Keyboard_State
3533 ecore_wl2_window_keyboard_state_get(Ecore_Wl2_Window *win)
3535 if (!win) return EINA_FALSE;
3537 return win->keyboard.state;
3542 ecore_wl2_window_aspect_set(Ecore_Wl2_Window *window, int w, int h, unsigned int aspect)
3544 EINA_SAFETY_ON_NULL_RETURN(window);
3545 EINA_SAFETY_ON_TRUE_RETURN(w < 1);
3546 EINA_SAFETY_ON_TRUE_RETURN(h < 1);
3548 if ((window->aspect.aspect == aspect) && (window->aspect.w == w) &&
3549 (window->aspect.h == h))
3552 window->aspect.w = w;
3553 window->aspect.h = h;
3554 window->aspect.aspect = aspect;
3555 window->aspect.set = 1;
3556 if (!window->display->wl.efl_hints) return;
3557 if (window->xdg_surface)
3558 efl_hints_set_aspect(window->display->wl.efl_hints,
3559 window->xdg_surface, w, h, aspect);
3560 ecore_wl2_display_flush(window->display);
3564 ecore_wl2_window_aspect_get(Ecore_Wl2_Window *window, int *w, int *h, unsigned int *aspect)
3566 EINA_SAFETY_ON_NULL_RETURN(window);
3568 if (w) *w = window->aspect.w;
3569 if (h) *h = window->aspect.h;
3570 if (aspect) *aspect = window->aspect.aspect;
3574 ecore_wl2_window_weight_set(Ecore_Wl2_Window *window, double w, double h)
3577 EINA_SAFETY_ON_NULL_RETURN(window);
3579 ww = lround(w * 100);
3580 hh = lround(h * 100);
3582 if ((window->weight.w == ww) && (window->weight.h == hh))
3585 window->weight.w = ww;
3586 window->weight.h = hh;
3587 window->weight.set = 1;
3588 if (!window->display->wl.efl_hints) return;
3589 if (window->xdg_surface)
3590 efl_hints_set_weight(window->display->wl.efl_hints,
3591 window->xdg_surface, ww, hh);
3592 ecore_wl2_display_flush(window->display);
3596 _frame_cb(void *data, struct wl_callback *callback, uint32_t timestamp)
3598 Ecore_Wl2_Frame_Cb_Handle *cb;
3599 Ecore_Wl2_Window *window;
3603 window->commit_pending = EINA_FALSE;
3604 wl_callback_destroy(callback);
3605 window->callback = NULL;
3606 EINA_INLIST_FOREACH_SAFE(window->frame_callbacks, l, cb)
3607 cb->cb(window, timestamp, cb->data);
3610 static struct wl_callback_listener _frame_listener =
3616 _maximized_set(Ecore_Wl2_Window *window)
3618 EINA_SAFETY_ON_FALSE_RETURN(window->zxdg_toplevel || window->xdg_toplevel);
3620 if (window->set_config.maximized)
3622 window->saved = window->set_config.geometry;
3623 if (window->xdg_toplevel)
3624 xdg_toplevel_set_maximized(window->xdg_toplevel);
3625 if (window->zxdg_toplevel)
3626 zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
3630 if (window->xdg_toplevel)
3631 xdg_toplevel_unset_maximized(window->xdg_toplevel);
3632 if (window->zxdg_toplevel)
3633 zxdg_toplevel_v6_unset_maximized(window->zxdg_toplevel);
3638 _fullscreen_set(Ecore_Wl2_Window *window)
3640 EINA_SAFETY_ON_FALSE_RETURN(window->zxdg_toplevel || window->xdg_toplevel);
3642 if (window->set_config.fullscreen)
3644 window->saved = window->set_config.geometry;
3645 if (window->xdg_toplevel)
3646 xdg_toplevel_set_fullscreen(window->xdg_toplevel, NULL);
3647 if (window->zxdg_toplevel)
3648 zxdg_toplevel_v6_set_fullscreen(window->zxdg_toplevel, NULL);
3652 if (window->xdg_toplevel)
3653 xdg_toplevel_unset_fullscreen(window->xdg_toplevel);
3654 if (window->zxdg_toplevel)
3655 zxdg_toplevel_v6_unset_fullscreen(window->zxdg_toplevel);
3659 static struct wl_region *
3660 _region_create(struct wl_compositor *comp, int x, int y, int w, int h)
3662 struct wl_region *out;
3664 out = wl_compositor_create_region(comp);
3667 ERR("Failed to create region");
3671 wl_region_add(out, x, y, w, h);
3677 _regions_set(Ecore_Wl2_Window *window)
3679 struct wl_region *region = NULL;
3681 if (window->pending.opaque)
3683 if (window->opaque_set)
3685 region = _region_create(window->display->wl.compositor,
3686 window->opaque.x, window->opaque.y,
3687 window->opaque.w, window->opaque.h);
3688 if (!region) return;
3690 // TIZEN_ONLY(20201123)
3692 wl_surface_set_opaque_region(window->surface, region);
3694 _opaque_region_set(window, region);
3698 if (!window->pending.input) goto out;
3699 if (window->type == ECORE_WL2_WINDOW_TYPE_DND) goto out;
3701 if (!window->input_set)
3703 wl_surface_set_input_region(window->surface, NULL);
3707 if (region && (window->opaque.x == window->input_rect.x) &&
3708 (window->opaque.y == window->input_rect.y) &&
3709 (window->opaque.w == window->input_rect.w) &&
3710 (window->opaque.h == window->input_rect.h))
3712 wl_surface_set_input_region(window->surface, region);
3715 if (region) wl_region_destroy(region);
3717 region = _region_create(window->display->wl.compositor,
3718 window->input_rect.x, window->input_rect.y,
3719 window->input_rect.w, window->input_rect.h);
3720 if (!region) return;
3721 wl_surface_set_input_region(window->surface, region);
3724 if (region) wl_region_destroy(region);
3727 // TIZEN_ONLY(20201123)
3729 _opaque_region_set(Ecore_Wl2_Window *window, struct wl_region *region)
3731 if (!window) return;
3732 if (!window->surface) return;
3734 wl_surface_set_opaque_region(window->surface, region);
3736 window->pending.opaque = EINA_FALSE;
3740 // TIZEN_ONLY(20190910)
3742 _opaque_set(Ecore_Wl2_Window *window)
3744 struct wl_region *region;
3746 if (!window->opaque_set)
3748 if (window->surface)
3749 _opaque_region_set(window, NULL);
3753 region = wl_compositor_create_region(window->display->wl.compositor);
3756 ERR("Failed to create opaque region");
3760 wl_region_add(region, window->opaque.x, window->opaque.y,
3761 window->opaque.w, window->opaque.h);
3762 _opaque_region_set(window, region);
3763 wl_region_destroy(region);
3768 ecore_wl2_window_commit(Ecore_Wl2_Window *window, Eina_Bool flush)
3770 EINA_SAFETY_ON_NULL_RETURN(window);
3771 EINA_SAFETY_ON_NULL_RETURN(window->surface);
3773 if (window->commit_pending)
3775 if (window->callback)
3776 wl_callback_destroy(window->callback);
3777 window->callback = NULL;
3778 WRN("Commit before previous commit processed");
3780 if (!window->pending.configure)
3782 if (window->has_buffer)
3783 window->commit_pending = EINA_TRUE;
3784 if (!window->callback)
3786 window->callback = wl_surface_frame(window->surface);
3787 wl_callback_add_listener(window->callback, &_frame_listener, window);
3789 /* Dispatch any state we've been saving along the way */
3790 if (window->pending.geom)
3794 ecore_wl2_window_geometry_get(window, &gx, &gy, &gw, &gh);
3795 if (window->xdg_toplevel)
3796 xdg_surface_set_window_geometry(window->xdg_surface,
3798 if (window->zxdg_surface)
3799 zxdg_surface_v6_set_window_geometry(window->zxdg_surface,
3802 // TIZEN_ONLY(20220421) : update window's saved size only un-fullscreen and unmaximize state
3803 if (!window->set_config.fullscreen && !window->set_config.maximized)
3805 window->saved.w = window->set_config.geometry.w;
3806 window->saved.h = window->set_config.geometry.h;
3810 if (window->pending.opaque || window->pending.input)
3811 _regions_set(window);
3813 if (window->pending.maximized)
3814 _maximized_set(window);
3816 if (window->pending.fullscreen)
3817 _fullscreen_set(window);
3819 window->pending.geom = EINA_FALSE;
3820 window->pending.opaque = EINA_FALSE;
3821 window->pending.input = EINA_FALSE;
3822 window->pending.maximized = EINA_FALSE;
3823 window->pending.fullscreen = EINA_FALSE;
3826 if (window->req_config.serial != window->set_config.serial)
3828 if (window->xdg_configure_ack && window->xdg_surface)
3829 window->xdg_configure_ack(window->xdg_surface,
3830 window->req_config.serial);
3831 if (window->zxdg_configure_ack && window->zxdg_surface)
3832 window->zxdg_configure_ack(window->zxdg_surface,
3833 window->req_config.serial);
3834 window->set_config.serial = window->req_config.serial;
3838 wl_surface_commit(window->surface);
3839 ecore_wl2_display_flush(window->display);
3842 if (!window->updating) return;
3844 window->updating = EINA_FALSE;
3845 if (window->def_config.serial != window->set_config.serial)
3846 _ecore_wl2_window_configure_send(window);
3850 ecore_wl2_window_false_commit(Ecore_Wl2_Window *window)
3852 EINA_SAFETY_ON_NULL_RETURN(window);
3853 EINA_SAFETY_ON_NULL_RETURN(window->surface);
3854 EINA_SAFETY_ON_TRUE_RETURN(window->pending.configure);
3855 EINA_SAFETY_ON_TRUE_RETURN(window->commit_pending);
3857 if (!window->callback)
3859 window->callback = wl_surface_frame(window->surface);
3860 wl_callback_add_listener(window->callback, &_frame_listener, window);
3862 wl_surface_commit(window->surface);
3863 ecore_wl2_display_flush(window->display);
3864 if (window->has_buffer)
3865 window->commit_pending = EINA_TRUE;
3869 ecore_wl2_window_pending_get(Ecore_Wl2_Window *window)
3871 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
3873 return window->commit_pending;
3876 EAPI Ecore_Wl2_Frame_Cb_Handle *
3877 ecore_wl2_window_frame_callback_add(Ecore_Wl2_Window *window, Ecore_Wl2_Frame_Cb cb, void *data)
3879 Ecore_Wl2_Frame_Cb_Handle *callback;
3881 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
3882 EINA_SAFETY_ON_NULL_RETURN_VAL(cb, NULL);
3884 callback = malloc(sizeof(*callback));
3885 EINA_SAFETY_ON_NULL_RETURN_VAL(callback, NULL);
3887 callback->data = data;
3888 callback->win = window;
3889 window->frame_callbacks =
3890 eina_inlist_append(window->frame_callbacks, EINA_INLIST_GET(callback));
3895 ecore_wl2_window_frame_callback_del(Ecore_Wl2_Frame_Cb_Handle *handle)
3897 EINA_SAFETY_ON_NULL_RETURN(handle);
3899 handle->win->frame_callbacks =
3900 eina_inlist_remove(handle->win->frame_callbacks, EINA_INLIST_GET(handle));
3905 ecore_wl2_window_buffer_attach(Ecore_Wl2_Window *win, void *buffer, int x, int y, Eina_Bool implicit)
3907 EINA_SAFETY_ON_NULL_RETURN(win);
3908 EINA_SAFETY_ON_NULL_RETURN(win->surface);
3910 /* FIXME: Haven't given any thought to x and y since we always use 0... */
3911 if (!implicit) wl_surface_attach(win->surface, buffer, x, y);
3912 win->buffer = buffer;
3913 if (!implicit && !buffer)
3914 win->has_buffer = EINA_FALSE;
3916 win->has_buffer = EINA_TRUE;
3920 ecore_wl2_window_resizing_get(Ecore_Wl2_Window *window)
3922 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
3924 return window->req_config.resizing;
3928 ecore_wl2_window_update_begin(Ecore_Wl2_Window *window)
3930 EINA_SAFETY_ON_NULL_RETURN(window);
3931 EINA_SAFETY_ON_TRUE_RETURN(window->updating);
3933 window->updating = EINA_TRUE;
3937 ecore_wl2_window_damage(Ecore_Wl2_Window *window, Eina_Rectangle *rects, unsigned int count)
3939 void (*damage)(struct wl_surface *, int32_t, int32_t, int32_t, int32_t);
3941 int compositor_version;
3943 EINA_SAFETY_ON_NULL_RETURN(window);
3945 compositor_version = window->display->wl.compositor_version;
3947 if (compositor_version >= WL_SURFACE_DAMAGE_BUFFER_SINCE_VERSION)
3948 damage = wl_surface_damage_buffer;
3950 damage = wl_surface_damage;
3952 if ((rects) && (count > 0))
3953 for (k = 0; k < count; k++)
3954 damage(window->surface, rects[k].x, rects[k].y, rects[k].w, rects[k].h);
3956 damage(window->surface, 0, 0, INT_MAX, INT_MAX);
3960 ecore_wl2_window_surface_flush(Ecore_Wl2_Window *window, Eina_Bool purge)
3962 EINA_SAFETY_ON_NULL_RETURN(window);
3964 if (!window->wl2_surface) return;
3965 ecore_wl2_surface_flush(window->wl2_surface, purge);
3968 EAPI Ecore_Wl2_Window_Type
3969 ecore_wl2_window_type_get(Ecore_Wl2_Window *window)
3971 EINA_SAFETY_ON_NULL_RETURN_VAL(window, ECORE_WL2_WINDOW_TYPE_NONE);
3972 return window->type;
3975 EAPI Ecore_Wl2_Window *
3976 ecore_wl2_window_surface_find(struct wl_surface *surface)
3978 Ecore_Wl2_Display *ewd;
3979 Ecore_Wl2_Window *win;
3981 EINA_SAFETY_ON_NULL_RETURN_VAL(surface, NULL);
3983 ewd = ecore_wl2_connected_display_get(NULL);
3984 EINA_SAFETY_ON_NULL_RETURN_VAL(ewd, NULL);
3986 win = ecore_wl2_display_window_find_by_surface(ewd, surface);
3990 // TIZEN_ONLY(20171107): add ecore_wl2_window_input_get() EAPI
3991 EAPI Ecore_Wl2_Input *
3992 ecore_wl2_window_input_get(Ecore_Wl2_Window *win)
3994 Ecore_Wl2_Input *input;
3996 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
3997 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, NULL);
3999 EINA_INLIST_FOREACH(win->display->inputs, input)
4001 if (input->focus.pointer) return input;
4002 //This code will be changed after adding ecore_wl2_window_keyboard_get API
4003 if (input->focus.keyboard) return input;
4010 // TIZEN_ONLY(20200326): add ecore_wl2_window_pointer_get() EAPI
4011 EAPI Ecore_Wl2_Input *
4012 ecore_wl2_window_pointer_get(Ecore_Wl2_Window *win)
4014 Ecore_Wl2_Input *input;
4016 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
4017 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, NULL);
4019 EINA_INLIST_FOREACH(win->display->inputs, input)
4020 if (input->focus.pointer == win) return input;
4026 // TIZEN_ONLY(20200326): add ecore_wl2_window_keyboard_get() EAPI
4027 EAPI Ecore_Wl2_Input *
4028 ecore_wl2_window_keyboard_get(Ecore_Wl2_Window *win)
4030 Ecore_Wl2_Input *input;
4032 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
4033 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, NULL);
4035 EINA_INLIST_FOREACH(win->display->inputs, input)
4036 if (input->focus.keyboard == win) return input;
4042 // TIZEN_ONLY(20171114): support a pointer warp
4044 ecore_wl2_window_pointer_warp(Ecore_Wl2_Window *win, int x, int y)
4046 Ecore_Wl2_Display *ewd;
4048 /* FIXME: visible is not merged yet. */
4049 //if (!win || !win->surface || !win->visible) return EINA_FALSE;
4050 if (!win || !win->surface) return EINA_FALSE;
4053 if (!ewd || !ewd->wl.tz_input_device_manager) return EINA_FALSE;
4055 tizen_input_device_manager_pointer_warp(ewd->wl.tz_input_device_manager,
4056 win->surface, wl_fixed_from_int(x), wl_fixed_from_int(y));
4062 // TIZEN_ONLY(20200601): support sync between ui and video
4063 /* The video surface created in ecore_wl2 is used for informing the video area.
4064 And there is another video surface created on the player side. The player
4065 video surface is filled with video data, and the garbage data of ecore_wl2
4066 video surface can interfere with video data. So fill it with zero here. */
4068 buffer_fill_zero(tbm_surface_h surface)
4070 tbm_surface_info_s info;
4072 unsigned int height, stride;
4074 ret = tbm_surface_map(surface, TBM_OPTION_WRITE, &info);
4075 if (ret != TBM_SURFACE_ERROR_NONE)
4078 img = (int *)info.planes[0].ptr;
4079 height = tbm_surface_get_height(surface);
4080 stride = info.planes[0].stride;
4082 memset(img, 0x0, sizeof(int) * stride * height);
4084 tbm_surface_unmap(surface);
4091 ecore_wl2_window_video_surface_create(Ecore_Wl2_Window *win)
4093 Ecore_Wl2_Display *display;
4095 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
4096 if (win->video.surface) return EINA_TRUE;
4098 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, EINA_FALSE);
4099 display = win->display;
4101 EINA_SAFETY_ON_NULL_RETURN_VAL(display->wl.compositor, EINA_FALSE);
4102 EINA_SAFETY_ON_NULL_RETURN_VAL(display->wl.subcompositor, EINA_FALSE);
4103 EINA_SAFETY_ON_NULL_RETURN_VAL(display->wl.tz_policy, EINA_FALSE);
4105 win->video.surface = wl_compositor_create_surface(display->wl.compositor);
4107 if (!win->video.surface)
4109 ERR("Failed to create video surface");
4113 win->video.subsurface =
4114 wl_subcompositor_get_subsurface(display->wl.subcompositor,
4115 win->video.surface, win->surface);
4117 if (!win->video.subsurface)
4119 ERR("Failed to create video subsurface");
4120 goto get_subsurf_err;
4123 tizen_policy_place_subsurface_below_parent(display->wl.tz_policy, win->video.subsurface);
4125 if (!win->tbm_client)
4127 win->tbm_client = wayland_tbm_client_init(display->wl.display);
4128 if (!win->tbm_client)
4130 ERR("Failed to init wayland tbm client");
4131 goto client_init_err;
4135 win->video.tbm_surface = tbm_surface_create(1, 1, TBM_FORMAT_ARGB8888);
4136 if (!win->video.tbm_surface)
4138 ERR("Failed to create tbm surface");
4139 goto client_init_err;
4142 win->video.wl_buffer = wayland_tbm_client_create_buffer(win->tbm_client,
4143 win->video.tbm_surface);
4144 if (!win->video.wl_buffer)
4146 ERR("Failed to create buffer of tbm client");
4147 goto create_buf_err;
4150 if (!buffer_fill_zero(win->video.tbm_surface))
4152 ERR("Failed to fill buffer to zero");
4156 /* A sub-surface is initially in the synchronized mode. */
4157 win->video.sync = EINA_TRUE;
4159 /* need to attach surface */
4160 wl_surface_attach(win->video.surface, win->video.wl_buffer, 0, 0);
4161 wl_surface_commit(win->video.surface);
4166 wayland_tbm_client_destroy_buffer(win->tbm_client, win->video.wl_buffer);
4167 win->video.wl_buffer = NULL;
4170 tbm_surface_destroy(win->video.tbm_surface);
4171 win->video.tbm_surface = NULL;
4174 wl_subsurface_destroy(win->video.subsurface);
4175 win->video.subsurface = NULL;
4178 wl_surface_destroy(win->video.surface);
4179 win->video.surface = NULL;
4185 ecore_wl2_window_video_surface_get(Ecore_Wl2_Window *win)
4187 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
4188 return win->video.surface;
4192 ecore_wl2_window_video_surface_destroy(Ecore_Wl2_Window *win)
4194 Ecore_Wl2_Display *display;
4196 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
4197 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, EINA_FALSE);
4199 display = win->display;
4201 if (display->wl.tz_video)
4203 tizen_video_destroy(display->wl.tz_video);
4204 display->wl.tz_video = NULL;
4207 _ecore_wl2_window_video_surface_destroy(win);
4213 ecore_wl2_window_video_surface_sync_set(Ecore_Wl2_Window *win, Eina_Bool sync)
4215 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
4216 EINA_SAFETY_ON_NULL_RETURN_VAL(win->video.subsurface, EINA_FALSE);
4219 if (win->video.sync == sync) return EINA_TRUE;
4221 win->video.sync = sync;
4224 wl_subsurface_set_sync(win->video.subsurface);
4226 wl_subsurface_set_desync(win->video.subsurface);
4232 ecore_wl2_window_video_surface_destination_set(Ecore_Wl2_Window *win, int x, int y, int w, int h)
4234 Ecore_Wl2_Display *display;
4235 struct wl_registry *registry;
4236 Eina_Iterator *globals;
4237 Ecore_Wl2_Global *global;
4239 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
4240 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, EINA_FALSE);
4241 EINA_SAFETY_ON_NULL_RETURN_VAL(win->video.surface, EINA_FALSE);
4243 display = win->display;
4245 if (!win->video.viewport)
4247 if (!display->wl.tz_video)
4249 registry = ecore_wl2_display_registry_get(display);
4250 if (!registry) return EINA_FALSE;
4252 globals = ecore_wl2_display_globals_get(display);
4253 if (!globals) return EINA_FALSE;
4255 EINA_ITERATOR_FOREACH(globals, global)
4257 if (strcmp(global->interface, "tizen_video") == 0)
4259 display->wl.tz_video = wl_registry_bind(registry, global->id, &tizen_video_interface, 1);
4265 if (!display->wl.tz_video)
4267 ERR("Failed to bind tizen video interface");
4271 win->video.viewport = tizen_video_get_viewport(display->wl.tz_video, win->video.surface);
4274 if (!win->video.viewport)
4276 ERR("Failed to get video viewport");
4280 tizen_viewport_set_destination(win->video.viewport, x, y, w, h);
4281 wl_surface_commit(win->video.surface);
4287 ecore_wl2_window_render_sync_fd_create(Ecore_Wl2_Window *win, Ecore_Wl2_Window_Render_Sync_Type sync_type)
4291 EINA_SAFETY_ON_NULL_RETURN_VAL(win, sync_fd);
4292 EINA_SAFETY_ON_NULL_RETURN_VAL(win->egl_win, sync_fd);
4296 case ECORE_WL2_WINDOW_RENDER_SYNC_COMMIT:
4297 sync_fd = wl_egl_window_tizen_create_commit_sync_fd(win->egl_win->native_win);
4299 case ECORE_WL2_WINDOW_RENDER_SYNC_PRESENT:
4300 sync_fd = wl_egl_window_tizen_create_presentation_sync_fd(win->egl_win->native_win);
4310 //TIZEN_ONLY: ecore_wl2: add ecore_wl_window_video_has
4312 ecore_wl2_window_video_has(Ecore_Wl2_Window *window, Eina_Bool has)
4314 Ecore_Wl2_Display *display;
4317 EINA_SAFETY_ON_NULL_RETURN(window);
4319 display = window->display;
4320 if (!display->wl.tz_policy) return;
4322 ver = wl_proxy_get_version((struct wl_proxy *)display->wl.tz_policy);
4325 tizen_policy_has_video(display->wl.tz_policy, window->surface, has);
4329 //TIZEN_ONLY(20171115): support output transform
4331 _ecore_wl2_window_ignore_output_transform_set(Ecore_Wl2_Window *window, Eina_Bool ignore)
4333 if (!window) return;
4335 window->ignore_output_transform = ignore;
4339 ecore_wl2_window_ignore_output_transform_get(Ecore_Wl2_Window *window)
4341 return window->ignore_output_transform;
4345 // TIZEN_ONLY(20171207): add functions to set client's custom cursors
4347 ecore_wl2_window_pointer_set(Ecore_Wl2_Window *win, struct wl_surface *surface, int hot_x, int hot_y)
4349 Ecore_Wl2_Input *input;
4353 win->pointer.surface = surface;
4354 win->pointer.hot_x = hot_x;
4355 win->pointer.hot_y = hot_y;
4356 win->pointer.set = EINA_TRUE;
4358 if ((input = win->pointer.device))
4359 ecore_wl2_input_pointer_set(input, surface, hot_x, hot_y);
4363 ecore_wl2_window_cursor_from_name_set(Ecore_Wl2_Window *win, const char *cursor_name)
4365 Ecore_Wl2_Input *input;
4369 win->pointer.set = EINA_FALSE;
4371 if (!(input = win->pointer.device))
4374 eina_stringshare_replace(&win->pointer.cursor_name, cursor_name);
4376 if ((input->cursor.name) && (strcmp(input->cursor.name, win->pointer.cursor_name)))
4377 ecore_wl2_input_cursor_from_name_set(input, cursor_name);
4381 ecore_wl2_window_cursor_default_restore(Ecore_Wl2_Window *win)
4383 Ecore_Wl2_Input *input;
4387 win->pointer.set = EINA_FALSE;
4389 if ((input = win->pointer.device))
4390 ecore_wl2_input_cursor_default_restore(input);
4394 //TIZEN_ONLY(20180810): support client demand move resize
4396 ecore_wl2_window_sync_geometry_set(Ecore_Wl2_Window *window, uint32_t serial, int x, int y, int w, int h)
4398 if (!window) return;
4400 if ((window->set_config.geometry.x != x) ||
4401 (window->set_config.geometry.y != y) ||
4402 (window->set_config.geometry.w != w) ||
4403 (window->set_config.geometry.h != h))
4404 window->pending.geom = EINA_TRUE;
4406 window->set_config.geometry.x = x;
4407 window->set_config.geometry.y = y;
4408 window->set_config.geometry.w = w;
4409 window->set_config.geometry.h = h;
4411 if (window->display->wl.tz_moveresize)
4412 tizen_move_resize_set_geometry(window->display->wl.tz_moveresize, window->surface, serial, x, y, w, h);
4414 // TIZEN_ONLY(20190807): Support for wl_egl interface
4415 if (window->egl_win)
4417 window->egl_win->sync_geom.serial = serial;
4418 window->egl_win->sync_geom.w = w;
4419 window->egl_win->sync_geom.h = h;
4421 wl_egl_window_tizen_set_window_serial(window->egl_win->native_win, serial);
4427 // TIZEN_ONLY(20190807): Support for wl_egl interface
4428 EAPI Ecore_Wl2_Egl_Window *
4429 ecore_wl2_egl_window_create(Ecore_Wl2_Window *window, int w, int h)
4431 Ecore_Wl2_Egl_Window *egl_win = NULL;
4432 struct wl_egl_window *native_win = NULL;
4433 int cap = WL_EGL_WINDOW_TIZEN_CAPABILITY_NONE;
4435 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
4436 EINA_SAFETY_ON_NULL_RETURN_VAL(window->surface, NULL);
4437 EINA_SAFETY_ON_FALSE_RETURN_VAL((window->egl_win == NULL), NULL);
4438 EINA_SAFETY_ON_FALSE_RETURN_VAL((w >= 0), NULL);
4439 EINA_SAFETY_ON_FALSE_RETURN_VAL((h >= 0), NULL);
4441 native_win = wl_egl_window_create(window->surface, w, h);
4442 EINA_SAFETY_ON_NULL_RETURN_VAL(native_win, NULL);
4444 egl_win = calloc(1, sizeof(Ecore_Wl2_Egl_Window));
4445 EINA_SAFETY_ON_NULL_GOTO(egl_win, failed);
4447 egl_win->win = window;
4448 egl_win->native_win = native_win;
4452 window->egl_win = egl_win;
4454 cap = wl_egl_window_tizen_get_capabilities(native_win);
4455 if (cap == WL_EGL_WINDOW_TIZEN_CAPABILITY_ROTATION_SUPPORTED)
4456 egl_win->support_pre_rotation = EINA_TRUE;
4461 if (native_win) wl_egl_window_destroy(native_win);
4466 ecore_wl2_egl_window_destroy(Ecore_Wl2_Egl_Window *egl_win)
4468 EINA_SAFETY_ON_NULL_RETURN(egl_win);
4470 if (egl_win->native_win)
4471 wl_egl_window_destroy(egl_win->native_win);
4474 egl_win->win->egl_win = NULL;
4476 memset(egl_win, 0, sizeof(Ecore_Wl2_Egl_Window));
4481 ecore_wl2_egl_window_native_get(Ecore_Wl2_Egl_Window *egl_win)
4483 EINA_SAFETY_ON_NULL_RETURN_VAL(egl_win, NULL);
4484 return (void *)egl_win->native_win;
4488 ecore_wl2_egl_window_resize_with_rotation(Ecore_Wl2_Egl_Window *egl_win, int dx, int dy, int w, int h, int rotation)
4490 int rot = rotation % 360;
4492 EINA_SAFETY_ON_NULL_RETURN(egl_win);
4494 egl_win->rot.buffer = rot;
4495 egl_win->rot.win = rot;
4501 if (egl_win->support_pre_rotation)
4502 wl_egl_window_tizen_set_rotation(egl_win->native_win, egl_win->rot.win);
4504 //TIZEN_ONLY(20171115): support output transform
4505 /* buffer_transform: screen rotation + window rotation
4506 * window_transform: window rotation only
4507 * We have to let the display server know the window rotation value
4508 * because the display server needs to calcuate the screen rotation value
4509 * from buffer_transform value.
4511 wl_egl_window_tizen_set_buffer_transform(egl_win->native_win, egl_win->rot.buffer / 90);
4512 wl_egl_window_tizen_set_window_transform(egl_win->native_win, egl_win->rot.win / 90);
4515 if ((egl_win->rot.buffer == 90) || (egl_win->rot.buffer == 270))
4516 wl_egl_window_resize(egl_win->native_win, h, w, dx, dy);
4518 wl_egl_window_resize(egl_win->native_win, w, h, dx, dy);
4522 //TIZEN_ONLY(20220322): add resource id to window attribute
4524 ecore_wl2_window_resource_id_get(Ecore_Wl2_Window *window)
4526 EINA_SAFETY_ON_NULL_RETURN_VAL(window, 0);
4527 return window->resource_id;