1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
------------------------------------------------------------------------
r652585 | lunakl | 2007-04-11 16:26:32 +0200 (Wed, 11 Apr 2007) | 3 lines
Changed paths:
M /branches/KDE/3.5/kdebase/nsplugins/viewer/qxteventloop.cpp
Fix keyboard events handling.
------------------------------------------------------------------------
Index: nsplugins/viewer/qxteventloop.cpp
===================================================================
--- nsplugins/viewer/qxteventloop.cpp (revision 652584)
+++ nsplugins/viewer/qxteventloop.cpp (revision 652585)
@@ -32,12 +32,16 @@
** not clear to you.
**
**********************************************************************/
+
+#include <config.h>
+
#include "qxteventloop.h"
#if QT_VERSION >= 0x030100
#include <qapplication.h>
#include <qwidgetintdict.h>
+#include <kglobal.h>
// resolve the conflict between X11's FocusIn and QEvent::FocusIn
const int XFocusOut = FocusOut;
@@ -52,6 +56,8 @@ const int XKeyRelease = KeyRelease;
Boolean qmotif_event_dispatcher( XEvent *event );
+static void handle_xquerykeymap( Display* dpy, XEvent* event );
+
class QXtEventLoopPrivate
{
public:
@@ -147,6 +153,7 @@ void QXtEventLoopPrivate::unhook()
extern bool qt_try_modal( QWidget *, XEvent * ); // defined in qapplication_x11.cpp
Boolean qmotif_event_dispatcher( XEvent *event )
{
+ handle_xquerykeymap( qt_xdisplay(), event );
QApplication::sendPostedEvents();
QWidgetIntDict *mapper = &static_d->mapper;
@@ -462,6 +469,29 @@ bool QXtEventLoop::processEvents( Proces
return ( (flags & WaitForMore) || ( pendingmask != 0 ) || nevents > 0 );
}
+#include <dlfcn.h>
+
+static char xquerykeymap_data[ 32 ];
+static int (*real_xquerykeymap)( Display*, char[32] ) = NULL;
+
+static void handle_xquerykeymap( Display* dpy, XEvent* event )
+{
+ if( real_xquerykeymap == NULL )
+ real_xquerykeymap = (int (*)( Display*, char[32] )) dlsym( RTLD_NEXT, "XQueryKeymap" );
+ if( event->type == XFocusIn || event->type == XKeyPress || event->type == XKeyRelease )
+ real_xquerykeymap( dpy, xquerykeymap_data );
+ if( event->type == XFocusOut )
+ memset( xquerykeymap_data, 0, 32 );
+}
+
+extern "C" KDE_EXPORT
+int XQueryKeymap( Display* , char k[32] )
+{
+ memcpy( k, xquerykeymap_data, 32 );
+ return 1;
+}
+
+
#include "qxteventloop.moc"
#endif
|