Make a branch to make krunner Good Enough For Aaron™.
[kdebase/uwolfer.git] / workspace / kwin / notifications.cpp
blob149df1880c0dd6b1bb58416ff047d180da46a2ea
1 /********************************************************************
2 KWin - the KDE window manager
3 This file is part of the KDE project.
5 Copyright (C) 1999, 2000 Matthias Ettrich <ettrich@kde.org>
6 Copyright (C) 2003 Lubos Lunak <l.lunak@kde.org>
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
20 *********************************************************************/
22 #include "notifications.h"
23 #include <knotification.h>
25 #include "client.h"
27 namespace KWin
30 QString Notify::eventToName( Event e )
32 QString event;
33 switch ( e )
35 case Activate:
36 event = "activate";
37 break;
38 case Close:
39 event = "close";
40 break;
41 case Minimize:
42 event = "minimize";
43 break;
44 case UnMinimize:
45 event = "unminimize";
46 break;
47 case Maximize:
48 event = "maximize";
49 break;
50 case UnMaximize:
51 event = "unmaximize";
52 break;
53 case OnAllDesktops:
54 event = "on_all_desktops";
55 break;
56 case NotOnAllDesktops:
57 event = "not_on_all_desktops";
58 break;
59 case New:
60 event = "new";
61 break;
62 case Delete:
63 event = "delete";
64 break;
65 case TransNew:
66 event = "transnew";
67 break;
68 case TransDelete:
69 event = "transdelete";
70 break;
71 case ShadeUp:
72 event = "shadeup";
73 break;
74 case ShadeDown:
75 event = "shadedown";
76 break;
77 case MoveStart:
78 event = "movestart";
79 break;
80 case MoveEnd:
81 event = "moveend";
82 break;
83 case ResizeStart:
84 event = "resizestart";
85 break;
86 case ResizeEnd:
87 event = "resizeend";
88 break;
89 case DemandAttentionCurrent:
90 event = "demandsattentioncurrent";
91 break;
92 case DemandAttentionOther:
93 event = "demandsattentionother";
94 break;
95 default:
96 if ((e > DesktopChange) && (e <= DesktopChange+20))
98 event = QString("desktop%1").arg(e-DesktopChange);
100 break;
102 return event;
105 static bool forgetIt = false;
106 QList< Notify::EventData > Notify::pending_events;
108 bool Notify::raise( Event e, const QString& message, Client* c )
110 if ( forgetIt )
111 return false; // no connection was possible, don't try each time
113 QString event = eventToName( e );
114 if ( event.isNull() )
115 return false;
117 // There may be a deadlock if KNotify event is sent while KWin has X grabbed.
118 // If KNotify is not running, KLauncher may do X requests (startup notification, whatever)
119 // that will block it. And KNotifyClient waits for the launch to succeed, which means
120 // KLauncher waits for X and KWin waits for KLauncher. So postpone events in such case.
121 if( grabbedXServer())
123 EventData data;
124 data.event = event;
125 data.message = message;
126 data.window = c ? c->window() : 0;
127 pending_events.append( data );
128 return true;
132 return KNotification::event( event, message /*, QPixmap() , c ? c->window() : 0*/ ); //FIXME get the widget ?
135 void Notify::sendPendingEvents()
137 while( !pending_events.isEmpty())
139 EventData data = pending_events.first();
140 pending_events.pop_front();
141 if( !forgetIt )
142 KNotification::event( data.event, data.message /* , QPixmap() , data.window */ );
146 } // namespace