aboutsummaryrefslogtreecommitdiffstats
path: root/sway/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/server.c')
-rw-r--r--sway/server.c103
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
63static 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
55bool server_init(struct sway_server *server) { 77bool 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
208bool server_start(struct sway_server *server) { 272bool 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