166 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env python
 | 
						|
# (c) 2018 Thomas Bernard
 | 
						|
 | 
						|
#import sys
 | 
						|
 | 
						|
filename = '../src/keycodes.h'
 | 
						|
 | 
						|
keys = ['UNKNOWN',
 | 
						|
        'ESCAPE', 'RETURN', 'BACKSPACE', 'TAB',
 | 
						|
        'UP', 'DOWN', 'LEFT', 'RIGHT',
 | 
						|
        'LEFTBRACKET', 'RIGHTBRACKET',
 | 
						|
        'INSERT', 'DELETE', 'COMMA', 'BACKQUOTE',
 | 
						|
        'PAGEUP', 'PAGEDOWN', 'HOME', 'END',
 | 
						|
        'KP_PLUS', 'KP_MINUS', 'KP_MULTIPLY', 'KP_ENTER',
 | 
						|
        'KP_DIVIDE', 'KP_PERIOD', 'KP_EQUALS',
 | 
						|
        'EQUALS', 'MINUS', 'PERIOD',
 | 
						|
        'CAPSLOCK', 'CLEAR', 'SPACE', 'PAUSE',
 | 
						|
        'LSHIFT', 'RSHIFT', 'LCTRL', 'RCTRL',
 | 
						|
        'LALT', 'RALT']
 | 
						|
 | 
						|
win32vk = {
 | 
						|
'BACKSPACE': 'BACK',
 | 
						|
'PAGEUP': 'PRIOR',
 | 
						|
'PAGEDOWN': 'NEXT',
 | 
						|
'CAPSLOCK': 'CAPITAL',
 | 
						|
'EQUALS': 'OEM_PLUS',  # =+ key on US keyboards
 | 
						|
'COMMA': 'OEM_COMMA',
 | 
						|
'MINUS': 'OEM_MINUS',
 | 
						|
'PERIOD': 'OEM_PERIOD',
 | 
						|
'BACKQUOTE': 'OEM_3',
 | 
						|
'LEFTBRACKET': 'OEM_4',
 | 
						|
'RIGHTBRACKET': 'OEM_6',
 | 
						|
'KP_PLUS': 'ADD',
 | 
						|
'KP_MULTIPLY': 'MULTIPLY',
 | 
						|
'KP_MINUS': 'SUBTRACT',
 | 
						|
'KP_DIVIDE': 'DIVIDE',
 | 
						|
'KP_PERIOD': 'DECIMAL',
 | 
						|
'KP_ENTER': 'RETURN',
 | 
						|
'LCTRL': 'LCONTROL',
 | 
						|
'RCTRL': 'RCONTROL',
 | 
						|
'LALT': 'LMENU',
 | 
						|
'RALT': 'RMENU',
 | 
						|
}
 | 
						|
 | 
						|
x11xk = {
 | 
						|
'BACKSPACE': 'BackSpace',
 | 
						|
'CAPSLOCK': 'Caps_Lock',
 | 
						|
'PAGEUP': 'Page_Up',
 | 
						|
'PAGEDOWN': 'Page_Down',
 | 
						|
'BACKQUOTE': 'grave',
 | 
						|
'KP_PLUS': 'KP_Add',
 | 
						|
'KP_MINUS': 'KP_Subtract',
 | 
						|
'KP_EQUALS': 'KP_Equal',
 | 
						|
'KP_PERIOD': 'KP_Decimal',
 | 
						|
'COMMA': 'comma',
 | 
						|
'SPACE': 'space',
 | 
						|
'EQUALS': 'equal',
 | 
						|
'MINUS': 'minus',
 | 
						|
'PERIOD': 'period',
 | 
						|
'LEFTBRACKET': 'bracketleft',
 | 
						|
'RIGHTBRACKET': 'bracketright',
 | 
						|
'LCTRL': 'Control_L',
 | 
						|
'RCTRL': 'Control_R',
 | 
						|
'LALT': 'Alt_L',
 | 
						|
'RALT': 'Alt_R',
 | 
						|
'LSHIFT': 'Shift_L',
 | 
						|
'RSHIFT': 'Shift_R',
 | 
						|
}
 | 
						|
 | 
						|
def keycode_def(section, key, index, native_key=None):
 | 
						|
	if native_key is None:
 | 
						|
		native_key = key
 | 
						|
	if section == 'SDL and SDL2':
 | 
						|
		return '#define KEY_%-12s K2K(SDLK_%s)\n' % (key, native_key)
 | 
						|
	elif section == 'win32':
 | 
						|
		if len(key) == 1 and key >= '0' and key <= '9':
 | 
						|
			return '#define KEY_%-12s 0x%02x\n' % (key, ord(key))
 | 
						|
		elif len(key) == 1 and key >= 'a' and key <= 'z':
 | 
						|
			return '#define KEY_%-12s 0x%02x\n' % (key, ord(key)-32)
 | 
						|
		elif key == 'UNKNOWN' or key == 'KP_EQUALS':
 | 
						|
			return '#define KEY_%-12s 0\n' % (key)
 | 
						|
		else:
 | 
						|
			return '#define KEY_%-12s VK_%s\n' % (key, native_key)
 | 
						|
	elif section == 'x11':
 | 
						|
		if native_key[0:3] == 'Kp_':
 | 
						|
			native_key = 'KP_' + native_key[3:]
 | 
						|
		if key == 'UNKNOWN':
 | 
						|
			return '#define KEY_%-12s 0\n' % (key)
 | 
						|
		else:
 | 
						|
			return '#define KEY_%-12s K2K(XK_%s)\n' % (key, native_key)
 | 
						|
	else:
 | 
						|
		return '#define KEY_%-12s %d\n' % (key, index)
 | 
						|
 | 
						|
def add_keycodes_defs(section, lines):
 | 
						|
	global keys
 | 
						|
	i = 0
 | 
						|
	for key in keys:
 | 
						|
		if section == 'win32' and key in win32vk:
 | 
						|
			lines.append(keycode_def(section, key, i, win32vk[key]))
 | 
						|
		elif section == 'x11':
 | 
						|
			if key in x11xk:
 | 
						|
				lines.append(keycode_def(section, key, i, x11xk[key]))
 | 
						|
			else:
 | 
						|
				lines.append(keycode_def(section, key, i, key.title()))
 | 
						|
		else:
 | 
						|
			lines.append(keycode_def(section, key, i))
 | 
						|
		i = i + 1
 | 
						|
	for j in range(10):
 | 
						|
		lines.append(keycode_def(section, chr(ord('0') + j), i))
 | 
						|
		i = i + 1
 | 
						|
	for j in range(26):
 | 
						|
		lines.append(keycode_def(section, chr(ord('a') + j), i))
 | 
						|
		i = i + 1
 | 
						|
	if section == 'SDL and SDL2':
 | 
						|
		lines.append('#if defined(USE_SDL)\n')
 | 
						|
	for j in range(10):
 | 
						|
		key = "KP%d" % (j)
 | 
						|
		if section == 'win32':
 | 
						|
			lines.append(keycode_def(section, key, i, "NUMPAD%d" % (j)))
 | 
						|
		elif section == 'x11':
 | 
						|
			lines.append(keycode_def(section, key, i, "KP_%d" % (j)))
 | 
						|
		else:
 | 
						|
			lines.append(keycode_def(section, key, i))
 | 
						|
		i = i + 1
 | 
						|
	if section == 'win32':
 | 
						|
		lines.append(keycode_def(section, 'SCROLLOCK', i, 'SCROLL'))
 | 
						|
	elif section == 'x11':
 | 
						|
		lines.append(keycode_def(section, 'SCROLLOCK', i, 'Scroll_Lock'))
 | 
						|
	else:
 | 
						|
		lines.append(keycode_def(section, 'SCROLLOCK', i))
 | 
						|
	i = i + 1
 | 
						|
	if section == 'SDL and SDL2':
 | 
						|
		lines.append('#else\n')
 | 
						|
		for j in range(10):
 | 
						|
			key = "KP%d" % (j)
 | 
						|
			sdl_key = 'KP_%d' % (j)
 | 
						|
			lines.append(keycode_def(section, key, 0, sdl_key))
 | 
						|
		lines.append(keycode_def(section, 'SCROLLOCK', i, 'SCROLLLOCK'))
 | 
						|
		lines.append('#endif\n')
 | 
						|
	for j in range(1,13):
 | 
						|
		key = "F%d" % (j)
 | 
						|
		lines.append(keycode_def(section, key, i))
 | 
						|
		i = i + 1
 | 
						|
 | 
						|
def update_keycodes(filename):
 | 
						|
	output = []
 | 
						|
	with open(filename) as f:
 | 
						|
		skipping = False
 | 
						|
		for line in f:
 | 
						|
			if skipping:
 | 
						|
				if line.startswith('// end of KEY definitions'):
 | 
						|
					output.append(line)
 | 
						|
					skipping = False
 | 
						|
			else:
 | 
						|
				output.append(line)
 | 
						|
				if line.startswith('// KEY definitions for '):
 | 
						|
					section = line[23:].strip()
 | 
						|
					print 'section "%s"' % (section)
 | 
						|
					skipping = True
 | 
						|
					add_keycodes_defs(section, output)
 | 
						|
	with open(filename, "w") as f:
 | 
						|
		for line in output:
 | 
						|
			f.write(line)
 | 
						|
 | 
						|
update_keycodes(filename)
 |