New format for mapper handlers to support keeping keys pressed.
Better support for double buffering with surface output with the new cached scalers Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2491
This commit is contained in:
parent
4a0acfb45a
commit
2fb65fe0ee
1 changed files with 66 additions and 43 deletions
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/* $Id: sdlmain.cpp,v 1.101 2006-02-12 13:19:58 qbix79 Exp $ */
|
||||
/* $Id: sdlmain.cpp,v 1.102 2006-02-12 23:39:37 harekiet Exp $ */
|
||||
|
||||
#ifndef _GNU_SOURCE
|
||||
#define _GNU_SOURCE
|
||||
|
@ -180,13 +180,12 @@ struct SDL_Block {
|
|||
#endif
|
||||
} opengl;
|
||||
#endif
|
||||
#if (HAVE_DDRAW_H) && defined(WIN32)
|
||||
struct {
|
||||
SDL_Surface * surface;
|
||||
#if (HAVE_DDRAW_H) && defined(WIN32)
|
||||
RECT rect;
|
||||
DDBLTFX fx;
|
||||
} blit;
|
||||
#endif
|
||||
} blit;
|
||||
struct {
|
||||
PRIORITY_LEVELS focus;
|
||||
PRIORITY_LEVELS nofocus;
|
||||
|
@ -206,7 +205,6 @@ struct SDL_Block {
|
|||
};
|
||||
|
||||
static SDL_Block sdl;
|
||||
static void CaptureMouse(void);
|
||||
|
||||
extern char * RunningProgram;
|
||||
//Globals for keyboard initialisation
|
||||
|
@ -378,6 +376,11 @@ Bitu GFX_SetSize(Bitu width,Bitu height,Bitu flags,double scalex,double scaley,G
|
|||
|
||||
Bitu bpp;
|
||||
Bitu retFlags;
|
||||
|
||||
if (sdl.blit.surface) {
|
||||
SDL_FreeSurface(sdl.blit.surface);
|
||||
sdl.blit.surface=0;
|
||||
}
|
||||
switch (sdl.desktop.want_type) {
|
||||
case SCREEN_SURFACE:
|
||||
dosurface:
|
||||
|
@ -394,7 +397,7 @@ dosurface:
|
|||
sdl.clip.y=(Sint16)((sdl.desktop.full.height-height)/2);
|
||||
sdl.surface=SDL_SetVideoMode(sdl.desktop.full.width,sdl.desktop.full.height,bpp,
|
||||
SDL_FULLSCREEN | ((flags & GFX_CAN_RANDOM) ? SDL_SWSURFACE : SDL_HWSURFACE) |
|
||||
(sdl.desktop.doublebuf ? SDL_DOUBLEBUF|SDL_ASYNCBLIT : 0) | SDL_HWPALETTE);
|
||||
(sdl.desktop.doublebuf ? SDL_DOUBLEBUF|SDL_ASYNCBLIT : 0) | SDL_HWPALETTE);
|
||||
if (sdl.surface == NULL) E_Exit("Could not set fullscreen video mode %ix%i-%i: %s",sdl.desktop.full.width,sdl.desktop.full.height,bpp,SDL_GetError());
|
||||
} else {
|
||||
sdl.clip.x=0;sdl.clip.y=0;
|
||||
|
@ -434,8 +437,18 @@ dosurface:
|
|||
retFlags = GFX_CAN_32;
|
||||
break;
|
||||
}
|
||||
if (retFlags && sdl.surface->flags & SDL_HWSURFACE)
|
||||
if (retFlags && (sdl.surface->flags & SDL_HWSURFACE))
|
||||
retFlags |= GFX_HARDWARE;
|
||||
if (retFlags && (sdl.surface->flags & SDL_DOUBLEBUF)) {
|
||||
sdl.blit.surface=SDL_CreateRGBSurface(SDL_HWSURFACE,
|
||||
sdl.draw.width, sdl.draw.height,
|
||||
sdl.surface->format->BitsPerPixel,
|
||||
sdl.surface->format->Rmask,
|
||||
sdl.surface->format->Gmask,
|
||||
sdl.surface->format->Bmask,
|
||||
0);
|
||||
/* If this one fails be ready for some flickering... */
|
||||
}
|
||||
}
|
||||
break;
|
||||
#if (HAVE_DDRAW_H) && defined(WIN32)
|
||||
|
@ -443,12 +456,6 @@ dosurface:
|
|||
if (flags & GFX_CAN_15) bpp=15;
|
||||
if (flags & GFX_CAN_16) bpp=16;
|
||||
if (flags & GFX_CAN_32) bpp=32;
|
||||
if (sdl.blit.surface) {
|
||||
SDL_FreeSurface(sdl.blit.surface);
|
||||
sdl.blit.surface=0;
|
||||
}
|
||||
memset(&sdl.blit.fx,0,sizeof(DDBLTFX));
|
||||
sdl.blit.fx.dwSize=sizeof(DDBLTFX);
|
||||
if (!GFX_SetupSurfaceScaled((sdl.desktop.doublebuf && sdl.desktop.fullscreen) ? SDL_DOUBLEBUF : 0,bpp)) goto dosurface;
|
||||
sdl.blit.rect.top=sdl.clip.y;
|
||||
sdl.blit.rect.left=sdl.clip.x;
|
||||
|
@ -593,8 +600,7 @@ dosurface:
|
|||
return retFlags;
|
||||
}
|
||||
|
||||
bool mouselocked; //Global variable for mapper
|
||||
static void CaptureMouse(void) {
|
||||
void GFX_CaptureMouse(void) {
|
||||
sdl.mouse.locked=!sdl.mouse.locked;
|
||||
if (sdl.mouse.locked) {
|
||||
SDL_WM_GrabInput(SDL_GRAB_ON);
|
||||
|
@ -606,61 +612,71 @@ static void CaptureMouse(void) {
|
|||
mouselocked=sdl.mouse.locked;
|
||||
}
|
||||
|
||||
void GFX_CaptureMouse(void) {
|
||||
CaptureMouse();
|
||||
bool mouselocked; //Global variable for mapper
|
||||
static void CaptureMouse(bool pressed) {
|
||||
if (!pressed)
|
||||
return;
|
||||
GFX_CaptureMouse();
|
||||
}
|
||||
|
||||
static void SwitchFullScreen(void) {
|
||||
void GFX_SwitchFullScreen(void) {
|
||||
sdl.desktop.fullscreen=!sdl.desktop.fullscreen;
|
||||
if (sdl.desktop.fullscreen) {
|
||||
if (!sdl.mouse.locked) CaptureMouse();
|
||||
if (!sdl.mouse.locked) GFX_CaptureMouse();
|
||||
} else {
|
||||
if (sdl.mouse.locked) CaptureMouse();
|
||||
if (sdl.mouse.locked) GFX_CaptureMouse();
|
||||
}
|
||||
GFX_ResetScreen();
|
||||
}
|
||||
|
||||
void GFX_SwitchFullScreen(void) {
|
||||
SwitchFullScreen();
|
||||
static void SwitchFullScreen(bool pressed) {
|
||||
if (!pressed)
|
||||
return;
|
||||
GFX_SwitchFullScreen();
|
||||
}
|
||||
|
||||
|
||||
bool GFX_StartUpdate(Bit8u * & pixels,Bitu & pitch) {
|
||||
if (!sdl.active || sdl.updating) return false;
|
||||
sdl.updating=true;
|
||||
switch (sdl.desktop.type) {
|
||||
case SCREEN_SURFACE:
|
||||
if (SDL_MUSTLOCK(sdl.surface)) {
|
||||
if (SDL_LockSurface(sdl.surface)) {
|
||||
// LOG_MSG("SDL Lock failed");
|
||||
sdl.updating=false;
|
||||
if (sdl.blit.surface) {
|
||||
if (SDL_MUSTLOCK(sdl.blit.surface) && SDL_LockSurface(sdl.blit.surface))
|
||||
return false;
|
||||
}
|
||||
pixels=(Bit8u *)sdl.blit.surface->pixels;
|
||||
pitch=sdl.blit.surface->pitch;
|
||||
} else {
|
||||
if (SDL_MUSTLOCK(sdl.surface) && SDL_LockSurface(sdl.surface))
|
||||
return false;
|
||||
pixels=(Bit8u *)sdl.surface->pixels;
|
||||
pixels+=sdl.clip.y*sdl.surface->pitch;
|
||||
pixels+=sdl.clip.x*sdl.surface->format->BytesPerPixel;
|
||||
pitch=sdl.surface->pitch;
|
||||
}
|
||||
pixels=(Bit8u *)sdl.surface->pixels;
|
||||
pixels+=sdl.clip.y*sdl.surface->pitch;
|
||||
pixels+=sdl.clip.x*sdl.surface->format->BytesPerPixel;
|
||||
pitch=sdl.surface->pitch;
|
||||
sdl.updating=true;
|
||||
return true;
|
||||
#if (HAVE_DDRAW_H) && defined(WIN32)
|
||||
case SCREEN_SURFACE_DDRAW:
|
||||
if (SDL_LockSurface(sdl.blit.surface)) {
|
||||
// LOG_MSG("SDL Lock failed");
|
||||
sdl.updating=false;
|
||||
return false;
|
||||
}
|
||||
pixels=(Bit8u *)sdl.blit.surface->pixels;
|
||||
pitch=sdl.blit.surface->pitch;
|
||||
sdl.updating=true;
|
||||
return true;
|
||||
#endif
|
||||
case SCREEN_OVERLAY:
|
||||
SDL_LockYUVOverlay(sdl.overlay);
|
||||
pixels=(Bit8u *)*(sdl.overlay->pixels);
|
||||
pitch=*(sdl.overlay->pitches);
|
||||
sdl.updating=true;
|
||||
return true;
|
||||
#if C_OPENGL
|
||||
case SCREEN_OPENGL:
|
||||
pixels=(Bit8u *)sdl.opengl.framebuf;
|
||||
pitch=sdl.opengl.pitch;
|
||||
sdl.updating=true;
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
@ -675,7 +691,12 @@ void GFX_EndUpdate( const Bit16u *changedLines ) {
|
|||
switch (sdl.desktop.type) {
|
||||
case SCREEN_SURFACE:
|
||||
if (SDL_MUSTLOCK(sdl.surface)) {
|
||||
SDL_UnlockSurface(sdl.surface);
|
||||
if (sdl.blit.surface) {
|
||||
SDL_UnlockSurface(sdl.blit.surface);
|
||||
LOG_MSG("Bit %d",SDL_BlitSurface( sdl.blit.surface, 0, sdl.surface, &sdl.clip ));
|
||||
} else {
|
||||
SDL_UnlockSurface(sdl.surface);
|
||||
}
|
||||
SDL_Flip(sdl.surface);
|
||||
} else if (changedLines) {
|
||||
Bitu y = 0, index = 0, rectCount = 0;
|
||||
|
@ -817,11 +838,13 @@ void GFX_Start() {
|
|||
static void GUI_ShutDown(Section * sec) {
|
||||
GFX_Stop();
|
||||
if (sdl.draw.reset) (sdl.draw.reset)( true );
|
||||
if (sdl.mouse.locked) CaptureMouse();
|
||||
if (sdl.desktop.fullscreen) SwitchFullScreen();
|
||||
if (sdl.mouse.locked) GFX_CaptureMouse();
|
||||
if (sdl.desktop.fullscreen) GFX_SwitchFullScreen();
|
||||
}
|
||||
|
||||
static void KillSwitch(void){
|
||||
static void KillSwitch(bool pressed) {
|
||||
if (!pressed)
|
||||
return;
|
||||
throw 1;
|
||||
}
|
||||
|
||||
|
@ -1090,12 +1113,12 @@ static void HandleMouseButton(SDL_MouseButtonEvent * button) {
|
|||
switch (button->state) {
|
||||
case SDL_PRESSED:
|
||||
if (sdl.mouse.requestlock && !sdl.mouse.locked) {
|
||||
CaptureMouse();
|
||||
GFX_CaptureMouse();
|
||||
// Dont pass klick to mouse handler
|
||||
break;
|
||||
}
|
||||
if (!sdl.mouse.autoenable && sdl.mouse.autolock && button->button == SDL_BUTTON_MIDDLE) {
|
||||
CaptureMouse();
|
||||
GFX_CaptureMouse();
|
||||
break;
|
||||
}
|
||||
switch (button->button) {
|
||||
|
@ -1138,7 +1161,7 @@ void GFX_Events() {
|
|||
if (event.active.state & SDL_APPINPUTFOCUS) {
|
||||
if (event.active.gain) {
|
||||
if (sdl.desktop.fullscreen && !sdl.mouse.locked)
|
||||
CaptureMouse();
|
||||
GFX_CaptureMouse();
|
||||
SetPriority(sdl.priority.focus);
|
||||
} else {
|
||||
if (sdl.mouse.locked) {
|
||||
|
@ -1149,7 +1172,7 @@ void GFX_Events() {
|
|||
GFX_ResetScreen();
|
||||
}
|
||||
#endif
|
||||
CaptureMouse();
|
||||
GFX_CaptureMouse();
|
||||
}
|
||||
SetPriority(sdl.priority.nofocus);
|
||||
MAPPER_LosingFocus();
|
||||
|
@ -1318,13 +1341,13 @@ int main(int argc, char* argv[]) {
|
|||
/* Some extra SDL Functions */
|
||||
if (control->cmdline->FindExist("-fullscreen") || sdl_sec->Get_bool("fullscreen")) {
|
||||
if(!sdl.desktop.fullscreen) { //only switch if not allready in fullscreen
|
||||
SwitchFullScreen();
|
||||
GFX_SwitchFullScreen();
|
||||
}
|
||||
}
|
||||
|
||||
/* Init the keyMapper */
|
||||
MAPPER_Init();
|
||||
if (control->cmdline->FindExist("-startmapper")) MAPPER_Run();
|
||||
if (control->cmdline->FindExist("-startmapper")) MAPPER_Run(true);
|
||||
|
||||
/* Start up main machine */
|
||||
control->StartUp();
|
||||
|
|
Loading…
Add table
Reference in a new issue