mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 21:07:34 +00:00
WindowServer+LibGUI: Handle mouse wheel deltas in the mouse event stream.
The wheel events will end up in GWidget::mousewheel_event(GMouseEvent&) on the client-side. This patch also implements basic wheel scrolling in GScrollableWidget via this mechanism. :^)
This commit is contained in:
parent
dae8eb6454
commit
dab9901235
13 changed files with 58 additions and 25 deletions
|
@ -74,6 +74,7 @@ struct WSAPI_ServerMessage {
|
|||
MouseMove,
|
||||
MouseDown,
|
||||
MouseUp,
|
||||
MouseWheel,
|
||||
WindowEntered,
|
||||
WindowLeft,
|
||||
KeyDown,
|
||||
|
@ -155,6 +156,7 @@ struct WSAPI_ServerMessage {
|
|||
WSAPI_MouseButton button;
|
||||
unsigned buttons;
|
||||
byte modifiers;
|
||||
int wheel_delta;
|
||||
} mouse;
|
||||
struct {
|
||||
char character;
|
||||
|
|
|
@ -18,6 +18,7 @@ public:
|
|||
MouseMove,
|
||||
MouseDown,
|
||||
MouseUp,
|
||||
MouseWheel,
|
||||
WindowEntered,
|
||||
WindowLeft,
|
||||
KeyDown,
|
||||
|
@ -74,7 +75,7 @@ public:
|
|||
virtual ~WSEvent() { }
|
||||
|
||||
bool is_client_request() const { return type() > __Begin_API_Client_Requests && type() < __End_API_Client_Requests; }
|
||||
bool is_mouse_event() const { return type() == MouseMove || type() == MouseDown || type() == MouseUp; }
|
||||
bool is_mouse_event() const { return type() == MouseMove || type() == MouseDown || type() == MouseUp || type() == MouseWheel; }
|
||||
bool is_key_event() const { return type() == KeyUp || type() == KeyDown; }
|
||||
};
|
||||
|
||||
|
@ -718,12 +719,13 @@ private:
|
|||
|
||||
class WSMouseEvent final : public WSEvent {
|
||||
public:
|
||||
WSMouseEvent(Type type, const Point& position, unsigned buttons, MouseButton button, unsigned modifiers)
|
||||
WSMouseEvent(Type type, const Point& position, unsigned buttons, MouseButton button, unsigned modifiers, int wheel_delta = 0)
|
||||
: WSEvent(type)
|
||||
, m_position(position)
|
||||
, m_buttons(buttons)
|
||||
, m_button(button)
|
||||
, m_modifiers(modifiers)
|
||||
, m_wheel_delta(wheel_delta)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -733,14 +735,16 @@ public:
|
|||
MouseButton button() const { return m_button; }
|
||||
unsigned buttons() const { return m_buttons; }
|
||||
unsigned modifiers() const { return m_modifiers; }
|
||||
int wheel_delta() const { return m_wheel_delta; }
|
||||
|
||||
WSMouseEvent translated(const Point& delta) const { return WSMouseEvent((Type)type(), m_position.translated(delta), m_buttons, m_button, m_modifiers); }
|
||||
WSMouseEvent translated(const Point& delta) const { return WSMouseEvent((Type)type(), m_position.translated(delta), m_buttons, m_button, m_modifiers, m_wheel_delta); }
|
||||
|
||||
private:
|
||||
Point m_position;
|
||||
unsigned m_buttons { 0 };
|
||||
MouseButton m_button { MouseButton::None };
|
||||
unsigned m_modifiers { 0 };
|
||||
int m_wheel_delta { 0 };
|
||||
};
|
||||
|
||||
class WSResizeEvent final : public WSEvent {
|
||||
|
|
|
@ -62,6 +62,7 @@ void WSEventLoop::drain_mouse()
|
|||
unsigned prev_buttons = screen.mouse_button_state();
|
||||
int dx = 0;
|
||||
int dy = 0;
|
||||
int dz = 0;
|
||||
unsigned buttons = prev_buttons;
|
||||
for (;;) {
|
||||
MousePacket packet;
|
||||
|
@ -73,15 +74,17 @@ void WSEventLoop::drain_mouse()
|
|||
|
||||
dx += packet.dx;
|
||||
dy += -packet.dy;
|
||||
dz += packet.dz;
|
||||
if (buttons != prev_buttons) {
|
||||
screen.on_receive_mouse_data(dx, dy, buttons);
|
||||
screen.on_receive_mouse_data(dx, dy, dz, buttons);
|
||||
dx = 0;
|
||||
dy = 0;
|
||||
dz = 0;
|
||||
prev_buttons = buttons;
|
||||
}
|
||||
}
|
||||
if (dx || dy)
|
||||
screen.on_receive_mouse_data(dx, dy, buttons);
|
||||
if (dx || dy || dz)
|
||||
screen.on_receive_mouse_data(dx, dy, dz, buttons);
|
||||
}
|
||||
|
||||
void WSEventLoop::drain_keyboard()
|
||||
|
|
|
@ -58,7 +58,7 @@ void WSScreen::set_resolution(int width, int height)
|
|||
m_cursor_location.constrain(rect());
|
||||
}
|
||||
|
||||
void WSScreen::on_receive_mouse_data(int dx, int dy, unsigned buttons)
|
||||
void WSScreen::on_receive_mouse_data(int dx, int dy, int dz, unsigned buttons)
|
||||
{
|
||||
auto prev_location = m_cursor_location;
|
||||
m_cursor_location.move_by(dx, dy);
|
||||
|
@ -80,6 +80,11 @@ void WSScreen::on_receive_mouse_data(int dx, int dy, unsigned buttons)
|
|||
WSEventLoop::the().post_event(WSWindowManager::the(), move(message));
|
||||
}
|
||||
|
||||
if (dz) {
|
||||
auto message = make<WSMouseEvent>(WSEvent::MouseWheel, m_cursor_location, buttons, MouseButton::None, m_modifiers, dz);
|
||||
WSEventLoop::the().post_event(WSWindowManager::the(), move(message));
|
||||
}
|
||||
|
||||
if (m_cursor_location != prev_location)
|
||||
WSWindowManager::the().invalidate_cursor();
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ public:
|
|||
Point cursor_location() const { return m_cursor_location; }
|
||||
unsigned mouse_button_state() const { return m_mouse_button_state; }
|
||||
|
||||
void on_receive_mouse_data(int dx, int dy, unsigned buttons);
|
||||
void on_receive_mouse_data(int dx, int dy, int dz, unsigned buttons);
|
||||
void on_receive_keyboard_data(KeyEvent);
|
||||
|
||||
private:
|
||||
|
|
|
@ -95,6 +95,7 @@ void WSWindow::handle_mouse_event(const WSMouseEvent& event)
|
|||
case WSEvent::MouseMove: server_message.type = WSAPI_ServerMessage::Type::MouseMove; break;
|
||||
case WSEvent::MouseDown: server_message.type = WSAPI_ServerMessage::Type::MouseDown; break;
|
||||
case WSEvent::MouseUp: server_message.type = WSAPI_ServerMessage::Type::MouseUp; break;
|
||||
case WSEvent::MouseWheel: server_message.type = WSAPI_ServerMessage::Type::MouseWheel; break;
|
||||
default: ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
|
@ -102,6 +103,7 @@ void WSWindow::handle_mouse_event(const WSMouseEvent& event)
|
|||
server_message.mouse.button = to_api(event.button());
|
||||
server_message.mouse.buttons = event.buttons();
|
||||
server_message.mouse.modifiers = event.modifiers();
|
||||
server_message.mouse.wheel_delta = event.wheel_delta();
|
||||
|
||||
m_client->post_message(server_message);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue