tree-wide: rename g_server to just server

This commit is contained in:
John Lindgren 2026-03-19 12:05:43 -04:00
parent 0f319e9849
commit b57161df96
61 changed files with 955 additions and 955 deletions

View file

@ -86,8 +86,8 @@ reload_config_and_theme(void)
scaled_buffer_invalidate_sharing();
rcxml_finish();
rcxml_read(rc.config_file);
theme_finish(g_server.theme);
theme_init(g_server.theme, rc.theme_name);
theme_finish(server.theme);
theme_init(server.theme, rc.theme_name);
#if HAVE_LIBSFDO
desktop_entry_finish();
@ -95,7 +95,7 @@ reload_config_and_theme(void)
#endif
struct view *view;
wl_list_for_each(view, &g_server.views, link) {
wl_list_for_each(view, &server.views, link) {
view_reload_ssd(view);
}
@ -111,7 +111,7 @@ reload_config_and_theme(void)
static int
handle_sighup(int signal, void *data)
{
keyboard_cancel_all_keybind_repeats(&g_server.seat);
keyboard_cancel_all_keybind_repeats(&server.seat);
session_environment_init();
reload_config_and_theme();
output_virtual_update_fallback();
@ -145,8 +145,8 @@ handle_sigchld(int signal, void *data)
#if HAVE_XWAYLAND
/* Ensure that we do not break xwayland lazy initialization */
if (g_server.xwayland && g_server.xwayland->server
&& info.si_pid == g_server.xwayland->server->pid) {
if (server.xwayland && server.xwayland->server
&& info.si_pid == server.xwayland->server->pid) {
return 0;
}
#endif
@ -184,9 +184,9 @@ handle_sigchld(int signal, void *data)
" please report", (long)info.si_pid, info.si_code);
}
if (info.si_pid == g_server.primary_client_pid) {
if (info.si_pid == server.primary_client_pid) {
wlr_log(WLR_INFO, "primary client %ld exited", (long)info.si_pid);
wl_display_terminate(g_server.wl_display);
wl_display_terminate(server.wl_display);
}
return 0;
@ -303,8 +303,8 @@ server_global_filter(const struct wl_client *client, const struct wl_global *glo
(void)iface;
#if HAVE_XWAYLAND
struct wl_client *xwayland_client = (g_server.xwayland && g_server.xwayland->server)
? g_server.xwayland->server->client
struct wl_client *xwayland_client = (server.xwayland && server.xwayland->server)
? server.xwayland->server->client
: NULL;
if (client != xwayland_client && !strcmp(iface->name, xwayland_shell_v1_interface.name)) {
@ -316,8 +316,8 @@ server_global_filter(const struct wl_client *client, const struct wl_global *glo
/* Do not allow security_context_manager_v1 to clients with a security context attached */
const struct wlr_security_context_v1_state *security_context =
wlr_security_context_manager_v1_lookup_client(
g_server.security_context_manager_v1, (struct wl_client *)client);
if (security_context && global == g_server.security_context_manager_v1->global) {
server.security_context_manager_v1, (struct wl_client *)client);
if (security_context && global == server.security_context_manager_v1->global) {
return false;
} else if (security_context) {
/*
@ -380,34 +380,34 @@ handle_renderer_lost(struct wl_listener *listener, void *data)
{
wlr_log(WLR_INFO, "Re-creating renderer after GPU reset");
struct wlr_renderer *renderer = wlr_renderer_autocreate(g_server.backend);
struct wlr_renderer *renderer = wlr_renderer_autocreate(server.backend);
if (!renderer) {
wlr_log(WLR_ERROR, "Unable to create renderer");
return;
}
struct wlr_allocator *allocator =
wlr_allocator_autocreate(g_server.backend, renderer);
wlr_allocator_autocreate(server.backend, renderer);
if (!allocator) {
wlr_log(WLR_ERROR, "Unable to create allocator");
wlr_renderer_destroy(renderer);
return;
}
struct wlr_renderer *old_renderer = g_server.renderer;
struct wlr_allocator *old_allocator = g_server.allocator;
g_server.renderer = renderer;
g_server.allocator = allocator;
struct wlr_renderer *old_renderer = server.renderer;
struct wlr_allocator *old_allocator = server.allocator;
server.renderer = renderer;
server.allocator = allocator;
wl_list_remove(&g_server.renderer_lost.link);
wl_signal_add(&g_server.renderer->events.lost, &g_server.renderer_lost);
wl_list_remove(&server.renderer_lost.link);
wl_signal_add(&server.renderer->events.lost, &server.renderer_lost);
wlr_compositor_set_renderer(g_server.compositor, renderer);
wlr_compositor_set_renderer(server.compositor, renderer);
struct output *output;
wl_list_for_each(output, &g_server.outputs, link) {
wl_list_for_each(output, &server.outputs, link) {
wlr_output_init_render(output->wlr_output,
g_server.allocator, g_server.renderer);
server.allocator, server.renderer);
}
reload_config_and_theme();
@ -421,27 +421,27 @@ handle_renderer_lost(struct wl_listener *listener, void *data)
void
server_init(void)
{
g_server.primary_client_pid = -1;
g_server.wl_display = wl_display_create();
if (!g_server.wl_display) {
server.primary_client_pid = -1;
server.wl_display = wl_display_create();
if (!server.wl_display) {
wlr_log(WLR_ERROR, "cannot allocate a wayland display");
exit(EXIT_FAILURE);
}
/* Increase max client buffer size to make slow clients less likely to terminate */
wl_display_set_default_max_buffer_size(g_server.wl_display, 1024 * 1024);
wl_display_set_default_max_buffer_size(server.wl_display, 1024 * 1024);
wl_display_set_global_filter(g_server.wl_display, server_global_filter, NULL);
g_server.wl_event_loop = wl_display_get_event_loop(g_server.wl_display);
wl_display_set_global_filter(server.wl_display, server_global_filter, NULL);
server.wl_event_loop = wl_display_get_event_loop(server.wl_display);
/* Catch signals */
g_server.sighup_source = wl_event_loop_add_signal(
g_server.wl_event_loop, SIGHUP, handle_sighup, NULL);
g_server.sigint_source = wl_event_loop_add_signal(
g_server.wl_event_loop, SIGINT, handle_sigterm, g_server.wl_display);
g_server.sigterm_source = wl_event_loop_add_signal(
g_server.wl_event_loop, SIGTERM, handle_sigterm, g_server.wl_display);
g_server.sigchld_source = wl_event_loop_add_signal(
g_server.wl_event_loop, SIGCHLD, handle_sigchld, NULL);
server.sighup_source = wl_event_loop_add_signal(
server.wl_event_loop, SIGHUP, handle_sighup, NULL);
server.sigint_source = wl_event_loop_add_signal(
server.wl_event_loop, SIGINT, handle_sigterm, server.wl_display);
server.sigterm_source = wl_event_loop_add_signal(
server.wl_event_loop, SIGTERM, handle_sigterm, server.wl_display);
server.sigchld_source = wl_event_loop_add_signal(
server.wl_event_loop, SIGCHLD, handle_sigchld, NULL);
/*
* Prevent wayland clients that request the X11 clipboard but closing
@ -459,31 +459,31 @@ server_init(void)
* backend based on the current environment, such as opening an x11
* window if an x11 server is running.
*/
g_server.backend = wlr_backend_autocreate(
g_server.wl_event_loop, &g_server.session);
if (!g_server.backend) {
server.backend = wlr_backend_autocreate(
server.wl_event_loop, &server.session);
if (!server.backend) {
wlr_log(WLR_ERROR, "unable to create backend");
fprintf(stderr, helpful_seat_error_message);
exit(EXIT_FAILURE);
}
/* Create headless backend to enable adding virtual outputs later on */
wlr_multi_for_each_backend(g_server.backend,
get_headless_backend, &g_server.headless.backend);
wlr_multi_for_each_backend(server.backend,
get_headless_backend, &server.headless.backend);
if (!g_server.headless.backend) {
if (!server.headless.backend) {
wlr_log(WLR_DEBUG, "manually creating headless backend");
g_server.headless.backend = wlr_headless_backend_create(
g_server.wl_event_loop);
server.headless.backend = wlr_headless_backend_create(
server.wl_event_loop);
} else {
wlr_log(WLR_DEBUG, "headless backend already exists");
}
if (!g_server.headless.backend) {
if (!server.headless.backend) {
wlr_log(WLR_ERROR, "unable to create headless backend");
exit(EXIT_FAILURE);
}
wlr_multi_backend_add(g_server.backend, g_server.headless.backend);
wlr_multi_backend_add(server.backend, server.headless.backend);
/*
* If we don't populate headless backend with a virtual output (that we
@ -491,7 +491,7 @@ server_init(void)
* later do not work properly when overlaid on real output. Content is
* drawn on the virtual output, but not drawn on the real output.
*/
wlr_output_destroy(wlr_headless_add_output(g_server.headless.backend, 0, 0));
wlr_output_destroy(wlr_headless_add_output(server.headless.backend, 0, 0));
/*
* Autocreates a renderer, either Pixman, GLES2 or Vulkan for us. The
@ -499,38 +499,38 @@ server_init(void)
* The renderer is responsible for defining the various pixel formats it
* supports for shared memory, this configures that for clients.
*/
g_server.renderer = wlr_renderer_autocreate(g_server.backend);
if (!g_server.renderer) {
server.renderer = wlr_renderer_autocreate(server.backend);
if (!server.renderer) {
wlr_log(WLR_ERROR, "unable to create renderer");
exit(EXIT_FAILURE);
}
g_server.renderer_lost.notify = handle_renderer_lost;
wl_signal_add(&g_server.renderer->events.lost, &g_server.renderer_lost);
server.renderer_lost.notify = handle_renderer_lost;
wl_signal_add(&server.renderer->events.lost, &server.renderer_lost);
if (!wlr_renderer_init_wl_shm(g_server.renderer, g_server.wl_display)) {
if (!wlr_renderer_init_wl_shm(server.renderer, server.wl_display)) {
wlr_log(WLR_ERROR, "Failed to initialize shared memory pool");
exit(EXIT_FAILURE);
}
if (wlr_renderer_get_texture_formats(
g_server.renderer, WLR_BUFFER_CAP_DMABUF)) {
if (wlr_renderer_get_drm_fd(g_server.renderer) >= 0) {
wlr_drm_create(g_server.wl_display, g_server.renderer);
server.renderer, WLR_BUFFER_CAP_DMABUF)) {
if (wlr_renderer_get_drm_fd(server.renderer) >= 0) {
wlr_drm_create(server.wl_display, server.renderer);
}
g_server.linux_dmabuf = wlr_linux_dmabuf_v1_create_with_renderer(
g_server.wl_display,
server.linux_dmabuf = wlr_linux_dmabuf_v1_create_with_renderer(
server.wl_display,
LAB_WLR_LINUX_DMABUF_VERSION,
g_server.renderer);
server.renderer);
} else {
wlr_log(WLR_DEBUG, "unable to initialize dmabuf");
}
if (wlr_renderer_get_drm_fd(g_server.renderer) >= 0 &&
g_server.renderer->features.timeline &&
g_server.backend->features.timeline) {
wlr_linux_drm_syncobj_manager_v1_create(g_server.wl_display, 1,
wlr_renderer_get_drm_fd(g_server.renderer));
if (wlr_renderer_get_drm_fd(server.renderer) >= 0 &&
server.renderer->features.timeline &&
server.backend->features.timeline) {
wlr_linux_drm_syncobj_manager_v1_create(server.wl_display, 1,
wlr_renderer_get_drm_fd(server.renderer));
}
/*
@ -538,22 +538,22 @@ server_init(void)
* the renderer and the backend. It handles the buffer creation,
* allowing wlroots to render onto the screen
*/
g_server.allocator = wlr_allocator_autocreate(
g_server.backend, g_server.renderer);
if (!g_server.allocator) {
server.allocator = wlr_allocator_autocreate(
server.backend, server.renderer);
if (!server.allocator) {
wlr_log(WLR_ERROR, "unable to create allocator");
exit(EXIT_FAILURE);
}
wl_list_init(&g_server.views);
wl_list_init(&g_server.unmanaged_surfaces);
wl_list_init(&g_server.cycle.views);
wl_list_init(&g_server.cycle.osd_outputs);
wl_list_init(&server.views);
wl_list_init(&server.unmanaged_surfaces);
wl_list_init(&server.cycle.views);
wl_list_init(&server.cycle.osd_outputs);
g_server.scene = wlr_scene_create();
die_if_null(g_server.scene);
server.scene = wlr_scene_create();
die_if_null(server.scene);
g_server.direct_scanout_enabled = g_server.scene->WLR_PRIVATE.direct_scanout;
server.direct_scanout_enabled = server.scene->WLR_PRIVATE.direct_scanout;
/*
* The order in which the scene-trees below are created determines the
@ -564,14 +564,14 @@ server_init(void)
* | ---------------------------------- | -------------------------------------
* | output->session_lock_tree | session lock surfaces (e.g. swaylock)
* | output->cycle_osd_tree | window switcher's on-screen display
* | g_server.cycle_preview_tree | window switcher's previewed window
* | g_server.menu_tree | labwc's server-side menus
* | server.cycle_preview_tree | window switcher's previewed window
* | server.menu_tree | labwc's server-side menus
* | output->layer_popup_tree | xdg popups on layer surfaces
* | output->layer_tree[3] | overlay layer surfaces (e.g. rofi)
* | output->layer_tree[2] | top layer surfaces (e.g. waybar)
* | g_server.unmanaged_tree | unmanaged X11 surfaces (e.g. dmenu)
* | g_server.xdg_popup_tree | xdg popups on xdg windows
* | g_server.workspace_tree |
* | server.unmanaged_tree | unmanaged X11 surfaces (e.g. dmenu)
* | server.xdg_popup_tree | xdg popups on xdg windows
* | server.workspace_tree |
* | + workspace->tree |
* | + workspace->view_trees[1] | always-on-top xdg/X11 windows
* | + workspace->view_trees[0] | normal xdg/X11 windows (e.g. firefox)
@ -580,13 +580,13 @@ server_init(void)
* | output->layer_tree[0] | background layer surfaces (e.g. swaybg)
*/
g_server.workspace_tree = lab_wlr_scene_tree_create(&g_server.scene->tree);
g_server.xdg_popup_tree = lab_wlr_scene_tree_create(&g_server.scene->tree);
server.workspace_tree = lab_wlr_scene_tree_create(&server.scene->tree);
server.xdg_popup_tree = lab_wlr_scene_tree_create(&server.scene->tree);
#if HAVE_XWAYLAND
g_server.unmanaged_tree = lab_wlr_scene_tree_create(&g_server.scene->tree);
server.unmanaged_tree = lab_wlr_scene_tree_create(&server.scene->tree);
#endif
g_server.menu_tree = lab_wlr_scene_tree_create(&g_server.scene->tree);
g_server.cycle_preview_tree = lab_wlr_scene_tree_create(&g_server.scene->tree);
server.menu_tree = lab_wlr_scene_tree_create(&server.scene->tree);
server.cycle_preview_tree = lab_wlr_scene_tree_create(&server.scene->tree);
workspaces_init();
@ -599,16 +599,16 @@ server_init(void)
* room for you to dig your fingers in and play with their behavior if
* you want.
*/
g_server.compositor = wlr_compositor_create(g_server.wl_display,
LAB_WLR_COMPOSITOR_VERSION, g_server.renderer);
if (!g_server.compositor) {
server.compositor = wlr_compositor_create(server.wl_display,
LAB_WLR_COMPOSITOR_VERSION, server.renderer);
if (!server.compositor) {
wlr_log(WLR_ERROR, "unable to create the wlroots compositor");
exit(EXIT_FAILURE);
}
wlr_subcompositor_create(g_server.wl_display);
wlr_subcompositor_create(server.wl_display);
struct wlr_data_device_manager *device_manager = NULL;
device_manager = wlr_data_device_manager_create(g_server.wl_display);
device_manager = wlr_data_device_manager_create(server.wl_display);
if (!device_manager) {
wlr_log(WLR_ERROR, "unable to create data device manager");
exit(EXIT_FAILURE);
@ -625,103 +625,103 @@ server_init(void)
* https://wayfire.org/2020/08/04/Wayfire-0-5.html
*/
if (rc.primary_selection) {
wlr_primary_selection_v1_device_manager_create(g_server.wl_display);
wlr_primary_selection_v1_device_manager_create(server.wl_display);
}
g_server.input_method_manager = wlr_input_method_manager_v2_create(
g_server.wl_display);
g_server.text_input_manager = wlr_text_input_manager_v3_create(
g_server.wl_display);
server.input_method_manager = wlr_input_method_manager_v2_create(
server.wl_display);
server.text_input_manager = wlr_text_input_manager_v3_create(
server.wl_display);
seat_init();
xdg_shell_init();
kde_server_decoration_init();
xdg_server_decoration_init();
xdserver_decoration_init();
struct wlr_presentation *presentation = wlr_presentation_create(
g_server.wl_display, g_server.backend,
server.wl_display, server.backend,
LAB_WLR_PRESENTATION_TIME_VERSION);
if (!presentation) {
wlr_log(WLR_ERROR, "unable to create presentation interface");
exit(EXIT_FAILURE);
}
if (g_server.linux_dmabuf) {
wlr_scene_set_linux_dmabuf_v1(g_server.scene, g_server.linux_dmabuf);
if (server.linux_dmabuf) {
wlr_scene_set_linux_dmabuf_v1(server.scene, server.linux_dmabuf);
}
wlr_export_dmabuf_manager_v1_create(g_server.wl_display);
wlr_screencopy_manager_v1_create(g_server.wl_display);
wlr_ext_image_copy_capture_manager_v1_create(g_server.wl_display, 1);
wlr_ext_output_image_capture_source_manager_v1_create(g_server.wl_display, 1);
wlr_data_control_manager_v1_create(g_server.wl_display);
wlr_ext_data_control_manager_v1_create(g_server.wl_display,
wlr_export_dmabuf_manager_v1_create(server.wl_display);
wlr_screencopy_manager_v1_create(server.wl_display);
wlr_ext_image_copy_capture_manager_v1_create(server.wl_display, 1);
wlr_ext_output_image_capture_source_manager_v1_create(server.wl_display, 1);
wlr_data_control_manager_v1_create(server.wl_display);
wlr_ext_data_control_manager_v1_create(server.wl_display,
LAB_EXT_DATA_CONTROL_VERSION);
g_server.security_context_manager_v1 =
wlr_security_context_manager_v1_create(g_server.wl_display);
wlr_viewporter_create(g_server.wl_display);
wlr_single_pixel_buffer_manager_v1_create(g_server.wl_display);
wlr_fractional_scale_manager_v1_create(g_server.wl_display,
server.security_context_manager_v1 =
wlr_security_context_manager_v1_create(server.wl_display);
wlr_viewporter_create(server.wl_display);
wlr_single_pixel_buffer_manager_v1_create(server.wl_display);
wlr_fractional_scale_manager_v1_create(server.wl_display,
LAB_WLR_FRACTIONAL_SCALE_V1_VERSION);
idle_manager_create(g_server.wl_display);
idle_manager_create(server.wl_display);
g_server.relative_pointer_manager = wlr_relative_pointer_manager_v1_create(
g_server.wl_display);
g_server.constraints = wlr_pointer_constraints_v1_create(
g_server.wl_display);
server.relative_pointer_manager = wlr_relative_pointer_manager_v1_create(
server.wl_display);
server.constraints = wlr_pointer_constraints_v1_create(
server.wl_display);
g_server.new_constraint.notify = create_constraint;
wl_signal_add(&g_server.constraints->events.new_constraint,
&g_server.new_constraint);
server.new_constraint.notify = create_constraint;
wl_signal_add(&server.constraints->events.new_constraint,
&server.new_constraint);
g_server.foreign_toplevel_manager =
wlr_foreign_toplevel_manager_v1_create(g_server.wl_display);
server.foreign_toplevel_manager =
wlr_foreign_toplevel_manager_v1_create(server.wl_display);
g_server.foreign_toplevel_list =
server.foreign_toplevel_list =
wlr_ext_foreign_toplevel_list_v1_create(
g_server.wl_display, LAB_EXT_FOREIGN_TOPLEVEL_LIST_VERSION);
server.wl_display, LAB_EXT_FOREIGN_TOPLEVEL_LIST_VERSION);
wlr_alpha_modifier_v1_create(g_server.wl_display);
wlr_alpha_modifier_v1_create(server.wl_display);
session_lock_init();
g_server.drm_lease_manager = wlr_drm_lease_v1_manager_create(
g_server.wl_display, g_server.backend);
if (g_server.drm_lease_manager) {
g_server.drm_lease_request.notify = handle_drm_lease_request;
wl_signal_add(&g_server.drm_lease_manager->events.request,
&g_server.drm_lease_request);
server.drm_lease_manager = wlr_drm_lease_v1_manager_create(
server.wl_display, server.backend);
if (server.drm_lease_manager) {
server.drm_lease_request.notify = handle_drm_lease_request;
wl_signal_add(&server.drm_lease_manager->events.request,
&server.drm_lease_request);
} else {
wlr_log(WLR_DEBUG, "Failed to create wlr_drm_lease_device_v1");
wlr_log(WLR_INFO, "VR will not be available");
}
g_server.output_power_manager_v1 =
wlr_output_power_manager_v1_create(g_server.wl_display);
g_server.output_power_manager_set_mode.notify =
server.output_power_manager_v1 =
wlr_output_power_manager_v1_create(server.wl_display);
server.output_power_manager_set_mode.notify =
handle_output_power_manager_set_mode;
wl_signal_add(&g_server.output_power_manager_v1->events.set_mode,
&g_server.output_power_manager_set_mode);
wl_signal_add(&server.output_power_manager_v1->events.set_mode,
&server.output_power_manager_set_mode);
g_server.tearing_control = wlr_tearing_control_manager_v1_create(g_server.wl_display, 1);
g_server.tearing_new_object.notify = handle_tearing_new_object;
wl_signal_add(&g_server.tearing_control->events.new_object, &g_server.tearing_new_object);
server.tearing_control = wlr_tearing_control_manager_v1_create(server.wl_display, 1);
server.tearing_new_object.notify = handle_tearing_new_object;
wl_signal_add(&server.tearing_control->events.new_object, &server.tearing_new_object);
g_server.tablet_manager = wlr_tablet_v2_create(g_server.wl_display);
server.tablet_manager = wlr_tablet_v2_create(server.wl_display);
layers_init();
/* These get cleaned up automatically on display destroy */
struct wlr_xdg_foreign_registry *registry =
wlr_xdg_foreign_registry_create(g_server.wl_display);
wlr_xdg_foreign_v1_create(g_server.wl_display, registry);
wlr_xdg_foreign_v2_create(g_server.wl_display, registry);
wlr_xdg_foreign_registry_create(server.wl_display);
wlr_xdg_foreign_v1_create(server.wl_display, registry);
wlr_xdg_foreign_v2_create(server.wl_display, registry);
#if HAVE_LIBSFDO
desktop_entry_init();
#endif
#if HAVE_XWAYLAND
xwayland_server_init(g_server.compositor);
xwayland_server_init(server.compositor);
#endif
}
@ -729,7 +729,7 @@ void
server_start(void)
{
/* Add a Unix socket to the Wayland display. */
const char *socket = wl_display_add_socket_auto(g_server.wl_display);
const char *socket = wl_display_add_socket_auto(server.wl_display);
if (!socket) {
wlr_log_errno(WLR_ERROR, "unable to open wayland socket");
exit(EXIT_FAILURE);
@ -739,7 +739,7 @@ server_start(void)
* Start the backend. This will enumerate outputs and inputs, become
* the DRM master, etc
*/
if (!wlr_backend_start(g_server.backend)) {
if (!wlr_backend_start(server.backend)) {
wlr_log(WLR_ERROR, "unable to start the wlroots backend");
exit(EXIT_FAILURE);
}
@ -763,35 +763,35 @@ server_finish(void)
#if HAVE_LIBSFDO
desktop_entry_finish();
#endif
wl_event_source_remove(g_server.sighup_source);
wl_event_source_remove(g_server.sigint_source);
wl_event_source_remove(g_server.sigterm_source);
wl_event_source_remove(g_server.sigchld_source);
wl_event_source_remove(server.sighup_source);
wl_event_source_remove(server.sigint_source);
wl_event_source_remove(server.sigterm_source);
wl_event_source_remove(server.sigchld_source);
wl_display_destroy_clients(g_server.wl_display);
wl_display_destroy_clients(server.wl_display);
seat_finish();
output_finish();
xdg_shell_finish();
layers_finish();
kde_server_decoration_finish();
xdg_server_decoration_finish();
wl_list_remove(&g_server.new_constraint.link);
wl_list_remove(&g_server.output_power_manager_set_mode.link);
wl_list_remove(&g_server.tearing_new_object.link);
if (g_server.drm_lease_request.notify) {
wl_list_remove(&g_server.drm_lease_request.link);
g_server.drm_lease_request.notify = NULL;
xdserver_decoration_finish();
wl_list_remove(&server.new_constraint.link);
wl_list_remove(&server.output_power_manager_set_mode.link);
wl_list_remove(&server.tearing_new_object.link);
if (server.drm_lease_request.notify) {
wl_list_remove(&server.drm_lease_request.link);
server.drm_lease_request.notify = NULL;
}
wlr_backend_destroy(g_server.backend);
wlr_allocator_destroy(g_server.allocator);
wlr_backend_destroy(server.backend);
wlr_allocator_destroy(server.allocator);
wl_list_remove(&g_server.renderer_lost.link);
wlr_renderer_destroy(g_server.renderer);
wl_list_remove(&server.renderer_lost.link);
wlr_renderer_destroy(server.renderer);
workspaces_destroy();
wlr_scene_node_destroy(&g_server.scene->tree.node);
wlr_scene_node_destroy(&server.scene->tree.node);
wl_display_destroy(g_server.wl_display);
wl_display_destroy(server.wl_display);
}