This repository has been archived on 2022-06-27. You can view files and clone it, but cannot push or open issues or pull requests.
Xash3DArchive/mainui/menu_vidmodes.cpp
2022-06-27 01:15:20 +03:00

287 lines
8.1 KiB
C++

/*
Copyright (C) 1997-2001 Id Software, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "extdll.h"
#include "basemenu.h"
#include "utils.h"
#include "menu_btnsbmp_table.h"
#include "menu_strings.h"
#define ART_BANNER "gfx/shell/head_vidmodes"
#define ID_BACKGROUND 0
#define ID_BANNER 1
#define ID_APPLY 2
#define ID_DONE 3
#define ID_VIDMODELIST 4
#define ID_FULLSCREEN 5
#define ID_SOFTWARE 6
#define ID_TABLEHINT 7
#define MAX_VIDMODES (sizeof( uiVideoModes ) / sizeof( uiVideoModes[0] )) + 1
static const char *uiVideoModes[] =
{
"640 x 480",
"800 x 600",
"960 x 720",
"1024 x 768",
"1152 x 864",
"1280 x 800",
"1280 x 960",
"1280 x 1024",
"1600 x 1200",
"2048 x 1536",
"800 x 480 (wide)",
"856 x 480 (wide)",
"1024 x 576 (wide)",
"1024 x 600 (wide)",
"1280 x 720 (wide)",
"1360 x 768 (wide)",
"1366 x 768 (wide)",
"1440 x 900 (wide)",
"1680 x 1050 (wide)",
"1920 x 1200 (wide)",
"2560 x 1600 (wide)",
};
typedef struct
{
const char *videoModesPtr[MAX_VIDMODES];
menuFramework_s menu;
menuBitmap_s background;
menuBitmap_s banner;
menuPicButton_s ok;
menuPicButton_s cancel;
menuCheckBox_s windowed;
menuCheckBox_s software;
menuScrollList_s vidList;
menuAction_s listCaption;
} uiVidModes_t;
static uiVidModes_t uiVidModes;
/*
=================
UI_VidModes_GetModesList
=================
*/
static void UI_VidModes_GetConfig( void )
{
for( int i = 0; i < MAX_VIDMODES-1; i++ )
uiVidModes.videoModesPtr[i] = uiVideoModes[i];
uiVidModes.videoModesPtr[i] = NULL; // terminator
uiVidModes.vidList.itemNames = uiVidModes.videoModesPtr;
uiVidModes.vidList.curItem = CVAR_GET_FLOAT( "vid_mode" );
if( !CVAR_GET_FLOAT( "fullscreen" ))
uiVidModes.windowed.enabled = 1;
if( CVAR_GET_FLOAT( "r_allow_software" ))
uiVidModes.software.enabled = 1;
}
/*
=================
UI_VidModes_SetConfig
=================
*/
static void UI_VidOptions_SetConfig( void )
{
CVAR_SET_FLOAT( "vid_mode", uiVidModes.vidList.curItem );
CVAR_SET_FLOAT( "fullscreen", !uiVidModes.windowed.enabled );
CVAR_SET_FLOAT( "r_allow_software", uiVidModes.software.enabled );
}
/*
=================
UI_VidModes_UpdateConfig
=================
*/
static void UI_VidOptions_UpdateConfig( void )
{
CVAR_SET_FLOAT( "r_allow_software", uiVidModes.software.enabled );
}
/*
=================
UI_VidModes_Callback
=================
*/
static void UI_VidModes_Callback( void *self, int event )
{
menuCommon_s *item = (menuCommon_s *)self;
switch( item->id )
{
case ID_FULLSCREEN:
case ID_SOFTWARE:
if( event == QM_PRESSED )
((menuCheckBox_s *)self)->focusPic = UI_CHECKBOX_PRESSED;
else ((menuCheckBox_s *)self)->focusPic = UI_CHECKBOX_FOCUS;
break;
}
if( event == QM_CHANGED )
{
UI_VidOptions_UpdateConfig();
return;
}
if( event != QM_ACTIVATED )
return;
switch( item->id )
{
case ID_DONE:
UI_PopMenu();
break;
case ID_APPLY:
UI_VidOptions_SetConfig ();
UI_PopMenu();
break;
}
}
/*
=================
UI_VidModes_Init
=================
*/
static void UI_VidModes_Init( void )
{
memset( &uiVidModes, 0, sizeof( uiVidModes_t ));
uiVidModes.menu.vidInitFunc = UI_VidModes_Init;
uiVidModes.background.generic.id = ID_BACKGROUND;
uiVidModes.background.generic.type = QMTYPE_BITMAP;
uiVidModes.background.generic.flags = QMF_INACTIVE;
uiVidModes.background.generic.x = 0;
uiVidModes.background.generic.y = 0;
uiVidModes.background.generic.width = 1024;
uiVidModes.background.generic.height = 768;
uiVidModes.background.pic = ART_BACKGROUND;
uiVidModes.banner.generic.id = ID_BANNER;
uiVidModes.banner.generic.type = QMTYPE_BITMAP;
uiVidModes.banner.generic.flags = QMF_INACTIVE|QMF_DRAW_ADDITIVE;
uiVidModes.banner.generic.x = UI_BANNER_POSX;
uiVidModes.banner.generic.y = UI_BANNER_POSY;
uiVidModes.banner.generic.width = UI_BANNER_WIDTH;
uiVidModes.banner.generic.height = UI_BANNER_HEIGHT;
uiVidModes.banner.pic = ART_BANNER;
uiVidModes.ok.generic.id = ID_APPLY;
uiVidModes.ok.generic.type = QMTYPE_BM_BUTTON;
uiVidModes.ok.generic.flags = QMF_HIGHLIGHTIFFOCUS|QMF_DROPSHADOW;
uiVidModes.ok.generic.x = 72;
uiVidModes.ok.generic.y = 230;
uiVidModes.ok.generic.name = "Apply";
uiVidModes.ok.generic.statusText = "Apply changes";
uiVidModes.ok.generic.callback = UI_VidModes_Callback;
UI_UtilSetupPicButton( &uiVidModes.ok, PC_OK );
uiVidModes.cancel.generic.id = ID_DONE;
uiVidModes.cancel.generic.type = QMTYPE_BM_BUTTON;
uiVidModes.cancel.generic.flags = QMF_HIGHLIGHTIFFOCUS|QMF_DROPSHADOW;
uiVidModes.cancel.generic.x = 72;
uiVidModes.cancel.generic.y = 280;
uiVidModes.cancel.generic.name = "Done";
uiVidModes.cancel.generic.statusText = "Return back to previous menu";
uiVidModes.cancel.generic.callback = UI_VidModes_Callback;
UI_UtilSetupPicButton( &uiVidModes.cancel, PC_CANCEL );
uiVidModes.listCaption.generic.id = ID_TABLEHINT;
uiVidModes.listCaption.generic.type = QMTYPE_BM_BUTTON;
uiVidModes.listCaption.generic.flags = QMF_INACTIVE|QMF_SMALLFONT;
uiVidModes.listCaption.generic.color = uiColorHelp;
uiVidModes.listCaption.generic.name = MenuStrings[HINT_DISPLAYMODE];
uiVidModes.listCaption.generic.x = 400;
uiVidModes.listCaption.generic.y = 270;
uiVidModes.vidList.generic.id = ID_VIDMODELIST;
uiVidModes.vidList.generic.type = QMTYPE_SCROLLLIST;
uiVidModes.vidList.generic.flags = QMF_HIGHLIGHTIFFOCUS|QMF_SMALLFONT;
uiVidModes.vidList.generic.x = 400;
uiVidModes.vidList.generic.y = 300;
uiVidModes.vidList.generic.width = 560;
uiVidModes.vidList.generic.height = 300;
uiVidModes.vidList.generic.callback = UI_VidModes_Callback;
uiVidModes.windowed.generic.id = ID_FULLSCREEN;
uiVidModes.windowed.generic.type = QMTYPE_CHECKBOX;
uiVidModes.windowed.generic.flags = QMF_HIGHLIGHTIFFOCUS|QMF_ACT_ONRELEASE|QMF_MOUSEONLY|QMF_DROPSHADOW;
uiVidModes.windowed.generic.name = "Run in a window";
uiVidModes.windowed.generic.x = 400;
uiVidModes.windowed.generic.y = 620;
uiVidModes.windowed.generic.callback = UI_VidModes_Callback;
uiVidModes.windowed.generic.statusText = "Run game in window mode";
uiVidModes.software.generic.id = ID_SOFTWARE;
uiVidModes.software.generic.type = QMTYPE_CHECKBOX;
uiVidModes.software.generic.flags = QMF_HIGHLIGHTIFFOCUS|QMF_ACT_ONRELEASE|QMF_MOUSEONLY|QMF_DROPSHADOW;
uiVidModes.software.generic.name = "Allow software";
uiVidModes.software.generic.x = 400;
uiVidModes.software.generic.y = 670;
uiVidModes.software.generic.callback = UI_VidModes_Callback;
uiVidModes.software.generic.statusText = "allow software rendering when hardware support is missing";
UI_VidModes_GetConfig();
UI_AddItem( &uiVidModes.menu, (void *)&uiVidModes.background );
UI_AddItem( &uiVidModes.menu, (void *)&uiVidModes.banner );
UI_AddItem( &uiVidModes.menu, (void *)&uiVidModes.ok );
UI_AddItem( &uiVidModes.menu, (void *)&uiVidModes.cancel );
UI_AddItem( &uiVidModes.menu, (void *)&uiVidModes.windowed );
UI_AddItem( &uiVidModes.menu, (void *)&uiVidModes.software );
UI_AddItem( &uiVidModes.menu, (void *)&uiVidModes.listCaption );
UI_AddItem( &uiVidModes.menu, (void *)&uiVidModes.vidList );
}
/*
=================
UI_VidModes_Precache
=================
*/
void UI_VidModes_Precache( void )
{
PIC_Load( ART_BACKGROUND );
PIC_Load( ART_BANNER );
}
/*
=================
UI_VidModes_Menu
=================
*/
void UI_VidModes_Menu( void )
{
UI_VidModes_Precache();
UI_VidModes_Init();
UI_PushMenu( &uiVidModes.menu );
}