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