*****************************************************************************/
#include "theme.hpp"
+#include "top_window.hpp"
+#include <sstream>
Theme::~Theme()
// Is there an existing config?
if( !strcmp( save, "" ) )
{
- // Show the windows
+ // Show the windows as indicated by the XML file
m_windowManager.showAll( true );
return;
}
- // Initialization
- map<string, TopWindowPtr>::const_iterator it;
- int i = 0;
- int x, y, visible, scan;
+ istringstream inStream(save);
+ free( save );
- // Get config for each window
- for( it = m_windows.begin(); it != m_windows.end(); it++ )
+ char sep;
+ string winId, layId;
+ int x, y, width, height, visible;
+ bool somethingVisible = false;
+ while( !inStream.eof() )
{
- TopWindow *pWin = (*it).second.get();
- // Get config
- scan = sscanf( &save[i * 13], "(%4d,%4d,%1d)", &x, &y, &visible );
+ 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();
- // If config has the correct number of arguments
- if( scan > 2 )
+ // 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, x, y );
+ m_windowManager.move( *pWin, -width - pLayout->getWidth(), 0);
m_windowManager.stopMove();
- if( visible )
- {
- m_windowManager.show( *pWin );
- }
+ 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 );
+ }
+ }
- // Next window
- i++;
+ if( !somethingVisible )
+ {
+ goto invalid;
}
- free( save );
+ return;
+
+invalid:
+ msg_Warn( getIntf(), "invalid config: %s", inStream.str().c_str() );
+ // Restore the visibility defined in the theme
+ m_windowManager.showAll( true );
}
{
msg_Dbg( getIntf(), "saving theme configuration");
- // Initialize char where config is stored
- char *save = new char[400];
- map<string, TopWindowPtr>::const_iterator it;
- int i = 0;
- int x, y;
-
- // Save config of every window
- for( it = m_windows.begin(); it != m_windows.end(); it++ )
+ map<string, TopWindowPtr>::const_iterator itWin;
+ map<string, GenericLayoutPtr>::const_iterator itLay;
+ ostringstream outStream;
+ for( itWin = m_windows.begin(); itWin != m_windows.end(); itWin++ )
{
- TopWindow *pWin = (*it).second.get();
- // Print config
- x = pWin->getLeft();
- y = pWin->getTop();
- sprintf( &save[i * 13], "(%4d,%4d,%1d)", x, y,
- pWin->getVisibleVar().get() );
- i++;
+ TopWindow *pWin = itWin->second.get();
+
+ // Find the layout id for this window
+ string layoutId;
+ const GenericLayout *pLayout = &pWin->getActiveLayout();
+ for( itLay = m_layouts.begin(); itLay != m_layouts.end(); itLay++ )
+ {
+ if( itLay->second.get() == pLayout )
+ {
+ layoutId = itLay->first;
+ }
+ }
+
+ outStream << '[' << itWin->first << ' ' << layoutId << ' '
+ << pWin->getLeft() << ' ' << pWin->getTop() << ' '
+ << pLayout->getWidth() << ' ' << pLayout->getHeight() << ' '
+ << (pWin->getVisibleVar().get() ? 1 : 0) << ']';
}
// Save config to file
- config_PutPsz( getIntf(), "skins2-config", save );
-
- // Free memory
- delete[] save;
+ config_PutPsz( getIntf(), "skins2-config", outStream.str().c_str() );
}