diff options
author | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-06-23 16:24:11 +1000 |
---|---|---|
committer | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-06-23 16:24:11 +1000 |
commit | 38398e2d77d57dc06b67ec88a54091c897915602 (patch) | |
tree | c80935807865fd96ab7d037070287d4dfaba1863 /sway/desktop/xdg_shell_v6.c | |
parent | Preserve buffers during transactions (diff) | |
download | sway-38398e2d77d57dc06b67ec88a54091c897915602.tar.gz sway-38398e2d77d57dc06b67ec88a54091c897915602.tar.zst sway-38398e2d77d57dc06b67ec88a54091c897915602.zip |
Implement atomic layout updates for tree operations
This implements atomic layout updates for when views map, reparent or
unmap.
Diffstat (limited to 'sway/desktop/xdg_shell_v6.c')
-rw-r--r-- | sway/desktop/xdg_shell_v6.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c index 7ec9e6cb..76c1fa24 100644 --- a/sway/desktop/xdg_shell_v6.c +++ b/sway/desktop/xdg_shell_v6.c | |||
@@ -143,16 +143,12 @@ static void _close(struct sway_view *view) { | |||
143 | } | 143 | } |
144 | } | 144 | } |
145 | 145 | ||
146 | static void destroy(struct sway_view *view) { | 146 | static void _free(struct sway_view *view) { |
147 | struct sway_xdg_shell_v6_view *xdg_shell_v6_view = | 147 | struct sway_xdg_shell_v6_view *xdg_shell_v6_view = |
148 | xdg_shell_v6_view_from_view(view); | 148 | xdg_shell_v6_view_from_view(view); |
149 | if (xdg_shell_v6_view == NULL) { | 149 | if (xdg_shell_v6_view == NULL) { |
150 | return; | 150 | return; |
151 | } | 151 | } |
152 | wl_list_remove(&xdg_shell_v6_view->destroy.link); | ||
153 | wl_list_remove(&xdg_shell_v6_view->map.link); | ||
154 | wl_list_remove(&xdg_shell_v6_view->unmap.link); | ||
155 | wl_list_remove(&xdg_shell_v6_view->request_fullscreen.link); | ||
156 | free(xdg_shell_v6_view); | 152 | free(xdg_shell_v6_view); |
157 | } | 153 | } |
158 | 154 | ||
@@ -164,7 +160,7 @@ static const struct sway_view_impl view_impl = { | |||
164 | .wants_floating = wants_floating, | 160 | .wants_floating = wants_floating, |
165 | .for_each_surface = for_each_surface, | 161 | .for_each_surface = for_each_surface, |
166 | .close = _close, | 162 | .close = _close, |
167 | .destroy = destroy, | 163 | .free = _free, |
168 | }; | 164 | }; |
169 | 165 | ||
170 | static void handle_commit(struct wl_listener *listener, void *data) { | 166 | static void handle_commit(struct wl_listener *listener, void *data) { |
@@ -173,7 +169,10 @@ static void handle_commit(struct wl_listener *listener, void *data) { | |||
173 | struct sway_view *view = &xdg_shell_v6_view->view; | 169 | struct sway_view *view = &xdg_shell_v6_view->view; |
174 | struct wlr_xdg_surface_v6 *xdg_surface_v6 = view->wlr_xdg_surface_v6; | 170 | struct wlr_xdg_surface_v6 *xdg_surface_v6 = view->wlr_xdg_surface_v6; |
175 | 171 | ||
176 | if (view->instructions->length) { | 172 | if (!view->swayc) { |
173 | return; | ||
174 | } | ||
175 | if (view->swayc->instructions->length) { | ||
177 | transaction_notify_view_ready(view, xdg_surface_v6->configure_serial); | 176 | transaction_notify_view_ready(view, xdg_surface_v6->configure_serial); |
178 | } | 177 | } |
179 | 178 | ||
@@ -191,11 +190,18 @@ static void handle_new_popup(struct wl_listener *listener, void *data) { | |||
191 | static void handle_unmap(struct wl_listener *listener, void *data) { | 190 | static void handle_unmap(struct wl_listener *listener, void *data) { |
192 | struct sway_xdg_shell_v6_view *xdg_shell_v6_view = | 191 | struct sway_xdg_shell_v6_view *xdg_shell_v6_view = |
193 | wl_container_of(listener, xdg_shell_v6_view, unmap); | 192 | wl_container_of(listener, xdg_shell_v6_view, unmap); |
193 | struct sway_view *view = &xdg_shell_v6_view->view; | ||
194 | 194 | ||
195 | view_unmap(&xdg_shell_v6_view->view); | 195 | if (!sway_assert(view->surface, "Cannot unmap unmapped view")) { |
196 | return; | ||
197 | } | ||
198 | |||
199 | struct sway_container *parent = view_unmap(view); | ||
200 | arrange_and_commit(parent); | ||
196 | 201 | ||
197 | wl_list_remove(&xdg_shell_v6_view->commit.link); | 202 | wl_list_remove(&xdg_shell_v6_view->commit.link); |
198 | wl_list_remove(&xdg_shell_v6_view->new_popup.link); | 203 | wl_list_remove(&xdg_shell_v6_view->new_popup.link); |
204 | view->surface = NULL; | ||
199 | } | 205 | } |
200 | 206 | ||
201 | static void handle_map(struct wl_listener *listener, void *data) { | 207 | static void handle_map(struct wl_listener *listener, void *data) { |
@@ -230,7 +236,13 @@ static void handle_map(struct wl_listener *listener, void *data) { | |||
230 | static void handle_destroy(struct wl_listener *listener, void *data) { | 236 | static void handle_destroy(struct wl_listener *listener, void *data) { |
231 | struct sway_xdg_shell_v6_view *xdg_shell_v6_view = | 237 | struct sway_xdg_shell_v6_view *xdg_shell_v6_view = |
232 | wl_container_of(listener, xdg_shell_v6_view, destroy); | 238 | wl_container_of(listener, xdg_shell_v6_view, destroy); |
233 | view_destroy(&xdg_shell_v6_view->view); | 239 | struct sway_view *view = &xdg_shell_v6_view->view; |
240 | wl_list_remove(&xdg_shell_v6_view->destroy.link); | ||
241 | wl_list_remove(&xdg_shell_v6_view->map.link); | ||
242 | wl_list_remove(&xdg_shell_v6_view->unmap.link); | ||
243 | wl_list_remove(&xdg_shell_v6_view->request_fullscreen.link); | ||
244 | view->wlr_xdg_surface_v6 = NULL; | ||
245 | view_destroy(view); | ||
234 | } | 246 | } |
235 | 247 | ||
236 | static void handle_request_fullscreen(struct wl_listener *listener, void *data) { | 248 | static void handle_request_fullscreen(struct wl_listener *listener, void *data) { |