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

KDEUI

  • 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
52static const QString s_statusNotifierWatcherServiceName("org.kde.StatusNotifierWatcher");
53
57class KDBusMenuExporter : public DBusMenuExporter
58{
59public:
60 KDBusMenuExporter(const QString &dbusObjectPath, QMenu *menu, const QDBusConnection &dbusConnection)
61 : DBusMenuExporter(dbusObjectPath, menu, dbusConnection)
62 {}
63
64protected:
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
101KStatusNotifierItem::KStatusNotifierItem(QObject *parent)
102 : QObject(parent),
103 d(new KStatusNotifierItemPrivate(this))
104{
105 d->init(QString());
106}
107
108
109KStatusNotifierItem::KStatusNotifierItem(const QString &id, QObject *parent)
110 : QObject(parent),
111 d(new KStatusNotifierItemPrivate(this))
112{
113 d->init(id);
114}
115
116KStatusNotifierItem::~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
128QString KStatusNotifierItem::id() const
129{
130 //kDebug(299) << "id requested" << d->id;
131 return d->id;
132}
133
134void KStatusNotifierItem::setCategory(const ItemCategory category)
135{
136 d->category = category;
137}
138
139KStatusNotifierItem::ItemStatus KStatusNotifierItem::status() const
140{
141 return d->status;
142}
143
144KStatusNotifierItem::ItemCategory KStatusNotifierItem::category() const
145{
146 return d->category;
147}
148
149void KStatusNotifierItem::setTitle(const QString &title)
150{
151 d->title = title;
152}
153
154void 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
172void 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
186QString KStatusNotifierItem::iconName() const
187{
188 return d->iconName;
189}
190
191void 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
207QIcon KStatusNotifierItem::iconPixmap() const
208{
209 return d->icon;
210}
211
212void 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
232QString KStatusNotifierItem::overlayIconName() const
233{
234 return d->overlayIconName;
235}
236
237void 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
259QIcon KStatusNotifierItem::overlayIconPixmap() const
260{
261 return d->overlayIcon;
262}
263
264//Icons and movie for requesting attention state
265
266void 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
277QString KStatusNotifierItem::attentionIconName() const
278{
279 return d->attentionIconName;
280}
281
282void 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
294QIcon KStatusNotifierItem::attentionIconPixmap() const
295{
296 return d->attentionIcon;
297}
298
299void 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
318QString KStatusNotifierItem::attentionMovieName() const
319{
320 return d->movieName;
321}
322
323//ToolTip
324
325void 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
345void 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
366void 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
377QString KStatusNotifierItem::toolTipIconName() const
378{
379 return d->toolTipIconName;
380}
381
382void 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
394QIcon KStatusNotifierItem::toolTipIconPixmap() const
395{
396 return d->toolTipIcon;
397}
398
399void 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
412QString KStatusNotifierItem::toolTipTitle() const
413{
414 return d->toolTipTitle;
415}
416
417void 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
427QString KStatusNotifierItem::toolTipSubTitle() const
428{
429 return d->toolTipSubTitle;
430}
431
432void 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
466KMenu *KStatusNotifierItem::contextMenu() const
467{
468 return d->menu;
469}
470
471void 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
512QWidget *KStatusNotifierItem::associatedWidget() const
513{
514 return d->associatedWidget;
515}
516
517KActionCollection *KStatusNotifierItem::actionCollection() const
518{
519 return d->actionCollection;
520}
521
522void 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
546bool KStatusNotifierItem::standardActionsEnabled() const
547{
548 return d->standardActionsEnabled;
549}
550
551void 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
562QString KStatusNotifierItem::title() const
563{
564 return d->title;
565}
566
567
568
569void 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
595bool 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
691bool 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
707const int KStatusNotifierItemPrivate::s_protocolVersion = 0;
708
709KStatusNotifierItemPrivate::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
725void 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
769void 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
792void 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
807void KStatusNotifierItemPrivate::checkForRegisteredHosts()
808{
809 setLegacyMode(!statusNotifierWatcher ||
810 !statusNotifierWatcher->property("IsStatusNotifierHostRegistered").toBool());
811}
812
813void 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
828void KStatusNotifierItemPrivate::legacyWheelEvent(int delta)
829{
830 statusNotifierItemDBus->Scroll(delta, "vertical");
831}
832
833void KStatusNotifierItemPrivate::legacyActivated(QSystemTrayIcon::ActivationReason reason)
834{
835 if (reason == QSystemTrayIcon::MiddleClick) {
836 emit q->secondaryActivateRequested(systemTrayIcon->geometry().topLeft());
837 }
838}
839
840void 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
876void 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
900void 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
933void 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
949void KStatusNotifierItemPrivate::minimizeRestore()
950{
951 q->activate(QPoint(0, 0));
952}
953
954void KStatusNotifierItemPrivate::hideMenu()
955{
956 menu->hide();
957}
958
959void 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
990KDbusImageStruct 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
1014KDbusImageVector 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"
KAboutData::programName
QString programName() const
KActionCollection
A container for a set of QAction objects.
Definition: kactioncollection.h:57
KComponentData::aboutData
const KAboutData * aboutData() const
KIconLoader::SizeMedium
@ SizeMedium
medium sized icons for the desktop
Definition: kiconloader.h:159
KIconLoader::SizeSmallMedium
@ SizeSmallMedium
slightly larger small icons for toolbars, panels, etc
Definition: kiconloader.h:157
KIconLoader::SizeSmall
@ SizeSmall
small icons for menu entries
Definition: kiconloader.h:155
KIconLoader::SizeLarge
@ SizeLarge
large sized icons for the panel
Definition: kiconloader.h:161
KIcon
A wrapper around QIcon that provides KDE icon features.
Definition: kicon.h:41
KMenu
A menu with keyboard searching.
Definition: kmenu.h:42
KMenu::addTitle
QAction * addTitle(const QString &text, QAction *before=0L)
Inserts a title item with no icon.
Definition: kmenu.cpp:170
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
KMessageBox::Continue
@ Continue
Definition: kmessagebox.h:74
KStandardDirs::findDirs
QStringList findDirs(const char *type, const QString &reldir) const
KStatusNotifierItem
KDE Status notifier Item protocol implementation
Definition: kstatusnotifieritem.h:73
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
KStatusNotifierItem::toolTipIconName
QString toolTipIconName
Definition: kstatusnotifieritem.h:84
KStatusNotifierItem::setAssociatedWidget
void setAssociatedWidget(QWidget *parent)
Sets the main widget associated with this StatusNotifierItem.
Definition: kstatusnotifieritem.cpp:471
KStatusNotifierItem::setStatus
void setStatus(const ItemStatus status)
Sets a new status for this icon.
Definition: kstatusnotifieritem.cpp:154
KStatusNotifierItem::actionCollection
KActionCollection * actionCollection() const
All the actions present in the menu.
Definition: kstatusnotifieritem.cpp:517
KStatusNotifierItem::eventFilter
bool eventFilter(QObject *watched, QEvent *event)
Definition: kstatusnotifieritem.cpp:691
KStatusNotifierItem::overlayIconPixmap
QIcon overlayIconPixmap() const
Definition: kstatusnotifieritem.cpp:259
KStatusNotifierItem::ItemCategory
ItemCategory
Different kinds of applications announce their type to the systemtray, so can be drawn in a different...
Definition: kstatusnotifieritem.h:110
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
KStatusNotifierItem::activateRequested
void activateRequested(bool active, const QPoint &pos)
Inform the host application that an activation has been requested, for instance left mouse click,...
KStatusNotifierItem::category
ItemCategory category
Definition: kstatusnotifieritem.h:78
KStatusNotifierItem::iconName
QString iconName
Definition: kstatusnotifieritem.h:81
KStatusNotifierItem::setToolTipIconByName
void setToolTipIconByName(const QString &name)
Set a new icon for the toolTip.
Definition: kstatusnotifieritem.cpp:366
KStatusNotifierItem::id
QString id() const
Definition: kstatusnotifieritem.cpp:128
KStatusNotifierItem::setToolTipSubTitle
void setToolTipSubTitle(const QString &subTitle)
Sets a new subtitle for the toolTip.
Definition: kstatusnotifieritem.cpp:417
KStatusNotifierItem::iconPixmap
QIcon iconPixmap() const
Definition: kstatusnotifieritem.cpp:207
KStatusNotifierItem::title
QString title
Definition: kstatusnotifieritem.h:79
KStatusNotifierItem::~KStatusNotifierItem
~KStatusNotifierItem()
Definition: kstatusnotifieritem.cpp:116
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
KStatusNotifierItem::Active
@ Active
The application is doing something, or it is important that the icon is always reachable from the use...
Definition: kstatusnotifieritem.h:100
KStatusNotifierItem::NeedsAttention
@ NeedsAttention
The application requests the attention of the user, for instance battery running out or a new IM mess...
Definition: kstatusnotifieritem.h:103
KStatusNotifierItem::contextMenu
KMenu * contextMenu() const
Access the context menu associated to this status notifier item.
Definition: kstatusnotifieritem.cpp:466
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,...
Definition: kstatusnotifieritem.cpp:325
KStatusNotifierItem::setStandardActionsEnabled
void setStandardActionsEnabled(bool enabled)
Sets whether to show the standard items in the menu, such as Quit.
Definition: kstatusnotifieritem.cpp:522
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
KStatusNotifierItem::associatedWidget
QWidget * associatedWidget() const
Access the main widget associated with this StatusNotifierItem.
Definition: kstatusnotifieritem.cpp:512
KStatusNotifierItem::setContextMenu
void setContextMenu(KMenu *menu)
Sets a new context menu for this StatusNotifierItem.
Definition: kstatusnotifieritem.cpp:432
KStatusNotifierItem::status
ItemStatus status
Definition: kstatusnotifieritem.h:80
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::attentionIconName
QString attentionIconName
Definition: kstatusnotifieritem.h:83
KStatusNotifierItem::overlayIconName
QString overlayIconName
Definition: kstatusnotifieritem.h:82
KStatusNotifierItem::setIconByName
void setIconByName(const QString &name)
Sets a new main icon for the system tray.
Definition: kstatusnotifieritem.cpp:172
KStatusNotifierItem::toolTipIconPixmap
QIcon toolTipIconPixmap() const
Definition: kstatusnotifieritem.cpp:394
KStatusNotifierItem::setIconByPixmap
void setIconByPixmap(const QIcon &icon)
Sets a new main icon for the system tray.
Definition: kstatusnotifieritem.cpp:191
KStatusNotifierItem::attentionIconPixmap
QIcon attentionIconPixmap() const
Definition: kstatusnotifieritem.cpp:294
KStatusNotifierItem::attentionMovieName
QString attentionMovieName() const
Definition: kstatusnotifieritem.cpp:318
KStatusNotifierItem::KStatusNotifierItem
KStatusNotifierItem(QObject *parent=0)
Construct a new status notifier item.
Definition: kstatusnotifieritem.cpp:101
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
KStatusNotifierItem::setAttentionMovieByName
void setAttentionMovieByName(const QString &name)
Sets a movie as the requesting attention icon.
Definition: kstatusnotifieritem.cpp:299
KStatusNotifierItem::toolTipTitle
QString toolTipTitle
Definition: kstatusnotifieritem.h:85
KStatusNotifierItem::setTitle
void setTitle(const QString &title)
Sets a title for this icon.
Definition: kstatusnotifieritem.cpp:149
KStatusNotifierItem::setAttentionIconByPixmap
void setAttentionIconByPixmap(const QIcon &icon)
Sets the pixmap of the requesting attention icon.
Definition: kstatusnotifieritem.cpp:282
KStatusNotifierItem::setToolTipTitle
void setToolTipTitle(const QString &title)
Sets a new title for the toolTip.
Definition: kstatusnotifieritem.cpp:399
KStatusNotifierItem::standardActionsEnabled
bool standardActionsEnabled() const
Definition: kstatusnotifieritem.cpp:546
KStatusNotifierItem::setOverlayIconByName
void setOverlayIconByName(const QString &name)
Sets an icon to be used as overlay for the main one.
Definition: kstatusnotifieritem.cpp:212
KStatusNotifierItem::toolTipSubTitle
QString toolTipSubTitle
Definition: kstatusnotifieritem.h:86
KStatusNotifierItem::setToolTipIconByPixmap
void setToolTipIconByPixmap(const QIcon &icon)
Set a new icon for the toolTip.
Definition: kstatusnotifieritem.cpp:382
KWindowInfo
Information about a window.
Definition: kwindowinfo.h:36
KWindowInfo::windowType
NET::WindowType windowType(int supported_types) const
Returns the window type of this window (see NET::WindowType).
Definition: kwindowinfo_mac.cpp:210
KWindowInfo::isMinimized
bool isMinimized() const
Returns true if the window is minimized.
Definition: kwindowinfo_mac.cpp:185
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
KWindowInfo::isOnCurrentDesktop
bool isOnCurrentDesktop() const
Returns true if the window is on the currently active virtual desktop.
Definition: kwindowinfo_mac.cpp:258
KWindowInfo::onAllDesktops
bool onAllDesktops() const
Returns true if the window is on all desktops (equal to desktop()==NET::OnAllDesktops).
Definition: kwindowinfo_mac.cpp:268
KWindowInfo::geometry
QRect geometry() const
Returns the position and size of the window contents.
Definition: kwindowinfo_mac.cpp:278
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
KWindowInfo::mappingState
NET::MappingState mappingState() const
Returns the mapping state of the window (see NET::MappingState).
Definition: kwindowinfo_mac.cpp:199
KWindowInfo::frameGeometry
QRect frameGeometry() const
Returns the frame geometry of the window, i.e.
Definition: kwindowinfo_mac.cpp:283
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
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
KWindowSystem::activateWindow
static void activateWindow(WId win, long time=0)
Requests that window win is activated.
Definition: kwindowsystem_mac.cpp:355
KWindowSystem::windowInfo
static KWindowInfo windowInfo(WId win, unsigned long properties, unsigned long properties2=0)
Returns information about window win.
Definition: kwindowsystem_mac.cpp:330
KWindowSystem::setCurrentDesktop
static void setCurrentDesktop(int desktop)
Convenience function to set the current desktop to desktop.
Definition: kwindowsystem_mac.cpp:394
KWindowSystem::forceActiveWindow
static void forceActiveWindow(WId win, long time=0)
Sets window win to be the active window.
Definition: kwindowsystem_mac.cpp:366
KWindowSystem::raiseWindow
static void raiseWindow(WId win)
Raises the given window.
Definition: kwindowsystem_mac.cpp:530
NET::KeepAbove
@ KeepAbove
indicates that a window should on top of most windows (but below fullscreen windows).
Definition: netwm_def.h:462
NET::DialogMask
@ DialogMask
Definition: netwm_def.h:390
NET::MenuMask
@ MenuMask
Definition: netwm_def.h:389
NET::SplashMask
@ SplashMask
Definition: netwm_def.h:394
NET::UtilityMask
@ UtilityMask
Definition: netwm_def.h:393
NET::OverrideMask
@ OverrideMask
Definition: netwm_def.h:391
NET::ToolbarMask
@ ToolbarMask
Definition: netwm_def.h:388
NET::DockMask
@ DockMask
Definition: netwm_def.h:387
NET::NormalMask
@ NormalMask
Definition: netwm_def.h:385
NET::DesktopMask
@ DesktopMask
Definition: netwm_def.h:386
NET::TopMenuMask
@ TopMenuMask
Definition: netwm_def.h:392
NET::WindowType
WindowType
Window type.
Definition: netwm_def.h:305
NET::TopMenu
@ TopMenu
indicates a toplevel menu (AKA macmenu).
Definition: netwm_def.h:345
NET::Dock
@ Dock
indicates a dock or panel feature
Definition: netwm_def.h:324
NET::WMFrameExtents
@ WMFrameExtents
Definition: netwm_def.h:643
NET::WMWindowType
@ WMWindowType
Definition: netwm_def.h:634
NET::XAWMState
@ XAWMState
Definition: netwm_def.h:642
NET::WMGeometry
@ WMGeometry
Definition: netwm_def.h:648
NET::WMState
@ WMState
Definition: netwm_def.h:635
NET::WMDesktop
@ WMDesktop
Definition: netwm_def.h:633
NET::Visible
@ Visible
indicates the client window is visible to the user.
Definition: netwm_def.h:537
QAction
QList
QMenu
QObject
QWidget
kDebug
#define kDebug
kaboutdata.h
kaction.h
kactioncollection.h
kdebug.h
kglobal.h
kicon.h
timeout
int timeout
i18n
QString i18n(const char *text)
kmenu.h
kmessagebox.h
kstandarddirs.h
s_statusNotifierWatcherServiceName
static const QString s_statusNotifierWatcherServiceName("org.kde.StatusNotifierWatcher")
kstatusnotifieritem.h
ksystemtrayicon.h
kwindowinfo.h
kwindowsystem.h
KGlobal::mainComponent
const KComponentData & mainComponent()
dirs
KStandardDirs * dirs()
KGlobal::deref
void deref()
KGlobal::ref
void ref()
KGlobal::caption
QString caption()
message
void message(KMessage::MessageType messageType, const QString &text, const QString &caption=QString())
KStandardAction::quit
KAction * quit(const QObject *recvr, const char *slot, QObject *parent)
Quit the program.
Definition: kstandardaction.cpp:279
KStandardAction::name
const char * name(StandardAction id)
This will return the internal name of a given standard action.
Definition: kstandardaction.cpp:223
KStandardAction::Quit
@ Quit
Definition: kstandardaction.h:130
KStandardGuiItem::cancel
KGuiItem cancel()
Returns the 'Cancel' gui item.
Definition: kstandardguiitem.cpp:113
KStandardGuiItem::quit
KGuiItem quit()
Returns the 'Quit' gui item.
Definition: kstandardguiitem.cpp:252
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 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-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 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
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