aboutsummaryrefslogtreecommitdiff
path: root/sway/xdg_decoration.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/xdg_decoration.c')
-rw-r--r--sway/xdg_decoration.c59
1 files changed, 32 insertions, 27 deletions
diff --git a/sway/xdg_decoration.c b/sway/xdg_decoration.c
index f7f5f5ed..fa8c6279 100644
--- a/sway/xdg_decoration.c
+++ b/sway/xdg_decoration.c
@@ -23,32 +23,7 @@ static void xdg_decoration_handle_request_mode(struct wl_listener *listener,
void *data) {
struct sway_xdg_decoration *deco =
wl_container_of(listener, deco, request_mode);
- struct sway_view *view = deco->view;
- enum wlr_xdg_toplevel_decoration_v1_mode mode =
- WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE;
- enum wlr_xdg_toplevel_decoration_v1_mode client_mode =
- deco->wlr_xdg_decoration->requested_mode;
-
- bool floating;
- if (view->container) {
- floating = container_is_floating(view->container);
- bool csd = false;
- csd = client_mode ==
- WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE;
- view_update_csd_from_client(view, csd);
- arrange_container(view->container);
- transaction_commit_dirty();
- } else {
- floating = view->impl->wants_floating &&
- view->impl->wants_floating(view);
- }
-
- if (floating && client_mode) {
- mode = client_mode;
- }
-
- wlr_xdg_toplevel_decoration_v1_set_mode(deco->wlr_xdg_decoration,
- mode);
+ set_xdg_decoration_mode(deco);
}
void handle_xdg_decoration(struct wl_listener *listener, void *data) {
@@ -72,7 +47,7 @@ void handle_xdg_decoration(struct wl_listener *listener, void *data) {
wl_list_insert(&server.xdg_decorations, &deco->link);
- xdg_decoration_handle_request_mode(&deco->request_mode, wlr_deco);
+ set_xdg_decoration_mode(deco);
}
struct sway_xdg_decoration *xdg_decoration_from_surface(
@@ -85,3 +60,33 @@ struct sway_xdg_decoration *xdg_decoration_from_surface(
}
return NULL;
}
+
+void set_xdg_decoration_mode(struct sway_xdg_decoration *deco) {
+ struct sway_view *view = deco->view;
+ enum wlr_xdg_toplevel_decoration_v1_mode mode =
+ WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE;
+ enum wlr_xdg_toplevel_decoration_v1_mode client_mode =
+ deco->wlr_xdg_decoration->requested_mode;
+
+ bool floating;
+ if (view->container) {
+ floating = container_is_floating(view->container);
+ bool csd = false;
+ csd = client_mode ==
+ WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE;
+ view_update_csd_from_client(view, csd);
+ arrange_container(view->container);
+ transaction_commit_dirty();
+ } else {
+ floating = view->impl->wants_floating &&
+ view->impl->wants_floating(view);
+ }
+
+ if (floating && client_mode) {
+ mode = client_mode;
+ }
+
+ if (view->wlr_xdg_toplevel->base->initialized) {
+ wlr_xdg_toplevel_decoration_v1_set_mode(deco->wlr_xdg_decoration, mode);
+ }
+}