Track android device panel width & height as well as window surface & height. Expand SDLActivity::SDLSurface::surfaceChanged() callback to grab the panel width and height at the same time and pass that along to the native code. Only works on API 17+. Duplicates surface dimensions whenever it fails. Add Android_DeviceWidth/Android_DeviceHeight globals to native code. Disambiguate Android_ScreenWidth/Android_ScreenHeight -> Android_SurfaceWidth/Android_SurfaceHeight Use device width/height for all display mode settings.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
diff --git a/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java b/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
index c62a514..b5e85bd 100644
--- a/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
+++ b/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
@@ -556,7 +556,7 @@ public class SDLActivity extends Activity {
public static native void nativePause();
public static native void nativeResume();
public static native void onNativeDropFile(String filename);
- public static native void onNativeResize(int x, int y, int format, float rate);
+ public static native void onNativeResize(int surfaceWidth, int surfaceHeight, int deviceWidth, int deviceHeight, int format, float rate);
public static native void onNativeKeyDown(int keycode);
public static native void onNativeKeyUp(int keycode);
public static native void onNativeKeyboardFocusLost();
@@ -1378,8 +1378,23 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
mWidth = width;
mHeight = height;
- SDLActivity.onNativeResize(width, height, sdlFormat, mDisplay.getRefreshRate());
- Log.v("SDL", "Window size: " + width + "x" + height);
+ int nDeviceWidth = width;
+ int nDeviceHeight = height;
+ try
+ {
+ if ( android.os.Build.VERSION.SDK_INT >= 17 )
+ {
+ android.util.DisplayMetrics realMetrics = new android.util.DisplayMetrics();
+ mDisplay.getRealMetrics( realMetrics );
+ nDeviceWidth = realMetrics.widthPixels;
+ nDeviceHeight = realMetrics.heightPixels;
+ }
+ }
+ catch ( java.lang.Throwable throwable ) {}
+
+ Log.v("SDL", "Window size: " + width + "x" + height);
+ Log.v("SDL", "Device size: " + nDeviceWidth + "x" + nDeviceHeight);
+ SDLActivity.onNativeResize(width, height, nDeviceWidth, nDeviceHeight, sdlFormat, mDisplay.getRefreshRate());
boolean skip = false;
diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c
index 9405d6c..29a55a9 100644
--- a/src/core/android/SDL_android.c
+++ b/src/core/android/SDL_android.c
@@ -76,7 +76,8 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeDropFile)(
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeResize)(
JNIEnv* env, jclass jcls,
- jint width, jint height, jint format, jfloat rate);
+ jint surfaceWidth, jint surfaceHeight,
+ jint deviceWidth, jint deviceHeight, jint format, jfloat rate);
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceChanged)(
JNIEnv* env, jclass jcls);
@@ -518,9 +519,10 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeDropFile)(
/* Resize */
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeResize)(
JNIEnv* env, jclass jcls,
- jint width, jint height, jint format, jfloat rate)
+ jint surfaceWidth, jint surfaceHeight,
+ jint deviceWidth, jint deviceHeight, jint format, jfloat rate)
{
- Android_SetScreenResolution(width, height, format, rate);
+ Android_SetScreenResolution(surfaceWidth, surfaceHeight, deviceWidth, deviceHeight, format, rate);
}
/* Paddown */
diff --git a/src/video/android/SDL_androidvideo.c b/src/video/android/SDL_androidvideo.c
index 357f5cf..79c20f6 100644
--- a/src/video/android/SDL_androidvideo.c
+++ b/src/video/android/SDL_androidvideo.c
@@ -60,8 +60,10 @@ int Android_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float
/* These are filled in with real values in Android_SetScreenResolution on init (before SDL_main()) */
-int Android_ScreenWidth = 0;
-int Android_ScreenHeight = 0;
+int Android_SurfaceWidth = 0;
+int Android_SurfaceHeight = 0;
+int Android_DeviceWidth = 0;
+int Android_DeviceHeight = 0;
Uint32 Android_ScreenFormat = SDL_PIXELFORMAT_UNKNOWN;
static int Android_ScreenRate = 0;
@@ -176,8 +178,8 @@ Android_VideoInit(_THIS)
SDL_DisplayMode mode;
mode.format = Android_ScreenFormat;
- mode.w = Android_ScreenWidth;
- mode.h = Android_ScreenHeight;
+ mode.w = Android_DeviceWidth;
+ mode.h = Android_DeviceHeight;
mode.refresh_rate = Android_ScreenRate;
mode.driverdata = NULL;
if (SDL_AddBasicVideoDisplay(&mode) < 0) {
@@ -209,12 +211,14 @@ Android_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * h
}
void
-Android_SetScreenResolution(int width, int height, Uint32 format, float rate)
+Android_SetScreenResolution(int surfaceWidth, int surfaceHeight, int deviceWidth, int deviceHeight, Uint32 format, float rate)
{
SDL_VideoDevice* device;
SDL_VideoDisplay *display;
- Android_ScreenWidth = width;
- Android_ScreenHeight = height;
+ Android_SurfaceWidth = surfaceWidth;
+ Android_SurfaceHeight = surfaceHeight;
+ Android_DeviceWidth = deviceWidth;
+ Android_DeviceHeight = deviceHeight;
Android_ScreenFormat = format;
Android_ScreenRate = rate;
@@ -229,8 +233,8 @@ Android_SetScreenResolution(int width, int height, Uint32 format, float rate)
{
display = &device->displays[0];
display->desktop_mode.format = Android_ScreenFormat;
- display->desktop_mode.w = Android_ScreenWidth;
- display->desktop_mode.h = Android_ScreenHeight;
+ display->desktop_mode.w = Android_DeviceWidth;
+ display->desktop_mode.h = Android_DeviceHeight;
display->desktop_mode.refresh_rate = Android_ScreenRate;
}
@@ -240,12 +244,12 @@ Android_SetScreenResolution(int width, int height, Uint32 format, float rate)
display = SDL_GetDisplayForWindow(Android_Window);
display->display_modes[0].format = format;
- display->display_modes[0].w = width;
- display->display_modes[0].h = height;
+ display->display_modes[0].w = Android_DeviceWidth;
+ display->display_modes[0].h = Android_DeviceHeight;
display->display_modes[0].refresh_rate = rate;
display->current_mode = display->display_modes[0];
- SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_RESIZED, width, height);
+ SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_RESIZED, surfaceWidth, surfaceHeight);
}
}
diff --git a/src/video/android/SDL_androidvideo.h b/src/video/android/SDL_androidvideo.h
index a62c983..6dce7ed 100644
--- a/src/video/android/SDL_androidvideo.h
+++ b/src/video/android/SDL_androidvideo.h
@@ -28,7 +28,7 @@
#include "../SDL_sysvideo.h"
/* Called by the JNI layer when the screen changes size or format */
-extern void Android_SetScreenResolution(int width, int height, Uint32 format, float rate);
+extern void Android_SetScreenResolution(int surfaceWidth, int surfaceHeight, int deviceWidth, int deviceHeight, Uint32 format, float rate);
/* Private display data */
@@ -37,8 +37,10 @@ typedef struct SDL_VideoData
SDL_Rect textRect;
} SDL_VideoData;
-extern int Android_ScreenWidth;
-extern int Android_ScreenHeight;
+extern int Android_SurfaceWidth;
+extern int Android_SurfaceHeight;
+extern int Android_DeviceWidth;
+extern int Android_DeviceHeight;
extern Uint32 Android_ScreenFormat;
extern SDL_sem *Android_PauseSem, *Android_ResumeSem;
extern SDL_Window *Android_Window;
diff --git a/src/video/android/SDL_androidwindow.c b/src/video/android/SDL_androidwindow.c
index f1cbf58..1ac1a2a 100644
--- a/src/video/android/SDL_androidwindow.c
+++ b/src/video/android/SDL_androidwindow.c
@@ -49,8 +49,8 @@ Android_CreateWindow(_THIS, SDL_Window * window)
/* Adjust the window data to match the screen */
window->x = 0;
window->y = 0;
- window->w = Android_ScreenWidth;
- window->h = Android_ScreenHeight;
+ window->w = Android_SurfaceWidth;
+ window->h = Android_SurfaceHeight;
window->flags &= ~SDL_WINDOW_RESIZABLE; /* window is NEVER resizeable */
window->flags &= ~SDL_WINDOW_HIDDEN;