1
0
Fork 0

source/Platform/Unix/X11Mouse.cpp: implement hack for XButton1 and 2.

This commit is contained in:
Henrik Hautakoski 2020-12-27 18:12:09 +01:00
parent c082700891
commit f6aa0246d3

View file

@ -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) {