diff options
Diffstat (limited to 'kwin/notifications.cpp')
-rw-r--r-- | kwin/notifications.cpp | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/kwin/notifications.cpp b/kwin/notifications.cpp new file mode 100644 index 000000000..a2d72d697 --- /dev/null +++ b/kwin/notifications.cpp @@ -0,0 +1,147 @@ +/***************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 1999, 2000 Matthias Ettrich <ettrich@kde.org> +Copyright (C) 2003 Lubos Lunak <l.lunak@kde.org> + +You can Freely distribute this program under the GNU General Public +License. See the file "COPYING" for the exact licensing terms. +******************************************************************/ + +#include "notifications.h" +#include <knotifyclient.h> + +#include "client.h" + +namespace KWinInternal +{ + +QString Notify::eventToName( Event e ) + { + QString event; + switch ( e ) + { + case Activate: + event = "activate"; + break; + case Close: + event = "close"; + break; + case Minimize: + event = "minimize"; + break; + case UnMinimize: + event = "unminimize"; + break; + case Maximize: + event = "maximize"; + break; + case UnMaximize: + event = "unmaximize"; + break; + case OnAllDesktops: + event = "on_all_desktops"; + break; + case NotOnAllDesktops: + event = "not_on_all_desktops"; + break; + case New: + event = "new"; + break; + case Delete: + event = "delete"; + break; + case TransNew: + event = "transnew"; + break; + case TransDelete: + event = "transdelete"; + break; + case ShadeUp: + event = "shadeup"; + break; + case ShadeDown: + event = "shadedown"; + break; + case MoveStart: + event = "movestart"; + break; + case MoveEnd: + event = "moveend"; + break; + case ResizeStart: + event = "resizestart"; + break; + case ResizeEnd: + event = "resizeend"; + break; + case DemandAttentionCurrent: + event = "demandsattentioncurrent"; + break; + case DemandAttentionOther: + event = "demandsattentionother"; + break; + default: + if ((e > DesktopChange) && (e <= DesktopChange+20)) + { + event = QString("desktop%1").arg(e-DesktopChange); + } + break; + } + return event; + } + +static bool forgetIt = FALSE; +QValueList< Notify::EventData > Notify::pending_events; + +bool Notify::raise( Event e, const QString& message, Client* c ) + { + if ( forgetIt ) + return false; // no connection was possible, don't try each time + + QString event = eventToName( e ); + if ( !event ) + return false; + +// There may be a deadlock if KNotify event is sent while KWin has X grabbed. +// If KNotify is not running, KLauncher may do X requests (startup notification, whatever) +// that will block it. And KNotifyClient waits for the launch to succeed, which means +// KLauncher waits for X and KWin waits for KLauncher. So postpone events in such case. + if( grabbedXServer()) + { + EventData data; + data.event = event; + data.message = message; + data.window = c ? c->window() : 0; + pending_events.append( data ); + return true; + } + + forgetIt= !KNotifyClient::event( c ? c->window() : 0, event, message ); + return !forgetIt; + } + +void Notify::sendPendingEvents() + { + while( !pending_events.isEmpty()) + { + EventData data = pending_events.first(); + pending_events.pop_front(); + if( !forgetIt ) + forgetIt= !KNotifyClient::event( data.window, data.event, data.message ); + } + } + +bool Notify::makeDemandAttention( Event e ) + { + QString event = eventToName( e ); + if( !event ) + return false; + int rep = KNotifyClient::getPresentation( event ); + if( rep == -1 ) + rep = KNotifyClient::getDefaultPresentation( event ); + return rep != -1 && ( rep & KNotifyClient::Taskbar ); + } + +} // namespace |