Here is a list of changes to make to your application so that it can take advantage of the new KStatusNotifierItem (KSNI) class, available since KDE 4.4.
KSNI API can be found here:
- KSNI constructor takes a QObject, not a QWidget
- Be sure to set the category of your application with setCategory()
- Tell KSNI what your main window is with setAssociatedWidget()
Note: the mapping presented here is the one implemented by the Plasma Systemtray applet. Other implementations may do different choices.
- activated(Trigger) becomes activateRequested()
- activated(MiddleClick) becomes secondaryActivateRequested()
- mouse wheel on the item triggers scrollRequested()
Icons can be passed as a QString or as a QPixmap. Note that both must go through D-Bus, so for performance reasons, pass icons by name whenever possible.
- setIcon() becomes either setIconByName(QString) or setIconByPixmap(QPixmap)
A KSNI tooltip is made of an icon, a title and a subtitle (which may contain some limited markup). This means you have to replace your call to setToolTip(QString) with calls to:
- setToolTipIconByName(QString) (prefered) or setToolTipIconByPixmap(QPixmap)
An item has a status, which can be set with setStatus(). The host implementation can use this status to adjust the way it presents the item. For example, the Plasma Systemtray applet will automatically hide items with the Passive status by default, making it only visible if you click on the applet expand arrow.
When porting from KSystemTrayIcon, you can replace calls to show() or hide() with setStatus(KStatusNotifierItem::Active) and setStatus(KStatusNotifierItem::Passive) respectively. You can also choose to delete the KSNI instance to hide it, and recreate it when you want to show it.
There is no equivalent for the convenience static loadIcon(QString name) function. You have to replace it with KIconLoader::global()->loadIcon(name, KIconLoader::Panel)
The KStatusNotifierItem handles the "Quit" action in the popup menu itself, displaying a confirmation dialogue and calling qApp->quit() if the user confirms. It is not necessary for the application to handle this action itself.