summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/Android/Fl_Android_Graphics_Driver.cxx8
-rw-r--r--src/drivers/Android/Fl_Android_Screen_Driver.H2
-rw-r--r--src/drivers/Android/Fl_Android_Screen_Driver.cxx89
-rw-r--r--src/drivers/Android/Fl_Android_Window_Driver.H16
-rw-r--r--src/drivers/Android/Fl_Android_Window_Driver.cxx15
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) {