Changes for Spanning View across split screens
This is intended to give a better perspective view using multiple monitors angled inwards git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@4702 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: be1e2f6b9cdb7827facbe142ecbe643193fc039e Former-commit-id: 0fa9d8c39c31afd614111de4a1ab5972e053b8ed
This commit is contained in:
parent
58938a6859
commit
714f6c6019
7 changed files with 423 additions and 36 deletions
|
@ -96,6 +96,15 @@
|
|||
#define GR_ATT_REAR_MAP2 "Rear Level Map 2"
|
||||
#define GR_ATT_REAR_MAP3 "Rear Level Map 3"
|
||||
|
||||
#define GR_SCT_MONITOR "Monitor"
|
||||
#define GR_ATT_MONITOR "monitor type"
|
||||
#define GR_VAL_MONITOR_16BY9 "16by9"
|
||||
#define GR_VAL_MONITOR_4BY3 "4by3"
|
||||
#define GR_ATT_SPANSPLIT "span splits"
|
||||
#define GR_VAL_YES "yes"
|
||||
#define GR_VAL_NO "no"
|
||||
#define GR_ATT_BEZELCOMP "bezel compensation"
|
||||
|
||||
#endif /* _GRAPHV1_H_ */
|
||||
|
||||
|
||||
|
|
|
@ -28,7 +28,10 @@
|
|||
#include "grutil.h" //grGetHOT
|
||||
|
||||
static char path[1024];
|
||||
static float allfovy;
|
||||
|
||||
static int spansplit;
|
||||
static float spanfovy;
|
||||
static float bezelcomp;
|
||||
|
||||
// Utilities ================================================================
|
||||
|
||||
|
@ -157,7 +160,11 @@ float cGrPerspCamera::getLODFactor(float x, float y, float z) {
|
|||
|
||||
void cGrPerspCamera::setViewOffset(float newOffset)
|
||||
{
|
||||
viewOffset = newOffset;
|
||||
if (spansplit && newOffset) {
|
||||
viewOffset = newOffset;
|
||||
spanfovy = fovy;
|
||||
} else
|
||||
viewOffset = 0;
|
||||
}
|
||||
|
||||
void cGrPerspCamera::setZoom(int cmd)
|
||||
|
@ -197,7 +204,9 @@ void cGrPerspCamera::setZoom(int cmd)
|
|||
}
|
||||
|
||||
limitFov();
|
||||
allfovy = fovy;
|
||||
|
||||
if (spansplit && viewOffset)
|
||||
spanfovy = fovy;
|
||||
|
||||
sprintf(buf, "%s-%d-%d", GR_ATT_FOVY, screen->getCurCamHead(), getId());
|
||||
sprintf(path, "%s/%d", GR_SCT_DISPMODE, screen->getId());
|
||||
|
@ -283,7 +292,7 @@ class cGrCarCamInsideDriverEye : public cGrPerspCamera
|
|||
|
||||
void update(tCarElt *car, tSituation *s) {
|
||||
sgVec3 P, p;
|
||||
float offset;
|
||||
float offset = 0;
|
||||
|
||||
p[0] = car->_drvPos_x;
|
||||
p[1] = car->_drvPos_y;
|
||||
|
@ -294,9 +303,11 @@ class cGrCarCamInsideDriverEye : public cGrPerspCamera
|
|||
eye[1] = p[1];
|
||||
eye[2] = p[2];
|
||||
|
||||
// Compute offset angle (fudged in bezel compensation)
|
||||
offset = viewOffset * 1.10 * atan(screen->getViewRatio() * tan(allfovy * M_PI / 360.0)) * 2;
|
||||
fovy = allfovy;
|
||||
// Compute offset angle and bezel compensation)
|
||||
if (spansplit && viewOffset) {
|
||||
offset += (viewOffset - 10) * bezelcomp / 100 * atan(screen->getViewRatio() * tan(spanfovy * M_PI / 360.0)) * 2;
|
||||
fovy = spanfovy;
|
||||
}
|
||||
|
||||
P[0] = car->_bonnetPos_x + 30.0 * cos(car->_glance + offset);
|
||||
P[1] = car->_bonnetPos_y - 30.0 * sin(car->_glance + offset);
|
||||
|
@ -561,6 +572,7 @@ class cGrCarCamInsideFixedCar : public cGrPerspCamera
|
|||
|
||||
void update(tCarElt *car, tSituation *s) {
|
||||
sgVec3 P, p;
|
||||
float offset = 0;
|
||||
|
||||
p[0] = car->_bonnetPos_x;
|
||||
p[1] = car->_bonnetPos_y;
|
||||
|
@ -570,9 +582,15 @@ class cGrCarCamInsideFixedCar : public cGrPerspCamera
|
|||
eye[0] = p[0];
|
||||
eye[1] = p[1];
|
||||
eye[2] = p[2];
|
||||
|
||||
// Compute offset angle and bezel compensation)
|
||||
if (spansplit && viewOffset) {
|
||||
offset += (viewOffset - 10) * bezelcomp / 100 * atan(screen->getViewRatio() * tan(spanfovy * M_PI / 360.0)) * 2;
|
||||
fovy = spanfovy;
|
||||
}
|
||||
|
||||
P[0] = car->_bonnetPos_x + 30.0 * cos(car->_glance);
|
||||
P[1] = car->_bonnetPos_y - 30.0 * sin(car->_glance);
|
||||
P[0] = car->_bonnetPos_x + 30.0 * cos(car->_glance + offset);
|
||||
P[1] = car->_bonnetPos_y - 30.0 * sin(car->_glance + offset);
|
||||
P[2] = car->_bonnetPos_z;
|
||||
sgXformPnt3(P, car->_posMat);
|
||||
|
||||
|
@ -609,6 +627,7 @@ class cGrCarCamBehindFixedCar : public cGrPerspCamera
|
|||
void update(tCarElt *car, tSituation *s)
|
||||
{
|
||||
sgVec3 P, p;
|
||||
float offset = 0;
|
||||
|
||||
p[0] = car->_bonnetPos_x - 6.0f;
|
||||
p[1] = car->_bonnetPos_y;
|
||||
|
@ -619,8 +638,14 @@ class cGrCarCamBehindFixedCar : public cGrPerspCamera
|
|||
eye[1] = p[1];
|
||||
eye[2] = p[2];
|
||||
|
||||
P[0] = car->_bonnetPos_x + 30.0;
|
||||
P[1] = car->_bonnetPos_y;
|
||||
// Compute offset angle and bezel compensation)
|
||||
if (spansplit && viewOffset) {
|
||||
offset += (viewOffset - 10) * bezelcomp / 100 * atan(screen->getViewRatio() * tan(spanfovy * M_PI / 360.0)) * 2;
|
||||
fovy = spanfovy;
|
||||
}
|
||||
|
||||
P[0] = car->_bonnetPos_x + 30.0 * cos(offset);
|
||||
P[1] = car->_bonnetPos_y - 30.0 * sin(offset);
|
||||
P[2] = car->_bonnetPos_z;
|
||||
sgXformPnt3(P, car->_posMat);
|
||||
|
||||
|
@ -673,6 +698,7 @@ class cGrCarCamBehindReverse : public cGrPerspCamera
|
|||
void update(tCarElt *car, tSituation *s)
|
||||
{
|
||||
sgVec3 P, p;
|
||||
float offset = 0;
|
||||
|
||||
p[0] = car->_bonnetPos_x - (car->_dimension_x/2);
|
||||
p[1] = car->_bonnetPos_y;
|
||||
|
@ -682,9 +708,15 @@ class cGrCarCamBehindReverse : public cGrPerspCamera
|
|||
eye[0] = p[0];
|
||||
eye[1] = p[1];
|
||||
eye[2] = p[2];
|
||||
|
||||
// Compute offset angle and bezel compensation)
|
||||
if (spansplit && viewOffset) {
|
||||
offset += (viewOffset - 10) * bezelcomp / 100 * atan(screen->getViewRatio() * tan(spanfovy * M_PI / 360.0)) * 2;
|
||||
fovy = spanfovy;
|
||||
}
|
||||
|
||||
P[0] = car->_bonnetPos_x;
|
||||
P[1] = car->_bonnetPos_y;
|
||||
P[0] = car->_bonnetPos_x + 30.0 * cos(offset);
|
||||
P[1] = car->_bonnetPos_y - 30.0 * sin(offset);
|
||||
P[2] = car->_bonnetPos_z;
|
||||
sgXformPnt3(P, car->_posMat);
|
||||
|
||||
|
@ -1560,6 +1592,13 @@ grCamCreateSceneCameraList(class cGrScreen *myscreen, tGrCamHead *cams,
|
|||
int c;
|
||||
class cGrCamera *cam;
|
||||
|
||||
/* Check whether view should be spanned across vertical splits */
|
||||
const char *pszSpanSplit =
|
||||
GfParmGetStr(grHandle, GR_SCT_MONITOR, GR_ATT_SPANSPLIT, GR_VAL_NO);
|
||||
spansplit = strcmp(pszSpanSplit, GR_VAL_YES) ? 0 : 1;
|
||||
|
||||
bezelcomp = (float)GfParmGetNum(grHandle, GR_SCT_MONITOR, GR_ATT_BEZELCOMP, NULL, 120);
|
||||
|
||||
/* Scene Cameras */
|
||||
c = 0;
|
||||
|
||||
|
|
|
@ -138,8 +138,8 @@ grAdaptScreenSize(void)
|
|||
grNbArrangeScreens = 0;
|
||||
case 0:
|
||||
// Left & Right half of the window
|
||||
grScreens[0]->activate(grWinx, grWiny, grWinw / 2, grWinh, -0.5);
|
||||
grScreens[1]->activate(grWinx + grWinw / 2, grWiny, grWinw / 2, grWinh, 0.5);
|
||||
grScreens[0]->activate(grWinx, grWiny, grWinw / 2, grWinh, -0.5 + 10);
|
||||
grScreens[1]->activate(grWinx + grWinw / 2, grWiny, grWinw / 2, grWinh, 0.5 + 10);
|
||||
break;
|
||||
case 1:
|
||||
// Top & Bottom half of the window
|
||||
|
@ -167,9 +167,9 @@ grAdaptScreenSize(void)
|
|||
grNbArrangeScreens = 0;
|
||||
case 0:
|
||||
// All side by side
|
||||
grScreens[0]->activate(grWinx, grWiny, grWinw / 3, grWinh, -1);
|
||||
grScreens[1]->activate(grWinx + grWinw / 3, grWiny, grWinw / 3, grWinh, 0.0);
|
||||
grScreens[2]->activate(grWinx + grWinw * 2/3, grWiny, grWinw / 3, grWinh, 1);
|
||||
grScreens[0]->activate(grWinx, grWiny, grWinw / 3, grWinh, -1 + 10);
|
||||
grScreens[1]->activate(grWinx + grWinw / 3, grWiny, grWinw / 3, grWinh, 0.0 + 10);
|
||||
grScreens[2]->activate(grWinx + grWinw * 2/3, grWiny, grWinw / 3, grWinh, 1 + 10);
|
||||
break;
|
||||
case 1:
|
||||
// Left/Right above wide
|
||||
|
@ -217,10 +217,10 @@ grAdaptScreenSize(void)
|
|||
grNbArrangeScreens = 0;
|
||||
case 0:
|
||||
// All side by side
|
||||
grScreens[0]->activate(grWinx, grWiny, grWinw / 4, grWinh, -1.5);
|
||||
grScreens[1]->activate(grWinx + grWinw / 4, grWiny, grWinw / 4, grWinh, -0.5);
|
||||
grScreens[2]->activate(grWinx + grWinw * 2/4, grWiny, grWinw / 4, grWinh, 0.5);
|
||||
grScreens[3]->activate(grWinx + grWinw * 3/4, grWiny, grWinw / 4, grWinh, 1.5);
|
||||
grScreens[0]->activate(grWinx, grWiny, grWinw / 4, grWinh, -1.5 + 10);
|
||||
grScreens[1]->activate(grWinx + grWinw / 4, grWiny, grWinw / 4, grWinh, -0.5 + 10);
|
||||
grScreens[2]->activate(grWinx + grWinw * 2/4, grWiny, grWinw / 4, grWinh, 0.5 + 10);
|
||||
grScreens[3]->activate(grWinx + grWinw * 3/4, grWiny, grWinw / 4, grWinh, 1.5 + 10);
|
||||
break;
|
||||
case 1:
|
||||
// Top/Bottom Left/Rigth Quarters
|
||||
|
@ -281,11 +281,11 @@ grAdaptScreenSize(void)
|
|||
grNbArrangeScreens = 0;
|
||||
case 0:
|
||||
// All side by side
|
||||
grScreens[0]->activate(grWinx, grWiny, grWinw / 5, grWinh, -2.0);
|
||||
grScreens[1]->activate(grWinx + grWinw / 5, grWiny, grWinw / 5, grWinh, -1.0);
|
||||
grScreens[2]->activate(grWinx + grWinw * 2/5, grWiny, grWinw / 5, grWinh, 0.0);
|
||||
grScreens[3]->activate(grWinx + grWinw * 3/5, grWiny, grWinw / 5, grWinh, 1.0);
|
||||
grScreens[4]->activate(grWinx + grWinw * 4/5, grWiny, grWinw / 5, grWinh, 2.0);
|
||||
grScreens[0]->activate(grWinx, grWiny, grWinw / 5, grWinh, -2.0 + 10);
|
||||
grScreens[1]->activate(grWinx + grWinw / 5, grWiny, grWinw / 5, grWinh, -1.0 + 10);
|
||||
grScreens[2]->activate(grWinx + grWinw * 2/5, grWiny, grWinw / 5, grWinh, 0.0 + 10);
|
||||
grScreens[3]->activate(grWinx + grWinw * 3/5, grWiny, grWinw / 5, grWinh, 1.0 + 10);
|
||||
grScreens[4]->activate(grWinx + grWinw * 4/5, grWiny, grWinw / 5, grWinh, 2.0 + 10);
|
||||
break;
|
||||
}
|
||||
for (i=5; i < GR_NB_MAX_SCREEN; i++)
|
||||
|
@ -297,12 +297,12 @@ grAdaptScreenSize(void)
|
|||
grNbArrangeScreens = 0;
|
||||
case 0:
|
||||
// All side by side
|
||||
grScreens[0]->activate(grWinx, grWiny, grWinw / 6, grWinh, -2.5);
|
||||
grScreens[1]->activate(grWinx + grWinw / 6, grWiny, grWinw / 6, grWinh, -1.5);
|
||||
grScreens[2]->activate(grWinx + grWinw * 2/6, grWiny, grWinw / 6, grWinh, -0.5);
|
||||
grScreens[3]->activate(grWinx + grWinw * 3/6, grWiny, grWinw / 6, grWinh, 0.5);
|
||||
grScreens[4]->activate(grWinx + grWinw * 4/6, grWiny, grWinw / 6, grWinh, 1.5);
|
||||
grScreens[5]->activate(grWinx + grWinw * 5/6, grWiny, grWinw / 6, grWinh, 2.5);
|
||||
grScreens[0]->activate(grWinx, grWiny, grWinw / 6, grWinh, -2.5 + 10);
|
||||
grScreens[1]->activate(grWinx + grWinw / 6, grWiny, grWinw / 6, grWinh, -1.5 + 10);
|
||||
grScreens[2]->activate(grWinx + grWinw * 2/6, grWiny, grWinw / 6, grWinh, -0.5 + 10);
|
||||
grScreens[3]->activate(grWinx + grWinw * 3/6, grWiny, grWinw / 6, grWinh, 0.5 + 10);
|
||||
grScreens[4]->activate(grWinx + grWinw * 4/6, grWiny, grWinw / 6, grWinh, 1.5 + 10);
|
||||
grScreens[5]->activate(grWinx + grWinw * 5/6, grWiny, grWinw / 6, grWinh, 2.5 + 10);
|
||||
break;
|
||||
case 1:
|
||||
// Top/Bottom Left/Middle/Rigth Matrix
|
||||
|
|
|
@ -60,7 +60,6 @@ cGrScreen::cGrScreen(int myid)
|
|||
scry = 0;
|
||||
scrw = 800;
|
||||
scrh = 600;
|
||||
viewOffset = 0;
|
||||
}
|
||||
|
||||
cGrScreen::~cGrScreen()
|
||||
|
@ -120,7 +119,6 @@ void cGrScreen::activate(int x, int y, int w, int h, float v)
|
|||
scry = y;
|
||||
scrw = w;
|
||||
scrh = h;
|
||||
viewOffset = v;
|
||||
|
||||
if (boardCam) delete boardCam;
|
||||
|
||||
|
@ -142,6 +140,7 @@ void cGrScreen::activate(int x, int y, int w, int h, float v)
|
|||
if (curCam) {
|
||||
curCam->limitFov ();
|
||||
curCam->setZoom (GR_ZOOM_DFLT);
|
||||
curCam->setViewOffset(v);
|
||||
}
|
||||
active = true;
|
||||
}
|
||||
|
@ -354,7 +353,6 @@ void cGrScreen::update(tSituation *s, const cGrFrameInfo* frameInfo)
|
|||
glEnable(GL_SCISSOR_TEST);
|
||||
glViewport(scrx, scry, scrw, scrh);
|
||||
glScissor(scrx, scry, scrw, scrh);
|
||||
curCam->setViewOffset(viewOffset);
|
||||
dispCam = curCam;
|
||||
camDraw(s);
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
|
|
|
@ -17,6 +17,7 @@ SET(CONFSCREENS_SOURCES ${CS}/playerconfig.cpp ${CS}/controlconfig.cpp
|
|||
${CS}/joystickconfig.cpp ${CS}/mouseconfig.cpp
|
||||
${CS}/joy2butconfig.cpp
|
||||
${CS}/displayconfig.cpp ${CS}/graphconfig.cpp ${CS}/openglconfig.cpp
|
||||
${CS}/monitorconfig.cpp
|
||||
${CS}/simuconfig.cpp ${CS}/soundconfig.cpp ${CS}/aiconfig.cpp
|
||||
${CS}/carsettingsmenu.cpp ${CS}/hostsettingsmenu.cpp
|
||||
${CS}/confscreens.h
|
||||
|
|
270
src/modules/userinterface/legacymenu/confscreens/monitorconfig.cpp
Executable file
270
src/modules/userinterface/legacymenu/confscreens/monitorconfig.cpp
Executable file
|
@ -0,0 +1,270 @@
|
|||
/***************************************************************************
|
||||
|
||||
file : monitorconfig.cpp
|
||||
created : October 2010
|
||||
copyright : (C) 2010 Jean-Philippe Meuret
|
||||
web : speed-dreams.sourceforge.net
|
||||
version : $Id$
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
/* Display configuration menu */
|
||||
|
||||
#include <sstream>
|
||||
|
||||
#include <tgfclient.h>
|
||||
|
||||
#include "legacymenu.h"
|
||||
#include "monitorconfig.h"
|
||||
#include "graphic.h"
|
||||
|
||||
|
||||
// Some consts.
|
||||
static const char* AMonitorTypes[MonitorMenu::nMonitorTypes] = { "4:3", "16:9" };
|
||||
static const char* ASpanSplits[MonitorMenu::nSpanSplits] = { "Disabled", "Enabled" };
|
||||
|
||||
static float _nBezelComp;
|
||||
static int nBezelCompID;
|
||||
|
||||
// The unique MonitorMenu instance.
|
||||
static MonitorMenu* PMonitorMenu = 0;
|
||||
|
||||
|
||||
// Call-backs ================================================================
|
||||
void MonitorMenu::onActivate(void *pMonitorMenu)
|
||||
{
|
||||
// Get the MonitorMenu instance.
|
||||
MonitorMenu* pMenu = static_cast<MonitorMenu*>(pMonitorMenu);
|
||||
|
||||
// Load settings from XML file.
|
||||
pMenu->loadSettings();
|
||||
|
||||
// Initialize GUI from loaded values.
|
||||
pMenu->updateControls();
|
||||
}
|
||||
|
||||
void MonitorMenu::onChangeMonitorType(tComboBoxInfo *pInfo)
|
||||
{
|
||||
// Get the MonitorMenu instance from call-back user data.
|
||||
MonitorMenu* pMenu = static_cast<MonitorMenu*>(pInfo->userData);
|
||||
|
||||
pMenu->setMonitorType((EMonitorType)pInfo->nPos);
|
||||
}
|
||||
|
||||
void MonitorMenu::onChangeSpanSplit(tComboBoxInfo *pInfo)
|
||||
{
|
||||
// Get the MonitorMenu instance from call-back user data.
|
||||
MonitorMenu* pMenu = static_cast<MonitorMenu*>(pInfo->userData);
|
||||
|
||||
pMenu->setSpanSplit((ESpanSplit)pInfo->nPos);
|
||||
}
|
||||
|
||||
void MonitorMenu::onChangeBezelComp(void *)
|
||||
{
|
||||
char* val = GfuiEditboxGetString(PMonitorMenu->getMenuHandle(), nBezelCompID);
|
||||
sscanf(val, "%g", &_nBezelComp);
|
||||
if (_nBezelComp > 120.0f)
|
||||
_nBezelComp = 100.0f;
|
||||
else if (_nBezelComp < 80.0f)
|
||||
_nBezelComp = 80.0f;
|
||||
|
||||
char buf[32];
|
||||
sprintf(buf, "%g", _nBezelComp);
|
||||
GfuiEditboxSetString(PMonitorMenu->getMenuHandle(), nBezelCompID, buf);
|
||||
#if 0
|
||||
// Get the MonitorMenu instance from call-back user data.
|
||||
MonitorMenu* pMenu = static_cast<MonitorMenu*>(pInfo->userData);
|
||||
|
||||
pMenu->setBezelComp((float)pInfo->nPos);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Re-init screen to take new graphical settings into account (implies process restart).
|
||||
void MonitorMenu::onAccept(void *pMonitorMenu)
|
||||
{
|
||||
// Get the MonitorMenu instance from call-back user data.
|
||||
MonitorMenu* pMenu = static_cast<MonitorMenu*>(pMonitorMenu);
|
||||
|
||||
// Force current control to loose focus (if one had it) and update associated variable.
|
||||
GfuiUnSelectCurrent();
|
||||
|
||||
// Save display settings.
|
||||
pMenu->storeSettings();
|
||||
|
||||
// Back to previous screen.
|
||||
GfuiScreenActivate(pMenu->getPreviousMenuHandle());
|
||||
}
|
||||
|
||||
void MonitorMenu::onCancel(void *pMonitorMenu)
|
||||
{
|
||||
// Get the MonitorMenu instance from call-back user data.
|
||||
const MonitorMenu* pMenu = static_cast<MonitorMenu*>(pMonitorMenu);
|
||||
|
||||
// Back to previous screen.
|
||||
GfuiScreenActivate(pMenu->getPreviousMenuHandle());
|
||||
}
|
||||
|
||||
void MonitorMenu::updateControls()
|
||||
{
|
||||
int nControlId = getDynamicControlId("MonitorCombo");
|
||||
GfuiComboboxSetSelectedIndex(getMenuHandle(), nControlId, _eMonitorType);
|
||||
|
||||
nControlId = getDynamicControlId("SpanSplitCombo");
|
||||
GfuiComboboxSetSelectedIndex(getMenuHandle(), nControlId, _eSpanSplit);
|
||||
|
||||
nControlId = getDynamicControlId("BezelCompCombo");
|
||||
GfuiComboboxSetSelectedIndex(getMenuHandle(), nControlId, _nBezelComp);
|
||||
}
|
||||
|
||||
void MonitorMenu::loadSettings()
|
||||
{
|
||||
std::ostringstream ossConfFile;
|
||||
ossConfFile << GfLocalDir() << GR_PARAM_FILE;
|
||||
void* grHandle =
|
||||
GfParmReadFile(ossConfFile.str().c_str(), GFPARM_RMODE_STD | GFPARM_RMODE_CREAT);
|
||||
|
||||
// Monitor Type : 4:3 or 16:9
|
||||
const char *pszMonitorType =
|
||||
GfParmGetStr(grHandle, GR_SCT_MONITOR, GR_ATT_MONITOR, GR_VAL_MONITOR_16BY9);
|
||||
_eMonitorType = strcmp(pszMonitorType, GR_VAL_MONITOR_16BY9) ? e4by3: e16by9;
|
||||
|
||||
// Span Split Screens
|
||||
const char *pszSpanSplit =
|
||||
GfParmGetStr(grHandle, GR_SCT_MONITOR, GR_ATT_SPANSPLIT, GR_VAL_NO);
|
||||
_eSpanSplit = strcmp(pszSpanSplit, GR_VAL_YES) ? eDisabled : eEnabled;
|
||||
|
||||
// Bezel Compensation
|
||||
_nBezelComp = (float)GfParmGetNum(grHandle, GR_SCT_MONITOR, GR_ATT_BEZELCOMP, NULL, 100);
|
||||
|
||||
if (_nBezelComp > 120.0f)
|
||||
_nBezelComp = 100.0f;
|
||||
else if (_nBezelComp < 80.0f)
|
||||
_nBezelComp = 80.0f;
|
||||
|
||||
char buf[32];
|
||||
sprintf(buf, "%g", _nBezelComp);
|
||||
GfuiEditboxSetString(PMonitorMenu->getMenuHandle(), nBezelCompID, buf);
|
||||
|
||||
// Release screen config params file.
|
||||
GfParmReleaseHandle(grHandle);
|
||||
}
|
||||
|
||||
// Save graphical settings to XML file.
|
||||
void MonitorMenu::storeSettings() const
|
||||
{
|
||||
std::ostringstream ossConfFile;
|
||||
ossConfFile << GfLocalDir() << GR_PARAM_FILE;
|
||||
void* grHandle =
|
||||
GfParmReadFile(ossConfFile.str().c_str(), GFPARM_RMODE_STD | GFPARM_RMODE_CREAT);
|
||||
|
||||
const char* pszMonitorType =
|
||||
(_eMonitorType == e16by9) ? GR_VAL_MONITOR_16BY9 : GR_VAL_MONITOR_4BY3;
|
||||
GfParmSetStr(grHandle, GR_SCT_MONITOR, GR_ATT_MONITOR, pszMonitorType);
|
||||
|
||||
const char* pszSpanSplit =
|
||||
(_eSpanSplit == eEnabled) ? GR_VAL_YES : GR_VAL_NO;
|
||||
GfParmSetStr(grHandle, GR_SCT_MONITOR, GR_ATT_SPANSPLIT, pszSpanSplit);
|
||||
|
||||
GfParmSetNum(grHandle, GR_SCT_MONITOR, GR_ATT_BEZELCOMP, (char*)NULL, _nBezelComp);
|
||||
|
||||
// Write and release screen config params file.
|
||||
GfParmWriteFile(NULL, grHandle, "Screen");
|
||||
GfParmReleaseHandle(grHandle);
|
||||
}
|
||||
|
||||
void MonitorMenu::setMonitorType(EMonitorType eMode)
|
||||
{
|
||||
_eMonitorType = eMode;
|
||||
}
|
||||
|
||||
void MonitorMenu::setSpanSplit(ESpanSplit eMode)
|
||||
{
|
||||
_eSpanSplit = eMode;
|
||||
}
|
||||
|
||||
void MonitorMenu::setBezelComp(float value)
|
||||
{
|
||||
_nBezelComp = value;
|
||||
}
|
||||
|
||||
MonitorMenu::MonitorMenu()
|
||||
: GfuiMenuScreen("monitorconfigmenu.xml")
|
||||
{
|
||||
_eMonitorType = e16by9;
|
||||
_eSpanSplit = eDisabled;
|
||||
_nBezelComp = 1.0;
|
||||
}
|
||||
|
||||
bool MonitorMenu::initialize(void *pPreviousMenu)
|
||||
{
|
||||
// Save the menu to return to.
|
||||
setPreviousMenuHandle(pPreviousMenu);
|
||||
|
||||
// Create the menu and all its controls.
|
||||
createMenu(NULL, this, onActivate, NULL, (tfuiCallback)NULL, 1);
|
||||
|
||||
void *param = GfuiMenuLoad("monitorconfigmenu.xml");
|
||||
|
||||
openXMLDescriptor();
|
||||
|
||||
createStaticControls();
|
||||
|
||||
const int nMonitorTypeComboId =
|
||||
createComboboxControl("MonitorTypeCombo", this, onChangeMonitorType);
|
||||
|
||||
const int nSpanSplitComboId =
|
||||
createComboboxControl("SpanSplitCombo", this, onChangeSpanSplit);
|
||||
|
||||
nBezelCompID = GfuiMenuCreateEditControl(getMenuHandle(), param, "BezelCompEdit", (void*)1, NULL, onChangeBezelComp);
|
||||
// createComboboxControl("BezelCompEdit", this, onChangeBezelComp);
|
||||
|
||||
createButtonControl("ApplyButton", this, onAccept);
|
||||
createButtonControl("CancelButton", this, onCancel);
|
||||
|
||||
addShortcut(GFUIK_RETURN, "Apply", this, onAccept, 0);
|
||||
addShortcut(GFUIK_ESCAPE, "Cancel", this, onCancel, 0);
|
||||
// TODO Keyboard shortcuts: Add support for shortcuts in GfuiCombobox ?
|
||||
//addShortcut(GFUIK_LEFT, "Previous Resolution", this, onChangeScreenSize, 0);
|
||||
//addShortcut(GFUIK_RIGHT, "Next Resolution", this, onChangeScreenSize, 0);
|
||||
addShortcut(GFUIK_F1, "Help", getMenuHandle(), GfuiHelpScreen, 0);
|
||||
addShortcut(GFUIK_F12, "Screen-Shot", 0, GfuiScreenShot, 0);
|
||||
|
||||
closeXMLDescriptor();
|
||||
|
||||
// Load constant value lists in combo-boxes.
|
||||
// 1) Monitor Type
|
||||
for (int nMonitorTypeInd = 0; nMonitorTypeInd < nMonitorTypes; nMonitorTypeInd++)
|
||||
GfuiComboboxAddText(getMenuHandle(), nMonitorTypeComboId, AMonitorTypes[nMonitorTypeInd]);
|
||||
|
||||
// 2) Span Split Screens - for wide displays
|
||||
for (int nSpanSplitInd = 0; nSpanSplitInd < nSpanSplits; nSpanSplitInd++)
|
||||
GfuiComboboxAddText(getMenuHandle(), nSpanSplitComboId, ASpanSplits[nSpanSplitInd]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Create and activate the monitor options menu screen.
|
||||
@ingroup screen
|
||||
@param precMenu previous menu to return to
|
||||
*/
|
||||
void* MonitorMenuInit(void *pPreviousMenu)
|
||||
{
|
||||
if (!PMonitorMenu)
|
||||
{
|
||||
PMonitorMenu = new MonitorMenu;
|
||||
|
||||
PMonitorMenu->initialize(pPreviousMenu);
|
||||
}
|
||||
|
||||
return PMonitorMenu->getMenuHandle();
|
||||
}
|
||||
|
70
src/modules/userinterface/legacymenu/confscreens/monitorconfig.h
Executable file
70
src/modules/userinterface/legacymenu/confscreens/monitorconfig.h
Executable file
|
@ -0,0 +1,70 @@
|
|||
/***************************************************************************
|
||||
|
||||
file : displayconfig.h
|
||||
created : October 2010
|
||||
copyright : (C) 2010 Jean-Philippe Meuret
|
||||
web : speed-dreams.sourceforge.net
|
||||
version : $Id$
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* 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. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef _MONITORCONFIG_H_
|
||||
#define _MONITORCONFIG_H_
|
||||
|
||||
#include <tgfclient.h>
|
||||
|
||||
#include "confscreens.h"
|
||||
|
||||
class MonitorMenu : public GfuiMenuScreen
|
||||
{
|
||||
public:
|
||||
|
||||
MonitorMenu();
|
||||
bool initialize(void* pPreviousMenu);
|
||||
|
||||
enum EMonitorType { e4by3 = 0, e16by9 = 1, nMonitorTypes };
|
||||
enum ESpanSplit { eDisabled = 0, eEnabled = 1, nSpanSplits };
|
||||
|
||||
void setMonitorType(EMonitorType eMode);
|
||||
void setSpanSplit(ESpanSplit eMode);
|
||||
void setBezelComp(float value);
|
||||
|
||||
void storeSettings() const;
|
||||
void loadSettings();
|
||||
|
||||
void updateControls();
|
||||
|
||||
protected:
|
||||
|
||||
// Control callback functions (must be static).
|
||||
static void onActivate(void *pMonitorMenu);
|
||||
static void onChangeMonitorType(tComboBoxInfo *pInfo);
|
||||
static void onChangeSpanSplit(tComboBoxInfo *pInfo);
|
||||
static void onChangeBezelComp(void *);
|
||||
|
||||
static void onAccept(void *pMonitorMenu);
|
||||
static void onCancel(void *pMonitorMenu);
|
||||
|
||||
private:
|
||||
|
||||
//! Current Setting for Monitor Type
|
||||
EMonitorType _eMonitorType;
|
||||
|
||||
//! Current Setting for Span Splits
|
||||
ESpanSplit _eSpanSplit;
|
||||
|
||||
|
||||
};
|
||||
|
||||
extern void* MonitorMenuInit(void* pPreviousMenu);
|
||||
|
||||
#endif //_MONITORCONFIG_H_
|
Loading…
Reference in a new issue