From 364a1d520705ced7e6056cdda0fcfa3dd4643400 Mon Sep 17 00:00:00 2001 From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Fri, 3 Oct 2025 02:10:00 +0200 Subject: [PATCH] osd: allow window switcher to temporary unshade windows This can be configured with a new unshade="yes|no" argument for windowSwitcher in rc.xml Fixes: #3111 --- docs/labwc-config.5.scd | 5 ++++- docs/rc.xml.all | 3 ++- include/config/rcxml.h | 1 + include/labwc.h | 1 + src/config/rcxml.c | 3 +++ src/input/keyboard.c | 3 +++ src/osd/osd.c | 18 +++++++++++++++--- 7 files changed, 29 insertions(+), 5 deletions(-) diff --git a/docs/labwc-config.5.scd b/docs/labwc-config.5.scd index 21ac2629..20149bee 100644 --- a/docs/labwc-config.5.scd +++ b/docs/labwc-config.5.scd @@ -346,7 +346,7 @@ this is for compatibility with Openbox. ``` -** +** *show* [yes|no] Draw the OnScreenDisplay when switching between windows. Default is yes. @@ -364,6 +364,9 @@ this is for compatibility with Openbox. they are on. Default no (that is only windows on the current workspace are shown). + *unshade* [yes|no] Temporarily unshade windows when switching between + them and permanently unshade on the final selection. Default is yes. + ** Define window switcher fields when using **. diff --git a/docs/rc.xml.all b/docs/rc.xml.all index 44ed984a..1dd08c4d 100644 --- a/docs/rc.xml.all +++ b/docs/rc.xml.all @@ -79,7 +79,8 @@ - + diff --git a/include/config/rcxml.h b/include/config/rcxml.h index e4fd184b..50874571 100644 --- a/include/config/rcxml.h +++ b/include/config/rcxml.h @@ -179,6 +179,7 @@ struct rcxml { bool show; bool preview; bool outlines; + bool unshade; enum lab_view_criteria criteria; struct wl_list fields; /* struct window_switcher_field.link */ enum window_switcher_style style; diff --git a/include/labwc.h b/include/labwc.h index 5a3bbefa..735f57b8 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -303,6 +303,7 @@ struct server { /* Set when in cycle (alt-tab) mode */ struct osd_state { struct view *cycle_view; + bool preview_was_shaded; bool preview_was_enabled; struct wlr_scene_node *preview_node; struct wlr_scene_tree *preview_parent; diff --git a/src/config/rcxml.c b/src/config/rcxml.c index 4ed6bd6d..be49eaeb 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -1217,6 +1217,8 @@ entry(xmlNode *node, char *nodename, char *content) rc.window_switcher.criteria &= ~LAB_VIEW_CRITERIA_CURRENT_WORKSPACE; } + } else if (!strcasecmp(nodename, "unshade.windowSwitcher")) { + set_bool(content, &rc.window_switcher.unshade); /* Remove this long term - just a friendly warning for now */ } else if (strstr(nodename, "windowswitcher.core")) { @@ -1429,6 +1431,7 @@ rcxml_init(void) rc.window_switcher.style = WINDOW_SWITCHER_CLASSIC; rc.window_switcher.preview = true; rc.window_switcher.outlines = true; + rc.window_switcher.unshade = true; rc.window_switcher.criteria = LAB_VIEW_CRITERIA_CURRENT_WORKSPACE | LAB_VIEW_CRITERIA_ROOT_TOPLEVEL | LAB_VIEW_CRITERIA_NO_SKIP_WINDOW_SWITCHER; diff --git a/src/input/keyboard.c b/src/input/keyboard.c index ae92e73f..8f7a3e81 100644 --- a/src/input/keyboard.c +++ b/src/input/keyboard.c @@ -96,6 +96,9 @@ end_cycling(struct server *server) /* FIXME: osd_finish() transiently sets focus to the old surface */ osd_finish(server); /* Note that server->osd_state.cycle_view is cleared at this point */ + if (rc.window_switcher.unshade) { + view_set_shade(cycle_view, false); + } desktop_focus_view(cycle_view, /*raise*/ true); } diff --git a/src/osd/osd.c b/src/osd/osd.c index df1b7ad9..e436c19e 100644 --- a/src/osd/osd.c +++ b/src/osd/osd.c @@ -9,6 +9,7 @@ #include "common/scene-helpers.h" #include "config/rcxml.h" #include "labwc.h" +#include "node.h" #include "output.h" #include "scaled-buffer/scaled-font-buffer.h" #include "scaled-buffer/scaled-icon-buffer.h" @@ -160,9 +161,14 @@ restore_preview_node(struct server *server) if (!osd_state->preview_was_enabled) { wlr_scene_node_set_enabled(osd_state->preview_node, false); } + if (osd_state->preview_was_shaded) { + struct view *view = node_view_from_node(osd_state->preview_node); + view_set_shade(view, true); + } osd_state->preview_node = NULL; osd_state->preview_parent = NULL; osd_state->preview_anchor = NULL; + osd_state->preview_was_shaded = false; } } @@ -203,6 +209,7 @@ osd_finish(struct server *server) server->osd_state.preview_node = NULL; server->osd_state.preview_anchor = NULL; server->osd_state.cycle_view = NULL; + server->osd_state.preview_was_shaded = false; destroy_osd_scenes(server); @@ -244,6 +251,10 @@ preview_cycled_view(struct view *view) if (!osd_state->preview_was_enabled) { wlr_scene_node_set_enabled(osd_state->preview_node, true); } + if (rc.window_switcher.unshade && view->shaded) { + view_set_shade(view, false); + osd_state->preview_was_shaded = true; + } /* * FIXME: This abuses an implementation detail of the always-on-top tree. @@ -294,6 +305,10 @@ update_osd(struct server *server) } } + if (rc.window_switcher.preview) { + preview_cycled_view(server->osd_state.cycle_view); + } + /* Outline current window */ if (rc.window_switcher.outlines) { if (view_is_focusable(server->osd_state.cycle_view)) { @@ -301,9 +316,6 @@ update_osd(struct server *server) } } - if (rc.window_switcher.preview) { - preview_cycled_view(server->osd_state.cycle_view); - } out: wl_array_release(&views); }