From: Tobias Bengfort Date: Thu, 18 Apr 2024 07:46:36 +0000 (+0200) Subject: decorations: refactor view_set_decorations X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=a0debda14243391e45088151f61f0a0bc77838e5;p=proto%2Flabwc.git decorations: refactor view_set_decorations --- diff --git a/include/ssd.h b/include/ssd.h index 757f9a21..447694d2 100644 --- a/include/ssd.h +++ b/include/ssd.h @@ -48,6 +48,12 @@ enum ssd_part_type { LAB_SSD_END_MARKER }; +enum ssd_mode { + LAB_SSD_MODE_NONE, + LAB_SSD_MODE_BORDER, + LAB_SSD_MODE_FULL +}; + /* Forward declare arguments */ struct ssd; struct ssd_button; @@ -72,7 +78,7 @@ void ssd_set_active(struct ssd *ssd, bool active); void ssd_update_title(struct ssd *ssd); void ssd_update_geometry(struct ssd *ssd); void ssd_destroy(struct ssd *ssd); -void ssd_titlebar_hide(struct ssd *ssd); +void ssd_set_titlebar(struct ssd *ssd, bool enabled); void ssd_enable_keybind_inhibit_indicator(struct ssd *ssd, bool enable); void ssd_enable_shade(struct ssd *ssd, bool enable); diff --git a/include/view.h b/include/view.h index b0e2a41e..6755037d 100644 --- a/include/view.h +++ b/include/view.h @@ -483,7 +483,8 @@ void view_toggle_visible_on_all_workspaces(struct view *view); bool view_is_tiled(struct view *view); bool view_is_floating(struct view *view); void view_move_to_workspace(struct view *view, struct workspace *workspace); -void view_set_decorations(struct view *view, bool decorations); +enum ssd_mode view_get_ssd_mode(struct view *view); +void view_set_ssd_mode(struct view *view, enum ssd_mode mode); void view_toggle_fullscreen(struct view *view); void view_invalidate_last_layout_geometry(struct view *view); void view_adjust_for_layout_change(struct view *view); diff --git a/src/decorations/kde-deco.c b/src/decorations/kde-deco.c index b26f6621..065f89fd 100644 --- a/src/decorations/kde-deco.c +++ b/src/decorations/kde-deco.c @@ -52,8 +52,11 @@ handle_mode(struct wl_listener *listener, void *data) "requested: %u", client_mode); } - view_set_decorations(kde_deco->view, - kde_deco->view->ssd_preference == LAB_SSD_PREF_SERVER); + if (kde_deco->view->ssd_preference == LAB_SSD_PREF_SERVER) { + view_set_ssd_mode(kde_deco->view, LAB_SSD_MODE_FULL); + } else { + view_set_ssd_mode(kde_deco->view, LAB_SSD_MODE_NONE); + } } static void diff --git a/src/decorations/xdg-deco.c b/src/decorations/xdg-deco.c index 3fa10940..c79964dd 100644 --- a/src/decorations/xdg-deco.c +++ b/src/decorations/xdg-deco.c @@ -48,8 +48,11 @@ xdg_deco_request_mode(struct wl_listener *listener, void *data) 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); + if (client_mode == WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE) { + view_set_ssd_mode(xdg_deco->view, LAB_SSD_MODE_FULL); + } else { + view_set_ssd_mode(xdg_deco->view, LAB_SSD_MODE_NONE); + } } static void diff --git a/src/ssd/ssd.c b/src/ssd/ssd.c index 9c96ef7b..9259022c 100644 --- a/src/ssd/ssd.c +++ b/src/ssd/ssd.c @@ -191,7 +191,7 @@ ssd_create(struct view *view, bool active) ssd_titlebar_create(ssd); if (view->ssd_titlebar_hidden) { /* Ensure we keep the old state on Reconfigure or when exiting fullscreen */ - ssd_titlebar_hide(ssd); + ssd_set_titlebar(ssd, false); } ssd->margin = ssd_thickness(view); ssd_set_active(ssd, active); @@ -267,13 +267,13 @@ ssd_update_geometry(struct ssd *ssd) } void -ssd_titlebar_hide(struct ssd *ssd) +ssd_set_titlebar(struct ssd *ssd, bool enabled) { - if (!ssd || !ssd->titlebar.tree->node.enabled) { + if (!ssd || ssd->titlebar.tree->node.enabled == enabled) { return; } - wlr_scene_node_set_enabled(&ssd->titlebar.tree->node, false); - ssd->titlebar.height = 0; + wlr_scene_node_set_enabled(&ssd->titlebar.tree->node, enabled); + ssd->titlebar.height = enabled ? ssd->view->server->theme->title_height : 0; ssd_border_update(ssd); ssd_extents_update(ssd); ssd_shadow_update(ssd); diff --git a/src/view.c b/src/view.c index ef44cbdb..09cc697d 100644 --- a/src/view.c +++ b/src/view.c @@ -1223,25 +1223,14 @@ view_toggle_decorations(struct view *view) { assert(view); - /* Reject decoration toggles when shaded */ - if (view->shaded) { - return; - } - - if (rc.ssd_keep_border && view->ssd_enabled && view->ssd - && !view->ssd_titlebar_hidden) { - /* - * ssd_titlebar_hidden has to be set before calling - * ssd_titlebar_hide() to make ssd_thickness() happy. - */ - view->ssd_titlebar_hidden = true; - ssd_titlebar_hide(view->ssd); - if (!view_is_floating(view)) { - view_apply_special_geometry(view); - } - return; + enum ssd_mode mode = view_get_ssd_mode(view); + if (rc.ssd_keep_border && mode == LAB_SSD_MODE_FULL) { + view_set_ssd_mode(view, LAB_SSD_MODE_BORDER); + } else if (mode != LAB_SSD_MODE_NONE) { + view_set_ssd_mode(view, LAB_SSD_MODE_NONE); + } else { + view_set_ssd_mode(view, LAB_SSD_MODE_FULL); } - view_set_decorations(view, !view->ssd_enabled); } bool @@ -1323,26 +1312,46 @@ undecorate(struct view *view) view->ssd = NULL; } +enum ssd_mode +view_get_ssd_mode(struct view *view) +{ + assert(view); + + if (!view->ssd_enabled) { + return LAB_SSD_MODE_NONE; + } else if (view->ssd_titlebar_hidden) { + return LAB_SSD_MODE_BORDER; + } else { + return LAB_SSD_MODE_FULL; + } +} + void -view_set_decorations(struct view *view, bool decorations) +view_set_ssd_mode(struct view *view, enum ssd_mode mode) { assert(view); - if (view->ssd_enabled != decorations && !view->fullscreen) { - /* - * Set view->ssd_enabled first since it is referenced - * within the call tree of ssd_create() - */ - view->ssd_enabled = decorations; - if (decorations) { - decorate(view); - } else { - undecorate(view); - view->ssd_titlebar_hidden = false; - } - if (!view_is_floating(view)) { - view_apply_special_geometry(view); - } + if (view->shaded || view->fullscreen + || mode == view_get_ssd_mode(view)) { + return; + } + + /* + * Set these first since they are referenced + * within the call tree of ssd_create() and ssd_thickness() + */ + view->ssd_enabled = mode != LAB_SSD_MODE_NONE; + view->ssd_titlebar_hidden = mode != LAB_SSD_MODE_FULL; + + if (view->ssd_enabled) { + decorate(view); + ssd_set_titlebar(view->ssd, !view->ssd_titlebar_hidden); + } else { + undecorate(view); + } + + if (!view_is_floating(view)) { + view_apply_special_geometry(view); } } diff --git a/src/xdg.c b/src/xdg.c index fd4e926f..e9b5984f 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -599,7 +599,11 @@ xdg_toplevel_view_map(struct view *view) init_foreign_toplevel(view); - view_set_decorations(view, has_ssd(view)); + if (has_ssd(view)) { + view_set_ssd_mode(view, LAB_SSD_MODE_FULL); + } else { + view_set_ssd_mode(view, LAB_SSD_MODE_NONE); + } /* * Set initial "pending" dimensions (may be modified by diff --git a/src/xwayland.c b/src/xwayland.c index 073a9697..2e537038 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -435,8 +435,11 @@ handle_request_maximize(struct wl_listener *listener, void *data) * Set decorations early to avoid changing geometry * after maximize (reduces visual glitches). */ - view_set_decorations(view, - want_deco(xwayland_surface_from_view(view))); + if (want_deco(xwayland_surface_from_view(view))) { + view_set_ssd_mode(view, LAB_SSD_MODE_FULL); + } else { + view_set_ssd_mode(view, LAB_SSD_MODE_NONE); + } } view_toggle_maximize(view, VIEW_AXIS_BOTH); } @@ -508,7 +511,11 @@ handle_set_decorations(struct wl_listener *listener, void *data) wl_container_of(listener, xwayland_view, set_decorations); struct view *view = &xwayland_view->base; - view_set_decorations(view, want_deco(xwayland_view->xwayland_surface)); + if (want_deco(xwayland_view->xwayland_surface)) { + view_set_ssd_mode(view, LAB_SSD_MODE_FULL); + } else { + view_set_ssd_mode(view, LAB_SSD_MODE_NONE); + } } static void @@ -659,7 +666,11 @@ xwayland_view_map(struct view *view) */ view_set_fullscreen(view, xwayland_surface->fullscreen); if (!view->been_mapped) { - view_set_decorations(view, want_deco(xwayland_surface)); + if (want_deco(xwayland_surface)) { + view_set_ssd_mode(view, LAB_SSD_MODE_FULL); + } else { + view_set_ssd_mode(view, LAB_SSD_MODE_NONE); + } } enum view_axis axis = VIEW_AXIS_NONE; if (xwayland_surface->maximized_horz) {