diff --git a/m64py b/m64py index 1e8bcde..bbdaef8 100755 --- a/m64py +++ b/m64py @@ -36,9 +36,8 @@ except ImportError, err: sys.exit(1) try: - from m64py.core.defs import FRONTEND_VERSION, LOGO - from m64py.frontend.mainwindow import MainWindow from m64py.loader import load_library + from m64py.core.defs import FRONTEND_VERSION, LOGO except ImportError, err: sys.stderr.write("Can't import m64py modules%sError:%s%s" % ( os.linesep, str(err), os.linesep)) @@ -58,6 +57,7 @@ def main(): from m64py.opts import opts, args sys.stderr.write("%s\nM64Py - A frontend for Mupen64Plus version %s\n\n" % ( LOGO, FRONTEND_VERSION)) + from m64py.frontend.mainwindow import MainWindow window = MainWindow((opts, args)) window.show() window.raise_() diff --git a/setup.py b/setup.py index 38330a7..3278a20 100644 --- a/setup.py +++ b/setup.py @@ -15,7 +15,7 @@ setup(name = "m64py", author_email = "gen2brain@gmail.com", license = "GNU GPLv3", url = "http://m64py.sourceforge.net", - packages = ["m64py", "m64py.core", "m64py.frontend", "m64py.ui", "SDL"], + packages = ["m64py", "m64py.core", "m64py.frontend", "m64py.ui", "m64py.SDL", "m64py.SDL2"], package_dir = {"": "src"}, scripts = ["m64py"], requires = ["PyQt4"], diff --git a/src/m64py/core/core.py b/src/m64py/core/core.py index 41f5320..99b790c 100644 --- a/src/m64py/core/core.py +++ b/src/m64py/core/core.py @@ -16,7 +16,9 @@ import os import sys +import signal import ctypes as C +import subprocess from m64py.core.defs import * from m64py.core.config import Config @@ -24,7 +26,7 @@ from m64py.loader import load, unload_library from m64py.utils import log, version_split from m64py.opts import VERBOSE from m64py.archive import ROM_TYPE -from m64py.platform import DLL_EXT, DEFAULT_DYNLIB, SEARCH_DIRS +from m64py.platform import DLL_EXT, DEFAULT_DYNLIB, SEARCH_DIRS, LDD_CMD from m64py.core.vidext import vidext def debug_callback(context, level, message): @@ -66,6 +68,7 @@ class Core: self.rom_settings = m64p_rom_settings() self.core_name = "Mupen64Plus Core" self.core_version = "Unknown" + self.core_sdl2 = False def get_handle(self): """Retrieves core library handle.""" @@ -108,6 +111,13 @@ class Core: self.core_name = plugin_name self.core_version = plugin_version + if LDD_CMD: + proc = subprocess.Popen(LDD_CMD % self.core_path, shell=True, + preexec_fn=lambda:signal.signal(signal.SIGPIPE, signal.SIG_DFL)) + proc.communicate() + if proc.returncode == 0: + self.core_sdl2 = True + log.info("attached to library '%s' version %s" % (self.core_name, version_split(self.core_version))) if plugin_cap & M64CAPS_DYNAREC: diff --git a/src/m64py/core/vidext.py b/src/m64py/core/vidext.py index 9dc01ce..75692c0 100644 --- a/src/m64py/core/vidext.py +++ b/src/m64py/core/vidext.py @@ -17,22 +17,12 @@ from PyQt4.QtCore import SIGNAL from PyQt4.QtOpenGL import QGLFormat -from SDL import * - from m64py.core.defs import * from m64py.utils import log -try: - if not SDL_WasInit(SDL_INIT_VIDEO): - SDL_InitSubSystem(SDL_INIT_VIDEO) - MODES = [(mode.w, mode.h) for mode in SDL_ListModes( - None, SDL_FULLSCREEN|SDL_HWSURFACE)] - SDL_QuitSubSystem(SDL_INIT_VIDEO) -except Exception, err: - log.warn(str(err)) - MODES = [(1920, 1440), (1600, 1200), (1400, 1050), - (1280, 960), (1152, 864), (1024, 768), - (800, 600), (640, 480), (320, 240)] +MODES = [(1920, 1440), (1600, 1200), (1400, 1050), + (1280, 960), (1152, 864), (1024, 768), + (800, 600), (640, 480), (320, 240)] class Video(): """Mupen64Plus video extension""" diff --git a/src/m64py/frontend/glwidget.py b/src/m64py/frontend/glwidget.py index bd54413..6d8ee55 100644 --- a/src/m64py/frontend/glwidget.py +++ b/src/m64py/frontend/glwidget.py @@ -19,7 +19,8 @@ from PyQt4.QtCore import * from PyQt4.QtOpenGL import * from m64py.core.defs import * -from m64py.frontend.keymap import SDL_KEYMAP +from m64py.opts import SDL2 +from m64py.frontend.keymap import QT2SDL, QT2SDL2 class GLWidget(QGLWidget): @@ -33,8 +34,7 @@ class GLWidget(QGLWidget): self.setContentsMargins(QMargins()) self.setFocusPolicy(Qt.StrongFocus) self.setFocus(True) - self.connect(self, SIGNAL("toggle_fs()"), - self.toggle_fs) + self.connect(self, SIGNAL("toggle_fs()"), self.toggle_fs) def showEvent(self, event): self.qglClearColor(Qt.black) @@ -63,8 +63,11 @@ class GLWidget(QGLWidget): self.worker.save_snapshot() else: try: - self.worker.send_sdl_keydown( - SDL_KEYMAP[key]) + if SDL2 or self.worker.m64p.core_sdl2: + sdl_key = QT2SDL2[key] + else: + sdl_key = QT2SDL[key] + self.worker.send_sdl_keydown(sdl_key) except KeyError: pass @@ -72,8 +75,11 @@ class GLWidget(QGLWidget): if self.worker.state == M64EMU_RUNNING: key = event.key() try: - self.worker.send_sdl_keyup( - SDL_KEYMAP[key]) + if SDL2 or self.worker.m64p.core_sdl2: + sdl_key = QT2SDL2[key] + else: + sdl_key = QT2SDL[key] + self.worker.send_sdl_keyup(sdl_key) except KeyError: pass diff --git a/src/m64py/frontend/input.py b/src/m64py/frontend/input.py index 55f8090..6711498 100644 --- a/src/m64py/frontend/input.py +++ b/src/m64py/frontend/input.py @@ -19,12 +19,18 @@ import re from PyQt4.QtGui import * from PyQt4.QtCore import * +from m64py.opts import SDL2 from m64py.core.defs import * from m64py.utils import format_tooltip from m64py.frontend.joystick import Joystick -from m64py.frontend.keymap import SDL_KEYMAP, QT_MODIFIERS, QT_KEYSTRING +from m64py.frontend.keymap import QT2SDL, SCANCODE2KEYCODE, KEYCODE2SCANCODE from m64py.ui.input_ui import Ui_InputDialog +if SDL2: + from m64py.SDL2 import * +else: + from m64py.SDL import * + KEY_RE = re.compile("([a-z]+)\((.*)\)") AXIS_RE = re.compile("([a-z]+)\((.*?),(.*?)\)") @@ -42,6 +48,9 @@ class Input(QDialog, Ui_InputDialog): self.add_items() self.connect_signals() + def showEvent(self, event): + self.adjustSize() + def closeEvent(self, event): self.save_config() self.close() @@ -57,9 +66,16 @@ class Input(QDialog, Ui_InputDialog): self.config.open_section(self.section) self.device = self.config.get_parameter("device") self.is_joystick = bool(self.device >= 0) + self.set_items() + self.show() + + def set_items(self): + if not SDL_WasInit(SDL_INIT_VIDEO): + SDL_InitSubSystem(SDL_INIT_VIDEO) self.get_opts(), self.get_keys() self.set_opts(), self.set_keys() - self.show() + if SDL_WasInit(SDL_INIT_VIDEO): + SDL_QuitSubSystem(SDL_INIT_VIDEO) def set_section(self, section): self.section = section @@ -101,8 +117,7 @@ class Input(QDialog, Ui_InputDialog): self.is_joystick = bool(self.config.get_parameter("device") >= 0) if not self.config.parameters[self.section]: self.set_default() - self.get_opts(), self.get_keys() - self.set_opts(), self.set_keys() + self.set_items() def set_default(self): for key in self.keys.keys(): @@ -117,9 +132,14 @@ class Input(QDialog, Ui_InputDialog): if key == "plugged": param = False elif key == "plugin": - param = 1 + if self.is_joystick: + param = 5 + else: + param = 1 elif key == "device": param = -2 + elif key == "mode": + param = 0 self.config.set_default(ptype, key, param, tooltip) self.config.list_parameters() @@ -261,16 +281,11 @@ class Input(QDialog, Ui_InputDialog): if key.startswith("X Axis") or key.startswith("Y Axis"): continue else: - val = KEY_RE.findall(str(widget.text())) - if val: - value = str(widget.text()) - self.config.set_parameter(key, value) + value = self.get_sdl_key(widget.text()) + if value: + self.config.set_parameter(key, "key(%s)" % value) else: - value = self.get_sdl_key(widget.text()) - if value: - self.config.set_parameter(key, "key(%s)" % value) - else: - continue + continue def get_axis(self, axis): param = self.config.get_parameter(axis) @@ -348,29 +363,31 @@ class Input(QDialog, Ui_InputDialog): return [0, 0] def get_sdl_key(self, text): - try: - if text in QT_KEYSTRING.keys(): - key = QT_KEYSTRING[str(text)] - else: + if SDL2 or self.parent.worker.m64p.core_sdl2: + from m64py.SDL2.keyboard import SDL_GetScancodeFromName + if "Shift" in text or "Ctrl" in text or "Alt" in text: + text = "Left %s" % text + return SCANCODE2KEYCODE[SDL_GetScancodeFromName(text)] + else: + try: key = QKeySequence(text).__int__() - return SDL_KEYMAP[key] - except KeyError: - return None + return QT2SDL[key] + except KeyError: + return None def get_key_name(self, sdl_key): if not sdl_key: return "Select..." - try: - key = Qt.Key_unknown - for qt, sdl in SDL_KEYMAP.items(): - if sdl == int(sdl_key): - key = qt - if key in QT_MODIFIERS.keys(): - key = QT_MODIFIERS[key] - except IndexError: - key = Qt.Key_unknown - - text = QKeySequence(key).toString(QKeySequence.PortableText) - if key in QT_MODIFIERS.values(): - text = text.replace("+", "") - return text + if SDL2 or self.parent.worker.m64p.core_sdl2: + from m64py.SDL2.keyboard import SDL_GetScancodeName + try: + text = SDL_GetScancodeName(KEYCODE2SCANCODE[int(sdl_key)]) + except: + return "Select..." + else: + text = SDL_GetKeyName(int(sdl_key)).title() + if not text: + return "Select..." + if "Shift" in text or "Ctrl" in text or "Alt" in text: + text = text.replace("Left ", "") + return text.title() diff --git a/src/m64py/frontend/joystick.py b/src/m64py/frontend/joystick.py index 349800e..92b275c 100644 --- a/src/m64py/frontend/joystick.py +++ b/src/m64py/frontend/joystick.py @@ -19,9 +19,13 @@ from PyQt4.QtCore import QObject, pyqtSignal, QTime, QTimer, SIGNAL -from SDL import * - from m64py.utils import log +from m64py.opts import SDL2 + +if SDL2: + from m64py.SDL2 import * +else: + from m64py.SDL import * JOYSTICK_DEADZONE = 0 JOYSTICK_SENSITIVITY = 0 @@ -79,7 +83,7 @@ class Joystick(QObject): try: self.joystick = SDL_JoystickOpen(stick) - except SDL.error.SDL_Exception, err: + except Exception, err: log.warn(str(err)) if self.joystick: diff --git a/src/m64py/frontend/keymap.py b/src/m64py/frontend/keymap.py index 8409634..63a4fc9 100644 --- a/src/m64py/frontend/keymap.py +++ b/src/m64py/frontend/keymap.py @@ -16,133 +16,390 @@ from PyQt4.QtCore import Qt -from SDL.constants import * +from m64py.SDL.constants import * +from m64py.SDL2.scancode import * -SDL_KEYMAP = { - Qt.Key_0: SDLK_0, - Qt.Key_1: SDLK_1, - Qt.Key_2: SDLK_2, - Qt.Key_3: SDLK_3, - Qt.Key_4: SDLK_4, - Qt.Key_5: SDLK_5, - Qt.Key_6: SDLK_6, - Qt.Key_7: SDLK_7, - Qt.Key_8: SDLK_8, - Qt.Key_9: SDLK_9, - Qt.Key_Ampersand: SDLK_AMPERSAND, - Qt.Key_Asterisk: SDLK_ASTERISK, - Qt.Key_At: SDLK_AT, - Qt.Key_QuoteLeft: SDLK_BACKQUOTE, - Qt.Key_Backslash: SDLK_BACKSLASH, - Qt.Key_Backspace: SDLK_BACKSPACE, - Qt.Key_CapsLock: SDLK_CAPSLOCK, - Qt.Key_AsciiCircum: SDLK_CARET, - Qt.Key_Clear: SDLK_CLEAR, - Qt.Key_Colon: SDLK_COLON, - Qt.Key_Comma: SDLK_COMMA, - Qt.Key_Delete: SDLK_DELETE, - Qt.Key_Dollar: SDLK_DOLLAR, - Qt.Key_Down: SDLK_DOWN, - Qt.Key_End: SDLK_END, - Qt.Key_Equal: SDLK_EQUALS, - Qt.Key_Escape: SDLK_ESCAPE, - Qt.Key_Exclam: SDLK_EXCLAIM, - Qt.Key_F1: SDLK_F1, - Qt.Key_F10: SDLK_F10, - Qt.Key_F11: SDLK_F11, - Qt.Key_F12: SDLK_F12, - Qt.Key_F13: SDLK_F13, - Qt.Key_F14: SDLK_F14, - Qt.Key_F15: SDLK_F15, - Qt.Key_F2: SDLK_F2, - Qt.Key_F3: SDLK_F3, - Qt.Key_F4: SDLK_F4, - Qt.Key_F5: SDLK_F5, - Qt.Key_F6: SDLK_F6, - Qt.Key_F7: SDLK_F7, - Qt.Key_F8: SDLK_F8, - Qt.Key_F9: SDLK_F9, - Qt.Key_Greater: SDLK_GREATER, - Qt.Key_NumberSign: SDLK_HASH, - Qt.Key_Help: SDLK_HELP, - Qt.Key_Home: SDLK_HOME, - Qt.Key_Insert: SDLK_INSERT, - Qt.Key_Left: SDLK_LEFT, - Qt.Key_BracketLeft: SDLK_LEFTBRACKET, - Qt.Key_ParenLeft: SDLK_LEFTPAREN, - Qt.Key_Less: SDLK_LESS, - Qt.Key_Menu: SDLK_MENU, - Qt.Key_Minus: SDLK_MINUS, - Qt.Key_Mode_switch: SDLK_MODE, - Qt.Key_NumLock: SDLK_NUMLOCK, - Qt.Key_PageDown: SDLK_PAGEDOWN, - Qt.Key_PageUp: SDLK_PAGEUP, - Qt.Key_Pause: SDLK_PAUSE, - Qt.Key_Period: SDLK_PERIOD, - Qt.Key_Plus: SDLK_PLUS, - Qt.Key_PowerOff: SDLK_POWER, - Qt.Key_Print: SDLK_PRINT, - Qt.Key_Question: SDLK_QUESTION, - Qt.Key_Apostrophe: SDLK_QUOTE, - Qt.Key_QuoteDbl: SDLK_QUOTEDBL, - Qt.Key_Return: SDLK_RETURN, - Qt.Key_Enter: SDLK_RETURN, - Qt.Key_Right: SDLK_RIGHT, - Qt.Key_BracketRight: SDLK_RIGHTBRACKET, - Qt.Key_ParenRight: SDLK_RIGHTPAREN, - Qt.Key_ScrollLock: SDLK_SCROLLOCK, - Qt.Key_Semicolon: SDLK_SEMICOLON, - Qt.Key_Slash: SDLK_SLASH, - Qt.Key_Space: SDLK_SPACE, - Qt.Key_SysReq: SDLK_SYSREQ, - Qt.Key_Tab: SDLK_TAB, - Qt.Key_Underscore: SDLK_UNDERSCORE, - Qt.Key_unknown: SDLK_UNKNOWN, - Qt.Key_Up: SDLK_UP, - Qt.Key_A: SDLK_a, - Qt.Key_B: SDLK_b, - Qt.Key_C: SDLK_c, - Qt.Key_D: SDLK_d, - Qt.Key_E: SDLK_e, - Qt.Key_F: SDLK_f, - Qt.Key_G: SDLK_g, - Qt.Key_H: SDLK_h, - Qt.Key_I: SDLK_i, - Qt.Key_J: SDLK_j, - Qt.Key_K: SDLK_k, - Qt.Key_L: SDLK_l, - Qt.Key_M: SDLK_m, - Qt.Key_N: SDLK_n, - Qt.Key_O: SDLK_o, - Qt.Key_P: SDLK_p, - Qt.Key_Q: SDLK_q, - Qt.Key_R: SDLK_r, - Qt.Key_S: SDLK_s, - Qt.Key_T: SDLK_t, - Qt.Key_U: SDLK_u, - Qt.Key_V: SDLK_v, - Qt.Key_W: SDLK_w, - Qt.Key_X: SDLK_x, - Qt.Key_Y: SDLK_y, - Qt.Key_Z: SDLK_z, - Qt.Key_Alt: SDLK_LALT, - Qt.Key_Control: SDLK_LCTRL, - Qt.Key_Meta: SDLK_LMETA, - Qt.Key_Shift: SDLK_LSHIFT, - Qt.Key_Super_L: SDLK_LSUPER, - Qt.Key_Super_R: SDLK_RSUPER - } +QT2SDL = {} +QT2SDL2 = {} +SCANCODE2KEYCODE = {} +KEYCODE2SCANCODE = {} -QT_MODIFIERS = { - Qt.Key_Alt: Qt.AltModifier, - Qt.Key_Control: Qt.ControlModifier, - Qt.Key_Meta: Qt.MetaModifier, - Qt.Key_Shift: Qt.ShiftModifier - } +QT2SDL[Qt.Key_A] = SDLK_a +QT2SDL[Qt.Key_B] = SDLK_b +QT2SDL[Qt.Key_C] = SDLK_c +QT2SDL[Qt.Key_D] = SDLK_d +QT2SDL[Qt.Key_E] = SDLK_e +QT2SDL[Qt.Key_F] = SDLK_f +QT2SDL[Qt.Key_G] = SDLK_g +QT2SDL[Qt.Key_H] = SDLK_h +QT2SDL[Qt.Key_I] = SDLK_i +QT2SDL[Qt.Key_J] = SDLK_j +QT2SDL[Qt.Key_K] = SDLK_k +QT2SDL[Qt.Key_L] = SDLK_l +QT2SDL[Qt.Key_M] = SDLK_m +QT2SDL[Qt.Key_N] = SDLK_n +QT2SDL[Qt.Key_O] = SDLK_o +QT2SDL[Qt.Key_P] = SDLK_p +QT2SDL[Qt.Key_Q] = SDLK_q +QT2SDL[Qt.Key_R] = SDLK_r +QT2SDL[Qt.Key_S] = SDLK_s +QT2SDL[Qt.Key_T] = SDLK_t +QT2SDL[Qt.Key_U] = SDLK_u +QT2SDL[Qt.Key_V] = SDLK_v +QT2SDL[Qt.Key_W] = SDLK_w +QT2SDL[Qt.Key_X] = SDLK_x +QT2SDL[Qt.Key_Y] = SDLK_y +QT2SDL[Qt.Key_Z] = SDLK_z +QT2SDL[Qt.Key_0] = SDLK_0 +QT2SDL[Qt.Key_1] = SDLK_1 +QT2SDL[Qt.Key_2] = SDLK_2 +QT2SDL[Qt.Key_3] = SDLK_3 +QT2SDL[Qt.Key_4] = SDLK_4 +QT2SDL[Qt.Key_5] = SDLK_5 +QT2SDL[Qt.Key_6] = SDLK_6 +QT2SDL[Qt.Key_7] = SDLK_7 +QT2SDL[Qt.Key_8] = SDLK_8 +QT2SDL[Qt.Key_9] = SDLK_9 +QT2SDL[Qt.Key_F1] = SDLK_F1 +QT2SDL[Qt.Key_F2] = SDLK_F2 +QT2SDL[Qt.Key_F3] = SDLK_F3 +QT2SDL[Qt.Key_F4] = SDLK_F4 +QT2SDL[Qt.Key_F5] = SDLK_F5 +QT2SDL[Qt.Key_F6] = SDLK_F6 +QT2SDL[Qt.Key_F7] = SDLK_F7 +QT2SDL[Qt.Key_F8] = SDLK_F8 +QT2SDL[Qt.Key_F9] = SDLK_F9 +QT2SDL[Qt.Key_F10] = SDLK_F10 +QT2SDL[Qt.Key_F11] = SDLK_F11 +QT2SDL[Qt.Key_F12] = SDLK_F12 +QT2SDL[Qt.Key_F13] = SDLK_F13 +QT2SDL[Qt.Key_F14] = SDLK_F14 +QT2SDL[Qt.Key_F15] = SDLK_F15 +QT2SDL[Qt.Key_Insert] = SDLK_INSERT +QT2SDL[Qt.Key_Delete] = SDLK_DELETE +QT2SDL[Qt.Key_Home] = SDLK_HOME +QT2SDL[Qt.Key_End] = SDLK_END +QT2SDL[Qt.Key_PageUp] = SDLK_PAGEUP +QT2SDL[Qt.Key_PageDown] = SDLK_PAGEDOWN +QT2SDL[Qt.Key_Up] = SDLK_UP +QT2SDL[Qt.Key_Down] = SDLK_DOWN +QT2SDL[Qt.Key_Left] = SDLK_LEFT +QT2SDL[Qt.Key_Right] = SDLK_RIGHT +QT2SDL[Qt.Key_Enter] = SDLK_KP_ENTER +QT2SDL[Qt.Key_Return] = SDLK_RETURN +QT2SDL[Qt.Key_Escape] = SDLK_ESCAPE +QT2SDL[Qt.Key_Pause] = SDLK_PAUSE +QT2SDL[Qt.Key_QuoteLeft] = SDLK_BACKQUOTE +QT2SDL[Qt.Key_Backspace] = SDLK_BACKSPACE +QT2SDL[Qt.Key_Tab] = SDLK_TAB +QT2SDL[Qt.Key_CapsLock] = SDLK_CAPSLOCK +QT2SDL[Qt.Key_Space] = SDLK_SPACE +QT2SDL[Qt.Key_Slash] = SDLK_SLASH +QT2SDL[Qt.Key_Backslash] = SDLK_BACKSLASH +QT2SDL[Qt.Key_Minus] = SDLK_MINUS +QT2SDL[Qt.Key_Plus] = SDLK_PLUS +QT2SDL[Qt.Key_Equal] = SDLK_EQUALS +QT2SDL[Qt.Key_BracketLeft] = SDLK_LEFTBRACKET +QT2SDL[Qt.Key_BracketRight] = SDLK_RIGHTBRACKET +QT2SDL[Qt.Key_Semicolon] = SDLK_SEMICOLON +QT2SDL[Qt.Key_Apostrophe] = SDLK_QUOTE +QT2SDL[Qt.Key_Comma] = SDLK_COMMA +QT2SDL[Qt.Key_Period] = SDLK_PERIOD +QT2SDL[Qt.Key_Alt] = SDLK_LALT +QT2SDL[Qt.Key_Control] = SDLK_LCTRL +QT2SDL[Qt.Key_Shift] = SDLK_LSHIFT +QT2SDL[Qt.AltModifier.__int__()] = SDLK_LALT +QT2SDL[Qt.ControlModifier.__int__()] = SDLK_LCTRL +QT2SDL[Qt.ShiftModifier.__int__()] = SDLK_LSHIFT +QT2SDL[Qt.Key_Print] = SDLK_PRINT +QT2SDL[Qt.Key_ScrollLock] = SDLK_SCROLLOCK +QT2SDL[Qt.Key_Meta] = SDLK_LMETA +QT2SDL[Qt.MetaModifier.__int__()] = SDLK_LMETA +QT2SDL[Qt.Key_Super_L] = SDLK_LSUPER +QT2SDL[Qt.Key_Super_R] = SDLK_RSUPER +QT2SDL[Qt.Key_unknown] = SDLK_UNKNOWN -QT_KEYSTRING = { - "Alt": Qt.Key_Alt, - "Ctrl": Qt.Key_Control, - "Meta": Qt.Key_Meta, - "Shift": Qt.Key_Shift - } +QT2SDL2[Qt.Key_A] = SDL_SCANCODE_A +QT2SDL2[Qt.Key_B] = SDL_SCANCODE_B +QT2SDL2[Qt.Key_C] = SDL_SCANCODE_C +QT2SDL2[Qt.Key_D] = SDL_SCANCODE_D +QT2SDL2[Qt.Key_E] = SDL_SCANCODE_E +QT2SDL2[Qt.Key_F] = SDL_SCANCODE_F +QT2SDL2[Qt.Key_G] = SDL_SCANCODE_G +QT2SDL2[Qt.Key_H] = SDL_SCANCODE_H +QT2SDL2[Qt.Key_I] = SDL_SCANCODE_I +QT2SDL2[Qt.Key_J] = SDL_SCANCODE_J +QT2SDL2[Qt.Key_K] = SDL_SCANCODE_K +QT2SDL2[Qt.Key_L] = SDL_SCANCODE_L +QT2SDL2[Qt.Key_M] = SDL_SCANCODE_M +QT2SDL2[Qt.Key_N] = SDL_SCANCODE_N +QT2SDL2[Qt.Key_O] = SDL_SCANCODE_O +QT2SDL2[Qt.Key_P] = SDL_SCANCODE_P +QT2SDL2[Qt.Key_Q] = SDL_SCANCODE_Q +QT2SDL2[Qt.Key_R] = SDL_SCANCODE_R +QT2SDL2[Qt.Key_S] = SDL_SCANCODE_S +QT2SDL2[Qt.Key_T] = SDL_SCANCODE_T +QT2SDL2[Qt.Key_U] = SDL_SCANCODE_U +QT2SDL2[Qt.Key_V] = SDL_SCANCODE_V +QT2SDL2[Qt.Key_W] = SDL_SCANCODE_W +QT2SDL2[Qt.Key_X] = SDL_SCANCODE_X +QT2SDL2[Qt.Key_Y] = SDL_SCANCODE_Y +QT2SDL2[Qt.Key_Z] = SDL_SCANCODE_Z +QT2SDL2[Qt.Key_0] = SDL_SCANCODE_0 +QT2SDL2[Qt.Key_1] = SDL_SCANCODE_1 +QT2SDL2[Qt.Key_2] = SDL_SCANCODE_2 +QT2SDL2[Qt.Key_3] = SDL_SCANCODE_3 +QT2SDL2[Qt.Key_4] = SDL_SCANCODE_4 +QT2SDL2[Qt.Key_5] = SDL_SCANCODE_5 +QT2SDL2[Qt.Key_6] = SDL_SCANCODE_6 +QT2SDL2[Qt.Key_7] = SDL_SCANCODE_7 +QT2SDL2[Qt.Key_8] = SDL_SCANCODE_8 +QT2SDL2[Qt.Key_9] = SDL_SCANCODE_9 +QT2SDL2[Qt.Key_F1] = SDL_SCANCODE_F1 +QT2SDL2[Qt.Key_F2] = SDL_SCANCODE_F2 +QT2SDL2[Qt.Key_F3] = SDL_SCANCODE_F3 +QT2SDL2[Qt.Key_F4] = SDL_SCANCODE_F4 +QT2SDL2[Qt.Key_F5] = SDL_SCANCODE_F5 +QT2SDL2[Qt.Key_F6] = SDL_SCANCODE_F6 +QT2SDL2[Qt.Key_F7] = SDL_SCANCODE_F7 +QT2SDL2[Qt.Key_F8] = SDL_SCANCODE_F8 +QT2SDL2[Qt.Key_F9] = SDL_SCANCODE_F9 +QT2SDL2[Qt.Key_F10] = SDL_SCANCODE_F10 +QT2SDL2[Qt.Key_F11] = SDL_SCANCODE_F11 +QT2SDL2[Qt.Key_F12] = SDL_SCANCODE_F12 +QT2SDL2[Qt.Key_F13] = SDL_SCANCODE_F13 +QT2SDL2[Qt.Key_F14] = SDL_SCANCODE_F14 +QT2SDL2[Qt.Key_F15] = SDL_SCANCODE_F15 +QT2SDL2[Qt.Key_Insert] = SDL_SCANCODE_INSERT +QT2SDL2[Qt.Key_Delete] = SDL_SCANCODE_DELETE +QT2SDL2[Qt.Key_Home] = SDL_SCANCODE_HOME +QT2SDL2[Qt.Key_End] = SDL_SCANCODE_END +QT2SDL2[Qt.Key_PageUp] = SDL_SCANCODE_PAGEUP +QT2SDL2[Qt.Key_PageDown] = SDL_SCANCODE_PAGEDOWN +QT2SDL2[Qt.Key_Up] = SDL_SCANCODE_UP +QT2SDL2[Qt.Key_Down] = SDL_SCANCODE_DOWN +QT2SDL2[Qt.Key_Left] = SDL_SCANCODE_LEFT +QT2SDL2[Qt.Key_Right] = SDL_SCANCODE_RIGHT +QT2SDL2[Qt.Key_Return] = SDL_SCANCODE_RETURN +QT2SDL2[Qt.Key_Enter] = SDL_SCANCODE_RETURN2 +QT2SDL2[Qt.Key_Escape] = SDL_SCANCODE_ESCAPE +QT2SDL2[Qt.Key_Pause] = SDL_SCANCODE_PAUSE +QT2SDL2[Qt.Key_QuoteLeft] = SDL_SCANCODE_GRAVE +QT2SDL2[Qt.Key_Backspace] = SDL_SCANCODE_BACKSPACE +QT2SDL2[Qt.Key_Tab] = SDL_SCANCODE_TAB +QT2SDL2[Qt.Key_CapsLock] = SDL_SCANCODE_CAPSLOCK +QT2SDL2[Qt.Key_Space] = SDL_SCANCODE_SPACE +QT2SDL2[Qt.Key_Slash] = SDL_SCANCODE_SLASH +QT2SDL2[Qt.Key_Backslash] = SDL_SCANCODE_BACKSLASH +QT2SDL2[Qt.Key_Minus] = SDL_SCANCODE_MINUS +QT2SDL2[Qt.Key_Plus] = SDL_SCANCODE_UNKNOWN +QT2SDL2[Qt.Key_Equal] = SDL_SCANCODE_EQUALS +QT2SDL2[Qt.Key_BracketLeft] = SDL_SCANCODE_LEFTBRACKET +QT2SDL2[Qt.Key_BracketRight] = SDL_SCANCODE_RIGHTBRACKET +QT2SDL2[Qt.Key_Semicolon] = SDL_SCANCODE_SEMICOLON +QT2SDL2[Qt.Key_Apostrophe] = SDL_SCANCODE_APOSTROPHE +QT2SDL2[Qt.Key_Comma] = SDL_SCANCODE_COMMA +QT2SDL2[Qt.Key_Period] = SDL_SCANCODE_PERIOD +QT2SDL2[Qt.Key_Alt] = SDL_SCANCODE_LALT +QT2SDL2[Qt.Key_Control] = SDL_SCANCODE_LCTRL +QT2SDL2[Qt.Key_Shift] = SDL_SCANCODE_LSHIFT +QT2SDL2[Qt.AltModifier.__int__()] = SDL_SCANCODE_LALT +QT2SDL2[Qt.ControlModifier.__int__()] = SDL_SCANCODE_LCTRL +QT2SDL2[Qt.ShiftModifier.__int__()] = SDL_SCANCODE_LSHIFT +QT2SDL2[Qt.Key_Print] = SDL_SCANCODE_PRINTSCREEN +QT2SDL2[Qt.Key_ScrollLock] = SDL_SCANCODE_SCROLLLOCK +QT2SDL2[Qt.Key_Meta] = SDL_SCANCODE_LGUI +QT2SDL2[Qt.MetaModifier.__int__()] = SDL_SCANCODE_LGUI +QT2SDL2[Qt.Key_Super_L] = SDL_SCANCODE_LGUI +QT2SDL2[Qt.Key_Super_R] = SDL_SCANCODE_RGUI +QT2SDL2[Qt.Key_unknown] = SDL_SCANCODE_UNKNOWN + +SCANCODE2KEYCODE[SDL_SCANCODE_A] = SDLK_a +SCANCODE2KEYCODE[SDL_SCANCODE_B] = SDLK_b +SCANCODE2KEYCODE[SDL_SCANCODE_C] = SDLK_c +SCANCODE2KEYCODE[SDL_SCANCODE_D] = SDLK_d +SCANCODE2KEYCODE[SDL_SCANCODE_E] = SDLK_e +SCANCODE2KEYCODE[SDL_SCANCODE_F] = SDLK_f +SCANCODE2KEYCODE[SDL_SCANCODE_G] = SDLK_g +SCANCODE2KEYCODE[SDL_SCANCODE_H] = SDLK_h +SCANCODE2KEYCODE[SDL_SCANCODE_I] = SDLK_i +SCANCODE2KEYCODE[SDL_SCANCODE_J] = SDLK_j +SCANCODE2KEYCODE[SDL_SCANCODE_K] = SDLK_k +SCANCODE2KEYCODE[SDL_SCANCODE_L] = SDLK_l +SCANCODE2KEYCODE[SDL_SCANCODE_M] = SDLK_m +SCANCODE2KEYCODE[SDL_SCANCODE_N] = SDLK_n +SCANCODE2KEYCODE[SDL_SCANCODE_O] = SDLK_o +SCANCODE2KEYCODE[SDL_SCANCODE_P] = SDLK_p +SCANCODE2KEYCODE[SDL_SCANCODE_Q] = SDLK_q +SCANCODE2KEYCODE[SDL_SCANCODE_R] = SDLK_r +SCANCODE2KEYCODE[SDL_SCANCODE_S] = SDLK_s +SCANCODE2KEYCODE[SDL_SCANCODE_T] = SDLK_t +SCANCODE2KEYCODE[SDL_SCANCODE_U] = SDLK_u +SCANCODE2KEYCODE[SDL_SCANCODE_V] = SDLK_v +SCANCODE2KEYCODE[SDL_SCANCODE_W] = SDLK_w +SCANCODE2KEYCODE[SDL_SCANCODE_X] = SDLK_x +SCANCODE2KEYCODE[SDL_SCANCODE_Y] = SDLK_y +SCANCODE2KEYCODE[SDL_SCANCODE_Z] = SDLK_z +SCANCODE2KEYCODE[SDL_SCANCODE_0] = SDLK_0 +SCANCODE2KEYCODE[SDL_SCANCODE_1] = SDLK_1 +SCANCODE2KEYCODE[SDL_SCANCODE_2] = SDLK_2 +SCANCODE2KEYCODE[SDL_SCANCODE_3] = SDLK_3 +SCANCODE2KEYCODE[SDL_SCANCODE_4] = SDLK_4 +SCANCODE2KEYCODE[SDL_SCANCODE_5] = SDLK_5 +SCANCODE2KEYCODE[SDL_SCANCODE_6] = SDLK_6 +SCANCODE2KEYCODE[SDL_SCANCODE_7] = SDLK_7 +SCANCODE2KEYCODE[SDL_SCANCODE_8] = SDLK_8 +SCANCODE2KEYCODE[SDL_SCANCODE_9] = SDLK_9 +SCANCODE2KEYCODE[SDL_SCANCODE_F1] = SDLK_F1 +SCANCODE2KEYCODE[SDL_SCANCODE_F2] = SDLK_F2 +SCANCODE2KEYCODE[SDL_SCANCODE_F3] = SDLK_F3 +SCANCODE2KEYCODE[SDL_SCANCODE_F4] = SDLK_F4 +SCANCODE2KEYCODE[SDL_SCANCODE_F5] = SDLK_F5 +SCANCODE2KEYCODE[SDL_SCANCODE_F6] = SDLK_F6 +SCANCODE2KEYCODE[SDL_SCANCODE_F7] = SDLK_F7 +SCANCODE2KEYCODE[SDL_SCANCODE_F8] = SDLK_F8 +SCANCODE2KEYCODE[SDL_SCANCODE_F9] = SDLK_F9 +SCANCODE2KEYCODE[SDL_SCANCODE_F10] = SDLK_F10 +SCANCODE2KEYCODE[SDL_SCANCODE_F11] = SDLK_F11 +SCANCODE2KEYCODE[SDL_SCANCODE_F12] = SDLK_F12 +SCANCODE2KEYCODE[SDL_SCANCODE_F13] = SDLK_F13 +SCANCODE2KEYCODE[SDL_SCANCODE_F14] = SDLK_F14 +SCANCODE2KEYCODE[SDL_SCANCODE_F15] = SDLK_F15 +SCANCODE2KEYCODE[SDL_SCANCODE_INSERT] = SDLK_INSERT +SCANCODE2KEYCODE[SDL_SCANCODE_DELETE] = SDLK_DELETE +SCANCODE2KEYCODE[SDL_SCANCODE_HOME] = SDLK_HOME +SCANCODE2KEYCODE[SDL_SCANCODE_END] = SDLK_END +SCANCODE2KEYCODE[SDL_SCANCODE_PAGEUP] = SDLK_PAGEUP +SCANCODE2KEYCODE[SDL_SCANCODE_PAGEDOWN] = SDLK_PAGEDOWN +SCANCODE2KEYCODE[SDL_SCANCODE_UP] = SDLK_UP +SCANCODE2KEYCODE[SDL_SCANCODE_DOWN] = SDLK_DOWN +SCANCODE2KEYCODE[SDL_SCANCODE_LEFT] = SDLK_LEFT +SCANCODE2KEYCODE[SDL_SCANCODE_RIGHT] = SDLK_RIGHT +SCANCODE2KEYCODE[SDL_SCANCODE_RETURN2] = SDLK_KP_ENTER +SCANCODE2KEYCODE[SDL_SCANCODE_RETURN] = SDLK_RETURN +SCANCODE2KEYCODE[SDL_SCANCODE_ESCAPE] = SDLK_ESCAPE +SCANCODE2KEYCODE[SDL_SCANCODE_PAUSE] = SDLK_PAUSE +SCANCODE2KEYCODE[SDL_SCANCODE_GRAVE] = SDLK_BACKQUOTE +SCANCODE2KEYCODE[SDL_SCANCODE_BACKSPACE] = SDLK_BACKSPACE +SCANCODE2KEYCODE[SDL_SCANCODE_TAB] = SDLK_TAB +SCANCODE2KEYCODE[SDL_SCANCODE_CAPSLOCK] = SDLK_CAPSLOCK +SCANCODE2KEYCODE[SDL_SCANCODE_SPACE] = SDLK_SPACE +SCANCODE2KEYCODE[SDL_SCANCODE_SLASH] = SDLK_SLASH +SCANCODE2KEYCODE[SDL_SCANCODE_BACKSLASH] = SDLK_BACKSLASH +SCANCODE2KEYCODE[SDL_SCANCODE_MINUS] = SDLK_MINUS +SCANCODE2KEYCODE[SDL_SCANCODE_UNKNOWN] = SDLK_PLUS +SCANCODE2KEYCODE[SDL_SCANCODE_EQUALS] = SDLK_EQUALS +SCANCODE2KEYCODE[SDL_SCANCODE_LEFTBRACKET] = SDLK_LEFTBRACKET +SCANCODE2KEYCODE[SDL_SCANCODE_RIGHTBRACKET] = SDLK_RIGHTBRACKET +SCANCODE2KEYCODE[SDL_SCANCODE_SEMICOLON] = SDLK_SEMICOLON +SCANCODE2KEYCODE[SDL_SCANCODE_APOSTROPHE] = SDLK_QUOTE +SCANCODE2KEYCODE[SDL_SCANCODE_COMMA] = SDLK_COMMA +SCANCODE2KEYCODE[SDL_SCANCODE_PERIOD] = SDLK_PERIOD +SCANCODE2KEYCODE[SDL_SCANCODE_LALT] = SDLK_LALT +SCANCODE2KEYCODE[SDL_SCANCODE_LCTRL] = SDLK_LCTRL +SCANCODE2KEYCODE[SDL_SCANCODE_LSHIFT] = SDLK_LSHIFT +SCANCODE2KEYCODE[SDL_SCANCODE_LALT] = SDLK_LALT +SCANCODE2KEYCODE[SDL_SCANCODE_LCTRL] = SDLK_LCTRL +SCANCODE2KEYCODE[SDL_SCANCODE_LSHIFT] = SDLK_LSHIFT +SCANCODE2KEYCODE[SDL_SCANCODE_PRINTSCREEN] = SDLK_PRINT +SCANCODE2KEYCODE[SDL_SCANCODE_SCROLLLOCK] = SDLK_SCROLLOCK +SCANCODE2KEYCODE[SDL_SCANCODE_LGUI] = SDLK_LMETA +SCANCODE2KEYCODE[SDL_SCANCODE_LGUI] = SDLK_LMETA +SCANCODE2KEYCODE[SDL_SCANCODE_LGUI] = SDLK_LSUPER +SCANCODE2KEYCODE[SDL_SCANCODE_RGUI] = SDLK_RSUPER +SCANCODE2KEYCODE[SDL_SCANCODE_UNKNOWN] = SDLK_UNKNOWN + +KEYCODE2SCANCODE[SDLK_a] = SDL_SCANCODE_A +KEYCODE2SCANCODE[SDLK_b] = SDL_SCANCODE_B +KEYCODE2SCANCODE[SDLK_c] = SDL_SCANCODE_C +KEYCODE2SCANCODE[SDLK_d] = SDL_SCANCODE_D +KEYCODE2SCANCODE[SDLK_e] = SDL_SCANCODE_E +KEYCODE2SCANCODE[SDLK_f] = SDL_SCANCODE_F +KEYCODE2SCANCODE[SDLK_g] = SDL_SCANCODE_G +KEYCODE2SCANCODE[SDLK_h] = SDL_SCANCODE_H +KEYCODE2SCANCODE[SDLK_i] = SDL_SCANCODE_I +KEYCODE2SCANCODE[SDLK_j] = SDL_SCANCODE_J +KEYCODE2SCANCODE[SDLK_k] = SDL_SCANCODE_K +KEYCODE2SCANCODE[SDLK_l] = SDL_SCANCODE_L +KEYCODE2SCANCODE[SDLK_m] = SDL_SCANCODE_M +KEYCODE2SCANCODE[SDLK_n] = SDL_SCANCODE_N +KEYCODE2SCANCODE[SDLK_o] = SDL_SCANCODE_O +KEYCODE2SCANCODE[SDLK_p] = SDL_SCANCODE_P +KEYCODE2SCANCODE[SDLK_q] = SDL_SCANCODE_Q +KEYCODE2SCANCODE[SDLK_r] = SDL_SCANCODE_R +KEYCODE2SCANCODE[SDLK_s] = SDL_SCANCODE_S +KEYCODE2SCANCODE[SDLK_t] = SDL_SCANCODE_T +KEYCODE2SCANCODE[SDLK_u] = SDL_SCANCODE_U +KEYCODE2SCANCODE[SDLK_v] = SDL_SCANCODE_V +KEYCODE2SCANCODE[SDLK_w] = SDL_SCANCODE_W +KEYCODE2SCANCODE[SDLK_x] = SDL_SCANCODE_X +KEYCODE2SCANCODE[SDLK_y] = SDL_SCANCODE_Y +KEYCODE2SCANCODE[SDLK_z] = SDL_SCANCODE_Z +KEYCODE2SCANCODE[SDLK_0] = SDL_SCANCODE_0 +KEYCODE2SCANCODE[SDLK_1] = SDL_SCANCODE_1 +KEYCODE2SCANCODE[SDLK_2] = SDL_SCANCODE_2 +KEYCODE2SCANCODE[SDLK_3] = SDL_SCANCODE_3 +KEYCODE2SCANCODE[SDLK_4] = SDL_SCANCODE_4 +KEYCODE2SCANCODE[SDLK_5] = SDL_SCANCODE_5 +KEYCODE2SCANCODE[SDLK_6] = SDL_SCANCODE_6 +KEYCODE2SCANCODE[SDLK_7] = SDL_SCANCODE_7 +KEYCODE2SCANCODE[SDLK_8] = SDL_SCANCODE_8 +KEYCODE2SCANCODE[SDLK_9] = SDL_SCANCODE_9 +KEYCODE2SCANCODE[SDLK_F1] = SDL_SCANCODE_F1 +KEYCODE2SCANCODE[SDLK_F2] = SDL_SCANCODE_F2 +KEYCODE2SCANCODE[SDLK_F3] = SDL_SCANCODE_F3 +KEYCODE2SCANCODE[SDLK_F4] = SDL_SCANCODE_F4 +KEYCODE2SCANCODE[SDLK_F5] = SDL_SCANCODE_F5 +KEYCODE2SCANCODE[SDLK_F6] = SDL_SCANCODE_F6 +KEYCODE2SCANCODE[SDLK_F7] = SDL_SCANCODE_F7 +KEYCODE2SCANCODE[SDLK_F8] = SDL_SCANCODE_F8 +KEYCODE2SCANCODE[SDLK_F9] = SDL_SCANCODE_F9 +KEYCODE2SCANCODE[SDLK_F10] = SDL_SCANCODE_F10 +KEYCODE2SCANCODE[SDLK_F11] = SDL_SCANCODE_F11 +KEYCODE2SCANCODE[SDLK_F12] = SDL_SCANCODE_F12 +KEYCODE2SCANCODE[SDLK_F13] = SDL_SCANCODE_F13 +KEYCODE2SCANCODE[SDLK_F14] = SDL_SCANCODE_F14 +KEYCODE2SCANCODE[SDLK_F15] = SDL_SCANCODE_F15 +KEYCODE2SCANCODE[SDLK_INSERT] = SDL_SCANCODE_INSERT +KEYCODE2SCANCODE[SDLK_DELETE] = SDL_SCANCODE_DELETE +KEYCODE2SCANCODE[SDLK_HOME] = SDL_SCANCODE_HOME +KEYCODE2SCANCODE[SDLK_END] = SDL_SCANCODE_END +KEYCODE2SCANCODE[SDLK_PAGEUP] = SDL_SCANCODE_PAGEUP +KEYCODE2SCANCODE[SDLK_PAGEDOWN] = SDL_SCANCODE_PAGEDOWN +KEYCODE2SCANCODE[SDLK_UP] = SDL_SCANCODE_UP +KEYCODE2SCANCODE[SDLK_DOWN] = SDL_SCANCODE_DOWN +KEYCODE2SCANCODE[SDLK_LEFT] = SDL_SCANCODE_LEFT +KEYCODE2SCANCODE[SDLK_RIGHT] = SDL_SCANCODE_RIGHT +KEYCODE2SCANCODE[SDLK_KP_ENTER] = SDL_SCANCODE_RETURN2 +KEYCODE2SCANCODE[SDLK_RETURN] = SDL_SCANCODE_RETURN +KEYCODE2SCANCODE[SDLK_ESCAPE] = SDL_SCANCODE_ESCAPE +KEYCODE2SCANCODE[SDLK_PAUSE] = SDL_SCANCODE_PAUSE +KEYCODE2SCANCODE[SDLK_BACKQUOTE] = SDL_SCANCODE_GRAVE +KEYCODE2SCANCODE[SDLK_BACKSPACE] = SDL_SCANCODE_BACKSPACE +KEYCODE2SCANCODE[SDLK_TAB] = SDL_SCANCODE_TAB +KEYCODE2SCANCODE[SDLK_CAPSLOCK] = SDL_SCANCODE_CAPSLOCK +KEYCODE2SCANCODE[SDLK_SPACE] = SDL_SCANCODE_SPACE +KEYCODE2SCANCODE[SDLK_SLASH] = SDL_SCANCODE_SLASH +KEYCODE2SCANCODE[SDLK_BACKSLASH] = SDL_SCANCODE_BACKSLASH +KEYCODE2SCANCODE[SDLK_MINUS] = SDL_SCANCODE_MINUS +KEYCODE2SCANCODE[SDLK_PLUS] = SDL_SCANCODE_UNKNOWN +KEYCODE2SCANCODE[SDLK_EQUALS] = SDL_SCANCODE_EQUALS +KEYCODE2SCANCODE[SDLK_LEFTBRACKET] = SDL_SCANCODE_LEFTBRACKET +KEYCODE2SCANCODE[SDLK_RIGHTBRACKET] = SDL_SCANCODE_RIGHTBRACKET +KEYCODE2SCANCODE[SDLK_SEMICOLON] = SDL_SCANCODE_SEMICOLON +KEYCODE2SCANCODE[SDLK_QUOTE] = SDL_SCANCODE_APOSTROPHE +KEYCODE2SCANCODE[SDLK_COMMA] = SDL_SCANCODE_COMMA +KEYCODE2SCANCODE[SDLK_PERIOD] = SDL_SCANCODE_PERIOD +KEYCODE2SCANCODE[SDLK_LALT] = SDL_SCANCODE_LALT +KEYCODE2SCANCODE[SDLK_LCTRL] = SDL_SCANCODE_LCTRL +KEYCODE2SCANCODE[SDLK_LSHIFT] = SDL_SCANCODE_LSHIFT +KEYCODE2SCANCODE[SDLK_LALT] = SDL_SCANCODE_LALT +KEYCODE2SCANCODE[SDLK_LCTRL] = SDL_SCANCODE_LCTRL +KEYCODE2SCANCODE[SDLK_LSHIFT] = SDL_SCANCODE_LSHIFT +KEYCODE2SCANCODE[SDLK_PRINT] = SDL_SCANCODE_PRINTSCREEN +KEYCODE2SCANCODE[SDLK_SCROLLOCK] = SDL_SCANCODE_SCROLLLOCK +KEYCODE2SCANCODE[SDLK_LMETA] = SDL_SCANCODE_LGUI +KEYCODE2SCANCODE[SDLK_LMETA] = SDL_SCANCODE_LGUI +KEYCODE2SCANCODE[SDLK_LSUPER] = SDL_SCANCODE_LGUI +KEYCODE2SCANCODE[SDLK_RSUPER] = SDL_SCANCODE_RGUI +KEYCODE2SCANCODE[SDLK_UNKNOWN] = SDL_SCANCODE_UNKNOWN diff --git a/src/m64py/frontend/worker.py b/src/m64py/frontend/worker.py index 330ad60..ecb22fd 100644 --- a/src/m64py/frontend/worker.py +++ b/src/m64py/frontend/worker.py @@ -23,6 +23,7 @@ from PyQt4.QtCore import * from m64py.core.defs import * from m64py.utils import log from m64py.loader import find_library +from m64py.screensaver import screensaver from m64py.core.core import Core from m64py.core.vidext import video from m64py.archive import Archive @@ -77,7 +78,7 @@ class Worker(QThread): else: path_library = self.settings.qset.value( "Paths/Library", find_library(CORE_NAME)) - self.m64p.core_load(path_library, self.use_vidext) + self.m64p.core_load(str(path_library), self.use_vidext) def core_shutdown(self): """Shutdowns core library.""" @@ -128,6 +129,9 @@ class Worker(QThread): del romfile self.m64p.rom_get_header() self.m64p.rom_get_settings() + if bool(int(self.settings.qset.value( + "disable_screensaver", 1))): + screensaver.disable() self.parent.emit(SIGNAL("rom_opened()")) self.parent.recent_files.add(self.filepath) @@ -136,6 +140,9 @@ class Worker(QThread): self.m64p.detach_plugins() self.m64p.plugins_shutdown() self.m64p.rom_close() + if bool(int(self.settings.qset.value( + "disable_screensaver", 1))): + screensaver.enable() self.parent.emit(SIGNAL("rom_closed()")) def core_state_query(self, state): @@ -158,7 +165,7 @@ class Worker(QThread): for filename in os.listdir(path): if filename.startswith(rom_name): screenshots.append(os.path.join( - screenshots_path, filename)) + path, filename)) if screenshots: return sorted(screenshots)[-1] return None @@ -253,8 +260,14 @@ class Worker(QThread): """Toggles pause.""" if self.state == M64EMU_RUNNING: self.m64p.pause() + if bool(int(self.settings.qset.value( + "disable_screensaver", 1))): + screensaver.enable() elif self.state == M64EMU_PAUSED: self.m64p.resume() + if bool(int(self.settings.qset.value( + "disable_screensaver", 1))): + screensaver.disable() self.toggle_actions() def toggle_mute(self): diff --git a/src/m64py/loader.py b/src/m64py/loader.py index 44901da..7a41c58 100644 --- a/src/m64py/loader.py +++ b/src/m64py/loader.py @@ -56,7 +56,6 @@ class LibraryLoader(object): self.other_dirs=[] def find_library(self, libname): - """Given the name of a library, return path.""" paths = self.getpaths(libname) for path in paths: if os.path.exists(path): @@ -64,7 +63,6 @@ class LibraryLoader(object): return None def load_library(self, libname): - """Given the name of a library, load it.""" paths = self.getpaths(libname) for path in paths: if os.path.exists(path): @@ -75,7 +73,6 @@ class LibraryLoader(object): dlclose(tdll._handle) def load(self, path): - """Given a path to a library, load it.""" try: # Darwin requires dlopen to be called with mode RTLD_GLOBAL instead # of the default RTLD_LOCAL. Without this, you end up with @@ -89,7 +86,6 @@ class LibraryLoader(object): raise ImportError(e) def getpaths(self, libname): - """Return a list of paths where the library might be found.""" if os.path.isabs(libname): yield libname @@ -103,10 +99,9 @@ class LibraryLoader(object): def getplatformpaths(self, libname): return [] -# Darwin (Mac OS X) class DarwinLibraryLoader(LibraryLoader): - name_formats = ["lib%s.dylib", "lib%s.so", "lib%s.bundle", "%s.dylib", - "%s.so", "%s.bundle", "%s"] + name_formats = ["lib%s.dylib", "lib%s.so", "lib%s.bundle", + "%s.dylib", "%s.so", "%s.bundle", "%s"] def getplatformpaths(self, libname): if os.path.pathsep in libname: @@ -135,7 +130,6 @@ class DarwinLibraryLoader(LibraryLoader): '/usr/local/lib', '/usr/lib'] dirs = [] - if '/' in libname: dirs.extend(_environ_path("DYLD_LIBRARY_PATH")) else: @@ -152,10 +146,8 @@ class DarwinLibraryLoader(LibraryLoader): 'Frameworks')) dirs.extend(dyld_fallback_library_path) - return dirs -# Posix class PosixLibraryLoader(LibraryLoader): _ld_so_cache = None @@ -178,8 +170,10 @@ class PosixLibraryLoader(LibraryLoader): directories.extend(self.other_dirs) directories.append(".") - try: directories.extend([dir.strip() for dir in open('/etc/ld.so.conf')]) - except IOError: pass + try: + directories.extend([dir.strip() for dir in open('/etc/ld.so.conf')]) + except IOError: + pass directories.extend(['/lib', '/usr/lib', '/lib64', '/usr/lib64', '/usr/games/lib', '/usr/games/lib64', @@ -217,7 +211,6 @@ class PosixLibraryLoader(LibraryLoader): path = ctypes.util.find_library(libname) if path: yield os.path.join("/lib",path) -# Windows class _WindowsLibrary(object): def __init__(self, path): try: @@ -226,7 +219,7 @@ class _WindowsLibrary(object): self.windll = ctypes.windll.LoadLibrary(path) except WindowsError: os.environ['PATH'] = ';'.join( - [os.path.dirname(path), os.environ['PATH']]) + [os.path.dirname(path), os.environ['PATH']]) path = os.path.basename(path) self.cdll = ctypes.cdll.LoadLibrary(path) self.windll = ctypes.windll.LoadLibrary(path) @@ -276,7 +269,6 @@ class WindowsLibraryLoader(LibraryLoader): if path: yield path -# Platform switching loaderclass = { "darwin": DarwinLibraryLoader, "cygwin": WindowsLibraryLoader, @@ -287,7 +279,7 @@ loader = loaderclass.get(sys.platform, PosixLibraryLoader)() load = loader.load load_library = loader.load_library -unload_library = loader.unload_library find_library = loader.find_library +unload_library = loader.unload_library del loaderclass diff --git a/src/m64py/opts.py b/src/m64py/opts.py index 0ccfa47..f8eacef 100644 --- a/src/m64py/opts.py +++ b/src/m64py/opts.py @@ -20,7 +20,9 @@ from m64py.core.defs import FRONTEND_VERSION usage = 'usage: %prog ' parser = OptionParser(usage=usage, version="M64Py Version %s" % FRONTEND_VERSION) -parser.add_option("-v", "--verbose", action="store_true", dest="verbose") +parser.add_option("-v", "--verbose", action="store_true", dest="verbose", help="show verbose output") +parser.add_option("--sdl2", action="store_true", dest="sdl2", help="use libSDL2 library") opts, args = parser.parse_args() +SDL2 = opts.sdl2 VERBOSE = opts.verbose diff --git a/src/m64py/platform.py b/src/m64py/platform.py index 38c137d..fe47324 100644 --- a/src/m64py/platform.py +++ b/src/m64py/platform.py @@ -18,6 +18,7 @@ import os import sys if sys.platform.startswith("linux"): + LDD_CMD = "ldd %s | grep -q SDL2" DLL_EXT = ".so" DLL_FILTER = ".so.2" DEFAULT_DYNLIB = "libmupen64plus.so.2" @@ -31,6 +32,7 @@ if sys.platform.startswith("linux"): "." ] elif sys.platform == "darwin": + LDD_CMD = "otool -L %s | grep -q SDL2" DLL_EXT = ".dylib" DLL_FILTER = ".dylib" DEFAULT_DYNLIB = "libmupen64plus.dylib" @@ -41,6 +43,7 @@ elif sys.platform == "darwin": "." ] elif sys.platform == "win32": + LDD_CMD = "" DLL_EXT = ".dll" DLL_FILTER = ".dll" DEFAULT_DYNLIB = "mupen64plus.dll" diff --git a/src/m64py/ui/icons/action_graphics.png b/src/m64py/ui/icons/action_graphics.png new file mode 100644 index 0000000..f244adb Binary files /dev/null and b/src/m64py/ui/icons/action_graphics.png differ