From 8904a61d71355b2786108aeab1f3b2cb5f139b18 Mon Sep 17 00:00:00 2001 From: thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> Date: Sun, 7 Aug 2022 19:40:02 -0400 Subject: [PATCH] LibGUI+WindowServer: Add a SystemEffects wrapper and helpers SystemEffects provides a tidy way to work with system-wide visual options passed through IPC. --- Userland/Libraries/LibGUI/SystemEffects.h | 17 +++ .../Services/WindowServer/SystemEffects.h | 107 ++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 Userland/Libraries/LibGUI/SystemEffects.h create mode 100644 Userland/Services/WindowServer/SystemEffects.h diff --git a/Userland/Libraries/LibGUI/SystemEffects.h b/Userland/Libraries/LibGUI/SystemEffects.h new file mode 100644 index 0000000000..acddc02f7f --- /dev/null +++ b/Userland/Libraries/LibGUI/SystemEffects.h @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2022, the SerenityOS developers. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace GUI { + +using SystemEffects = WindowServer::SystemEffects; +using ShowGeometry = WindowServer::ShowGeometry; +using Effects = WindowServer::Effects; + +} diff --git a/Userland/Services/WindowServer/SystemEffects.h b/Userland/Services/WindowServer/SystemEffects.h new file mode 100644 index 0000000000..6f3617c979 --- /dev/null +++ b/Userland/Services/WindowServer/SystemEffects.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2022, the SerenityOS developers. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace WindowServer { + +enum ShowGeometry : u8 { + OnMoveAndResize, + OnMoveOnly, + OnResizeOnly, + Never +}; + +enum Effects : size_t { + AnimateMenus, + FlashMenus, + AnimateWindows, + SmoothScrolling, + TabAccents, + SplitterKnurls, + MenuShadow, + WindowShadow, + TooltipShadow, + __Count +}; + +namespace ShowGeometryTools { + +[[maybe_unused]] static StringView enum_to_string(ShowGeometry geometry) +{ + switch (geometry) { + case ShowGeometry::OnMoveAndResize: + return "OnMoveAndResize"sv; + case ShowGeometry::OnMoveOnly: + return "OnMoveOnly"sv; + case ShowGeometry::OnResizeOnly: + return "OnResizeOnly"sv; + case ShowGeometry::Never: + return "Never"sv; + default: + VERIFY_NOT_REACHED(); + } +} + +[[maybe_unused]] static ShowGeometry string_to_enum(StringView geometry) +{ + if (geometry == "OnMoveAndResize"sv) + return ShowGeometry::OnMoveAndResize; + else if (geometry == "OnMoveOnly"sv) + return ShowGeometry::OnMoveOnly; + else if (geometry == "OnResizeOnly"sv) + return ShowGeometry::OnResizeOnly; + else if (geometry == "Never"sv) + return ShowGeometry::Never; + VERIFY_NOT_REACHED(); +} + +}; + +class SystemEffects { +public: + SystemEffects() = default; + SystemEffects(Vector effects, ShowGeometry show) + : m_effects(effects) + , m_geometry(show) + { + } + SystemEffects(Vector effects) + : m_effects(effects) + { + } + ~SystemEffects() = default; + + Vector& effects() { return m_effects; } + bool animate_menus() const { return m_effects[AnimateMenus]; } + bool flash_menus() const { return m_effects[FlashMenus]; } + bool animate_windows() const { return m_effects[AnimateWindows]; } + bool smooth_scrolling() const { return m_effects[SmoothScrolling]; } + + bool tab_accents() const { return m_effects[TabAccents]; } + bool splitter_knurls() const { return m_effects[SplitterKnurls]; } + + bool menu_shadow() const { return m_effects[MenuShadow]; } + bool window_shadow() const { return m_effects[WindowShadow]; } + bool tooltip_shadow() const { return m_effects[TooltipShadow]; } + + void set_geometry(ShowGeometry g) { m_geometry = g; } + ShowGeometry geometry() const { return m_geometry; } + + bool operator==(SystemEffects const& other) const + { + return m_effects == other.m_effects && m_geometry == other.m_geometry; + } + +private: + Vector m_effects; + ShowGeometry m_geometry { ShowGeometry::Never }; +}; + +}