From 5ee2ec7fff28fce32ce4928faccd19a81ff6b88d Mon Sep 17 00:00:00 2001 From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Thu, 23 Mar 2023 20:55:14 +0100 Subject: [PATCH] Decorations: minor refactoring, no logical changes intended --- include/decorations.h | 9 ++++++ include/labwc.h | 3 -- src/decorations/xdg-deco.c | 60 ++++++++++++++++++++++++++------------ src/server.c | 12 ++------ 4 files changed, 52 insertions(+), 32 deletions(-) create mode 100644 include/decorations.h diff --git a/include/decorations.h b/include/decorations.h new file mode 100644 index 00000000..bad8569f --- /dev/null +++ b/include/decorations.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef __LAB_DECORATIONS_H +#define __LAB_DECORATIONS_H + +struct server; + +void xdg_server_decoration_init(struct server *server); + +#endif /* __LAB_DECORATIONS_H */ diff --git a/include/labwc.h b/include/labwc.h index c3bdfd8f..718162bb 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -38,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -349,8 +348,6 @@ struct idle_inhibitor { void xdg_popup_create(struct view *view, struct wlr_xdg_popup *wlr_popup); -void xdg_toplevel_decoration(struct wl_listener *listener, void *data); - void xdg_activation_handle_request(struct wl_listener *listener, void *data); void xdg_surface_new(struct wl_listener *listener, void *data); diff --git a/src/decorations/xdg-deco.c b/src/decorations/xdg-deco.c index 3e0a5abf..38181eb3 100644 --- a/src/decorations/xdg-deco.c +++ b/src/decorations/xdg-deco.c @@ -1,11 +1,12 @@ // SPDX-License-Identifier: GPL-2.0-only +#include #include "common/mem.h" +#include "decorations.h" #include "labwc.h" #include "view.h" struct xdg_deco { - struct wlr_xdg_toplevel_decoration_v1 *wlr_decoration; - struct server *server; + struct wlr_xdg_toplevel_decoration_v1 *wlr_xdg_decoration; struct view *view; struct wl_listener destroy; struct wl_listener request_mode; @@ -14,8 +15,7 @@ struct xdg_deco { static void xdg_deco_destroy(struct wl_listener *listener, void *data) { - struct xdg_deco *xdg_deco = - wl_container_of(listener, xdg_deco, destroy); + struct xdg_deco *xdg_deco = wl_container_of(listener, xdg_deco, destroy); wl_list_remove(&xdg_deco->destroy.link); wl_list_remove(&xdg_deco->request_mode.link); free(xdg_deco); @@ -26,7 +26,7 @@ xdg_deco_request_mode(struct wl_listener *listener, void *data) { struct xdg_deco *xdg_deco = wl_container_of(listener, xdg_deco, request_mode); enum wlr_xdg_toplevel_decoration_v1_mode client_mode = - xdg_deco->wlr_decoration->requested_mode; + xdg_deco->wlr_xdg_decoration->requested_mode; switch (client_mode) { case WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE: @@ -42,30 +42,52 @@ xdg_deco_request_mode(struct wl_listener *listener, void *data) : WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE; break; default: - wlr_log(WLR_ERROR, "Unspecified decoration variant requested: %u", - client_mode); + wlr_log(WLR_ERROR, "Unspecified xdg decoration variant " + "requested: %u", client_mode); } - wlr_xdg_toplevel_decoration_v1_set_mode(xdg_deco->wlr_decoration, client_mode); + wlr_xdg_toplevel_decoration_v1_set_mode(xdg_deco->wlr_xdg_decoration, + client_mode); view_set_decorations(xdg_deco->view, client_mode == WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE); } -void +static void xdg_toplevel_decoration(struct wl_listener *listener, void *data) { - struct server *server = - wl_container_of(listener, server, xdg_toplevel_decoration); - struct wlr_xdg_toplevel_decoration_v1 *wlr_decoration = data; + struct wlr_xdg_toplevel_decoration_v1 *wlr_xdg_decoration = data; + struct wlr_xdg_surface *xdg_surface = wlr_xdg_decoration->surface; + if (!xdg_surface || !xdg_surface->data) { + wlr_log(WLR_ERROR, + "Invalid surface supplied for xdg decorations"); + return; + } + struct xdg_deco *xdg_deco = znew(*xdg_deco); - xdg_deco->wlr_decoration = wlr_decoration; - xdg_deco->server = server; - xdg_deco->view = wlr_decoration->surface->data; + xdg_deco->wlr_xdg_decoration = wlr_xdg_decoration; + xdg_deco->view = (struct view *)xdg_surface->data; + + wl_signal_add(&wlr_xdg_decoration->events.destroy, &xdg_deco->destroy); xdg_deco->destroy.notify = xdg_deco_destroy; - wl_signal_add(&wlr_decoration->events.destroy, &xdg_deco->destroy); - xdg_deco->request_mode.notify = xdg_deco_request_mode; - wl_signal_add(&wlr_decoration->events.request_mode, + + wl_signal_add(&wlr_xdg_decoration->events.request_mode, &xdg_deco->request_mode); + xdg_deco->request_mode.notify = xdg_deco_request_mode; + + xdg_deco_request_mode(&xdg_deco->request_mode, wlr_xdg_decoration); +} + +void +xdg_server_decoration_init(struct server *server) +{ + struct wlr_xdg_decoration_manager_v1 *xdg_deco_mgr = NULL; + xdg_deco_mgr = wlr_xdg_decoration_manager_v1_create(server->wl_display); + if (!xdg_deco_mgr) { + wlr_log(WLR_ERROR, "unable to create the XDG deco manager"); + exit(EXIT_FAILURE); + } - xdg_deco_request_mode(&xdg_deco->request_mode, wlr_decoration); + wl_signal_add(&xdg_deco_mgr->events.new_toplevel_decoration, + &server->xdg_toplevel_decoration); + server->xdg_toplevel_decoration.notify = xdg_toplevel_decoration; } diff --git a/src/server.c b/src/server.c index bf74b871..ffae132e 100644 --- a/src/server.c +++ b/src/server.c @@ -18,6 +18,7 @@ #include "drm-lease-v1-protocol.h" #include "config/rcxml.h" #include "config/session.h" +#include "decorations.h" #include "labwc.h" #include "layers.h" #include "menu/menu.h" @@ -310,16 +311,7 @@ server_init(struct server *server) &server->new_xdg_surface); /* Disable CSD */ - struct wlr_xdg_decoration_manager_v1 *xdg_deco_mgr = NULL; - xdg_deco_mgr = wlr_xdg_decoration_manager_v1_create(server->wl_display); - if (!xdg_deco_mgr) { - wlr_log(WLR_ERROR, "unable to create the XDG deco manager"); - exit(EXIT_FAILURE); - } - wl_signal_add(&xdg_deco_mgr->events.new_toplevel_decoration, - &server->xdg_toplevel_decoration); - server->xdg_toplevel_decoration.notify = xdg_toplevel_decoration; - + xdg_server_decoration_init(server); struct wlr_server_decoration_manager *deco_mgr = NULL; deco_mgr = wlr_server_decoration_manager_create(server->wl_display); if (!deco_mgr) { -- 2.52.0