changeset 31035:5aae99fd6ca7

Fullscreen support for -vo gl using SDL.
author reimar
date Sun, 25 Apr 2010 09:24:30 +0000
parents 0382f000a688
children 272b88ce570e
files libvo/gl_common.c libvo/sdl_common.c libvo/sdl_common.h
diffstat 3 files changed, 40 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/gl_common.c	Sun Apr 25 08:40:28 2010 +0000
+++ b/libvo/gl_common.c	Sun Apr 25 09:24:30 2010 +0000
@@ -34,6 +34,7 @@
 #include <math.h>
 #include "gl_common.h"
 #include "csputils.h"
+#include "aspect.h"
 
 void (GLAPIENTRY *mpglBegin)(GLenum);
 void (GLAPIENTRY *mpglEnd)(void);
@@ -1887,10 +1888,21 @@
   return 0;
 }
 
+static void dummy_update_xinerama_info(void) {
+  if (vo_screenwidth <= 0 || vo_screenheight <= 0) {
+    mp_msg(MSGT_VO, MSGL_ERR, "You must specify the screen dimensions"
+                              "with -screenw and -screenh\n");
+    vo_screenwidth  = 1280;
+    vo_screenheight = 768;
+  }
+  aspect_save_screenres(vo_screenwidth, vo_screenheight);
+}
+
 int init_mpglcontext(MPGLContext *ctx, enum MPGLType type) {
   memset(ctx, 0, sizeof(*ctx));
   ctx->setGlWindow = setGlWindow_dummy;
   ctx->releaseGlContext = releaseGlContext_dummy;
+  ctx->update_xinerama_info = dummy_update_xinerama_info;
   ctx->check_events = dummy_check_events;
   ctx->type = type;
   switch (ctx->type) {
@@ -1924,6 +1936,7 @@
     ctx->setGlWindow = setGlWindow_sdl;
     ctx->swapGlBuffers = swapGlBuffers_sdl;
     ctx->check_events = sdl_check_events;
+    ctx->fullscreen = vo_sdl_fullscreen;
     return 1;
 #endif
   default:
--- a/libvo/sdl_common.c	Sun Apr 25 08:40:28 2010 +0000
+++ b/libvo/sdl_common.c	Sun Apr 25 09:24:30 2010 +0000
@@ -26,9 +26,34 @@
 #include "input/mouse.h"
 #include "video_out.h"
 
+static int old_w;
+static int old_h;
+static int mode_flags;
+
+void vo_sdl_fullscreen(void)
+{
+    if (vo_fs) {
+        vo_dwidth  = old_w;
+        vo_dheight = old_h;
+    } else {
+        old_w = vo_dwidth;
+        old_h = vo_dheight;
+        vo_dwidth  = vo_screenwidth;
+        vo_dheight = vo_screenheight;
+    }
+    vo_fs = !vo_fs;
+    sdl_set_mode(0, mode_flags);
+}
+
 int sdl_set_mode(int bpp, uint32_t flags)
 {
-    SDL_Surface *s = SDL_SetVideoMode(vo_dwidth, vo_dheight, bpp, flags);
+    SDL_Surface *s;
+    mode_flags = flags;
+    if (vo_fs) flags |= SDL_FULLSCREEN;
+    // doublebuf with opengl creates flickering
+    if (vo_doublebuffering && !(flags & SDL_OPENGL))
+        flags |= SDL_DOUBLEBUF;
+    s = SDL_SetVideoMode(vo_dwidth, vo_dheight, bpp, flags);
     if (!s) {
       mp_msg(MSGT_VO, MSGL_FATAL, "SDL SetVideoMode failed: %s\n", SDL_GetError());
       return -1;
--- a/libvo/sdl_common.h	Sun Apr 25 08:40:28 2010 +0000
+++ b/libvo/sdl_common.h	Sun Apr 25 09:24:30 2010 +0000
@@ -28,6 +28,7 @@
 #include <SDL.h>
 #endif
 
+void vo_sdl_fullscreen(void);
 int sdl_set_mode(int bpp, uint32_t flags);
 int sdl_default_handle_event(SDL_Event *event);