void WindowManager::resize( GenericLayout &rLayout, int width, int height ) const { // TODO: handle anchored windows // Compute the real resizing offset int xOffset = width - rLayout.getWidth(); int yOffset = height - rLayout.getHeight(); // Check anchoring; this can change the values of xOffset and yOffset checkAnchors( rLayout.getWindow(), xOffset, yOffset ); if( m_direction == kResizeS ) xOffset = 0; if( m_direction == kResizeE ) yOffset = 0; int newWidth = rLayout.getWidth() + xOffset; int newHeight = rLayout.getHeight() + yOffset; // Check boundaries if( newWidth < rLayout.getMinWidth() ) { newWidth = rLayout.getMinWidth(); } if( newWidth > rLayout.getMaxWidth() ) { newWidth = rLayout.getMaxWidth(); } if( newHeight < rLayout.getMinHeight() ) { newHeight = rLayout.getMinHeight(); } if( newHeight > rLayout.getMaxHeight() ) { newHeight = rLayout.getMaxHeight(); } if( newWidth == rLayout.getWidth() && newHeight == rLayout.getHeight() ) { return; } // New offset, after the last corrections int xNewOffset = newWidth - rLayout.getWidth(); int yNewOffset = newHeight - rLayout.getHeight(); // Resize the window TopWindow *pWindow = rLayout.getWindow(); pWindow->resize( newWidth, newHeight ); // Do the actual resizing rLayout.resize( newWidth, newHeight ); // refresh content rLayout.refreshAll(); // Move all the anchored windows WinSet_t::const_iterator it; if( m_direction == kResizeE || m_direction == kResizeSE ) { for( it = m_resizeMovingE.begin(); it != m_resizeMovingE.end(); ++it ) { (*it)->move( (*it)->getLeft() + xNewOffset, (*it)->getTop() ); } } if( m_direction == kResizeS || m_direction == kResizeSE ) { for( it = m_resizeMovingS.begin(); it != m_resizeMovingS.end(); ++it ) { (*it)->move( (*it)->getLeft(), (*it)->getTop( )+ yNewOffset ); } } if( m_direction == kResizeE || m_direction == kResizeS || m_direction == kResizeSE ) { for( it = m_resizeMovingSE.begin(); it != m_resizeMovingSE.end(); ++it ) { (*it)->move( (*it)->getLeft() + xNewOffset, (*it)->getTop() + yNewOffset ); } } }
void Theme::loadConfig() { msg_Dbg( getIntf(), "loading theme configuration"); // Get config from vlcrc file char *save = config_GetPsz( getIntf(), "skins2-config" ); if( !save ) return; // Is there an existing config? if( !strcmp( save, "" ) ) { // Show the windows as indicated by the XML file m_windowManager.showAll( true ); return; } istringstream inStream(save); free( save ); char sep; string winId, layId; int x, y, width, height, visible; bool somethingVisible = false; while( !inStream.eof() ) { inStream >> sep; if( sep != '[' ) goto invalid; inStream >> winId >> layId >> x >> y >> width >> height >> visible >> sep >> ws; if( sep != ']' ) goto invalid; // Try to find the window and the layout map<string, TopWindowPtr>::const_iterator itWin; map<string, GenericLayoutPtr>::const_iterator itLay; itWin = m_windows.find( winId ); itLay = m_layouts.find( layId ); if( itWin == m_windows.end() || itLay == m_layouts.end() ) { goto invalid; } TopWindow *pWin = itWin->second.get(); GenericLayout *pLayout = itLay->second.get(); // Restore the layout m_windowManager.setActiveLayout( *pWin, *pLayout ); if( pLayout->getWidth() != width || pLayout->getHeight() != height ) { // XXX FIXME XXX: big kludge // As resizing a hidden window causes some trouble (at least on // Windows), first show the window off screen, resize it, and // hide it again. // This has to be investigated more deeply! m_windowManager.startMove( *pWin ); m_windowManager.move( *pWin, -width - pLayout->getWidth(), 0); m_windowManager.stopMove(); m_windowManager.show( *pWin ); m_windowManager.startResize( *pLayout, WindowManager::kResizeSE ); m_windowManager.resize( *pLayout, width, height ); m_windowManager.stopResize(); m_windowManager.hide( *pWin ); } // Move the window (which incidentally takes care of the anchoring) m_windowManager.startMove( *pWin ); m_windowManager.move( *pWin, x, y ); m_windowManager.stopMove(); if( visible ) { somethingVisible = true; m_windowManager.show( *pWin ); } } if( !somethingVisible ) { goto invalid; } return; invalid: msg_Warn( getIntf(), "invalid config: %s", inStream.str().c_str() ); // Restore the visibility defined in the theme m_windowManager.showAll( true ); }