diff options
Diffstat (limited to 'tools/sk_app/android/surface_glue_android.h')
-rw-r--r-- | tools/sk_app/android/surface_glue_android.h | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/tools/sk_app/android/surface_glue_android.h b/tools/sk_app/android/surface_glue_android.h new file mode 100644 index 0000000000..1dd1f2854a --- /dev/null +++ b/tools/sk_app/android/surface_glue_android.h @@ -0,0 +1,79 @@ +/* +* Copyright 2016 Google Inc. +* +* Use of this source code is governed by a BSD-style license that can be +* found in the LICENSE file. +*/ + +#ifndef surface_glue_android_DEFINED +#define surface_glue_android_DEFINED + +#include <pthread.h> + +#include <android/native_window_jni.h> + +#include "SkString.h" + +#include "../Application.h" +#include "../Window.h" + +namespace sk_app { + +enum MessageType { + kUndefined, + kSurfaceCreated, + kSurfaceChanged, + kSurfaceDestroyed, + kDestroyApp, + kContentInvalidated, + kKeyPressed, + kTouched, + kUIStateChanged, +}; + +struct Message { + MessageType fType = kUndefined; + ANativeWindow* fNativeWindow = nullptr; + int fKeycode = 0; + int fTouchOwner, fTouchState; + float fTouchX, fTouchY; + + SkString* stateName; + SkString* stateValue; + + Message() {} + Message(MessageType t) : fType(t) {} +}; + +struct SkiaAndroidApp { + Application* fApp; + Window* fWindow; + jobject fAndroidApp; + + SkiaAndroidApp(JNIEnv* env, jobject androidApp); + + void postMessage(const Message& message) const; + void readMessage(Message* message) const; + + // These must be called in SkiaAndroidApp's own pthread because the JNIEnv is thread sensitive + void setTitle(const char* title) const; + void setUIState(const char* state) const; + +private: + pthread_t fThread; + ANativeWindow* fNativeWindow; + int fPipes[2]; // 0 is the read message pipe, 1 is the write message pipe + JavaVM* fJavaVM; + JNIEnv* fPThreadEnv; + jmethodID fSetTitleMethodID, fSetStateMethodID; + + // This must be called in SkiaAndroidApp's own pthread because the JNIEnv is thread sensitive + ~SkiaAndroidApp(); + + static int message_callback(int fd, int events, void* data); + static void* pthread_main(void*); +}; + +} // namespace sk_app + +#endif |