diff options
Diffstat (limited to 'sway/server.c')
-rw-r--r-- | sway/server.c | 103 |
1 files changed, 84 insertions, 19 deletions
diff --git a/sway/server.c b/sway/server.c index f51fcfe2..627d80d6 100644 --- a/sway/server.c +++ b/sway/server.c | |||
@@ -7,24 +7,32 @@ | |||
7 | #include <wlr/backend.h> | 7 | #include <wlr/backend.h> |
8 | #include <wlr/backend/headless.h> | 8 | #include <wlr/backend/headless.h> |
9 | #include <wlr/backend/multi.h> | 9 | #include <wlr/backend/multi.h> |
10 | #include <wlr/backend/noop.h> | ||
11 | #include <wlr/backend/session.h> | 10 | #include <wlr/backend/session.h> |
11 | #include <wlr/config.h> | ||
12 | #include <wlr/render/wlr_renderer.h> | 12 | #include <wlr/render/wlr_renderer.h> |
13 | #include <wlr/types/wlr_compositor.h> | 13 | #include <wlr/types/wlr_compositor.h> |
14 | #include <wlr/types/wlr_data_control_v1.h> | 14 | #include <wlr/types/wlr_data_control_v1.h> |
15 | #include <wlr/types/wlr_drm_lease_v1.h> | ||
16 | #include <wlr/types/wlr_drm.h> | ||
15 | #include <wlr/types/wlr_export_dmabuf_v1.h> | 17 | #include <wlr/types/wlr_export_dmabuf_v1.h> |
16 | #include <wlr/types/wlr_gamma_control_v1.h> | 18 | #include <wlr/types/wlr_gamma_control_v1.h> |
17 | #include <wlr/types/wlr_idle.h> | 19 | #include <wlr/types/wlr_idle.h> |
18 | #include <wlr/types/wlr_layer_shell_v1.h> | 20 | #include <wlr/types/wlr_layer_shell_v1.h> |
21 | #include <wlr/types/wlr_linux_dmabuf_v1.h> | ||
19 | #include <wlr/types/wlr_pointer_constraints_v1.h> | 22 | #include <wlr/types/wlr_pointer_constraints_v1.h> |
20 | #include <wlr/types/wlr_primary_selection_v1.h> | 23 | #include <wlr/types/wlr_primary_selection_v1.h> |
21 | #include <wlr/types/wlr_relative_pointer_v1.h> | 24 | #include <wlr/types/wlr_relative_pointer_v1.h> |
22 | #include <wlr/types/wlr_screencopy_v1.h> | 25 | #include <wlr/types/wlr_screencopy_v1.h> |
23 | #include <wlr/types/wlr_server_decoration.h> | 26 | #include <wlr/types/wlr_server_decoration.h> |
27 | #include <wlr/types/wlr_subcompositor.h> | ||
24 | #include <wlr/types/wlr_tablet_v2.h> | 28 | #include <wlr/types/wlr_tablet_v2.h> |
25 | #include <wlr/types/wlr_viewporter.h> | 29 | #include <wlr/types/wlr_viewporter.h> |
26 | #include <wlr/types/wlr_xcursor_manager.h> | 30 | #include <wlr/types/wlr_xcursor_manager.h> |
31 | #include <wlr/types/wlr_xdg_activation_v1.h> | ||
27 | #include <wlr/types/wlr_xdg_decoration_v1.h> | 32 | #include <wlr/types/wlr_xdg_decoration_v1.h> |
33 | #include <wlr/types/wlr_xdg_foreign_registry.h> | ||
34 | #include <wlr/types/wlr_xdg_foreign_v1.h> | ||
35 | #include <wlr/types/wlr_xdg_foreign_v2.h> | ||
28 | #include <wlr/types/wlr_xdg_output_v1.h> | 36 | #include <wlr/types/wlr_xdg_output_v1.h> |
29 | #include "config.h" | 37 | #include "config.h" |
30 | #include "list.h" | 38 | #include "list.h" |
@@ -52,19 +60,52 @@ bool server_privileged_prepare(struct sway_server *server) { | |||
52 | return true; | 60 | return true; |
53 | } | 61 | } |
54 | 62 | ||
63 | static void handle_drm_lease_request(struct wl_listener *listener, void *data) { | ||
64 | /* We only offer non-desktop outputs, but in the future we might want to do | ||
65 | * more logic here. */ | ||
66 | |||
67 | struct wlr_drm_lease_request_v1 *req = data; | ||
68 | struct wlr_drm_lease_v1 *lease = wlr_drm_lease_request_v1_grant(req); | ||
69 | if (!lease) { | ||
70 | sway_log(SWAY_ERROR, "Failed to grant lease request"); | ||
71 | wlr_drm_lease_request_v1_reject(req); | ||
72 | } | ||
73 | } | ||
74 | |||
75 | #define SWAY_XDG_SHELL_VERSION 2 | ||
76 | |||
55 | bool server_init(struct sway_server *server) { | 77 | bool server_init(struct sway_server *server) { |
56 | sway_log(SWAY_DEBUG, "Initializing Wayland server"); | 78 | sway_log(SWAY_DEBUG, "Initializing Wayland server"); |
57 | 79 | ||
58 | struct wlr_renderer *renderer = wlr_backend_get_renderer(server->backend); | 80 | server->renderer = wlr_renderer_autocreate(server->backend); |
59 | assert(renderer); | 81 | if (!server->renderer) { |
82 | sway_log(SWAY_ERROR, "Failed to create renderer"); | ||
83 | return false; | ||
84 | } | ||
60 | 85 | ||
61 | wlr_renderer_init_wl_display(renderer, server->wl_display); | 86 | wlr_renderer_init_wl_shm(server->renderer, server->wl_display); |
62 | 87 | ||
63 | server->compositor = wlr_compositor_create(server->wl_display, renderer); | 88 | if (wlr_renderer_get_dmabuf_texture_formats(server->renderer) != NULL) { |
89 | wlr_drm_create(server->wl_display, server->renderer); | ||
90 | server->linux_dmabuf_v1 = | ||
91 | wlr_linux_dmabuf_v1_create(server->wl_display, server->renderer); | ||
92 | } | ||
93 | |||
94 | server->allocator = wlr_allocator_autocreate(server->backend, | ||
95 | server->renderer); | ||
96 | if (!server->allocator) { | ||
97 | sway_log(SWAY_ERROR, "Failed to create allocator"); | ||
98 | return false; | ||
99 | } | ||
100 | |||
101 | server->compositor = wlr_compositor_create(server->wl_display, | ||
102 | server->renderer); | ||
64 | server->compositor_new_surface.notify = handle_compositor_new_surface; | 103 | server->compositor_new_surface.notify = handle_compositor_new_surface; |
65 | wl_signal_add(&server->compositor->events.new_surface, | 104 | wl_signal_add(&server->compositor->events.new_surface, |
66 | &server->compositor_new_surface); | 105 | &server->compositor_new_surface); |
67 | 106 | ||
107 | wlr_subcompositor_create(server->wl_display); | ||
108 | |||
68 | server->data_device_manager = | 109 | server->data_device_manager = |
69 | wlr_data_device_manager_create(server->wl_display); | 110 | wlr_data_device_manager_create(server->wl_display); |
70 | 111 | ||
@@ -87,7 +128,8 @@ bool server_init(struct sway_server *server) { | |||
87 | &server->layer_shell_surface); | 128 | &server->layer_shell_surface); |
88 | server->layer_shell_surface.notify = handle_layer_shell_surface; | 129 | server->layer_shell_surface.notify = handle_layer_shell_surface; |
89 | 130 | ||
90 | server->xdg_shell = wlr_xdg_shell_create(server->wl_display); | 131 | server->xdg_shell = wlr_xdg_shell_create(server->wl_display, |
132 | SWAY_XDG_SHELL_VERSION); | ||
91 | wl_signal_add(&server->xdg_shell->events.new_surface, | 133 | wl_signal_add(&server->xdg_shell->events.new_surface, |
92 | &server->xdg_shell_surface); | 134 | &server->xdg_shell_surface); |
93 | server->xdg_shell_surface.notify = handle_xdg_shell_surface; | 135 | server->xdg_shell_surface.notify = handle_xdg_shell_surface; |
@@ -144,16 +186,40 @@ bool server_init(struct sway_server *server) { | |||
144 | server->foreign_toplevel_manager = | 186 | server->foreign_toplevel_manager = |
145 | wlr_foreign_toplevel_manager_v1_create(server->wl_display); | 187 | wlr_foreign_toplevel_manager_v1_create(server->wl_display); |
146 | 188 | ||
189 | sway_session_lock_init(); | ||
190 | |||
191 | server->drm_lease_manager= | ||
192 | wlr_drm_lease_v1_manager_create(server->wl_display, server->backend); | ||
193 | if (server->drm_lease_manager) { | ||
194 | server->drm_lease_request.notify = handle_drm_lease_request; | ||
195 | wl_signal_add(&server->drm_lease_manager->events.request, | ||
196 | &server->drm_lease_request); | ||
197 | } else { | ||
198 | sway_log(SWAY_DEBUG, "Failed to create wlr_drm_lease_device_v1"); | ||
199 | sway_log(SWAY_INFO, "VR will not be available"); | ||
200 | } | ||
201 | |||
147 | wlr_export_dmabuf_manager_v1_create(server->wl_display); | 202 | wlr_export_dmabuf_manager_v1_create(server->wl_display); |
148 | wlr_screencopy_manager_v1_create(server->wl_display); | 203 | wlr_screencopy_manager_v1_create(server->wl_display); |
149 | wlr_data_control_manager_v1_create(server->wl_display); | 204 | wlr_data_control_manager_v1_create(server->wl_display); |
150 | wlr_primary_selection_v1_device_manager_create(server->wl_display); | 205 | wlr_primary_selection_v1_device_manager_create(server->wl_display); |
151 | wlr_viewporter_create(server->wl_display); | 206 | wlr_viewporter_create(server->wl_display); |
152 | 207 | ||
208 | struct wlr_xdg_foreign_registry *foreign_registry = | ||
209 | wlr_xdg_foreign_registry_create(server->wl_display); | ||
210 | wlr_xdg_foreign_v1_create(server->wl_display, foreign_registry); | ||
211 | wlr_xdg_foreign_v2_create(server->wl_display, foreign_registry); | ||
212 | |||
213 | server->xdg_activation_v1 = wlr_xdg_activation_v1_create(server->wl_display); | ||
214 | server->xdg_activation_v1_request_activate.notify = | ||
215 | xdg_activation_v1_handle_request_activate; | ||
216 | wl_signal_add(&server->xdg_activation_v1->events.request_activate, | ||
217 | &server->xdg_activation_v1_request_activate); | ||
218 | |||
153 | // Avoid using "wayland-0" as display socket | 219 | // Avoid using "wayland-0" as display socket |
154 | char name_candidate[16]; | 220 | char name_candidate[16]; |
155 | for (int i = 1; i <= 32; ++i) { | 221 | for (unsigned int i = 1; i <= 32; ++i) { |
156 | sprintf(name_candidate, "wayland-%d", i); | 222 | snprintf(name_candidate, sizeof(name_candidate), "wayland-%u", i); |
157 | if (wl_display_add_socket(server->wl_display, name_candidate) >= 0) { | 223 | if (wl_display_add_socket(server->wl_display, name_candidate) >= 0) { |
158 | server->socket = strdup(name_candidate); | 224 | server->socket = strdup(name_candidate); |
159 | break; | 225 | break; |
@@ -166,27 +232,26 @@ bool server_init(struct sway_server *server) { | |||
166 | return false; | 232 | return false; |
167 | } | 233 | } |
168 | 234 | ||
169 | server->noop_backend = wlr_noop_backend_create(server->wl_display); | 235 | server->headless_backend = wlr_headless_backend_create(server->wl_display); |
170 | |||
171 | struct wlr_output *wlr_output = wlr_noop_add_output(server->noop_backend); | ||
172 | root->noop_output = output_create(wlr_output); | ||
173 | |||
174 | server->headless_backend = | ||
175 | wlr_headless_backend_create_with_renderer(server->wl_display, renderer); | ||
176 | if (!server->headless_backend) { | 236 | if (!server->headless_backend) { |
177 | sway_log(SWAY_INFO, "Failed to create secondary headless backend, " | 237 | sway_log(SWAY_ERROR, "Failed to create secondary headless backend"); |
178 | "starting without it"); | 238 | wlr_backend_destroy(server->backend); |
239 | return false; | ||
179 | } else { | 240 | } else { |
180 | wlr_multi_backend_add(server->backend, server->headless_backend); | 241 | wlr_multi_backend_add(server->backend, server->headless_backend); |
181 | } | 242 | } |
182 | 243 | ||
244 | struct wlr_output *wlr_output = | ||
245 | wlr_headless_add_output(server->headless_backend, 800, 600); | ||
246 | wlr_output_set_name(wlr_output, "FALLBACK"); | ||
247 | root->fallback_output = output_create(wlr_output); | ||
248 | |||
183 | // This may have been set already via -Dtxn-timeout | 249 | // This may have been set already via -Dtxn-timeout |
184 | if (!server->txn_timeout_ms) { | 250 | if (!server->txn_timeout_ms) { |
185 | server->txn_timeout_ms = 200; | 251 | server->txn_timeout_ms = 200; |
186 | } | 252 | } |
187 | 253 | ||
188 | server->dirty_nodes = create_list(); | 254 | server->dirty_nodes = create_list(); |
189 | server->transactions = create_list(); | ||
190 | 255 | ||
191 | server->input = input_manager_create(server); | 256 | server->input = input_manager_create(server); |
192 | input_manager_get_default_seat(); // create seat0 | 257 | input_manager_get_default_seat(); // create seat0 |
@@ -202,7 +267,6 @@ void server_fini(struct sway_server *server) { | |||
202 | wl_display_destroy_clients(server->wl_display); | 267 | wl_display_destroy_clients(server->wl_display); |
203 | wl_display_destroy(server->wl_display); | 268 | wl_display_destroy(server->wl_display); |
204 | list_free(server->dirty_nodes); | 269 | list_free(server->dirty_nodes); |
205 | list_free(server->transactions); | ||
206 | } | 270 | } |
207 | 271 | ||
208 | bool server_start(struct sway_server *server) { | 272 | bool server_start(struct sway_server *server) { |
@@ -238,6 +302,7 @@ bool server_start(struct sway_server *server) { | |||
238 | wlr_backend_destroy(server->backend); | 302 | wlr_backend_destroy(server->backend); |
239 | return false; | 303 | return false; |
240 | } | 304 | } |
305 | |||
241 | return true; | 306 | return true; |
242 | } | 307 | } |
243 | 308 | ||