From d05eec7207093be9de578289eacc6bcc2fcdddd2 Mon Sep 17 00:00:00 2001 From: Sam Lantinga <slouken@libsdl.org> Date: Tue, 12 Mar 2019 14:44:25 -0700 Subject: [PATCH] Fixed initial display orientation at Android app start --- src/core/android/SDL_android.c | 23 +++++++++++++---------- src/core/android/SDL_android.h | 6 ++++-- src/video/android/SDL_androidvideo.c | 11 ++++++++--- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c index a88f2f2cf..cc7be09d2 100644 --- a/src/core/android/SDL_android.c +++ b/src/core/android/SDL_android.c @@ -284,6 +284,7 @@ static jmethodID midHapticStop; static jfieldID fidSeparateMouseAndTouch; /* Accelerometer data storage */ +static SDL_DisplayOrientation displayOrientation; static float fLastAccelerometer[3]; static SDL_bool bHasNewData; @@ -399,7 +400,7 @@ Android_JNI_ThreadDestroyed(void *value) /* Creation of local storage mThreadKey */ static void -Android_JNI_CreateKey() +Android_JNI_CreateKey(void) { int status = pthread_key_create(&mThreadKey, Android_JNI_ThreadDestroyed); if (status < 0) { @@ -408,7 +409,7 @@ Android_JNI_CreateKey() } static void -Android_JNI_CreateKey_once() +Android_JNI_CreateKey_once(void) { int status = pthread_once(&key_once, Android_JNI_CreateKey); if (status < 0) { @@ -423,7 +424,7 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) return JNI_VERSION_1_4; } -void checkJNIReady() +void checkJNIReady(void) { if (!mActivityClass || !mAudioManagerClass || !mControllerManagerClass) { /* We aren't fully initialized, let's just return. */ @@ -739,11 +740,8 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeOrientationChanged)( { SDL_LockMutex(Android_ActivityMutex); - if (Android_Window) - { - SDL_VideoDisplay *display = SDL_GetDisplay(0); - SDL_SendDisplayEvent(display, SDL_DISPLAYEVENT_ORIENTATION, orientation); - } + displayOrientation = (SDL_DisplayOrientation)orientation; + SDL_SendDisplayEvent(SDL_GetDisplay(0), SDL_DISPLAYEVENT_ORIENTATION, orientation); SDL_UnlockMutex(Android_ActivityMutex); } @@ -1418,6 +1416,11 @@ int Android_JNI_OpenAudioDevice(int iscapture, SDL_AudioSpec *spec) return 0; } +SDL_DisplayOrientation Android_JNI_GetDisplayOrientation(void) +{ + return displayOrientation; +} + int Android_JNI_GetDisplayDPI(float *ddpi, float *xdpi, float *ydpi) { JNIEnv *env = Android_JNI_GetEnv(); @@ -2263,7 +2266,7 @@ void Android_JNI_HideTextInput(void) Android_JNI_SendMessage(COMMAND_TEXTEDIT_HIDE, 0); } -SDL_bool Android_JNI_IsScreenKeyboardShown() +SDL_bool Android_JNI_IsScreenKeyboardShown(void) { JNIEnv *env = Android_JNI_GetEnv(); jboolean is_shown = 0; @@ -2595,7 +2598,7 @@ SDL_bool Android_JNI_SetSystemCursor(int cursorID) return (*env)->CallStaticBooleanMethod(env, mActivityClass, midSetSystemCursor, cursorID); } -SDL_bool Android_JNI_SupportsRelativeMouse() +SDL_bool Android_JNI_SupportsRelativeMouse(void) { JNIEnv *env = Android_JNI_GetEnv(); return (*env)->CallStaticBooleanMethod(env, mActivityClass, midSupportsRelativeMouse); diff --git a/src/core/android/SDL_android.h b/src/core/android/SDL_android.h index f437ab1ab..837378624 100644 --- a/src/core/android/SDL_android.h +++ b/src/core/android/SDL_android.h @@ -33,6 +33,7 @@ extern "C" { #include "SDL_audio.h" #include "SDL_rect.h" +#include "SDL_video.h" /* Interface from the SDL library into the Android Java activity */ extern void Android_JNI_SetActivityTitle(const char *title); @@ -46,6 +47,7 @@ extern SDL_bool Android_JNI_IsScreenKeyboardShown(void); extern ANativeWindow* Android_JNI_GetNativeWindow(void); extern void Android_JNI_SetSurfaceViewFormat(int format); +extern SDL_DisplayOrientation Android_JNI_GetDisplayOrientation(void); extern int Android_JNI_GetDisplayDPI(float *ddpi, float *xdpi, float *ydpi); /* Audio support */ @@ -58,8 +60,8 @@ extern void Android_JNI_CloseAudioDevice(const int iscapture); extern void Android_JNI_AudioSetThreadPriority(int iscapture, int device_id); /* Detecting device type */ -extern SDL_bool Android_IsDeXMode(); -extern SDL_bool Android_IsChromebook(); +extern SDL_bool Android_IsDeXMode(void); +extern SDL_bool Android_IsChromebook(void); #include "SDL_rwops.h" diff --git a/src/video/android/SDL_androidvideo.c b/src/video/android/SDL_androidvideo.c index 283b1053b..9ee60d718 100644 --- a/src/video/android/SDL_androidvideo.c +++ b/src/video/android/SDL_androidvideo.c @@ -172,8 +172,10 @@ VideoBootStrap Android_bootstrap = { int Android_VideoInit(_THIS) { - SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; - SDL_DisplayMode mode; + SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; + int display_index; + SDL_VideoDisplay *display; + SDL_DisplayMode mode; videodata->isPaused = SDL_FALSE; videodata->isPausing = SDL_FALSE; @@ -184,9 +186,12 @@ Android_VideoInit(_THIS) mode.refresh_rate = Android_ScreenRate; mode.driverdata = NULL; - if (SDL_AddBasicVideoDisplay(&mode) < 0) { + display_index = SDL_AddBasicVideoDisplay(&mode); + if (display_index < 0) { return -1; } + display = SDL_GetDisplay(display_index); + display->orientation = Android_JNI_GetDisplayOrientation(); SDL_AddDisplayMode(&_this->displays[0], &mode);