]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_sdl.c
changed VID_InitMode to take a viddef_mode_t structure which contains
[xonotic/darkplaces.git] / vid_sdl.c
index fe1a3605c71565421eb71faee583db337927ab1f..c368bbc126f650cd257891f824c096a6479a4d46 100644 (file)
--- a/vid_sdl.c
+++ b/vid_sdl.c
@@ -22,6 +22,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include "quakedef.h"
 
+#ifdef WIN32
+#define SDL_R_RESTART
+#endif
+
 // Tell startup code that we have a client
 int cl_available = true;
 
@@ -336,6 +340,20 @@ static int Sys_EventFilter( SDL_Event *event )
        return 1;
 }
 
+#ifdef SDL_R_RESTART
+static qboolean sdl_needs_restart;
+static void sdl_start(void)
+{
+}
+static void sdl_shutdown(void)
+{
+       sdl_needs_restart = false;
+}
+static void sdl_newmap(void)
+{
+}
+#endif
+
 static keynum_t buttonremap[18] =
 {
        K_MOUSE1,
@@ -399,12 +417,21 @@ void Sys_SendKeyEvents( void )
                                        vid.width = event.resize.w;
                                        vid.height = event.resize.h;
                                        SDL_SetVideoMode(vid.width, vid.height, video_bpp, video_flags);
+#ifdef SDL_R_RESTART
+                                       // better not call R_Modules_Restart from here directly, as this may wreak havoc...
+                                       // so, let's better queue it for next frame
+                                       if(!sdl_needs_restart)
+                                       {
+                                               Cbuf_AddText("\nr_restart\n");
+                                               sdl_needs_restart = true;
+                                       }
+#endif
                                }
                                break;
                }
 
        // enable/disable sound on focus gain/loss
-       if (!vid_hidden && (vid_activewindow || !snd_mutewhenidle.integer))
+       if ((!vid_hidden && vid_activewindow) || !snd_mutewhenidle.integer)
        {
                if (!sound_active)
                {
@@ -435,6 +462,7 @@ void *GL_GetProcAddress(const char *name)
 
 static int Sys_EventFilter( SDL_Event *event );
 static qboolean vid_sdl_initjoysticksystem = false;
+
 void VID_Init (void)
 {
        Cvar_RegisterVariable(&joy_detected);
@@ -458,6 +486,10 @@ void VID_Init (void)
        Cvar_RegisterVariable(&joy_sensitivitypitch);
        Cvar_RegisterVariable(&joy_sensitivityyaw);
        //Cvar_RegisterVariable(&joy_sensitivityroll);
+       
+#ifdef SDL_R_RESTART
+       R_RegisterModule("SDL", sdl_start, sdl_shutdown, sdl_newmap);
+#endif
 
        if (SDL_Init(SDL_INIT_VIDEO) < 0)
                Sys_Error ("Failed to init SDL video subsystem: %s", SDL_GetError());
@@ -471,7 +503,7 @@ void VID_Init (void)
 #ifdef WIN32
 #include "resource.h"
 #include <SDL_syswm.h>
-static void VID_SetCaption()
+static void VID_SetCaption(void)
 {
     SDL_SysWMinfo      info;
        HICON                   icon;
@@ -498,7 +530,7 @@ static void VID_SetCaption()
 #endif
        SetClassLongPtr( info.window, GCLP_HICON, (LONG_PTR)icon );
 }
-static void VID_SetIcon()
+static void VID_SetIcon(void)
 {
 }
 #else
@@ -506,7 +538,7 @@ static void VID_SetIcon()
 #include "darkplaces.xpm"
 #include "nexuiz.xpm"
 static SDL_Surface *icon = NULL;
-static void VID_SetIcon()
+static void VID_SetIcon(void)
 {
        /*
         * Somewhat restricted XPM reader. Only supports XPMs saved by GIMP 2.4 at
@@ -608,13 +640,13 @@ static void VID_SetIcon()
 }
 
 
-static void VID_SetCaption()
+static void VID_SetCaption(void)
 {
        SDL_WM_SetCaption( gamename, NULL );
 }
 #endif
 
-static void VID_OutputVersion()
+static void VID_OutputVersion(void)
 {
        const SDL_version *version;
        version = SDL_Linked_Version();
@@ -624,15 +656,15 @@ static void VID_OutputVersion()
                                        version->major, version->minor, version->patch );
 }
 
-int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshrate, int stereobuffer, int samples)
+qboolean VID_InitMode(viddef_mode_t *mode)
 {
        int i;
        static int notfirstvideomode = false;
        int flags = SDL_OPENGL;
        const char *drivername;
 
-       win_half_width = *width>>1;
-       win_half_height = *height>>1;
+       win_half_width = mode->width>>1;
+       win_half_height = mode->height>>1;
 
        if(vid_resizable.integer)
                flags |= SDL_RESIZABLE;
@@ -671,14 +703,14 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra
        // Knghtbrd: should do platform-specific extension string function here
 
        vid_isfullscreen = false;
-       if (fullscreen) {
+       if (mode->fullscreen) {
                flags |= SDL_FULLSCREEN;
                vid_isfullscreen = true;
        }
        //flags |= SDL_HWSURFACE;
 
        SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
-       if (bpp >= 32)
+       if (mode->bitsperpixel >= 32)
        {
                SDL_GL_SetAttribute (SDL_GL_RED_SIZE, 8);
                SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 8);
@@ -694,26 +726,26 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra
                SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5);
                SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 16);
        }
-       if (stereobuffer)
+       if (mode->stereobuffer)
                SDL_GL_SetAttribute (SDL_GL_STEREO, 1);
        if (vid_vsync.integer)
                SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1);
        else
                SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 0);
-       if (samples > 1)
+       if (mode->samples > 1)
        {
                SDL_GL_SetAttribute (SDL_GL_MULTISAMPLEBUFFERS, 1);
-               SDL_GL_SetAttribute (SDL_GL_MULTISAMPLESAMPLES, samples);
+               SDL_GL_SetAttribute (SDL_GL_MULTISAMPLESAMPLES, mode->samples);
        }
 
-       video_bpp = bpp;
+       video_bpp = mode->bitsperpixel;
        video_flags = flags;
        VID_SetIcon();
-       screen = SDL_SetVideoMode(*width, *height, bpp, flags);
+       screen = SDL_SetVideoMode(mode->width, mode->height, mode->bitsperpixel, flags);
 
        if (screen == NULL)
        {
-               Con_Printf("Failed to set video mode to %ix%i: %s\n", *width, *height, SDL_GetError());
+               Con_Printf("Failed to set video mode to %ix%i: %s\n", mode->width, mode->height, SDL_GetError());
                VID_Shutdown();
                return false;
        }
@@ -798,7 +830,7 @@ void VID_Finish (void)
 
        VID_UpdateGamma(false, 256);
 
-       if (r_render.integer && !vid_hidden)
+       if (!vid_hidden)
        {
                CHECKGLERROR
                if (r_speeds.integer == 2 || gl_finish.integer)
@@ -811,7 +843,6 @@ void VID_Finish (void)
 
 size_t VID_ListModes(vid_mode_t *modes, size_t maxcount)
 {
-       int i;
        size_t k;
        SDL_Rect **vidmodes;
        int bpp = SDL_GetVideoInfo()->vfmt->BitsPerPixel;
@@ -821,8 +852,8 @@ size_t VID_ListModes(vid_mode_t *modes, size_t maxcount)
        {
                if(k >= maxcount)
                        break;
-               modes[k].width = vidmodes[i]->w;
-               modes[k].height = vidmodes[i]->h;
+               modes[k].width = (*vidmodes)->w;
+               modes[k].height = (*vidmodes)->h;
                modes[k].bpp = bpp;
                modes[k].refreshrate = 60; // no support for refresh rate in SDL
                modes[k].pixelheight_num = 1;