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