00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "xrb_keyrepeater.hpp"
00012
00013 #include "xrb_eventqueue.hpp"
00014
00015 namespace Xrb
00016 {
00017
00018 KeyRepeater::KeyRepeater (
00019 Float const repeat_delay,
00020 Float const repeat_period)
00021 :
00022 EventHandler(NULL),
00023 FrameHandler(),
00024 m_current_key_event(Key::NONE, Key::MOD_NONE, 0.0f)
00025 {
00026 ASSERT1(repeat_delay > 0.0);
00027 ASSERT1(repeat_period > 0.0);
00028
00029 m_repeat_delay = repeat_delay;
00030 m_repeat_period = repeat_period;
00031 m_is_current_key_event_active = false;
00032 }
00033
00034 KeyRepeater::~KeyRepeater ()
00035 {
00036 m_is_current_key_event_active = false;
00037 }
00038
00039 EventKeyRepeat *KeyRepeater::DequeueEvent ()
00040 {
00041 ASSERT1(!m_key_event_queue.IsEmpty());
00042 return m_key_event_queue.Dequeue();
00043 }
00044
00045 void KeyRepeater::HandleFrame ()
00046 {
00047
00048 GenerateKeyEvents(FrameTime());
00049 }
00050
00051 bool KeyRepeater::HandleEvent (Event const *const e)
00052 {
00053 if (e->IsKeyEvent())
00054 {
00055
00056 GenerateKeyEvents(e->Time());
00057
00058 EventKey const *key_event = static_cast<EventKey const *>(e);
00059 if (key_event->IsKeyDownEvent() &&
00060 Key::IsKeyRepeatable(key_event->KeyCode()))
00061 {
00062 EventKeyDown const *key_down_event = static_cast<EventKeyDown const *>(e);
00063
00064 m_current_key_event = *key_down_event;
00065 m_is_current_key_event_active = true;
00066 m_next_repeat_time = key_down_event->Time() + m_repeat_delay;
00067
00068
00069 return true;
00070 }
00071 else if (key_event->IsKeyUpEvent() &&
00072 Key::IsKeyRepeatable(key_event->KeyCode()))
00073 {
00074
00075
00076 if (m_current_key_event.KeyCode() == key_event->KeyCode())
00077 m_is_current_key_event_active = false;
00078
00079
00080 return true;
00081 }
00082 }
00083
00084
00085 return false;
00086 }
00087
00088 void KeyRepeater::GenerateKeyEvents (Float const time)
00089 {
00090
00091 if (!m_is_current_key_event_active)
00092 return;
00093
00094
00095 while (m_next_repeat_time <= time && !m_key_event_queue.IsFull())
00096 {
00097
00098 EventKeyRepeat *key_repeat_event =
00099 new EventKeyRepeat(m_current_key_event.KeyCode(), m_current_key_event.KeyModifier(), time);
00100
00101 m_key_event_queue.Enqueue(key_repeat_event);
00102
00103 m_next_repeat_time += m_repeat_period;
00104 }
00105
00106
00107 if (m_key_event_queue.IsFull())
00108 m_next_repeat_time = time;
00109 }
00110
00111 }