diff options
author | Drew DeVault <sir@cmpwn.com> | 2018-08-06 11:32:17 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-06 11:32:17 -0400 |
commit | d8b65193c493e5826383a08593395a598ce4b503 (patch) | |
tree | 97a1da416928ad8d7d3cca2e3e7dd72c39f924b6 /sway/decoration.c | |
parent | Merge pull request #2392 from ianyfan/commands (diff) | |
parent | Handle views created after decoration mode is sent for xdg-shell-v6 (diff) | |
download | sway-d8b65193c493e5826383a08593395a598ce4b503.tar.gz sway-d8b65193c493e5826383a08593395a598ce4b503.tar.zst sway-d8b65193c493e5826383a08593395a598ce4b503.zip |
Merge pull request #2268 from emersion/server-decoration-borders
Enable borders on floating SSD xdg-shell views
Diffstat (limited to 'sway/decoration.c')
-rw-r--r-- | sway/decoration.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/sway/decoration.c b/sway/decoration.c new file mode 100644 index 00000000..0e3e67ac --- /dev/null +++ b/sway/decoration.c | |||
@@ -0,0 +1,71 @@ | |||
1 | #include <stdlib.h> | ||
2 | #include "sway/decoration.h" | ||
3 | #include "sway/server.h" | ||
4 | #include "sway/tree/view.h" | ||
5 | #include "log.h" | ||
6 | |||
7 | static void server_decoration_handle_destroy(struct wl_listener *listener, | ||
8 | void *data) { | ||
9 | struct sway_server_decoration *deco = | ||
10 | wl_container_of(listener, deco, destroy); | ||
11 | wl_list_remove(&deco->destroy.link); | ||
12 | wl_list_remove(&deco->mode.link); | ||
13 | wl_list_remove(&deco->link); | ||
14 | free(deco); | ||
15 | } | ||
16 | |||
17 | static void server_decoration_handle_mode(struct wl_listener *listener, | ||
18 | void *data) { | ||
19 | struct sway_server_decoration *deco = | ||
20 | wl_container_of(listener, deco, mode); | ||
21 | struct sway_view *view = | ||
22 | view_from_wlr_surface(deco->wlr_server_decoration->surface); | ||
23 | if (view == NULL || view->surface != deco->wlr_server_decoration->surface) { | ||
24 | return; | ||
25 | } | ||
26 | |||
27 | switch (view->type) { | ||
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 | } | ||
41 | } | ||
42 | |||
43 | void handle_server_decoration(struct wl_listener *listener, void *data) { | ||
44 | struct wlr_server_decoration *wlr_deco = data; | ||
45 | |||
46 | struct sway_server_decoration *deco = calloc(1, sizeof(*deco)); | ||
47 | if (deco == NULL) { | ||
48 | return; | ||
49 | } | ||
50 | |||
51 | deco->wlr_server_decoration = wlr_deco; | ||
52 | |||
53 | wl_signal_add(&wlr_deco->events.destroy, &deco->destroy); | ||
54 | deco->destroy.notify = server_decoration_handle_destroy; | ||
55 | |||
56 | wl_signal_add(&wlr_deco->events.mode, &deco->mode); | ||
57 | deco->mode.notify = server_decoration_handle_mode; | ||
58 | |||
59 | wl_list_insert(&server.decorations, &deco->link); | ||
60 | } | ||
61 | |||
62 | struct 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; | ||
71 | } | ||