summaryrefslogtreecommitdiff
path: root/Userland/Services
diff options
context:
space:
mode:
authorTom <tomut@yahoo.com>2021-02-11 15:12:19 -0700
committerAndreas Kling <kling@serenityos.org>2021-02-11 23:36:11 +0100
commitcf1c159ed541222aeeb03d249f1e64ef0650b2df (patch)
tree816393140c8a3c01fb046c9a7cef73de289d67b2 /Userland/Services
parent8c694ed6ebd8ea7f036dcaa6306cf49225c377e8 (diff)
downloadserenity-cf1c159ed541222aeeb03d249f1e64ef0650b2df.zip
WindowServer: Allow different shadows for active/inactive windows
Also allow specifying different shadows for the task and menu bar.
Diffstat (limited to 'Userland/Services')
-rw-r--r--Userland/Services/WindowServer/Window.cpp2
-rw-r--r--Userland/Services/WindowServer/WindowFrame.cpp21
-rw-r--r--Userland/Services/WindowServer/WindowFrame.h3
-rw-r--r--Userland/Services/WindowServer/WindowManager.cpp3
4 files changed, 23 insertions, 6 deletions
diff --git a/Userland/Services/WindowServer/Window.cpp b/Userland/Services/WindowServer/Window.cpp
index 385a9851da..0a28629e16 100644
--- a/Userland/Services/WindowServer/Window.cpp
+++ b/Userland/Services/WindowServer/Window.cpp
@@ -474,7 +474,7 @@ void Window::invalidate(bool invalidate_frame, bool re_render_frame)
m_invalidated_frame = true;
}
if (re_render_frame)
- frame().set_dirty();
+ frame().set_dirty(true);
m_dirty_rects.clear();
Compositor::the().invalidate_window();
}
diff --git a/Userland/Services/WindowServer/WindowFrame.cpp b/Userland/Services/WindowServer/WindowFrame.cpp
index ac8644de01..9c17e967d9 100644
--- a/Userland/Services/WindowServer/WindowFrame.cpp
+++ b/Userland/Services/WindowServer/WindowFrame.cpp
@@ -60,11 +60,17 @@ static Gfx::Bitmap* s_close_icon;
static String s_last_title_button_icons_path;
static int s_last_title_button_icons_scale;
-static Gfx::Bitmap* s_window_shadow;
+static Gfx::Bitmap* s_active_window_shadow;
+static Gfx::Bitmap* s_inactive_window_shadow;
+static Gfx::Bitmap* s_menu_bar_shadow;
static Gfx::Bitmap* s_menu_shadow;
+static Gfx::Bitmap* s_task_bar_shadow;
static Gfx::Bitmap* s_tooltip_shadow;
-static String s_last_window_shadow_path;
+static String s_last_active_window_shadow_path;
+static String s_last_inactive_window_shadow_path;
+static String s_last_menu_bar_shadow_path;
static String s_last_menu_shadow_path;
+static String s_last_task_bar_shadow_path;
static String s_last_tooltip_shadow_path;
static Gfx::IntRect frame_rect_for_window(Window& window, const Gfx::IntRect& rect)
@@ -185,8 +191,11 @@ void WindowFrame::reload_config()
last_path = String::empty();
}
};
- load_shadow(WindowManager::the().palette().window_shadow_path(), s_last_window_shadow_path, s_window_shadow);
+ load_shadow(WindowManager::the().palette().active_window_shadow_path(), s_last_active_window_shadow_path, s_active_window_shadow);
+ load_shadow(WindowManager::the().palette().inactive_window_shadow_path(), s_last_inactive_window_shadow_path, s_inactive_window_shadow);
+ load_shadow(WindowManager::the().palette().menu_bar_shadow_path(), s_last_menu_bar_shadow_path, s_menu_bar_shadow);
load_shadow(WindowManager::the().palette().menu_shadow_path(), s_last_menu_shadow_path, s_menu_shadow);
+ load_shadow(WindowManager::the().palette().task_bar_shadow_path(), s_last_task_bar_shadow_path, s_task_bar_shadow);
load_shadow(WindowManager::the().palette().tooltip_shadow_path(), s_last_tooltip_shadow_path, s_tooltip_shadow);
}
@@ -201,8 +210,12 @@ Gfx::Bitmap* WindowFrame::window_shadow() const
return s_menu_shadow;
case WindowType::Tooltip:
return s_tooltip_shadow;
+ case WindowType::Menubar:
+ return s_menu_bar_shadow;
+ case WindowType::Taskbar:
+ return s_task_bar_shadow;
default:
- return s_window_shadow;
+ return m_window.is_active() ? s_active_window_shadow : s_inactive_window_shadow;
}
}
diff --git a/Userland/Services/WindowServer/WindowFrame.h b/Userland/Services/WindowServer/WindowFrame.h
index fa838c8a5b..992ce11921 100644
--- a/Userland/Services/WindowServer/WindowFrame.h
+++ b/Userland/Services/WindowServer/WindowFrame.h
@@ -82,9 +82,10 @@ public:
return true;
}
- void set_dirty()
+ void set_dirty(bool re_render_shadow = false)
{
m_dirty = true;
+ m_shadow_dirty |= re_render_shadow;
}
void theme_changed()
diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp
index a9b4c404ca..e2dc90e86a 100644
--- a/Userland/Services/WindowServer/WindowManager.cpp
+++ b/Userland/Services/WindowServer/WindowManager.cpp
@@ -1287,6 +1287,9 @@ void WindowManager::set_active_window(Window* window, bool make_input)
} else {
MenuManager::the().set_current_menubar(nullptr);
}
+
+ // Window shapes may have changed (e.g. shadows for inactive/active windows)
+ Compositor::the().invalidate_occlusions();
}
void WindowManager::set_hovered_window(Window* window)