diff --git a/src/dlangui/platforms/android/androidapp.d b/src/dlangui/platforms/android/androidapp.d index 3ff4d86a..3e21cfaf 100644 --- a/src/dlangui/platforms/android/androidapp.d +++ b/src/dlangui/platforms/android/androidapp.d @@ -66,6 +66,93 @@ class AndroidWindow : Window { // TODO } + ushort lastFlags; + short lastx; + short lasty; + protected ButtonDetails _lbutton; + protected ButtonDetails _mbutton; + protected ButtonDetails _rbutton; + void processMouseEvent(MouseAction action, uint button, uint state, int x, int y) { + MouseEvent event = null; + lastFlags = 0; //convertMouseFlags(state); + if (_keyFlags & KeyFlag.Shift) + lastFlags |= MouseFlag.Shift; + if (_keyFlags & KeyFlag.Control) + lastFlags |= MouseFlag.Control; + if (_keyFlags & KeyFlag.Alt) + lastFlags |= MouseFlag.Alt; + lastx = cast(short)x; + lasty = cast(short)y; + MouseButton btn = MouseButton.Left; // convertMouseButton(button); + event = new MouseEvent(action, btn, lastFlags, lastx, lasty); + if (event) { + ButtonDetails * pbuttonDetails = null; + if (button == MouseButton.Left) + pbuttonDetails = &_lbutton; + else if (button == MouseButton.Right) + pbuttonDetails = &_rbutton; + else if (button == MouseButton.Middle) + pbuttonDetails = &_mbutton; + if (pbuttonDetails) { + if (action == MouseAction.ButtonDown) { + pbuttonDetails.down(cast(short)x, cast(short)y, lastFlags); + } else if (action == MouseAction.ButtonUp) { + pbuttonDetails.up(cast(short)x, cast(short)y, lastFlags); + } + } + event.lbutton = _lbutton; + event.rbutton = _rbutton; + event.mbutton = _mbutton; + bool res = dispatchMouseEvent(event); + if (res) { + debug(mouse) Log.d("Calling update() after mouse event"); + invalidate(); + } + } + } + uint _keyFlags; + + /** + * Process the next input event. + */ + int handle_input(AInputEvent* event) { + Log.i("handle input, event=", AInputEvent_getType(event)); + auto et = AInputEvent_getType(event); + if (et == AINPUT_EVENT_TYPE_MOTION) { + auto action = AMotionEvent_getAction(event); + int x = cast(int)AMotionEvent_getX(event, 0); + int y = cast(int)AMotionEvent_getY(event, 0); + switch(action) { + case AMOTION_EVENT_ACTION_DOWN: + processMouseEvent(MouseAction.ButtonDown, 0, 0, x, y); + break; + case AMOTION_EVENT_ACTION_UP: + processMouseEvent(MouseAction.ButtonUp, 0, 0, x, y); + break; + case AMOTION_EVENT_ACTION_MOVE: + processMouseEvent(MouseAction.Move, 0, 0, x, y); + break; + case AMOTION_EVENT_ACTION_CANCEL: + processMouseEvent(MouseAction.Cancel, 0, 0, x, y); + break; + case AMOTION_EVENT_ACTION_OUTSIDE: + //processMouseEvent(MouseAction.Down, 0, 0, x, y); + break; + case AMOTION_EVENT_ACTION_POINTER_DOWN: + processMouseEvent(MouseAction.ButtonDown, 0, 0, x, y); + break; + case AMOTION_EVENT_ACTION_POINTER_UP: + processMouseEvent(MouseAction.ButtonUp, 0, 0, x, y); + break; + default: + break; + } + return 1; + } else if (et == AINPUT_EVENT_TYPE_KEY) { + return 1; + } + return 0; + } } /** @@ -215,13 +302,10 @@ class AndroidPlatform : Platform { */ int handle_input(AInputEvent* event) { Log.i("handle input, event=", AInputEvent_getType(event)); - if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) { - _engine.animating = 1; - _engine.state.x = AMotionEvent_getX(event, 0); - _engine.state.y = AMotionEvent_getY(event, 0); - return 1; - } - return 0; + auto w = activeWindow; + if (!w) + return 0; + return w.handle_input(event); } /** diff --git a/views/res/theme_default.xml b/views/res/theme_default.xml index 927d384a..dd553d4d 100644 --- a/views/res/theme_default.xml +++ b/views/res/theme_default.xml @@ -32,8 +32,8 @@