Add window.displayMode for fullscreen display mode switching
This commit is contained in:
@@ -1564,6 +1564,16 @@ namespace lime {
|
||||
}
|
||||
|
||||
|
||||
value lime_window_get_display_mode (value window) {
|
||||
|
||||
Window* targetWindow = (Window*)val_data (window);
|
||||
DisplayMode displayMode;
|
||||
targetWindow->GetDisplayMode (&displayMode);
|
||||
return displayMode.Value ();
|
||||
|
||||
}
|
||||
|
||||
|
||||
bool lime_window_get_enable_text_events (value window) {
|
||||
|
||||
Window* targetWindow = (Window*)val_data (window);
|
||||
@@ -1636,6 +1646,17 @@ namespace lime {
|
||||
}
|
||||
|
||||
|
||||
value lime_window_set_display_mode (value window, value displayMode) {
|
||||
|
||||
Window* targetWindow = (Window*)val_data (window);
|
||||
DisplayMode _displayMode (displayMode);
|
||||
targetWindow->SetDisplayMode (&_displayMode);
|
||||
targetWindow->GetDisplayMode (&_displayMode);
|
||||
return _displayMode.Value ();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void lime_window_set_enable_text_events (value window, bool enabled) {
|
||||
|
||||
Window* targetWindow = (Window*)val_data (window);
|
||||
@@ -1861,6 +1882,7 @@ namespace lime {
|
||||
DEFINE_PRIME2v (lime_window_event_manager_register);
|
||||
DEFINE_PRIME1v (lime_window_focus);
|
||||
DEFINE_PRIME1 (lime_window_get_display);
|
||||
DEFINE_PRIME1 (lime_window_get_display_mode);
|
||||
DEFINE_PRIME1 (lime_window_get_enable_text_events);
|
||||
DEFINE_PRIME1 (lime_window_get_height);
|
||||
DEFINE_PRIME1 (lime_window_get_id);
|
||||
@@ -1870,6 +1892,7 @@ namespace lime {
|
||||
DEFINE_PRIME3v (lime_window_move);
|
||||
DEFINE_PRIME3v (lime_window_resize);
|
||||
DEFINE_PRIME2 (lime_window_set_borderless);
|
||||
DEFINE_PRIME2 (lime_window_set_display_mode);
|
||||
DEFINE_PRIME2v (lime_window_set_enable_text_events);
|
||||
DEFINE_PRIME2 (lime_window_set_fullscreen);
|
||||
DEFINE_PRIME2v (lime_window_set_icon);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include <graphics/PixelFormat.h>
|
||||
#include <math/Rectangle.h>
|
||||
#include <system/Clipboard.h>
|
||||
#include <system/DisplayMode.h>
|
||||
#include <system/JNI.h>
|
||||
#include <system/System.h>
|
||||
|
||||
@@ -301,51 +302,69 @@ namespace lime {
|
||||
#endif
|
||||
alloc_field (display, id_dpi, alloc_float (dpi));
|
||||
|
||||
SDL_DisplayMode currentDisplayMode = { SDL_PIXELFORMAT_UNKNOWN, 0, 0, 0, 0 };
|
||||
SDL_DisplayMode displayMode = { SDL_PIXELFORMAT_UNKNOWN, 0, 0, 0, 0 };
|
||||
DisplayMode mode;
|
||||
|
||||
SDL_GetCurrentDisplayMode (id, ¤tDisplayMode);
|
||||
SDL_GetDesktopDisplayMode (id, &displayMode);
|
||||
|
||||
mode.height = displayMode.h;
|
||||
|
||||
switch (displayMode.format) {
|
||||
|
||||
case SDL_PIXELFORMAT_ARGB8888:
|
||||
|
||||
mode.pixelFormat = ARGB32;
|
||||
break;
|
||||
|
||||
case SDL_PIXELFORMAT_BGRA8888:
|
||||
case SDL_PIXELFORMAT_BGRX8888:
|
||||
|
||||
mode.pixelFormat = BGRA32;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
mode.pixelFormat = RGBA32;
|
||||
|
||||
}
|
||||
|
||||
mode.refreshRate = displayMode.refresh_rate;
|
||||
mode.width = displayMode.w;
|
||||
|
||||
alloc_field (display, id_currentMode, mode.Value ());
|
||||
|
||||
int numDisplayModes = SDL_GetNumDisplayModes (id);
|
||||
value supportedModes = alloc_array (numDisplayModes);
|
||||
value mode;
|
||||
|
||||
for (int i = 0; i < numDisplayModes; i++) {
|
||||
|
||||
SDL_GetDisplayMode (id, i, &displayMode);
|
||||
|
||||
if (displayMode.format == currentDisplayMode.format && displayMode.w == currentDisplayMode.w && displayMode.h == currentDisplayMode.h && displayMode.refresh_rate == currentDisplayMode.refresh_rate) {
|
||||
|
||||
alloc_field (display, id_currentMode, alloc_int (i));
|
||||
|
||||
}
|
||||
|
||||
mode = alloc_empty_object ();
|
||||
alloc_field (mode, id_height, alloc_int (displayMode.h));
|
||||
mode.height = displayMode.h;
|
||||
|
||||
switch (displayMode.format) {
|
||||
|
||||
case SDL_PIXELFORMAT_ARGB8888:
|
||||
|
||||
alloc_field (mode, id_pixelFormat, alloc_int (ARGB32));
|
||||
mode.pixelFormat = ARGB32;
|
||||
break;
|
||||
|
||||
case SDL_PIXELFORMAT_BGRA8888:
|
||||
case SDL_PIXELFORMAT_BGRX8888:
|
||||
|
||||
alloc_field (mode, id_pixelFormat, alloc_int (BGRA32));
|
||||
mode.pixelFormat = BGRA32;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
alloc_field (mode, id_pixelFormat, alloc_int (RGBA32));
|
||||
mode.pixelFormat = RGBA32;
|
||||
|
||||
}
|
||||
|
||||
alloc_field (mode, id_refreshRate, alloc_int (displayMode.refresh_rate));
|
||||
alloc_field (mode, id_width, alloc_int (displayMode.w));
|
||||
mode.refreshRate = displayMode.refresh_rate;
|
||||
mode.width = displayMode.w;
|
||||
|
||||
val_array_set_i (supportedModes, i, mode);
|
||||
val_array_set_i (supportedModes, i, mode.Value ());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
namespace lime {
|
||||
|
||||
|
||||
static bool displayModeSet = false;
|
||||
|
||||
|
||||
SDLWindow::SDLWindow (Application* application, int width, int height, int flags, const char* title) {
|
||||
|
||||
currentApplication = application;
|
||||
@@ -196,6 +199,38 @@ namespace lime {
|
||||
}
|
||||
|
||||
|
||||
void SDLWindow::GetDisplayMode (DisplayMode* displayMode) {
|
||||
|
||||
SDL_DisplayMode mode;
|
||||
SDL_GetWindowDisplayMode (sdlWindow, &mode);
|
||||
|
||||
displayMode->width = mode.w;
|
||||
displayMode->height = mode.h;
|
||||
|
||||
switch (mode.format) {
|
||||
|
||||
case SDL_PIXELFORMAT_ARGB8888:
|
||||
|
||||
displayMode->pixelFormat = ARGB32;
|
||||
break;
|
||||
|
||||
case SDL_PIXELFORMAT_BGRA8888:
|
||||
case SDL_PIXELFORMAT_BGRX8888:
|
||||
|
||||
displayMode->pixelFormat = BGRA32;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
displayMode->pixelFormat = RGBA32;
|
||||
|
||||
}
|
||||
|
||||
displayMode->refreshRate = mode.refresh_rate;
|
||||
|
||||
}
|
||||
|
||||
|
||||
bool SDLWindow::GetEnableTextEvents () {
|
||||
|
||||
return SDL_IsTextInputActive ();
|
||||
@@ -289,6 +324,45 @@ namespace lime {
|
||||
}
|
||||
|
||||
|
||||
void SDLWindow::SetDisplayMode (DisplayMode* displayMode) {
|
||||
|
||||
Uint32 pixelFormat = 0;
|
||||
|
||||
switch (displayMode->pixelFormat) {
|
||||
|
||||
case ARGB32:
|
||||
|
||||
pixelFormat = SDL_PIXELFORMAT_ARGB8888;
|
||||
break;
|
||||
|
||||
case BGRA32:
|
||||
|
||||
pixelFormat = SDL_PIXELFORMAT_BGRA8888;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
pixelFormat = SDL_PIXELFORMAT_RGBA8888;
|
||||
|
||||
}
|
||||
|
||||
SDL_DisplayMode mode = { pixelFormat, displayMode->width, displayMode->height, displayMode->refreshRate, 0 };
|
||||
|
||||
if (SDL_SetWindowDisplayMode (sdlWindow, &mode) == 0) {
|
||||
|
||||
displayModeSet = true;
|
||||
|
||||
if (SDL_GetWindowFlags (sdlWindow) & SDL_WINDOW_FULLSCREEN_DESKTOP) {
|
||||
|
||||
SDL_SetWindowFullscreen (sdlWindow, SDL_WINDOW_FULLSCREEN);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void SDLWindow::SetEnableTextEvents (bool enabled) {
|
||||
|
||||
if (enabled) {
|
||||
@@ -308,7 +382,15 @@ namespace lime {
|
||||
|
||||
if (fullscreen) {
|
||||
|
||||
SDL_SetWindowFullscreen (sdlWindow, SDL_WINDOW_FULLSCREEN_DESKTOP);
|
||||
if (displayModeSet) {
|
||||
|
||||
SDL_SetWindowFullscreen (sdlWindow, SDL_WINDOW_FULLSCREEN);
|
||||
|
||||
} else {
|
||||
|
||||
SDL_SetWindowFullscreen (sdlWindow, SDL_WINDOW_FULLSCREEN_DESKTOP);
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ namespace lime {
|
||||
virtual void Close ();
|
||||
virtual void Focus ();
|
||||
virtual int GetDisplay ();
|
||||
virtual void GetDisplayMode (DisplayMode* displayMode);
|
||||
virtual bool GetEnableTextEvents ();
|
||||
virtual int GetHeight ();
|
||||
virtual uint32_t GetID ();
|
||||
@@ -30,6 +31,7 @@ namespace lime {
|
||||
virtual void Move (int x, int y);
|
||||
virtual void Resize (int width, int height);
|
||||
virtual bool SetBorderless (bool borderless);
|
||||
virtual void SetDisplayMode (DisplayMode* displayMode);
|
||||
virtual void SetEnableTextEvents (bool enabled);
|
||||
virtual bool SetFullscreen (bool fullscreen);
|
||||
virtual void SetIcon (ImageBuffer *imageBuffer);
|
||||
|
||||
66
project/src/system/DisplayMode.cpp
Normal file
66
project/src/system/DisplayMode.cpp
Normal file
@@ -0,0 +1,66 @@
|
||||
#include <system/DisplayMode.h>
|
||||
|
||||
|
||||
namespace lime {
|
||||
|
||||
|
||||
static int id_height;
|
||||
static int id_pixelFormat;
|
||||
static int id_refreshRate;
|
||||
static int id_width;
|
||||
static bool init = false;
|
||||
|
||||
|
||||
DisplayMode::DisplayMode () {
|
||||
|
||||
width = 0;
|
||||
height = 0;
|
||||
pixelFormat = RGBA32;
|
||||
refreshRate = 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
DisplayMode::DisplayMode (value displayMode) {
|
||||
|
||||
width = val_int (val_field (displayMode, id_width));
|
||||
height = val_int (val_field (displayMode, id_height));
|
||||
pixelFormat = (PixelFormat)val_int (val_field (displayMode, id_pixelFormat));
|
||||
refreshRate = val_int (val_field (displayMode, id_refreshRate));
|
||||
|
||||
}
|
||||
|
||||
|
||||
DisplayMode::DisplayMode (int _width, int _height, PixelFormat _pixelFormat, int _refreshRate) {
|
||||
|
||||
width = _width;
|
||||
height = _height;
|
||||
pixelFormat = _pixelFormat;
|
||||
refreshRate = _refreshRate;
|
||||
|
||||
}
|
||||
|
||||
|
||||
value DisplayMode::Value () {
|
||||
|
||||
if (!init) {
|
||||
|
||||
id_height = val_id ("height");
|
||||
id_pixelFormat = val_id ("pixelFormat");
|
||||
id_refreshRate = val_id ("refreshRate");
|
||||
id_width = val_id ("width");
|
||||
init = true;
|
||||
|
||||
}
|
||||
|
||||
value displayMode = alloc_empty_object ();
|
||||
alloc_field (displayMode, id_height, alloc_int (height));
|
||||
alloc_field (displayMode, id_pixelFormat, alloc_int (pixelFormat));
|
||||
alloc_field (displayMode, id_refreshRate, alloc_int (refreshRate));
|
||||
alloc_field (displayMode, id_width, alloc_int (width));
|
||||
return displayMode;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user