1 
2 static void
_zxdg_surface_cb_configure(void * data,struct zxdg_surface_v6 * zxdg_surface EINA_UNUSED,uint32_t serial)3 _zxdg_surface_cb_configure(void *data, struct zxdg_surface_v6 *zxdg_surface EINA_UNUSED, uint32_t serial)
4 {
5    Ecore_Wl2_Window *window;
6 
7    window = data;
8    window->def_config.serial = serial;
9 
10    if (window->pending.configure)
11      {
12         window->saved.w = window->set_config.geometry.w;
13         window->saved.h = window->set_config.geometry.h;
14      }
15    if (window->pending.configure && window->updating)
16      ERR("Window shouldn't be rendering before initial configure");
17 
18    if (!window->updating)
19      _ecore_wl2_window_configure_send(window);
20 
21    if (window->pending.configure)
22      _configure_complete(window);
23 }
24 
25 static const struct zxdg_surface_v6_listener _zxdg_surface_listener =
26 {
27    _zxdg_surface_cb_configure,
28 };
29 
30 static void
_zxdg_toplevel_cb_configure(void * data,struct zxdg_toplevel_v6 * zxdg_toplevel EINA_UNUSED,int32_t width,int32_t height,struct wl_array * states)31 _zxdg_toplevel_cb_configure(void *data, struct zxdg_toplevel_v6 *zxdg_toplevel EINA_UNUSED, int32_t width, int32_t height, struct wl_array *states)
32 {
33    Ecore_Wl2_Window *win = data;
34    uint32_t *s;
35 
36    win->def_config.maximized = EINA_FALSE;
37    win->def_config.fullscreen = EINA_FALSE;
38    win->def_config.focused = EINA_FALSE;
39    win->def_config.resizing = EINA_FALSE;
40    win->def_config.geometry.w = width;
41    win->def_config.geometry.h = height;
42 
43    wl_array_for_each(s, states)
44      {
45         switch (*s)
46           {
47            case ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED:
48              win->def_config.maximized = EINA_TRUE;
49              break;
50            case ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN:
51              win->def_config.fullscreen = EINA_TRUE;
52              break;
53            case ZXDG_TOPLEVEL_V6_STATE_RESIZING:
54              win->def_config.resizing = EINA_TRUE;
55              break;
56            case ZXDG_TOPLEVEL_V6_STATE_ACTIVATED:
57              win->def_config.focused = EINA_TRUE;
58            default:
59              break;
60           }
61      }
62 }
63 
64 static void
_zxdg_toplevel_cb_close(void * data,struct zxdg_toplevel_v6 * zxdg_toplevel EINA_UNUSED)65 _zxdg_toplevel_cb_close(void *data, struct zxdg_toplevel_v6 *zxdg_toplevel EINA_UNUSED)
66 {
67    Ecore_Wl2_Window *win;
68 
69    win = data;
70    if (!win) return;
71 
72    ecore_wl2_window_free(win);
73 }
74 
75 static const struct zxdg_toplevel_v6_listener _zxdg_toplevel_listener =
76 {
77    _zxdg_toplevel_cb_configure,
78    _zxdg_toplevel_cb_close,
79 };
80 
81 static void
_zxdg_popup_cb_configure(void * data,struct zxdg_popup_v6 * zxdg_popup EINA_UNUSED,int32_t x EINA_UNUSED,int32_t y EINA_UNUSED,int32_t width,int32_t height)82 _zxdg_popup_cb_configure(void *data, struct zxdg_popup_v6 *zxdg_popup EINA_UNUSED, int32_t x EINA_UNUSED, int32_t y EINA_UNUSED, int32_t width, int32_t height)
83 {
84    Ecore_Wl2_Window *win = data;
85    win->def_config.geometry.w = width;
86    win->def_config.geometry.h = height;
87 }
88 
89 static void
_zxdg_popup_cb_done(void * data,struct zxdg_popup_v6 * zxdg_popup EINA_UNUSED)90 _zxdg_popup_cb_done(void *data, struct zxdg_popup_v6 *zxdg_popup EINA_UNUSED)
91 {
92    Ecore_Wl2_Window *win;
93 
94    win = data;
95    if (!win) return;
96 
97    if (win->grab) _ecore_wl2_input_ungrab(win->grab);
98 }
99 
100 static const struct zxdg_popup_v6_listener _zxdg_popup_listener =
101 {
102    _zxdg_popup_cb_configure,
103    _zxdg_popup_cb_done,
104 };
105 
106 static void
_window_v6_popup_create(Ecore_Wl2_Window * win)107 _window_v6_popup_create(Ecore_Wl2_Window *win)
108 {
109    struct zxdg_positioner_v6 *pos;
110    int ww, wh;
111 
112    EINA_SAFETY_ON_NULL_RETURN(win->parent);
113    pos = zxdg_shell_v6_create_positioner(win->display->wl.zxdg_shell);
114    if (!pos) return;
115 
116    ecore_wl2_window_geometry_get(win, NULL, NULL, &ww, &wh);
117 
118    zxdg_positioner_v6_set_anchor_rect(pos, 0, 0, 1, 1);
119    zxdg_positioner_v6_set_size(pos, ww, wh);
120    zxdg_positioner_v6_set_anchor(pos, ZXDG_POSITIONER_V6_ANCHOR_TOP |
121                                  ZXDG_POSITIONER_V6_ANCHOR_LEFT);
122    zxdg_positioner_v6_set_gravity(pos, ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
123                                   ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
124 
125    win->zxdg_popup = zxdg_surface_v6_get_popup(win->zxdg_surface,
126                                win->parent->zxdg_surface, pos);
127 
128    zxdg_positioner_v6_destroy(pos);
129    if (win->grab)
130      zxdg_popup_v6_grab(win->zxdg_popup, win->grab->wl.seat,
131                         wl_display_get_serial(win->display->wl.display));
132    zxdg_popup_v6_set_user_data(win->zxdg_popup, win);
133    zxdg_popup_v6_add_listener(win->zxdg_popup, &_zxdg_popup_listener, win);
134 
135    win->pending.configure = EINA_TRUE;
136 
137    ecore_wl2_window_commit(win, EINA_TRUE);
138 }
139 
140 static void
_window_v6_shell_surface_create(Ecore_Wl2_Window * window)141 _window_v6_shell_surface_create(Ecore_Wl2_Window *window)
142 {
143    if (window->zxdg_surface) return;
144    window->zxdg_surface =
145      zxdg_shell_v6_get_xdg_surface(window->display->wl.zxdg_shell,
146                                    window->surface);
147    zxdg_surface_v6_set_user_data(window->zxdg_surface, window);
148    zxdg_surface_v6_add_listener(window->zxdg_surface,
149                                 &_zxdg_surface_listener, window);
150 
151    window->zxdg_configure_ack = zxdg_surface_v6_ack_configure;
152    window->pending.configure = EINA_TRUE;
153 
154    if (window->type == ECORE_WL2_WINDOW_TYPE_MENU)
155      _window_v6_popup_create(window);
156    else
157      {
158         struct zxdg_toplevel_v6 *ptop = NULL;
159 
160         window->zxdg_toplevel =
161           zxdg_surface_v6_get_toplevel(window->zxdg_surface);
162         zxdg_toplevel_v6_set_user_data(window->zxdg_toplevel, window);
163         zxdg_toplevel_v6_add_listener(window->zxdg_toplevel,
164                                       &_zxdg_toplevel_listener, window);
165 
166         if (window->deferred_minimize)
167           zxdg_toplevel_v6_set_minimized(window->zxdg_toplevel);
168         window->deferred_minimize = EINA_FALSE;
169 
170         if (window->title)
171           zxdg_toplevel_v6_set_title(window->zxdg_toplevel, window->title);
172         if (window->class)
173           zxdg_toplevel_v6_set_app_id(window->zxdg_toplevel, window->class);
174 
175         window->zxdg_set_min_size = zxdg_toplevel_v6_set_min_size;
176         window->zxdg_set_max_size = zxdg_toplevel_v6_set_max_size;
177 
178         if (window->parent)
179           ptop = window->parent->zxdg_toplevel;
180 
181         if (ptop)
182           zxdg_toplevel_v6_set_parent(window->zxdg_toplevel, ptop);
183 
184         if (window->set_config.maximized)
185           zxdg_toplevel_v6_set_maximized(window->zxdg_toplevel);
186 
187         if (window->set_config.fullscreen)
188           zxdg_toplevel_v6_set_fullscreen(window->zxdg_toplevel, NULL);
189      }
190 
191    ecore_wl2_window_commit(window, EINA_TRUE);
192 }
193