mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 02:37:36 +00:00
WindowServer+LibGUI: Add a way to get notified at display refresh rate
This patch adds GUI::DisplayLink, a mechanism for registering callbacks that will fire at the display refresh rate. Note that we don't actually know the screen refresh rate, but this is instead completely driven by WindowServer's compositing timer. For all current intents and purposes it does the job well enough. :^)
This commit is contained in:
parent
bb70d0692b
commit
424a3f5ac3
11 changed files with 183 additions and 0 deletions
|
@ -734,4 +734,22 @@ OwnPtr<Messages::WindowServer::SetWindowBaseSizeAndSizeIncrementResponse> Client
|
|||
return make<Messages::WindowServer::SetWindowBaseSizeAndSizeIncrementResponse>();
|
||||
}
|
||||
|
||||
void ClientConnection::handle(const Messages::WindowServer::EnableDisplayLink&)
|
||||
{
|
||||
m_has_display_link = true;
|
||||
}
|
||||
|
||||
void ClientConnection::handle(const Messages::WindowServer::DisableDisplayLink&)
|
||||
{
|
||||
m_has_display_link = false;
|
||||
}
|
||||
|
||||
void ClientConnection::notify_display_link(Badge<Compositor>)
|
||||
{
|
||||
if (!m_has_display_link)
|
||||
return;
|
||||
|
||||
post_message(Messages::WindowClient::DisplayLinkNotification());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <AK/Badge.h>
|
||||
#include <AK/Function.h>
|
||||
#include <AK/HashMap.h>
|
||||
#include <AK/OwnPtr.h>
|
||||
|
@ -38,6 +39,7 @@
|
|||
|
||||
namespace WindowServer {
|
||||
|
||||
class Compositor;
|
||||
class Window;
|
||||
class Menu;
|
||||
class MenuBar;
|
||||
|
@ -72,6 +74,8 @@ public:
|
|||
return const_cast<Menu*>(menu.value().ptr());
|
||||
}
|
||||
|
||||
void notify_display_link(Badge<Compositor>);
|
||||
|
||||
private:
|
||||
explicit ClientConnection(Core::LocalSocket&, int client_id);
|
||||
|
||||
|
@ -117,6 +121,8 @@ private:
|
|||
virtual OwnPtr<Messages::WindowServer::SetSystemMenuResponse> handle(const Messages::WindowServer::SetSystemMenu&) override;
|
||||
virtual OwnPtr<Messages::WindowServer::SetSystemThemeResponse> handle(const Messages::WindowServer::SetSystemTheme&) override;
|
||||
virtual OwnPtr<Messages::WindowServer::SetWindowBaseSizeAndSizeIncrementResponse> handle(const Messages::WindowServer::SetWindowBaseSizeAndSizeIncrement&) override;
|
||||
virtual void handle(const Messages::WindowServer::EnableDisplayLink&) override;
|
||||
virtual void handle(const Messages::WindowServer::DisableDisplayLink&) override;
|
||||
|
||||
HashMap<int, NonnullRefPtr<Window>> m_windows;
|
||||
HashMap<int, NonnullOwnPtr<MenuBar>> m_menubars;
|
||||
|
@ -127,6 +133,8 @@ private:
|
|||
int m_next_menu_id { 20000 };
|
||||
int m_next_window_id { 1982 };
|
||||
|
||||
bool m_has_display_link { false };
|
||||
|
||||
RefPtr<SharedBuffer> m_last_sent_clipboard_content;
|
||||
};
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
*/
|
||||
|
||||
#include "Compositor.h"
|
||||
#include "ClientConnection.h"
|
||||
#include "Event.h"
|
||||
#include "EventLoop.h"
|
||||
#include "Screen.h"
|
||||
|
@ -69,6 +70,7 @@ Compositor::Compositor()
|
|||
init_bitmaps();
|
||||
|
||||
m_compose_timer->on_timeout = [&]() {
|
||||
notify_display_links();
|
||||
#if defined(COMPOSITOR_DEBUG)
|
||||
dbgprintf("Compositor: delayed frame callback: %d rects\n", m_dirty_rects.size());
|
||||
#endif
|
||||
|
@ -466,4 +468,11 @@ void Compositor::draw_cursor()
|
|||
m_last_cursor_rect = cursor_rect;
|
||||
}
|
||||
|
||||
void Compositor::notify_display_links()
|
||||
{
|
||||
ClientConnection::for_each_client([](auto& client) {
|
||||
client.notify_display_link({});
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -70,6 +70,7 @@ private:
|
|||
void draw_geometry_label();
|
||||
void draw_menubar();
|
||||
void run_animations();
|
||||
void notify_display_links();
|
||||
|
||||
RefPtr<Core::Timer> m_compose_timer;
|
||||
RefPtr<Core::Timer> m_immediate_compose_timer;
|
||||
|
|
|
@ -35,4 +35,6 @@ endpoint WindowClient = 4
|
|||
DragDropped(i32 window_id, Gfx::Point mouse_position, String text, String data_type, String data) =|
|
||||
|
||||
UpdateSystemTheme(i32 system_theme_buffer_id) =|
|
||||
|
||||
DisplayLinkNotification() =|
|
||||
}
|
||||
|
|
|
@ -85,4 +85,7 @@ endpoint WindowServer = 2
|
|||
SetSystemTheme(String theme_path, String theme_name) => (bool success)
|
||||
|
||||
SetWindowBaseSizeAndSizeIncrement(i32 window_id, Gfx::Size base_size, Gfx::Size size_increment) => ()
|
||||
|
||||
EnableDisplayLink() =|
|
||||
DisableDisplayLink() =|
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue