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 if (changed_maximize_state && maximized)
2141 window->saved = window->set_config.geometry;
2143 window->pending.maximized = EINA_TRUE;
2147 if (changed_maximize_state)
2151 if (!window->set_config.fullscreen)
2152 window->saved = window->set_config.geometry;
2154 if (window->xdg_toplevel)
2155 xdg_toplevel_set_maximized(window->xdg_toplevel);
2156 if (window->zxdg_toplevel)
2157 zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
2161 if (window->xdg_toplevel)
2162 xdg_toplevel_unset_maximized(window->xdg_toplevel);
2163 if (window->zxdg_toplevel)
2164 zxdg_toplevel_v6_unset_maximized(window->zxdg_toplevel);
2168 /* TIZEN_ONLY(20190522): The window properties of ecore_evas are updated in
2169 * _ecore_evas_wl_common_cb_window_configure.
2170 * To call _ecore_evas_wl_common_cb_window_configure,
2171 * ECORE_WL2_EVENT_WINDOW_CONFIGURE event is added.
2172 * To add ECORE_WL2_EVENT_WINDOW_CONFIGURE event,
2173 * _ecore_wl2_window_configure_send is called. */
2174 _ecore_wl2_window_configure_send(window);
2175 /* END of TIZEN_ONLY(20190522) */
2176 ecore_wl2_display_flush(window->display);
2180 ecore_wl2_window_maximized_set(Ecore_Wl2_Window *window, Eina_Bool maximized)
2183 ecore_wl2_window_maximized_set_with_direction(window, ECORE_WL2_MAXIMIZE_DIRECTION_ALL);
2185 ecore_wl2_window_maximized_set_with_direction(window, ECORE_WL2_MAXIMIZE_DIRECTION_NONE);
2189 ecore_wl2_window_fullscreen_get(Ecore_Wl2_Window *window)
2191 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2193 return window->set_config.fullscreen;
2197 ecore_wl2_window_fullscreen_set(Ecore_Wl2_Window *window, Eina_Bool fullscreen)
2201 EINA_SAFETY_ON_NULL_RETURN(window);
2203 prev = window->set_config.fullscreen;
2204 fullscreen = !!fullscreen;
2205 if (prev == fullscreen) return;
2207 window->set_config.fullscreen = fullscreen;
2208 if (window->updating)
2210 window->pending.fullscreen = EINA_TRUE;
2216 if (!window->set_config.maximized)
2217 window->saved = window->set_config.geometry;
2219 if (window->xdg_toplevel)
2220 xdg_toplevel_set_fullscreen(window->xdg_toplevel, NULL);
2221 if (window->zxdg_toplevel)
2222 zxdg_toplevel_v6_set_fullscreen(window->zxdg_toplevel, NULL);
2226 if (window->xdg_toplevel)
2227 xdg_toplevel_unset_fullscreen(window->xdg_toplevel);
2228 if (window->zxdg_toplevel)
2229 zxdg_toplevel_v6_unset_fullscreen(window->zxdg_toplevel);
2231 /* TIZEN_ONLY(20190522): The window properties of ecore_evas are updated in
2232 * _ecore_evas_wl_common_cb_window_configure.
2233 * To call _ecore_evas_wl_common_cb_window_configure,
2234 * ECORE_WL2_EVENT_WINDOW_CONFIGURE event is added.
2235 * To add ECORE_WL2_EVENT_WINDOW_CONFIGURE event,
2236 * _ecore_wl2_window_configure_send is called. */
2237 _ecore_wl2_window_configure_send(window);
2238 /* END of TIZEN_ONLY(20190522) */
2239 ecore_wl2_display_flush(window->display);
2243 ecore_wl2_window_rotation_get(Ecore_Wl2_Window *window)
2245 EINA_SAFETY_ON_NULL_RETURN_VAL(window, -1);
2247 return window->rotation;
2251 ecore_wl2_window_rotation_set(Ecore_Wl2_Window *window, int rotation)
2253 EINA_SAFETY_ON_NULL_RETURN(window);
2255 window->rotation = rotation;
2259 ecore_wl2_window_title_set(Ecore_Wl2_Window *window, const char *title)
2261 EINA_SAFETY_ON_NULL_RETURN(window);
2263 eina_stringshare_replace(&window->title, title);
2264 if (!window->title) return;
2265 if (!window->xdg_toplevel && !window->zxdg_toplevel) return;
2267 if (window->xdg_toplevel)
2268 xdg_toplevel_set_title(window->xdg_toplevel, window->title);
2269 if (window->zxdg_toplevel)
2270 zxdg_toplevel_v6_set_title(window->zxdg_toplevel, window->title);
2271 ecore_wl2_display_flush(window->display);
2275 ecore_wl2_window_title_get(Ecore_Wl2_Window *window)
2277 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2279 return window->title ? window->title : NULL;
2283 ecore_wl2_window_class_set(Ecore_Wl2_Window *window, const char *clas)
2285 EINA_SAFETY_ON_NULL_RETURN(window);
2287 eina_stringshare_replace(&window->class, clas);
2288 if (!window->class) return;
2289 if (!window->xdg_toplevel && !window->zxdg_toplevel) return;
2291 if (window->xdg_toplevel)
2292 xdg_toplevel_set_app_id(window->xdg_toplevel, window->class);
2293 if (window->zxdg_toplevel)
2294 zxdg_toplevel_v6_set_app_id(window->zxdg_toplevel, window->class);
2295 ecore_wl2_display_flush(window->display);
2299 ecore_wl2_window_class_get(Ecore_Wl2_Window *window)
2301 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2303 return window->class ? window->class : NULL;
2307 ecore_wl2_window_geometry_get(Ecore_Wl2_Window *window, int *x, int *y, int *w, int *h)
2309 EINA_SAFETY_ON_NULL_RETURN(window);
2311 if (x) *x = window->set_config.geometry.x;
2312 if (y) *y = window->set_config.geometry.y;
2313 if (w) *w = window->set_config.geometry.w;
2314 if (h) *h = window->set_config.geometry.h;
2318 ecore_wl2_window_geometry_set(Ecore_Wl2_Window *window, int x, int y, int w, int h)
2320 EINA_SAFETY_ON_NULL_RETURN(window);
2322 if ((window->set_config.geometry.x == x) &&
2323 (window->set_config.geometry.y == y) &&
2324 (window->set_config.geometry.w == w) &&
2325 (window->set_config.geometry.h == h))
2328 window->set_config.geometry.x = x;
2329 window->set_config.geometry.y = y;
2330 window->set_config.geometry.w = w;
2331 window->set_config.geometry.h = h;
2332 window->pending.geom = EINA_TRUE;
2335 //TIZEN_ONLY(20220325): added min / max size set to window
2337 ecore_wl2_window_minimum_size_set(Ecore_Wl2_Window *window, int w, int h)
2339 EINA_SAFETY_ON_NULL_RETURN(window);
2341 if (window->zxdg_set_min_size && window->zxdg_toplevel)
2343 window->zxdg_set_min_size(window->zxdg_toplevel, w, h);
2344 window->pending.min = 0;
2347 if (window->xdg_set_min_size && window->xdg_toplevel)
2349 window->xdg_set_min_size(window->xdg_toplevel, w, h);
2350 window->pending.min = 0;
2356 ecore_wl2_window_maximum_size_set(Ecore_Wl2_Window *window, int w, int h)
2358 EINA_SAFETY_ON_NULL_RETURN(window);
2360 if (window->zxdg_set_max_size && window->zxdg_toplevel)
2362 window->zxdg_set_max_size(window->zxdg_toplevel, w, h);
2363 window->pending.max = 0;
2366 if (window->xdg_set_max_size && window->xdg_toplevel)
2368 window->xdg_set_max_size(window->xdg_toplevel, w, h);
2369 window->pending.max = 0;
2376 ecore_wl2_window_iconified_get(Ecore_Wl2_Window *window)
2378 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2380 // TIZEN_ONLY(20150822)
2381 if (window->display->wl.tz_policy)
2382 return window->iconified;
2385 return window->set_config.minimized;
2388 // TIZEN_ONLY(20151231) : handling iconic state on tizen
2390 _ecore_wl2_window_iconified_set(Ecore_Wl2_Window *window, Eina_Bool iconified, Eina_Bool send_event)
2394 EINA_SAFETY_ON_NULL_RETURN(window);
2396 prev = window->set_config.minimized;
2397 iconified = !!iconified;
2398 if (prev == iconified) return;
2400 window->set_config.minimized = iconified;
2404 if ((window->surface) && (window->display->wl.tz_policy))
2407 tizen_policy_iconify(window->display->wl.tz_policy, window->surface);
2408 window->iconified = EINA_TRUE;
2411 else if (window->zxdg_toplevel)
2412 zxdg_toplevel_v6_set_minimized(window->zxdg_toplevel);
2416 if ((window->surface) && (window->display->wl.tz_policy))
2419 tizen_policy_uniconify(window->display->wl.tz_policy, window->surface);
2420 window->iconified = EINA_FALSE;
2423 else if (window->zxdg_toplevel)
2425 struct wl_array states;
2428 wl_array_init(&states);
2429 s = wl_array_add(&states, sizeof(*s));
2430 *s = ZXDG_TOPLEVEL_V6_STATE_ACTIVATED;
2431 _zxdg_toplevel_cb_configure(window, window->zxdg_toplevel,
2433 window->saved.h, &states);
2434 wl_array_release(&states);
2440 Ecore_Wl2_Event_Window_Iconify_State_Change *ev;
2442 if (!(ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Iconify_State_Change)))) return;
2443 ev->win = window->id;
2444 ev->iconified = iconified;
2446 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE, ev, NULL, NULL);
2452 ecore_wl2_window_iconified_set(Ecore_Wl2_Window *window, Eina_Bool iconified)
2454 // TIZEN_ONLY(20151231) : handling iconic state on tizen
2458 EINA_SAFETY_ON_NULL_RETURN(window);
2460 prev = window->set_config.minimized;
2461 iconified = !!iconified;
2462 if (prev == iconified) return;
2464 window->set_config.minimized = iconified;
2468 if (window->xdg_toplevel)
2469 xdg_toplevel_set_minimized(window->xdg_toplevel);
2470 if (window->zxdg_toplevel)
2471 zxdg_toplevel_v6_set_minimized(window->zxdg_toplevel);
2472 ecore_wl2_display_flush(window->display);
2475 _ecore_wl2_window_iconified_set(window, iconified, EINA_TRUE);
2479 // TIZEN_ONLY(20151231) : handling iconic state on tizen
2481 ecore_wl2_window_iconify_state_update(Ecore_Wl2_Window *window, Eina_Bool iconified, Eina_Bool send_event)
2483 _ecore_wl2_window_iconified_set(window, iconified, send_event);
2487 //TIZEN_ONLY(20171216): add ecore_wl2_window_find
2488 EAPI Ecore_Wl2_Window *
2489 ecore_wl2_window_find(unsigned int id)
2491 Ecore_Wl2_Window *win = NULL;
2493 if (!_windows) return NULL;
2494 win = eina_hash_find(_windows, _ecore_wl2_window_id_str_get(id));
2499 //TIZEN_ONLY(20180202): Fix to send a proper window type value to the server
2500 static inline uint32_t
2501 _convert_to_tzsh_type(Ecore_Wl2_Window_Type type)
2505 case ECORE_WL2_WINDOW_TYPE_NONE:
2506 return TIZEN_POLICY_WIN_TYPE_NONE;
2507 case ECORE_WL2_WINDOW_TYPE_TOPLEVEL:
2508 return TIZEN_POLICY_WIN_TYPE_TOPLEVEL;
2509 case ECORE_WL2_WINDOW_TYPE_MENU:
2510 return TIZEN_POLICY_WIN_TYPE_MENU;
2511 case ECORE_WL2_WINDOW_TYPE_DND:
2512 return TIZEN_POLICY_WIN_TYPE_DND;
2513 case ECORE_WL2_WINDOW_TYPE_CUSTOM:
2514 return TIZEN_POLICY_WIN_TYPE_CUSTOM;
2515 case ECORE_WL2_WINDOW_TYPE_NOTIFICATION:
2516 return TIZEN_POLICY_WIN_TYPE_NOTIFICATION;
2517 case ECORE_WL2_WINDOW_TYPE_UTILITY:
2518 return TIZEN_POLICY_WIN_TYPE_UTILITY;
2519 case ECORE_WL2_WINDOW_TYPE_DIALOG:
2520 return TIZEN_POLICY_WIN_TYPE_DIALOG;
2521 case ECORE_WL2_WINDOW_TYPE_DOCK:
2522 return TIZEN_POLICY_WIN_TYPE_DOCK;
2523 case ECORE_WL2_WINDOW_TYPE_SPLASH:
2524 return TIZEN_POLICY_WIN_TYPE_SPLASH;
2525 case ECORE_WL2_WINDOW_TYPE_DESKTOP:
2526 return TIZEN_POLICY_WIN_TYPE_DESKTOP;
2528 return TIZEN_POLICY_WIN_TYPE_NONE;
2534 ecore_wl2_window_type_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window_Type type)
2536 EINA_SAFETY_ON_NULL_RETURN(window);
2537 window->type = type;
2539 // TIZEN_ONLY(20180202): Fix to send a proper window type value to the server
2541 tzsh_type = _convert_to_tzsh_type(type);
2544 // TIZEN_ONLY(20171114)
2545 if ((window->surface) && (window->display->wl.tz_policy))
2546 tizen_policy_set_type(window->display->wl.tz_policy, window->surface, (uint32_t)tzsh_type);
2551 ecore_wl2_window_popup_input_set(Ecore_Wl2_Window *window, Ecore_Wl2_Input *input)
2553 EINA_SAFETY_ON_NULL_RETURN(window);
2554 EINA_SAFETY_ON_NULL_RETURN(input);
2555 EINA_SAFETY_ON_TRUE_RETURN(window->type != ECORE_WL2_WINDOW_TYPE_MENU);
2556 window->grab = input;
2559 EAPI Ecore_Wl2_Input *
2560 ecore_wl2_window_popup_input_get(Ecore_Wl2_Window *window)
2562 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2564 return window->grab;
2567 EAPI Ecore_Wl2_Display *
2568 ecore_wl2_window_display_get(const Ecore_Wl2_Window *window)
2570 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2571 EINA_SAFETY_ON_NULL_RETURN_VAL(window->display, NULL);
2573 if (window->display->recovering) return NULL;
2575 return window->display;
2579 ecore_wl2_window_shell_surface_exists(Ecore_Wl2_Window *window)
2581 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2582 return !!window->zxdg_surface || !!window->xdg_surface;
2585 // TIZEN_ONLY(171108) : get shell surface of a given window
2586 EAPI struct zxdg_surface_v6 *
2587 ecore_wl2_window_shell_surface_get(Ecore_Wl2_Window *window)
2589 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2590 return window->zxdg_surface;
2595 ecore_wl2_window_activated_get(const Ecore_Wl2_Window *window)
2597 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2598 return window->req_config.focused;
2601 EAPI Ecore_Wl2_Output *
2602 ecore_wl2_window_output_find(Ecore_Wl2_Window *window)
2604 Ecore_Wl2_Output *out;
2608 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
2610 x = window->set_config.geometry.x;
2611 y = window->set_config.geometry.y;
2613 EINA_INLIST_FOREACH_SAFE(window->display->outputs, tmp, out)
2617 ox = out->geometry.x;
2618 oy = out->geometry.y;
2620 switch (out->transform)
2622 case WL_OUTPUT_TRANSFORM_90:
2623 case WL_OUTPUT_TRANSFORM_270:
2624 case WL_OUTPUT_TRANSFORM_FLIPPED_90:
2625 case WL_OUTPUT_TRANSFORM_FLIPPED_270:
2626 ow = out->geometry.h;
2627 oh = out->geometry.w;
2630 ow = out->geometry.w;
2631 oh = out->geometry.h;
2635 if (((x >= ox) && (x < ow)) && ((y >= oy) && (y < oh)))
2643 ecore_wl2_window_buffer_transform_set(Ecore_Wl2_Window *window, int transform)
2645 EINA_SAFETY_ON_NULL_RETURN(window);
2647 wl_surface_set_buffer_transform(window->surface, transform);
2651 ecore_wl2_window_wm_rotation_supported_set(Ecore_Wl2_Window *window, Eina_Bool enabled)
2653 EINA_SAFETY_ON_NULL_RETURN(window);
2654 window->wm_rot.supported = enabled;
2658 ecore_wl2_window_wm_rotation_supported_get(Ecore_Wl2_Window *window)
2660 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2661 return window->wm_rot.supported;
2665 ecore_wl2_window_rotation_app_set(Ecore_Wl2_Window *window, Eina_Bool set)
2667 EINA_SAFETY_ON_NULL_RETURN(window);
2668 window->wm_rot.app_set = set;
2672 ecore_wl2_window_rotation_app_get(Ecore_Wl2_Window *window)
2674 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2675 return window->wm_rot.app_set;
2679 ecore_wl2_window_preferred_rotation_set(Ecore_Wl2_Window *window, int rot)
2681 EINA_SAFETY_ON_NULL_RETURN(window);
2682 window->wm_rot.preferred_rot = rot;
2685 _tizen_rotation_preferred_angle_set(window, window->wm_rot.preferred_rot);
2690 ecore_wl2_window_preferred_rotation_get(Ecore_Wl2_Window *window)
2692 EINA_SAFETY_ON_NULL_RETURN_VAL(window, 0);
2693 return window->wm_rot.preferred_rot;
2697 ecore_wl2_window_available_rotations_set(Ecore_Wl2_Window *window, const int *rots, unsigned int count)
2700 EINA_SAFETY_ON_NULL_RETURN(window);
2703 _tizen_rotation_available_angles_set(window, rots, count);
2706 if (window->wm_rot.available_rots)
2708 free(window->wm_rot.available_rots);
2709 window->wm_rot.available_rots = NULL;
2711 window->wm_rot.count = count;
2715 window->wm_rot.available_rots = calloc(count, sizeof(int));
2716 if (!window->wm_rot.available_rots) return;
2718 for (; i < count; i++)
2719 window->wm_rot.available_rots[i] = ((int *)rots)[i];
2724 ecore_wl2_window_available_rotations_get(Ecore_Wl2_Window *window, int **rots, unsigned int *count)
2729 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
2732 *count = window->wm_rot.count;
2734 if (window->wm_rot.count >= 1)
2736 val = calloc(window->wm_rot.count, sizeof(int));
2737 if (!val) return EINA_FALSE;
2739 for (; i < window->wm_rot.count; i++)
2740 val[i] = ((int *)window->wm_rot.available_rots)[i];
2750 ecore_wl2_window_rotation_change_prepare_send(Ecore_Wl2_Window *window, int rot, int w, int h, Eina_Bool resize)
2752 Ecore_Wl2_Event_Window_Rotation_Change_Prepare *ev;
2754 EINA_SAFETY_ON_NULL_RETURN(window);
2756 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation_Change_Prepare));
2759 ev->win = window->id;
2763 ev->resize = resize;
2765 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_PREPARE, ev, NULL, NULL);
2769 ecore_wl2_window_rotation_change_prepare_done_send(Ecore_Wl2_Window *window, int rot)
2771 Ecore_Wl2_Event_Window_Rotation_Change_Prepare_Done *ev;
2773 EINA_SAFETY_ON_NULL_RETURN(window);
2775 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation_Change_Prepare_Done));
2778 ev->win = window->id;
2784 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_PREPARE_DONE,
2789 ecore_wl2_window_rotation_change_request_send(Ecore_Wl2_Window *window, int rot)
2791 Ecore_Wl2_Event_Window_Rotation_Change_Request *ev;
2793 EINA_SAFETY_ON_NULL_RETURN(window);
2795 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation_Change_Request));
2798 ev->win = window->id;
2804 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_REQUEST,
2809 ecore_wl2_window_rotation_change_done_send(Ecore_Wl2_Window *window, int rot, int w, int h)
2811 Ecore_Wl2_Event_Window_Rotation_Change_Done *ev;
2813 EINA_SAFETY_ON_NULL_RETURN(window);
2816 if (window->tz_rotation)
2817 tizen_rotation_ack_angle_change(window->tz_rotation, window->wm_rot.serial);
2820 ev = calloc(1, sizeof(Ecore_Wl2_Event_Window_Rotation_Change_Done));
2823 ev->win = window->id;
2829 ecore_event_add(ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_DONE,
2835 ecore_wl2_window_rotation_geometry_set(Ecore_Wl2_Window *win, int rot, int x, int y, int w, int h)
2839 enum tizen_rotation_angle angle = TIZEN_ROTATION_ANGLE_NONE;
2843 if ((rot % 90 != 0) || (rot / 90 > 3) || (rot < 0)) return;
2846 win->wm_rot.geometry_hints[i].x = x;
2847 win->wm_rot.geometry_hints[i].y = y;
2848 win->wm_rot.geometry_hints[i].w = w;
2849 win->wm_rot.geometry_hints[i].h = h;
2850 win->wm_rot.geometry_hints[i].valid = EINA_TRUE;
2852 if (!win->tz_rotation) return;
2856 angle = TIZEN_ROTATION_ANGLE_0;
2859 angle = TIZEN_ROTATION_ANGLE_90;
2862 angle = TIZEN_ROTATION_ANGLE_180;
2865 angle = TIZEN_ROTATION_ANGLE_270;
2870 tizen_rotation_set_geometry_hint(win->tz_rotation,
2871 (uint32_t)angle, x, y, w, h);
2873 rotation = ecore_wl2_window_rotation_get(win);
2874 if ((rotation % 90 != 0) || (rotation / 90 > 3) || (rotation < 0)) return;
2875 if ((i == (rotation / 90)) &&
2876 ((win->set_config.geometry.w != w) || (win->set_config.geometry.h != h)))
2878 //TIZEN_ONLY(20180201) : add function to set window size by client.
2879 win->set_config.geometry.w = w;
2880 win->set_config.geometry.h = h;
2881 _ecore_wl2_window_configure_send_by_client(win);
2887 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))
2891 win->cb_rot_changed = func;
2892 win->cb_rot_changed_data = data;
2896 // TIZEN_ONLY(20210330): for maintain internal aux hint list
2897 static Ecore_Wl2_Window_Aux_Hint *
2898 _ecore_wl2_window_aux_hint_get_by_id(Ecore_Wl2_Window *win, int id)
2900 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
2901 Eina_List *l = NULL;
2903 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
2905 EINA_LIST_REVERSE_FOREACH(win->aux_hints, l, ewah)
2914 static Ecore_Wl2_Window_Aux_Hint *
2915 _ecore_wl2_window_aux_hint_get_by_hint(Ecore_Wl2_Window *win, const char *hint)
2917 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
2918 Eina_List *l = NULL;
2919 size_t hint_len = 0;
2921 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
2923 hint_len = strlen(hint);
2924 EINA_LIST_REVERSE_FOREACH(win->aux_hints, l, ewah)
2926 if ((strlen(ewah->hint) == hint_len) &&
2927 !strncmp(ewah->hint, hint, hint_len))
2935 _ecore_wl2_window_aux_hint_list_add(Ecore_Wl2_Window *win, int id, const char *hint, const char *val)
2937 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
2939 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
2941 ewah = _ecore_wl2_window_aux_hint_get_by_id(win, id);
2944 eina_stringshare_del(ewah->hint);
2945 eina_stringshare_del(ewah->val);
2946 ewah->hint = eina_stringshare_add(hint);
2947 ewah->val = eina_stringshare_add(val);
2951 ewah = (Ecore_Wl2_Window_Aux_Hint *)calloc(1, sizeof(Ecore_Wl2_Window_Aux_Hint));
2952 EINA_SAFETY_ON_NULL_RETURN_VAL(ewah, EINA_FALSE);
2954 ewah->hint = eina_stringshare_add(hint);
2955 ewah->val = eina_stringshare_add(val);
2957 win->aux_hints = eina_list_append(win->aux_hints, ewah);
2963 _ecore_wl2_window_aux_hint_list_change(Ecore_Wl2_Window *win, Ecore_Wl2_Window_Aux_Hint *ewah, const char *val)
2965 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
2966 EINA_SAFETY_ON_NULL_RETURN_VAL(ewah, EINA_FALSE);
2968 eina_stringshare_del(ewah->val);
2969 ewah->val = eina_stringshare_add(val);
2975 _ecore_wl2_window_aux_hint_list_del(Ecore_Wl2_Window *win, Ecore_Wl2_Window_Aux_Hint *ewah)
2977 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
2978 EINA_SAFETY_ON_NULL_RETURN_VAL(ewah, EINA_FALSE);
2980 eina_stringshare_del(ewah->hint);
2981 eina_stringshare_del(ewah->val);
2982 win->aux_hints = eina_list_remove(win->aux_hints, ewah);
2986 // END OF TIZEN_ONLY
2988 // TIZEN_ONLY(20210330): support aux hint generate
2990 _cb_aux_hint_sort(const void *data1, const void *data2)
2992 const Ecore_Wl2_Window_Aux_Hint *ewah1 = (const Ecore_Wl2_Window_Aux_Hint *) data1;
2993 const Ecore_Wl2_Window_Aux_Hint *ewah2 = (const Ecore_Wl2_Window_Aux_Hint *) data2;
2995 if (!ewah1 || !ewah2) return 0;
2997 if (ewah1->id > ewah2->id) return 1;
2998 else if (ewah1->id == ewah2->id) return 0;
3003 _ecore_wl2_window_aux_hint_id_assign(Ecore_Wl2_Window *win)
3005 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3006 Eina_List *ewah_sorted_list = NULL, *l = NULL;
3009 ewah_sorted_list = eina_list_clone(win->aux_hints);
3010 ewah_sorted_list = eina_list_sort(ewah_sorted_list, 0, _cb_aux_hint_sort);
3012 EINA_LIST_FOREACH(ewah_sorted_list, l, ewah)
3014 if (ewah->id < 0) continue;
3025 eina_list_free(ewah_sorted_list);
3031 ecore_wl2_window_aux_hint_generate(Ecore_Wl2_Window *win, const char *hint, const char *val)
3033 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3036 EINA_SAFETY_ON_NULL_RETURN_VAL(win, -1);
3038 ewah = _ecore_wl2_window_aux_hint_get_by_hint(win, hint);
3041 ecore_wl2_window_aux_hint_change(win, ewah->id, val);
3045 id = _ecore_wl2_window_aux_hint_id_assign(win);
3046 if (id < 0) return -1;
3048 if (!_ecore_wl2_window_aux_hint_list_add(win, id, hint, val))
3052 if ((win->surface) && (win->display->wl.tz_policy))
3053 tizen_policy_add_aux_hint(win->display->wl.tz_policy, win->surface, id, hint, val);
3055 if ((!win->surface) || (!win->display->wl.efl_aux_hints)) return id;
3057 efl_aux_hints_add_aux_hint(win->display->wl.efl_aux_hints, win->surface, id, hint, val);
3058 ecore_wl2_display_flush(win->display);
3064 ecore_wl2_window_aux_hint_id_get(Ecore_Wl2_Window *win, const char *hint)
3066 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3068 ewah = _ecore_wl2_window_aux_hint_get_by_hint(win, hint);
3075 ecore_wl2_window_aux_hint_value_get(Ecore_Wl2_Window *win, int id)
3077 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3079 ewah = _ecore_wl2_window_aux_hint_get_by_id(win, id);
3084 // END OF TIZEN_ONLY
3087 ecore_wl2_window_aux_hints_supported_get(Ecore_Wl2_Window *win)
3089 Eina_List *res = NULL;
3091 char *supported_hint = NULL;
3092 const char *hint = NULL;
3094 if (!win) return NULL;
3095 if (!win->surface) return NULL;
3097 // TIZEN_ONLY : To use tizen protocols
3098 if (win->display->wl.tz_policy)
3100 tizen_policy_get_supported_aux_hints(win->display->wl.tz_policy, win->surface);
3101 ecore_wl2_display_sync(win->display);
3105 EINA_LIST_FOREACH(win->supported_aux_hints, ll, supported_hint)
3107 hint = eina_stringshare_add(supported_hint);
3108 res = eina_list_append(res, hint);
3114 ecore_wl2_window_aux_hint_add(Ecore_Wl2_Window *win, int id, const char *hint, const char *val)
3118 // TIZEN_ONLY : To use tizen protocols
3119 if ((win->surface) && (win->display->wl.tz_policy))
3120 tizen_policy_add_aux_hint(win->display->wl.tz_policy, win->surface, id, hint, val);
3123 // TIZEN_ONLY(20210330): for maintain internal aux hint list
3124 _ecore_wl2_window_aux_hint_list_add(win, id, hint, val);
3127 if ((!win->surface) || (!win->display->wl.efl_aux_hints)) return;
3129 efl_aux_hints_add_aux_hint(win->display->wl.efl_aux_hints, win->surface, id, hint, val);
3130 ecore_wl2_display_flush(win->display);
3134 ecore_wl2_window_aux_hint_change(Ecore_Wl2_Window *win, int id, const char *val)
3138 // TIZEN_ONLY : To use tizen protocols
3139 if ((win->surface) && (win->display->wl.tz_policy))
3140 tizen_policy_change_aux_hint(win->display->wl.tz_policy, win->surface, id, val);
3143 // TIZEN_ONLY(20210330): for maintain internal aux hint list
3144 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3145 ewah = _ecore_wl2_window_aux_hint_get_by_id(win, id);
3147 _ecore_wl2_window_aux_hint_list_change(win, ewah, val);
3150 if ((!win->surface) || (!win->display->wl.efl_aux_hints)) return;
3152 efl_aux_hints_change_aux_hint(win->display->wl.efl_aux_hints, win->surface, id, val);
3153 ecore_wl2_display_flush(win->display);
3157 ecore_wl2_window_aux_hint_del(Ecore_Wl2_Window *win, int id)
3161 // TIZEN_ONLY : To use tizen protocols
3162 if ((win->surface) && (win->display->wl.tz_policy))
3163 tizen_policy_del_aux_hint(win->display->wl.tz_policy, win->surface, id);
3166 // TIZEN_ONLY(20210330): for maintain internal aux hint list
3167 Ecore_Wl2_Window_Aux_Hint *ewah = NULL;
3168 ewah = _ecore_wl2_window_aux_hint_get_by_id(win, id);
3170 _ecore_wl2_window_aux_hint_list_del(win, ewah);
3173 if ((!win->surface) || (!win->display->wl.efl_aux_hints)) return;
3175 efl_aux_hints_del_aux_hint(win->display->wl.efl_aux_hints, win->surface, id);
3176 ecore_wl2_display_flush(win->display);
3180 ecore_wl2_window_focus_skip_set(Ecore_Wl2_Window *window, Eina_Bool focus_skip)
3182 EINA_SAFETY_ON_NULL_RETURN(window);
3184 // TIZEN_ONLY(20171112)
3185 if (window->focus_skip != focus_skip)
3187 if ((window->surface) && (window->display->wl.tz_policy))
3190 tizen_policy_set_focus_skip(window->display->wl.tz_policy, window->surface);
3192 tizen_policy_unset_focus_skip(window->display->wl.tz_policy, window->surface);
3197 window->focus_skip = focus_skip;
3201 ecore_wl2_window_focus_skip_get(Ecore_Wl2_Window *window)
3203 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
3204 return window->focus_skip;
3208 ecore_wl2_window_role_set(Ecore_Wl2_Window *window, const char *role)
3210 EINA_SAFETY_ON_NULL_RETURN(window);
3211 eina_stringshare_replace(&window->role, role);
3213 // TIZEN_ONLY(20171112)
3214 if ((window->surface) && (window->display->wl.tz_policy))
3215 tizen_policy_set_role(window->display->wl.tz_policy, window->surface, window->role);
3220 ecore_wl2_window_role_get(Ecore_Wl2_Window *window)
3222 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
3224 return window->role ? window->role : NULL;
3228 ecore_wl2_window_floating_mode_set(Ecore_Wl2_Window *window, Eina_Bool floating)
3230 EINA_SAFETY_ON_NULL_RETURN(window);
3231 window->floating = floating;
3233 // TIZEN_ONLY(20171112)
3234 if ((window->surface) && (window->display->wl.tz_policy))
3237 tizen_policy_set_floating_mode(window->display->wl.tz_policy,
3240 tizen_policy_unset_floating_mode(window->display->wl.tz_policy,
3247 ecore_wl2_window_floating_mode_get(Ecore_Wl2_Window *window)
3249 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
3250 return window->floating;
3253 // TIZEN_ONLY(20150703) : support conformant
3255 ecore_wl2_window_conformant_set(Ecore_Wl2_Window *win, unsigned int is_conformant)
3258 if (!win->surface) return;
3259 if (!win->display) return;
3260 if (!win->display->wl.tz_policy) return;
3263 tizen_policy_set_conformant(win->display->wl.tz_policy, win->surface);
3265 tizen_policy_unset_conformant(win->display->wl.tz_policy, win->surface);
3269 ecore_wl2_window_conformant_get(Ecore_Wl2_Window *win)
3271 if (!win) return EINA_FALSE;
3272 if (!win->surface) return EINA_FALSE;
3273 if (!win->display) return EINA_FALSE;
3274 if (!win->display->wl.tz_policy) return EINA_FALSE;
3276 tizen_policy_get_conformant(win->display->wl.tz_policy, win->surface);
3277 ecore_wl2_display_sync(win->display);
3279 return win->conformant;
3283 // TIZEN_ONLY(20171108) : add functions for indicator
3285 ecore_wl2_window_indicator_geometry_set(Ecore_Wl2_Window *win, int x, int y, int w, int h)
3289 win->indicator.x = x;
3290 win->indicator.y = y;
3291 win->indicator.w = w;
3292 win->indicator.h = h;
3296 ecore_wl2_window_indicator_geometry_get(Ecore_Wl2_Window *win, int *x, int *y, int *w, int *h)
3298 if(!win) return EINA_FALSE;
3301 *x = win->indicator.x;
3303 *y = win->indicator.y;
3305 *w = win->indicator.w;
3307 *h = win->indicator.h;
3313 ecore_wl2_window_indicator_state_set(Ecore_Wl2_Window *win, Ecore_Wl2_Indicator_State state)
3318 if (!win->surface) return;
3319 if (!win->display->wl.tz_indicator) return;
3321 if (state == ECORE_WL2_INDICATOR_STATE_ON)
3322 ind_state = TIZEN_INDICATOR_STATE_ON;
3323 else if (state == ECORE_WL2_INDICATOR_STATE_OFF)
3324 ind_state = TIZEN_INDICATOR_STATE_OFF;
3326 ind_state = TIZEN_INDICATOR_STATE_UNKNOWN;
3328 tizen_indicator_set_state(win->display->wl.tz_indicator, win->surface, ind_state);
3330 win->indicator.state = state;
3333 EAPI Ecore_Wl2_Indicator_State
3334 ecore_wl2_window_indicator_state_get(Ecore_Wl2_Window *win)
3336 if (!win) return EINA_FALSE;
3338 return win->indicator.state;
3342 ecore_wl2_window_indicator_opacity_set(Ecore_Wl2_Window *win, Ecore_Wl2_Indicator_Opacity_Mode mode)
3347 if (!win->surface) return;
3348 if (!win->display->wl.tz_indicator) return;
3352 case ECORE_WL2_INDICATOR_OPAQUE:
3353 op_mode = TIZEN_INDICATOR_OPACITY_MODE_OPAQUE;
3356 case ECORE_WL2_INDICATOR_TRANSLUCENT:
3357 op_mode = TIZEN_INDICATOR_OPACITY_MODE_TRANSLUCENT;
3360 case ECORE_WL2_INDICATOR_TRANSPARENT:
3361 op_mode = TIZEN_INDICATOR_OPACITY_MODE_TRANSPARENT;
3364 case ECORE_WL2_INDICATOR_BG_TRANSPARENT:
3365 op_mode = TIZEN_INDICATOR_OPACITY_MODE_BG_TRANSPARENT;
3369 op_mode = TIZEN_INDICATOR_OPACITY_MODE_OPAQUE;
3373 tizen_indicator_set_opacity_mode(win->display->wl.tz_indicator, win->surface, op_mode);
3375 win->indicator.mode = mode;
3378 EAPI Ecore_Wl2_Indicator_Opacity_Mode
3379 ecore_wl2_window_indicator_opacity_get(Ecore_Wl2_Window *win)
3381 if (!win) return EINA_FALSE;
3383 return win->indicator.mode;
3387 ecore_wl2_indicator_visible_type_set(Ecore_Wl2_Window *win, Ecore_Wl2_Indicator_Visible_Type type)
3392 if (!win->surface) return;
3393 if (!win->display->wl.tz_indicator) return;
3395 if (type == ECORE_WL2_INDICATOR_VISIBLE_TYPE_SHOWN)
3396 vis_type = TIZEN_INDICATOR_VISIBLE_TYPE_SHOWN;
3398 vis_type = TIZEN_INDICATOR_VISIBLE_TYPE_HIDDEN;
3400 tizen_indicator_set_visible_type(win->display->wl.tz_indicator, win->surface, vis_type);
3402 win->indicator.type = type;
3405 EAPI Ecore_Wl2_Indicator_Visible_Type
3406 ecore_wl2_indicator_visible_type_get(Ecore_Wl2_Window *win)
3408 if (!win) return EINA_FALSE;
3410 return win->indicator.type;
3414 // TIZEN_ONLY(20171108) : add functions for clipboard
3416 ecore_wl2_window_clipboard_geometry_set(Ecore_Wl2_Window *win, int x, int y, int w, int h)
3420 win->clipboard.x = x;
3421 win->clipboard.y = y;
3422 win->clipboard.w = w;
3423 win->clipboard.h = h;
3427 ecore_wl2_window_clipboard_geometry_get(Ecore_Wl2_Window *win, int *x, int *y, int *w, int *h)
3429 if (!win) return EINA_FALSE;
3432 *x = win->clipboard.x;
3434 *y = win->clipboard.y;
3436 *w = win->clipboard.w;
3438 *h = win->clipboard.h;
3444 ecore_wl2_window_clipboard_state_set(Ecore_Wl2_Window *win, Ecore_Wl2_Clipboard_State state)
3448 win->clipboard.state = state;
3451 EAPI Ecore_Wl2_Clipboard_State
3452 ecore_wl2_window_clipboard_state_get(Ecore_Wl2_Window *win)
3454 if (!win) return EINA_FALSE;
3456 return win->clipboard.state;
3460 ecore_wl2_clipboard_show(Ecore_Wl2_Window *win)
3463 if (!win->surface) return;
3464 if (!win->display->wl.tz_clipboard) return;
3466 tizen_clipboard_show(win->display->wl.tz_clipboard, win->surface);
3470 ecore_wl2_clipboard_hide(Ecore_Wl2_Window *win)
3473 if (!win->surface) return;
3474 if (!win->display->wl.tz_clipboard) return;
3476 tizen_clipboard_hide(win->display->wl.tz_clipboard, win->surface);
3480 ecore_wl2_clipboard_data_only_set(Eina_Bool data_only)
3482 Ecore_Wl2_Display *ewd = NULL;
3483 Ecore_Wl2_Input *input = NULL;
3485 ewd = ecore_wl2_connected_display_get(NULL);
3486 if (!ewd) return EINA_FALSE;
3487 input = ecore_wl2_input_default_input_get(ewd);
3488 if (!input) return EINA_FALSE;
3490 if (!ewd->wl.tz_clipboard) return EINA_FALSE;
3492 tizen_clipboard_set_data_only(ewd->wl.tz_clipboard, data_only);
3493 ecore_wl2_display_sync(ewd);
3495 return input->is_data_only;
3499 // TIZEN_ONLY(20171108) : add functions for keyboard
3501 ecore_wl2_window_keyboard_geometry_set(Ecore_Wl2_Window *win, int x, int y, int w, int h)
3506 win->keyboard.y = y;
3507 win->keyboard.w = w;
3508 win->keyboard.h = h;
3512 ecore_wl2_window_keyboard_geometry_get(Ecore_Wl2_Window *win, int *x, int *y, int *w, int *h)
3514 if (!win) return EINA_FALSE;
3517 *x = win->keyboard.x;
3519 *y = win->keyboard.y;
3521 *w = win->keyboard.w;
3523 *h = win->keyboard.h;
3529 ecore_wl2_window_keyboard_state_set(Ecore_Wl2_Window *win, Ecore_Wl2_Virtual_Keyboard_State state)
3533 win->keyboard.state = state;
3536 EAPI Ecore_Wl2_Virtual_Keyboard_State
3537 ecore_wl2_window_keyboard_state_get(Ecore_Wl2_Window *win)
3539 if (!win) return EINA_FALSE;
3541 return win->keyboard.state;
3546 ecore_wl2_window_aspect_set(Ecore_Wl2_Window *window, int w, int h, unsigned int aspect)
3548 EINA_SAFETY_ON_NULL_RETURN(window);
3549 EINA_SAFETY_ON_TRUE_RETURN(w < 1);
3550 EINA_SAFETY_ON_TRUE_RETURN(h < 1);
3552 if ((window->aspect.aspect == aspect) && (window->aspect.w == w) &&
3553 (window->aspect.h == h))
3556 window->aspect.w = w;
3557 window->aspect.h = h;
3558 window->aspect.aspect = aspect;
3559 window->aspect.set = 1;
3560 if (!window->display->wl.efl_hints) return;
3561 if (window->xdg_surface)
3562 efl_hints_set_aspect(window->display->wl.efl_hints,
3563 window->xdg_surface, w, h, aspect);
3564 ecore_wl2_display_flush(window->display);
3568 ecore_wl2_window_aspect_get(Ecore_Wl2_Window *window, int *w, int *h, unsigned int *aspect)
3570 EINA_SAFETY_ON_NULL_RETURN(window);
3572 if (w) *w = window->aspect.w;
3573 if (h) *h = window->aspect.h;
3574 if (aspect) *aspect = window->aspect.aspect;
3578 ecore_wl2_window_weight_set(Ecore_Wl2_Window *window, double w, double h)
3581 EINA_SAFETY_ON_NULL_RETURN(window);
3583 ww = lround(w * 100);
3584 hh = lround(h * 100);
3586 if ((window->weight.w == ww) && (window->weight.h == hh))
3589 window->weight.w = ww;
3590 window->weight.h = hh;
3591 window->weight.set = 1;
3592 if (!window->display->wl.efl_hints) return;
3593 if (window->xdg_surface)
3594 efl_hints_set_weight(window->display->wl.efl_hints,
3595 window->xdg_surface, ww, hh);
3596 ecore_wl2_display_flush(window->display);
3600 _frame_cb(void *data, struct wl_callback *callback, uint32_t timestamp)
3602 Ecore_Wl2_Frame_Cb_Handle *cb;
3603 Ecore_Wl2_Window *window;
3607 window->commit_pending = EINA_FALSE;
3608 wl_callback_destroy(callback);
3609 window->callback = NULL;
3610 EINA_INLIST_FOREACH_SAFE(window->frame_callbacks, l, cb)
3611 cb->cb(window, timestamp, cb->data);
3614 static struct wl_callback_listener _frame_listener =
3620 _maximized_set(Ecore_Wl2_Window *window)
3622 EINA_SAFETY_ON_FALSE_RETURN(window->zxdg_toplevel || window->xdg_toplevel);
3624 if (window->set_config.maximized)
3626 if (window->xdg_toplevel)
3627 xdg_toplevel_set_maximized(window->xdg_toplevel);
3628 if (window->zxdg_toplevel)
3629 zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
3633 if (window->xdg_toplevel)
3634 xdg_toplevel_unset_maximized(window->xdg_toplevel);
3635 if (window->zxdg_toplevel)
3636 zxdg_toplevel_v6_unset_maximized(window->zxdg_toplevel);
3641 _fullscreen_set(Ecore_Wl2_Window *window)
3643 EINA_SAFETY_ON_FALSE_RETURN(window->zxdg_toplevel || window->xdg_toplevel);
3645 if (window->set_config.fullscreen)
3647 window->saved = window->set_config.geometry;
3648 if (window->xdg_toplevel)
3649 xdg_toplevel_set_fullscreen(window->xdg_toplevel, NULL);
3650 if (window->zxdg_toplevel)
3651 zxdg_toplevel_v6_set_fullscreen(window->zxdg_toplevel, NULL);
3655 if (window->xdg_toplevel)
3656 xdg_toplevel_unset_fullscreen(window->xdg_toplevel);
3657 if (window->zxdg_toplevel)
3658 zxdg_toplevel_v6_unset_fullscreen(window->zxdg_toplevel);
3662 static struct wl_region *
3663 _region_create(struct wl_compositor *comp, int x, int y, int w, int h)
3665 struct wl_region *out;
3667 out = wl_compositor_create_region(comp);
3670 ERR("Failed to create region");
3674 wl_region_add(out, x, y, w, h);
3680 _regions_set(Ecore_Wl2_Window *window)
3682 struct wl_region *region = NULL;
3684 if (window->pending.opaque)
3686 if (window->opaque_set)
3688 region = _region_create(window->display->wl.compositor,
3689 window->opaque.x, window->opaque.y,
3690 window->opaque.w, window->opaque.h);
3691 if (!region) return;
3693 // TIZEN_ONLY(20201123)
3695 wl_surface_set_opaque_region(window->surface, region);
3697 _opaque_region_set(window, region);
3701 if (!window->pending.input) goto out;
3702 if (window->type == ECORE_WL2_WINDOW_TYPE_DND) goto out;
3704 if (!window->input_set)
3706 wl_surface_set_input_region(window->surface, NULL);
3710 if (region && (window->opaque.x == window->input_rect.x) &&
3711 (window->opaque.y == window->input_rect.y) &&
3712 (window->opaque.w == window->input_rect.w) &&
3713 (window->opaque.h == window->input_rect.h))
3715 wl_surface_set_input_region(window->surface, region);
3718 if (region) wl_region_destroy(region);
3720 region = _region_create(window->display->wl.compositor,
3721 window->input_rect.x, window->input_rect.y,
3722 window->input_rect.w, window->input_rect.h);
3723 if (!region) return;
3724 wl_surface_set_input_region(window->surface, region);
3727 if (region) wl_region_destroy(region);
3730 // TIZEN_ONLY(20201123)
3732 _opaque_region_set(Ecore_Wl2_Window *window, struct wl_region *region)
3734 if (!window) return;
3735 if (!window->surface) return;
3737 wl_surface_set_opaque_region(window->surface, region);
3739 window->pending.opaque = EINA_FALSE;
3743 // TIZEN_ONLY(20190910)
3745 _opaque_set(Ecore_Wl2_Window *window)
3747 struct wl_region *region;
3749 if (!window->opaque_set)
3751 if (window->surface)
3752 _opaque_region_set(window, NULL);
3756 region = wl_compositor_create_region(window->display->wl.compositor);
3759 ERR("Failed to create opaque region");
3763 wl_region_add(region, window->opaque.x, window->opaque.y,
3764 window->opaque.w, window->opaque.h);
3765 _opaque_region_set(window, region);
3766 wl_region_destroy(region);
3771 ecore_wl2_window_commit(Ecore_Wl2_Window *window, Eina_Bool flush)
3773 EINA_SAFETY_ON_NULL_RETURN(window);
3774 EINA_SAFETY_ON_NULL_RETURN(window->surface);
3776 if (window->commit_pending)
3778 if (window->callback)
3779 wl_callback_destroy(window->callback);
3780 window->callback = NULL;
3781 WRN("Commit before previous commit processed");
3783 if (!window->pending.configure)
3785 if (window->has_buffer)
3786 window->commit_pending = EINA_TRUE;
3787 if (!window->callback)
3789 window->callback = wl_surface_frame(window->surface);
3790 wl_callback_add_listener(window->callback, &_frame_listener, window);
3792 /* Dispatch any state we've been saving along the way */
3793 if (window->pending.geom)
3797 ecore_wl2_window_geometry_get(window, &gx, &gy, &gw, &gh);
3798 if (window->xdg_toplevel)
3799 xdg_surface_set_window_geometry(window->xdg_surface,
3801 if (window->zxdg_surface)
3802 zxdg_surface_v6_set_window_geometry(window->zxdg_surface,
3805 // TIZEN_ONLY(20220421) : update window's saved size only un-fullscreen and unmaximize state
3806 if (!window->set_config.fullscreen && !window->set_config.maximized)
3808 window->saved.w = window->set_config.geometry.w;
3809 window->saved.h = window->set_config.geometry.h;
3813 if (window->pending.opaque || window->pending.input)
3814 _regions_set(window);
3816 if (window->pending.maximized)
3817 _maximized_set(window);
3819 if (window->pending.fullscreen)
3820 _fullscreen_set(window);
3822 window->pending.geom = EINA_FALSE;
3823 window->pending.opaque = EINA_FALSE;
3824 window->pending.input = EINA_FALSE;
3825 window->pending.maximized = EINA_FALSE;
3826 window->pending.fullscreen = EINA_FALSE;
3829 if (window->req_config.serial != window->set_config.serial)
3831 if (window->xdg_configure_ack && window->xdg_surface)
3832 window->xdg_configure_ack(window->xdg_surface,
3833 window->req_config.serial);
3834 if (window->zxdg_configure_ack && window->zxdg_surface)
3835 window->zxdg_configure_ack(window->zxdg_surface,
3836 window->req_config.serial);
3837 window->set_config.serial = window->req_config.serial;
3841 wl_surface_commit(window->surface);
3842 ecore_wl2_display_flush(window->display);
3845 if (!window->updating) return;
3847 window->updating = EINA_FALSE;
3848 if (window->def_config.serial != window->set_config.serial)
3849 _ecore_wl2_window_configure_send(window);
3853 ecore_wl2_window_false_commit(Ecore_Wl2_Window *window)
3855 EINA_SAFETY_ON_NULL_RETURN(window);
3856 EINA_SAFETY_ON_NULL_RETURN(window->surface);
3857 EINA_SAFETY_ON_TRUE_RETURN(window->pending.configure);
3858 EINA_SAFETY_ON_TRUE_RETURN(window->commit_pending);
3860 if (!window->callback)
3862 window->callback = wl_surface_frame(window->surface);
3863 wl_callback_add_listener(window->callback, &_frame_listener, window);
3865 wl_surface_commit(window->surface);
3866 ecore_wl2_display_flush(window->display);
3867 if (window->has_buffer)
3868 window->commit_pending = EINA_TRUE;
3872 ecore_wl2_window_pending_get(Ecore_Wl2_Window *window)
3874 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
3876 return window->commit_pending;
3879 EAPI Ecore_Wl2_Frame_Cb_Handle *
3880 ecore_wl2_window_frame_callback_add(Ecore_Wl2_Window *window, Ecore_Wl2_Frame_Cb cb, void *data)
3882 Ecore_Wl2_Frame_Cb_Handle *callback;
3884 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
3885 EINA_SAFETY_ON_NULL_RETURN_VAL(cb, NULL);
3887 callback = malloc(sizeof(*callback));
3888 EINA_SAFETY_ON_NULL_RETURN_VAL(callback, NULL);
3890 callback->data = data;
3891 callback->win = window;
3892 window->frame_callbacks =
3893 eina_inlist_append(window->frame_callbacks, EINA_INLIST_GET(callback));
3898 ecore_wl2_window_frame_callback_del(Ecore_Wl2_Frame_Cb_Handle *handle)
3900 EINA_SAFETY_ON_NULL_RETURN(handle);
3902 handle->win->frame_callbacks =
3903 eina_inlist_remove(handle->win->frame_callbacks, EINA_INLIST_GET(handle));
3908 ecore_wl2_window_buffer_attach(Ecore_Wl2_Window *win, void *buffer, int x, int y, Eina_Bool implicit)
3910 EINA_SAFETY_ON_NULL_RETURN(win);
3911 EINA_SAFETY_ON_NULL_RETURN(win->surface);
3913 /* FIXME: Haven't given any thought to x and y since we always use 0... */
3914 if (!implicit) wl_surface_attach(win->surface, buffer, x, y);
3915 win->buffer = buffer;
3916 if (!implicit && !buffer)
3917 win->has_buffer = EINA_FALSE;
3919 win->has_buffer = EINA_TRUE;
3923 ecore_wl2_window_resizing_get(Ecore_Wl2_Window *window)
3925 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EINA_FALSE);
3927 return window->req_config.resizing;
3931 ecore_wl2_window_update_begin(Ecore_Wl2_Window *window)
3933 EINA_SAFETY_ON_NULL_RETURN(window);
3934 EINA_SAFETY_ON_TRUE_RETURN(window->updating);
3936 window->updating = EINA_TRUE;
3940 ecore_wl2_window_damage(Ecore_Wl2_Window *window, Eina_Rectangle *rects, unsigned int count)
3942 void (*damage)(struct wl_surface *, int32_t, int32_t, int32_t, int32_t);
3944 int compositor_version;
3946 EINA_SAFETY_ON_NULL_RETURN(window);
3948 compositor_version = window->display->wl.compositor_version;
3950 if (compositor_version >= WL_SURFACE_DAMAGE_BUFFER_SINCE_VERSION)
3951 damage = wl_surface_damage_buffer;
3953 damage = wl_surface_damage;
3955 if ((rects) && (count > 0))
3956 for (k = 0; k < count; k++)
3957 damage(window->surface, rects[k].x, rects[k].y, rects[k].w, rects[k].h);
3959 damage(window->surface, 0, 0, INT_MAX, INT_MAX);
3963 ecore_wl2_window_surface_flush(Ecore_Wl2_Window *window, Eina_Bool purge)
3965 EINA_SAFETY_ON_NULL_RETURN(window);
3967 if (!window->wl2_surface) return;
3968 ecore_wl2_surface_flush(window->wl2_surface, purge);
3971 EAPI Ecore_Wl2_Window_Type
3972 ecore_wl2_window_type_get(Ecore_Wl2_Window *window)
3974 EINA_SAFETY_ON_NULL_RETURN_VAL(window, ECORE_WL2_WINDOW_TYPE_NONE);
3975 return window->type;
3978 EAPI Ecore_Wl2_Window *
3979 ecore_wl2_window_surface_find(struct wl_surface *surface)
3981 Ecore_Wl2_Display *ewd;
3982 Ecore_Wl2_Window *win;
3984 EINA_SAFETY_ON_NULL_RETURN_VAL(surface, NULL);
3986 ewd = ecore_wl2_connected_display_get(NULL);
3987 EINA_SAFETY_ON_NULL_RETURN_VAL(ewd, NULL);
3989 win = ecore_wl2_display_window_find_by_surface(ewd, surface);
3993 // TIZEN_ONLY(20171107): add ecore_wl2_window_input_get() EAPI
3994 EAPI Ecore_Wl2_Input *
3995 ecore_wl2_window_input_get(Ecore_Wl2_Window *win)
3997 Ecore_Wl2_Input *input;
3999 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
4000 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, NULL);
4002 EINA_INLIST_FOREACH(win->display->inputs, input)
4004 if (input->focus.pointer) return input;
4005 //This code will be changed after adding ecore_wl2_window_keyboard_get API
4006 if (input->focus.keyboard) return input;
4013 // TIZEN_ONLY(20200326): add ecore_wl2_window_pointer_get() EAPI
4014 EAPI Ecore_Wl2_Input *
4015 ecore_wl2_window_pointer_get(Ecore_Wl2_Window *win)
4017 Ecore_Wl2_Input *input;
4019 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
4020 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, NULL);
4022 EINA_INLIST_FOREACH(win->display->inputs, input)
4023 if (input->focus.pointer == win) return input;
4029 // TIZEN_ONLY(20200326): add ecore_wl2_window_keyboard_get() EAPI
4030 EAPI Ecore_Wl2_Input *
4031 ecore_wl2_window_keyboard_get(Ecore_Wl2_Window *win)
4033 Ecore_Wl2_Input *input;
4035 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
4036 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, NULL);
4038 EINA_INLIST_FOREACH(win->display->inputs, input)
4039 if (input->focus.keyboard == win) return input;
4045 // TIZEN_ONLY(20171114): support a pointer warp
4047 ecore_wl2_window_pointer_warp(Ecore_Wl2_Window *win, int x, int y)
4049 Ecore_Wl2_Display *ewd;
4051 /* FIXME: visible is not merged yet. */
4052 //if (!win || !win->surface || !win->visible) return EINA_FALSE;
4053 if (!win || !win->surface) return EINA_FALSE;
4056 if (!ewd || !ewd->wl.tz_input_device_manager) return EINA_FALSE;
4058 tizen_input_device_manager_pointer_warp(ewd->wl.tz_input_device_manager,
4059 win->surface, wl_fixed_from_int(x), wl_fixed_from_int(y));
4065 // TIZEN_ONLY(20200601): support sync between ui and video
4066 /* The video surface created in ecore_wl2 is used for informing the video area.
4067 And there is another video surface created on the player side. The player
4068 video surface is filled with video data, and the garbage data of ecore_wl2
4069 video surface can interfere with video data. So fill it with zero here. */
4071 buffer_fill_zero(tbm_surface_h surface)
4073 tbm_surface_info_s info;
4075 unsigned int height, stride;
4077 ret = tbm_surface_map(surface, TBM_OPTION_WRITE, &info);
4078 if (ret != TBM_SURFACE_ERROR_NONE)
4081 img = (int *)info.planes[0].ptr;
4082 height = tbm_surface_get_height(surface);
4083 stride = info.planes[0].stride;
4085 memset(img, 0x0, sizeof(int) * stride * height);
4087 tbm_surface_unmap(surface);
4094 ecore_wl2_window_video_surface_create(Ecore_Wl2_Window *win)
4096 Ecore_Wl2_Display *display;
4098 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
4099 if (win->video.surface) return EINA_TRUE;
4101 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, EINA_FALSE);
4102 display = win->display;
4104 EINA_SAFETY_ON_NULL_RETURN_VAL(display->wl.compositor, EINA_FALSE);
4105 EINA_SAFETY_ON_NULL_RETURN_VAL(display->wl.subcompositor, EINA_FALSE);
4106 EINA_SAFETY_ON_NULL_RETURN_VAL(display->wl.tz_policy, EINA_FALSE);
4108 win->video.surface = wl_compositor_create_surface(display->wl.compositor);
4110 if (!win->video.surface)
4112 ERR("Failed to create video surface");
4116 win->video.subsurface =
4117 wl_subcompositor_get_subsurface(display->wl.subcompositor,
4118 win->video.surface, win->surface);
4120 if (!win->video.subsurface)
4122 ERR("Failed to create video subsurface");
4123 goto get_subsurf_err;
4126 tizen_policy_place_subsurface_below_parent(display->wl.tz_policy, win->video.subsurface);
4128 if (!win->tbm_client)
4130 win->tbm_client = wayland_tbm_client_init(display->wl.display);
4131 if (!win->tbm_client)
4133 ERR("Failed to init wayland tbm client");
4134 goto client_init_err;
4138 win->video.tbm_surface = tbm_surface_create(1, 1, TBM_FORMAT_ARGB8888);
4139 if (!win->video.tbm_surface)
4141 ERR("Failed to create tbm surface");
4142 goto client_init_err;
4145 win->video.wl_buffer = wayland_tbm_client_create_buffer(win->tbm_client,
4146 win->video.tbm_surface);
4147 if (!win->video.wl_buffer)
4149 ERR("Failed to create buffer of tbm client");
4150 goto create_buf_err;
4153 if (!buffer_fill_zero(win->video.tbm_surface))
4155 ERR("Failed to fill buffer to zero");
4159 /* A sub-surface is initially in the synchronized mode. */
4160 win->video.sync = EINA_TRUE;
4162 /* need to attach surface */
4163 wl_surface_attach(win->video.surface, win->video.wl_buffer, 0, 0);
4164 wl_surface_commit(win->video.surface);
4169 wayland_tbm_client_destroy_buffer(win->tbm_client, win->video.wl_buffer);
4170 win->video.wl_buffer = NULL;
4173 tbm_surface_destroy(win->video.tbm_surface);
4174 win->video.tbm_surface = NULL;
4177 wl_subsurface_destroy(win->video.subsurface);
4178 win->video.subsurface = NULL;
4181 wl_surface_destroy(win->video.surface);
4182 win->video.surface = NULL;
4188 ecore_wl2_window_video_surface_get(Ecore_Wl2_Window *win)
4190 EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
4191 return win->video.surface;
4195 ecore_wl2_window_video_surface_destroy(Ecore_Wl2_Window *win)
4197 Ecore_Wl2_Display *display;
4199 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
4200 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, EINA_FALSE);
4202 display = win->display;
4204 if (display->wl.tz_video)
4206 tizen_video_destroy(display->wl.tz_video);
4207 display->wl.tz_video = NULL;
4210 _ecore_wl2_window_video_surface_destroy(win);
4216 ecore_wl2_window_video_surface_sync_set(Ecore_Wl2_Window *win, Eina_Bool sync)
4218 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
4219 EINA_SAFETY_ON_NULL_RETURN_VAL(win->video.subsurface, EINA_FALSE);
4222 if (win->video.sync == sync) return EINA_TRUE;
4224 win->video.sync = sync;
4227 wl_subsurface_set_sync(win->video.subsurface);
4229 wl_subsurface_set_desync(win->video.subsurface);
4235 ecore_wl2_window_video_surface_destination_set(Ecore_Wl2_Window *win, int x, int y, int w, int h)
4237 Ecore_Wl2_Display *display;
4238 struct wl_registry *registry;
4239 Eina_Iterator *globals;
4240 Ecore_Wl2_Global *global;
4242 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
4243 EINA_SAFETY_ON_NULL_RETURN_VAL(win->display, EINA_FALSE);
4244 EINA_SAFETY_ON_NULL_RETURN_VAL(win->video.surface, EINA_FALSE);
4246 display = win->display;
4248 if (!win->video.viewport)
4250 if (!display->wl.tz_video)
4252 registry = ecore_wl2_display_registry_get(display);
4253 if (!registry) return EINA_FALSE;
4255 globals = ecore_wl2_display_globals_get(display);
4256 if (!globals) return EINA_FALSE;
4258 EINA_ITERATOR_FOREACH(globals, global)
4260 if (strcmp(global->interface, "tizen_video") == 0)
4262 display->wl.tz_video = wl_registry_bind(registry, global->id, &tizen_video_interface, 1);
4268 if (!display->wl.tz_video)
4270 ERR("Failed to bind tizen video interface");
4274 win->video.viewport = tizen_video_get_viewport(display->wl.tz_video, win->video.surface);
4277 if (!win->video.viewport)
4279 ERR("Failed to get video viewport");
4283 tizen_viewport_set_destination(win->video.viewport, x, y, w, h);
4284 wl_surface_commit(win->video.surface);
4290 ecore_wl2_window_render_sync_fd_create(Ecore_Wl2_Window *win, Ecore_Wl2_Window_Render_Sync_Type sync_type)
4294 EINA_SAFETY_ON_NULL_RETURN_VAL(win, sync_fd);
4295 EINA_SAFETY_ON_NULL_RETURN_VAL(win->egl_win, sync_fd);
4299 case ECORE_WL2_WINDOW_RENDER_SYNC_COMMIT:
4300 sync_fd = wl_egl_window_tizen_create_commit_sync_fd(win->egl_win->native_win);
4302 case ECORE_WL2_WINDOW_RENDER_SYNC_PRESENT:
4303 sync_fd = wl_egl_window_tizen_create_presentation_sync_fd(win->egl_win->native_win);
4313 //TIZEN_ONLY: ecore_wl2: add ecore_wl_window_video_has
4315 ecore_wl2_window_video_has(Ecore_Wl2_Window *window, Eina_Bool has)
4317 Ecore_Wl2_Display *display;
4320 EINA_SAFETY_ON_NULL_RETURN(window);
4322 display = window->display;
4323 if (!display->wl.tz_policy) return;
4325 ver = wl_proxy_get_version((struct wl_proxy *)display->wl.tz_policy);
4328 tizen_policy_has_video(display->wl.tz_policy, window->surface, has);
4332 //TIZEN_ONLY(20171115): support output transform
4334 _ecore_wl2_window_ignore_output_transform_set(Ecore_Wl2_Window *window, Eina_Bool ignore)
4336 if (!window) return;
4338 window->ignore_output_transform = ignore;
4342 ecore_wl2_window_ignore_output_transform_get(Ecore_Wl2_Window *window)
4344 return window->ignore_output_transform;
4348 // TIZEN_ONLY(20171207): add functions to set client's custom cursors
4350 ecore_wl2_window_pointer_set(Ecore_Wl2_Window *win, struct wl_surface *surface, int hot_x, int hot_y)
4352 Ecore_Wl2_Input *input;
4356 win->pointer.surface = surface;
4357 win->pointer.hot_x = hot_x;
4358 win->pointer.hot_y = hot_y;
4359 win->pointer.set = EINA_TRUE;
4361 if ((input = win->pointer.device))
4362 ecore_wl2_input_pointer_set(input, surface, hot_x, hot_y);
4366 ecore_wl2_window_cursor_from_name_set(Ecore_Wl2_Window *win, const char *cursor_name)
4368 Ecore_Wl2_Input *input;
4372 win->pointer.set = EINA_FALSE;
4374 if (!(input = win->pointer.device))
4377 eina_stringshare_replace(&win->pointer.cursor_name, cursor_name);
4379 if ((input->cursor.name) && (strcmp(input->cursor.name, win->pointer.cursor_name)))
4380 ecore_wl2_input_cursor_from_name_set(input, cursor_name);
4384 ecore_wl2_window_cursor_default_restore(Ecore_Wl2_Window *win)
4386 Ecore_Wl2_Input *input;
4390 win->pointer.set = EINA_FALSE;
4392 if ((input = win->pointer.device))
4393 ecore_wl2_input_cursor_default_restore(input);
4397 //TIZEN_ONLY(20180810): support client demand move resize
4399 ecore_wl2_window_sync_geometry_set(Ecore_Wl2_Window *window, uint32_t serial, int x, int y, int w, int h)
4401 if (!window) return;
4403 if ((window->set_config.geometry.x != x) ||
4404 (window->set_config.geometry.y != y) ||
4405 (window->set_config.geometry.w != w) ||
4406 (window->set_config.geometry.h != h))
4407 window->pending.geom = EINA_TRUE;
4409 window->set_config.geometry.x = x;
4410 window->set_config.geometry.y = y;
4411 window->set_config.geometry.w = w;
4412 window->set_config.geometry.h = h;
4414 if (window->display->wl.tz_moveresize)
4415 tizen_move_resize_set_geometry(window->display->wl.tz_moveresize, window->surface, serial, x, y, w, h);
4417 // TIZEN_ONLY(20190807): Support for wl_egl interface
4418 if (window->egl_win)
4420 window->egl_win->sync_geom.serial = serial;
4421 window->egl_win->sync_geom.w = w;
4422 window->egl_win->sync_geom.h = h;
4424 wl_egl_window_tizen_set_window_serial(window->egl_win->native_win, serial);
4430 // TIZEN_ONLY(20190807): Support for wl_egl interface
4431 EAPI Ecore_Wl2_Egl_Window *
4432 ecore_wl2_egl_window_create(Ecore_Wl2_Window *window, int w, int h)
4434 Ecore_Wl2_Egl_Window *egl_win = NULL;
4435 struct wl_egl_window *native_win = NULL;
4436 int cap = WL_EGL_WINDOW_TIZEN_CAPABILITY_NONE;
4438 EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
4439 EINA_SAFETY_ON_NULL_RETURN_VAL(window->surface, NULL);
4440 EINA_SAFETY_ON_FALSE_RETURN_VAL((window->egl_win == NULL), NULL);
4441 EINA_SAFETY_ON_FALSE_RETURN_VAL((w >= 0), NULL);
4442 EINA_SAFETY_ON_FALSE_RETURN_VAL((h >= 0), NULL);
4444 native_win = wl_egl_window_create(window->surface, w, h);
4445 EINA_SAFETY_ON_NULL_RETURN_VAL(native_win, NULL);
4447 egl_win = calloc(1, sizeof(Ecore_Wl2_Egl_Window));
4448 EINA_SAFETY_ON_NULL_GOTO(egl_win, failed);
4450 egl_win->win = window;
4451 egl_win->native_win = native_win;
4455 window->egl_win = egl_win;
4457 cap = wl_egl_window_tizen_get_capabilities(native_win);
4458 if (cap == WL_EGL_WINDOW_TIZEN_CAPABILITY_ROTATION_SUPPORTED)
4459 egl_win->support_pre_rotation = EINA_TRUE;
4464 if (native_win) wl_egl_window_destroy(native_win);
4469 ecore_wl2_egl_window_destroy(Ecore_Wl2_Egl_Window *egl_win)
4471 EINA_SAFETY_ON_NULL_RETURN(egl_win);
4473 if (egl_win->native_win)
4474 wl_egl_window_destroy(egl_win->native_win);
4477 egl_win->win->egl_win = NULL;
4479 memset(egl_win, 0, sizeof(Ecore_Wl2_Egl_Window));
4484 ecore_wl2_egl_window_native_get(Ecore_Wl2_Egl_Window *egl_win)
4486 EINA_SAFETY_ON_NULL_RETURN_VAL(egl_win, NULL);
4487 return (void *)egl_win->native_win;
4491 ecore_wl2_egl_window_resize_with_rotation(Ecore_Wl2_Egl_Window *egl_win, int dx, int dy, int w, int h, int rotation)
4493 int rot = rotation % 360;
4495 EINA_SAFETY_ON_NULL_RETURN(egl_win);
4497 egl_win->rot.buffer = rot;
4498 egl_win->rot.win = rot;
4504 if (egl_win->support_pre_rotation)
4505 wl_egl_window_tizen_set_rotation(egl_win->native_win, egl_win->rot.win);
4507 //TIZEN_ONLY(20171115): support output transform
4508 /* buffer_transform: screen rotation + window rotation
4509 * window_transform: window rotation only
4510 * We have to let the display server know the window rotation value
4511 * because the display server needs to calcuate the screen rotation value
4512 * from buffer_transform value.
4514 wl_egl_window_tizen_set_buffer_transform(egl_win->native_win, egl_win->rot.buffer / 90);
4515 wl_egl_window_tizen_set_window_transform(egl_win->native_win, egl_win->rot.win / 90);
4518 if ((egl_win->rot.buffer == 90) || (egl_win->rot.buffer == 270))
4519 wl_egl_window_resize(egl_win->native_win, h, w, dx, dy);
4521 wl_egl_window_resize(egl_win->native_win, w, h, dx, dy);
4525 //TIZEN_ONLY(20220322): add resource id to window attribute
4527 ecore_wl2_window_resource_id_get(Ecore_Wl2_Window *window)
4529 EINA_SAFETY_ON_NULL_RETURN_VAL(window, 0);
4530 return window->resource_id;