• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdecore
 

tdecore

  • tdecore
kxmessages.cpp
1/****************************************************************************
2
3 $Id$
4
5 Copyright (C) 2001-2003 Lubos Lunak <l.lunak@kde.org>
6
7Permission is hereby granted, free of charge, to any person obtaining a
8copy of this software and associated documentation files (the "Software"),
9to deal in the Software without restriction, including without limitation
10the rights to use, copy, modify, merge, publish, distribute, sublicense,
11and/or sell copies of the Software, and to permit persons to whom the
12Software is furnished to do so, subject to the following conditions:
13
14The above copyright notice and this permission notice shall be included in
15all copies or substantial portions of the Software.
16
17THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23DEALINGS IN THE SOFTWARE.
24
25****************************************************************************/
26
27#include "kxmessages.h"
28
29#include <tdeapplication.h>
30
31#ifdef TQ_WS_X11 // FIXME(E): Figure out what parts we can/should emulate in QT/E
32
33#include <X11/Xlib.h>
34#include <kdebug.h>
35
36// for broadcasting
37const long BROADCAST_MASK = PropertyChangeMask;
38// CHECKME
39
40KXMessages::KXMessages( const char* accept_broadcast_P, TQWidget* parent_P )
41 : TQWidget( parent_P )
42 {
43 if( accept_broadcast_P != NULL )
44 {
45 ( void ) tdeApp->desktop(); //trigger desktop widget creation to select root window events
46 tdeApp->installX11EventFilter( this ); // i.e. PropertyChangeMask
47 accept_atom1 = XInternAtom( tqt_xdisplay(), accept_broadcast_P, false );
48 accept_atom2 = accept_atom1;
49 }
50 else
51 {
52 accept_atom1 = accept_atom2 = None;
53 }
54 handle = new TQWidget( this );
55 }
56
57KXMessages::KXMessages( const char* accept_broadcast_P, TQWidget* parent_P, bool obsolete_P )
58 : TQWidget( parent_P )
59 {
60 if( accept_broadcast_P != NULL )
61 {
62 ( void ) tdeApp->desktop(); //trigger desktop widget creation to select root window events
63 tdeApp->installX11EventFilter( this ); // i.e. PropertyChangeMask
64 accept_atom2 = XInternAtom( tqt_xdisplay(), accept_broadcast_P, false );
65 accept_atom1 = obsolete_P ? accept_atom2
66 : XInternAtom( tqt_xdisplay(), TQCString( accept_broadcast_P ) + "_BEGIN", false );
67 }
68 else
69 {
70 accept_atom1 = accept_atom2 = None;
71 }
72 handle = new TQWidget( this );
73 }
74
75KXMessages::~KXMessages()
76 {
77// delete d; no private data yet
78 }
79
80
81void KXMessages::broadcastMessage( const char* msg_type_P, const TQString& message_P )
82 {
83 broadcastMessage( msg_type_P, message_P, -1, true );
84 }
85
86void KXMessages::broadcastMessage( const char* msg_type_P, const TQString& message_P,
87 int screen_P, bool obsolete_P )
88 {
89 Atom a2 = XInternAtom( tqt_xdisplay(), msg_type_P, false );
90 Atom a1 = obsolete_P ? a2 : XInternAtom( tqt_xdisplay(), TQCString( msg_type_P ) + "_BEGIN", false );
91 Window root = screen_P == -1 ? tqt_xrootwin() : tqt_xrootwin( screen_P );
92 send_message_internal( root, message_P, BROADCAST_MASK, tqt_xdisplay(),
93 a1, a2, handle->winId());
94 }
95
96void KXMessages::sendMessage( WId w_P, const char* msg_type_P, const TQString& message_P )
97 {
98 sendMessage( w_P, msg_type_P, message_P, true );
99 }
100
101void KXMessages::sendMessage( WId w_P, const char* msg_type_P, const TQString& message_P,
102 bool obsolete_P )
103 {
104 Atom a2 = XInternAtom( tqt_xdisplay(), msg_type_P, false );
105 Atom a1 = obsolete_P ? a2 : XInternAtom( tqt_xdisplay(), TQCString( msg_type_P ) + "_BEGIN", false );
106 send_message_internal( w_P, message_P, 0, tqt_xdisplay(), a1, a2, handle->winId());
107 }
108
109bool KXMessages::broadcastMessageX( Display* disp, const char* msg_type_P,
110 const TQString& message_P )
111 {
112 return broadcastMessageX( disp, msg_type_P, message_P, -1, true );
113 }
114
115bool KXMessages::broadcastMessageX( Display* disp, const char* msg_type_P,
116 const TQString& message_P, int screen_P, bool obsolete_P )
117 {
118 if( disp == NULL )
119 return false;
120 Atom a2 = XInternAtom( disp, msg_type_P, false );
121 Atom a1 = obsolete_P ? a2 : XInternAtom( disp, TQCString( msg_type_P ) + "_BEGIN", false );
122 Window root = screen_P == -1 ? DefaultRootWindow( disp ) : RootWindow( disp, screen_P );
123 Window win = XCreateSimpleWindow( disp, root, 0, 0, 1, 1,
124 0, BlackPixel( disp, screen_P == -1 ? DefaultScreen( disp ) : screen_P ),
125 BlackPixel( disp, screen_P == -1 ? DefaultScreen( disp ) : screen_P ));
126 send_message_internal( root, message_P, BROADCAST_MASK, disp,
127 a1, a2, win );
128 XDestroyWindow( disp, win );
129 return true;
130 }
131
132bool KXMessages::sendMessageX( Display* disp, WId w_P, const char* msg_type_P,
133 const TQString& message_P )
134 {
135 return sendMessageX( disp, w_P, msg_type_P, message_P, true );
136 }
137
138bool KXMessages::sendMessageX( Display* disp, WId w_P, const char* msg_type_P,
139 const TQString& message_P, bool obsolete_P )
140 {
141 if( disp == NULL )
142 return false;
143 Atom a2 = XInternAtom( disp, msg_type_P, false );
144 Atom a1 = obsolete_P ? a2 : XInternAtom( disp, TQCString( msg_type_P ) + "_BEGIN", false );
145 Window win = XCreateSimpleWindow( disp, DefaultRootWindow( disp ), 0, 0, 1, 1,
146 0, BlackPixelOfScreen( DefaultScreenOfDisplay( disp )),
147 BlackPixelOfScreen( DefaultScreenOfDisplay( disp )));
148 send_message_internal( w_P, message_P, 0, disp, a1, a2, win );
149 XDestroyWindow( disp, win );
150 return true;
151 }
152
153void KXMessages::send_message_internal( WId w_P, const TQString& msg_P, long mask_P,
154 Display* disp, Atom atom1_P, Atom atom2_P, Window handle_P )
155 {
156 unsigned int pos = 0;
157 TQCString msg = msg_P.utf8();
158 unsigned int len = strlen( msg );
159 XEvent e;
160 e.xclient.type = ClientMessage;
161 e.xclient.message_type = atom1_P; // leading message
162 e.xclient.display = disp;
163 e.xclient.window = handle_P;
164 e.xclient.format = 8;
165 do
166 {
167 unsigned int i;
168 for( i = 0;
169 i < 20 && i + pos <= len;
170 ++i )
171 e.xclient.data.b[ i ] = msg[ i + pos ];
172 XSendEvent( disp, w_P, false, mask_P, &e );
173 e.xclient.message_type = atom2_P; // following messages
174 pos += i;
175 } while( pos <= len );
176 XFlush( disp );
177 }
178
179bool KXMessages::x11Event( XEvent* ev_P )
180 {
181 if( ev_P->type != ClientMessage || ev_P->xclient.format != 8 )
182 return TQWidget::x11Event( ev_P );
183 if( ev_P->xclient.message_type != accept_atom1 && ev_P->xclient.message_type != accept_atom2 )
184 return TQWidget::x11Event( ev_P );
185 char buf[ 21 ]; // can't be longer
186 int i;
187 for( i = 0;
188 i < 20 && ev_P->xclient.data.b[ i ] != '\0';
189 ++i )
190 buf[ i ] = ev_P->xclient.data.b[ i ];
191 buf[ i ] = '\0';
192 if( incoming_messages.contains( ev_P->xclient.window ))
193 {
194 if( ev_P->xclient.message_type == accept_atom1 && accept_atom1 != accept_atom2 )
195 // two different messages on the same window at the same time shouldn't happen anyway
196 incoming_messages[ ev_P->xclient.window ] = TQCString();
197 incoming_messages[ ev_P->xclient.window ] += buf;
198 }
199 else
200 {
201 if( ev_P->xclient.message_type == accept_atom2 && accept_atom1 != accept_atom2 )
202 return false; // middle of message, but we don't have the beginning
203 incoming_messages[ ev_P->xclient.window ] = buf;
204 }
205 if( i < 20 ) // last message fragment
206 {
207 emit gotMessage( TQString::fromUtf8( incoming_messages[ ev_P->xclient.window ] ));
208 incoming_messages.remove( ev_P->xclient.window );
209 }
210 return false; // lets other KXMessages instances get the event too
211 }
212
213#include "kxmessages.moc"
214#endif

tdecore

Skip menu "tdecore"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

tdecore

Skip menu "tdecore"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdecore by doxygen 1.9.4
This website is maintained by Timothy Pearson.