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.
parent
db86e7a633
commit
fe196db774
|
@ -556,7 +556,7 @@ public class SDLActivity extends Activity {
|
||||||
public static native void nativePause();
|
public static native void nativePause();
|
||||||
public static native void nativeResume();
|
public static native void nativeResume();
|
||||||
public static native void onNativeDropFile(String filename);
|
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 onNativeKeyDown(int keycode);
|
||||||
public static native void onNativeKeyUp(int keycode);
|
public static native void onNativeKeyUp(int keycode);
|
||||||
public static native void onNativeKeyboardFocusLost();
|
public static native void onNativeKeyboardFocusLost();
|
||||||
|
@ -1378,8 +1378,23 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
|
||||||
|
|
||||||
mWidth = width;
|
mWidth = width;
|
||||||
mHeight = height;
|
mHeight = height;
|
||||||
SDLActivity.onNativeResize(width, height, sdlFormat, mDisplay.getRefreshRate());
|
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", "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;
|
boolean skip = false;
|
||||||
|
|
|
@ -76,7 +76,8 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeDropFile)(
|
||||||
|
|
||||||
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeResize)(
|
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeResize)(
|
||||||
JNIEnv* env, jclass jcls,
|
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)(
|
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceChanged)(
|
||||||
JNIEnv* env, jclass jcls);
|
JNIEnv* env, jclass jcls);
|
||||||
|
@ -518,9 +519,10 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeDropFile)(
|
||||||
/* Resize */
|
/* Resize */
|
||||||
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeResize)(
|
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeResize)(
|
||||||
JNIEnv* env, jclass jcls,
|
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 */
|
/* Paddown */
|
||||||
|
|
|
@ -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()) */
|
/* These are filled in with real values in Android_SetScreenResolution on init (before SDL_main()) */
|
||||||
int Android_ScreenWidth = 0;
|
int Android_SurfaceWidth = 0;
|
||||||
int Android_ScreenHeight = 0;
|
int Android_SurfaceHeight = 0;
|
||||||
|
int Android_DeviceWidth = 0;
|
||||||
|
int Android_DeviceHeight = 0;
|
||||||
Uint32 Android_ScreenFormat = SDL_PIXELFORMAT_UNKNOWN;
|
Uint32 Android_ScreenFormat = SDL_PIXELFORMAT_UNKNOWN;
|
||||||
static int Android_ScreenRate = 0;
|
static int Android_ScreenRate = 0;
|
||||||
|
|
||||||
|
@ -176,8 +178,8 @@ Android_VideoInit(_THIS)
|
||||||
SDL_DisplayMode mode;
|
SDL_DisplayMode mode;
|
||||||
|
|
||||||
mode.format = Android_ScreenFormat;
|
mode.format = Android_ScreenFormat;
|
||||||
mode.w = Android_ScreenWidth;
|
mode.w = Android_DeviceWidth;
|
||||||
mode.h = Android_ScreenHeight;
|
mode.h = Android_DeviceHeight;
|
||||||
mode.refresh_rate = Android_ScreenRate;
|
mode.refresh_rate = Android_ScreenRate;
|
||||||
mode.driverdata = NULL;
|
mode.driverdata = NULL;
|
||||||
if (SDL_AddBasicVideoDisplay(&mode) < 0) {
|
if (SDL_AddBasicVideoDisplay(&mode) < 0) {
|
||||||
|
@ -209,12 +211,14 @@ Android_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * h
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
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_VideoDevice* device;
|
||||||
SDL_VideoDisplay *display;
|
SDL_VideoDisplay *display;
|
||||||
Android_ScreenWidth = width;
|
Android_SurfaceWidth = surfaceWidth;
|
||||||
Android_ScreenHeight = height;
|
Android_SurfaceHeight = surfaceHeight;
|
||||||
|
Android_DeviceWidth = deviceWidth;
|
||||||
|
Android_DeviceHeight = deviceHeight;
|
||||||
Android_ScreenFormat = format;
|
Android_ScreenFormat = format;
|
||||||
Android_ScreenRate = rate;
|
Android_ScreenRate = rate;
|
||||||
|
|
||||||
|
@ -229,8 +233,8 @@ Android_SetScreenResolution(int width, int height, Uint32 format, float rate)
|
||||||
{
|
{
|
||||||
display = &device->displays[0];
|
display = &device->displays[0];
|
||||||
display->desktop_mode.format = Android_ScreenFormat;
|
display->desktop_mode.format = Android_ScreenFormat;
|
||||||
display->desktop_mode.w = Android_ScreenWidth;
|
display->desktop_mode.w = Android_DeviceWidth;
|
||||||
display->desktop_mode.h = Android_ScreenHeight;
|
display->desktop_mode.h = Android_DeviceHeight;
|
||||||
display->desktop_mode.refresh_rate = Android_ScreenRate;
|
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 = SDL_GetDisplayForWindow(Android_Window);
|
||||||
|
|
||||||
display->display_modes[0].format = format;
|
display->display_modes[0].format = format;
|
||||||
display->display_modes[0].w = width;
|
display->display_modes[0].w = Android_DeviceWidth;
|
||||||
display->display_modes[0].h = height;
|
display->display_modes[0].h = Android_DeviceHeight;
|
||||||
display->display_modes[0].refresh_rate = rate;
|
display->display_modes[0].refresh_rate = rate;
|
||||||
display->current_mode = display->display_modes[0];
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
#include "../SDL_sysvideo.h"
|
#include "../SDL_sysvideo.h"
|
||||||
|
|
||||||
/* Called by the JNI layer when the screen changes size or format */
|
/* 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 */
|
/* Private display data */
|
||||||
|
|
||||||
|
@ -37,8 +37,10 @@ typedef struct SDL_VideoData
|
||||||
SDL_Rect textRect;
|
SDL_Rect textRect;
|
||||||
} SDL_VideoData;
|
} SDL_VideoData;
|
||||||
|
|
||||||
extern int Android_ScreenWidth;
|
extern int Android_SurfaceWidth;
|
||||||
extern int Android_ScreenHeight;
|
extern int Android_SurfaceHeight;
|
||||||
|
extern int Android_DeviceWidth;
|
||||||
|
extern int Android_DeviceHeight;
|
||||||
extern Uint32 Android_ScreenFormat;
|
extern Uint32 Android_ScreenFormat;
|
||||||
extern SDL_sem *Android_PauseSem, *Android_ResumeSem;
|
extern SDL_sem *Android_PauseSem, *Android_ResumeSem;
|
||||||
extern SDL_Window *Android_Window;
|
extern SDL_Window *Android_Window;
|
||||||
|
|
|
@ -49,8 +49,8 @@ Android_CreateWindow(_THIS, SDL_Window * window)
|
||||||
/* Adjust the window data to match the screen */
|
/* Adjust the window data to match the screen */
|
||||||
window->x = 0;
|
window->x = 0;
|
||||||
window->y = 0;
|
window->y = 0;
|
||||||
window->w = Android_ScreenWidth;
|
window->w = Android_SurfaceWidth;
|
||||||
window->h = Android_ScreenHeight;
|
window->h = Android_SurfaceHeight;
|
||||||
|
|
||||||
window->flags &= ~SDL_WINDOW_RESIZABLE; /* window is NEVER resizeable */
|
window->flags &= ~SDL_WINDOW_RESIZABLE; /* window is NEVER resizeable */
|
||||||
window->flags &= ~SDL_WINDOW_HIDDEN;
|
window->flags &= ~SDL_WINDOW_HIDDEN;
|
||||||
|
|
Loading…
Reference in New Issue