Fix paint curve not drawing selection colors properly
[blender.git] / intern / ghost / intern / GHOST_EventManager.cpp
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup GHOST
22  */
23
24 /**
25  * Copyright (C) 2001 NaN Technologies B.V.
26  */
27
28 #include "GHOST_EventManager.h"
29 #include <algorithm>
30 #include "GHOST_Debug.h"
31 #include <stdio.h>  // [mce] temp debug
32
33 GHOST_EventManager::GHOST_EventManager()
34 {
35 }
36
37 GHOST_EventManager::~GHOST_EventManager()
38 {
39   disposeEvents();
40
41   TConsumerVector::iterator iter = m_consumers.begin();
42   while (iter != m_consumers.end()) {
43     GHOST_IEventConsumer *consumer = *iter;
44     delete consumer;
45     iter = m_consumers.erase(iter);
46   }
47 }
48
49 GHOST_TUns32 GHOST_EventManager::getNumEvents()
50 {
51   return (GHOST_TUns32)m_events.size();
52 }
53
54 GHOST_TUns32 GHOST_EventManager::getNumEvents(GHOST_TEventType type)
55 {
56   GHOST_TUns32 numEvents = 0;
57   TEventStack::iterator p;
58   for (p = m_events.begin(); p != m_events.end(); ++p) {
59     if ((*p)->getType() == type) {
60       numEvents++;
61     }
62   }
63   return numEvents;
64 }
65
66 GHOST_TSuccess GHOST_EventManager::pushEvent(GHOST_IEvent *event)
67 {
68   GHOST_TSuccess success;
69   GHOST_ASSERT(event, "invalid event");
70   if (m_events.size() < m_events.max_size()) {
71     m_events.push_front(event);
72     success = GHOST_kSuccess;
73   }
74   else {
75     success = GHOST_kFailure;
76   }
77   return success;
78 }
79
80 void GHOST_EventManager::dispatchEvent(GHOST_IEvent *event)
81 {
82   TConsumerVector::iterator iter;
83
84   for (iter = m_consumers.begin(); iter != m_consumers.end(); ++iter) {
85     (*iter)->processEvent(event);
86   }
87 }
88
89 void GHOST_EventManager::dispatchEvent()
90 {
91   GHOST_IEvent *event = m_events.back();
92   m_events.pop_back();
93   m_handled_events.push_back(event);
94
95   dispatchEvent(event);
96 }
97
98 void GHOST_EventManager::dispatchEvents()
99 {
100   while (!m_events.empty()) {
101     dispatchEvent();
102   }
103
104   disposeEvents();
105 }
106
107 GHOST_TSuccess GHOST_EventManager::addConsumer(GHOST_IEventConsumer *consumer)
108 {
109   GHOST_TSuccess success;
110   GHOST_ASSERT(consumer, "invalid consumer");
111
112   // Check to see whether the consumer is already in our list
113   TConsumerVector::const_iterator iter = std::find(
114       m_consumers.begin(), m_consumers.end(), consumer);
115
116   if (iter == m_consumers.end()) {
117     // Add the consumer
118     m_consumers.push_back(consumer);
119     success = GHOST_kSuccess;
120   }
121   else {
122     success = GHOST_kFailure;
123   }
124   return success;
125 }
126
127 GHOST_TSuccess GHOST_EventManager::removeConsumer(GHOST_IEventConsumer *consumer)
128 {
129   GHOST_TSuccess success;
130   GHOST_ASSERT(consumer, "invalid consumer");
131
132   // Check to see whether the consumer is in our list
133   TConsumerVector::iterator iter = std::find(m_consumers.begin(), m_consumers.end(), consumer);
134
135   if (iter != m_consumers.end()) {
136     // Remove the consumer
137     m_consumers.erase(iter);
138     success = GHOST_kSuccess;
139   }
140   else {
141     success = GHOST_kFailure;
142   }
143   return success;
144 }
145
146 void GHOST_EventManager::removeWindowEvents(GHOST_IWindow *window)
147 {
148   TEventStack::iterator iter;
149   iter = m_events.begin();
150   while (iter != m_events.end()) {
151     GHOST_IEvent *event = *iter;
152     if (event->getWindow() == window) {
153       GHOST_PRINT("GHOST_EventManager::removeWindowEvents(): removing event\n");
154       /*
155        * Found an event for this window, remove it.
156        * The iterator will become invalid.
157        */
158       delete event;
159       m_events.erase(iter);
160       iter = m_events.begin();
161     }
162     else {
163       ++iter;
164     }
165   }
166 }
167
168 void GHOST_EventManager::removeTypeEvents(GHOST_TEventType type, GHOST_IWindow *window)
169 {
170   TEventStack::iterator iter;
171   iter = m_events.begin();
172   while (iter != m_events.end()) {
173     GHOST_IEvent *event = *iter;
174     if ((event->getType() == type) && (!window || (event->getWindow() == window))) {
175       GHOST_PRINT("GHOST_EventManager::removeTypeEvents(): removing event\n");
176       /*
177        * Found an event of this type for the window, remove it.
178        * The iterator will become invalid.
179        */
180       delete event;
181       m_events.erase(iter);
182       iter = m_events.begin();
183     }
184     else {
185       ++iter;
186     }
187   }
188 }
189
190 void GHOST_EventManager::disposeEvents()
191 {
192   while (m_handled_events.empty() == false) {
193     GHOST_ASSERT(m_handled_events[0], "invalid event");
194     delete m_handled_events[0];
195     m_handled_events.pop_front();
196   }
197
198   while (m_events.empty() == false) {
199     GHOST_ASSERT(m_events[0], "invalid event");
200     delete m_events[0];
201     m_events.pop_front();
202   }
203 }