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