]> git.tdb.fi Git - libs/gltk.git/blob - source/systemkeyboardinput.cpp
Simplify constructors with C++11
[libs/gltk.git] / source / systemkeyboardinput.cpp
1 #include <msp/input/keys.h>
2 #include "root.h"
3 #include "systemkeyboardinput.h"
4
5 namespace Msp {
6 namespace GLtk {
7
8 SystemKeyboardInput::SystemKeyboardInput(Root &r, Input::Keyboard &k):
9         InputMethod(r),
10         keyboard(k)
11 {
12         keyboard.signal_button_press.connect(sigc::mem_fun(this, &SystemKeyboardInput::key_press));
13         keyboard.signal_button_release.connect(sigc::mem_fun(this, &SystemKeyboardInput::key_release));
14         keyboard.signal_character.connect(sigc::mem_fun(this, &SystemKeyboardInput::character));
15 }
16
17 bool SystemKeyboardInput::key_press(unsigned key)
18 {
19         if(!root.is_visible())
20                 return false;
21
22         if(key==Input::KEY_SHIFT_L || key==Input::KEY_SHIFT_R)
23                 modifier_state |= MOD_SHIFT;
24         else if(key==Input::KEY_CTRL_L || key==Input::KEY_CTRL_R)
25                 modifier_state |= MOD_CTRL;
26         else if(key==Input::KEY_ALT_L || key==Input::KEY_ALT_R)
27                 modifier_state |= MOD_ALT;
28
29         if(root.key_press(key, modifier_state))
30                 return true;
31         
32         switch(key)
33         {
34         case Input::KEY_LEFT: return root.navigate(NAV_LEFT);
35         case Input::KEY_RIGHT: return root.navigate(NAV_RIGHT);
36         case Input::KEY_UP: return root.navigate(NAV_UP);
37         case Input::KEY_DOWN: return root.navigate(NAV_DOWN);
38         case Input::KEY_TAB: return root.navigate((modifier_state&MOD_SHIFT) ? NAV_PREVIOUS : NAV_NEXT);
39         case Input::KEY_SPACE: return root.navigate(NAV_ACTIVATE);
40         case Input::KEY_ENTER: return root.navigate(NAV_ACCEPT);
41         case Input::KEY_ESC: return root.navigate(NAV_CANCEL);
42         }
43
44         return false;
45 }
46
47 bool SystemKeyboardInput::key_release(unsigned key)
48 {
49         if(root.is_visible())
50         {
51                 bool result = root.key_release(key, modifier_state);
52
53                 if(key==Input::KEY_SHIFT_L || key==Input::KEY_SHIFT_R)
54                         modifier_state &= ~MOD_SHIFT;
55                 else if(key==Input::KEY_CTRL_L || key==Input::KEY_CTRL_R)
56                         modifier_state &= ~MOD_CTRL;
57                 else if(key==Input::KEY_ALT_L || key==Input::KEY_ALT_R)
58                         modifier_state &= ~MOD_ALT;
59
60                 return result;
61         }
62         else
63                 return false;
64 }
65
66 bool SystemKeyboardInput::character(StringCodec::unichar ch)
67 {
68         if(root.is_visible())
69                 return root.character(ch);
70         else
71                 return false;
72 }
73
74 } // namespace GLtk
75 } // namespace Msp