not quite so much needs to be delayed to the init() function
[personal-kdebase.git] / workspace / kwin / data / update_window_settings.cpp
blobda09d9e033b0b0aa795c160560cac839ebb53af9
1 /********************************************************************
2 KWin - the KDE window manager
3 This file is part of the KDE project.
5 Copyright (C) 2004 Lubos Lunak <l.lunak@kde.org>
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *********************************************************************/
21 // updates per-window settings from KDE3.2 to KDE3.3
23 #include <netwm_def.h>
24 #include <kconfig.h>
25 #include <kconfiggroup.h>
26 #include <kcomponentdata.h>
27 #include <QRect>
28 #include <QByteArray>
29 #include <QList>
30 #include <QtDBus/QtDBus>
31 struct SessionInfo
33 QByteArray sessionId;
34 QByteArray windowRole;
35 QByteArray wmCommand;
36 QByteArray wmClientMachine;
37 QByteArray resourceName;
38 QByteArray resourceClass;
40 QRect geometry;
41 QRect restore;
42 QRect fsrestore;
43 int maximized;
44 int fullscreen;
45 int desktop;
46 bool minimized;
47 bool onAllDesktops;
48 bool shaded;
49 bool keepAbove;
50 bool keepBelow;
51 bool skipTaskbar;
52 bool skipPager;
53 bool userNoBorder;
54 bool active; // means 'was active in the saved session', not used otherwise
55 bool fake; // fake session, i.e. 'save window settings', not SM restored
56 NET::WindowType windowType;
59 QList<SessionInfo*> fakeSession;
61 static const char* const window_type_names[] =
63 "Unknown", "Normal" , "Desktop", "Dock", "Toolbar", "Menu", "Dialog",
64 "Override", "TopMenu", "Utility", "Splash"
66 // change also the two functions below when adding new entries
68 NET::WindowType txtToWindowType( const char* txt )
70 for( int i = NET::Unknown;
71 i <= NET::Splash;
72 ++i )
73 if( qstrcmp( txt, window_type_names[ i + 1 ] ) == 0 ) // +1
74 return static_cast< NET::WindowType >( i );
75 return static_cast< NET::WindowType >( -2 ); // undefined
78 void loadFakeSessionInfo( KConfig* config )
80 fakeSession.clear();
81 KConfigGroup fakeGroup(config, "FakeSession");
82 int count = fakeGroup.readEntry( "count",0 );
83 for ( int i = 1; i <= count; i++ )
85 QString n = QString::number(i);
86 SessionInfo* info = new SessionInfo;
87 fakeSession.append( info );
88 info->windowRole = fakeGroup.readEntry( QString("windowRole")+n, QString() ).toLatin1();
89 info->resourceName = fakeGroup.readEntry( QString("resourceName")+n, QString() ).toLatin1();
90 info->resourceClass = fakeGroup.readEntry( QString("resourceClass")+n, QString() ).toLower().toLatin1();
91 info->wmClientMachine = fakeGroup.readEntry( QString("clientMachine")+n, QString() ).toLatin1();
92 info->geometry = fakeGroup.readEntry( QString("geometry")+n, QRect() );
93 info->restore = fakeGroup.readEntry( QString("restore")+n, QRect() );
94 info->fsrestore = fakeGroup.readEntry( QString("fsrestore")+n, QRect() );
95 info->maximized = fakeGroup.readEntry( QString("maximize")+n, 0 );
96 info->fullscreen = fakeGroup.readEntry( QString("fullscreen")+n, 0 );
97 info->desktop = fakeGroup.readEntry( QString("desktop")+n, 0 );
98 info->minimized = fakeGroup.readEntry( QString("iconified")+n, false );
99 info->onAllDesktops = fakeGroup.readEntry( QString("sticky")+n, false );
100 info->shaded = fakeGroup.readEntry( QString("shaded")+n, false );
101 info->keepAbove = fakeGroup.readEntry( QString("staysOnTop")+n, false );
102 info->keepBelow = fakeGroup.readEntry( QString("keepBelow")+n, false );
103 info->skipTaskbar = fakeGroup.readEntry( QString("skipTaskbar")+n, false );
104 info->skipPager = fakeGroup.readEntry( QString("skipPager")+n, false );
105 info->userNoBorder = fakeGroup.readEntry( QString("userNoBorder")+n, false );
106 info->windowType = txtToWindowType( fakeGroup.readEntry( QString("windowType")+n, QString() ).toLatin1());
107 info->active = false;
108 info->fake = true;
110 config->deleteGroup( "FakeSession" );
113 void writeRules( KConfig& cfg )
115 KConfigGroup cg(&cfg, "General");
116 int pos = cg.readEntry( "count",0 );
118 QList<SessionInfo*>::iterator it;
119 for ( it = fakeSession.begin(); it != fakeSession.end(); ++it)
121 if( (*it)->resourceName.isEmpty() && (*it)->resourceClass.isEmpty())
122 continue;
123 ++pos;
124 KConfigGroup groupCfg(&cfg, QString::number( pos ));
125 groupCfg.writeEntry( "description", ( const char* ) ( (*it)->resourceClass + " (KDE3.2)" ));
126 groupCfg.writeEntry( "wmclass", ( const char* )( (*it)->resourceName + ' ' + (*it)->resourceClass ));
127 groupCfg.writeEntry( "wmclasscomplete", true );
128 groupCfg.writeEntry( "wmclassmatch", 1 ); // 1 == exact match
129 if( !(*it)->windowRole.isEmpty())
131 groupCfg.writeEntry( "windowrole", ( const char* ) (*it)->windowRole );
132 groupCfg.writeEntry( "windowrolematch", 1 );
134 if( (*it)->windowType == static_cast< NET::WindowType >( -2 )) // undefined
135 {} // all types
136 if( (*it)->windowType == NET::Unknown )
137 groupCfg.writeEntry( "types", (int)NET::NormalMask );
138 else
139 groupCfg.writeEntry( "types", 1 << (*it)->windowType );
140 groupCfg.writeEntry( "position", (*it)->geometry.topLeft());
141 groupCfg.writeEntry( "positionrule", 4 ); // 4 == remember
142 groupCfg.writeEntry( "size", (*it)->geometry.size());
143 groupCfg.writeEntry( "sizerule", 4 );
144 groupCfg.writeEntry( "maximizevert", (*it)->maximized & NET::MaxVert );
145 groupCfg.writeEntry( "maximizevertrule", 4 );
146 groupCfg.writeEntry( "maximizehoriz", (*it)->maximized & NET::MaxHoriz );
147 groupCfg.writeEntry( "maximizehorizrule", 4 );
148 groupCfg.writeEntry( "fullscreen", (*it)->fullscreen );
149 groupCfg.writeEntry( "fullscreenrule", 4 );
150 groupCfg.writeEntry( "desktop", (*it)->desktop );
151 groupCfg.writeEntry( "desktoprule", 4 );
152 groupCfg.writeEntry( "minimize", (*it)->minimized );
153 groupCfg.writeEntry( "minimizerule", 4 );
154 groupCfg.writeEntry( "shade", (*it)->shaded );
155 groupCfg.writeEntry( "shaderule", 4 );
156 groupCfg.writeEntry( "above", (*it)->keepAbove );
157 groupCfg.writeEntry( "aboverule", 4 );
158 groupCfg.writeEntry( "below", (*it)->keepBelow );
159 groupCfg.writeEntry( "belowrule", 4 );
160 groupCfg.writeEntry( "skiptaskbar", (*it)->skipTaskbar );
161 groupCfg.writeEntry( "skiptaskbarrule", 4 );
162 groupCfg.writeEntry( "skippager", (*it)->skipPager );
163 groupCfg.writeEntry( "skippagerrule", 4 );
164 groupCfg.writeEntry( "noborder", (*it)->userNoBorder );
165 groupCfg.writeEntry( "noborderrule", 4 );
167 cg.writeEntry( "count", pos );
170 int main()
172 KComponentData inst( "kwin_update_window_settings" );
173 KConfig src_cfg( "kwinrc" );
174 KConfig dest_cfg( "kwinrulesrc" );
175 loadFakeSessionInfo( &src_cfg );
176 writeRules( dest_cfg );
177 src_cfg.sync();
178 dest_cfg.sync();
179 // Send signal to all kwin instances
180 QDBusMessage message =
181 QDBusMessage::createSignal("/KWin", "org.kde.KWin", "reloadConfig");
182 QDBusConnection::sessionBus().send(message);