1# ----------------------------------------------------------------------------
2# pyglet
3# Copyright (c) 2006-2008 Alex Holkner
4# Copyright (c) 2008-2020 pyglet contributors
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10#
11#  * Redistributions of source code must retain the above copyright
12#    notice, this list of conditions and the following disclaimer.
13#  * Redistributions in binary form must reproduce the above copyright
14#    notice, this list of conditions and the following disclaimer in
15#    the documentation and/or other materials provided with the
16#    distribution.
17#  * Neither the name of pyglet nor the names of its
18#    contributors may be used to endorse or promote products
19#    derived from this software without specific prior written
20#    permission.
21#
22# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33# POSSIBILITY OF SUCH DAMAGE.
34# ----------------------------------------------------------------------------
35
36from pyglet.window import key
37
38# From SDL: src/video/quartz/SDL_QuartzKeys.h
39# These are the Macintosh key scancode constants -- from Inside Macintosh
40# http://boredzo.org/blog/wp-content/uploads/2007/05/imtx-virtual-keycodes.png
41# Renamed QZ_RALT, QZ_LALT to QZ_ROPTION, QZ_LOPTION
42# and QZ_RMETA, QZ_LMETA to QZ_RCOMMAND, QZ_LCOMMAND.
43#
44# See also:
45# /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Headers/Events.h
46
47QZ_ESCAPE = 0x35
48QZ_F1 = 0x7A
49QZ_F2 = 0x78
50QZ_F3 = 0x63
51QZ_F4 = 0x76
52QZ_F5 = 0x60
53QZ_F6 = 0x61
54QZ_F7 = 0x62
55QZ_F8 = 0x64
56QZ_F9 = 0x65
57QZ_F10 = 0x6D
58QZ_F11 = 0x67
59QZ_F12 = 0x6F
60QZ_F13 = 0x69
61QZ_F14 = 0x6B
62QZ_F15 = 0x71
63QZ_F16 = 0x6A
64QZ_F17 = 0x40
65QZ_F18 = 0x4F
66QZ_F19 = 0x50
67QZ_F20 = 0x5A
68QZ_BACKQUOTE = 0x32
69QZ_1 = 0x12
70QZ_2 = 0x13
71QZ_3 = 0x14
72QZ_4 = 0x15
73QZ_5 = 0x17
74QZ_6 = 0x16
75QZ_7 = 0x1A
76QZ_8 = 0x1C
77QZ_9 = 0x19
78QZ_0 = 0x1D
79QZ_MINUS = 0x1B
80QZ_EQUALS = 0x18
81QZ_BACKSPACE = 0x33
82QZ_INSERT = 0x72
83QZ_HOME = 0x73
84QZ_PAGEUP = 0x74
85QZ_NUMLOCK = 0x47
86QZ_KP_EQUALS = 0x51
87QZ_KP_DIVIDE = 0x4B
88QZ_KP_MULTIPLY = 0x43
89QZ_TAB = 0x30
90QZ_q = 0x0C
91QZ_w = 0x0D
92QZ_e = 0x0E
93QZ_r = 0x0F
94QZ_t = 0x11
95QZ_y = 0x10
96QZ_u = 0x20
97QZ_i = 0x22
98QZ_o = 0x1F
99QZ_p = 0x23
100QZ_LEFTBRACKET = 0x21
101QZ_RIGHTBRACKET = 0x1E
102QZ_BACKSLASH = 0x2A
103QZ_DELETE = 0x75
104QZ_END = 0x77
105QZ_PAGEDOWN = 0x79
106QZ_KP7 = 0x59
107QZ_KP8 = 0x5B
108QZ_KP9 = 0x5C
109QZ_KP_MINUS = 0x4E
110QZ_CAPSLOCK = 0x39
111QZ_a = 0x00
112QZ_s = 0x01
113QZ_d = 0x02
114QZ_f = 0x03
115QZ_g = 0x05
116QZ_h = 0x04
117QZ_j = 0x26
118QZ_k = 0x28
119QZ_l = 0x25
120QZ_SEMICOLON = 0x29
121QZ_QUOTE = 0x27
122QZ_RETURN = 0x24
123QZ_KP4 = 0x56
124QZ_KP5 = 0x57
125QZ_KP6 = 0x58
126QZ_KP_PLUS = 0x45
127QZ_LSHIFT = 0x38
128QZ_z = 0x06
129QZ_x = 0x07
130QZ_c = 0x08
131QZ_v = 0x09
132QZ_b = 0x0B
133QZ_n = 0x2D
134QZ_m = 0x2E
135QZ_COMMA = 0x2B
136QZ_PERIOD = 0x2F
137QZ_SLASH = 0x2C
138QZ_RSHIFT = 0x3C
139QZ_UP = 0x7E
140QZ_KP1 = 0x53
141QZ_KP2 = 0x54
142QZ_KP3 = 0x55
143QZ_KP_ENTER = 0x4C
144QZ_LCTRL = 0x3B
145QZ_LOPTION = 0x3A
146QZ_LCOMMAND = 0x37
147QZ_SPACE = 0x31
148QZ_RCOMMAND = 0x36
149QZ_ROPTION = 0x3D
150QZ_RCTRL = 0x3E
151QZ_FUNCTION = 0x3F
152QZ_LEFT = 0x7B
153QZ_DOWN = 0x7D
154QZ_RIGHT = 0x7C
155QZ_KP0 = 0x52
156QZ_KP_PERIOD = 0x41
157
158# This map contains only keys that can be directly translated independent of
159# keyboard layout and locale
160keymap = {
161    QZ_ESCAPE: key.ESCAPE,
162    QZ_F1: key.F1,
163    QZ_F2: key.F2,
164    QZ_F3: key.F3,
165    QZ_F4: key.F4,
166    QZ_F5: key.F5,
167    QZ_F6: key.F6,
168    QZ_F7: key.F7,
169    QZ_F8: key.F8,
170    QZ_F9: key.F9,
171    QZ_F10: key.F10,
172    QZ_F11: key.F11,
173    QZ_F12: key.F12,
174    QZ_F13: key.F13,
175    QZ_F14: key.F14,
176    QZ_F15: key.F15,
177    QZ_F16: key.F16,
178    QZ_F17: key.F17,
179    QZ_F18: key.F18,
180    QZ_F19: key.F19,
181    QZ_F20: key.F20,
182    QZ_BACKSPACE: key.BACKSPACE,
183    QZ_INSERT: key.INSERT,
184    QZ_HOME: key.HOME,
185    QZ_PAGEUP: key.PAGEUP,
186    QZ_NUMLOCK: key.NUMLOCK,
187    QZ_KP_EQUALS: key.NUM_EQUAL,
188    QZ_KP_DIVIDE: key.NUM_DIVIDE,
189    QZ_KP_MULTIPLY: key.NUM_MULTIPLY,
190    QZ_TAB: key.TAB,
191    QZ_BACKSLASH: key.BACKSLASH,
192    QZ_DELETE: key.DELETE,
193    QZ_END: key.END,
194    QZ_PAGEDOWN: key.PAGEDOWN,
195    QZ_KP7: key.NUM_7,
196    QZ_KP8: key.NUM_8,
197    QZ_KP9: key.NUM_9,
198    QZ_KP_MINUS: key.NUM_SUBTRACT,
199    QZ_CAPSLOCK: key.CAPSLOCK,
200    QZ_RETURN: key.RETURN,
201    QZ_KP4: key.NUM_4,
202    QZ_KP5: key.NUM_5,
203    QZ_KP6: key.NUM_6,
204    QZ_KP_PLUS: key.NUM_ADD,
205    QZ_LSHIFT: key.LSHIFT,
206    QZ_RSHIFT: key.RSHIFT,
207    QZ_UP: key.UP,
208    QZ_KP1: key.NUM_1,
209    QZ_KP2: key.NUM_2,
210    QZ_KP3: key.NUM_3,
211    QZ_KP_ENTER: key.NUM_ENTER,
212    QZ_LCTRL: key.LCTRL,
213    QZ_LOPTION: key.LOPTION,
214    QZ_LCOMMAND: key.LCOMMAND,
215    QZ_SPACE: key.SPACE,
216    QZ_RCOMMAND: key.RCOMMAND,
217    QZ_ROPTION: key.ROPTION,
218    QZ_RCTRL: key.RCTRL,
219    QZ_FUNCTION: key.FUNCTION,
220    QZ_LEFT: key.LEFT,
221    QZ_DOWN: key.DOWN,
222    QZ_RIGHT: key.RIGHT,
223    QZ_KP0: key.NUM_0,
224    QZ_KP_PERIOD: key.NUM_DECIMAL,
225}
226
227charmap = {
228    ' ': key.SPACE,
229    '!': key.EXCLAMATION,
230    '"': key.DOUBLEQUOTE,
231    '#': key.HASH,
232    '#': key.POUND,
233    '$': key.DOLLAR,
234    '%': key.PERCENT,
235    '&': key.AMPERSAND,
236    "'": key.APOSTROPHE,
237    '(': key.PARENLEFT,
238    ')': key.PARENRIGHT,
239    '*': key.ASTERISK,
240    '+': key.PLUS,
241    ',': key.COMMA,
242    '-': key.MINUS,
243    '.': key.PERIOD,
244    '/': key.SLASH,
245    '0': key._0,
246    '1': key._1,
247    '2': key._2,
248    '3': key._3,
249    '4': key._4,
250    '5': key._5,
251    '6': key._6,
252    '7': key._7,
253    '8': key._8,
254    '9': key._9,
255    ':': key.COLON,
256    ';': key.SEMICOLON,
257    '<': key.LESS,
258    '=': key.EQUAL,
259    '>': key.GREATER,
260    '?': key.QUESTION,
261    '@': key.AT,
262    '[': key.BRACKETLEFT,
263    '\\': key.BACKSLASH,
264    ']': key.BRACKETRIGHT,
265    '^': key.ASCIICIRCUM,
266    '_': key.UNDERSCORE,
267    '`': key.GRAVE,
268    '`': key.QUOTELEFT,
269    'A': key.A,
270    'B': key.B,
271    'C': key.C,
272    'D': key.D,
273    'E': key.E,
274    'F': key.F,
275    'G': key.G,
276    'H': key.H,
277    'I': key.I,
278    'J': key.J,
279    'K': key.K,
280    'L': key.L,
281    'M': key.M,
282    'N': key.N,
283    'O': key.O,
284    'P': key.P,
285    'Q': key.Q,
286    'R': key.R,
287    'S': key.S,
288    'T': key.T,
289    'U': key.U,
290    'V': key.V,
291    'W': key.W,
292    'X': key.X,
293    'Y': key.Y,
294    'Z': key.Z,
295    '{': key.BRACELEFT,
296    '|': key.BAR,
297    '}': key.BRACERIGHT,
298    '~': key.ASCIITILDE
299}
300