LibreOffice Module vcl (master)  1
salusereventlist.hxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #ifndef INCLUDED_VCL_INC_SALUSEREVENTLIST_HXX
21 #define INCLUDED_VCL_INC_SALUSEREVENTLIST_HXX
22 
23 #include <sal/config.h>
24 #include <vcl/dllapi.h>
25 #include <osl/mutex.hxx>
26 #include <osl/thread.hxx>
27 
28 #include <list>
29 #include <o3tl/sorted_vector.hxx>
30 
31 class SalFrame;
32 enum class SalEvent;
33 
35 
37 {
38 public:
39  struct SalUserEvent
40  {
42  void* m_pData;
44 
45  SalUserEvent( SalFrame* pFrame, void* pData, SalEvent nEvent )
46  : m_pFrame( pFrame ),
47  m_pData( pData ),
48  m_nEvent( nEvent )
49  {}
50 
51  bool operator==(const SalUserEvent &aEvent) const
52  {
53  return m_pFrame == aEvent.m_pFrame
54  && m_pData == aEvent.m_pData
55  && m_nEvent== aEvent.m_nEvent;
56  }
57  };
58 
59 protected:
60  mutable osl::Mutex m_aUserEventsMutex;
61  std::list< SalUserEvent > m_aUserEvents;
62  std::list< SalUserEvent > m_aProcessingUserEvents;
65  oslThreadIdentifier m_aProcessingThread;
66 
67  virtual void ProcessEvent( SalUserEvent aEvent ) = 0;
68  virtual void TriggerUserEventProcessing() = 0;
70 
71 public:
73  virtual ~SalUserEventList() COVERITY_NOEXCEPT_FALSE;
74 
75  inline const SalFrameSet& getFrames() const;
76  inline SalFrame* anyFrame() const;
77  void insertFrame( SalFrame* pFrame );
78  void eraseFrame( SalFrame* pFrame );
79  inline bool isFrameAlive( const SalFrame* pFrame ) const;
80 
81  void PostEvent( SalFrame* pFrame, void* pData, SalEvent nEvent );
82  void RemoveEvent( SalFrame* pFrame, void* pData, SalEvent nEvent );
83  inline bool HasUserEvents() const;
84 
85  bool DispatchUserEvents( bool bHandleAllCurrentEvents );
86 };
87 
88 inline SalFrame* SalUserEventList::anyFrame() const
89 {
90  if ( m_aFrames.empty() )
91  return nullptr;
92  return *m_aFrames.begin();
93 }
94 
95 inline bool SalUserEventList::isFrameAlive( const SalFrame* pFrame ) const
96 {
97  auto it = m_aFrames.find( const_cast<SalFrame*>( pFrame ) );
98  return it != m_aFrames.end();
99 }
100 
102 {
103  osl::MutexGuard aGuard( m_aUserEventsMutex );
104  return !(m_aUserEvents.empty() && m_aProcessingUserEvents.empty());
105 }
106 
107 inline void SalUserEventList::PostEvent( SalFrame* pFrame, void* pData, SalEvent nEvent )
108 {
109  osl::MutexGuard aGuard( m_aUserEventsMutex );
110  m_aUserEvents.push_back( SalUserEvent( pFrame, pData, nEvent ) );
111  m_bAllUserEventProcessedSignaled = false;
112  TriggerUserEventProcessing();
113 }
114 
116 {
117  return m_aFrames;
118 }
119 
120 #endif // INCLUDED_VCL_INC_SALUSEREVENTLIST_HXX
121 
122 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
const_iterator find(const Value &x) const
const SalFrameSet & getFrames() const
std::list< SalUserEvent > m_aProcessingUserEvents
o3tl::sorted_vector< SalFrame * > SalFrameSet
std::list< SalUserEvent > m_aUserEvents
virtual void TriggerAllUserEventsProcessed()
osl::Mutex m_aUserEventsMutex
const_iterator end() const
bool empty() const
bool HasUserEvents() const
bool operator==(const SalUserEvent &aEvent) const
SalEvent
Definition: salwtype.hxx:40
const_iterator begin() const
#define VCL_PLUGIN_PUBLIC
Definition: dllapi.h:40
A SalFrame is a system window (e.g. an X11 window).
Definition: salframe.hxx:112
SalUserEvent(SalFrame *pFrame, void *pData, SalEvent nEvent)
bool isFrameAlive(const SalFrame *pFrame) const
void PostEvent(SalFrame *pFrame, void *pData, SalEvent nEvent)
bool m_bAllUserEventProcessedSignaled
oslThreadIdentifier m_aProcessingThread