diff options
-rw-r--r-- | include/sway/decoration.h | 13 | ||||
-rw-r--r-- | include/sway/server.h | 10 | ||||
-rw-r--r-- | sway/decoration.c | 41 | ||||
-rw-r--r-- | sway/meson.build | 5 | ||||
-rw-r--r-- | sway/server.c | 9 |
5 files changed, 72 insertions, 6 deletions
diff --git a/include/sway/decoration.h b/include/sway/decoration.h new file mode 100644 index 00000000..c77c04c7 --- /dev/null +++ b/include/sway/decoration.h | |||
@@ -0,0 +1,13 @@ | |||
1 | #ifndef _SWAY_DECORATION_H | ||
2 | #define _SWAY_DECORATION_H | ||
3 | |||
4 | #include <wlr/types/wlr_server_decoration.h> | ||
5 | |||
6 | struct sway_server_decoration { | ||
7 | struct wlr_server_decoration *wlr_server_decoration; | ||
8 | |||
9 | struct wl_listener destroy; | ||
10 | struct wl_listener mode; | ||
11 | }; | ||
12 | |||
13 | #endif | ||
diff --git a/include/sway/server.h b/include/sway/server.h index a3782f91..7e73fb4f 100644 --- a/include/sway/server.h +++ b/include/sway/server.h | |||
@@ -4,12 +4,13 @@ | |||
4 | #include <wayland-server.h> | 4 | #include <wayland-server.h> |
5 | #include <wlr/backend.h> | 5 | #include <wlr/backend.h> |
6 | #include <wlr/backend/session.h> | 6 | #include <wlr/backend/session.h> |
7 | #include <wlr/render/wlr_renderer.h> | ||
7 | #include <wlr/types/wlr_compositor.h> | 8 | #include <wlr/types/wlr_compositor.h> |
8 | #include <wlr/types/wlr_data_device.h> | 9 | #include <wlr/types/wlr_data_device.h> |
9 | #include <wlr/types/wlr_layer_shell.h> | 10 | #include <wlr/types/wlr_layer_shell.h> |
11 | #include <wlr/types/wlr_server_decoration.h> | ||
10 | #include <wlr/types/wlr_xdg_shell_v6.h> | 12 | #include <wlr/types/wlr_xdg_shell_v6.h> |
11 | #include <wlr/types/wlr_xdg_shell.h> | 13 | #include <wlr/types/wlr_xdg_shell.h> |
12 | #include <wlr/render/wlr_renderer.h> | ||
13 | // TODO WLR: make Xwayland optional | 14 | // TODO WLR: make Xwayland optional |
14 | #include "list.h" | 15 | #include "list.h" |
15 | #include "config.h" | 16 | #include "config.h" |
@@ -42,11 +43,16 @@ struct sway_server { | |||
42 | 43 | ||
43 | struct wlr_xdg_shell *xdg_shell; | 44 | struct wlr_xdg_shell *xdg_shell; |
44 | struct wl_listener xdg_shell_surface; | 45 | struct wl_listener xdg_shell_surface; |
46 | |||
45 | #ifdef HAVE_XWAYLAND | 47 | #ifdef HAVE_XWAYLAND |
46 | struct sway_xwayland xwayland; | 48 | struct sway_xwayland xwayland; |
47 | struct wl_listener xwayland_surface; | 49 | struct wl_listener xwayland_surface; |
48 | struct wl_listener xwayland_ready; | 50 | struct wl_listener xwayland_ready; |
49 | #endif | 51 | #endif |
52 | |||
53 | struct wlr_server_decoration_manager *server_decoration_manager; | ||
54 | struct wl_listener server_decoration; | ||
55 | |||
50 | bool debug_txn_timings; | 56 | bool debug_txn_timings; |
51 | 57 | ||
52 | list_t *transactions; | 58 | list_t *transactions; |
@@ -71,4 +77,6 @@ void handle_xdg_shell_surface(struct wl_listener *listener, void *data); | |||
71 | #ifdef HAVE_XWAYLAND | 77 | #ifdef HAVE_XWAYLAND |
72 | void handle_xwayland_surface(struct wl_listener *listener, void *data); | 78 | void handle_xwayland_surface(struct wl_listener *listener, void *data); |
73 | #endif | 79 | #endif |
80 | void handle_server_decoration(struct wl_listener *listener, void *data); | ||
81 | |||
74 | #endif | 82 | #endif |
diff --git a/sway/decoration.c b/sway/decoration.c new file mode 100644 index 00000000..73b3f45d --- /dev/null +++ b/sway/decoration.c | |||
@@ -0,0 +1,41 @@ | |||
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 | free(deco); | ||
13 | } | ||
14 | |||
15 | static void server_decoration_handle_mode(struct wl_listener *listener, | ||
16 | void *data) { | ||
17 | struct sway_server_decoration *deco = | ||
18 | wl_container_of(listener, deco, mode); | ||
19 | struct sway_view *view = | ||
20 | view_from_wlr_surface(deco->wlr_server_decoration->surface); | ||
21 | |||
22 | // TODO | ||
23 | wlr_log(WLR_ERROR, "%p %d", view, deco->wlr_server_decoration->mode); | ||
24 | } | ||
25 | |||
26 | void handle_server_decoration(struct wl_listener *listener, void *data) { | ||
27 | struct wlr_server_decoration *wlr_deco = data; | ||
28 | |||
29 | struct sway_server_decoration *deco = calloc(1, sizeof(*deco)); | ||
30 | if (deco == NULL) { | ||
31 | return; | ||
32 | } | ||
33 | |||
34 | deco->wlr_server_decoration = wlr_deco; | ||
35 | |||
36 | wl_signal_add(&wlr_deco->events.destroy, &deco->destroy); | ||
37 | deco->destroy.notify = server_decoration_handle_destroy; | ||
38 | |||
39 | wl_signal_add(&wlr_deco->events.mode, &deco->mode); | ||
40 | deco->mode.notify = server_decoration_handle_mode; | ||
41 | } | ||
diff --git a/sway/meson.build b/sway/meson.build index c18fb6e2..2a457270 100644 --- a/sway/meson.build +++ b/sway/meson.build | |||
@@ -1,13 +1,14 @@ | |||
1 | sway_sources = files( | 1 | sway_sources = files( |
2 | 'main.c', | ||
3 | 'server.c', | ||
4 | 'commands.c', | 2 | 'commands.c', |
5 | 'config.c', | 3 | 'config.c', |
6 | 'criteria.c', | 4 | 'criteria.c', |
7 | 'debug-tree.c', | 5 | 'debug-tree.c', |
6 | 'decoration.c', | ||
8 | 'ipc-json.c', | 7 | 'ipc-json.c', |
9 | 'ipc-server.c', | 8 | 'ipc-server.c', |
9 | 'main.c', | ||
10 | 'security.c', | 10 | 'security.c', |
11 | 'server.c', | ||
11 | 'swaynag.c', | 12 | 'swaynag.c', |
12 | 13 | ||
13 | 'desktop/desktop.c', | 14 | 'desktop/desktop.c', |
diff --git a/sway/server.c b/sway/server.c index e8755360..bf6255bc 100644 --- a/sway/server.c +++ b/sway/server.c | |||
@@ -109,11 +109,14 @@ bool server_init(struct sway_server *server) { | |||
109 | } | 109 | } |
110 | #endif | 110 | #endif |
111 | 111 | ||
112 | // TODO: Integration with sway borders | 112 | server->server_decoration_manager = |
113 | struct wlr_server_decoration_manager *deco_manager = | ||
114 | wlr_server_decoration_manager_create(server->wl_display); | 113 | wlr_server_decoration_manager_create(server->wl_display); |
115 | wlr_server_decoration_manager_set_default_mode( | 114 | wlr_server_decoration_manager_set_default_mode( |
116 | deco_manager, WLR_SERVER_DECORATION_MANAGER_MODE_SERVER); | 115 | server->server_decoration_manager, |
116 | WLR_SERVER_DECORATION_MANAGER_MODE_SERVER); | ||
117 | wl_signal_add(&server->server_decoration_manager->events.new_decoration, | ||
118 | &server->server_decoration); | ||
119 | server->server_decoration.notify = handle_server_decoration; | ||
117 | 120 | ||
118 | wlr_linux_dmabuf_v1_create(server->wl_display, renderer); | 121 | wlr_linux_dmabuf_v1_create(server->wl_display, renderer); |
119 | wlr_export_dmabuf_manager_v1_create(server->wl_display); | 122 | wlr_export_dmabuf_manager_v1_create(server->wl_display); |