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 TQString Notify::eventToName( Event e ) 00021 { 00022 TQString 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 = TQString("desktop%1").arg(e-DesktopChange); 00089 } 00090 break; 00091 } 00092 return event; 00093 } 00094 00095 static bool forgetIt = FALSE; 00096 TQValueList< Notify::EventData > Notify::pending_events; 00097 00098 bool Notify::raise( Event e, const TQString& message, Client* c ) 00099 { 00100 if ( forgetIt ) 00101 return false; // no connection was possible, don't try each time 00102 00103 TQString 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 TQString 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