diff options
author | Unknown <unknown@unknown.org> | 2010-11-01 16:56:53 (GMT) |
---|---|---|
committer | Sascha Silbe <sascha-pgp@silbe.org> | 2010-11-01 16:56:53 (GMT) |
commit | 2d032906ab8086082ab98449d9099945c0847f3e (patch) | |
tree | b092a2136fa386cad80072daa615b4c711d15211 | |
parent | 90a6cf0ad7bda2d81b4fc21e306e2409a0d2adf9 (diff) |
accessibility_0001_cp_accessibility_keyboard.patch
-rwxr-xr-x | bin/sugar-session | 7 | ||||
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | data/icons/Makefile.am | 1 | ||||
-rw-r--r-- | data/icons/module-accessibility.svg | 92 | ||||
-rw-r--r-- | extensions/cpsection/Makefile.am | 15 | ||||
-rw-r--r-- | extensions/cpsection/accessibility/Makefile.am | 6 | ||||
-rw-r--r-- | extensions/cpsection/accessibility/__init__.py | 25 | ||||
-rw-r--r-- | extensions/cpsection/accessibility/model.py | 55 | ||||
-rw-r--r-- | extensions/cpsection/accessibility/view.py | 114 | ||||
-rw-r--r-- | src/jarabe/model/Makefile.am | 1 | ||||
-rw-r--r-- | src/jarabe/model/accessibility.py | 76 |
11 files changed, 391 insertions, 2 deletions
diff --git a/bin/sugar-session b/bin/sugar-session index cc8358c..cd019a7 100755 --- a/bin/sugar-session +++ b/bin/sugar-session @@ -1,6 +1,7 @@ #!/usr/bin/env python # Copyright (C) 2006, Red Hat, Inc. # Copyright (C) 2009, One Laptop Per Child Association Inc +# Copyright (C) 2010, Plan Ceibal <comunidad@plan.ceibal.edu.uy> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -190,6 +191,7 @@ def bootstrap(): gobject.idle_add(setup_notification_service_cb) gobject.idle_add(setup_file_transfer_cb) gobject.idle_add(show_software_updates_cb) + gobject.idle_add(setup_accessibility_cb) if sys.modules.has_key('xklavier'): gobject.idle_add(setup_keyboard_cb) @@ -201,6 +203,11 @@ def set_fonts(): settings = gtk.settings_get_default() settings.set_property("gtk-font-name", "%s %f" % (face, size)) +def setup_accessibility_cb(): + from jarabe.model import accessibility + accessibility_manager = accessibility.AccessibilityManager() + accessibility_manager.setup_accessibility() + def main(): try: from sugar import env diff --git a/configure.ac b/configure.ac index 13a2f09..d291141 100644 --- a/configure.ac +++ b/configure.ac @@ -50,6 +50,7 @@ data/icons/Makefile data/Makefile data/sugar-emulator.desktop extensions/cpsection/aboutcomputer/Makefile +extensions/cpsection/accessibility/Makefile extensions/cpsection/aboutme/Makefile extensions/cpsection/datetime/Makefile extensions/cpsection/frame/Makefile diff --git a/data/icons/Makefile.am b/data/icons/Makefile.am index a35643a..2497c4a 100644 --- a/data/icons/Makefile.am +++ b/data/icons/Makefile.am @@ -3,6 +3,7 @@ sugardir = $(pkgdatadir)/data/icons sugar_DATA = \ module-about_me.svg \ module-about_my_computer.svg \ + module-accessibility.svg \ module-date_and_time.svg \ module-frame.svg \ module-keyboard.svg \ diff --git a/data/icons/module-accessibility.svg b/data/icons/module-accessibility.svg new file mode 100644 index 0000000..245a47e --- /dev/null +++ b/data/icons/module-accessibility.svg @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + version="1.0" + width="55" + height="55" + id="svg795"> + <defs + id="defs797" /> + <g + id="layer1"> + <path + d="m -23.738584,30.440666 a 8.901969,11.301082 0 1 1 -17.803937,0 8.901969,11.301082 0 1 1 17.803937,0 z" + transform="matrix(1.2765958,0,0,1.0558659,19.192898,-13.127946)" + id="path12" + style="fill:none;stroke:#ffffff" /> + <path + d="m 30.145644,37.823484 c -0.583589,6.659344 -6.7511,11.52268 -13.775517,10.862567 C 9.3457054,48.02594 4.1243814,42.092348 4.7079694,35.433004 5.2915594,28.773661 20.67887,20.597949 14.885997,24.011638 -12.777062,40.313232 24.43362,62.068174 30.145644,37.823484 z" + id="path1405-0" + style="fill:none;stroke:#ffffff;stroke-width:1.44962609;stroke-opacity:1" /> + <rect + width="2.916333" + height="21.188446" + ry="1.3939767" + x="18.332197" + y="13.76814" + id="rect1438-8" + style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.50547338;stroke-opacity:1" /> + <rect + width="2.8716421" + height="19.140917" + ry="1.259271" + x="-35.091366" + y="-38.207035" + transform="matrix(0,-1,-1,0,0,0)" + id="rect1438-1-87" + style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.41987956;stroke-opacity:1" /> + <rect + width="2.5733202" + height="15.766372" + ry="1.0372615" + x="-5.4068875" + y="-65.997124" + transform="matrix(-0.55477829,0.83199823,-0.68762037,-0.72607041,0,0)" + id="rect1438-0-4" + style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.21988189;stroke-opacity:1" /> + <rect + width="2.0588" + height="12.916228" + ry="0.84975183" + x="6.7647386" + y="-38.278324" + transform="matrix(-0.21998034,0.97550431,-0.88967727,-0.45658992,0,0)" + id="rect1438-0-1-8" + style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.98759735;stroke-opacity:1" /> + <rect + width="0.98179615" + height="13.275604" + ry="0.87339497" + x="-30.243309" + y="-41.495876" + transform="matrix(0,-1,-1,0,0,0)" + id="rect1438-1-8-5" + style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.69142139;stroke-opacity:1" /> + <rect + width="0.97070193" + height="11.568416" + ry="0.76108003" + x="50.822704" + y="-8.6089849" + transform="matrix(0.89791652,0.44016579,0.56230073,-0.82693282,0,0)" + id="rect1438-1-8-0-0" + style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.64177793;stroke-opacity:1" /> + <rect + width="1.6299056" + height="7.7739253" + ry="0.51144254" + x="72.759727" + y="35.364716" + transform="matrix(0.9888174,0.14913131,-0.60877492,0.79334299,0,0)" + id="rect1438-0-1-7-7" + style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.68172067;stroke-opacity:1" /> + <path + d="m 79.67578,18.634508 a 3.2829957,3.0304577 0 1 1 -6.565992,0 3.2829957,3.0304577 0 1 1 6.565992,0 z" + transform="matrix(1.5397454,0,0,1.4719643,-97.932275,-17.750188)" + id="path1603-2" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-opacity:1" /> + </g> +</svg> diff --git a/extensions/cpsection/Makefile.am b/extensions/cpsection/Makefile.am index a92b5dd..d623380 100644 --- a/extensions/cpsection/Makefile.am +++ b/extensions/cpsection/Makefile.am @@ -1,5 +1,16 @@ -SUBDIRS = aboutme aboutcomputer datetime frame keyboard language \ - modemconfiguration network power updater +SUBDIRS = \ + aboutme \ + aboutcomputer \ + accessibility \ + datetime \ + frame \ + keyboard \ + language \ + modemconfiguration \ + network \ + power \ + updater \ + # sugardir = $(pkgdatadir)/extensions/cpsection sugar_PYTHON = __init__.py diff --git a/extensions/cpsection/accessibility/Makefile.am b/extensions/cpsection/accessibility/Makefile.am new file mode 100644 index 0000000..70d26f4 --- /dev/null +++ b/extensions/cpsection/accessibility/Makefile.am @@ -0,0 +1,6 @@ +sugardir = $(pkgdatadir)/extensions/cpsection/accessibility + +sugar_PYTHON = \ + __init__.py \ + model.py \ + view.py diff --git a/extensions/cpsection/accessibility/__init__.py b/extensions/cpsection/accessibility/__init__.py new file mode 100644 index 0000000..3467372 --- /dev/null +++ b/extensions/cpsection/accessibility/__init__.py @@ -0,0 +1,25 @@ +# Copyright (C) 2010 Plan Ceibal +# +# Author: Esteban Arias <earias@plan.ceibal.edu.uy> +# Contact information: comunidad@plan.ceibal.edu.uy +# Plan Ceibal http://www.ceibal.edu.uy +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +from gettext import gettext as _ + +CLASS = 'accessibility' +ICON = 'module-accessibility' +TITLE = _('Accessibility') + diff --git a/extensions/cpsection/accessibility/model.py b/extensions/cpsection/accessibility/model.py new file mode 100644 index 0000000..5136460 --- /dev/null +++ b/extensions/cpsection/accessibility/model.py @@ -0,0 +1,55 @@ +# Copyright (C) 2010 Plan Ceibal +# +# Author: Esteban Arias <earias@plan.ceibal.edu.uy> +# Contact information: comunidad@plan.ceibal.edu.uy +# Plan Ceibal http://www.ceibal.edu.uy +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +import subprocess +import gconf + +from gettext import gettext as _ +from jarabe.model import accessibility + +keyboard = accessibility.Keyboard() + +KEYWORDS = ['mouse_keys', 'sticky_keys', 'bounce_keys'] + +def get_mouse_keys(): + return keyboard.get_mouse_keys() + +def set_mouse_keys(activar): + keyboard.set_mouse_keys(activar) + +def print_mouse_keys(): + print str(get_mouse_keys()) + +def get_sticky_keys(): + return keyboard.get_sticky_keys() + +def set_sticky_keys(activar): + keyboard.set_sticky_keys(activar) + +def print_sticky_keys(): + print str(get_sticky_keys()) + +def get_bounce_keys(): + return keyboard.get_bounce_keys() + +def set_bounce_keys(activar): + keyboard.set_bounce_keys(activar) + +def print_bounce_keys(): + print str(get_bounce_keys()) diff --git a/extensions/cpsection/accessibility/view.py b/extensions/cpsection/accessibility/view.py new file mode 100644 index 0000000..9f291ac --- /dev/null +++ b/extensions/cpsection/accessibility/view.py @@ -0,0 +1,114 @@ +# Copyright (C) 2010 Plan Ceibal +# +# Author: Esteban Arias <earias@plan.ceibal.edu.uy> +# Contact information: comunidad@plan.ceibal.edu.uy +# Plan Ceibal http://www.ceibal.edu.uy +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +import gtk +from gettext import gettext as _ + +from sugar.graphics import style + +from jarabe import config +from jarabe.controlpanel.sectionview import SectionView +from jarabe.controlpanel.inlinealert import InlineAlert + +class accessibility(SectionView): + def __init__(self, model, alerts=None): + SectionView.__init__(self) + + self._model = model + self.set_border_width(style.DEFAULT_SPACING * 2) + self.set_spacing(style.DEFAULT_SPACING) + group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) + + separator_pm = gtk.HSeparator() + self.pack_start(separator_pm, expand=False) + separator_pm.show() + + label_pm_teclado = gtk.Label(_('Keyboard')) + label_pm_teclado.set_alignment(0, 0) + self.pack_start(label_pm_teclado, expand=False) + label_pm_teclado.show() + + self.box_pm = gtk.VBox() + self.box_pm.set_border_width(style.DEFAULT_SPACING * 2) + self.box_pm.set_spacing(style.DEFAULT_SPACING) + + self._view_mouse_keys() + self._view_sticky_keys() + self._view_bounce_keys() + + self.pack_start(self.box_pm, expand=False) + self.box_pm.show() + + def _set_mouse_keys(self, widget): + state = widget.get_active() + self._model.set_mouse_keys(state) + + def _set_sticky_keys(self, widget): + state = widget.get_active() + self._model.set_sticky_keys(state) + + def _set_bounce_keys(self, widget): + state = widget.get_active() + self._model.set_bounce_keys(state) + + def undo(self): + self._model.set_mouse_keys(self.init_state_mouse_keys) + self._model.set_sticky_keys(self.init_state_sticky_keys) + self._model.set_bounce_keys(self.init_state_bounce_keys) + + def _view_mouse_keys(self): + self.btn_mouse_keys = gtk.CheckButton(_('Mouse Keys')) + self._mouse_pm_change_handler = self.btn_mouse_keys.connect("toggled", self._set_mouse_keys) + self.init_state_mouse_keys = self._model.get_mouse_keys() + self.btn_mouse_keys.set_active(self.init_state_mouse_keys) + self.box_pm.pack_start(self.btn_mouse_keys, True, True, 2) + self.btn_mouse_keys.show() + + lbl_mouse = gtk.Label(_('Move the mouse pointer with keyboard number.')) + lbl_mouse.set_alignment(0, 0) + self.box_pm.pack_start(lbl_mouse, True, True, 2) + lbl_mouse.show() + + def _view_sticky_keys(self): + self.btn_sticky_keys = gtk.CheckButton(_('Sticky Keys')) + self._sticky_pm_change_handler = self.btn_sticky_keys.connect("toggled", self._set_sticky_keys) + self.init_state_sticky_keys = self._model.get_sticky_keys() + self.btn_sticky_keys.set_active(self.init_state_sticky_keys) + self.box_pm.pack_start(self.btn_sticky_keys, True, True, 2) + self.btn_sticky_keys.show() + + lbl_sticky = gtk.Label(_('Instead of having to press two keys at once (such as CTRL + Q), you can press one key at a time.')) + lbl_sticky.set_line_wrap(True) + lbl_sticky.set_alignment(0, 0) + self.box_pm.pack_start(lbl_sticky, True, True, 2) + lbl_sticky.show() + + def _view_bounce_keys(self): + self.btn_bounce_keys = gtk.CheckButton(_('Bounce Keys')) + self._bounce_pm_change_handler = self.btn_bounce_keys.connect("toggled", self._set_bounce_keys) + self.init_state_bounce_keys = self._model.get_bounce_keys() + self.btn_bounce_keys.set_active(self.init_state_bounce_keys) + self.box_pm.pack_start(self.btn_bounce_keys, True, True, 2) + self.btn_bounce_keys.show() + + lbl_bounce = gtk.Label(_('Ignore rapid, repeated keypresses of the same key.')) + lbl_bounce.set_alignment(0, 0) + self.box_pm.pack_start(lbl_bounce, True, True, 2) + lbl_bounce.show() diff --git a/src/jarabe/model/Makefile.am b/src/jarabe/model/Makefile.am index b025606..fca3252 100644 --- a/src/jarabe/model/Makefile.am +++ b/src/jarabe/model/Makefile.am @@ -2,6 +2,7 @@ sugardir = $(pythondir)/jarabe/model sugar_PYTHON = \ adhoc.py \ __init__.py \ + accessibility.py \ buddy.py \ bundleregistry.py \ filetransfer.py \ diff --git a/src/jarabe/model/accessibility.py b/src/jarabe/model/accessibility.py new file mode 100644 index 0000000..b851b3c --- /dev/null +++ b/src/jarabe/model/accessibility.py @@ -0,0 +1,76 @@ +# Copyright (C) 2010 Plan Ceibal +# +# Author: Esteban Arias <earias@plan.ceibal.edu.uy> +# Contact information: comunidad@plan.ceibal.edu.uy +# Plan Ceibal http://www.ceibal.edu.uy +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +import subprocess +import gconf + +from gettext import gettext as _ + +class Keyboard: + + def get_mouse_keys(self): + client = gconf.client_get_default() + return client.get_bool("/desktop/sugar/accessibility/keyboard/mousekeys_enable") + + def set_mouse_keys(self, activar): + client = gconf.client_get_default() + client.set_bool("/desktop/sugar/accessibility/keyboard/mousekeys_enable", activar) + self.run_config_keyboard() + + def get_sticky_keys(self): + client = gconf.client_get_default() + return client.get_bool("/desktop/sugar/accessibility/keyboard/stickykeys_enable") + + def set_sticky_keys(self, activar): + client = gconf.client_get_default() + client.set_bool("/desktop/sugar/accessibility/keyboard/stickykeys_enable", activar) + self.run_config_keyboard() + + def get_bounce_keys(self): + client = gconf.client_get_default() + return client.get_bool("/desktop/sugar/accessibility/keyboard/bouncekeys_enable") + + def set_bounce_keys(self, activar): + client = gconf.client_get_default() + client.set_bool("/desktop/sugar/accessibility/keyboard/bouncekeys_enable", activar) + self.run_config_keyboard() + + def run_config_keyboard(self): + cmd = ['ax'] + if self.get_sticky_keys(): + cmd.append('+stickykeys') + else: + cmd.append('-stickykeys') + if self.get_bounce_keys(): + cmd.append('+bouncekeys') + else: + cmd.append('-bouncekeys') + if self.get_mouse_keys(): + cmd += ['+mousekeys', 'mousemaxspeed', '3000', 'mousetimetomax', '1000', '-timeout', '-repeatkeys'] + else: + cmd += ['-mousekeys', 'mousemaxspeed', '3000', 'mousetimetomax', '1000', '+timeout', '+repeatkeys'] + subprocess.call(cmd) + +class AccessibilityManager: + def setup_accessibility(self): + client = gconf.client_get_default() + is_accessibility = client.dir_exists("/desktop/sugar/accessibility") + if is_accessibility: + keyboard = Keyboard() + keyboard.run_config_keyboard() |