diff options
| author | Stijn Buys <ingar@osirion.org> | 2008-07-21 22:03:26 +0000 | 
|---|---|---|
| committer | Stijn Buys <ingar@osirion.org> | 2008-07-21 22:03:26 +0000 | 
| commit | 980c5c41dc8e88ab3e7a5751348a92a0662a2ea4 (patch) | |
| tree | 638fc130c94973038b76b50c1fd68a74c2dcdd9f /src/client/keyboard.cc | |
| parent | 5a4bcd856787af106807b0b18fba8e4e2fae63ef (diff) | |
prepare keybinds for modifier keys, fix for the camera clipping issue
Diffstat (limited to 'src/client/keyboard.cc')
| -rw-r--r-- | src/client/keyboard.cc | 211 | 
1 files changed, 116 insertions, 95 deletions
diff --git a/src/client/keyboard.cc b/src/client/keyboard.cc index 8295fce..170fbd1 100644 --- a/src/client/keyboard.cc +++ b/src/client/keyboard.cc @@ -15,7 +15,8 @@  #include "filesystem/filesystem.h"  #include "sys/sys.h" -namespace client { +namespace client +{  /*  Notes: @@ -29,25 +30,25 @@ Keyboard::Keyboard()  	add_key("backspace", SDLK_BACKSPACE);  	add_key("tab", SDLK_TAB); -   	add_key("clear", SDLK_CLEAR); -   	add_key("enter", SDLK_RETURN); -   	add_key("pause", SDLK_PAUSE); -   	add_key("esc", SDLK_ESCAPE); -   	add_key("space", SDLK_SPACE, ' ', "ui_control"); -   	add_key("!", SDLK_EXCLAIM, '!'); -   	add_key("\"", SDLK_QUOTEDBL, '"'); -   	add_key("#", SDLK_HASH, '#'); -   	add_key("$", SDLK_DOLLAR, '$'); -   	add_key("&", SDLK_AMPERSAND, '&'); -   	add_key("'", SDLK_QUOTE, '\''); +	add_key("clear", SDLK_CLEAR); +	add_key("enter", SDLK_RETURN); +	add_key("pause", SDLK_PAUSE); +	add_key("esc", SDLK_ESCAPE); +	add_key("space", SDLK_SPACE, ' ', "ui_control"); +	add_key("!", SDLK_EXCLAIM, '!'); +	add_key("\"", SDLK_QUOTEDBL, '"'); +	add_key("#", SDLK_HASH, '#'); +	add_key("$", SDLK_DOLLAR, '$'); +	add_key("&", SDLK_AMPERSAND, '&'); +	add_key("'", SDLK_QUOTE, '\'');  	add_key("(", SDLK_LEFTPAREN, '('); -   	add_key(")", SDLK_RIGHTPAREN, ')'); -   	add_key("*", SDLK_ASTERISK, '*'); -   	add_key("+", SDLK_PLUS, '+'); -   	add_key(",", SDLK_COMMA, ','); -   	add_key("-", SDLK_MINUS, '-'); -   	add_key(".", SDLK_PERIOD, '.'); -   	add_key("/", SDLK_SLASH, '/'); +	add_key(")", SDLK_RIGHTPAREN, ')'); +	add_key("*", SDLK_ASTERISK, '*'); +	add_key("+", SDLK_PLUS, '+'); +	add_key(",", SDLK_COMMA, ','); +	add_key("-", SDLK_MINUS, '-'); +	add_key(".", SDLK_PERIOD, '.'); +	add_key("/", SDLK_SLASH, '/');  	add_key("0", SDLK_0, '0');  	add_key("1", SDLK_1, '1'); @@ -61,18 +62,18 @@ Keyboard::Keyboard()  	add_key("9", SDLK_9, '9');  	add_key(":", SDLK_COLON, ':'); -   	add_key(";", SDLK_SEMICOLON, ';'); -   	add_key("<", SDLK_LESS, '<'); -   	add_key("=", SDLK_EQUALS, '='); -   	add_key(">", SDLK_GREATER, '>'); -   	add_key("?", SDLK_QUESTION, '?'); -  	add_key("@", SDLK_AT, '@'); -   	add_key("[", SDLK_LEFTBRACKET, '['); -   	add_key("\\", SDLK_BACKSLASH, '\\'); -   	add_key("]", SDLK_RIGHTBRACKET, ']'); -   	add_key("^", SDLK_CARET, '^'); -   	add_key("_", SDLK_UNDERSCORE, '_'); -   	add_key("`", SDLK_BACKQUOTE, '`', "ui_console"); +	add_key(";", SDLK_SEMICOLON, ';'); +	add_key("<", SDLK_LESS, '<'); +	add_key("=", SDLK_EQUALS, '='); +	add_key(">", SDLK_GREATER, '>'); +	add_key("?", SDLK_QUESTION, '?'); +	add_key("@", SDLK_AT, '@'); +	add_key("[", SDLK_LEFTBRACKET, '['); +	add_key("\\", SDLK_BACKSLASH, '\\'); +	add_key("]", SDLK_RIGHTBRACKET, ']'); +	add_key("^", SDLK_CARET, '^'); +	add_key("_", SDLK_UNDERSCORE, '_'); +	add_key("`", SDLK_BACKQUOTE, '`', "ui_console");  	add_key("a", SDLK_a, 'a');  	add_key("b", SDLK_b, 'b'); @@ -112,7 +113,7 @@ Keyboard::Keyboard()  	add_key("kp7", SDLK_KP7);  	add_key("kp8", SDLK_KP8, 0, "+down");  	add_key("kp9", SDLK_KP9); -  +  	add_key("kpperiod", SDLK_KP_PERIOD, '.');  	add_key("kpdiv", SDLK_KP_DIVIDE, '/', "+rollleft");  	add_key("kpmul", SDLK_KP_MULTIPLY, '*', "+rollright"); @@ -120,7 +121,7 @@ Keyboard::Keyboard()  	add_key("kpplus", SDLK_KP_PLUS, '+', "+thrust");  	add_key("kpenter", SDLK_KP_ENTER, '\n');  	add_key("kpequal", SDLK_KP_EQUALS, '='); -	 +  	add_key("up", SDLK_UP, 0, "+camup");  	add_key("down", SDLK_DOWN, 0, "+camdown");  	add_key("right", SDLK_RIGHT, 0, "+camright"); @@ -147,7 +148,7 @@ Keyboard::Keyboard()  	add_key("f13", SDLK_F13);  	add_key("f14", SDLK_F14);  	add_key("f15", SDLK_F15); -	 +  	add_key("numlock", SDLK_NUMLOCK);  	add_key("capslock", SDLK_CAPSLOCK);  	add_key("scrollock", SDLK_SCROLLOCK); @@ -170,7 +171,7 @@ Keyboard::Keyboard()  	add_key("help", SDLK_HELP);  	add_key("print", SDLK_PRINT, 0, "screenshot");  	add_key("sysrq", SDLK_SYSREQ); -	add_key("breal", SDLK_BREAK); +	add_key("break", SDLK_BREAK);  	add_key("menu", SDLK_MENU);  	add_key("power", SDLK_POWER);  	add_key("euro", SDLK_EURO); @@ -186,8 +187,8 @@ Keyboard::Keyboard()  Keyboard::~Keyboard()  { -	for(iterator it = begin(); it != end(); it++) -		delete (*it).second; +	for (iterator it = begin(); it != end(); it++) +		delete(*it).second;  	keys.clear();  } @@ -211,8 +212,8 @@ void Keyboard::save_binds()  	iterator it;  	for (it = begin(); it != end(); it++) {  		Key *key = (*it).second; -		if (key->bind().size()) { -			ofs << "bind " << key->name() << " " << key->bind()  << std::endl; +		if (key->bind(Key::None).size()) { +			ofs << "bind " << key->name() << " " << key->bind(Key::None)  << std::endl;  		}  		/*  		} else { @@ -241,7 +242,7 @@ void Keyboard::load_binds()  		if (line[0] && line[0] != '#' && line[0] != ';')  			core::cmd() << line << '\n';  	} -	 +  	// execute commands in the buffer  	core::CommandBuffer::exec();  } @@ -251,7 +252,7 @@ Key * Keyboard::release(unsigned int sym)  	if (!key) {  		return 0;  	} -	 +  	key->pressed() = 0;  	return key;  } @@ -262,7 +263,7 @@ Key * Keyboard::press(unsigned int sym)  	if (!key) {  		return 0;  	} -	 +  	if (!key->pressed())  		key->pressed() = core::application()->time(); @@ -293,8 +294,7 @@ void Keyboard::bind(std::string const &name, const std::string str)  {  	Key *key = find(name);  	if (key) { -		key->bind().assign(str); -		aux::trim(key->bind()); +		key->assign(Key::None, str.c_str());  	} else {  		con_print << "Key '" << name << "' not found." << std::endl;  	} @@ -304,12 +304,20 @@ void Keyboard::unbind(std::string const &name)  {  	Key *key = find(name);  	if (key) { -		key->bind().clear(); +		key->clear(Key::None);  	} else {  		con_print << "Key '" << name << "' not found." << std::endl;  	}  } +void Keyboard::unbindall() +{ +	for (iterator it = begin(); it != end(); it++) { +		Key *key = (*it).second; +		key->clear(); +	} +} +  void Keyboard::add_key(const char *name, const unsigned int keysym, const char ascii, const char *bind)  {  	keys[keysym] = new Key(name, keysym, ascii, bind); @@ -318,7 +326,7 @@ void Keyboard::add_key(const char *name, const unsigned int keysym, const char a  void Keyboard::list_keys()  {  	for (iterator it = begin(); it != end(); it++) { -		con_print << "  " << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind() << std::endl; +		con_print << "  " << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind(Key::None) << std::endl;  	}  	con_print  << keys.size() << " keys" << std::endl;  } @@ -327,36 +335,49 @@ void Keyboard::list_binds()  {  	size_t n =0;  	for (iterator it = begin(); it != end(); it++) { -		if ((*it).second->bind().size()) { -			con_print << "  " << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind() << std::endl; +		if ((*it).second->bind(Key::None).size()) { +			con_print << "       " << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind(Key::None) << std::endl;  			n++;  		} +		if ((*it).second->bind(Key::Shift).size()) { +			con_print << " shift+" << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind(Key::Shift) << std::endl; +			n++; +		} +		if ((*it).second->bind(Key::Ctrl).size()) { +			con_print << "  ctrl+" << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind(Key::Ctrl) << std::endl; +			n++; +		} +		if ((*it).second->bind(Key::Alt).size()) { +			con_print << "   alt+" << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind(Key::Alt) << std::endl; +			n++; +		} +  	}  	con_print  << n << " binds" << std::endl;  }  void setkeyboardmode(bool input)  { -/*	if(input) -		SDL_EnableKeyRepeat(250,  SDL_DEFAULT_REPEAT_INTERVAL); -	else -		SDL_EnableKeyRepeat(10,  SDL_DEFAULT_REPEAT_INTERVAL); -*/ +	/*	if(input) +			SDL_EnableKeyRepeat(250,  SDL_DEFAULT_REPEAT_INTERVAL); +		else +			SDL_EnableKeyRepeat(10,  SDL_DEFAULT_REPEAT_INTERVAL); +	*/  }  unsigned int translate_keysym(const SDL_keysym &keysym)  { -	 +  	int key = keysym.sym; -	bool shift = false;	 +	bool shift = false;  	bool numlock = false; -	 +  	// keypad keys  	if (keysym.mod & KMOD_NUM) {  		numlock = true; -		switch(key) { +		switch (key) {  			case SDLK_KP0:  				return '0';  				break; @@ -389,39 +410,39 @@ unsigned int translate_keysym(const SDL_keysym &keysym)  				break;  		}  	} else { -		switch(key) { -		case SDLK_KP0: -			return SDLK_INSERT; -			break; -		case SDLK_KP1: -			return SDLK_END; -			break; -		case SDLK_KP2: -			return SDLK_DOWN; -			break; -		case SDLK_KP3: -			return SDLK_PAGEDOWN; -			break; -		case SDLK_KP4: -			return SDLK_LEFT; -			break; -		case SDLK_KP6: -			return SDLK_RIGHT; -			break; -		case SDLK_KP7: -			return SDLK_HOME; -			break; -		case SDLK_KP8: -			return SDLK_UP; -			break; -		case SDLK_KP9: -			return SDLK_PAGEUP; -			break; +		switch (key) { +			case SDLK_KP0: +				return SDLK_INSERT; +				break; +			case SDLK_KP1: +				return SDLK_END; +				break; +			case SDLK_KP2: +				return SDLK_DOWN; +				break; +			case SDLK_KP3: +				return SDLK_PAGEDOWN; +				break; +			case SDLK_KP4: +				return SDLK_LEFT; +				break; +			case SDLK_KP6: +				return SDLK_RIGHT; +				break; +			case SDLK_KP7: +				return SDLK_HOME; +				break; +			case SDLK_KP8: +				return SDLK_UP; +				break; +			case SDLK_KP9: +				return SDLK_PAGEUP; +				break;  		}  	}  	// special keys -	switch(key) { +	switch (key) {  		case SDLK_ESCAPE:  			return SDLK_ESCAPE;  			break; @@ -431,19 +452,19 @@ unsigned int translate_keysym(const SDL_keysym &keysym)  		case SDLK_KP_PERIOD:  			return '.';  			break; -   		case SDLK_KP_DIVIDE: +		case SDLK_KP_DIVIDE:  			return '/';  			break; -   		case SDLK_KP_MULTIPLY: +		case SDLK_KP_MULTIPLY:  			return '*';  			break; -   		case SDLK_KP_MINUS: +		case SDLK_KP_MINUS:  			return '-';  			break; -   		case SDLK_KP_PLUS: +		case SDLK_KP_PLUS:  			return '+';  			break; -   		case SDLK_KP_EQUALS: +		case SDLK_KP_EQUALS:  			return '=';  			break;  	} @@ -461,7 +482,7 @@ unsigned int translate_keysym(const SDL_keysym &keysym)  		if ((key >= 'a' && key <= 'z')) {  			key = key + 'A' - 'a';  			return key; -		}  +		}  		switch (key) {  			case '`': @@ -503,7 +524,7 @@ unsigned int translate_keysym(const SDL_keysym &keysym)  			case '=':  				key = '+';  				break; -			// second row +				// second row  			case '[':  				key = '{';  				break; @@ -513,14 +534,14 @@ unsigned int translate_keysym(const SDL_keysym &keysym)  			case '|':  				key = '\\';  				break; -			// third row +				// third row  			case ';':  				key = ':';  				break;  			case '\'':  				key = '"';  				break; -			// fourth row +				// fourth row  			case ',':  				key = '<';  				break;  | 
