mirror of
https://github.com/aseprite/aseprite.git
synced 2025-03-25 01:43:36 +00:00
x11/skia: Add support for mouse wheel
This commit is contained in:
parent
272f24ed3a
commit
d08674704d
@ -28,7 +28,7 @@ Atom wmDeleteMessage = 0;
|
|||||||
// into our own user data pointer (X11Window instance) is using a map.
|
// into our own user data pointer (X11Window instance) is using a map.
|
||||||
std::map<::Window, X11Window*> g_activeWindows;
|
std::map<::Window, X11Window*> g_activeWindows;
|
||||||
|
|
||||||
KeyModifiers get_modifiers_from_xevent(int state)
|
KeyModifiers get_modifiers_from_x(int state)
|
||||||
{
|
{
|
||||||
int modifiers = kKeyNoneModifier;
|
int modifiers = kKeyNoneModifier;
|
||||||
if (state & ShiftMask) modifiers |= kKeyShiftModifier;
|
if (state & ShiftMask) modifiers |= kKeyShiftModifier;
|
||||||
@ -37,6 +37,24 @@ KeyModifiers get_modifiers_from_xevent(int state)
|
|||||||
return (KeyModifiers)modifiers;
|
return (KeyModifiers)modifiers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_mouse_wheel_button(int button)
|
||||||
|
{
|
||||||
|
return (button == Button4 || button == Button5);
|
||||||
|
}
|
||||||
|
|
||||||
|
Event::MouseButton get_mouse_button_from_x(int button)
|
||||||
|
{
|
||||||
|
switch (button) {
|
||||||
|
case Button1: TRACE("LeftButton\n"); return Event::LeftButton;
|
||||||
|
case Button2: TRACE("MiddleButton\n"); return Event::MiddleButton;
|
||||||
|
case Button3: TRACE("RightButton\n"); return Event::RightButton;
|
||||||
|
case 8: TRACE("X1Button\n"); return Event::X1Button;
|
||||||
|
case 9: TRACE("X2Button\n"); return Event::X2Button;
|
||||||
|
}
|
||||||
|
TRACE("Unknown Button %d\n", button);
|
||||||
|
return Event::NoneButton;
|
||||||
|
}
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
||||||
// static
|
// static
|
||||||
@ -189,35 +207,22 @@ void X11Window::processX11Event(XEvent& event)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case ButtonPress: {
|
case ButtonPress:
|
||||||
Event ev;
|
|
||||||
ev.setType(Event::MouseDown);
|
|
||||||
ev.setModifiers(get_modifiers_from_xevent(event.xbutton.state));
|
|
||||||
ev.setPosition(gfx::Point(event.xbutton.x / m_scale,
|
|
||||||
event.xbutton.y / m_scale));
|
|
||||||
ev.setButton(
|
|
||||||
event.xbutton.button == 1 ? Event::LeftButton:
|
|
||||||
event.xbutton.button == 2 ? Event::MiddleButton:
|
|
||||||
event.xbutton.button == 3 ? Event::RightButton:
|
|
||||||
event.xbutton.button == 4 ? Event::X1Button:
|
|
||||||
event.xbutton.button == 5 ? Event::X2Button: Event::NoneButton);
|
|
||||||
|
|
||||||
queueEvent(ev);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ButtonRelease: {
|
case ButtonRelease: {
|
||||||
Event ev;
|
Event ev;
|
||||||
ev.setType(Event::MouseUp);
|
|
||||||
ev.setModifiers(get_modifiers_from_xevent(event.xbutton.state));
|
if (is_mouse_wheel_button(event.xbutton.button)) {
|
||||||
|
ev.setType(Event::MouseWheel);
|
||||||
|
ev.setWheelDelta(gfx::Point(0, event.xbutton.button == Button4 ? -1: 1));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ev.setType(event.type == ButtonPress? Event::MouseDown:
|
||||||
|
Event::MouseUp);
|
||||||
|
ev.setButton(get_mouse_button_from_x(event.xbutton.button));
|
||||||
|
}
|
||||||
|
ev.setModifiers(get_modifiers_from_x(event.xbutton.state));
|
||||||
ev.setPosition(gfx::Point(event.xbutton.x / m_scale,
|
ev.setPosition(gfx::Point(event.xbutton.x / m_scale,
|
||||||
event.xbutton.y / m_scale));
|
event.xbutton.y / m_scale));
|
||||||
ev.setButton(
|
|
||||||
event.xbutton.button == 1 ? Event::LeftButton:
|
|
||||||
event.xbutton.button == 2 ? Event::MiddleButton:
|
|
||||||
event.xbutton.button == 3 ? Event::RightButton:
|
|
||||||
event.xbutton.button == 4 ? Event::X1Button:
|
|
||||||
event.xbutton.button == 5 ? Event::X2Button: Event::NoneButton);
|
|
||||||
|
|
||||||
queueEvent(ev);
|
queueEvent(ev);
|
||||||
break;
|
break;
|
||||||
@ -226,7 +231,7 @@ void X11Window::processX11Event(XEvent& event)
|
|||||||
case MotionNotify: {
|
case MotionNotify: {
|
||||||
Event ev;
|
Event ev;
|
||||||
ev.setType(Event::MouseMove);
|
ev.setType(Event::MouseMove);
|
||||||
ev.setModifiers(get_modifiers_from_xevent(event.xmotion.state));
|
ev.setModifiers(get_modifiers_from_x(event.xmotion.state));
|
||||||
ev.setPosition(gfx::Point(event.xmotion.x / m_scale,
|
ev.setPosition(gfx::Point(event.xmotion.x / m_scale,
|
||||||
event.xmotion.y / m_scale));
|
event.xmotion.y / m_scale));
|
||||||
queueEvent(ev);
|
queueEvent(ev);
|
||||||
@ -234,16 +239,21 @@ void X11Window::processX11Event(XEvent& event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case EnterNotify:
|
case EnterNotify:
|
||||||
case LeaveNotify: {
|
case LeaveNotify:
|
||||||
Event ev;
|
// "mode" can be NotifyGrab or NotifyUngrab when middle mouse
|
||||||
ev.setType(event.type == EnterNotify ? Event::MouseEnter:
|
// button is pressed/released. We must not generated
|
||||||
Event::MouseLeave);
|
// MouseEnter/Leave events on those cases, only on NotifyNormal
|
||||||
ev.setModifiers(get_modifiers_from_xevent(event.xcrossing.state));
|
// (when mouse leaves/enter the X11 window).
|
||||||
ev.setPosition(gfx::Point(event.xcrossing.x / m_scale,
|
if (event.xcrossing.mode == NotifyNormal) {
|
||||||
event.xcrossing.y / m_scale));
|
Event ev;
|
||||||
queueEvent(ev);
|
ev.setType(event.type == EnterNotify ? Event::MouseEnter:
|
||||||
|
Event::MouseLeave);
|
||||||
|
ev.setModifiers(get_modifiers_from_x(event.xcrossing.state));
|
||||||
|
ev.setPosition(gfx::Point(event.xcrossing.x / m_scale,
|
||||||
|
event.xcrossing.y / m_scale));
|
||||||
|
queueEvent(ev);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case ClientMessage:
|
case ClientMessage:
|
||||||
// When the close button is pressed
|
// When the close button is pressed
|
||||||
|
Loading…
x
Reference in New Issue
Block a user