1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 07:27:45 +00:00

WindowServer: Don't re-render the window frame when not needed

Merely moving a window shouldn't require re-rendering the window
frame anymore now that we cache the rendered frame in bitmaps. This
reduces CPU usage significantly when moving windows.
This commit is contained in:
Tom 2021-02-10 11:54:58 -07:00 committed by Andreas Kling
parent 497d48a8de
commit f8d65e57ba
5 changed files with 22 additions and 23 deletions

View file

@ -466,7 +466,7 @@ OwnPtr<Messages::WindowServer::CreateWindowResponse> ClientConnection::handle(co
window->set_size_increment(message.size_increment()); window->set_size_increment(message.size_increment());
window->set_base_size(message.base_size()); window->set_base_size(message.base_size());
window->set_resize_aspect_ratio(message.resize_aspect_ratio()); window->set_resize_aspect_ratio(message.resize_aspect_ratio());
window->invalidate(); window->invalidate(true, true);
if (window->type() == WindowType::MenuApplet) if (window->type() == WindowType::MenuApplet)
AppletManager::the().add_applet(*window); AppletManager::the().add_applet(*window);
m_windows.set(window_id, move(window)); m_windows.set(window_id, move(window));

View file

@ -152,7 +152,7 @@ void Window::set_rect(const Gfx::IntRect& rect)
m_backing_store = Gfx::Bitmap::create(Gfx::BitmapFormat::RGB32, m_rect.size()); m_backing_store = Gfx::Bitmap::create(Gfx::BitmapFormat::RGB32, m_rect.size());
} }
invalidate(true); invalidate(true, old_rect.size() != rect.size());
m_frame.notify_window_rect_changed(old_rect, rect); // recomputes occlusions m_frame.notify_window_rect_changed(old_rect, rect); // recomputes occlusions
} }
@ -172,7 +172,7 @@ void Window::set_rect_without_repaint(const Gfx::IntRect& rect)
} }
} }
invalidate(true); invalidate(true, old_rect.size() != rect.size());
m_frame.notify_window_rect_changed(old_rect, rect); // recomputes occlusions m_frame.notify_window_rect_changed(old_rect, rect); // recomputes occlusions
} }
@ -466,14 +466,15 @@ void Window::set_visible(bool b)
Compositor::the().invalidate_screen(frame().render_rect()); Compositor::the().invalidate_screen(frame().render_rect());
} }
void Window::invalidate(bool invalidate_frame) void Window::invalidate(bool invalidate_frame, bool re_render_frame)
{ {
m_invalidated = true; m_invalidated = true;
m_invalidated_all = true; m_invalidated_all = true;
if (invalidate_frame && !m_invalidated_frame) { if (invalidate_frame && !m_invalidated_frame) {
m_invalidated_frame = true; m_invalidated_frame = true;
frame().set_dirty();
} }
if (re_render_frame)
frame().set_dirty();
m_dirty_rects.clear(); m_dirty_rects.clear();
Compositor::the().invalidate_window(); Compositor::the().invalidate_window();
} }
@ -494,10 +495,8 @@ bool Window::invalidate_no_notify(const Gfx::IntRect& rect, bool with_frame)
if (rect.is_empty()) if (rect.is_empty())
return false; return false;
if (m_invalidated_all) { if (m_invalidated_all) {
if (with_frame && !m_invalidated_frame) { if (with_frame)
m_invalidated_frame = true; m_invalidated_frame |= true;
frame().set_dirty();
}
return false; return false;
} }
@ -510,10 +509,8 @@ bool Window::invalidate_no_notify(const Gfx::IntRect& rect, bool with_frame)
return false; return false;
m_invalidated = true; m_invalidated = true;
if (with_frame && !m_invalidated_frame) { if (with_frame)
m_invalidated_frame = true; m_invalidated_frame |= true;
frame().set_dirty();
}
m_dirty_rects.add(inner_rect.translated(-outer_rect.location())); m_dirty_rects.add(inner_rect.translated(-outer_rect.location()));
return true; return true;
} }

View file

@ -179,7 +179,7 @@ public:
Gfx::IntSize size() const { return m_rect.size(); } Gfx::IntSize size() const { return m_rect.size(); }
void invalidate(bool with_frame = true); void invalidate(bool with_frame = true, bool re_render_frame = false);
void invalidate(const Gfx::IntRect&, bool with_frame = false); void invalidate(const Gfx::IntRect&, bool with_frame = false);
bool invalidate_no_notify(const Gfx::IntRect& rect, bool with_frame = false); bool invalidate_no_notify(const Gfx::IntRect& rect, bool with_frame = false);

View file

@ -465,6 +465,7 @@ Gfx::IntRect WindowFrame::render_rect() const
void WindowFrame::invalidate_title_bar() void WindowFrame::invalidate_title_bar()
{ {
m_dirty = true;
invalidate(title_bar_rect()); invalidate(title_bar_rect());
} }

View file

@ -440,7 +440,7 @@ void WindowManager::start_window_move(Window& window, const MouseEvent& event)
m_move_window->set_default_positioned(false); m_move_window->set_default_positioned(false);
m_move_origin = event.position(); m_move_origin = event.position();
m_move_window_origin = window.position(); m_move_window_origin = window.position();
window.invalidate(); window.invalidate(true, true);
} }
void WindowManager::start_window_resize(Window& window, const Gfx::IntPoint& position, MouseButton button) void WindowManager::start_window_resize(Window& window, const Gfx::IntPoint& position, MouseButton button)
@ -475,7 +475,7 @@ void WindowManager::start_window_resize(Window& window, const Gfx::IntPoint& pos
m_active_input_tracking_window = nullptr; m_active_input_tracking_window = nullptr;
window.invalidate(); window.invalidate(true, true);
if (hot_area_row == 0 || hot_area_column == 0) { if (hot_area_row == 0 || hot_area_column == 0) {
m_resize_window->set_default_positioned(false); m_resize_window->set_default_positioned(false);
@ -495,7 +495,7 @@ bool WindowManager::process_ongoing_window_move(MouseEvent& event, Window*& hove
dbgln_if(MOVE_DEBUG, "[WM] Finish moving Window({})", m_move_window); dbgln_if(MOVE_DEBUG, "[WM] Finish moving Window({})", m_move_window);
m_move_window->invalidate(); m_move_window->invalidate(true, true);
if (m_move_window->rect().contains(event.position())) if (m_move_window->rect().contains(event.position()))
hovered_window = m_move_window; hovered_window = m_move_window;
if (m_move_window->is_resizable()) { if (m_move_window->is_resizable()) {
@ -591,7 +591,7 @@ bool WindowManager::process_ongoing_window_resize(const MouseEvent& event, Windo
} }
Core::EventLoop::current().post_event(*m_resize_window, make<ResizeEvent>(m_resize_window->rect())); Core::EventLoop::current().post_event(*m_resize_window, make<ResizeEvent>(m_resize_window->rect()));
m_resize_window->invalidate(); m_resize_window->invalidate(true, true);
if (m_resize_window->rect().contains(event.position())) if (m_resize_window->rect().contains(event.position()))
hovered_window = m_resize_window; hovered_window = m_resize_window;
m_resize_window = nullptr; m_resize_window = nullptr;
@ -1181,11 +1181,12 @@ void WindowManager::set_highlight_window(Window* window)
{ {
if (window == m_highlight_window) if (window == m_highlight_window)
return; return;
if (auto* previous_highlight_window = m_highlight_window.ptr()) auto* previous_highlight_window = m_highlight_window.ptr();
previous_highlight_window->invalidate();
m_highlight_window = window; m_highlight_window = window;
if (previous_highlight_window)
previous_highlight_window->invalidate(true, true);
if (m_highlight_window) if (m_highlight_window)
m_highlight_window->invalidate(); m_highlight_window->invalidate(true, true);
} }
bool WindowManager::is_active_window_or_accessory(Window& window) const bool WindowManager::is_active_window_or_accessory(Window& window) const
@ -1267,7 +1268,7 @@ void WindowManager::set_active_window(Window* window, bool make_input)
if (previously_active_window) { if (previously_active_window) {
Core::EventLoop::current().post_event(*previously_active_window, make<Event>(Event::WindowDeactivated)); Core::EventLoop::current().post_event(*previously_active_window, make<Event>(Event::WindowDeactivated));
previously_active_window->invalidate(); previously_active_window->invalidate(true, true);
m_active_window = nullptr; m_active_window = nullptr;
m_active_input_tracking_window = nullptr; m_active_input_tracking_window = nullptr;
tell_wm_listeners_window_state_changed(*previously_active_window); tell_wm_listeners_window_state_changed(*previously_active_window);
@ -1276,7 +1277,7 @@ void WindowManager::set_active_window(Window* window, bool make_input)
if (window) { if (window) {
m_active_window = *window; m_active_window = *window;
Core::EventLoop::current().post_event(*m_active_window, make<Event>(Event::WindowActivated)); Core::EventLoop::current().post_event(*m_active_window, make<Event>(Event::WindowActivated));
m_active_window->invalidate(); m_active_window->invalidate(true, true);
if (auto* client = window->client()) { if (auto* client = window->client()) {
MenuManager::the().set_current_menubar(client->app_menubar()); MenuManager::the().set_current_menubar(client->app_menubar());
} else { } else {