Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/rpms
diff options
context:
space:
mode:
authorBernie Innocenti <bernie@codewiz.org>2010-07-30 20:24:32 (GMT)
committer Bernie Innocenti <bernie@codewiz.org>2010-07-30 20:24:56 (GMT)
commit04a67bf616f0517cdc65908559860c8483037c12 (patch)
treec38c69314c09aefd866986f8c7da3092066b2b6d /rpms
parentab6d7d72fceb32b0a084cd877cfb89de391b440b (diff)
sugar: add esteban's accessibility work
Diffstat (limited to 'rpms')
-rw-r--r--rpms/sugar/accessibility_0001_cp_accessibility_keyboard.patch894
-rw-r--r--rpms/sugar/accessibility_0002_magnifier_extension.patch110
-rw-r--r--rpms/sugar/accessibility_0003_cp_accessibility_contrast.patch421
-rw-r--r--rpms/sugar/accessibility_0004_cp_accessibility_mouse.patch323
-rw-r--r--rpms/sugar/accessibility_0005_cp_accessibility_capital_letters.patch140
-rw-r--r--rpms/sugar/accessibility_0006_virtualkeyboard.patch2215
-rw-r--r--rpms/sugar/accessibility_0007_cp_translations.patch78
-rw-r--r--rpms/sugar/backup-0004-es-translations.patch1559
-rwxr-xr-xrpms/sugar/backup-translations.patch78
-rw-r--r--rpms/sugar/cpu-and-memory-resource-indicator.patch2
-rw-r--r--rpms/sugar/journal-0003-reindex-translations.patch4
-rw-r--r--rpms/sugar/sl2006-touchpad-device-on-frame.patch2
-rw-r--r--rpms/sugar/sugar.spec33
13 files changed, 4290 insertions, 1569 deletions
diff --git a/rpms/sugar/accessibility_0001_cp_accessibility_keyboard.patch b/rpms/sugar/accessibility_0001_cp_accessibility_keyboard.patch
new file mode 100644
index 0000000..dd02687
--- /dev/null
+++ b/rpms/sugar/accessibility_0001_cp_accessibility_keyboard.patch
@@ -0,0 +1,894 @@
+diff -u -r -N sugar-0.88.1.original/bin/sugar-session sugar-0.88.1/bin/sugar-session
+--- sugar-0.88.1.original/bin/sugar-session 2010-06-02 09:33:43.000000000 -0300
++++ sugar-0.88.1/bin/sugar-session 2010-07-27 11:45:05.234753203 -0300
+@@ -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 @@
+ 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 @@
+ 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 -u -r -N sugar-0.88.1.original/configure.ac sugar-0.88.1/configure.ac
+--- sugar-0.88.1.original/configure.ac 2010-07-27 10:55:39.737753575 -0300
++++ sugar-0.88.1/configure.ac 2010-07-27 11:45:05.234753203 -0300
+@@ -50,6 +50,7 @@
+ 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 -u -r -N sugar-0.88.1.original/data/icons/Makefile.am sugar-0.88.1/data/icons/Makefile.am
+--- sugar-0.88.1.original/data/icons/Makefile.am 2010-07-27 10:55:39.737753575 -0300
++++ sugar-0.88.1/data/icons/Makefile.am 2010-07-27 11:46:12.610754773 -0300
+@@ -3,6 +3,7 @@
+ 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 -u -r -N sugar-0.88.1.original/data/icons/module-accessibility.svg sugar-0.88.1/data/icons/module-accessibility.svg
+--- sugar-0.88.1.original/data/icons/module-accessibility.svg 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/data/icons/module-accessibility.svg 2010-07-27 11:45:05.235763039 -0300
+@@ -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 -u -r -N sugar-0.88.1.original/extensions/cpsection/accessibility/__init__.py sugar-0.88.1/extensions/cpsection/accessibility/__init__.py
+--- sugar-0.88.1.original/extensions/cpsection/accessibility/__init__.py 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/extensions/cpsection/accessibility/__init__.py 2010-07-27 11:45:05.235763039 -0300
+@@ -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 -u -r -N sugar-0.88.1.original/extensions/cpsection/accessibility/Makefile.am sugar-0.88.1/extensions/cpsection/accessibility/Makefile.am
+--- sugar-0.88.1.original/extensions/cpsection/accessibility/Makefile.am 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/extensions/cpsection/accessibility/Makefile.am 2010-07-27 11:45:05.236504055 -0300
+@@ -0,0 +1,6 @@
++sugardir = $(pkgdatadir)/extensions/cpsection/accessibility
++
++sugar_PYTHON = \
++ __init__.py \
++ model.py \
++ view.py
+diff -u -r -N sugar-0.88.1.original/extensions/cpsection/accessibility/Makefile.in sugar-0.88.1/extensions/cpsection/accessibility/Makefile.in
+--- sugar-0.88.1.original/extensions/cpsection/accessibility/Makefile.in 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/extensions/cpsection/accessibility/Makefile.in 2010-07-27 11:45:05.237504112 -0300
+@@ -0,0 +1,423 @@
++# Makefile.in generated by automake 1.11 from Makefile.am.
++# @configure_input@
++
++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
++# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
++# Inc.
++# This Makefile.in is free software; the Free Software Foundation
++# gives unlimited permission to copy and/or distribute it,
++# with or without modifications, as long as this notice is preserved.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
++# PARTICULAR PURPOSE.
++
++@SET_MAKE@
++VPATH = @srcdir@
++pkgdatadir = $(datadir)/@PACKAGE@
++pkgincludedir = $(includedir)/@PACKAGE@
++pkglibdir = $(libdir)/@PACKAGE@
++pkglibexecdir = $(libexecdir)/@PACKAGE@
++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
++install_sh_DATA = $(install_sh) -c -m 644
++install_sh_PROGRAM = $(install_sh) -c
++install_sh_SCRIPT = $(install_sh) -c
++INSTALL_HEADER = $(INSTALL_DATA)
++transform = $(program_transform_name)
++NORMAL_INSTALL = :
++PRE_INSTALL = :
++POST_INSTALL = :
++NORMAL_UNINSTALL = :
++PRE_UNINSTALL = :
++POST_UNINSTALL = :
++subdir = extensions/cpsection/accessibility
++DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
++ $(sugar_PYTHON)
++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
++am__aclocal_m4_deps = $(top_srcdir)/configure.ac
++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
++ $(ACLOCAL_M4)
++mkinstalldirs = $(install_sh) -d
++CONFIG_CLEAN_FILES =
++CONFIG_CLEAN_VPATH_FILES =
++SOURCES =
++DIST_SOURCES =
++am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
++am__vpath_adj = case $$p in \
++ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
++ *) f=$$p;; \
++ esac;
++am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
++am__install_max = 40
++am__nobase_strip_setup = \
++ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
++am__nobase_strip = \
++ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
++am__nobase_list = $(am__nobase_strip_setup); \
++ for p in $$list; do echo "$$p $$p"; done | \
++ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
++ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
++ if (++n[$$2] == $(am__install_max)) \
++ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
++ END { for (dir in files) print dir, files[dir] }'
++am__base_list = \
++ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
++ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
++am__installdirs = "$(DESTDIR)$(sugardir)"
++py_compile = $(top_srcdir)/py-compile
++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
++ACLOCAL = @ACLOCAL@
++ALL_LINGUAS = @ALL_LINGUAS@
++AMTAR = @AMTAR@
++AUTOCONF = @AUTOCONF@
++AUTOHEADER = @AUTOHEADER@
++AUTOMAKE = @AUTOMAKE@
++AWK = @AWK@
++CATALOGS = @CATALOGS@
++CATOBJEXT = @CATOBJEXT@
++CC = @CC@
++CCDEPMODE = @CCDEPMODE@
++CFLAGS = @CFLAGS@
++CPP = @CPP@
++CPPFLAGS = @CPPFLAGS@
++CYGPATH_W = @CYGPATH_W@
++DATADIRNAME = @DATADIRNAME@
++DEFS = @DEFS@
++DEPDIR = @DEPDIR@
++ECHO_C = @ECHO_C@
++ECHO_N = @ECHO_N@
++ECHO_T = @ECHO_T@
++EGREP = @EGREP@
++EXEEXT = @EXEEXT@
++GCONFTOOL = @GCONFTOOL@
++GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@
++GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@
++GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
++GMOFILES = @GMOFILES@
++GMSGFMT = @GMSGFMT@
++GREP = @GREP@
++INSTALL = @INSTALL@
++INSTALL_DATA = @INSTALL_DATA@
++INSTALL_PROGRAM = @INSTALL_PROGRAM@
++INSTALL_SCRIPT = @INSTALL_SCRIPT@
++INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
++INSTOBJEXT = @INSTOBJEXT@
++INTLLIBS = @INTLLIBS@
++INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
++INTLTOOL_MERGE = @INTLTOOL_MERGE@
++INTLTOOL_PERL = @INTLTOOL_PERL@
++INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
++LDFLAGS = @LDFLAGS@
++LIBOBJS = @LIBOBJS@
++LIBS = @LIBS@
++LTLIBOBJS = @LTLIBOBJS@
++MAINT = @MAINT@
++MAKEINFO = @MAKEINFO@
++MKDIR_P = @MKDIR_P@
++MKINSTALLDIRS = @MKINSTALLDIRS@
++MSGFMT = @MSGFMT@
++MSGFMT_OPTS = @MSGFMT_OPTS@
++MSGMERGE = @MSGMERGE@
++OBJEXT = @OBJEXT@
++PACKAGE = @PACKAGE@
++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
++PACKAGE_NAME = @PACKAGE_NAME@
++PACKAGE_STRING = @PACKAGE_STRING@
++PACKAGE_TARNAME = @PACKAGE_TARNAME@
++PACKAGE_VERSION = @PACKAGE_VERSION@
++PATH_SEPARATOR = @PATH_SEPARATOR@
++PKG_CONFIG = @PKG_CONFIG@
++POFILES = @POFILES@
++POSUB = @POSUB@
++PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
++PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
++PYTHON = @PYTHON@
++PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
++PYTHON_PLATFORM = @PYTHON_PLATFORM@
++PYTHON_PREFIX = @PYTHON_PREFIX@
++PYTHON_VERSION = @PYTHON_VERSION@
++SET_MAKE = @SET_MAKE@
++SHELL = @SHELL@
++SHELL_CFLAGS = @SHELL_CFLAGS@
++SHELL_LIBS = @SHELL_LIBS@
++STRIP = @STRIP@
++SUCROSE_VERSION = @SUCROSE_VERSION@
++USE_NLS = @USE_NLS@
++VERSION = @VERSION@
++XGETTEXT = @XGETTEXT@
++abs_builddir = @abs_builddir@
++abs_srcdir = @abs_srcdir@
++abs_top_builddir = @abs_top_builddir@
++abs_top_srcdir = @abs_top_srcdir@
++ac_ct_CC = @ac_ct_CC@
++am__include = @am__include@
++am__leading_dot = @am__leading_dot@
++am__quote = @am__quote@
++am__tar = @am__tar@
++am__untar = @am__untar@
++bindir = @bindir@
++build_alias = @build_alias@
++builddir = @builddir@
++datadir = @datadir@
++datarootdir = @datarootdir@
++docdir = @docdir@
++dvidir = @dvidir@
++exec_prefix = @exec_prefix@
++host_alias = @host_alias@
++htmldir = @htmldir@
++includedir = @includedir@
++infodir = @infodir@
++install_sh = @install_sh@
++libdir = @libdir@
++libexecdir = @libexecdir@
++localedir = @localedir@
++localstatedir = @localstatedir@
++mandir = @mandir@
++mkdir_p = @mkdir_p@
++oldincludedir = @oldincludedir@
++pdfdir = @pdfdir@
++pkgpyexecdir = @pkgpyexecdir@
++pkgpythondir = @pkgpythondir@
++prefix = @prefix@
++program_transform_name = @program_transform_name@
++psdir = @psdir@
++pyexecdir = @pyexecdir@
++pythondir = @pythondir@
++sbindir = @sbindir@
++sharedstatedir = @sharedstatedir@
++srcdir = @srcdir@
++sysconfdir = @sysconfdir@
++target_alias = @target_alias@
++top_build_prefix = @top_build_prefix@
++top_builddir = @top_builddir@
++top_srcdir = @top_srcdir@
++sugardir = $(pkgdatadir)/extensions/cpsection/accessibility
++sugar_PYTHON = \
++ __init__.py \
++ model.py \
++ view.py
++
++all: all-am
++
++.SUFFIXES:
++$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
++ @for dep in $?; do \
++ case '$(am__configure_deps)' in \
++ *$$dep*) \
++ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
++ && { if test -f $@; then exit 0; else break; fi; }; \
++ exit 1;; \
++ esac; \
++ done; \
++ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign extensions/cpsection/accessibility/Makefile'; \
++ $(am__cd) $(top_srcdir) && \
++ $(AUTOMAKE) --foreign extensions/cpsection/accessibility/Makefile
++.PRECIOUS: Makefile
++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
++ @case '$?' in \
++ *config.status*) \
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
++ *) \
++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
++ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
++ esac;
++
++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++
++$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
++$(am__aclocal_m4_deps):
++install-sugarPYTHON: $(sugar_PYTHON)
++ @$(NORMAL_INSTALL)
++ test -z "$(sugardir)" || $(MKDIR_P) "$(DESTDIR)$(sugardir)"
++ @list='$(sugar_PYTHON)'; dlist=; list2=; test -n "$(sugardir)" || list=; \
++ for p in $$list; do \
++ if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \
++ if test -f $$b$$p; then \
++ $(am__strip_dir) \
++ dlist="$$dlist $$f"; \
++ list2="$$list2 $$b$$p"; \
++ else :; fi; \
++ done; \
++ for file in $$list2; do echo $$file; done | $(am__base_list) | \
++ while read files; do \
++ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sugardir)'"; \
++ $(INSTALL_DATA) $$files "$(DESTDIR)$(sugardir)" || exit $$?; \
++ done || exit $$?; \
++ if test -n "$$dlist"; then \
++ if test -z "$(DESTDIR)"; then \
++ PYTHON=$(PYTHON) $(py_compile) --basedir "$(sugardir)" $$dlist; \
++ else \
++ PYTHON=$(PYTHON) $(py_compile) --destdir "$(DESTDIR)" --basedir "$(sugardir)" $$dlist; \
++ fi; \
++ else :; fi
++
++uninstall-sugarPYTHON:
++ @$(NORMAL_UNINSTALL)
++ @list='$(sugar_PYTHON)'; test -n "$(sugardir)" || list=; \
++ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
++ test -n "$$files" || exit 0; \
++ filesc=`echo "$$files" | sed 's|$$|c|'`; \
++ fileso=`echo "$$files" | sed 's|$$|o|'`; \
++ echo " ( cd '$(DESTDIR)$(sugardir)' && rm -f" $$files ")"; \
++ cd "$(DESTDIR)$(sugardir)" && rm -f $$files || exit $$?; \
++ echo " ( cd '$(DESTDIR)$(sugardir)' && rm -f" $$filesc ")"; \
++ cd "$(DESTDIR)$(sugardir)" && rm -f $$filesc || exit $$?; \
++ echo " ( cd '$(DESTDIR)$(sugardir)' && rm -f" $$fileso ")"; \
++ cd "$(DESTDIR)$(sugardir)" && rm -f $$fileso
++tags: TAGS
++TAGS:
++
++ctags: CTAGS
++CTAGS:
++
++
++distdir: $(DISTFILES)
++ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
++ list='$(DISTFILES)'; \
++ dist_files=`for file in $$list; do echo $$file; done | \
++ sed -e "s|^$$srcdirstrip/||;t" \
++ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
++ case $$dist_files in \
++ */*) $(MKDIR_P) `echo "$$dist_files" | \
++ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
++ sort -u` ;; \
++ esac; \
++ for file in $$dist_files; do \
++ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
++ if test -d $$d/$$file; then \
++ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
++ if test -d "$(distdir)/$$file"; then \
++ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++ fi; \
++ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
++ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
++ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
++ fi; \
++ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
++ else \
++ test -f "$(distdir)/$$file" \
++ || cp -p $$d/$$file "$(distdir)/$$file" \
++ || exit 1; \
++ fi; \
++ done
++check-am: all-am
++check: check-am
++all-am: Makefile
++installdirs:
++ for dir in "$(DESTDIR)$(sugardir)"; do \
++ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
++ done
++install: install-am
++install-exec: install-exec-am
++install-data: install-data-am
++uninstall: uninstall-am
++
++install-am: all-am
++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
++
++installcheck: installcheck-am
++install-strip:
++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
++ `test -z '$(STRIP)' || \
++ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
++mostlyclean-generic:
++
++clean-generic:
++
++distclean-generic:
++ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
++ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
++
++maintainer-clean-generic:
++ @echo "This command is intended for maintainers to use"
++ @echo "it deletes files that may require special tools to rebuild."
++clean: clean-am
++
++clean-am: clean-generic mostlyclean-am
++
++distclean: distclean-am
++ -rm -f Makefile
++distclean-am: clean-am distclean-generic
++
++dvi: dvi-am
++
++dvi-am:
++
++html: html-am
++
++html-am:
++
++info: info-am
++
++info-am:
++
++install-data-am: install-sugarPYTHON
++
++install-dvi: install-dvi-am
++
++install-dvi-am:
++
++install-exec-am:
++
++install-html: install-html-am
++
++install-html-am:
++
++install-info: install-info-am
++
++install-info-am:
++
++install-man:
++
++install-pdf: install-pdf-am
++
++install-pdf-am:
++
++install-ps: install-ps-am
++
++install-ps-am:
++
++installcheck-am:
++
++maintainer-clean: maintainer-clean-am
++ -rm -f Makefile
++maintainer-clean-am: distclean-am maintainer-clean-generic
++
++mostlyclean: mostlyclean-am
++
++mostlyclean-am: mostlyclean-generic
++
++pdf: pdf-am
++
++pdf-am:
++
++ps: ps-am
++
++ps-am:
++
++uninstall-am: uninstall-sugarPYTHON
++
++.MAKE: install-am install-strip
++
++.PHONY: all all-am check check-am clean clean-generic distclean \
++ distclean-generic distdir dvi dvi-am html html-am info info-am \
++ install install-am install-data install-data-am install-dvi \
++ install-dvi-am install-exec install-exec-am install-html \
++ install-html-am install-info install-info-am install-man \
++ install-pdf install-pdf-am install-ps install-ps-am \
++ install-strip install-sugarPYTHON installcheck installcheck-am \
++ installdirs maintainer-clean maintainer-clean-generic \
++ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
++ uninstall-am uninstall-sugarPYTHON
++
++
++# Tell versions [3.59,3.63) of GNU make to not export all variables.
++# Otherwise a system limit (for SysV at least) may be exceeded.
++.NOEXPORT:
+diff -u -r -N sugar-0.88.1.original/extensions/cpsection/accessibility/model.py sugar-0.88.1/extensions/cpsection/accessibility/model.py
+--- sugar-0.88.1.original/extensions/cpsection/accessibility/model.py 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/extensions/cpsection/accessibility/model.py 2010-07-27 11:45:05.237504112 -0300
+@@ -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 -u -r -N sugar-0.88.1.original/extensions/cpsection/accessibility/view.py sugar-0.88.1/extensions/cpsection/accessibility/view.py
+--- sugar-0.88.1.original/extensions/cpsection/accessibility/view.py 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/extensions/cpsection/accessibility/view.py 2010-07-27 11:45:05.238503821 -0300
+@@ -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 -u -r -N sugar-0.88.1.original/extensions/cpsection/Makefile.am sugar-0.88.1/extensions/cpsection/Makefile.am
+--- sugar-0.88.1.original/extensions/cpsection/Makefile.am 2010-07-27 10:55:39.738753911 -0300
++++ sugar-0.88.1/extensions/cpsection/Makefile.am 2010-07-27 11:46:37.115753833 -0300
+@@ -1,6 +1,7 @@
+ SUBDIRS = \
+ aboutme \
+ aboutcomputer \
++ accessibility \
+ datetime \
+ frame \
+ keyboard \
+diff -u -r -N sugar-0.88.1.original/src/jarabe/model/accessibility.py sugar-0.88.1/src/jarabe/model/accessibility.py
+--- sugar-0.88.1.original/src/jarabe/model/accessibility.py 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/src/jarabe/model/accessibility.py 2010-07-27 11:45:05.238503821 -0300
+@@ -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()
+diff -u -r -N sugar-0.88.1.original/src/jarabe/model/Makefile.am sugar-0.88.1/src/jarabe/model/Makefile.am
+--- sugar-0.88.1.original/src/jarabe/model/Makefile.am 2010-07-27 10:55:14.456503932 -0300
++++ sugar-0.88.1/src/jarabe/model/Makefile.am 2010-07-27 11:47:46.002753886 -0300
+@@ -1,6 +1,7 @@
+ sugardir = $(pythondir)/jarabe/model
+ sugar_PYTHON = \
+ __init__.py \
++ accessibility.py \
+ buddy.py \
+ bundleregistry.py \
+ filetransfer.py \
diff --git a/rpms/sugar/accessibility_0002_magnifier_extension.patch b/rpms/sugar/accessibility_0002_magnifier_extension.patch
new file mode 100644
index 0000000..85ef136
--- /dev/null
+++ b/rpms/sugar/accessibility_0002_magnifier_extension.patch
@@ -0,0 +1,110 @@
+diff -r -u -N sugar-0.88.1.original.con.parches.cp_accessibility_keyboard/extensions/globalkey/magnifier.py sugar-0.88.1/extensions/globalkey/magnifier.py
+--- sugar-0.88.1.original.con.parches.cp_accessibility_keyboard/extensions/globalkey/magnifier.py 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/extensions/globalkey/magnifier.py 2010-06-21 15:48:39.837180591 -0300
+@@ -0,0 +1,96 @@
++# Copyright (C) 2010 Plan Ceibal <comunidad@plan.ceibal.edu.uy>
++
++import os
++
++import ConfigParser
++import logging
++import gobject
++
++from jarabe.view.viewsource import setup_view_source
++from sugar import env
++
++
++PATH_VMG_CONFIG = os.environ['HOME'] + '/.magnifier.ini'
++BOUND_KEYS = ['<shift>F13', 'F13', '<control>F13']
++
++def handle_key_press(key):
++ logger = logging.getLogger('magnifier')
++ logger.setLevel(logging.DEBUG)
++ logger.debug("Ejecutando magnifier......" + key)
++ if (key=='<shift>F13'):
++ set_ruta_archivo()
++ set_GraphicsTools()
++ if (key=='<control>F13'):
++ set_ruta_archivo()
++ set_InvertColors()
++ _run_cmd_async('launchVmg')
++
++def get_GraphicsTools():
++ return leer_config('General', 'GraphicsTools')
++
++def set_GraphicsTools():
++ grabar_config_GraphicsTools('General', 'GraphicsTools')
++
++def grabar_config_GraphicsTools(encabezado, etiqueta):
++ parser = ConfigParser.ConfigParser()
++ parser.read(PATH_VMG_CONFIG)
++ val_old = get_GraphicsTools()
++ if val_old == '1':
++ parser.set(encabezado, etiqueta, '0')
++ arch = open(PATH_VMG_CONFIG, 'w')
++ parser.write(arch)
++ arch.close()
++ else:
++ parser.set(encabezado, etiqueta, '1')
++ arch = open(PATH_VMG_CONFIG, 'w')
++ parser.write(arch)
++ arch.close()
++
++def get_InvertColors():
++ return leer_config('General', 'InvertColors')
++
++def set_InvertColors():
++ grabar_config_InvertColors('General', 'InvertColors')
++
++def grabar_config_InvertColors(encabezado, etiqueta):
++ parser = ConfigParser.ConfigParser()
++ parser.read(PATH_VMG_CONFIG)
++ val_old = get_InvertColors()
++ if val_old == '1':
++ parser.set(encabezado, etiqueta, '0')
++ arch = open(PATH_VMG_CONFIG, 'w')
++ parser.write(arch)
++ arch.close()
++ else:
++ parser.set(encabezado, etiqueta, '1')
++ arch = open(PATH_VMG_CONFIG, 'w')
++ parser.write(arch)
++ arch.close()
++
++def leer_config(encabezado, etiqueta):
++ parser = ConfigParser.ConfigParser()
++ parser.read(PATH_VMG_CONFIG)
++ return parser.get(encabezado, etiqueta)
++
++def set_ruta_archivo():
++ try:
++ f = file(PATH_VMG_CONFIG)
++ except:
++ PATH_VMG_CONFIG = "/root/.magnifier.ini"
++
++def _run_cmd_async(cmd):
++ logger = logging.getLogger('magnifier')
++ logger.setLevel(logging.DEBUG)
++ try:
++ gobject.spawn_async([find_and_absolutize('launchVmg')])
++ logger.debug("Ejecuto magnifier")
++ except Exception, e:
++ logger.debug("Error ejecutando magnifier" + str(e))
++
++def find_and_absolutize(script_name):
++ paths = env.os.environ['PATH'].split(':')
++ for path in paths:
++ looking_path = path + '/' + script_name
++ if env.os.path.isfile(looking_path):
++ return looking_path
++ return None
+diff -r -u -N sugar-0.88.1.original.con.parches.cp_accessibility_keyboard/extensions/globalkey/Makefile.am sugar-0.88.1/extensions/globalkey/Makefile.am
+--- sugar-0.88.1.original.con.parches.cp_accessibility_keyboard/extensions/globalkey/Makefile.am 2010-02-20 14:47:08.000000000 -0200
++++ sugar-0.88.1/extensions/globalkey/Makefile.am 2010-06-21 15:45:58.445180878 -0300
+@@ -2,5 +2,6 @@
+
+ sugar_PYTHON = \
+ __init__.py \
++ magnifier.py \
+ screenshot.py \
+ viewsource.py
diff --git a/rpms/sugar/accessibility_0003_cp_accessibility_contrast.patch b/rpms/sugar/accessibility_0003_cp_accessibility_contrast.patch
new file mode 100644
index 0000000..1a510ec
--- /dev/null
+++ b/rpms/sugar/accessibility_0003_cp_accessibility_contrast.patch
@@ -0,0 +1,421 @@
+diff -u -r -N sugar-0.88.1.original/bin/sugar.in sugar-0.88.1/bin/sugar.in
+--- sugar-0.88.1.original/bin/sugar.in 2010-07-16 13:18:04.013303378 -0300
++++ sugar-0.88.1/bin/sugar.in 2010-07-16 13:18:11.155046440 -0300
+@@ -40,7 +40,21 @@
+ export SUGAR_SCALING=100
+ fi
+
+-export GTK2_RC_FILES="@prefix@/share/sugar/data/sugar-$SUGAR_SCALING.gtkrc"
++# Set theme
++gconftool-2 --dir-exists=/desktop/sugar/interface
++EXIST_GCONF_SUGAR_CONFIG=$(echo $?)
++if [[ $EXIST_GCONF_SUGAR_CONFIG == 0 ]]; then
++ THEME=$(gconftool-2 --get /desktop/sugar/interface/gtk_theme);
++ if [[ $THEME == 'sugar-contrast' ]]; then
++ GTK2_THEME="sugar-$SUGAR_SCALING-contrast"
++ else
++ GTK2_THEME="sugar-$SUGAR_SCALING"
++ fi
++else
++ GTK2_THEME="sugar-$SUGAR_SCALING"
++fi
++
++export GTK2_RC_FILES="@prefix@/share/sugar/data/$GTK2_THEME.gtkrc"
+
+ # Needed for executing wpa_passphrase
+ export PATH="$PATH":/sbin:/usr/sbin
+diff -u -r -N sugar-0.88.1.original/data/gtkrc-contrast.em sugar-0.88.1/data/gtkrc-contrast.em
+--- sugar-0.88.1.original/data/gtkrc-contrast.em 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/data/gtkrc-contrast.em 2010-07-20 16:41:40.709583181 -0300
+@@ -0,0 +1,12 @@
++@{
++if scaling == '72':
++ icon_sizes = 'gtk-large-toolbar=40,40'
++else:
++ icon_sizes = 'gtk-large-toolbar=55,55'
++}@
++gtk-theme-name = "sugar-@scaling-contrast"
++gtk-icon-theme-name = "sugar"
++gtk-cursor-theme-name = "sugar"
++gtk-toolbar-style = GTK_TOOLBAR_ICONS
++gtk-icon-sizes = "@icon_sizes"
++gtk-cursor-blink-timeout = 3
+diff -u -r -N sugar-0.88.1.original/data/Makefile.am sugar-0.88.1/data/Makefile.am
+--- sugar-0.88.1.original/data/Makefile.am 2010-07-16 13:18:02.492051920 -0300
++++ sugar-0.88.1/data/Makefile.am 2010-07-20 16:39:19.075582765 -0300
+@@ -8,6 +8,14 @@
+ $(srcdir)/em.py -D scaling=\'100\' $(srcdir)/gtkrc.em > \
+ $(top_builddir)/data/sugar-100.gtkrc
+
++sugar-100-contrast.gtkrc: gtkrc-contrast.em
++ $(srcdir)/em.py -D scaling=\'100\' $(srcdir)/gtkrc-contrast.em > \
++ $(top_builddir)/data/sugar-100-contrast.gtkrc
++
++sugar-72-contrast.gtkrc: gtkrc-contrast.em
++ $(srcdir)/em.py -D scaling=\'100\' $(srcdir)/gtkrc-contrast.em > \
++ $(top_builddir)/data/sugar-72-contrast.gtkrc
++
+ sugardir = $(pkgdatadir)/data
+ sugar_DATA = \
+ activities.defaults \
+@@ -18,7 +26,9 @@
+
+ GTKRC_FILES = \
+ sugar-72.gtkrc \
+- sugar-100.gtkrc
++ sugar-100.gtkrc \
++ sugar-100-contrast.gtkrc \
++ sugar-72-contrast.gtkrc
+
+ xsessionsdir = $(datadir)/xsessions
+ xsessions_DATA = sugar.desktop
+@@ -64,5 +74,5 @@
+ icondir = $(datadir)/icons/hicolor/scalable/apps
+ icon_DATA = sugar-xo.svg
+
+-EXTRA_DIST = $(sugar_DATA) $(xsessions_DATA) $(nmservice_DATA) $(mime_xml_in_files) em.py gtkrc.em $(schema_in_files) $(icon_DATA)
++EXTRA_DIST = $(sugar_DATA) $(xsessions_DATA) $(nmservice_DATA) $(mime_xml_in_files) em.py gtkrc.em gtkrc-contrast.em $(schema_in_files) $(icon_DATA)
+ CLEANFILES = $(GTKRC_FILES) $(mime_xml_files) $(schema_DATA)
+diff -u -r -N sugar-0.88.1.original/data/sugar-100-contrast.gtkrc sugar-0.88.1/data/sugar-100-contrast.gtkrc
+--- sugar-0.88.1.original/data/sugar-100-contrast.gtkrc 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/data/sugar-100-contrast.gtkrc 2010-07-16 13:18:08.653046556 -0300
+@@ -0,0 +1,6 @@
++gtk-theme-name = "sugar-100-contrast"
++gtk-icon-theme-name = "sugar"
++gtk-cursor-theme-name = "sugar"
++gtk-toolbar-style = GTK_TOOLBAR_ICONS
++gtk-icon-sizes = "gtk-large-toolbar=55,55"
++gtk-cursor-blink-timeout = 3
+diff -u -r -N sugar-0.88.1.original/data/sugar-72-contrast.gtkrc sugar-0.88.1/data/sugar-72-contrast.gtkrc
+--- sugar-0.88.1.original/data/sugar-72-contrast.gtkrc 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/data/sugar-72-contrast.gtkrc 2010-07-20 16:45:49.308583315 -0300
+@@ -0,0 +1,6 @@
++gtk-theme-name = "sugar-72-contrast"
++gtk-icon-theme-name = "sugar"
++gtk-cursor-theme-name = "sugar"
++gtk-toolbar-style = GTK_TOOLBAR_ICONS
++gtk-icon-sizes = "gtk-large-toolbar=40,40"
++gtk-cursor-blink-timeout = 3
+diff -u -r -N sugar-0.88.1.original/extensions/cpsection/accessibility/model.py sugar-0.88.1/extensions/cpsection/accessibility/model.py
+--- sugar-0.88.1.original/extensions/cpsection/accessibility/model.py 2010-07-16 13:18:04.307107086 -0300
++++ sugar-0.88.1/extensions/cpsection/accessibility/model.py 2010-07-16 13:18:11.600145984 -0300
+@@ -17,15 +17,12 @@
+ # 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()
++screen = accessibility.Screen()
+
+-KEYWORDS = ['mouse_keys', 'sticky_keys', 'bounce_keys']
++KEYWORDS = ['mouse_keys', 'sticky_keys', 'bounce_keys', 'contrast']
+
+ def get_mouse_keys():
+ return keyboard.get_mouse_keys()
+@@ -53,3 +50,12 @@
+
+ def print_bounce_keys():
+ print str(get_bounce_keys())
++
++def get_contrast():
++ return screen.get_contrast()
++
++def set_contrast(activar):
++ screen.set_contrast(activar)
++
++def print_contrast():
++ print str(get_contrast())
+\ No hay ningún carácter de nueva línea al final del fichero
+diff -u -r -N sugar-0.88.1.original/extensions/cpsection/accessibility/view.py sugar-0.88.1/extensions/cpsection/accessibility/view.py
+--- sugar-0.88.1.original/extensions/cpsection/accessibility/view.py 2010-07-16 13:18:04.312046331 -0300
++++ sugar-0.88.1/extensions/cpsection/accessibility/view.py 2010-07-20 16:44:14.613583366 -0300
+@@ -23,7 +23,6 @@
+
+ from sugar.graphics import style
+
+-from jarabe import config
+ from jarabe.controlpanel.sectionview import SectionView
+ from jarabe.controlpanel.inlinealert import InlineAlert
+
+@@ -32,29 +31,73 @@
+ SectionView.__init__(self)
+
+ self._model = model
++ self.restart_alerts = alerts
+ 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)
++ scrollwindow = gtk.ScrolledWindow()
++ scrollwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
++ self.pack_start(scrollwindow, expand=True)
++ scrollwindow.show()
++
++ self._vbox_section = gtk.VBox()
++ scrollwindow.add_with_viewport(self._vbox_section)
++ self._vbox_section.show()
++
++ self._zone_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
++ self.pack_start(self._zone_alert_box, False)
++
++ self._zone_alert = InlineAlert()
++ self._zone_alert_box.pack_start(self._zone_alert)
++ if 'zone' in self.restart_alerts:
++ self._zone_alert.props.msg = self.restart_msg
++ self._zone_alert.show()
++ self._zone_alert_box.show()
++
++ self.needs_restart = False
++
++ self._view_keyboard_options()
++ self._view_screen_options()
++
++
++ def _view_keyboard_options(self):
++ separator_pm_keyboard = gtk.HSeparator()
++ self._vbox_section.pack_start(separator_pm_keyboard, expand=False)
++ separator_pm_keyboard.show()
++
++ label_pm_keyboard = gtk.Label(_('Keyboard'))
++ label_pm_keyboard.set_alignment(0, 0)
++ self._vbox_section.pack_start(label_pm_keyboard, expand=False)
++ label_pm_keyboard.show()
++
++ self.box_pm_keyboard = gtk.VBox()
++ self.box_pm_keyboard.set_border_width(style.DEFAULT_SPACING * 2)
++ self.box_pm_keyboard.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()
++ self._vbox_section.pack_start(self.box_pm_keyboard, expand=False)
++ self.box_pm_keyboard.show()
++
++ def _view_screen_options(self):
++ separator_pm_screen = gtk.HSeparator()
++ self._vbox_section.pack_start(separator_pm_screen, expand=False)
++ separator_pm_screen.show()
++
++ label_pm_screen = gtk.Label(_('Screen'))
++ label_pm_screen.set_alignment(0, 0)
++ self._vbox_section.pack_start(label_pm_screen, expand=False)
++ label_pm_screen.show()
++
++ self.box_pm_screen = gtk.VBox()
++ self.box_pm_screen.set_border_width(style.DEFAULT_SPACING * 2)
++ self.box_pm_screen.set_spacing(style.DEFAULT_SPACING)
++
++ self._view_contrast()
++
++ self._vbox_section.pack_start(self.box_pm_screen, expand=False)
++ self.box_pm_screen.show()
+
+ def _set_mouse_keys(self, widget):
+ state = widget.get_active()
+@@ -68,22 +111,35 @@
+ state = widget.get_active()
+ self._model.set_bounce_keys(state)
+
++ def _set_contrast(self, widget):
++ state = widget.get_active()
++ self._model.set_contrast(state)
++ self.restart_alerts.append('zone')
++ self.needs_restart = True
++ self._zone_alert.props.msg = self.restart_msg
++ self._zone_alert.show()
++
+ 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)
+
++ self._model.set_contrast(self.init_state_contrast)
++ self.btn_contrast.set_active(self.init_state_contrast)
++ self.needs_restart = False
++ self._zone_alert.hide()
++
+ 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.box_pm_keyboard.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)
++ self.box_pm_keyboard.pack_start(lbl_mouse, True, True, 2)
+ lbl_mouse.show()
+
+ def _view_sticky_keys(self):
+@@ -91,13 +147,13 @@
+ 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.box_pm_keyboard.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)
++ self.box_pm_keyboard.pack_start(lbl_sticky, True, True, 2)
+ lbl_sticky.show()
+
+ def _view_bounce_keys(self):
+@@ -105,10 +161,28 @@
+ 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.box_pm_keyboard.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)
++ self.box_pm_keyboard.pack_start(lbl_bounce, True, True, 2)
+ lbl_bounce.show()
++
++ def _view_contrast(self):
++ self.btn_contrast = gtk.CheckButton(_('Contrast'))
++ self._contrast_pm_change_handler = self.btn_contrast.connect("toggled", self._set_contrast)
++ self.init_state_contrast = self._model.get_contrast()
++ if self.init_state_contrast:
++ self.btn_contrast.handler_block(self._contrast_pm_change_handler)
++ self.btn_contrast.set_active(True)
++ self.btn_contrast.handler_unblock(self._contrast_pm_change_handler)
++ else:
++ self.btn_contrast.set_active(False)
++ self.box_pm_screen.pack_start(self.btn_contrast, True, True, 2)
++ self.btn_contrast.show()
++
++ lbl_contrast = gtk.Label(_('Enables the color contrast of the graphic interface.'))
++ lbl_contrast.set_alignment(0, 0)
++ self.box_pm_screen.pack_start(lbl_contrast, True, True, 2)
++ lbl_contrast.show()
+diff -u -r -N sugar-0.88.1.original/src/jarabe/controlpanel/gui.py sugar-0.88.1/src/jarabe/controlpanel/gui.py
+--- sugar-0.88.1.original/src/jarabe/controlpanel/gui.py 2010-07-16 13:18:03.606047116 -0300
++++ sugar-0.88.1/src/jarabe/controlpanel/gui.py 2010-07-16 13:18:10.422201719 -0300
+@@ -1,4 +1,5 @@
+ # Copyright (C) 2008 One Laptop Per Child
++# 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
+@@ -224,7 +225,7 @@
+ self._section_view.connect('request-close',
+ self.__close_request_cb)
+ self._main_view.modify_bg(gtk.STATE_NORMAL,
+- style.COLOR_WHITE.get_gdk_color())
++ style.COLOR_BG_CP.get_gdk_color())
+
+ def set_section_view_auto_close(self):
+ '''Automatically close the control panel if there is "nothing to do"
+diff -u -r -N sugar-0.88.1.original/src/jarabe/desktop/activitieslist.py sugar-0.88.1/src/jarabe/desktop/activitieslist.py
+--- sugar-0.88.1.original/src/jarabe/desktop/activitieslist.py 2010-07-16 13:18:03.809045695 -0300
++++ sugar-0.88.1/src/jarabe/desktop/activitieslist.py 2010-07-16 13:18:10.755297149 -0300
+@@ -1,5 +1,6 @@
+ # Copyright (C) 2008 One Laptop Per Child
+ # Copyright (C) 2009 Tomeu Vizoso
++# 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
+@@ -271,7 +272,7 @@
+ self.props.width = style.GRID_CELL_SIZE
+ self.props.height = style.GRID_CELL_SIZE
+ self.props.size = style.STANDARD_ICON_SIZE
+- self.props.stroke_color = style.COLOR_BUTTON_GREY.get_svg()
++ self.props.stroke_color = style.COLOR_DESKTOP_ICON.get_svg()
+ self.props.fill_color = style.COLOR_TRANSPARENT.get_svg()
+ self.props.mode = gtk.CELL_RENDERER_MODE_ACTIVATABLE
+
+diff -u -r -N sugar-0.88.1.original/src/jarabe/desktop/favoritesview.py sugar-0.88.1/src/jarabe/desktop/favoritesview.py
+--- sugar-0.88.1.original/src/jarabe/desktop/favoritesview.py 2010-07-16 13:18:03.899048832 -0300
++++ sugar-0.88.1/src/jarabe/desktop/favoritesview.py 2010-07-16 13:18:10.933046702 -0300
+@@ -1,5 +1,6 @@
+ # Copyright (C) 2006-2007 Red Hat, Inc.
+ # Copyright (C) 2008 One Laptop Per Child
++# 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
+@@ -411,7 +412,7 @@
+ def _update(self):
+ self.palette = None
+ if not self._resume_mode or not self._journal_entries:
+- xo_color = XoColor('%s,%s' % (style.COLOR_BUTTON_GREY.get_svg(),
++ xo_color = XoColor('%s,%s' % (style.COLOR_DESKTOP_ICON.get_svg(),
+ style.COLOR_TRANSPARENT.get_svg()))
+ else:
+ xo_color = misc.get_icon_color(self._journal_entries[0])
+@@ -528,7 +529,7 @@
+ ActivityPalette.__init__(self, activity_info)
+
+ if not journal_entries:
+- xo_color = XoColor('%s,%s' % (style.COLOR_BUTTON_GREY.get_svg(),
++ xo_color = XoColor('%s,%s' % (style.COLOR_WHITE.get_svg(),
+ style.COLOR_TRANSPARENT.get_svg()))
+ else:
+ xo_color = misc.get_icon_color(journal_entries[0])
+diff -u -r -N sugar-0.88.1.original/src/jarabe/model/accessibility.py sugar-0.88.1/src/jarabe/model/accessibility.py
+--- sugar-0.88.1.original/src/jarabe/model/accessibility.py 2010-07-16 13:18:03.679239241 -0300
++++ sugar-0.88.1/src/jarabe/model/accessibility.py 2010-07-16 13:18:10.506046670 -0300
+@@ -20,8 +20,6 @@
+ import subprocess
+ import gconf
+
+-from gettext import gettext as _
+-
+ class Keyboard:
+
+ def get_mouse_keys(self):
+@@ -67,6 +65,24 @@
+ cmd += ['-mousekeys', 'mousemaxspeed', '3000', 'mousetimetomax', '1000', '+timeout', '+repeatkeys']
+ subprocess.call(cmd)
+
++class Screen:
++
++ CONTRAST_THEME="sugar-contrast"
++ DEFAULT_THEME="sugar"
++
++ def get_contrast(self):
++ client = gconf.client_get_default()
++ value = client.get_string("/desktop/sugar/interface/gtk_theme")
++ return value==self.CONTRAST_THEME
++
++ def set_contrast(self, activar):
++ client = gconf.client_get_default()
++ if (activar):
++ client.set_string("/desktop/sugar/interface/gtk_theme", self.CONTRAST_THEME)
++ else:
++ client.set_string("/desktop/sugar/interface/gtk_theme", self.DEFAULT_THEME)
++
++
+ class AccessibilityManager:
+ def setup_accessibility(self):
+ client = gconf.client_get_default()
diff --git a/rpms/sugar/accessibility_0004_cp_accessibility_mouse.patch b/rpms/sugar/accessibility_0004_cp_accessibility_mouse.patch
new file mode 100644
index 0000000..25b4e81
--- /dev/null
+++ b/rpms/sugar/accessibility_0004_cp_accessibility_mouse.patch
@@ -0,0 +1,323 @@
+diff -u -r -N sugar-0.88.1.original/bin/sugar.in sugar-0.88.1/bin/sugar.in
+--- sugar-0.88.1.original/bin/sugar.in 2010-07-16 13:18:11.155046000 -0300
++++ sugar-0.88.1/bin/sugar.in 2010-07-20 16:57:48.086855582 -0300
+@@ -76,7 +76,18 @@
+ . ~/.sugar/debug
+ fi
+
+-echo Xcursor.theme: sugar | xrdb -merge
++
++# Set cursor theme
++gconftool-2 --dir-exists=/desktop/sugar/peripherals/mouse
++EXIST_SUGAR_CURSOR_THEME=$(echo $?)
++if [[ $EXIST_SUGAR_CURSOR_THEME == 0 ]]; then
++ CURSOR_THEME=$(gconftool-2 --get /desktop/sugar/peripherals/mouse/cursor_theme);
++else
++ CURSOR_THEME="sugar"
++fi
++
++
++echo Xcursor.theme: $CURSOR_THEME | xrdb -merge
+ metacity --no-force-fullscreen -d $DISPLAY &
+
+ exec sugar-session
+diff -u -r -N sugar-0.88.1.original/data/gtkrc-contrast.em sugar-0.88.1/data/gtkrc-contrast.em
+--- sugar-0.88.1.original/data/gtkrc-contrast.em 2010-07-20 16:41:40.709583000 -0300
++++ sugar-0.88.1/data/gtkrc-contrast.em 2010-07-20 16:58:37.329583372 -0300
+@@ -6,7 +6,6 @@
+ }@
+ gtk-theme-name = "sugar-@scaling-contrast"
+ gtk-icon-theme-name = "sugar"
+-gtk-cursor-theme-name = "sugar"
+ gtk-toolbar-style = GTK_TOOLBAR_ICONS
+ gtk-icon-sizes = "@icon_sizes"
+ gtk-cursor-blink-timeout = 3
+diff -u -r -N sugar-0.88.1.original/data/gtkrc.em sugar-0.88.1/data/gtkrc.em
+--- sugar-0.88.1.original/data/gtkrc.em 2010-07-16 13:18:08.796049000 -0300
++++ sugar-0.88.1/data/gtkrc.em 2010-07-20 16:58:26.474583041 -0300
+@@ -6,7 +6,6 @@
+ }@
+ gtk-theme-name = "sugar-@scaling"
+ gtk-icon-theme-name = "sugar"
+-gtk-cursor-theme-name = "sugar"
+ gtk-toolbar-style = GTK_TOOLBAR_ICONS
+ gtk-icon-sizes = "@icon_sizes"
+ gtk-cursor-blink-timeout = 3
+diff -u -r -N sugar-0.88.1.original/data/sugar-100-contrast.gtkrc sugar-0.88.1/data/sugar-100-contrast.gtkrc
+--- sugar-0.88.1.original/data/sugar-100-contrast.gtkrc 2010-07-16 13:18:08.653046000 -0300
++++ sugar-0.88.1/data/sugar-100-contrast.gtkrc 2010-07-20 16:59:20.943583646 -0300
+@@ -1,6 +1,5 @@
+ gtk-theme-name = "sugar-100-contrast"
+ gtk-icon-theme-name = "sugar"
+-gtk-cursor-theme-name = "sugar"
+ gtk-toolbar-style = GTK_TOOLBAR_ICONS
+ gtk-icon-sizes = "gtk-large-toolbar=55,55"
+ gtk-cursor-blink-timeout = 3
+diff -u -r -N sugar-0.88.1.original/data/sugar-100.gtkrc sugar-0.88.1/data/sugar-100.gtkrc
+--- sugar-0.88.1.original/data/sugar-100.gtkrc 2010-07-16 13:18:08.656046000 -0300
++++ sugar-0.88.1/data/sugar-100.gtkrc 2010-07-20 16:59:11.507583511 -0300
+@@ -1,6 +1,5 @@
+ gtk-theme-name = "sugar-100"
+ gtk-icon-theme-name = "sugar"
+-gtk-cursor-theme-name = "sugar"
+ gtk-toolbar-style = GTK_TOOLBAR_ICONS
+ gtk-icon-sizes = "gtk-large-toolbar=55,55"
+ gtk-cursor-blink-timeout = 3
+diff -u -r -N sugar-0.88.1.original/data/sugar-72-contrast.gtkrc sugar-0.88.1/data/sugar-72-contrast.gtkrc
+--- sugar-0.88.1.original/data/sugar-72-contrast.gtkrc 2010-07-20 16:45:49.308583000 -0300
++++ sugar-0.88.1/data/sugar-72-contrast.gtkrc 2010-07-20 16:59:00.283833495 -0300
+@@ -1,6 +1,5 @@
+ gtk-theme-name = "sugar-72-contrast"
+ gtk-icon-theme-name = "sugar"
+-gtk-cursor-theme-name = "sugar"
+ gtk-toolbar-style = GTK_TOOLBAR_ICONS
+ gtk-icon-sizes = "gtk-large-toolbar=40,40"
+ gtk-cursor-blink-timeout = 3
+diff -u -r -N sugar-0.88.1.original/data/sugar-72.gtkrc sugar-0.88.1/data/sugar-72.gtkrc
+--- sugar-0.88.1.original/data/sugar-72.gtkrc 2010-07-16 13:18:08.786046000 -0300
++++ sugar-0.88.1/data/sugar-72.gtkrc 2010-07-20 16:58:51.018583194 -0300
+@@ -1,6 +1,5 @@
+ gtk-theme-name = "sugar-72"
+ gtk-icon-theme-name = "sugar"
+-gtk-cursor-theme-name = "sugar"
+ gtk-toolbar-style = GTK_TOOLBAR_ICONS
+ gtk-icon-sizes = "gtk-large-toolbar=40,40"
+ gtk-cursor-blink-timeout = 3
+diff -u -r -N sugar-0.88.1.original/extensions/cpsection/accessibility/model.py sugar-0.88.1/extensions/cpsection/accessibility/model.py
+--- sugar-0.88.1.original/extensions/cpsection/accessibility/model.py 2010-07-16 13:18:11.600145000 -0300
++++ sugar-0.88.1/extensions/cpsection/accessibility/model.py 2010-07-20 16:57:48.086855582 -0300
+@@ -21,8 +21,9 @@
+
+ keyboard = accessibility.Keyboard()
+ screen = accessibility.Screen()
++mouse = accessibility.Mouse()
+
+-KEYWORDS = ['mouse_keys', 'sticky_keys', 'bounce_keys', 'contrast']
++KEYWORDS = ['mouse_keys', 'sticky_keys', 'bounce_keys', 'contrast', 'white_mouse', 'accel_mouse']
+
+ def get_mouse_keys():
+ return keyboard.get_mouse_keys()
+@@ -58,4 +59,22 @@
+ screen.set_contrast(activar)
+
+ def print_contrast():
+- print str(get_contrast())
+\ No hay ningún carácter de nueva línea al final del fichero
++ print str(get_contrast())
++
++def get_white_mouse():
++ return mouse.get_white_mouse()
++
++def set_white_mouse(activar):
++ mouse.set_white_mouse(activar)
++
++def print_white_mouse():
++ print str(get_white_mouse())
++
++def get_accel_mouse():
++ return mouse.get_accel_mouse()
++
++def set_accel_mouse(valor):
++ mouse.set_accel_mouse(valor)
++
++def print_accel_mouse():
++ print str(get_accel_mouse())
+\ No hay ningún carácter de nueva línea al final del fichero
+diff -u -r -N sugar-0.88.1.original/extensions/cpsection/accessibility/view.py sugar-0.88.1/extensions/cpsection/accessibility/view.py
+--- sugar-0.88.1.original/extensions/cpsection/accessibility/view.py 2010-07-20 16:44:14.613583000 -0300
++++ sugar-0.88.1/extensions/cpsection/accessibility/view.py 2010-07-20 16:57:48.087855221 -0300
+@@ -57,6 +57,7 @@
+
+ self._view_keyboard_options()
+ self._view_screen_options()
++ self._view_mouse_options()
+
+
+ def _view_keyboard_options(self):
+@@ -98,6 +99,26 @@
+
+ self._vbox_section.pack_start(self.box_pm_screen, expand=False)
+ self.box_pm_screen.show()
++
++ def _view_mouse_options(self):
++ separator_pm_mouse = gtk.HSeparator()
++ self._vbox_section.pack_start(separator_pm_mouse, expand=False)
++ separator_pm_mouse.show()
++
++ label_pm_mouse = gtk.Label(_('Mouse'))
++ label_pm_mouse.set_alignment(0, 0)
++ self._vbox_section.pack_start(label_pm_mouse, expand=False)
++ label_pm_mouse.show()
++
++ self.box_pm_mouse = gtk.VBox()
++ self.box_pm_mouse.set_border_width(style.DEFAULT_SPACING * 2)
++ self.box_pm_mouse.set_spacing(style.DEFAULT_SPACING)
++
++ self._view_white_mouse()
++ self._view_acceleration_mouse()
++
++ self._vbox_section.pack_start(self.box_pm_mouse, expand=False)
++ self.box_pm_mouse.show()
+
+ def _set_mouse_keys(self, widget):
+ state = widget.get_active()
+@@ -119,6 +140,17 @@
+ self._zone_alert.props.msg = self.restart_msg
+ self._zone_alert.show()
+
++ def _set_white_mouse(self, widget):
++ state = widget.get_active()
++ self._model.set_white_mouse(state)
++ self.restart_alerts.append('zone')
++ self.needs_restart = True
++ self._zone_alert.props.msg = self.restart_msg
++ self._zone_alert.show()
++
++ def cb_digits_scale_accel_mouse(self, adj):
++ self._model.set_accel_mouse(adj.value)
++
+ def undo(self):
+ self._model.set_mouse_keys(self.init_state_mouse_keys)
+ self._model.set_sticky_keys(self.init_state_sticky_keys)
+@@ -126,6 +158,12 @@
+
+ self._model.set_contrast(self.init_state_contrast)
+ self.btn_contrast.set_active(self.init_state_contrast)
++
++ self._model.set_white_mouse(self.init_state_white_mouse)
++ self.btn_white_mouse.set_active(self.init_state_white_mouse)
++
++ self.adj_accel_mouse.set_value(self.init_state_accel_mouse)
++
+ self.needs_restart = False
+ self._zone_alert.hide()
+
+@@ -186,3 +224,45 @@
+ lbl_contrast.set_alignment(0, 0)
+ self.box_pm_screen.pack_start(lbl_contrast, True, True, 2)
+ lbl_contrast.show()
++
++ def _view_white_mouse(self):
++ self.btn_white_mouse = gtk.CheckButton(_('White Mouse'))
++ self._white_mouse_pm_change_handler = self.btn_white_mouse.connect("toggled", self._set_white_mouse)
++ self.init_state_white_mouse = self._model.get_white_mouse()
++ if self.init_state_white_mouse:
++ self.btn_white_mouse.handler_block(self._white_mouse_pm_change_handler)
++ self.btn_white_mouse.set_active(True)
++ self.btn_white_mouse.handler_unblock(self._white_mouse_pm_change_handler)
++ else:
++ self.btn_white_mouse.set_active(False)
++ self.box_pm_mouse.pack_start(self.btn_white_mouse, True, True, 2)
++ self.btn_white_mouse.show()
++
++ lbl_white_mouse = gtk.Label(_('Show the mouse cursor white.'))
++ lbl_white_mouse.set_alignment(0, 0)
++ self.box_pm_mouse.pack_start(lbl_white_mouse, True, True, 2)
++ lbl_white_mouse.show()
++
++ def _view_acceleration_mouse(self):
++ box_accel_mouse = gtk.HBox(False, 0)
++ box_accel_mouse.set_border_width(0)
++ lbl_accel_mouse = gtk.Label(_('Acceleration: '))
++ lbl_accel_mouse.show()
++ box_accel_mouse.pack_start(lbl_accel_mouse, False, False, 0)
++
++ self.init_state_accel_mouse = self._model.get_accel_mouse();
++ self.adj_accel_mouse = gtk.Adjustment(self.init_state_accel_mouse, 0.0, 5.0, 1.0, 1.0, 0.0)
++ self.adj_accel_mouse.connect("value_changed", self.cb_digits_scale_accel_mouse)
++ self.scale_accel_mouse = gtk.HScale(self.adj_accel_mouse)
++ self.scale_accel_mouse.set_digits(0)
++ self.scale_accel_mouse.show()
++
++ box_accel_mouse.pack_start(self.scale_accel_mouse, True, True, 0)
++ box_accel_mouse.show()
++
++ self.box_pm_mouse.pack_start(box_accel_mouse, True, True, 2)
++
++ desc_accel_mouse = gtk.Label(_('Controller acceleration mouse.'))
++ desc_accel_mouse.set_alignment(0, 0)
++ self.box_pm_mouse.pack_start(desc_accel_mouse, True, True, 2)
++ desc_accel_mouse.show()
+\ No hay ningún carácter de nueva línea al final del fichero
+diff -u -r -N sugar-0.88.1.original/src/jarabe/model/accessibility.py sugar-0.88.1/src/jarabe/model/accessibility.py
+--- sugar-0.88.1.original/src/jarabe/model/accessibility.py 2010-07-16 13:18:10.506046000 -0300
++++ sugar-0.88.1/src/jarabe/model/accessibility.py 2010-07-20 16:57:48.090583431 -0300
+@@ -17,6 +17,7 @@
+ # 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
+ import subprocess
+ import gconf
+
+@@ -67,8 +68,10 @@
+
+ class Screen:
+
+- CONTRAST_THEME="sugar-contrast"
+ DEFAULT_THEME="sugar"
++ DEFAULT_FONT_SIZE=7
++ CONTRAST_THEME="sugar-contrast"
++ CONTRAST_FONT_SIZE=9.5
+
+ def get_contrast(self):
+ client = gconf.client_get_default()
+@@ -79,9 +82,52 @@
+ client = gconf.client_get_default()
+ if (activar):
+ client.set_string("/desktop/sugar/interface/gtk_theme", self.CONTRAST_THEME)
++ client.set_float('/desktop/sugar/font/default_size', self.CONTRAST_FONT_SIZE)
+ else:
+ client.set_string("/desktop/sugar/interface/gtk_theme", self.DEFAULT_THEME)
++ client.set_float('/desktop/sugar/font/default_size', self.DEFAULT_FONT_SIZE)
++
++class Mouse:
++
++ WHITE_CURSOR_THEME="FlatbedCursors.White.Huge"
++ DEFAULT_CURSOR_THEME="sugar"
++
++ def get_white_mouse(self):
++ client = gconf.client_get_default()
++ value = client.get_string("/desktop/sugar/peripherals/mouse/cursor_theme")
++ return value==self.WHITE_CURSOR_THEME
++
++ def set_white_mouse(self, activar):
++ client = gconf.client_get_default()
++ if (activar):
++ client.set_string("/desktop/sugar/peripherals/mouse/cursor_theme", self.WHITE_CURSOR_THEME)
++ else:
++ client.set_string("/desktop/sugar/peripherals/mouse/cursor_theme", self.DEFAULT_CURSOR_THEME)
++
++ def _set_white_mouse_setting(self):
++ cursor_theme = self.DEFAULT_CURSOR_THEME
++ if (self.get_white_mouse()):
++ cursor_theme = self.WHITE_CURSOR_THEME
++ settings = gtk.settings_get_default()
++ settings.set_property("gtk-cursor-theme-name", "%s" % (cursor_theme))
++
++ def get_accel_mouse(self):
++ client = gconf.client_get_default()
++ value = client.get_float("/desktop/sugar/peripherals/mouse/motion_acceleration")
++ return value
++
++ def set_accel_mouse(self, value):
++ client = gconf.client_get_default()
++ client.set_float("/desktop/sugar/peripherals/mouse/motion_acceleration", value)
++ self.run_config_mouse()
++
++ def _set_accel_mouse_setting(self):
++ cmd = ['xset', 'm' , str(self.get_accel_mouse())]
++ subprocess.call(cmd)
+
++ def run_config_mouse(self):
++ self._set_accel_mouse_setting()
++ self._set_white_mouse_setting()
+
+ class AccessibilityManager:
+ def setup_accessibility(self):
+@@ -90,3 +136,5 @@
+ if is_accessibility:
+ keyboard = Keyboard()
+ keyboard.run_config_keyboard()
++ mouse = Mouse()
++ mouse.run_config_mouse()
diff --git a/rpms/sugar/accessibility_0005_cp_accessibility_capital_letters.patch b/rpms/sugar/accessibility_0005_cp_accessibility_capital_letters.patch
new file mode 100644
index 0000000..bb5d758
--- /dev/null
+++ b/rpms/sugar/accessibility_0005_cp_accessibility_capital_letters.patch
@@ -0,0 +1,140 @@
+diff -u -r -N sugar-0.88.1.original/extensions/cpsection/accessibility/model.py sugar-0.88.1/extensions/cpsection/accessibility/model.py
+--- sugar-0.88.1.original/extensions/cpsection/accessibility/model.py 2010-07-07 11:39:07.592689000 -0300
++++ sugar-0.88.1/extensions/cpsection/accessibility/model.py 2010-07-08 16:50:20.098168299 -0300
+@@ -23,7 +23,7 @@
+ screen = accessibility.Screen()
+ mouse = accessibility.Mouse()
+
+-KEYWORDS = ['mouse_keys', 'sticky_keys', 'bounce_keys', 'contrast', 'white_mouse', 'accel_mouse']
++KEYWORDS = ['mouse_keys', 'sticky_keys', 'bounce_keys', 'contrast', 'white_mouse', 'accel_mouse', 'capital_letters']
+
+ def get_mouse_keys():
+ return keyboard.get_mouse_keys()
+@@ -61,6 +61,15 @@
+ def print_contrast():
+ print str(get_contrast())
+
++def get_capital_letters():
++ return screen.get_capital_letters()
++
++def set_capital_letters(activar):
++ screen.set_capital_letters(activar)
++
++def print_capital_letters():
++ print str(get_capital_letters())
++
+ def get_white_mouse():
+ return mouse.get_white_mouse()
+
+diff -u -r -N sugar-0.88.1.original/extensions/cpsection/accessibility/view.py sugar-0.88.1/extensions/cpsection/accessibility/view.py
+--- sugar-0.88.1.original/extensions/cpsection/accessibility/view.py 2010-07-07 13:32:25.853041000 -0300
++++ sugar-0.88.1/extensions/cpsection/accessibility/view.py 2010-07-09 12:17:08.900311273 -0300
+@@ -96,6 +96,7 @@
+ self.box_pm_screen.set_spacing(style.DEFAULT_SPACING)
+
+ self._view_contrast()
++ self._view_letters()
+
+ self._vbox_section.pack_start(self.box_pm_screen, expand=False)
+ self.box_pm_screen.show()
+@@ -140,6 +141,14 @@
+ self._zone_alert.props.msg = self.restart_msg
+ self._zone_alert.show()
+
++ def _set_capital_letters(self, widget):
++ state = widget.get_active()
++ self._model.set_capital_letters(state)
++ self.restart_alerts.append('zone')
++ self.needs_restart = True
++ self._zone_alert.props.msg = self.restart_msg
++ self._zone_alert.show()
++
+ def _set_white_mouse(self, widget):
+ state = widget.get_active()
+ self._model.set_white_mouse(state)
+@@ -159,6 +168,9 @@
+ self._model.set_contrast(self.init_state_contrast)
+ self.btn_contrast.set_active(self.init_state_contrast)
+
++ self._model.set_capital_letters(self.init_state_capital_letters)
++ self.btn_capital_letters.set_active(self.init_state_capital_letters)
++
+ self._model.set_white_mouse(self.init_state_white_mouse)
+ self.btn_white_mouse.set_active(self.init_state_white_mouse)
+
+@@ -225,6 +237,24 @@
+ self.box_pm_screen.pack_start(lbl_contrast, True, True, 2)
+ lbl_contrast.show()
+
++ def _view_letters(self):
++ self.btn_capital_letters = gtk.CheckButton(_('Capital letters'))
++ self._capital_letters_pm_change_handler = self.btn_capital_letters.connect("toggled", self._set_capital_letters)
++ self.init_state_capital_letters = self._model.get_capital_letters()
++ if self.init_state_capital_letters:
++ self.btn_capital_letters.handler_block(self._capital_letters_pm_change_handler)
++ self.btn_capital_letters.set_active(True)
++ self.btn_capital_letters.handler_unblock(self._capital_letters_pm_change_handler)
++ else:
++ self.btn_capital_letters.set_active(False)
++ self.box_pm_screen.pack_start(self.btn_capital_letters, True, True, 2)
++ self.btn_capital_letters.show()
++
++ lbl_capital_letters = gtk.Label(_('Shows capital letters in the user interface.'))
++ lbl_capital_letters.set_alignment(0, 0)
++ self.box_pm_screen.pack_start(lbl_capital_letters, True, True, 2)
++ lbl_capital_letters.show()
++
+ def _view_white_mouse(self):
+ self.btn_white_mouse = gtk.CheckButton(_('White Mouse'))
+ self._white_mouse_pm_change_handler = self.btn_white_mouse.connect("toggled", self._set_white_mouse)
+@@ -265,4 +295,7 @@
+ desc_accel_mouse = gtk.Label(_('Controller acceleration mouse.'))
+ desc_accel_mouse.set_alignment(0, 0)
+ self.box_pm_mouse.pack_start(desc_accel_mouse, True, True, 2)
+- desc_accel_mouse.show()
+\ No hay ningún carácter de nueva línea al final del fichero
++ desc_accel_mouse.show()
++
++ def setup(self):
++ pass
+\ No hay ningún carácter de nueva línea al final del fichero
+diff -u -r -N sugar-0.88.1.original/src/jarabe/model/accessibility.py sugar-0.88.1/src/jarabe/model/accessibility.py
+--- sugar-0.88.1.original/src/jarabe/model/accessibility.py 2010-07-08 14:26:37.651094000 -0300
++++ sugar-0.88.1/src/jarabe/model/accessibility.py 2010-07-09 09:44:07.768479236 -0300
+@@ -68,10 +68,12 @@
+
+ class Screen:
+
+- DEFAULT_THEME="sugar"
+- DEFAULT_FONT_SIZE=7
+- CONTRAST_THEME="sugar-contrast"
+- CONTRAST_FONT_SIZE=9.5
++ DEFAULT_THEME = "sugar"
++ DEFAULT_FONT_SIZE = 7
++ DEFAULT_FONT_FACE = "Sans Serif"
++ CONTRAST_THEME = "sugar-contrast"
++ CONTRAST_FONT_SIZE = 9.5
++ CAPITAL_LETTERS_FONT_FACE = "Oracle"
+
+ def get_contrast(self):
+ client = gconf.client_get_default()
+@@ -87,6 +89,19 @@
+ client.set_string("/desktop/sugar/interface/gtk_theme", self.DEFAULT_THEME)
+ client.set_float('/desktop/sugar/font/default_size', self.DEFAULT_FONT_SIZE)
+
++ def get_capital_letters(self):
++ client = gconf.client_get_default()
++ value = client.get_string("/desktop/sugar/font/default_face")
++ return value==self.CAPITAL_LETTERS_FONT_FACE
++
++ def set_capital_letters(self, activar):
++ client = gconf.client_get_default()
++ if (activar):
++ client.set_string('/desktop/sugar/font/default_face', self.CAPITAL_LETTERS_FONT_FACE)
++ else:
++ client.set_string('/desktop/sugar/font/default_face', self.DEFAULT_FONT_FACE)
++
++
+ class Mouse:
+
+ WHITE_CURSOR_THEME="FlatbedCursors.White.Huge"
diff --git a/rpms/sugar/accessibility_0006_virtualkeyboard.patch b/rpms/sugar/accessibility_0006_virtualkeyboard.patch
new file mode 100644
index 0000000..3ab0d82
--- /dev/null
+++ b/rpms/sugar/accessibility_0006_virtualkeyboard.patch
@@ -0,0 +1,2215 @@
+diff -u -r -N sugar-0.88.1.sin_6/bin/sugar.in sugar-0.88.1/bin/sugar.in
+--- sugar-0.88.1.sin_6/bin/sugar.in 2010-07-27 11:54:50.732527000 -0300
++++ sugar-0.88.1/bin/sugar.in 2010-07-27 11:58:16.219753512 -0300
+@@ -90,4 +90,6 @@
+ echo Xcursor.theme: $CURSOR_THEME | xrdb -merge
+ metacity --no-force-fullscreen -d $DISPLAY &
+
++[ -x /usr/bin/pulseaudio ] && /usr/bin/pulseaudio &
++
+ exec sugar-session
+diff -u -r -N sugar-0.88.1.sin_6/extensions/deviceicon/Makefile.am sugar-0.88.1/extensions/deviceicon/Makefile.am
+--- sugar-0.88.1.sin_6/extensions/deviceicon/Makefile.am 2010-07-27 10:55:49.057527000 -0300
++++ sugar-0.88.1/extensions/deviceicon/Makefile.am 2010-07-27 11:59:45.770753790 -0300
+@@ -5,5 +5,6 @@
+ network.py \
+ speaker.py \
+ touchpad.py \
++ virtualkeyboard.py \
+ volume.py \
+ resources.py
+diff -u -r -N sugar-0.88.1.sin_6/extensions/deviceicon/virtualkeyboard.py sugar-0.88.1/extensions/deviceicon/virtualkeyboard.py
+--- sugar-0.88.1.sin_6/extensions/deviceicon/virtualkeyboard.py 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/extensions/deviceicon/virtualkeyboard.py 2010-07-27 12:10:36.323753898 -0300
+@@ -0,0 +1,72 @@
++from gettext import gettext as _
++
++import logging
++import gobject
++import gtk
++import gconf
++import os
++
++from sugar.graphics.tray import TrayIcon
++from sugar.graphics.xocolor import XoColor
++from sugar.graphics.palette import Palette
++from sugar.graphics import style
++from jarabe.frame.frameinvoker import FrameWidgetInvoker
++
++import jarabe.view.virtualkeyboard
++
++class DeviceView(TrayIcon):
++
++ FRAME_POSITION_RELATIVE = 500
++
++ def __init__(self):
++ icon_name = 'virtualkeyboard'
++
++ client = gconf.client_get_default()
++ color = XoColor(client.get_string('/desktop/sugar/user/color'))
++ TrayIcon.__init__(self, icon_name=icon_name, xo_color=color)
++ self.set_palette_invoker(FrameWidgetInvoker(self))
++
++ def create_palette(self):
++ palette = VirtualkeyboardPalette(_('Teclado Virtual'))
++ palette.set_group_id('frame')
++ return palette
++
++class VirtualkeyboardPalette(Palette):
++
++ def __init__(self, primary_text):
++ Palette.__init__(self, label=primary_text)
++
++ self.connect('popup', self._popup_cb)
++ self.connect('popdown', self._popdown_cb)
++
++ self._popped_up = False
++
++ self._open_item = gtk.MenuItem(_('Open'))
++ self._open_item.connect('activate', self._open_activate_cb)
++ self.menu.append(self._open_item)
++ self._open_item.show()
++
++ self._close_item = gtk.MenuItem(_('Close'))
++ self._close_item.connect('activate', self._close_activate_cb)
++ self.menu.append(self._close_item)
++ self._close_item.show()
++
++ def _popup_cb(self, gobject_ref):
++ self._popped_up = True
++
++ def _popdown_cb(self, gobject_ref):
++ self._popped_up = False
++
++ def _open_activate_cb(self, gobject_ref):
++ self.v = jarabe.view.virtualkeyboard.Teclado()
++
++ def _close_activate_cb(self, gobject_ref):
++ try:
++ self.v.close()
++ except:
++ pass
++
++
++def setup(tray):
++ tray.add_device(DeviceView())
++
+diff -u -r -N sugar-0.88.1.sin_6/extensions/globalkey/Makefile.am sugar-0.88.1/extensions/globalkey/Makefile.am
+--- sugar-0.88.1.sin_6/extensions/globalkey/Makefile.am 2010-07-27 11:54:35.612760000 -0300
++++ sugar-0.88.1/extensions/globalkey/Makefile.am 2010-07-27 12:01:39.803753913 -0300
+@@ -4,4 +4,5 @@
+ __init__.py \
+ magnifier.py \
+ screenshot.py \
+- viewsource.py
++ viewsource.py \
++ virtualkeyboard.py
+diff -u -r -N sugar-0.88.1.sin_6/extensions/globalkey/virtualkeyboard.py sugar-0.88.1/extensions/globalkey/virtualkeyboard.py
+--- sugar-0.88.1.sin_6/extensions/globalkey/virtualkeyboard.py 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/extensions/globalkey/virtualkeyboard.py 2010-07-27 12:03:52.624506476 -0300
+@@ -0,0 +1,9 @@
++import logging
++
++import jarabe.view.virtualkeyboard
++
++BOUND_KEYS = ['<alt>k']
++
++def handle_key_press(key):
++ logging.debug('load virtual keyboard')
++ jarabe.view.virtualkeyboard.Teclado()
+diff -u -r -N sugar-0.88.1.sin_6/src/jarabe/model/Makefile.am sugar-0.88.1/src/jarabe/model/Makefile.am
+--- sugar-0.88.1.sin_6/src/jarabe/model/Makefile.am 2010-07-27 11:47:46.002753000 -0300
++++ sugar-0.88.1/src/jarabe/model/Makefile.am 2010-07-27 12:02:50.900754061 -0300
+@@ -17,4 +17,5 @@
+ screen.py \
+ session.py \
+ sound.py \
+- processmanagement.py
++ processmanagement.py \
++ virtualkeyboard.py
+diff -u -r -N sugar-0.88.1.sin_6/src/jarabe/model/virtualkeyboard.py sugar-0.88.1/src/jarabe/model/virtualkeyboard.py
+--- sugar-0.88.1.sin_6/src/jarabe/model/virtualkeyboard.py 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/src/jarabe/model/virtualkeyboard.py 2010-07-27 12:03:52.625503879 -0300
+@@ -0,0 +1,185 @@
++#!/usr/bin/env python
++# -*- coding: UTF-8 -*-
++# VirtualKeyboard
++# Copyright (C) 2010 Plan Ceibal
++# pykey - http://shallowsky.com/software/crikey
++#
++# 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 sys, os
++import time
++import Xlib.display
++import Xlib.X
++import Xlib.XK
++import Xlib.protocol.event
++
++class Teclado:
++ special_X_keysyms = {
++ ' ' : "space",
++ '\t' : "Tab",
++ '\n' : "Return",
++ '\r' : "BackSpace",
++ '\e' : "Escape",
++ '!' : "exclam",
++ '#' : "numbersign",
++ '%' : "percent",
++ '$' : "dollar",
++ '&' : "ampersand",
++ '"' : "quotedbl",
++ '\'' : "apostrophe",
++ '(' : "parenleft",
++ ')' : "parenright",
++ '*' : "asterisk",
++ '=' : "equal",
++ '+' : "plus",
++ ',' : "comma",
++ '-' : "minus",
++ '.' : "period",
++ '/' : "slash",
++ ':' : "colon",
++ ';' : "semicolon",
++ '<' : "less",
++ '>' : "greater",
++ '?' : "question",
++ '@' : "at",
++ '[' : "bracketleft",
++ ']' : "bracketright",
++ '\\' : "backslash",
++ '^' : "asciicircum",
++ '_' : "underscore",
++ '`' : "grave",
++ '{' : "braceleft",
++ '|' : "bar",
++ '}' : "braceright",
++ '~' : "asciitilde",
++ 'ñ' : "ntilde",
++ 'Ñ' : "Ntilde"
++ };
++
++ def __init__(self):
++ self.display = Xlib.display.Display()
++ self.window = self.display.get_input_focus()._data["focus"];
++
++ def get_keysym(self, ch) :
++ keysym = Xlib.XK.string_to_keysym(ch)
++ if keysym == 0:
++ keysym = Xlib.XK.string_to_keysym(self.special_X_keysyms[ch])
++ return keysym
++
++ def is_shifted(self, ch) :
++ if ch.isupper() :
++ return True
++ if "/=~!@#$%^&()_*{}|:;\">?Ñ".find(ch) >= 0 :
++ return True
++ return False
++
++ def char_to_keycode(self, ch) :
++ keysym = self.get_keysym(ch)
++ keycode = self.display.keysym_to_keycode(keysym)
++ if keycode == 0 :
++ print "Sorry, can't map", ch
++
++ if (self.is_shifted(ch)) :
++ shift_mask = Xlib.X.ShiftMask
++ else :
++ shift_mask = 0
++
++ return keycode, shift_mask
++
++
++ def send_string(self, ch):
++ keycode, shift_mask = self.char_to_keycode(ch)
++ self.escribir(keycode, shift_mask)
++
++ def escribir(self, keycode, shift_mask):
++ event = Xlib.protocol.event.KeyPress(
++ time = int(time.time()),
++ root = self.display.screen().root,
++ window = self.window,
++ same_screen = 0, child = Xlib.X.NONE,
++ root_x = 0, root_y = 0, event_x = 0, event_y = 0,
++ state = shift_mask,
++ detail = keycode
++ )
++ self.window.send_event(event, propagate = True)
++ event = Xlib.protocol.event.KeyRelease(
++ time = int(time.time()),
++ root = self.display.screen().root,
++ window = self.window,
++ same_screen = 0, child = Xlib.X.NONE,
++ root_x = 0, root_y = 0, event_x = 0, event_y = 0,
++ state = shift_mask,
++ detail = keycode
++ )
++ self.window.send_event(event, propagate = True)
++
++
++ def escribir_txt(self, txt):
++ self.display = Xlib.display.Display()
++ self.window = self.display.get_input_focus()._data["focus"];
++
++ if (txt == "ü"):
++ self.escribir(34, 1)
++ self.send_string("u")
++ elif (txt == "Ü"):
++ self.escribir(34, 1)
++ self.send_string("U")
++ elif (txt == "|"):
++ self.escribir(10, Xlib.X.Mod5Mask)
++ elif (txt == "@"):
++ self.escribir(11, Xlib.X.Mod5Mask)
++ elif (txt == "#"):
++ self.escribir(12, Xlib.X.Mod5Mask)
++ elif (txt == "º"):
++ self.escribir(49, 0)
++ elif (txt == "ª"):
++ self.escribir(49, 1)
++ elif (txt == "'"):
++ self.escribir(20, 0)
++ elif (txt == "¿"):
++ self.escribir(21, 1)
++ elif (txt == "¡"):
++ self.escribir(21, 0)
++ elif (txt == "'"):
++ self.escribir(34, 0)
++ elif (self.tieneTilde(txt)):
++ self.escribir(34, 0)
++ self.escribirVocal(txt)
++ else:
++ self.send_string(txt)
++
++ self.display.sync()
++
++ def tieneTilde(self, txt):
++ return "ÁÉÍÓÚáéíóú".find(txt) >= 0
++
++ def escribirVocal(self, txt):
++ if txt=="Á": self.send_string("A")
++ if txt=="É": self.send_string("E")
++ if txt=="Í": self.send_string("I")
++ if txt=="Ó": self.send_string("O")
++ if txt=="Ú": self.send_string("U")
++ if txt=="á": self.send_string("a")
++ if txt=="é": self.send_string("e")
++ if txt=="í": self.send_string("i")
++ if txt=="ó": self.send_string("o")
++ if txt=="ú": self.send_string("u")
++
++ def hablar(self, texto, s):
++ subprocess.call(["espeak", "-p", "30", "-s", s, "-v", "spanish", texto], stdout=subprocess.PIPE)
+diff -u -r -N sugar-0.88.1.sin_6/src/jarabe/view/Makefile.am sugar-0.88.1/src/jarabe/view/Makefile.am
+--- sugar-0.88.1.sin_6/src/jarabe/view/Makefile.am 2010-02-20 14:47:08.000000000 -0200
++++ sugar-0.88.1/src/jarabe/view/Makefile.am 2010-07-27 12:03:09.426753881 -0300
+@@ -9,4 +9,5 @@
+ pulsingicon.py \
+ service.py \
+ tabbinghandler.py \
+- viewsource.py
++ viewsource.py \
++ virtualkeyboard.py
+diff -u -r -N sugar-0.88.1.sin_6/src/jarabe/view/virtualkeyboard.py sugar-0.88.1/src/jarabe/view/virtualkeyboard.py
+--- sugar-0.88.1.sin_6/src/jarabe/view/virtualkeyboard.py 1969-12-31 21:00:00.000000000 -0300
++++ sugar-0.88.1/src/jarabe/view/virtualkeyboard.py 2010-07-27 12:03:52.628503074 -0300
+@@ -0,0 +1,1883 @@
++#!/usr/bin/env python
++# -*- coding: UTF-8 -*-
++# Virtualkeyboard
++# 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 pygtk
++pygtk.require('2.0')
++import gtk
++import sys, os
++import time
++import pango
++import gconf
++import logging
++import threading
++import gobject
++
++import jarabe.model.virtualkeyboard
++from sugar.graphics.icon import Icon, get_icon_file_name
++
++gobject.threads_init()
++
++velocidades = {'lenta': 4500, 'media': 3000, 'rapida':1500}
++hablar = {'lenta': "170", 'media': "180", 'rapida':"275"}
++
++class Teclado:
++
++ def __init__(self):
++ self.BOTONESxBARRIDO = False;
++ self.BOTONESxBARRIDOxFILA = False;
++ self.MAYUSCULA = True;
++ self.fila_1 = [];
++ self.fila_2 = [];
++ self.fila_3 = [];
++ self.fila_4 = [];
++ self.fila_5 = [];
++ self.losBotones = [];
++ self.fila_actual = None;
++ self.btn_actual = None;
++ self.fila_actual_nro = -1;
++
++ self.seg = velocidades['media'];
++ self.hablar_al = "NUNCA";
++ self.size = "CHICO"
++ self.teclado_tipo = "COMPLETO";
++ self.inicilizar_config()
++
++# self.desplegar()
++ if os.environ.has_key('virtualkeyboard'):
++ self.visible = os.environ['virtualkeyboard']
++ if self.visible == 'True':
++ return
++ else:
++ if self.visible == 'False':
++ self.desplegar()
++ else:
++ self.desplegar()
++
++
++ def delete_event(self, widget, event=None):
++ self.close()
++
++ def close(self):
++ self.BOTONESxBARRIDOxFILA = False
++ self.BOTONESxBARRIDO = False
++ os.environ['virtualkeyboard'] = 'False'
++ logging.debug('close virtual keyboard')
++ self.dialog.destroy()
++ try:
++ self.hilo_type._Thread__stop()
++ self.hilo_size._Thread__stop()
++ self.hilo_bloquear._Thread__stop()
++ self.hilo_hablar._Thread__stop()
++ except:
++ pass
++ return False
++
++
++ def desplegar(self):
++ self._mTeclado=jarabe.model.virtualkeyboard.Teclado()
++
++ self.dialog = gtk.Dialog()
++ self.dialog.set_title("TECLADO VIRTUAL")
++ self.dialog.set_keep_above(True)
++ self.dialog.grab_focus()
++ try:
++ self.dialog.set_icon_from_file(get_icon_file_name('virtualkeyboard'))
++ except:
++ logging.debug('dont show virtual keyboard icon')
++
++ self.dialog.set_accept_focus(False)
++ self.dialog.connect("delete_event", self.delete_event)
++
++ #tipo de teclado:
++ try:
++ self.teclado_tipo = self.get_tipo_teclado()
++ except:
++ logging.error("init - error al leer teclado_tipo")
++ self.teclado_tipo = "COMPLETO"
++
++ self.vbox_teclado = self.mostrar_teclado()
++
++ #sizes:
++ try:
++ self.size = self.get_size_botones()
++ except:
++ logging.error("init - error al leer size_botones")
++ self.size = "CHICO"
++
++ x, y = self.get_size_dialog(self.size, self.teclado_tipo)
++ font_desc = self.get_font_desc(self.size, self.teclado_tipo)
++ self.dialog.set_size_request(x, y)
++ self.sizeBotones(font_desc)
++
++ self.event_box = gtk.EventBox()
++ self.event_box.add(self.vbox_teclado)
++ self.event_box.set_events(gtk.gdk.BUTTON_PRESS)
++ self.event_box.show()
++ self.ebc = self.event_box.connect("button_press_event", self.mouse_boton)
++ self.dialog.vbox.pack_start(self.event_box, False, False, 5)
++
++ self.vbox_teclado.show_all()
++
++ self.posicionar_dialog(self.dialog)
++
++ self.dialog.show()
++
++ try:
++ self.hablar_al = self.get_opciones_hablar()
++ except:
++ logging.debug('init - Error al cargar opciones.')
++ self.hablar_al = "NUNCA"
++
++ barriendo=""
++ try:
++ barriendo = self.leer_barrido()
++ except:
++ logging.error("init - Error al leer barrido.")
++ barriendo = "NO"
++
++ if barriendo == "SI":
++ try:
++ seg =self.get_time_barrido_botones()
++ except:
++ logging.error("init - error al leer time_barrido_botones")
++ seg = velocidades['media']
++
++ self.seg = seg
++ self.BOTONESxBARRIDOxFILA = True
++ self.botonesXbarridoXfila()
++
++ os.environ['virtualkeyboard'] = 'True'
++
++
++ def mostrar_teclado(self):
++ if (self.teclado_tipo == "COMPLETO"):
++ return self.mostrar_teclado_completo()
++ elif (self.teclado_tipo == "NUMERICO"):
++ return self.mostrar_teclado_numerico()
++ elif (self.teclado_tipo == "LETRAS"):
++ return self.mostrar_teclado_letras()
++
++ def mostrar_teclado_completo(self):
++ child = gtk.VBox(False, 2)
++
++ # defino botones
++ self.btn_BACK_SPACE = self.new_button_borrar()
++ self.losBotones.append(self.btn_BACK_SPACE)
++
++ self.btn_SPACE = self.new_button_espacio()
++ self.losBotones.append(self.btn_SPACE)
++
++ self.btn_CAPS_LOCK = self.new_button_mayuscula()
++ self.fila_3.append(self.btn_CAPS_LOCK)
++ self.losBotones.append(self.btn_CAPS_LOCK)
++
++ self.btn_ENTER = self.new_button_enter()
++ self.losBotones.append(self.btn_ENTER)
++ self.fila_2.append(self.btn_ENTER)
++
++ self.btn_TAB = self.new_button_tab()
++ self.losBotones.append(self.btn_TAB)
++ self.fila_2.append(self.btn_TAB)
++
++ self.btn_do = self.new_button_escribir("º")
++ self.btn_do.set_text_desc("o superíndice")
++ self.losBotones.append(self.btn_do)
++ self.fila_1.append(self.btn_do)
++
++ self.btn_1 = self.new_button_escribir("1")
++ self.losBotones.append(self.btn_1)
++ self.fila_1.append(self.btn_1)
++
++ self.btn_2 = self.new_button_escribir("2")
++ self.losBotones.append(self.btn_2)
++ self.fila_1.append(self.btn_2)
++
++ self.btn_3 = self.new_button_escribir("3")
++ self.losBotones.append(self.btn_3)
++ self.fila_1.append(self.btn_3)
++
++ self.btn_4 = self.new_button_escribir("4")
++ self.losBotones.append(self.btn_4)
++ self.fila_1.append(self.btn_4)
++
++ self.btn_5 = self.new_button_escribir("5")
++ self.losBotones.append(self.btn_5)
++ self.fila_1.append(self.btn_5)
++
++ self.btn_6 = self.new_button_escribir("6")
++ self.losBotones.append(self.btn_6)
++ self.fila_1.append(self.btn_6)
++
++ self.btn_7 = self.new_button_escribir("7")
++ self.losBotones.append(self.btn_7)
++ self.fila_1.append(self.btn_7)
++
++ self.btn_8 = self.new_button_escribir("8")
++ self.losBotones.append(self.btn_8)
++ self.fila_1.append(self.btn_8)
++
++ self.btn_9 = self.new_button_escribir("9")
++ self.losBotones.append(self.btn_9)
++ self.fila_1.append(self.btn_9)
++
++ self.btn_0 = self.new_button_escribir("0")
++ self.losBotones.append(self.btn_0)
++ self.fila_1.append(self.btn_0)
++
++ self.btn_finPreg = self.new_button_escribir("'")
++ self.btn_finPreg.set_text_desc("comilla simple")
++ self.losBotones.append(self.btn_finPreg)
++ self.fila_1.append(self.btn_finPreg)
++
++ self.btn_inicioPreg = self.new_button_escribir("¡")
++ self.btn_inicioPreg.set_text_desc("abro exclamación")
++ self.losBotones.append(self.btn_inicioPreg)
++ self.fila_1.append(self.btn_inicioPreg)
++
++ self.btn_Q = self.new_button_escribir("Q")
++ self.losBotones.append(self.btn_Q)
++ self.fila_2.append(self.btn_Q)
++
++ self.btn_W = self.new_button_escribir("W")
++ self.losBotones.append(self.btn_W)
++ self.fila_2.append(self.btn_W)
++
++ self.btn_E = self.new_button_escribir("E")
++ self.losBotones.append(self.btn_E)
++ self.fila_2.append(self.btn_E)
++
++ self.btn_R = self.new_button_escribir("R")
++ self.losBotones.append(self.btn_R)
++ self.fila_2.append(self.btn_R)
++
++ self.btn_T = self.new_button_escribir("T")
++ self.losBotones.append(self.btn_T)
++ self.fila_2.append(self.btn_T)
++
++ self.btn_Y = self.new_button_escribir("Y")
++ self.losBotones.append(self.btn_Y)
++ self.fila_2.append(self.btn_Y)
++
++ self.btn_U = self.new_button_escribir("U")
++ self.losBotones.append(self.btn_U)
++ self.fila_2.append(self.btn_U)
++
++ self.btn_I = self.new_button_escribir("I")
++ self.losBotones.append(self.btn_I)
++ self.fila_2.append(self.btn_I)
++
++ self.btn_O = self.new_button_escribir("O")
++ self.losBotones.append(self.btn_O)
++ self.fila_2.append(self.btn_O)
++
++ self.btn_P = self.new_button_escribir("P")
++ self.losBotones.append(self.btn_P)
++ self.fila_2.append(self.btn_P)
++
++ self.btn_asterisco = self.new_button_escribir("*")
++ self.losBotones.append(self.btn_asterisco)
++ self.fila_2.append(self.btn_asterisco)
++
++ self.btn_cierra_llave = self.new_button_escribir("]")
++ self.btn_cierra_llave.set_text_desc("cierro paréntesis recto")
++ self.losBotones.append(self.btn_cierra_llave)
++
++ self.btn_A = self.new_button_escribir("A")
++ self.losBotones.append(self.btn_A)
++ self.fila_3.append(self.btn_A)
++
++ self.btn_S = self.new_button_escribir("S")
++ self.losBotones.append(self.btn_S)
++ self.fila_3.append(self.btn_S)
++
++ self.btn_D = self.new_button_escribir("D")
++ self.losBotones.append(self.btn_D)
++ self.fila_3.append(self.btn_D)
++
++ self.btn_F = self.new_button_escribir("F")
++ self.losBotones.append(self.btn_F)
++ self.fila_3.append(self.btn_F)
++
++ self.btn_G = self.new_button_escribir("G")
++ self.losBotones.append(self.btn_G)
++ self.fila_3.append(self.btn_G)
++
++ self.btn_H = self.new_button_escribir("H")
++ self.losBotones.append(self.btn_H)
++ self.fila_3.append(self.btn_H)
++
++ self.btn_J = self.new_button_escribir("J")
++ self.losBotones.append(self.btn_J)
++ self.fila_3.append(self.btn_J)
++
++ self.btn_K = self.new_button_escribir("K")
++ self.losBotones.append(self.btn_K)
++ self.fila_3.append(self.btn_K)
++
++ self.btn_L = self.new_button_escribir("L")
++ self.losBotones.append(self.btn_L)
++ self.fila_3.append(self.btn_L)
++
++ self.btn_enie = self.new_button_escribir("Ñ")
++ self.losBotones.append(self.btn_enie)
++ self.fila_3.append(self.btn_enie)
++
++ self.btn_mas = self.new_button_escribir("+")
++ self.btn_mas.set_text_desc("más")
++ self.losBotones.append(self.btn_mas)
++ self.fila_3.append(self.btn_mas)
++
++ self.fila_3.append(self.btn_cierra_llave)
++
++ self.btn_abre_llave = self.new_button_escribir("[")
++ self.btn_abre_llave.set_text_desc("abro paréntesis recto")
++ self.losBotones.append(self.btn_abre_llave)
++ self.fila_2.append(self.btn_abre_llave)
++
++ self.btn_Z = self.new_button_escribir("Z")
++ self.losBotones.append(self.btn_Z)
++ self.fila_4.append(self.btn_Z)
++
++ self.btn_X = self.new_button_escribir("X")
++ self.losBotones.append(self.btn_X)
++ self.fila_4.append(self.btn_X)
++
++ self.btn_C = self.new_button_escribir("C")
++ self.losBotones.append(self.btn_C)
++ self.fila_4.append(self.btn_C)
++
++ self.btn_V = self.new_button_escribir("V")
++ self.losBotones.append(self.btn_V)
++ self.fila_4.append(self.btn_V)
++
++ self.btn_B = self.new_button_escribir("B")
++ self.losBotones.append(self.btn_B)
++ self.fila_4.append(self.btn_B)
++
++ self.btn_N = self.new_button_escribir("N")
++ self.losBotones.append(self.btn_N)
++ self.fila_4.append(self.btn_N)
++
++ self.btn_M = self.new_button_escribir("M")
++ self.losBotones.append(self.btn_M)
++ self.fila_4.append(self.btn_M)
++
++ self.btn_coma = self.new_button_escribir(",")
++ self.btn_coma.set_text_desc("coma")
++ self.losBotones.append(self.btn_coma)
++ self.fila_4.append(self.btn_coma)
++
++ self.btn_punto = self.new_button_escribir(".")
++ self.btn_punto.set_text_desc("punto")
++ self.losBotones.append(self.btn_punto)
++ self.fila_4.append(self.btn_punto)
++
++ self.btn_guion = self.new_button_escribir("-")
++ self.btn_guion.set_text_desc("guión")
++ self.losBotones.append(self.btn_guion)
++ self.fila_4.append(self.btn_guion)
++
++ self.btn_A_tilde = self.new_button_escribir("Á")
++ self.btn_A_tilde.set_text_desc("Á tilde")
++ self.losBotones.append(self.btn_A_tilde)
++ self.fila_5.append(self.btn_A_tilde)
++
++ self.btn_E_tilde = self.new_button_escribir("É")
++ self.btn_E_tilde.set_text_desc("É tilde")
++ self.losBotones.append(self.btn_E_tilde)
++ self.fila_5.append(self.btn_E_tilde)
++
++ self.btn_I_tilde = self.new_button_escribir("Í")
++ self.btn_I_tilde.set_text_desc("Í tilde")
++ self.losBotones.append(self.btn_I_tilde)
++ self.fila_5.append(self.btn_I_tilde)
++
++ self.btn_O_tilde = self.new_button_escribir("Ó")
++ self.btn_O_tilde.set_text_desc("Ó tilde")
++ self.losBotones.append(self.btn_O_tilde)
++ self.fila_5.append(self.btn_O_tilde)
++
++ self.btn_U_tilde = self.new_button_escribir("Ú")
++ self.btn_U_tilde.set_text_desc("Ú tilde")
++ self.losBotones.append(self.btn_U_tilde)
++ self.fila_5.append(self.btn_U_tilde)
++
++ self.btn_U_puntos = self.new_button_escribir("Ü")
++ self.btn_U_puntos.set_text_desc("u diéresis")
++ self.losBotones.append(self.btn_U_puntos)
++ self.fila_5.append(self.btn_U_puntos)
++
++ self.btn_pite = self.new_button_escribir("|")
++ self.btn_pite.set_text_desc("pait")
++ self.losBotones.append(self.btn_pite)
++ self.fila_5.append(self.btn_pite)
++
++ self.btn_arroba = self.new_button_escribir("@")
++ self.losBotones.append(self.btn_arroba)
++ self.fila_5.append(self.btn_arroba)
++
++ self.btn_menor = self.new_button_escribir("<")
++ self.btn_menor.set_text_desc("menor")
++ self.losBotones.append(self.btn_menor)
++ self.fila_5.append(self.btn_menor)
++
++ self.btn_opciones = self.new_button(gtk.STOCK_PREFERENCES, " ", self.desplegar_opciones)
++
++ #dibujo tabla
++ table = gtk.Table(7, 19, True)
++
++ table.set_row_spacing(0, 15)
++ table.set_row_spacing(1, 3)
++ table.set_row_spacing(2, 3)
++ table.set_row_spacing(3, 15)
++ table.set_row_spacing(4, 10)
++ table.set_row_spacing(5, 3)
++ table.set_row_spacing(6, 3)
++
++ table.set_col_spacing(0, 3)
++ table.set_col_spacing(1, 3)
++ table.set_col_spacing(2, 3)
++ table.set_col_spacing(3, 3)
++ table.set_col_spacing(4, 3)
++ table.set_col_spacing(5, 3)
++ table.set_col_spacing(6, 3)
++ table.set_col_spacing(7, 3)
++ table.set_col_spacing(8, 3)
++ table.set_col_spacing(9, 3)
++ table.set_col_spacing(10, 3)
++ table.set_col_spacing(11, 3)
++ table.set_col_spacing(12, 3)
++ table.set_col_spacing(13, 15)
++
++
++ table.attach(self.btn_do, 1, 2, 0, 1)
++ table.attach(self.btn_1, 2, 3, 0, 1)
++ table.attach(self.btn_2, 3, 4, 0, 1)
++ table.attach(self.btn_3, 4, 5, 0, 1)
++ table.attach(self.btn_4, 5, 6, 0, 1)
++ table.attach(self.btn_5, 6, 7, 0, 1)
++ table.attach(self.btn_6, 7, 8, 0, 1)
++ table.attach(self.btn_7, 8, 9, 0, 1)
++ table.attach(self.btn_8, 9, 10, 0, 1)
++ table.attach(self.btn_9, 10, 11, 0, 1)
++ table.attach(self.btn_0, 11, 12, 0, 1)
++ table.attach(self.btn_finPreg, 12 ,13, 0, 1)
++ table.attach(self.btn_inicioPreg, 13, 14, 0, 1)
++ table.attach(self.btn_TAB, 0, 2, 1, 2)
++ table.attach(self.btn_Q, 2, 3, 1, 2)
++ table.attach(self.btn_W, 3, 4, 1, 2)
++ table.attach(self.btn_E, 4, 5, 1, 2)
++ table.attach(self.btn_R, 5, 6, 1, 2)
++ table.attach(self.btn_T, 6, 7, 1, 2)
++ table.attach(self.btn_Y, 7, 8, 1, 2)
++ table.attach(self.btn_U, 8, 9, 1, 2)
++ table.attach(self.btn_I, 9, 10, 1, 2)
++ table.attach(self.btn_O, 10, 11, 1, 2)
++ table.attach(self.btn_P, 11, 12, 1, 2)
++ table.attach(self.btn_asterisco, 12, 13, 1, 2)
++ table.attach(self.btn_abre_llave, 13, 14, 1, 2)
++ table.attach(self.btn_A, 2, 3, 2, 3)
++ table.attach(self.btn_S, 3, 4, 2, 3)
++ table.attach(self.btn_D, 4, 5, 2, 3)
++ table.attach(self.btn_F, 5, 6, 2, 3)
++ table.attach(self.btn_G, 6, 7, 2, 3)
++ table.attach(self.btn_H, 7, 8, 2, 3)
++ table.attach(self.btn_J, 8, 9, 2, 3)
++ table.attach(self.btn_K, 9, 10, 2, 3)
++ table.attach(self.btn_L, 10, 11, 2, 3)
++ table.attach(self.btn_enie, 11, 12, 2, 3)
++ table.attach(self.btn_mas, 12, 13, 2, 3)
++ table.attach(self.btn_cierra_llave, 13, 14, 2, 3)
++ table.attach(self.btn_Z, 2, 3, 3, 4)
++ table.attach(self.btn_X, 3, 4, 3, 4)
++ table.attach(self.btn_C, 4, 5, 3, 4)
++ table.attach(self.btn_V, 5, 6, 3, 4)
++ table.attach(self.btn_B, 6, 7, 3, 4)
++ table.attach(self.btn_N, 7, 8, 3, 4)
++ table.attach(self.btn_M, 8, 9, 3, 4)
++ table.attach(self.btn_coma, 9, 10, 3, 4)
++ table.attach(self.btn_punto, 10, 11, 3, 4)
++ table.attach(self.btn_guion, 11, 12, 3, 4)
++
++ table.attach(self.btn_BACK_SPACE, 14, 19, 0, 1)
++ table.attach(self.btn_ENTER, 14, 19, 1, 2)
++ table.attach(self.btn_CAPS_LOCK, 14, 19, 2, 3)
++ table.attach(self.btn_SPACE, 2, 14, 5, 6)
++ table.attach(self.btn_opciones, 18, 19, 5, 6)
++
++ table.attach(self.btn_A_tilde, 2, 3, 4, 5)
++ table.attach(self.btn_E_tilde, 3, 4, 4, 5)
++ table.attach(self.btn_I_tilde, 4, 5, 4, 5)
++ table.attach(self.btn_O_tilde, 5, 6, 4, 5)
++ table.attach(self.btn_U_tilde, 6, 7, 4, 5)
++ table.attach(self.btn_U_puntos, 9, 10, 4, 5)
++ table.attach(self.btn_pite, 10, 11, 4, 5)
++ table.attach(self.btn_arroba, 11, 12, 4, 5)
++ table.attach(self.btn_menor, 12, 13, 4, 5)
++
++ child.pack_end(table, True, True, 0)
++
++ return child
++
++####################################################################################
++ def escribir(self, widget, *arg):
++ txt = widget.get_text()
++
++ self._mTeclado.escribir_txt(txt)
++ if (self.hablar_al == "ESCRIBIR"):
++ self.btn_actual=widget
++ self.hablar()
++
++ def espacio(self, *arg):
++ self._mTeclado.escribir_txt(" ")
++ if (self.hablar_al == "ESCRIBIR"):
++ self.btn_actual = self.btn_SPACE
++ self.hablar()
++
++ def tab(self, *arg):
++ self._mTeclado.escribir_txt("\t")
++ if (self.hablar_al == "ESCRIBIR"):
++ self.btn_actual = self.btn_TAB
++ self.hablar()
++
++ def enter(self, *arg):
++ self._mTeclado.escribir_txt("\n")
++ if (self.hablar_al == "ESCRIBIR"):
++ self.btn_actual = self.btn_ENTER
++ self.hablar()
++
++ def borrar(self, *arg):
++ self._mTeclado.escribir_txt("\r")
++ if (self.hablar_al == "ESCRIBIR"):
++ self.btn_actual = self.btn_BACK_SPACE
++ self.hablar()
++
++ def new_button_escribir(self, plabel):
++ btn = Boton(plabel)
++ btn.connect("pressed", self.escribir, plabel)
++ btn.connect("activate", self.escribir, plabel)
++ return btn
++
++
++ def new_button_enter(self):
++ btn = Boton("ENTER")
++ btn.set_text_desc("énter")
++ btn.set_font_desc("sans bold 11")
++ btn.connect("pressed", self.enter)
++ btn.connect("activate", self.enter)
++ return btn
++
++ def new_button_espacio(self):
++ btn = Boton("ESPACIO")
++ btn.set_font_desc("sans bold 11")
++ btn.connect("pressed", self.espacio)
++ btn.connect("activate", self.espacio)
++ return btn
++
++ def new_button_borrar(self):
++ btn = Boton("BORRAR")
++ btn.set_font_desc("sans bold 11")
++ btn.connect("pressed", self.borrar)
++ btn.connect("activate", self.borrar)
++ return btn
++
++ def new_button_tab(self):
++ btn = Boton("TAB")
++ btn.set_font_desc("sans bold 11")
++ btn.connect("pressed", self.tab)
++ btn.connect("activate", self.tab)
++ return btn
++
++ def new_button_mayuscula(self):
++ btn = Boton("MINÚSCULA")
++ btn.set_font_desc("sans bold 11")
++ btn.connect("pressed", self.set_mayuscula)
++ btn.connect("activate", self.set_mayuscula)
++ return btn
++
++ def new_button_cambiar_tipo(self, titulo):
++ btn = Boton(titulo)
++ btn.set_font_desc("sans 9")
++ btn.connect("pressed", self.cambiar_tipo)
++ btn.connect("activate", self.cambiar_tipo)
++ return btn
++
++
++ def set_mayuscula(self, *arg):
++ if (self.MAYUSCULA):
++ self.btn_do.set_text("ª")
++ self.btn_do.set_text_desc("a superíndice")
++ self.btn_1.set_text("!")
++ self.btn_1.set_text_desc("cierro exclamación")
++ self.btn_2.set_text("\"")
++ self.btn_2.set_text_desc("comilla doble")
++ self.btn_3.set_text("#")
++ self.btn_3.set_text_desc("numeral")
++ self.btn_4.set_text("$")
++ self.btn_4.set_text_desc("peso")
++ self.btn_5.set_text("%")
++ self.btn_5.set_text_desc("porcentaje")
++ self.btn_6.set_text("&")
++ self.btn_6.set_text_desc("ámpersand")
++ self.btn_7.set_text("/")
++ self.btn_7.set_text_desc("barra")
++ self.btn_8.set_text("(")
++ self.btn_8.set_text_desc("abro paréntesis")
++ self.btn_9.set_text(")")
++ self.btn_9.set_text_desc("cierro paréntesis")
++ self.btn_0.set_text("=")
++ self.btn_0.set_text_desc("igual")
++ self.btn_finPreg.set_text("?")
++ self.btn_finPreg.set_text_desc("cierro pregunta")
++ self.btn_inicioPreg.set_text("¿")
++ self.btn_inicioPreg.set_text_desc("abro pregunta")
++ self.btn_Q.set_text("q")
++ self.btn_W.set_text("w")
++ self.btn_E.set_text("e")
++ self.btn_R.set_text("r")
++ self.btn_T.set_text("t")
++ self.btn_Y.set_text("y")
++ self.btn_U.set_text("u")
++ self.btn_I.set_text("i")
++ self.btn_O.set_text("o")
++ self.btn_P.set_text("p")
++ self.btn_A.set_text("a")
++ self.btn_S.set_text("s")
++ self.btn_D.set_text("d")
++ self.btn_F.set_text("f")
++ self.btn_G.set_text("g")
++ self.btn_H.set_text("h")
++ self.btn_J.set_text("j")
++ self.btn_K.set_text("k")
++ self.btn_L.set_text("l")
++ self.btn_enie.set_text("ñ")
++ self.btn_menor.set_text(">")
++ self.btn_menor.set_text_desc("mayor")
++ self.btn_Z.set_text("z")
++ self.btn_X.set_text("x")
++ self.btn_C.set_text("c")
++ self.btn_V.set_text("v")
++ self.btn_B.set_text("b")
++ self.btn_N.set_text("n")
++ self.btn_M.set_text("m")
++ self.btn_coma.set_text(";")
++ self.btn_coma.set_text_desc("punto y coma")
++ self.btn_punto.set_text(":")
++ self.btn_punto.set_text_desc("dos puntos")
++ self.btn_guion.set_text("_")
++ self.btn_guion.set_text_desc("guión bajo")
++ self.btn_A_tilde.set_text("á")
++ self.btn_A_tilde.set_text_desc("á tilde")
++ self.btn_E_tilde.set_text("é")
++ self.btn_E_tilde.set_text_desc("é tilde")
++ self.btn_I_tilde.set_text("í")
++ self.btn_I_tilde.set_text_desc("í tilde")
++ self.btn_O_tilde.set_text("ó")
++ self.btn_O_tilde.set_text_desc("ó tilde")
++ self.btn_U_tilde.set_text("ú")
++ self.btn_U_tilde.set_text_desc("ú tilde")
++ self.btn_U_puntos.set_text("ü")
++ self.btn_U_puntos.set_text_desc("u diéresis")
++ self.btn_abre_llave.set_text("{")
++ self.btn_abre_llave.set_text_desc("abro llave")
++ self.btn_cierra_llave.set_text("}")
++ self.btn_cierra_llave.set_text_desc("cierro llave")
++
++ self.MAYUSCULA = False
++ self.btn_CAPS_LOCK.set_text("MAYÚSCULA")
++ self.btn_CAPS_LOCK.set_text_desc("MAYÚSCULA")
++ else:
++ self.btn_do.set_text("º")
++ self.btn_do.set_text_desc("o superíndice")
++ self.btn_1.set_text("1")
++ self.btn_1.set_text_desc("1")
++ self.btn_2.set_text("2")
++ self.btn_2.set_text_desc("2")
++ self.btn_3.set_text("3")
++ self.btn_3.set_text_desc("3")
++ self.btn_4.set_text("4")
++ self.btn_4.set_text_desc("4")
++ self.btn_5.set_text("5")
++ self.btn_5.set_text_desc("5")
++ self.btn_6.set_text("6")
++ self.btn_6.set_text_desc("6")
++ self.btn_7.set_text("7")
++ self.btn_7.set_text_desc("7")
++ self.btn_8.set_text("8")
++ self.btn_8.set_text_desc("8")
++ self.btn_9.set_text("9")
++ self.btn_9.set_text_desc("9")
++ self.btn_0.set_text("0")
++ self.btn_0.set_text_desc("0")
++ self.btn_finPreg.set_text("'")
++ self.btn_finPreg.set_text_desc("comilla simple")
++ self.btn_inicioPreg.set_text("¡")
++ self.btn_inicioPreg.set_text_desc("abro exclamación")
++ self.btn_Q.set_text("Q")
++ self.btn_W.set_text("W")
++ self.btn_E.set_text("E")
++ self.btn_R.set_text("R")
++ self.btn_T.set_text("T")
++ self.btn_Y.set_text("Y")
++ self.btn_U.set_text("U")
++ self.btn_I.set_text("I")
++ self.btn_O.set_text("O")
++ self.btn_P.set_text("P")
++ self.btn_A.set_text("A")
++ self.btn_S.set_text("S")
++ self.btn_D.set_text("D")
++ self.btn_F.set_text("F")
++ self.btn_G.set_text("G")
++ self.btn_H.set_text("H")
++ self.btn_J.set_text("J")
++ self.btn_K.set_text("K")
++ self.btn_L.set_text("L")
++ self.btn_enie.set_text("Ñ")
++ self.btn_menor.set_text("<")
++ self.btn_menor.set_text_desc("menor")
++ self.btn_Z.set_text("Z")
++ self.btn_X.set_text("X")
++ self.btn_C.set_text("C")
++ self.btn_V.set_text("V")
++ self.btn_B.set_text("B")
++ self.btn_N.set_text("N")
++ self.btn_M.set_text("M")
++ self.btn_coma.set_text(",")
++ self.btn_coma.set_text_desc("coma")
++ self.btn_punto.set_text(".")
++ self.btn_punto.set_text_desc("punto")
++ self.btn_guion.set_text("-")
++ self.btn_guion.set_text_desc("guión")
++ self.btn_A_tilde.set_text("Á")
++ self.btn_A_tilde.set_text_desc("Á tilde")
++ self.btn_E_tilde.set_text("É")
++ self.btn_E_tilde.set_text_desc("É tilde")
++ self.btn_I_tilde.set_text("Í")
++ self.btn_I_tilde.set_text_desc("Í tilde")
++ self.btn_O_tilde.set_text("Ó")
++ self.btn_O_tilde.set_text_desc("Ó tilde")
++ self.btn_U_tilde.set_text("Ú")
++ self.btn_U_tilde.set_text_desc("Ú tilde")
++ self.btn_U_puntos.set_text("Ü")
++ self.btn_U_puntos.set_text_desc("u diéresis")
++ self.btn_abre_llave.set_text("[")
++ self.btn_abre_llave.set_text_desc("abro paréntesis recto")
++ self.btn_cierra_llave.set_text("]")
++ self.btn_cierra_llave.set_text_desc("abro paréntesis recto")
++
++
++ self.MAYUSCULA = True
++ self.btn_CAPS_LOCK.set_text("MINÚSCULA")
++ self.btn_CAPS_LOCK.set_text_desc("MINÚSCULA")
++ if (self.hablar_al == "ESCRIBIR"):
++ self.btn_actual = self.btn_CAPS_LOCK
++ self.hablar()
++
++########################################################################
++
++ def set_botonesXbarridoXfila(self, widget):
++ state = widget.get_active()
++ if state:
++ self.BOTONESxBARRIDOxFILA = True
++ self.grabar_barrido("SI")
++ self.BOTONESxBARRIDO = False #nuevo
++ self.botonesXbarridoXfila()
++ else:
++ if (self.BOTONESxBARRIDOxFILA):
++ self.BOTONESxBARRIDOxFILA = False
++ self.iluminarFila(self.fila_actual_nro, "white")
++ self.iluminarBoton(self.btn_actual, "white")
++ self.BOTONESxBARRIDO = False
++ self.grabar_barrido("NO")
++
++ def botonesXbarridoXfila(self):
++ gobject.timeout_add(self.seg, self.barrerFocusXfila1)
++
++ def barrerFocusXfila1(self, *arg):
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ self.fila_actual_nro = 1
++ self.fila_actual = self.fila_1
++ self.iluminarBoton(self.btn_actual, "white") #nuevo, sacarlo
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ self.iluminarFila(1, "Yellow")
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ if self.BOTONESxBARRIDOxFILA:
++ if (not self.fila_2 == []):
++ gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_BACK_SPACE,1, 2)
++ else:
++ gobject.timeout_add(self.seg, self.barrerFocusXfila1)
++
++ def barrer_el_boton(self, btn , fila_anterior, fila_a_seguir):
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++
++ self.fila_actual_nro = -1
++ self.fila_actual = None
++ self.btn_actual = btn
++ self.iluminarFila(fila_anterior, "white")
++
++ if (self.hablar_al == "BARRER"):
++ self.hablar()
++
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ self.iluminarBoton(self.btn_actual, "Yellow")
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ if self.BOTONESxBARRIDOxFILA:
++ if fila_a_seguir==1:
++ gobject.timeout_add(self.seg, self.barrerFocusXfila1)
++ if fila_a_seguir==2:
++ gobject.timeout_add(self.seg, self.barrerFocusXfila2)
++ if fila_a_seguir==3:
++ gobject.timeout_add(self.seg, self.barrerFocusXfila3)
++ if fila_a_seguir==4:
++ gobject.timeout_add(self.seg, self.barrerFocusXfila4)
++ if fila_a_seguir==5:
++ gobject.timeout_add(self.seg, self.barrerFocusXfila5)
++
++
++
++ def barrerFocusXfila2(self, *arg):
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ self.iluminarBoton(self.btn_actual, "white")
++ self.fila_actual_nro = 2
++ self.fila_actual = self.fila_2
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ self.iluminarFila(2, "Yellow")
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ if self.BOTONESxBARRIDOxFILA:
++ if (not self.fila_3 == []):
++ gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_BACK_SPACE,2, 3)
++ else:
++ gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_BACK_SPACE,2, 1)
++
++
++ def barrerFocusXfila3(self, *arg):
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ self.fila_actual_nro = 3
++ self.fila_actual = self.fila_3
++ self.iluminarBoton(self.btn_actual, "white")
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ self.iluminarFila(3, "Yellow")
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ if self.BOTONESxBARRIDOxFILA:
++ if (not self.fila_4 == []):
++ gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_BACK_SPACE, 3, 4)
++ else:
++ gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_BACK_SPACE, 3, 1)
++
++
++ def barrerFocusXfila4(self, *arg):
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ self.fila_actual_nro = 4
++ self.fila_actual = self.fila_4
++ self.iluminarBoton(self.btn_actual, "white")
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ self.iluminarFila(4, "Yellow")
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ if self.BOTONESxBARRIDOxFILA:
++ if (not self.fila_5 == []):
++ gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_BACK_SPACE, 4, 5)
++ else:
++ if (self.teclado_tipo=="LETRAS" or self.teclado_tipo=="COMPLETO"):
++ gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_SPACE, 4, 1)
++ else:
++ gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_BACK_SPACE, 4, 1)
++
++
++ def barrerFocusXfila5(self, *arg):
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ self.fila_actual_nro = 5
++ self.fila_actual = self.fila_5
++ self.iluminarBoton(self.btn_actual, "white")
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ self.iluminarFila(5, "Yellow")
++ if not self.BOTONESxBARRIDOxFILA:
++ return False
++ if self.BOTONESxBARRIDOxFILA:
++ gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_SPACE, 5, 1)
++
++
++ def iluminarFila(self, fila, color):
++ if fila == 1:
++ for f in range(0,len(self.fila_1)):
++ gobject.idle_add(self.pintarControl,self.fila_1[f], color)
++ if fila == 2:
++ for f in range(0,len(self.fila_2)):
++ gobject.idle_add(self.pintarControl,self.fila_2[f], color)
++ if fila == 3:
++ for f in range(0,len(self.fila_3)):
++ gobject.idle_add(self.pintarControl,self.fila_3[f], color)
++ if fila == 4:
++ for f in range(0,len(self.fila_4)):
++ gobject.idle_add(self.pintarControl,self.fila_4[f], color)
++ if fila == 5:
++ for f in range(0,len(self.fila_5)):
++ gobject.idle_add(self.pintarControl,self.fila_5[f], color)
++
++ def pintarControl(self, w, color):
++ if not w == None:
++ w.modify_bg( gtk.STATE_NORMAL, gtk.gdk.color_parse(color))
++
++ def mouse_boton(self, widget, event):
++ #evita repetición
++ self.bloquearHandler()
++
++ if self.BOTONESxBARRIDO:
++ self.BOTONESxBARRIDO=False
++ self.btn_actual.emit("pressed")
++ #voler a empezar...
++ self.iluminarBoton(self.btn_actual, "white")
++ self.BOTONESxBARRIDOxFILA = True
++ self.botonesXbarridoXfila()
++ return
++ if self.BOTONESxBARRIDOxFILA:
++ if self.fila_actual_nro==-1: #es un boton
++ self.btn_actual.emit("pressed")
++ self.iluminarBoton(self.btn_actual, "white") #nuevo
++ else:
++ self.BOTONESxBARRIDOxFILA = False;
++ self.iluminarFila(self.fila_actual_nro, "white")
++ self.BOTONESxBARRIDO = True;
++ self.botonesXbarridoEnFila()
++
++
++
++ def iluminarBoton(self, btn, color):
++ gobject.idle_add(self.pintarControl,btn, color)
++
++ def bloquearHandler(self):
++ self.hilo_bloquear = threading.Thread(target = self.bloquearHandler_aux_obj)
++ self.hilo_bloquear.start()
++ self.hilo_bloquear.quit = True
++
++ def bloquearHandler_aux_obj(self):
++ self.event_box.handler_block(self.ebc)
++ try:
++ seg=self.get_time_barrido_botones()
++ except:
++ seg = velocidades['media']
++
++ s = seg/1000
++ if self.BOTONESxBARRIDOxFILA:
++ if self.fila_actual_nro==-1: #es un boton
++ if seg == velocidades['rapida']:
++ s = s - 0.5
++ else:
++ s = s - 1
++ time.sleep(s)
++ self.event_box.handler_unblock(self.ebc)
++
++
++ def botonesXbarridoEnFila(self):
++ gobject.idle_add(self.barrerEnFila)
++
++ def barrerEnFila(self):
++ if self.BOTONESxBARRIDO:
++ i=0
++ gobject.timeout_add(self.seg, self.barrerEnFila_aux, i)
++
++ def barrerEnFila_aux(self, i):
++ if not self.BOTONESxBARRIDO:
++ return False
++ try:
++ self.btn_ant = self.fila_actual[i-1]
++ except:
++ return False
++ try:
++ self.btn_actual = self.fila_actual[i]
++ except:
++ self.BOTONESxBARRIDO = False
++ self.BOTONESxBARRIDOxFILA = True
++ self.botonesXbarridoXfila()
++ return False
++ if not self.BOTONESxBARRIDO:
++ return False
++ self.iluminarBoton(self.btn_ant, "white")
++ if not self.BOTONESxBARRIDO:
++ return False
++ self.iluminarBoton(self.btn_actual, "Yellow")
++
++ if (self.hablar_al == "BARRER"):
++ self.hablar()
++
++ if not self.BOTONESxBARRIDO:
++ return False
++ else:
++ gobject.timeout_add(self.seg, self.barrerEnFila_aux, i+1)
++
++
++ def combo_tiempos_botones(self):
++ cb = gtk.combo_box_new_text()
++ cb.append_text("RÁPIDO")
++ cb.append_text("MEDIO")
++ cb.append_text("LENTO")
++ seg = velocidades['media']
++ try:
++ seg = self.get_time_barrido_botones()
++ logging.debug('seg : ' + seg)
++ except:
++ logging.debug("ERROR al leer velocidad de barrido de botones")
++
++ if seg==velocidades['rapida']:
++ cb.set_active(0)
++ if seg==velocidades['media']:
++ cb.set_active(1)
++ if seg==velocidades['lenta']:
++ cb.set_active(2)
++
++ cb.connect("changed", self.on_changed_cbo_time_btn)
++ return cb
++
++
++ def combo_size_botones(self):
++ cb = gtk.combo_box_new_text()
++ cb.append_text("CHICO")
++ cb.append_text("MEDIANO")
++ cb.append_text("GRANDE")
++ size="CHICO"
++ try:
++ size = self.get_size_botones()
++ except:
++ logging.debug("ERROR, al leer size de botones")
++
++ if size=="CHICO":
++ cb.set_active(0)
++ if size=="MEDIANO":
++ cb.set_active(1)
++ if size=="GRANDE":
++ cb.set_active(2)
++
++ cb.connect("changed", self.on_changed_cbo_size_btn)
++ return cb
++
++ def combo_tipo_teclados(self):
++ cb = gtk.combo_box_new_text()
++ cb.append_text("COMPLETO")
++ cb.append_text("NUMÉRICO")
++ cb.append_text("LETRAS")
++ tipo="COMPLETO"
++ try:
++ tipo = self.get_tipo_teclado()
++ except:
++ logging.debug("ERROR, al leer tipo de teclado")
++
++ if tipo=="COMPLETO":
++ cb.set_active(0)
++ if tipo=="NUMERICO":
++ cb.set_active(1)
++ if tipo=="LETRAS":
++ cb.set_active(2)
++
++ cb.connect("changed", self.on_changed_cbo_tipo_teclados)
++ return cb
++
++ def on_changed_cbo_tipo_teclados(self, widget):
++ s = widget.get_active()
++
++ if s==0:
++ tipo = "COMPLETO"
++ if s==1:
++ tipo = "NUMERICO"
++ if s==2:
++ tipo = "LETRAS"
++
++ self.set_tipo_teclado(tipo)
++
++ self.hilo_type = threading.Thread(target = self.reset)
++ self.hilo_type.start()
++ self.hilo_type.quit = True
++
++ self.dialog_opciones.destroy()
++ self.close()
++
++
++ def on_changed_cbo_size_btn(self, widget):
++ s = widget.get_active()
++
++ if s==0:
++ size = "CHICO"
++ if s==1:
++ size = "MEDIANO"
++ if s==2:
++ size = "GRANDE"
++
++ self.set_size_botones(size)
++
++ self.hilo_size = threading.Thread(target = self.reset)
++ self.hilo_size.start()
++ self.hilo_size.quit = True
++
++ self.dialog_opciones.destroy()
++ self.close()
++
++
++ def on_changed_cbo_time_btn(self, widget):
++ s = widget.get_active()
++
++ if s==0:
++ seg = velocidades['rapida']
++ if s==1:
++ seg = velocidades['media']
++ if s==2:
++ seg = velocidades['lenta']
++
++ self.set_time_barrido_botones(seg)
++ self.seg=seg
++
++
++
++ def get_time_barrido_botones(self):
++ client = gconf.client_get_default()
++ return client.get_int("/desktop/sugar/virtualkeyboard/time")
++
++ def set_time_barrido_botones(self, seg):
++ client = gconf.client_get_default()
++ client.set_int("/desktop/sugar/virtualkeyboard/time", seg)
++
++ def get_size_botones(self):
++ client = gconf.client_get_default()
++ return client.get_string("/desktop/sugar/virtualkeyboard/size")
++
++ def set_size_botones(self, size):
++ client = gconf.client_get_default()
++ client.set_string("/desktop/sugar/virtualkeyboard/size", size)
++
++ def set_hablar(self, hablar):
++ client = gconf.client_get_default()
++ client.set_string("/desktop/sugar/virtualkeyboard/hablar", hablar)
++ self.hablar_al = hablar
++
++ def get_tipo_teclado(self):
++ client = gconf.client_get_default()
++ return client.get_string("/desktop/sugar/virtualkeyboard/tipo")
++
++ def set_tipo_teclado(self, tipo):
++ client = gconf.client_get_default()
++ client.set_string("/desktop/sugar/virtualkeyboard/tipo", tipo)
++
++ def leer_barrido(self):
++ client = gconf.client_get_default()
++ return client.get_string("/desktop/sugar/virtualkeyboard/barrido")
++
++
++ def grabar_barrido(self, barrido):
++ client = gconf.client_get_default()
++ client.set_string("/desktop/sugar/virtualkeyboard/barrido", barrido)
++
++ def get_opciones_hablar(self):
++ client = gconf.client_get_default()
++ return client.get_string("/desktop/sugar/virtualkeyboard/hablar")
++
++ def set_opciones_hablar(self, widget, data=None):
++ if (widget.get_active()):
++ self.set_hablar(data)
++
++ def inicilizar_config(self):
++ client = gconf.client_get_default()
++ if not client.dir_exists("/desktop/sugar/virtualkeyboard"):
++ self.set_time_barrido_botones(self.seg)
++ self.set_size_botones(self.size)
++ self.set_hablar(self.hablar_al)
++ self.set_tipo_teclado(self.teclado_tipo)
++ if self.BOTONESxBARRIDOxFILA:
++ self.grabar_barrido("SI")
++ else:
++ self.grabar_barrido("NO")
++
++ def new_button(self, icon, label, callbackstr):
++ btn = Boton(label)
++ btn.set_font_desc("sans 9")
++ btn.connect("pressed", callbackstr)
++ if (not icon == None):
++ btn.set_icon(icon)
++ return btn
++
++
++ def sizeBotones(self, desc):
++ for btn in self.losBotones:
++ btn.set_font_desc(desc)
++
++ def reset(self):
++ self.close()
++ Teclado()
++
++ def hablar(self):
++ self.hilo_hablar = threading.Thread(target=self.hablar_aux)
++ self.hilo_hablar.start()
++ self.hilo_hablar.quit=True
++
++ def hablar_aux(self):
++ texto = ""
++ v = ""
++ try:
++ texto = self.btn_actual.get_text_desc()
++ except:
++ return
++ if (not texto == ""):
++ try:
++ seg=self.get_time_barrido_botones()
++ except:
++ seg = velocidades['media']
++ if seg == velocidades['rapida']:
++ v = hablar['rapida']
++ if seg == velocidades['media']:
++ v = hablar['media']
++ if seg == velocidades['lenta']:
++ v = hablar['lenta']
++ self._mTeclado.hablar(texto, v)
++
++ def desplegar_opciones(self, *arg):
++ try:
++ if (self.dialog_opciones.get_property('visible')):
++ return
++ except:
++ pass
++
++ self.dialog_opciones = gtk.Dialog()
++ self.dialog_opciones.set_title("OPCIONES")
++ self.dialog_opciones.set_keep_above(True)
++
++ #opciones hablar
++ box_hablar = gtk.VBox(False, 10)
++ box_hablar.set_border_width(20)
++
++ button = gtk.RadioButton(None, "HABLAR AL BARRER BOTONES.")
++ button.connect("toggled", self.set_opciones_hablar, "BARRER")
++ if (self.get_opciones_hablar()=="BARRER"):
++ button.set_active(True)
++ box_hablar.pack_start(button, True, True, 0)
++ button = gtk.RadioButton(button, "HABLAR AL ESCRIBIR.")
++ button.connect("toggled", self.set_opciones_hablar, "ESCRIBIR")
++ if (self.get_opciones_hablar()=="ESCRIBIR"):
++ button.set_active(True)
++ box_hablar.pack_start(button, True, True, 0)
++ button = gtk.RadioButton(button, "NO HABLAR.")
++ button.connect("toggled", self.set_opciones_hablar, "NUNCA")
++ if (self.get_opciones_hablar()=="NUNCA"):
++ button.set_active(True)
++ box_hablar.pack_start(button, True, True, 0)
++ self.dialog_opciones.vbox.pack_start(box_hablar, True, True, 0)
++
++ separator_hablar = gtk.HSeparator()
++ self.dialog_opciones.vbox.pack_start(separator_hablar, expand=False)
++ separator_hablar.show()
++
++ #opciones de barrido
++ box_barrido = gtk.VBox(False, 10)
++ box_barrido.set_border_width(20)
++
++ lbl_op_botones = gtk.Label("Barrer:")
++ lbl_op_botones.show()
++ box_barrido.pack_start(lbl_op_botones, True, True, 0)
++
++ self.chk_activarBarrido_botones = gtk.CheckButton("_BOTONES")
++
++ barriendo= ""
++ try:
++ barriendo = self.leer_barrido()
++ except:
++ barriendo == "NO"
++ if barriendo == "SI":
++ self.BOTONESxBARRIDOxFILA = True
++ elif barriendo == "NO":
++ self.BOTONESxBARRIDOxFILA = False
++ else:
++ logging.error("Error al leer barrido." + str(barriendo))
++
++
++ self.chk_activarBarrido_botones.set_active(self.BOTONESxBARRIDOxFILA or self.BOTONESxBARRIDO)
++ self.chk_activarBarrido_botones.connect("toggled", self.set_botonesXbarridoXfila)
++ box_barrido.pack_start(self.chk_activarBarrido_botones, True, True, 0)
++
++ lbl_op_velocidad = gtk.Label("Velocidad:")
++ lbl_op_velocidad.show()
++ box_barrido.pack_start(lbl_op_velocidad, True, True, 0)
++
++ self.cbo_time_btn = self.combo_tiempos_botones()
++ box_barrido.pack_start(self.cbo_time_btn, True, True, 0)
++ self.dialog_opciones.vbox.pack_start(box_barrido, True, True, 0)
++
++ separator_barrido = gtk.HSeparator()
++ self.dialog_opciones.vbox.pack_start(separator_barrido, expand=False)
++ separator_barrido.show()
++
++ #opciones de tamaño
++ box_size = gtk.VBox(False, 10)
++ box_size.set_border_width(20)
++
++ lbl_op_size = gtk.Label("Tamaño:")
++ lbl_op_size.show()
++ box_size.pack_start(lbl_op_size, True, True, 0)
++
++ self.cbo_size_btn = self.combo_size_botones()
++ box_size.pack_start(self.cbo_size_btn, True, True, 0)
++ self.dialog_opciones.vbox.pack_start(box_size, True, True, 0)
++
++ separator_size = gtk.HSeparator()
++ self.dialog_opciones.vbox.pack_start(separator_size, expand=False)
++ separator_size.show()
++
++ #tipo
++ box_teclado = gtk.VBox(False, 10)
++ box_teclado.set_border_width(20)
++
++ lbl_op_tipo = gtk.Label("Tipo:")
++ lbl_op_tipo.show()
++ box_teclado.pack_start(lbl_op_tipo, True, True, 0)
++
++ self.cbo_tipo_teclado = self.combo_tipo_teclados()
++ box_teclado.pack_start(self.cbo_tipo_teclado, True, True, 0)
++ self.dialog_opciones.vbox.pack_start(box_teclado, True, True, 0)
++
++ separator_tipo = gtk.HSeparator()
++ self.dialog_opciones.vbox.pack_start(separator_tipo, expand=False)
++ separator_tipo.show()
++
++ self.dialog_opciones.show_all()
++
++
++
++ def set_opciones_hablar(self, widget, data=None):
++ if (widget.get_active()):
++ self.set_hablar(data)
++################################################################################################################
++ def mostrar_teclado_numerico(self):
++ child = gtk.VBox(False, 2)
++
++ self.fila_1 = []
++ self.fila_2 = []
++ self.fila_3 = []
++ self.fila_4 = []
++ self.fila_5 = []
++ self.losBotones = []
++
++ # defino botones
++ self.btn_BACK_SPACE = self.new_button_borrar()
++ self.losBotones.append(self.btn_BACK_SPACE)
++
++ self.btn_1 = self.new_button_escribir("1")
++ self.losBotones.append(self.btn_1)
++ self.fila_3.append(self.btn_1)
++
++ self.btn_2 = self.new_button_escribir("2")
++ self.losBotones.append(self.btn_2)
++ self.fila_3.append(self.btn_2)
++
++ self.btn_3 = self.new_button_escribir("3")
++ self.losBotones.append(self.btn_3)
++ self.fila_3.append(self.btn_3)
++
++ self.btn_4 = self.new_button_escribir("4")
++ self.losBotones.append(self.btn_4)
++ self.fila_2.append(self.btn_4)
++
++ self.btn_5 = self.new_button_escribir("5")
++ self.losBotones.append(self.btn_5)
++ self.fila_2.append(self.btn_5)
++
++ self.btn_6 = self.new_button_escribir("6")
++ self.losBotones.append(self.btn_6)
++ self.fila_2.append(self.btn_6)
++
++ self.btn_7 = self.new_button_escribir("7")
++ self.losBotones.append(self.btn_7)
++ self.fila_1.append(self.btn_7)
++
++ self.btn_8 = self.new_button_escribir("8")
++ self.losBotones.append(self.btn_8)
++ self.fila_1.append(self.btn_8)
++
++ self.btn_9 = self.new_button_escribir("9")
++ self.losBotones.append(self.btn_9)
++ self.fila_1.append(self.btn_9)
++
++ self.btn_0 = self.new_button_escribir("0")
++ self.losBotones.append(self.btn_0)
++ self.fila_4.append(self.btn_0)
++
++ self.btn_asterisco = self.new_button_escribir("*")
++ self.btn_asterisco.set_text_desc("por")
++ self.losBotones.append(self.btn_asterisco)
++ self.fila_3.append(self.btn_asterisco)
++
++ self.btn_barra = self.new_button_escribir("/")
++ self.btn_barra.set_text_desc("dividido")
++ self.losBotones.append(self.btn_barra)
++ self.fila_3.append(self.btn_barra)
++
++ self.btn_mas = self.new_button_escribir("+")
++ self.btn_mas.set_text_desc("más")
++ self.losBotones.append(self.btn_mas)
++ self.fila_2.append(self.btn_mas)
++
++ self.btn_punto = self.new_button_escribir(".")
++ self.btn_punto.set_text_desc("punto")
++ self.losBotones.append(self.btn_punto)
++ self.fila_4.append(self.btn_punto)
++
++ self.btn_guion = self.new_button_escribir("-")
++ self.btn_guion.set_text_desc("menos")
++ self.losBotones.append(self.btn_guion)
++ self.fila_2.append(self.btn_guion)
++
++ self.btn_ENTER = self.new_button_enter()
++ self.losBotones.append(self.btn_ENTER)
++ self.fila_4.append(self.btn_ENTER)
++
++ self.btn_opciones = self.new_button(gtk.STOCK_PREFERENCES, None ,self.desplegar_opciones)
++ self.btn_cambiar_tipo = self.new_button_cambiar_tipo("ABC")
++ self.fila_4.append(self.btn_cambiar_tipo)
++
++ table = gtk.Table(6, 11, True)
++
++ table.set_row_spacing(0, 3)
++ table.set_row_spacing(1, 3)
++ table.set_row_spacing(2, 3)
++ table.set_row_spacing(3, 3)
++ table.set_row_spacing(4, 3)
++ table.set_row_spacing(5, 3)
++
++ table.set_col_spacing(0, 3)
++ table.set_col_spacing(1, 3)
++ table.set_col_spacing(2, 3)
++ table.set_col_spacing(3, 3)
++ table.set_col_spacing(4, 3)
++ table.set_col_spacing(5, 15)
++ table.set_col_spacing(6, 3)
++ table.set_col_spacing(7, 3)
++ table.set_col_spacing(8, 3)
++ table.set_col_spacing(9, 3)
++ table.set_col_spacing(10, 15)
++
++ table.attach(self.btn_7, 0, 2, 0, 2)
++ table.attach(self.btn_8, 2, 4, 0, 2)
++ table.attach(self.btn_9, 4, 6, 0, 2)
++ table.attach(self.btn_BACK_SPACE, 6, 10, 0, 2)
++
++ table.attach(self.btn_4, 0, 2, 2, 4)
++ table.attach(self.btn_5, 2, 4, 2, 4)
++ table.attach(self.btn_6, 4, 6, 2, 4)
++ table.attach(self.btn_mas, 6, 8, 2, 4)
++ table.attach(self.btn_guion, 8, 10, 2, 4)
++
++ table.attach(self.btn_1, 0, 2, 4, 6)
++ table.attach(self.btn_2, 2, 4, 4, 6)
++ table.attach(self.btn_3, 4, 6, 4, 6)
++ table.attach(self.btn_asterisco, 6, 8, 4, 6)
++ table.attach(self.btn_barra, 8, 10, 4, 6)
++
++ table.attach(self.btn_0, 0, 2, 6, 8)
++ table.attach(self.btn_punto, 2, 4, 6, 8)
++ table.attach(self.btn_ENTER, 6, 10, 6, 8)
++
++ table.attach(self.btn_opciones, 10, 11, 6, 7)
++ table.attach(self.btn_cambiar_tipo, 10, 11, 7, 8)
++
++
++ child.pack_end(table, True, True, 0)
++
++ return child
++
++ def posicionar_dialog(self, dialog):
++ dialog.set_gravity(gtk.gdk.GRAVITY_SOUTH_EAST)
++ width, height = dialog.get_size()
++ dialog.move(gtk.gdk.screen_width() - width, gtk.gdk.screen_height() - height)
++
++ def mostrar_teclado_letras(self):
++ self.fila_1 = []
++ self.fila_2 = []
++ self.fila_3 = []
++ self.fila_4 = []
++ self.fila_5 = []
++ self.losBotones = []
++
++ child = gtk.VBox(False, 2)
++
++ # defino botones
++ self.btn_BACK_SPACE = self.new_button_borrar()
++ self.losBotones.append(self.btn_BACK_SPACE)
++
++ self.btn_SPACE = self.new_button_espacio()
++ self.losBotones.append(self.btn_SPACE)
++
++ self.btn_ENTER = self.new_button_enter()
++ self.losBotones.append(self.btn_ENTER)
++ self.fila_2.append(self.btn_ENTER)
++
++ self.btn_Q = self.new_button_escribir("Q")
++ self.losBotones.append(self.btn_Q)
++ self.fila_1.append(self.btn_Q)
++
++ self.btn_W = self.new_button_escribir("W")
++ self.losBotones.append(self.btn_W)
++ self.fila_1.append(self.btn_W)
++
++ self.btn_E = self.new_button_escribir("E")
++ self.losBotones.append(self.btn_E)
++ self.fila_1.append(self.btn_E)
++
++ self.btn_R = self.new_button_escribir("R")
++ self.losBotones.append(self.btn_R)
++ self.fila_1.append(self.btn_R)
++
++ self.btn_T = self.new_button_escribir("T")
++ self.losBotones.append(self.btn_T)
++ self.fila_1.append(self.btn_T)
++
++ self.btn_Y = self.new_button_escribir("Y")
++ self.losBotones.append(self.btn_Y)
++ self.fila_1.append(self.btn_Y)
++
++ self.btn_U = self.new_button_escribir("U")
++ self.losBotones.append(self.btn_U)
++ self.fila_1.append(self.btn_U)
++
++ self.btn_I = self.new_button_escribir("I")
++ self.losBotones.append(self.btn_I)
++ self.fila_1.append(self.btn_I)
++
++ self.btn_O = self.new_button_escribir("O")
++ self.losBotones.append(self.btn_O)
++ self.fila_1.append(self.btn_O)
++
++ self.btn_P = self.new_button_escribir("P")
++ self.losBotones.append(self.btn_P)
++ self.fila_1.append(self.btn_P)
++
++ self.btn_A = self.new_button_escribir("A")
++ self.losBotones.append(self.btn_A)
++ self.fila_2.append(self.btn_A)
++
++ self.btn_S = self.new_button_escribir("S")
++ self.losBotones.append(self.btn_S)
++ self.fila_2.append(self.btn_S)
++
++ self.btn_D = self.new_button_escribir("D")
++ self.losBotones.append(self.btn_D)
++ self.fila_2.append(self.btn_D)
++
++ self.btn_F = self.new_button_escribir("F")
++ self.losBotones.append(self.btn_F)
++ self.fila_2.append(self.btn_F)
++
++ self.btn_G = self.new_button_escribir("G")
++ self.losBotones.append(self.btn_G)
++ self.fila_2.append(self.btn_G)
++
++ self.btn_H = self.new_button_escribir("H")
++ self.losBotones.append(self.btn_H)
++ self.fila_2.append(self.btn_H)
++
++ self.btn_J = self.new_button_escribir("J")
++ self.losBotones.append(self.btn_J)
++ self.fila_2.append(self.btn_J)
++
++ self.btn_K = self.new_button_escribir("K")
++ self.losBotones.append(self.btn_K)
++ self.fila_2.append(self.btn_K)
++
++ self.btn_L = self.new_button_escribir("L")
++ self.losBotones.append(self.btn_L)
++ self.fila_2.append(self.btn_L)
++
++ self.btn_enie = self.new_button_escribir("Ñ")
++ self.losBotones.append(self.btn_enie)
++ self.fila_2.append(self.btn_enie)
++
++ self.btn_Z = self.new_button_escribir("Z")
++ self.losBotones.append(self.btn_Z)
++ self.fila_3.append(self.btn_Z)
++
++ self.btn_X = self.new_button_escribir("X")
++ self.losBotones.append(self.btn_X)
++ self.fila_3.append(self.btn_X)
++
++ self.btn_C = self.new_button_escribir("C")
++ self.losBotones.append(self.btn_C)
++ self.fila_3.append(self.btn_C)
++
++ self.btn_V = self.new_button_escribir("V")
++ self.losBotones.append(self.btn_V)
++ self.fila_3.append(self.btn_V)
++
++ self.btn_B = self.new_button_escribir("B")
++ self.losBotones.append(self.btn_B)
++ self.fila_3.append(self.btn_B)
++
++ self.btn_N = self.new_button_escribir("N")
++ self.losBotones.append(self.btn_N)
++ self.fila_3.append(self.btn_N)
++
++ self.btn_M = self.new_button_escribir("M")
++ self.losBotones.append(self.btn_M)
++ self.fila_3.append(self.btn_M)
++
++ self.btn_A_tilde = self.new_button_escribir("Á")
++ self.btn_A_tilde.set_text_desc("Á tilde")
++ self.losBotones.append(self.btn_A_tilde)
++ self.fila_4.append(self.btn_A_tilde)
++
++ self.btn_E_tilde = self.new_button_escribir("É")
++ self.btn_E_tilde.set_text_desc("É tilde")
++ self.losBotones.append(self.btn_E_tilde)
++ self.fila_4.append(self.btn_E_tilde)
++
++ self.btn_I_tilde = self.new_button_escribir("Í")
++ self.btn_I_tilde.set_text_desc("Í tilde")
++ self.losBotones.append(self.btn_I_tilde)
++ self.fila_4.append(self.btn_I_tilde)
++
++ self.btn_O_tilde = self.new_button_escribir("Ó")
++ self.btn_O_tilde.set_text_desc("Ó tilde")
++ self.losBotones.append(self.btn_O_tilde)
++ self.fila_4.append(self.btn_O_tilde)
++
++ self.btn_U_tilde = self.new_button_escribir("Ú")
++ self.btn_U_tilde.set_text_desc("Ú tilde")
++ self.losBotones.append(self.btn_U_tilde)
++ self.fila_4.append(self.btn_U_tilde)
++
++ self.btn_opciones = self.new_button(gtk.STOCK_PREFERENCES, " ", self.desplegar_opciones)
++ self.btn_cambiar_tipo = self.new_button_cambiar_tipo("123")
++ self.fila_4.append(self.btn_cambiar_tipo)
++
++ #dibujo tabla
++ table = gtk.Table(7, 13, True)
++
++ table.set_row_spacing(0, 3)
++ table.set_row_spacing(1, 3)
++ table.set_row_spacing(2, 13)
++ table.set_row_spacing(3, 10)
++ table.set_row_spacing(4, 3)
++ table.set_row_spacing(5, 3)
++ table.set_row_spacing(6, 3)
++
++ table.set_col_spacing(0, 3)
++ table.set_col_spacing(1, 3)
++ table.set_col_spacing(2, 3)
++ table.set_col_spacing(3, 3)
++ table.set_col_spacing(4, 3)
++ table.set_col_spacing(5, 3)
++ table.set_col_spacing(6, 3)
++ table.set_col_spacing(7, 3)
++ table.set_col_spacing(8, 3)
++ table.set_col_spacing(9, 3)
++ table.set_col_spacing(10, 3)
++ table.set_col_spacing(11, 13)
++ table.set_col_spacing(12, 3)
++
++
++ table.attach(self.btn_Q, 0, 1, 0, 1)
++ table.attach(self.btn_W, 1, 2, 0, 1)
++ table.attach(self.btn_E, 2, 3, 0, 1)
++ table.attach(self.btn_R, 3, 4, 0, 1)
++ table.attach(self.btn_T, 4, 5, 0, 1)
++ table.attach(self.btn_Y, 5, 6, 0, 1)
++ table.attach(self.btn_U, 6, 7, 0, 1)
++ table.attach(self.btn_I, 7, 8, 0, 1)
++ table.attach(self.btn_O, 8, 9, 0, 1)
++ table.attach(self.btn_P, 9, 10, 0, 1)
++ table.attach(self.btn_A, 0, 1, 1, 2)
++ table.attach(self.btn_S, 1, 2, 1, 2)
++ table.attach(self.btn_D, 2, 3, 1, 2)
++ table.attach(self.btn_F, 3, 4, 1, 2)
++ table.attach(self.btn_G, 4, 5, 1, 2)
++ table.attach(self.btn_H, 5, 6, 1, 2)
++ table.attach(self.btn_J, 6, 7, 1, 2)
++ table.attach(self.btn_K, 7, 8, 1, 2)
++ table.attach(self.btn_L, 8, 9, 1, 2)
++ table.attach(self.btn_Z, 0, 1, 2, 3)
++ table.attach(self.btn_X, 1, 2, 2, 3)
++ table.attach(self.btn_C, 2, 3, 2, 3)
++ table.attach(self.btn_V, 3, 4, 2, 3)
++ table.attach(self.btn_B, 4, 5, 2, 3)
++ table.attach(self.btn_N, 5, 6, 2, 3)
++ table.attach(self.btn_M, 6, 7, 2, 3)
++
++ table.attach(self.btn_BACK_SPACE, 10, 13, 0, 1)
++ table.attach(self.btn_ENTER, 10, 13, 1, 2)
++ table.attach(self.btn_SPACE, 1, 9, 4, 5)
++ table.attach(self.btn_opciones, 12, 13, 4, 5)
++ table.attach(self.btn_cambiar_tipo, 12, 13, 3, 4)
++
++
++ table.attach(self.btn_A_tilde, 1, 2, 3, 4)
++ table.attach(self.btn_E_tilde, 2, 3, 3, 4)
++ table.attach(self.btn_I_tilde, 3, 4, 3, 4)
++ table.attach(self.btn_O_tilde, 4, 5, 3, 4)
++ table.attach(self.btn_U_tilde, 5, 6, 3, 4)
++
++ child.pack_end(table, True, True, 0)
++
++ return child
++
++ def get_size_dialog(self, size, teclado_tipo):
++ if teclado_tipo == "COMPLETO":
++ if size == "CHICO":
++ return 700, 335
++ if size == "MEDIANO":
++ return 1000, 400
++ if size == "GRANDE":
++ return 1200, 475
++
++ if teclado_tipo == "NUMERICO":
++ if size == "CHICO":
++ return 700, 400
++ if size == "MEDIANO":
++ return 900, 400
++ if size == "GRANDE":
++ return 1200, 500
++
++ if teclado_tipo == "LETRAS":
++ if size == "CHICO":
++ return 830, 290
++ if size == "MEDIANO":
++ return 1000, 330
++ if size == "GRANDE":
++ return 1200, 550
++
++ def get_font_desc(self, size, teclado_tipo):
++ if teclado_tipo == "COMPLETO":
++ if size == "CHICO":
++ return "sans 7"
++ if size == "MEDIANO":
++ return "sans bold 13"
++ if size == "GRANDE":
++ return "sans bold 15"
++
++ if teclado_tipo == "NUMERICO":
++ if size == "CHICO":
++ return "sans bold 7"
++ if size == "MEDIANO":
++ return "sans bold 13"
++ if size == "GRANDE":
++ return "sans bold 28"
++
++ if teclado_tipo == "LETRAS":
++ if size == "CHICO":
++ return "sans 7"
++ if size == "MEDIANO":
++ return "sans bold 13"
++ if size == "GRANDE":
++ return "sans bold 26"
++
++ def cambiar_tipo(self, w):
++
++ if (self.teclado_tipo=="NUMERICO"):
++ tipo = "LETRAS"
++ else:
++ tipo = "NUMERICO"
++
++ self.set_tipo_teclado(tipo)
++
++ self.hilo_type = threading.Thread(target = self.reset)
++ self.hilo_type.start()
++ self.hilo_type.quit = True
++
++ self.close()
++
++class Boton(gtk.Button):
++ font_desc = ''
++ font_color = ''
++ fondo_color = ''
++ text = ''
++ text_desc = ''
++
++ def __init__(self, nom=None):
++ gtk.Button.__init__(self)
++
++ self.hbox = gtk.HBox(False, 0)
++ self.add(self.hbox)
++
++ self.label = gtk.Label()
++ self.set_text(nom)
++
++ self.set_text(nom)
++ self.set_text_desc(nom)
++ self.set_font_desc('sans bold 13')
++ self.set_font_color('black')
++ self.set_fondo_color('white')
++
++ self.label.set_use_underline(True)
++ self.hbox.add(self.label)
++
++ def set_font_desc(self, pfont_desc):
++ self.font_desc = pfont_desc
++ self.label.modify_font(pango.FontDescription(pfont_desc))
++
++ def set_font_color(self, pfont_color):
++ self.font_color = pfont_color
++ self.label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse(pfont_color))
++
++ def set_fondo_color(self, pfondo_color):
++ self.fondo_color = pfondo_color
++ self.modify_bg( gtk.STATE_NORMAL, gtk.gdk.color_parse(pfondo_color))
++
++ def set_text(self, ptext):
++ if (not ptext == None):
++ self.text = ptext
++ self.label.set_text(self.text)
++
++ def get_font_desc(self):
++ return self.font_desc
++
++ def get_font_color(self):
++ return self.font_color
++
++ def get_fondo_color(self):
++ return self.fondo_color
++
++ def get_text(self):
++ return self.text
++
++ def is_visible(self):
++ self.get_property('visible')
++
++ def get_text_desc(self):
++ return self.text_desc
++
++ def set_text_desc(self, ptext_desc):
++ self.text_desc = ptext_desc
++
++ def set_icon(self, icon):
++ #http://www.pygtk.org/docs/pygtk/gtk-stock-items.html
++ s = gtk.Style()
++ icon = s.lookup_icon_set(icon).render_icon(s, gtk.TEXT_DIR_LTR, gtk.STATE_NORMAL, gtk.ICON_SIZE_BUTTON, self.hbox, None)
++ img = gtk.Image()
++ img.set_from_pixbuf(icon)
++ self.hbox.add(img)
diff --git a/rpms/sugar/accessibility_0007_cp_translations.patch b/rpms/sugar/accessibility_0007_cp_translations.patch
new file mode 100644
index 0000000..dc35af5
--- /dev/null
+++ b/rpms/sugar/accessibility_0007_cp_translations.patch
@@ -0,0 +1,78 @@
+diff -u -r -N sugar-0.88.1.original/po/es.po sugar-0.88.1/po/es.po
+--- sugar-0.88.1.original/po/es.po 2010-07-27 12:53:07.539504007 -0300
++++ sugar-0.88.1/po/es.po 2010-07-27 14:38:32.631752867 -0300
+@@ -1275,6 +1275,74 @@
+ msgid "View source: %r"
+ msgstr "Ver código fuente: %r"
+
++#: ../extensions/cpsection/accessibility/__init__.py:24
++msgid "Accessibility"
++msgstr "Accesibilidad"
++
++#: ../extensions/cpsection/accessibility/view.py:77
++msgid "Mouse Keys"
++msgstr "Teclas del ratón"
++
++#: ../extensions/cpsection/accessibility/view.py:84
++msgid "Move the mouse pointer with keyboard number."
++msgstr "Mover el puntero del ratón con un teclado numérico o con las teclas de juego."
++
++#: ../extensions/cpsection/accessibility/view.py:90
++msgid "Sticky Keys"
++msgstr "Teclas pegajosas"
++
++#: ../extensions/cpsection/accessibility/view.py:97
++msgid "Instead of having to press two keys at once (such as CTRL + Q), you can press one key at a time."
++msgstr "En lugar de tener que pulsar dos teclas a la vez (por ejemplo, CTRL + Q), permite pulsar una tecla a la vez."
++
++#: ../extensions/cpsection/accessibility/view.py:104
++msgid "Bounce Keys"
++msgstr "Teclas de rebote"
++
++#: ../extensions/cpsection/accessibility/view.py:111
++msgid "Ignore rapid, repeated keypresses of the same key."
++msgstr "Ignora la presión rápida y repetida de una tecla."
++
++#: ../extensions/cpsection/accessibility/view.py:89
++msgid "Screen"
++msgstr "Pantalla"
++
++#: ../extensions/cpsection/accessibility/view.py:176
++msgid "Contrast"
++msgstr "Contraste"
++
++#: ../extensions/cpsection/accessibility/view.py:188
++msgid "Enables the color contrast of the graphic interface."
++msgstr "Habilita el contraste de colores en la interfaz gráfica."
++
++#: ../extensions/cpsection/accessibility/view.py:108
++msgid "Mouse"
++msgstr "Ratón"
++
++#: ../extensions/cpsection/accessibility/view.py:227
++msgid "White Mouse"
++msgstr "Ratón blanco"
++
++#: ../extensions/cpsection/accessibility/view.py:239
++msgid "Show the mouse cursor white."
++msgstr "Mostrar el puntero del ratón blanco."
++
++#: ../extensions/cpsection/accessibility/view.py:247
++msgid "Acceleration: "
++msgstr "Aceleración: "
++
++#: ../extensions/cpsection/accessibility/view.py:263
++msgid "Controller acceleration mouse."
++msgstr "Controla la aceleración del ratón."
++
++#: ../extensions/cpsection/accessibility/view.py:241
++msgid "Capital letters"
++msgstr "Letras mayúsculas"
++
++#: ../extensions/cpsection/accessibility/view.py:253
++msgid "Shows capital letters in the user interface."
++msgstr "Muestra las letras en mayúsculas en la interfaz gráfica."
++
+ #~ msgid "Cannot obtain data needed for registration."
+ #~ msgstr "No se puede obtener datos necesarios para el registro"
+
diff --git a/rpms/sugar/backup-0004-es-translations.patch b/rpms/sugar/backup-0004-es-translations.patch
deleted file mode 100644
index 541032b..0000000
--- a/rpms/sugar/backup-0004-es-translations.patch
+++ /dev/null
@@ -1,1559 +0,0 @@
-From 0604fea518d6f5fe8280dad1452acec2b92258b4 Mon Sep 17 00:00:00 2001
-From: Martin Abente <mabente@paraguayeduca.org>
-Date: Wed, 30 Jun 2010 14:01:27 -0400
-Subject: [PATCH] Backup and Restore translations
-Organization: Paraguay Educa
-
----
- po/POTFILES.in | 3 +-
- po/es.po | 786 ++++++++++++++++++++++++++++++++++++--------------------
- 2 files changed, 512 insertions(+), 277 deletions(-)
-
-diff --git a/po/POTFILES.in b/po/POTFILES.in
-index e9a7f1c..a7dc31e 100644
---- a/po/POTFILES.in
-+++ b/po/POTFILES.in
-@@ -57,10 +57,11 @@ src/jarabe/journal/misc.py
- src/jarabe/journal/modalalert.py
- src/jarabe/journal/objectchooser.py
- src/jarabe/journal/palettes.py
-+src/jarabe/journal/processdialog.py
- src/jarabe/journal/volumestoolbar.py
-+src/jarabe/model/processmanagement.py
- src/jarabe/view/buddymenu.py
- src/jarabe/view/keyhandler.py
- src/jarabe/view/launcher.py
- src/jarabe/view/palettes.py
- src/jarabe/view/viewsource.py
--
-diff --git a/po/es.po b/po/es.po
-index 587608f..84a5a52 100644
---- a/po/es.po
-+++ b/po/es.po
-@@ -6,14 +6,14 @@ msgid ""
- msgstr ""
- "Project-Id-Version: olpc-sugar\n"
- "Report-Msgid-Bugs-To: \n"
--"POT-Creation-Date: 2009-09-05 00:31-0400\n"
-+"POT-Creation-Date: 2010-06-30 13:58-0400\n"
- "PO-Revision-Date: 2010-01-18 19:18+0200\n"
- "Last-Translator: Chris <cjl@laptop.org>\n"
- "Language-Team: Fedora Spanish <fedora-trans-es@redhat.com>\n"
--"Language: es\n"
- "MIME-Version: 1.0\n"
- "Content-Type: text/plain; charset=UTF-8\n"
- "Content-Transfer-Encoding: 8bit\n"
-+"Language: es\n"
- "Plural-Forms: nplurals=2; plural=(n != 1);\n"
- "X-Generator: Pootle 2.0.1\n"
- "X-Poedit-Language: Spanish\n"
-@@ -56,7 +56,7 @@ msgstr "Error en modificadores de color especificados."
- msgid "Error in specified colors."
- msgstr "Error en colores especificados."
-
--#: ../extensions/cpsection/aboutme/view.py:94 ../src/jarabe/intro/window.py:92
-+#: ../extensions/cpsection/aboutme/view.py:94 ../src/jarabe/intro/window.py:93
- msgid "Name:"
- msgstr "Nombre:"
-
-@@ -129,7 +129,7 @@ msgstr "Fecha y hora"
- msgid "Error timezone does not exist."
- msgstr "Error, zona horaria no existe."
-
--#: ../extensions/cpsection/datetime/view.py:68 ../data/sugar.schemas.in.h:27
-+#: ../extensions/cpsection/datetime/view.py:68 ../data/sugar.schemas.in.h:47
- msgid "Timezone"
- msgstr "Zona horaria"
-
-@@ -172,15 +172,15 @@ msgstr "Borde"
- msgid "Keyboard"
- msgstr "Teclado"
-
--#: ../extensions/cpsection/keyboard/view.py:187
-+#: ../extensions/cpsection/keyboard/view.py:189
- msgid "Keyboard Model"
- msgstr "Modelo de teclado"
-
--#: ../extensions/cpsection/keyboard/view.py:243
-+#: ../extensions/cpsection/keyboard/view.py:248
- msgid "Key(s) to change layout"
- msgstr "Tecla(s) para cambiar el diseño"
-
--#: ../extensions/cpsection/keyboard/view.py:311
-+#: ../extensions/cpsection/keyboard/view.py:318
- msgid "Keyboard Layout(s)"
- msgstr "Diseño(s) de teclado"
-
-@@ -212,6 +212,43 @@ msgstr ""
- "Añade idiomas en el orden que prefieres. Si una traducción no se encuentra "
- "disponible, se usará la siguiente en la lista."
-
-+#: ../extensions/cpsection/modemconfiguration/__init__.py:21
-+msgid "Modem Configuration"
-+msgstr "Configuración del Modem"
-+
-+#: ../extensions/cpsection/modemconfiguration/view.py:91
-+#, fuzzy
-+msgid "Username:"
-+msgstr "Nombre de usuario"
-+
-+#: ../extensions/cpsection/modemconfiguration/view.py:102
-+msgid "Password:"
-+msgstr "Contraseña:"
-+
-+#: ../extensions/cpsection/modemconfiguration/view.py:113
-+#, fuzzy
-+msgid "Number:"
-+msgstr "Número:"
-+
-+#: ../extensions/cpsection/modemconfiguration/view.py:124
-+msgid "Access Point Name (APN):"
-+msgstr "Punto de Acceso (APN):"
-+
-+#: ../extensions/cpsection/modemconfiguration/view.py:135
-+msgid "Personal Identity Number (PIN):"
-+msgstr "Número de Identificación Personal (PIN):"
-+
-+#: ../extensions/cpsection/modemconfiguration/view.py:146
-+msgid "Personal Unblocking Key (PUK):"
-+msgstr "Llave de Desbloqueo Personal (PUK):"
-+
-+#: ../extensions/cpsection/modemconfiguration/view.py:167
-+msgid ""
-+"You will need to provide the following information to set up a mobile "
-+"broadband connection to a cellular (3G) network."
-+msgstr "Será necesario proveer la siguiente información a fin de utilizar "
-+"el dispositivo celular (3G)."
-+
- #: ../extensions/cpsection/network/__init__.py:21
- #: ../extensions/cpsection/network/view.py:28
- msgid "Network"
-@@ -270,11 +307,11 @@ msgstr "Servidor:"
- msgid "Power"
- msgstr "Energía"
-
--#: ../extensions/cpsection/power/model.py:54
-+#: ../extensions/cpsection/power/model.py:85
- msgid "Error in automatic pm argument, use on/off."
- msgstr "Error en argumento automático de pm, use on/off."
-
--#: ../extensions/cpsection/power/model.py:81
-+#: ../extensions/cpsection/power/model.py:112
- msgid "Error in extreme pm argument, use on/off."
- msgstr "Error en argumento extremo de pm, use on/off."
-
-@@ -298,7 +335,7 @@ msgstr ""
- msgid "Software update"
- msgstr "Actualización de Software"
-
--#: ../extensions/cpsection/updater/view.py:62
-+#: ../extensions/cpsection/updater/view.py:63
- msgid ""
- "Software updates correct errors, eliminate security vulnerabilities, and "
- "provide new features."
-@@ -306,79 +343,79 @@ msgstr ""
- "Las actualizaciones de software corrigen errores, eliminan vulnerabilidades "
- "de seguridad y proveen nuevas características."
-
--#: ../extensions/cpsection/updater/view.py:122
-+#: ../extensions/cpsection/updater/view.py:125
- #, python-format
- msgid "Checking %s..."
- msgstr "Probando %s..."
-
--#: ../extensions/cpsection/updater/view.py:124
-+#: ../extensions/cpsection/updater/view.py:127
- #, python-format
- msgid "Downloading %s..."
- msgstr "Descargando %s..."
-
--#: ../extensions/cpsection/updater/view.py:126
-+#: ../extensions/cpsection/updater/view.py:129
- #, python-format
- msgid "Updating %s..."
- msgstr "Actualizando %s..."
-
--#: ../extensions/cpsection/updater/view.py:135
-+#: ../extensions/cpsection/updater/view.py:139
- msgid "Your software is up-to-date"
- msgstr "Tu software esta actualizado"
-
--#: ../extensions/cpsection/updater/view.py:137
-+#: ../extensions/cpsection/updater/view.py:141
- #, python-format
- msgid "You can install %s update"
- msgid_plural "You can install %s updates"
- msgstr[0] "Puedes instalar %s actualización"
- msgstr[1] "Puedes instalar %s actualizaciones"
-
--#: ../extensions/cpsection/updater/view.py:155
-+#: ../extensions/cpsection/updater/view.py:159
- msgid "Checking for updates..."
- msgstr "Buscando actualizaciones..."
-
--#: ../extensions/cpsection/updater/view.py:160
-+#: ../extensions/cpsection/updater/view.py:164
- msgid "Installing updates..."
- msgstr "Instalando actualizaciones..."
-
--#: ../extensions/cpsection/updater/view.py:165
-+#: ../extensions/cpsection/updater/view.py:172
- #, python-format
- msgid "%s update was installed"
- msgid_plural "%s updates were installed"
- msgstr[0] "%s actualización fue instalada"
- msgstr[1] "%s actualizaciones fueron instaladas"
-
--#: ../extensions/cpsection/updater/view.py:244
-+#: ../extensions/cpsection/updater/view.py:253
- msgid "Install selected"
- msgstr "Instalación seleccionada"
-
--#: ../extensions/cpsection/updater/view.py:265
-+#: ../extensions/cpsection/updater/view.py:274
- #, python-format
- msgid "Download size: %s"
- msgstr "Tamaño de descarga: %s"
-
--#: ../extensions/cpsection/updater/view.py:353
-+#: ../extensions/cpsection/updater/view.py:362
- #, python-format
- msgid "From version %(current)d to %(new)s (Size: %(size)s)"
- msgstr "Desde la version %(current)d hacia %(new)s (Size: %(size)s)"
-
- #. TRANS: download size is 0
--#: ../extensions/cpsection/updater/view.py:373
-+#: ../extensions/cpsection/updater/view.py:382
- msgid "None"
- msgstr "Ninguno"
-
- #. TRANS: download size of very small updates
--#: ../extensions/cpsection/updater/view.py:376
-+#: ../extensions/cpsection/updater/view.py:385
- msgid "1 KB"
- msgstr "1 KB"
-
- #. TRANS: download size of small updates, e.g. '250 KB'
--#: ../extensions/cpsection/updater/view.py:379
-+#: ../extensions/cpsection/updater/view.py:388
- #, python-format
- msgid "%.0f KB"
- msgstr "%.0f KB"
-
- #. TRANS: download size of updates, e.g. '2.3 MB'
--#: ../extensions/cpsection/updater/view.py:382
-+#: ../extensions/cpsection/updater/view.py:391
- #, python-format
- msgid "%.1f MB"
- msgstr "%.1f MB"
-@@ -408,7 +445,7 @@ msgstr "Quedan %(hour)d:%(min).2d"
- msgid "Charged"
- msgstr "Cargada"
-
--#: ../extensions/deviceicon/network.py:44
-+#: ../extensions/deviceicon/network.py:49
- #, python-format
- msgid "IP address: %s"
- msgstr "Direccion IP: %s"
-@@ -417,43 +454,102 @@ msgstr "Direccion IP: %s"
- # priority over the normal wireless device. NM doesn't have a "disconnect"
- # method for a device either (for various reasons) so this doesn't
- # have a good mapping
--#: ../extensions/deviceicon/network.py:110
-+#: ../extensions/deviceicon/network.py:112
- msgid "Disconnect..."
- msgstr "Desconectando..."
-
--#: ../extensions/deviceicon/network.py:114
-+#: ../extensions/deviceicon/network.py:117
- msgid "Create new wireless network"
- msgstr "Crear nueva red inalámbrica"
-
--#: ../extensions/deviceicon/network.py:120
--#: ../src/jarabe/desktop/meshbox.py:264
-+#: ../extensions/deviceicon/network.py:123
-+#: ../extensions/deviceicon/network.py:285
-+#: ../src/jarabe/desktop/meshbox.py:247 ../src/jarabe/desktop/meshbox.py:536
- msgid "Connecting..."
- msgstr "Conectando..."
-
- # TODO: show the channel number
--#: ../extensions/deviceicon/network.py:124
--#: ../extensions/deviceicon/network.py:186
--#: ../src/jarabe/desktop/meshbox.py:270
-+#: ../extensions/deviceicon/network.py:127
-+#: ../extensions/deviceicon/network.py:199
-+#: ../extensions/deviceicon/network.py:289
-+#: ../src/jarabe/desktop/meshbox.py:253 ../src/jarabe/desktop/meshbox.py:542
- msgid "Connected"
- msgstr "Conectado"
-
--#: ../extensions/deviceicon/network.py:146
-+#: ../extensions/deviceicon/network.py:159
- msgid "Channel"
- msgstr "Canal"
-
--#: ../extensions/deviceicon/network.py:161
-+#: ../extensions/deviceicon/network.py:174
- msgid "Wired Network"
- msgstr "Red Cableada"
-
--#: ../extensions/deviceicon/network.py:189
-+#: ../extensions/deviceicon/network.py:202
- msgid "Speed"
- msgstr "Velocidad"
-
--#: ../extensions/deviceicon/network.py:415
--#, python-format
--msgid "%s's network %s"
-+#: ../extensions/deviceicon/network.py:229
-+#, fuzzy
-+msgid "Wireless modem"
-+msgstr "Modem inalámbrico"
-+
-+#: ../extensions/deviceicon/network.py:277
-+msgid "Please wait..."
-+msgstr "Favor espere..."
-+
-+#: ../extensions/deviceicon/network.py:280
-+#: ../src/jarabe/desktop/meshbox.py:163 ../src/jarabe/desktop/meshbox.py:493
-+msgid "Connect"
-+msgstr "Conectar"
-+
-+#: ../extensions/deviceicon/network.py:281
-+msgid "Disconnected"
-+msgstr "Desconectado"
-+
-+#: ../extensions/deviceicon/network.py:284
-+#: ../src/jarabe/controlpanel/toolbar.py:115
-+#: ../src/jarabe/desktop/homebox.py:68
-+#: ../src/jarabe/frame/activitiestray.py:708
-+#: ../src/jarabe/frame/activitiestray.py:807
-+#: ../src/jarabe/frame/activitiestray.py:835
-+msgid "Cancel"
-+msgstr "Cancelar"
-+
-+#: ../extensions/deviceicon/network.py:288
-+#: ../src/jarabe/desktop/meshbox.py:167
-+msgid "Disconnect"
-+msgstr "Desconectar"
-+
-+#: ../extensions/deviceicon/network.py:292
-+msgid "Sim requires Pin/Puk"
-+msgstr "Requiere PIN y PUK."
-+
-+#: ../extensions/deviceicon/network.py:293
-+#, fuzzy
-+msgid "Authentication Error"
-+msgstr "Error de autenticación:"
-+
-+#: ../extensions/deviceicon/network.py:538
-+#, fuzzy, python-format
-+msgid "%s's network"
- msgstr "%s's red %s"
-
-+#: ../extensions/deviceicon/network.py:605
-+#: ../extensions/deviceicon/network.py:664
-+msgid "Mesh Network"
-+msgstr "Red Malla"
-+
-+#: ../extensions/deviceicon/network.py:869
-+#, python-format
-+msgid "Data sent %d KB / received %d KB"
-+msgstr ""
-+
-+# TODO: show the channel number
-+#: ../extensions/deviceicon/network.py:880
-+#, fuzzy
-+msgid "Connection time "
-+msgstr "Conectado"
-+
- #: ../extensions/deviceicon/speaker.py:59
- msgid "My Speakers"
- msgstr "Mis parlantes"
-@@ -467,39 +563,49 @@ msgstr "Dar voz"
- msgid "Mute"
- msgstr "Silenciar"
-
--#: ../extensions/globalkey/screenshot.py:56
-+#: ../extensions/globalkey/screenshot.py:59
- msgid "Mesh"
- msgstr "Malla"
-
--#: ../extensions/globalkey/screenshot.py:58
-+#: ../extensions/globalkey/screenshot.py:61
- #: ../src/jarabe/frame/zoomtoolbar.py:39
- msgid "Group"
- msgstr "Grupo"
-
--#: ../extensions/globalkey/screenshot.py:60
-+#: ../extensions/globalkey/screenshot.py:63
- #: ../src/jarabe/frame/zoomtoolbar.py:41
- msgid "Home"
- msgstr "Hogar"
-
--#: ../extensions/globalkey/screenshot.py:66
-+#: ../extensions/globalkey/screenshot.py:69
- #: ../src/jarabe/frame/zoomtoolbar.py:43
- msgid "Activity"
- msgstr "Actividad"
-
--#: ../extensions/globalkey/screenshot.py:69
-+#: ../extensions/globalkey/screenshot.py:72
- msgid "Screenshot"
- msgstr "Captura de pantalla"
-
--#: ../extensions/globalkey/screenshot.py:71
-+#: ../extensions/globalkey/screenshot.py:74
- #, python-format
- msgid "Screenshot of \"%s\""
- msgstr "Captura pantalla de \"%s\""
-
- #: ../data/sugar.schemas.in.h:1
-+msgid ""
-+"\"disabled\" to ask nick on initialization; \"system\" to reuse UNIX account "
-+"long name."
-+msgstr ""
-+
-+#: ../data/sugar.schemas.in.h:2
-+msgid "Additional directories which can contain updated translations."
-+msgstr ""
-+
-+#: ../data/sugar.schemas.in.h:3
- msgid "Backup URL"
- msgstr "URL de Respaldo"
-
--#: ../data/sugar.schemas.in.h:2
-+#: ../data/sugar.schemas.in.h:4
- msgid ""
- "Color for the XO icon that is used throughout the desktop. The string is "
- "composed of the stroke color and fill color, format is that of rbg colors. "
-@@ -510,32 +616,109 @@ msgstr ""
- "colores RBG. Ejemplo: #AC32FF, #9A5200"
-
- # es la mejor traduccion ?
--#: ../data/sugar.schemas.in.h:3
-+#: ../data/sugar.schemas.in.h:5
- msgid "Corner Delay"
- msgstr "Retraso de las Esquinas"
-
--#: ../data/sugar.schemas.in.h:4
-+#: ../data/sugar.schemas.in.h:6
-+msgid "Default font face"
-+msgstr ""
-+
-+#: ../data/sugar.schemas.in.h:7
-+msgid "Default font size"
-+msgstr ""
-+
-+#: ../data/sugar.schemas.in.h:8
-+msgid "Default nick"
-+msgstr ""
-+
-+#: ../data/sugar.schemas.in.h:9
- msgid "Delay for the activation of the frame using the corners."
- msgstr "Retraso para la activación del cuadro utilizando las esquinas."
-
--#: ../data/sugar.schemas.in.h:5
-+#: ../data/sugar.schemas.in.h:10
- msgid "Delay for the activation of the frame using the edges."
- msgstr "Retraso para la activación del cuadro utilizando los bordes."
-
-+#: ../data/sugar.schemas.in.h:11
-+msgid "Directory to search for translations"
-+msgstr ""
-+
- # es la mejor traduccion ?
--#: ../data/sugar.schemas.in.h:6
-+#: ../data/sugar.schemas.in.h:12
- msgid "Edge Delay"
- msgstr "Retraso del Borde"
-
--#: ../data/sugar.schemas.in.h:7
-+#: ../data/sugar.schemas.in.h:13
- msgid "Favorites Layout"
- msgstr "Diseño de favoritos"
-
--#: ../data/sugar.schemas.in.h:8
-+#: ../data/sugar.schemas.in.h:14
- msgid "Favorites resume mode"
- msgstr "Modo de reanudar favoritos"
-
--#: ../data/sugar.schemas.in.h:9
-+#: ../data/sugar.schemas.in.h:15
-+#, fuzzy
-+msgid "Font face that is used throughout the desktop."
-+msgstr "Nombre de usuario que se utiliza en todo el escritorio."
-+
-+#: ../data/sugar.schemas.in.h:16
-+#, fuzzy
-+msgid "Font size that is used throughout the desktop."
-+msgstr "Nombre de usuario que se utiliza en todo el escritorio."
-+
-+#: ../data/sugar.schemas.in.h:17
-+#, fuzzy
-+msgid "GSM network APN"
-+msgstr "%s's red %s"
-+
-+#: ../data/sugar.schemas.in.h:18
-+#, fuzzy
-+msgid "GSM network PIN"
-+msgstr "%s's red %s"
-+
-+#: ../data/sugar.schemas.in.h:19
-+#, fuzzy
-+msgid "GSM network PUK"
-+msgstr "%s's red %s"
-+
-+#: ../data/sugar.schemas.in.h:20
-+msgid "GSM network access point name configuration"
-+msgstr ""
-+
-+#: ../data/sugar.schemas.in.h:21
-+msgid "GSM network number"
-+msgstr ""
-+
-+#: ../data/sugar.schemas.in.h:22
-+msgid "GSM network password"
-+msgstr ""
-+
-+#: ../data/sugar.schemas.in.h:23
-+msgid "GSM network password configuration"
-+msgstr ""
-+
-+#: ../data/sugar.schemas.in.h:24
-+msgid "GSM network personal identification number configuration"
-+msgstr ""
-+
-+#: ../data/sugar.schemas.in.h:25
-+msgid "GSM network personal unlock key configuration"
-+msgstr ""
-+
-+#: ../data/sugar.schemas.in.h:26
-+msgid "GSM network telephone number configuration"
-+msgstr ""
-+
-+#: ../data/sugar.schemas.in.h:27
-+msgid "GSM network username"
-+msgstr ""
-+
-+#: ../data/sugar.schemas.in.h:28
-+msgid "GSM network username configuration"
-+msgstr ""
-+
-+#: ../data/sugar.schemas.in.h:29
- msgid ""
- "If TRUE, Sugar will make us searchable for the other users of the Jabber "
- "server."
-@@ -543,110 +726,110 @@ msgstr ""
- "Si es TRUE, Azúcar habilitará que otros usuarios nos busquen en el servidor "
- "Jabber."
-
--#: ../data/sugar.schemas.in.h:10
-+#: ../data/sugar.schemas.in.h:30
- msgid "If TRUE, Sugar will show a \"Log out\" option."
- msgstr "Si es TRUE, Azúcar mostrará una opción \"Terminar Sesión\"."
-
--#: ../data/sugar.schemas.in.h:11
-+#: ../data/sugar.schemas.in.h:31
- msgid "Jabber Server"
- msgstr "Servidor Jabber"
-
--#: ../data/sugar.schemas.in.h:12
-+#: ../data/sugar.schemas.in.h:32
- msgid "Keyboard layouts"
- msgstr "Distribuciones del teclado"
-
--#: ../data/sugar.schemas.in.h:13
-+#: ../data/sugar.schemas.in.h:33
- msgid "Keyboard model"
- msgstr "Modelo del teclado"
-
--#: ../data/sugar.schemas.in.h:14
-+#: ../data/sugar.schemas.in.h:34
- msgid "Keyboard options"
- msgstr "Opciones del teclado"
-
--#: ../data/sugar.schemas.in.h:15
-+#: ../data/sugar.schemas.in.h:35
- msgid "Layout of the favorites view."
- msgstr "Distribución de las actividades favoritas."
-
--#: ../data/sugar.schemas.in.h:16
-+#: ../data/sugar.schemas.in.h:36
- msgid ""
- "List of keyboard layouts. Each entry should be in the form layout(variant)"
- msgstr ""
- "Lista de las distribuciones de teclado. Cada entrada debe ser en la forma "
- "distribución(variante)"
-
--#: ../data/sugar.schemas.in.h:17
-+#: ../data/sugar.schemas.in.h:37
- msgid "List of keyboard options."
- msgstr "Lista de las opciones del teclado."
-
--#: ../data/sugar.schemas.in.h:18
-+#: ../data/sugar.schemas.in.h:38
- msgid "Power Automatic"
- msgstr "Manejo automática de energía"
-
--#: ../data/sugar.schemas.in.h:19
-+#: ../data/sugar.schemas.in.h:39
- msgid "Power Automatic."
- msgstr "Manejo automática de energía."
-
--#: ../data/sugar.schemas.in.h:20
-+#: ../data/sugar.schemas.in.h:40
- msgid "Power Extreme"
- msgstr "Manejo extremo de energía"
-
--#: ../data/sugar.schemas.in.h:21
-+#: ../data/sugar.schemas.in.h:41
- msgid "Power Extreme."
- msgstr "Manejo extremo de energía."
-
--#: ../data/sugar.schemas.in.h:22
-+#: ../data/sugar.schemas.in.h:42
- msgid "Publish to Gadget"
- msgstr "Publicar en Gadget"
-
--#: ../data/sugar.schemas.in.h:23
-+#: ../data/sugar.schemas.in.h:43
- msgid "Setting for muting the sound device."
- msgstr "Configuración para silenciar el dispositivo de sonido."
-
--#: ../data/sugar.schemas.in.h:24
-+#: ../data/sugar.schemas.in.h:44
- msgid "Show Log out"
- msgstr "Mostrar Terminar Sesión"
-
--#: ../data/sugar.schemas.in.h:25
-+#: ../data/sugar.schemas.in.h:45
- msgid "Sound Muted"
- msgstr "Sonido silenciado"
-
--#: ../data/sugar.schemas.in.h:26
-+#: ../data/sugar.schemas.in.h:46
- msgid "The keyboard model to be used"
- msgstr "El modelo del teclado que se utilizará"
-
--#: ../data/sugar.schemas.in.h:28
-+#: ../data/sugar.schemas.in.h:48
- msgid "Timezone setting for the system."
- msgstr "Configuración de zona horaria para el sistema."
-
--#: ../data/sugar.schemas.in.h:29
-+#: ../data/sugar.schemas.in.h:49
- msgid "Url of the jabber server to use."
- msgstr "URL del servidor de Jabber para usar."
-
--#: ../data/sugar.schemas.in.h:30
-+#: ../data/sugar.schemas.in.h:50
- msgid "Url where the backup is saved to."
- msgstr "URL donde se guarda el backup."
-
--#: ../data/sugar.schemas.in.h:31
-+#: ../data/sugar.schemas.in.h:51
- msgid "User Color"
- msgstr "Color del usuario"
-
--#: ../data/sugar.schemas.in.h:32
-+#: ../data/sugar.schemas.in.h:52
- msgid "User Name"
- msgstr "Nombre de usuario"
-
--#: ../data/sugar.schemas.in.h:33
-+#: ../data/sugar.schemas.in.h:53
- msgid "User name that is used throughout the desktop."
- msgstr "Nombre de usuario que se utiliza en todo el escritorio."
-
--#: ../data/sugar.schemas.in.h:34
-+#: ../data/sugar.schemas.in.h:54
- msgid "Volume Level"
- msgstr "Nivel de volumen"
-
--#: ../data/sugar.schemas.in.h:35
-+#: ../data/sugar.schemas.in.h:55
- msgid "Volume level for the sound device."
- msgstr "Nivel de volumen para el dispositivo de sonido."
-
--#: ../data/sugar.schemas.in.h:36
-+#: ../data/sugar.schemas.in.h:56
- msgid ""
- "When in resume mode, clicking on a favorite icon will cause the last entry "
- "for that activity to be resumed."
-@@ -705,68 +888,47 @@ msgstr ""
- msgid "To apply your changes you have to restart sugar.\n"
- msgstr "Para aplicar sus cambios tiene que reiniciar Azúcar.\n"
-
--#: ../src/jarabe/controlpanel/gui.py:280
-+#: ../src/jarabe/controlpanel/gui.py:281
- msgid "Warning"
- msgstr "Advertencia"
-
--#: ../src/jarabe/controlpanel/gui.py:281
-+#: ../src/jarabe/controlpanel/gui.py:282
- #: ../src/jarabe/controlpanel/sectionview.py:42
- msgid "Changes require restart"
- msgstr "Los cambios requieren reiniciar"
-
--#: ../src/jarabe/controlpanel/gui.py:284
-+#: ../src/jarabe/controlpanel/gui.py:285
- msgid "Cancel changes"
- msgstr "Cancelar cambios"
-
--#: ../src/jarabe/controlpanel/gui.py:289 ../src/jarabe/desktop/homebox.py:70
-+#: ../src/jarabe/controlpanel/gui.py:290 ../src/jarabe/desktop/homebox.py:70
- msgid "Later"
- msgstr "Después"
-
--#: ../src/jarabe/controlpanel/gui.py:293
-+#: ../src/jarabe/controlpanel/gui.py:294
- msgid "Restart now"
- msgstr "Reiniciar ahora"
-
--#: ../src/jarabe/controlpanel/toolbar.py:61 ../src/jarabe/intro/window.py:188
-+#: ../src/jarabe/controlpanel/toolbar.py:61 ../src/jarabe/intro/window.py:206
- msgid "Done"
- msgstr "Hecho"
-
--#: ../src/jarabe/controlpanel/toolbar.py:115
--#: ../src/jarabe/desktop/homebox.py:68
--#: ../src/jarabe/frame/activitiestray.py:726
--#: ../src/jarabe/frame/activitiestray.py:822
--#: ../src/jarabe/frame/activitiestray.py:850
--msgid "Cancel"
--msgstr "Cancelar"
--
- #: ../src/jarabe/controlpanel/toolbar.py:121
--#: ../src/jarabe/desktop/favoritesview.py:332
-+#: ../src/jarabe/desktop/favoritesview.py:335
-+#: ../src/jarabe/desktop/favoritesview.py:660
- msgid "Ok"
- msgstr "Ok"
-
--#: ../src/jarabe/desktop/activitieslist.py:80
--#: ../src/jarabe/journal/listview.py:147
--msgid "Title"
--msgstr "Título"
--
--#: ../src/jarabe/desktop/activitieslist.py:91
--msgid "Version"
--msgstr "Versión"
--
--#: ../src/jarabe/desktop/activitieslist.py:105
--#: ../src/jarabe/journal/listview.py:178
--msgid "Date"
--msgstr "Fecha"
--
--#: ../src/jarabe/desktop/activitieslist.py:234
-+#: ../src/jarabe/desktop/activitieslist.py:236
- #, python-format
- msgid "Version %s"
- msgstr "Versión %s"
-
--#: ../src/jarabe/desktop/activitieslist.py:355
-+#: ../src/jarabe/desktop/activitieslist.py:357
- msgid "Confirm erase"
- msgstr "Confirmar borrado"
-
--#: ../src/jarabe/desktop/activitieslist.py:357
-+#: ../src/jarabe/desktop/activitieslist.py:359
- #, python-format
- msgid "Confirm erase: Do you want to permanently erase %s?"
- msgstr "Confirmar el borrado: ¿Quiere borrar %s de forma permanente?"
-@@ -775,24 +937,24 @@ msgstr "Confirmar el borrado: ¿Quiere borrar %s de forma permanente?"
- # TODO: Implement stopping downloads
- # self._stop_item.connect('activate', self._stop_item_activate_cb)
- # self.append_menu_item(self._stop_item)
--#: ../src/jarabe/desktop/activitieslist.py:361
--#: ../src/jarabe/frame/clipboardmenu.py:62
-+#: ../src/jarabe/desktop/activitieslist.py:363
-+#: ../src/jarabe/frame/clipboardmenu.py:63
- #: ../src/jarabe/view/viewsource.py:218
- msgid "Keep"
- msgstr "Guardar"
-
--#: ../src/jarabe/desktop/activitieslist.py:364
--#: ../src/jarabe/desktop/activitieslist.py:407
--#: ../src/jarabe/journal/journaltoolbox.py:360
--#: ../src/jarabe/journal/palettes.py:112
-+#: ../src/jarabe/desktop/activitieslist.py:366
-+#: ../src/jarabe/desktop/activitieslist.py:409
-+#: ../src/jarabe/journal/journaltoolbox.py:361
-+#: ../src/jarabe/journal/palettes.py:106
- msgid "Erase"
- msgstr "Borrar"
-
--#: ../src/jarabe/desktop/activitieslist.py:428
-+#: ../src/jarabe/desktop/activitieslist.py:430
- msgid "Remove favorite"
- msgstr "Remover favorito"
-
--#: ../src/jarabe/desktop/activitieslist.py:432
-+#: ../src/jarabe/desktop/activitieslist.py:434
- msgid "Make favorite"
- msgstr "Hacer favorito"
-
-@@ -826,27 +988,38 @@ msgstr "Caja"
- msgid "Triangle"
- msgstr "Triángulo"
-
--#: ../src/jarabe/desktop/favoritesview.py:323
-+#: ../src/jarabe/desktop/favoritesview.py:325
- msgid "Registration Failed"
- msgstr "Registro fallido"
-
--#: ../src/jarabe/desktop/favoritesview.py:324
-+#: ../src/jarabe/desktop/favoritesview.py:326
- #, python-format
- msgid "%s"
- msgstr "%s"
-
--#: ../src/jarabe/desktop/favoritesview.py:326
-+#: ../src/jarabe/desktop/favoritesview.py:328
- msgid "Registration Successful"
- msgstr "Registro exitoso"
-
--#: ../src/jarabe/desktop/favoritesview.py:327
-+#: ../src/jarabe/desktop/favoritesview.py:329
- msgid "You are now registered with your school server."
- msgstr "Ahora estás registrado en el servidor de colegio."
-
--#: ../src/jarabe/desktop/favoritesview.py:671
-+#: ../src/jarabe/desktop/favoritesview.py:633
-+#: ../src/jarabe/desktop/favoritesview.py:638
- msgid "Register"
- msgstr "Registro"
-
-+#: ../src/jarabe/desktop/favoritesview.py:658
-+#, fuzzy
-+msgid "Unregistration Successful"
-+msgstr "Registro exitoso"
-+
-+#: ../src/jarabe/desktop/favoritesview.py:659
-+#, fuzzy
-+msgid "You are not registered anymore"
-+msgstr "Ahora estás registrado en el servidor de colegio."
-+
- #: ../src/jarabe/desktop/homebox.py:63
- msgid "Software Update"
- msgstr "Actualización de Software"
-@@ -877,112 +1050,109 @@ msgid "<Ctrl>1"
- msgstr "<Ctrl>1"
-
- # This is an encryption key type, not a keyboard key
--#: ../src/jarabe/desktop/keydialog.py:131
-+#: ../src/jarabe/desktop/keydialog.py:135
- msgid "Key Type:"
- msgstr "Tipo de clave:"
-
--#: ../src/jarabe/desktop/keydialog.py:151
-+#: ../src/jarabe/desktop/keydialog.py:155
- msgid "Authentication Type:"
- msgstr "Tipo de autenticación:"
-
--#: ../src/jarabe/desktop/keydialog.py:215
-+#: ../src/jarabe/desktop/keydialog.py:220
- msgid "WPA & WPA2 Personal"
- msgstr "WPA y WPA2 Personal"
-
--#: ../src/jarabe/desktop/keydialog.py:224
-+#: ../src/jarabe/desktop/keydialog.py:229
- msgid "Wireless Security:"
- msgstr "Seguridad inalámbrica:"
-
--#: ../src/jarabe/desktop/meshbox.py:136
--msgid "Connect"
--msgstr "Conectar"
--
--#: ../src/jarabe/desktop/meshbox.py:140
--msgid "Disconnect"
--msgstr "Desconectar"
-+#: ../src/jarabe/desktop/meshbox.py:491
-+#, fuzzy, python-format
-+msgid "Mesh Network %d"
-+msgstr "Red Malla"
-
- # TRANS: Action label for resuming an activity.
- #. TRANS: Action label for resuming an activity.
--#: ../src/jarabe/desktop/meshbox.py:466
--#: ../src/jarabe/frame/activitiestray.py:761
--#: ../src/jarabe/journal/journaltoolbox.py:428
--#: ../src/jarabe/journal/palettes.py:72 ../src/jarabe/view/palettes.py:64
-+#: ../src/jarabe/desktop/meshbox.py:628
-+#: ../src/jarabe/frame/activitiestray.py:743
-+#: ../src/jarabe/journal/journaltoolbox.py:440
-+#: ../src/jarabe/journal/palettes.py:66 ../src/jarabe/view/palettes.py:82
- msgid "Resume"
- msgstr "Retomar"
-
--#: ../src/jarabe/desktop/meshbox.py:471
--#: ../src/jarabe/frame/activitiestray.py:235
-+#: ../src/jarabe/desktop/meshbox.py:633
-+#: ../src/jarabe/frame/activitiestray.py:241
- msgid "Join"
- msgstr "Unirse"
-
--#: ../src/jarabe/desktop/schoolserver.py:103
-+#: ../src/jarabe/desktop/schoolserver.py:104
- msgid "Cannot connect to the server."
- msgstr "No se puede conectar al servidor."
-
--#: ../src/jarabe/desktop/schoolserver.py:108
-+#: ../src/jarabe/desktop/schoolserver.py:109
- msgid "The server could not complete the request."
- msgstr "El servidor no pudo completar el pedido."
-
--#: ../src/jarabe/frame/activitiestray.py:240
--#: ../src/jarabe/frame/activitiestray.py:698
-+#: ../src/jarabe/frame/activitiestray.py:246
-+#: ../src/jarabe/frame/activitiestray.py:680
- msgid "Decline"
- msgstr "Rechazar"
-
--#: ../src/jarabe/frame/activitiestray.py:650
-+#: ../src/jarabe/frame/activitiestray.py:632
- #, python-format
- msgid "%dB"
- msgstr "%dB"
-
--#: ../src/jarabe/frame/activitiestray.py:652
-+#: ../src/jarabe/frame/activitiestray.py:634
- #, python-format
- msgid "%dKB"
- msgstr "%dKB"
-
--#: ../src/jarabe/frame/activitiestray.py:654
-+#: ../src/jarabe/frame/activitiestray.py:636
- #, python-format
- msgid "%dMB"
- msgstr "%dMB"
-
--#: ../src/jarabe/frame/activitiestray.py:671
-+#: ../src/jarabe/frame/activitiestray.py:653
- #, python-format
- msgid "%s of %s"
- msgstr "%s de %s"
-
--#: ../src/jarabe/frame/activitiestray.py:683
-+#: ../src/jarabe/frame/activitiestray.py:665
- #, python-format
- msgid "Transfer from %r"
- msgstr "Transferencia desde %r"
-
--#: ../src/jarabe/frame/activitiestray.py:693
-+#: ../src/jarabe/frame/activitiestray.py:675
- msgid "Accept"
- msgstr "Aceptar"
-
--#: ../src/jarabe/frame/activitiestray.py:716
--#: ../src/jarabe/frame/activitiestray.py:840
-+#: ../src/jarabe/frame/activitiestray.py:698
-+#: ../src/jarabe/frame/activitiestray.py:825
- #, python-format
- msgid "%s (%s)"
- msgstr "%s (%s)"
-
--#: ../src/jarabe/frame/activitiestray.py:750
--#: ../src/jarabe/frame/activitiestray.py:875
-+#: ../src/jarabe/frame/activitiestray.py:732
-+#: ../src/jarabe/frame/activitiestray.py:860
- msgid "Dismiss"
- msgstr "Descartar"
-
--#: ../src/jarabe/frame/activitiestray.py:810
-+#: ../src/jarabe/frame/activitiestray.py:795
- #, python-format
- msgid "Transfer to %r"
- msgstr "Transferencia a %r"
-
--#: ../src/jarabe/frame/clipboardmenu.py:52 ../src/jarabe/view/palettes.py:218
-+#: ../src/jarabe/frame/clipboardmenu.py:53 ../src/jarabe/view/palettes.py:236
- msgid "Remove"
--msgstr "Eliminar"
-+msgstr "Quitar"
-
--#: ../src/jarabe/frame/clipboardmenu.py:57
--#: ../src/jarabe/frame/clipboardmenu.py:80
-+#: ../src/jarabe/frame/clipboardmenu.py:58
-+#: ../src/jarabe/frame/clipboardmenu.py:81
- msgid "Open"
- msgstr "Abrir"
-
--#: ../src/jarabe/frame/clipboardmenu.py:85
-+#: ../src/jarabe/frame/clipboardmenu.py:86
- msgid "Open with"
- msgstr "Abrir con"
-
-@@ -1011,140 +1181,142 @@ msgstr "F3"
- msgid "F4"
- msgstr "F4"
-
--#: ../src/jarabe/intro/window.py:124
-+#: ../src/jarabe/intro/window.py:128
- msgid "Click to change color:"
- msgstr "Clic para cambiar de color:"
-
--#: ../src/jarabe/intro/window.py:174 ../src/jarabe/journal/detailview.py:103
-+#: ../src/jarabe/intro/window.py:192 ../src/jarabe/journal/detailview.py:103
- msgid "Back"
- msgstr "Atrás"
-
--#: ../src/jarabe/intro/window.py:191
-+#: ../src/jarabe/intro/window.py:209
- msgid "Next"
- msgstr "Siguiente"
-
--#: ../src/jarabe/journal/expandedentry.py:164
--#: ../src/jarabe/journal/palettes.py:66
-+#: ../src/jarabe/journal/expandedentry.py:151
-+#: ../src/jarabe/journal/palettes.py:60
- msgid "Untitled"
- msgstr "Sin título"
-
--#: ../src/jarabe/journal/expandedentry.py:210
-+#: ../src/jarabe/journal/expandedentry.py:242
- msgid "No preview"
- msgstr "Sin vista previa"
-
--#: ../src/jarabe/journal/expandedentry.py:229
-+#: ../src/jarabe/journal/expandedentry.py:261
- #, python-format
- msgid "Kind: %s"
- msgstr "Tipo: %s"
-
--#: ../src/jarabe/journal/expandedentry.py:229
-+#: ../src/jarabe/journal/expandedentry.py:261
- msgid "Unknown"
- msgstr "Desconocido"
-
--#: ../src/jarabe/journal/expandedentry.py:230
-+#: ../src/jarabe/journal/expandedentry.py:262
- #, python-format
- msgid "Date: %s"
- msgstr "Fecha: %s"
-
--#: ../src/jarabe/journal/expandedentry.py:231
-+#: ../src/jarabe/journal/expandedentry.py:263
- #, python-format
- msgid "Size: %s"
- msgstr "Tamaño: %s"
-
--#: ../src/jarabe/journal/expandedentry.py:253 ../src/jarabe/journal/misc.py:92
-+#: ../src/jarabe/journal/expandedentry.py:285 ../src/jarabe/journal/misc.py:94
- msgid "No date"
- msgstr "Sin fecha"
-
--#: ../src/jarabe/journal/expandedentry.py:260
-+#: ../src/jarabe/journal/expandedentry.py:292
- msgid "Participants:"
- msgstr "Participantes:"
-
--#: ../src/jarabe/journal/expandedentry.py:283
-+#: ../src/jarabe/journal/expandedentry.py:315
- msgid "Description:"
- msgstr "Descripción:"
-
--#: ../src/jarabe/journal/expandedentry.py:309
-+#: ../src/jarabe/journal/expandedentry.py:340
- msgid "Tags:"
- msgstr "Etiquetas:"
-
- #: ../src/jarabe/journal/journalactivity.py:108
--#: ../src/jarabe/journal/volumestoolbar.py:47
-+#: ../src/jarabe/journal/journaltoolbox.py:411
-+#: ../src/jarabe/journal/volumestoolbar.py:49
- msgid "Journal"
- msgstr "Diario"
-
--#: ../src/jarabe/journal/journaltoolbox.py:67
-+#: ../src/jarabe/journal/journaltoolbox.py:68
- msgid "Search"
- msgstr "Buscar"
-
--#: ../src/jarabe/journal/journaltoolbox.py:126
-+#: ../src/jarabe/journal/journaltoolbox.py:127
- msgid "Anytime"
- msgstr "Cualquier momento"
-
--#: ../src/jarabe/journal/journaltoolbox.py:128
-+#: ../src/jarabe/journal/journaltoolbox.py:129
- msgid "Today"
- msgstr "Hoy"
-
--#: ../src/jarabe/journal/journaltoolbox.py:130
-+#: ../src/jarabe/journal/journaltoolbox.py:131
- msgid "Since yesterday"
- msgstr "Desde ayer"
-
- # TRANS: Filter entries modified during the last 7 days.
- #. TRANS: Filter entries modified during the last 7 days.
--#: ../src/jarabe/journal/journaltoolbox.py:132
-+#: ../src/jarabe/journal/journaltoolbox.py:133
- msgid "Past week"
- msgstr "Última semana"
-
- # TRANS: Filter entries modified during the last 30 days.
- #. TRANS: Filter entries modified during the last 30 days.
--#: ../src/jarabe/journal/journaltoolbox.py:134
-+#: ../src/jarabe/journal/journaltoolbox.py:135
- msgid "Past month"
- msgstr "Último mes"
-
- # TRANS: Filter entries modified during the last 356 days.
- #. TRANS: Filter entries modified during the last 356 days.
--#: ../src/jarabe/journal/journaltoolbox.py:136
-+#: ../src/jarabe/journal/journaltoolbox.py:137
- msgid "Past year"
- msgstr "Último año"
-
--#: ../src/jarabe/journal/journaltoolbox.py:143
-+#: ../src/jarabe/journal/journaltoolbox.py:144
- msgid "Anyone"
- msgstr "Cualquiera"
-
--#: ../src/jarabe/journal/journaltoolbox.py:145
-+#: ../src/jarabe/journal/journaltoolbox.py:146
- msgid "My friends"
- msgstr "Mis amigos"
-
--#: ../src/jarabe/journal/journaltoolbox.py:146
-+#: ../src/jarabe/journal/journaltoolbox.py:147
- msgid "My class"
- msgstr "Mi clase"
-
- # TRANS: Item in a combo box that filters by entry type.
--#: ../src/jarabe/journal/journaltoolbox.py:274
-+#: ../src/jarabe/journal/journaltoolbox.py:275
- msgid "Anything"
- msgstr "Cualquiera"
-
- # TODO: Add "Start with" menu item
--#: ../src/jarabe/journal/journaltoolbox.py:350
--#: ../src/jarabe/journal/palettes.py:90
-+#: ../src/jarabe/journal/journaltoolbox.py:351
-+#: ../src/jarabe/journal/palettes.py:84
- msgid "Copy"
- msgstr "Copiar"
-
- # TRANS: Action label for starting an entry.
- #. TRANS: Action label for starting an entry.
--#: ../src/jarabe/journal/journaltoolbox.py:431
--#: ../src/jarabe/journal/palettes.py:75
-+#: ../src/jarabe/journal/journaltoolbox.py:443
-+#: ../src/jarabe/journal/palettes.py:69
-+#: ../src/jarabe/journal/processdialog.py:115
- msgid "Start"
- msgstr "Iniciar"
-
--#: ../src/jarabe/journal/listview.py:361
-+#: ../src/jarabe/journal/listview.py:373
- msgid "Your Journal is empty"
- msgstr "Su diario está vacío"
-
--#: ../src/jarabe/journal/listview.py:363
-+#: ../src/jarabe/journal/listview.py:375
- msgid "No matching entries"
- msgstr "No hay entradas coincidentes"
-
--#: ../src/jarabe/journal/listview.py:374
-+#: ../src/jarabe/journal/listview.py:386
- msgid "Clear search"
- msgstr "Limpiar búsqueda"
-
-@@ -1167,44 +1339,118 @@ msgid "Choose an object"
- msgstr "Escoja un objeto"
-
- #: ../src/jarabe/journal/objectchooser.py:151
--#: ../src/jarabe/view/viewsource.py:308
-+#: ../src/jarabe/journal/processdialog.py:120
-+#: ../src/jarabe/view/viewsource.py:310
- msgid "Close"
- msgstr "Cerrar"
-
--#: ../src/jarabe/journal/palettes.py:73
-+#: ../src/jarabe/journal/palettes.py:67
- msgid "Resume with"
- msgstr "Reiniciar con"
-
--#: ../src/jarabe/journal/palettes.py:76
-+#: ../src/jarabe/journal/palettes.py:70
- msgid "Start with"
- msgstr "Empezar con"
-
--#: ../src/jarabe/journal/palettes.py:98
-+#: ../src/jarabe/journal/palettes.py:92
- msgid "Send to"
- msgstr "Enviar a"
-
--#: ../src/jarabe/journal/palettes.py:107
-+#: ../src/jarabe/journal/palettes.py:101
- msgid "View Details"
- msgstr "Ver detalles"
-
--#: ../src/jarabe/journal/palettes.py:185
-+#: ../src/jarabe/journal/palettes.py:179
- msgid "No friends present"
- msgstr "No hay amigos presentes"
-
- # tildes
--#: ../src/jarabe/journal/palettes.py:190
-+#: ../src/jarabe/journal/palettes.py:184
- msgid "No valid connection found"
- msgstr "No se encontró una conexión válida"
-
- # tildes...
--#: ../src/jarabe/journal/palettes.py:218
-+#: ../src/jarabe/journal/palettes.py:212
- msgid "No activity to resume entry"
- msgstr "No se encontró una actividad para retomar la entrada"
-
--#: ../src/jarabe/journal/palettes.py:220
-+#: ../src/jarabe/journal/palettes.py:214
- msgid "No activity to start entry"
- msgstr "No se encontró una actividad para iniciar la entrada"
-
-+# TRANS: label for the ring layout in the favorites view
-+#: ../src/jarabe/journal/processdialog.py:48
-+#, fuzzy
-+msgid "Running"
-+msgstr "Ejecutando"
-+
-+#: ../src/jarabe/journal/processdialog.py:49
-+msgid "Failed"
-+msgstr "Fallado"
-+
-+#: ../src/jarabe/journal/processdialog.py:50
-+msgid "Finished"
-+msgstr "Terminado"
-+
-+#: ../src/jarabe/journal/processdialog.py:125
-+#, fuzzy
-+msgid "Restart"
-+msgstr "Reiniciar"
-+
-+#: ../src/jarabe/journal/processdialog.py:211
-+#, python-format
-+msgid "Please wait, saving journal content to %s."
-+msgstr "Favor espere, guardando el contenido del Diario en "
-+
-+#: ../src/jarabe/journal/processdialog.py:212
-+#: ../src/jarabe/journal/processdialog.py:242
-+msgid "The journal content has been saved."
-+msgstr "El contenido del Diario ha sido guardado."
-+
-+#: ../src/jarabe/journal/processdialog.py:214
-+#: ../src/jarabe/journal/processdialog.py:244
-+#, fuzzy
-+msgid "Backup"
-+msgstr "Respaldar"
-+
-+#: ../src/jarabe/journal/processdialog.py:215
-+#: ../src/jarabe/journal/processdialog.py:245
-+#, python-format
-+msgid "Journal content will be saved to %s"
-+msgstr "El contenido del Diario será guardado en "
-+
-+#: ../src/jarabe/journal/processdialog.py:228
-+#: ../src/jarabe/journal/processdialog.py:255
-+#, python-format
-+msgid "Please wait, restoring journal content from %s"
-+msgstr "Favor espere, restaurando el contenido del Diario desde "
-+
-+#: ../src/jarabe/journal/processdialog.py:229
-+#: ../src/jarabe/journal/processdialog.py:256
-+msgid "The journal content has been restored."
-+msgstr "El contendo del Diario ha sido restaurado."
-+
-+#: ../src/jarabe/journal/processdialog.py:231
-+#: ../src/jarabe/journal/processdialog.py:258
-+#, fuzzy
-+msgid "Restore"
-+msgstr "Restaurar"
-+
-+#: ../src/jarabe/journal/processdialog.py:232
-+#: ../src/jarabe/journal/processdialog.py:259
-+#, python-format
-+msgid "Journal content will be restored from %s"
-+msgstr "El contenido del Diario será restaurado desde "
-+
-+#: ../src/jarabe/journal/processdialog.py:241
-+#, python-format
-+msgid "Please wait, saving journal content to %s"
-+msgstr "Favor espere, guardando el contenido del Diario en "
-+
-+#: ../src/jarabe/model/processmanagement.py:76
-+msgid "Error - Call process: "
-+msgstr "Fallo en la llamada: "
-+
- # "Eliminate friend"??? That's a bit harsh. Wouldn't "quitar amigo" be a better choice?--
- # agree but i preffer remover :). that verbe has the exact meaning we are looking on here.
- #: ../src/jarabe/view/buddymenu.py:62
-@@ -1232,32 +1478,57 @@ msgstr "Mis ajustes"
- msgid "Invite to %s"
- msgstr "Invitar a %s"
-
--#: ../src/jarabe/view/palettes.py:45
-+#: ../src/jarabe/view/launcher.py:190
-+#, python-format
-+msgid "<b>%s</b> failed to start."
-+msgstr ""
-+
-+#: ../src/jarabe/view/palettes.py:50
- msgid "Starting..."
- msgstr "Iniciando..."
-
-+#: ../src/jarabe/view/palettes.py:60
-+#, fuzzy
-+msgid "Activity failed to start"
-+msgstr "No se encontró una actividad para iniciar la entrada"
-+
- #. TODO: share-with, keep
--#: ../src/jarabe/view/palettes.py:71
-+#: ../src/jarabe/view/palettes.py:89
- msgid "View Source"
- msgstr "Ver fuente"
-
--#: ../src/jarabe/view/palettes.py:82
-+#: ../src/jarabe/view/palettes.py:100
- msgid "Stop"
- msgstr "Parar"
-
--#: ../src/jarabe/view/palettes.py:122
-+#: ../src/jarabe/view/palettes.py:140
- msgid "Start new"
- msgstr "Empezar nuevo"
-
--#: ../src/jarabe/view/palettes.py:171
-+#: ../src/jarabe/view/palettes.py:189
- msgid "Show contents"
- msgstr "Mostrar contenidos"
-
--#: ../src/jarabe/view/palettes.py:193 ../src/jarabe/view/palettes.py:243
-+#: ../src/jarabe/view/palettes.py:211 ../src/jarabe/view/palettes.py:261
- #, python-format
- msgid "%(free_space)d MB Free"
- msgstr "%(free_space)d MB libres"
-
-+#: ../src/jarabe/view/palettes.py:280 ../src/jarabe/view/palettes.py:328
-+#, fuzzy
-+msgid "Restore Journal"
-+msgstr "Restaurar Diario"
-+
-+#: ../src/jarabe/view/palettes.py:290 ../src/jarabe/view/palettes.py:318
-+#, fuzzy
-+msgid "Backup Journal"
-+msgstr "Respaldar Diario"
-+
-+#: ../src/jarabe/view/palettes.py:307
-+#, fuzzy
-+msgid "School Server"
-+msgstr "Servidor Escuela"
-+
- #: ../src/jarabe/view/viewsource.py:208
- msgid "Instance Source"
- msgstr "Fuente de la instancia"
-@@ -1266,31 +1537,40 @@ msgstr "Fuente de la instancia"
- msgid "Source"
- msgstr "Fuente"
-
--#: ../src/jarabe/view/viewsource.py:292
-+#: ../src/jarabe/view/viewsource.py:294
- msgid "Activity Bundle Source"
- msgstr "Fuente del paquete de la actividad"
-
--#: ../src/jarabe/view/viewsource.py:299
-+#: ../src/jarabe/view/viewsource.py:301
- #, python-format
- msgid "View source: %r"
- msgstr "Ver código fuente: %r"
-
-+#, fuzzy
-+#~ msgid "Documents"
-+#~ msgstr "Documento"
-+
-+#~ msgid "Title"
-+#~ msgstr "Título"
-+
-+#~ msgid "Version"
-+#~ msgstr "Versión"
-+
-+#~ msgid "Date"
-+#~ msgstr "Fecha"
-+
- #~ msgid "Cannot obtain data needed for registration."
- #~ msgstr "No se puede obtener datos necesarios para el registro"
-
- #~ msgid "Unmount"
- #~ msgstr "Desmontar"
-
--#~ msgid "Restart"
--#~ msgstr "Reiniciar"
--
- #~ msgid ""
--#~ "© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
-+#~ "© 2008 One Laptop per Child Association Inc; Red Hat Inc; and "
-+#~ "Contributors."
- #~ msgstr ""
--#~ "© 2008 One Laptop per Child Association Inc; Red Hat Inc; y Contribuyentes."
--
--#~ msgid "Document"
--#~ msgstr "Documento"
-+#~ "© 2008 One Laptop per Child Association Inc; Red Hat Inc; y "
-+#~ "Contribuyentes."
-
- #~ msgid "Resume by default"
- #~ msgstr "Continuar de forma predeterminada"
-@@ -1306,12 +1586,6 @@ msgstr "Ver código fuente: %r"
- #~ msgid "Disconnecting..."
- #~ msgstr "Desconectando..."
-
--#~ msgid "Mesh Network"
--#~ msgstr "Red Malla"
--
--#~ msgid "Disconnected"
--#~ msgstr "Desconectado"
--
- #~ msgid "About my XO"
- #~ msgstr "Acerca de mi XO"
-
-@@ -1340,7 +1614,6 @@ msgstr "Ver código fuente: %r"
- #~ msgid "Settings"
- #~ msgstr "Configuración "
-
--#, python-format
- #~ msgid "Clipboard object: %s."
- #~ msgstr "Objeto de portapapel: %s."
-
-@@ -1385,16 +1658,15 @@ msgstr "Ver código fuente: %r"
- #~ msgstr "encendido"
-
- #~ msgid "Permission denied. You need to be root to run this method."
--#~ msgstr "permiso denegado. Usted necesita ser root para ejecutar este método."
-+#~ msgstr ""
-+#~ "permiso denegado. Usted necesita ser root para ejecutar este método."
-
- #~ msgid "Error in reading timezone"
- #~ msgstr "Error en la lectura de la zona horaria"
-
--#, python-format
- #~ msgid "Error copying timezone (from %s): %s"
- #~ msgstr "Error copiando zona horaria (desde %s): %s"
-
--#, python-format
- #~ msgid "Changing permission of timezone: %s"
- #~ msgstr "Cambiando permisos de zona horaria: %s"
-
-@@ -1458,43 +1730,18 @@ msgstr "Ver código fuente: %r"
- #~ msgid "Paste"
- #~ msgstr "Pegar"
-
--#, python-format
- #~ msgid "%s Activity"
- #~ msgstr "Actividad %s"
-
--#, python-format
--#~ msgid "Text snippet"
--#~ "Web Page"
--#~ "PDF file"
--#~ "MS Word file"
--#~ "RTF file"
--#~ "Abiword file"
--#~ "Squeak project"
--#~ "OpenOffice text file"
--#~ "Object"
--#~ "Pick a buddy picture"
--#~ "My Picture:"
--#~ "My Color:"
--#~ "Stop download"
--#~ "Close"
--#~ "No options"
--#~ "Send"
--#~ msgstr "Recorte de texto"
--#~ "Página web"
--#~ "Archivo PDF"
--#~ "Archivo MS-Word"
--#~ "Archivo RTF"
--#~ "Archivo Abiword"
--#~ "Proyecto de Squeak"
--#~ "Archivo de texto de OpenOffice"
--#~ "Objeto"
--#~ "Elegir la imagen de amigo"
--#~ "Mi imagen:"
--#~ "Mi color:"
--#~ "Interrumpir la bajada"
--#~ "Cerrar"
--#~ "Ninguna opción"
--#~ "Enviar"
-+#~ msgid ""
-+#~ "Text snippetWeb PagePDF fileMS Word fileRTF fileAbiword fileSqueak "
-+#~ "projectOpenOffice text fileObjectPick a buddy pictureMy Picture:My Color:"
-+#~ "Stop downloadCloseNo optionsSend"
-+#~ msgstr ""
-+#~ "Recorte de textoPágina webArchivo PDFArchivo MS-WordArchivo RTFArchivo "
-+#~ "AbiwordProyecto de SqueakArchivo de texto de OpenOfficeObjetoElegir la "
-+#~ "imagen de amigoMi imagen:Mi color:Interrumpir la bajadaCerrarNinguna "
-+#~ "opciónEnviar"
-
- #~ msgid "Keep error"
- #~ msgstr "Error de guardado"
-@@ -1514,55 +1761,42 @@ msgstr "Ver código fuente: %r"
- #~ msgid "OK"
- #~ msgstr "OK"
-
--#, python-format
- #~ msgid "%d year"
- #~ msgstr "%d año"
-
--#, python-format
- #~ msgid "%d years"
- #~ msgstr "%d años"
-
--#, python-format
- #~ msgid "%d month"
- #~ msgstr "%d mes"
-
--#, python-format
- #~ msgid "%d months"
- #~ msgstr "%d meses"
-
--#, python-format
- #~ msgid "%d week"
- #~ msgstr "%d semana"
-
--#, python-format
- #~ msgid "%d weeks"
- #~ msgstr "%d semanas"
-
--#, python-format
- #~ msgid "%d day"
- #~ msgstr "%d día"
-
--#, python-format
- #~ msgid "%d days"
- #~ msgstr "%d días"
-
--#, python-format
- #~ msgid "%d hour"
- #~ msgstr "%d hora"
-
--#, python-format
- #~ msgid "%d hours"
- #~ msgstr "%d horas"
-
--#, python-format
- #~ msgid "%d minute"
- #~ msgstr "%d minuto"
-
--#, python-format
- #~ msgid "%d minutes"
- #~ msgstr "%d minutos"
-
--#, python-format
- #~ msgid "%d second"
- #~ msgstr "%d segundo"
-
---
-1.6.0.4
-
diff --git a/rpms/sugar/backup-translations.patch b/rpms/sugar/backup-translations.patch
new file mode 100755
index 0000000..da4dc06
--- /dev/null
+++ b/rpms/sugar/backup-translations.patch
@@ -0,0 +1,78 @@
+diff -u -r -N sugar-0.88.1.original/po/es.po sugar-0.88.1/po/es.po
+--- sugar-0.88.1.original/po/es.po 2010-07-27 16:09:37.518503629 -0300
++++ sugar-0.88.1/po/es.po 2010-07-27 16:11:36.407752932 -0300
+@@ -1343,6 +1343,74 @@
+ msgid "Shows capital letters in the user interface."
+ msgstr "Muestra las letras en mayúsculas en la interfaz gráfica."
+
++#: ../src/jarabe/journal/processdialog.py:48
++msgid "Running"
++msgstr "Corriendo"
++
++#: ../src/jarabe/journal/processdialog.py:49
++msgid "Failed"
++msgstr "Fracasado"
++
++#: ../src/jarabe/journal/processdialog.py:50
++msgid "Finished"
++msgstr "Finalizado"
++
++#: ../src/jarabe/journal/processdialog.py:221
++msgid "Please wait, saving Journal content to"
++msgstr "Espere por favor, guardando el contenido del Diario a"
++
++#: ../src/jarabe/journal/processdialog.py:222
++msgid "Do not remove the storage device!"
++msgstr "¡No quite el dispositivo de almacenamiento!"
++
++#: ../src/jarabe/journal/processdialog.py:224
++msgid "The Journal content has been saved."
++msgstr "El contenido del Diario se ha guardado."
++
++#: ../src/jarabe/journal/processdialog.py:226
++msgid "Backup"
++msgstr "Respaldar"
++
++#: ../src/jarabe/journal/processdialog.py:228
++msgid "Journal content will be saved to"
++msgstr "El contenido del Diario se guardará en"
++
++#: ../src/jarabe/journal/processdialog.py:239
++msgid "Please wait, restoring Journal content from"
++msgstr "Espere por favor, restaurando el contenido del Diario desde"
++
++#: ../src/jarabe/journal/processdialog.py:242
++msgid "The Journal content has been restored."
++msgstr "El contenido del Diario se ha restaurado."
++
++#: ../src/jarabe/journal/processdialog.py:244
++msgid "Restore"
++msgstr "Restaurar"
++
++#: ../src/jarabe/view/palettes.py:246
++msgid "Journal content will be restored from"
++msgstr "El contenido del Diario será restaurado desde"
++
++#: ../src/jarabe/journal/processdialog.py:247
++msgid "Warning:"
++msgstr "Advertencia:"
++
++#: ../src/jarabe/journal/processdialog.py:247
++msgid "Current Journal content will be deleted!"
++msgstr "¡El contenido actual del Diario será eliminado!"
++
++#: ../src/jarabe/view/palettes.py:280
++msgid "Restore Journal"
++msgstr "Restaurar Diario"
++
++#: ../src/jarabe/view/palettes.py:290
++msgid "Backup Journal"
++msgstr "Respaldar Diario"
++
++#: ../src/jarabe/view/palettes.py:307
++msgid "School Server"
++msgstr "Servidor Escuela"
++
+ #~ msgid "Cannot obtain data needed for registration."
+ #~ msgstr "No se puede obtener datos necesarios para el registro"
+
diff --git a/rpms/sugar/cpu-and-memory-resource-indicator.patch b/rpms/sugar/cpu-and-memory-resource-indicator.patch
index fd5c477..36f5d49 100644
--- a/rpms/sugar/cpu-and-memory-resource-indicator.patch
+++ b/rpms/sugar/cpu-and-memory-resource-indicator.patch
@@ -27,7 +27,7 @@ index 8a2e765..038c059 100644
@@ -5,4 +5,5 @@ sugar_PYTHON = \
network.py \
speaker.py \
- touchpad.py \
+ touchpad.py \
- volume.py
+ volume.py \
+ resources.py
diff --git a/rpms/sugar/journal-0003-reindex-translations.patch b/rpms/sugar/journal-0003-reindex-translations.patch
index a753641..5f107fd 100644
--- a/rpms/sugar/journal-0003-reindex-translations.patch
+++ b/rpms/sugar/journal-0003-reindex-translations.patch
@@ -2,8 +2,8 @@ diff -u -r -N sugar-0.88.1.original/po/es.po sugar-0.88.1/po/es.po
--- sugar-0.88.1.original/po/es.po 2010-07-29 11:56:19.126759310 -0300
+++ sugar-0.88.1/po/es.po 2010-07-29 12:36:42.310734269 -0300
@@ -1411,6 +1411,30 @@
- msgid "View source: %r"
- msgstr "Ver código fuente: %r"
+ msgid "School Server"
+ msgstr "Servidor Escuela"
+#: ../src/jarabe/view/palettes.py:201
+msgid "Repair"
diff --git a/rpms/sugar/sl2006-touchpad-device-on-frame.patch b/rpms/sugar/sl2006-touchpad-device-on-frame.patch
index fba088d..3ec32aa 100644
--- a/rpms/sugar/sl2006-touchpad-device-on-frame.patch
+++ b/rpms/sugar/sl2006-touchpad-device-on-frame.patch
@@ -17,7 +17,7 @@ index 8a2e765..7f82a3f 100644
battery.py \
network.py \
speaker.py \
-+ touchpad.py \
++ touchpad.py \
volume.py
diff --git a/extensions/deviceicon/touchpad.py b/extensions/deviceicon/touchpad.py
new file mode 100644
diff --git a/rpms/sugar/sugar.spec b/rpms/sugar/sugar.spec
index 37fc88d..76da138 100644
--- a/rpms/sugar/sugar.spec
+++ b/rpms/sugar/sugar.spec
@@ -3,7 +3,7 @@
Summary: Constructionist learning platform
Name: sugar
Version: 0.88.1
-Release: 5.24dxo%{?dist}
+Release: 5.26dxo%{?dist}
URL: http://sugarlabs.org/
Source0: http://download.sugarlabs.org/sources/sucrose/glucose/%{name}/%{name}-%{version}.tar.bz2
@@ -49,11 +49,9 @@ Patch110: sizelist-0010-Add-ctime-property-to-the-journal-model.patch
Patch201: backup-0001-Volumes-Backup-and-Restore.patch
Patch202: backup-0002-Journal-XS-backup-and-restore.patch
#Patch203: backup-0003-Journal-documents-volume-button.patch
-#Patch204: backup-0004-es-translations.patch
Patch205: backup-0005-save-lease.patch
-Patch206: journal-0001-Processdialog-prerequisite-check-support.patch
-Patch207: journal-0002-reindex.patch
-Patch208: journal-0003-reindex-translations.patch
+Patch207: journal-0001-Processdialog-prerequisite-check-support.patch
+Patch208: journal-0002-reindex.patch
# experimental patches
Patch500: sl2006-touchpad-device-on-frame.patch
@@ -68,6 +66,19 @@ patch601: bundle-Delete-profile-data-only-when-erased.patch
patch602: caacupe-Protected-activities-list.patch
patch603: tch-Add-missing-restart-button.patch
+# Accessibility
+patch701: accessibility_0001_cp_accessibility_keyboard.patch
+patch702: accessibility_0002_magnifier_extension.patch
+patch703: accessibility_0003_cp_accessibility_contrast.patch
+patch704: accessibility_0004_cp_accessibility_mouse.patch
+patch705: accessibility_0005_cp_accessibility_capital_letters.patch
+patch706: accessibility_0006_virtualkeyboard.patch
+
+# Translations
+patch801: accessibility_0007_cp_translations.patch
+patch802: backup-translations.patch
+Patch803: journal-0003-reindex-translations.patch
+
License: GPLv2+
Group: User Interface/Desktops
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -169,7 +180,6 @@ multiple instances of sugar.
#%patch203 -p1
#%patch204 -p1
%patch205 -p1
-%patch206 -p1
%patch207 -p1
%patch208 -p1
@@ -184,6 +194,17 @@ multiple instances of sugar.
%patch602 -p1
%patch603 -p1
+%patch701 -p1
+%patch702 -p1
+%patch703 -p1
+%patch704 -p1
+%patch705 -p1
+%patch706 -p1
+
+%patch801 -p1
+%patch802 -p1
+%patch803 -p1
+
%build
autoreconf
%configure