summaryrefslogtreecommitdiff
blob: 8d301d6d4e690d1841a2410641db8fd2e62320ae (plain)
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