mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 01:07:35 +00:00
WindowServer+LibGUI: Implement automatic cursor tracking.
When a mouse button is pressed inside a window, put that window into an automatic mouse tracking state where all mouse events are sent to that window until all mouse buttons are released. This might feel even better if it only cared about the mouse buttons you actually pressed while *inside* the windows to get released, I don't know. I'll have to use it for a while and see how it's like.
This commit is contained in:
parent
e84823360d
commit
b4da451c9a
11 changed files with 66 additions and 56 deletions
|
@ -69,6 +69,28 @@ static WSAPI_MouseButton to_api(MouseButton button)
|
|||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
void WSWindow::handle_mouse_event(const WSMouseEvent& event)
|
||||
{
|
||||
set_automatic_cursor_tracking_enabled(event.buttons() != 0);
|
||||
|
||||
WSAPI_ServerMessage server_message;
|
||||
server_message.window_id = window_id();
|
||||
|
||||
switch (event.type()) {
|
||||
case WSMessage::MouseMove: server_message.type = WSAPI_ServerMessage::Type::MouseMove; break;
|
||||
case WSMessage::MouseDown: server_message.type = WSAPI_ServerMessage::Type::MouseDown; break;
|
||||
case WSMessage::MouseUp: server_message.type = WSAPI_ServerMessage::Type::MouseUp; break;
|
||||
default: ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
server_message.mouse.position = event.position();
|
||||
server_message.mouse.button = to_api(event.button());
|
||||
server_message.mouse.buttons = event.buttons();
|
||||
server_message.mouse.modifiers = event.modifiers();
|
||||
|
||||
m_client->post_message(server_message);
|
||||
}
|
||||
|
||||
void WSWindow::on_message(WSMessage& message)
|
||||
{
|
||||
if (m_internal_owner)
|
||||
|
@ -80,28 +102,10 @@ void WSWindow::on_message(WSMessage& message)
|
|||
WSAPI_ServerMessage server_message;
|
||||
server_message.window_id = window_id();
|
||||
|
||||
if (message.is_mouse_event())
|
||||
return handle_mouse_event(static_cast<const WSMouseEvent&>(message));
|
||||
|
||||
switch (message.type()) {
|
||||
case WSMessage::MouseMove:
|
||||
server_message.type = WSAPI_ServerMessage::Type::MouseMove;
|
||||
server_message.mouse.position = static_cast<WSMouseEvent&>(message).position();
|
||||
server_message.mouse.button = WSAPI_MouseButton::NoButton;
|
||||
server_message.mouse.buttons = static_cast<WSMouseEvent&>(message).buttons();
|
||||
server_message.mouse.modifiers = static_cast<WSMouseEvent&>(message).modifiers();
|
||||
break;
|
||||
case WSMessage::MouseDown:
|
||||
server_message.type = WSAPI_ServerMessage::Type::MouseDown;
|
||||
server_message.mouse.position = static_cast<WSMouseEvent&>(message).position();
|
||||
server_message.mouse.button = to_api(static_cast<WSMouseEvent&>(message).button());
|
||||
server_message.mouse.buttons = static_cast<WSMouseEvent&>(message).buttons();
|
||||
server_message.mouse.modifiers = static_cast<WSMouseEvent&>(message).modifiers();
|
||||
break;
|
||||
case WSMessage::MouseUp:
|
||||
server_message.type = WSAPI_ServerMessage::Type::MouseUp;
|
||||
server_message.mouse.position = static_cast<WSMouseEvent&>(message).position();
|
||||
server_message.mouse.button = to_api(static_cast<WSMouseEvent&>(message).button());
|
||||
server_message.mouse.buttons = static_cast<WSMouseEvent&>(message).buttons();
|
||||
server_message.mouse.modifiers = static_cast<WSMouseEvent&>(message).modifiers();
|
||||
break;
|
||||
case WSMessage::WindowEntered:
|
||||
server_message.type = WSAPI_ServerMessage::Type::WindowEntered;
|
||||
break;
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
class WSClientConnection;
|
||||
class WSMenu;
|
||||
class WSMouseEvent;
|
||||
|
||||
class WSWindow final : public WSMessageReceiver, public InlineLinkedListNode<WSWindow> {
|
||||
public:
|
||||
|
@ -78,7 +79,8 @@ public:
|
|||
GraphicsBitmap* last_backing_store() { return m_last_backing_store.ptr(); }
|
||||
|
||||
void set_global_cursor_tracking_enabled(bool);
|
||||
bool global_cursor_tracking() const { return m_global_cursor_tracking_enabled; }
|
||||
void set_automatic_cursor_tracking_enabled(bool enabled) { m_automatic_cursor_tracking_enabled = enabled; }
|
||||
bool global_cursor_tracking() const { return m_global_cursor_tracking_enabled || m_automatic_cursor_tracking_enabled; }
|
||||
|
||||
bool has_alpha_channel() const { return m_has_alpha_channel; }
|
||||
void set_has_alpha_channel(bool value) { m_has_alpha_channel = value; }
|
||||
|
@ -104,12 +106,15 @@ public:
|
|||
WSWindow* m_prev { nullptr };
|
||||
|
||||
private:
|
||||
void handle_mouse_event(const WSMouseEvent&);
|
||||
|
||||
WSClientConnection* m_client { nullptr };
|
||||
WSMessageReceiver* m_internal_owner { nullptr };
|
||||
String m_title;
|
||||
Rect m_rect;
|
||||
WSWindowType m_type { WSWindowType::Normal };
|
||||
bool m_global_cursor_tracking_enabled { false };
|
||||
bool m_automatic_cursor_tracking_enabled { false };
|
||||
bool m_visible { true };
|
||||
bool m_has_alpha_channel { false };
|
||||
bool m_has_painted_since_last_resize { false };
|
||||
|
|
|
@ -660,7 +660,7 @@ void WSWindowManager::start_window_resize(WSWindow& window, WSMouseEvent& event)
|
|||
invalidate(window);
|
||||
}
|
||||
|
||||
bool WSWindowManager::process_ongoing_window_drag(WSMouseEvent& event, WSWindow*& event_window)
|
||||
bool WSWindowManager::process_ongoing_window_drag(WSMouseEvent& event, WSWindow*&)
|
||||
{
|
||||
if (!m_drag_window)
|
||||
return false;
|
||||
|
@ -687,7 +687,7 @@ bool WSWindowManager::process_ongoing_window_drag(WSMouseEvent& event, WSWindow*
|
|||
return false;
|
||||
}
|
||||
|
||||
bool WSWindowManager::process_ongoing_window_resize(WSMouseEvent& event, WSWindow*& event_window)
|
||||
bool WSWindowManager::process_ongoing_window_resize(WSMouseEvent& event, WSWindow*&)
|
||||
{
|
||||
if (!m_resize_window)
|
||||
return false;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue