mirror of
				https://github.com/libsdl-org/SDL.git
				synced 2025-10-26 12:27:44 +00:00 
			
		
		
		
	Implemented SDL_GetDisplayOrientation() on Android (thanks Rachel!)
This commit is contained in:
		| @@ -54,6 +54,14 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh | |||||||
|     private static final int SDL_SYSTEM_CURSOR_NO = 10; |     private static final int SDL_SYSTEM_CURSOR_NO = 10; | ||||||
|     private static final int SDL_SYSTEM_CURSOR_HAND = 11; |     private static final int SDL_SYSTEM_CURSOR_HAND = 11; | ||||||
|  |  | ||||||
|  |     protected static final int SDL_ORIENTATION_UNKNOWN = 0; | ||||||
|  |     protected static final int SDL_ORIENTATION_LANDSCAPE = 1; | ||||||
|  |     protected static final int SDL_ORIENTATION_LANDSCAPE_FLIPPED = 2; | ||||||
|  |     protected static final int SDL_ORIENTATION_PORTRAIT = 3; | ||||||
|  |     protected static final int SDL_ORIENTATION_PORTRAIT_FLIPPED = 4; | ||||||
|  |  | ||||||
|  |     protected static int mCurrentOrientation; | ||||||
|  |  | ||||||
|     // Handle the state of the native layer |     // Handle the state of the native layer | ||||||
|     public enum NativeState { |     public enum NativeState { | ||||||
|            INIT, RESUMED, PAUSED |            INIT, RESUMED, PAUSED | ||||||
| @@ -250,6 +258,10 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh | |||||||
|         mLayout = new RelativeLayout(this); |         mLayout = new RelativeLayout(this); | ||||||
|         mLayout.addView(mSurface); |         mLayout.addView(mSurface); | ||||||
|  |  | ||||||
|  |         // Get our current screen orientation and pass it down. | ||||||
|  |         mCurrentOrientation = SDLActivity.getCurrentOrientation(); | ||||||
|  |         SDLActivity.onNativeOrientationChanged(mCurrentOrientation); | ||||||
|  |  | ||||||
|         setContentView(mLayout); |         setContentView(mLayout); | ||||||
|  |  | ||||||
|         setWindowStyle(false); |         setWindowStyle(false); | ||||||
| @@ -304,6 +316,32 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh | |||||||
|         SDLActivity.handleNativeState(); |         SDLActivity.handleNativeState(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public static int getCurrentOrientation() { | ||||||
|  |         final Context context = SDLActivity.getContext(); | ||||||
|  |         final Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); | ||||||
|  |  | ||||||
|  |         int result = SDL_ORIENTATION_UNKNOWN; | ||||||
|  |  | ||||||
|  |         switch (display.getRotation()) { | ||||||
|  |             case Surface.ROTATION_0: | ||||||
|  |                 result = SDL_ORIENTATION_PORTRAIT; | ||||||
|  |                 break; | ||||||
|  |      | ||||||
|  |             case Surface.ROTATION_90: | ||||||
|  |                 result = SDL_ORIENTATION_LANDSCAPE; | ||||||
|  |                 break; | ||||||
|  |      | ||||||
|  |             case Surface.ROTATION_180: | ||||||
|  |                 result = SDL_ORIENTATION_PORTRAIT_FLIPPED; | ||||||
|  |                 break; | ||||||
|  |      | ||||||
|  |             case Surface.ROTATION_270: | ||||||
|  |                 result = SDL_ORIENTATION_LANDSCAPE_FLIPPED; | ||||||
|  |                 break; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return result; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void onWindowFocusChanged(boolean hasFocus) { |     public void onWindowFocusChanged(boolean hasFocus) { | ||||||
| @@ -628,6 +666,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh | |||||||
|     public static native void onNativeSurfaceDestroyed(); |     public static native void onNativeSurfaceDestroyed(); | ||||||
|     public static native String nativeGetHint(String name); |     public static native String nativeGetHint(String name); | ||||||
|     public static native void nativeSetenv(String name, String value); |     public static native void nativeSetenv(String name, String value); | ||||||
|  |     public static native void onNativeOrientationChanged(int orientation); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * This method is called by SDL using JNI. |      * This method is called by SDL using JNI. | ||||||
| @@ -1748,28 +1787,45 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, | |||||||
|     @Override |     @Override | ||||||
|     public void onSensorChanged(SensorEvent event) { |     public void onSensorChanged(SensorEvent event) { | ||||||
|         if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { |         if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { | ||||||
|  |  | ||||||
|  |             // Since we may have an orientation set, we won't receive onConfigurationChanged events. | ||||||
|  |             // We thus should check here. | ||||||
|  |             int newOrientation = SDLActivity.SDL_ORIENTATION_UNKNOWN; | ||||||
|  |      | ||||||
|             float x, y; |             float x, y; | ||||||
|             switch (mDisplay.getRotation()) { |             switch (mDisplay.getRotation()) { | ||||||
|                 case Surface.ROTATION_90: |                 case Surface.ROTATION_90: | ||||||
|                     x = -event.values[1]; |                     x = -event.values[1]; | ||||||
|                     y = event.values[0]; |                     y = event.values[0]; | ||||||
|  |                     newOrientation = SDLActivity.SDL_ORIENTATION_LANDSCAPE; | ||||||
|                     break; |                     break; | ||||||
|                 case Surface.ROTATION_270: |                 case Surface.ROTATION_270: | ||||||
|                     x = event.values[1]; |                     x = event.values[1]; | ||||||
|                     y = -event.values[0]; |                     y = -event.values[0]; | ||||||
|  |                     newOrientation = SDLActivity.SDL_ORIENTATION_LANDSCAPE_FLIPPED; | ||||||
|                     break; |                     break; | ||||||
|                 case Surface.ROTATION_180: |                 case Surface.ROTATION_180: | ||||||
|                     x = -event.values[1]; |                     x = -event.values[1]; | ||||||
|                     y = -event.values[0]; |                     y = -event.values[0]; | ||||||
|  |                     newOrientation = SDLActivity.SDL_ORIENTATION_PORTRAIT_FLIPPED; | ||||||
|                     break; |                     break; | ||||||
|                 default: |                 default: | ||||||
|                     x = event.values[0]; |                     x = event.values[0]; | ||||||
|                     y = event.values[1]; |                     y = event.values[1]; | ||||||
|  |                     newOrientation = SDLActivity.SDL_ORIENTATION_PORTRAIT; | ||||||
|                     break; |                     break; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |             if (newOrientation != SDLActivity.mCurrentOrientation) { | ||||||
|  |                 SDLActivity.mCurrentOrientation = newOrientation; | ||||||
|  |                 SDLActivity.onNativeOrientationChanged(newOrientation); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             SDLActivity.onNativeAccel(-x / SensorManager.GRAVITY_EARTH, |             SDLActivity.onNativeAccel(-x / SensorManager.GRAVITY_EARTH, | ||||||
|                                       y / SensorManager.GRAVITY_EARTH, |                                       y / SensorManager.GRAVITY_EARTH, | ||||||
|                                       event.values[2] / SensorManager.GRAVITY_EARTH); |                                       event.values[2] / SensorManager.GRAVITY_EARTH); | ||||||
|  |  | ||||||
|  |              | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -135,6 +135,10 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetenv)( | |||||||
| JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeEnvironmentVariablesSet)( | JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeEnvironmentVariablesSet)( | ||||||
|         JNIEnv* env, jclass cls); |         JNIEnv* env, jclass cls); | ||||||
|  |  | ||||||
|  | JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeOrientationChanged)( | ||||||
|  |         JNIEnv* env, jclass cls, | ||||||
|  |         jint orientation); | ||||||
|  |  | ||||||
| /* Java class SDLInputConnection */ | /* Java class SDLInputConnection */ | ||||||
| JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeCommitText)( | JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeCommitText)( | ||||||
|         JNIEnv* env, jclass cls, |         JNIEnv* env, jclass cls, | ||||||
| @@ -535,6 +539,14 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeResize)( | |||||||
|     Android_SetScreenResolution(surfaceWidth, surfaceHeight, deviceWidth, deviceHeight, format, rate); |     Android_SetScreenResolution(surfaceWidth, surfaceHeight, deviceWidth, deviceHeight, format, rate); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeOrientationChanged)( | ||||||
|  |                                     JNIEnv *env, jclass jcls, | ||||||
|  |                                     jint orientation) | ||||||
|  | { | ||||||
|  |     SDL_VideoDisplay *display = SDL_GetDisplay(0); | ||||||
|  |     SDL_SendDisplayEvent(display, SDL_DISPLAYEVENT_ORIENTATION, orientation); | ||||||
|  | } | ||||||
|  |  | ||||||
| /* Paddown */ | /* Paddown */ | ||||||
| JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativePadDown)( | JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativePadDown)( | ||||||
|                                     JNIEnv* env, jclass jcls, |                                     JNIEnv* env, jclass jcls, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Sam Lantinga
					Sam Lantinga