void WindowManager::startResize( GenericLayout &rLayout, Direction_t direction ) { m_direction = direction; // Rebuild the set of moving windows. // From the resized window, we only take into account the anchors which // are mobile with the current type of resizing, and that are hanging a // window. The hanged windows will come will all their dependencies. m_resizeMovingE.clear(); m_resizeMovingS.clear(); m_resizeMovingSE.clear(); WinSet_t::const_iterator itWin; AncList_t::const_iterator itAnc1, itAnc2; // Get the anchors of the layout const AncList_t &ancList1 = rLayout.getAnchorList(); // Iterate through all the hanged windows for( itWin = m_dependencies[rLayout.getWindow()].begin(); itWin != m_dependencies[rLayout.getWindow()].end(); ++itWin ) { // Now, check for anchoring between the 2 windows const AncList_t &ancList2 = (*itWin)->getActiveLayout().getAnchorList(); for( itAnc1 = ancList1.begin(); itAnc1 != ancList1.end(); ++itAnc1 ) { for( itAnc2 = ancList2.begin(); itAnc2 != ancList2.end(); ++itAnc2 ) { if( (*itAnc1)->isHanging( **itAnc2 ) ) { // Add the dependencies of the hanged window to one of the // lists of moving windows Position::Ref_t aRefPos = (*itAnc1)->getPosition().getRefLeftTop(); if( aRefPos == Position::kRightTop ) buildDependSet( m_resizeMovingE, *itWin ); else if( aRefPos == Position::kLeftBottom ) buildDependSet( m_resizeMovingS, *itWin ); else if( aRefPos == Position::kRightBottom ) buildDependSet( m_resizeMovingSE, *itWin ); break; } } } } // The checkAnchors() method will need to have m_movingWindows properly set // so let's insert in it the contents of the other sets m_movingWindows.clear(); m_movingWindows.insert( rLayout.getWindow() ); m_movingWindows.insert( m_resizeMovingE.begin(), m_resizeMovingE.end() ); m_movingWindows.insert( m_resizeMovingS.begin(), m_resizeMovingS.end() ); m_movingWindows.insert( m_resizeMovingSE.begin(), m_resizeMovingSE.end() ); }
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 ); }