]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_sdl.c
add DeviceLost and DeviceRestored functions to R_Modules system
[xonotic/darkplaces.git] / vid_sdl.c
index 56d1ad6129505c5701d37550b388d899d0baebf4..4d9153b4f5b9a9c366dac30c11ccd02d9d775676 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,
@@ -370,7 +388,7 @@ void Sys_SendKeyEvents( void )
                                break;
                        case SDL_KEYDOWN:
                        case SDL_KEYUP:
-                               Key_Event( MapKey( event.key.keysym.sym ), (char)event.key.keysym.unicode, (event.key.state == SDL_PRESSED) );
+                               Key_Event( MapKey( event.key.keysym.sym ), event.key.keysym.unicode, (event.key.state == SDL_PRESSED) );
                                break;
                        case SDL_ACTIVEEVENT:
                                if( event.active.state & SDL_APPACTIVE )
@@ -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, NULL, NULL);
+#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;
        }
@@ -729,7 +761,6 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra
 
        gl_platform = "SDL";
        gl_platformextensions = "";
-       gl_videosyncavailable = true;
 
        GL_Init();
 
@@ -798,7 +829,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)
@@ -808,3 +839,25 @@ void VID_Finish (void)
                SDL_GL_SwapBuffers();
        }
 }
+
+size_t VID_ListModes(vid_mode_t *modes, size_t maxcount)
+{
+       size_t k;
+       SDL_Rect **vidmodes;
+       int bpp = SDL_GetVideoInfo()->vfmt->BitsPerPixel;
+
+       k = 0;
+       for(vidmodes = SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_HWSURFACE); *vidmodes; ++vidmodes)
+       {
+               if(k >= maxcount)
+                       break;
+               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;
+               modes[k].pixelheight_denom = 1; // SDL does not provide this
+               ++k;
+       }
+       return k;
+}