vcl/Library_vcl.mk | 1 vcl/headless/svpframe.cxx | 5 - vcl/headless/svpinst.cxx | 93 ++++----------------------- vcl/headless/svpprn.cxx | 7 -- vcl/inc/headless/svpinst.hxx | 47 +++++-------- vcl/inc/osx/salinst.h | 14 ---- vcl/inc/salusereventlist.hxx | 112 +++++++++++++++++++++++++++++++++ vcl/inc/unx/gendisp.hxx | 36 ++-------- vcl/inc/unx/gtk/gtkdata.hxx | 9 +- vcl/inc/unx/saldisp.hxx | 8 -- vcl/source/app/salusereventlist.cxx | 121 ++++++++++++++++++++++++++++++++++++ vcl/unx/generic/app/gendisp.cxx | 81 +++--------------------- vcl/unx/generic/app/i18n_status.cxx | 9 -- vcl/unx/generic/app/saldata.cxx | 2 vcl/unx/generic/app/saldisp.cxx | 22 ++---- vcl/unx/generic/app/salinst.cxx | 6 - vcl/unx/generic/app/sm.cxx | 14 +--- vcl/unx/generic/gdi/salgdi2.cxx | 7 -- vcl/unx/generic/window/salframe.cxx | 47 +++++-------- vcl/unx/gtk/gtkdata.cxx | 31 ++++----- vcl/unx/gtk/gtksalframe.cxx | 5 - vcl/unx/gtk3/gtk3gtkdata.cxx | 17 ++--- vcl/unx/kde4/KDESalDisplay.cxx | 5 + vcl/unx/kde4/KDESalDisplay.hxx | 21 +++--- vcl/unx/kde4/KDEXLib.cxx | 4 - vcl/unx/kde4/KDEXLib.hxx | 2 26 files changed, 393 insertions(+), 333 deletions(-)
New commits: commit 6e2640d0b1674ea83ca01d849205a7cc8a8dcb3f Author: Jan-Marek Glogowski <[email protected]> Date: Tue Sep 5 13:50:23 2017 +0200 Unify SalUserEvent handling Change-Id: I188b567e44fd79c162b2d9cabbd771d1f66c7dc4 diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index 1a2105877de5..d76567776b42 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -321,6 +321,7 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/source/app/help \ vcl/source/app/i18nhelp \ vcl/source/app/idle \ + vcl/source/app/salusereventlist \ vcl/source/app/salvtables \ vcl/source/app/scheduler \ vcl/source/app/session \ diff --git a/vcl/headless/svpframe.cxx b/vcl/headless/svpframe.cxx index 9a086c0b3d6a..08c6a09ef834 100644 --- a/vcl/headless/svpframe.cxx +++ b/vcl/headless/svpframe.cxx @@ -94,10 +94,9 @@ SvpSalFrame::~SvpSalFrame() // pass focus to another frame, preferably a document style window if( s_pFocusFrame == nullptr ) { - const std::list< SalFrame* >& rFrames( m_pInstance->getFrames() ); - for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it ) + for (auto pSalFrame : m_pInstance->getFrames() ) { - SvpSalFrame* pFrame = static_cast<SvpSalFrame*>(*it); + SvpSalFrame* pFrame = static_cast<SvpSalFrame*>( const_cast<SalFrame*>( pSalFrame ) ); if( pFrame->m_bVisible && pFrame->m_pParent == nullptr && (pFrame->m_nStyle & (SalFrameStyleFlags::MOVEABLE | diff --git a/vcl/headless/svpinst.cxx b/vcl/headless/svpinst.cxx index 5fcb7c57d602..8cfedd5730be 100644 --- a/vcl/headless/svpinst.cxx +++ b/vcl/headless/svpinst.cxx @@ -47,19 +47,6 @@ // FIXME: remove when we re-work the svp mainloop #include "unx/salunxtime.h" -bool SvpSalInstance::isFrameAlive( const SalFrame* pFrame ) const -{ - for( std::list< SalFrame* >::const_iterator it = m_aFrames.begin(); - it != m_aFrames.end(); ++it ) - { - if( *it == pFrame ) - { - return true; - } - } - return false; -} - SvpSalInstance* SvpSalInstance::s_pDefaultInstance = nullptr; #if !defined(ANDROID) && !defined(IOS) @@ -165,12 +152,8 @@ void SvpSalInstance::CreateWakeupPipe(bool log) #endif -void SvpSalInstance::PostEvent(const SalFrame* pFrame, ImplSVEvent* pData, SalEvent nEvent) +void SvpSalInstance::TriggerUserEventProcessing() { - { - osl::MutexGuard g(m_aEventGuard); - m_aUserEvents.push_back( SalUserEvent( pFrame, pData, nEvent ) ); - } Wakeup(); } @@ -186,31 +169,6 @@ bool SvpSalInstance::PostedEventsInQueue() } #endif -void SvpSalInstance::deregisterFrame( SalFrame* pFrame ) -{ - m_aFrames.remove( pFrame ); - - osl::MutexGuard g(m_aEventGuard); - // cancel outstanding events for this frame - if( ! m_aUserEvents.empty() ) - { - std::list< SalUserEvent >::iterator it = m_aUserEvents.begin(); - do - { - if( it->m_pFrame == pFrame ) - { - if (it->m_nEvent == SalEvent::UserEvent) - { - delete it->m_pData; - } - it = m_aUserEvents.erase( it ); - } - else - ++it; - } while( it != m_aUserEvents.end() ); - } -} - void SvpSalInstance::Wakeup() { #ifndef IOS @@ -304,45 +262,24 @@ SalBitmap* SvpSalInstance::CreateSalBitmap() #endif } -bool SvpSalInstance::DoYield(bool bWait, bool bHandleAllCurrentEvents) +void SvpSalInstance::ProcessEvent( SalUserEvent aEvent ) const { - bool bEvent = false; - - // first, process current user events - std::list< SalUserEvent > aCurrentEvents; + aEvent.m_pFrame->CallCallback( aEvent.m_nEvent, aEvent.m_pData ); + if( aEvent.m_nEvent == SalEvent::Resize ) { - osl::MutexGuard g(m_aEventGuard); - if( ! m_aUserEvents.empty() ) - { - if( bHandleAllCurrentEvents ) - aCurrentEvents.swap( m_aUserEvents ); - else - { - aCurrentEvents.push_back( m_aUserEvents.front() ); - m_aUserEvents.pop_front(); - } - bEvent = true; - } + // this would be a good time to post a paint + const SvpSalFrame* pSvpFrame = static_cast<const SvpSalFrame*>( aEvent.m_pFrame); + pSvpFrame->PostPaint(); } - if( bEvent ) - { - for( auto it = aCurrentEvents.begin(); it != aCurrentEvents.end(); ++it ) - { - if ( isFrameAlive( it->m_pFrame ) ) - { - it->m_pFrame->CallCallback( it->m_nEvent, it->m_pData ); - if( it->m_nEvent == SalEvent::Resize ) - { - // this would be a good time to post a paint - const SvpSalFrame* pSvpFrame = static_cast<const SvpSalFrame*>(it->m_pFrame); - pSvpFrame->PostPaint(); - } - } +} - if ( !bHandleAllCurrentEvents ) - return true; - } - } + +bool SvpSalInstance::DoYield(bool bWait, bool bHandleAllCurrentEvents) +{ + // first, process current user events + bool bEvent = DispatchUserEvents( bHandleAllCurrentEvents ); + if ( !bHandleAllCurrentEvents &&bEvent ) + return true; bEvent = CheckTimeout() || bEvent; diff --git a/vcl/headless/svpprn.cxx b/vcl/headless/svpprn.cxx index 92a11e99d03a..eb9b322a9de5 100644 --- a/vcl/headless/svpprn.cxx +++ b/vcl/headless/svpprn.cxx @@ -257,10 +257,9 @@ OUString SvpSalInstance::GetDefaultPrinter() void SvpSalInstance::PostPrintersChanged() { - const std::list< SalFrame* >& rList = SvpSalInstance::s_pDefaultInstance->getFrames(); - for( std::list< SalFrame* >::const_iterator it = rList.begin(); - it != rList.end(); ++it ) - SvpSalInstance::s_pDefaultInstance->PostEvent( *it, nullptr, SalEvent::PrinterChanged ); + SvpSalInstance *pInst = SvpSalInstance::s_pDefaultInstance; + for (auto pSalFrame : pInst->getFrames() ) + pInst->PostEvent( const_cast<SalFrame*>( pSalFrame ), nullptr, SalEvent::PrinterChanged ); } GenPspGraphics *SvpSalInstance::CreatePrintGraphics() diff --git a/vcl/inc/headless/svpinst.hxx b/vcl/inc/headless/svpinst.hxx index 0883981c4406..91cde9a29e8c 100644 --- a/vcl/inc/headless/svpinst.hxx +++ b/vcl/inc/headless/svpinst.hxx @@ -25,6 +25,7 @@ #include <salinst.hxx> #include <salwtype.hxx> #include <saltimer.hxx> +#include <salusereventlist.hxx> #include <unx/geninst.h> #include <unx/genprn.h> @@ -57,35 +58,18 @@ class GenPspGraphics; SalInstance* svp_create_SalInstance(); -class VCL_DLLPUBLIC SvpSalInstance : public SalGenericInstance +class VCL_DLLPUBLIC SvpSalInstance : public SalGenericInstance, public SalUserEventList { timeval m_aTimeout; sal_uLong m_nTimeoutMS; int m_pTimeoutFDS[2]; - // internal event queue - struct SalUserEvent - { - const SalFrame* m_pFrame; - ImplSVEvent* m_pData; - SalEvent m_nEvent; - - SalUserEvent( const SalFrame* pFrame, ImplSVEvent* pData, SalEvent nEvent ) - : m_pFrame( pFrame ), - m_pData( pData ), - m_nEvent( nEvent ) - {} - }; - - osl::Mutex m_aEventGuard; - std::list< SalUserEvent > m_aUserEvents; - - std::list< SalFrame* > m_aFrames; - - bool isFrameAlive( const SalFrame* pFrame ) const; - void DoReleaseYield( int nTimeoutMS ); + virtual void TriggerUserEventProcessing() override; + virtual void ProcessEvent( SalUserEvent aEvent ) const override; + void Wakeup(); + public: static SvpSalInstance* s_pDefaultInstance; @@ -95,19 +79,16 @@ public: void CloseWakeupPipe(bool log); void CreateWakeupPipe(bool log); - void PostEvent(const SalFrame* pFrame, ImplSVEvent* pData, SalEvent nEvent); - #ifdef ANDROID bool PostedEventsInQueue(); #endif void StartTimer( sal_uLong nMS ); void StopTimer(); - void Wakeup(); - void registerFrame( SalFrame* pFrame ) { m_aFrames.push_back( pFrame ); } - void deregisterFrame( SalFrame* pFrame ); - const std::list< SalFrame* >& + inline void registerFrame( const SalFrame* pFrame ); + inline void deregisterFrame( const SalFrame* pFrame ); + const std::set< const SalFrame* >& getFrames() const { return m_aFrames; } bool CheckTimeout( bool bExecuteTimers = true ); @@ -171,6 +152,16 @@ public: virtual GenPspGraphics *CreatePrintGraphics() override; }; +inline void SvpSalInstance::registerFrame( const SalFrame* pFrame ) +{ + insertFrame( pFrame ); +} + +inline void SvpSalInstance::deregisterFrame( const SalFrame* pFrame ) +{ + eraseFrame( pFrame ); +} + #endif // INCLUDED_VCL_INC_HEADLESS_SVPINST_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/osx/salinst.h b/vcl/inc/osx/salinst.h index 028b02afe630..05768cb9c74e 100644 --- a/vcl/inc/osx/salinst.h +++ b/vcl/inc/osx/salinst.h @@ -59,19 +59,8 @@ public: virtual bool IsCurrentThread() const override; }; -class AquaSalInstance : public SalInstance +class AquaSalInstance : public SalInstance, public SalUserEventList { - struct SalUserEvent - { - AquaSalFrame* mpFrame; - void* mpData; - SalEvent mnType; - - SalUserEvent( AquaSalFrame* pFrame, void* pData, SalEvent nType ) : - mpFrame( pFrame ), mpData( pData ), mnType( nType ) - {} - }; - bool RunInMainYield( bool bHandleAllCurrentEvents ); public: @@ -80,7 +69,6 @@ public: oslThreadIdentifier maMainThread; bool mbWaitingYield; int mnActivePrintJobs; - std::list< SalUserEvent > maUserEvents; osl::Mutex maUserEventListMutex; osl::Condition maWaitingYieldCond; bool mbIsLiveResize; diff --git a/vcl/inc/salusereventlist.hxx b/vcl/inc/salusereventlist.hxx new file mode 100644 index 000000000000..8bcbb29f8005 --- /dev/null +++ b/vcl/inc/salusereventlist.hxx @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_VCL_INC_SALUSEREVENTLIST_HXX +#define INCLUDED_VCL_INC_SALUSEREVENTLIST_HXX + +#include <sal/config.h> +#include <vcl/dllapi.h> +#include <osl/mutex.hxx> + +#include <assert.h> + +#include <list> +#include <set> + +class SalFrame; +enum class SalEvent; + +class VCL_PLUGIN_PUBLIC SalUserEventList +{ +public: + struct SalUserEvent + { + SalFrame* m_pFrame; + void* m_pData; + SalEvent m_nEvent; + + SalUserEvent( SalFrame* pFrame, void* pData, SalEvent nEvent ) + : m_pFrame( pFrame ), + m_pData( pData ), + m_nEvent( nEvent ) + {} + + bool operator==(const SalUserEvent &aEvent) const + { + return m_pFrame == aEvent.m_pFrame + && m_pData == aEvent.m_pData + && m_nEvent== aEvent.m_nEvent; + } + }; + +protected: + mutable osl::Mutex m_aUserEventsMutex; + std::list< SalUserEvent > m_aUserEvents; + std::list< SalUserEvent > m_aProcessingUserEvents; + std::set< const SalFrame* > m_aFrames; + const SalFrame * m_pFirstFrame; + + virtual void ProcessEvent( SalUserEvent aEvent ) const = 0; + virtual void TriggerUserEventProcessing() = 0; + +public: + SalUserEventList(); + virtual ~SalUserEventList(); + + inline SalFrame* firstFrame() const; + void insertFrame( const SalFrame* pFrame ); + void eraseFrame( const SalFrame* pFrame ); + inline bool isFrameAlive( const SalFrame* pFrame ) const; + + void PostEvent( SalFrame* pFrame, void* pData, SalEvent nEvent ); + bool RemoveEvent( SalFrame* pFrame, void* pData, SalEvent nEvent ); + inline bool HasUserEvents() const; + + bool DispatchUserEvents( bool bHandleAllCurrentEvents ); +}; + +inline SalFrame* SalUserEventList::firstFrame() const +{ + return const_cast<SalFrame*>( m_pFirstFrame ); +} + +inline bool SalUserEventList::isFrameAlive( const SalFrame* pFrame ) const +{ + auto it = m_aFrames.find( pFrame ); + return it != m_aFrames.end(); +} + +inline bool SalUserEventList::HasUserEvents() const +{ + osl::MutexGuard aGuard( m_aUserEventsMutex ); + return !(m_aUserEvents.empty() && m_aProcessingUserEvents.empty()); +} + +inline void SalUserEventList::PostEvent( SalFrame* pFrame, void* pData, SalEvent nEvent ) +{ + { + osl::MutexGuard aGuard( m_aUserEventsMutex ); + m_aUserEvents.push_back( SalUserEvent( pFrame, pData, nEvent ) ); + } + TriggerUserEventProcessing(); +} + +#endif // INCLUDED_VCL_INC_SALUSEREVENTLIST_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/unx/gendisp.hxx b/vcl/inc/unx/gendisp.hxx index 64564237a232..8cc031f572e2 100644 --- a/vcl/inc/unx/gendisp.hxx +++ b/vcl/inc/unx/gendisp.hxx @@ -27,45 +27,27 @@ #include <vcl/dllapi.h> #include <list> #include <vector> +#include <salusereventlist.hxx> class SalFrame; -class VCL_DLLPUBLIC SalGenericDisplay +class VCL_DLLPUBLIC SalGenericDisplay : public SalUserEventList { - mutable osl::Mutex m_aEventGuard; - struct SalUserEvent - { - SalFrame* m_pFrame; - void* m_pData; - SalEvent m_nEvent; - - SalUserEvent( SalFrame* pFrame, void* pData, - SalEvent nEvent ) - : m_pFrame( pFrame ), - m_pData( pData ), - m_nEvent( nEvent ) - {} - }; - std::list< SalUserEvent > m_aUserEvents; protected: SalFrame* m_pCapture; - std::list<SalFrame*> m_aFrames; + + virtual void ProcessEvent( SalUserEvent aEvent ) const override; + public: SalGenericDisplay(); - virtual ~SalGenericDisplay(); + virtual ~SalGenericDisplay() override; - osl::Mutex& getEventGuardMutex() { return m_aEventGuard; } - - void registerFrame( SalFrame* pFrame ); - virtual void deregisterFrame( SalFrame* pFrame ); + void registerFrame( const SalFrame* pFrame ); + virtual void deregisterFrame( const SalFrame* pFrame ); void emitDisplayChanged(); - // Event handling - virtual void PostUserEvent() = 0; - void SendInternalEvent( SalFrame* pFrame, void* pData, SalEvent nEvent = SalEvent::UserEvent ); - void CancelInternalEvent( SalFrame const * pFrame, void const * pData, SalEvent nEvent ); + void CancelInternalEvent( SalFrame* pFrame, void* pData, SalEvent nEvent ); bool DispatchInternalEvent(); - bool HasUserEvents() const; bool MouseCaptured( const SalFrame *pFrameData ) const { return m_pCapture == pFrameData; } diff --git a/vcl/inc/unx/gtk/gtkdata.hxx b/vcl/inc/unx/gtk/gtkdata.hxx index 60a0940d9439..45d1564043da 100644 --- a/vcl/inc/unx/gtk/gtkdata.hxx +++ b/vcl/inc/unx/gtk/gtkdata.hxx @@ -111,7 +111,7 @@ public: static gboolean userEventFn( gpointer data ); - void PostUserEvent(); + void TriggerUserEventProcessing(); bool Yield( bool bWait, bool bHandleAllCurrentEvents ); inline GdkDisplay *GetGdkDisplay(); @@ -138,6 +138,9 @@ class GtkSalDisplay : public SalDisplay GdkCursor* getFromXBM( const unsigned char *pBitmap, const unsigned char *pMask, int nWidth, int nHeight, int nXHot, int nYHot ); + + void WakeupMainLoop(); + public: GtkSalDisplay( GdkDisplay* pDisplay ); virtual ~GtkSalDisplay() override; @@ -149,7 +152,7 @@ public: GtkWidget* findGtkWidgetForNativeHandle(sal_uIntPtr hWindow) const; - virtual void deregisterFrame( SalFrame* pFrame ) override; + virtual void deregisterFrame( const SalFrame* pFrame ) override; GdkCursor *getCursor( PointerStyle ePointerStyle ); #if GTK_CHECK_VERSION(3,0,0) virtual int CaptureMouse( SalFrame* pFrame ); @@ -172,7 +175,7 @@ public: void screenSizeChanged( GdkScreen const * ); void monitorsChanged( GdkScreen const * ); - virtual void PostUserEvent() override; + virtual void TriggerUserEventProcessing() override; #if !GTK_CHECK_VERSION(3,0,0) virtual bool Dispatch( XEvent *pEvent ) override; diff --git a/vcl/inc/unx/saldisp.hxx b/vcl/inc/unx/saldisp.hxx index 2c23d6010c35..72f3a43df371 100644 --- a/vcl/inc/unx/saldisp.hxx +++ b/vcl/inc/unx/saldisp.hxx @@ -168,7 +168,7 @@ public: virtual bool Yield( bool bWait, bool bHandleAllCurrentEvents ); virtual void Wakeup(); - virtual void PostUserEvent(); + void TriggerUserEventProcessing(); virtual void Insert( int fd, void* data, YieldFunc pending, @@ -371,12 +371,10 @@ public: { return getDataForScreen( nXScreen ).m_aRoot; } unsigned int GetXScreenCount() const { return m_aScreens.size(); } - const std::list< SalFrame* >& getFrames() const { return m_aFrames; } + const std::set< const SalFrame* >& getFrames() const { return m_aFrames; } bool IsNumLockFromXS() const { return bNumLockFromXS_; } std::list< SalObject* >& getSalObjects() { return m_aSalObjects; } - - virtual void PostUserEvent() override = 0; }; inline Display *SalColormap::GetXDisplay() const @@ -390,7 +388,7 @@ public: virtual bool Dispatch( XEvent *pEvent ) override; virtual void Yield(); - virtual void PostUserEvent() override; + virtual void TriggerUserEventProcessing() override; bool IsEvent(); void SetupInput(); diff --git a/vcl/source/app/salusereventlist.cxx b/vcl/source/app/salusereventlist.cxx new file mode 100644 index 000000000000..1630b1e4d014 --- /dev/null +++ b/vcl/source/app/salusereventlist.cxx @@ -0,0 +1,121 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <salusereventlist.hxx> +#include <salwtype.hxx> + +#include <algorithm> + +SalUserEventList::SalUserEventList() + : m_pFirstFrame( nullptr ) +{ +} + +SalUserEventList::~SalUserEventList() +{ +} + +void SalUserEventList::insertFrame( const SalFrame* pFrame ) +{ + auto aPair = m_aFrames.insert( pFrame ); + assert( aPair.second ); (void) aPair; + if ( nullptr == m_pFirstFrame ) + m_pFirstFrame = pFrame; +} + +void SalUserEventList::eraseFrame( const SalFrame* pFrame ) +{ + auto it = m_aFrames.find( pFrame ); + assert( it != m_aFrames.end() ); + if ( it != m_aFrames.end() ) + { + if ( it == m_aFrames.begin() ) + m_pFirstFrame = nullptr; + m_aFrames.erase( it ); + if ( !m_aFrames.empty() ) + m_pFirstFrame = *m_aFrames.begin(); + } +} + +bool SalUserEventList::DispatchUserEvents( bool bHandleAllCurrentEvents ) +{ + bool bWasEvent = false; + + { + osl::MutexGuard aGuard( m_aUserEventsMutex ); + if( ! m_aUserEvents.empty() ) + { + if( bHandleAllCurrentEvents ) + m_aProcessingUserEvents.swap( m_aUserEvents ); + else + { + m_aProcessingUserEvents.push_back( m_aUserEvents.front() ); + m_aUserEvents.pop_front(); + } + bWasEvent = true; + } + } + + if( bWasEvent ) + { + SalUserEvent aEvent( nullptr, nullptr, SalEvent::NONE ); + do { + { + osl::MutexGuard aGuard( m_aUserEventsMutex ); + if ( m_aProcessingUserEvents.empty() ) + break; + aEvent = m_aProcessingUserEvents.front(); + m_aProcessingUserEvents.pop_front(); + } + + if ( isFrameAlive( aEvent.m_pFrame ) ) + ProcessEvent( aEvent ); + } + while( true ); + } + + return bWasEvent; +} + +bool SalUserEventList::RemoveEvent( SalFrame* pFrame, void* pData, SalEvent nEvent ) +{ + SalUserEvent aEvent( pFrame, pData, nEvent ); + bool bResult = false; + + osl::MutexGuard aGuard( m_aUserEventsMutex ); + auto it = std::find( m_aUserEvents.begin(), m_aUserEvents.end(), aEvent ); + if ( it != m_aUserEvents.end() ) + { + m_aUserEvents.erase( it ); + bResult = true; + } + else + { + it = std::find( m_aProcessingUserEvents.begin(), m_aProcessingUserEvents.end(), aEvent ); + if ( it != m_aProcessingUserEvents.end() ) + { + m_aProcessingUserEvents.erase( it ); + bResult = true; + } + } + + return bResult; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/generic/app/gendisp.cxx b/vcl/unx/generic/app/gendisp.cxx index c1cd5a23112e..0b5b0997c5c3 100644 --- a/vcl/unx/generic/app/gendisp.cxx +++ b/vcl/unx/generic/app/gendisp.cxx @@ -22,7 +22,6 @@ #include <unx/geninst.h> SalGenericDisplay::SalGenericDisplay() - : m_aEventGuard() { m_pCapture = nullptr; } @@ -31,96 +30,40 @@ SalGenericDisplay::~SalGenericDisplay() { } -void SalGenericDisplay::registerFrame( SalFrame* pFrame ) +void SalGenericDisplay::registerFrame( const SalFrame* pFrame ) { - m_aFrames.push_front( pFrame ); + insertFrame( pFrame ); } -void SalGenericDisplay::deregisterFrame( SalFrame* pFrame ) +void SalGenericDisplay::deregisterFrame( const SalFrame* pFrame ) { - { - osl::MutexGuard g( m_aEventGuard ); - std::list< SalUserEvent >::iterator it = m_aUserEvents.begin(); - while ( it != m_aUserEvents.end() ) - { - if( it->m_pFrame == pFrame ) - { - if (it->m_nEvent == SalEvent::UserEvent) { - delete static_cast<ImplSVEvent *>(it->m_pData); - } - it = m_aUserEvents.erase( it ); - } - else - ++it; - } - } - - m_aFrames.remove( pFrame ); + eraseFrame( pFrame ); } void SalGenericDisplay::emitDisplayChanged() { - if( !m_aFrames.empty() ) - m_aFrames.front()->CallCallback( SalEvent::DisplayChanged, nullptr ); + if( m_pFirstFrame ) + m_pFirstFrame->CallCallback( SalEvent::DisplayChanged, nullptr ); } bool SalGenericDisplay::DispatchInternalEvent() { - void* pData = nullptr; - SalFrame* pFrame = nullptr; - SalEvent nEvent = SalEvent::NONE; - - { - osl::MutexGuard g( m_aEventGuard ); - if( !m_aUserEvents.empty() ) - { - pFrame = m_aUserEvents.front().m_pFrame; - pData = m_aUserEvents.front().m_pData; - nEvent = m_aUserEvents.front().m_nEvent; - - m_aUserEvents.pop_front(); - } - } - - if( pFrame ) - pFrame->CallCallback( nEvent, pData ); - - return pFrame != nullptr; + return DispatchUserEvents( false ); } void SalGenericDisplay::SendInternalEvent( SalFrame* pFrame, void* pData, SalEvent nEvent ) { - osl::MutexGuard g( m_aEventGuard ); - - m_aUserEvents.push_back( SalUserEvent( pFrame, pData, nEvent ) ); - - PostUserEvent(); // wakeup the concrete mainloop + PostEvent( pFrame, pData, nEvent ); } -void SalGenericDisplay::CancelInternalEvent( SalFrame const * pFrame, void const * pData, SalEvent nEvent ) +void SalGenericDisplay::CancelInternalEvent( SalFrame* pFrame, void* pData, SalEvent nEvent ) { - osl::MutexGuard g( m_aEventGuard ); - if( ! m_aUserEvents.empty() ) - { - std::list< SalUserEvent >::iterator it = m_aUserEvents.begin(); - while (it != m_aUserEvents.end()) - { - if( it->m_pFrame == pFrame && - it->m_pData == pData && - it->m_nEvent == nEvent ) - { - it = m_aUserEvents.erase( it ); - } - else - ++it; - } - } + RemoveEvent( pFrame, pData, nEvent ); } -bool SalGenericDisplay::HasUserEvents() const +void SalGenericDisplay::ProcessEvent( SalUserEvent aEvent ) const { - osl::MutexGuard g( m_aEventGuard ); - return !m_aUserEvents.empty(); + aEvent.m_pFrame->CallCallback( aEvent.m_nEvent, aEvent.m_pData ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/generic/app/i18n_status.cxx b/vcl/unx/generic/app/i18n_status.cxx index cca11999e6b6..f6ea79399c9e 100644 --- a/vcl/unx/generic/app/i18n_status.cxx +++ b/vcl/unx/generic/app/i18n_status.cxx @@ -170,12 +170,9 @@ bool XIMStatusWindow::checkLastParent() const { if( m_pLastParent ) { - const std::list< SalFrame* >& rFrames = vcl_sal::getSalDisplay(GetGenericData())->getFrames(); - for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it ) - { - if( *it == m_pLastParent ) - return true; - } + auto rFrameList = vcl_sal::getSalDisplay(GetGenericData())->getFrames(); + auto it = rFrameList.find( m_pLastParent ); + return it != rFrameList.end(); } return false; } diff --git a/vcl/unx/generic/app/saldata.cxx b/vcl/unx/generic/app/saldata.cxx index fb5131473e5a..007162a17b36 100644 --- a/vcl/unx/generic/app/saldata.cxx +++ b/vcl/unx/generic/app/saldata.cxx @@ -786,7 +786,7 @@ void SalXLib::Wakeup() OSL_VERIFY(write (m_pTimeoutFDS[1], "", 1) == 1); } -void SalXLib::PostUserEvent() +void SalXLib::TriggerUserEventProcessing() { Wakeup(); } diff --git a/vcl/unx/generic/app/saldisp.cxx b/vcl/unx/generic/app/saldisp.cxx index 73d63086bec6..326d68f5adde 100644 --- a/vcl/unx/generic/app/saldisp.cxx +++ b/vcl/unx/generic/app/saldisp.cxx @@ -431,10 +431,10 @@ SalX11Display::~SalX11Display() } } -void SalX11Display::PostUserEvent() +void SalX11Display::TriggerUserEventProcessing() { if( pXLib_ ) - pXLib_->PostUserEvent(); + pXLib_->TriggerUserEventProcessing(); } SalDisplay::ScreenData * @@ -1935,17 +1935,16 @@ bool SalX11Display::Dispatch( XEvent *pEvent ) { ::Window aWindow = pEvent->xkey.window; - std::list< SalFrame* >::const_iterator it; - for( it = m_aFrames.begin(); it != m_aFrames.end(); ++it ) + for (auto pSalFrame : m_aFrames ) { - const X11SalFrame* pFrame = static_cast< const X11SalFrame* >(*it); + const X11SalFrame* pFrame = static_cast< const X11SalFrame* >( pSalFrame ); if( pFrame->GetWindow() == aWindow || pFrame->GetShellWindow() == aWindow ) { aWindow = pFrame->GetWindow(); break; } } - if( it != m_aFrames.end() ) + if( aWindow != pEvent->xkey.window ) { if ( pInputMethod && pInputMethod->FilterEvent( pEvent , aWindow ) ) return false; @@ -1975,9 +1974,8 @@ bool SalX11Display::Dispatch( XEvent *pEvent ) { if( pEvent->xproperty.window == rScreen.m_aRefWindow ) { - std::list< SalFrame* >::const_iterator it; - for( it = m_aFrames.begin(); it != m_aFrames.end(); ++it ) - (*it)->CallCallback( SalEvent::SettingsChanged, nullptr ); + for (auto pSalFrame : m_aFrames ) + pSalFrame->CallCallback( SalEvent::SettingsChanged, nullptr ); return false; } } @@ -2009,10 +2007,10 @@ bool SalX11Display::Dispatch( XEvent *pEvent ) break; } - std::list< SalFrame* >::iterator it; - for( it = m_aFrames.begin(); it != m_aFrames.end(); ++it ) + for (auto pSalFrame : m_aFrames ) { - X11SalFrame* pFrame = static_cast< X11SalFrame* >(*it); + X11SalFrame* pFrame = static_cast<X11SalFrame*>( const_cast<SalFrame*>( pSalFrame ) ); + ::Window aDispatchWindow = pEvent->xany.window; if( pFrame->GetWindow() == aDispatchWindow || pFrame->GetShellWindow() == aDispatchWindow diff --git a/vcl/unx/generic/app/salinst.cxx b/vcl/unx/generic/app/salinst.cxx index 897d955ddccb..c306f6a78f70 100644 --- a/vcl/unx/generic/app/salinst.cxx +++ b/vcl/unx/generic/app/salinst.cxx @@ -225,10 +225,8 @@ void X11SalInstance::AddToRecentDocumentList(const OUString& rFileUrl, const OUS void X11SalInstance::PostPrintersChanged() { SalDisplay* pDisp = vcl_sal::getSalDisplay(GetGenericData()); - const std::list< SalFrame* >& rList = pDisp->getFrames(); - for( std::list< SalFrame* >::const_iterator it = rList.begin(); - it != rList.end(); ++it ) - pDisp->SendInternalEvent( *it, nullptr, SalEvent::PrinterChanged ); + for (auto pSalFrame : pDisp->getFrames() ) + pDisp->PostEvent( const_cast<SalFrame*>( pSalFrame ), nullptr, SalEvent::PrinterChanged ); } GenPspGraphics *X11SalInstance::CreatePrintGraphics() diff --git a/vcl/unx/generic/app/sm.cxx b/vcl/unx/generic/app/sm.cxx index b86435fbaf73..5d6bf68edd7f 100644 --- a/vcl/unx/generic/app/sm.cxx +++ b/vcl/unx/generic/app/sm.cxx @@ -293,10 +293,9 @@ IMPL_STATIC_LINK( SessionManagerClient, SaveYourselfHdl, void*, pStateVal, void task of the quick-starter) */ *pSmRestartHint = SmRestartNever; - const std::list< SalFrame* >& rFrames = vcl_sal::getSalDisplay(GetGenericData())->getFrames(); - for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it ) + for (auto pSalFrame : vcl_sal::getSalDisplay(GetGenericData())->getFrames() ) { - vcl::Window *pWindow = (*it)->GetWindow(); + vcl::Window *pWindow = pSalFrame->GetWindow(); if (pWindow && pWindow->IsVisible()) { *pSmRestartHint = SmRestartIfRunning; @@ -394,11 +393,10 @@ IMPL_STATIC_LINK_NOARG( SessionManagerClient, ShutDownHdl, void*, void ) m_pSession->CallCallback( &aEvent ); } - const std::list< SalFrame* >& rFrames = vcl_sal::getSalDisplay(GetGenericData())->getFrames(); - - SAL_INFO("vcl.sm.debug", " rFrames.empty() = " << (rFrames.empty() ? "true" : "false")); - if( !rFrames.empty() ) - rFrames.front()->CallCallback( SalEvent::Shutdown, nullptr ); + auto pFirstFrame = vcl_sal::getSalDisplay(GetGenericData())->firstFrame(); + SAL_INFO("vcl.sm.debug", " rFrames.empty() = " << (pFirstFrame ? "true" : "false")); + if( pFirstFrame ) + pFirstFrame->CallCallback( SalEvent::Shutdown, nullptr ); } void SessionManagerClient::DieProc( diff --git a/vcl/unx/generic/gdi/salgdi2.cxx b/vcl/unx/generic/gdi/salgdi2.cxx index 4e9219505069..0d726f59466a 100644 --- a/vcl/unx/generic/gdi/salgdi2.cxx +++ b/vcl/unx/generic/gdi/salgdi2.cxx @@ -127,12 +127,11 @@ void X11SalGraphics::YieldGraphicsExpose() ::Window aWindow = GetDrawable(); if( ! pFrame ) { - const std::list< SalFrame* >& rFrames = vcl_sal::getSalDisplay(GetGenericData())->getFrames(); - for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end() && ! pFrame; ++it ) + for (auto pSalFrame : vcl_sal::getSalDisplay(GetGenericData())->getFrames() ) { - const SystemEnvData* pEnvData = (*it)->GetSystemData(); + const SystemEnvData* pEnvData = pSalFrame->GetSystemData(); if( Drawable(pEnvData->aWindow) == aWindow ) - pFrame = *it; + pFrame = const_cast<SalFrame*>( pSalFrame ); } if( ! pFrame ) return; diff --git a/vcl/unx/generic/window/salframe.cxx b/vcl/unx/generic/window/salframe.cxx index f8baf9b0742e..2bc836d6afe5 100644 --- a/vcl/unx/generic/window/salframe.cxx +++ b/vcl/unx/generic/window/salframe.cxx @@ -492,15 +492,14 @@ void X11SalFrame::Init( SalFrameStyleFlags nSalFrameStyle, SalX11Screen nXScreen // check if this is really one of our own frames // do not change the input mask in that case - const std::list< SalFrame* >& rFrames = GetDisplay()->getFrames(); - std::list< SalFrame* >::const_iterator it = rFrames.begin(); - while( it != rFrames.end() && mhForeignParent != static_cast<const X11SalFrame*>(*it)->GetWindow() ) - ++it; - - if( it == rFrames.end() ) + for (auto pSalFrame : GetDisplay()->getFrames() ) { - XSelectInput( GetDisplay()->GetDisplay(), mhForeignParent, StructureNotifyMask | FocusChangeMask ); - XSelectInput( GetDisplay()->GetDisplay(), mhShellWindow, StructureNotifyMask | FocusChangeMask ); + if ( static_cast<const X11SalFrame*>( pSalFrame )->GetWindow() == mhForeignParent ) + { + XSelectInput( GetDisplay()->GetDisplay(), mhForeignParent, StructureNotifyMask | FocusChangeMask ); + XSelectInput( GetDisplay()->GetDisplay(), mhShellWindow, StructureNotifyMask | FocusChangeMask ); + break; + } } } else @@ -521,11 +520,9 @@ void X11SalFrame::Init( SalFrameStyleFlags nSalFrameStyle, SalX11Screen nXScreen { // find the last document window (if any) const X11SalFrame* pFrame = nullptr; - const std::list< SalFrame* >& rFrames = GetDisplay()->getFrames(); - std::list< SalFrame* >::const_iterator it = rFrames.begin(); - while( it != rFrames.end() ) + for (auto pSalFrame : GetDisplay()->getFrames() ) { - pFrame = static_cast< const X11SalFrame* >(*it); + pFrame = static_cast< const X11SalFrame* >( pSalFrame ); if( ! ( pFrame->mpParent || pFrame->mbFullScreen || ! ( pFrame->nStyle_ & SalFrameStyleFlags::SIZEABLE ) @@ -534,10 +531,9 @@ void X11SalFrame::Init( SalFrameStyleFlags nSalFrameStyle, SalX11Screen nXScreen ) ) break; - ++it; } - if( it != rFrames.end() ) + if( pFrame ) { // set a document position and size // the first frame gets positioned by the window manager @@ -954,13 +950,12 @@ X11SalFrame::~X11SalFrame() * check if there is only the status frame left * if so, free it */ - if( ! GetDisplay()->getFrames().empty() && vcl::I18NStatus::exists() ) + auto &rFrames = GetDisplay()->getFrames(); + if( ! rFrames.empty() && vcl::I18NStatus::exists() ) { SalFrame* pStatusFrame = vcl::I18NStatus::get().getStatusFrame(); - std::list< SalFrame* >::const_iterator sit = GetDisplay()->getFrames().begin(); - if( pStatusFrame - && *sit == pStatusFrame - && ++sit == GetDisplay()->getFrames().end() ) + auto sit = rFrames.begin(); + if( pStatusFrame && *sit == pStatusFrame && ++sit == rFrames.end() ) vcl::I18NStatus::free(); } } @@ -1204,10 +1199,9 @@ void X11SalFrame::Show( bool bVisible, bool bNoActivate ) if( ! (nStyle_ & SalFrameStyleFlags::INTRO) ) { // hide all INTRO frames - const std::list< SalFrame* >& rFrames = GetDisplay()->getFrames(); - for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it ) + for (auto pSalFrame : GetDisplay()->getFrames() ) { - const X11SalFrame* pFrame = static_cast< const X11SalFrame* >(*it); + const X11SalFrame* pFrame = static_cast< const X11SalFrame* >( pSalFrame ); // look for intro bit map; if present, hide it if( pFrame->nStyle_ & SalFrameStyleFlags::INTRO ) { @@ -2698,10 +2692,9 @@ bool X11SalFrame::HandleMouseEvent( XEvent *pEvent ) // see if the user clicks outside all of the floats // if yes release the grab bool bInside = false; - const std::list< SalFrame* >& rFrames = GetDisplay()->getFrames(); - for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it ) + for (auto pSalFrame : GetDisplay()->getFrames() ) { - const X11SalFrame* pFrame = static_cast< const X11SalFrame* >(*it); + const X11SalFrame* pFrame = static_cast< const X11SalFrame* >( pSalFrame ); if( pFrame->IsFloatGrabWindow() && pFrame->bMapped_ && pEvent->xbutton.x_root >= pFrame->maGeometry.nX && @@ -2738,9 +2731,9 @@ bool X11SalFrame::HandleMouseEvent( XEvent *pEvent ) && aChild // pointer may not be in any child ) { - for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it ) + for (auto pSalFrame : GetDisplay()->getFrames() ) { - const X11SalFrame* pFrame = static_cast< const X11SalFrame* >(*it); + const X11SalFrame* pFrame = static_cast< const X11SalFrame* >( pSalFrame ); if( ! pFrame->IsFloatGrabWindow() && ( pFrame->GetWindow() == aChild || pFrame->GetShellWindow() == aChild || diff --git a/vcl/unx/gtk/gtkdata.cxx b/vcl/unx/gtk/gtkdata.cxx index bcbce082ef29..5f6a30f35479 100644 --- a/vcl/unx/gtk/gtkdata.cxx +++ b/vcl/unx/gtk/gtkdata.cxx @@ -135,17 +135,16 @@ GdkFilterReturn GtkSalDisplay::filterGdkEvent( GdkXEvent* sys_event ) // actually change when a corresponding PropertyNotify occurs if( pEvent->type == PropertyNotify && pEvent->xproperty.atom == getWMAdaptor()->getAtom( WMAdaptor::XSETTINGS ) && - ! m_aFrames.empty() + m_pFirstFrame ) { - SendInternalEvent( m_aFrames.front(), nullptr, SalEvent::SettingsChanged ); + PostEvent( firstFrame(), nullptr, SalEvent::SettingsChanged ); } // let's see if one of our frames wants to swallow these events // get the frame - for( std::list< SalFrame* >::const_iterator it = m_aFrames.begin(); - it != m_aFrames.end(); ++it ) + for (auto pSalFrame : m_aFrames ) { - GtkSalFrame* pFrame = static_cast<GtkSalFrame*>(*it); + GtkSalFrame* pFrame = static_cast<GtkSalFrame*>( const_cast<SalFrame*>( pSalFrame ) ); if( pFrame->GetSystemData()->aWindow == pEvent->xany.window || ( pFrame->getForeignParent() && pFrame->getForeignParentWindow() == pEvent->xany.window ) || ( pFrame->getForeignTopLevel() && pFrame->getForeignTopLevelWindow() == pEvent->xany.window ) @@ -213,11 +212,10 @@ bool GtkSalDisplay::Dispatch( XEvent* pEvent ) { // let's see if one of our frames wants to swallow these events // get the child frame - for( std::list< SalFrame* >::const_iterator it = m_aFrames.begin(); - it != m_aFrames.end(); ++it ) + for (auto pSalFrame : m_aFrames ) { - if ((*it)->GetSystemData()->aWindow == pEvent->xany.window) - return static_cast<GtkSalFrame*>(*it)->Dispatch( pEvent ); + if (pSalFrame->GetSystemData()->aWindow == pEvent->xany.window) + return static_cast<GtkSalFrame*>( const_cast<SalFrame*>( pSalFrame ) )->Dispatch( pEvent ); } } @@ -826,8 +824,7 @@ gboolean GtkData::userEventFn( gpointer data ) { OSL_ASSERT(static_cast<const SalGenericDisplay *>(pThis->GetGtkDisplay()) == pDisplay); { - osl::MutexGuard g (pThis->GetGtkDisplay()->getEventGuardMutex()); - + osl::MutexGuard g( pThis->m_aDispatchMutex ); if( !pThis->GetGtkDisplay()->HasUserEvents() ) { if( pThis->m_pUserEvent ) @@ -855,8 +852,9 @@ extern "C" { } // hEventGuard_ held during this invocation -void GtkData::PostUserEvent() +void GtkData::TriggerUserEventProcessing() { + osl::MutexGuard g( m_aDispatchMutex ); if (m_pUserEvent) g_main_context_wakeup (nullptr); // really needed ? else // nothing pending anyway @@ -870,16 +868,15 @@ void GtkData::PostUserEvent() } } -void GtkSalDisplay::PostUserEvent() +void GtkSalDisplay::TriggerUserEventProcessing() { - GetGtkSalData()->PostUserEvent(); + GetGtkSalData()->TriggerUserEventProcessing(); } GtkWidget* GtkSalDisplay::findGtkWidgetForNativeHandle(sal_uIntPtr hWindow) const { - for (auto it = m_aFrames.begin(); it != m_aFrames.end(); ++it) + for (auto pFrame : m_aFrames) { - SalFrame* pFrame = *it; const SystemEnvData* pEnvData = pFrame->GetSystemData(); if (pEnvData->aWindow == hWindow) return GTK_WIDGET(pEnvData->pWidget); @@ -887,7 +884,7 @@ GtkWidget* GtkSalDisplay::findGtkWidgetForNativeHandle(sal_uIntPtr hWindow) cons return nullptr; } -void GtkSalDisplay::deregisterFrame( SalFrame* pFrame ) +void GtkSalDisplay::deregisterFrame( const SalFrame* pFrame ) { if( m_pCapture == pFrame ) { diff --git a/vcl/unx/gtk/gtksalframe.cxx b/vcl/unx/gtk/gtksalframe.cxx index 8bd532eea78c..ab011854fdb9 100644 --- a/vcl/unx/gtk/gtksalframe.cxx +++ b/vcl/unx/gtk/gtksalframe.cxx @@ -2180,10 +2180,9 @@ void GtkSalFrame::grabPointer( bool bGrab, bool bOwnerEvents ) if( bGrab ) { bool bUseGdkGrab = true; - const std::list< SalFrame* >& rFrames = getDisplay()->getFrames(); - for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it ) + for (auto pSalFrame : getDisplay()->getFrames() ) { - const GtkSalFrame* pFrame = static_cast< const GtkSalFrame* >(*it); + const GtkSalFrame* pFrame = static_cast< const GtkSalFrame* >( pSalFrame ); if( pFrame->m_bWindowIsGtkPlug ) { bUseGdkGrab = false; diff --git a/vcl/unx/gtk3/gtk3gtkdata.cxx b/vcl/unx/gtk3/gtk3gtkdata.cxx index 77048114c2d0..2a6440b8ce61 100644 --- a/vcl/unx/gtk3/gtk3gtkdata.cxx +++ b/vcl/unx/gtk3/gtk3gtkdata.cxx @@ -788,8 +788,7 @@ gboolean GtkData::userEventFn( gpointer data ) { OSL_ASSERT(static_cast<const SalGenericDisplay *>(pThis->GetGtkDisplay()) == pDisplay); { - osl::MutexGuard g (pThis->GetGtkDisplay()->getEventGuardMutex()); - + osl::MutexGuard g( pThis->m_aDispatchMutex ); if( !pThis->GetGtkDisplay()->HasUserEvents() ) { if( pThis->m_pUserEvent ) @@ -817,8 +816,9 @@ extern "C" { } // hEventGuard_ held during this invocation -void GtkData::PostUserEvent() +void GtkData::TriggerUserEventProcessing() { + osl::MutexGuard g( m_aDispatchMutex ); if (m_pUserEvent) g_main_context_wakeup (nullptr); // really needed ? else // nothing pending anyway @@ -832,24 +832,23 @@ void GtkData::PostUserEvent() } } -void GtkSalDisplay::PostUserEvent() +void GtkSalDisplay::TriggerUserEventProcessing() { - GetGtkSalData()->PostUserEvent(); + GetGtkSalData()->TriggerUserEventProcessing(); } GtkWidget* GtkSalDisplay::findGtkWidgetForNativeHandle(sal_uIntPtr hWindow) const { - for (auto it = m_aFrames.begin(); it != m_aFrames.end(); ++it) + for (auto pSalFrame : m_aFrames ) { - SalFrame* pFrame = *it; - const SystemEnvData* pEnvData = pFrame->GetSystemData(); + const SystemEnvData* pEnvData = pSalFrame->GetSystemData(); if (pEnvData->aWindow == hWindow) return GTK_WIDGET(pEnvData->pWidget); } return nullptr; } -void GtkSalDisplay::deregisterFrame( SalFrame* pFrame ) +void GtkSalDisplay::deregisterFrame( const SalFrame* pFrame ) { if( m_pCapture == pFrame ) { diff --git a/vcl/unx/kde4/KDESalDisplay.cxx b/vcl/unx/kde4/KDESalDisplay.cxx index 4647b3d111c8..8a2422a3918d 100644 --- a/vcl/unx/kde4/KDESalDisplay.cxx +++ b/vcl/unx/kde4/KDESalDisplay.cxx @@ -86,4 +86,9 @@ bool SalKDEDisplay::checkDirectInputEvent( XEvent* ev ) return false; } +void SalKDEDisplay::TriggerUserEventProcessing() +{ + static_cast<KDEXLib*>(GetXLib())->TriggerUserEventProcessing(); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kde4/KDESalDisplay.hxx b/vcl/unx/kde4/KDESalDisplay.hxx index 4a0458dcc5c2..07b5ca3dadf5 100644 --- a/vcl/unx/kde4/KDESalDisplay.hxx +++ b/vcl/unx/kde4/KDESalDisplay.hxx @@ -23,15 +23,18 @@ class SalKDEDisplay : public SalX11Display { - public: - explicit SalKDEDisplay( Display* pDisp ); - virtual ~SalKDEDisplay() override; - static SalKDEDisplay* self(); - virtual void Yield() override; - bool checkDirectInputEvent( XEvent* ev ); - private: - Atom xim_protocol; - static SalKDEDisplay* selfptr; + Atom xim_protocol; + static SalKDEDisplay* selfptr; + +protected: + virtual void TriggerUserEventProcessing() override; + +public: + explicit SalKDEDisplay( Display* pDisp ); + virtual ~SalKDEDisplay() override; + static SalKDEDisplay* self(); + virtual void Yield() override; + bool checkDirectInputEvent( XEvent* ev ); }; inline SalKDEDisplay* SalKDEDisplay::self() diff --git a/vcl/unx/kde4/KDEXLib.cxx b/vcl/unx/kde4/KDEXLib.cxx index d56c67e008cb..17920e276869 100644 --- a/vcl/unx/kde4/KDEXLib.cxx +++ b/vcl/unx/kde4/KDEXLib.cxx @@ -357,10 +357,10 @@ void KDEXLib::Wakeup() QAbstractEventDispatcher::instance( qApp->thread())->wakeUp(); // main thread event loop } -void KDEXLib::PostUserEvent() +void KDEXLib::TriggerUserEventProcessing() { if( !m_isGlibEventLoopType ) - return SalXLib::PostUserEvent(); + return SalXLib::TriggerUserEventProcessing(); QApplication::postEvent(this, new QEvent(QEvent::Type( m_postUserEventId ))); } diff --git a/vcl/unx/kde4/KDEXLib.hxx b/vcl/unx/kde4/KDEXLib.hxx index 2fe497d019fa..4c06104b4c59 100644 --- a/vcl/unx/kde4/KDEXLib.hxx +++ b/vcl/unx/kde4/KDEXLib.hxx @@ -83,7 +83,7 @@ class KDEXLib : public QObject, public SalXLib virtual void StartTimer( sal_uLong nMS ) override; virtual void StopTimer() override; virtual void Wakeup() override; - virtual void PostUserEvent() override; + void TriggerUserEventProcessing(); void doStartup(); bool allowKdeDialogs() { return m_allowKdeDialogs; } _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
