diff options
author | Bernie Innocenti <bernie@codewiz.org> | 2010-07-30 20:24:32 (GMT) |
---|---|---|
committer | Bernie Innocenti <bernie@codewiz.org> | 2010-07-30 20:24:56 (GMT) |
commit | 04a67bf616f0517cdc65908559860c8483037c12 (patch) | |
tree | c38c69314c09aefd866986f8c7da3092066b2b6d /rpms | |
parent | ab6d7d72fceb32b0a084cd877cfb89de391b440b (diff) |
sugar: add esteban's accessibility work
Diffstat (limited to 'rpms')
-rw-r--r-- | rpms/sugar/accessibility_0001_cp_accessibility_keyboard.patch | 894 | ||||
-rw-r--r-- | rpms/sugar/accessibility_0002_magnifier_extension.patch | 110 | ||||
-rw-r--r-- | rpms/sugar/accessibility_0003_cp_accessibility_contrast.patch | 421 | ||||
-rw-r--r-- | rpms/sugar/accessibility_0004_cp_accessibility_mouse.patch | 323 | ||||
-rw-r--r-- | rpms/sugar/accessibility_0005_cp_accessibility_capital_letters.patch | 140 | ||||
-rw-r--r-- | rpms/sugar/accessibility_0006_virtualkeyboard.patch | 2215 | ||||
-rw-r--r-- | rpms/sugar/accessibility_0007_cp_translations.patch | 78 | ||||
-rw-r--r-- | rpms/sugar/backup-0004-es-translations.patch | 1559 | ||||
-rwxr-xr-x | rpms/sugar/backup-translations.patch | 78 | ||||
-rw-r--r-- | rpms/sugar/cpu-and-memory-resource-indicator.patch | 2 | ||||
-rw-r--r-- | rpms/sugar/journal-0003-reindex-translations.patch | 4 | ||||
-rw-r--r-- | rpms/sugar/sl2006-touchpad-device-on-frame.patch | 2 | ||||
-rw-r--r-- | rpms/sugar/sugar.spec | 33 |
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 |