Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 9bb938de93248ca5cc71ecf424cefd6c > files > 27

kdebase-3.5.4-21.el5_5.1.src.rpm

------------------------------------------------------------------------
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