--- orca.py 2011-11-08 17:16:28.736222017 -0500 +++ orca.py.saved 2011-11-08 17:11:33.584217326 -0500 @@ -1424,12 +1424,36 @@ cmd = [] if "Caps_Lock" in settings.orcaModifierKeys: - os.system("setxkbmap -option caps:orca") + cmd.append("clear Lock") _capsLockCleared = True elif _capsLockCleared: - os.system("setxkbmap -option") + cmd.append("add Lock = Caps_Lock") _capsLockCleared = False + # Clear other keysyms so that we always treat the Orca modifier as + # the Orca modifier (e.g. remove KP_0 from KP_Insert). + # + for keyName in settings.orcaModifierKeys: + if keyName in ["Caps_Lock", "KP_Insert", "Insert"]: + cmd.append("keysym %s = %s" % (keyName, keyName)) + + os.system("echo '%s' | xmodmap - > /dev/null 2>&1" % "\n".join(cmd)) + +def _storeXmodmap(keyList): + """Save the original xmodmap for the keys in keyList before we alter it. + + Arguments: + - keyList: A list of named keys to look for. + """ + + global _originalXmodmap + + items = "|".join(keyList) + cmd = "xmodmap -pke | grep -E '(%s)'" % items + filehandle = os.popen(cmd) + _originalXmodmap = filehandle.read() + filehandle.close() + def _restoreXmodmap(keyList=[]): """Restore the original xmodmap values for the keys in keyList. @@ -1438,11 +1462,22 @@ to restore the entire saved xmodmap. """ + toRestore = [] + lines = _originalXmodmap.split("\n") + if not keyList: + toRestore = lines + + for key in keyList: + line = filter(lambda k: " %s" % key in k, lines) + toRestore.extend(line) + global _capsLockCleared if _capsLockCleared: - os.system("setxkbmap -option") + toRestore.append("add Lock = Caps_Lock") _capsLockCleared = False + os.system("echo '%s' | xmodmap - > /dev/null 2>&1" % "\n".join(toRestore)) + def loadUserSettings(script=None, inputEvent=None, skipReloadMessage=False): """Loads (and reloads) the user settings module, reinitializing things such as speech if necessary. @@ -1553,6 +1588,7 @@ if _originalXmodmap: _restoreXmodmap(_orcaModifiers) + _storeXmodmap(_orcaModifiers) _createOrcaXmodmap() showMainWindowGUI()