Hy Bill,
I tryed your last attached patch with my Oneiric system, The patch works
wonderful with Orca master version. Thank you this patch.
I attaching now a git diff command generated patch.
Beginner users easyest appliing this patch, if already downloaded for
example with Orca master version from git repository without need going
in src/orca directory and run patch -p0 command. This situation need
doing following:
1. Please go to top of the Orca main source directory.
2. Run simple following command:
patch -p1 <capslock.patch
If the patch is right applied, you will be see the patch is applied with
src/orca/orca.py file.
3. Do ./autogen.sh, make, make install commands, and restart Orca. After
this nothing need doing, the Orca caps lock related issue is resolved.
I not tested this patch with orca-xdesktop branch, because my Lucid
system this issue is not happening.
If you not need doing any work this issue related your patch, please
attach your patch with following bugreport:
https://bugzilla.gnome.org/show_bug.cgi?id=658122
Hopefuly this way fix is acceptable with upstream level, and short time
will be Joanie or other Orca developer committing this fix.
Attila
diff --git a/src/orca/orca.py b/src/orca/orca.py
index ecd57cd..2014c06 100644
--- a/src/orca/orca.py
+++ b/src/orca/orca.py
@@ -29,6 +29,8 @@ __license__ = "LGPL"
import getopt
import os
+import subprocess
+import re
import signal
import sys
import time
@@ -1415,6 +1417,45 @@ def toggleSilenceSpeech(script=None, inputEvent=None):
settings.silenceSpeech = True
return True
+def _setXmodmap(xkbmap):
+ """Set the keyboard map using xkbcomp."""
+ p = subprocess.Popen(['xkbcomp', '-w0', '-', os.environ['DISPLAY']],
+ stdin=subprocess.PIPE, stdout=None, stderr=None)
+ p.communicate(xkbmap)
+
+def _setCapsLockAsOrcaModifier(enable):
+ """Enable or disable use of the caps lock key as an Orca modifier key."""
+ interpretCapsLineProg = re.compile(
+ r'^\s*interpret\s+Caps[_+]Lock[_+]AnyOfOrNone\s*\(all\)\s*{\s*$', re.I)
+ capsModLineProg = re.compile(
+ r'^\s*action\s*=\s*SetMods\s*\(\s*modifiers\s*=\s*Lock\s*,\s*clearLocks\s*\)\s*;\s*$', re.I)
+ normalCapsLineProg = re.compile(
+ r'^\s*action\s*=\s*LockMods\s*\(\s*modifiers\s*=\s*Lock\s*\)\s*;\s*$', re.I)
+ normalCapsLine = ' action= LockMods(modifiers=Lock);'
+ capsModLine = ' action= SetMods(modifiers=Lock,clearLocks);'
+ global _originalXmodmap
+ lines = _originalXmodmap.split('\n')
+ foundCapsInterpretSection = False
+ for i in range(len(lines)):
+ line = lines[i]
+ if not foundCapsInterpretSection:
+ if interpretCapsLineProg.match(line):
+ foundCapsInterpretSection = True
+ else:
+ if enable:
+ if normalCapsLineProg.match(line):
+ lines[i] = capsModLine
+ _setXmodmap('\n'.join(lines))
+ return
+ else:
+ if capsModLineProg.match(line):
+ lines[i] = normalCapsLine
+ _setXmodmap('\n'.join(lines))
+ return
+ if line.find('}'):
+ # Failed to find the line we need to change
+ return
+
def _createOrcaXmodmap():
"""Makes an Orca-specific Xmodmap so that the keys behave as we
need them to do. This is especially the case for the Orca modifier.
@@ -1424,21 +1465,12 @@ def _createOrcaXmodmap():
cmd = []
if "Caps_Lock" in settings.orcaModifierKeys:
- cmd.append("clear Lock")
+ _setCapsLockAsOrcaModifier(True)
_capsLockCleared = True
elif _capsLockCleared:
- cmd.append("add Lock = Caps_Lock")
+ _setCapsLockAsOrcaModifier(False)
_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.
@@ -1447,12 +1479,7 @@ def _storeXmodmap(keyList):
"""
global _originalXmodmap
-
- items = "|".join(keyList)
- cmd = "xmodmap -pke | grep -E '(%s)'" % items
- filehandle = os.popen(cmd)
- _originalXmodmap = filehandle.read()
- filehandle.close()
+ _originalXmodmap = subprocess.check_output(['xkbcomp', os.environ['DISPLAY'], '-'])
def _restoreXmodmap(keyList=[]):
"""Restore the original xmodmap values for the keys in keyList.
@@ -1462,21 +1489,11 @@ def _restoreXmodmap(keyList=[]):
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:
- toRestore.append("add Lock = Caps_Lock")
- _capsLockCleared = False
-
- os.system("echo '%s' | xmodmap - > /dev/null 2>&1" % "\n".join(toRestore))
+ _capsLockCleared = False
+ p = subprocess.Popen(['xkbcomp', '-w0', '-', os.environ['DISPLAY']],
+ stdin=subprocess.PIPE, stdout=None, stderr=None)
+ p.communicate(_originalXmodmap)
def loadUserSettings(script=None, inputEvent=None, skipReloadMessage=False):
"""Loads (and reloads) the user settings module, reinitializing
--
Ubuntu-accessibility mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-accessibility