notifications.cpp

00001 /*****************************************************************
00002  KWin - the KDE window manager
00003  This file is part of the KDE project.
00004 
00005 Copyright (C) 1999, 2000 Matthias Ettrich <ettrich@kde.org>
00006 Copyright (C) 2003 Lubos Lunak <l.lunak@kde.org>
00007 
00008 You can Freely distribute this program under the GNU General Public
00009 License. See the file "COPYING" for the exact licensing terms.
00010 ******************************************************************/
00011 
00012 #include "notifications.h"
00013 #include <knotifyclient.h>
00014 
00015 #include "client.h"
00016 
00017 namespace KWinInternal
00018 {
00019 
00020 QString Notify::eventToName( Event e )
00021     {
00022     QString event;
00023     switch ( e ) 
00024         {
00025         case Activate:
00026             event = "activate";
00027             break;
00028         case Close:
00029             event = "close";
00030             break;
00031         case Minimize:
00032             event = "minimize";
00033             break;
00034         case UnMinimize:
00035             event = "unminimize";
00036             break;
00037         case Maximize:
00038             event = "maximize";
00039             break;
00040         case UnMaximize:
00041             event = "unmaximize";
00042             break;
00043         case OnAllDesktops:
00044             event = "on_all_desktops";
00045             break;
00046         case NotOnAllDesktops:
00047             event = "not_on_all_desktops";
00048             break;
00049         case New:
00050             event = "new";
00051             break;
00052         case Delete:
00053             event = "delete";
00054             break;
00055         case TransNew:
00056             event = "transnew";
00057             break;
00058         case TransDelete:
00059             event = "transdelete";
00060             break;
00061         case ShadeUp:
00062             event = "shadeup";
00063             break;
00064         case ShadeDown:
00065             event = "shadedown";
00066             break;
00067         case MoveStart:
00068             event = "movestart";
00069             break;
00070         case MoveEnd:
00071             event = "moveend";
00072             break;
00073         case ResizeStart:
00074             event = "resizestart";
00075             break;
00076         case ResizeEnd:
00077             event = "resizeend";
00078             break;
00079         case DemandAttentionCurrent:
00080             event = "demandsattentioncurrent";
00081             break;
00082         case DemandAttentionOther:
00083             event = "demandsattentionother";
00084             break;
00085         default:
00086             if ((e > DesktopChange) && (e <= DesktopChange+20))
00087             {
00088             event = QString("desktop%1").arg(e-DesktopChange);
00089             }
00090         break;
00091         }
00092     return event;
00093     }
00094 
00095 static bool forgetIt = FALSE;
00096 QValueList< Notify::EventData > Notify::pending_events;
00097 
00098 bool Notify::raise( Event e, const QString& message, Client* c )
00099     {
00100     if ( forgetIt )
00101         return false; // no connection was possible, don't try each time
00102 
00103     QString event = eventToName( e );
00104     if ( !event )
00105         return false;
00106 
00107 // There may be a deadlock if KNotify event is sent while KWin has X grabbed.
00108 // If KNotify is not running, KLauncher may do X requests (startup notification, whatever)
00109 // that will block it. And KNotifyClient waits for the launch to succeed, which means
00110 // KLauncher waits for X and KWin waits for KLauncher. So postpone events in such case.
00111     if( grabbedXServer())
00112         {
00113         EventData data;
00114         data.event = event;
00115         data.message = message;
00116         data.window = c ? c->window() : 0;
00117         pending_events.append( data );
00118         return true;
00119         }
00120 
00121     forgetIt= !KNotifyClient::event( c ? c->window() : 0, event, message );
00122     return !forgetIt;
00123     }
00124 
00125 void Notify::sendPendingEvents()
00126     {
00127     while( !pending_events.isEmpty())
00128         {
00129         EventData data = pending_events.first();
00130         pending_events.pop_front();
00131         if( !forgetIt )
00132             forgetIt= !KNotifyClient::event( data.window, data.event, data.message );
00133         }
00134     }
00135 
00136 bool Notify::makeDemandAttention( Event e )
00137     {
00138     QString event = eventToName( e );
00139     if( !event )
00140         return false;
00141     int rep = KNotifyClient::getPresentation( event );
00142     if( rep == -1 )
00143         rep = KNotifyClient::getDefaultPresentation( event );
00144     return rep != -1 && ( rep & KNotifyClient::Taskbar );
00145     }
00146 
00147 } // namespace
KDE Home | KDE Accessibility Home | Description of Access Keys