From 582427f333709f6927aa73a5787e3fb0a6dab920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Santos?= Date: Fri, 19 Jun 2026 03:38:13 +0100 Subject: [PATCH] feat(taskbar): add minimal style option for workspace labels When enabled, workspace labels in the taskbar show as colored text without the colored disc background. The fill color (primary for active, secondary for occupied) becomes the text color instead. This mirrors the minimal style option already available in the workspaces widget. --- assets/translations/en.json | 3 ++- src/shell/bar/widget_factory.cpp | 1 + src/shell/bar/widgets/taskbar_widget.cpp | 17 +++++++++-------- src/shell/bar/widgets/taskbar_widget.h | 2 ++ src/shell/settings/widget_settings_registry.cpp | 5 +++++ 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index 7dab837c63..367df63734 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -3087,7 +3087,8 @@ "minimal": { "description": "Show workspace id or name labels only, without animated pills", "label": "Minimal Style", - "workspaces-description": "Text-only workspace labels without pill backgrounds or slide animation" + "workspaces-description": "Text-only workspace labels without pill backgrounds or slide animation", + "taskbar-description": "Text-only workspace labels without colored disc backgrounds" }, "mirrored": { "description": "Mirror the visualizer around its center", diff --git a/src/shell/bar/widget_factory.cpp b/src/shell/bar/widget_factory.cpp index e90ce8010c..1b6f9ac445 100644 --- a/src/shell/bar/widget_factory.cpp +++ b/src/shell/bar/widget_factory.cpp @@ -533,6 +533,7 @@ std::unique_ptr WidgetFactory::create( .hideEmptyWorkspaces = wc != nullptr ? wc->getBool("hide_empty_workspaces", false) : false, .workspaceGroupCapsule = wc != nullptr ? wc->getBool("workspace_group_capsule", true) : true, .focusedOutputOnly = wc != nullptr ? wc->getBool("focused_output_only", false) : false, + .minimal = wc != nullptr ? wc->getBool("minimal", false) : false, .groupSingleIconPerApp = wc != nullptr ? wc->getBool("group_single_icon_per_app", false) : false, .showActiveIndicator = wc != nullptr ? wc->getBool("show_active_indicator", true) : true, .activeOpacity = wc != nullptr ? static_cast(wc->getDouble("active_opacity", 1.0)) : 1.0f, diff --git a/src/shell/bar/widgets/taskbar_widget.cpp b/src/shell/bar/widgets/taskbar_widget.cpp index 0e06ca1243..493f34b38d 100644 --- a/src/shell/bar/widgets/taskbar_widget.cpp +++ b/src/shell/bar/widgets/taskbar_widget.cpp @@ -166,11 +166,12 @@ TaskbarWidget::TaskbarWidget( ) : m_platform(platform), m_configService(config), m_output(output), m_configOptions(std::move(options)), m_showAllOutputs(m_configOptions.showAllOutputs), m_focusedOutputOnly(m_configOptions.focusedOutputOnly), - m_showActiveIndicator(m_configOptions.showActiveIndicator), m_activeOpacity(m_configOptions.activeOpacity), - m_inactiveOpacity(m_configOptions.inactiveOpacity), m_focusedColor(m_configOptions.focusedColor), - m_occupiedColor(m_configOptions.occupiedColor), m_emptyColor(m_configOptions.emptyColor), - m_windowTitleMaxWidth(m_configOptions.windowTitleMaxWidth), m_taskbarMaxWidth(m_configOptions.taskbarMaxWidth), - m_barPosition(std::move(m_configOptions.barPosition)), m_shadowConfig(m_configOptions.shadowConfig) { + m_minimal(m_configOptions.minimal), m_showActiveIndicator(m_configOptions.showActiveIndicator), + m_activeOpacity(m_configOptions.activeOpacity), m_inactiveOpacity(m_configOptions.inactiveOpacity), + m_focusedColor(m_configOptions.focusedColor), m_occupiedColor(m_configOptions.occupiedColor), + m_emptyColor(m_configOptions.emptyColor), m_windowTitleMaxWidth(m_configOptions.windowTitleMaxWidth), + m_taskbarMaxWidth(m_configOptions.taskbarMaxWidth), m_barPosition(std::move(m_configOptions.barPosition)), + m_shadowConfig(m_configOptions.shadowConfig) { syncWorkspaceGroupingCapability(); buildDesktopIconIndex(); } @@ -607,7 +608,7 @@ void TaskbarWidget::buildTaskButtons(Renderer& renderer) { const auto styleWorkspaceDisc = [this](Box& badge, float width, float height, const Workspace& workspace) { badge.setFrameSize(width, height); badge.setRadius(resolvedBarCapsuleRadius(width, height)); - badge.setFill(workspaceFillColor(workspace)); + badge.setFill(m_minimal ? clearColorSpec() : workspaceFillColor(workspace)); badge.clearBorder(); }; @@ -647,7 +648,7 @@ void TaskbarWidget::buildTaskButtons(Renderer& renderer) { .fontSize = badgeFontSize, .fontWeight = fontWeight, .fontFamily = fontFamily, - .color = workspaceTextColor(ws.workspace), + .color = m_minimal ? workspaceFillColor(ws.workspace) : workspaceTextColor(ws.workspace), }); badgeText->measure(renderer); badgeText->setPosition( @@ -693,7 +694,7 @@ void TaskbarWidget::buildTaskButtons(Renderer& renderer) { .fontSize = badgeFontSize, .fontWeight = fontWeight, .fontFamily = fontFamily, - .color = workspaceTextColor(ws.workspace), + .color = m_minimal ? workspaceFillColor(ws.workspace) : workspaceTextColor(ws.workspace), }); badgeText->measure(renderer); badgeText->setPosition( diff --git a/src/shell/bar/widgets/taskbar_widget.h b/src/shell/bar/widgets/taskbar_widget.h index 1864778ce3..98cc461326 100644 --- a/src/shell/bar/widgets/taskbar_widget.h +++ b/src/shell/bar/widgets/taskbar_widget.h @@ -35,6 +35,7 @@ struct TaskbarWidgetOptions { bool hideEmptyWorkspaces = false; bool workspaceGroupCapsule = true; bool focusedOutputOnly = false; + bool minimal = false; bool groupSingleIconPerApp = false; bool showActiveIndicator = true; float activeOpacity = 1.0f; @@ -131,6 +132,7 @@ class TaskbarWidget : public Widget { bool m_focusedOutputOnly = false; bool m_wasFocusedOutput = true; bool m_activeUsesFocusedColor = true; + bool m_minimal = false; bool m_groupSingleIconPerApp = false; bool m_showActiveIndicator = true; float m_activeOpacity = 1.0f; diff --git a/src/shell/settings/widget_settings_registry.cpp b/src/shell/settings/widget_settings_registry.cpp index 8280924b73..c665930bb4 100644 --- a/src/shell/settings/widget_settings_registry.cpp +++ b/src/shell/settings/widget_settings_registry.cpp @@ -851,6 +851,11 @@ namespace settings { focusedOutputOnly.visibleWhen = WidgetSettingVisibility{WidgetSettingVisibilityCondition{"show_workspace_label", {"true"}}}; add(std::move(focusedOutputOnly)); + auto minimal = boolSpec("minimal", false); + minimal.descriptionKey = "settings.widgets.settings.minimal.taskbar-description"; + minimal.visibleWhen = + WidgetSettingVisibility{WidgetSettingVisibilityCondition{"show_workspace_label", {"true"}}}; + add(std::move(minimal)); } { auto singleIconPerApp = boolSpec("group_single_icon_per_app", false);