Add command to toggle fullscreen mode.
This commit is contained in:
parent
4e6f0e18fd
commit
b577ec70fc
4 changed files with 80 additions and 5 deletions
|
@ -379,6 +379,17 @@ do_view_prev( bool )
|
||||||
globals->get_viewmgr()->prev_view();
|
globals->get_viewmgr()->prev_view();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An fgcommand to toggle fullscreen mode.
|
||||||
|
* No parameters.
|
||||||
|
*/
|
||||||
|
static bool
|
||||||
|
do_toggle_fullscreen(const SGPropertyNode *arg)
|
||||||
|
{
|
||||||
|
fgOSFullScreen();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Built-in command: cycle view.
|
* Built-in command: cycle view.
|
||||||
*/
|
*/
|
||||||
|
@ -1533,6 +1544,7 @@ do_profiler_stop(const SGPropertyNode *arg)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
// Command setup.
|
// Command setup.
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -1559,6 +1571,7 @@ static struct {
|
||||||
{ "load-tape", do_load_tape },
|
{ "load-tape", do_load_tape },
|
||||||
{ "panel-load", do_panel_load },
|
{ "panel-load", do_panel_load },
|
||||||
{ "preferences-load", do_preferences_load },
|
{ "preferences-load", do_preferences_load },
|
||||||
|
{ "toggle-fullscreen", do_toggle_fullscreen },
|
||||||
{ "view-cycle", do_view_cycle },
|
{ "view-cycle", do_view_cycle },
|
||||||
{ "screen-capture", do_screen_capture },
|
{ "screen-capture", do_screen_capture },
|
||||||
{ "hires-screen-capture", do_hires_screen_capture },
|
{ "hires-screen-capture", do_hires_screen_capture },
|
||||||
|
|
|
@ -309,9 +309,72 @@ void fgOSInit(int* argc, char** argv)
|
||||||
WindowSystemAdapter::setWSA(new WindowSystemAdapter);
|
WindowSystemAdapter::setWSA(new WindowSystemAdapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Noop
|
|
||||||
void fgOSFullScreen()
|
void fgOSFullScreen()
|
||||||
{
|
{
|
||||||
|
std::vector<osgViewer::GraphicsWindow*> windows;
|
||||||
|
viewer->getWindows(windows);
|
||||||
|
|
||||||
|
if (windows.size() == 0)
|
||||||
|
return; // Huh?!?
|
||||||
|
|
||||||
|
/* Toggling window fullscreen is only supported for the main GUI window.
|
||||||
|
* The other windows should use fixed setup from the camera.xml file anyway. */
|
||||||
|
osgViewer::GraphicsWindow* window = windows[0];
|
||||||
|
|
||||||
|
{
|
||||||
|
osg::GraphicsContext::WindowingSystemInterface *wsi = osg::GraphicsContext::getWindowingSystemInterface();
|
||||||
|
|
||||||
|
if (wsi == NULL)
|
||||||
|
{
|
||||||
|
SG_LOG(SG_VIEW, SG_ALERT, "ERROR: No WindowSystemInterface available. Cannot toggle window fullscreen.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int previous_x = 0;
|
||||||
|
static int previous_y = 0;
|
||||||
|
static int previous_width = 800;
|
||||||
|
static int previous_height = 600;
|
||||||
|
|
||||||
|
unsigned int screenWidth;
|
||||||
|
unsigned int screenHeight;
|
||||||
|
wsi->getScreenResolution(*(window->getTraits()), screenWidth, screenHeight);
|
||||||
|
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
window->getWindowRectangle(x, y, width, height);
|
||||||
|
|
||||||
|
bool isFullScreen = x == 0 && y == 0 && width == (int)screenWidth && height == (int)screenHeight;
|
||||||
|
|
||||||
|
SG_LOG(SG_VIEW, SG_DEBUG, "Toggling fullscreen. Previous window rectangle ("
|
||||||
|
<< x << ", " << y << ") x (" << width << ", " << height << "), fullscreen: " << isFullScreen);
|
||||||
|
if (isFullScreen)
|
||||||
|
{
|
||||||
|
// disable fullscreen mode, restore previous window size/coordinates
|
||||||
|
window->setWindowDecoration(true);
|
||||||
|
// limit x,y coordinates and window size to screen area
|
||||||
|
if (previous_x + previous_width > (int)screenWidth)
|
||||||
|
previous_x = 0;
|
||||||
|
if (previous_y + previous_height > (int)screenHeight)
|
||||||
|
previous_y = 0;
|
||||||
|
window->setWindowRectangle(previous_x, previous_y, previous_width, previous_height);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// remember previous setting
|
||||||
|
previous_x = x;
|
||||||
|
previous_y = y;
|
||||||
|
previous_width = width;
|
||||||
|
previous_height = height;
|
||||||
|
|
||||||
|
// enable fullscreen
|
||||||
|
window->setWindowDecoration(false);
|
||||||
|
window->setWindowRectangle(0, 0, screenWidth, screenHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
window->grabFocusIfPointerInWindow();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setMouseCursor(osgViewer::GraphicsWindow* gw, int cursor)
|
static void setMouseCursor(osgViewer::GraphicsWindow* gw, int cursor)
|
||||||
|
|
|
@ -1380,10 +1380,6 @@ FGRenderer::setupView( void )
|
||||||
osg::PolygonOffset::setUnitsMultiplier(1);
|
osg::PolygonOffset::setUnitsMultiplier(1);
|
||||||
osg::PolygonOffset::setFactorMultiplier(1);
|
osg::PolygonOffset::setFactorMultiplier(1);
|
||||||
|
|
||||||
// Go full screen if requested ...
|
|
||||||
if ( fgGetBool("/sim/startup/fullscreen") )
|
|
||||||
fgOSFullScreen();
|
|
||||||
|
|
||||||
// build the sky
|
// build the sky
|
||||||
// The sun and moon diameters are scaled down numbers of the
|
// The sun and moon diameters are scaled down numbers of the
|
||||||
// actual diameters. This was needed to fit both the sun and the
|
// actual diameters. This was needed to fit both the sun and the
|
||||||
|
|
|
@ -61,6 +61,9 @@ FGViewer::FGViewer( fgViewType Type, bool from_model, int from_model_index,
|
||||||
_roll_deg(0),
|
_roll_deg(0),
|
||||||
_pitch_deg(0),
|
_pitch_deg(0),
|
||||||
_heading_deg(0),
|
_heading_deg(0),
|
||||||
|
_target_roll_deg(0),
|
||||||
|
_target_pitch_deg(0),
|
||||||
|
_target_heading_deg(0),
|
||||||
_scaling_type(FG_SCALING_MAX),
|
_scaling_type(FG_SCALING_MAX),
|
||||||
_cameraGroup(CameraGroup::getDefault())
|
_cameraGroup(CameraGroup::getDefault())
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue