Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2008-07-22 21:17:15 +0000
committerStijn Buys <ingar@osirion.org>2008-07-22 21:17:15 +0000
commit540b500f2176966ebfb7f21ebd2c17ddfdcd34e6 (patch)
treee31bbf0046237b5134002f51d48c1b3f5b752f4f
parent9adc3720cd8fe2ba843d014dbbfe81bf936f9715 (diff)
keyboard key repeat
-rw-r--r--doc/TODO9
-rw-r--r--osirion.kdevelop16
-rw-r--r--src/client/input.cc56
-rw-r--r--src/client/key.cc1
-rw-r--r--src/client/key.h5
-rw-r--r--src/client/keyboard.cc9
-rw-r--r--src/client/keyboard.h7
7 files changed, 85 insertions, 18 deletions
diff --git a/doc/TODO b/doc/TODO
index 2dcf176..22bd4a4 100644
--- a/doc/TODO
+++ b/doc/TODO
@@ -77,9 +77,9 @@ client:
input handler switching (ok)
key binds (ok)
better crosshair bitmaps (ok)
-
- modifier key binds
- keyboard repeat
+ keyboard repeat (ok)
+
+ shift/ctrl/alt modifier key binds
render:
render pipeline (ok)
@@ -88,7 +88,8 @@ render:
texture registry (ok)
add small camera light (ok)
- text quads render pipe? (see model quads)
+ text quads render pipe? (see model quads)
+ - text can't be a in quadpipe -> gui layers
test/fix? lighting without sun in world.ini
sun light strenght
diff --git a/osirion.kdevelop b/osirion.kdevelop
index 58a8bfc..c31777e 100644
--- a/osirion.kdevelop
+++ b/osirion.kdevelop
@@ -16,7 +16,7 @@
<projectdirectory>./</projectdirectory>
<absoluteprojectpath>false</absoluteprojectpath>
<description>The OSiRiON Project is an SDL+OpenGL space game.</description>
- <defaultencoding/>
+ <defaultencoding></defaultencoding>
<versioncontrol>kdevsubversion</versioncontrol>
</general>
<kdevautoproject>
@@ -140,7 +140,7 @@
<projectdoc>
<docsystem>Doxygen documentatieverzameling</docsystem>
<docurl>osirion.tag</docurl>
- <usermanualurl/>
+ <usermanualurl></usermanualurl>
</projectdoc>
</kdevdocumentation>
<substmap>
@@ -196,7 +196,7 @@
<designerpluginpaths/>
</qt>
<creategettersetter>
- <prefixGet/>
+ <prefixGet></prefixGet>
<prefixSet>set</prefixSet>
<prefixVariable>m_,_</prefixVariable>
<parameterName>theValue</parameterName>
@@ -228,11 +228,11 @@
</cppsupportpart>
<kdevdebugger>
<general>
- <gdbpath/>
- <dbgshell/>
- <configGdbScript/>
- <runShellScript/>
- <runGdbScript/>
+ <gdbpath></gdbpath>
+ <dbgshell></dbgshell>
+ <configGdbScript></configGdbScript>
+ <runShellScript></runShellScript>
+ <runGdbScript></runGdbScript>
<breakonloadinglibs>true</breakonloadinglibs>
<separatetty>false</separatetty>
<floatingtoolbar>false</floatingtoolbar>
diff --git a/src/client/input.cc b/src/client/input.cc
index f8d76f2..819ce27 100644
--- a/src/client/input.cc
+++ b/src/client/input.cc
@@ -23,6 +23,8 @@ namespace client
{
core::Cvar *input_mousecontrol = 0;
+core::Cvar *input_keydelay = 0;
+core::Cvar *input_keyrepeat = 0;
namespace input
{
@@ -204,9 +206,15 @@ void init()
SDL_WM_GrabInput(SDL_GRAB_ON);
// SDL_EnableUNICODE(1);
- input_mousecontrol = core::Cvar::get("input_mousecontrol", "1", core::Cvar::Archive);
+ input_mousecontrol = core::Cvar::get("input_mousecontrol", 1.0f, core::Cvar::Archive);
input_mousecontrol->set_info("[bool] enable or disable mouse control");
+ input_keydelay = core::Cvar::get("input_keydelay", 250.0f, core::Cvar::Archive);
+ input_keydelay->set_info("[int] keyboard delay time-out in milliseconds");
+
+ input_keyrepeat = core::Cvar::get("input_keyrepeat", 30.0f, core::Cvar::Archive);
+ input_keyrepeat->set_info("[int] keyboard repeat time-out in milliseconds");
+
core::Func *func = 0;
func = core::Func::add("ui_console", func_ui_console);
@@ -270,7 +278,7 @@ void shutdown()
SDL_ShowCursor(SDL_ENABLE);
SDL_WM_GrabInput(SDL_GRAB_OFF);
-// SDL_EnableUNICODE(0);
+// SDL_DisableUNICODE(0);
}
@@ -447,6 +455,7 @@ void key_released(Key *key)
void frame(float seconds)
{
+ /* -- detect localcontrol() changes --------------- */
if (core::localcontrol() && (last_control != core::localcontrol()->id())) {
local_direction = 0.0f;
@@ -464,6 +473,7 @@ void frame(float seconds)
render::reset();
}
+ /* -- poll SDL keyboard events -------------------- */
SDL_Event event;
Key *key = 0;
bool pressed = false;
@@ -515,10 +525,50 @@ void frame(float seconds)
key_released(key);
}
}
+
+ /* -- handle key repeat --------------------------- */
+ float delay = 250.0f; // key delay time-out in milliseconds
+ if (input_keydelay) {
+ delay = input_keydelay->value();
+ math::clamp(delay, 50.0f, 500.0f);
+ }
+
+ float repeat = 30.0f; // key repeat time-out in milliseconds
+ if (input_keyrepeat) {
+ repeat = input_keyrepeat->value();
+ math::clamp(repeat, 10.0f, 250.0f);
+ }
+
+ if (repeat > delay) {
+ float tmp = repeat;
+ repeat = delay;
+ delay = tmp;
+ }
+ if (input_keydelay)
+ (*input_keydelay) = delay;
+ if (input_keyrepeat)
+ (*input_keyrepeat) = repeat;
+ repeat /= 1000.0f;
+ delay /= 1000.0f;
+
+ for (Keyboard::iterator it = keyboard->begin(); it != keyboard->end(); it++) {
+ key = (*it).second;
+ if (key && key->sym() < 512 && key->pressed()) {
+ while ((key->pressed()+delay < core::application()->time()) && (key->lastpressed()+repeat < core::application()->time())) {
+ if (key->lastpressed() > key->pressed())
+ key->lastpressed() += repeat;
+ else
+ key->lastpressed() += delay;
+ key_pressed(key);
+ }
+ }
+ }
+
+ /* -- process mouse movement ----------------------*/
mouse_control = false;
mouse_deadzone = false;
-
+ key->lastpressed() += repeat;
if (core::application()->connected() && core::localcontrol()) {
mouse_control = !console()->visible() && ((input_mousecontrol->value() > 0) || mouse_control_override);
diff --git a/src/client/key.cc b/src/client/key.cc
index 27ed22a..27d280f 100644
--- a/src/client/key.cc
+++ b/src/client/key.cc
@@ -14,6 +14,7 @@ Key::Key(const char *name, int keysym, char ascii, const char *bind)
key_sym = keysym;
key_ascii = ascii;
key_pressed = 0;
+ key_lastpressed = 0;
key_name.assign(name);
diff --git a/src/client/key.h b/src/client/key.h
index 6f190c0..d1a8e96 100644
--- a/src/client/key.h
+++ b/src/client/key.h
@@ -40,8 +40,12 @@ public:
/// return the bind for a specific modifier
std::string const & bind(Modifier mod) const;
+ /// first time the key was pressed since previous release
inline float & pressed() { return key_pressed; }
+ /// last time the key was pressed
+ inline float & lastpressed() { return key_lastpressed; }
+
inline std::string const & name() const { return key_name; }
inline char ascii() const { return key_ascii; }
@@ -54,6 +58,7 @@ private:
char key_ascii;
float key_pressed;
+ float key_lastpressed;
std::string key_bind;
std::string key_bind_shift;
diff --git a/src/client/keyboard.cc b/src/client/keyboard.cc
index 410e76c..10d98ea 100644
--- a/src/client/keyboard.cc
+++ b/src/client/keyboard.cc
@@ -214,7 +214,7 @@ Keyboard::~Keyboard()
{
// clear key map
for (iterator it = begin(); it != end(); it++)
- delete(*it).second;
+ delete (*it).second;
keys.clear();
// clear action list
@@ -284,6 +284,7 @@ Key * Keyboard::release(unsigned int sym)
}
key->pressed() = 0;
+ key->lastpressed() = 0;
return key;
}
@@ -294,8 +295,14 @@ Key * Keyboard::press(unsigned int sym)
return 0;
}
+ return press(key);
+}
+
+Key * Keyboard::press(Key *key)
+{
if (!key->pressed())
key->pressed() = core::application()->time();
+ key->lastpressed() = core::application()->time();
return key;
}
diff --git a/src/client/keyboard.h b/src/client/keyboard.h
index 9712009..e4995e6 100644
--- a/src/client/keyboard.h
+++ b/src/client/keyboard.h
@@ -61,15 +61,18 @@ public:
Key *press(unsigned int sym);
/// a key has been pressed
+ Key *press(Key *key);
+
+ /// a key has been pressed
Key *release(unsigned int sym);
-private:
typedef std::map<unsigned int, Key *>::iterator iterator;
-
+
inline iterator begin() { return keys.begin(); }
inline iterator end() { return keys.end(); }
+private:
void add_key(const char *name, const unsigned int keysym, const char ascii=0, const char *bind=0);
void add_action(const char *name, Action::Identifier action, const char *info = 0);