mouse wheel support under SDL; fix SDL build on windows

This commit is contained in:
Vadim Lopatin 2014-12-10 17:20:26 +03:00
parent a2fd7868fc
commit 866693d9c5
1 changed files with 29 additions and 9 deletions

View File

@ -387,15 +387,30 @@ class SDLWindow : Window {
return MouseButton.None; return MouseButton.None;
} }
ushort lastFlags;
short lastx;
short lasty;
void processMouseEvent(MouseAction action, uint button, uint state, int x, int y) { void processMouseEvent(MouseAction action, uint button, uint state, int x, int y) {
ushort flags = convertMouseFlags(state); MouseEvent event = null;
MouseButton btn = convertMouseButton(button); if (action == MouseAction.Wheel) {
MouseEvent event = new MouseEvent(action, btn, flags, cast(short)x, cast(short)y); // handle wheel
bool res = dispatchMouseEvent(event); short wheelDelta = cast(short)y;
if (res) { if (wheelDelta)
debug(mouse) Log.d("Calling update() after mouse event"); event = new MouseEvent(action, MouseButton.None, lastFlags, lastx, lasty, wheelDelta);
invalidate(); } else {
} lastFlags = convertMouseFlags(state);
lastx = cast(short)x;
lasty = cast(short)y;
MouseButton btn = convertMouseButton(button);
event = new MouseEvent(action, btn, lastFlags, lastx, lasty);
}
if (event) {
bool res = dispatchMouseEvent(event);
if (res) {
debug(mouse) Log.d("Calling update() after mouse event");
invalidate();
}
}
} }
uint convertKeyCode(uint keyCode) { uint convertKeyCode(uint keyCode) {
@ -877,6 +892,11 @@ class SDLPlatform : Platform {
} }
break; break;
case SDL_MOUSEWHEEL: case SDL_MOUSEWHEEL:
SDLWindow w = getWindow(event.wheel.windowID);
if (w) {
Log.d("SDL_MOUSEWHEEL x=", event.wheel.x, " y=", event.wheel.y);
w.processMouseEvent(MouseAction.Wheel, 0, 0, event.wheel.x, event.wheel.y);
}
break; break;
default: default:
// not supported event // not supported event
@ -948,7 +968,7 @@ version (Windows) {
} }
catch (Throwable e) // catch any uncaught exceptions catch (Throwable e) // catch any uncaught exceptions
{ {
MessageBox(null, toUTF16z(e.toString ~ "\nStack trace:\n" ~ defaultTraceHandler.toString), "Error", MessageBoxW(null, toUTF16z(e.toString ~ "\nStack trace:\n" ~ defaultTraceHandler.toString), "Error",
MB_OK | MB_ICONEXCLAMATION); MB_OK | MB_ICONEXCLAMATION);
result = 0; // failed result = 0; // failed
} }