Fixed locking and fullscreen switch for windows.
This commit is contained in:
parent
1882e13c5f
commit
d0a9890df6
4 changed files with 144 additions and 29 deletions
src
|
@ -230,7 +230,7 @@ global void UpdateDisplay(void)
|
|||
|
||||
VideoLockScreen(); // prepare video write
|
||||
|
||||
HideAnyCursor(); // remove cursor (when available)
|
||||
HideAnyCursor(); // remove cursor (when available)
|
||||
|
||||
#ifdef NEW_DECODRAW
|
||||
// Experimental new drawing mechanism, which can keep track of what is
|
||||
|
@ -278,7 +278,6 @@ global void UpdateDisplay(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
|
||||
if( MustRedraw&(RedrawMessage|RedrawMap) ) {
|
||||
DrawMessage();
|
||||
}
|
||||
|
|
|
@ -1194,6 +1194,7 @@ global void DrawMenu(int menu_id)
|
|||
if (menu_id == -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
menu = Menus + menu_id;
|
||||
switch( menu->image ) {
|
||||
case ImagePanel1:
|
||||
|
@ -1283,6 +1284,7 @@ global void DrawMenu(int menu_id)
|
|||
if (mip) {
|
||||
DrawPulldown(mip,menu->x,menu->y);
|
||||
}
|
||||
|
||||
InvalidateArea(menu->x,menu->y,menu->xsize,menu->ysize);
|
||||
}
|
||||
|
||||
|
@ -1301,14 +1303,14 @@ local void StartMenusSetBackground(Menuitem *mi __attribute__((unused)))
|
|||
VideoSetPalette(Menusbgnd->Pixels);
|
||||
}
|
||||
|
||||
VideoLockScreen();
|
||||
// VideoLockScreen();
|
||||
|
||||
// FIXME: bigger window ?
|
||||
VideoDrawSubClip(Menusbgnd,0,0,
|
||||
Menusbgnd->Width,Menusbgnd->Height,
|
||||
(VideoWidth-Menusbgnd->Width)/2,(VideoHeight-Menusbgnd->Height)/2);
|
||||
|
||||
VideoUnlockScreen();
|
||||
// VideoUnlockScreen();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1438,9 +1440,11 @@ local void SinglePlayerGameMenu(void)
|
|||
|
||||
local void CampaignGameMenu(void)
|
||||
{
|
||||
DestroyCursorBackground();
|
||||
VideoLockScreen();
|
||||
StartMenusSetBackground(NULL);
|
||||
VideoUnlockScreen();
|
||||
Invalidate();
|
||||
|
||||
GuiGameStarted = 0;
|
||||
ProcessMenu(MENU_CAMPAIN_SELECT, 1);
|
||||
if (GuiGameStarted) {
|
||||
|
@ -1450,9 +1454,11 @@ local void CampaignGameMenu(void)
|
|||
|
||||
local void AllianceCampaignMenu(void)
|
||||
{
|
||||
DestroyCursorBackground();
|
||||
VideoLockScreen();
|
||||
StartMenusSetBackground(NULL);
|
||||
VideoUnlockScreen();
|
||||
Invalidate();
|
||||
|
||||
// Any Campaign info should be displayed through a DrawFunc() Item
|
||||
// int the CAMPAIN_CONT menu processed below...
|
||||
ProcessMenu(MENU_CAMPAIN_CONT, 1);
|
||||
|
@ -1463,8 +1469,9 @@ local void AllianceCampaignMenu(void)
|
|||
PlayCampaign("human");
|
||||
GuiGameStarted = 1;
|
||||
|
||||
DestroyCursorBackground();
|
||||
VideoLockScreen();
|
||||
StartMenusSetBackground(NULL);
|
||||
VideoUnlockScreen();
|
||||
Invalidate();
|
||||
|
||||
// FIXME: johns othewise crash in UpdateDisplay -> DrawMinimapCursor
|
||||
|
@ -1473,9 +1480,11 @@ local void AllianceCampaignMenu(void)
|
|||
|
||||
local void MysticalCampaignMenu(void)
|
||||
{
|
||||
DestroyCursorBackground();
|
||||
VideoLockScreen();
|
||||
StartMenusSetBackground(NULL);
|
||||
VideoUnlockScreen();
|
||||
Invalidate();
|
||||
|
||||
// Any Campaign info should be displayed through a DrawFunc() Item
|
||||
// int the CAMPAIN_CONT menu processed below...
|
||||
ProcessMenu(MENU_CAMPAIN_CONT, 1);
|
||||
|
@ -1486,8 +1495,9 @@ local void MysticalCampaignMenu(void)
|
|||
PlayCampaign("orc");
|
||||
GuiGameStarted = 1;
|
||||
|
||||
DestroyCursorBackground();
|
||||
VideoLockScreen();
|
||||
StartMenusSetBackground(NULL);
|
||||
VideoUnlockScreen();
|
||||
Invalidate();
|
||||
|
||||
// FIXME: johns othewise crash in UpdateDisplay -> DrawMinimapCursor
|
||||
|
@ -1496,9 +1506,11 @@ local void MysticalCampaignMenu(void)
|
|||
|
||||
local void Alliance2CampaignMenu(void)
|
||||
{
|
||||
DestroyCursorBackground();
|
||||
VideoLockScreen();
|
||||
StartMenusSetBackground(NULL);
|
||||
VideoUnlockScreen();
|
||||
Invalidate();
|
||||
|
||||
// Any Campaign info should be displayed through a DrawFunc() Item
|
||||
// int the CAMPAIN_CONT menu processed below...
|
||||
ProcessMenu(MENU_CAMPAIN_CONT, 1);
|
||||
|
@ -1509,8 +1521,9 @@ local void Alliance2CampaignMenu(void)
|
|||
PlayCampaign("human-exp");
|
||||
GuiGameStarted = 1;
|
||||
|
||||
DestroyCursorBackground();
|
||||
VideoLockScreen();
|
||||
StartMenusSetBackground(NULL);
|
||||
VideoUnlockScreen();
|
||||
Invalidate();
|
||||
|
||||
// FIXME: johns othewise crash in UpdateDisplay -> DrawMinimapCursor
|
||||
|
@ -1519,9 +1532,11 @@ local void Alliance2CampaignMenu(void)
|
|||
|
||||
local void Mystical2CampaignMenu(void)
|
||||
{
|
||||
DestroyCursorBackground();
|
||||
VideoLockScreen();
|
||||
StartMenusSetBackground(NULL);
|
||||
VideoUnlockScreen();
|
||||
Invalidate();
|
||||
|
||||
// Any Campaign info should be displayed through a DrawFunc() Item
|
||||
// int the CAMPAIN_CONT menu processed below...
|
||||
ProcessMenu(MENU_CAMPAIN_CONT, 1);
|
||||
|
@ -1532,11 +1547,12 @@ local void Mystical2CampaignMenu(void)
|
|||
PlayCampaign("orc-exp");
|
||||
GuiGameStarted = 1;
|
||||
|
||||
DestroyCursorBackground();
|
||||
VideoLockScreen();
|
||||
StartMenusSetBackground(NULL);
|
||||
VideoUnlockScreen();
|
||||
Invalidate();
|
||||
|
||||
// FIXME: johns othewise crash in UpdateDisplay -> DrawMinimapCursor
|
||||
// FIXME: johns otherwise crash in UpdateDisplay -> DrawMinimapCursor
|
||||
EndMenu();
|
||||
}
|
||||
|
||||
|
@ -3102,13 +3118,17 @@ local void EndMenu(void)
|
|||
**
|
||||
** @param menu_id The menu number to process
|
||||
** @param loop Indicates to setup handlers and really 'Process'
|
||||
**
|
||||
** @todo FIXME: This function is called from the event handler!!
|
||||
*/
|
||||
global void ProcessMenu(int menu_id, int loop)
|
||||
{
|
||||
int i, oldncr;
|
||||
Menu *menu;
|
||||
Menuitem *mi;
|
||||
int CurrentMenuSave = -1, MenuButtonUnderCursorSave = -1, MenuButtonCurSelSave = -1;
|
||||
int CurrentMenuSave = -1;
|
||||
int MenuButtonUnderCursorSave = -1;
|
||||
int MenuButtonCurSelSave = -1;
|
||||
|
||||
// Recursion protection:
|
||||
if (loop) {
|
||||
|
@ -3118,7 +3138,9 @@ global void ProcessMenu(int menu_id, int loop)
|
|||
}
|
||||
|
||||
InterfaceState = IfaceStateMenu;
|
||||
VideoLockScreen();
|
||||
HideAnyCursor();
|
||||
VideoUnlockScreen();
|
||||
DestroyCursorBackground();
|
||||
MustRedraw |= RedrawCursor;
|
||||
CursorState = CursorStatePoint;
|
||||
|
@ -3173,7 +3195,11 @@ global void ProcessMenu(int menu_id, int loop)
|
|||
MenuHandleMouseMove(CursorX,CursorY); // This activates buttons as appropriate!
|
||||
MustRedraw |= RedrawCursor;
|
||||
}
|
||||
|
||||
|
||||
VideoLockScreen();
|
||||
DrawMenu(CurrentMenu);
|
||||
VideoUnlockScreen();
|
||||
|
||||
if (loop) {
|
||||
while (CurrentMenu != -1) {
|
||||
|
|
|
@ -811,6 +811,28 @@ global void RealizeVideoMemory(void)
|
|||
{
|
||||
}
|
||||
|
||||
/**
|
||||
** Lock the screen for write access.
|
||||
*/
|
||||
global void SdlLockScreen(void)
|
||||
{
|
||||
SDL_LockSurface(Screen);
|
||||
VideoMemory=Screen->pixels;
|
||||
}
|
||||
|
||||
/**
|
||||
** Unlock the screen for write access.
|
||||
*/
|
||||
global void SdlUnlockScreen(void)
|
||||
{
|
||||
SDL_UnlockSurface(Screen);
|
||||
#ifdef DEBUG
|
||||
VideoMemory=NULL; // Catch errors!
|
||||
#else
|
||||
VideoMemory=Screen->pixels; // Be kind
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
** Toggle grab mouse.
|
||||
*/
|
||||
|
@ -836,7 +858,79 @@ global void ToggleGrabMouse(void)
|
|||
*/
|
||||
global void ToggleFullScreen(void)
|
||||
{
|
||||
#ifndef USE_WIN32
|
||||
long framesize;
|
||||
void *pixels;
|
||||
SDL_Color *palette;
|
||||
SDL_Rect clip;
|
||||
int ncolors;
|
||||
Uint32 flags;
|
||||
int w;
|
||||
int h;
|
||||
int bpp;
|
||||
|
||||
if ( !Screen ) { // don't bother if there's no surface.
|
||||
return;
|
||||
}
|
||||
|
||||
flags = Screen->flags;
|
||||
w = Screen->w;
|
||||
h = Screen->h;
|
||||
bpp = Screen->format->BitsPerPixel;
|
||||
|
||||
SDL_GetClipRect(Screen, &clip);
|
||||
|
||||
// save the contents of the screen.
|
||||
framesize = w * h * Screen->format->BytesPerPixel;
|
||||
|
||||
if ( !(pixels = malloc(framesize)) ) { // out of memory
|
||||
return;
|
||||
}
|
||||
SDL_LockSurface(Screen);
|
||||
memcpy(pixels, Screen->pixels, framesize);
|
||||
|
||||
IfDebug( palette=NULL; ncolors=0; ); // shut up compiler
|
||||
if ( Screen->format->palette ) {
|
||||
ncolors = Screen->format->palette->ncolors;
|
||||
if ( !(palette = malloc(ncolors * sizeof(SDL_Color))) ) {
|
||||
free(pixels);
|
||||
return;
|
||||
}
|
||||
memcpy(palette, Screen->format->palette->colors,
|
||||
ncolors * sizeof(SDL_Color));
|
||||
}
|
||||
SDL_UnlockSurface(Screen);
|
||||
|
||||
Screen = SDL_SetVideoMode(w, h, bpp, flags ^ SDL_FULLSCREEN);
|
||||
if( !Screen ) {
|
||||
Screen = SDL_SetVideoMode(w, h, bpp, flags);
|
||||
if ( !Screen ) { // completely screwed.
|
||||
free(pixels);
|
||||
if( Screen->format->palette ) {
|
||||
free(palette);
|
||||
}
|
||||
fprintf(stderr,"Toggle to fullscreen, crashed all\n");
|
||||
Exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
SDL_LockSurface(Screen);
|
||||
memcpy(Screen->pixels, pixels, framesize);
|
||||
free(pixels);
|
||||
|
||||
if ( Screen->format->palette ) {
|
||||
// !!! FIXME : No idea if that flags param is right.
|
||||
SDL_SetPalette(Screen, SDL_LOGPAL, palette, 0, ncolors);
|
||||
free(palette);
|
||||
}
|
||||
SDL_UnlockSurface(Screen);
|
||||
|
||||
SDL_SetClipRect(Screen, &clip);
|
||||
|
||||
return;
|
||||
#else
|
||||
SDL_WM_ToggleFullScreen(Screen);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // } USE_SDL
|
||||
|
|
|
@ -168,10 +168,14 @@ typedef struct _clip_ {
|
|||
-- Externals
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
extern void InitVideoSdl(void);
|
||||
extern void InitVideoX11(void);
|
||||
extern void InitVideoSVGA(void);
|
||||
extern void InitVideoWin32(void);
|
||||
extern void InitVideoSdl(void); /// Init SDL video hardware driver
|
||||
extern void InitVideoX11(void); /// Init X11 video hardware driver
|
||||
extern void InitVideoSVGA(void); /// Init SVGA video hardware driver
|
||||
extern void InitVideoWin32(void); /// Init Win32 video hardware driver
|
||||
extern void InitVideoWinCE(void); /// Init WinCE video hardware driver
|
||||
|
||||
extern void SdlLockScreen(void); /// Do SDL hardware lock
|
||||
extern void SdlUnlockScreen(void); /// Do SDL hardware unlock
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Variables
|
||||
|
@ -1174,11 +1178,7 @@ global void VideoCreatePalette(const Palette* palette)
|
|||
global void VideoLockScreen(void)
|
||||
{
|
||||
#ifdef USE_SDL
|
||||
// FIXME: move to system api part!
|
||||
extern SDL_Surface *Screen; /// internal screen
|
||||
|
||||
SDL_LockSurface(Screen);
|
||||
VideoMemory=Screen->pixels;
|
||||
SdlLockScreen();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -1188,11 +1188,7 @@ global void VideoLockScreen(void)
|
|||
global void VideoUnlockScreen(void)
|
||||
{
|
||||
#ifdef USE_SDL
|
||||
// FIXME: move to system api part!
|
||||
extern SDL_Surface *Screen; /// internal screen
|
||||
|
||||
SDL_UnlockSurface(Screen);
|
||||
VideoMemory=Screen->pixels;
|
||||
SdlUnlockScreen();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue