summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2016-03-12 17:34:13 +0000
committerMatthias Melcher <fltk@matthiasm.com>2016-03-12 17:34:13 +0000
commit3b1434238879cd4cdb0cf1d91563c5e661698f78 (patch)
tree7bd595dd7a6364ce4ca4fa3c1c0bd027e463b571 /src
parent823a6cc2adebca1146fac784d6b9844263bd477b (diff)
Add Android Touch events.
"test/button" works now. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11353 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
-rw-r--r--src/drivers/Pico/Fl_Pico_Graphics_Driver.cxx10
-rw-r--r--src/drivers/PicoAndroid/Fl_PicoAndroid_Screen_Driver.cxx136
2 files changed, 141 insertions, 5 deletions
diff --git a/src/drivers/Pico/Fl_Pico_Graphics_Driver.cxx b/src/drivers/Pico/Fl_Pico_Graphics_Driver.cxx
index 407b29662..914fdafd3 100644
--- a/src/drivers/Pico/Fl_Pico_Graphics_Driver.cxx
+++ b/src/drivers/Pico/Fl_Pico_Graphics_Driver.cxx
@@ -233,15 +233,15 @@ static const char *font_data[128] = {
/* */0, /*!*/"\31\34\100\35\36", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, /*B*/"\43\54\45\15\11\41\52\43\13", 0, 0, /*E*/"\51\11\15\55\100\13\43", 0, 0,
/*H*/"\11\15\100\61\65\100\13\63", 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, /*T*/"\11\71\100\41\45", 0, 0, /*W*/"\01\15\33\55\61",
- 0, 0, 0, 0, 0, 0, 0, 0,
+ /*X*/"\15\51\100\11\55", 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, /*d*/"\64\55\55\25\14\13\22\52\63\100\61\65", /*e*/"\55\25\14\13\22\52\63\64\14", 0, 0,
- 0, 0, 0, 0, /*l*/"\31\34\45", 0, 0, /*o*/"\55\25\14\13\22\52\63\64\55",
- 0, 0, /*r*/"\25\22\100\23\32\52", /*s*/"\62\22\13\64\55\15", /*t*/"\41\44\55\65\100\22\62", 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, /*i*/"\31\32\100\23\33\35\100\25\45", 0, 0, /*l*/"\31\34\45", 0, /*n*/"\15\12\100\13\22\42\53\55", /*o*/"\55\25\14\13\22\52\63\64\55",
+ /*p*/"\17\12\42\53\54\45\15", 0, /*r*/"\25\22\100\23\32\52", /*s*/"\62\22\13\64\55\15", /*t*/"\41\44\55\65\100\22\62", 0, 0, 0,
+ /*x*/"\15\52\100\12\55", 0, 0, 0, 0, 0, 0, 0,
};
diff --git a/src/drivers/PicoAndroid/Fl_PicoAndroid_Screen_Driver.cxx b/src/drivers/PicoAndroid/Fl_PicoAndroid_Screen_Driver.cxx
index 0e75a28b7..48f57e3c0 100644
--- a/src/drivers/PicoAndroid/Fl_PicoAndroid_Screen_Driver.cxx
+++ b/src/drivers/PicoAndroid/Fl_PicoAndroid_Screen_Driver.cxx
@@ -22,6 +22,8 @@
#include "../../config_lib.h"
#include "Fl_PicoAndroid_Screen_Driver.H"
+#include <android/window.h>
+
#include <FL/x.H>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
@@ -36,6 +38,7 @@
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))
+
void Fl_PicoAndroid_Screen_Driver::initDisplay()
{
// initialize OpenGL ES and EGL
@@ -159,6 +162,9 @@ void Fl_PicoAndroid_Screen_Driver::handleAppCmd(struct android_app* app, int32_t
case APP_CMD_INIT_WINDOW:
// The window is being shown, get it ready.
if (pApp->window != NULL) {
+ // the flag below allow for easy development and should be removed when
+ // distributing a final app
+ ANativeActivity_setWindowFlags(pApp->activity, AWINDOW_FLAG_KEEP_SCREEN_ON, 0);
initDisplay();
drawFrame();
}
@@ -202,15 +208,145 @@ int32_t Fl_PicoAndroid_Screen_Driver::handleInputEventCB(struct android_app* app
int32_t Fl_PicoAndroid_Screen_Driver::handleInputEvent(struct android_app* app, AInputEvent* event)
{
if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
+// fl_lock_function();
int x = AMotionEvent_getX(event, 0);
int y = AMotionEvent_getY(event, 0);
+ int action = AKeyEvent_getAction(event);
+ Fl_Window *window = Fl::first_window();
+ switch (action) {
+ case AMOTION_EVENT_ACTION_DOWN:
+ Fl::e_is_click = 1;
+ Fl::e_x = Fl::e_x_root = x/3;
+ Fl::e_y = (y-100)/3;
+ if (!window) break;
+ Fl::e_keysym = FL_Button+FL_LEFT_MOUSE;
+ Fl::e_state = FL_BUTTON1;
+ Fl::handle(FL_PUSH, window);
+ break;
+ case AMOTION_EVENT_ACTION_MOVE:
+ Fl::e_is_click = 1;
+ Fl::e_x = Fl::e_x_root = x/3;
+ Fl::e_y = (y-100)/3;
+ if (!window) break;
+ Fl::e_keysym = FL_Button+FL_LEFT_MOUSE;
+ Fl::e_state = FL_BUTTON1;
+ Fl::handle(FL_DRAG, window);
+ break;
+ case AMOTION_EVENT_ACTION_UP:
+ case AMOTION_EVENT_ACTION_CANCEL:
+ Fl::e_is_click = 1;
+ Fl::e_x = Fl::e_x_root = x/3;
+ Fl::e_y = (y-100)/3;
+ if (!window) break;
+ Fl::e_keysym = FL_Button+FL_LEFT_MOUSE;
+ Fl::e_state = 0;
+ Fl::handle(FL_RELEASE, window);
+ break;
+// case AMOTION_EVENT_ACTION_HOVER_MOVE:
+// Fl::e_is_click = 1;
+// Fl::e_x = Fl::e_x_root = x/3;
+// Fl::e_y = (y-100)/3;
+// if (!window) break;
+// Fl::e_keysym = 0;
+// Fl::e_state = 0;
+// Fl::handle(FL_MOVE, window);
+// break;
+ }
+// AMOTION_EVENT_ACTION_MASK
LOGI("Motion at %d, %d", x, y);
+// fl_unlock_function();
Fl_X::first->w->redraw();
return 1;
}
return 0;
}
+#if 0
+static int keysym[] = { 0, FL_Button+1, FL_Button+3, FL_Button+2 };
+static int px, py;
+static char suppressed = 0;
+
+fl_lock_function();
+
+Fl_Window *window = (Fl_Window*)[(FLWindow*)[theEvent window] getFl_Window];
+if ( !window->shown() ) {
+ fl_unlock_function();
+ return;
+}
+Fl_Window *first = Fl::first_window();
+if (first != window && !(first->modal() || first->non_modal())) Fl::first_window(window);
+NSPoint pos = [theEvent locationInWindow];
+pos.y = window->h() - pos.y;
+NSInteger btn = [theEvent buttonNumber] + 1;
+NSUInteger mods = [theEvent modifierFlags];
+int sendEvent = 0;
+
+NSEventType etype = [theEvent type];
+if (etype == NSLeftMouseDown || etype == NSRightMouseDown || etype == NSOtherMouseDown) {
+ if (btn == 1) Fl::e_state |= FL_BUTTON1;
+ else if (btn == 3) Fl::e_state |= FL_BUTTON2;
+ else if (btn == 2) Fl::e_state |= FL_BUTTON3;
+ }
+else if (etype == NSLeftMouseUp || etype == NSRightMouseUp || etype == NSOtherMouseUp) {
+ if (btn == 1) Fl::e_state &= ~FL_BUTTON1;
+ else if (btn == 3) Fl::e_state &= ~FL_BUTTON2;
+ else if (btn == 2) Fl::e_state &= ~FL_BUTTON3;
+ }
+
+switch ( etype ) {
+ case NSLeftMouseDown:
+ case NSRightMouseDown:
+ case NSOtherMouseDown:
+ suppressed = 0;
+ sendEvent = FL_PUSH;
+ Fl::e_is_click = 1;
+ px = (int)pos.x; py = (int)pos.y;
+ if ([theEvent clickCount] > 1)
+ Fl::e_clicks++;
+ else
+ Fl::e_clicks = 0;
+ // fall through
+ case NSLeftMouseUp:
+ case NSRightMouseUp:
+ case NSOtherMouseUp:
+ if (suppressed) {
+ suppressed = 0;
+ break;
+ }
+ if ( !window ) break;
+ if ( !sendEvent ) {
+ sendEvent = FL_RELEASE;
+ }
+ Fl::e_keysym = keysym[ btn ];
+ // fall through
+ case NSMouseMoved:
+ suppressed = 0;
+ if ( !sendEvent ) {
+ sendEvent = FL_MOVE;
+ }
+ // fall through
+ case NSLeftMouseDragged:
+ case NSRightMouseDragged:
+ case NSOtherMouseDragged: {
+ if (suppressed) break;
+ if ( !sendEvent ) {
+ sendEvent = FL_MOVE; // Fl::handle will convert into FL_DRAG
+ if (fabs(pos.x-px)>5 || fabs(pos.y-py)>5)
+ Fl::e_is_click = 0;
+ }
+ mods_to_e_state( mods );
+ update_e_xy_and_e_xy_root([theEvent window]);
+ Fl::handle( sendEvent, window );
+ }
+ break;
+ default:
+ break;
+}
+
+fl_unlock_function();
+
+return;
+#endif
extern int main(int argc, const char **argv);