SVN commit 1006493 by gkiagia: Work a bit more on the behavior of the systray icon. - When clicking on the icon and the window is shown, close it instead of hiding it. - When minimizing a window (i.e. hiding it), do not make the systray icon active. - When an approver request comes, save the icon status and restore it when the request has finished. - While showing a notification for the request, do not change the icon status if the main window closes, but update the status-to-be-restored instead. M +22 -6 systrayicon.cpp --- trunk/playground/network/kcall/systrayicon.cpp #1006492:1006493 @@ -44,6 +44,7 @@ QSet requests; QPointer currentRequest; Experimental::KNotificationItem *notificationItem; + Experimental::KNotificationItem::ItemStatus restoreStatus; }; SystrayIcon::SystrayIcon() @@ -71,6 +72,10 @@ { d->requests.insert(request); d->currentRequest = request; + //if we are not already showing a notification, save the current icon status for restoring later + if ( d->notificationItem->status() != Experimental::KNotificationItem::NeedsAttention ) { + d->restoreStatus = d->notificationItem->status(); + } d->notificationItem->setStatus(Experimental::KNotificationItem::NeedsAttention); } @@ -79,7 +84,7 @@ d->requests.remove(request); kDebug() << d->requests.size(); if ( d->requests.size() == 0 ) { - d->notificationItem->setStatus(Experimental::KNotificationItem::Passive); + d->notificationItem->setStatus(d->restoreStatus); } } @@ -100,7 +105,7 @@ mw->raise(); mw->activateWindow(); } else { - mw->hide(); + mw->close(); } } } @@ -111,17 +116,28 @@ return AbstractClientApprover::eventFilter(watched, event); } + Experimental::KNotificationItem::ItemStatus newStatus; + switch (event->type()) { case QEvent::Show: - d->notificationItem->setStatus(Experimental::KNotificationItem::Passive); + newStatus = Experimental::KNotificationItem::Passive; break; - case QEvent::Hide: case QEvent::Close: - d->notificationItem->setStatus(Experimental::KNotificationItem::Active); + newStatus = Experimental::KNotificationItem::Active; break; default: - break; + return false; } + + if ( d->notificationItem->status() != Experimental::KNotificationItem::NeedsAttention ) { + //there is no request currently, so we should directly update the icon status + d->notificationItem->setStatus(newStatus); + } else { + //else we need to update the restoreStatus, so that the status + //is set to that when the request has finished + d->restoreStatus = newStatus; + } + return false; }