aboutsummaryrefslogtreecommitdiff
path: root/src/event_manager.h
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2012-03-23 20:23:03 +0200
committerPerttu Ahola <celeron55@gmail.com>2012-03-24 04:24:26 +0200
commit6c14025b2d416105915440e114de927c26e925ac (patch)
tree64396513416935f2c0eaf50115a61856bbc0f7f2 /src/event_manager.h
parente53794868eaa33199a1f1011b2d5f517b6f68057 (diff)
downloadminetest-6c14025b2d416105915440e114de927c26e925ac.tar.gz
minetest-6c14025b2d416105915440e114de927c26e925ac.tar.bz2
minetest-6c14025b2d416105915440e114de927c26e925ac.zip
Add event manager and use it to trigger sounds
Diffstat (limited to 'src/event_manager.h')
-rw-r--r--src/event_manager.h115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/event_manager.h b/src/event_manager.h
new file mode 100644
index 000000000..b33d5a295
--- /dev/null
+++ b/src/event_manager.h
@@ -0,0 +1,115 @@
+/*
+Minetest-c55
+Copyright (C) 2012 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef EVENT_MANAGER_HEADER
+#define EVENT_MANAGER_HEADER
+
+#include "event.h"
+#include <list>
+#include <map>
+
+class EventManager: public MtEventManager
+{
+ static void receiverReceive(MtEvent *e, void *data)
+ {
+ MtEventReceiver *r = (MtEventReceiver*)data;
+ r->onEvent(e);
+ }
+ struct FuncSpec{
+ event_receive_func f;
+ void *d;
+ FuncSpec(event_receive_func f, void *d):
+ f(f), d(d)
+ {}
+ };
+ struct Dest{
+ std::list<FuncSpec> funcs;
+ };
+ std::map<std::string, Dest> m_dest;
+
+public:
+ ~EventManager()
+ {
+ }
+ void put(MtEvent *e)
+ {
+ std::map<std::string, Dest>::iterator i = m_dest.find(e->getType());
+ if(i != m_dest.end()){
+ std::list<FuncSpec> &funcs = i->second.funcs;
+ for(std::list<FuncSpec>::iterator i = funcs.begin();
+ i != funcs.end(); i++){
+ (*(i->f))(e, i->d);
+ }
+ }
+ delete e;
+ }
+ void reg(const char *type, event_receive_func f, void *data)
+ {
+ std::map<std::string, Dest>::iterator i = m_dest.find(type);
+ if(i != m_dest.end()){
+ i->second.funcs.push_back(FuncSpec(f, data));
+ } else{
+ std::list<FuncSpec> funcs;
+ Dest dest;
+ dest.funcs.push_back(FuncSpec(f, data));
+ m_dest[type] = dest;
+ }
+ }
+ void dereg(const char *type, event_receive_func f, void *data)
+ {
+ if(type != NULL){
+ std::map<std::string, Dest>::iterator i = m_dest.find(type);
+ if(i != m_dest.end()){
+ std::list<FuncSpec> &funcs = i->second.funcs;
+ std::list<FuncSpec>::iterator i = funcs.begin();
+ while(i != funcs.end()){
+ bool remove = (i->f == f && (!data || i->d == data));
+ if(remove)
+ funcs.erase(i++);
+ else
+ i++;
+ }
+ }
+ } else{
+ for(std::map<std::string, Dest>::iterator
+ i = m_dest.begin(); i != m_dest.end(); i++){
+ std::list<FuncSpec> &funcs = i->second.funcs;
+ std::list<FuncSpec>::iterator i = funcs.begin();
+ while(i != funcs.end()){
+ bool remove = (i->f == f && (!data || i->d == data));
+ if(remove)
+ funcs.erase(i++);
+ else
+ i++;
+ }
+ }
+ }
+ }
+ void reg(MtEventReceiver *r, const char *type)
+ {
+ reg(type, EventManager::receiverReceive, r);
+ }
+ void dereg(MtEventReceiver *r, const char *type)
+ {
+ dereg(type, EventManager::receiverReceive, r);
+ }
+};
+
+#endif
+