diff options
-rw-r--r-- | vcl/inc/generic/gendata.hxx | 4 | ||||
-rw-r--r-- | vcl/inc/unx/gtk/gtkdata.hxx | 6 | ||||
-rw-r--r-- | vcl/inc/unx/gtk/gtkframe.hxx | 3 | ||||
-rw-r--r-- | vcl/inc/unx/saldata.hxx | 37 | ||||
-rw-r--r-- | vcl/inc/unx/saldisp.hxx | 50 | ||||
-rw-r--r-- | vcl/unx/generic/app/i18n_status.cxx | 10 | ||||
-rw-r--r-- | vcl/unx/generic/app/saldata.cxx | 155 | ||||
-rw-r--r-- | vcl/unx/generic/app/saldisp.cxx | 25 | ||||
-rw-r--r-- | vcl/unx/generic/app/wmadaptor.cxx | 166 | ||||
-rw-r--r-- | vcl/unx/generic/gdi/salbmp.cxx | 5 | ||||
-rw-r--r-- | vcl/unx/generic/gdi/salgdi2.cxx | 7 | ||||
-rw-r--r-- | vcl/unx/generic/window/salframe.cxx | 40 | ||||
-rw-r--r-- | vcl/unx/generic/window/salobj.cxx | 17 | ||||
-rw-r--r-- | vcl/unx/gtk/app/gtkdata.cxx | 35 | ||||
-rw-r--r-- | vcl/unx/gtk/window/gtkframe.cxx | 64 | ||||
-rw-r--r-- | vcl/unx/kde/kdedata.cxx | 13 | ||||
-rw-r--r-- | vcl/unx/kde4/KDEXLib.cxx | 11 |
17 files changed, 319 insertions, 329 deletions
diff --git a/vcl/inc/generic/gendata.hxx b/vcl/inc/generic/gendata.hxx index 0392adc9eae9..ef7725f6a559 100644 --- a/vcl/inc/generic/gendata.hxx +++ b/vcl/inc/generic/gendata.hxx @@ -73,6 +73,10 @@ class VCL_DLLPUBLIC SalGenericData : public SalData return m_eType; } + // Mostly useful for remote protocol backends + virtual void ErrorTrapPush() = 0; + virtual bool ErrorTrapPop( bool bIgnoreError = true ) = 0; // true on error + // Not the prettiest - but helpful for migrating old code ... inline SalDisplay *GetSalDisplay() const { diff --git a/vcl/inc/unx/gtk/gtkdata.hxx b/vcl/inc/unx/gtk/gtkdata.hxx index 3f8444c62eec..4e5f7b68f3f2 100644 --- a/vcl/inc/unx/gtk/gtkdata.hxx +++ b/vcl/inc/unx/gtk/gtkdata.hxx @@ -111,6 +111,9 @@ public: virtual void PostUserEvent(); void Yield( bool bWait, bool bHandleAllCurrentEvents ); inline GdkDisplay *GetGdkDisplay(); + + virtual void ErrorTrapPush(); + virtual bool ErrorTrapPop( bool bIgnoreError ); }; class GtkSalFrame; @@ -151,9 +154,6 @@ public: void screenSizeChanged( GdkScreen* ); void monitorsChanged( GdkScreen* ); - void errorTrapPush(); - void errorTrapPop(); - virtual void PostUserEvent(); #if !GTK_CHECK_VERSION(3,0,0) diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx index 0e3ada125613..4fa86d3af173 100644 --- a/vcl/inc/unx/gtk/gtkframe.hxx +++ b/vcl/inc/unx/gtk/gtkframe.hxx @@ -162,13 +162,10 @@ class GtkSalFrame : public SalFrame, basebmp::BitmapDeviceDamageTracker void endExtTextInput( sal_uInt16 nFlags ); bool handleKeyEvent( GdkEventKey* pEvent ); void focusChanged( bool bFocusIn ); - void errorTrapPush(); - void errorTrapPop(); void doCallEndExtTextInput(); void sendEmptyCommit(); - static void signalIMCommit( GtkIMContext*, gchar*, gpointer ); static gboolean signalIMDeleteSurrounding( GtkIMContext*, gint, gint, gpointer ); static void signalIMPreeditChanged( GtkIMContext*, gpointer ); diff --git a/vcl/inc/unx/saldata.hxx b/vcl/inc/unx/saldata.hxx index 30573b00132c..2d5dca512673 100644 --- a/vcl/inc/unx/saldata.hxx +++ b/vcl/inc/unx/saldata.hxx @@ -31,6 +31,8 @@ // -=-= includes -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= #include <signal.h> +#include <unx/salunx.h> +#include <vcl/salgtype.hxx> #include <unx/salstd.hxx> #include <salframe.hxx> #include <unx/salinst.h> @@ -56,6 +58,19 @@ typedef unsigned int pthread_t; // -=-= SalData =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= class VCLPLUG_GEN_PUBLIC X11SalData : public SalGenericData { + static int XErrorHdl( Display*, XErrorEvent* ); + static int XIOErrorHdl( Display* ); + + struct XErrorStackEntry + { + bool m_bIgnore; + bool m_bWas; + unsigned int m_nLastErrorRequest; + XErrorHandler m_aHandler; + }; + std::vector< XErrorStackEntry > m_aXErrorHandlerStack; + XIOErrorHandler m_aOrigXIOErrorHandler; + protected: SalXLib *pXLib_; pthread_t hMainThread_; @@ -66,11 +81,10 @@ public: virtual void Init(); virtual void Dispose(); + virtual void initNWF(); virtual void deInitNWF(); - inline void XError( Display *pDisplay, XErrorEvent *pEvent ) const; - SalDisplay* GetX11Display() const { return GetSalDisplay(); } void DeleteDisplay(); // for shutdown @@ -81,15 +95,20 @@ public: inline void StopTimer(); void Timeout() const; - static int XErrorHdl( Display*, XErrorEvent* ); - static int XIOErrorHdl( Display* ); + // X errors + virtual void ErrorTrapPush(); + virtual bool ErrorTrapPop( bool bIgnoreError ); + void XError( Display *pDisp, XErrorEvent *pEvent ); + bool HasXErrorOccurred() const + { return m_aXErrorHandlerStack.back().m_bWas; } + unsigned int GetLastXErrorRequestCode() const + { return m_aXErrorHandlerStack.back().m_nLastErrorRequest; } + void ResetXErrorOccurred() + { m_aXErrorHandlerStack.back().m_bWas = false; } + void PushXErrorLevel( bool bIgnore ); + void PopXErrorLevel(); }; -#ifdef _SV_SALDISP_HXX -inline void X11SalData::XError( Display *pDisplay, XErrorEvent *pEvent ) const -{ pXLib_->XError( pDisplay, pEvent ); } -#endif - #endif // _SV_SALDATA_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/unx/saldisp.hxx b/vcl/inc/unx/saldisp.hxx index 20a1abc457a6..73e527765d38 100644 --- a/vcl/inc/unx/saldisp.hxx +++ b/vcl/inc/unx/saldisp.hxx @@ -203,22 +203,11 @@ protected: sal_uLong m_nTimeoutMS; int m_pTimeoutFDS[2]; - bool m_bHaveSystemChildFrames; - int nFDs_; fd_set aReadFDS_; fd_set aExceptionFDS_; YieldEntry *pYieldEntries_; - struct XErrorStackEntry - { - bool m_bIgnore; - bool m_bWas; - unsigned int m_nLastErrorRequest; - XErrorHandler m_aHandler; - }; - std::vector< XErrorStackEntry > m_aXErrorHandlerStack; - XIOErrorHandler m_aOrigXIOErrorHandler; public: SalXLib(); virtual ~SalXLib(); @@ -234,22 +223,10 @@ public: YieldFunc handle ); virtual void Remove( int fd ); - void XError( Display *pDisp, XErrorEvent *pEvent ); - bool HasXErrorOccurred() const { return m_aXErrorHandlerStack.back().m_bWas; } - unsigned int GetLastXErrorRequestCode() const { return m_aXErrorHandlerStack.back().m_nLastErrorRequest; } - void ResetXErrorOccurred() { m_aXErrorHandlerStack.back().m_bWas = false; } - void PushXErrorLevel( bool bIgnore ); - void PopXErrorLevel(); - - virtual void StartTimer( sal_uLong nMS ); - virtual void StopTimer(); + virtual void StartTimer( sal_uLong nMS ); + virtual void StopTimer(); bool CheckTimeout( bool bExecuteTimers = true ); - - void setHaveSystemChildFrame() - { m_bHaveSystemChildFrames = true; } - bool getHaveSystemChildFrame() const - { return m_bHaveSystemChildFrames; } }; // -=-= SalDisplay -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -366,25 +343,20 @@ protected: void doDestruct(); void addXineramaScreenUnique( int i, long i_nX, long i_nY, long i_nWidth, long i_nHeight ); public: - static SalDisplay *GetSalDisplay( Display* display ); - static sal_Bool BestVisual( Display *pDisp, - int nScreen, - XVisualInfo &rVI ); - - SalDisplay( Display* pDisp ); + static SalDisplay *GetSalDisplay( Display* display ); + static sal_Bool BestVisual( Display *pDisp, + int nScreen, + XVisualInfo &rVI ); - virtual ~SalDisplay(); + SalDisplay( Display* pDisp ); - void setHaveSystemChildFrame() const - { pXLib_->setHaveSystemChildFrame(); } - bool getHaveSystemChildFrame() const - { return pXLib_->getHaveSystemChildFrame(); } + virtual ~SalDisplay(); void Init(); void PrintInfo() const; #ifdef DBG_UTIL - void DbgPrintDisplayEvent(const char *pComment, XEvent *pEvent) const; + void DbgPrintDisplayEvent(const char *pComment, XEvent *pEvent) const; #endif void Beep() const; @@ -492,8 +464,8 @@ public: virtual long Dispatch( XEvent *pEvent ); virtual void Yield(); - - sal_Bool IsEvent(); + sal_Bool IsEvent(); + void SetupInput( SalI18N_InputMethod *pInputMethod ); }; /*---------------------------------------------------------- diff --git a/vcl/unx/generic/app/i18n_status.cxx b/vcl/unx/generic/app/i18n_status.cxx index e2fcdae113c7..d99894c6955d 100644 --- a/vcl/unx/generic/app/i18n_status.cxx +++ b/vcl/unx/generic/app/i18n_status.cxx @@ -468,15 +468,14 @@ void IIIMPStatusWindow::GetFocus() if( it != rFrames.end() ) { const SystemEnvData* pParentEnvData = m_pResetFocus->GetSystemData(); - SalXLib* pXLib = GetGenericData()->GetSalDisplay()->GetXLib(); - pXLib->PushXErrorLevel( true ); + GetGenericData()->ErrorTrapPush(); XSetInputFocus( (Display*)pParentEnvData->pDisplay, (XLIB_Window)pParentEnvData->aShellWindow, RevertToNone, CurrentTime ); XSync( (Display*)pParentEnvData->pDisplay, False ); - pXLib->PopXErrorLevel(); + GetGenericData()->ErrorTrapPop(); } m_pResetFocus = NULL; } @@ -501,15 +500,14 @@ IMPL_LINK( IIIMPStatusWindow, SelectHdl, MenuButton*, pBtn ) if( pParent && pParent->isMapped() ) { const SystemEnvData* pEnv = pParent->GetSystemData(); - SalXLib* pXLib = GetGenericData()->GetSalDisplay()->GetXLib(); - pXLib->PushXErrorLevel( true ); + GetGenericData()->ErrorTrapPush(); XSetInputFocus( (Display*)pEnv->pDisplay, (XLIB_Window)pEnv->aShellWindow, RevertToNone, CurrentTime ); XSync( (Display*)pEnv->pDisplay, False ); - pXLib->PopXErrorLevel(); + GetGenericData()->ErrorTrapPop(); } } } diff --git a/vcl/unx/generic/app/saldata.cxx b/vcl/unx/generic/app/saldata.cxx index 940dc22b0517..4b235a4f7ac6 100644 --- a/vcl/unx/generic/app/saldata.cxx +++ b/vcl/unx/generic/app/saldata.cxx @@ -232,43 +232,6 @@ static const char* XRequest[] = { "X_NoOperation" }; -// -=-= C statics =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -int X11SalData::XErrorHdl( Display *pDisplay, XErrorEvent *pEvent ) -{ - OSL_ASSERT( GetX11SalData()->GetType() != SAL_DATA_GTK ); - - GetX11SalData()->XError( pDisplay, pEvent ); - return 0; -} - -int X11SalData::XIOErrorHdl( Display * ) -{ - OSL_ASSERT( GetX11SalData()->GetType() != SAL_DATA_GTK ); - - /* #106197# hack: until a real shutdown procedure exists - * _exit ASAP - */ - if( ImplGetSVData()->maAppData.mbAppQuit ) - _exit(1); - - // really bad hack - if( ! SessionManagerClient::checkDocumentsSaved() ) - /* oslSignalAction eToDo = */ osl_raiseSignal (OSL_SIGNAL_USER_X11SUBSYSTEMERROR, NULL); - - std::fprintf( stderr, "X IO Error\n" ); - std::fflush( stdout ); - std::fflush( stderr ); - - /* #106197# the same reasons to use _exit instead of exit in salmain - * do apply here. Since there is nothing to be done after an XIO - * error we have to _exit immediately. - */ - _exit(0); - return 0; -} - // -=-= SalData =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= #include <pthread.h> @@ -281,11 +244,16 @@ X11SalData::X11SalData( SalGenericDataType t ) m_pPlugin = NULL; hMainThread_ = pthread_self(); + + m_aOrigXIOErrorHandler = XSetIOErrorHandler ( (XIOErrorHandler)XIOErrorHdl ); + PushXErrorLevel( !!getenv( "SAL_IGNOREXERRORS" ) ); } X11SalData::~X11SalData() { DeleteDisplay(); + PopXErrorLevel(); + XSetIOErrorHandler (m_aOrigXIOErrorHandler); } void X11SalData::Dispose() @@ -317,6 +285,75 @@ void X11SalData::deInitNWF( void ) { } +void X11SalData::ErrorTrapPush() +{ + PushXErrorLevel( true ); +} + +bool X11SalData::ErrorTrapPop( bool bIgnoreError ) +{ + bool err = false; + if( !bIgnoreError ) + err = HasXErrorOccurred(); + PopXErrorLevel(); + return err; +} + + +void X11SalData::PushXErrorLevel( bool bIgnore ) +{ + m_aXErrorHandlerStack.push_back( XErrorStackEntry() ); + XErrorStackEntry& rEnt = m_aXErrorHandlerStack.back(); + rEnt.m_bWas = false; + rEnt.m_bIgnore = bIgnore; + rEnt.m_nLastErrorRequest = 0; + rEnt.m_aHandler = XSetErrorHandler( (XErrorHandler)XErrorHdl ); +} + +void X11SalData::PopXErrorLevel() +{ + if( m_aXErrorHandlerStack.size() ) + { + XSetErrorHandler( m_aXErrorHandlerStack.back().m_aHandler ); + m_aXErrorHandlerStack.pop_back(); + } +} + +// -=-= C statics =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +int X11SalData::XErrorHdl( Display *pDisplay, XErrorEvent *pEvent ) +{ + GetX11SalData()->XError( pDisplay, pEvent ); + return 0; +} + +int X11SalData::XIOErrorHdl( Display * ) +{ + /* #106197# hack: until a real shutdown procedure exists + * _exit ASAP + */ + if( ImplGetSVData()->maAppData.mbAppQuit ) + _exit(1); + + // really bad hack + if( ! SessionManagerClient::checkDocumentsSaved() ) + /* oslSignalAction eToDo = */ osl_raiseSignal (OSL_SIGNAL_USER_X11SUBSYSTEMERROR, NULL); + + std::fprintf( stderr, "X IO Error\n" ); + std::fflush( stdout ); + std::fflush( stderr ); + + /* #106197# the same reasons to use _exit instead of exit in salmain + * do apply here. Since there is nothing to be done after an XIO + * error we have to _exit immediately. + */ + _exit(0); + return 0; +} + + + // -=-= SalXLib =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= SalXLib::SalXLib() @@ -363,10 +400,6 @@ SalXLib::SalXLib() FD_SET( m_pTimeoutFDS[0], &aReadFDS_ ); nFDs_ = m_pTimeoutFDS[0] + 1; } - - m_bHaveSystemChildFrames = false; - m_aOrigXIOErrorHandler = XSetIOErrorHandler ( (XIOErrorHandler)X11SalData::XIOErrorHdl ); - PushXErrorLevel( !!getenv( "SAL_IGNOREXERRORS" ) ); } SalXLib::~SalXLib() @@ -374,28 +407,6 @@ SalXLib::~SalXLib() // close 'wakeup' pipe. close (m_pTimeoutFDS[0]); close (m_pTimeoutFDS[1]); - - PopXErrorLevel(); - XSetIOErrorHandler (m_aOrigXIOErrorHandler); -} - -void SalXLib::PushXErrorLevel( bool bIgnore ) -{ - m_aXErrorHandlerStack.push_back( XErrorStackEntry() ); - XErrorStackEntry& rEnt = m_aXErrorHandlerStack.back(); - rEnt.m_bWas = false; - rEnt.m_bIgnore = bIgnore; - rEnt.m_nLastErrorRequest = 0; - rEnt.m_aHandler = XSetErrorHandler( (XErrorHandler)X11SalData::XErrorHdl ); -} - -void SalXLib::PopXErrorLevel() -{ - if( m_aXErrorHandlerStack.size() ) - { - XSetErrorHandler( m_aXErrorHandlerStack.back().m_aHandler ); - m_aXErrorHandlerStack.pop_back(); - } } void SalXLib::Init() @@ -470,19 +481,10 @@ void SalXLib::Init() exit(0); } - SalDisplay *pSalDisplay = new SalX11Display( pDisp ); + SalX11Display *pSalDisplay = new SalX11Display( pDisp ); pInputMethod->CreateMethod( pDisp ); - pSalDisplay->SetInputMethod( pInputMethod ); - - PushXErrorLevel( true ); - SalI18N_KeyboardExtension *pKbdExtension = new SalI18N_KeyboardExtension( pDisp ); - XSync( pDisp, False ); - - pKbdExtension->UseExtension( ! HasXErrorOccurred() ); - PopXErrorLevel(); - - pSalDisplay->SetKbdExtension( pKbdExtension ); + pSalDisplay->SetupInput( pInputMethod ); } extern "C" { @@ -536,11 +538,8 @@ static void PrintXError( Display *pDisplay, XErrorEvent *pEvent ) std::fflush( stderr ); } -void SalXLib::XError( Display *pDisplay, XErrorEvent *pEvent ) +void X11SalData::XError( Display *pDisplay, XErrorEvent *pEvent ) { - if( m_bHaveSystemChildFrames ) - return; - if( ! m_aXErrorHandlerStack.back().m_bIgnore ) { if ( (pEvent->error_code == BadAlloc) diff --git a/vcl/unx/generic/app/saldisp.cxx b/vcl/unx/generic/app/saldisp.cxx index c0ca7fe1eb22..004b3fc4f914 100644 --- a/vcl/unx/generic/app/saldisp.cxx +++ b/vcl/unx/generic/app/saldisp.cxx @@ -113,6 +113,11 @@ using ::rtl::OUString; #define SALCOLOR_WHITE MAKE_SALCOLOR( 0xFF, 0xFF, 0xFF ) #define SALCOLOR_BLACK MAKE_SALCOLOR( 0x00, 0x00, 0x00 ) +inline X11SalData* GetX11SalData() +{ + return (X11SalData*)ImplGetSVData()->mpSalData; +} + // -=-= Prototyps =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // -=-= static variables -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -831,6 +836,22 @@ void SalDisplay::Init() #endif } +void SalX11Display::SetupInput( SalI18N_InputMethod *pInputMethod ) +{ + SetInputMethod( pInputMethod ); + + GetGenericData()->ErrorTrapPush(); + SalI18N_KeyboardExtension *pKbdExtension = new SalI18N_KeyboardExtension( pDisp_ ); + XSync( pDisp_, False ); + + bool bError = GetGenericData()->ErrorTrapPop( false ); + GetGenericData()->ErrorTrapPush(); + pKbdExtension->UseExtension( ! bError ); + GetGenericData()->ErrorTrapPop(); + + SetKbdExtension( pKbdExtension ); +} + // Sound // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void SalDisplay::Beep() const @@ -2078,13 +2099,13 @@ void SalX11Display::Yield() Dispatch( &aEvent ); #ifdef DBG_UTIL - if( pXLib_->HasXErrorOccurred() ) + if( GetX11SalData()->HasXErrorOccurred() ) { XFlush( pDisp_ ); DbgPrintDisplayEvent("SalDisplay::Yield (WasXError)", &aEvent); } #endif - pXLib_->ResetXErrorOccurred(); + GetX11SalData()->ResetXErrorOccurred(); } long SalX11Display::Dispatch( XEvent *pEvent ) diff --git a/vcl/unx/generic/app/wmadaptor.cxx b/vcl/unx/generic/app/wmadaptor.cxx index 89e9d5b486e9..ed97ddb189f0 100644 --- a/vcl/unx/generic/app/wmadaptor.cxx +++ b/vcl/unx/generic/app/wmadaptor.cxx @@ -579,7 +579,7 @@ GnomeWMAdaptor::GnomeWMAdaptor( SalDisplay* pSalDisplay ) : XFree( pProperty ); pProperty = NULL; XLIB_Window aCheckWindow = None; - m_pSalDisplay->GetXLib()->PushXErrorLevel( true ); + GetGenericData()->ErrorTrapPush(); if( XGetWindowProperty( m_pDisplay, aWMChild, m_aWMAtoms[ WIN_SUPPORTING_WM_CHECK ], @@ -593,26 +593,31 @@ GnomeWMAdaptor::GnomeWMAdaptor( SalDisplay* pSalDisplay ) : &pProperty ) == 0 && aRealType == XA_CARDINAL && nFormat == 32 - && nItems != 0 - && ! m_pSalDisplay->GetXLib()->HasXErrorOccurred() - ) + && nItems != 0 ) { - aCheckWindow = *(XLIB_Window*)pProperty; - XFree( pProperty ); - pProperty = NULL; - if( aCheckWindow == aWMChild ) + if (! GetGenericData()->ErrorTrapPop( false ) ) { - m_bValid = true; - /* - * get name of WM - * this is NOT part of the GNOME WM hints, but e.g. Sawfish - * already supports this part of the extended WM hints - */ - m_aWMAtoms[ UTF8_STRING ] = XInternAtom( m_pDisplay, "UTF8_STRING", False ); - getNetWmName(); + GetGenericData()->ErrorTrapPush(); + + aCheckWindow = *(XLIB_Window*)pProperty; + XFree( pProperty ); + pProperty = NULL; + if( aCheckWindow == aWMChild ) + { + m_bValid = true; + /* + * get name of WM + * this is NOT part of the GNOME WM hints, but e.g. Sawfish + * already supports this part of the extended WM hints + */ + m_aWMAtoms[ UTF8_STRING ] = XInternAtom( m_pDisplay, "UTF8_STRING", False ); + getNetWmName(); + } } + else + GetGenericData()->ErrorTrapPush(); } - m_pSalDisplay->GetXLib()->PopXErrorLevel(); + GetGenericData()->ErrorTrapPop(); } else if( pProperty ) { @@ -779,7 +784,7 @@ bool WMAdaptor::getNetWmName() XFree( pProperty ); pProperty = NULL; XLIB_Window aCheckWindow = None; - m_pSalDisplay->GetXLib()->PushXErrorLevel( true ); + GetGenericData()->ErrorTrapPush(); if( XGetWindowProperty( m_pDisplay, aWMChild, m_aWMAtoms[ NET_SUPPORTING_WM_CHECK ], @@ -793,63 +798,25 @@ bool WMAdaptor::getNetWmName() &pProperty ) == 0 && aRealType == XA_WINDOW && nFormat == 32 - && nItems != 0 - && ! m_pSalDisplay->GetXLib()->HasXErrorOccurred() - ) - { - aCheckWindow = *(XLIB_Window*)pProperty; - XFree( pProperty ); - pProperty = NULL; - if( aCheckWindow == aWMChild ) + && nItems != 0 ) { - bNetWM = true; - // get name of WM - m_aWMAtoms[ UTF8_STRING ] = XInternAtom( m_pDisplay, "UTF8_STRING", False ); - if( XGetWindowProperty( m_pDisplay, - aWMChild, - m_aWMAtoms[ NET_WM_NAME ], - 0, 256, - False, - AnyPropertyType, /* m_aWMAtoms[ UTF8_STRING ],*/ - &aRealType, - &nFormat, - &nItems, - &nBytesLeft, - &pProperty ) == 0 - && nItems != 0 - ) - { - if (aRealType == m_aWMAtoms[ UTF8_STRING ]) - { - m_aWMName = String( (sal_Char*)pProperty, nItems, RTL_TEXTENCODING_UTF8 ); - } - else - if (aRealType == XA_STRING) - { - m_aWMName = String( (sal_Char*)pProperty, nItems, RTL_TEXTENCODING_ISO_8859_1 ); - } - - XFree( pProperty ); - pProperty = NULL; - } - else if( pProperty ) + if ( GetGenericData()->ErrorTrapPop( false ) ) { + GetGenericData()->ErrorTrapPush(); + aCheckWindow = *(XLIB_Window*)pProperty; XFree( pProperty ); pProperty = NULL; - } - // if this is metacity, check for version to enable a legacy workaround - if( m_aWMName.EqualsAscii( "Metacity" ) ) - { - int nVersionMajor = 0, nVersionMinor = 0; - Atom nVersionAtom = XInternAtom( m_pDisplay, "_METACITY_VERSION", True ); - if( nVersionAtom ) + if( aCheckWindow == aWMChild ) { + bNetWM = true; + // get name of WM + m_aWMAtoms[ UTF8_STRING ] = XInternAtom( m_pDisplay, "UTF8_STRING", False ); if( XGetWindowProperty( m_pDisplay, aWMChild, - nVersionAtom, + m_aWMAtoms[ NET_WM_NAME ], 0, 256, False, - m_aWMAtoms[ UTF8_STRING ], + AnyPropertyType, /* m_aWMAtoms[ UTF8_STRING ],*/ &aRealType, &nFormat, &nItems, @@ -858,27 +825,68 @@ bool WMAdaptor::getNetWmName() && nItems != 0 ) { - String aMetaVersion( (sal_Char*)pProperty, nItems, RTL_TEXTENCODING_UTF8 ); - nVersionMajor = aMetaVersion.GetToken( 0, '.' ).ToInt32(); - nVersionMinor = aMetaVersion.GetToken( 1, '.' ).ToInt32(); + if (aRealType == m_aWMAtoms[ UTF8_STRING ]) + m_aWMName = String( (sal_Char*)pProperty, nItems, RTL_TEXTENCODING_UTF8 ); + else if (aRealType == XA_STRING) + m_aWMName = String( (sal_Char*)pProperty, nItems, RTL_TEXTENCODING_ISO_8859_1 ); + + XFree( pProperty ); + pProperty = NULL; } - if( pProperty ) + else if( pProperty ) { XFree( pProperty ); pProperty = NULL; } + + // if this is metacity, check for version to enable a legacy workaround + if( m_aWMName.EqualsAscii( "Metacity" ) ) + { + int nVersionMajor = 0, nVersionMinor = 0; + Atom nVersionAtom = XInternAtom( m_pDisplay, "_METACITY_VERSION", True ); + if( nVersionAtom ) + { + if( XGetWindowProperty( m_pDisplay, + aWMChild, + nVersionAtom, + 0, 256, + False, + m_aWMAtoms[ UTF8_STRING ], + &aRealType, + &nFormat, + &nItems, + &nBytesLeft, + &pProperty ) == 0 + && nItems != 0 + ) + { + String aMetaVersion( (sal_Char*)pProperty, nItems, RTL_TEXTENCODING_UTF8 ); + nVersionMajor = aMetaVersion.GetToken( 0, '.' ).ToInt32(); + nVersionMinor = aMetaVersion.GetToken( 1, '.' ).ToInt32(); + } + if( pProperty ) + { + XFree( pProperty ); + pProperty = NULL; + } + } + if( nVersionMajor < 2 || (nVersionMajor == 2 && nVersionMinor < 12) ) + m_bLegacyPartialFullscreen = true; + } } - if( nVersionMajor < 2 || (nVersionMajor == 2 && nVersionMinor < 12) ) - m_bLegacyPartialFullscreen = true; + } + else + { + if( pProperty ) + { + XFree( pProperty ); + pProperty = NULL; + } + GetGenericData()->ErrorTrapPush(); } } - } - else if( pProperty ) - { - XFree( pProperty ); - pProperty = NULL; - } - m_pSalDisplay->GetXLib()->PopXErrorLevel(); + + GetGenericData()->ErrorTrapPop(); } else if( pProperty ) { diff --git a/vcl/unx/generic/gdi/salbmp.cxx b/vcl/unx/generic/gdi/salbmp.cxx index c2057e79fb9b..d0201e3df6d6 100644 --- a/vcl/unx/generic/gdi/salbmp.cxx +++ b/vcl/unx/generic/gdi/salbmp.cxx @@ -226,10 +226,9 @@ BitmapBuffer* X11SalBitmap::ImplCreateDIB( // but this call can actually work on servers with backing store // defaults even if the rectangle is offscreen // so better catch the XError - pXLib->PushXErrorLevel( true ); + GetGenericData()->ErrorTrapPush(); XImage* pImage = XGetImage( pXDisp, aDrawable, nX, nY, nWidth, nHeight, AllPlanes, ZPixmap ); - bool bWasError = pXLib->HasXErrorOccurred() && pXLib->GetLastXErrorRequestCode() == X_GetImage; - pXLib->PopXErrorLevel(); + bool bWasError = GetGenericData()->ErrorTrapPop( false ); if( ! bWasError && pImage && pImage->data ) { diff --git a/vcl/unx/generic/gdi/salgdi2.cxx b/vcl/unx/generic/gdi/salgdi2.cxx index 1669ab6f2662..2b2612025a68 100644 --- a/vcl/unx/generic/gdi/salgdi2.cxx +++ b/vcl/unx/generic/gdi/salgdi2.cxx @@ -84,20 +84,17 @@ void X11SalGraphics::CopyScreenArea( Display* pDisplay, src_x, src_y, w, h, dest_x, dest_y ); else { - SalXLib* pLib = GetGenericData()->GetSalDisplay()->GetXLib(); - pLib->PushXErrorLevel( true ); + GetGenericData()->ErrorTrapPush(); XImage* pImage = XGetImage( pDisplay, aSrc, src_x, src_y, w, h, AllPlanes, ZPixmap ); if( pImage ) { if( pImage->data ) - { XPutImage( pDisplay, aDest, aDestGC, pImage, 0, 0, dest_x, dest_y, w, h ); - } XDestroyImage( pImage ); } - pLib->PopXErrorLevel(); + GetGenericData()->ErrorTrapPop(); } } else diff --git a/vcl/unx/generic/window/salframe.cxx b/vcl/unx/generic/window/salframe.cxx index 6d821bdee88a..ad43f7afefe6 100644 --- a/vcl/unx/generic/window/salframe.cxx +++ b/vcl/unx/generic/window/salframe.cxx @@ -114,7 +114,7 @@ X11SalFrame* X11SalFrame::s_pSaveYourselfFrame = NULL; // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= static void doReparentPresentationDialogues( SalDisplay* pDisplay ) { - pDisplay->GetXLib()->PushXErrorLevel( true ); + GetGenericData()->ErrorTrapPush(); while( aPresentationReparentList.begin() != aPresentationReparentList.end() ) { int x, y; @@ -139,7 +139,7 @@ static void doReparentPresentationDialogues( SalDisplay* pDisplay ) if( hPresFocusWindow ) XSetInputFocus( pDisplay->GetDisplay(), hPresFocusWindow, PointerRoot, CurrentTime ); XSync( pDisplay->GetDisplay(), False ); - pDisplay->GetXLib()->PopXErrorLevel(); + GetGenericData()->ErrorTrapPop(); } // -=-= SalFrame / X11SalFrame =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -201,12 +201,12 @@ void X11SalFrame::askForXEmbedFocus( sal_Int32 i_nTimeCode ) aEvent.xclient.data.l[3] = 0; aEvent.xclient.data.l[4] = 0; - GetDisplay()->GetXLib()->PushXErrorLevel( true ); + GetGenericData()->ErrorTrapPush(); XSendEvent( pDisplay_->GetDisplay(), mhForeignParent, False, NoEventMask, &aEvent ); XSync( pDisplay_->GetDisplay(), False ); - GetDisplay()->GetXLib()->PopXErrorLevel(); + GetGenericData()->ErrorTrapPop(); } @@ -281,9 +281,9 @@ void X11SalFrame::Init( sal_uLong nSalFrameStyle, int nScreen, SystemParentData* } else if( pParentData ) { - // plugin parent may be killed unexpectedly by - // plugging process; ignore XErrors in that case - GetDisplay()->setHaveSystemChildFrame(); + // plugin parent may be killed unexpectedly by plugging + // process; start permanantly ignoring X errors ... + GetGenericData()->ErrorTrapPush(); nStyle_ |= SAL_FRAME_STYLE_PLUG; Attributes.override_redirect = True; @@ -3786,7 +3786,7 @@ long X11SalFrame::HandleReparentEvent( XReparentEvent *pEvent ) static const char* pDisableStackingCheck = getenv( "SAL_DISABLE_STACKING_CHECK" ); - GetDisplay()->GetXLib()->PushXErrorLevel( true ); + GetGenericData()->ErrorTrapPush(); /* * don't rely on the new parent from the event. @@ -3805,7 +3805,11 @@ long X11SalFrame::HandleReparentEvent( XReparentEvent *pEvent ) &hDummy, &Children, &nChildren ); - if( GetDisplay()->GetXLib()->HasXErrorOccurred() ) + + bool bError = GetGenericData()->ErrorTrapPop( false ); + GetGenericData()->ErrorTrapPush(); + + if( bError ) { hWM_Parent = GetShellWindow(); break; @@ -3813,7 +3817,7 @@ long X11SalFrame::HandleReparentEvent( XReparentEvent *pEvent ) /* this sometimes happens if a Show(sal_True) is * immediately followed by Show(sal_False) (which is braindead anyway) */ - if( hDummy == hWM_Parent ) + if( hDummy == hWM_Parent ) hDummy = hRoot; if( hDummy != hRoot ) { @@ -3844,7 +3848,7 @@ long X11SalFrame::HandleReparentEvent( XReparentEvent *pEvent ) // Reparenting before Destroy aPresentationReparentList.remove( GetStackingWindow() ); mhStackingWindow = None; - GetDisplay()->GetXLib()->PopXErrorLevel(); + GetGenericData()->ErrorTrapPop(); return 0; } @@ -3895,7 +3899,11 @@ long X11SalFrame::HandleReparentEvent( XReparentEvent *pEvent ) * so need real geometries here * (this will fail with virtual roots ?) */ - GetDisplay()->GetXLib()->ResetXErrorOccurred(); + + // reset error occurred + GetGenericData()->ErrorTrapPop(); + GetGenericData()->ErrorTrapPush(); + int xp, yp, x, y; unsigned int wp, w, hp, h, bw, d; XGetGeometry( GetXDisplay(), @@ -3907,7 +3915,10 @@ long X11SalFrame::HandleReparentEvent( XReparentEvent *pEvent ) &hRoot, &xp, &yp, &wp, &hp, &bw, &d ); bool bResized = false; - if( ! GetDisplay()->GetXLib()->HasXErrorOccurred() ) + bool bError = GetGenericData()->ErrorTrapPop( false ); + GetGenericData()->ErrorTrapPush(); + + if( ! bError ) { maGeometry.nRightDecoration = wp - w - maGeometry.nLeftDecoration; maGeometry.nBottomDecoration = hp - h - maGeometry.nTopDecoration; @@ -3922,7 +3933,6 @@ long X11SalFrame::HandleReparentEvent( XReparentEvent *pEvent ) maGeometry.nHeight = h; } - // limit width and height if we are too large: #47757 // olwm and fvwm need this, it doesnt harm the rest @@ -3951,7 +3961,7 @@ long X11SalFrame::HandleReparentEvent( XReparentEvent *pEvent ) if( bResized ) CallCallback( SALEVENT_RESIZE, NULL ); - GetDisplay()->GetXLib()->PopXErrorLevel(); + GetGenericData()->ErrorTrapPop(); return 1; } diff --git a/vcl/unx/generic/window/salobj.cxx b/vcl/unx/generic/window/salobj.cxx index cc9487fda4be..da0937858150 100644 --- a/vcl/unx/generic/window/salobj.cxx +++ b/vcl/unx/generic/window/salobj.cxx @@ -134,7 +134,7 @@ X11SalObject* X11SalObject::CreateObject( SalFrame* pParent, SystemWindowData* p static_cast<unsigned int> (pSalDisp->GetVisual( nScreen ).GetVisualId()), static_cast<unsigned int> (aVisID) ); #endif - pSalDisp->GetXLib()->PushXErrorLevel( true ); + GetGenericData()->ErrorTrapPush(); // create colormap for visual - there might not be one pObject->maColormap = aAttribs.colormap = XCreateColormap( @@ -152,9 +152,7 @@ X11SalObject* X11SalObject::CreateObject( SalFrame* pParent, SystemWindowData* p pVisual, CWEventMask|CWColormap, &aAttribs ); XSync( pDisp, False ); - sal_Bool bWasXError = pSalDisp->GetXLib()->HasXErrorOccurred(); - pSalDisp->GetXLib()->PopXErrorLevel(); - if( bWasXError ) + if( GetGenericData()->ErrorTrapPop( false ) ) { pObject->maSecondary = None; delete pObject; @@ -163,7 +161,7 @@ X11SalObject* X11SalObject::CreateObject( SalFrame* pParent, SystemWindowData* p XReparentWindow( pDisp, pObject->maSecondary, pObject->maPrimary, 0, 0 ); } - pSalDisp->GetXLib()->PushXErrorLevel( true ); + GetGenericData()->ErrorTrapPush(); if( bShow ) { XMapWindow( pDisp, pObject->maSecondary ); XMapWindow( pDisp, pObject->maPrimary ); @@ -179,9 +177,7 @@ X11SalObject* X11SalObject::CreateObject( SalFrame* pParent, SystemWindowData* p pObjData->pAppContext = NULL; XSync(pDisp, False); - sal_Bool bWasXError = pSalDisp->GetXLib()->HasXErrorOccurred(); - pSalDisp->GetXLib()->PopXErrorLevel(); - if( bWasXError ) + if( GetGenericData()->ErrorTrapPop( false ) ) { delete pObject; return NULL; @@ -278,7 +274,8 @@ X11SalObject::~X11SalObject() std::list< SalObject* >& rObjects = GetGenericData()->GetSalDisplay()->getSalObjects(); rObjects.remove( this ); SalDisplay* pSalDisp = GetGenericData()->GetSalDisplay(); - pSalDisp->GetXLib()->PushXErrorLevel( true ); + + GetGenericData()->ErrorTrapPush(); if ( maSecondary ) XDestroyWindow( (Display*)maSystemChildData.pDisplay, maSecondary ); if ( maPrimary ) @@ -286,7 +283,7 @@ X11SalObject::~X11SalObject() if ( maColormap ) XFreeColormap((Display*)maSystemChildData.pDisplay, maColormap); XSync( (Display*)maSystemChildData.pDisplay, False ); - pSalDisp->GetXLib()->PopXErrorLevel(); + GetGenericData()->ErrorTrapPop(); } diff --git a/vcl/unx/gtk/app/gtkdata.cxx b/vcl/unx/gtk/app/gtkdata.cxx index 5f39bd9c9053..52b7166c2899 100644 --- a/vcl/unx/gtk/app/gtkdata.cxx +++ b/vcl/unx/gtk/app/gtkdata.cxx @@ -99,7 +99,7 @@ GtkSalDisplay::GtkSalDisplay( GdkDisplay* pDisplay ) : gdk_window_add_filter( NULL, call_filterGdkEvent, this ); if ( getenv( "SAL_IGNOREXERRORS" ) ) - errorTrapPush(); // and leak the trap + GetGenericData()->ErrorTrapPush(); // and leak the trap } GtkSalDisplay::~GtkSalDisplay() @@ -119,20 +119,6 @@ GtkSalDisplay::~GtkSalDisplay() gdk_cursor_unref( m_aCursors[ i ] ); } -void GtkSalDisplay::errorTrapPush() -{ - gdk_error_trap_push (); -} - -void GtkSalDisplay::errorTrapPop() -{ -#if !GTK_CHECK_VERSION(3,0,0) - gdk_error_trap_pop (); -#else - gdk_error_trap_pop_ignored (); // faster -#endif -} - extern "C" { void signalKeysChanged( GdkKeymap*, gpointer data ) @@ -773,6 +759,25 @@ void GtkData::Init() } } +void GtkData::ErrorTrapPush() +{ + gdk_error_trap_push (); +} + +bool GtkData::ErrorTrapPop( bool bIgnoreError ) +{ +#if GTK_CHECK_VERSION(3,0,0) + if( bIgnoreError ) + { + gdk_error_trap_pop_ignored (); // faster + return false; + } +#else + (void) bIgnoreError; +#endif + return gdk_error_trap_pop () != 0; +} + GtkSalTimer::GtkSalTimer() : m_pTimeout( 0 ) { diff --git a/vcl/unx/gtk/window/gtkframe.cxx b/vcl/unx/gtk/window/gtkframe.cxx index bc7a568165c7..e16dd4b10d6b 100644 --- a/vcl/unx/gtk/window/gtkframe.cxx +++ b/vcl/unx/gtk/window/gtkframe.cxx @@ -454,9 +454,8 @@ GtkSalFrame::GtkSalFrame( SystemParentData* pSysData ) { m_nScreen = getDisplay()->GetDefaultScreenNumber(); getDisplay()->registerFrame( this ); -#if !GTK_CHECK_VERSION(3,0,0) - getDisplay()->setHaveSystemChildFrame(); -#endif + // permanently ignore errors from our unruly children ... + GetGenericData()->ErrorTrapPush(); m_bDefaultPos = true; m_bDefaultSize = true; m_nIdleFullScreen = 0; @@ -1045,11 +1044,11 @@ void GtkSalFrame::askForXEmbedFocus( sal_Int32 i_nTimeCode ) aEvent.xclient.data.l[3] = 0; aEvent.xclient.data.l[4] = 0; - getDisplay()->errorTrapPush (); + GetGenericData()->ErrorTrapPush(); XSendEvent( getDisplay()->GetDisplay(), m_aForeignParentWindow, False, NoEventMask, &aEvent ); - getDisplay()->errorTrapPop (); + GetGenericData()->ErrorTrapPop(); #endif } @@ -2185,9 +2184,9 @@ void GtkSalFrame::ToTop( sal_uInt16 nFlags ) { // sad but true: this can cause an XError, we need to catch that // to do this we need to synchronize with the XServer - getDisplay()->errorTrapPush (); + GetGenericData()->ErrorTrapPush(); XSetInputFocus( getDisplay()->GetDisplay(), GDK_WINDOW_XWINDOW( widget_get_window(m_pWindow) ), RevertToParent, CurrentTime ); - getDisplay()->errorTrapPop (); + GetGenericData()->ErrorTrapPop(); } #endif } @@ -2226,17 +2225,14 @@ void GtkSalFrame::grabPointer( sal_Bool bGrab, sal_Bool bOwnerEvents ) if( bGrab ) { bool bUseGdkGrab = true; - if( getDisplay()->getHaveSystemChildFrame() ) + const std::list< SalFrame* >& rFrames = getDisplay()->getFrames(); + for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it ) { - const std::list< SalFrame* >& rFrames = getDisplay()->getFrames(); - for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it ) + const GtkSalFrame* pFrame = static_cast< const GtkSalFrame* >(*it); + if( pFrame->m_bWindowIsGtkPlug ) { - const GtkSalFrame* pFrame = static_cast< const GtkSalFrame* >(*it); - if( pFrame->m_bWindowIsGtkPlug ) - { - bUseGdkGrab = false; - break; - } + bUseGdkGrab = false; + break; } } if( bUseGdkGrab ) @@ -2606,7 +2602,7 @@ bool GtkSalFrame::SetPluginParent( SystemParentData* pSysParent ) { #if !GTK_CHECK_VERSION(3,0,0) if( pSysParent ) // this may be the first system child frame now - getDisplay()->setHaveSystemChildFrame(); + GetGenericData()->ErrorTrapPush(); // permanantly ignore unruly children's errors createNewWindow( pSysParent->aWindow, (pSysParent->nSize > sizeof(long)) ? pSysParent->bXEmbedSupport : false, m_nScreen ); return true; #else @@ -3607,20 +3603,6 @@ GtkSalFrame::IMHandler::~IMHandler() deleteIMContext(); } -void GtkSalFrame::IMHandler::errorTrapPush() -{ - if (!m_pFrame) - return; - m_pFrame->getDisplay()->errorTrapPush(); -} - -void GtkSalFrame::IMHandler::errorTrapPop() -{ - if (!m_pFrame) - return; - m_pFrame->getDisplay()->errorTrapPop(); -} - void GtkSalFrame::IMHandler::createIMContext() { if( ! m_pIMContext ) @@ -3639,10 +3621,10 @@ void GtkSalFrame::IMHandler::createIMContext() g_signal_connect( m_pIMContext, "preedit_end", G_CALLBACK (signalIMPreeditEnd), this ); - errorTrapPush (); + GetGenericData()->ErrorTrapPush(); gtk_im_context_set_client_window( m_pIMContext, widget_get_window(GTK_WIDGET(m_pFrame->m_pWindow)) ); gtk_im_context_focus_in( m_pIMContext ); - errorTrapPop (); + GetGenericData()->ErrorTrapPop(); m_bFocused = true; } } @@ -3652,9 +3634,9 @@ void GtkSalFrame::IMHandler::deleteIMContext() if( m_pIMContext ) { // first give IC a chance to deinitialize - errorTrapPush (); + GetGenericData()->ErrorTrapPush(); gtk_im_context_set_client_window( m_pIMContext, NULL ); - errorTrapPop (); + GetGenericData()->ErrorTrapPop(); // destroy old IC g_object_unref( m_pIMContext ); m_pIMContext = NULL; @@ -3676,9 +3658,9 @@ void GtkSalFrame::IMHandler::updateIMSpotLocation() aArea.y = aPosEvent.mnY; aArea.width = aPosEvent.mnWidth; aArea.height = aPosEvent.mnHeight; - errorTrapPush (); + GetGenericData()->ErrorTrapPush(); gtk_im_context_set_cursor_location( m_pIMContext, &aArea ); - errorTrapPop (); + GetGenericData()->ErrorTrapPop(); } void GtkSalFrame::IMHandler::setInputContext( SalInputContext* ) @@ -3729,9 +3711,9 @@ void GtkSalFrame::IMHandler::focusChanged( bool bFocusIn ) m_bFocused = bFocusIn; if( bFocusIn ) { - errorTrapPush (); + GetGenericData()->ErrorTrapPush(); gtk_im_context_focus_in( m_pIMContext ); - errorTrapPop (); + GetGenericData()->ErrorTrapPop(); if( m_aInputEvent.mpTextAttr ) { sendEmptyCommit(); @@ -3741,9 +3723,9 @@ void GtkSalFrame::IMHandler::focusChanged( bool bFocusIn ) } else { - errorTrapPush (); + GetGenericData()->ErrorTrapPush(); gtk_im_context_focus_out( m_pIMContext ); - errorTrapPop (); + GetGenericData()->ErrorTrapPop(); // cancel an eventual event posted to begin preedit again m_pFrame->getDisplay()->CancelInternalEvent( m_pFrame, &m_aInputEvent, SALEVENT_EXTTEXTINPUT ); } diff --git a/vcl/unx/kde/kdedata.cxx b/vcl/unx/kde/kdedata.cxx index d1dc388b7d31..177fa4ed5e3a 100644 --- a/vcl/unx/kde/kdedata.cxx +++ b/vcl/unx/kde/kdedata.cxx @@ -181,19 +181,10 @@ void KDEXLib::Init() Display* pDisp = QPaintDevice::x11AppDisplay(); - SalDisplay *pSalDisplay = new SalKDEDisplay( pDisp ); + SalX11Display *pSalDisplay = new SalKDEDisplay( pDisp ); pInputMethod->CreateMethod( pDisp ); - pSalDisplay->SetInputMethod( pInputMethod ); - - PushXErrorLevel( true ); - SalI18N_KeyboardExtension *pKbdExtension = new SalI18N_KeyboardExtension( pDisp ); - XSync( pDisp, False ); - - pKbdExtension->UseExtension( ! HasXErrorOccurred() ); - PopXErrorLevel(); - - pSalDisplay->SetKbdExtension( pKbdExtension ); + pSalDisplay->SetupInput( pInputMethod ); } void KDEXLib::doStartup() diff --git a/vcl/unx/kde4/KDEXLib.cxx b/vcl/unx/kde4/KDEXLib.cxx index ad46e61f4c44..a5804b39b5e4 100644 --- a/vcl/unx/kde4/KDEXLib.cxx +++ b/vcl/unx/kde4/KDEXLib.cxx @@ -178,16 +178,7 @@ void KDEXLib::Init() SalKDEDisplay *pSalDisplay = new SalKDEDisplay(pDisp); pInputMethod->CreateMethod( pDisp ); - pSalDisplay->SetInputMethod( pInputMethod ); - - PushXErrorLevel( true ); - SalI18N_KeyboardExtension *pKbdExtension = new SalI18N_KeyboardExtension( pDisp ); - XSync( pDisp, False ); - - pKbdExtension->UseExtension( ! HasXErrorOccurred() ); - PopXErrorLevel(); - - pSalDisplay->SetKbdExtension( pKbdExtension ); + pSalDisplay->SetupInput( pInputMethod ); } // When we use Qt event loop, it can actually use its own event loop handling, or wrap |