Blender V4.3
GHOST_EventManager.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
13#include "GHOST_EventManager.hh"
14#include "GHOST_Debug.hh"
15#include <algorithm>
16
18
20{
22
23 TConsumerVector::iterator iter = m_consumers.begin();
24 while (iter != m_consumers.end()) {
25 GHOST_IEventConsumer *consumer = *iter;
26 delete consumer;
27 iter = m_consumers.erase(iter);
28 }
29}
30
35
37{
38 uint32_t numEvents = 0;
39 TEventStack::iterator p;
40 for (p = m_events.begin(); p != m_events.end(); ++p) {
41 if ((*p)->getType() == type) {
42 numEvents++;
43 }
44 }
45 return numEvents;
46}
47
49{
50 GHOST_TSuccess success;
51 GHOST_ASSERT(event, "invalid event");
52 if (m_events.size() < m_events.max_size()) {
53 m_events.push_front(event);
54 success = GHOST_kSuccess;
55 }
56 else {
57 success = GHOST_kFailure;
58 }
59 return success;
60}
61
63{
64 TConsumerVector::iterator iter;
65
66 for (iter = m_consumers.begin(); iter != m_consumers.end(); ++iter) {
67 (*iter)->processEvent(event);
68 }
69}
70
72{
73 const GHOST_IEvent *event = m_events.back();
74 m_events.pop_back();
75 m_handled_events.push_back(event);
76
77 dispatchEvent(event);
78}
79
81{
82 while (!m_events.empty()) {
84 }
85
87}
88
90{
91 GHOST_TSuccess success;
92 GHOST_ASSERT(consumer, "invalid consumer");
93
94 /* Check to see whether the consumer is already in our list. */
95 TConsumerVector::const_iterator iter = std::find(
96 m_consumers.begin(), m_consumers.end(), consumer);
97
98 if (iter == m_consumers.end()) {
99 /* Add the consumer. */
100 m_consumers.push_back(consumer);
101 success = GHOST_kSuccess;
102 }
103 else {
104 success = GHOST_kFailure;
105 }
106 return success;
107}
108
110{
111 GHOST_TSuccess success;
112 GHOST_ASSERT(consumer, "invalid consumer");
113
114 /* Check to see whether the consumer is in our list. */
115 TConsumerVector::iterator iter = std::find(m_consumers.begin(), m_consumers.end(), consumer);
116
117 if (iter != m_consumers.end()) {
118 /* Remove the consumer. */
119 m_consumers.erase(iter);
120 success = GHOST_kSuccess;
121 }
122 else {
123 success = GHOST_kFailure;
124 }
125 return success;
126}
127
129{
130 TEventStack::iterator iter;
131 iter = m_events.begin();
132 while (iter != m_events.end()) {
133 const GHOST_IEvent *event = *iter;
134 if (event->getWindow() == window) {
135 GHOST_PRINT("GHOST_EventManager::removeWindowEvents(): removing event\n");
136 /*
137 * Found an event for this window, remove it.
138 * The iterator will become invalid.
139 */
140 delete event;
141 m_events.erase(iter);
142 iter = m_events.begin();
143 }
144 else {
145 ++iter;
146 }
147 }
148}
149
151{
152 TEventStack::iterator iter;
153 iter = m_events.begin();
154 while (iter != m_events.end()) {
155 const GHOST_IEvent *event = *iter;
156 if ((event->getType() == type) && (!window || (event->getWindow() == window))) {
157 GHOST_PRINT("GHOST_EventManager::removeTypeEvents(): removing event\n");
158 /*
159 * Found an event of this type for the window, remove it.
160 * The iterator will become invalid.
161 */
162 delete event;
163 m_events.erase(iter);
164 iter = m_events.begin();
165 }
166 else {
167 ++iter;
168 }
169 }
170}
171
173{
174 while (m_handled_events.empty() == false) {
175 GHOST_ASSERT(m_handled_events[0], "invalid event");
176 delete m_handled_events[0];
177 m_handled_events.pop_front();
178 }
179
180 while (m_events.empty() == false) {
181 GHOST_ASSERT(m_events[0], "invalid event");
182 delete m_events[0];
183 m_events.pop_front();
184 }
185}
#define GHOST_ASSERT(x, info)
#define GHOST_PRINT(x)
GHOST_TEventType
GHOST_TSuccess
Definition GHOST_Types.h:87
@ GHOST_kFailure
Definition GHOST_Types.h:87
@ GHOST_kSuccess
Definition GHOST_Types.h:87
std::deque< const GHOST_IEvent * > m_handled_events
GHOST_TSuccess addConsumer(GHOST_IEventConsumer *consumer)
std::deque< const GHOST_IEvent * > m_events
GHOST_TSuccess removeConsumer(GHOST_IEventConsumer *consumer)
TConsumerVector m_consumers
GHOST_TSuccess pushEvent(const GHOST_IEvent *event)
void removeWindowEvents(const GHOST_IWindow *window)
void removeTypeEvents(GHOST_TEventType type, const GHOST_IWindow *window=nullptr)
unsigned int uint32_t
Definition stdint.h:80