~ubuntu-branches/ubuntu/karmic/kdepim/karmic-backports

« back to all changes in this revision

Viewing changes to debian/patches/kubuntu-message-indicator/0006-Activating-server-entry-in-MI-now-toggles-KMail-windo.diff

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Riddell
  • Date: 2009-09-24 15:36:10 UTC
  • Revision ID: james.westby@ubuntu.com-20090924153610-pllcvgprrq6bo71y
Tags: 4:4.3.1-0ubuntu4
Update debian/patches/kubuntu-message-indicator with 20090924
versions from
http://people.canonical.com/~agateau/indicate/index.html

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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.
 
5
 
 
6
---
 
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(-)
 
13
 
 
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()
 
19
 
 
20
 void KMFolder::slotIndicatorClicked()
 
21
 {
 
22
-  kmkernel->activateMainWin();
 
23
+  kmkernel->showMainWin();
 
24
   kmkernel->selectFolder( this );
 
25
 }
 
26
 
 
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) :
 
33
   QObject(parent),
 
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 )
 
38
 {
 
39
   kDebug();
 
40
   setObjectName( name );
 
41
@@ -1472,7 +1473,7 @@ void KMKernel::init()
 
42
     kWarning() << "Could not find desktop file for application";
 
43
   }
 
44
   connect( the_indicateServer, SIGNAL( serverDisplay() ),
 
45
-           SLOT( activateMainWin() ) );
 
46
+           SLOT( toggleMainWin() ) );
 
47
 
 
48
   the_undoStack     = new UndoStack(20);
 
49
   the_folderMgr     = new KMFolderMgr(foldersPath);
 
50
@@ -2140,13 +2141,94 @@ KMainWindow* KMKernel::mainWin()
 
51
   return mWin;
 
52
 }
 
53
 
 
54
-void KMKernel::activateMainWin()
 
55
+void KMKernel::toggleMainWin()
 
56
 {
 
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() ) {
 
61
+    hideMainWin();
 
62
+  } else {
 
63
+    showMainWin();
 
64
+  }
 
65
+}
 
66
+
 
67
+/**
 
68
+ * Shows and raises the first KMMainWidget and
 
69
+ * switches to the appropriate virtual desktop.
 
70
+ */
 
71
+void KMKernel::showMainWin()
 
72
+{
 
73
+  KMMainWidget *widget = getKMMainWidget();
 
74
+  if ( !widget ) {
 
75
+    return;
 
76
+  }
 
77
+  QWidget *mainWin = widget->topLevelWidget();
 
78
+  assert(mainWin);
 
79
+#ifdef Q_WS_X11
 
80
+  KWindowInfo cur = KWindowSystem::windowInfo( mainWin->winId(), NET::WMDesktop );
 
81
+  if ( cur.valid() ) {
 
82
+    mDesktopOfMainWin = cur.desktop();
 
83
+  }
 
84
+  // switch to appropriate desktop
 
85
+  if ( mDesktopOfMainWin != NET::OnAllDesktops ) {
 
86
+    KWindowSystem::setCurrentDesktop( mDesktopOfMainWin );
 
87
+  }
 
88
+  if ( !mMainWinVisible ) {
 
89
+    if ( mDesktopOfMainWin == NET::OnAllDesktops ) {
 
90
+      KWindowSystem::setOnAllDesktops( mainWin->winId(), true );
 
91
+    }
 
92
+  }
 
93
+  KWindowSystem::activateWindow( mainWin->winId() );
 
94
+#endif
 
95
+  if ( !mMainWinVisible ) {
 
96
+    mainWin->move( mPosOfMainWin );
 
97
+    mainWin->show();
 
98
+    mMainWinVisible = true;
 
99
+  }
 
100
+  raise();
 
101
+
 
102
+  KMSystemTray *systray = widget->systray();
 
103
+  if ( systray ) {
 
104
+    //Fake that the folders have changed so that the icon status is correct
 
105
+    systray->foldersChanged();
 
106
+  }
 
107
 }
 
108
 
 
109
+void KMKernel::hideMainWin()
 
110
+{
 
111
+  if ( !getKMMainWidget() ) {
 
112
+    return;
 
113
+  }
 
114
+  QWidget *mainWin = getKMMainWidget()->topLevelWidget();
 
115
+  assert(mainWin);
 
116
+  mPosOfMainWin = mainWin->pos();
 
117
+#ifdef Q_WS_X11
 
118
+  mDesktopOfMainWin = KWindowSystem::windowInfo( mainWin->winId(),
 
119
+                                        NET::WMDesktop ).desktop();
 
120
+  // iconifying is unnecessary, but it looks cooler
 
121
+  KWindowSystem::minimizeWindow( mainWin->winId() );
 
122
+#endif
 
123
+  mainWin->hide();
 
124
+  mMainWinVisible = false;
 
125
+}
 
126
+
 
127
+bool KMKernel::mainWindowIsOnCurrentDesktop() const
 
128
+{
 
129
+#ifdef Q_WS_X11
 
130
+  KMMainWidget * mainWidget = getKMMainWidget();
 
131
+  if ( !mainWidget ) {
 
132
+    return false;
 
133
+  }
 
134
+
 
135
+  QWidget *mainWin = mainWidget->topLevelWidget();
 
136
+  if ( !mainWin ) {
 
137
+    return false;
 
138
+  }
 
139
+
 
140
+  return KWindowSystem::windowInfo( mainWin->winId(),
 
141
+                           NET::WMDesktop ).isOnCurrentDesktop();
 
142
+#else
 
143
+  return true;
 
144
+#endif
 
145
+}
 
146
 
 
147
 /**
 
148
  * Empties all trash folders
 
149
@@ -2223,7 +2305,7 @@ void KMKernel::selectFolder( KMFolder *folder )
 
150
   widget->mainFolderView()->setCurrentFolder( folder );
 
151
 }
 
152
 
 
153
-KMMainWidget *KMKernel::getKMMainWidget()
 
154
+KMMainWidget *KMKernel::getKMMainWidget() const
 
155
 {
 
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() )
 
160
       return true;
 
161
   if ( systray->mode() == GlobalSettings::EnumSystemTrayPolicy::ShowAlways ) {
 
162
-    systray->hideKMail();
 
163
+    hideMainWin();
 
164
     return false;
 
165
   } else if ( ( systray->mode() == GlobalSettings::EnumSystemTrayPolicy::ShowOnUnread ) && ( systray->hasUnreadMail() )) {
 
166
     systray->show();
 
167
-    systray->hideKMail();
 
168
+    hideMainWin();
 
169
     return false;
 
170
   }
 
171
   return true;
 
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:
 
177
 
 
178
 
 
179
 public Q_SLOTS:
 
180
-  /** Bring the first main window to front (as returned by mainWin()) */
 
181
-  void activateMainWin();
 
182
+  void toggleMainWin();
 
183
+  void showMainWin();
 
184
+  void hideMainWin();
 
185
 
 
186
 public:
 
187
 
 
188
@@ -406,7 +407,7 @@ public:
 
189
   KWallet::Wallet *wallet();
 
190
 
 
191
   /** Get first mainwidget */
 
192
-  KMMainWidget *getKMMainWidget();
 
193
+  KMMainWidget *getKMMainWidget() const;
 
194
 
 
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 );
 
199
 
 
200
 private:
 
201
+  bool mainWindowIsOnCurrentDesktop() const;
 
202
   void openReader( bool onlyCheck );
 
203
   KMFolder *currentFolder();
 
204
 
 
205
@@ -537,6 +539,11 @@ private:
 
206
   QString               mAddMessageLastFolder;
 
207
   KMFolder             *mAddMsgCurrentFolder;
 
208
   KMail::FolderAdaptor *folderAdaptor;
 
209
+
 
210
+  // main window management
 
211
+  bool mMainWinVisible;
 
212
+  QPoint mPosOfMainWin;
 
213
+  int mDesktopOfMainWin;
 
214
 };
 
215
 
 
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;
 
222
  */
 
223
 KMSystemTray::KMSystemTray(QWidget *parent)
 
224
   : KSystemTrayIcon( parent),
 
225
-    mParentVisible( true ),
 
226
-    mPosOfMainWin( 0, 0 ),
 
227
-    mDesktopOfMainWin( 0 ),
 
228
     mMode( GlobalSettings::EnumSystemTrayPolicy::ShowOnUnread ),
 
229
     mCount( 0 ),
 
230
     mNewMessagesPopup( 0 ),
 
231
@@ -76,17 +73,6 @@ KMSystemTray::KMSystemTray(QWidget *parent)
 
232
 
 
233
   mDefaultIcon = KIcon( "kmail" ).pixmap( 22 );
 
234
   setIcon( mDefaultIcon );
 
235
-#ifdef Q_WS_X11
 
236
-  KMMainWidget * mainWidget = kmkernel->getKMMainWidget();
 
237
-  if ( mainWidget ) {
 
238
-    QWidget * mainWin = mainWidget->topLevelWidget();
 
239
-    if ( mainWin ) {
 
240
-      mDesktopOfMainWin = KWindowSystem::windowInfo( mainWin->winId(),
 
241
-                                            NET::WMDesktop ).desktop();
 
242
-      mPosOfMainWin = mainWin->pos();
 
243
-    }
 
244
-  }
 
245
-#endif
 
246
   // register the applet with the kernel
 
247
   kmkernel->registerSystemTrayApplet( this );
 
248
 
 
249
@@ -296,10 +282,7 @@ void KMSystemTray::slotActivated( QSystemTrayIcon::ActivationReason reason )
 
250
   // switch to kmail on left mouse button
 
251
   if( reason == QSystemTrayIcon::Trigger )
 
252
   {
 
253
-    if( mParentVisible && mainWindowIsOnCurrentDesktop() )
 
254
-      hideKMail();
 
255
-    else
 
256
-      showKMail();
 
257
+    kmkernel->toggleMainWin();
 
258
   }
 
259
 }
 
260
 
 
261
@@ -369,80 +352,6 @@ QString KMSystemTray::prettyName(KMFolder * fldr)
 
262
 }
 
263
 
 
264
 
 
265
-bool KMSystemTray::mainWindowIsOnCurrentDesktop()
 
266
-{
 
267
-#ifdef Q_WS_X11
 
268
-  KMMainWidget * mainWidget = kmkernel->getKMMainWidget();
 
269
-  if ( !mainWidget )
 
270
-    return false;
 
271
-
 
272
-  QWidget *mainWin = kmkernel->getKMMainWidget()->topLevelWidget();
 
273
-  if ( !mainWin )
 
274
-    return false;
 
275
-
 
276
-  return KWindowSystem::windowInfo( mainWin->winId(),
 
277
-                           NET::WMDesktop ).isOnCurrentDesktop();
 
278
-#else
 
279
-  return true;
 
280
-#endif
 
281
-}
 
282
-
 
283
-/**
 
284
- * Shows and raises the first KMMainWidget and
 
285
- * switches to the appropriate virtual desktop.
 
286
- */
 
287
-void KMSystemTray::showKMail()
 
288
-{
 
289
-  if (!kmkernel->getKMMainWidget())
 
290
-    return;
 
291
-  QWidget *mainWin = kmkernel->getKMMainWidget()->topLevelWidget();
 
292
-  assert(mainWin);
 
293
-#ifdef Q_WS_X11
 
294
-  if(mainWin)
 
295
-  {
 
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 );
 
304
-    }
 
305
-    KWindowSystem::activateWindow( mainWin->winId() );
 
306
-  }
 
307
-#endif
 
308
-  if ( !mParentVisible ) {
 
309
-    mainWin->move( mPosOfMainWin );
 
310
-    mainWin->show();
 
311
-    mParentVisible = true;
 
312
-  }
 
313
-  kmkernel->raise();
 
314
-
 
315
-  //Fake that the folders have changed so that the icon status is correct
 
316
-  foldersChanged();
 
317
-}
 
318
-
 
319
-void KMSystemTray::hideKMail()
 
320
-{
 
321
-  if (!kmkernel->getKMMainWidget())
 
322
-    return;
 
323
-  QWidget *mainWin = kmkernel->getKMMainWidget()->topLevelWidget();
 
324
-  assert(mainWin);
 
325
-  if(mainWin)
 
326
-  {
 
327
-    mPosOfMainWin = mainWin->pos();
 
328
-#ifdef Q_WS_X11
 
329
-    mDesktopOfMainWin = KWindowSystem::windowInfo( mainWin->winId(),
 
330
-                                          NET::WMDesktop ).desktop();
 
331
-    // iconifying is unnecessary, but it looks cooler
 
332
-    KWindowSystem::minimizeWindow( mainWin->winId() );
 
333
-#endif
 
334
-    mainWin->hide();
 
335
-    mParentVisible = false;
 
336
-  }
 
337
-}
 
338
-
 
339
 /**
 
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()
 
343
  */
 
344
 void KMSystemTray::selectedAccount(int id)
 
345
 {
 
346
-  showKMail();
 
347
+  kmkernel->showMainWin();
 
348
 
 
349
   KMMainWidget * mainWidget = kmkernel->getKMMainWidget();
 
350
   if (!mainWidget)
 
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);
 
357
   int mode() const;
 
358
 
 
359
-  void hideKMail();
 
360
   bool hasUnreadMail() const;
 
361
 
 
362
 public slots:
 
363
@@ -63,19 +62,12 @@ private slots:
 
364
   void slotContextMenuAboutToShow();
 
365
 
 
366
 protected:
 
367
-  bool mainWindowIsOnCurrentDesktop();
 
368
-  void showKMail();
 
369
   void buildPopupMenu();
 
370
   void updateCount();
 
371
 
 
372
   QString prettyName(KMFolder *);
 
373
 
 
374
 private:
 
375
-
 
376
-  bool mParentVisible;
 
377
-  QPoint mPosOfMainWin;
 
378
-  int mDesktopOfMainWin;
 
379
-
 
380
   int mMode;
 
381
   int mCount;
 
382
 
 
383
-- 
 
384
1.6.3.3
 
385