X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=vid_sdl.c;h=0bdfbf5517237e8bb5b8afeeb88975442880b535;hp=af30f9cb7059451baeba06a3eff2be2edc98178e;hb=a2535521709ba873592188925ed1c9c170eb662c;hpb=f9dcdc3e0de79608d613dc34c5bb1d14c32fa8a8 diff --git a/vid_sdl.c b/vid_sdl.c index af30f9cb..0bdfbf55 100644 --- a/vid_sdl.c +++ b/vid_sdl.c @@ -28,7 +28,7 @@ int cl_available = true; qboolean vid_supportrefreshrate = false; cvar_t joy_detected = {CVAR_READONLY, "joy_detected", "0", "number of joysticks detected by engine"}; -cvar_t joy_enable = {0, "joy_enable", "1", "enables joystick support"}; +cvar_t joy_enable = {CVAR_SAVE, "joy_enable", "0", "enables joystick support"}; cvar_t joy_index = {0, "joy_index", "0", "selects which joystick to use if you have multiple"}; cvar_t joy_axisforward = {0, "joy_axisforward", "1", "which joystick axis to query for forward/backward movement"}; cvar_t joy_axisside = {0, "joy_axisside", "0", "which joystick axis to query for right/left movement"}; @@ -49,13 +49,16 @@ cvar_t joy_sensitivitypitch = {0, "joy_sensitivitypitch", "1", "movement multipl cvar_t joy_sensitivityyaw = {0, "joy_sensitivityyaw", "-1", "movement multiplier"}; cvar_t joy_sensitivityroll = {0, "joy_sensitivityroll", "1", "movement multiplier"}; - static qboolean vid_usingmouse; static qboolean vid_isfullscreen; static int vid_numjoysticks = 0; #define MAX_JOYSTICKS 8 static SDL_Joystick *vid_joysticks[MAX_JOYSTICKS]; +static int win_half_width = 50; +static int win_half_height = 50; +static int video_bpp, video_flags; + static SDL_Surface *screen; ///////////////////////// @@ -231,22 +234,24 @@ static int MapKey( unsigned int sdlkey ) static void IN_Activate( qboolean grab ) { + //SDL_WM_GrabInput( SDL_GRAB_OFF ); + //Con_Printf("< Turning off input-grabbing. --blub\n"); if (grab) { if (!vid_usingmouse) { vid_usingmouse = true; - cl_ignoremousemove = true; + cl_ignoremousemoves = 2; SDL_WM_GrabInput( SDL_GRAB_ON ); SDL_ShowCursor( SDL_DISABLE ); - } + } } else { if (vid_usingmouse) { vid_usingmouse = false; - cl_ignoremousemove = true; + cl_ignoremousemoves = 2; SDL_WM_GrabInput( SDL_GRAB_OFF ); SDL_ShowCursor( SDL_ENABLE ); } @@ -268,12 +273,37 @@ static double IN_JoystickGetAxis(SDL_Joystick *joy, int axis, double sensitivity void IN_Move( void ) { int j; + static int old_x = 0, old_y = 0; + static int stuck = 0; int x, y; if( vid_usingmouse ) { - SDL_GetRelativeMouseState( &x, &y ); - in_mouse_x = x; - in_mouse_y = y; + if(vid_stick_mouse.integer) + { + // have the mouse stuck in the middle, example use: prevent expose effect of beryl during the game when not using + // window grabbing. --blub + + // we need 2 frames to initialize the center position + if(!stuck) + { + SDL_WarpMouse(win_half_width, win_half_height); + SDL_GetMouseState(&x, &y); + SDL_GetRelativeMouseState(&x, &y); + ++stuck; + } else { + SDL_GetRelativeMouseState(&x, &y); + in_mouse_x = x + old_x; + in_mouse_y = y + old_y; + SDL_GetMouseState(&x, &y); + old_x = x - win_half_width; + old_y = y - win_half_height; + SDL_WarpMouse(win_half_width, win_half_height); + } + } else { + SDL_GetRelativeMouseState( &x, &y ); + in_mouse_x = x; + in_mouse_y = y; + } } if (vid_numjoysticks && joy_enable.integer && joy_index.integer >= 0 && joy_index.integer < vid_numjoysticks) { @@ -341,7 +371,7 @@ void Sys_SendKeyEvents( void ) while( SDL_PollEvent( &event ) ) switch( event.type ) { case SDL_QUIT: - Sys_Quit(); + Sys_Quit(0); break; case SDL_KEYDOWN: case SDL_KEYUP: @@ -368,18 +398,32 @@ void Sys_SendKeyEvents( void ) if (event.jbutton.button < 48) Key_Event( event.jbutton.button + (event.jbutton.button < 16 ? K_JOY1 : K_AUX1 - 16), 0, (event.jbutton.state == SDL_PRESSED) ); break; + case SDL_VIDEORESIZE: + if(vid_resizable.integer < 2) + { + vid.width = event.resize.w; + vid.height = event.resize.h; + SDL_SetVideoMode(vid.width, vid.height, video_bpp, video_flags); + } + break; } // enable/disable sound on focus gain/loss - if (!vid_activewindow && sound_active) + if (!vid_hidden && (vid_activewindow || !snd_mutewhenidle.integer)) { - S_BlockSound (); - sound_active = false; + if (!sound_active) + { + S_UnblockSound (); + sound_active = true; + } } - else if (vid_activewindow && !sound_active) + else { - S_UnblockSound (); - sound_active = true; + if (sound_active) + { + S_BlockSound (); + sound_active = false; + } } } @@ -453,7 +497,116 @@ static void VID_SetCaption() #endif SetClassLongPtr( info.window, GCLP_HICON, (LONG_PTR)icon ); } +static void VID_SetIcon() +{ +} #else +// Adding the OS independent XPM version --blub +#include "darkplaces.xpm" +#include "nexuiz.xpm" +static SDL_Surface *icon = NULL; +static void VID_SetIcon() +{ + /* + * Somewhat restricted XPM reader. Only supports XPMs saved by GIMP 2.4 at + * default settings with less than 91 colors and transparency. + */ + + int width, height, colors, isize, i, j; + int thenone = -1; + static SDL_Color palette[256]; + unsigned short palenc[256]; // store color id by char + + char **idata = ENGINE_ICON; + char *data = idata[0]; + + if(sscanf(data, "%i %i %i %i", &width, &height, &colors, &isize) != 4) + { + // NOTE: Only 1-char colornames are supported + Con_Printf("Sorry, but this does not even look similar to an XPM.\n"); + return; + } + + if(isize != 1) + { + // NOTE: Only 1-char colornames are supported + Con_Printf("This XPM's palette is either huge or idiotically unoptimized. It's key size is %i\n", isize); + return; + } + + for(i = 0; i < colors; ++i) + { + int r, g, b; + char idx; + + if(sscanf(idata[i+1], "%c c #%02x%02x%02x", &idx, &r, &g, &b) != 4) + { + char foo[2]; + if(sscanf(idata[i+1], "%c c Non%1[e]", &idx, foo) != 2) // I take the DailyWTF credit for this. --div0 + { + Con_Printf("This XPM's palette looks odd. Can't continue.\n"); + return; + } + else + { + palette[i].r = 255; // color key + palette[i].g = 0; + palette[i].b = 255; + thenone = i; // weeeee + } + } + else + { + palette[i].r = r - (r == 255 && g == 0 && b == 255); // change 255/0/255 pink to 254/0/255 for color key + palette[i].g = g; + palette[i].b = b; + } + + palenc[(unsigned char) idx] = i; + } + + // allocate the image data + data = (char*) malloc(width*height); + + for(j = 0; j < height; ++j) + { + for(i = 0; i < width; ++i) + { + // casting to the safest possible datatypes ^^ + data[j * width + i] = palenc[((unsigned char*)idata[colors+j+1])[i]]; + } + } + + if(icon != NULL) + { + // SDL_FreeSurface should free the data too + // but for completeness' sake... + if(icon->flags & SDL_PREALLOC) + { + free(icon->pixels); + icon->pixels = NULL; // safety + } + SDL_FreeSurface(icon); + } + + icon = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, width, height, 8, 0,0,0,0);// rmask, gmask, bmask, amask); no mask needed + // 8 bit surfaces get an empty palette allocated according to the docs + // so it's a palette image for sure :) no endian check necessary for the mask + + if(icon == NULL) { + Con_Printf( "Failed to create surface for the window Icon!\n" + "%s\n", SDL_GetError()); + free(data); + return; + } + icon->pixels = data; + SDL_SetPalette(icon, SDL_PHYSPAL|SDL_LOGPAL, palette, 0, colors); + SDL_SetColorKey(icon, SDL_SRCCOLORKEY, thenone); + + SDL_WM_SetIcon(icon, NULL); +} + + static void VID_SetCaption() { SDL_WM_SetCaption( gamename, NULL ); @@ -477,6 +630,12 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate int flags = SDL_OPENGL; const char *drivername; + win_half_width = width>>1; + win_half_height = height>>1; + + if(vid_resizable.integer) + flags |= SDL_RESIZABLE; + VID_OutputVersion(); /* @@ -500,7 +659,7 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate Con_Printf("Unable to load GL driver \"%s\": %s\n", drivername, SDL_GetError()); return false; } - + if ((qglGetString = (const GLubyte* (GLAPIENTRY *)(GLenum name))GL_GetProcAddress("glGetString")) == NULL) { VID_Shutdown(); @@ -515,6 +674,7 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate flags |= SDL_FULLSCREEN; vid_isfullscreen = true; } + //flags |= SDL_HWSURFACE; SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); if (bpp >= 32) @@ -536,7 +696,11 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate if (stereobuffer) SDL_GL_SetAttribute (SDL_GL_STEREO, 1); + video_bpp = bpp; + video_flags = flags; + VID_SetIcon(); screen = SDL_SetVideoMode(width, height, bpp, flags); + if (screen == NULL) { Con_Printf("Failed to set video mode to %ix%i: %s\n", width, height, SDL_GetError()); @@ -563,6 +727,12 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate gl_platformextensions = ""; gl_videosyncavailable = false; + Con_DPrintf("GL_VENDOR: %s\n", gl_vendor); + Con_DPrintf("GL_RENDERER: %s\n", gl_renderer); + Con_DPrintf("GL_VERSION: %s\n", gl_version); + Con_DPrintf("GL_EXTENSIONS: %s\n", gl_extensions); + Con_DPrintf("%s_EXTENSIONS: %s\n", gl_platform, gl_platformextensions); + GL_Init(); vid_numjoysticks = SDL_NumJoysticks(); @@ -585,6 +755,8 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate vid_hidden = false; vid_activewindow = false; vid_usingmouse = false; + + SDL_WM_GrabInput(SDL_GRAB_OFF); return true; }