]> git.tdb.fi Git - libs/gltk.git/blob - source/systemkeyboardinput.cpp
Pass modifier state to key_press and key_release functions
[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         modifier_state(0)
12 {
13         keyboard.signal_button_press.connect(sigc::mem_fun(this, &SystemKeyboardInput::key_press));
14         keyboard.signal_button_release.connect(sigc::mem_fun(this, &SystemKeyboardInput::key_release));
15         keyboard.signal_character.connect(sigc::mem_fun(this, &SystemKeyboardInput::character));
16 }
17
18 bool SystemKeyboardInput::key_press(unsigned key)
19 {
20         if(!root.is_visible())
21                 return false;
22
23         if(key==Input::KEY_SHIFT_L || key==Input::KEY_SHIFT_R)
24                 modifier_state |= MOD_SHIFT;
25         else if(key==Input::KEY_CTRL_L || key==Input::KEY_CTRL_R)
26                 modifier_state |= MOD_CTRL;
27         else if(key==Input::KEY_ALT_L || key==Input::KEY_ALT_R)
28                 modifier_state |= MOD_ALT;
29
30         if(root.key_press(key, modifier_state))
31                 return true;
32         
33         switch(key)
34         {
35         case Input::KEY_LEFT: return root.navigate(NAV_LEFT);
36         case Input::KEY_RIGHT: return root.navigate(NAV_RIGHT);
37         case Input::KEY_UP: return root.navigate(NAV_UP);
38         case Input::KEY_DOWN: return root.navigate(NAV_DOWN);
39         case Input::KEY_TAB: return root.navigate(NAV_NEXT);
40         case Input::KEY_SPACE: return root.navigate(NAV_ACTIVATE);
41         case Input::KEY_ENTER: return root.navigate(NAV_ACCEPT);
42         case Input::KEY_ESC: return root.navigate(NAV_CANCEL);
43         }
44
45         return false;
46 }
47
48 bool SystemKeyboardInput::key_release(unsigned key)
49 {
50         if(root.is_visible())
51         {
52                 bool result = root.key_release(key, modifier_state);
53
54                 if(key==Input::KEY_SHIFT_L || key==Input::KEY_SHIFT_R)
55                         modifier_state &= ~MOD_SHIFT;
56                 else if(key==Input::KEY_CTRL_L || key==Input::KEY_CTRL_R)
57                         modifier_state &= ~MOD_CTRL;
58                 else if(key==Input::KEY_ALT_L || key==Input::KEY_ALT_R)
59                         modifier_state &= ~MOD_ALT;
60
61                 return result;
62         }
63         else
64                 return false;
65 }
66
67 bool SystemKeyboardInput::character(StringCodec::unichar ch)
68 {
69         if(root.is_visible())
70                 return root.character(ch);
71         else
72                 return false;
73 }
74
75 } // namespace GLtk
76 } // namespace Msp