[Libreoffice-commits] core.git: Branch 'private/jmux/scheduler-fixes' - vcl/headless vcl/inc vcl/Library_vcl.mk vcl/source vcl/unx
Jan-Marek Glogowski
glogow at fbihome.de
Tue Sep 5 13:38:27 UTC 2017
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 <glogow at fbihome.de>
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; }
More information about the Libreoffice-commits
mailing list