diff options
Diffstat (limited to 'sway')
-rw-r--r-- | sway/desktop/layer_shell.c | 96 | ||||
-rw-r--r-- | sway/desktop/output.c | 6 | ||||
-rw-r--r-- | sway/meson.build | 10 | ||||
-rw-r--r-- | sway/server.c | 6 |
4 files changed, 114 insertions, 4 deletions
diff --git a/sway/desktop/layer_shell.c b/sway/desktop/layer_shell.c new file mode 100644 index 00000000..3cf171bd --- /dev/null +++ b/sway/desktop/layer_shell.c | |||
@@ -0,0 +1,96 @@ | |||
1 | #include <stdlib.h> | ||
2 | #include <wayland-server.h> | ||
3 | #include <wlr/util/log.h> | ||
4 | #include "sway/layers.h" | ||
5 | #include "sway/output.h" | ||
6 | #include "sway/server.h" | ||
7 | |||
8 | static void arrange_layers(struct sway_output *output) { | ||
9 | // TODO | ||
10 | } | ||
11 | |||
12 | static void handle_output_destroy(struct wl_listener *listener, void *data) { | ||
13 | // TODO | ||
14 | } | ||
15 | |||
16 | static void handle_output_mode(struct wl_listener *listener, void *data) { | ||
17 | // TODO | ||
18 | } | ||
19 | |||
20 | static void handle_output_transform(struct wl_listener *listener, void *data) { | ||
21 | // TODO | ||
22 | } | ||
23 | |||
24 | static void handle_surface_commit(struct wl_listener *listener, void *data) { | ||
25 | // TODO | ||
26 | } | ||
27 | |||
28 | static void handle_destroy(struct wl_listener *listener, void *data) { | ||
29 | // TODO | ||
30 | } | ||
31 | |||
32 | static void handle_map(struct wl_listener *listener, void *data) { | ||
33 | // TODO | ||
34 | } | ||
35 | |||
36 | static void handle_unmap(struct wl_listener *listener, void *data) { | ||
37 | // TODO | ||
38 | } | ||
39 | |||
40 | void handle_layer_shell_surface(struct wl_listener *listener, void *data) { | ||
41 | struct wlr_layer_surface *layer_surface = data; | ||
42 | struct sway_server *server = | ||
43 | wl_container_of(listener, server, layer_shell_surface); | ||
44 | wlr_log(L_DEBUG, "new layer surface: namespace %s layer %d anchor %d " | ||
45 | "size %dx%d margin %d,%d,%d,%d", | ||
46 | layer_surface->namespace, layer_surface->layer, layer_surface->layer, | ||
47 | layer_surface->client_pending.desired_width, | ||
48 | layer_surface->client_pending.desired_height, | ||
49 | layer_surface->client_pending.margin.top, | ||
50 | layer_surface->client_pending.margin.right, | ||
51 | layer_surface->client_pending.margin.bottom, | ||
52 | layer_surface->client_pending.margin.left); | ||
53 | |||
54 | struct sway_layer_surface *sway_layer = | ||
55 | calloc(1, sizeof(struct sway_layer_surface)); | ||
56 | if (!sway_layer) { | ||
57 | return; | ||
58 | } | ||
59 | |||
60 | sway_layer->surface_commit.notify = handle_surface_commit; | ||
61 | wl_signal_add(&layer_surface->surface->events.commit, | ||
62 | &sway_layer->surface_commit); | ||
63 | |||
64 | sway_layer->output_destroy.notify = handle_output_destroy; | ||
65 | wl_signal_add(&layer_surface->output->events.destroy, | ||
66 | &sway_layer->output_destroy); | ||
67 | |||
68 | sway_layer->output_mode.notify = handle_output_mode; | ||
69 | wl_signal_add(&layer_surface->output->events.mode, | ||
70 | &sway_layer->output_mode); | ||
71 | |||
72 | sway_layer->output_transform.notify = handle_output_transform; | ||
73 | wl_signal_add(&layer_surface->output->events.transform, | ||
74 | &sway_layer->output_transform); | ||
75 | |||
76 | sway_layer->destroy.notify = handle_destroy; | ||
77 | wl_signal_add(&layer_surface->events.destroy, &sway_layer->destroy); | ||
78 | sway_layer->map.notify = handle_map; | ||
79 | wl_signal_add(&layer_surface->events.map, &sway_layer->map); | ||
80 | sway_layer->unmap.notify = handle_unmap; | ||
81 | wl_signal_add(&layer_surface->events.unmap, &sway_layer->unmap); | ||
82 | // TODO: Listen for subsurfaces | ||
83 | |||
84 | sway_layer->layer_surface = layer_surface; | ||
85 | layer_surface->data = sway_layer; | ||
86 | |||
87 | struct sway_output *output = layer_surface->output->data; | ||
88 | wl_list_insert(&output->layers[layer_surface->layer], &sway_layer->link); | ||
89 | |||
90 | // Temporarily set the layer's current state to client_pending | ||
91 | // So that we can easily arrange it | ||
92 | struct wlr_layer_surface_state old_state = layer_surface->current; | ||
93 | layer_surface->current = layer_surface->client_pending; | ||
94 | arrange_layers(output); | ||
95 | layer_surface->current = old_state; | ||
96 | } | ||
diff --git a/sway/desktop/output.c b/sway/desktop/output.c index 6c990c47..a9aa47a6 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c | |||
@@ -236,6 +236,7 @@ void handle_new_output(struct wl_listener *listener, void *data) { | |||
236 | return; | 236 | return; |
237 | } | 237 | } |
238 | output->wlr_output = wlr_output; | 238 | output->wlr_output = wlr_output; |
239 | wlr_output->data = output; | ||
239 | output->server = server; | 240 | output->server = server; |
240 | 241 | ||
241 | if (!wl_list_empty(&wlr_output->modes)) { | 242 | if (!wl_list_empty(&wlr_output->modes)) { |
@@ -250,6 +251,11 @@ void handle_new_output(struct wl_listener *listener, void *data) { | |||
250 | return; | 251 | return; |
251 | } | 252 | } |
252 | 253 | ||
254 | size_t len = sizeof(output->layers) / sizeof(output->layers[0]); | ||
255 | for (size_t i = 0; i < len; ++i) { | ||
256 | wl_list_init(&output->layers[i]); | ||
257 | } | ||
258 | |||
253 | sway_input_manager_configure_xcursor(input_manager); | 259 | sway_input_manager_configure_xcursor(input_manager); |
254 | 260 | ||
255 | wl_signal_add(&wlr_output->events.frame, &output->frame); | 261 | wl_signal_add(&wlr_output->events.frame, &output->frame); |
diff --git a/sway/meson.build b/sway/meson.build index 26e56ad2..8bddb11b 100644 --- a/sway/meson.build +++ b/sway/meson.build | |||
@@ -46,6 +46,7 @@ sway_sources = files( | |||
46 | 'ipc-json.c', | 46 | 'ipc-json.c', |
47 | 'ipc-server.c', | 47 | 'ipc-server.c', |
48 | 'desktop/output.c', | 48 | 'desktop/output.c', |
49 | 'desktop/layer_shell.c', | ||
49 | 'desktop/wl_shell.c', | 50 | 'desktop/wl_shell.c', |
50 | 'desktop/xdg_shell_v6.c', | 51 | 'desktop/xdg_shell_v6.c', |
51 | 'desktop/xwayland.c', | 52 | 'desktop/xwayland.c', |
@@ -57,14 +58,15 @@ sway_sources = files( | |||
57 | ) | 58 | ) |
58 | 59 | ||
59 | sway_deps = [ | 60 | sway_deps = [ |
61 | jsonc, | ||
62 | libcap, | ||
63 | libinput, | ||
64 | math, | ||
60 | pcre, | 65 | pcre, |
61 | pixman, | 66 | pixman, |
67 | server_protos, | ||
62 | wayland_server, | 68 | wayland_server, |
63 | jsonc, | ||
64 | wlroots, | 69 | wlroots, |
65 | libcap, | ||
66 | math, | ||
67 | libinput, | ||
68 | xkbcommon, | 70 | xkbcommon, |
69 | ] | 71 | ] |
70 | 72 | ||
diff --git a/sway/server.c b/sway/server.c index ca08d7fb..92f72f13 100644 --- a/sway/server.c +++ b/sway/server.c | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <wlr/render/wlr_renderer.h> | 7 | #include <wlr/render/wlr_renderer.h> |
8 | #include <wlr/render/gles2.h> | 8 | #include <wlr/render/gles2.h> |
9 | #include <wlr/types/wlr_compositor.h> | 9 | #include <wlr/types/wlr_compositor.h> |
10 | #include <wlr/types/wlr_layer_shell.h> | ||
10 | #include <wlr/types/wlr_wl_shell.h> | 11 | #include <wlr/types/wlr_wl_shell.h> |
11 | // TODO WLR: make Xwayland optional | 12 | // TODO WLR: make Xwayland optional |
12 | #include <wlr/xwayland.h> | 13 | #include <wlr/xwayland.h> |
@@ -51,6 +52,11 @@ bool server_init(struct sway_server *server) { | |||
51 | server->new_output.notify = handle_new_output; | 52 | server->new_output.notify = handle_new_output; |
52 | wl_signal_add(&server->backend->events.new_output, &server->new_output); | 53 | wl_signal_add(&server->backend->events.new_output, &server->new_output); |
53 | 54 | ||
55 | server->layer_shell = wlr_layer_shell_create(server->wl_display); | ||
56 | wl_signal_add(&server->layer_shell->events.new_surface, | ||
57 | &server->layer_shell_surface); | ||
58 | server->layer_shell_surface.notify = handle_layer_shell_surface; | ||
59 | |||
54 | server->xdg_shell_v6 = wlr_xdg_shell_v6_create(server->wl_display); | 60 | server->xdg_shell_v6 = wlr_xdg_shell_v6_create(server->wl_display); |
55 | wl_signal_add(&server->xdg_shell_v6->events.new_surface, | 61 | wl_signal_add(&server->xdg_shell_v6->events.new_surface, |
56 | &server->xdg_shell_v6_surface); | 62 | &server->xdg_shell_v6_surface); |