source/Platform/Unix/X11Mouse.cpp: implement hack for XButton1 and 2.
This commit is contained in:
parent
c082700891
commit
f6aa0246d3
1 changed files with 22 additions and 5 deletions
|
|
@ -5,8 +5,17 @@
|
||||||
#include "X11Display.h"
|
#include "X11Display.h"
|
||||||
#include "X11Mouse.h"
|
#include "X11Mouse.h"
|
||||||
|
|
||||||
|
#define XBUTTON1BIT (1<<0)
|
||||||
|
#define XBUTTON2BIT (1<<1)
|
||||||
|
|
||||||
namespace sp {
|
namespace sp {
|
||||||
|
|
||||||
|
namespace _priv {
|
||||||
|
|
||||||
|
// Variable to handle extra button state (not queryable in xlib)
|
||||||
|
unsigned int xstate = 0;
|
||||||
|
}
|
||||||
|
|
||||||
X11Mouse::X11Mouse() :
|
X11Mouse::X11Mouse() :
|
||||||
m_btn_state(0)
|
m_btn_state(0)
|
||||||
{
|
{
|
||||||
|
|
@ -35,8 +44,6 @@ bool X11Mouse::isButtonDown(Mouse::Button button) const
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Button1 and 2 is defined in x11 and
|
|
||||||
// therefore clashes with Mouse::Button::Button1 and 2.
|
|
||||||
switch(button) {
|
switch(button) {
|
||||||
case Mouse::Button::Left :
|
case Mouse::Button::Left :
|
||||||
return m_btn_state & Button1Mask;
|
return m_btn_state & Button1Mask;
|
||||||
|
|
@ -44,6 +51,10 @@ bool X11Mouse::isButtonDown(Mouse::Button button) const
|
||||||
return m_btn_state & Button3Mask;
|
return m_btn_state & Button3Mask;
|
||||||
case Mouse::Button::Middle :
|
case Mouse::Button::Middle :
|
||||||
return m_btn_state & Button2Mask;
|
return m_btn_state & Button2Mask;
|
||||||
|
case Mouse::Button::XButton1 :
|
||||||
|
return _priv::xstate & XBUTTON1BIT;
|
||||||
|
case Mouse::Button::XButton2 :
|
||||||
|
return _priv::xstate & XBUTTON2BIT;
|
||||||
default :
|
default :
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -82,6 +93,11 @@ void X11Mouse::updateFocusedWindow()
|
||||||
m_win = focus ? (::Window) focus->getHandle() : 0;
|
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)
|
bool X11Mouse::handleMessage(XEvent* xevent, Event& event)
|
||||||
{
|
{
|
||||||
if (xevent->type == MotionNotify) {
|
if (xevent->type == MotionNotify) {
|
||||||
|
|
@ -99,9 +115,10 @@ bool X11Mouse::handleMessage(XEvent* xevent, Event& event)
|
||||||
case Button1 : trans = Mouse::Button::Left; break;
|
case Button1 : trans = Mouse::Button::Left; break;
|
||||||
case Button2 : trans = Mouse::Button::Middle; break;
|
case Button2 : trans = Mouse::Button::Middle; break;
|
||||||
case Button3 : trans = Mouse::Button::Right; break;
|
case Button3 : trans = Mouse::Button::Right; break;
|
||||||
// TODO: name clash, need to rename Mouse::Button enums.
|
// Xlib do not support querying of button 8 and 9.
|
||||||
// case Button4 : trans = Mouse::Button::Button1; break; // clashes with X11's "Button1" define.
|
// so we have to fake it.
|
||||||
// case Button5 : trans = Mouse::Button::Button2; break; // clashes with X11's "Button2" define.
|
case 8 : trans = Mouse::Button::XButton1; SETXSTATE(XBUTTON1BIT); break;
|
||||||
|
case 9 : trans = Mouse::Button::XButton2; SETXSTATE(XBUTTON2BIT); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trans != Mouse::Button::Unknown) {
|
if (trans != Mouse::Button::Unknown) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue