• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdelibs API Reference
  • KDE Home
  • Contact Us
 

KDEUI

  • sources
  • kde-4.14
  • kdelibs
  • kdeui
  • notifications
kstatusnotifieritem.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE libraries
2  Copyright 2009 by Marco Martin <notmart@gmail.com>
3 
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Library General Public
6  License (LGPL) as published by the Free Software Foundation;
7  either version 2 of the License, or (at your option) any later
8  version.
9 
10  This library is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Library General Public License for more details.
14 
15  You should have received a copy of the GNU Library General Public License
16  along with this library; see the file COPYING.LIB. If not, write to
17  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  Boston, MA 02110-1301, USA.
19 */
20 
21 #include "kstatusnotifieritem.h"
22 #include "kstatusnotifieritemprivate_p.h"
23 #include "kstatusnotifieritemdbus_p.h"
24 
25 #include <QDBusConnection>
26 #include <QPixmap>
27 #include <QImage>
28 #include <QApplication>
29 #include <QMovie>
30 #include <QPainter>
31 
32 
33 #include <kdebug.h>
34 #include <ksystemtrayicon.h>
35 #include <kaboutdata.h>
36 #include <kicon.h>
37 #include <kmenu.h>
38 #include <kaction.h>
39 #include <kwindowinfo.h>
40 #include <kwindowsystem.h>
41 #include <kmessagebox.h>
42 #include <kactioncollection.h>
43 #include <kstandarddirs.h>
44 #include <kglobal.h>
45 
46 #include <netinet/in.h>
47 
48 #include <dbusmenuexporter.h>
49 
50 #include "statusnotifieritemadaptor.h"
51 
52 static const QString s_statusNotifierWatcherServiceName("org.kde.StatusNotifierWatcher");
53 
57 class KDBusMenuExporter : public DBusMenuExporter
58 {
59 public:
60  KDBusMenuExporter(const QString &dbusObjectPath, QMenu *menu, const QDBusConnection &dbusConnection)
61  : DBusMenuExporter(dbusObjectPath, menu, dbusConnection)
62  {}
63 
64 protected:
65  virtual QString iconNameForAction(QAction *action)
66  {
67  KIcon icon(action->icon());
68 #if QT_VERSION >= 0x040701
69  // QIcon::name() is in the 4.7 git branch, but it is not in 4.7 TP.
70  // If you get a build error here, you need to update your pre-release
71  // of Qt 4.7.
72  return icon.isNull() ? QString() : icon.name();
73 #else
74  // Qt 4.6: If the icon was created by us, via our engine, serializing it
75  // will let us get to the name.
76  if (!icon.isNull()) {
77  QBuffer encBuf;
78  encBuf.open(QIODevice::WriteOnly);
79  QDataStream encode(&encBuf);
80  encode.setVersion(QDataStream::Qt_4_6);
81  encode << icon;
82  encBuf.close();
83 
84  if (!encBuf.data().isEmpty()) {
85  QDataStream decode(encBuf.data());
86  QString key;
87  decode >> key;
88  if (key == QLatin1String("KIconEngine")) {
89  QString name;
90  decode >> name;
91  return name;
92  }
93  }
94  }
95 
96  return QString();
97 #endif
98  }
99 };
100 
101 KStatusNotifierItem::KStatusNotifierItem(QObject *parent)
102  : QObject(parent),
103  d(new KStatusNotifierItemPrivate(this))
104 {
105  d->init(QString());
106 }
107 
108 
109 KStatusNotifierItem::KStatusNotifierItem(const QString &id, QObject *parent)
110  : QObject(parent),
111  d(new KStatusNotifierItemPrivate(this))
112 {
113  d->init(id);
114 }
115 
116 KStatusNotifierItem::~KStatusNotifierItem()
117 {
118  delete d->statusNotifierWatcher;
119  delete d->notificationsClient;
120  delete d->systemTrayIcon;
121  if (!qApp->closingDown()) {
122  delete d->menu;
123  }
124  delete d;
125  KGlobal::deref();
126 }
127 
128 QString KStatusNotifierItem::id() const
129 {
130  //kDebug(299) << "id requested" << d->id;
131  return d->id;
132 }
133 
134 void KStatusNotifierItem::setCategory(const ItemCategory category)
135 {
136  d->category = category;
137 }
138 
139 KStatusNotifierItem::ItemStatus KStatusNotifierItem::status() const
140 {
141  return d->status;
142 }
143 
144 KStatusNotifierItem::ItemCategory KStatusNotifierItem::category() const
145 {
146  return d->category;
147 }
148 
149 void KStatusNotifierItem::setTitle(const QString &title)
150 {
151  d->title = title;
152 }
153 
154 void KStatusNotifierItem::setStatus(const ItemStatus status)
155 {
156  if (d->status == status) {
157  return;
158  }
159 
160  d->status = status;
161  emit d->statusNotifierItemDBus->NewStatus(metaObject()->enumerator(metaObject()->indexOfEnumerator("ItemStatus")).valueToKey(d->status));
162 
163  if (d->systemTrayIcon) {
164  d->syncLegacySystemTrayIcon();
165  }
166 }
167 
168 
169 
170 //normal icon
171 
172 void KStatusNotifierItem::setIconByName(const QString &name)
173 {
174  if (d->iconName == name) {
175  return;
176  }
177 
178  d->serializedIcon = KDbusImageVector();
179  d->iconName = name;
180  emit d->statusNotifierItemDBus->NewIcon();
181  if (d->systemTrayIcon) {
182  d->systemTrayIcon->setIcon(KIcon(name));
183  }
184 }
185 
186 QString KStatusNotifierItem::iconName() const
187 {
188  return d->iconName;
189 }
190 
191 void KStatusNotifierItem::setIconByPixmap(const QIcon &icon)
192 {
193  if (d->iconName.isEmpty() && d->icon.cacheKey() == icon.cacheKey()) {
194  return;
195  }
196 
197  d->iconName.clear();
198  d->serializedIcon = d->iconToVector(icon);
199  emit d->statusNotifierItemDBus->NewIcon();
200 
201  d->icon = icon;
202  if (d->systemTrayIcon) {
203  d->systemTrayIcon->setIcon(icon);
204  }
205 }
206 
207 QIcon KStatusNotifierItem::iconPixmap() const
208 {
209  return d->icon;
210 }
211 
212 void KStatusNotifierItem::setOverlayIconByName(const QString &name)
213 {
214  if (d->overlayIconName == name) {
215  return;
216  }
217 
218  d->overlayIconName = name;
219  emit d->statusNotifierItemDBus->NewOverlayIcon();
220  if (d->systemTrayIcon) {
221  QPixmap iconPixmap = KIcon(d->iconName).pixmap(KIconLoader::SizeSmallMedium, KIconLoader::SizeSmallMedium);
222  if (!name.isEmpty()) {
223  QPixmap overlayPixmap = KIcon(d->overlayIconName).pixmap(KIconLoader::SizeSmallMedium/2, KIconLoader::SizeSmallMedium/2);
224  QPainter p(&iconPixmap);
225  p.drawPixmap(iconPixmap.width()-overlayPixmap.width(), iconPixmap.height()-overlayPixmap.height(), overlayPixmap);
226  p.end();
227  }
228  d->systemTrayIcon->setIcon(iconPixmap);
229  }
230 }
231 
232 QString KStatusNotifierItem::overlayIconName() const
233 {
234  return d->overlayIconName;
235 }
236 
237 void KStatusNotifierItem::setOverlayIconByPixmap(const QIcon &icon)
238 {
239  if (d->overlayIconName.isEmpty() && d->overlayIcon.cacheKey() == icon.cacheKey()) {
240  return;
241  }
242 
243  d->overlayIconName.clear();
244  d->serializedOverlayIcon = d->iconToVector(icon);
245  emit d->statusNotifierItemDBus->NewOverlayIcon();
246 
247  d->overlayIcon = icon;
248  if (d->systemTrayIcon) {
249  QPixmap iconPixmap = d->icon.pixmap(KIconLoader::SizeSmallMedium, KIconLoader::SizeSmallMedium);
250  QPixmap overlayPixmap = d->overlayIcon.pixmap(KIconLoader::SizeSmallMedium/2, KIconLoader::SizeSmallMedium/2);
251 
252  QPainter p(&iconPixmap);
253  p.drawPixmap(iconPixmap.width()-overlayPixmap.width(), iconPixmap.height()-overlayPixmap.height(), overlayPixmap);
254  p.end();
255  d->systemTrayIcon->setIcon(iconPixmap);
256  }
257 }
258 
259 QIcon KStatusNotifierItem::overlayIconPixmap() const
260 {
261  return d->overlayIcon;
262 }
263 
264 //Icons and movie for requesting attention state
265 
266 void KStatusNotifierItem::setAttentionIconByName(const QString &name)
267 {
268  if (d->attentionIconName == name) {
269  return;
270  }
271 
272  d->serializedAttentionIcon = KDbusImageVector();
273  d->attentionIconName = name;
274  emit d->statusNotifierItemDBus->NewAttentionIcon();
275 }
276 
277 QString KStatusNotifierItem::attentionIconName() const
278 {
279  return d->attentionIconName;
280 }
281 
282 void KStatusNotifierItem::setAttentionIconByPixmap(const QIcon &icon)
283 {
284  if (d->attentionIconName.isEmpty() && d->attentionIcon.cacheKey() == icon.cacheKey()) {
285  return;
286  }
287 
288  d->attentionIconName.clear();
289  d->serializedAttentionIcon = d->iconToVector(icon);
290  d->attentionIcon = icon;
291  emit d->statusNotifierItemDBus->NewAttentionIcon();
292 }
293 
294 QIcon KStatusNotifierItem::attentionIconPixmap() const
295 {
296  return d->attentionIcon;
297 }
298 
299 void KStatusNotifierItem::setAttentionMovieByName(const QString &name)
300 {
301  if (d->movieName == name) {
302  return;
303  }
304 
305  d->movieName = name;
306 
307  delete d->movie;
308  d->movie = 0;
309 
310  emit d->statusNotifierItemDBus->NewAttentionIcon();
311 
312  if (d->systemTrayIcon) {
313  d->movie = new QMovie(d->movieName);
314  d->systemTrayIcon->setMovie(d->movie);
315  }
316 }
317 
318 QString KStatusNotifierItem::attentionMovieName() const
319 {
320  return d->movieName;
321 }
322 
323 //ToolTip
324 
325 void KStatusNotifierItem::setToolTip(const QString &iconName, const QString &title, const QString &subTitle)
326 {
327  if (d->toolTipIconName == iconName &&
328  d->toolTipTitle == title &&
329  d->toolTipSubTitle == subTitle) {
330  return;
331  }
332 
333  d->serializedToolTipIcon = KDbusImageVector();
334  d->toolTipIconName = iconName;
335 
336  d->toolTipTitle = title;
337  if (d->systemTrayIcon) {
338  d->systemTrayIcon->setToolTip(title);
339  }
340 
341  d->toolTipSubTitle = subTitle;
342  emit d->statusNotifierItemDBus->NewToolTip();
343 }
344 
345 void KStatusNotifierItem::setToolTip(const QIcon &icon, const QString &title, const QString &subTitle)
346 {
347  if (d->toolTipIconName.isEmpty() && d->toolTipIcon.cacheKey() == icon.cacheKey() &&
348  d->toolTipTitle == title &&
349  d->toolTipSubTitle == subTitle) {
350  return;
351  }
352 
353  d->toolTipIconName.clear();
354  d->serializedToolTipIcon = d->iconToVector(icon);
355  d->toolTipIcon = icon;
356 
357  d->toolTipTitle = title;
358  if (d->systemTrayIcon) {
359  d->systemTrayIcon->setToolTip(title);
360  }
361 
362  d->toolTipSubTitle = subTitle;
363  emit d->statusNotifierItemDBus->NewToolTip();
364 }
365 
366 void KStatusNotifierItem::setToolTipIconByName(const QString &name)
367 {
368  if (d->toolTipIconName == name) {
369  return;
370  }
371 
372  d->serializedToolTipIcon = KDbusImageVector();
373  d->toolTipIconName = name;
374  emit d->statusNotifierItemDBus->NewToolTip();
375 }
376 
377 QString KStatusNotifierItem::toolTipIconName() const
378 {
379  return d->toolTipIconName;
380 }
381 
382 void KStatusNotifierItem::setToolTipIconByPixmap(const QIcon &icon)
383 {
384  if (d->toolTipIconName.isEmpty() && d->toolTipIcon.cacheKey() == icon.cacheKey()) {
385  return;
386  }
387 
388  d->toolTipIconName.clear();
389  d->serializedToolTipIcon = d->iconToVector(icon);
390  d->toolTipIcon = icon;
391  emit d->statusNotifierItemDBus->NewToolTip();
392 }
393 
394 QIcon KStatusNotifierItem::toolTipIconPixmap() const
395 {
396  return d->toolTipIcon;
397 }
398 
399 void KStatusNotifierItem::setToolTipTitle(const QString &title)
400 {
401  if (d->toolTipTitle == title) {
402  return;
403  }
404 
405  d->toolTipTitle = title;
406  emit d->statusNotifierItemDBus->NewToolTip();
407  if (d->systemTrayIcon) {
408  d->systemTrayIcon->setToolTip(title);
409  }
410 }
411 
412 QString KStatusNotifierItem::toolTipTitle() const
413 {
414  return d->toolTipTitle;
415 }
416 
417 void KStatusNotifierItem::setToolTipSubTitle(const QString &subTitle)
418 {
419  if (d->toolTipSubTitle == subTitle) {
420  return;
421  }
422 
423  d->toolTipSubTitle = subTitle;
424  emit d->statusNotifierItemDBus->NewToolTip();
425 }
426 
427 QString KStatusNotifierItem::toolTipSubTitle() const
428 {
429  return d->toolTipSubTitle;
430 }
431 
432 void KStatusNotifierItem::setContextMenu(KMenu *menu)
433 {
434  if (d->menu && d->menu != menu) {
435  d->menu->removeEventFilter(this);
436  delete d->menu;
437  }
438 
439  if (!menu) {
440  d->menu = 0;
441  return;
442  }
443 
444  if (d->systemTrayIcon) {
445  d->systemTrayIcon->setContextMenu(menu);
446  } else if (d->menu != menu) {
447  if (getenv("KSNI_NO_DBUSMENU")) {
448  // This is a hack to make it possible to disable DBusMenu in an
449  // application. The string "/NO_DBUSMENU" must be the same as in
450  // DBusSystemTrayWidget::findDBusMenuInterface() in the Plasma
451  // systemtray applet.
452  d->menuObjectPath = "/NO_DBUSMENU";
453  menu->installEventFilter(this);
454  } else {
455  d->menuObjectPath = "/MenuBar";
456  new KDBusMenuExporter(d->menuObjectPath, menu, d->statusNotifierItemDBus->dbusConnection());
457  }
458 
459  connect(menu, SIGNAL(aboutToShow()), this, SLOT(contextMenuAboutToShow()));
460  }
461 
462  d->menu = menu;
463  d->menu->setParent(0);
464 }
465 
466 KMenu *KStatusNotifierItem::contextMenu() const
467 {
468  return d->menu;
469 }
470 
471 void KStatusNotifierItem::setAssociatedWidget(QWidget *associatedWidget)
472 {
473  if (associatedWidget) {
474  d->associatedWidget = associatedWidget->window();
475  } else {
476  d->associatedWidget = 0;
477  }
478 
479  if (d->systemTrayIcon) {
480  delete d->systemTrayIcon;
481  d->systemTrayIcon = 0;
482  d->setLegacySystemTrayEnabled(true);
483  }
484 
485  if (d->associatedWidget && d->associatedWidget != d->menu) {
486  QAction *action = d->actionCollection->action("minimizeRestore");
487 
488  if (!action) {
489  action = d->actionCollection->addAction("minimizeRestore");
490  action->setText(i18n("&Minimize"));
491  connect(action, SIGNAL(triggered(bool)), this, SLOT(minimizeRestore()));
492  }
493 
494 #ifdef Q_WS_X11
495  KWindowInfo info = KWindowSystem::windowInfo(d->associatedWidget->winId(), NET::WMDesktop);
496  d->onAllDesktops = info.onAllDesktops();
497 #else
498  d->onAllDesktops = false;
499 #endif
500  } else {
501  if (d->menu && d->hasQuit) {
502  QAction *action = d->actionCollection->action("minimizeRestore");
503  if (action) {
504  d->menu->removeAction(action);
505  }
506  }
507 
508  d->onAllDesktops = false;
509  }
510 }
511 
512 QWidget *KStatusNotifierItem::associatedWidget() const
513 {
514  return d->associatedWidget;
515 }
516 
517 KActionCollection *KStatusNotifierItem::actionCollection() const
518 {
519  return d->actionCollection;
520 }
521 
522 void KStatusNotifierItem::setStandardActionsEnabled(bool enabled)
523 {
524  if (d->standardActionsEnabled == enabled) {
525  return;
526  }
527 
528  d->standardActionsEnabled = enabled;
529 
530  if (d->menu && !enabled && d->hasQuit) {
531  QAction *action = d->actionCollection->action("minimizeRestore");
532  if (action) {
533  d->menu->removeAction(action);
534  }
535 
536  action = d->actionCollection->action(KStandardAction::name(KStandardAction::Quit));
537  if (action) {
538  d->menu->removeAction(action);
539  }
540 
541 
542  d->hasQuit = false;
543  }
544 }
545 
546 bool KStatusNotifierItem::standardActionsEnabled() const
547 {
548  return d->standardActionsEnabled;
549 }
550 
551 void KStatusNotifierItem::showMessage(const QString & title, const QString & message, const QString &icon, int timeout)
552 {
553  if (!d->notificationsClient) {
554  d->notificationsClient = new org::freedesktop::Notifications("org.freedesktop.Notifications", "/org/freedesktop/Notifications",
555  QDBusConnection::sessionBus());
556  }
557 
558  uint id = 0;
559  d->notificationsClient->Notify(d->title, id, icon, title, message, QStringList(), QVariantMap(), timeout);
560 }
561 
562 QString KStatusNotifierItem::title() const
563 {
564  return d->title;
565 }
566 
567 
568 
569 void KStatusNotifierItem::activate(const QPoint &pos)
570 {
571  //if the user activated the icon the NeedsAttention state is no longer necessary
572  //FIXME: always true?
573  if (d->status == NeedsAttention) {
574  d->status = Active;
575  emit d->statusNotifierItemDBus->NewStatus(metaObject()->enumerator(metaObject()->indexOfEnumerator("ItemStatus")).valueToKey(d->status));
576  }
577 
578  if (d->associatedWidget == d->menu) {
579  d->statusNotifierItemDBus->ContextMenu(pos.x(), pos.y());
580  return;
581  }
582 
583  if (d->menu->isVisible()) {
584  d->menu->hide();
585  }
586 
587  if (!d->associatedWidget) {
588  emit activateRequested(true, pos);
589  return;
590  }
591 
592  d->checkVisibility(pos);
593 }
594 
595 bool KStatusNotifierItemPrivate::checkVisibility(QPoint pos, bool perform)
596 {
597 #ifdef Q_WS_WIN
598 #if 0
599  // the problem is that we lose focus when the systray icon is activated
600  // and we don't know the former active window
601  // therefore we watch for activation event and use our stopwatch :)
602  if(GetTickCount() - dwTickCount < 300) {
603  // we were active in the last 300ms -> hide it
604  minimizeRestore(false);
605  emit activateRequested(false, pos);
606  } else {
607  minimizeRestore(true);
608  emit activateRequested(true, pos);
609  }
610 #endif
611 #elif defined(Q_WS_X11)
612  KWindowInfo info1 = KWindowSystem::windowInfo(associatedWidget->winId(), NET::XAWMState | NET::WMState | NET::WMDesktop);
613  // mapped = visible (but possibly obscured)
614  bool mapped = (info1.mappingState() == NET::Visible) && !info1.isMinimized();
615 
616 // - not mapped -> show, raise, focus
617 // - mapped
618 // - obscured -> raise, focus
619 // - not obscured -> hide
620  //info1.mappingState() != NET::Visible -> window on another desktop?
621  if (!mapped) {
622  if (perform) {
623  minimizeRestore(true);
624  emit q->activateRequested(true, pos);
625  }
626 
627  return true;
628  } else {
629  QListIterator< WId > it (KWindowSystem::stackingOrder());
630  it.toBack();
631  while (it.hasPrevious()) {
632  WId id = it.previous();
633  if (id == associatedWidget->winId()) {
634  break;
635  }
636 
637  KWindowInfo info2 = KWindowSystem::windowInfo(id,
638  NET::WMDesktop | NET::WMGeometry | NET::XAWMState | NET::WMState | NET::WMWindowType);
639 
640  if (info2.mappingState() != NET::Visible) {
641  continue; // not visible on current desktop -> ignore
642  }
643 
644  if (!info2.geometry().intersects(associatedWidget->geometry())) {
645  continue; // not obscuring the window -> ignore
646  }
647 
648  if (!info1.hasState(NET::KeepAbove) && info2.hasState(NET::KeepAbove)) {
649  continue; // obscured by window kept above -> ignore
650  }
651 
652  NET::WindowType type = info2.windowType(NET::NormalMask | NET::DesktopMask
653  | NET::DockMask | NET::ToolbarMask | NET::MenuMask | NET::DialogMask
654  | NET::OverrideMask | NET::TopMenuMask | NET::UtilityMask | NET::SplashMask);
655 
656  if (type == NET::Dock || type == NET::TopMenu) {
657  continue; // obscured by dock or topmenu -> ignore
658  }
659 
660  if (perform) {
661  KWindowSystem::raiseWindow(associatedWidget->winId());
662  KWindowSystem::forceActiveWindow(associatedWidget->winId());
663  emit q->activateRequested(true, pos);
664  }
665 
666  return true;
667  }
668 
669  //not on current desktop?
670  if (!info1.isOnCurrentDesktop()) {
671  if (perform) {
672  KWindowSystem::activateWindow(associatedWidget->winId());
673  emit q->activateRequested(true, pos);
674  }
675 
676  return true;
677  }
678 
679  if (perform) {
680  minimizeRestore(false); // hide
681  emit q->activateRequested(false, pos);
682  }
683 
684  return false;
685  }
686 #endif
687 
688  return true;
689 }
690 
691 bool KStatusNotifierItem::eventFilter(QObject *watched, QEvent *event)
692 {
693  if (d->systemTrayIcon == 0) {
694  //FIXME: ugly ugly workaround to weird QMenu's focus problems
695  if (watched == d->menu &&
696  (event->type() == QEvent::WindowDeactivate || (event->type() == QEvent::MouseButtonRelease && static_cast<QMouseEvent*>(event)->button() == Qt::LeftButton))) {
697  //put at the back of even queue to let the action activate anyways
698  QTimer::singleShot(0, this, SLOT(hideMenu()));
699  }
700  }
701  return false;
702 }
703 
704 
705 //KStatusNotifierItemPrivate
706 
707 const int KStatusNotifierItemPrivate::s_protocolVersion = 0;
708 
709 KStatusNotifierItemPrivate::KStatusNotifierItemPrivate(KStatusNotifierItem *item)
710  : q(item),
711  category(KStatusNotifierItem::ApplicationStatus),
712  status(KStatusNotifierItem::Passive),
713  movie(0),
714  menu(0),
715  titleAction(0),
716  statusNotifierWatcher(0),
717  notificationsClient(0),
718  systemTrayIcon(0),
719  hasQuit(false),
720  onAllDesktops(false),
721  standardActionsEnabled(true)
722 {
723 }
724 
725 void KStatusNotifierItemPrivate::init(const QString &extraId)
726 {
727  // Ensure that closing the last KMainWindow doesn't exit the application
728  // if a system tray icon is still present.
729  KGlobal::ref();
730 
731  qDBusRegisterMetaType<KDbusImageStruct>();
732  qDBusRegisterMetaType<KDbusImageVector>();
733  qDBusRegisterMetaType<KDbusToolTipStruct>();
734 
735  actionCollection = new KActionCollection(q);
736  statusNotifierItemDBus = new KStatusNotifierItemDBus(q);
737  q->setAssociatedWidget(qobject_cast<QWidget*>(q->parent()));
738 
739  QDBusServiceWatcher *watcher = new QDBusServiceWatcher(s_statusNotifierWatcherServiceName,
740  QDBusConnection::sessionBus(),
741  QDBusServiceWatcher::WatchForOwnerChange,
742  q);
743  QObject::connect(watcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)),
744  q, SLOT(serviceChange(QString,QString,QString)));
745 
746  //create a default menu, just like in KSystemtrayIcon
747  KMenu *m = new KMenu(associatedWidget);
748  titleAction = m->addTitle(qApp->windowIcon(), KGlobal::caption());
749  m->setTitle(KGlobal::mainComponent().aboutData()->programName());
750  q->setContextMenu(m);
751 
752  KStandardAction::quit(q, SLOT(maybeQuit()), actionCollection);
753 
754  id = title = KGlobal::mainComponent().aboutData()->programName();
755 
756  if (!extraId.isEmpty()) {
757  id.append('_').append(extraId);
758  }
759 
760  // Init iconThemePath to the app folder for now
761  QStringList dirs = KGlobal::dirs()->findDirs("appdata", "icons");
762  if (!dirs.isEmpty()) {
763  iconThemePath = dirs.first();
764  }
765 
766  registerToDaemon();
767 }
768 
769 void KStatusNotifierItemPrivate::registerToDaemon()
770 {
771  kDebug(299) << "Registering a client interface to the KStatusNotifierWatcher";
772  if (!statusNotifierWatcher) {
773  statusNotifierWatcher = new org::kde::StatusNotifierWatcher(s_statusNotifierWatcherServiceName, "/StatusNotifierWatcher",
774  QDBusConnection::sessionBus());
775  QObject::connect(statusNotifierWatcher, SIGNAL(StatusNotifierHostRegistered()),
776  q, SLOT(checkForRegisteredHosts()));
777  QObject::connect(statusNotifierWatcher, SIGNAL(StatusNotifierHostUnregistered()),
778  q, SLOT(checkForRegisteredHosts()));
779  }
780 
781  if (statusNotifierWatcher->isValid() &&
782  statusNotifierWatcher->property("ProtocolVersion").toInt() == s_protocolVersion) {
783 
784  statusNotifierWatcher->RegisterStatusNotifierItem(statusNotifierItemDBus->service());
785  setLegacySystemTrayEnabled(false);
786  } else {
787  kDebug(299)<<"KStatusNotifierWatcher not reachable";
788  setLegacySystemTrayEnabled(true);
789  }
790 }
791 
792 void KStatusNotifierItemPrivate::serviceChange(const QString &name, const QString &oldOwner, const QString &newOwner)
793 {
794  Q_UNUSED(name)
795  if (newOwner.isEmpty()) {
796  //unregistered
797  kDebug(299) << "Connection to the KStatusNotifierWatcher lost";
798  setLegacyMode(true);
799  delete statusNotifierWatcher;
800  statusNotifierWatcher = 0;
801  } else if (oldOwner.isEmpty()) {
802  //registered
803  setLegacyMode(false);
804  }
805 }
806 
807 void KStatusNotifierItemPrivate::checkForRegisteredHosts()
808 {
809  setLegacyMode(!statusNotifierWatcher ||
810  !statusNotifierWatcher->property("IsStatusNotifierHostRegistered").toBool());
811 }
812 
813 void KStatusNotifierItemPrivate::setLegacyMode(bool legacy)
814 {
815  if (legacy == (systemTrayIcon != 0)) {
816  return;
817  }
818 
819  if (legacy) {
820  //unregistered
821  setLegacySystemTrayEnabled(true);
822  } else {
823  //registered
824  registerToDaemon();
825  }
826 }
827 
828 void KStatusNotifierItemPrivate::legacyWheelEvent(int delta)
829 {
830  statusNotifierItemDBus->Scroll(delta, "vertical");
831 }
832 
833 void KStatusNotifierItemPrivate::legacyActivated(QSystemTrayIcon::ActivationReason reason)
834 {
835  if (reason == QSystemTrayIcon::MiddleClick) {
836  emit q->secondaryActivateRequested(systemTrayIcon->geometry().topLeft());
837  }
838 }
839 
840 void KStatusNotifierItemPrivate::setLegacySystemTrayEnabled(bool enabled)
841 {
842  if (enabled == (systemTrayIcon != 0)) {
843  // already in the correct state
844  return;
845  }
846 
847  if (enabled) {
848  if (!systemTrayIcon) {
849  systemTrayIcon = new KStatusNotifierLegacyIcon(associatedWidget);
850  syncLegacySystemTrayIcon();
851  systemTrayIcon->setToolTip(toolTipTitle);
852  systemTrayIcon->show();
853  QObject::connect(systemTrayIcon, SIGNAL(wheel(int)), q, SLOT(legacyWheelEvent(int)));
854  QObject::connect(systemTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), q, SLOT(legacyActivated(QSystemTrayIcon::ActivationReason)));
855  }
856 
857  if (menu) {
858  menu->setWindowFlags(Qt::Popup);
859  }
860  } else {
861  delete systemTrayIcon;
862  systemTrayIcon = 0;
863 
864  if (menu) {
865  menu->setWindowFlags(Qt::Window);
866  }
867  }
868 
869  if (menu) {
870  KMenu *m = menu;
871  menu = 0;
872  q->setContextMenu(m);
873  }
874 }
875 
876 void KStatusNotifierItemPrivate::syncLegacySystemTrayIcon()
877 {
878  if (status == KStatusNotifierItem::NeedsAttention) {
879  if (!movieName.isNull()) {
880  if (!movie) {
881  movie = new QMovie(movieName);
882  }
883  systemTrayIcon->setMovie(movie);
884  } else if (!attentionIconName.isNull()) {
885  systemTrayIcon->setIcon(KIcon(attentionIconName));
886  } else {
887  systemTrayIcon->setIcon(attentionIcon);
888  }
889  } else {
890  if (!iconName.isNull()) {
891  systemTrayIcon->setIcon(KIcon(iconName));
892  } else {
893  systemTrayIcon->setIcon(icon);
894  }
895  }
896 
897  systemTrayIcon->setToolTip(toolTipTitle);
898 }
899 
900 void KStatusNotifierItemPrivate::contextMenuAboutToShow()
901 {
902  if (!hasQuit && standardActionsEnabled) {
903  // we need to add the actions to the menu afterwards so that these items
904  // appear at the _END_ of the menu
905  menu->addSeparator();
906  if (associatedWidget && associatedWidget != menu) {
907  QAction *action = actionCollection->action("minimizeRestore");
908 
909  if (action) {
910  menu->addAction(action);
911  }
912  }
913 
914  QAction *action = actionCollection->action(KStandardAction::name(KStandardAction::Quit));
915 
916  if (action) {
917  menu->addAction(action);
918  }
919 
920  hasQuit = true;
921  }
922 
923  if (associatedWidget && associatedWidget != menu) {
924  QAction* action = actionCollection->action("minimizeRestore");
925  if (checkVisibility(QPoint(0, 0), false)) {
926  action->setText(i18n("&Restore"));
927  } else {
928  action->setText(i18n("&Minimize"));
929  }
930  }
931 }
932 
933 void KStatusNotifierItemPrivate::maybeQuit()
934 {
935  QString caption = KGlobal::caption();
936  QString query = i18n("<qt>Are you sure you want to quit <b>%1</b>?</qt>", caption);
937 
938  if (KMessageBox::warningContinueCancel(associatedWidget, query,
939  i18n("Confirm Quit From System Tray"),
940  KStandardGuiItem::quit(),
941  KStandardGuiItem::cancel(),
942  QString("systemtrayquit%1")
943  .arg(caption)) == KMessageBox::Continue) {
944  qApp->quit();
945  }
946 
947 }
948 
949 void KStatusNotifierItemPrivate::minimizeRestore()
950 {
951  q->activate(QPoint(0, 0));
952 }
953 
954 void KStatusNotifierItemPrivate::hideMenu()
955 {
956  menu->hide();
957 }
958 
959 void KStatusNotifierItemPrivate::minimizeRestore(bool show)
960 {
961 #ifdef Q_WS_X11
962  KWindowInfo info = KWindowSystem::windowInfo(associatedWidget->winId(), NET::WMDesktop | NET::WMFrameExtents);
963  if (show) {
964  if (onAllDesktops) {
965  KWindowSystem::setOnAllDesktops(associatedWidget->winId(), true);
966  } else {
967  KWindowSystem::setCurrentDesktop(info.desktop());
968  }
969 
970  associatedWidget->move(info.frameGeometry().topLeft()); // avoid placement policies
971  associatedWidget->show();
972  associatedWidget->raise();
973  KWindowSystem::raiseWindow(associatedWidget->winId());
974  KWindowSystem::forceActiveWindow(associatedWidget->winId());
975  } else {
976  onAllDesktops = info.onAllDesktops();
977  associatedWidget->hide();
978  }
979 #else
980  if (show) {
981  associatedWidget->show();
982  associatedWidget->raise();
983  KWindowSystem::forceActiveWindow(associatedWidget->winId());
984  } else {
985  associatedWidget->hide();
986  }
987 #endif
988 }
989 
990 KDbusImageStruct KStatusNotifierItemPrivate::imageToStruct(const QImage &image)
991 {
992  KDbusImageStruct icon;
993  icon.width = image.size().width();
994  icon.height = image.size().height();
995  if (image.format() == QImage::Format_ARGB32) {
996  icon.data = QByteArray((char*)image.bits(), image.numBytes());
997  } else {
998  QImage image32 = image.convertToFormat(QImage::Format_ARGB32);
999  icon.data = QByteArray((char*)image32.bits(), image32.numBytes());
1000  }
1001 
1002  //swap to network byte order if we are little endian
1003  if (QSysInfo::ByteOrder == QSysInfo::LittleEndian) {
1004  quint32 *uintBuf = (quint32 *) icon.data.data();
1005  for (uint i = 0; i < icon.data.size()/sizeof(quint32); ++i) {
1006  *uintBuf = htonl(*uintBuf);
1007  ++uintBuf;
1008  }
1009  }
1010 
1011  return icon;
1012 }
1013 
1014 KDbusImageVector KStatusNotifierItemPrivate::iconToVector(const QIcon &icon)
1015 {
1016  KDbusImageVector iconVector;
1017 
1018  QPixmap iconPixmap;
1019 
1020  //availableSizes() won't work on KIcon
1021  QList<QSize> allSizes;
1022  allSizes << QSize(KIconLoader::SizeSmall, KIconLoader::SizeSmall)
1023  << QSize(KIconLoader::SizeSmallMedium, KIconLoader::SizeSmallMedium)
1024  << QSize(KIconLoader::SizeMedium, KIconLoader::SizeMedium)
1025  << QSize(KIconLoader::SizeLarge, KIconLoader::SizeLarge);
1026 
1027  //if an icon exactly that size wasn't found don't add it to the vector
1028  foreach (const QSize &size, allSizes) {
1029  //hopefully huge and enormous not necessary right now, since it's quite costly
1030  if (size.width() <= KIconLoader::SizeLarge) {
1031  iconPixmap = icon.pixmap(size);
1032  iconVector.append(imageToStruct(iconPixmap.toImage()));
1033  }
1034  }
1035 
1036  return iconVector;
1037 }
1038 
1039 #include "kstatusnotifieritem.moc"
1040 #include "kstatusnotifieritemprivate_p.moc"
KStandardGuiItem::cancel
KGuiItem cancel()
Returns the 'Cancel' gui item.
Definition: kstandardguiitem.cpp:113
QAction::setText
void setText(const QString &text)
NET::TopMenu
indicates a toplevel menu (AKA macmenu).
Definition: netwm_def.h:345
QIcon::cacheKey
qint64 cacheKey() const
KGlobal::caption
QString caption()
i18n
QString i18n(const char *text)
KIconLoader::SizeMedium
medium sized icons for the desktop
Definition: kiconloader.h:159
KStatusNotifierItem::setCategory
void setCategory(const ItemCategory category)
Sets the category for this icon, usually it's needed to call this function only once.
Definition: kstatusnotifieritem.cpp:134
QImage::convertToFormat
QImage convertToFormat(Format format, QFlags< Qt::ImageConversionFlag > flags) const
KIconLoader::SizeLarge
large sized icons for the panel
Definition: kiconloader.h:161
QEvent
KActionCollection
A container for a set of QAction objects.
Definition: kactioncollection.h:56
QWidget
NET::KeepAbove
indicates that a window should on top of most windows (but below fullscreen windows).
Definition: netwm_def.h:462
QString::append
QString & append(QChar ch)
NET::SplashMask
Definition: netwm_def.h:394
QEvent::type
Type type() const
KStatusNotifierItem::setAttentionMovieByName
void setAttentionMovieByName(const QString &name)
Sets a movie as the requesting attention icon.
Definition: kstatusnotifieritem.cpp:299
KMessageBox::Continue
Definition: kmessagebox.h:74
QSize::width
int width() const
QPixmap::width
int width() const
KStatusNotifierItem::eventFilter
bool eventFilter(QObject *watched, QEvent *event)
Definition: kstatusnotifieritem.cpp:691
QPainter::end
bool end()
KStatusNotifierItem::setOverlayIconByName
void setOverlayIconByName(const QString &name)
Sets an icon to be used as overlay for the main one.
Definition: kstatusnotifieritem.cpp:212
kdebug.h
KStatusNotifierItem::setIconByName
void setIconByName(const QString &name)
Sets a new main icon for the system tray.
Definition: kstatusnotifieritem.cpp:172
KWindowInfo::windowType
NET::WindowType windowType(int supported_types) const
Returns the window type of this window (see NET::WindowType).
Definition: kwindowinfo_mac.cpp:210
NET::DesktopMask
Definition: netwm_def.h:386
QWidget::window
QWidget * window() const
QByteArray
NET::UtilityMask
Definition: netwm_def.h:393
KWindowInfo::frameGeometry
QRect frameGeometry() const
Returns the frame geometry of the window, i.e.
Definition: kwindowinfo_mac.cpp:283
QDataStream
kactioncollection.h
KStandardDirs::findDirs
QStringList findDirs(const char *type, const QString &reldir) const
KMenu
A menu with keyboard searching.
Definition: kmenu.h:42
KStatusNotifierItem::standardActionsEnabled
bool standardActionsEnabled() const
Definition: kstatusnotifieritem.cpp:546
KIconLoader::SizeSmallMedium
slightly larger small icons for toolbars, panels, etc
Definition: kiconloader.h:157
KStandardAction::Quit
Definition: kstandardaction.h:130
NET::XAWMState
Definition: netwm_def.h:642
QAction::icon
icon
KWindowSystem::windowInfo
static KWindowInfo windowInfo(WId win, unsigned long properties, unsigned long properties2=0)
Returns information about window win.
Definition: kwindowsystem_mac.cpp:330
QMovie
KStatusNotifierItem::activate
virtual void activate(const QPoint &pos=QPoint())
Shows the main widget and try to position it on top of the other windows, if the widget is already vi...
Definition: kstatusnotifieritem.cpp:569
dirs
KStandardDirs * dirs()
QByteArray::isEmpty
bool isEmpty() const
KStatusNotifierItem::iconName
QString iconName() const
QRect::intersects
bool intersects(const QRect &rectangle) const
KStandardAction::name
const char * name(StandardAction id)
This will return the internal name of a given standard action.
Definition: kstandardaction.cpp:223
KStatusNotifierItem::setAssociatedWidget
void setAssociatedWidget(QWidget *parent)
Sets the main widget associated with this StatusNotifierItem.
Definition: kstatusnotifieritem.cpp:471
QObject::metaObject
virtual const QMetaObject * metaObject() const
NET::NormalMask
Definition: netwm_def.h:385
KWindowInfo
Information about a window.
Definition: kwindowinfo.h:35
KWindowInfo::hasState
bool hasState(unsigned long s) const
Returns true if the window has the given state flag set (see the NET::State enum for details)...
Definition: kwindowinfo_mac.cpp:180
QDBusConnection
KStatusNotifierItem::contextMenu
KMenu * contextMenu() const
Access the context menu associated to this status notifier item.
Definition: kstatusnotifieritem.cpp:466
QBuffer
QDBusConnection::sessionBus
QDBusConnection sessionBus()
KComponentData::aboutData
const KAboutData * aboutData() const
quint32
KStatusNotifierItem::setStandardActionsEnabled
void setStandardActionsEnabled(bool enabled)
Sets whether to show the standard items in the menu, such as Quit.
Definition: kstatusnotifieritem.cpp:522
QPoint
QMouseEvent
KStatusNotifierItem::NeedsAttention
The application requests the attention of the user, for instance battery running out or a new IM mess...
Definition: kstatusnotifieritem.h:103
KWindowSystem::raiseWindow
static void raiseWindow(WId win)
Raises the given window.
Definition: kwindowsystem_mac.cpp:530
KWindowSystem::forceActiveWindow
static void forceActiveWindow(WId win, long time=0)
Sets window win to be the active window.
Definition: kwindowsystem_mac.cpp:366
kDebug
static QDebug kDebug(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
KStatusNotifierItem::toolTipIconName
QString toolTipIconName() const
KStatusNotifierItem::attentionIconPixmap
QIcon attentionIconPixmap() const
Definition: kstatusnotifieritem.cpp:294
KGlobal::ref
void ref()
KStatusNotifierItem::setToolTipIconByName
void setToolTipIconByName(const QString &name)
Set a new icon for the toolTip.
Definition: kstatusnotifieritem.cpp:366
QPoint::x
int x() const
QPoint::y
int y() const
QIcon::pixmap
QPixmap pixmap(const QSize &size, Mode mode, State state) const
KStatusNotifierItem::associatedWidget
QWidget * associatedWidget() const
Access the main widget associated with this StatusNotifierItem.
Definition: kstatusnotifieritem.cpp:512
KStatusNotifierItem::setToolTip
void setToolTip(const QString &iconName, const QString &title, const QString &subTitle)
Sets a new toolTip or this icon, a toolTip is composed of an icon, a title ad a text, all fields are optional.
Definition: kstatusnotifieritem.cpp:325
KWindowInfo::isMinimized
bool isMinimized() const
Returns true if the window is minimized.
Definition: kwindowinfo_mac.cpp:185
KStatusNotifierItem::setIconByPixmap
void setIconByPixmap(const QIcon &icon)
Sets a new main icon for the system tray.
Definition: kstatusnotifieritem.cpp:191
KStatusNotifierItem::toolTipIconPixmap
QIcon toolTipIconPixmap() const
Definition: kstatusnotifieritem.cpp:394
QObject::event
virtual bool event(QEvent *e)
KStatusNotifierItem::setToolTipIconByPixmap
void setToolTipIconByPixmap(const QIcon &icon)
Set a new icon for the toolTip.
Definition: kstatusnotifieritem.cpp:382
KStatusNotifierItem::category
ItemCategory category() const
NET::DialogMask
Definition: netwm_def.h:390
KWindowInfo::onAllDesktops
bool onAllDesktops() const
Returns true if the window is on all desktops (equal to desktop()==NET::OnAllDesktops).
Definition: kwindowinfo_mac.cpp:268
KWindowSystem::activateWindow
static void activateWindow(WId win, long time=0)
Requests that window win is activated.
Definition: kwindowsystem_mac.cpp:355
QObject::name
const char * name() const
KWindowInfo::mappingState
NET::MappingState mappingState() const
Returns the mapping state of the window (see NET::MappingState).
Definition: kwindowinfo_mac.cpp:199
kglobal.h
KStatusNotifierItem::ItemCategory
ItemCategory
Different kinds of applications announce their type to the systemtray, so can be drawn in a different...
Definition: kstatusnotifieritem.h:110
ksystemtrayicon.h
KGlobal::deref
void deref()
KStatusNotifierItem::setToolTipSubTitle
void setToolTipSubTitle(const QString &subTitle)
Sets a new subtitle for the toolTip.
Definition: kstatusnotifieritem.cpp:417
QObject::installEventFilter
void installEventFilter(QObject *filterObj)
NET::ToolbarMask
Definition: netwm_def.h:388
KStatusNotifierItem::setOverlayIconByPixmap
void setOverlayIconByPixmap(const QIcon &icon)
Sets an icon to be used as overlay for the main one setOverlayIconByPixmap(QIcon()) will remove the o...
Definition: kstatusnotifieritem.cpp:237
NET::WindowType
WindowType
Window type.
Definition: netwm_def.h:305
kmenu.h
QObject
KStatusNotifierItem::overlayIconName
QString overlayIconName() const
KStatusNotifierItem::setAttentionIconByPixmap
void setAttentionIconByPixmap(const QIcon &icon)
Sets the pixmap of the requesting attention icon.
Definition: kstatusnotifieritem.cpp:282
QPainter::drawPixmap
void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)
QList::isEmpty
bool isEmpty() const
QPainter
QString::isEmpty
bool isEmpty() const
KStatusNotifierItem::status
ItemStatus status() const
KStatusNotifierItem::overlayIconPixmap
QIcon overlayIconPixmap() const
Definition: kstatusnotifieritem.cpp:259
KIcon
A wrapper around QIcon that provides KDE icon features.
Definition: kicon.h:40
KStatusNotifierItem::setStatus
void setStatus(const ItemStatus status)
Sets a new status for this icon.
Definition: kstatusnotifieritem.cpp:154
KStatusNotifierItem::setContextMenu
void setContextMenu(KMenu *menu)
Sets a new context menu for this StatusNotifierItem.
Definition: kstatusnotifieritem.cpp:432
QBuffer::open
virtual bool open(QFlags< QIODevice::OpenModeFlag > flags)
QMenu::setTitle
void setTitle(const QString &title)
QList::first
T & first()
KStatusNotifierItem::iconPixmap
QIcon iconPixmap() const
Definition: kstatusnotifieritem.cpp:207
KStatusNotifierItem::Active
The application is doing something, or it is important that the icon is always reachable from the use...
Definition: kstatusnotifieritem.h:100
QString
QList
QStringList
KWindowSystem::setCurrentDesktop
static void setCurrentDesktop(int desktop)
Convenience function to set the current desktop to desktop.
Definition: kwindowsystem_mac.cpp:394
KStatusNotifierItem::setToolTipTitle
void setToolTipTitle(const QString &title)
Sets a new title for the toolTip.
Definition: kstatusnotifieritem.cpp:399
KStatusNotifierItem::attentionMovieName
QString attentionMovieName() const
Definition: kstatusnotifieritem.cpp:318
QBuffer::data
const QByteArray & data() const
QPixmap
NET::WMFrameExtents
Definition: netwm_def.h:643
KStatusNotifierItem::attentionIconName
QString attentionIconName() const
kaction.h
QMenu
NET::WMWindowType
Definition: netwm_def.h:634
QSize
QPixmap::height
int height() const
KStatusNotifierItem::ItemStatus
ItemStatus
All the possible status this icon can have, depending on the importance of the events that happens in...
Definition: kstatusnotifieritem.h:95
QImage::numBytes
int numBytes() const
QImage
KStatusNotifierItem::setTitle
void setTitle(const QString &title)
Sets a title for this icon.
Definition: kstatusnotifieritem.cpp:149
KStatusNotifierItem::activateRequested
void activateRequested(bool active, const QPoint &pos)
Inform the host application that an activation has been requested, for instance left mouse click...
KWindowInfo::geometry
QRect geometry() const
Returns the position and size of the window contents.
Definition: kwindowinfo_mac.cpp:278
KAboutData::programName
QString programName() const
kstatusnotifieritem.h
QBuffer::close
virtual void close()
KIconLoader::SizeSmall
small icons for menu entries
Definition: kiconloader.h:155
KStatusNotifierItem::actionCollection
KActionCollection * actionCollection() const
All the actions present in the menu.
Definition: kstatusnotifieritem.cpp:517
QLatin1String
NET::Dock
indicates a dock or panel feature
Definition: netwm_def.h:324
KStatusNotifierItem::toolTipTitle
QString toolTipTitle() const
QIcon::isNull
bool isNull() const
kstandarddirs.h
KWindowSystem::setOnAllDesktops
static void setOnAllDesktops(WId win, bool b)
Sets window win to be present on all virtual desktops if is true.
Definition: kwindowsystem_mac.cpp:400
NET::DockMask
Definition: netwm_def.h:387
QAction
QSize::height
int height() const
NET::Visible
indicates the client window is visible to the user.
Definition: netwm_def.h:537
QRect::topLeft
QPoint topLeft() const
KGlobal::mainComponent
const KComponentData & mainComponent()
QImage::size
QSize size() const
kwindowsystem.h
KStatusNotifierItem::~KStatusNotifierItem
~KStatusNotifierItem()
Definition: kstatusnotifieritem.cpp:116
QImage::bits
uchar * bits()
KStatusNotifierItem
KDE Status notifier Item protocol implementation
Definition: kstatusnotifieritem.h:72
NET::OverrideMask
Definition: netwm_def.h:391
NET::TopMenuMask
Definition: netwm_def.h:392
QListIterator
KStatusNotifierItem::KStatusNotifierItem
KStatusNotifierItem(QObject *parent=0)
Construct a new status notifier item.
Definition: kstatusnotifieritem.cpp:101
KStandardAction::quit
KAction * quit(const QObject *recvr, const char *slot, QObject *parent)
Quit the program.
Definition: kstandardaction.cpp:279
KWindowInfo::desktop
int desktop() const
Returns the virtual desktop this window is on (NET::OnAllDesktops if the window is on all desktops)...
Definition: kwindowinfo_mac.cpp:273
kaboutdata.h
QPixmap::toImage
QImage toImage() const
KStandardGuiItem::quit
KGuiItem quit()
Returns the 'Quit' gui item.
Definition: kstandardguiitem.cpp:252
kicon.h
KWindowInfo::isOnCurrentDesktop
bool isOnCurrentDesktop() const
Returns true if the window is on the currently active virtual desktop.
Definition: kwindowinfo_mac.cpp:258
kmessagebox.h
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
NET::MenuMask
Definition: netwm_def.h:389
s_statusNotifierWatcherServiceName
static const QString s_statusNotifierWatcherServiceName("org.kde.StatusNotifierWatcher")
KWindowSystem::stackingOrder
static QList< WId > stackingOrder()
Returns the list of all toplevel windows currently managed by the window manager in the current stack...
Definition: kwindowsystem_mac.cpp:340
NET::WMDesktop
Definition: netwm_def.h:633
KStatusNotifierItem::showMessage
void showMessage(const QString &title, const QString &message, const QString &icon, int timeout=10000)
Shows the user a notification.
Definition: kstatusnotifieritem.cpp:551
KStatusNotifierItem::toolTipSubTitle
QString toolTipSubTitle() const
QImage::format
Format format() const
KMessageBox::warningContinueCancel
static int warningContinueCancel(QWidget *parent, const QString &text, const QString &caption=QString(), const KGuiItem &buttonContinue=KStandardGuiItem::cont(), const KGuiItem &buttonCancel=KStandardGuiItem::cancel(), const QString &dontAskAgainName=QString(), Options options=Notify)
Display a "warning" dialog.
Definition: kmessagebox.cpp:644
NET::WMState
Definition: netwm_def.h:635
KStatusNotifierItem::setAttentionIconByName
void setAttentionIconByName(const QString &name)
Sets a new icon that should be used when the application wants to request attention (usually the syst...
Definition: kstatusnotifieritem.cpp:266
QtConcurrent::mapped
QFuture< T > mapped(const Sequence &sequence, MapFunction function)
KStatusNotifierItem::title
QString title() const
QIcon
kwindowinfo.h
QDBusServiceWatcher
KMenu::addTitle
QAction * addTitle(const QString &text, QAction *before=0L)
Inserts a title item with no icon.
Definition: kmenu.cpp:170
NET::WMGeometry
Definition: netwm_def.h:648
QTimer::singleShot
singleShot
KStatusNotifierItem::id
QString id() const
Definition: kstatusnotifieritem.cpp:128
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:24:00 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDEUI

Skip menu "KDEUI"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdelibs API Reference

Skip menu "kdelibs API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal