~ubuntu-branches/ubuntu/utopic/kde-workspace/utopic-proposed

« back to all changes in this revision

Viewing changes to kwin/data/update_window_settings.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Michał Zając
  • Date: 2011-07-09 08:31:15 UTC
  • Revision ID: james.westby@ubuntu.com-20110709083115-ohyxn6z93mily9fc
Tags: upstream-4.6.90
Import upstream version 4.6.90

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/********************************************************************
 
2
 KWin - the KDE window manager
 
3
 This file is part of the KDE project.
 
4
 
 
5
Copyright (C) 2004 Lubos Lunak <l.lunak@kde.org>
 
6
 
 
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.
 
11
 
 
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.
 
16
 
 
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
*********************************************************************/
 
20
 
 
21
// updates per-window settings from KDE3.2 to KDE3.3
 
22
 
 
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
 
32
    {
 
33
    QByteArray sessionId;
 
34
    QByteArray windowRole;
 
35
    QByteArray wmCommand;
 
36
    QByteArray wmClientMachine;
 
37
    QByteArray resourceName;
 
38
    QByteArray resourceClass;
 
39
 
 
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;
 
57
    };
 
58
 
 
59
QList<SessionInfo*> fakeSession;
 
60
 
 
61
static const char* const window_type_names[] = 
 
62
    {
 
63
    "Unknown", "Normal" , "Desktop", "Dock", "Toolbar", "Menu", "Dialog",
 
64
    "Override", "TopMenu", "Utility", "Splash"
 
65
    };
 
66
    // change also the two functions below when adding new entries
 
67
 
 
68
NET::WindowType txtToWindowType( const char* txt )
 
69
    {
 
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
 
76
    }
 
77
 
 
78
void loadFakeSessionInfo( KConfig* config )
 
79
    {
 
80
    fakeSession.clear();
 
81
    KConfigGroup fakeGroup(config, "FakeSession");
 
82
    int count = fakeGroup.readEntry( "count",0 );
 
83
    for ( int i = 1; i <= count; i++ ) 
 
84
        {
 
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;
 
109
        }
 
110
    config->deleteGroup( "FakeSession" );
 
111
    }
 
112
 
 
113
void writeRules( KConfig& cfg )
 
114
    {
 
115
        KConfigGroup cg(&cfg, "General");
 
116
    int pos = cg.readEntry( "count",0 );
 
117
 
 
118
    QList<SessionInfo*>::iterator it;
 
119
    for ( it = fakeSession.begin(); it != fakeSession.end(); ++it)
 
120
        {
 
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())
 
130
            {
 
131
            groupCfg.writeEntry( "windowrole", ( const char* ) (*it)->windowRole );
 
132
            groupCfg.writeEntry( "windowrolematch", 1 );
 
133
            }
 
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 );
 
166
        }
 
167
    cg.writeEntry( "count", pos );
 
168
    }
 
169
 
 
170
int main()
 
171
    {
 
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);
 
183
    }