Add option for windowed fullscreen.

This commit is contained in:
Themaister 2012-10-05 14:15:54 +02:00
parent 45a5895abf
commit 6104ce2163
6 changed files with 27 additions and 9 deletions

View File

@ -155,7 +155,8 @@ static const float xscale = 3.0; // Real x res = aspect * base_size * xscale
static const float yscale = 3.0; // Real y res = base_size * yscale
// Fullscreen
static const bool fullscreen = false; // To start in Fullscreen or not
static const bool fullscreen = false; // To start in Fullscreen or not.
static const bool windowed_fullscreen = false; // To use windowed mode or not when going fullscreen.
static const unsigned fullscreen_x = 0; // Fullscreen resolution. A value of 0 uses the desktop resolution.
static const unsigned fullscreen_y = 0;

View File

@ -82,6 +82,7 @@ struct settings
float xscale;
float yscale;
bool fullscreen;
bool windowed_fullscreen;
unsigned fullscreen_x;
unsigned fullscreen_y;
bool vsync;

View File

@ -236,6 +236,9 @@ static bool gfx_ctx_set_video_mode(
sigaction(SIGINT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
bool windowed_full = g_settings.video.windowed_fullscreen;
bool true_full = false;
XSetWindowAttributes swa = {0};
XVisualInfo *vi = glXGetVisualFromFBConfig(g_dpy, g_fbc);
@ -247,22 +250,25 @@ static bool gfx_ctx_set_video_mode(
swa.event_mask = StructureNotifyMask;
swa.override_redirect = fullscreen ? True : False;
if (fullscreen)
if (fullscreen && !windowed_full)
{
if (x11_enter_fullscreen(g_dpy, width, height, &g_desktop_mode))
{
g_should_reset_mode = true;
true_full = true;
}
}
g_win = XCreateWindow(g_dpy, RootWindow(g_dpy, vi->screen),
0, 0, width ? width : 200, height ? height : 200, 0,
vi->depth, InputOutput, vi->visual,
CWBorderPixel | CWColormap | CWEventMask | (fullscreen && g_should_reset_mode ? CWOverrideRedirect : 0), &swa);
CWBorderPixel | CWColormap | CWEventMask | (true_full ? CWOverrideRedirect : 0), &swa);
XSetWindowBackground(g_dpy, g_win, 0);
gfx_ctx_update_window_title(true);
x11_hide_mouse(g_dpy, g_win);
if (fullscreen && g_should_reset_mode)
if (true_full)
{
XMapRaised(g_dpy, g_win);
XGrabKeyboard(g_dpy, g_win, True, GrabModeAsync, GrabModeAsync, CurrentTime);
@ -270,7 +276,7 @@ static bool gfx_ctx_set_video_mode(
else if (fullscreen) // We attempted true fullscreen, but failed. Attempt using windowed fullscreen.
{
XMapRaised(g_dpy, g_win);
RARCH_WARN("[GLX]: True fullscreen failed. Attempt using windowed fullscreen instead.\n");
RARCH_WARN("[GLX]: Using windowed fullscreen.\n");
x11_windowed_fullscreen(g_dpy, g_win);
}
else

View File

@ -259,6 +259,8 @@ static bool gfx_ctx_set_video_mode(
XVisualInfo temp = {0};
XSetWindowAttributes swa = {0};
XVisualInfo *vi = NULL;
bool windowed_full = g_settings.video.windowed_fullscreen;
bool true_full = false;
EGLint vid;
if (!eglGetConfigAttrib(g_egl_dpy, g_config, EGL_NATIVE_VISUAL_ID, &vid))
@ -276,16 +278,19 @@ static bool gfx_ctx_set_video_mode(
swa.event_mask = StructureNotifyMask;
swa.override_redirect = fullscreen ? True : False;
if (fullscreen)
if (fullscreen && !windowed_full)
{
if (x11_enter_fullscreen(g_dpy, width, height, &g_desktop_mode))
{
g_should_reset_mode = true;
true_full = true;
}
}
g_win = XCreateWindow(g_dpy, RootWindow(g_dpy, vi->screen),
0, 0, width ? width : 200, height ? height : 200, 0,
vi->depth, InputOutput, vi->visual,
CWBorderPixel | CWColormap | CWEventMask | (fullscreen && g_should_reset_mode ? CWOverrideRedirect : 0), &swa);
CWBorderPixel | CWColormap | CWEventMask | (fullscreen && true_full ? CWOverrideRedirect : 0), &swa);
XSetWindowBackground(g_dpy, g_win, 0);
// GLES 2.0. Don't use for any other API.
@ -310,7 +315,7 @@ static bool gfx_ctx_set_video_mode(
gfx_ctx_update_window_title(true);
x11_hide_mouse(g_dpy, g_win);
if (fullscreen && g_should_reset_mode)
if (true_full)
{
XMapRaised(g_dpy, g_win);
XGrabKeyboard(g_dpy, g_win, True, GrabModeAsync, GrabModeAsync, CurrentTime);
@ -318,7 +323,7 @@ static bool gfx_ctx_set_video_mode(
else if (fullscreen) // We attempted true fullscreen, but failed. Attempt using windowed fullscreen.
{
XMapRaised(g_dpy, g_win);
RARCH_WARN("[X/EGL]: True fullscreen failed. Attempt using windowed fullscreen instead.\n");
RARCH_WARN("[X/EGL]: Using windowed fullscreen.\n");
x11_windowed_fullscreen(g_dpy, g_win);
}
else

View File

@ -50,6 +50,9 @@
# Start in fullscreen. Can be changed at runtime.
# video_fullscreen = false
# If fullscreen, prefer using a windowed fullscreen mode.
# video_windowed_fullscreen = false
# Force 16-bit colors. Apparently some video cards in use today have troubles with 32-bit ...
# video_force_16bit = false

View File

@ -144,6 +144,7 @@ void config_set_defaults(void)
g_settings.video.xscale = xscale;
g_settings.video.yscale = yscale;
g_settings.video.fullscreen = g_extern.force_fullscreen ? true : fullscreen;
g_settings.video.windowed_fullscreen = windowed_fullscreen;
g_settings.video.fullscreen_x = fullscreen_x;
g_settings.video.fullscreen_y = fullscreen_y;
g_settings.video.force_16bit = force_16bit;
@ -370,6 +371,7 @@ bool config_load_file(const char *path)
if (!g_extern.force_fullscreen)
CONFIG_GET_BOOL(video.fullscreen, "video_fullscreen");
CONFIG_GET_BOOL(video.windowed_fullscreen, "video_windowed_fullscreen");
CONFIG_GET_BOOL(video.force_16bit, "video_force_16bit");
CONFIG_GET_BOOL(video.disable_composition, "video_disable_composition");
CONFIG_GET_BOOL(video.vsync, "video_vsync");