diff --git a/Userland/Libraries/LibGfx/Palette.h b/Userland/Libraries/LibGfx/Palette.h index 2d88cddc1b..2dbee0a252 100644 --- a/Userland/Libraries/LibGfx/Palette.h +++ b/Userland/Libraries/LibGfx/Palette.h @@ -143,6 +143,7 @@ public: Gfx::TextAlignment title_alignment() const { return alignment(AlignmentRole::TitleAlignment); } bool is_dark() const { return flag(FlagRole::IsDark); } + bool title_buttons_icon_only() const { return flag(FlagRole::TitleButtonsIconOnly); } int window_border_thickness() const { return metric(MetricRole::BorderThickness); } int window_border_radius() const { return metric(MetricRole::BorderRadius); } diff --git a/Userland/Libraries/LibGfx/SystemTheme.h b/Userland/Libraries/LibGfx/SystemTheme.h index 646b792382..aad4a28a95 100644 --- a/Userland/Libraries/LibGfx/SystemTheme.h +++ b/Userland/Libraries/LibGfx/SystemTheme.h @@ -105,7 +105,8 @@ namespace Gfx { C(TitleAlignment) #define ENUMERATE_FLAG_ROLES(C) \ - C(IsDark) + C(IsDark) \ + C(TitleButtonsIconOnly) #define ENUMERATE_METRIC_ROLES(C) \ C(BorderThickness) \ diff --git a/Userland/Services/WindowServer/Button.cpp b/Userland/Services/WindowServer/Button.cpp index ea05391042..2e578738c6 100644 --- a/Userland/Services/WindowServer/Button.cpp +++ b/Userland/Services/WindowServer/Button.cpp @@ -27,7 +27,9 @@ void Button::paint(Screen& screen, Gfx::Painter& painter) auto palette = WindowManager::the().palette(); Gfx::PainterStateSaver saver(painter); painter.translate(relative_rect().location()); - Gfx::StylePainter::paint_button(painter, rect(), palette, Gfx::ButtonStyle::Normal, m_pressed, m_hovered); + + if (m_style == Style::Normal) + Gfx::StylePainter::paint_button(painter, rect(), palette, Gfx::ButtonStyle::Normal, m_pressed, m_hovered); if (m_icon) { auto& bitmap = m_icon->bitmap(screen.scale_factor()); diff --git a/Userland/Services/WindowServer/Button.h b/Userland/Services/WindowServer/Button.h index eed6bd290d..bd65713261 100644 --- a/Userland/Services/WindowServer/Button.h +++ b/Userland/Services/WindowServer/Button.h @@ -42,6 +42,13 @@ public: void set_icon(RefPtr const& icon) { m_icon = icon; } + enum class Style { + Normal, + IconOnly + }; + + void set_style(Style style) { m_style = style; } + private: WindowFrame& m_frame; Gfx::IntRect m_relative_rect; @@ -49,6 +56,7 @@ private: bool m_pressed { false }; bool m_visible { true }; bool m_hovered { false }; + Style m_style { Style::Normal }; }; } diff --git a/Userland/Services/WindowServer/WindowFrame.cpp b/Userland/Services/WindowServer/WindowFrame.cpp index cf848fa081..6daa53b1fb 100644 --- a/Userland/Services/WindowServer/WindowFrame.cpp +++ b/Userland/Services/WindowServer/WindowFrame.cpp @@ -120,12 +120,22 @@ void WindowFrame::set_button_icons() if (m_window.is_frameless()) return; - if (m_window.is_closeable()) + auto button_style = WindowManager::the().palette().title_buttons_icon_only() + ? Button::Style::IconOnly + : Button::Style::Normal; + + if (m_window.is_closeable()) { m_close_button->set_icon(m_window.is_modified() ? *s_close_modified_icon : *s_close_icon); - if (m_window.is_minimizable()) + m_close_button->set_style(button_style); + } + if (m_window.is_minimizable()) { m_minimize_button->set_icon(s_minimize_icon); - if (m_window.is_resizable()) + m_minimize_button->set_style(button_style); + } + if (m_window.is_resizable()) { m_maximize_button->set_icon(m_window.is_maximized() ? *s_restore_icon : *s_maximize_icon); + m_maximize_button->set_style(button_style); + } } void WindowFrame::reload_config()