mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-01 13:56:38 +00:00 
			
		
		
		
	Added input component
This commit is contained in:
		
							parent
							
								
									1af84ad852
								
							
						
					
					
						commit
						5d73b47cc0
					
				
					 18 changed files with 570 additions and 0 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							|  | @ -1,2 +1,3 @@ | ||||||
| *~ | *~ | ||||||
| *.o | *.o | ||||||
|  | *_test | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | ||||||
|  | [submodule "mangle"] | ||||||
|  | 	path = mangle | ||||||
|  | 	url = git://github.com/korslund/mangle | ||||||
							
								
								
									
										75
									
								
								input/dispatch_map.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								input/dispatch_map.hpp
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,75 @@ | ||||||
|  | #ifndef _INPUT_DISPATCHMAP_H | ||||||
|  | #define _INPUT_DISPATCHMAP_H | ||||||
|  | 
 | ||||||
|  | #include <set> | ||||||
|  | #include <map> | ||||||
|  | #include <assert.h> | ||||||
|  | 
 | ||||||
|  | namespace Input { | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |    DispatchMap is a simple connection system that connects incomming | ||||||
|  |    signals with outgoing signals. | ||||||
|  | 
 | ||||||
|  |    The signals can be connected one-to-one, many-to-one, one-to-many | ||||||
|  |    or many-to-many. | ||||||
|  | 
 | ||||||
|  |    The dispatch map is completely system agnostic. It is a pure data | ||||||
|  |    structure and all signals are just integer indices. It does not | ||||||
|  |    delegate any actions, but used together with Dispatcher it can be | ||||||
|  |    used to build an event system. | ||||||
|  |  */ | ||||||
|  | struct DispatchMap | ||||||
|  | { | ||||||
|  |   typedef std::set<int> OutList; | ||||||
|  |   typedef std::map<int, OutList> InMap; | ||||||
|  | 
 | ||||||
|  |   typedef OutList::iterator Oit; | ||||||
|  |   typedef InMap::iterator Iit; | ||||||
|  | 
 | ||||||
|  |   InMap map; | ||||||
|  | 
 | ||||||
|  |   void bind(int in, int out) | ||||||
|  |   { | ||||||
|  |     map[in].insert(out); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   void unbind(int in, int out) | ||||||
|  |   { | ||||||
|  |     Iit it = map.find(in); | ||||||
|  |     if(it != map.end()) | ||||||
|  |       { | ||||||
|  |         it->second.erase(out); | ||||||
|  | 
 | ||||||
|  |         // If there are no more elements, then remove the entire list
 | ||||||
|  |         if(it->second.empty()) | ||||||
|  |           map.erase(it); | ||||||
|  |       } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /// Check if a given input is bound to anything
 | ||||||
|  |   bool isBound(int in) const | ||||||
|  |   { | ||||||
|  |     return map.find(in) != map.end(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /**
 | ||||||
|  |      Get the list of outputs bound to the given input. Only call this | ||||||
|  |      on inputs that you know are bound to something. | ||||||
|  | 
 | ||||||
|  |      The returned set is only intended for immediate iteration. Do not | ||||||
|  |      store references to it. | ||||||
|  |   */ | ||||||
|  |   const OutList &getList(int in) const | ||||||
|  |   { | ||||||
|  |     assert(isBound(in)); | ||||||
|  |     InMap::const_iterator it = map.find(in); | ||||||
|  |     assert(it != map.end()); | ||||||
|  |     const OutList &out = it->second; | ||||||
|  |     assert(!out.empty()); | ||||||
|  |     return out; | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | #endif | ||||||
							
								
								
									
										49
									
								
								input/dispatcher.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								input/dispatcher.hpp
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,49 @@ | ||||||
|  | #ifndef _INPUT_DISPATCHER_H | ||||||
|  | #define _INPUT_DISPATCHER_H | ||||||
|  | 
 | ||||||
|  | #include "dispatch_map.hpp" | ||||||
|  | #include "func_binder.hpp" | ||||||
|  | #include <mangle/input/event.hpp> | ||||||
|  | 
 | ||||||
|  | namespace Input { | ||||||
|  | 
 | ||||||
|  | struct Dispatcher : Mangle::Input::Event | ||||||
|  | { | ||||||
|  |   DispatchMap map; | ||||||
|  |   FuncBinder funcs; | ||||||
|  | 
 | ||||||
|  |   /**
 | ||||||
|  |      Constructor. Takes the number of actions and passes it to | ||||||
|  |      FuncBinder. | ||||||
|  |   */ | ||||||
|  |   Dispatcher(int actions) : funcs(actions) {} | ||||||
|  | 
 | ||||||
|  |   void bind(int action, int key) { map.bind(key, action); } | ||||||
|  |   void unbind(int action, int key) { map.unbind(key, action); } | ||||||
|  |   bool isBound(int key) const { return map.isBound(key); } | ||||||
|  | 
 | ||||||
|  |   /**
 | ||||||
|  |      Instigate an event. It is translated through the dispatch map and | ||||||
|  |      sent to the function bindings. | ||||||
|  |    */ | ||||||
|  |   typedef DispatchMap::OutList _O; | ||||||
|  |   void event(Type type, int index, const void* p) | ||||||
|  |   { | ||||||
|  |     // No bindings, nothing happens
 | ||||||
|  |     if(!isBound(index)) | ||||||
|  |       return; | ||||||
|  | 
 | ||||||
|  |     // Only treat key-down events for now
 | ||||||
|  |     if(type != EV_KeyDown) | ||||||
|  |       return; | ||||||
|  | 
 | ||||||
|  |     // Get the mapped actions and execute them
 | ||||||
|  |     const _O &list = map.getList(index); | ||||||
|  |     _O::const_iterator it; | ||||||
|  |     for(it = list.begin(); it != list.end(); it++) | ||||||
|  |       funcs.call(*it, p); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | #endif | ||||||
							
								
								
									
										104
									
								
								input/func_binder.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								input/func_binder.hpp
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,104 @@ | ||||||
|  | #ifndef _INPUT_FUNCBINDER_H | ||||||
|  | #define _INPUT_FUNCBINDER_H | ||||||
|  | 
 | ||||||
|  | #include <string> | ||||||
|  | #include <vector> | ||||||
|  | #include <boost/function.hpp> | ||||||
|  | #include <assert.h> | ||||||
|  | 
 | ||||||
|  | namespace Input { | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |    An Action defines the user defined action corresponding to a | ||||||
|  |    binding. | ||||||
|  | 
 | ||||||
|  |    The first parameter is the action index that invoked this call. You | ||||||
|  |    can assign the same function to multiple actions, and this can help | ||||||
|  |    you keep track of which action was invoked. | ||||||
|  | 
 | ||||||
|  |    The second parameter is an optional user-defined parameter, | ||||||
|  |    represented by a void pointer. In many cases it is practical to | ||||||
|  |    point this to temporaries (stack values), so make sure not to store | ||||||
|  |    permanent references to it unless you've planning for this on the | ||||||
|  |    calling side as well. | ||||||
|  |  */ | ||||||
|  | typedef boost::function<void(int,const void*)> Action; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |    The FuncBinder is a simple struct that binds user-defined indices | ||||||
|  |    to functions. It is useful for binding eg. keyboard events to | ||||||
|  |    specific actions in your program, but can potentially have many | ||||||
|  |    other uses as well. | ||||||
|  |  */ | ||||||
|  | class FuncBinder | ||||||
|  | { | ||||||
|  |   struct FuncBinding | ||||||
|  |   { | ||||||
|  |     std::string name; | ||||||
|  |     Action action; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   std::vector<FuncBinding> bindings; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  |   /**
 | ||||||
|  |      Constructor. Initialize the struct by telling it how many action | ||||||
|  |      indices you intend to bind. | ||||||
|  | 
 | ||||||
|  |      The indices you use should be 0 <= i < number. | ||||||
|  |   */ | ||||||
|  |   FuncBinder(int number) : bindings(number) {} | ||||||
|  | 
 | ||||||
|  |   /**
 | ||||||
|  |      Bind an action to an index. | ||||||
|  |    */ | ||||||
|  |   void bind(int index, Action action, const std::string &name="") | ||||||
|  |   { | ||||||
|  |     assert(index >= 0 && index < (int)bindings.size()); | ||||||
|  | 
 | ||||||
|  |     FuncBinding &fb = bindings[index]; | ||||||
|  |     fb.action = action; | ||||||
|  |     fb.name = name; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /**
 | ||||||
|  |      Unbind an index, reverting a previous bind(). | ||||||
|  |    */ | ||||||
|  |   void unbind(int index) | ||||||
|  |   { | ||||||
|  |     assert(index >= 0 && index < (int)bindings.size()); | ||||||
|  | 
 | ||||||
|  |     bindings[index] = FuncBinding(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /**
 | ||||||
|  |      Call a specific action. Takes an optional parameter that is | ||||||
|  |      passed to the action. | ||||||
|  |    */ | ||||||
|  |   void call(int index, const void *p=NULL) const | ||||||
|  |   { | ||||||
|  |     assert(index >= 0 && index < (int)bindings.size()); | ||||||
|  | 
 | ||||||
|  |     const FuncBinding &fb = bindings[index]; | ||||||
|  |     if(fb.action) fb.action(index, p); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /// Check if a given index is bound to anything
 | ||||||
|  |   bool isBound(int index) const | ||||||
|  |   { | ||||||
|  |     assert(index >= 0 && index < (int)bindings.size()); | ||||||
|  | 
 | ||||||
|  |     return !bindings[index].action.empty(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /// Return the name associated with an action (empty if not bound)
 | ||||||
|  |   const std::string &getName(int index) const | ||||||
|  |   { | ||||||
|  |     assert(index >= 0 && index < (int)bindings.size()); | ||||||
|  | 
 | ||||||
|  |     return bindings[index].name; | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | #endif | ||||||
							
								
								
									
										46
									
								
								input/poller.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								input/poller.hpp
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | ||||||
|  | #ifndef _INPUT_POLLER_H | ||||||
|  | #define _INPUT_POLLER_H | ||||||
|  | 
 | ||||||
|  | #include "dispatch_map.hpp" | ||||||
|  | #include <mangle/input/driver.hpp> | ||||||
|  | 
 | ||||||
|  | namespace Input { | ||||||
|  | 
 | ||||||
|  | /** The poller is used to check (poll) for keys rather than waiting
 | ||||||
|  |     for events. */ | ||||||
|  | struct Poller | ||||||
|  | { | ||||||
|  |   DispatchMap map; | ||||||
|  |   Mangle::Input::Driver &input; | ||||||
|  | 
 | ||||||
|  |   Poller(Mangle::Input::Driver &drv) | ||||||
|  |     : input(drv) {} | ||||||
|  | 
 | ||||||
|  |   /** Bind or unbind a given action with a key. The action is the first
 | ||||||
|  |       parameter, the key is the second. | ||||||
|  |   */ | ||||||
|  |   void bind(int in, int out) { map.bind(in, out); } | ||||||
|  |   void unbind(int in, int out) { map.unbind(in, out); } | ||||||
|  |   bool isBound(int in) const { return map.isBound(in); } | ||||||
|  | 
 | ||||||
|  |   /// Check whether a given action button is currently pressed.
 | ||||||
|  |   typedef DispatchMap::OutList _O; | ||||||
|  |   bool isDown(int index) const | ||||||
|  |   { | ||||||
|  |     // No bindings, no action
 | ||||||
|  |     if(!isBound(index)) | ||||||
|  |       return false; | ||||||
|  | 
 | ||||||
|  |     // Get all the keys bound to this action, and check them.
 | ||||||
|  |     const _O &list = map.getList(index); | ||||||
|  |     _O::const_iterator it; | ||||||
|  |     for(it = list.begin(); it != list.end(); it++) | ||||||
|  |       // If there's any match, we're good to go.
 | ||||||
|  |       if(input.isDown(*it)) return true; | ||||||
|  | 
 | ||||||
|  |     return false; | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | #endif | ||||||
							
								
								
									
										18
									
								
								input/tests/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								input/tests/Makefile
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | ||||||
|  | GCC=g++ | ||||||
|  | 
 | ||||||
|  | all: funcbind_test dispatch_map_test sdl_driver_test sdl_binder_test | ||||||
|  | 
 | ||||||
|  | funcbind_test: funcbind_test.cpp ../func_binder.hpp | ||||||
|  | 	$(GCC) $< -o $@ | ||||||
|  | 
 | ||||||
|  | dispatch_map_test: dispatch_map_test.cpp ../dispatch_map.hpp | ||||||
|  | 	$(GCC) $< -o $@ | ||||||
|  | 
 | ||||||
|  | sdl_driver_test: sdl_driver_test.cpp | ||||||
|  | 	$(GCC) $< ../../mangle/input/servers/sdl_driver.cpp -o $@ -I/usr/include/SDL/ -lSDL -I../../ | ||||||
|  | 
 | ||||||
|  | sdl_binder_test: sdl_binder_test.cpp | ||||||
|  | 	$(GCC) $< ../../mangle/input/servers/sdl_driver.cpp -o $@ -I/usr/include/SDL/ -lSDL -I../../ | ||||||
|  | 
 | ||||||
|  | clean: | ||||||
|  | 	rm *_test | ||||||
							
								
								
									
										54
									
								
								input/tests/dispatch_map_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								input/tests/dispatch_map_test.cpp
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,54 @@ | ||||||
|  | #include <iostream> | ||||||
|  | using namespace std; | ||||||
|  | 
 | ||||||
|  | #include "../dispatch_map.hpp" | ||||||
|  | 
 | ||||||
|  | using namespace Input; | ||||||
|  | 
 | ||||||
|  | typedef DispatchMap::OutList OutList; | ||||||
|  | typedef OutList::const_iterator Cit; | ||||||
|  | 
 | ||||||
|  | void showList(const DispatchMap::OutList &out) | ||||||
|  | { | ||||||
|  |   for(Cit it = out.begin(); | ||||||
|  |       it != out.end(); it++) | ||||||
|  |     { | ||||||
|  |       cout << "  " << *it << endl; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void showAll(DispatchMap &map) | ||||||
|  | { | ||||||
|  |   cout << "\nPrinting everything:\n"; | ||||||
|  |   for(DispatchMap::Iit it = map.map.begin(); | ||||||
|  |       it != map.map.end(); it++) | ||||||
|  |     { | ||||||
|  |       cout << it->first << ":\n"; | ||||||
|  |       showList(map.getList(it->first)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |   cout << "Testing the dispatch map\n"; | ||||||
|  | 
 | ||||||
|  |   DispatchMap dsp; | ||||||
|  | 
 | ||||||
|  |   dsp.bind(1,9); | ||||||
|  |   dsp.bind(2,-5); | ||||||
|  |   dsp.bind(2,9); | ||||||
|  |   dsp.bind(3,10); | ||||||
|  |   dsp.bind(3,12); | ||||||
|  |   dsp.bind(3,10); | ||||||
|  | 
 | ||||||
|  |   showAll(dsp); | ||||||
|  | 
 | ||||||
|  |   dsp.unbind(1,9); | ||||||
|  |   dsp.unbind(5,8); | ||||||
|  |   dsp.unbind(3,11); | ||||||
|  |   dsp.unbind(3,12); | ||||||
|  |   dsp.unbind(3,12); | ||||||
|  | 
 | ||||||
|  |   showAll(dsp); | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
							
								
								
									
										47
									
								
								input/tests/funcbind_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								input/tests/funcbind_test.cpp
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | ||||||
|  | #include <iostream> | ||||||
|  | using namespace std; | ||||||
|  | 
 | ||||||
|  | #include "../func_binder.hpp" | ||||||
|  | 
 | ||||||
|  | void f1(int i, const void *p) | ||||||
|  | { | ||||||
|  |   cout << "  F1 i=" << i << endl; | ||||||
|  | 
 | ||||||
|  |   if(p) | ||||||
|  |     cout << "  Got a nice gift: " | ||||||
|  |          << *((const float*)p) << endl; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void f2(int i, const void *p) | ||||||
|  | { | ||||||
|  |   cout << "  F2 i=" << i << endl; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | using namespace Input; | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |   cout << "This will test the function binding system\n"; | ||||||
|  | 
 | ||||||
|  |   FuncBinder bnd(5); | ||||||
|  | 
 | ||||||
|  |   bnd.bind(0, &f1, "This is action 1"); | ||||||
|  |   bnd.bind(1, &f2); | ||||||
|  |   bnd.bind(2, &f1, "This is action 3"); | ||||||
|  |   bnd.bind(3, &f2, "This is action 4"); | ||||||
|  | 
 | ||||||
|  |   bnd.unbind(2); | ||||||
|  | 
 | ||||||
|  |   for(int i=0; i<5; i++) | ||||||
|  |     { | ||||||
|  |       cout << "Calling " << i << ": '" << bnd.getName(i) << "'\n"; | ||||||
|  |       bnd.call(i); | ||||||
|  |       if(!bnd.isBound(i)) cout << "  (not bound)\n"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |   cout << "\nCalling with parameter:\n"; | ||||||
|  |   float f = 3.1415; | ||||||
|  |   bnd.call(0, &f); | ||||||
|  | 
 | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								input/tests/output/dispatch_map_test.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								input/tests/output/dispatch_map_test.out
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | ||||||
|  | Testing the dispatch map | ||||||
|  | 
 | ||||||
|  | Printing everything: | ||||||
|  | 1: | ||||||
|  |   9 | ||||||
|  | 2: | ||||||
|  |   -5 | ||||||
|  |   9 | ||||||
|  | 3: | ||||||
|  |   10 | ||||||
|  |   12 | ||||||
|  | 
 | ||||||
|  | Printing everything: | ||||||
|  | 2: | ||||||
|  |   -5 | ||||||
|  |   9 | ||||||
|  | 3: | ||||||
|  |   10 | ||||||
							
								
								
									
										15
									
								
								input/tests/output/funcbind_test.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								input/tests/output/funcbind_test.out
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | ||||||
|  | This will test the function binding system | ||||||
|  | Calling 0: 'This is action 1' | ||||||
|  |   F1 i=0 | ||||||
|  | Calling 1: '' | ||||||
|  |   F2 i=1 | ||||||
|  | Calling 2: '' | ||||||
|  |   (not bound) | ||||||
|  | Calling 3: 'This is action 4' | ||||||
|  |   F2 i=3 | ||||||
|  | Calling 4: '' | ||||||
|  |   (not bound) | ||||||
|  | 
 | ||||||
|  | Calling with parameter: | ||||||
|  |   F1 i=0 | ||||||
|  |   Got a nice gift: 3.1415 | ||||||
							
								
								
									
										4
									
								
								input/tests/output/sdl_binder_test.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								input/tests/output/sdl_binder_test.out
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,4 @@ | ||||||
|  | Hold the Q key to quit: | ||||||
|  | You are running in script mode, aborting. Run this test with a parameter (any at all) to test the input loop properly | ||||||
|  | 
 | ||||||
|  | Bye bye! | ||||||
							
								
								
									
										4
									
								
								input/tests/output/sdl_driver_test.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								input/tests/output/sdl_driver_test.out
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,4 @@ | ||||||
|  | Hold the Q key to quit: | ||||||
|  | You are running in script mode, aborting. Run this test with a parameter (any at all) to test the input loop properly | ||||||
|  | 
 | ||||||
|  | Bye bye! | ||||||
							
								
								
									
										71
									
								
								input/tests/sdl_binder_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								input/tests/sdl_binder_test.cpp
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,71 @@ | ||||||
|  | #include <iostream> | ||||||
|  | #include <mangle/input/servers/sdl_driver.hpp> | ||||||
|  | #include <SDL.h> | ||||||
|  | #include "../dispatcher.hpp" | ||||||
|  | #include "../poller.hpp" | ||||||
|  | 
 | ||||||
|  | using namespace std; | ||||||
|  | using namespace Mangle::Input; | ||||||
|  | using namespace Input; | ||||||
|  | 
 | ||||||
|  | enum Actions | ||||||
|  |   { | ||||||
|  |     A_Quit, | ||||||
|  |     A_Left, | ||||||
|  |     A_Right, | ||||||
|  | 
 | ||||||
|  |     A_LAST | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  | bool quit=false; | ||||||
|  | 
 | ||||||
|  | void doExit(int,const void*) | ||||||
|  | { | ||||||
|  |   quit = true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void goLeft(int,const void*) | ||||||
|  | { | ||||||
|  |   cout << "Going left\n"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main(int argc, char** argv) | ||||||
|  | { | ||||||
|  |   SDL_Init(SDL_INIT_VIDEO); | ||||||
|  |   SDL_SetVideoMode(640, 480, 0, SDL_SWSURFACE); | ||||||
|  |   SDLDriver input; | ||||||
|  |   Dispatcher disp(A_LAST); | ||||||
|  |   Poller poll(input); | ||||||
|  | 
 | ||||||
|  |   input.setEvent(&disp); | ||||||
|  | 
 | ||||||
|  |   disp.funcs.bind(A_Quit, &doExit); | ||||||
|  |   disp.funcs.bind(A_Left, &goLeft); | ||||||
|  | 
 | ||||||
|  |   disp.bind(A_Quit, SDLK_q); | ||||||
|  |   disp.bind(A_Left, SDLK_a); | ||||||
|  |   disp.bind(A_Left, SDLK_LEFT); | ||||||
|  | 
 | ||||||
|  |   poll.bind(A_Right, SDLK_d); | ||||||
|  |   poll.bind(A_Right, SDLK_RIGHT); | ||||||
|  | 
 | ||||||
|  |   cout << "Hold the Q key to quit:\n"; | ||||||
|  |   //input->setEvent(&mycb);
 | ||||||
|  |   while(!quit) | ||||||
|  |     { | ||||||
|  |       input.capture(); | ||||||
|  |       if(poll.isDown(A_Right)) | ||||||
|  |         cout << "We're going right!\n"; | ||||||
|  |       SDL_Delay(20); | ||||||
|  | 
 | ||||||
|  |       if(argc == 1) | ||||||
|  |         { | ||||||
|  |           cout << "You are running in script mode, aborting. Run this test with a parameter (any at all) to test the input loop properly\n"; | ||||||
|  |           break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |   cout << "\nBye bye!\n"; | ||||||
|  | 
 | ||||||
|  |   SDL_Quit(); | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
							
								
								
									
										31
									
								
								input/tests/sdl_driver_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								input/tests/sdl_driver_test.cpp
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,31 @@ | ||||||
|  | #include <iostream> | ||||||
|  | #include <mangle/input/servers/sdl_driver.hpp> | ||||||
|  | #include <SDL.h> | ||||||
|  | 
 | ||||||
|  | using namespace std; | ||||||
|  | using namespace Mangle::Input; | ||||||
|  | 
 | ||||||
|  | int main(int argc, char** argv) | ||||||
|  | { | ||||||
|  |   SDL_Init(SDL_INIT_VIDEO); | ||||||
|  |   SDL_SetVideoMode(640, 480, 0, SDL_SWSURFACE); | ||||||
|  |   SDLDriver input; | ||||||
|  | 
 | ||||||
|  |   cout << "Hold the Q key to quit:\n"; | ||||||
|  |   //input->setEvent(&mycb);
 | ||||||
|  |   while(!input.isDown(SDLK_q)) | ||||||
|  |     { | ||||||
|  |       input.capture(); | ||||||
|  |       SDL_Delay(20); | ||||||
|  | 
 | ||||||
|  |       if(argc == 1) | ||||||
|  |         { | ||||||
|  |           cout << "You are running in script mode, aborting. Run this test with a parameter (any at all) to test the input loop properly\n"; | ||||||
|  |           break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |   cout << "\nBye bye!\n"; | ||||||
|  | 
 | ||||||
|  |   SDL_Quit(); | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								input/tests/test.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										18
									
								
								input/tests/test.sh
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,18 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | 
 | ||||||
|  | make || exit | ||||||
|  | 
 | ||||||
|  | mkdir -p output | ||||||
|  | 
 | ||||||
|  | PROGS=*_test | ||||||
|  | 
 | ||||||
|  | for a in $PROGS; do | ||||||
|  |     if [ -f "output/$a.out" ]; then | ||||||
|  |         echo "Running $a:" | ||||||
|  |         ./$a | diff output/$a.out - | ||||||
|  |     else | ||||||
|  |         echo "Creating $a.out" | ||||||
|  |         ./$a > "output/$a.out" | ||||||
|  |         git add "output/$a.out" | ||||||
|  |     fi | ||||||
|  | done | ||||||
							
								
								
									
										1
									
								
								mangle
									
									
									
									
									
										Submodule
									
								
							
							
						
						
									
										1
									
								
								mangle
									
									
									
									
									
										Submodule
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | Subproject commit 7583fc3f1bfa6d0fde56c925da959a5e9e50031a | ||||||
							
								
								
									
										11
									
								
								testall.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										11
									
								
								testall.sh
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,11 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | 
 | ||||||
|  | function run() | ||||||
|  | { | ||||||
|  |   echo "TESTING $1" | ||||||
|  |   cd "$1/tests/" | ||||||
|  |   ./test.sh | ||||||
|  |   cd ../../ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | run input | ||||||
		Loading…
	
		Reference in a new issue