aboutsummaryrefslogtreecommitdiffstats
path: root/sway/decoration.c
diff options
context:
space:
mode:
authorLibravatar emersion <contact@emersion.fr>2018-07-29 18:31:10 +0100
committerLibravatar emersion <contact@emersion.fr>2018-08-06 15:20:30 +0100
commit9d578e0a0f08e053dfc1982e32d9fda172b0087f (patch)
tree941f76c80794a5665264bd65ea1467490b1d615e /sway/decoration.c
parentListen to server-decoration mode changes (diff)
downloadsway-9d578e0a0f08e053dfc1982e32d9fda172b0087f.tar.gz
sway-9d578e0a0f08e053dfc1982e32d9fda172b0087f.tar.zst
sway-9d578e0a0f08e053dfc1982e32d9fda172b0087f.zip
Handle views created after decoration mode is sent for xdg-shell
Diffstat (limited to 'sway/decoration.c')
-rw-r--r--sway/decoration.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/sway/decoration.c b/sway/decoration.c
index 73b3f45d..0e3e67ac 100644
--- a/sway/decoration.c
+++ b/sway/decoration.c
@@ -9,6 +9,8 @@ static void server_decoration_handle_destroy(struct wl_listener *listener,
9 struct sway_server_decoration *deco = 9 struct sway_server_decoration *deco =
10 wl_container_of(listener, deco, destroy); 10 wl_container_of(listener, deco, destroy);
11 wl_list_remove(&deco->destroy.link); 11 wl_list_remove(&deco->destroy.link);
12 wl_list_remove(&deco->mode.link);
13 wl_list_remove(&deco->link);
12 free(deco); 14 free(deco);
13} 15}
14 16
@@ -18,9 +20,24 @@ static void server_decoration_handle_mode(struct wl_listener *listener,
18 wl_container_of(listener, deco, mode); 20 wl_container_of(listener, deco, mode);
19 struct sway_view *view = 21 struct sway_view *view =
20 view_from_wlr_surface(deco->wlr_server_decoration->surface); 22 view_from_wlr_surface(deco->wlr_server_decoration->surface);
23 if (view == NULL || view->surface != deco->wlr_server_decoration->surface) {
24 return;
25 }
21 26
22 // TODO 27 switch (view->type) {
23 wlr_log(WLR_ERROR, "%p %d", view, deco->wlr_server_decoration->mode); 28 case SWAY_VIEW_XDG_SHELL_V6:;
29 struct sway_xdg_shell_v6_view *xdg_shell_v6_view =
30 (struct sway_xdg_shell_v6_view *)view;
31 xdg_shell_v6_view->deco_mode = deco->wlr_server_decoration->mode;
32 break;
33 case SWAY_VIEW_XDG_SHELL:;
34 struct sway_xdg_shell_view *xdg_shell_view =
35 (struct sway_xdg_shell_view *)view;
36 xdg_shell_view->deco_mode = deco->wlr_server_decoration->mode;
37 break;
38 default:
39 break;
40 }
24} 41}
25 42
26void handle_server_decoration(struct wl_listener *listener, void *data) { 43void handle_server_decoration(struct wl_listener *listener, void *data) {
@@ -38,4 +55,17 @@ void handle_server_decoration(struct wl_listener *listener, void *data) {
38 55
39 wl_signal_add(&wlr_deco->events.mode, &deco->mode); 56 wl_signal_add(&wlr_deco->events.mode, &deco->mode);
40 deco->mode.notify = server_decoration_handle_mode; 57 deco->mode.notify = server_decoration_handle_mode;
58
59 wl_list_insert(&server.decorations, &deco->link);
60}
61
62struct sway_server_decoration *decoration_from_surface(
63 struct wlr_surface *surface) {
64 struct sway_server_decoration *deco;
65 wl_list_for_each(deco, &server.decorations, link) {
66 if (deco->wlr_server_decoration->surface == surface) {
67 return deco;
68 }
69 }
70 return NULL;
41} 71}