Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1143)

Unified Diff: tools/viewer/sk_app/android/surface_glue_android.cpp

Issue 1982643004: Implement touch control (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 1-- Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/viewer/sk_app/android/surface_glue_android.cpp
diff --git a/tools/viewer/sk_app/android/surface_glue_android.cpp b/tools/viewer/sk_app/android/surface_glue_android.cpp
index 3d8617f0aa4ab8854991fbeb37151ff60894c840..541b7f0053ad84392e65b8c2fdcca11971e453a0 100644
--- a/tools/viewer/sk_app/android/surface_glue_android.cpp
+++ b/tools/viewer/sk_app/android/surface_glue_android.cpp
@@ -13,6 +13,7 @@
#include <unistd.h>
#include <unordered_map>
+#include <android/input.h>
#include <android/keycodes.h>
#include <android/looper.h>
#include <android/native_window_jni.h>
@@ -31,12 +32,22 @@ static const std::unordered_map<int, Window::Key> ANDROID_TO_WINDOW_KEYMAP({
{AKEYCODE_SOFT_RIGHT, Window::Key::kRight}
});
+static const std::unordered_map<int, Window::InputState> ANDROID_TO_WINDOW_STATEMAP({
+ {AMOTION_EVENT_ACTION_DOWN, Window::kDown_InputState},
+ {AMOTION_EVENT_ACTION_POINTER_DOWN, Window::kDown_InputState},
+ {AMOTION_EVENT_ACTION_UP, Window::kUp_InputState},
+ {AMOTION_EVENT_ACTION_POINTER_UP, Window::kUp_InputState},
+ {AMOTION_EVENT_ACTION_MOVE, Window::kMove_InputState},
+ {AMOTION_EVENT_ACTION_CANCEL, Window::kUp_InputState},
+});
+
SkiaAndroidApp::SkiaAndroidApp(JNIEnv* env, jobject androidApp) {
env->GetJavaVM(&fJavaVM);
fAndroidApp = env->NewGlobalRef(androidApp);
jclass cls = env->GetObjectClass(fAndroidApp);
fSetTitleMethodID = env->GetMethodID(cls, "setTitle", "(Ljava/lang/String;)V");
fNativeWindow = nullptr;
+ pthread_mutex_init(&fMutex, nullptr);
pthread_create(&fThread, nullptr, pthread_main, this);
}
@@ -52,6 +63,7 @@ SkiaAndroidApp::~SkiaAndroidApp() {
if (fApp) {
delete fApp;
}
+ pthread_mutex_destroy(&fMutex);
}
void SkiaAndroidApp::setTitle(const char* title) const {
@@ -76,6 +88,15 @@ void SkiaAndroidApp::readMessage(Message* message) const {
SkASSERT(readSize == sizeof(Message));
}
+void SkiaAndroidApp::inval() {
+ pthread_mutex_lock(&fMutex);
djsollen 2016/05/17 18:48:02 use SkAutoTAcquire
liyuqian 2016/05/17 19:06:35 Done.
+ if (!fIsContentInvalidated) {
+ postMessage(Message(kContentInvalidated));
+ fIsContentInvalidated = true;
+ }
+ pthread_mutex_unlock(&fMutex);
+}
+
int SkiaAndroidApp::message_callback(int fd, int events, void* data) {
auto skiaAndroidApp = (SkiaAndroidApp*)data;
Message message;
@@ -90,7 +111,10 @@ int SkiaAndroidApp::message_callback(int fd, int events, void* data) {
return 0;
}
case kContentInvalidated: {
+ pthread_mutex_lock(&skiaAndroidApp->fMutex);
djsollen 2016/05/17 18:48:02 use SkAutoTAcquire
liyuqian 2016/05/17 19:06:34 Done.
+ skiaAndroidApp->fIsContentInvalidated = false;
skiaAndroidApp->paintIfNeeded();
+ pthread_mutex_unlock(&skiaAndroidApp->fMutex);
break;
}
case kSurfaceCreated: {
@@ -121,13 +145,20 @@ int SkiaAndroidApp::message_callback(int fd, int events, void* data) {
break;
}
case kKeyPressed: {
- auto it = ANDROID_TO_WINDOW_KEYMAP.find(message.keycode);
+ auto it = ANDROID_TO_WINDOW_KEYMAP.find(message.fKeycode);
SkASSERT(it != ANDROID_TO_WINDOW_KEYMAP.end());
// No modifier is supported so far
skiaAndroidApp->fWindow->onKey(it->second, Window::kDown_InputState, 0);
skiaAndroidApp->fWindow->onKey(it->second, Window::kUp_InputState, 0);
break;
}
+ case kTouched: {
+ auto it = ANDROID_TO_WINDOW_STATEMAP.find(message.fTouchState);
+ SkASSERT(it != ANDROID_TO_WINDOW_STATEMAP.end());
+ skiaAndroidApp->fWindow->onTouch(message.fTouchOwner, it->second, message.fTouchX,
+ message.fTouchY);
+ break;
+ }
default: {
// do nothing
}
@@ -203,7 +234,18 @@ extern "C" JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_onKeyPress
jint keycode) {
auto skiaAndroidApp = (SkiaAndroidApp*)handle;
Message message(kKeyPressed);
- message.keycode = keycode;
+ message.fKeycode = keycode;
+ skiaAndroidApp->postMessage(message);
+}
+
+extern "C" JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_onTouched(
+ JNIEnv* env, jobject activity, jlong handle, jint owner, jfloat x, jfloat y, jint state) {
+ auto skiaAndroidApp = (SkiaAndroidApp*)handle;
+ Message message(kTouched);
+ message.fTouchOwner = owner;
+ message.fTouchState = state;
+ message.fTouchX = x;
+ message.fTouchY = y;
skiaAndroidApp->postMessage(message);
}

Powered by Google App Engine
This is Rietveld 408576698