Panda3D
 All Classes Functions Variables Enumerations
keyboardButton.cxx
1 // Filename: keyboardButton.cxx
2 // Created by: drose (01Mar00)
3 //
4 ////////////////////////////////////////////////////////////////////
5 //
6 // PANDA 3D SOFTWARE
7 // Copyright (c) Carnegie Mellon University. All rights reserved.
8 //
9 // All use of this software is subject to the terms of the revised BSD
10 // license. You should have received a copy of this license along
11 // with this source code in a file named "LICENSE."
12 //
13 ////////////////////////////////////////////////////////////////////
14 
15 #include "keyboardButton.h"
16 #include "buttonRegistry.h"
17 
18 #include <ctype.h>
19 
20 ////////////////////////////////////////////////////////////////////
21 // Function: KeyboardButton::ascii_key
22 // Access: Public, Static
23 // Description: Returns the ButtonHandle associated with the
24 // particular ASCII character, if there is one, or
25 // ButtonHandle::none() if there is not.
26 ////////////////////////////////////////////////////////////////////
28 ascii_key(char ascii_equivalent) {
29  return ButtonRegistry::ptr()->find_ascii_button(ascii_equivalent);
30 }
31 
32 #define DEFINE_KEYBD_BUTTON_HANDLE(KeyName) \
33  static ButtonHandle _##KeyName; \
34  ButtonHandle KeyboardButton::KeyName() { return _##KeyName; }
35 
36 DEFINE_KEYBD_BUTTON_HANDLE(space)
37 DEFINE_KEYBD_BUTTON_HANDLE(backspace)
38 DEFINE_KEYBD_BUTTON_HANDLE(tab)
39 DEFINE_KEYBD_BUTTON_HANDLE(enter)
40 DEFINE_KEYBD_BUTTON_HANDLE(escape)
41 DEFINE_KEYBD_BUTTON_HANDLE(f1)
42 DEFINE_KEYBD_BUTTON_HANDLE(f2)
43 DEFINE_KEYBD_BUTTON_HANDLE(f3)
44 DEFINE_KEYBD_BUTTON_HANDLE(f4)
45 DEFINE_KEYBD_BUTTON_HANDLE(f5)
46 DEFINE_KEYBD_BUTTON_HANDLE(f6)
47 DEFINE_KEYBD_BUTTON_HANDLE(f7)
48 DEFINE_KEYBD_BUTTON_HANDLE(f8)
49 DEFINE_KEYBD_BUTTON_HANDLE(f9)
50 DEFINE_KEYBD_BUTTON_HANDLE(f10)
51 DEFINE_KEYBD_BUTTON_HANDLE(f11)
52 DEFINE_KEYBD_BUTTON_HANDLE(f12)
53 DEFINE_KEYBD_BUTTON_HANDLE(f13)
54 DEFINE_KEYBD_BUTTON_HANDLE(f14)
55 DEFINE_KEYBD_BUTTON_HANDLE(f15)
56 DEFINE_KEYBD_BUTTON_HANDLE(f16)
57 DEFINE_KEYBD_BUTTON_HANDLE(left)
58 DEFINE_KEYBD_BUTTON_HANDLE(right)
59 DEFINE_KEYBD_BUTTON_HANDLE(up)
60 DEFINE_KEYBD_BUTTON_HANDLE(down)
61 DEFINE_KEYBD_BUTTON_HANDLE(page_up)
62 DEFINE_KEYBD_BUTTON_HANDLE(page_down)
63 DEFINE_KEYBD_BUTTON_HANDLE(home)
64 DEFINE_KEYBD_BUTTON_HANDLE(end)
65 DEFINE_KEYBD_BUTTON_HANDLE(insert)
66 DEFINE_KEYBD_BUTTON_HANDLE(del)
67 DEFINE_KEYBD_BUTTON_HANDLE(help)
68 DEFINE_KEYBD_BUTTON_HANDLE(meta)
69 DEFINE_KEYBD_BUTTON_HANDLE(caps_lock)
70 DEFINE_KEYBD_BUTTON_HANDLE(shift_lock)
71 DEFINE_KEYBD_BUTTON_HANDLE(scroll_lock)
72 DEFINE_KEYBD_BUTTON_HANDLE(num_lock)
73 DEFINE_KEYBD_BUTTON_HANDLE(print_screen)
74 DEFINE_KEYBD_BUTTON_HANDLE(pause)
75 DEFINE_KEYBD_BUTTON_HANDLE(menu)
76 DEFINE_KEYBD_BUTTON_HANDLE(shift)
77 DEFINE_KEYBD_BUTTON_HANDLE(control)
78 DEFINE_KEYBD_BUTTON_HANDLE(alt)
79 DEFINE_KEYBD_BUTTON_HANDLE(lshift)
80 DEFINE_KEYBD_BUTTON_HANDLE(rshift)
81 DEFINE_KEYBD_BUTTON_HANDLE(lcontrol)
82 DEFINE_KEYBD_BUTTON_HANDLE(rcontrol)
83 DEFINE_KEYBD_BUTTON_HANDLE(lalt)
84 DEFINE_KEYBD_BUTTON_HANDLE(ralt)
85 DEFINE_KEYBD_BUTTON_HANDLE(lmeta)
86 DEFINE_KEYBD_BUTTON_HANDLE(rmeta)
87 
88 
89 ////////////////////////////////////////////////////////////////////
90 // Function: KeyboardButton::init_keyboard_buttons
91 // Access: Public, Static
92 // Description: This is intended to be called only once, by the
93 // static initialization performed in config_util.cxx.
94 ////////////////////////////////////////////////////////////////////
95 void KeyboardButton::
96 init_keyboard_buttons() {
97  ButtonRegistry::ptr()->register_button(_space, "space",
98  ButtonHandle::none(), ' ');
99  ButtonRegistry::ptr()->register_button(_backspace, "backspace",
100  ButtonHandle::none(), '\x08');
101  ButtonRegistry::ptr()->register_button(_tab, "tab",
102  ButtonHandle::none(), '\x09');
103  ButtonRegistry::ptr()->register_button(_enter, "enter",
104  ButtonHandle::none(), '\x0d');
105  ButtonRegistry::ptr()->register_button(_escape, "escape",
106  ButtonHandle::none(), '\x1b');
107  ButtonRegistry::ptr()->register_button(_del, "delete",
108  ButtonHandle::none(), '\x7f');
109 
110  ButtonRegistry::ptr()->register_button(_f1, "f1");
111  ButtonRegistry::ptr()->register_button(_f2, "f2");
112  ButtonRegistry::ptr()->register_button(_f3, "f3");
113  ButtonRegistry::ptr()->register_button(_f4, "f4");
114  ButtonRegistry::ptr()->register_button(_f5, "f5");
115  ButtonRegistry::ptr()->register_button(_f6, "f6");
116  ButtonRegistry::ptr()->register_button(_f7, "f7");
117  ButtonRegistry::ptr()->register_button(_f8, "f8");
118  ButtonRegistry::ptr()->register_button(_f9, "f9");
119  ButtonRegistry::ptr()->register_button(_f10, "f10");
120  ButtonRegistry::ptr()->register_button(_f11, "f11");
121  ButtonRegistry::ptr()->register_button(_f12, "f12");
122 
123  ButtonRegistry::ptr()->register_button(_f13, "f13");
124  ButtonRegistry::ptr()->register_button(_f14, "f14");
125  ButtonRegistry::ptr()->register_button(_f15, "f15");
126  ButtonRegistry::ptr()->register_button(_f16, "f16");
127 
128  ButtonRegistry::ptr()->register_button(_left, "arrow_left");
129  ButtonRegistry::ptr()->register_button(_right, "arrow_right");
130  ButtonRegistry::ptr()->register_button(_up, "arrow_up"); // cannot name this 'up' since it conflicts with key-release name 'up'
131  ButtonRegistry::ptr()->register_button(_down, "arrow_down");
132  ButtonRegistry::ptr()->register_button(_page_up, "page_up");
133  ButtonRegistry::ptr()->register_button(_page_down, "page_down");
134  ButtonRegistry::ptr()->register_button(_home, "home");
135  ButtonRegistry::ptr()->register_button(_end, "end");
136  ButtonRegistry::ptr()->register_button(_insert, "insert");
137  ButtonRegistry::ptr()->register_button(_help, "help");
138 
139  ButtonRegistry::ptr()->register_button(_shift, "shift");
140  ButtonRegistry::ptr()->register_button(_control, "control");
141  ButtonRegistry::ptr()->register_button(_alt, "alt");
142  ButtonRegistry::ptr()->register_button(_meta, "meta");
143  ButtonRegistry::ptr()->register_button(_caps_lock, "caps_lock");
144  ButtonRegistry::ptr()->register_button(_shift_lock, "shift_lock");
145  ButtonRegistry::ptr()->register_button(_num_lock, "num_lock");
146  ButtonRegistry::ptr()->register_button(_scroll_lock, "scroll_lock");
147  ButtonRegistry::ptr()->register_button(_print_screen, "print_screen");
148  ButtonRegistry::ptr()->register_button(_pause, "pause");
149  ButtonRegistry::ptr()->register_button(_menu, "menu");
150 
151  ButtonRegistry::ptr()->register_button(_lshift, "lshift", _shift);
152  ButtonRegistry::ptr()->register_button(_rshift, "rshift", _shift);
153  ButtonRegistry::ptr()->register_button(_lcontrol, "lcontrol", _control);
154  ButtonRegistry::ptr()->register_button(_rcontrol, "rcontrol", _control);
155  ButtonRegistry::ptr()->register_button(_lalt, "lalt", _alt);
156  ButtonRegistry::ptr()->register_button(_ralt, "ralt", _alt);
157  ButtonRegistry::ptr()->register_button(_lmeta, "lmeta", _meta);
158  ButtonRegistry::ptr()->register_button(_rmeta, "rmeta", _meta);
159 
160  // Also register all of the visible ASCII characters.
161  for (int i = 32; i < 127; i++) {
162  if (isgraph(i)) {
163  ButtonHandle key;
164  ButtonRegistry::ptr()->register_button(key, string(1, (char)i),
165  ButtonHandle::none(), i);
166  }
167  }
168 }
static ButtonHandle none()
Returns a special zero-valued ButtonHandle that is used to indicate no button.
Definition: buttonHandle.I:205
ButtonHandle find_ascii_button(char ascii_equivalent) const
Finds a ButtonHandle in the registry matching the indicated ASCII equivalent character.
bool register_button(ButtonHandle &button_handle, const string &name, ButtonHandle alias=ButtonHandle::none(), char ascii_equivalent= '\0')
Registers a new ButtonHandle with the indicated name, and if specified, the indicated ASCII equivalen...
A ButtonHandle represents a single button from any device, including keyboard buttons and mouse butto...
Definition: buttonHandle.h:28
static ButtonRegistry * ptr()
Returns the pointer to the global ButtonRegistry object.
This class is just used as a convenient namespace for grouping all of these handy functions that retu...
static ButtonHandle ascii_key(char ascii_equivalent)
Returns the ButtonHandle associated with the particular ASCII character, if there is one...