Blender V5.0
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
8
12
13#include "GHOST_EventManager.hh"
14#include "GHOST_Debug.hh"
15#include <algorithm>
16
18
20{
22
23 TConsumerVector::iterator iter = consumers_.begin();
24 while (iter != consumers_.end()) {
25 GHOST_IEventConsumer *consumer = *iter;
26 delete consumer;
27 iter = consumers_.erase(iter);
28 }
29}
30
32{
33 return uint32_t(events_.size());
34}
35
37{
38 uint32_t numEvents = 0;
39 TEventStack::iterator p;
40 for (p = events_.begin(); p != 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 (events_.size() < events_.max_size()) {
53 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 = consumers_.begin(); iter != consumers_.end(); ++iter) {
67 (*iter)->processEvent(event);
68 }
69}
70
72{
73 const GHOST_IEvent *event = events_.back();
74 events_.pop_back();
75 handled_events_.push_back(event);
76
77 dispatchEvent(event);
78}
79
81{
82 while (!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(consumers_.begin(), consumers_.end(), consumer);
96
97 if (iter == consumers_.end()) {
98 /* Add the consumer. */
99 consumers_.push_back(consumer);
100 success = GHOST_kSuccess;
101 }
102 else {
103 success = GHOST_kFailure;
104 }
105 return success;
106}
107
109{
110 GHOST_TSuccess success;
111 GHOST_ASSERT(consumer, "invalid consumer");
112
113 /* Check to see whether the consumer is in our list. */
114 TConsumerVector::iterator iter = std::find(consumers_.begin(), consumers_.end(), consumer);
115
116 if (iter != consumers_.end()) {
117 /* Remove the consumer. */
118 consumers_.erase(iter);
119 success = GHOST_kSuccess;
120 }
121 else {
122 success = GHOST_kFailure;
123 }
124 return success;
125}
126
128{
129 TEventStack::iterator iter;
130 iter = events_.begin();
131 while (iter != events_.end()) {
132 const GHOST_IEvent *event = *iter;
133 if (event->getWindow() == window) {
134 GHOST_PRINT("GHOST_EventManager::removeWindowEvents(): removing event\n");
135 /*
136 * Found an event for this window, remove it.
137 * The iterator will become invalid.
138 */
139 delete event;
140 events_.erase(iter);
141 iter = events_.begin();
142 }
143 else {
144 ++iter;
145 }
146 }
147}
148
150{
151 TEventStack::iterator iter;
152 iter = events_.begin();
153 while (iter != events_.end()) {
154 const GHOST_IEvent *event = *iter;
155 if ((event->getType() == type) && (!window || (event->getWindow() == window))) {
156 GHOST_PRINT("GHOST_EventManager::removeTypeEvents(): removing event\n");
157 /*
158 * Found an event of this type for the window, remove it.
159 * The iterator will become invalid.
160 */
161 delete event;
162 events_.erase(iter);
163 iter = events_.begin();
164 }
165 else {
166 ++iter;
167 }
168 }
169}
170
172{
173 while (handled_events_.empty() == false) {
174 GHOST_ASSERT(handled_events_[0], "invalid event");
175 delete handled_events_[0];
176 handled_events_.pop_front();
177 }
178
179 while (events_.empty() == false) {
180 GHOST_ASSERT(events_[0], "invalid event");
181 delete events_[0];
182 events_.pop_front();
183 }
184}
#define GHOST_ASSERT(x, info)
#define GHOST_PRINT(x)
GHOST_TEventType
GHOST_TSuccess
Definition GHOST_Types.h:57
@ GHOST_kFailure
Definition GHOST_Types.h:57
@ GHOST_kSuccess
Definition GHOST_Types.h:57
std::deque< const GHOST_IEvent * > events_
GHOST_TSuccess addConsumer(GHOST_IEventConsumer *consumer)
std::deque< const GHOST_IEvent * > handled_events_
GHOST_TSuccess removeConsumer(GHOST_IEventConsumer *consumer)
TConsumerVector consumers_
GHOST_TSuccess pushEvent(const GHOST_IEvent *event)
void removeWindowEvents(const GHOST_IWindow *window)
void removeTypeEvents(GHOST_TEventType type, const GHOST_IWindow *window=nullptr)