Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.2:Test
libreoffice-bootstrap
vcl-input-methods-in-qt4.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File vcl-input-methods-in-qt4.diff of Package libreoffice-bootstrap
--- vcl/unx/kde4/KDESalDisplay.cxx.old 2010-11-11 16:22:48.000000000 +0100 +++ vcl/unx/kde4/KDESalDisplay.cxx 2011-02-22 19:37:17.000000000 +0100 @@ -41,6 +41,7 @@ SalKDEDisplay::SalKDEDisplay( Display* p { assert( selfptr == NULL ); selfptr = this; + xim_protocol = XInternAtom( pDisp_, "_XIM_PROTOCOL", False ); } SalKDEDisplay::~SalKDEDisplay() @@ -65,7 +66,32 @@ void SalKDEDisplay::Yield() XEvent event; XNextEvent( pDisp_, &event ); + if( checkDirectInputEvent( &event )) + return; qApp->x11ProcessEvent( &event ); } +// HACK: When using Qt event loop, input methods (japanese, etc.) will get broken because +// of XFilterEvent() getting called twice, once by Qt, once by LO (bnc#665112). +// This function is therefore called before any XEvent is passed to Qt event handling +// and if it is a keyboard event and no Qt widget is the active window (i.e. we are +// processing events for some LO window), then feed the event only to LO directly and skip Qt +// completely. Skipped events are KeyPress, KeyRelease and also _XIM_PROTOCOL client message +// (seems to be necessary too, hopefully there are not other internal XIM messages that +// would need this handling). +bool SalKDEDisplay::checkDirectInputEvent( XEvent* ev ) +{ + if( ev->xany.type == XLIB_KeyPress || ev->xany.type == KeyRelease + || ( ev->xany.type == ClientMessage && ev->xclient.message_type == xim_protocol )) + { + if( qApp->activeWindow() == NULL ) + { + Dispatch(ev); + return true; + } + } + return false; +} + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ --- vcl/unx/kde4/KDESalDisplay.hxx.old 2010-11-11 16:22:48.000000000 +0100 +++ vcl/unx/kde4/KDESalDisplay.hxx 2011-02-22 19:37:17.000000000 +0100 @@ -41,7 +41,9 @@ class SalKDEDisplay : public SalX11Displ inline void EventGuardRelease() { osl_releaseMutex( hEventGuard_ ); } // virtual long Dispatch( XEvent *event ); virtual void Yield(); + bool checkDirectInputEvent( XEvent* ev ); private: + Atom xim_protocol; static SalKDEDisplay* selfptr; }; --- vcl/unx/kde4/KDEXLib.cxx.old 2010-12-14 17:02:02.000000000 +0100 +++ vcl/unx/kde4/KDEXLib.cxx 2011-02-22 19:37:17.000000000 +0100 @@ -205,8 +205,19 @@ static GPollFunc old_gpoll = NULL; static gint gpoll_wrapper( GPollFD*, guint, gint ); #endif +static bool ( *old_qt_event_filter )( void* ); +static bool qt_event_filter( void* m ) +{ + if( old_qt_event_filter != NULL && old_qt_event_filter( m )) + return true; + if( SalKDEDisplay::self() && SalKDEDisplay::self()->checkDirectInputEvent( static_cast< XEvent* >( m ))) + return true; + return false; +} + void KDEXLib::setupEventLoop() { + old_qt_event_filter = QAbstractEventDispatcher::instance()->setEventFilter( qt_event_filter ); #ifdef GLIB_EVENT_LOOP_SUPPORT // Glib is simple, it has g_main_context_set_poll_func() for wrapping the sleep call. // The catch is that Qt has a bug that allows triggering timers even when they should
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor