• 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 
7 Permission is hereby granted, free of charge, to any person obtaining a
8 copy of this software and associated documentation files (the "Software"),
9 to deal in the Software without restriction, including without limitation
10 the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 and/or sell copies of the Software, and to permit persons to whom the
12 Software is furnished to do so, subject to the following conditions:
13 
14 The above copyright notice and this permission notice shall be included in
15 all copies or substantial portions of the Software.
16 
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 DEALINGS 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
37 const long BROADCAST_MASK = PropertyChangeMask;
38 // CHECKME
39 
40 KXMessages::KXMessages( const char* accept_broadcast_P, TQWidget* parent_P )
41  : TQWidget( parent_P )
42  {
43  if( accept_broadcast_P != NULL )
44  {
45  ( void ) kapp->desktop(); //trigger desktop widget creation to select root window events
46  kapp->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 
57 KXMessages::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 ) kapp->desktop(); //trigger desktop widget creation to select root window events
63  kapp->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 
75 KXMessages::~KXMessages()
76  {
77 // delete d; no private data yet
78  }
79 
80 
81 void KXMessages::broadcastMessage( const char* msg_type_P, const TQString& message_P )
82  {
83  broadcastMessage( msg_type_P, message_P, -1, true );
84  }
85 
86 void 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 
96 void 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 
101 void 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 
109 bool 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 
115 bool 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 
132 bool 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 
138 bool 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 
153 void 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 
179 bool 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.1
This website is maintained by Timothy Pearson.