aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--android/multitouch-port.c27
-rw-r--r--android/multitouch-screen.c47
-rw-r--r--android/multitouch-screen.h8
3 files changed, 71 insertions, 11 deletions
diff --git a/android/multitouch-port.c b/android/multitouch-port.c
index d872b30..88a76fe 100644
--- a/android/multitouch-port.c
+++ b/android/multitouch-port.c
@@ -48,17 +48,21 @@
*/
/* Pointer move message. */
-#define SDKCTL_MT_MOVE 1
+#define SDKCTL_MT_MOVE 1
/* First pointer down message. */
-#define SDKCTL_MT_FISRT_DOWN 2
+#define SDKCTL_MT_FISRT_DOWN 2
/* Last pointer up message. */
-#define SDKCTL_MT_LAST_UP 3
+#define SDKCTL_MT_LAST_UP 3
/* Pointer down message. */
-#define SDKCTL_MT_POINTER_DOWN 4
+#define SDKCTL_MT_POINTER_DOWN 4
/* Pointer up message. */
-#define SDKCTL_MT_POINTER_UP 5
+#define SDKCTL_MT_POINTER_UP 5
/* Sends framebuffer update. */
-#define SDKCTL_MT_FB_UPDATE 6
+#define SDKCTL_MT_FB_UPDATE 6
+/* Framebuffer update has been received. */
+#define SDKCTL_MT_FB_UPDATE_RECEIVED 7
+/* Framebuffer update has been handled. */
+#define SDKCTL_MT_FB_UPDATE_HANDLED 8
/* Multi-touch port descriptor. */
struct AndroidMTSPort {
@@ -260,6 +264,8 @@ _on_multitouch_port_connection(void* opaque,
if (android_hw->hw_gpu_enabled) {
android_setPostCallback(multitouch_opengles_fb_update, NULL);
}
+ /* Refresh (possibly stale) device screen. */
+ multitouch_refresh_screen();
break;
case SDKCTL_PORT_DISABLED:
@@ -330,6 +336,15 @@ _on_multitouch_message(void* client_opaque,
_on_pup((const AndroidMTPtr*)msg_data);
break;
+ case SDKCTL_MT_FB_UPDATE_RECEIVED:
+ D("Framebuffer update ACK.");
+ break;
+
+ case SDKCTL_MT_FB_UPDATE_HANDLED:
+ D("Framebuffer update handled.");
+ multitouch_fb_updated();
+ break;
+
default:
W("Multi-touch: Unknown message %d", msg_type);
break;
diff --git a/android/multitouch-screen.c b/android/multitouch-screen.c
index 59d4d75..36f937d 100644
--- a/android/multitouch-screen.c
+++ b/android/multitouch-screen.c
@@ -87,7 +87,7 @@ typedef struct MTSState {
} MTSState;
/* Default multi-touch screen descriptor */
-static MTSState _MTSState;
+static MTSState _MTSState = { 0 };
/* Pushes event to the event device. */
static void
@@ -252,16 +252,15 @@ _on_fb_sent(void* opaque, SDKCtlDirectPacket* packet, AsyncIOState status)
if (status == ASIO_STATE_SUCCEEDED) {
/* Lets see if we have accumulated more changes while transmission has been
* in progress. */
- if (mts_state->fb_header.w && mts_state->fb_header.h) {
+ if (mts_state->fb_header.w && mts_state->fb_header.h &&
+ !mts_state->fb_transfer_in_progress) {
+ mts_state->fb_transfer_in_progress = 1;
/* Send accumulated updates. */
if (mts_port_send_frame(mts_state->mtsp, &mts_state->fb_header,
mts_state->current_fb, _on_fb_sent, mts_state,
mts_state->ydir)) {
mts_state->fb_transfer_in_progress = 0;
}
- } else {
- /* Framebuffer transfer is completed, and no more updates are pending. */
- mts_state->fb_transfer_in_progress = 0;
}
}
@@ -377,6 +376,44 @@ multitouch_opengles_fb_update(void* context,
}
void
+multitouch_refresh_screen(void)
+{
+ MTSState* const mts_state = &_MTSState;
+
+ /* Make sure MT port is initialized. */
+ if (!_is_mt_initialized) {
+ return;
+ }
+
+ /* Lets see if any updates have been received so far. */
+ if (NULL != mts_state->current_fb) {
+ _mt_fb_common_update(mts_state, 0, 0, mts_state->fb_header.disp_width,
+ mts_state->fb_header.disp_height);
+ }
+}
+
+void
+multitouch_fb_updated(void)
+{
+ MTSState* const mts_state = &_MTSState;
+
+ /* This concludes framebuffer update. */
+ mts_state->fb_transfer_in_progress = 0;
+
+ /* Lets see if we have accumulated more changes while transmission has been
+ * in progress. */
+ if (mts_state->fb_header.w && mts_state->fb_header.h) {
+ mts_state->fb_transfer_in_progress = 1;
+ /* Send accumulated updates. */
+ if (mts_port_send_frame(mts_state->mtsp, &mts_state->fb_header,
+ mts_state->current_fb, _on_fb_sent, mts_state,
+ mts_state->ydir)) {
+ mts_state->fb_transfer_in_progress = 0;
+ }
+ }
+}
+
+void
multitouch_init(AndroidMTSPort* mtsp)
{
if (!_is_mt_initialized) {
diff --git a/android/multitouch-screen.h b/android/multitouch-screen.h
index 95ae86a..baca224 100644
--- a/android/multitouch-screen.h
+++ b/android/multitouch-screen.h
@@ -95,4 +95,12 @@ extern void multitouch_opengles_fb_update(void* context,
int type,
unsigned char* pixels);
+/* Pushes the entire framebuffer to the device. This will force the device to
+ * refresh the entire screen.
+ */
+extern void multitouch_refresh_screen(void);
+
+/* Framebuffer update has been handled by the device. */
+extern void multitouch_fb_updated(void);
+
#endif /* ANDROID_MULTITOUCH_SCREEN_H_ */