bool StApplication::open() { if(!myWindow.isNull()) { return true; } StSettings aGlobalSettings(myResMgr, "sview"); if(!mySwitchTo.isNull()) { myRendId = mySwitchTo->getRendererId(); myWindow = mySwitchTo; mySwitchTo.nullify(); aGlobalSettings.saveString(ST_SETTING_RENDERER, myRendId); aGlobalSettings.saveBool (ST_SETTING_RENDERER_AUTO, false); } else { if(myRenderers.isEmpty()) { myWindow = new StWindow(myResMgr, myWinParent); myWindow->setMessagesQueue(myMsgQueue); myWindow->params.VSyncMode = params.VSyncMode; } else { bool isAuto = myRendId.isEqualsIgnoreCase(ST_SETTING_AUTO_VALUE); if(!isAuto) { for(size_t anIter = 0; anIter < myRenderers.size(); ++anIter) { StHandle<StWindow> aWin = myRenderers[anIter]; if(myRendId == aWin->getRendererId()) { myWindow = aWin; aGlobalSettings.saveString(ST_SETTING_RENDERER, myRendId); aGlobalSettings.saveBool (ST_SETTING_RENDERER_AUTO, isAuto); break; } } if(myWindow.isNull()) { stError(StString("Output with id '" + myRendId + "' is not found.")); isAuto = true; } } if(isAuto) { // autodetection aGlobalSettings.saveString(ST_SETTING_RENDERER, ST_SETTING_AUTO_VALUE); aGlobalSettings.saveBool (ST_SETTING_RENDERER_AUTO, isAuto); myWindow = myRenderers[0]; if(!myDevices.isEmpty()) { StHandle<StOutDevice> aBestDev = myDevices[0]; for(size_t aDevIter = 0; aDevIter < myDevices.size(); ++aDevIter) { const StHandle<StOutDevice>& aDev = myDevices[aDevIter]; if(aDev->Priority > aBestDev->Priority) { aBestDev = aDev; } } for(size_t anIter = 0; anIter < myRenderers.size(); ++anIter) { const StHandle<StWindow>& aWin = myRenderers[anIter]; if(aBestDev->PluginId == aWin->getRendererId()) { myWindow = aWin; myWindow->setDevice(aBestDev->DeviceId); break; } } } } } myWindow->setTitle(myTitle); } // synchronize devices enumeration const StString aPluginId = myWindow->getRendererId(); const StString aDeviceId = myWindow->getDeviceId(); for(size_t aDevIter = 0; aDevIter < myDevices.size(); ++aDevIter) { const StHandle<StOutDevice>& aDev = myDevices[aDevIter]; if(aPluginId == aDev->PluginId && aDeviceId == aDev->DeviceId) { params.ActiveDevice->setValue((int32_t )aDevIter); break; } } // setup GL options before window creation const StWinAttr anAttribs[] = { StWinAttr_GlDebug, (StWinAttr )myGlDebug, StWinAttr_NULL }; myWindow->setAttributes(anAttribs); myIsOpened = myWindow->create(); if(myIsOpened) { // connect slots myWindow->signals.onRedraw = stSlot(this, &StApplication::doDrawProxy); myWindow->signals.onClose = stSlot(this, &StApplication::doClose); myWindow->signals.onPause = stSlot(this, &StApplication::doPause); myWindow->signals.onResize = stSlot(this, &StApplication::doResize); myWindow->signals.onAction = stSlot(this, &StApplication::doAction); myWindow->signals.onKeyDown = stSlot(this, &StApplication::doKeyDown); myWindow->signals.onKeyUp = stSlot(this, &StApplication::doKeyUp); myWindow->signals.onKeyHold = stSlot(this, &StApplication::doKeyHold); myWindow->signals.onMouseDown = stSlot(this, &StApplication::doMouseDown); myWindow->signals.onMouseUp = stSlot(this, &StApplication::doMouseUp); myWindow->signals.onTouch = stSlot(this, &StApplication::doTouch); myWindow->signals.onGesture = stSlot(this, &StApplication::doGesture); myWindow->signals.onScroll = stSlot(this, &StApplication::doScroll); myWindow->signals.onFileDrop = stSlot(this, &StApplication::doFileDrop); myWindow->signals.onNavigate = stSlot(this, &StApplication::doNavigate); } return myIsOpened; }