diff options
| author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 | 
|---|---|---|
| committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 | 
| commit | 4aed2c8219774f5d797760606b8489a92ddc5163 (patch) | |
| tree | 3f8c130f7d269626bf6a9447407ef6c35954426a /kwin/notifications.cpp | |
| download | tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.tar.gz tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.zip | |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
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 | 
