X11: Fix convertMouseFlags() should fix #474

This commit is contained in:
and3md 2017-10-07 20:32:27 +02:00
parent fd6940c184
commit 4c6cc85481
1 changed files with 37 additions and 10 deletions

View File

@ -758,14 +758,39 @@ class X11Window : DWindow {
protected ButtonDetails _mbutton;
protected ButtonDetails _rbutton;
ushort convertMouseFlags(uint flags) {
// x11 gives flags from time prior event so if left button is pressed there is not Button1Mask
ushort convertMouseFlags(uint flags, MouseButton btn, bool pressed) {
ushort res = 0;
if (flags & Button1Mask)
res |= MouseFlag.LButton;
if (flags & Button2Mask)
res |= MouseFlag.RButton;
if (flags & Button3Mask)
res |= MouseFlag.MButton;
if (btn == MouseButton.Left) {
if (pressed)
res |= MouseFlag.LButton;
else
res &= ~MouseFlag.LButton;
}
else
if (flags & Button1Mask)
res |= MouseFlag.LButton;
if (btn == MouseButton.Middle) {
if (pressed)
res |= MouseFlag.MButton;
else
res &= ~MouseFlag.MButton;
}
else
if (flags & Button2Mask)
res |= MouseFlag.MButton;
if (btn == MouseButton.Right) {
if (pressed)
res |= MouseFlag.RButton;
else
res &= ~MouseFlag.RButton;
}
else
if (flags & Button3Mask)
res |= MouseFlag.RButton;
return res;
}
@ -803,7 +828,9 @@ class X11Window : DWindow {
if (wheelDelta)
event = new MouseEvent(action, MouseButton.None, lastFlags, lastx, lasty, wheelDelta);
} else {
lastFlags = convertMouseFlags(state);
MouseButton btn = convertMouseButton(button);
lastFlags = convertMouseFlags(state, btn, action == MouseAction.ButtonDown);
if (_keyFlags & KeyFlag.Shift)
lastFlags |= MouseFlag.Shift;
if (_keyFlags & KeyFlag.Control)
@ -812,7 +839,6 @@ class X11Window : DWindow {
lastFlags |= MouseFlag.Alt;
lastx = cast(short)x;
lasty = cast(short)y;
MouseButton btn = convertMouseButton(button);
event = new MouseEvent(action, btn, lastFlags, lastx, lasty);
}
if (event) {
@ -833,6 +859,7 @@ class X11Window : DWindow {
event.lbutton = _lbutton;
event.rbutton = _rbutton;
event.mbutton = _mbutton;
bool res = dispatchMouseEvent(event);
if (res) {
debug(mouse) Log.d("Calling update() after mouse event");
@ -1655,7 +1682,7 @@ class X11Platform : Platform {
XFlush(x11display);
int eventsInQueue = numberOfPendingEvents();
if (!eventsInQueue) {
debug(x11) Log.d("X11: Sleeping");
//debug(x11) Log.d("X11: Sleeping");
Thread.sleep(dur!("msecs")(10));
}
foreach(eventIndex; 0..eventsInQueue)