[orca] Break up printable-keys keyecho into alpha, numeric, and punctuation



commit 2ab7e66c754a8dea07fb9c8dea0e0b53611df104
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Tue Nov 10 00:31:43 2015 -0500

    Break up printable-keys keyecho into alpha, numeric, and punctuation

 help/C/howto_text_setup.page     |   23 +++++++++++---
 help/C/preferences_key_echo.page |   31 +++++++++++++++----
 src/orca/input_event.py          |   62 ++++++++++++++++++++++++++++++-------
 src/orca/messages.py             |   16 ++++++++--
 src/orca/orca-setup.ui           |   52 +++++++++++++++++++++++++++----
 src/orca/orca_console_prefs.py   |   38 +++++++++++++++++++++--
 src/orca/orca_gui_prefs.py       |   12 +++++--
 src/orca/scripts/default.py      |    3 +-
 src/orca/settings.py             |    8 ++++-
 9 files changed, 202 insertions(+), 43 deletions(-)
---
diff --git a/help/C/howto_text_setup.page b/help/C/howto_text_setup.page
index 117fa6b..50f0050 100644
--- a/help/C/howto_text_setup.page
+++ b/help/C/howto_text_setup.page
@@ -85,11 +85,24 @@
       </p>
       <list>
         <item>
-          <p>alphanumeric and punctuation keys</p>
+          <p>alphabetic keys</p>
           <p>
             This option controls whether or not keys like <key>a</key>,
-            <key>b</key>, <key>c</key>, <key>;</key>, <key>?</key>, and so on
-            should be spoken when pressed.
+            <key>b</key>, and <key>c</key> should be spoken when pressed.
+          </p>
+        </item>
+        <item>
+          <p>numeric keys</p>
+          <p>
+            This option controls whether or not keys like <key>1</key>,
+            <key>2</key>, and <key>3</key> should be spoken when pressed.
+          </p>
+        </item>
+        <item>
+          <p>punctuation keys</p>
+          <p>
+            This option controls whether or not keys like <key>%</key>,
+            <key>;</key>, and <key>?</key> should be spoken when pressed.
           </p>
         </item>
         <item>
@@ -117,8 +130,8 @@
           <p>action keys</p>
           <p>
             This option controls whether or not <key>BackSpace</key>,
-            <key>Delete</key>, <key>Return</key>, <key>Escape</key>,
-            <key>Tab</key>, <key>Page Up</key>, <key>Page Down</key>,
+            <key>Delete</key>, <key>Return</key>, <key>Space</key>,
+            <key>Tab</key>, <key>Escape</key>, <key>Page Up</key>, <key>Page Down</key>,
             <key>Home</key>, and <key>End</key> should be spoken when
             pressed.
           </p>
diff --git a/help/C/preferences_key_echo.page b/help/C/preferences_key_echo.page
index d365c20..1de5ab5 100644
--- a/help/C/preferences_key_echo.page
+++ b/help/C/preferences_key_echo.page
@@ -29,11 +29,30 @@
       Default value: checked
     </p>  
     <section>
-      <title>Enable alphanumeric and punctuation keys</title>
+      <title>Enable alphabetic keys</title>
       <p>
         This option controls whether or not keys like <key>a</key>,
-        <key>b</key>, <key>c</key>, <key>;</key>, <key>?</key>, and
-        so on should be spoken when pressed.
+        <key>b</key>, and <key>c</key> should be spoken when pressed.
+      </p>
+      <p>
+        Default value: checked
+      </p>
+    </section>
+    <section>
+      <title>Enable numeric keys</title>
+      <p>
+        This option controls whether or not keys like <key>1</key>,
+        <key>2</key>, and <key>3</key> should be spoken when pressed.
+      </p>
+      <p>
+        Default value: checked
+      </p>
+    </section>
+    <section>
+      <title>Enable punctuation keys</title>
+      <p>
+        This option controls whether or not keys like <key>%</key>,
+        <key>;</key>, and <key>?</key> should be spoken when pressed.
       </p>
       <p>
         Default value: checked
@@ -63,8 +82,8 @@
       <title>Enable action keys</title>
       <p>
         This option controls whether or not <key>BackSpace</key>, <key>Delete
-        </key>, <key>Return</key>, <key>Escape</key>, <key>Tab</key>, <key>Page
-        Up</key>, <key>Page Down</key>, <key>Home</key>, and <key>End</key>
+        </key>, <key>Return</key>, <key>Space</key>, <key>Tab</key>, <key>Escape</key>
+        <key>Page Up</key>, <key>Page Down</key>, <key>Home</key>, and <key>End</key>
         should be spoken when pressed.
       </p>
       <p>
@@ -103,7 +122,7 @@
     </p>
     <p>
       While echo by character seems quite similar to the key echo of
-      alphanumeric and punctuation keys, there are important differences,
+      alphabetic, numeric, and punctuation keys, there are important differences,
       especially with respect to accented letters and other symbols for which
       there is no dedicated key:
     </p>
diff --git a/src/orca/input_event.py b/src/orca/input_event.py
index 0c9f3b8..f2f10b7 100644
--- a/src/orca/input_event.py
+++ b/src/orca/input_event.py
@@ -108,6 +108,9 @@ class KeyboardEvent(InputEvent):
     TYPE_ACTION           = "action"
     TYPE_NAVIGATION       = "navigation"
     TYPE_DIACRITICAL      = "diacritical"
+    TYPE_ALPHABETIC       = "alphabetic"
+    TYPE_NUMERIC          = "numeric"
+    TYPE_PUNCTUATION      = "punctuation"
 
     def __init__(self, event):
         """Creates a new InputEvent of type KEYBOARD_EVENT.
@@ -175,10 +178,15 @@ class KeyboardEvent(InputEvent):
             self.shouldEcho = settings.presentLockingKeys
             if self.shouldEcho == None:
                 self.shouldEcho = not settings.onlySpeakDisplayedText
-        elif self.isPrintableKey():
-            self.keyType = KeyboardEvent.TYPE_PRINTABLE
-            self.shouldEcho = \
-                settings.enablePrintableKeys or settings.enableEchoByCharacter
+        elif self.isAlphabeticKey():
+            self.keyType = KeyboardEvent.TYPE_ALPHABETIC
+            self.shouldEcho = settings.enableAlphabeticKeys or settings.enableEchoByCharacter
+        elif self.isNumericKey():
+            self.keyType = KeyboardEvent.TYPE_NUMERIC
+            self.shouldEcho = settings.enableNumericKeys or settings.enableEchoByCharacter
+        elif self.isPunctuationKey():
+            self.keyType = KeyboardEvent.TYPE_PUNCTUATION
+            self.shouldEcho = settings.enablePunctuationKeys or settings.enableEchoByCharacter
         else:
             self.keyType = KeyboardEvent.TYPE_UNKNOWN
             self.shouldEcho = False
@@ -227,7 +235,18 @@ class KeyboardEvent(InputEvent):
 
         return self.event_string in \
             ["Return", "Escape", "Tab", "BackSpace", "Delete",
-             "Page_Up", "Page_Down"]
+             "Page_Up", "Page_Down", "space", " "]
+
+    def isAlphabeticKey(self):
+        """Return True if this is an alphabetic key."""
+
+        if self.keyType:
+            return self.keyType == KeyboardEvent.TYPE_ALPHABETIC
+
+        if not len(self.event_string) == 1:
+            return False
+
+        return self.event_string.isalpha()
 
     def isDiacriticalKey(self):
         """Return True if this is a non-spacing diacritical key."""
@@ -276,6 +295,17 @@ class KeyboardEvent(InputEvent):
              'Shift_L', 'Shift_R', 'Meta_L', 'Meta_R',
              'ISO_Level3_Shift']
 
+    def isNumericKey(self):
+        """Return True if this is a numeric key."""
+
+        if self.keyType:
+            return self.keyType == KeyboardEvent.TYPE_NUMERIC
+
+        if not len(self.event_string) == 1:
+            return False
+
+        return self.event_string.isnumeric()
+
     def isOrcaModifier(self):
         """Return True if this is the Orca modifier key."""
 
@@ -303,25 +333,33 @@ class KeyboardEvent(InputEvent):
     def isPrintableKey(self):
         """Return True if this is a printable key."""
 
-        if self.keyType:
-            return self.keyType == KeyboardEvent.TYPE_PRINTABLE
-
         if self.event_string in ["space", " "]:
             return True
 
         if not len(self.event_string) == 1:
             return False
 
-        if self.event_string.isalnum() or self.event_string.isspace():
-            return True
-
-        return unicodedata.category(self.event_string)[0] in ('P', 'S')
+        return self.event_string.isprintable()
 
     def isPressedKey(self):
         """Returns True if the key is pressed"""
 
         return self.type == pyatspi.KEY_PRESSED_EVENT
 
+    def isPunctuationKey(self):
+        """Return True if this is a punctuation key."""
+
+        if self.keyType:
+            return self.keyType == KeyboardEvent.TYPE_PUNCTUATION
+
+        if not len(self.event_string) == 1:
+            return False
+
+        if self.isAlphabeticKey() or self.isNumericKey():
+            return False
+
+        return self.event_string.isprintable() and not self.event_string.isspace()
+
     def isCharacterEchoable(self):
         """Returns True if the script will echo this event as part of
         character echo. We do this to not double-echo a given printable
diff --git a/src/orca/messages.py b/src/orca/messages.py
index b3b4dec..21e52fa 100644
--- a/src/orca/messages.py
+++ b/src/orca/messages.py
@@ -374,10 +374,20 @@ CONSOLE_SETUP_ENABLE_BRAILLE = _("Enable Braille?  Enter y or n: ")
 # classes of keys they want echoed.
 CONSOLE_SETUP_ENABLE_ECHO_KEY = _("Enable key echo?  Enter y or n: ")
 
-# Translators: This is in reference to key echo for normal text entry keys and
+# Translators: This is in reference to key echo for alphabetic keys and
 # is part of Orca's console-based setup.
-CONSOLE_SETUP_ENABLE_ECHO_PRINTABLE_KEYS = \
-    _("Enable alphanumeric and punctuation keys?  Enter y or n: ")
+CONSOLE_SETUP_ENABLE_ECHO_ALPHABETIC_KEYS = \
+    _("Enable alphabetic keys?  Enter y or n: ")
+
+# Translators: This is in reference to key echo for numeric keys and
+# is part of Orca's console-based setup.
+CONSOLE_SETUP_ENABLE_ECHO_NUMERIC_KEYS = \
+    _("Enable numeric keys?  Enter y or n: ")
+
+# Translators: This is in reference to key echo for punctuation keys and
+# is part of Orca's console-based setup.
+CONSOLE_SETUP_ENABLE_ECHO_PUNCTUATION_KEYS = \
+    _("Enable punctuation keys?  Enter y or n: ")
 
 # Translators: This is in reference to key echo for keys such as CTRL, ALT,
 # Shift, Insert, etc. It is part of Orca's console-based setup.
diff --git a/src/orca/orca-setup.ui b/src/orca/orca-setup.ui
index 0c69e97..2a9dc94 100644
--- a/src/orca/orca-setup.ui
+++ b/src/orca/orca-setup.ui
@@ -2380,8 +2380,8 @@
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <child>
-                          <object class="GtkCheckButton" id="enablePrintableKeysCheckButton">
-                            <property name="label" translatable="yes">Enable _alphanumeric and punctuation 
keys</property>
+                          <object class="GtkCheckButton" id="enableAlphabeticKeysCheckButton">
+                            <property name="label" translatable="yes">Enable _alphabetic keys</property>
                             <property name="use_action_appearance">False</property>
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
@@ -2399,6 +2399,44 @@
                           </packing>
                         </child>
                         <child>
+                          <object class="GtkCheckButton" id="enableNumericKeysCheckButton">
+                            <property name="label" translatable="yes">Enable n_umeric keys</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_indicator">True</property>
+                            <signal name="toggled" handler="checkButtonToggled" swapped="no"/>
+                          </object>
+                          <packing>
+                            <property name="left_attach">0</property>
+                            <property name="top_attach">1</property>
+                            <property name="width">1</property>
+                            <property name="height">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="enablePunctuationKeysCheckButton">
+                            <property name="label" translatable="yes">Enable _punctuation keys</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_indicator">True</property>
+                            <signal name="toggled" handler="checkButtonToggled" swapped="no"/>
+                          </object>
+                          <packing>
+                            <property name="left_attach">0</property>
+                            <property name="top_attach">2</property>
+                            <property name="width">1</property>
+                            <property name="height">1</property>
+                          </packing>
+                        </child>
+                        <child>
                           <object class="GtkCheckButton" id="enableModifierKeysCheckButton">
                             <property name="label" translatable="yes">Enable _modifier keys</property>
                             <property name="use_action_appearance">False</property>
@@ -2412,7 +2450,7 @@
                           </object>
                           <packing>
                             <property name="left_attach">0</property>
-                            <property name="top_attach">1</property>
+                            <property name="top_attach">3</property>
                             <property name="width">1</property>
                             <property name="height">1</property>
                           </packing>
@@ -2431,7 +2469,7 @@
                           </object>
                           <packing>
                             <property name="left_attach">0</property>
-                            <property name="top_attach">3</property>
+                            <property name="top_attach">4</property>
                             <property name="width">1</property>
                             <property name="height">1</property>
                           </packing>
@@ -2450,7 +2488,7 @@
                           </object>
                           <packing>
                             <property name="left_attach">0</property>
-                            <property name="top_attach">4</property>
+                            <property name="top_attach">5</property>
                             <property name="width">1</property>
                             <property name="height">1</property>
                           </packing>
@@ -2469,7 +2507,7 @@
                           </object>
                           <packing>
                             <property name="left_attach">0</property>
-                            <property name="top_attach">5</property>
+                            <property name="top_attach">6</property>
                             <property name="width">1</property>
                             <property name="height">1</property>
                           </packing>
@@ -2488,7 +2526,7 @@
                           </object>
                           <packing>
                             <property name="left_attach">0</property>
-                            <property name="top_attach">6</property>
+                            <property name="top_attach">7</property>
                             <property name="width">1</property>
                             <property name="height">1</property>
                           </packing>
diff --git a/src/orca/orca_console_prefs.py b/src/orca/orca_console_prefs.py
index 2f06c21..62649d2 100644
--- a/src/orca/orca_console_prefs.py
+++ b/src/orca/orca_console_prefs.py
@@ -274,7 +274,9 @@ def setupSpeech(prefsDict):
     keyEcho = prefsDict["enableKeyEcho"]
     if not keyEcho:
         prefsDict["enableKeyEcho"]       = False
-        prefsDict["enablePrintableKeys"] = False
+        prefsDict["enableAlphabeticKeys"] = False
+        prefsDict["enableNumericKeys"] = False
+        prefsDict["enablePunctuationKeys"] = False
         prefsDict["enableModifierKeys"]  = False
         prefsDict["enableFunctionKeys"]  = False
         prefsDict["enableActionKeys"]    = False
@@ -282,13 +284,43 @@ def setupSpeech(prefsDict):
     stop = True
     while keyEcho and True:
         answer = sayAndPrint(
-            messages.CONSOLE_SETUP_ENABLE_ECHO_PRINTABLE_KEYS,
+            messages.CONSOLE_SETUP_ENABLE_ECHO_ALPHABETIC_KEYS,
             stop,
             True,
             speechServerChoice,
             speechVoiceChoice)
         try:
-            prefsDict["enablePrintableKeys"] = checkYes(answer)
+            prefsDict["enableAlphabeticKeys"] = checkYes(answer)
+            break
+        except:
+            stop = False
+            sayAndPrint(messages.CONSOLE_SETUP_ENTER_Y_OR_N)
+
+    stop = True
+    while keyEcho and True:
+        answer = sayAndPrint(
+            messages.CONSOLE_SETUP_ENABLE_ECHO_NUMERIC_KEYS,
+            stop,
+            True,
+            speechServerChoice,
+            speechVoiceChoice)
+        try:
+            prefsDict["enableNumericKeys"] = checkYes(answer)
+            break
+        except:
+            stop = False
+            sayAndPrint(messages.CONSOLE_SETUP_ENTER_Y_OR_N)
+
+    stop = True
+    while keyEcho and True:
+        answer = sayAndPrint(
+            messages.CONSOLE_SETUP_ENABLE_ECHO_PUNCTUATION_KEYS,
+            stop,
+            True,
+            speechServerChoice,
+            speechVoiceChoice)
+        try:
+            prefsDict["enablePunctuationKeys"] = checkYes(answer)
             break
         except:
             stop = False
diff --git a/src/orca/orca_gui_prefs.py b/src/orca/orca_gui_prefs.py
index 76fae16..89a69b6 100644
--- a/src/orca/orca_gui_prefs.py
+++ b/src/orca/orca_gui_prefs.py
@@ -1502,8 +1502,12 @@ class OrcaSetupGUI(orca_gtkbuilder.GtkBuilderWrapper):
         #
         self.get_widget("keyEchoCheckButton").set_active( \
                         prefs["enableKeyEcho"])
-        self.get_widget("enablePrintableKeysCheckButton").set_active( \
-                        prefs["enablePrintableKeys"])
+        self.get_widget("enableAlphabeticKeysCheckButton").set_active(
+                        prefs.get("enableAlphabeticKeys", settings.enableAlphabeticKeys))
+        self.get_widget("enableNumericKeysCheckButton").set_active(
+                        prefs.get("enableNumericKeys", settings.enableNumericKeys))
+        self.get_widget("enablePunctuationKeysCheckButton").set_active(
+                        prefs.get("enablePunctuationKeys", settings.enablePunctuationKeys))
         self.get_widget("enableModifierKeysCheckButton").set_active( \
                         prefs["enableModifierKeys"])
         self.get_widget("enableFunctionKeysCheckButton").set_active( \
@@ -1737,7 +1741,9 @@ class OrcaSetupGUI(orca_gtkbuilder.GtkBuilderWrapper):
         """
 
         enable = self.get_widget("keyEchoCheckButton").get_active()
-        self.get_widget("enablePrintableKeysCheckButton").set_sensitive(enable)
+        self.get_widget("enableAlphabeticKeysCheckButton").set_sensitive(enable)
+        self.get_widget("enableNumericKeysCheckButton").set_sensitive(enable)
+        self.get_widget("enablePunctuationKeysCheckButton").set_sensitive(enable)
         self.get_widget("enableModifierKeysCheckButton").set_sensitive(enable)
         self.get_widget("enableFunctionKeysCheckButton").set_sensitive(enable)
         self.get_widget("enableActionKeysCheckButton").set_sensitive(enable)
diff --git a/src/orca/scripts/default.py b/src/orca/scripts/default.py
index 0f5bfc0..65af5a6 100644
--- a/src/orca/scripts/default.py
+++ b/src/orca/scripts/default.py
@@ -2625,8 +2625,7 @@ class Script(script.Script):
             elif wasCommand or wasAutoComplete:
                 speakThis = True
             elif role == pyatspi.ROLE_PASSWORD_TEXT \
-                 and _settingsManager.getSetting('enableKeyEcho') \
-                 and _settingsManager.getSetting('enablePrintableKeys'):
+                 and _settingsManager.getSetting('enableKeyEcho'):
                 # Echoing "star" is preferable to echoing the descriptive
                 # name of the bullet that has appeared (e.g. "black circle")
                 #
diff --git a/src/orca/settings.py b/src/orca/settings.py
index 2825160..04cf9da 100644
--- a/src/orca/settings.py
+++ b/src/orca/settings.py
@@ -46,7 +46,9 @@ userCustomizableSettings = [
     "enableEchoByWord",
     "enableEchoBySentence",
     "enableKeyEcho",
-    "enablePrintableKeys",
+    "enableAlphabeticKeys",
+    "enableNumericKeys",
+    "enablePunctuationKeys",
     "enableModifierKeys",
     "enableFunctionKeys",
     "enableActionKeys",
@@ -237,7 +239,9 @@ keyboardLayout               = GENERAL_KEYBOARD_LAYOUT_DESKTOP
 orcaModifierKeys             = DESKTOP_MODIFIER_KEYS
 doubleClickTimeout           = 0.5
 enableKeyEcho                = True
-enablePrintableKeys          = True
+enableAlphabeticKeys         = True
+enableNumericKeys            = True
+enablePunctuationKeys        = True
 enableModifierKeys           = True
 enableFunctionKeys           = True
 enableActionKeys             = True


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]