mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 14:07:46 +00:00
LibGUI+WindowServer: Allow applications to set custom cursor bitmaps
This will allow e.g PaintBrush to use custom cursors for each tool.
This commit is contained in:
parent
8c1b01e79b
commit
df43e09433
5 changed files with 36 additions and 2 deletions
|
@ -209,10 +209,21 @@ void Window::set_override_cursor(StandardCursor cursor)
|
||||||
{
|
{
|
||||||
if (!is_visible())
|
if (!is_visible())
|
||||||
return;
|
return;
|
||||||
if (m_override_cursor == cursor)
|
if (!m_custom_cursor && m_override_cursor == cursor)
|
||||||
return;
|
return;
|
||||||
WindowServerConnection::the().send_sync<Messages::WindowServer::SetWindowOverrideCursor>(m_window_id, (u32)cursor);
|
WindowServerConnection::the().send_sync<Messages::WindowServer::SetWindowOverrideCursor>(m_window_id, (u32)cursor);
|
||||||
m_override_cursor = cursor;
|
m_override_cursor = cursor;
|
||||||
|
m_custom_cursor = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Window::set_override_cursor(const Gfx::Bitmap& cursor)
|
||||||
|
{
|
||||||
|
if (!is_visible())
|
||||||
|
return;
|
||||||
|
if (&cursor == m_custom_cursor.ptr())
|
||||||
|
return;
|
||||||
|
m_custom_cursor = &cursor;
|
||||||
|
WindowServerConnection::the().send_sync<Messages::WindowServer::SetWindowCustomOverrideCursor>(m_window_id, m_custom_cursor->to_shareable_bitmap(WindowServerConnection::the().server_pid()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::event(Core::Event& event)
|
void Window::event(Core::Event& event)
|
||||||
|
|
|
@ -163,6 +163,7 @@ public:
|
||||||
void set_base_size(const Gfx::Size&);
|
void set_base_size(const Gfx::Size&);
|
||||||
|
|
||||||
void set_override_cursor(StandardCursor);
|
void set_override_cursor(StandardCursor);
|
||||||
|
void set_override_cursor(const Gfx::Bitmap&);
|
||||||
|
|
||||||
void set_icon(const Gfx::Bitmap*);
|
void set_icon(const Gfx::Bitmap*);
|
||||||
void apply_icon();
|
void apply_icon();
|
||||||
|
@ -204,6 +205,7 @@ private:
|
||||||
RefPtr<Gfx::Bitmap> m_front_bitmap;
|
RefPtr<Gfx::Bitmap> m_front_bitmap;
|
||||||
RefPtr<Gfx::Bitmap> m_back_bitmap;
|
RefPtr<Gfx::Bitmap> m_back_bitmap;
|
||||||
RefPtr<Gfx::Bitmap> m_icon;
|
RefPtr<Gfx::Bitmap> m_icon;
|
||||||
|
RefPtr<Gfx::Bitmap> m_custom_cursor;
|
||||||
int m_window_id { 0 };
|
int m_window_id { 0 };
|
||||||
float m_opacity_when_windowless { 1.0f };
|
float m_opacity_when_windowless { 1.0f };
|
||||||
RefPtr<Widget> m_main_widget;
|
RefPtr<Widget> m_main_widget;
|
||||||
|
|
|
@ -578,6 +578,25 @@ OwnPtr<Messages::WindowServer::SetWindowOverrideCursorResponse> ClientConnection
|
||||||
return make<Messages::WindowServer::SetWindowOverrideCursorResponse>();
|
return make<Messages::WindowServer::SetWindowOverrideCursorResponse>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OwnPtr<Messages::WindowServer::SetWindowCustomOverrideCursorResponse> ClientConnection::handle(const Messages::WindowServer::SetWindowCustomOverrideCursor& message)
|
||||||
|
{
|
||||||
|
auto it = m_windows.find(message.window_id());
|
||||||
|
if (it == m_windows.end()) {
|
||||||
|
did_misbehave("SetWindowCustomOverrideCursor: Bad window ID");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& window = *(*it).value;
|
||||||
|
if (!message.cursor().is_valid()) {
|
||||||
|
did_misbehave("SetWindowCustomOverrideCursor: Bad cursor");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.set_override_cursor(Cursor::create(*message.cursor().bitmap()));
|
||||||
|
Compositor::the().invalidate_cursor();
|
||||||
|
return make<Messages::WindowServer::SetWindowCustomOverrideCursorResponse>();
|
||||||
|
}
|
||||||
|
|
||||||
OwnPtr<Messages::WindowServer::SetWindowHasAlphaChannelResponse> ClientConnection::handle(const Messages::WindowServer::SetWindowHasAlphaChannel& message)
|
OwnPtr<Messages::WindowServer::SetWindowHasAlphaChannelResponse> ClientConnection::handle(const Messages::WindowServer::SetWindowHasAlphaChannel& message)
|
||||||
{
|
{
|
||||||
auto it = m_windows.find(message.window_id());
|
auto it = m_windows.find(message.window_id());
|
||||||
|
|
|
@ -114,6 +114,7 @@ private:
|
||||||
virtual OwnPtr<Messages::WindowServer::GetWallpaperResponse> handle(const Messages::WindowServer::GetWallpaper&) override;
|
virtual OwnPtr<Messages::WindowServer::GetWallpaperResponse> handle(const Messages::WindowServer::GetWallpaper&) override;
|
||||||
virtual OwnPtr<Messages::WindowServer::SetResolutionResponse> handle(const Messages::WindowServer::SetResolution&) override;
|
virtual OwnPtr<Messages::WindowServer::SetResolutionResponse> handle(const Messages::WindowServer::SetResolution&) override;
|
||||||
virtual OwnPtr<Messages::WindowServer::SetWindowOverrideCursorResponse> handle(const Messages::WindowServer::SetWindowOverrideCursor&) override;
|
virtual OwnPtr<Messages::WindowServer::SetWindowOverrideCursorResponse> handle(const Messages::WindowServer::SetWindowOverrideCursor&) override;
|
||||||
|
virtual OwnPtr<Messages::WindowServer::SetWindowCustomOverrideCursorResponse> handle(const Messages::WindowServer::SetWindowCustomOverrideCursor&) override;
|
||||||
virtual OwnPtr<Messages::WindowServer::PopupMenuResponse> handle(const Messages::WindowServer::PopupMenu&) override;
|
virtual OwnPtr<Messages::WindowServer::PopupMenuResponse> handle(const Messages::WindowServer::PopupMenu&) override;
|
||||||
virtual OwnPtr<Messages::WindowServer::DismissMenuResponse> handle(const Messages::WindowServer::DismissMenu&) override;
|
virtual OwnPtr<Messages::WindowServer::DismissMenuResponse> handle(const Messages::WindowServer::DismissMenu&) override;
|
||||||
virtual OwnPtr<Messages::WindowServer::SetWindowIconBitmapResponse> handle(const Messages::WindowServer::SetWindowIconBitmap&) override;
|
virtual OwnPtr<Messages::WindowServer::SetWindowIconBitmapResponse> handle(const Messages::WindowServer::SetWindowIconBitmap&) override;
|
||||||
|
|
|
@ -82,6 +82,7 @@ endpoint WindowServer = 2
|
||||||
|
|
||||||
GetWallpaper() => (String path)
|
GetWallpaper() => (String path)
|
||||||
SetWindowOverrideCursor(i32 window_id, i32 cursor_type) => ()
|
SetWindowOverrideCursor(i32 window_id, i32 cursor_type) => ()
|
||||||
|
SetWindowCustomOverrideCursor(i32 window_id, Gfx::ShareableBitmap cursor) => ()
|
||||||
|
|
||||||
StartDrag(String text, String data_type, String data, i32 bitmap_id, Gfx::Size bitmap_size) => (bool started)
|
StartDrag(String text, String data_type, String data, i32 bitmap_id, Gfx::Size bitmap_size) => (bool started)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue