1
From 571747da3d7b30fa26d14956f6146cdea944dfb1 Mon Sep 17 00:00:00 2001
2
From: Aurelien Gateau <aurelien.gateau@canonical.com>
3
Date: Thu, 24 Sep 2009 13:40:37 +0200
4
Subject: [PATCH 6/8] Activating server entry in MI now toggles KMail window.
7
kmail/kmfolder.cpp | 2 +-
8
kmail/kmkernel.cpp | 100 +++++++++++++++++++++++++++++++++++++++++++----
9
kmail/kmkernel.h | 13 +++++-
10
kmail/kmsystemtray.cpp | 95 +--------------------------------------------
11
kmail/kmsystemtray.h | 8 ----
12
5 files changed, 104 insertions(+), 114 deletions(-)
14
diff --git a/kmail/kmfolder.cpp b/kmail/kmfolder.cpp
15
index 47049e0..fa4afb2 100644
16
--- a/kmail/kmfolder.cpp
17
+++ b/kmail/kmfolder.cpp
18
@@ -1032,7 +1032,7 @@ void KMFolder::updateIndicatorIcon()
20
void KMFolder::slotIndicatorClicked()
22
- kmkernel->activateMainWin();
23
+ kmkernel->showMainWin();
24
kmkernel->selectFolder( this );
27
diff --git a/kmail/kmkernel.cpp b/kmail/kmkernel.cpp
28
index 96e1731..374f37e 100644
29
--- a/kmail/kmkernel.cpp
30
+++ b/kmail/kmkernel.cpp
31
@@ -103,7 +103,8 @@ static KMKernel * mySelf = 0;
32
KMKernel::KMKernel (QObject *parent, const char *name) :
34
mIdentityManager(0), mConfigureDialog(0), mICalIface(0), mMailService(0),
35
- mMailManager( 0 ), mContextMenuShown( false ), mWallet( 0 )
36
+ mMailManager( 0 ), mContextMenuShown( false ), mWallet( 0 ),
37
+ mMainWinVisible( true ), mPosOfMainWin( 0, 0 ), mDesktopOfMainWin( 0 )
40
setObjectName( name );
41
@@ -1472,7 +1473,7 @@ void KMKernel::init()
42
kWarning() << "Could not find desktop file for application";
44
connect( the_indicateServer, SIGNAL( serverDisplay() ),
45
- SLOT( activateMainWin() ) );
46
+ SLOT( toggleMainWin() ) );
48
the_undoStack = new UndoStack(20);
49
the_folderMgr = new KMFolderMgr(foldersPath);
50
@@ -2140,13 +2141,94 @@ KMainWindow* KMKernel::mainWin()
54
-void KMKernel::activateMainWin()
55
+void KMKernel::toggleMainWin()
57
- // We use forceActiveWindow here because this function is called from
58
- // indicators, which act as part of the user desktop
59
- KWindowSystem::forceActiveWindow( mainWin()->winId() );
60
+ if( mMainWinVisible && mainWindowIsOnCurrentDesktop() ) {
68
+ * Shows and raises the first KMMainWidget and
69
+ * switches to the appropriate virtual desktop.
71
+void KMKernel::showMainWin()
73
+ KMMainWidget *widget = getKMMainWidget();
77
+ QWidget *mainWin = widget->topLevelWidget();
80
+ KWindowInfo cur = KWindowSystem::windowInfo( mainWin->winId(), NET::WMDesktop );
81
+ if ( cur.valid() ) {
82
+ mDesktopOfMainWin = cur.desktop();
84
+ // switch to appropriate desktop
85
+ if ( mDesktopOfMainWin != NET::OnAllDesktops ) {
86
+ KWindowSystem::setCurrentDesktop( mDesktopOfMainWin );
88
+ if ( !mMainWinVisible ) {
89
+ if ( mDesktopOfMainWin == NET::OnAllDesktops ) {
90
+ KWindowSystem::setOnAllDesktops( mainWin->winId(), true );
93
+ KWindowSystem::activateWindow( mainWin->winId() );
95
+ if ( !mMainWinVisible ) {
96
+ mainWin->move( mPosOfMainWin );
98
+ mMainWinVisible = true;
102
+ KMSystemTray *systray = widget->systray();
104
+ //Fake that the folders have changed so that the icon status is correct
105
+ systray->foldersChanged();
109
+void KMKernel::hideMainWin()
111
+ if ( !getKMMainWidget() ) {
114
+ QWidget *mainWin = getKMMainWidget()->topLevelWidget();
116
+ mPosOfMainWin = mainWin->pos();
118
+ mDesktopOfMainWin = KWindowSystem::windowInfo( mainWin->winId(),
119
+ NET::WMDesktop ).desktop();
120
+ // iconifying is unnecessary, but it looks cooler
121
+ KWindowSystem::minimizeWindow( mainWin->winId() );
124
+ mMainWinVisible = false;
127
+bool KMKernel::mainWindowIsOnCurrentDesktop() const
130
+ KMMainWidget * mainWidget = getKMMainWidget();
131
+ if ( !mainWidget ) {
135
+ QWidget *mainWin = mainWidget->topLevelWidget();
140
+ return KWindowSystem::windowInfo( mainWin->winId(),
141
+ NET::WMDesktop ).isOnCurrentDesktop();
148
* Empties all trash folders
149
@@ -2223,7 +2305,7 @@ void KMKernel::selectFolder( KMFolder *folder )
150
widget->mainFolderView()->setCurrentFolder( folder );
153
-KMMainWidget *KMKernel::getKMMainWidget()
154
+KMMainWidget *KMKernel::getKMMainWidget() const
156
//This could definitely use a speadup
157
QWidgetList l = QApplication::topLevelWidgets();
158
@@ -2323,11 +2405,11 @@ bool KMKernel::canQueryClose()
159
if ( !systray || GlobalSettings::closeDespiteSystemTray() )
161
if ( systray->mode() == GlobalSettings::EnumSystemTrayPolicy::ShowAlways ) {
162
- systray->hideKMail();
165
} else if ( ( systray->mode() == GlobalSettings::EnumSystemTrayPolicy::ShowOnUnread ) && ( systray->hasUnreadMail() )) {
167
- systray->hideKMail();
172
diff --git a/kmail/kmkernel.h b/kmail/kmkernel.h
173
index 60ef548..1c458e5 100644
174
--- a/kmail/kmkernel.h
175
+++ b/kmail/kmkernel.h
176
@@ -244,8 +244,9 @@ Q_SIGNALS:
180
- /** Bring the first main window to front (as returned by mainWin()) */
181
- void activateMainWin();
182
+ void toggleMainWin();
183
+ void showMainWin();
184
+ void hideMainWin();
188
@@ -406,7 +407,7 @@ public:
189
KWallet::Wallet *wallet();
191
/** Get first mainwidget */
192
- KMMainWidget *getKMMainWidget();
193
+ KMMainWidget *getKMMainWidget() const;
195
/** @return a list of all folders from all folder managers. */
196
QList< QPointer<KMFolder> > allFolders();
197
@@ -456,6 +457,7 @@ private slots:
198
void transportRenamed( int id, const QString &oldName, const QString &newName );
201
+ bool mainWindowIsOnCurrentDesktop() const;
202
void openReader( bool onlyCheck );
203
KMFolder *currentFolder();
205
@@ -537,6 +539,11 @@ private:
206
QString mAddMessageLastFolder;
207
KMFolder *mAddMsgCurrentFolder;
208
KMail::FolderAdaptor *folderAdaptor;
210
+ // main window management
211
+ bool mMainWinVisible;
212
+ QPoint mPosOfMainWin;
213
+ int mDesktopOfMainWin;
216
#endif // _KMKERNEL_H
217
diff --git a/kmail/kmsystemtray.cpp b/kmail/kmsystemtray.cpp
218
index 37fbc5c..a1b9b6c 100644
219
--- a/kmail/kmsystemtray.cpp
220
+++ b/kmail/kmsystemtray.cpp
221
@@ -59,9 +59,6 @@ using KMail::AccountManager;
223
KMSystemTray::KMSystemTray(QWidget *parent)
224
: KSystemTrayIcon( parent),
225
- mParentVisible( true ),
226
- mPosOfMainWin( 0, 0 ),
227
- mDesktopOfMainWin( 0 ),
228
mMode( GlobalSettings::EnumSystemTrayPolicy::ShowOnUnread ),
230
mNewMessagesPopup( 0 ),
231
@@ -76,17 +73,6 @@ KMSystemTray::KMSystemTray(QWidget *parent)
233
mDefaultIcon = KIcon( "kmail" ).pixmap( 22 );
234
setIcon( mDefaultIcon );
236
- KMMainWidget * mainWidget = kmkernel->getKMMainWidget();
237
- if ( mainWidget ) {
238
- QWidget * mainWin = mainWidget->topLevelWidget();
240
- mDesktopOfMainWin = KWindowSystem::windowInfo( mainWin->winId(),
241
- NET::WMDesktop ).desktop();
242
- mPosOfMainWin = mainWin->pos();
246
// register the applet with the kernel
247
kmkernel->registerSystemTrayApplet( this );
249
@@ -296,10 +282,7 @@ void KMSystemTray::slotActivated( QSystemTrayIcon::ActivationReason reason )
250
// switch to kmail on left mouse button
251
if( reason == QSystemTrayIcon::Trigger )
253
- if( mParentVisible && mainWindowIsOnCurrentDesktop() )
257
+ kmkernel->toggleMainWin();
261
@@ -369,80 +352,6 @@ QString KMSystemTray::prettyName(KMFolder * fldr)
265
-bool KMSystemTray::mainWindowIsOnCurrentDesktop()
268
- KMMainWidget * mainWidget = kmkernel->getKMMainWidget();
272
- QWidget *mainWin = kmkernel->getKMMainWidget()->topLevelWidget();
276
- return KWindowSystem::windowInfo( mainWin->winId(),
277
- NET::WMDesktop ).isOnCurrentDesktop();
284
- * Shows and raises the first KMMainWidget and
285
- * switches to the appropriate virtual desktop.
287
-void KMSystemTray::showKMail()
289
- if (!kmkernel->getKMMainWidget())
291
- QWidget *mainWin = kmkernel->getKMMainWidget()->topLevelWidget();
296
- KWindowInfo cur = KWindowSystem::windowInfo( mainWin->winId(), NET::WMDesktop );
297
- if ( cur.valid() ) mDesktopOfMainWin = cur.desktop();
298
- // switch to appropriate desktop
299
- if ( mDesktopOfMainWin != NET::OnAllDesktops )
300
- KWindowSystem::setCurrentDesktop( mDesktopOfMainWin );
301
- if ( !mParentVisible ) {
302
- if ( mDesktopOfMainWin == NET::OnAllDesktops )
303
- KWindowSystem::setOnAllDesktops( mainWin->winId(), true );
305
- KWindowSystem::activateWindow( mainWin->winId() );
308
- if ( !mParentVisible ) {
309
- mainWin->move( mPosOfMainWin );
311
- mParentVisible = true;
315
- //Fake that the folders have changed so that the icon status is correct
319
-void KMSystemTray::hideKMail()
321
- if (!kmkernel->getKMMainWidget())
323
- QWidget *mainWin = kmkernel->getKMMainWidget()->topLevelWidget();
327
- mPosOfMainWin = mainWin->pos();
329
- mDesktopOfMainWin = KWindowSystem::windowInfo( mainWin->winId(),
330
- NET::WMDesktop ).desktop();
331
- // iconifying is unnecessary, but it looks cooler
332
- KWindowSystem::minimizeWindow( mainWin->winId() );
335
- mParentVisible = false;
340
* Called on startup of the KMSystemTray and when the numUnreadMsgsChanged signal
341
* is emitted for one of the watched folders. Shows the system tray icon if there
342
@@ -559,7 +468,7 @@ void KMSystemTray::updateNewMessages()
344
void KMSystemTray::selectedAccount(int id)
347
+ kmkernel->showMainWin();
349
KMMainWidget * mainWidget = kmkernel->getKMMainWidget();
351
diff --git a/kmail/kmsystemtray.h b/kmail/kmsystemtray.h
352
index 77a2976..04ec58e 100644
353
--- a/kmail/kmsystemtray.h
354
+++ b/kmail/kmsystemtray.h
355
@@ -49,7 +49,6 @@ public:
356
void setMode(int mode);
360
bool hasUnreadMail() const;
363
@@ -63,19 +62,12 @@ private slots:
364
void slotContextMenuAboutToShow();
367
- bool mainWindowIsOnCurrentDesktop();
369
void buildPopupMenu();
372
QString prettyName(KMFolder *);
376
- bool mParentVisible;
377
- QPoint mPosOfMainWin;
378
- int mDesktopOfMainWin;