diff options
| author | Matthias Melcher <fltk@matthiasm.com> | 2018-03-24 13:06:59 +0000 |
|---|---|---|
| committer | Matthias Melcher <fltk@matthiasm.com> | 2018-03-24 13:06:59 +0000 |
| commit | 79b31708de7b1544d0e7b32d616ecb9b79d1b9bd (patch) | |
| tree | 4bcb449bcc1e90269f7c04ada08eab1762d8a199 /src | |
| parent | db55dfbbd6e161ab1388583ef6834137a4a380e1 (diff) | |
Android: Made popup and menu windows work, fixed Fl::wait() recursion,
fixed incompatible Fl::wait() behavior.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12793 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
| -rw-r--r-- | src/drivers/Android/Fl_Android_Graphics_Driver.cxx | 8 | ||||
| -rw-r--r-- | src/drivers/Android/Fl_Android_Screen_Driver.H | 2 | ||||
| -rw-r--r-- | src/drivers/Android/Fl_Android_Screen_Driver.cxx | 89 | ||||
| -rw-r--r-- | src/drivers/Android/Fl_Android_Window_Driver.H | 16 | ||||
| -rw-r--r-- | src/drivers/Android/Fl_Android_Window_Driver.cxx | 15 |
5 files changed, 87 insertions, 43 deletions
diff --git a/src/drivers/Android/Fl_Android_Graphics_Driver.cxx b/src/drivers/Android/Fl_Android_Graphics_Driver.cxx index d06186268..2198735b9 100644 --- a/src/drivers/Android/Fl_Android_Graphics_Driver.cxx +++ b/src/drivers/Android/Fl_Android_Graphics_Driver.cxx @@ -892,10 +892,10 @@ void Fl_Android_Graphics_Driver::pie_unscaled(float xi, float yi, float w, float * FIXME: these do not draw rotated ellipses correctly! * */ void Fl_Android_Graphics_Driver::ellipse_unscaled(double xt, double yt, double rx, double ry) { - double llx = xt-rx; - double w = xt+rx-llx; - double lly = yt-ry; - double h = yt+ry-lly; + float llx = xt-rx; + float w = xt+rx-llx; + float lly = yt-ry; + float h = yt+ry-lly; if (what==POLYGON) pie_unscaled(llx, lly, w, h, 0.0, 360.0); diff --git a/src/drivers/Android/Fl_Android_Screen_Driver.H b/src/drivers/Android/Fl_Android_Screen_Driver.H index a63941783..a228641a2 100644 --- a/src/drivers/Android/Fl_Android_Screen_Driver.H +++ b/src/drivers/Android/Fl_Android_Screen_Driver.H @@ -43,7 +43,7 @@ private: int handle_app_command(); int handle_input_event(); int handle_keyboard_event(AInputEvent*); - int handle_mouse_event(AInputEvent*); + int handle_mouse_event(AInputQueue*, AInputEvent*); public: Fl_Android_Screen_Driver() : Fl_Screen_Driver(), pScreenContentChanged(false) { } diff --git a/src/drivers/Android/Fl_Android_Screen_Driver.cxx b/src/drivers/Android/Fl_Android_Screen_Driver.cxx index e713f5b95..eb597e6c6 100644 --- a/src/drivers/Android/Fl_Android_Screen_Driver.cxx +++ b/src/drivers/Android/Fl_Android_Screen_Driver.cxx @@ -95,16 +95,18 @@ int Fl_Android_Screen_Driver::handle_input_event() switch (AInputEvent_getType(event)) { case AINPUT_EVENT_TYPE_KEY: consumed = handle_keyboard_event(event); + AInputQueue_finishEvent(queue, event, consumed); break; case AINPUT_EVENT_TYPE_MOTION: - consumed = handle_mouse_event(event); + consumed = handle_mouse_event(queue, event); break; default: // don't do anything. There may be additional event types in the future + AInputQueue_finishEvent(queue, event, consumed); break; } // TODO: handle all events here - AInputQueue_finishEvent(queue, event, consumed); +// AInputQueue_finishEvent(queue, event, consumed); } } return 0; @@ -119,7 +121,8 @@ int Fl_Android_Screen_Driver::handle_keyboard_event(AInputEvent *event) return 0; } -int Fl_Android_Screen_Driver::handle_mouse_event(AInputEvent *event) + +int Fl_Android_Screen_Driver::handle_mouse_event(AInputQueue *queue, AInputEvent *event) { int ex = Fl::e_x_root = (int)(AMotionEvent_getX(event, 0) * 600 / ANativeWindow_getWidth(Fl_Android_Application::native_window())); @@ -130,14 +133,19 @@ int Fl_Android_Screen_Driver::handle_mouse_event(AInputEvent *event) Fl_Window *win = Fl::grab(); if (!win) { win = Fl::first_window(); - while (win) { - if (ex >= win->x() && ex < win->x() + win->w() && ey >= win->y() && - ey < win->y() + win->h()) - break; - win = Fl::next_window(win); + if (win && !win->modal()) { + while (win) { + if (ex >= win->x() && ex < win->x() + win->w() && ey >= win->y() && + ey < win->y() + win->h()) + break; + win = Fl::next_window(win); + } } } - if (!win) return 0; + if (!win) { + AInputQueue_finishEvent(queue, event, 0); + return 0; + } if (win) { Fl::e_x = ex-win->x(); @@ -150,14 +158,19 @@ int Fl_Android_Screen_Driver::handle_mouse_event(AInputEvent *event) Fl::e_state = FL_BUTTON1; Fl::e_keysym = FL_Button + 1; if (AMotionEvent_getAction(event) == AMOTION_EVENT_ACTION_DOWN) { + AInputQueue_finishEvent(queue, event, 1); Fl::e_is_click = 1; if (win) Fl::handle(FL_PUSH, win); // do NOT send a push event into the "Desktop" Fl_Android_Application::log_i("Mouse push %d at %d, %d", Fl::event_button(), Fl::event_x(), Fl::event_y()); } else if (AMotionEvent_getAction(event) == AMOTION_EVENT_ACTION_MOVE) { + AInputQueue_finishEvent(queue, event, 1); Fl::handle(FL_DRAG, win); } else if (AMotionEvent_getAction(event) == AMOTION_EVENT_ACTION_UP) { + AInputQueue_finishEvent(queue, event, 1); Fl::e_state = 0; Fl::handle(FL_RELEASE, win); + } else { + AInputQueue_finishEvent(queue, event, 0); } return 1; } @@ -176,29 +189,47 @@ int Fl_Android_Screen_Driver::handle_queued_events(double time_to_wait) // Read all pending events. int ident; int events; - struct android_poll_source *source; - - for (;;) { - ident = ALooper_pollAll(Fl::damage() ? 0 : -1, nullptr, &events, (void **) &source); - switch (ident) { - // FIXME: ALOOPER_POLL_WAKE = -1, ALOOPER_POLL_CALLBACK = -2, ALOOPER_POLL_TIMEOUT = -3, ALOOPER_POLL_ERROR = -4 - case Fl_Android_Application::LOOPER_ID_MAIN: - ret = handle_app_command(); - break; - case Fl_Android_Application::LOOPER_ID_INPUT: - ret = handle_input_event(); - break; - case Fl_Android_Application::LOOPER_ID_TIMER: - timer_do_callback(Fl_Android_Application::receive_timer_index()); - break; - case -3: return ret; - default: return ret; - } + + ident = ALooper_pollAll(Fl::damage() ? 0 : -1, nullptr, &events, nullptr); + switch (ident) { + case Fl_Android_Application::LOOPER_ID_MAIN: + ret = handle_app_command(); + break; + case Fl_Android_Application::LOOPER_ID_INPUT: + ret = handle_input_event(); + break; + case Fl_Android_Application::LOOPER_ID_TIMER: + timer_do_callback(Fl_Android_Application::receive_timer_index()); + break; + case ALOOPER_POLL_WAKE: + Fl_Android_Application::log_e("Someone woke up ALooper_pollAll."); + break; + case ALOOPER_POLL_CALLBACK: + Fl_Android_Application::log_e( + "Someone added a callback to ALooper_pollAll."); + break; + case ALOOPER_POLL_TIMEOUT: + // timer expired + break; + case ALOOPER_POLL_ERROR: + Fl_Android_Application::log_e( + "Something caused an ERROR in ALooper_pollAll."); + break; + default: + Fl_Android_Application::log_e( + "Unknown return value from ALooper_pollAll."); + break; } return ret; } - +/** + * Wait for a maximum of `time_to_wait` until something happens. + * @param time_to_wait in seconds + * @return We really do not know; check other platforms to see what is + * consistent here. + * FIXME: return the remaining time to reach 'time_to_wait' + */ double Fl_Android_Screen_Driver::wait(double time_to_wait) { Fl::run_checks(); @@ -229,7 +260,7 @@ double Fl_Android_Screen_Driver::wait(double time_to_wait) fl_lock_function(); } - return 0.0; // FIXME: return the remaining time to reach 'time_to_wait' + return 0.0; } diff --git a/src/drivers/Android/Fl_Android_Window_Driver.H b/src/drivers/Android/Fl_Android_Window_Driver.H index 49be9a913..95c31b247 100644 --- a/src/drivers/Android/Fl_Android_Window_Driver.H +++ b/src/drivers/Android/Fl_Android_Window_Driver.H @@ -71,12 +71,17 @@ private: #endif public: - Fl_Android_Window_Driver(Fl_Window *w) : Fl_Window_Driver(w) {} - ~Fl_Android_Window_Driver() {} static inline Fl_Android_Window_Driver* driver(Fl_Window *w) { return (Fl_Android_Window_Driver*)w->driver(); } + Fl_Android_Window_Driver(Fl_Window *w) : Fl_Window_Driver(w) {} + virtual ~Fl_Android_Window_Driver() override {} + + virtual void make_current() override; + virtual void show() override; + virtual void hide() override; + #if 0 HDC private_dc; // used for OpenGL RECT border_width_title_bar_height(int &bx, int &by, int &bt); @@ -103,13 +108,8 @@ public: virtual void flush_double(); virtual void flush_overlay(); virtual void draw_begin(); -#endif - virtual void make_current(); - virtual void show(); -#if 0 virtual void label(const char *name,const char *iname); virtual void resize(int X,int Y,int W,int H); - virtual void hide(); virtual void map(); virtual void unmap(); virtual void fullscreen_on(); @@ -136,8 +136,6 @@ public: void wait_for_expose() { wait_for_expose_value = 1; } static void expose_all(); -// Leuwer: 0171 473 1850 - }; diff --git a/src/drivers/Android/Fl_Android_Window_Driver.cxx b/src/drivers/Android/Fl_Android_Window_Driver.cxx index 18bbe3bde..4e10d6d7d 100644 --- a/src/drivers/Android/Fl_Android_Window_Driver.cxx +++ b/src/drivers/Android/Fl_Android_Window_Driver.cxx @@ -76,10 +76,25 @@ void Fl_Android_Window_Driver::show() } } else { // bring window to front + Fl::first_window(pWindow); // TODO: does this really work? + expose_all(); } } +void Fl_Android_Window_Driver::hide() +{ + Fl_X* ip = Fl_X::i(pWindow); + if (hide_common()) return; + if (ip->region) { + delete ip->region; + ip->region = nullptr; + } + delete ip; + expose_all(); +} + + void Fl_Android_Window_Driver::expose_all() { for (Fl_X *x = Fl_X::first; x; x = x->next) { |
