diff --git a/source/Platform/Unix/X11Mouse.cpp b/source/Platform/Unix/X11Mouse.cpp index cabbedc..f4bd651 100644 --- a/source/Platform/Unix/X11Mouse.cpp +++ b/source/Platform/Unix/X11Mouse.cpp @@ -5,8 +5,17 @@ #include "X11Display.h" #include "X11Mouse.h" +#define XBUTTON1BIT (1<<0) +#define XBUTTON2BIT (1<<1) + namespace sp { +namespace _priv { + + // Variable to handle extra button state (not queryable in xlib) + unsigned int xstate = 0; +} + X11Mouse::X11Mouse() : m_btn_state(0) { @@ -35,8 +44,6 @@ bool X11Mouse::isButtonDown(Mouse::Button button) const return false; } - // TODO: Button1 and 2 is defined in x11 and - // therefore clashes with Mouse::Button::Button1 and 2. switch(button) { case Mouse::Button::Left : return m_btn_state & Button1Mask; @@ -44,6 +51,10 @@ bool X11Mouse::isButtonDown(Mouse::Button button) const return m_btn_state & Button3Mask; case Mouse::Button::Middle : return m_btn_state & Button2Mask; + case Mouse::Button::XButton1 : + return _priv::xstate & XBUTTON1BIT; + case Mouse::Button::XButton2 : + return _priv::xstate & XBUTTON2BIT; default : return false; } @@ -82,6 +93,11 @@ void X11Mouse::updateFocusedWindow() m_win = focus ? (::Window) focus->getHandle() : 0; } +#define SETXSTATE(bit) \ + _priv::xstate = (xevent->type == ButtonPress) \ + ? _priv::xstate | (bit) \ + : _priv::xstate & ~(bit) + bool X11Mouse::handleMessage(XEvent* xevent, Event& event) { if (xevent->type == MotionNotify) { @@ -99,9 +115,10 @@ bool X11Mouse::handleMessage(XEvent* xevent, Event& event) case Button1 : trans = Mouse::Button::Left; break; case Button2 : trans = Mouse::Button::Middle; break; case Button3 : trans = Mouse::Button::Right; break; - // TODO: name clash, need to rename Mouse::Button enums. - // case Button4 : trans = Mouse::Button::Button1; break; // clashes with X11's "Button1" define. - // case Button5 : trans = Mouse::Button::Button2; break; // clashes with X11's "Button2" define. + // Xlib do not support querying of button 8 and 9. + // so we have to fake it. + case 8 : trans = Mouse::Button::XButton1; SETXSTATE(XBUTTON1BIT); break; + case 9 : trans = Mouse::Button::XButton2; SETXSTATE(XBUTTON2BIT); break; } if (trans != Mouse::Button::Unknown) {