Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/rpms
diff options
context:
space:
mode:
authorBernie Innocenti <bernie@codewiz.org>2010-07-29 15:55:47 (GMT)
committer Bernie Innocenti <bernie@codewiz.org>2010-07-29 15:55:47 (GMT)
commit67f5a8185d878bd0fc8e83aa9150ed02bf745924 (patch)
tree433a9869091624d4e8237639f1d783c8fe004e46 /rpms
parent028da6dd8bc6a0375498b51278f874a9cb7691c0 (diff)
Add all pending Sugar patches
Diffstat (limited to 'rpms')
-rw-r--r--rpms/sugar-artwork/revert-to-GTK_WIDGET_IS_SENSITIVE.patch29
-rw-r--r--rpms/sugar-artwork/sizelist-0001-add-icons-for-the-sorting-options-in-the-Journal.patch113
-rw-r--r--rpms/sugar-artwork/sl2006-icons-for-touchpad-panel.patch84
-rw-r--r--rpms/sugar-artwork/sugar-artwork-gtkdep.patch25
-rw-r--r--rpms/sugar-artwork/sugar-artwork.spec448
-rw-r--r--rpms/sugar-datastore/sizelist-0000-cover-letter.patch43
-rw-r--r--rpms/sugar-datastore/sizelist-0001-Add-filesize-property-to-the-index.patch98
-rw-r--r--rpms/sugar-datastore/sizelist-0002-Add-migration-code-from-DS-v0-for-the-filesize-prope.patch48
-rw-r--r--rpms/sugar-datastore/sizelist-0003-Check-filesize-property-on-index-rebuild.patch41
-rw-r--r--rpms/sugar-datastore/sizelist-0004-Add-ctime-property-to-the-index-and-datastore.patch83
-rw-r--r--rpms/sugar-datastore/sizelist-0005-Check-ctime-on-index-rebuild.patch35
-rw-r--r--rpms/sugar-datastore/sizelist-0006-Implement-migration-from-DS-v0-for-ctime-property.patch34
-rw-r--r--rpms/sugar-datastore/sizelist-0007-Increment-CURRENT_LAYOUT_VERSION-to-trigger-an-index.patch33
-rw-r--r--rpms/sugar-datastore/sugar-datastore.spec342
-rw-r--r--rpms/sugar-toolkit/change-keep-string-to-keep-a-copy.patch26
-rw-r--r--rpms/sugar-toolkit/fix-two-trivial-shell-log-warnings.patch93
-rw-r--r--rpms/sugar-toolkit/kill-the-delayed-menus-for-good.patch114
-rw-r--r--rpms/sugar-toolkit/remove-incomplete-MANIFEST-support.patch255
-rw-r--r--rpms/sugar-toolkit/set-default-accelerators-for-Copy-and-Paste-buttons.patch34
-rw-r--r--rpms/sugar-toolkit/sl1842-notify-red-alert.patch74
-rw-r--r--rpms/sugar-toolkit/sl1876.patch16
-rw-r--r--rpms/sugar-toolkit/sl1948-Race-condition-with-name-widget-in-the-activ.patch68
-rw-r--r--rpms/sugar-toolkit/sugar-toolkit-dont-configure-fonts.patch16
-rw-r--r--rpms/sugar-toolkit/sugar-toolkit.spec436
-rw-r--r--rpms/sugar-toolkit/use-set_toolbar_box-in-example-code.patch30
-rw-r--r--rpms/sugar/add-font-dpi-schema.patch45
-rw-r--r--rpms/sugar/avoid-popping-an-empty-list-in-the-software-updater.patch36
-rw-r--r--rpms/sugar/backup-0001-Volumes-Backup-and-Restore.patch705
-rw-r--r--rpms/sugar/backup-0002-Journal-XS-backup-and-restore.patch209
-rw-r--r--rpms/sugar/backup-0003-Journal-documents-volume-button.patch74
-rw-r--r--rpms/sugar/backup-0004-es-translations.patch1559
-rw-r--r--rpms/sugar/backup-0005-save-lease.patch38
-rw-r--r--rpms/sugar/bundle-Delete-profile-data-only-when-erased.patch52
-rw-r--r--rpms/sugar/caacupe-Protected-activities-list.patch123
-rw-r--r--rpms/sugar/click-on-journal-icons-with-a-exclusive-time-frame.patch62
-rw-r--r--rpms/sugar/cpu-and-memory-resource-indicator.patch258
-rw-r--r--rpms/sugar/dynamically-set-number-of-control-panel-columns.patch96
-rw-r--r--rpms/sugar/fix-duplication-of-OLPC-mesh-icons.patch80
-rw-r--r--rpms/sugar/fix-for-file-list-sorting-for-FAT32-formatted-flash-drives-in-journal.patch89
-rw-r--r--rpms/sugar/fix-name-clash-set_state.patch101
-rw-r--r--rpms/sugar/gsm-errors-palette.patch540
-rw-r--r--rpms/sugar/jasg-register-rename.patch62
-rw-r--r--rpms/sugar/pe558-add-option-to-mount-any-user-directory-to-journal.patch140
-rw-r--r--rpms/sugar/pe558-backup-restore-front-end-for-control-panel.patch588
-rw-r--r--rpms/sugar/pe558-journal-management-control-panel-feature.patch465
-rw-r--r--rpms/sugar/pe558-modify-volumnestoolbar-to-mount-a-directory.patch160
-rw-r--r--rpms/sugar/reverse-sort-order-of-activities-list.patch53
-rw-r--r--rpms/sugar/set-default-scaling-to-100.patch11
-rw-r--r--rpms/sugar/simplify-the-definition-of-UpdateModel._bundles_to_check..patch37
-rw-r--r--rpms/sugar/sizelist-0000-cover-letter.patch42
-rw-r--r--rpms/sugar/sizelist-0001-Journal-Retrieve-filesize-from-the-datastore.patch39
-rw-r--r--rpms/sugar/sizelist-0002-Add-a-filesize-column-to-the-journal-list-model.patch63
-rw-r--r--rpms/sugar/sizelist-0003-Journaltoolbox-Add-add_separator-method-for-convenie.patch42
-rw-r--r--rpms/sugar/sizelist-0004-Add-a-ListViewButton-to-the-journal-search-toolbar.patch135
-rw-r--r--rpms/sugar/sizelist-0005-Rename-the-date-column-to-sort_column.patch68
-rw-r--r--rpms/sugar/sizelist-0006-Display-the-sorting-property-in-the-last-column.patch46
-rw-r--r--rpms/sugar/sizelist-0007-Expandedentry-Try-to-use-the-filesize-property.patch37
-rw-r--r--rpms/sugar/sizelist-0008-Implement-sorting-for-removable-devices.patch82
-rw-r--r--rpms/sugar/sizelist-0009-Add-sort-by-creation-time-option-to-the-ListViewButt.patch32
-rw-r--r--rpms/sugar/sizelist-0010-Add-ctime-property-to-the-journal-model.patch95
-rw-r--r--rpms/sugar/sl1842-journal-show-error-on-write-failure.patch123
-rw-r--r--rpms/sugar/sl2006-file-exists-check.patch26
-rw-r--r--rpms/sugar/sl2006-touchpad-section-for-control-panel.patch404
-rw-r--r--rpms/sugar/sl2062.patch21
-rw-r--r--rpms/sugar/sl2064-always-listen-for-NameOwnerChanged-DBus-message.patch33
-rw-r--r--rpms/sugar/sugar-enable-settings-manager.patch13
-rw-r--r--rpms/sugar/sugar.spec1619
-rw-r--r--rpms/sugar/tch-Add-missing-restart-button.patch29
-rw-r--r--rpms/sugar/use-the-spanish-verb-quitar-for-unmounting-devices.patch37
69 files changed, 11187 insertions, 0 deletions
diff --git a/rpms/sugar-artwork/revert-to-GTK_WIDGET_IS_SENSITIVE.patch b/rpms/sugar-artwork/revert-to-GTK_WIDGET_IS_SENSITIVE.patch
new file mode 100644
index 0000000..882b785
--- /dev/null
+++ b/rpms/sugar-artwork/revert-to-GTK_WIDGET_IS_SENSITIVE.patch
@@ -0,0 +1,29 @@
+--- sugar-artwork-0.88.1/gtk/engine/sugar-style.c.orig 2010-07-01 07:42:50.000000000 -0400
++++ sugar-artwork-0.88.1/gtk/engine/sugar-style.c 2010-07-01 07:43:49.000000000 -0400
+@@ -444,7 +444,7 @@ sugar_style_draw_box (GtkStyle *st
+
+ sugar_fill_generic_info (&info, style, state_type, shadow_type, widget, detail, x, y, width, height);
+
+- if (widget && !gtk_widget_is_sensitive (widget))
++ if (widget && !GTK_WIDGET_IS_SENSITIVE (widget))
+ info.state = GTK_STATE_INSENSITIVE;
+
+ /* Needed because the trough and bar are cached in a buffer inside GtkProgress. */
+@@ -458,7 +458,7 @@ sugar_style_draw_box (GtkStyle *st
+
+ sugar_fill_generic_info (&info, style, state_type, shadow_type, widget, detail, x, y, width, height);
+
+- if (widget && !gtk_widget_is_sensitive (widget))
++ if (widget && !GTK_WIDGET_IS_SENSITIVE (widget))
+ info.state = GTK_STATE_INSENSITIVE;
+
+ if (widget && GTK_IS_PROGRESS_BAR (widget)) {
+@@ -641,7 +641,7 @@ sugar_style_draw_shadow (GtkStyle
+ if (widget && GTK_WIDGET_HAS_FOCUS (widget)) {
+ info.state = GTK_STATE_ACTIVE;
+ }
+- if (widget && !gtk_widget_is_sensitive (widget)) {
++ if (widget && !GTK_WIDGET_IS_SENSITIVE (widget)) {
+ info.state = GTK_STATE_INSENSITIVE;
+ }
+
diff --git a/rpms/sugar-artwork/sizelist-0001-add-icons-for-the-sorting-options-in-the-Journal.patch b/rpms/sugar-artwork/sizelist-0001-add-icons-for-the-sorting-options-in-the-Journal.patch
new file mode 100644
index 0000000..d59067b
--- /dev/null
+++ b/rpms/sugar-artwork/sizelist-0001-add-icons-for-the-sorting-options-in-the-Journal.patch
@@ -0,0 +1,113 @@
+From 9df080ca84bf63c39daaa8074bf6e1d1116b3cbf Mon Sep 17 00:00:00 2001
+Message-Id: <9df080ca84bf63c39daaa8074bf6e1d1116b3cbf.1274926564.git.andresambrois@gmail.com>
+From: =?utf-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Wed, 26 May 2010 23:15:21 -0300
+Subject: [PATCH] Add icons for the sorting options in the Journal
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+Thanks to Gary C. Martin for the icons.
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ icons/scalable/actions/Makefile.am | 3 +++
+ icons/scalable/actions/view-created.svg | 21 +++++++++++++++++++++
+ icons/scalable/actions/view-lastedit.svg | 23 +++++++++++++++++++++++
+ icons/scalable/actions/view-size.svg | 12 ++++++++++++
+ 4 files changed, 59 insertions(+), 0 deletions(-)
+ create mode 100644 icons/scalable/actions/view-created.svg
+ create mode 100644 icons/scalable/actions/view-lastedit.svg
+ create mode 100644 icons/scalable/actions/view-size.svg
+
+diff --git a/icons/scalable/actions/Makefile.am b/icons/scalable/actions/Makefile.am
+index 42a06a3..a00a2df 100644
+--- a/icons/scalable/actions/Makefile.am
++++ b/icons/scalable/actions/Makefile.am
+@@ -94,6 +94,9 @@ icon_DATA = \
+ view-freeform.svg \
+ view-fullscreen.svg \
+ view-list.svg \
++ view-size.svg \
++ view-lastedit.svg \
++ view-created.svg \
+ view-radial.svg \
+ view-refresh.svg \
+ view-return.svg \
+diff --git a/icons/scalable/actions/view-created.svg b/icons/scalable/actions/view-created.svg
+new file mode 100644
+index 0000000..7d3ba09
+--- /dev/null
++++ b/icons/scalable/actions/view-created.svg
+@@ -0,0 +1,21 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
++ <!ENTITY fill_color "#000000">
++ <!ENTITY stroke_color "#FFFFFF">
++]>
++<svg xmlns="http://www.w3.org/2000/svg" width="55" height="55">
++ <defs>
++ <mask id="Mask" maskUnits="userSpaceOnUse" x="0" y="0" width="55" height="55">
++ <rect x="0" y="0" width="55" height="55" fill="#FFFFFF" stroke="none"/>
++ <circle cx="27.5" cy="15" r="1.75" style="fill:#000000;;stroke:none"/>
++ <circle cx="27.5" cy="40" r="1.75" style="fill:#000000;;stroke:none"/>
++ <circle cx="15" cy="27.5" r="1.75" style="fill:#000000;;stroke:none"/>
++ <circle cx="40" cy="27.5" r="1.75" style="fill:#000000;;stroke:none"/>
++ <line x1="27.5" y1="27.5" x2="34.5" y2="17" stroke="#000000" stroke-width="2.5" stroke-linecap="round"/>
++ <line x1="27.5" y1="27.5" x2="35" y2="32.5" stroke="#000000" stroke-width="2.5" stroke-linecap="round"/>
++ </mask>
++ </defs>
++ <circle cx="27.5" cy="27.5" r="17" style="fill:&stroke_color;;stroke:&stroke_color;;stroke-width:3.5" mask="url(#Mask)"/>
++ <!--
++ -->
++</svg>
+diff --git a/icons/scalable/actions/view-lastedit.svg b/icons/scalable/actions/view-lastedit.svg
+new file mode 100644
+index 0000000..fe3e077
+--- /dev/null
++++ b/icons/scalable/actions/view-lastedit.svg
+@@ -0,0 +1,23 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
++ <!ENTITY fill_color "#000000">
++ <!ENTITY stroke_color "#FFFFFF">
++]>
++<svg xmlns="http://www.w3.org/2000/svg" width="55" height="55">
++ <defs>
++ <mask id="Mask" maskUnits="userSpaceOnUse" x="0" y="0" width="55" height="55">
++ <rect x="0" y="0" width="55" height="55" fill="#FFFFFF" stroke="none"/>
++ <line x1="19" y1="19" x2="27" y2="19" stroke="#000000" stroke-width="2.5"/>
++ <line x1="28" y1="19" x2="31" y2="19" stroke="#000000" stroke-width="2.5"/>
++ <line x1="19" y1="24" x2="21" y2="24" stroke="#000000" stroke-width="2.5"/>
++ <line x1="22" y1="24" x2="26" y2="24" stroke="#000000" stroke-width="2.5"/>
++ <line x1="19" y1="29" x2="22" y2="29" stroke="#000000" stroke-width="2.5"/>
++ <path d="M 24 35 l 2 -6 l 19 -19 l 4 3 l -19 19 z" fill="#000000" stroke="#000000" stroke-width="3"/>
++ </mask>
++ </defs>
++ <rect x="15" y="14" width="25" height="27" style="fill:&stroke_color;;stroke:&stroke_color;;stroke-width:3.5" mask="url(#Mask)"/>
++ <path d="M 24 35 l 1 -5 l 4 3 z" fill="&stroke_color;" stroke="none"/>
++ <path d="M 24 35 m 2 -6 l 19 -19 l 4 3 l -19 19 z" fill="&stroke_color;" stroke="none"/>
++ <!--
++ -->
++</svg>
+diff --git a/icons/scalable/actions/view-size.svg b/icons/scalable/actions/view-size.svg
+new file mode 100644
+index 0000000..e87f978
+--- /dev/null
++++ b/icons/scalable/actions/view-size.svg
+@@ -0,0 +1,12 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
++ <!ENTITY fill_color "#000000">
++ <!ENTITY stroke_color "#FFFFFF">
++]>
++<svg xmlns="http://www.w3.org/2000/svg" width="55" height="55">
++ <line x1="12" y1="17.5" x2="43" y2="17.5" stroke="&stroke_color;" stroke-width="2.5"/>
++ <line x1="16" y1="22.5" x2="39" y2="22.5" stroke="&stroke_color;" stroke-width="2.5"/>
++ <line x1="20" y1="27.5" x2="35" y2="27.5" stroke="&stroke_color;" stroke-width="2.5"/>
++ <line x1="23.5" y1="32.5" x2="31.5" y2="32.5" stroke="&stroke_color;" stroke-width="2.5"/>
++ <line x1="28.5" y1="37.5" x2="26.5" y2="37.5" stroke="&stroke_color;" stroke-width="2.5"/>
++</svg>
+--
+1.6.3.3
+
diff --git a/rpms/sugar-artwork/sl2006-icons-for-touchpad-panel.patch b/rpms/sugar-artwork/sl2006-icons-for-touchpad-panel.patch
new file mode 100644
index 0000000..93da715
--- /dev/null
+++ b/rpms/sugar-artwork/sl2006-icons-for-touchpad-panel.patch
@@ -0,0 +1,84 @@
+From 582755ecf47bb044e3e9b9e42c50ebe6406f9534 Mon Sep 17 00:00:00 2001
+From: Walter Bender <walter@sugarlabs.org>
+Date: Wed, 19 May 2010 08:25:29 -0400
+Subject: [PATCH] icons for touchpad panel
+
+---
+ icons/scalable/device/capacitive.svg | 18 ++++++++++++++++++
+ icons/scalable/device/resistive.svg | 21 +++++++++++++++++++++
+ 2 files changed, 39 insertions(+), 0 deletions(-)
+ create mode 100644 icons/scalable/device/capacitive.svg
+ create mode 100644 icons/scalable/device/resistive.svg
+
+--- sugar-artwork-0.88.0/icons/scalable/device/Makefile.am.orig 2010-05-20 03:35:54.000000000 -0400
++++ sugar-artwork-0.88.0/icons/scalable/device/Makefile.am 2010-05-20 03:36:22.000000000 -0400
+@@ -38,6 +38,7 @@ icon_DATA = \
+ battery-charging-100.svg \
+ camera-external.svg \
+ camera.svg \
++ capacitive.svg \
+ computer.svg \
+ computer-xo.svg \
+ drive.svg \
+@@ -77,6 +78,7 @@ icon_DATA = \
+ network-wireless-connected-100.svg \
+ network-wireless-connected-100.icon \
+ printer.svg \
++ resistive.svg \
+ speaker-000.svg \
+ speaker-033.svg \
+ speaker-066.svg \
+diff --git a/icons/scalable/device/capacitive.svg b/icons/scalable/device/capacitive.svg
+new file mode 100644
+index 0000000..e223b66
+--- /dev/null
++++ b/icons/scalable/device/capacitive.svg
+@@ -0,0 +1,18 @@
++<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
++ <!ENTITY stroke_color "#010101">
++ <!ENTITY fill_color "#ffffff">
++]><svg enable-background="new 0 0 55 55" height="55px" id="Layer_1" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px">
++<g
++ transform="translate(0,-15.65)">
++<path
++ d="m 2.934,28.664 0,18.209 49.391,0 0,-18.209 -49.391,0 z M 36,45.833 l -17,0 0,-16.129 17,0 0,16.129 z"
++ fill="&fill_color;"
++ stroke="&stroke_color;"
++ style="stroke-width:2" />
++</g>
++<path
++ d="m 22.817123,49.135003 c 0,0 -3.23492,-8.766448 -3.243008,-9.837791 -0.0135,-1.797291 -2.398098,-2.342156 -2.398098,-2.342156 0,0 -0.621319,-2.249376 0,-2.770053 0.656117,-0.549837 2.934483,-0.629824 3.735004,0.330634 l 2.413094,2.895211 0,-12.75 c 0,0 0.888891,-1.589214 1.643962,-1.454545 0.745806,0.133019 1.356038,1.454545 1.356038,1.454545 l 0,10.5 0,-4.5 c 0,0 0.947828,-0.746067 1.5,-0.75 0.552172,-0.0039 1.5,0.75 1.5,0.75 l 0,4.5 0,-3.75 c 0,0 0.675747,-0.758712 1.5,-0.75 0.824253,0.0087 1.5,0.568182 1.5,0.568182 l 0,3.931818 0,-3 c 0,0 0.857274,-0.33549 1.5,-0.375 0.526597,-0.03237 1.448303,0.97351 1.5,1.575 0.220672,2.567514 0.969363,5.350927 0.823983,7.574377 -0.100086,1.53071 -0.67874,8.199778 -2.212713,8.199778 l -11.118262,0 z"
++ fill="&fill_color;"
++ stroke="&stroke_color;"
++ style="stroke-width:1.5;" />
++</svg>
+diff --git a/icons/scalable/device/resistive.svg b/icons/scalable/device/resistive.svg
+new file mode 100644
+index 0000000..3eb8cb4
+--- /dev/null
++++ b/icons/scalable/device/resistive.svg
+@@ -0,0 +1,21 @@
++<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
++ <!ENTITY stroke_color "#010101">
++ <!ENTITY fill_color "#ffffff">
++]><svg enable-background="new 0 0 55 55" height="55px" id="Layer_1" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px">
++<g
++ transform="translate(0,-15.6)">
++<path
++ d="m 2.934,28.664 0,18.209 49.391,0 0,-18.209 -49.391,0 z"
++ fill="&fill_color;"
++ stroke="&stroke_color;"
++ style="stroke-width:2" />
++</g><path
++ d="m 10.113335,17.999995 c 4.481574,10.248626 12.299223,4.823443 18.006668,1.48 3.636065,-2.130021 10.421669,1.48 10.421669,1.48"
++ fill="none"
++ stroke="&stroke_color;"
++ style="stroke-width:2;stroke-linecap:round" /><path
++ d="m 46.742465,8.1381941 -5.095999,6.7474989 -1.044001,1.3585 -1.7375,4.133 c -0.023,0.052 -0.009,0.1115 0.0345,0.1475 0.0445,0.036 0.1055,0.042 0.1535,0.01 l 3.913,-2.5185 c 0.0055,-0.004 0.0055,-0.0135 0.011,-0.0215 0.0325,-0.0245 0.071,-0.046 0.098,-0.081 0.0015,-10e-4 0.017,-0.0205 0.017,-0.0245 l 0.9155,-1.1355 2.7345,-3.527 4.005501,-5.1644989 c 0.011,-0.0115 0.0745,-0.1015 0.0745,-0.1015 0.048,-0.0805 0.074,-0.1725 0.074,-0.278 0,-0.0305 0,-0.059 -0.006,-0.088 -0.0435,-0.3815 -0.357501,-0.841 -0.819501,-1.2065 -0.4615,-0.364 -0.9845,-0.5615 -1.364,-0.517 -0.163,0.021 -0.3945,0.1875 -0.3945,0.1875 l -1.5695,2.0795 z"
++ fill="&fill_color;"
++ stroke="&stroke_color;"
++ style="stroke-width:1.5" />
++</svg>
+--
+1.7.0.4
+
diff --git a/rpms/sugar-artwork/sugar-artwork-gtkdep.patch b/rpms/sugar-artwork/sugar-artwork-gtkdep.patch
new file mode 100644
index 0000000..ba69ee6
--- /dev/null
+++ b/rpms/sugar-artwork/sugar-artwork-gtkdep.patch
@@ -0,0 +1,25 @@
+From ac029997d30ed0e76b319d0ccadb058e21f4d054 Mon Sep 17 00:00:00 2001
+From: Benjamin Berg <benjamin@sipsolutions.net>
+Date: Thu, 6 May 2010 19:13:51 +0200
+Subject: [PATCH 1/2] Revert 5d88c89 and instead disable the just remove time flags. #1899
+Organization: Sugar Labs Foundation
+X-Subversion: sucks
+
+---
+ gtk/engine/Makefile.am | 3 ---
+ gtk/engine/sugar-info.c | 2 +-
+ gtk/engine/sugar-style.c | 6 +++---
+ 3 files changed, 4 insertions(+), 7 deletions(-)
+
+diff --git a/gtk/engine/Makefile.am b/gtk/engine/Makefile.am
+index eb720ff..d23508a 100644
+--- a/gtk/engine/Makefile.am
++++ b/gtk/engine/Makefile.am
+@@ -1,7 +1,4 @@
+ INCLUDES = \
+- -DGTK_DISABLE_DEPRECATED \
+- -DGDK_DISABLE_DEPRECATED \
+- -DG_DISABLE_DEPRECATED \
+ $(ENGINE_CFLAGS) $(WARN_CFLAGS)
+
+ enginedir = $(libdir)/gtk-2.0/$(GTK_VERSION)/engines
diff --git a/rpms/sugar-artwork/sugar-artwork.spec b/rpms/sugar-artwork/sugar-artwork.spec
new file mode 100644
index 0000000..b7062e5
--- /dev/null
+++ b/rpms/sugar-artwork/sugar-artwork.spec
@@ -0,0 +1,448 @@
+Summary: Artwork for Sugar look-and-feel
+Name: sugar-artwork
+Version: 0.88.1
+Release: 1.3bernie%{?dist}
+URL: http://sugarlabs.org
+Group: User Interface/Desktops
+License: LGPLv2+
+Source0: http://download.sugarlabs.org/sources/sucrose/glucose/%{name}/%{name}-%{version}.tar.bz2
+
+# Bugfixes
+Patch1: revert-to-GTK_WIDGET_IS_SENSITIVE.patch
+
+# Experimental patches
+Patch101: sl2006-icons-for-touchpad-panel.patch
+Patch102: sizelist-0001-add-icons-for-the-sorting-options-in-the-Journal.patch
+
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+BuildRequires: gtk2-devel >= 2.9.0
+BuildRequires: xorg-x11-apps
+BuildRequires: perl-XML-Parser
+BuildRequires: python
+BuildRequires: icon-naming-utils
+BuildRequires: icon-slicer
+
+Requires: gtk2 >= 2.9.0
+
+%description
+sugar-artwork contains the themes and icons that make up the OLPC default
+look and feel.
+
+%prep
+%setup -q
+%patch1 -p1
+%patch101 -p1
+%patch102 -p1
+
+%build
+autoreconf
+%configure
+make %{?_smp_mflags}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make DESTDIR=$RPM_BUILD_ROOT install
+
+rm -f $RPM_BUILD_ROOT%{_libdir}/gtk-2.0/*/engines/*.la
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post
+touch --no-create %{_datadir}/icons/sugar || :
+%{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/sugar || :
+
+%postun
+touch --no-create %{_datadir}/icons/sugar || :
+%{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/sugar || :
+
+%files
+%defattr(-,root,root)
+%doc README COPYING
+
+%{_datadir}/icons/sugar
+%{_datadir}/themes/sugar-100/gtk-2.0/gtkrc
+%{_datadir}/themes/sugar-72/gtk-2.0/gtkrc
+%{_libdir}/gtk-2.0/*/engines/*.so
+
+%changelog
+* Thu Jun 3 2010 Peter Robinson <pbrobinson@gmail.com> - 0.88.1-1
+- New upstream stable 0.88.1 release
+
+* Tue Apr 13 2010 Peter Robinson <pbrobinson@gmail.com> - 0.88.0-2
+- Add patch for deprecated gtk functions to fix borked sugar
+
+* Tue Mar 20 2010 Peter Robinson <pbrobinson@gmail.com> - 0.88.0-1
+- New upstream stable 0.88.0 release
+
+* Wed Mar 10 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.3-1
+- New upstream release
+
+* Fri Feb 12 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.2-1
+- New upstream release
+
+* Sat Dec 05 2009 Mathieu Bridon <bochecha@fedoraproject.org> - 0.87.1-1
+- New upstream release
+
+* Thu Sep 24 2009 Mathieu Bridon <bochecha@fedoraproject.org> - 0.86.0-1
+- New upstream release
+
+* Fri Sep 18 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.4-2
+- Upload sources
+
+* Fri Sep 18 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.4-1
+- New upstream release
+
+* Fri Sep 11 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.3-1
+- New upstream release
+
+* Fri Jul 31 2009 Mathieu Bridon (bochecha) <bochecha@fedoraproject.org> - 0.85.2-1
+- New upstream release
+
+* Sun Jul 26 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.85.1-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Sat Jul 18 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.1-2
+- Remove matchbox theme dir
+
+* Sat Jul 18 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.1-1
+- New upstream release
+
+* Wed Apr 08 2009 Simon Schampijer <simon@schampijer.de> - 0.84.1-3
+- Another rebuild for icon-slicer-0.3-12
+
+* Wed Apr 08 2009 Simon Schampijer <simon@schampijer.de> - 0.84.1-2
+- Rebuild for icon-slicer-0.3-12
+
+* Wed Mar 11 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.84.1-1
+- Add back some icons to the Makefile (Simon)
+
+* Tue Mar 03 2009 Simon Schampijer <simon@schampijer.de> - 0.84.0-1
+- Rebuild for 0.84
+
+* Wed Feb 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.83.5-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Mon Feb 23 2009 Simon Schampijer <simon@schampijer.de> - 0.83.5-1
+- Icon for a generic document, part of #360
+- Add view source icon
+
+* Mon Feb 16 2009 Simon Schampijer <simon@schampijer.de> - 0.83.4-1
+- Add documend-send icon (Gary C Martin) #227
+- Add application-x-generic as a copy of application-octet-stream #13
+- Add icons drive-harddisk and drive
+
+* Fri Feb 06 2009 Simon Schampijer <simon@schampijer.de> - 0.83.3-2.20090206giteb39d7b3b2b
+- Add documend-send icon (Gary C Martin) #227
+- Add application-x-generic as a copy of application-octet-stream #13
+- Add icons drive-harddisk and drive
+
+* Tue Jan 20 2009 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.3-1
+- add activity-journal icon to artwork
+- add system-logout icon (part of #207)
+- add everything needed for the colorpicker. That is a small icon and a bit in the gtkrc.
+- fix triangular arrows by looking at the parent_bg_color option
+- add icons for object transfers
+
+* Sun Jan 04 2009 Simon Schampijer <simon@laptop.org> - 0.83.2-1
+- New icon for the wired network
+
+* Tue Nov 4 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.1-1
+- Update to 0.83.1
+
+* Tue Sep 23 2008 Simon Schampijer <simon@laptop.org> - 0.82.3-1
+- Fix corrupted network-wireless-060.svg
+
+* Sat Sep 20 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.2-1
+- #7685 Alternate home layouts; fixed ring scaling; better modularization of layouts
+- #8554 Indicate connected AP in Neighborhood view.
+- #8198 Use a plainer "wrench" for the Settings icon
+- #7987 Home view XO icon palette for Control Panel has wrong icon
+
+* Sat Sep 6 2008 Tom "spot" Callaway <tcallawa@redhat.com> - 0.82.1-2
+- fix license tag
+
+* Thu Aug 28 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.1-1
+- #4312 need volume button icons for totem player
+- #7939 Missing stock icons
+
+* Thu Aug 07 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.0-1
+- 7641 Install GTK compatibility symlinks using icon-naming-utils package
+
+* Wed Jul 09 2008 Simon Schampijer <simon@laptop.org> - 0.81.6-2.20080709gitc77b345c02
+- git snapshot
+- 7385 Add view-freeform icon (eben)
+
+* Sat Jun 21 2008 Tomeu Vizoso <tomeu@tomeuvizoso.net> - 0.81.1
+- Some improvements to the gtk theme (benzea)
+
+* Fri Jun 13 2008 Simon Schampijer <simon@laptop.org> - 0.79.3-1
+- Update to 0.79.3
+
+* Wed Apr 09 2008 Tomeu Vizoso <tomeu@tomeuvizoso.net> - 0.79.2
+- Misc. icon fixes.
+
+* Thu Apr 03 2008 Simon Schampijer <simon@laptop.org> - 0.79.1
+- Frame/Home redesign - Put corner stone
+
+* Sat Feb 9 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.79.0-1
+- Update to 0.79.0
+
+* Fri Nov 02 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.33.20071102git0763fefc48
+- #4610 Prevent a division by zero while making icons insensitive. (benzea)
+
+* Fri Nov 02 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.32.20071102git9bc8be4d48
+- #4568 Implement a better effect for insensitive icons [may need more tweaking] (benzea)
+- Added tray-hide/show icons (eben)
+- Added a zoom-original button for returning to actual size (eben)
+- Updated the full media button set to the new design spec (eben)
+- Added fullscreen (and return) buttons (eben)
+- #4595 Fixed the "wiggle" in the busy cursor (eben)
+
+* Fri Oct 19 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.31.20071019git811b41812a
+- New snapshot
+
+* Tue Oct 9 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.30.20071009git91d9239340
+- New snapshot
+
+* Sun Oct 7 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.29.20071007git9b93ff3a3f
+- New snapshot
+
+* Fri Sep 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.28.20070914git2aac89b4fe
+- New snapshot
+
+* Wed Sep 12 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.26.20070912gite4fd20770c
+- New snapshot
+
+* Sun Sep 9 2007 Dan Williams <dcbw@redhat.com> - 0.34-0.25.20070909git2e13ad392d
+- New snapshot
+
+* Thu Sep 6 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.24.20070906gitf89f6e00cc
+- New snapshot
+
+* Thu Aug 30 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.23.20070830gitd2120f79b7
+- New snapshot
+
+* Wed Aug 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.21.20070829git60139d01c3
+- New snapshot
+
+* Tue Aug 28 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.20.20070827git931d3dee31
+- New snapshot
+
+* Wed Aug 22 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.19.20070822git8de1d5be84
+- New snapshot
+
+* Mon Aug 20 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.18.20070820git81695a321f
+- New snapshot
+
+* Tue Aug 14 2007 John (J5) Palmieri <johnp@redhat.com> - 0.34-0.15.20070814gitb0228a578f
+- New snapshot
+
+* Fri Jul 27 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.15.20070727git359c47de2c
+- New snapshot
+
+* Wed Jul 25 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.14.20070725git37744886a7
+- New snapshot
+
+* Tue Jul 24 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.13.20070724git3368046fdc
+- New snapshot
+
+* Sat Jul 21 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.12.20070721gitb4d5062514
+- New snapshot
+
+* Thu Jul 19 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.11.20070719gitf662ad4507
+- New snapshot
+
+* Wed Jul 18 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.10.20070718giteb3ffd0171
+- New snapshot
+
+* Tue Jul 17 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.9.20070716gita0c7965b7b
+- New snapshot
+
+* Mon Jul 16 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.8.20070715git7724264dab
+- New snapshot
+
+* Fri Jul 13 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.7.20070713git454a63a3f0
+- New snapshot
+
+* Wed Jul 11 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.6.20070711git4d612c6644
+- New snapshot
+
+* Fri Jul 6 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.5.20070705gitaddbcacbc5
+- Several new icons for network and journal
+
+* Fri Jun 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.4.20070629git13fafab42e
+- Minor tweaks to the controls style.
+
+* Thu Jun 28 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.3.20070628git6c74e162ca
+- New snapshot
+
+* Tue Jun 26 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-0.2.20070626gitc788870202
+- New snapshot
+
+* Sat Jun 16 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.33-3.git5aef11739b
+- Spec cleanups, patch by ivazqueznet@gmail.com
+- Rename to sugar-artwork
+
+* Thu Jun 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.33-3.git5640efb030
+- Fix comboboxes on the toolbars
+
+* Mon Jun 4 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.33-2.gitc3d3dce71b
+- New snapshot
+
+* Mon May 28 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.20.20070528git
+- More work on the gtk theme
+
+* Wed May 16 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.19.20070516git
+- Add icon for call
+
+* Mon May 14 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.17.20070514git
+- More work on the theme
+
+* Thu May 11 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.16.20070511git
+- Fix cursors
+
+* Thu May 11 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.15.20070511git
+- Better gtk theme
+
+* Thu May 10 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.14.20070510git
+- New snapshot
+
+* Thu Mar 29 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.12.20070329git
+- Add an icon for the mesh device
+
+* Thu Mar 22 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.11.20070322git
+- Remove conflict with redhat-artwork
+
+* Wed Mar 21 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.10.20070321git
+- Fix italic icon
+
+* Tue Mar 20 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.9.20070320git
+- New icons for the write activity
+
+* Mon Mar 19 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.8.20070319git
+- More matchbox theme fixes
+
+* Mon Mar 19 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.7.20070319git
+- Fix matchbox font size
+
+* Thu Mar 15 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.6.20070315git
+- Fix font an icons size
+
+* Wed Mar 7 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.5.20070307git
+- Put back the gtk theme
+
+* Fri Mar 2 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.4.20070302git
+- Update snapshot
+
+* Wed Feb 28 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.3.20070228git
+- Update snapshot
+
+* Wed Feb 28 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.2.20070228git
+- Update snapshot
+
+* Sat Feb 24 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-2.1.20070224git
+- Update to 2.1.20070224git
+
+* Wed Feb 8 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.33-1
+- Update to 0.33
+
+* Wed Jan 31 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.32-1
+- Update to 0.32
+
+* Mon Jan 29 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.31-1
+- Update to 0.31
+
+* Tue Jan 16 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.30-1
+- Update to 0.30
+
+* Wed Jan 11 2007 Marco Pesenti Gritti <mpg@redhat.com> 0.29-1
+- Update to 0.29
+
+* Tue Dec 19 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.28-1
+- Update to 0.28
+
+* Tue Dec 19 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.27-1
+- Update to 0.27
+
+* Fri Nov 17 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.26-1
+- Update 0.26
+
+* Thu Nov 9 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.25-1
+- Update to 0.25
+
+* Wed Nov 8 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.24-1
+- Update to 0.24
+
+* Sat Nov 4 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.23-1
+- Update to 0.23
+
+* Fri Nov 3 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.22-1
+- Update to 0.22
+
+* Mon Oct 30 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.21-1
+- Update to 0.21
+
+* Wed Oct 25 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.20-1
+- Update to 0.20
+
+* Tue Oct 24 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.19-1
+- Update to 0.19
+
+* Fri Oct 20 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.18-1
+- Update to 0.18
+
+* Thu Oct 19 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.17-1
+- Update to 0.17
+
+* Wed Oct 18 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.16-1
+- Update to 0.16
+
+* Tue Oct 17 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.15-1
+- Update to 0.15
+
+* Thu Oct 13 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.14-1
+- Buld 0.14
+
+* Thu Oct 5 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.13-1
+- Build 0.13
+
+* Mon Sep 11 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.12-1
+- Build 0.12
+
+* Fri Aug 21 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.11-1
+- Build 0.11
+
+* Fri Jun 30 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.10-1
+- Build 0.10 and add xorg-x11-apps
+
+* Fri Jun 29 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.9-1
+- Build 0.9
+
+* Fri Jun 22 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.8-1
+- Build 0.8
+
+* Thu Jun 21 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.7-2
+- Add some unpackaged files
+
+* Thu Jun 7 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.7-1
+- Build 0.7
+
+* Thu Jun 7 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.6-1
+- Build 0.6
+
+* Thu Jun 7 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.5-1
+- Build 0.5
+
+* Thu Jun 7 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.4-2
+- Add build require (perl xml parser)
+
+* Thu Jun 7 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.4-1
+- Build 0.4
+
+* Thu May 23 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.3-1
+- Build 0.3
+
+* Thu May 22 2006 Marco Pesenti Gritti <mpg@redhat.com> 0.2-1
+- Build 0.2
diff --git a/rpms/sugar-datastore/sizelist-0000-cover-letter.patch b/rpms/sugar-datastore/sizelist-0000-cover-letter.patch
new file mode 100644
index 0000000..455dc75
--- /dev/null
+++ b/rpms/sugar-datastore/sizelist-0000-cover-letter.patch
@@ -0,0 +1,43 @@
+From adf903b541e0bc31a3aec6199930451476400e3d Mon Sep 17 00:00:00 2001
+Message-Id: <cover.1278225681.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Sun, 4 Jul 2010 03:41:21 -0300
+Subject: [PATCH v2 0/7] Add ctime and filesize properties to the datastore
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This new version addresses two problems with the last patchset:
+
+Bert Freudenberg kindly reminded me that the 'ctime' property had a documented
+string format [0], which Etoys was using. This version uses that format so we
+don't break any activities expecting it.
+
+Bernie Innocenti produced a datastore that was unable to successfuly upgrade
+(reindex) to the new version. The problem was that indexing a document failed
+miserably when ctime or filesize didn't exist, this version avoids that. This
+version also contains a new patch that checks for and adds the new metadata
+when rebuilding the index so that old entries can be sorted.
+
+[0] http://wiki.sugarlabs.org/go/Development_Team/Low-level_Activity_API#Meta_Data
+
+v0: Initial submission to sugar-devel
+v1: Split ctime and filesize patches as requested by Sascha
+v2: Change ctime format to '%Y-%m-%dT%H:%M:%S'. Add ctime and filesize metadata
+when reindexing.
+
+Andrés Ambrois (7):
+ Add filesize property to the index.
+ Add migration code from DS v0 for the filesize property
+ Check filesize property on index rebuild.
+ Add ctime property to the index and datastore
+ Check ctime on index rebuild
+ Implement migration from DS v0 for ctime property.
+ Increment CURRENT_LAYOUT_VERSION to trigger an index rebuild
+
+ src/carquinyol/datastore.py | 28 ++++++++++++++++++++++++++++
+ src/carquinyol/indexstore.py | 22 ++++++++++++++++++++++
+ src/carquinyol/layoutmanager.py | 2 +-
+ src/carquinyol/migration.py | 12 +++++++++++-
+ 4 files changed, 62 insertions(+), 2 deletions(-)
+
diff --git a/rpms/sugar-datastore/sizelist-0001-Add-filesize-property-to-the-index.patch b/rpms/sugar-datastore/sizelist-0001-Add-filesize-property-to-the-index.patch
new file mode 100644
index 0000000..b3b145c
--- /dev/null
+++ b/rpms/sugar-datastore/sizelist-0001-Add-filesize-property-to-the-index.patch
@@ -0,0 +1,98 @@
+From 2b14f8b279734cebecb3ac532ee912c3b2f5726c Mon Sep 17 00:00:00 2001
+Message-Id: <2b14f8b279734cebecb3ac532ee912c3b2f5726c.1278225681.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278225681.git.andresambrois@gmail.com>
+References: <cover.1278225681.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Fri, 2 Jul 2010 03:34:23 -0300
+Subject: [PATCH v2 1/7] Add filesize property to the index.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Don't fail indexing if filesize is missing.
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/carquinyol/datastore.py | 12 ++++++++++++
+ src/carquinyol/indexstore.py | 14 ++++++++++++++
+ 2 files changed, 26 insertions(+), 0 deletions(-)
+
+diff --git a/src/carquinyol/datastore.py b/src/carquinyol/datastore.py
+index a556869..93ad419 100644
+--- a/src/carquinyol/datastore.py
++++ b/src/carquinyol/datastore.py
+@@ -157,6 +157,12 @@ class DataStore(dbus.service.Object):
+ if not props.get('timestamp', ''):
+ props['timestamp'] = int(time.time())
+
++ if os.path.exists(file_path):
++ stat = os.stat(file_path)
++ props['filesize'] = stat.st_size
++ else:
++ props['filesize'] = 0
++
+ self._metadata_store.store(uid, props)
+ self._index_store.store(uid, props)
+ self._file_store.store(uid, file_path, transfer_ownership,
+@@ -193,6 +199,12 @@ class DataStore(dbus.service.Object):
+ if not props.get('timestamp', ''):
+ props['timestamp'] = int(time.time())
+
++ if os.path.exists(file_path):
++ stat = os.stat(file_path)
++ props['filesize'] = stat.st_size
++ else:
++ props['filesize'] = 0
++
+ self._metadata_store.store(uid, props)
+ self._index_store.store(uid, props)
+
+diff --git a/src/carquinyol/indexstore.py b/src/carquinyol/indexstore.py
+index 8a69334..1b32a01 100644
+--- a/src/carquinyol/indexstore.py
++++ b/src/carquinyol/indexstore.py
+@@ -28,6 +28,8 @@ from carquinyol.layoutmanager import MAX_QUERY_LIMIT
+ _VALUE_UID = 0
+ _VALUE_TIMESTAMP = 1
+ _VALUE_TITLE = 2
++# 3 reserved for version support
++_VALUE_FILESIZE = 4
+
+ _PREFIX_NONE = 'N'
+ _PREFIX_FULL_VALUE = 'F'
+@@ -57,6 +59,7 @@ _QUERY_TERM_MAP = {
+
+ _QUERY_VALUE_MAP = {
+ 'timestamp': {'number': _VALUE_TIMESTAMP, 'type': float},
++ 'filesize': {'number': _VALUE_FILESIZE, 'type': int},
+ }
+
+
+@@ -66,6 +69,13 @@ class TermGenerator (xapian.TermGenerator):
+ document.add_value(_VALUE_TIMESTAMP,
+ xapian.sortable_serialise(float(properties['timestamp'])))
+ document.add_value(_VALUE_TITLE, properties.get('title', '').strip())
++ if 'filesize' in properties:
++ try:
++ document.add_value(_VALUE_FILESIZE,
++ xapian.sortable_serialise(int(properties['filesize'])))
++ except ValueError:
++ logging.debug('Invalid value for filesize property: %s',
++ properties['filesize'])
+
+ self.set_document(document)
+
+@@ -284,6 +294,10 @@ class IndexStore(object):
+ enquire.set_sort_by_value(_VALUE_TITLE, True)
+ elif order_by == '-title':
+ enquire.set_sort_by_value(_VALUE_TITLE, False)
++ elif order_by == '+filesize':
++ enquire.set_sort_by_value(_VALUE_FILESIZE, True)
++ elif order_by == '-filesize':
++ enquire.set_sort_by_value(_VALUE_FILESIZE, False)
+ else:
+ logging.warning('Unsupported property for sorting: %s', order_by)
+
+--
+1.7.0.4
+
diff --git a/rpms/sugar-datastore/sizelist-0002-Add-migration-code-from-DS-v0-for-the-filesize-prope.patch b/rpms/sugar-datastore/sizelist-0002-Add-migration-code-from-DS-v0-for-the-filesize-prope.patch
new file mode 100644
index 0000000..6261930
--- /dev/null
+++ b/rpms/sugar-datastore/sizelist-0002-Add-migration-code-from-DS-v0-for-the-filesize-prope.patch
@@ -0,0 +1,48 @@
+From 82858a507553015b2fb1e8fa7adbb72882b3afb9 Mon Sep 17 00:00:00 2001
+Message-Id: <82858a507553015b2fb1e8fa7adbb72882b3afb9.1278225682.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278225681.git.andresambrois@gmail.com>
+References: <cover.1278225681.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Fri, 2 Jul 2010 03:35:47 -0300
+Subject: [PATCH v2 2/7] Add migration code from DS v0 for the filesize property
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/carquinyol/migration.py | 9 ++++++++-
+ 1 files changed, 8 insertions(+), 1 deletions(-)
+
+diff --git a/src/carquinyol/migration.py b/src/carquinyol/migration.py
+index 95ee391..228467c 100644
+--- a/src/carquinyol/migration.py
++++ b/src/carquinyol/migration.py
+@@ -45,8 +45,8 @@ def migrate_from_0():
+
+ logging.debug('Migrating entry %r', uid)
+ try:
+- _migrate_metadata(root_path, old_root_path, uid)
+ _migrate_file(root_path, old_root_path, uid)
++ _migrate_metadata(root_path, old_root_path, uid)
+ _migrate_preview(root_path, old_root_path, uid)
+ except Exception:
+ logging.exception('Error while migrating entry %r', uid)
+@@ -73,6 +73,13 @@ def _migrate_metadata(root_path, old_root_path, uid):
+ metadata['timestamp'] = \
+ time.mktime(time.strptime(metadata['mtime'], DATE_FORMAT))
+
++ file_path = layoutmanager.get_instance().get_data_path(uid)
++ if 'filesize' not in metadata:
++ if os.path.exists(file_path):
++ metadata['filesize'] = int(os.stat(file_path).st_size)
++ else:
++ metadata['filesize'] = 0
++
+ for key, value in metadata.items():
+ try:
+ f = open(os.path.join(metadata_path, key), 'w')
+--
+1.7.0.4
+
diff --git a/rpms/sugar-datastore/sizelist-0003-Check-filesize-property-on-index-rebuild.patch b/rpms/sugar-datastore/sizelist-0003-Check-filesize-property-on-index-rebuild.patch
new file mode 100644
index 0000000..2272a73
--- /dev/null
+++ b/rpms/sugar-datastore/sizelist-0003-Check-filesize-property-on-index-rebuild.patch
@@ -0,0 +1,41 @@
+From 54a0d9aab34d5d6ce731a931e6adc165c6191221 Mon Sep 17 00:00:00 2001
+Message-Id: <54a0d9aab34d5d6ce731a931e6adc165c6191221.1278225682.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278225681.git.andresambrois@gmail.com>
+References: <cover.1278225681.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Fri, 2 Jul 2010 03:36:56 -0300
+Subject: [PATCH v2 3/7] Check filesize property on index rebuild.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This will ensure it gets set when upgrading from older datastores.
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/carquinyol/datastore.py | 8 ++++++++
+ 1 files changed, 8 insertions(+), 0 deletions(-)
+
+diff --git a/src/carquinyol/datastore.py b/src/carquinyol/datastore.py
+index 93ad419..357591f 100644
+--- a/src/carquinyol/datastore.py
++++ b/src/carquinyol/datastore.py
+@@ -120,7 +120,15 @@ class DataStore(dbus.service.Object):
+
+ if not self._index_store.contains(uid):
+ try:
++ update_metadata = False
+ props = self._metadata_store.retrieve(uid)
++ if 'filesize' not in props:
++ path = self._file_store.get_file_path(uid)
++ if os.path.exists(path):
++ props['filesize'] = os.stat(path).st_size
++ update_metadata = True
++ if update_metadata:
++ self._metadata_store.store(uid, props)
+ self._index_store.store(uid, props)
+ except Exception:
+ logging.exception('Error processing %r', uid)
+--
+1.7.0.4
+
diff --git a/rpms/sugar-datastore/sizelist-0004-Add-ctime-property-to-the-index-and-datastore.patch b/rpms/sugar-datastore/sizelist-0004-Add-ctime-property-to-the-index-and-datastore.patch
new file mode 100644
index 0000000..c6f857c
--- /dev/null
+++ b/rpms/sugar-datastore/sizelist-0004-Add-ctime-property-to-the-index-and-datastore.patch
@@ -0,0 +1,83 @@
+From f04bad9371a81749ae7ce8f7a7b0694f0a4931dc Mon Sep 17 00:00:00 2001
+Message-Id: <f04bad9371a81749ae7ce8f7a7b0694f0a4931dc.1278225682.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278225681.git.andresambrois@gmail.com>
+References: <cover.1278225681.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Fri, 2 Jul 2010 03:40:10 -0300
+Subject: [PATCH v2 4/7] Add ctime property to the index and datastore
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/carquinyol/datastore.py | 4 ++++
+ src/carquinyol/indexstore.py | 8 ++++++++
+ 2 files changed, 12 insertions(+), 0 deletions(-)
+
+diff --git a/src/carquinyol/datastore.py b/src/carquinyol/datastore.py
+index 357591f..73e2d74 100644
+--- a/src/carquinyol/datastore.py
++++ b/src/carquinyol/datastore.py
+@@ -42,6 +42,8 @@ DS_SERVICE = "org.laptop.sugar.DataStore"
+ DS_DBUS_INTERFACE = "org.laptop.sugar.DataStore"
+ DS_OBJECT_PATH = "/org/laptop/sugar/DataStore"
+
++CTIME_FORMAT = '%Y-%m-%dT%H:%M:%S'
++
+ logger = logging.getLogger(DS_LOG_CHANNEL)
+
+
+@@ -164,6 +166,8 @@ class DataStore(dbus.service.Object):
+
+ if not props.get('timestamp', ''):
+ props['timestamp'] = int(time.time())
++ if not props.get('ctime', ''):
++ props['ctime'] = time.strftime(CTIME_FORMAT, time.localtime())
+
+ if os.path.exists(file_path):
+ stat = os.stat(file_path)
+diff --git a/src/carquinyol/indexstore.py b/src/carquinyol/indexstore.py
+index 1b32a01..29d9590 100644
+--- a/src/carquinyol/indexstore.py
++++ b/src/carquinyol/indexstore.py
+@@ -30,6 +30,7 @@ _VALUE_TIMESTAMP = 1
+ _VALUE_TITLE = 2
+ # 3 reserved for version support
+ _VALUE_FILESIZE = 4
++_VALUE_CTIME = 5
+
+ _PREFIX_NONE = 'N'
+ _PREFIX_FULL_VALUE = 'F'
+@@ -60,6 +61,7 @@ _QUERY_TERM_MAP = {
+ _QUERY_VALUE_MAP = {
+ 'timestamp': {'number': _VALUE_TIMESTAMP, 'type': float},
+ 'filesize': {'number': _VALUE_FILESIZE, 'type': int},
++ 'ctime': {'number': _VALUE_CTIME, 'type': str},
+ }
+
+
+@@ -76,6 +78,8 @@ class TermGenerator (xapian.TermGenerator):
+ except ValueError:
+ logging.debug('Invalid value for filesize property: %s',
+ properties['filesize'])
++ if 'ctime' in properties:
++ document.add_value(_VALUE_CTIME, properties['ctime'])
+
+ self.set_document(document)
+
+@@ -290,6 +294,10 @@ class IndexStore(object):
+ enquire.set_sort_by_value(_VALUE_TIMESTAMP, True)
+ elif order_by == '-timestamp':
+ enquire.set_sort_by_value(_VALUE_TIMESTAMP, False)
++ elif order_by == '+ctime':
++ enquire.set_sort_by_value(_VALUE_CTIME, True)
++ elif order_by == '-ctime':
++ enquire.set_sort_by_value(_VALUE_CTIME, False)
+ elif order_by == '+title':
+ enquire.set_sort_by_value(_VALUE_TITLE, True)
+ elif order_by == '-title':
+--
+1.7.0.4
+
diff --git a/rpms/sugar-datastore/sizelist-0005-Check-ctime-on-index-rebuild.patch b/rpms/sugar-datastore/sizelist-0005-Check-ctime-on-index-rebuild.patch
new file mode 100644
index 0000000..731675f
--- /dev/null
+++ b/rpms/sugar-datastore/sizelist-0005-Check-ctime-on-index-rebuild.patch
@@ -0,0 +1,35 @@
+From 1b599d880e994ac9380c0447eeb0749c311a8cf5 Mon Sep 17 00:00:00 2001
+Message-Id: <1b599d880e994ac9380c0447eeb0749c311a8cf5.1278225682.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278225681.git.andresambrois@gmail.com>
+References: <cover.1278225681.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Fri, 2 Jul 2010 03:40:51 -0300
+Subject: [PATCH v2 5/7] Check ctime on index rebuild
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/carquinyol/datastore.py | 4 ++++
+ 1 files changed, 4 insertions(+), 0 deletions(-)
+
+diff --git a/src/carquinyol/datastore.py b/src/carquinyol/datastore.py
+index 73e2d74..82d5700 100644
+--- a/src/carquinyol/datastore.py
++++ b/src/carquinyol/datastore.py
+@@ -129,6 +129,10 @@ class DataStore(dbus.service.Object):
+ if os.path.exists(path):
+ props['filesize'] = os.stat(path).st_size
+ update_metadata = True
++ if 'ctime' not in props:
++ props['ctime'] = time.strftime(CTIME_FORMAT,
++ time.localtime(int(props['timestamp'])))
++ update_metadata = True
+ if update_metadata:
+ self._metadata_store.store(uid, props)
+ self._index_store.store(uid, props)
+--
+1.7.0.4
+
diff --git a/rpms/sugar-datastore/sizelist-0006-Implement-migration-from-DS-v0-for-ctime-property.patch b/rpms/sugar-datastore/sizelist-0006-Implement-migration-from-DS-v0-for-ctime-property.patch
new file mode 100644
index 0000000..975bd04
--- /dev/null
+++ b/rpms/sugar-datastore/sizelist-0006-Implement-migration-from-DS-v0-for-ctime-property.patch
@@ -0,0 +1,34 @@
+From fe96ed9a8c026f594fe4e8074af2ab8d95ccad99 Mon Sep 17 00:00:00 2001
+Message-Id: <fe96ed9a8c026f594fe4e8074af2ab8d95ccad99.1278225682.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278225681.git.andresambrois@gmail.com>
+References: <cover.1278225681.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Fri, 2 Jul 2010 03:41:13 -0300
+Subject: [PATCH v2 6/7] Implement migration from DS v0 for ctime property.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/carquinyol/migration.py | 3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/src/carquinyol/migration.py b/src/carquinyol/migration.py
+index 228467c..80adbae 100644
+--- a/src/carquinyol/migration.py
++++ b/src/carquinyol/migration.py
+@@ -73,6 +73,9 @@ def _migrate_metadata(root_path, old_root_path, uid):
+ metadata['timestamp'] = \
+ time.mktime(time.strptime(metadata['mtime'], DATE_FORMAT))
+
++ if 'ctime' not in metadata:
++ metadata['ctime'] = int(os.stat(old_metadata_path).st_ctime)
++
+ file_path = layoutmanager.get_instance().get_data_path(uid)
+ if 'filesize' not in metadata:
+ if os.path.exists(file_path):
+--
+1.7.0.4
+
diff --git a/rpms/sugar-datastore/sizelist-0007-Increment-CURRENT_LAYOUT_VERSION-to-trigger-an-index.patch b/rpms/sugar-datastore/sizelist-0007-Increment-CURRENT_LAYOUT_VERSION-to-trigger-an-index.patch
new file mode 100644
index 0000000..c35ce8e
--- /dev/null
+++ b/rpms/sugar-datastore/sizelist-0007-Increment-CURRENT_LAYOUT_VERSION-to-trigger-an-index.patch
@@ -0,0 +1,33 @@
+From adf903b541e0bc31a3aec6199930451476400e3d Mon Sep 17 00:00:00 2001
+Message-Id: <adf903b541e0bc31a3aec6199930451476400e3d.1278225682.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278225681.git.andresambrois@gmail.com>
+References: <cover.1278225681.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Fri, 2 Jul 2010 03:41:36 -0300
+Subject: [PATCH v2 7/7] Increment CURRENT_LAYOUT_VERSION to trigger an index rebuild
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/carquinyol/layoutmanager.py | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/src/carquinyol/layoutmanager.py b/src/carquinyol/layoutmanager.py
+index 8402b6d..aee5efb 100644
+--- a/src/carquinyol/layoutmanager.py
++++ b/src/carquinyol/layoutmanager.py
+@@ -18,7 +18,7 @@ import os
+ import logging
+
+ MAX_QUERY_LIMIT = 40960
+-CURRENT_LAYOUT_VERSION = 4
++CURRENT_LAYOUT_VERSION = 5
+
+ class LayoutManager(object):
+ """Provide the logic about how entries are stored inside the datastore
+--
+1.7.0.4
+
diff --git a/rpms/sugar-datastore/sugar-datastore.spec b/rpms/sugar-datastore/sugar-datastore.spec
new file mode 100644
index 0000000..ea57ff9
--- /dev/null
+++ b/rpms/sugar-datastore/sugar-datastore.spec
@@ -0,0 +1,342 @@
+%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")}
+
+Name: sugar-datastore
+Version: 0.88.0
+Release: 3.2bernie%{?dist}
+#Release: 2.%{alphatag}%{?dist}
+Summary: Sugar Datastore
+
+Group: Development/Libraries
+License: GPLv2+
+URL: http://sugarlabs.org/
+Source0: http://download.sugarlabs.org/sources/sucrose/glucose/%{name}/%{name}-%{version}.tar.bz2
+
+# aa's "sort by filesize" patch series
+#Patch0: sizelist-0000-cover-letter.patch
+Patch1: sizelist-0001-Add-filesize-property-to-the-index.patch
+Patch2: sizelist-0002-Add-migration-code-from-DS-v0-for-the-filesize-prope.patch
+Patch3: sizelist-0003-Check-filesize-property-on-index-rebuild.patch
+Patch4: sizelist-0004-Add-ctime-property-to-the-index-and-datastore.patch
+Patch5: sizelist-0005-Check-ctime-on-index-rebuild.patch
+Patch6: sizelist-0006-Implement-migration-from-DS-v0-for-ctime-property.patch
+Patch7: sizelist-0007-Increment-CURRENT_LAYOUT_VERSION-to-trigger-an-index.patch
+
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+BuildRequires: python-devel
+
+Requires: gnome-python2-gnomevfs
+Requires: xapian-bindings-python
+Requires: python-cjson
+
+%description
+sugar-datastore is a simple log like datastore able to connect with multiple
+backends. The datastore supports connectionig and disconnecting from
+backends on the fly to help the support the limit space/memory
+characteristics of the OLPC system and the fact that network services
+may become unavailable at times
+
+%prep
+%setup -q
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
+
+%build
+%configure
+make %{?_smp_mflags} V=1
+
+%install
+rm -rf %{buildroot}
+make install DESTDIR=%{buildroot} INSTALL='install -p'
+
+#Remove libtool archives.
+find %{buildroot} -name '*.la' -exec rm -f {} ';'
+
+%clean
+rm -rf %{buildroot}
+
+%files
+%defattr(-,root,root,-)
+%doc AUTHORS COPYING NEWS README
+%{python_sitelib}/*
+%{_bindir}/*
+%{_datadir}/dbus-1/services/*.service
+
+%changelog
+* Mon Mar 29 2010 Peter Robinson <pbrobinson@gmail.com> - 0.88.0-1
+- New upstream stable 0.88.0 release
+
+* Wed Mar 10 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.4-1
+- New upstream release
+
+* Tue Mar 09 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.3-1
+- #1787 rebuild index on migration
+
+* Sat Jan 9 2010 Peter Robinson <pbrobinson@gmail.com> - 0.87.2-2
+- Updated to the new python sysarch spec file reqs
+
+* Wed Dec 23 2009 Sebastian Dziallas <sebastian@when.com> - 0.87.2-1
+- New upstream release
+
+* Fri Dec 18 2009 Peter Robinson <pbrobinson@gmail.com> 0.87.1-2
+- Remove libtool archives
+
+* Tue Dec 01 2009 Sebastian Dziallas <sebastian@when.com> - 0.87.1-1
+- New upstream release
+
+* Sun Sep 27 2009 Sebastian Dziallas <sebastian@when.com> - 0.86.0-1
+- New upstream release
+
+* Fri Sep 18 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.4-3
+- Rename files in docs accordingly
+
+* Fri Sep 18 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.4-2
+- Upload sources
+
+* Fri Sep 18 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.4-1
+- New upstream release
+
+* Fri Sep 11 2009 Simon Schampijer <simon@schampijer.de> - 0.85.3-1
+- Fix memory leaks after many get_properties() ds calls #1240
+
+* Wed Aug 26 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.2-1
+- Update to new upstream release
+
+* Fri Aug 07 2009 Simon Schampijer <simon@schampijer.de> - 0.85.1-1
+- PEP8 compliance fixes #1108
+- Rebuild index when an inconsistency between the index and the metadata is detected
+- Implement sorting by timestamp and title
+- Return a consistent entry count when some entries are missing (dsd)
+- Don't include in find() results entries without metadata
+- Remove title option (copy-from-journal) #896
+- Only one dot for the filename if we specify an extension (copy-from-journal)
+
+* Sun Jul 26 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.84.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Tue Mar 03 2009 Simon Schampijer <simon@schampijer.de> - 0.84.0-1
+- Rebuild for 0.84
+
+* Wed Feb 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.83.3-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Wed Feb 04 2009 Simon Schampijer <simon@schampijer.de> - 0.83.3-1
+- Only try to remove the checksum dir if it already exists
+- Rename the installed package from olpc.datastore to carquinyol
+
+* Fri Jan 30 2009 Simon Schampijer <simon@schampijer.de> - 0.83.2-2.20090130gite999c1c1e1
+- Only try to remove the checksum dir if it already exists
+
+* Tue Jan 20 2009 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.2-1
+- #181 Replace deprecated os.popen by subprocess
+- #140 Crash when joining a shared Read
+
+* Sun Jan 04 2009 Simon Schampijer <simon@laptop.org> - 0.83.1-1
+- contains a bunch of stability and robustness improvements
+
+* Sat Nov 29 2008 Ignacio Vazquez-Abrams <ivazqueznet+rpm@gmail.com> - 0.83.0-2
+- Rebuild for Python 2.6
+
+* Tue Nov 4 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.1-1
+- Update to 0.83.1
+
+* Sat Sep 6 2008 Tom "spot" Callaway <tcallawa@redhat.com> - 0.8.3-2
+- fix license tag
+
+* Tue Jul 08 2008 Tomeu Vizoso <tomeu@tomeuvizoso.net> - 0.8.3-1
+- Update to 0.8.3
+
+* Fri Jun 13 2008 Simon Schampijer <simon@laptop.org> - 0.8.1-1
+- Update to 0.8.1
+
+* Tue Dec 11 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.6.0-1
+- Fix #5218 #5254
+
+* Wed Dec 5 2007 Marco Pesenti Gritti <marco@localhost.localdomain> - 0.5-1
+- Update to 0.5
+
+* Tue Nov 20 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.3-1
+- Update to 0.3
+
+* Wed Nov 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.40.20071114gitea0764a9e9
+- #4662 Add the 'source' property to the model. (marco)
+- #4558 Correctly encode characters in URI. (tomeu)
+
+* Wed Nov 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.39.20071114gita42f40d575
+- #4784 Use valid FAT names when saving entries to usb sticks. (tomeu)
+
+* Mon Nov 12 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.38.20071112git6d3d607ec7
+- #4783 Try harder to guess the file extension. (tomeu)
+- #4796 Ignore failure to chmod files in usb sticks. (tomeu)
+
+* Fri Nov 09 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.37.20071109git62a5c30d81
+- Copy files to the profile dir when asked by an out-of-container process. (tomeu)
+
+* Wed Nov 07 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.36.20071107git3b70954e71
+- #3801 Check out files in the activity instance dir with the correct
+ permissions. (tomeu)
+- #4704 Fix copy of entries with file to removable devices. (tomeu)
+- #4714 Fix copy of entries without file to removable devices. (tomeu)
+
+* Tue Nov 06 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.35.20071106git74cbc13878
+- #4654 Hard link files on check out instead of copying if possible. (tomeu)
+
+* Fri Nov 02 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.34.20071102git2b5596554c
+- #4234 Fix copying a download to an usb stick. (marco)
+
+* Tue Oct 9 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.33.20071009gitcb0acdf653
+- New snapshot
+
+* Sun Oct 7 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.32.20071007gitb603f340b2
+- New snapshot
+
+* Sat Oct 6 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.31.20071005git23becaa683
+- New snapshot
+
+* Fri Oct 5 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.30.20071005git64abebe398
+- New snapshot
+
+* Fri Oct 5 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.29.20071005git87204de5b9
+- New snapshot
+
+* Thu Oct 4 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.28.20071004git902883ab7c
+- New snapshot
+
+* Thu Oct 4 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.27.20071004git23f5b3439e
+- New snapshot
+
+* Thu Sep 20 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.26.20070920gitdce9c18d56
+- New snapshot
+
+* Wed Sep 19 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.25.20070919git11013dc3ca
+- New snapshot
+
+* Tue Sep 18 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.24.20070918git48ab782a01
+- New snapshot
+
+* Fri Sep 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.23.20070914gitea13f75d6a
+- New snapshot
+
+* Wed Sep 12 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.22.20070912git7655f4d99a
+- New snapshot
+
+* Tue Sep 11 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.21.20070911gitb0b4c4115a
+- New snapshot
+
+* Mon Sep 10 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.20.20070910git617bf5d005
+- New snapshot
+
+* Sun Sep 09 2007 Dan Williams <dcbw@redhat.com> - 0.2.2-0.19.20070909git0a7e80f01a
+- New snapshot (async writes and ownership transfer on update/create)
+
+* Wed Aug 01 2007 Dan Williams <dcbw@redhat.com> - 0.2.2-0.18.20070801gita111996299
+- New snapshot (fix #2607)
+
+* Tue Jul 31 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.18.20070731git356b35a278
+- New snapshot
+
+* Sun Jul 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.17.20070729git4a4283978f
+- New snapshot
+
+* Fri Jul 27 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.16.20070727gitd0bcbf67d1
+- New snapshot
+
+* Wed Jul 25 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.15.20070725git30ce1b1378
+- New snapshot
+
+* Mon Jul 23 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.14.20070723git00570bc517
+- New snapshot
+
+* Sat Jul 21 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.13.20070720git033d224d3b
+- New snapshot
+
+* Fri Jul 20 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.12.20070720gite30379af95
+- New snapshot
+
+* Thu Jul 19 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.11.20070719git9aabdfb24b
+- New snapshot
+
+* Wed Jul 18 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.2.20070718git535d9835e2
+- New snapshot
+
+* Tue Jul 17 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.10.20070716git2978ff86bd
+- New snapshot
+
+* Tue Jul 17 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.9.20070716git643ac4dad8
+- New snapshot
+
+* Mon Jul 16 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.8.20070715git6666e28e60
+- New snapshot
+
+* Fri Jul 13 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.7.20070713git33bf60bb4f
+- Remove dependencies on sqlalchemy and pyxapian
+- New snapshot
+
+* Fri Jul 6 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.6.20070705git18b7951026
+- Full indexing refactor
+- Support or in the queries
+
+* Tue Jul 3 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.5.20070703gita248b5cb79
+- Support for binary properties
+- Indexer fixes
+- External devices fixes
+
+* Thu Jun 28 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.4.20070628gitd23ee8a383
+- New snapshot
+
+* Wed Jun 27 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.3.20070627gitf5a5d0ff66
+- New snapshot
+
+* Tue Jun 26 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.2.20070626git30c1a1abb8
+- New snapshot
+
+* Wed Jun 20 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.2-0.1.20070620git49f3211d34
+- Update to 0.2.2
+- Fix rpmlint complaints
+
+* Mon Jun 4 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.1-3.git8d46929bf7.1
+- New snapshot
+
+* Wed May 30 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.0-2.gita7ec17405d
+- Fix locks
+
+* Tue May 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.0-1.9.20070529git
+- New snapshot
+
+* Tue May 16 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.0-1.9.20070516.2git
+- Remove setuptools again
+
+* Tue May 16 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.0-1.9.20070516git
+- More performance work
+
+* Tue May 15 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.0-1.7.20070515git
+- Performance fix
+
+* Mon May 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.0-1.7.20070514git.4
+- Disable indexer, fix empty files
+
+* Mon May 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.0-1.7.20070514git.3
+- Fixes
+
+* Mon May 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.0-1.7.20070514git.2
+- Fix startup
+
+* Mon May 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.0-1.7.20070514git
+- New snapshot, use auto*
+
+* Thu May 11 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.0-1.6.20070511git
+- Fix service path
+
+* Thu May 11 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.0-1.5.20070511git
+- Update snapshot
+
+* Thu May 10 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.0-1.4.20070510git
+- Require pyxapian
+
+* Thu May 10 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.0-1.3.20070510git
+- Initial build
diff --git a/rpms/sugar-toolkit/change-keep-string-to-keep-a-copy.patch b/rpms/sugar-toolkit/change-keep-string-to-keep-a-copy.patch
new file mode 100644
index 0000000..5afc4d3
--- /dev/null
+++ b/rpms/sugar-toolkit/change-keep-string-to-keep-a-copy.patch
@@ -0,0 +1,26 @@
+>From 8a2da36117aa8b5e38fb0ead9664024d47ab4e96 Mon Sep 17 00:00:00 2001
+From: Jorge Saldivar <jsaldivar@paraguayeduca.org>
+Date: Wed, 21 Apr 2010 17:26:50 -0400
+Subject: [PATCH] Change keep string to keep a copy
+
+---
+ src/sugar/activity/widgets.py | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/src/sugar/activity/widgets.py b/src/sugar/activity/widgets.py
+index 2867666..5ce82bd 100644
+--- a/src/sugar/activity/widgets.py
++++ b/src/sugar/activity/widgets.py
+@@ -163,7 +163,7 @@ class KeepButton(ToolButton):
+
+ def __init__(self, activity, **kwargs):
+ ToolButton.__init__(self, **kwargs)
+- self.props.tooltip = _('Keep')
++ self.props.tooltip = _('Keep a copy')
+ self.props.accelerator = '<Ctrl>S'
+
+ client = gconf.client_get_default()
+--
+1.6.3.3
+
+
diff --git a/rpms/sugar-toolkit/fix-two-trivial-shell-log-warnings.patch b/rpms/sugar-toolkit/fix-two-trivial-shell-log-warnings.patch
new file mode 100644
index 0000000..bb0ce34
--- /dev/null
+++ b/rpms/sugar-toolkit/fix-two-trivial-shell-log-warnings.patch
@@ -0,0 +1,93 @@
+From sugar-devel-bounces@lists.sugarlabs.org Mon May 10 07:07:31 2010
+Return-Path: <sugar-devel-bounces@lists.sugarlabs.org>
+X-Original-To: bernie@codewiz.org
+Delivered-To: bernie@trinity.develer.com
+Received: from solarsail.media.mit.edu (solarsail.media.mit.edu
+ [18.85.2.155]) by trinity.develer.com (Postfix) with ESMTPS id 750921D606F
+ for <bernie@codewiz.org>; Mon, 10 May 2010 07:07:31 +0200 (CEST)
+X-Virus-Status: Clean
+X-Virus-Scanned: clamav-milter 0.95.2 at trinity.develer.com
+Received: from solarsail.media.mit.edu (localhost [127.0.0.1]) by
+ solarsail.media.mit.edu (Postfix) with ESMTP id 7F8508109; Mon, 10 May 2010
+ 01:07:29 -0400 (EDT)
+Received: from enchanter.real-time.com (enchanter.real-time.com
+ [63.170.91.11]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168
+ bits)) (No client certificate requested) by solarsail.media.mit.edu
+ (Postfix) with ESMTPS id 0BE748108 for <sugar-devel@lists.sugarlabs.org>;
+ Mon, 10 May 2010 01:07:25 -0400 (EDT)
+Received: from dors.lan (quozl2.real-time.com [65.165.43.5]) by
+ enchanter.real-time.com (8.12.10/8.12.10) with ESMTP id o4A57GG0010693
+ (version=TLSv1/SSLv3 cipher=DES-CBC3-SHA bits=168 verify=NO); Mon, 10 May
+ 2010 00:07:20 -0500
+Received: from james by dors.lan with local (Exim 4.71) (envelope-from
+ <quozl.2005@bigpond.com>) id 1OBLCx-0000Yy-GM; Mon, 10 May 2010 15:07:11
+ +1000
+From: James Cameron <quozl@laptop.org>
+To: Sayamindu Dasgupta <sayamindu@gmail.com>, Daniel Drake <dsd@laptop.org>
+Date: Mon, 10 May 2010 15:06:14 +1000
+Message-Id: <1273467974-2104-1-git-send-email-quozl@laptop.org>
+X-Mailer: git-send-email 1.7.1
+Cc: sugar-devel@lists.sugarlabs.org, James Cameron <quozl@laptop.org>
+Subject: [Sugar-devel] [PATCH] fix two trivial shell.log warnings
+X-BeenThere: sugar-devel@lists.sugarlabs.org
+X-Mailman-Version: 2.1.9
+Precedence: list
+List-Id: "Discussion of Sugar development and other technical matters."
+ <sugar-devel.lists.sugarlabs.org>
+List-Unsubscribe: <http://lists.sugarlabs.org/listinfo/sugar-devel>,
+ <mailto:sugar-devel-request@lists.sugarlabs.org?subject=unsubscribe>
+List-Archive: <http://lists.sugarlabs.org/archive/sugar-devel>
+List-Post: <mailto:sugar-devel@lists.sugarlabs.org>
+List-Help: <mailto:sugar-devel-request@lists.sugarlabs.org?subject=help>
+List-Subscribe: <http://lists.sugarlabs.org/listinfo/sugar-devel>,
+ <mailto:sugar-devel-request@lists.sugarlabs.org?subject=subscribe>
+MIME-Version: 1.0
+Content-Type: text/plain; charset="us-ascii"
+Sender: sugar-devel-bounces@lists.sugarlabs.org
+Errors-To: sugar-devel-bounces@lists.sugarlabs.org
+X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY
+ autolearn=ham version=3.3.1
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ trinity.develer.com
+X-Evolution-Source: imap://bernie@imap.develer.com/
+Content-Transfer-Encoding: 8bit
+
+"DeprecationWarning: integer argument expected, got float" was happening
+in two places. An issue that has been with us for at least 12 months,
+since it was also seen in logs attached to SL #870.
+---
+ src/sugar/graphics/icon.py | 6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/sugar/graphics/icon.py b/src/sugar/graphics/icon.py
+index 57c53f5..8e3861c 100644
+--- a/src/sugar/graphics/icon.py
++++ b/src/sugar/graphics/icon.py
+@@ -133,7 +133,7 @@ class _IconBuffer(object):
+ if self.width != None:
+ size = self.width
+
+- info = theme.lookup_icon(self.icon_name, size, 0)
++ info = theme.lookup_icon(self.icon_name, int(size), 0)
+ if info:
+ attach_x, attach_y = self._get_attach_points(info, size)
+
+@@ -178,8 +178,8 @@ class _IconBuffer(object):
+
+ def _get_size(self, icon_width, icon_height, padding):
+ if self.width is not None and self.height is not None:
+- width = self.width + padding
+- height = self.height + padding
++ width = int(self.width) + padding
++ height = int(self.height) + padding
+ else:
+ width = icon_width + padding
+ height = icon_height + padding
+--
+1.7.1
+
+_______________________________________________
+Sugar-devel mailing list
+Sugar-devel@lists.sugarlabs.org
+http://lists.sugarlabs.org/listinfo/sugar-devel
+
diff --git a/rpms/sugar-toolkit/kill-the-delayed-menus-for-good.patch b/rpms/sugar-toolkit/kill-the-delayed-menus-for-good.patch
new file mode 100644
index 0000000..43da274
--- /dev/null
+++ b/rpms/sugar-toolkit/kill-the-delayed-menus-for-good.patch
@@ -0,0 +1,114 @@
+From sugar-devel-bounces@lists.sugarlabs.org Tue Oct 13 02:36:45 2009
+Return-Path: <sugar-devel-bounces@lists.sugarlabs.org>
+Delivered-To: bernie@codewiz.org
+Received: (qmail 5091 invoked from network); 13 Oct 2009 02:36:45 -0000
+Received: by simscan 1.4.0 ppid: 5072, pid: 5073, t: 2.5265s scanners:
+ clamav: 0.93.3/m:48/d:8412 spam: 3.2.5
+X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on
+ trinity.develer.com
+X-Spam-Level:
+X-Spam-Status: No, score=-6.6 required=3.0 tests=BAYES_00,RCVD_IN_DNSWL_MED
+ autolearn=ham version=3.2.5
+Received: from solarsail.media.mit.edu (18.85.2.155) by trinity.develer.com
+ with ESMTP; 13 Oct 2009 02:36:43 -0000
+Received: from solarsail.media.mit.edu (localhost [127.0.0.1]) by
+ solarsail.media.mit.edu (Postfix) with ESMTP id 77346805B; Mon, 12 Oct 2009
+ 22:36:41 -0400 (EDT)
+Received: from trinity.develer.com (trinity.develer.com [83.149.158.210])
+ by solarsail.media.mit.edu (Postfix) with ESMTP id 72B6F8042 for
+ <sugar-devel@lists.sugarlabs.org>; Mon, 12 Oct 2009 22:36:18 -0400 (EDT)
+Received: (qmail 4993 invoked from network); 13 Oct 2009 02:36:16 -0000
+Received: from 75-147-59-54-newengland.hfc.comcastbusiness.net (HELO
+ ?172.16.1.6?) (bernie@75.147.59.54) by trinity.develer.com with ESMTPA; 13
+ Oct 2009 02:36:16 -0000
+From: Bernie Innocenti <bernie@codewiz.org>
+To: Sugar Devel <sugar-devel@lists.sugarlabs.org>
+Organization: Sugar Labs - http://www.sugarlabs.org/
+Date: Mon, 12 Oct 2009 22:36:12 -0400
+Message-Id: <1255401372.1477.549.camel@giskard>
+Mime-Version: 1.0
+X-Mailer: Evolution 2.28.0 (2.28.0-2.fc12)
+Subject: [Sugar-devel] RFC: Kill the delayed menus for good
+X-BeenThere: sugar-devel@lists.sugarlabs.org
+X-Mailman-Version: 2.1.9
+Precedence: list
+List-Id: "Discussion of Sugar development and other technical matters."
+ <sugar-devel.lists.sugarlabs.org>
+List-Unsubscribe: <http://lists.sugarlabs.org/listinfo/sugar-devel>,
+ <mailto:sugar-devel-request@lists.sugarlabs.org?subject=unsubscribe>
+List-Archive: <http://lists.sugarlabs.org/archive/sugar-devel>
+List-Post: <mailto:sugar-devel@lists.sugarlabs.org>
+List-Help: <mailto:sugar-devel-request@lists.sugarlabs.org?subject=help>
+List-Subscribe: <http://lists.sugarlabs.org/listinfo/sugar-devel>,
+ <mailto:sugar-devel-request@lists.sugarlabs.org?subject=subscribe>
+Content-Type: text/plain; charset="us-ascii"
+Sender: sugar-devel-bounces@lists.sugarlabs.org
+Errors-To: sugar-devel-bounces@lists.sugarlabs.org
+X-Evolution-Source: imap://bernie@imap.develer.com/
+Content-Transfer-Encoding: 8bit
+
+Hello,
+
+Michael just passed by the Acetarium and, since the dinner was late, we
+found the time to test and review his latest prototype^W patch.
+
+I'm loving how the menus suddenly are now snappy and responsive. Please,
+test it yourself and report back. If we like this change, I think we
+should go on and also kill the code that this patch makes redundant.
+(please, let's not add another configurable knob!)
+
+>From 83ef08969ed7bee08f90c12bfa1eedcb7fb0500c Mon Sep 17 00:00:00 2001
+From: Michael Stone <michael@laptop.org>
+Date: Mon, 14 Sep 2009 22:33:12 -0400
+Subject: Make various palette animations happen more quickly.
+
+---
+ src/sugar/graphics/palette.py | 2 +-
+ src/sugar/graphics/palettewindow.py | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/sugar/graphics/palette.py
+b/src/sugar/graphics/palette.py
+index bb2b605..466edef 100644
+--- a/src/sugar/graphics/palette.py
++++ b/src/sugar/graphics/palette.py
+@@ -103,7 +103,7 @@ class Palette(PaletteWindow):
+
+ self._menu_content_separator = gtk.HSeparator()
+
+- self._secondary_anim = animator.Animator(2.0, 10)
++ self._secondary_anim = animator.Animator(0.0, 10)
+ self._secondary_anim.add(_SecondaryAnimation(self))
+
+ # we init after initializing all of our containers
+diff --git a/src/sugar/graphics/palettewindow.py
+b/src/sugar/graphics/palettewindow.py
+index 3049f55..4bc07e2 100644
+--- a/src/sugar/graphics/palettewindow.py
++++ b/src/sugar/graphics/palettewindow.py
+@@ -148,10 +148,10 @@ class PaletteWindow(gtk.Window):
+ self._up = False
+ self._old_alloc = None
+
+- self._popup_anim = animator.Animator(.5, 10)
++ self._popup_anim = animator.Animator(0.0, 10)
+ self._popup_anim.add(_PopupAnimation(self))
+
+- self._popdown_anim = animator.Animator(0.6, 10)
++ self._popdown_anim = animator.Animator(0.0, 10)
+ self._popdown_anim.add(_PopdownAnimation(self))
+
+ gobject.GObject.__init__(self, **kwargs)
+--
+1.5.6.5
+
+
+--
+ // Bernie Innocenti - http://codewiz.org/
+ \X/ Sugar Labs - http://sugarlabs.org/
+
+_______________________________________________
+Sugar-devel mailing list
+Sugar-devel@lists.sugarlabs.org
+http://lists.sugarlabs.org/listinfo/sugar-devel
+
diff --git a/rpms/sugar-toolkit/remove-incomplete-MANIFEST-support.patch b/rpms/sugar-toolkit/remove-incomplete-MANIFEST-support.patch
new file mode 100644
index 0000000..c36224c
--- /dev/null
+++ b/rpms/sugar-toolkit/remove-incomplete-MANIFEST-support.patch
@@ -0,0 +1,255 @@
+From 07b6cc041fe9a0ecd798ec67e8d27728d33001e3 Mon Sep 17 00:00:00 2001
+From: Bernie Innocenti <bernie@codewiz.org>
+Date: Thu, 20 May 2010 02:19:14 -0400
+Subject: [PATCH] Remove incomplete MANIFEST support
+Organization: Sugar Labs Foundation
+X-Subversion: sucks
+
+This incomplete feature contributes to confuse new activity authors and
+slightly complicates our bundle installation logic.
+
+The day someone finds something useful to do with the MANIFEST
+specification, we can revert this patch in no time.
+
+Signed-off-by: Bernie Innocenti <bernie@codewiz.org>
+Tested-by: Bernie Innocenti <bernie@codewiz.org>
+---
+ src/sugar/activity/bundlebuilder.py | 48 ++---------------
+ src/sugar/bundle/activitybundle.py | 99 +----------------------------------
+ src/sugar/bundle/bundle.py | 9 ---
+ 3 files changed, 6 insertions(+), 150 deletions(-)
+
+diff --git a/src/sugar/activity/bundlebuilder.py b/src/sugar/activity/bundlebuilder.py
+index 868ca3d..630a3e4 100644
+--- a/src/sugar/activity/bundlebuilder.py
++++ b/src/sugar/activity/bundlebuilder.py
+@@ -141,37 +141,9 @@ class Builder(object):
+ f.close()
+
+ def get_files(self):
+- files = self.config.bundle.get_files()
+-
+- if not files:
+- logging.error('No files found, fixing the MANIFEST.')
+- self.fix_manifest()
+- files = self.config.bundle.get_files()
+-
+- return files
+-
+- def check_manifest(self):
+- missing_files = []
+-
+ allfiles = list_files(self.config.source_dir,
+ IGNORE_DIRS, IGNORE_FILES)
+- for path in allfiles:
+- if path not in self.config.bundle.manifest:
+- missing_files.append(path)
+-
+- return missing_files
+-
+- def fix_manifest(self):
+- self.build()
+-
+- manifest = self.config.bundle.manifest
+-
+- for path in self.check_manifest():
+- manifest.append(path)
+-
+- f = open(os.path.join(self.config.source_dir, "MANIFEST"), "wb")
+- for line in manifest:
+- f.write(line + "\n")
++ return allfiles
+
+
+ class Packager(object):
+@@ -197,13 +169,6 @@ class XOPackager(Packager):
+ bundle_zip = zipfile.ZipFile(self.package_path, 'w',
+ zipfile.ZIP_DEFLATED)
+
+- missing_files = self.builder.check_manifest()
+- if missing_files:
+- logging.warn('These files are not included in the manifest ' \
+- 'and will not be present in the bundle:\n\n' +
+- '\n'.join(missing_files) +
+- '\n\nUse fix_manifest if you want to add them.')
+-
+ for f in self.builder.get_files():
+ bundle_zip.write(os.path.join(self.config.source_dir, f),
+ os.path.join(self.config.bundle_root_dir, f))
+@@ -307,14 +272,11 @@ def cmd_dist_xo(config, args):
+
+
+ def cmd_fix_manifest(config, args):
+- '''Add missing files to the manifest'''
++ '''Add missing files to the manifest (OBSOLETE)'''
+
+- if args:
+- print 'Usage: %prog fix_manifest'
+- return
+-
+- builder = Builder(config)
+- builder.fix_manifest()
++ print "WARNING: the fix_manifest command is obsolete"
++ print "the MANIFEST file is no longer used in bundles, please remove it"
++ pass
+
+
+ def cmd_dist_source(config, args):
+--- sugar-toolkit-0.88.1/src/sugar/bundle/activitybundle.py.orig 2010-06-03 02:56:29.000000000 -0400
++++ sugar-toolkit-0.88.1/src/sugar/bundle/activitybundle.py 2010-06-06 10:36:58.000000000 -0400
+@@ -59,7 +59,6 @@ class ActivityBundle(Bundle):
+ self._tags = None
+ self._activity_version = 0
+ self._installation_time = os.stat(path).st_mtime
+- self._manifest = None
+
+ info_file = self.get_file('activity/activity.info')
+ if info_file is None:
+@@ -73,74 +72,6 @@ class ActivityBundle(Bundle):
+ if self._local_name == None:
+ self._local_name = self._name
+
+- def _get_manifest(self):
+- if self._manifest is None:
+- self._manifest = self._read_manifest()
+- return self._manifest
+-
+- manifest = property(_get_manifest, None, None,
+- "NOTICE: this property is potentially quite slow, so better make sure "
+- "that it's not called at performance-critical points like shell or "
+- "activity startup.")
+-
+- def _raw_manifest(self):
+- f = self.get_file("MANIFEST")
+- if not f:
+- logging.warning("Activity directory lacks a MANIFEST file.")
+- return []
+-
+- ret = [line.strip() for line in f.readlines()]
+- f.close()
+- return ret
+-
+- def _read_manifest(self):
+- """return a list with the lines in MANIFEST, with invalid lines
+- replaced by empty lines.
+-
+- Since absolute order carries information on file history, it should
+- be preserved. For instance, when renaming a file, you should leave
+- the new name on the same line as the old one.
+- """
+- logging.debug('STARTUP: Reading manifest')
+- lines = self._raw_manifest()
+-
+- # Remove trailing newlines, they do not help keep absolute position.
+- while lines and lines[-1] == "":
+- lines = lines[:-1]
+-
+- for num, line in enumerate(lines):
+- if not line:
+- continue
+-
+- # Remove duplicates
+- if line in lines[0:num]:
+- lines[num] = ""
+- logging.warning('Bundle %s: duplicate entry in MANIFEST: %s',
+- self._name, line)
+- continue
+-
+- # Remove MANIFEST
+- if line == "MANIFEST":
+- lines[num] = ""
+- logging.warning('Bundle %s: MANIFEST includes itself: %s',
+- self._name, line)
+-
+- # Remove invalid files
+- if not self.is_file(line):
+- lines[num] = ""
+- logging.warning('Bundle %s: invalid entry in MANIFEST: %s',
+- self._name, line)
+-
+- return lines
+-
+- def get_files(self, manifest = None):
+- files = [line for line in (manifest or self.manifest) if line]
+-
+- if self.is_file('MANIFEST'):
+- files.append('MANIFEST')
+-
+- return files
+-
+ def _parse_info(self, info_file):
+ cp = ConfigParser()
+ cp.readfp(info_file)
+@@ -300,41 +231,13 @@ class ActivityBundle(Bundle):
+ """Get whether there should be a visible launcher for the activity"""
+ return self._show_launcher
+
+- def install(self, install_dir=None, strict_manifest=False):
++ def install(self, install_dir=None):
+ if install_dir is None:
+ install_dir = env.get_user_activities_path()
+
+ self._unzip(install_dir)
+
+ install_path = os.path.join(install_dir, self._zip_root_dir)
+-
+- # List installed files
+- manifestfiles = self.get_files(self._raw_manifest())
+- paths = []
+- for root, dirs_, files in os.walk(install_path):
+- rel_path = root[len(install_path) + 1:]
+- for f in files:
+- paths.append(os.path.join(rel_path, f))
+-
+- # Check the list against the MANIFEST
+- for path in paths:
+- if path in manifestfiles:
+- manifestfiles.remove(path)
+- elif path != "MANIFEST":
+- logging.warning('Bundle %s: %s not in MANIFEST', self._name,
+- path)
+- if strict_manifest:
+- os.remove(os.path.join(install_path, path))
+-
+- # Is anything in MANIFEST left over after accounting for all files?
+- if manifestfiles:
+- err = ("Bundle %s: files in MANIFEST not included: %s"%
+- (self._name, str(manifestfiles)))
+- if strict_manifest:
+- raise MalformedBundleException(err)
+- else:
+- logging.warning(err)
+-
+ self.install_mime_type(install_path)
+
+ return install_path
+diff --git a/src/sugar/bundle/bundle.py b/src/sugar/bundle/bundle.py
+index a04c873..adba480 100644
+--- a/src/sugar/bundle/bundle.py
++++ b/src/sugar/bundle/bundle.py
+@@ -80,14 +80,6 @@ class Bundle(object):
+ % (self._path, ziperror))
+ self._check_zip_bundle()
+
+- # manifest = self._get_file(self._infodir + '/contents')
+- # if manifest is None:
+- # raise MalformedBundleException('No manifest file')
+-
+- # signature = self._get_file(self._infodir + '/contents.sig')
+- # if signature is None:
+- # raise MalformedBundleException('No signature file')
+-
+ def __del__(self):
+ if self._zip_file is not None:
+ self._zip_file.close()
+@@ -176,7 +168,6 @@ class Bundle(object):
+ # correctly by hand, but handling all the oddities of
+ # Windows/UNIX mappings, extension attributes, deprecated
+ # features, etc makes it impractical.
+- # FIXME: use manifest
+ if os.spawnlp(os.P_WAIT, 'unzip', 'unzip', '-o', self._path,
+ '-x', 'mimetype', '-d', install_dir):
+ # clean up install dir after failure
+--
+1.7.0.1
+
diff --git a/rpms/sugar-toolkit/set-default-accelerators-for-Copy-and-Paste-buttons.patch b/rpms/sugar-toolkit/set-default-accelerators-for-Copy-and-Paste-buttons.patch
new file mode 100644
index 0000000..2bf3d9d
--- /dev/null
+++ b/rpms/sugar-toolkit/set-default-accelerators-for-Copy-and-Paste-buttons.patch
@@ -0,0 +1,34 @@
+From 1bd42e5922736b729941ec5fb1dc4a7ede4f169b Mon Sep 17 00:00:00 2001
+From: Bernie Innocenti <bernie@codewiz.org>
+Date: Sat, 19 Jun 2010 08:23:04 -0400
+Subject: [PATCH] Set default accelerators for Copy and Paste buttons
+Organization: Sugar Labs Foundation
+X-Subversion: sucks
+
+---
+ src/sugar/activity/widgets.py | 2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/src/sugar/activity/widgets.py b/src/sugar/activity/widgets.py
+index 83b689c..f89ac1f 100644
+--- a/src/sugar/activity/widgets.py
++++ b/src/sugar/activity/widgets.py
+@@ -108,6 +108,7 @@ class CopyButton(ToolButton):
+ def __init__(self, **kwargs):
+ ToolButton.__init__(self, 'edit-copy', **kwargs)
+ self.props.tooltip = _('Copy')
++ self.props.accelerator = '<Ctrl>C'
+
+
+ class PasteButton(ToolButton):
+@@ -115,6 +116,7 @@ class PasteButton(ToolButton):
+ def __init__(self, **kwargs):
+ ToolButton.__init__(self, 'edit-paste', **kwargs)
+ self.props.tooltip = _('Paste')
++ self.props.accelerator = '<Ctrl>V'
+
+
+ class ShareButton(RadioMenuButton):
+--
+1.7.1
+
diff --git a/rpms/sugar-toolkit/sl1842-notify-red-alert.patch b/rpms/sugar-toolkit/sl1842-notify-red-alert.patch
new file mode 100644
index 0000000..51e66e6
--- /dev/null
+++ b/rpms/sugar-toolkit/sl1842-notify-red-alert.patch
@@ -0,0 +1,74 @@
+From: anishmangal2002@gmail.com
+To: sugar-devel@lists.sugarlabs.org
+Cc: bernie@codewiz.org, anishmangal2002 <anishmangal2002@gmail.com>
+Subject: [PATCH] Add NotifyRedAlert inherited from NotifyAlert
+Date: Mon, 14 Jun 2010 02:51:23 +0530
+
+Adds the NotifyRedAlert class which is an alert inherited from
+ NotifyAlert. When the alert message is displayed, it glows the
+alert bar Red before slowly fading out to black, thus resulting
+in a more visible notification.
+
+Signed-off-by: anishmangal2002 <anishmangal2002@gmail.com>
+---
+ src/sugar/graphics/alert.py | 46 +++++++++++++++++++++++++++++++++++++++++++
+ 1 files changed, 46 insertions(+), 0 deletions(-)
+
+diff --git a/src/sugar/graphics/alert.py b/src/sugar/graphics/alert.py
+index 4441909..b4dfee1 100644
+--- a/src/sugar/graphics/alert.py
++++ b/src/sugar/graphics/alert.py
+@@ -432,3 +432,49 @@ class NotifyAlert(Alert):
+ self._response(gtk.RESPONSE_OK)
+ return False
+ return True
++
++class NotifyRedAlert(NotifyAlert):
++ """
++ Timeout alert with only an "OK" button and a glowing Red border- just for notifications
++
++ Examples
++ --------
++
++ .. code-block:: python
++ from sugar.graphics.alert import NotifyRedAlert
++ ...
++ #### Method: _alert_notify, create a NotifyRed alert (with only an 'OK'
++ button)
++ # and add it to the UI.
++ def _alert_notify(self):
++ #Notice that for a NotifyRedAlert, you pass the number of seconds in
++ #which to notify. By default, this is 5.
++ alert = NotifyRedAlert(10)
++ alert.props.title=_('Title of Alert Goes Here')
++ alert.props.msg = _('Text message of notify alert goes here')
++ alert.connect('response', self._alert_response_cb)
++ self.add_alert(alert)
++
++ """
++
++ def __init__(self, timeout=5, **kwargs):
++ NotifyAlert.__init__(self, timeout, **kwargs)
++ self.saturation = 255
++
++ gobject.timeout_add(20, self.__modify_color_timeout)
++
++ def __modify_color_timeout(self):
++ if self.saturation:
++ self.saturation -= 1
++
++ # Form the hex color representation
++ if self.saturation <= 15:
++ color = '#0%s0000' % hex(self.saturation)[2:]
++ else:
++ color = '#%s0000' % hex(self.saturation)[2:]
++ else:
++ return False
++
++ self.modify_bg( gtk.STATE_NORMAL, gtk.gdk.Color(color))
++ self.show()
++ return True
+--
+1.7.0.4
+
+
diff --git a/rpms/sugar-toolkit/sl1876.patch b/rpms/sugar-toolkit/sl1876.patch
new file mode 100644
index 0000000..ac80ce6
--- /dev/null
+++ b/rpms/sugar-toolkit/sl1876.patch
@@ -0,0 +1,16 @@
+--- sugar-toolkit-0.88.1/src/sugar/bundle/bundle.py.orig 2010-06-03 02:55:42.000000000 -0400
++++ sugar-toolkit-0.88.1/src/sugar/bundle/bundle.py 2010-06-06 10:09:00.000000000 -0400
+@@ -71,7 +71,12 @@ class Bundle(object):
+ self._zip_file = None
+
+ if not os.path.isdir(self._path):
+- self._zip_file = zipfile.ZipFile(self._path)
++ try:
++ self._zip_file = zipfile.ZipFile(self._path)
++ except (zipfile.error, LargeZipFile), ziperror:
++ raise MalformedBundleException(
++ "Error accessing zip file %s: %s"
++ % (self._path, ziperror))
+ self._check_zip_bundle()
+
+ # manifest = self._get_file(self._infodir + '/contents')
diff --git a/rpms/sugar-toolkit/sl1948-Race-condition-with-name-widget-in-the-activ.patch b/rpms/sugar-toolkit/sl1948-Race-condition-with-name-widget-in-the-activ.patch
new file mode 100644
index 0000000..e402617
--- /dev/null
+++ b/rpms/sugar-toolkit/sl1948-Race-condition-with-name-widget-in-the-activ.patch
@@ -0,0 +1,68 @@
+From 9b6ea6ed9d97b617b4c9633068369c074b3173b8 Mon Sep 17 00:00:00 2001
+From: Bernie Innocenti <bernie@codewiz.org>
+Date: Tue, 18 May 2010 18:30:34 -0400
+Subject: [sugar-toolkit] sl#1948: Race condition with name widget in the activity toolbar (0.88)
+Organization: Sugar Labs Foundation
+X-Subversion: sucks
+
+The fix consists in updating the datastore metadata on "focus-out-event".
+Previously, we were using the "change" event along with a 1s timeout, which
+was likely to trigger while the user was still typing into the text
+entry widget.
+
+Signed-off-by: Bernie Innocenti <bernie@codewiz.org>
+---
+ src/sugar/activity/widgets.py | 23 ++++++++---------------
+ 1 files changed, 8 insertions(+), 15 deletions(-)
+
+--- sugar-toolkit-0.88.1/src/sugar/activity/widgets.py.orig 2010-06-02 10:57:58.000000000 -0400
++++ sugar-toolkit-0.88.1/src/sugar/activity/widgets.py 2010-06-06 10:17:43.000000000 -0400
+@@ -183,12 +183,11 @@ class TitleEntry(gtk.ToolItem):
+ def __init__(self, activity, **kwargs):
+ gtk.ToolItem.__init__(self)
+ self.set_expand(False)
+- self._update_title_sid = None
+
+ self.entry = gtk.Entry(**kwargs)
+ self.entry.set_size_request(int(gtk.gdk.screen_width() / 3), -1)
+ self.entry.set_text(activity.metadata['title'])
+- self.entry.connect('changed', self.__title_changed_cb, activity)
++ self.entry.connect('focus-out-event', self.__title_changed_cb, activity)
+ self.entry.show()
+ self.add(self.entry)
+
+@@ -202,23 +201,16 @@ class TitleEntry(gtk.ToolItem):
+ self.entry.set_text(jobject['title'])
+
+ def __title_changed_cb(self, entry, activity):
+- if self._update_title_sid is not None:
+- gobject.source_remove(self._update_title_sid)
+- self._update_title_sid = gobject.timeout_add_seconds(
+- 1, self.__update_title_cb, activity)
+-
+- def __update_title_cb(self, activity):
+ title = self.entry.get_text()
++ if title != self._activity.metadata['title']:
++ activity.metadata['title'] = title
++ activity.metadata['title_set_by_user'] = '1'
++ activity.save()
++
++ shared_activity = activity.get_shared_activity()
++ if shared_activity is not None:
++ shared_activity.props.name = title
+
+- activity.metadata['title'] = title
+- activity.metadata['title_set_by_user'] = '1'
+- activity.save()
+-
+- shared_activity = activity.get_shared_activity()
+- if shared_activity is not None:
+- shared_activity.props.name = title
+-
+- self._update_title_sid = None
+ return False
+
+
+--
+1.7.0.1
+
diff --git a/rpms/sugar-toolkit/sugar-toolkit-dont-configure-fonts.patch b/rpms/sugar-toolkit/sugar-toolkit-dont-configure-fonts.patch
new file mode 100644
index 0000000..fa92187
--- /dev/null
+++ b/rpms/sugar-toolkit/sugar-toolkit-dont-configure-fonts.patch
@@ -0,0 +1,16 @@
+diff -ur a/src/sugar/activity/main.py b/src/sugar/activity/main.py
+--- a/src/sugar/activity/main.py 2010-02-10 16:28:23.000000000 +0100
++++ b/src/sugar/activity/main.py 2010-02-16 19:06:30.000000000 +0100
+@@ -98,12 +98,6 @@
+
+ gtk.icon_theme_get_default().append_search_path(bundle.get_icons_path())
+
+- # This code can be removed when we grow an xsettings daemon (the GTK+
+- # init routines will then automatically figure out the font settings)
+- settings = gtk.settings_get_default()
+- settings.set_property('gtk-font-name',
+- '%s %f' % (style.FONT_FACE, style.FONT_SIZE))
+-
+ locale_path = i18n.get_locale_path(bundle.get_bundle_id())
+
+ gettext.bindtextdomain(bundle.get_bundle_id(), locale_path)
diff --git a/rpms/sugar-toolkit/sugar-toolkit.spec b/rpms/sugar-toolkit/sugar-toolkit.spec
new file mode 100644
index 0000000..bcd2a2d
--- /dev/null
+++ b/rpms/sugar-toolkit/sugar-toolkit.spec
@@ -0,0 +1,436 @@
+%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")}
+
+Summary: Sugar toolkit
+Name: sugar-toolkit
+Version: 0.88.1
+Release: 4.3bernie%{?dist}
+URL: http://wiki.laptop.org/go/Sugar
+Source0: http://download.sugarlabs.org/sources/sucrose/glucose/%{name}/%{name}-%{version}.tar.bz2
+Source1: macros.sugar
+
+# Bug fixes
+
+#bernie: sugar-settings-manager breaks Browse
+#Patch0: sugar-toolkit-dont-configure-fonts.patch
+
+Patch1: fix-two-trivial-shell-log-warnings.patch
+Patch2: sl1876.patch
+Patch3: sl1948-Race-condition-with-name-widget-in-the-activ.patch
+Patch4: sl1842-notify-red-alert.patch
+Patch5: use-set_toolbar_box-in-example-code.patch
+Patch6: set-default-accelerators-for-Copy-and-Paste-buttons.patch
+
+# Experimental patches
+Patch101: remove-incomplete-MANIFEST-support.patch
+Patch102: kill-the-delayed-menus-for-good.patch
+Patch103: change-keep-string-to-keep-a-copy.patch
+
+License: LGPLv2+
+Group: System Environment/Libraries
+Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+BuildRequires: pkgconfig
+BuildRequires: pygtk2-devel
+BuildRequires: gettext
+BuildRequires: gtk2-devel
+BuildRequires: perl-XML-Parser
+BuildRequires: libSM-devel
+BuildRequires: alsa-lib-devel
+BuildRequires: intltool
+
+Requires: gnome-python2-rsvg
+Requires: dbus-python
+Requires: pygtk2
+Requires: hippo-canvas-python
+Requires: sugar-datastore
+Requires: sugar-base
+Requires: sugar-presence-service
+Requires: python-simplejson
+Requires: python-dateutil
+Requires: libxml2-python
+Requires: unzip
+
+%description
+Sugar is the core of the OLPC Human Interface. The toolkit provides
+a set of widgets to build HIG compliant applications and interfaces
+to interact with system services like presence and the datastore.
+
+%prep
+%setup -q
+
+#%patch0 -p1
+
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+
+%patch101 -p1
+%patch102 -p1
+%patch103 -p1
+
+%build
+%configure
+make %{?_smp_mflags} V=1
+
+%install
+rm -rf %{buildroot}
+make install DESTDIR=%{buildroot}
+
+mkdir -p %{buildroot}/%{_sysconfdir}/rpm/
+install -p %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/rpm/macros.sugar
+
+%find_lang %name
+
+#Remove libtool archives.
+find %{buildroot} -name '*.la' -exec rm -f {} ';'
+
+%clean
+rm -rf %{buildroot}
+
+%files -f %{name}.lang
+%defattr(-,root,root,-)
+%doc COPYING README
+
+%{python_sitelib}/*
+%{_sysconfdir}/rpm/macros.sugar
+
+%changelog
+* Thu Jun 3 2010 Peter Robinson <pbrobinson@gmail.com> - 0.88.1-1
+- New upstream stable 0.88.1 release
+
+* Tue Mar 20 2010 Peter Robinson <pbrobinson@gmail.com> - 0.88.0-1
+- New upstream stable 0.88.0 release
+
+* Wed Mar 10 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.8-1
+- New upstream release
+
+* Wed Feb 17 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.6-1
+- New upstream release
+
+* Tue Feb 16 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.5-4
+- Make sure to use correct patch
+
+* Tue Feb 16 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.5-3
+- Enable sugar-settings-manager support
+
+* Sat Feb 13 2010 Simon Schampijer <simon@schampijer.de> - 0.87.5-2
+- Add the requires field for python-dateutil (brings back activity start)
+
+* Thu Feb 11 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.5-1
+- New upstream release
+
+* Sun Feb 07 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.4-1
+- New upstream release
+
+* Tue Jan 12 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.3-1
+- New upstream release
+
+* Sat Jan 9 2010 Peter Robinson <pbrobinson@gmail.com> - 0.87.2-2
+- Updated to the new python sysarch spec file reqs
+
+* Wed Dec 23 2009 Sebastian Dziallas <sebastian@when.com> - 0.87.2-1
+- New upstream release
+
+* Fri Dec 18 2009 Peter Robinson <pbrobinson@gmail.com> 0.87.1-2
+- Remove libtool archives
+
+* Tue Dec 01 2009 Sebastian Dziallas <sebastian@when.com> - 0.87.1-1
+- New upstream release
+
+* Wed Oct 21 2009 Sebastian Dziallas <sebastian@when.com> - 0.86.2-1
+- Do not stop processing motion-notify-event #1507
+
+* Tue Oct 13 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.86.0-3
+- Add unzip as a dependency
+
+* Fri Oct 09 2009 Luke Macken <lmacken@redhat.com> - 0.86.0-2
+- Remove python-json requirement, which is now provided by Python 2.6
+
+* Sun Sep 27 2009 Sebastian Dziallas <sebastian@when.com> - 0.86.0-1
+- New upstream release
+
+* Fri Sep 18 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.8-1
+- New upstream release
+
+* Fri Sep 11 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.7-1
+- New upstream release
+
+* Wed Sep 05 2009 Peter Robinson <pbrobinson@gmail.com> - 0.85.6-2
+- Drop Requires: gettext, it should be just a BuildReq
+
+* Wed Sep 02 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.6-1
+- New upstream release
+
+* Wed Aug 26 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.5-1
+- New upstream release
+
+* Sun Aug 02 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.3-1
+- New upstream release
+
+* Sun Jul 26 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.85.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Sat Jul 18 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.2-1
+- New upstream release
+
+* Mon Apr 06 2009 Simon Schampijer <simon@schampijer.de> - 0.84.4-1
+- new german and spanish translations
+
+* Mon Apr 06 2009 Simon Schampijer <simon@schampijer.de> - 0.84.3-1
+- Journal Palette does not manage too many characters for a title correctly #610
+- Bundlebuilder list_files: Better error handling #635
+- Only call read_file once on activity startup #428
+- Revert "Listen for map in Window instead of in Canvas (alsroot) #428"
+- Use git ls-files instead of git-ls-files, to work with newer Git. d.sl.o #647
+- Bundlebuilder: Don't include whole directory in src tarball #397
+
+* Wed Apr 01 2009 Simon Schampijer <simon@schampijer.de> - 0.84.1-2.20090401git0a65259dc5
+- git snapshot
+
+* Sun Mar 22 2009 Simon Schampijer <simon@schampijer.de> - 0.84.1-1
+- Fix palettes scaling when using scaling factor 72 #504
+- Use Popen.communicate() to avoid hang (Sascha Silbe) #397
+- Change property type to object because int cannot be None #157
+
+* Wed Mar 18 2009 Simon Schampijer <simon@schampijer.de> - 0.84.0-2.20090318git29aa6cbe65
+- git snapshot
+
+* Tue Mar 03 2009 Simon Schampijer <simon@schampijer.de> - 0.84.0-1
+- Catch all exceptions while saving #224
+- Listen for map in Window instead of in Canvas (alsroot) #428
+- Restore minimal .xol support #459
+- Use the same font size independent from scaling
+- Don't recursively clean an activity if it's a symbolic link #444
+- Add extension to temp icon file names #458
+- Process .py files in subdirectories './setup genplot' #391 (alsroot)
+- Improve error handling of calls to XGrabKey #431
+- Cleanup temp files at exit #435
+- Let activities provide their own implementation of get_preview() #152
+- Show/Hide the color palette correctly (#374)
+- Support setting None as the secondary text #384
+- Only display one line in the secondary text of a clipping palette #384
+- Switch to existing instance of an activity if it's already running #410
+- Reveal the palette on right click on an activity icon #409
+
+* Fri Feb 27 2009 Simon Schampijer <simon@schampijer.de> - 0.83.7-3.20090227git6f210f0e33
+- git snapshot
+- Process .py files in subdirectories './setup genplot' #391 (alsroot)
+- Improve error handling of calls to XGrabKey #431
+- Cleanup temp files at exit #435
+- Let activities provide their own implementation of get_preview() #152
+- Show/Hide the color palette correctly (#374)
+- Support setting None as the secondary text #384
+- Only display one line in the secondary text of a clipping palette #384
+- Switch to existing instance of an activity if it's already running #410
+- Reveal the palette on right click on an activity icon #409
+
+* Wed Feb 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.83.7-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Mon Feb 23 2009 Simon Schampijer <simon@schampijer.de> - 0.83.7-1
+- Don't try to hide the tray if the activity has none (alsroot) #395
+- NamingAlert: Icon dependent on the entry type #353
+- Updated Languages
+
+* Mon Feb 16 2009 Simon Schampijer <simon@schampijer.de> - 0.83.6-1
+- Dates in journal are not translated #55
+- Keep error when displaying a file in Browse, Read, ImageViewer, etc #258
+- Palette positioning fixes #298
+- 'Resume' activity window when NamingAlert is displayed #293
+- Naming alert prevents activity close on keep error #224
+
+* Fri Feb 06 2009 Simon Schampijer <simon@schampijer.de> - 0.83.5-2.20090206git474b2c3476
+- Set the locale path for sugar-toolkit #55
+- Don't push to the DS a file path pointing to nowhere #258
+
+* Wed Feb 04 2009 Simon Schampijer <simon@schampijer.de> - 0.83.5-1
+- Palette positioning fixes #298
+- 'Resume' activity window when NamingAlert is displayed #293
+- Naming alert prevents activity close on keep error #224
+
+* Fri Jan 30 2009 Simon Schampijer <simon@schampijer.de> - 0.83.4-2.20090130git073336585d
+- Translation updates
+- Naming alert prevents activity close on keep error #224
+
+* Tue Jan 20 2009 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.4-1
+- separate debug settings from xsession #163
+- show an alert on activity close for suggesting the user to set properties of the entry #215
+- add a colorpicker to Sugar, only the ColorToolButton is public for now
+- move the palette to new style gobject properties
+- #3060 Add the possibility of filtering the object chooser by data type
+- fix uninstallling of activities that use symlinks #171
+- remove the hacks for asking the X server for screenshots and use gtk.Widget.get_snapshot() instead
+
+* Sun Jan 04 2009 Simon Schampijer <simon@laptop.org> - 0.83.3-1
+- remove session shutdown patch
+- add intltool as build requires
+- new download url
+- Fix palette highlighting on tray icons. Patch by benzea, style tweaks by marcopg
+- Rework palette state logic. Fix #42
+- Use g_timeout_add_seconds() for power efficiency
+- Add colors to icons in menu items
+- Add accelerator support to menu items
+- Simplify activity bundle installation
+- Dont pop down the palette when a submenu opens
+
+* Mon Dec 5 2008 Peter Robinson<pbrobinson@gmail.com> - 0.83.2-4
+- Rebuild for python 2.6
+
+* Sat Nov 29 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.2-3
+- Fix session shutdown
+
+* Fri Nov 28 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.2-1
+- Update to 0.83.2
+
+* Tue Nov 4 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.1-2
+- Update to 0.83.1
+
+* Wed Sep 24 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.11-1
+- #8626 Icons overlap unnecessarily in crowded neighborhood view.
+
+* Sat Sep 20 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.10-1
+- #8532 SIGCHLD fights with threads.
+- #8485 Switching between zoom levels seem to leak
+
+* Tue Sep 16 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.8-2
+- Fix a crash when we cannot access the alsa device
+
+* Sat Sep 13 2008 Simon Schampijer <simon@laptop.org> - 0.82.7-1
+- #8375 gst usage in the shell wastes 2.6mb
+- #8394 sugar shell leaks presence service info
+- #8469 palette.menu is leaked
+
+* Thu Sep 11 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.6-1
+- #8394 sugar shell leaks presence service info
+- #8392 Remove "dynamic" font height computation
+
+* Tue Sep 9 2008 Simon Schampijer <simon@laptop.org> - 0.82.5-4
+- remove pseudo.po from the source tarball
+
+* Wed Sep 3 2008 Jeremy Katz <katzj@redhat.com> - 0.82.5-3
+- requires gettext for bundlebuilder
+
+* Mon Sep 01 2008 Simon Schampijer <simon@laptop.org> - 0.82.5-2
+- added the python-json dependency
+
+* Mon Sep 01 2008 Simon Schampijer <simon@laptop.org> - 0.82.5-1
+- Translation updates
+- Add plural information for all languages
+- Fix plural form equations
+
+* Thu Aug 31 2008 Simon Schampijer <simon@laptop.org> - 0.82.4-1
+- 8136 Do a more 'standard' system installation for bundlebuilder
+- 7837 Do not try to list the mimetypes directory if it does not exist
+- 8220 Ensure that the widget is fully onscreen before taking a screenshot
+
+* Thu Aug 28 2008 Marco Pesenti Gritti <mpgritti@gmail.com> - 0.82.3-1
+- Translation updates
+
+* Thu Aug 28 2008 Marco Pesenti Gritti <mpgritti@gmail.com> - 0.82.2-1
+- #5428 downloads not starting in Browse due to old compreg.dat
+- #7733 Cannot install Wikipedia-10.xo
+- #7533 Activity does not respond to ctrl-q keyboard shortcut unless the 'Activity' tab is visible
+- #8000 Pulsing icon on activity launch significantly slows activity start-up
+- #8000 Pulsing icon on activity launch significantly slows activity start-up
+- #7270 /setup release does not update the bundle number
+- #7680 Activity name box is too small for localizaed name
+- #7881 Accelerator labels don't show up for most toolbar buttons
+- #7800 time stamps doesn't use translations
+
+* Tue Aug 22 2008 Tomeu Vizoso <tomeu@tomeuvizoso.net> - 0.82.1-2.20080822git2e6be9ea55
+- #7270 Add update functionality to Config in bundlebuilder
+- #7680 Widen activity tile entry
+- #7841 Wrap message in alert
+- #7881 Make Palette handle changes of the invoker widget
+
+* Tue Aug 12 2008 Marco Pesenti Gritti <mpgritti@gmail.com> - 0.82.1-1
+- Fix crash on startup on x86_64
+
+* Thu Aug 07 2008 Marco Pesenti Gritti <mpgritti@gmail.com> - 0.82.0-2
+- Rebuild
+
+* Thu Aug 07 2008 Marco Pesenti Gritti <mpgritti@gmail.com> - 0.82.0-1
+- #7759 Default home view should be Ring, not Freeform
+- #4084 Palette persist over zoom levels
+- #7754 Handle multiple Activity per process correctly
+- Add git tagging to the 'setup.py release' command
+
+* Fri Aug 01 2008 Morgan Collett <morgan@laptop.org> - 0.81.8-1
+- #7566 sugar-shell enters in infinite loop after a failed shutdown
+- #7534 Safer to always install, rather than comparing versions
+- #7494 Updates to Browse-92 fail
+
+* Wed Jul 23 2008 Simon Schampijer <simon@laptop.org> - 0.81.7-1
+- 5136 Keep error alert hard to find
+- 6014 Shutdown should sync activities data
+- 7532 install + open content bundles with journal
+- 7523 library index regeneration fails due to no XDG_DATA_DIRS
+- 4208 Battery indicator's icon fullness inconsistent with indicator %.
+- 7444 cannot close a shared activity when the initiator has disconnected
+- 7430 Favorites view is not preserved
+- 7434 Control panel UI for power management.
+- 5079 Could simplify sharing code
+
+* Tue Jul 15 2008 Simon Schampijer <simon@laptop.org> - 0.81.6-3.20080715gitd17347cc19
+- git snapshot
+- 7523 fix content bundle installation
+- 5079 simplify sharing code
+- 4208 get_icon_state accepts negative step kwarg
+- 7444 Fix crash in get_joined_buddies when a buddy disappears uncleanly
+
+* Wed Jul 09 2008 Simon Schampijer <simon@laptop.org> - 0.81.6-2.20080709git92ef9d298a
+- git snapshot
+- 7430 Preserve the favorites layout across reboots
+- 7434 Add power section to the control panel
+
+* Wed Jul 09 2008 Simon Schampijer <simon@laptop.org> - 0.81.6-1
+- 7015 Add proper alignment support to the tray control
+- 7054 Journal doesn't show correct colors for activity instances
+- 7046 Deleting activity bundle with journal leaves it showing in Home list view until reboot
+- 3939 Keep button should use XO colors
+- 7248 Speaker device has inconsistent behavior
+
+* Sat Jun 21 2008 Tomeu Vizoso <tomeu@tomeuvizoso.net> - 0.81.5-1
+- Add build dependency on libSM-devel
+- Support for session management (marco)
+- Make MANIFEST mandatory in bundlebuilder (homunq)
+- Add a position attribute to activity bundles (tomeu)
+- Add a scroll_to_item method to the tray (benzea)
+
+* Mon Jun 09 2008 Simon Schampijer <simon@laptop.org> - 0.81.4-1
+- Add an installation time property to the activity bundle (Tomeu)
+- Reveal palettes on right-click (Eben)
+- Refactor bundlebuilder and add dist_source command (Marco)
+- Enable journal to do open-with for activity bundles (Chema)
+- Add timezone, hot_corners, warm_edges to the profile (Simon)
+
+* Thu Apr 24 2008 Simon Schampijer <simon@laptop.org> - 0.79.6-1
+- Fix activity installation
+
+* Tue Apr 22 2008 Tomeu Vizoso <tomeu@tomeuvizoso.net> - 0.79.5-1
+- Correctly use tempfile.mkstemp().
+
+* Tue Apr 22 2008 Tomeu Vizoso <tomeu@tomeuvizoso.net> - 0.79.4-1
+- Pylint cleanup.
+
+* Wed Apr 09 2008 Tomeu Vizoso <tomeu@tomeuvizoso.net> - 0.79.3
+- Added default to label arg in palette constructor (eben)
+
+* Fri Apr 04 2008 Dennis Gilmore <dennis@ausil.us> - 0.79.2-3
+- add macro defining sugaractivitydir
+
+* Thu Apr 03 2008 Simon Schampijer <simon@laptop.org> - 0.79.2
+- add python-simplejson as dependency
+- #5474: Scale emblems
+
+* Wed Apr 2 2008 Simon Schampijer <simon@laptop.org> - 0.79.1
+- Frame/Home redesign - Put corner stone
+
+* Fri Feb 8 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.79.0-2
+- Fix source reference
+
+* Wed Feb 6 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.79.0-1
+- Initial build
diff --git a/rpms/sugar-toolkit/use-set_toolbar_box-in-example-code.patch b/rpms/sugar-toolkit/use-set_toolbar_box-in-example-code.patch
new file mode 100644
index 0000000..1995184
--- /dev/null
+++ b/rpms/sugar-toolkit/use-set_toolbar_box-in-example-code.patch
@@ -0,0 +1,30 @@
+From c13910dc358ba3793d5d150f336be0bcc1ef47eb Mon Sep 17 00:00:00 2001
+From: Bernie Innocenti <bernie@codewiz.org>
+Date: Sat, 19 Jun 2010 08:50:08 -0400
+Subject: [PATCH] Use set_toolbar_box() in example code.
+Organization: Sugar Labs Foundation
+X-Subversion: sucks
+
+The set_toolbox() method is obsolete, so let's not advertise it.
+
+Signed-off-by: Bernie Innocenti <bernie@codewiz.org>
+---
+ src/sugar/activity/widgets.py | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/src/sugar/activity/widgets.py b/src/sugar/activity/widgets.py
+index f89ac1f..8df04ea 100644
+--- a/src/sugar/activity/widgets.py
++++ b/src/sugar/activity/widgets.py
+@@ -328,7 +328,7 @@ class ActivityToolbox(Toolbox):
+ ... your code, inserting all other toolbars you need, like EditToolbar
+
+ # Add the toolbox to the activity frame:
+- self.set_toolbox(toolbox)
++ self.set_toolbar_box(toolbox)
+ # And make it visible:
+ toolbox.show()
+ """
+--
+1.7.1
+
diff --git a/rpms/sugar/add-font-dpi-schema.patch b/rpms/sugar/add-font-dpi-schema.patch
new file mode 100644
index 0000000..ddbc019
--- /dev/null
+++ b/rpms/sugar/add-font-dpi-schema.patch
@@ -0,0 +1,45 @@
+From: "Jorge (jasg) Saldivar" <jsaldivar@paraguayeduca.org>
+To: sayamindu@laptop.org
+Cc: bernie@codewiz.org, Jorge Saldivar <jsaldivar@paraguayeduca.org>
+Subject: [PATCH] Add font dpi schema
+Date: Fri, 18 Jun 2010 13:02:46 -0400
+
+From: Jorge Saldivar <jsaldivar@paraguayeduca.org>
+
+---
+ data/sugar.schemas.in | 12 +++++++++++-
+ 1 files changed, 11 insertions(+), 1 deletions(-)
+
+diff --git a/data/sugar.schemas.in b/data/sugar.schemas.in
+index b9606ba..78aea9d 100644
+--- a/data/sugar.schemas.in
++++ b/data/sugar.schemas.in
+@@ -249,6 +249,17 @@
+ <long>Font size that is used throughout the desktop.</long>
+ </locale>
+ </schema>
++ <schema>
++ <key>/schemas/desktop/sugar/font/dpi</key>
++ <applyto>/desktop/sugar/font/dpi</applyto>
++ <owner>sugar</owner>
++ <type>int</type>
++ <default>200</default>
++ <locale name="C">
++ <short>Default font dpi</short>
++ <long>Font dpi that is used throughout the desktop.</long>
++ </locale>
++ </schema>
+
+ <schema>
+ <key>/schemas/desktop/sugar/i18n/langpackdir</key>
+@@ -328,6 +339,5 @@
+ <long>GSM network personal unlock key configuration</long>
+ </locale>
+ </schema>
+-
+ </schemalist>
+ </gconfschemafile>
+--
+1.7.0.4
+
+
diff --git a/rpms/sugar/avoid-popping-an-empty-list-in-the-software-updater.patch b/rpms/sugar/avoid-popping-an-empty-list-in-the-software-updater.patch
new file mode 100644
index 0000000..a9a2245
--- /dev/null
+++ b/rpms/sugar/avoid-popping-an-empty-list-in-the-software-updater.patch
@@ -0,0 +1,36 @@
+Date: Sun, 23 May 2010 14:50:16 -0400
+From: Michael Stone <michael@laptop.org>
+To: sugar-devel@lists.sugarlabs.org
+Subject: [Sugar-devel] [PATCH] Avoid popping an empty list in the software
+ updater.
+
+When you run Sugar with no activities installed, UpdateModel._bundles_to_check
+is empty. Attempting to unconditionally pop this list results in an IndexError.
+Instead, the updater should stop trying to update bundles when it determines
+that it has no more bundles to check.
+
+Signed-off-by: Michael Stone <michael@laptop.org>
+---
+ extensions/cpsection/updater/model.py | 2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/extensions/cpsection/updater/model.py b/extensions/cpsection/updater/model.py
+index f2de65b..c45dcd3 100755
+--- a/extensions/cpsection/updater/model.py
++++ b/extensions/cpsection/updater/model.py
+@@ -71,6 +71,8 @@ class UpdateModel(gobject.GObject):
+ total = len(bundleregistry.get_registry())
+ current = total - len(self._bundles_to_check)
+
++ if len(self._bundles_to_check) == 0:
++ return False
+ bundle = self._bundles_to_check.pop()
+ self.emit('progress', UpdateModel.ACTION_CHECKING, bundle.get_name(),
+ current, total)
+--
+1.7.1
+_______________________________________________
+Sugar-devel mailing list
+Sugar-devel@lists.sugarlabs.org
+http://lists.sugarlabs.org/listinfo/sugar-devel
+
diff --git a/rpms/sugar/backup-0001-Volumes-Backup-and-Restore.patch b/rpms/sugar/backup-0001-Volumes-Backup-and-Restore.patch
new file mode 100644
index 0000000..0cafc79
--- /dev/null
+++ b/rpms/sugar/backup-0001-Volumes-Backup-and-Restore.patch
@@ -0,0 +1,705 @@
+From 9e7b9820f39d7f8f04099c9051e0db59c841d263 Mon Sep 17 00:00:00 2001
+From: Martin Abente <mabente@paraguayeduca.org>
+Date: Tue, 22 Jun 2010 15:59:13 -0400
+Subject: [PATCH] Journal Volumes Backup and Restore
+Organization: Paraguay Educa
+
+Add a basic backup and restore feature for the Sugar Journal.
+It provides:
+
+- Generic Backup and Restore dialog GUI.
+- Process manager class as an abstraction layer between the dialog and
+ backup/restore scripts. (Allowing to work with many backup and restore
+ technologies, using the same GUI, with no need for script rewrite).
+- Basic file system Volume Restore and Backup scripts implemented in Python.
+- New backup and restore options for journal volumes palettes.
+
+This patch is based on Esteban Arias (Plan Ceibal) Volume Backup and Restore
+patch, with a few changes:
+
+- Refactor original Backup dialog class into a generic dialog class.
+- Create specialized VolumeBackupDialog and VolumeRestoreDialog subclasses.
+- Rewrite backup and restore scripts in python for an easier sugar interaction.
+- Add backup identification helpers to jarabe.journal.misc.
+---
+ bin/Makefile.am | 4 +-
+ bin/journal-backup-volume | 57 ++++++++
+ bin/journal-restore-volume | 67 +++++++++
+ src/jarabe/journal/Makefile.am | 3 +-
+ src/jarabe/journal/misc.py | 27 ++++
+ src/jarabe/journal/processdialog.py | 248 +++++++++++++++++++++++++++++++++
+ src/jarabe/journal/volumestoolbar.py | 5 +-
+ src/jarabe/model/Makefile.am | 3 +-
+ src/jarabe/model/processmanagement.py | 98 +++++++++++++
+ src/jarabe/view/palettes.py | 44 ++++++
+ 10 files changed, 551 insertions(+), 5 deletions(-)
+ create mode 100644 bin/journal-backup-volume
+ create mode 100644 bin/journal-restore-volume
+ create mode 100644 src/jarabe/journal/processdialog.py
+ create mode 100644 src/jarabe/model/processmanagement.py
+
+diff --git a/bin/Makefile.am b/bin/Makefile.am
+index 05a9215..8cc87b5 100644
+--- a/bin/Makefile.am
++++ b/bin/Makefile.am
+@@ -5,7 +5,9 @@ python_scripts = \
+ sugar-install-bundle \
+ sugar-launch \
+ sugar-session \
+- sugar-ui-check
++ sugar-ui-check \
++ journal-backup-volume \
++ journal-restore-volume
+
+ bin_SCRIPTS = \
+ sugar \
+diff --git a/bin/journal-backup-volume b/bin/journal-backup-volume
+new file mode 100644
+index 0000000..4f3ec8a
+--- /dev/null
++++ b/bin/journal-backup-volume
+@@ -0,0 +1,57 @@
++#!/usr/bin/env python
++# Copyright (C) 2010, Paraguay Educa <tecnologia@paraguayeduca.org>
++#
++# 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 os
++import sys
++import subprocess
++import logging
++
++from sugar import env
++#from sugar.datastore import datastore
++
++backup_identifier = sys.argv[2]
++volume_path = sys.argv[1]
++
++if len(sys.argv) != 3:
++ print 'Usage: %s <volume_path> <backup_identifier>' % sys.argv[0]
++ exit(1)
++
++logging.debug('Backup started')
++
++backup_path = os.path.join(volume_path, 'backup', backup_identifier)
++
++if not os.path.exists(backup_path):
++ os.makedirs(backup_path)
++
++#datastore.freeze()
++subprocess.call(['pkill', '-9', '-f', 'python.*datastore-service'])
++
++result = 0
++try:
++ cmd = ['tar', '-C', env.get_profile_path(), '-czf', \
++ os.path.join(backup_path, 'datastore.tar.gz'), 'datastore']
++
++ subprocess.check_call(cmd)
++
++except Exception, e:
++ logging.error('Backup failed: %s', str(e))
++ result = 1
++
++#datastore.thaw()
++
++logging.debug('Backup finished')
++exit(result)
+diff --git a/bin/journal-restore-volume b/bin/journal-restore-volume
+new file mode 100644
+index 0000000..aa14ad0
+--- /dev/null
++++ b/bin/journal-restore-volume
+@@ -0,0 +1,67 @@
++#!/usr/bin/env python
++# Copyright (C) 2010, Paraguay Educa <tecnologia@paraguayeduca.org>
++#
++# 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 os
++import sys
++import shutil
++import logging
++import subprocess
++
++from sugar import env
++#from sugar.datastore import datastore
++
++backup_identifier = sys.argv[2]
++volume_path = sys.argv[1]
++
++if len(sys.argv) != 3:
++ print 'Usage: %s <volume_path> <backup_identifier>' % sys.argv[0]
++ exit(1)
++
++logging.debug('Restore started')
++
++journal_path = os.path.join(env.get_profile_path(), 'datastore')
++backup_path = os.path.join(volume_path, 'backup', backup_identifier, 'datastore.tar.gz')
++
++if not os.path.exists(backup_path):
++ logging.error('Could not find backup file %s', backup_path)
++ exit(1)
++
++#datastore.freeze()
++subprocess.call(['pkill', '-9', '-f', 'python.*datastore-service'])
++
++result = 0
++try:
++ if os.path.exists(journal_path):
++ shutil.rmtree(journal_path)
++
++ subprocess.check_call(['tar', '-C', env.get_profile_path(), '-xzf', backup_path])
++
++except Exception, e:
++ logging.error('Restore failed: %s', str(e))
++ result = 1
++
++try:
++ shutil.rmtree(os.path.join(journal_path, 'index'))
++ os.remove(os.path.join(journal_path, 'index_updated'))
++ os.remove(os.path.join(journal_path, 'version'))
++except:
++ logging.debug('Restore has no index files')
++
++#datastore.thaw()
++
++logging.debug('Restore finished')
++exit(result)
+diff --git a/src/jarabe/journal/Makefile.am b/src/jarabe/journal/Makefile.am
+index f4bf273..a760869 100644
+--- a/src/jarabe/journal/Makefile.am
++++ b/src/jarabe/journal/Makefile.am
+@@ -14,4 +14,5 @@ sugar_PYTHON = \
+ model.py \
+ objectchooser.py \
+ palettes.py \
+- volumestoolbar.py
++ volumestoolbar.py \
++ processdialog.py
+diff --git a/src/jarabe/journal/misc.py b/src/jarabe/journal/misc.py
+index 24ad216..6e3cb95 100644
+--- a/src/jarabe/journal/misc.py
++++ b/src/jarabe/journal/misc.py
+@@ -1,4 +1,5 @@
+ # Copyright (C) 2007, One Laptop Per Child
++# Copyright (C) 2010, Paraguay Educa <tecnologia@paraguayeduca.org>
+ #
+ # 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
+@@ -249,3 +250,29 @@ def get_icon_color(metadata):
+ return XoColor(client.get_string('/desktop/sugar/user/color'))
+ else:
+ return XoColor(metadata['icon-color'])
++
++def get_backup_identifier():
++ serial_number = get_xo_serial()
++ if serial_number is None:
++ serial_number = get_nick()
++ return serial_number
++
++def get_xo_serial():
++ path = '/ofw/serial-number'
++
++ if os.access(path, os.R_OK) == 0:
++ return None
++
++ file_descriptor = open(path, 'r')
++ content = file_descriptor.read()
++ file_descriptor.close()
++
++ if content:
++ return content.strip()
++ else:
++ logging.error('No serial number at %s', path)
++ return None
++
++def get_nick():
++ client = gconf.client_get_default()
++ return client.get_string("/desktop/sugar/user/nick")
+diff --git a/src/jarabe/journal/processdialog.py b/src/jarabe/journal/processdialog.py
+new file mode 100644
+index 0000000..8217973
+--- /dev/null
++++ b/src/jarabe/journal/processdialog.py
+@@ -0,0 +1,248 @@
++#!/usr/bin/env python
++# Copyright (C) 2010, Plan Ceibal <comunidad@plan.ceibal.edu.uy>
++# Copyright (C) 2010, Paraguay Educa <tecnologia@paraguayeduca.org>
++#
++# 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
++import gobject
++import gconf
++import logging
++
++from gettext import gettext as _
++from sugar.graphics import style
++from sugar.graphics.icon import Icon
++from sugar.graphics.xocolor import XoColor
++
++from jarabe.journal import misc
++from jarabe.model import shell
++from jarabe.model import processmanagement
++from jarabe.model.session import get_session_manager
++
++class ProcessDialog(gtk.Window):
++
++ __gtype_name__ = 'SugarProcessDialog'
++
++ def __init__(self, process_script='', process_params=[], restart_after=True):
++
++ #FIXME: Workaround limitations of Sugar core modal handling
++ shell_model = shell.get_model()
++ shell_model.set_zoom_level(shell_model.ZOOM_HOME)
++
++ gtk.Window.__init__(self)
++
++ self._process_script = processmanagement.find_and_absolutize(process_script)
++ self._process_params = process_params
++ self._restart_after = restart_after
++ self._start_message = _('Running')
++ self._failed_message = _('Failed')
++ self._finished_message = _('Finished')
++
++ self.set_border_width(style.LINE_WIDTH)
++ width = gtk.gdk.screen_width()
++ height = gtk.gdk.screen_height()
++ self.set_size_request(width, height)
++ self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
++ self.set_decorated(False)
++ self.set_resizable(False)
++ self.set_modal(True)
++
++ self._colored_box = gtk.EventBox()
++ self._colored_box.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white"))
++ self._colored_box.show()
++
++ self._vbox = gtk.VBox()
++ self._vbox.set_spacing(style.DEFAULT_SPACING)
++ self._vbox.set_border_width(style.GRID_CELL_SIZE)
++
++ self._colored_box.add(self._vbox)
++ self.add(self._colored_box)
++
++ self._setup_information()
++ self._setup_progress_bar()
++ self._setup_options()
++
++ self._vbox.show()
++
++ self.connect("realize", self.__realize_cb)
++
++ self._process_management = processmanagement.ProcessManagement()
++ self._process_management.connect('process-management-running', self._set_status_updated)
++ self._process_management.connect('process-management-started', self._set_status_started)
++ self._process_management.connect('process-management-finished', self._set_status_finished)
++ self._process_management.connect('process-management-failed', self._set_status_failed)
++
++ def _setup_information(self):
++ client = gconf.client_get_default()
++ color = XoColor(client.get_string('/desktop/sugar/user/color'))
++
++ self._icon = Icon(icon_name='activity-journal', pixel_size=style.XLARGE_ICON_SIZE, xo_color=color)
++ self._icon.show()
++
++ self._vbox.pack_start(self._icon, False)
++
++ self._title = gtk.Label()
++ self._title.modify_fg(gtk.STATE_NORMAL, style.COLOR_BLACK.get_gdk_color())
++ self._title.set_use_markup(True)
++ self._title.set_justify(gtk.JUSTIFY_CENTER)
++ self._title.show()
++
++ self._vbox.pack_start(self._title, False)
++
++ self._message = gtk.Label()
++ self._message.modify_fg(gtk.STATE_NORMAL, style.COLOR_BLACK.get_gdk_color())
++ self._message.set_use_markup(True)
++ self._message.set_line_wrap(True)
++ self._message.set_justify(gtk.JUSTIFY_CENTER)
++ self._message.show()
++
++ self._vbox.pack_start(self._message, True)
++
++ def _setup_options(self):
++ hbox = gtk.HBox(True, 3)
++ hbox.show()
++
++ icon = Icon(icon_name='dialog-ok')
++
++ self._start_button = gtk.Button()
++ self._start_button.set_image(icon)
++ self._start_button.set_label(_('Start'))
++ self._start_button.connect('clicked', self.__start_cb)
++ self._start_button.show()
++
++ icon = Icon(icon_name='dialog-cancel')
++
++ self._close_button = gtk.Button()
++ self._close_button.set_image(icon)
++ self._close_button.set_label(_('Cancel'))
++ self._close_button.connect('clicked', self.__close_cb)
++ self._close_button.show()
++
++ icon = Icon(icon_name='system-restart')
++
++ self._restart_button = gtk.Button()
++ self._restart_button.set_image(icon)
++ self._restart_button.set_label(_('Restart'))
++ self._restart_button.connect('clicked', self.__restart_cb)
++ self._restart_button.hide()
++
++ hbox.add(self._start_button)
++ hbox.add(self._close_button)
++ hbox.add(self._restart_button)
++
++ halign = gtk.Alignment(1, 0, 0, 0)
++ halign.show()
++ halign.add(hbox)
++
++ self._vbox.pack_start(halign, False, False, 3)
++
++ def _setup_progress_bar(self):
++ alignment = gtk.Alignment(xalign=0.5, yalign=0.5, xscale=0.5)
++ alignment.show()
++
++ self._progress_bar = gtk.ProgressBar(adjustment=None)
++ self._progress_bar.hide()
++
++ alignment.add(self._progress_bar)
++ self._vbox.pack_start(alignment)
++
++ def __realize_cb(self, widget):
++ self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
++ self.window.set_accept_focus(True)
++
++ def __close_cb(self, button):
++ self.destroy()
++
++ def __start_cb(self, button):
++ self._process_management.do_process([self._process_script] + self._process_params)
++
++ def __restart_cb(self, button):
++ session_manager = get_session_manager()
++ session_manager.logout()
++
++ def _set_status_started(self, model, data=None):
++ self._message.set_markup(self._start_message)
++
++ self._start_button.hide()
++ self._close_button.hide()
++
++ self._progress_bar.set_fraction(0.05)
++ self._progress_bar_handler = gobject.timeout_add(1000, self.__progress_bar_handler_cb)
++ self._progress_bar.show()
++
++ def __progress_bar_handler_cb(self):
++ self._progress_bar.pulse()
++ return True
++
++ def _set_status_updated(self, model, data):
++ pass
++
++ def _set_status_finished(self, model, data=None):
++ self._message.set_markup(self._finished_message)
++
++ self._progress_bar.hide()
++ self._start_button.hide()
++
++ if self._restart_after:
++ self._restart_button.show()
++ else:
++ self._close_button.show()
++
++ def _set_status_failed(self, model, error_message=''):
++ self._message.set_markup('%s %s' % (self._failed_message, error_message))
++
++ self._progress_bar.hide()
++ self._start_button.show()
++ self._close_button.show()
++
++ logging.error(error_message)
++
++
++class VolumeBackupDialog(ProcessDialog):
++
++ def __init__(self, volume_path):
++ ProcessDialog.__init__(self, 'journal-backup-volume', \
++ [volume_path, misc.get_backup_identifier()])
++
++ self._resetup_information(volume_path)
++
++ def _resetup_information(self, volume_path):
++ self._start_message = '%s %s. \n\n' % (_('Please wait, saving Journal content to'), volume_path) + \
++ '<big><b>%s</b></big>' % _('Do not remove the storage device!')
++
++ self._finished_message = _('The Journal content has been saved.')
++
++ self._title.set_markup('<big><b>%s</b></big>' % _('Backup'))
++
++ self._message.set_markup('%s %s' % (_('Journal content will be saved to'), volume_path))
++
++class VolumeRestoreDialog(ProcessDialog):
++
++ def __init__(self, volume_path):
++ ProcessDialog.__init__(self, 'journal-restore-volume', \
++ [volume_path, misc.get_backup_identifier()])
++
++ self._resetup_information(volume_path)
++
++ def _resetup_information(self, volume_path):
++ self._start_message = '%s %s. \n\n' % (_('Please wait, restoring Journal content from'), volume_path) + \
++ '<big><b>%s</b></big>' % _('Do not remove the storage device!')
++
++ self._finished_message = _('The Journal content has been restored.')
++
++ self._title.set_markup('<big><b>%s</b></big>' % _('Restore'))
++
++ self._message.set_markup('%s %s.\n\n' % (_('Journal content will be restored from'), volume_path) + \
++ '<big><b>%s</b> %s</big>' % (_('Warning:'), _('Current Journal content will be deleted!')))
++
+diff --git a/src/jarabe/journal/volumestoolbar.py b/src/jarabe/journal/volumestoolbar.py
+index 74b974c..2e64fe2 100644
+--- a/src/jarabe/journal/volumestoolbar.py
++++ b/src/jarabe/journal/volumestoolbar.py
+@@ -27,7 +27,7 @@ from sugar.graphics.palette import Palette
+ from sugar.graphics.xocolor import XoColor
+
+ from jarabe.journal import model
+-from jarabe.view.palettes import VolumePalette
++from jarabe.view.palettes import JournalVolumePalette
+
+ class VolumesToolbar(gtk.Toolbar):
+ __gtype_name__ = 'VolumesToolbar'
+@@ -164,11 +164,12 @@ class VolumeButton(BaseButton):
+ self.props.xo_color = color
+
+ def create_palette(self):
+- palette = VolumePalette(self._mount)
++ palette = JournalVolumePalette(self._mount)
+ #palette.props.invoker = FrameWidgetInvoker(self)
+ #palette.set_group_id('frame')
+ return palette
+
++
+ class JournalButton(BaseButton):
+ def __init__(self):
+ BaseButton.__init__(self, mount_point='/')
+diff --git a/src/jarabe/model/Makefile.am b/src/jarabe/model/Makefile.am
+index e9f0700..8fdc552 100644
+--- a/src/jarabe/model/Makefile.am
++++ b/src/jarabe/model/Makefile.am
+@@ -15,4 +15,5 @@ sugar_PYTHON = \
+ shell.py \
+ screen.py \
+ session.py \
+- sound.py
++ sound.py \
++ processmanagement.py
+diff --git a/src/jarabe/model/processmanagement.py b/src/jarabe/model/processmanagement.py
+new file mode 100644
+index 0000000..466e1f6
+--- /dev/null
++++ b/src/jarabe/model/processmanagement.py
+@@ -0,0 +1,98 @@
++# Copyright (C) 2010, Paraguay Educa <tecnologia@paraguayeduca.org>
++# 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
++# the Free Software Foundation; either version 2 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, write to the Free Software
++# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++
++import os
++import gobject
++import glib
++import gio
++
++from sugar import env
++from gettext import gettext as _
++
++BYTES_TO_READ = 100
++
++class ProcessManagement(gobject.GObject):
++
++ __gtype_name__ = 'ProcessManagement'
++
++ __gsignals__ = {
++ 'process-management-running' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([str])),
++ 'process-management-started' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
++ 'process-management-finished' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
++ 'process-management-failed' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([str]))
++ }
++
++ def __init__(self):
++ gobject.GObject.__init__(self)
++ self._running = False
++
++ def do_process(self, cmd):
++ self._run_cmd_async(cmd)
++
++ def _report_process_status(self, stream, result):
++ data = stream.read_finish(result)
++
++ if len(data):
++ self.emit('process-management-running', data)
++ stream.read_async(BYTES_TO_READ, self._report_process_status)
++
++ def _report_process_error(self, stream, result, concat_err=''):
++ data = stream.read_finish(result)
++ concat_err = concat_err + data
++
++ if len(data) == 0:
++ self.emit('process-management-failed', concat_err)
++ else:
++ stream.read_async(BYTES_TO_READ, self._report_process_error, user_data=concat_err)
++
++ def _notify_error(self, stderr):
++ stdin_stream = gio.unix.InputStream(stderr, True)
++ stdin_stream.read_async(BYTES_TO_READ, self._report_process_error)
++
++ def _notify_process_status(self, stdout):
++ stdin_stream = gio.unix.InputStream(stdout, True)
++ stdin_stream.read_async(BYTES_TO_READ, self._report_process_status)
++
++ def _run_cmd_async(self, cmd):
++ if self._running == False:
++ try:
++ pid, stdin, stdout, stderr = glib.spawn_async(cmd, flags=glib.SPAWN_DO_NOT_REAP_CHILD, standard_output=True, standard_error=True)
++ gobject.child_watch_add(pid, _handle_process_end, (self, stderr))
++ except Exception:
++ self.emit('process-management-failed', _("Error - Call process: ") + str(cmd))
++ else:
++ self._notify_process_status(stdout)
++ self._running = True
++ self.emit('process-management-started')
++
++def _handle_process_end(pid, condition, (myself, stderr)):
++ myself._running = False
++
++ if os.WIFEXITED(condition) and\
++ os.WEXITSTATUS(condition) == 0:
++ myself.emit('process-management-finished')
++ else:
++ myself._notify_error(stderr)
++
++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 --git a/src/jarabe/view/palettes.py b/src/jarabe/view/palettes.py
+index ad84f08..2fc4d5f 100644
+--- a/src/jarabe/view/palettes.py
++++ b/src/jarabe/view/palettes.py
+@@ -1,4 +1,6 @@
+ # Copyright (C) 2008 One Laptop Per Child
++# Copyright (C) 2010, Plan Ceibal <comunidad@plan.ceibal.edu.uy>
++# Copyright (C) 2010, Paraguay Educa <tecnologia@paraguayeduca.org>
+ #
+ # 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
+@@ -31,6 +33,7 @@ from sugar.graphics.xocolor import XoColor
+ from sugar.activity import activityfactory
+ from sugar.activity.activityhandle import ActivityHandle
+
++from jarabe.journal.processdialog import VolumeBackupDialog, VolumeRestoreDialog
+ from jarabe.model import shell
+ from jarabe.view import launcher
+ from jarabe.view.viewsource import setup_view_source
+@@ -258,3 +261,44 @@ class VolumePalette(Palette):
+ self._free_space_label.props.label = _('%(free_space)d MB Free') % \
+ {'free_space': free_space / (1024 * 1024)}
+
++
++class JournalVolumePalette(VolumePalette):
++
++ __gtype_name__ = 'JournalVolumePalette'
++
++ def __init__(self, mount):
++ VolumePalette.__init__(self, mount)
++
++ journal_separator = gtk.SeparatorMenuItem()
++ journal_separator.show()
++
++ self.menu.prepend(journal_separator)
++
++ icon = Icon(icon_name='transfer-from', icon_size=gtk.ICON_SIZE_MENU)
++ icon.show()
++
++ menu_item_journal_restore = MenuItem(_('Restore Journal'))
++ menu_item_journal_restore.set_image(icon)
++ menu_item_journal_restore.connect('activate', self.__journal_restore_activate_cb, mount.get_root().get_path())
++ menu_item_journal_restore.show()
++
++ self.menu.prepend(menu_item_journal_restore)
++
++ icon = Icon(icon_name='transfer-to', icon_size=gtk.ICON_SIZE_MENU)
++ icon.show()
++
++ menu_item_journal_backup = MenuItem(_('Backup Journal'))
++ menu_item_journal_backup.set_image(icon)
++ menu_item_journal_backup.connect('activate', self.__journal_backup_activate_cb, mount.get_root().get_path())
++ menu_item_journal_backup.show()
++
++ self.menu.prepend(menu_item_journal_backup)
++
++ def __journal_backup_activate_cb(self, menu_item, mount_path):
++ dialog = VolumeBackupDialog(mount_path)
++ dialog.show()
++
++ def __journal_restore_activate_cb(self, menu_item, mount_path):
++ dialog = VolumeRestoreDialog(mount_path)
++ dialog.show()
++
+--
+1.6.0.4
+
diff --git a/rpms/sugar/backup-0002-Journal-XS-backup-and-restore.patch b/rpms/sugar/backup-0002-Journal-XS-backup-and-restore.patch
new file mode 100644
index 0000000..3fb69a1
--- /dev/null
+++ b/rpms/sugar/backup-0002-Journal-XS-backup-and-restore.patch
@@ -0,0 +1,209 @@
+From 630cff5c5ffecb70fd96faa568ad3ae270f8b0e3 Mon Sep 17 00:00:00 2001
+From: Martin Abente <mabente@paraguayeduca.org>
+Date: Wed, 23 Jun 2010 17:12:59 -0400
+Subject: [PATCH] Journal XS backup and restore
+Organization: Paraguay Educa
+
+Include a new journal volumes toolbar icon. The icon represents
+the schoolserver. The icon palette provides a backup and restore
+options.
+---
+ src/jarabe/desktop/favoritesview.py | 2 +
+ src/jarabe/journal/processdialog.py | 30 ++++++++++++++++++++++++++
+ src/jarabe/journal/volumestoolbar.py | 37 +++++++++++++++++++++++++++++--
+ src/jarabe/view/palettes.py | 39 +++++++++++++++++++++++++++++++++-
+ 4 files changed, 104 insertions(+), 4 deletions(-)
+
+diff --git a/src/jarabe/desktop/favoritesview.py b/src/jarabe/desktop/favoritesview.py
+index aca945a..a311b52 100644
+--- a/src/jarabe/desktop/favoritesview.py
++++ b/src/jarabe/desktop/favoritesview.py
+@@ -42,6 +42,7 @@ from jarabe.view import launcher
+ from jarabe.model.buddy import BuddyModel
+ from jarabe.model import shell
+ from jarabe.model import bundleregistry
++from jarabe.journal.journalactivity import get_journal
+ from jarabe.journal import misc
+
+ from jarabe.desktop import schoolserver
+@@ -328,6 +329,7 @@ class FavoritesView(hippo.Canvas):
+ alert.props.msg = _('You are now registered ' \
+ 'with your school server.')
+ self._my_icon.remove_register_menu()
++ get_journal()._volumes_toolbar.setup_xs_button()
+
+ ok_icon = Icon(icon_name='dialog-ok')
+ alert.add_button(gtk.RESPONSE_OK, _('Ok'), ok_icon)
+diff --git a/src/jarabe/journal/processdialog.py b/src/jarabe/journal/processdialog.py
+index 8217973..4d8704e 100644
+--- a/src/jarabe/journal/processdialog.py
++++ b/src/jarabe/journal/processdialog.py
+@@ -246,3 +246,33 @@ class VolumeRestoreDialog(ProcessDialog):
+ self._message.set_markup('%s %s.\n\n' % (_('Journal content will be restored from'), volume_path) + \
+ '<big><b>%s</b> %s</big>' % (_('Warning:'), _('Current Journal content will be deleted!')))
+
++class XSBackupDialog(ProcessDialog):
++
++ def __init__(self, xs_hostname):
++ ProcessDialog.__init__(self, 'journal-backup')
++ self._resetup_information(xs_hostname)
++
++ def _resetup_information(self, xs_hostname):
++ self._start_message = '%s %s.' % (_('Please wait, saving Journal content to'), xs_hostname)
++
++ self._finished_message = _('The journal content has been saved.')
++
++ self._title.set_markup('<big><b>%s</b></big>' % _('Backup'))
++
++ self._message.set_text('%s %s.' % (_('Journal content will be saved to'), xs_hostname))
++
++class XSRestoreDialog(ProcessDialog):
++
++ def __init__(self, xs_hostname):
++ ProcessDialog.__init__(self, 'journal-restore')
++ self._resetup_information(xs_hostname)
++
++ def _resetup_information(self, xs_hostname):
++ self._start_message = '%s %s.' % (_('Please wait, restoring journal content from'), xs_hostname)
++
++ self._finished_message = _('The journal content has been restored.')
++
++ self._title.set_markup('<big><b>%s</b></big>' % _('Restore'))
++
++ self._message.set_text('%s %s.' % (_('Journal content will be restored from'), xs_hostname))
++
+diff --git a/src/jarabe/journal/volumestoolbar.py b/src/jarabe/journal/volumestoolbar.py
+index 2e64fe2..e1f9ce0 100644
+--- a/src/jarabe/journal/volumestoolbar.py
++++ b/src/jarabe/journal/volumestoolbar.py
+@@ -22,12 +22,14 @@ import gio
+ import gtk
+ import gconf
+
++from sugar.graphics.toolbutton import ToolButton
+ from sugar.graphics.radiotoolbutton import RadioToolButton
++from sugar.graphics.icon import Icon
+ from sugar.graphics.palette import Palette
+ from sugar.graphics.xocolor import XoColor
+
+ from jarabe.journal import model
+-from jarabe.view.palettes import JournalVolumePalette
++from jarabe.view.palettes import JournalVolumePalette, JournalXSPalette
+
+ class VolumesToolbar(gtk.Toolbar):
+ __gtype_name__ = 'VolumesToolbar'
+@@ -52,6 +54,7 @@ class VolumesToolbar(gtk.Toolbar):
+
+ self.connect('destroy', self.__destroy_cb)
+
++ self.setup_xs_button()
+ gobject.idle_add(self._set_up_volumes)
+
+ def __destroy_cb(self, widget):
+@@ -59,6 +62,21 @@ class VolumesToolbar(gtk.Toolbar):
+ volume_monitor.disconnect(self._mount_added_hid)
+ volume_monitor.disconnect(self._mount_removed_hid)
+
++ def setup_xs_button(self):
++ client = gconf.client_get_default()
++ backup_url = client.get_string('/desktop/sugar/backup_url')
++
++ if backup_url:
++ xs_button = XSButton()
++ xs_button.set_palette(JournalXSPalette(backup_url))
++ #xs_button.props.group = self._volume_buttons[0]
++ xs_button.show()
++
++ self._volume_buttons.append(xs_button)
++ position = len(self._volume_buttons) - 1
++ self.insert(xs_button, position)
++ self.show()
++
+ def _set_up_volumes(self):
+ volume_monitor = gio.volume_monitor_get()
+ self._mount_added_hid = \
+@@ -104,8 +122,9 @@ class VolumesToolbar(gtk.Toolbar):
+ def _get_button_for_mount(self, mount):
+ mount_point = mount.get_root().get_path()
+ for button in self.get_children():
+- if button.mount_point == mount_point:
+- return button
++ if type(button) == VolumeButton and \
++ button.mount_point == mount_point:
++ return button
+ logging.error('Couldnt find button with mount_point %r', mount_point)
+ return None
+
+@@ -180,3 +199,15 @@ class JournalButton(BaseButton):
+ color = XoColor(client.get_string('/desktop/sugar/user/color'))
+ self.props.xo_color = color
+
++class XSButton(ToolButton):
++ def __init__(self):
++ ToolButton.__init__(self)
++ self.set_icon('school-server')
++
++ def set_icon(self, icon_name):
++ client = gconf.client_get_default()
++ color = XoColor(client.get_string('/desktop/sugar/user/color'))
++ icon = Icon(icon_name=icon_name, xo_color=color, icon_size=gtk.ICON_SIZE_LARGE_TOOLBAR)
++ icon.show()
++
++ self.set_icon_widget(icon)
+diff --git a/src/jarabe/view/palettes.py b/src/jarabe/view/palettes.py
+index 2fc4d5f..51c40f1 100644
+--- a/src/jarabe/view/palettes.py
++++ b/src/jarabe/view/palettes.py
+@@ -33,7 +33,7 @@ from sugar.graphics.xocolor import XoColor
+ from sugar.activity import activityfactory
+ from sugar.activity.activityhandle import ActivityHandle
+
+-from jarabe.journal.processdialog import VolumeBackupDialog, VolumeRestoreDialog
++from jarabe.journal.processdialog import VolumeBackupDialog, VolumeRestoreDialog, XSBackupDialog, XSRestoreDialog
+ from jarabe.model import shell
+ from jarabe.view import launcher
+ from jarabe.view.viewsource import setup_view_source
+@@ -302,3 +302,40 @@ class JournalVolumePalette(VolumePalette):
+ dialog = VolumeRestoreDialog(mount_path)
+ dialog.show()
+
++class JournalXSPalette(Palette):
++ def __init__(self, xs_hostname):
++ Palette.__init__(self, _('School Server'))
++
++ self.props.secondary_text = xs_hostname
++
++ vbox = gtk.VBox()
++ self.set_content(vbox)
++ vbox.show()
++
++ icon = Icon(icon_name='transfer-to', icon_size=gtk.ICON_SIZE_MENU)
++ icon.show()
++
++ menu_item_journal_backup = MenuItem(_('Backup Journal'))
++ menu_item_journal_backup.set_image(icon)
++ menu_item_journal_backup.connect('activate', self.__journal_backup_activate_cb, xs_hostname)
++ menu_item_journal_backup.show()
++
++ self.menu.append(menu_item_journal_backup)
++
++ icon = Icon(icon_name='transfer-from', icon_size=gtk.ICON_SIZE_MENU)
++ icon.show()
++
++ menu_item_journal_restore = MenuItem(_('Restore Journal'))
++ menu_item_journal_restore.set_image(icon)
++ menu_item_journal_restore.connect('activate', self.__journal_restore_activate_cb, xs_hostname)
++ menu_item_journal_restore.show()
++
++ self.menu.append(menu_item_journal_restore)
++
++ def __journal_backup_activate_cb(self, menu_item, xs_hostname):
++ dialog = XSBackupDialog(xs_hostname)
++ dialog.show()
++
++ def __journal_restore_activate_cb(self, menu_item, xs_hostname):
++ dialog = XSRestoreDialog(xs_hostname)
++ dialog.show()
+--
+1.6.0.4
+
diff --git a/rpms/sugar/backup-0003-Journal-documents-volume-button.patch b/rpms/sugar/backup-0003-Journal-documents-volume-button.patch
new file mode 100644
index 0000000..05b00cc
--- /dev/null
+++ b/rpms/sugar/backup-0003-Journal-documents-volume-button.patch
@@ -0,0 +1,74 @@
+From c5f5aaa9c887ccee31fca91d96a3692a999cec7d Mon Sep 17 00:00:00 2001
+From: Martin Abente <mabente@paraguayeduca.org>
+Date: Fri, 25 Jun 2010 09:40:17 -0400
+Subject: [PATCH] Journal documents volume button
+Organization: Paraguay Educa
+
+Simplified version of Jorge Saldivar's patch. Add a new volume toolbar
+button for xdg-user-dir DOCUMENTS directory.
+---
+ src/jarabe/journal/volumestoolbar.py | 30 ++++++++++++++++++++++++++++++
+ 1 files changed, 30 insertions(+), 0 deletions(-)
+
+diff --git a/src/jarabe/journal/volumestoolbar.py b/src/jarabe/journal/volumestoolbar.py
+index a245b1f..448e228 100644
+--- a/src/jarabe/journal/volumestoolbar.py
++++ b/src/jarabe/journal/volumestoolbar.py
+@@ -21,6 +21,7 @@ import gobject
+ import gio
+ import gtk
+ import gconf
++import subprocess
+
+ from sugar.graphics.radiotoolbutton import RadioToolButton
+ from sugar.graphics.palette import Palette
+@@ -53,6 +54,7 @@ class VolumesToolbar(gtk.Toolbar):
+ self.connect('destroy', self.__destroy_cb)
+
+ self.setup_xs_button()
++ self.setup_documents_button()
+ gobject.idle_add(self._set_up_volumes)
+
+ def __destroy_cb(self, widget):
+@@ -75,6 +77,18 @@ class VolumesToolbar(gtk.Toolbar):
+ self.insert(xs_button, position)
+ self.show()
+
++ def setup_documents_button(self):
++ button = DocumentsButton()
++ button.props.group = self._volume_buttons[0]
++ button.set_palette(Palette(_('Documents')))
++ button.connect('toggled', self._button_toggled_cb)
++ button.show()
++
++ position = len(self._volume_buttons) - 1
++ self.insert(button, position)
++ self._volume_buttons.append(button)
++ self.show()
++
+ def _set_up_volumes(self):
+ volume_monitor = gio.volume_monitor_get()
+ self._mount_added_hid = \
+@@ -211,3 +225,19 @@ class XSButton(RadioToolButton):
+
+ def _button_toggled_cb(self):
+ pass
++
++class DocumentsButton(BaseButton):
++ def __init__(self):
++ self.__mount_directory_path = subprocess.Popen(["xdg-user-dir", "DOCUMENTS"], stdout=subprocess.PIPE).stdout.read().strip()
++
++ BaseButton.__init__(self, mount_point=self.__mount_directory_path)
++
++ self.props.named_icon = 'drive'
++
++ client = gconf.client_get_default()
++ color = XoColor(client.get_string('/desktop/sugar/user/color'))
++ self.props.xo_color = color
++
++ def get_mount_point(self):
++ return self.__mount_directory_path
++
+--
+1.6.0.4
+
diff --git a/rpms/sugar/backup-0004-es-translations.patch b/rpms/sugar/backup-0004-es-translations.patch
new file mode 100644
index 0000000..541032b
--- /dev/null
+++ b/rpms/sugar/backup-0004-es-translations.patch
@@ -0,0 +1,1559 @@
+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-0005-save-lease.patch b/rpms/sugar/backup-0005-save-lease.patch
new file mode 100644
index 0000000..6aa278f
--- /dev/null
+++ b/rpms/sugar/backup-0005-save-lease.patch
@@ -0,0 +1,38 @@
+From b6b7fda25326042720d11434829e9ccddd0564da Mon Sep 17 00:00:00 2001
+From: Martin Abente <mabente@paraguayeduca.org>
+Date: Tue, 13 Jul 2010 11:02:27 -0400
+Subject: [PATCH] Journal Backup save lease
+Organization: Paraguay Educa
+
+This feature was requested by Caacupe CATS.
+---
+ bin/journal-backup-volume | 6 ++++++
+ 1 files changed, 6 insertions(+), 0 deletions(-)
+
+diff --git a/bin/journal-backup-volume b/bin/journal-backup-volume
+index 4f3ec8a..fe13004 100644
+--- a/bin/journal-backup-volume
++++ b/bin/journal-backup-volume
+@@ -23,6 +23,7 @@ import logging
+ from sugar import env
+ #from sugar.datastore import datastore
+
++lease_path = '/security/lease.sig'
+ backup_identifier = sys.argv[2]
+ volume_path = sys.argv[1]
+
+@@ -37,6 +38,11 @@ backup_path = os.path.join(volume_path, 'backup', backup_identifier)
+ if not os.path.exists(backup_path):
+ os.makedirs(backup_path)
+
++# Save activation file
++if os.path.isfile(lease_path):
++ lease_content = open(lease_path).read()
++ open(os.path.join(volume_path, 'lease.sig'), 'a+').write(lease_content)
++
+ #datastore.freeze()
+ subprocess.call(['pkill', '-9', '-f', 'python.*datastore-service'])
+
+--
+1.6.0.4
+
diff --git a/rpms/sugar/bundle-Delete-profile-data-only-when-erased.patch b/rpms/sugar/bundle-Delete-profile-data-only-when-erased.patch
new file mode 100644
index 0000000..24e64fb
--- /dev/null
+++ b/rpms/sugar/bundle-Delete-profile-data-only-when-erased.patch
@@ -0,0 +1,52 @@
+From c0dcfaf0a0aa3fadc0c9b4c5b7f40fb0f98f21b8 Mon Sep 17 00:00:00 2001
+From: Martin Abente <mabente@paraguayeduca.org>
+Date: Tue, 6 Jul 2010 15:39:48 -0400
+Subject: [PATCH] Delete profile data only when erased
+Organization: Paraguay Educa
+
+Profile data should be deleted _only_ when the
+user explicitly erases the activity from the
+activities list.
+---
+ src/jarabe/desktop/activitieslist.py | 2 +-
+ src/jarabe/model/bundleregistry.py | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/jarabe/desktop/activitieslist.py b/src/jarabe/desktop/activitieslist.py
+index 87f2af0..0bd5aab 100644
+--- a/src/jarabe/desktop/activitieslist.py
++++ b/src/jarabe/desktop/activitieslist.py
+@@ -376,7 +376,7 @@ class ActivitiesList(gtk.VBox):
+ if response_id == gtk.RESPONSE_OK:
+ registry = bundleregistry.get_registry()
+ bundle = registry.get_bundle(bundle_id)
+- registry.uninstall(bundle)
++ registry.uninstall(bundle, delete_profile=True)
+
+ class ActivityListPalette(ActivityPalette):
+ __gtype_name__ = 'SugarActivityListPalette'
+diff --git a/src/jarabe/model/bundleregistry.py b/src/jarabe/model/bundleregistry.py
+index 86a2738..ae42583 100644
+--- a/src/jarabe/model/bundleregistry.py
++++ b/src/jarabe/model/bundleregistry.py
+@@ -376,7 +376,7 @@ class BundleRegistry(gobject.GObject):
+ elif not self.add_bundle(install_path):
+ raise RegistrationException
+
+- def uninstall(self, bundle, force=False):
++ def uninstall(self, bundle, force=False, delete_profile=False):
+ # TODO treat ContentBundle in special way
+ # needs rethinking while fixing ContentBundle support
+ if isinstance(bundle, ContentBundle) or \
+@@ -399,7 +399,7 @@ class BundleRegistry(gobject.GObject):
+
+ install_path = act.get_path()
+
+- bundle.uninstall(install_path, force)
++ bundle.uninstall(install_path, force, delete_profile)
+
+ if not self.remove_bundle(install_path):
+ raise RegistrationException
+--
+1.6.0.4
+
diff --git a/rpms/sugar/caacupe-Protected-activities-list.patch b/rpms/sugar/caacupe-Protected-activities-list.patch
new file mode 100644
index 0000000..0157ee9
--- /dev/null
+++ b/rpms/sugar/caacupe-Protected-activities-list.patch
@@ -0,0 +1,123 @@
+From da2f3c80ed902e40270deb4b584ca654aea6b35d Mon Sep 17 00:00:00 2001
+From: Martin Abente <mabente@paraguayeduca.org>
+Date: Wed, 7 Jul 2010 11:32:30 -0400
+Subject: [PATCH] Protected activities list
+Organization: Paraguay Educa
+
+Does not allow sugar to display erase option
+for activities that are included in the
+activities.protected list.
+
+This feature was requested by many teachers
+from different diployments, in example Paraguay.
+---
+ data/Makefile.am | 1 +
+ data/activities.protected | 14 ++++++++++++++
+ src/jarabe/desktop/activitieslist.py | 17 +++++++++--------
+ src/jarabe/model/bundleregistry.py | 19 +++++++++++++++++--
+ 4 files changed, 41 insertions(+), 10 deletions(-)
+ create mode 100644 data/activities.protected
+
+diff --git a/data/Makefile.am b/data/Makefile.am
+index 6a62d23..e34930b 100644
+--- a/data/Makefile.am
++++ b/data/Makefile.am
+@@ -11,6 +11,7 @@ sugar-100.gtkrc: gtkrc.em
+ sugardir = $(pkgdatadir)/data
+ sugar_DATA = \
+ activities.defaults \
++ activities.protected \
+ kbdconfig \
+ mime.defaults \
+ GPLv2 \
+diff --git a/data/activities.protected b/data/activities.protected
+new file mode 100644
+index 0000000..e3907ba
+--- /dev/null
++++ b/data/activities.protected
+@@ -0,0 +1,14 @@
++# Protected activities list
++
++org.laptop.WebActivity
++org.laptop.Calculate
++org.laptop.Chat
++org.vpri.EtoysActivity
++org.laptop.ImageViewerActivity
++org.laptop.sugar.Jukebox
++org.laptop.Log
++org.laptop.Pippy
++org.laptop.sugar.ReadActivity
++org.laptop.Terminal
++org.laptop.TurtleArtActivity
++org.laptop.AbiWordActivity
+diff --git a/src/jarabe/desktop/activitieslist.py b/src/jarabe/desktop/activitieslist.py
+index 0bd5aab..ac9cadf 100644
+--- a/src/jarabe/desktop/activitieslist.py
++++ b/src/jarabe/desktop/activitieslist.py
+@@ -405,14 +405,15 @@ class ActivityListPalette(ActivityPalette):
+ self.menu.append(self._favorite_item)
+ self._favorite_item.show()
+
+- if activity_info.is_user_activity():
+- menu_item = MenuItem(_('Erase'), 'list-remove')
+- menu_item.connect('activate', self.__erase_activate_cb)
+- self.menu.append(menu_item)
+- menu_item.show()
+-
+- if not os.access(activity_info.get_path(), os.W_OK):
+- menu_item.props.sensitive = False
++ if activity_info.is_user_activity() and \
++ not registry.protects_activity(self._bundle_id):
++ menu_item = MenuItem(_('Erase'), 'list-remove')
++ menu_item.connect('activate', self.__erase_activate_cb)
++ self.menu.append(menu_item)
++ menu_item.show()
++
++ if not os.access(activity_info.get_path(), os.W_OK):
++ menu_item.props.sensitive = False
+
+ registry = bundleregistry.get_registry()
+ self._activity_changed_sid = registry.connect('bundle_changed',
+diff --git a/src/jarabe/model/bundleregistry.py b/src/jarabe/model/bundleregistry.py
+index ae42583..20b095e 100644
+--- a/src/jarabe/model/bundleregistry.py
++++ b/src/jarabe/model/bundleregistry.py
+@@ -65,11 +65,13 @@ class BundleRegistry(gobject.GObject):
+
+ self._last_defaults_mtime = -1
+ self._favorite_bundles = {}
++ self._protected_activities = []
+
+ try:
+ self._load_favorites()
+- except Exception:
+- logging.exception('Error while loading favorite_activities.')
++ self._load_protected()
++ except Exception, e:
++ logging.exception('Error while loading activities defaults: %s' % str(e))
+
+ self._merge_default_favorites()
+
+@@ -126,6 +128,19 @@ class BundleRegistry(gobject.GObject):
+ self._last_defaults_mtime = float(favorites_data['defaults-mtime'])
+ self._favorite_bundles = favorite_bundles
+
++ def _load_protected(self):
++ f = open(os.path.join(config.data_path, 'activities.protected'), 'r')
++
++ for line in f.readlines():
++ line = line.strip()
++ if line and not line.startswith('#'):
++ self._protected_activities.append(line)
++
++ f.close()
++
++ def protects_activity(self, bundle_id):
++ return (bundle_id in self._protected_activities)
++
+ def _merge_default_favorites(self):
+ default_activities = []
+ defaults_path = os.path.join(config.data_path, 'activities.defaults')
+--
+1.6.0.4
+
diff --git a/rpms/sugar/click-on-journal-icons-with-a-exclusive-time-frame.patch b/rpms/sugar/click-on-journal-icons-with-a-exclusive-time-frame.patch
new file mode 100644
index 0000000..c7e702b
--- /dev/null
+++ b/rpms/sugar/click-on-journal-icons-with-a-exclusive-time-frame.patch
@@ -0,0 +1,62 @@
+From 44df38015ab61cdcb82b71d372534f4788ee3670 Mon Sep 17 00:00:00 2001
+From: Martin Abente <mabente@paraguayeduca.org>
+Date: Tue, 1 Jun 2010 16:50:17 -0400
+Subject: [PATCH] Click on journal icons with a exclusive time frame
+Organization: Paraguay Educa
+
+Double-or-more clicks on Journal icons causes multiple activities
+instances, saturating the whole evironment
+---
+ src/jarabe/journal/listview.py | 15 ++++++++++++++-
+ 1 files changed, 14 insertions(+), 1 deletions(-)
+
+diff --git a/src/jarabe/journal/listview.py b/src/jarabe/journal/listview.py
+index 9e19f70..2974f16 100644
+--- a/src/jarabe/journal/listview.py
++++ b/src/jarabe/journal/listview.py
+@@ -39,6 +39,8 @@ UPDATE_INTERVAL = 300
+ MESSAGE_EMPTY_JOURNAL = 0
+ MESSAGE_NO_MATCH = 1
+
++EXCLUSIVITY_TIME = 2000
++
+ class TreeView(gtk.TreeView):
+ __gtype_name__ = 'JournalTreeView'
+
+@@ -467,6 +469,7 @@ class ListView(BaseListView):
+ def __init__(self):
+ BaseListView.__init__(self)
+ self._is_dragging = False
++ self._exclusivity_timer = None
+
+ self.tree_view.connect('drag-begin', self.__drag_begin_cb)
+ self.tree_view.connect('button-release-event',
+@@ -475,7 +478,7 @@ class ListView(BaseListView):
+ self.cell_title.connect('edited', self.__cell_title_edited_cb)
+ self.cell_title.connect('editing-canceled', self.__editing_canceled_cb)
+
+- self.cell_icon.connect('clicked', self.__icon_clicked_cb)
++ self.cell_icon.connect('clicked', self.__icon_clicked_exclusively)
+ self.cell_icon.connect('detail-clicked', self.__detail_clicked_cb)
+
+ cell_detail = CellRendererDetail(self.tree_view)
+@@ -518,6 +521,16 @@ class ListView(BaseListView):
+ def __detail_clicked_cb(self, cell, uid):
+ self.emit('detail-clicked', uid)
+
++ def __icon_clicked_exclusively(self, cell, path):
++ if self._exclusivity_timer == None:
++ self._exclusivity_timer = gobject.timeout_add(EXCLUSIVITY_TIME, self.__allow_clicking)
++ self.__icon_clicked_cb(cell, path)
++ else:
++ logging.debug(_('Sorry, too soon to activate this icon again'))
++
++ def __allow_clicking(self):
++ self._exclusivity_timer = None
++
+ def __icon_clicked_cb(self, cell, path):
+ row = self.tree_view.get_model()[path]
+ metadata = model.get(row[ListModel.COLUMN_UID])
+--
+1.6.0.4
+
diff --git a/rpms/sugar/cpu-and-memory-resource-indicator.patch b/rpms/sugar/cpu-and-memory-resource-indicator.patch
new file mode 100644
index 0000000..e97d110
--- /dev/null
+++ b/rpms/sugar/cpu-and-memory-resource-indicator.patch
@@ -0,0 +1,258 @@
+From sugar-devel-bounces@lists.sugarlabs.org Fri Jul 2 17:17:43 2010
+Return-Path: <sugar-devel-bounces@lists.sugarlabs.org>
+X-Original-To: bernie@codewiz.org
+Delivered-To: bernie@trinity.develer.com
+Received: from solarsail.media.mit.edu (solarsail.media.mit.edu
+ [18.85.2.155]) by trinity.develer.com (Postfix) with ESMTPS id 47A8F1D6043
+ for <bernie@codewiz.org>; Fri, 2 Jul 2010 17:17:43 +0200 (CEST)
+X-Virus-Status: Clean
+X-Virus-Scanned: clamav-milter 0.95.3 at trinity.develer.com
+Received: from solarsail.media.mit.edu (localhost [127.0.0.1]) by
+ solarsail.media.mit.edu (Postfix) with ESMTP id BF8718105; Fri, 2 Jul 2010
+ 11:17:40 -0400 (EDT)
+Received: from mail-pv0-f170.google.com (mail-pv0-f170.google.com
+ [74.125.83.170]) by solarsail.media.mit.edu (Postfix) with ESMTP id
+ 71632805B for <sugar-devel@lists.sugarlabs.org>; Fri, 2 Jul 2010 11:17:37
+ -0400 (EDT)
+Received: by pvc22 with SMTP id 22so297585pvc.29 for
+ <sugar-devel@lists.sugarlabs.org>; Fri, 02 Jul 2010 08:17:36 -0700 (PDT)
+Received: by 10.114.146.5 with SMTP id t5mr1209378wad.4.1278083856260; Fri,
+ 02 Jul 2010 08:17:36 -0700 (PDT)
+Received: from localhost.localdomain ([59.178.42.124]) by mx.google.com
+ with ESMTPS id q6sm11900844waj.10.2010.07.02.08.17.32 (version=TLSv1/SSLv3
+ cipher=RC4-MD5); Fri, 02 Jul 2010 08:17:35 -0700 (PDT)
+From: anishmangal2002 <anishmangal2002@gmail.com>
+To:
+Date: Fri, 2 Jul 2010 20:47:28 +0530
+Message-Id: <1278083848-18942-1-git-send-email-anishmangal2002@gmail.com>
+X-Mailer: git-send-email 1.7.0.1
+In-Reply-To: <1>
+References: <1>
+Cc: sugar-devel@lists.sugarlabs.org, anishmangal2002
+ <anishmangal2002@gmail.com>
+Subject: [Sugar-devel] [PATCH] Add cpu and memory resource indicator to
+ frame
+X-BeenThere: sugar-devel@lists.sugarlabs.org
+X-Mailman-Version: 2.1.9
+Precedence: list
+List-Id: "Discussion of Sugar development and other technical matters."
+ <sugar-devel.lists.sugarlabs.org>
+List-Unsubscribe: <http://lists.sugarlabs.org/listinfo/sugar-devel>,
+ <mailto:sugar-devel-request@lists.sugarlabs.org?subject=unsubscribe>
+List-Archive: <http://lists.sugarlabs.org/archive/sugar-devel>
+List-Post: <mailto:sugar-devel@lists.sugarlabs.org>
+List-Help: <mailto:sugar-devel-request@lists.sugarlabs.org?subject=help>
+List-Subscribe: <http://lists.sugarlabs.org/listinfo/sugar-devel>,
+ <mailto:sugar-devel-request@lists.sugarlabs.org?subject=subscribe>
+MIME-Version: 1.0
+Content-Type: text/plain; charset="us-ascii"
+Sender: sugar-devel-bounces@lists.sugarlabs.org
+Errors-To: sugar-devel-bounces@lists.sugarlabs.org
+X-Spam-Status: No, score=-3.6 required=3.5 tests=AWL,BAYES_00,
+ DKIM_ADSP_CUSTOM_MED,FREEMAIL_FROM,RCVD_IN_DNSWL_MED,T_TO_NO_BRKTS_FREEMAIL
+ autolearn=ham version=3.3.1
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ trinity.develer.com
+Content-Transfer-Encoding: 8bit
+
+This patch adds an icon to the frame, whose palette
+menu displays the memory and cpu resources. For computing
+free memory, the code reads the /proc/meminfo file (thanks
+quozl) and for computing cpu usage, the code reads the
+/proc/stat file.
+
+The palette menu entries are only updated (in one second
+intervals) when the palette menu is visible thus
+possibly saving cpu cycles.
+
+Signed-off-by: anishmangal2002 <anishmangal2002@gmail.com>
+---
+ extensions/deviceicon/Makefile.am | 3 +-
+ extensions/deviceicon/resources.py | 159 ++++++++++++++++++++++++++++++++++++
+ 2 files changed, 161 insertions(+), 1 deletions(-)
+ create mode 100644 extensions/deviceicon/resources.py
+
+diff --git a/extensions/deviceicon/Makefile.am b/extensions/deviceicon/Makefile.am
+index 8a2e765..038c059 100644
+--- a/extensions/deviceicon/Makefile.am
++++ b/extensions/deviceicon/Makefile.am
+@@ -5,4 +5,5 @@ sugar_PYTHON = \
+ battery.py \
+ network.py \
+ speaker.py \
+- volume.py
++ volume.py \
++ resources.py
+diff --git a/extensions/deviceicon/resources.py b/extensions/deviceicon/resources.py
+new file mode 100644
+index 0000000..ab3fc08
+--- /dev/null
++++ b/extensions/deviceicon/resources.py
+@@ -0,0 +1,159 @@
++# Copyright (C) Anish Mangal <anishmangal2002@gmail.com>
++#
++# 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 2 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, write to the Free Software
++# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++
++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
++
++class DeviceView(TrayIcon):
++
++ FRAME_POSITION_RELATIVE = 500
++
++ def __init__(self):
++ icon_name = 'computer'
++
++ 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 = ResourcePalette(_('System resources'))
++ palette.set_group_id('frame')
++ return palette
++
++class ResourcePalette(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._cpu_times = self._get_cpu_times_list()
++
++ vbox = gtk.VBox()
++ self.set_content(vbox)
++
++ self._cpu_text = gtk.Label()
++ vbox.pack_start(self._cpu_text, padding=10)
++ self._cpu_text.show()
++
++ self._cpu_bar = gtk.ProgressBar()
++ self._cpu_bar.set_size_request(
++ style.zoom(style.GRID_CELL_SIZE * 4), -1)
++ vbox.pack_start(self._cpu_bar, padding=10)
++ self._cpu_bar.show()
++
++ self._memory_text = gtk.Label()
++ vbox.pack_start(self._memory_text, padding=10)
++ self._memory_text.show()
++
++ self._memory_bar = gtk.ProgressBar()
++ self._memory_bar.set_size_request(
++ style.zoom(style.GRID_CELL_SIZE * 4), -1)
++ vbox.pack_start(self._memory_bar, padding=10)
++ self._memory_bar.show()
++
++ vbox.show()
++
++ def _get_cpu_times_list(self):
++ """Return various cpu times as read from /proc/stat
++
++ This method returns the following cpu times as an ordered
++ list of numbers - [user, nice, system, idle, iowait] where,
++
++ user: normal processes executing in user mode
++ nice: niced processes executing in user mode
++ system: processes executing in kernel mode
++ idle: twiddling thumbs
++ iowait: waiting for I/O to complete
++
++ """
++ return [int(count)
++ for count in file('/proc/stat').readline().split()[1:6]]
++
++ def _percentage_cpu_available(self):
++ """
++ Return free CPU resources as a percentage
++
++ """
++ _cpu_times_new = self._get_cpu_times_list()
++ _cpu_times_current = [(new - old)
++ for new, old in zip(_cpu_times_new,
++ self._cpu_times)]
++ user, nice, system, idle, iowait = _cpu_times_current
++ cpu_free = (idle + iowait) * 100.0 / sum(_cpu_times_current)
++ self._cpu_times = self._get_cpu_times_list()
++ return cpu_free
++
++ def _percentage_memory_available(self):
++ """
++ Return free memory as a percentage
++
++ """
++ for line in file('/proc/meminfo'):
++ name, value, unit = line.split()[:3]
++ if 'MemTotal:' == name: total = int(value)
++ elif 'MemFree:' == name: free = int(value)
++ elif 'Buffers:' == name: buffers = int(value)
++ elif 'Cached:' == name: cached = int(value)
++ elif 'Active:' == name: break
++
++ return (free + buffers + cached) * 100.0 / total
++
++ def __timer_cb(self):
++ # Get free CPU resources
++ cpu_free = self._percentage_cpu_available()
++ # Get free memory resources
++ memory_free = self._percentage_memory_available()
++
++ # Update CPU and Memory labels and progressbars
++ self._cpu_text.set_label('CPU free: %d%%' % cpu_free)
++ self._cpu_text.show()
++ self._cpu_bar.set_fraction(cpu_free/100.0)
++ self._memory_text.set_label('Memory free: %d%%' % memory_free)
++ self._memory_text.show()
++ self._memory_bar.set_fraction(memory_free/100.0)
++
++ # Keep invoking this method if we are popped up
++ return self._popped_up
++
++ def _popup_cb(self, gobject_ref):
++ gobject.timeout_add(1000, self.__timer_cb)
++ self._popped_up = True
++
++ def _popdown_cb(self, gobject_ref):
++ # Kill timer if we are not popped up
++ self._popped_up = False
++
++
++def setup(tray):
++ if os.path.exists('/proc/stat') and os.path.exists('/proc/meminfo'):
++ tray.add_device(DeviceView())
++ else:
++ logging.warning('CPU and Memory statistics cannot be computed')
+--
+1.7.0.1
+
+_______________________________________________
+Sugar-devel mailing list
+Sugar-devel@lists.sugarlabs.org
+http://lists.sugarlabs.org/listinfo/sugar-devel
+
diff --git a/rpms/sugar/dynamically-set-number-of-control-panel-columns.patch b/rpms/sugar/dynamically-set-number-of-control-panel-columns.patch
new file mode 100644
index 0000000..2c4365f
--- /dev/null
+++ b/rpms/sugar/dynamically-set-number-of-control-panel-columns.patch
@@ -0,0 +1,96 @@
+From: anishmangal2002@gmail.com
+To: sugar-devel@lists.sugarlabs.org
+Cc: alsroot@member.fsf.org, sascha-pgp@silbe.org, bernie@codewiz.org,
+ anishmangal2002 <anishmangal2002@gmail.com>
+Subject: [PATCH] Dynamically set number of control panel columns
+Date: Sun, 20 Jun 2010 22:57:46 +0530
+
+From: anishmangal2002 <anishmangal2002@gmail.com>
+
+This patch sets the number of icon-columns in the control
+panel based on the screen resolution. This patch also sets
+the table row spacing to GRID_CELL_SIZE.
+
+How the number of columns are calculated:
+Let 'W' be the screen width, 's' be the GRID_CELL_SIZE and
+'n' be the number of icon columns that can be comfortably
+accomodated. Further, lets assume that the width an icon
+and its text-label occupies a horizontal space equivalent to
+(2.5 * s). We may represent 'W', 'n' and 's' by the following
+expression:
+
+ W - (2 * s) = (n * s + s) + (2.5 * n * s)
+
+where 'W - (2 * s)' is the width of the control panel menu,
+'(n * s + s)' is the cumulative column spacing of 'n' icons,
+and '(2.5 * n * s)' is the width occupied by 'n' icons and
+their text-labels. From the above, 'n' may be computed as
+
+ n = (1/3.5) * ( w/s - 3 )
+
+Signed-off-by: anishmangal2002 <anishmangal2002@gmail.com>
+---
+ src/jarabe/controlpanel/gui.py | 18 ++++++++++++++----
+ 1 files changed, 14 insertions(+), 4 deletions(-)
+
+diff --git a/src/jarabe/controlpanel/gui.py b/src/jarabe/controlpanel/gui.py
+index 51d9820..4a54310 100644
+--- a/src/jarabe/controlpanel/gui.py
++++ b/src/jarabe/controlpanel/gui.py
+@@ -33,7 +33,6 @@ from jarabe.controlpanel.toolbar import SectionToolbar
+ from jarabe import config
+
+ _logger = logging.getLogger('ControlPanel')
+-_MAX_COLUMNS = 5
+
+ class ControlPanel(gtk.Window):
+ __gtype_name__ = 'SugarControlPanel'
+@@ -41,6 +40,9 @@ class ControlPanel(gtk.Window):
+ def __init__(self):
+ gtk.Window.__init__(self)
+
++ self._MAX_COLUMNS = int( 0.285 * ( ( gtk.gdk.screen_width() /
++ style.GRID_CELL_SIZE ) - 3.0 ) )
++
+ self.set_border_width(style.LINE_WIDTH)
+ offset = style.GRID_CELL_SIZE
+ width = gtk.gdk.screen_width() - offset * 2
+@@ -110,6 +112,7 @@ class ControlPanel(gtk.Window):
+
+ self._table = gtk.Table()
+ self._table.set_col_spacings(style.GRID_CELL_SIZE)
++ self._table.set_row_spacings(style.GRID_CELL_SIZE)
+ self._table.set_border_width(style.GRID_CELL_SIZE)
+
+ self._scrolledwindow = gtk.ScrolledWindow()
+@@ -134,8 +137,15 @@ class ControlPanel(gtk.Window):
+ except ImportError:
+ del self._options['keyboard']
+
+- row = 0
+- column = 2
++ # If the screen width only supports two columns, start
++ # placing from the second row.
++ if self._MAX_COLUMNS == 2:
++ row = 1
++ column = 0
++ else:
++ row = 0
++ column = 2
++
+ options = self._options.keys()
+ options.sort()
+
+@@ -157,7 +167,7 @@ class ControlPanel(gtk.Window):
+ column, column + 1,
+ row, row + 1)
+ column += 1
+- if column == _MAX_COLUMNS:
++ if column == self._MAX_COLUMNS:
+ column = 0
+ row += 1
+
+--
+1.7.0.1
+
+
diff --git a/rpms/sugar/fix-duplication-of-OLPC-mesh-icons.patch b/rpms/sugar/fix-duplication-of-OLPC-mesh-icons.patch
new file mode 100644
index 0000000..3448cf0
--- /dev/null
+++ b/rpms/sugar/fix-duplication-of-OLPC-mesh-icons.patch
@@ -0,0 +1,80 @@
+From 9082631642b84270f4825bcf420eb7447b0fc91e Mon Sep 17 00:00:00 2001
+From: Martin Abente <mabente@paraguayeduca.org>
+Date: Wed, 9 Jun 2010 16:31:29 -0400
+Subject: [PATCH] Fix duplication of OLPC mesh icons
+Organization: Paraguay Educa
+
+Three or more mesh icons were being added after every suspend/resume.
+
+There was already code present to detect when the device goes away and
+remove the icons, but it was not working. NetworkManagerObserver was
+attempting to look at the properties of the gone-away device in order to
+see if it is a mesh device, but this was failing because the device has
+already been destroyed at this point.
+
+Solve this by recording the device path of the mesh device when it is
+detected, so that we can later determine if the gone-away device is the
+mesh device.
+
+Signed-off-by: Martin Abente <mabente@paraguayeduca.org>
+---
+ src/jarabe/desktop/meshbox.py | 17 +++++++++--------
+ 1 files changed, 9 insertions(+), 8 deletions(-)
+
+diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py
+index a04922b..eabc737 100644
+--- a/src/jarabe/desktop/meshbox.py
++++ b/src/jarabe/desktop/meshbox.py
+@@ -574,13 +574,15 @@ class OlpcMeshView(CanvasPulsingIcon):
+ self._update_color()
+
+ def disconnect(self):
++ device_object_path = self._mesh_mgr.mesh_device.object_path
++
+ self._bus.remove_signal_receiver(self.__device_state_changed_cb,
+ signal_name='StateChanged',
+- path=self._device.object_path,
++ path=device_object_path,
+ dbus_interface=_NM_DEVICE_IFACE)
+ self._bus.remove_signal_receiver(self.__wireless_properties_changed_cb,
+ signal_name='PropertiesChanged',
+- path=self._device.object_path,
++ path=device_object_path,
+ dbus_interface=_NM_OLPC_MESH_IFACE)
+
+
+@@ -821,6 +823,7 @@ class NetworkManagerObserver(object):
+ self._bus = None
+ self._devices = {}
+ self._netmgr = None
++ self._olpc_mesh_device_o = None
+
+ def listen(self):
+ try:
+@@ -885,6 +888,7 @@ class NetworkManagerObserver(object):
+ if device_type == network.DEVICE_TYPE_802_11_WIRELESS:
+ self._devices[device_o] = DeviceObserver(self._box, device)
+ elif device_type == network.DEVICE_TYPE_802_11_OLPC_MESH:
++ self._olpc_mesh_device_o = device_o
+ self._box.enable_olpc_mesh(device)
+
+ def _get_device_path_error_cb(self, err):
+@@ -899,12 +903,9 @@ class NetworkManagerObserver(object):
+ observer.disconnect()
+ del self._devices[device_o]
+ return
+-
+- device = self._bus.get_object(_NM_SERVICE, device_o)
+- props = dbus.Interface(device, 'org.freedesktop.DBus.Properties')
+- device_type = props.Get(_NM_DEVICE_IFACE, 'DeviceType')
+- if device_type == network.DEVICE_TYPE_802_11_OLPC_MESH:
+- self._box.disable_olpc_mesh(device)
++
++ if self._olpc_mesh_device_o == device_o:
++ self._box.disable_olpc_mesh(device_o)
+
+ class MeshBox(gtk.VBox):
+ __gtype_name__ = 'SugarMeshBox'
+--
+1.6.0.4
+
diff --git a/rpms/sugar/fix-for-file-list-sorting-for-FAT32-formatted-flash-drives-in-journal.patch b/rpms/sugar/fix-for-file-list-sorting-for-FAT32-formatted-flash-drives-in-journal.patch
new file mode 100644
index 0000000..b8f4dc8
--- /dev/null
+++ b/rpms/sugar/fix-for-file-list-sorting-for-FAT32-formatted-flash-drives-in-journal.patch
@@ -0,0 +1,89 @@
+From sugar-devel-bounces@lists.sugarlabs.org Thu May 13 06:21:46 2010
+Return-Path: <sugar-devel-bounces@lists.sugarlabs.org>
+X-Original-To: bernie@codewiz.org
+Delivered-To: bernie@trinity.develer.com
+Received: from solarsail.media.mit.edu (solarsail.media.mit.edu
+ [18.85.2.155]) by trinity.develer.com (Postfix) with ESMTPS id A20571D6066
+ for <bernie@codewiz.org>; Thu, 13 May 2010 06:21:46 +0200 (CEST)
+X-Virus-Status: Clean
+X-Virus-Scanned: clamav-milter 0.95.2 at trinity.develer.com
+Received: from solarsail.media.mit.edu (localhost [127.0.0.1]) by
+ solarsail.media.mit.edu (Postfix) with ESMTP id 0E855810F; Thu, 13 May 2010
+ 00:21:45 -0400 (EDT)
+Received: from mail-gx0-f225.google.com (mail-gx0-f225.google.com
+ [209.85.217.225]) by solarsail.media.mit.edu (Postfix) with ESMTP id
+ D1691810D for <sugar-devel@lists.sugarlabs.org>; Thu, 13 May 2010 00:21:42
+ -0400 (EDT)
+Received: by gxk25 with SMTP id 25so562494gxk.11 for
+ <sugar-devel@lists.sugarlabs.org>; Wed, 12 May 2010 21:21:42 -0700 (PDT)
+Received: by 10.100.244.32 with SMTP id r32mr5462417anh.28.1273724502212;
+ Wed, 12 May 2010 21:21:42 -0700 (PDT)
+Received: from localhost.localdomain ([186.16.14.172]) by mx.google.com
+ with ESMTPS id 20sm275799yxe.4.2010.05.12.21.21.36 (version=TLSv1/SSLv3
+ cipher=RC4-MD5); Wed, 12 May 2010 21:21:41 -0700 (PDT)
+From: Kenny Meyer <knny.myer@gmail.com>
+To: sugar-devel@lists.sugarlabs.org
+Date: Thu, 13 May 2010 00:21:11 -0400
+Message-Id: <1273724471-4615-1-git-send-email-knny.myer@gmail.com>
+X-Mailer: git-send-email 1.7.0.4
+Cc: Kenny Meyer <knny.myer@gmail.com>
+Subject: [Sugar-devel] [PATCH] Fix for file list sorting for FAT32
+ formatted flash drives in Journal.
+X-BeenThere: sugar-devel@lists.sugarlabs.org
+X-Mailman-Version: 2.1.9
+Precedence: list
+List-Id: "Discussion of Sugar development and other technical matters."
+ <sugar-devel.lists.sugarlabs.org>
+List-Unsubscribe: <http://lists.sugarlabs.org/listinfo/sugar-devel>,
+ <mailto:sugar-devel-request@lists.sugarlabs.org?subject=unsubscribe>
+List-Archive: <http://lists.sugarlabs.org/archive/sugar-devel>
+List-Post: <mailto:sugar-devel@lists.sugarlabs.org>
+List-Help: <mailto:sugar-devel-request@lists.sugarlabs.org?subject=help>
+List-Subscribe: <http://lists.sugarlabs.org/listinfo/sugar-devel>,
+ <mailto:sugar-devel-request@lists.sugarlabs.org?subject=subscribe>
+MIME-Version: 1.0
+Content-Type: text/plain; charset="us-ascii"
+Sender: sugar-devel-bounces@lists.sugarlabs.org
+Errors-To: sugar-devel-bounces@lists.sugarlabs.org
+X-Spam-Status: No, score=-1.9 required=5.0
+ tests=BAYES_00,DKIM_ADSP_CUSTOM_MED,
+ FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,T_TO_NO_BRKTS_FREEMAIL,UNPARSEABLE_RELAY
+ autolearn=ham version=3.3.1
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ trinity.develer.com
+X-Evolution-Source: imap://bernie@imap.develer.com/
+Content-Transfer-Encoding: 8bit
+
+Bernie, and I have had a special situation where a flash drive, which
+has been formatted on Windows with (apparently) a FAT32 file-system.
+Some of the files on the flash drive had a negative `changetime`, which
+resulted in automatically making the `changetime` of type long, whereas
+the sort() function expected an integer.
+
+This behaviour was reproduced on sugar-0.84.16. Should be backported to
+older versions. [?]
+---
+ src/jarabe/journal/model.py | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/src/jarabe/journal/model.py b/src/jarabe/journal/model.py
+index 50e8dc1..5abab07 100644
+--- a/src/jarabe/journal/model.py
++++ b/src/jarabe/journal/model.py
+@@ -289,7 +289,7 @@ class InplaceResultSet(BaseResultSet):
+ self._stopped = True
+
+ def setup_ready(self):
+- self._file_list.sort(lambda a, b: b[2] - a[2])
++ self._file_list.sort(lambda a, b: cmp(b[2], a[2]))
+ self.ready.send(self)
+
+ def find(self, query):
+--
+1.7.0.4
+
+_______________________________________________
+Sugar-devel mailing list
+Sugar-devel@lists.sugarlabs.org
+http://lists.sugarlabs.org/listinfo/sugar-devel
+
diff --git a/rpms/sugar/fix-name-clash-set_state.patch b/rpms/sugar/fix-name-clash-set_state.patch
new file mode 100644
index 0000000..31f08e8
--- /dev/null
+++ b/rpms/sugar/fix-name-clash-set_state.patch
@@ -0,0 +1,101 @@
+From sugar-devel-bounces@lists.sugarlabs.org Wed May 19 21:25:50 2010
+Return-Path: <sugar-devel-bounces@lists.sugarlabs.org>
+X-Original-To: bernie@codewiz.org
+Delivered-To: bernie@trinity.develer.com
+Received: from solarsail.media.mit.edu (solarsail.media.mit.edu
+ [18.85.2.155]) by trinity.develer.com (Postfix) with ESMTPS id 9091F1D608E
+ for <bernie@codewiz.org>; Wed, 19 May 2010 21:25:50 +0200 (CEST)
+X-Virus-Status: Clean
+X-Virus-Scanned: clamav-milter 0.95.2 at trinity.develer.com
+Received: from solarsail.media.mit.edu (localhost [127.0.0.1]) by
+ solarsail.media.mit.edu (Postfix) with ESMTP id 8BD587BC73E; Wed, 19 May
+ 2010 15:25:48 -0400 (EDT)
+Received: from buho.paraguayeduca.org (mail.paraguayeduca.org
+ [190.104.152.113]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256
+ bits)) (No client certificate requested) by solarsail.media.mit.edu
+ (Postfix) with ESMTPS id 0020A7BC739 for <sugar-devel@lists.sugarlabs.org>;
+ Wed, 19 May 2010 15:25:44 -0400 (EDT)
+Received: (qmail 25017 invoked by uid 508); 19 May 2010 15:35:59 -0400
+Received: from unknown (HELO localhost.localdomain) (192.168.0.233) by
+ buho.paraguayeduca.org with SMTP; 19 May 2010 15:35:59 -0400
+From: Martin Abente <mabente@paraguayeduca.org>
+To: tomeu@sugarlabs.org
+Date: Wed, 19 May 2010 15:25:41 -0400
+Message-Id: <1274297141-6580-1-git-send-email-mabente@paraguayeduca.org>
+X-Mailer: git-send-email 1.6.0.4
+In-Reply-To: <AANLkTinBDTbCkAzRZG6qUOzknKKpLzBqsDSTBOThZ2Cj@mail.gmail.com>
+References: <AANLkTinBDTbCkAzRZG6qUOzknKKpLzBqsDSTBOThZ2Cj@mail.gmail.com>
+Organization: Paraguay Educa
+Cc: sugar-devel@lists.sugarlabs.org, Martin Abente
+ <mabente@paraguayeduca.org>, bernie@sugarlabs.org
+Subject: [Sugar-devel] [sugar] Fixed name clash set_state
+X-BeenThere: sugar-devel@lists.sugarlabs.org
+X-Mailman-Version: 2.1.9
+Precedence: list
+List-Id: "Discussion of Sugar development and other technical matters."
+ <sugar-devel.lists.sugarlabs.org>
+List-Unsubscribe: <http://lists.sugarlabs.org/listinfo/sugar-devel>,
+ <mailto:sugar-devel-request@lists.sugarlabs.org?subject=unsubscribe>
+List-Archive: <http://lists.sugarlabs.org/archive/sugar-devel>
+List-Post: <mailto:sugar-devel@lists.sugarlabs.org>
+List-Help: <mailto:sugar-devel-request@lists.sugarlabs.org?subject=help>
+List-Subscribe: <http://lists.sugarlabs.org/listinfo/sugar-devel>,
+ <mailto:sugar-devel-request@lists.sugarlabs.org?subject=subscribe>
+MIME-Version: 1.0
+Content-Type: text/plain; charset="us-ascii"
+Sender: sugar-devel-bounces@lists.sugarlabs.org
+Errors-To: sugar-devel-bounces@lists.sugarlabs.org
+X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY
+ autolearn=ham version=3.3.1
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ trinity.develer.com
+X-Evolution-Source: imap://bernie@imap.develer.com/
+Content-Transfer-Encoding: 8bit
+
+Method set_state at GsmPalette class was unintentionally overiding
+its parent method.
+
+Signed-off-by: Martin Abente <mabente@paraguayeduca.org>
+---
+ extensions/deviceicon/network.py | 6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/extensions/deviceicon/network.py b/extensions/deviceicon/network.py
+index 94a4293..5f10ce3 100644
+--- a/extensions/deviceicon/network.py
++++ b/extensions/deviceicon/network.py
+@@ -235,7 +235,7 @@ class GsmPalette(Palette):
+ self.menu.append(self._toggle_state_item)
+ self._toggle_state_item.show()
+
+- self.set_state(_GSM_STATE_NOT_READY)
++ self.set_gsm_state(_GSM_STATE_NOT_READY)
+
+ self.info_box = gtk.VBox()
+
+@@ -267,7 +267,7 @@ class GsmPalette(Palette):
+ alignment.add(child)
+ return alignment
+
+- def set_state(self, state):
++ def set_gsm_state(self, state):
+ self._current_state = state
+ self._update_label_and_text()
+
+@@ -852,7 +852,7 @@ class GsmDeviceView(TrayIcon):
+ gsm_state = _GSM_STATE_NEED_AUTH
+
+ if self._palette is not None:
+- self._palette.set_state(gsm_state)
++ self._palette.set_gsm_state(gsm_state)
+
+ def disconnect(self):
+ self._bus.remove_signal_receiver(self.__state_changed_cb,
+--
+1.6.0.4
+
+_______________________________________________
+Sugar-devel mailing list
+Sugar-devel@lists.sugarlabs.org
+http://lists.sugarlabs.org/listinfo/sugar-devel
+
diff --git a/rpms/sugar/gsm-errors-palette.patch b/rpms/sugar/gsm-errors-palette.patch
new file mode 100644
index 0000000..756526e
--- /dev/null
+++ b/rpms/sugar/gsm-errors-palette.patch
@@ -0,0 +1,540 @@
+From 8b76b39bfcc29d1382c85a7c334e5e037d1487b9 Mon Sep 17 00:00:00 2001
+From: dcastelo <dcastelo@plan.ceibal.edu.uy>
+Date: Tue, 1 Jun 2010 11:36:35 -0300
+Subject: [PATCH] Showing-Errors-Pallete-Mockup-V5.patch
+
+---
+ extensions/deviceicon/network.py | 189 ++++++++++++++++++++++++++------------
+ src/jarabe/model/network.py | 160 ++++++++++++++++++++++++++++++--
+ 2 files changed, 280 insertions(+), 69 deletions(-)
+
+diff --git a/extensions/deviceicon/network.py b/extensions/deviceicon/network.py
+index 94a4293..d695fad 100644
+--- a/extensions/deviceicon/network.py
++++ b/extensions/deviceicon/network.py
+@@ -39,6 +39,8 @@ from sugar.graphics.tray import TrayIcon
+ from sugar.graphics import xocolor
+ from sugar.util import unique_id
+ from sugar import profile
++from sugar.graphics.icon import Icon
++from sugar.graphics.menuitem import MenuItem
+
+ from jarabe.model import network
+ from jarabe.model.network import Settings
+@@ -63,7 +65,7 @@ _GSM_STATE_NOT_READY = 0
+ _GSM_STATE_DISCONNECTED = 1
+ _GSM_STATE_CONNECTING = 2
+ _GSM_STATE_CONNECTED = 3
+-_GSM_STATE_NEED_AUTH = 4
++_GSM_STATE_FAILED = 4
+
+ def frequency_to_channel(frequency):
+ ftoc = { 2412: 1, 2417: 2, 2422: 3, 2427: 4,
+@@ -214,6 +216,7 @@ class WiredPalette(Palette):
+ ip_address_text = ""
+ self._ip_address_label.set_text(ip_address_text)
+
++
+ class GsmPalette(Palette):
+ __gtype_name__ = 'SugarGsmPalette'
+
+@@ -227,36 +230,53 @@ class GsmPalette(Palette):
+ def __init__(self):
+
+ Palette.__init__(self, label=_('Wireless modem'))
+-
+ self._current_state = None
++ self._alert = False
+
+- self._toggle_state_item = gtk.MenuItem('')
++ self._toggle_state_item = MenuItem('')
+ self._toggle_state_item.connect('activate', self.__toggle_state_cb)
+ self.menu.append(self._toggle_state_item)
+ self._toggle_state_item.show()
+
+- self.set_state(_GSM_STATE_NOT_READY)
+-
+ self.info_box = gtk.VBox()
+
+- self.data_label = gtk.Label()
+- self.data_label.props.xalign = 0.0
+- label_alignment = self._add_widget_with_padding(self.data_label)
+- self.info_box.pack_start(label_alignment)
+- self.data_label.show()
++ self.error_description_label = gtk.Label("")
++ self.error_description_label.set_line_wrap(True)
++ self.info_box.pack_start(self.error_description_label)
++
++ self.connection_info_box = gtk.HBox()
++
++ icon = Icon(icon_name='data-upload', icon_size=gtk.ICON_SIZE_MENU)
++ self.connection_info_box.pack_start(icon)
++ icon.show()
++ self._data_label_up = gtk.Label()
++ self._data_label_up.props.xalign = 0.0
++ label_alignment = self._add_widget_with_padding(self._data_label_up)
++ self.connection_info_box.pack_start(label_alignment)
++ self._data_label_up.show()
+ label_alignment.show()
+
+- self.connection_time_label = gtk.Label()
+- self.connection_time_label.props.xalign = 0.0
+- label_alignment = self._add_widget_with_padding( \
+- self.connection_time_label)
+- self.info_box.pack_start(label_alignment)
+- self.connection_time_label.show()
++ icon = Icon(icon_name='data-download', icon_size=gtk.ICON_SIZE_MENU)
++ self.connection_info_box.pack_start(icon)
++ icon.show()
++ self._data_label_down = gtk.Label()
++ self._data_label_down.props.xalign = 0.0
++ label_alignment = self._add_widget_with_padding(self._data_label_down)
++ self.connection_info_box.pack_start(label_alignment)
++ self._data_label_down.show()
+ label_alignment.show()
++
++ self.info_box.pack_start(self.connection_info_box)
+
++ self._error_accept_item = MenuItem('')
++ self._error_accept_item.connect('activate', self.__error_accept_cb)
++ self.menu.append(self._error_accept_item)
++
+ self.info_box.show()
+ self.set_content(self.info_box)
+
++ self.set_state(_GSM_STATE_NOT_READY)
++
+ def _add_widget_with_padding(self, child, xalign=0, yalign=0.5):
+ alignment = gtk.Alignment(xalign=xalign, yalign=yalign,
+ xscale=1, yscale=0.33)
+@@ -267,35 +287,90 @@ class GsmPalette(Palette):
+ alignment.add(child)
+ return alignment
+
+- def set_state(self, state):
++ def set_state(self, state, reason=0):
+ self._current_state = state
+- self._update_label_and_text()
++ self._update_label_and_text(reason)
+
+- def _update_label_and_text(self):
++ def _update_label_and_text(self, reason=0):
++
+ if self._current_state == _GSM_STATE_NOT_READY:
+ self._toggle_state_item.get_child().set_label('...')
+ self.props.secondary_text = _('Please wait...')
+-
++
+ elif self._current_state == _GSM_STATE_DISCONNECTED:
+ self._toggle_state_item.get_child().set_label(_('Connect'))
+- self.props.secondary_text = _('Disconnected')
+-
++ if not self._alert:
++ self.props.secondary_text = _('Disconnected')
++ icon = Icon(icon_name='dialog-ok', \
++ icon_size=gtk.ICON_SIZE_MENU)
++ self._toggle_state_item.set_image(icon)
++
+ elif self._current_state == _GSM_STATE_CONNECTING:
+ self._toggle_state_item.get_child().set_label(_('Cancel'))
+ self.props.secondary_text = _('Connecting...')
++ icon = Icon(icon_name='dialog-cancel', \
++ icon_size=gtk.ICON_SIZE_MENU)
++ self._toggle_state_item.set_image(icon)
+
+ elif self._current_state == _GSM_STATE_CONNECTED:
+ self._toggle_state_item.get_child().set_label(_('Disconnect'))
+- self.props.secondary_text = _('Connected')
+-
+- elif self._current_state == _GSM_STATE_NEED_AUTH:
+- self._toggle_state_item.get_child().set_label(_('Sim requires Pin/Puk'))
+- self.props.secondary_text = _('Authentication Error')
+-
++ self.update_connection_time()
++ icon = Icon(icon_name='media-eject', \
++ icon_size=gtk.ICON_SIZE_MENU)
++ self._toggle_state_item.set_image(icon)
++
++ elif self._current_state == _GSM_STATE_FAILED:
++ message_error = self._get_error_by_nm_reason(reason)
++ self.add_alert(_('Error: %s') % message_error[0], \
++ message_error[1])
+ else:
+ raise ValueError('Invalid GSM state while updating label and ' \
+ 'text, %s' % str(self._current_state))
+-
++
++ def add_alert(self, title, message):
++ self._alert = True
++ self.props.secondary_text = _("Connection Error")
++ self._error_accept_item.get_child().set_label(title)
++ self._error_accept_item.show()
++ self.error_description_label.set_text(message)
++ self.error_description_label.show()
++ self._toggle_state_item.set_sensitive(False)
++
++ def __error_accept_cb(self, alert):
++ self._alert = False
++ self._update_label_and_text()
++ self._error_accept_item.get_child().set_label('')
++ self._error_accept_item.hide()
++ self.error_description_label.hide()
++ self._toggle_state_item.set_sensitive(True)
++ self._full_request = [0, 0]
++
++ def update_connection_time(self, connection_time=None):
++ if (connection_time is not None):
++ self.props.secondary_text = _('Connected for ' + \
++ connection_time.strftime('%H:%M:%S'))
++ else:
++ self.props.secondary_text = _('Connected for ' \
++ + '00:00:00')
++
++ def update_stats(self, in_bytes, out_bytes):
++ in_KBytes = in_bytes / 1024
++ out_KBytes = out_bytes / 1024
++ self._data_label_up.set_text(_("%d KB") % (out_KBytes))
++ self._data_label_down.set_text(_("%d KB") % (in_KBytes))
++
++ def _get_error_by_nm_reason(self, reason):
++ if reason in [network.NM_DEVICE_STATE_REASON_NO_SECRETS, network.NM_DEVICE_STATE_REASON_GSM_PIN_CHECK_FAILED]:
++ message = _('Suggestion: Check your Pin/Puk configuration.')
++ elif reason in [network.NM_DEVICE_STATE_REASON_PPP_DISCONNECT, network.NM_DEVICE_STATE_REASON_PPP_FAILED]:
++ message = _('Suggestion: Check your Access Point Name (APN) configuration')
++ elif reason in [network.NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER, network.NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT]:
++ message = _('Suggestion: Check the Number configuration.')
++ else:
++ message = ''
++ message_tuple = (network.NM_DEVICE_STATE_REASON_DESCRIPTION[reason], message)
++ return message_tuple
++
+ def __toggle_state_cb(self, menuitem):
+ if self._current_state == _GSM_STATE_NOT_READY:
+ pass
+@@ -305,12 +380,10 @@ class GsmPalette(Palette):
+ self.emit('gsm-disconnect')
+ elif self._current_state == _GSM_STATE_CONNECTED:
+ self.emit('gsm-disconnect')
+- elif self._current_state == _GSM_STATE_NEED_AUTH:
+- self.emit('gsm-disconnect')
+ else:
+ raise ValueError('Invalid GSM state while emitting signal, %s' % \
+ str(self._current_state))
+-
++
+
+ class WirelessDeviceView(ToolButton):
+
+@@ -747,6 +820,7 @@ class GsmDeviceView(TrayIcon):
+ signal_name='PppStats',
+ path=self._device.object_path,
+ dbus_interface=_NM_SERIAL_IFACE)
++
+ def create_palette(self):
+ palette = GsmPalette()
+
+@@ -774,6 +848,9 @@ class GsmDeviceView(TrayIcon):
+ '/',
+ reply_handler=self.__connect_cb,
+ error_handler=self.__connect_error_cb)
++ else:
++ self._palette.add_alert(_('Connection Error'), \
++ _('There is no gsm connection available'))
+
+ def __connect_cb(self, active_connection):
+ logging.debug('Connected successfully to gsm device, %s',
+@@ -807,15 +884,15 @@ class GsmDeviceView(TrayIcon):
+
+ def __state_changed_cb(self, new_state, old_state, reason):
+ logging.debug('State: %s to %s, reason %s', old_state, new_state, reason)
+- self._update_state(int(new_state))
++ self._update_state(int(new_state), int(old_state), int(reason))
+
+ def __current_state_check_cb(self, properties):
+- self._update_state(int(properties['State']))
++ self._update_state(int(properties['State']), 0, 0)
+
+ def __current_state_check_error_cb(self, error):
+ raise RuntimeError('Error when checking gsm device state, %s' % error)
+
+- def _update_state(self, state):
++ def _update_state(self, state, old_state, reason):
+ gsm_state = None
+
+ if state is network.DEVICE_STATE_ACTIVATED:
+@@ -823,20 +900,22 @@ class GsmDeviceView(TrayIcon):
+ connection = network.find_gsm_connection()
+ if connection is not None:
+ connection.set_connected()
+- self._connection_timestamp = time.time() - \
++ self._connection_timestamp = time.time() - \
+ connection.get_settings().connection.timestamp
+ self._connection_time_handler = gobject.timeout_add_seconds( \
+ 1, self.__connection_timecount_cb)
+- self._update_stats(0, 0)
+- self._update_connection_time()
+- self._palette.info_box.show()
++ self._palette.update_connection_time()
++ self._palette.update_stats(0, 0)
++ if self._palette is not None:
++ self._palette.connection_info_box.show()
+
+ elif state is network.DEVICE_STATE_DISCONNECTED:
+ gsm_state = _GSM_STATE_DISCONNECTED
+ self._connection_timestamp = 0
+ if self._connection_time_handler is not None:
+ gobject.source_remove(self._connection_time_handler)
+- self._palette.info_box.hide()
++ if self._palette is not None:
++ self._palette.connection_info_box.hide()
+
+ elif state in [network.DEVICE_STATE_UNMANAGED,
+ network.DEVICE_STATE_UNAVAILABLE,
+@@ -845,14 +924,15 @@ class GsmDeviceView(TrayIcon):
+
+ elif state in [network.DEVICE_STATE_PREPARE,
+ network.DEVICE_STATE_CONFIG,
+- network.DEVICE_STATE_IP_CONFIG]:
++ network.DEVICE_STATE_IP_CONFIG,
++ network.DEVICE_STATE_NEED_AUTH]:
+ gsm_state = _GSM_STATE_CONNECTING
+-
+- elif state in [network.DEVICE_STATE_NEED_AUTH]:
+- gsm_state = _GSM_STATE_NEED_AUTH
++
++ elif state == network.DEVICE_STATE_FAILED:
++ gsm_state = _GSM_STATE_FAILED
+
+ if self._palette is not None:
+- self._palette.set_state(gsm_state)
++ self._palette.set_state(gsm_state, reason)
+
+ def disconnect(self):
+ self._bus.remove_signal_receiver(self.__state_changed_cb,
+@@ -861,25 +941,17 @@ class GsmDeviceView(TrayIcon):
+ dbus_interface=_NM_DEVICE_IFACE)
+
+ def __ppp_stats_changed_cb(self, in_bytes, out_bytes):
+- self._update_stats(in_bytes, out_bytes)
+-
+- def _update_stats(self, in_bytes, out_bytes):
+- in_KBytes = in_bytes / 1024
+- out_KBytes = out_bytes / 1024
+- text = _("Data sent %d KB / received %d KB") % (out_KBytes, in_KBytes)
+- self._palette.data_label.set_text(text)
++ self._palette.update_stats(in_bytes, out_bytes)
+
+ def __connection_timecount_cb(self):
+ self._connection_timestamp = self._connection_timestamp + 1
+- self._update_connection_time()
++ connection_time = \
++ datetime.datetime.fromtimestamp(self._connection_timestamp)
++ self._palette.update_connection_time(connection_time)
+ return True
+
+- def _update_connection_time(self):
+- connection_time = datetime.datetime.fromtimestamp( \
+- self._connection_timestamp)
+- text = _("Connection time ") + connection_time.strftime('%H : %M : %S')
+- self._palette.connection_time_label.set_text(text)
+
++
+ class WirelessDeviceObserver(object):
+ def __init__(self, device, tray, device_type):
+ self._device = device
+@@ -950,6 +1022,7 @@ class WiredDeviceObserver(object):
+ del self._device_view
+ self._device_view = None
+
++
+ class GsmDeviceObserver(object):
+ def __init__(self, device, tray):
+ self._device = device
+diff --git a/src/jarabe/model/network.py b/src/jarabe/model/network.py
+index 3a949da..04391f8 100644
+--- a/src/jarabe/model/network.py
++++ b/src/jarabe/model/network.py
+@@ -18,6 +18,7 @@
+ # along with this program; if not, write to the Free Software
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
++from gettext import gettext as _
+ import logging
+ import os
+ import time
+@@ -54,6 +55,138 @@ NM_ACTIVE_CONNECTION_STATE_UNKNOWN = 0
+ NM_ACTIVE_CONNECTION_STATE_ACTIVATING = 1
+ NM_ACTIVE_CONNECTION_STATE_ACTIVATED = 2
+
++
++NM_DEVICE_STATE_REASON_UNKNOWN = 0
++NM_DEVICE_STATE_REASON_NONE = 1
++NM_DEVICE_STATE_REASON_NOW_MANAGED = 2
++NM_DEVICE_STATE_REASON_NOW_UNMANAGED = 3
++NM_DEVICE_STATE_REASON_CONFIG_FAILED = 4
++NM_DEVICE_STATE_REASON_CONFIG_UNAVAILABLE = 5
++NM_DEVICE_STATE_REASON_CONFIG_EXPIRED = 6
++NM_DEVICE_STATE_REASON_NO_SECRETS = 7
++NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT = 8
++NM_DEVICE_STATE_REASON_SUPPLICANT_CONFIG_FAILED = 9
++NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED = 10
++NM_DEVICE_STATE_REASON_SUPPLICANT_TIMEOUT = 11
++NM_DEVICE_STATE_REASON_PPP_START_FAILED = 12
++NM_DEVICE_STATE_REASON_PPP_DISCONNECT = 13
++NM_DEVICE_STATE_REASON_PPP_FAILED = 14
++NM_DEVICE_STATE_REASON_DHCP_START_FAILED = 15
++NM_DEVICE_STATE_REASON_DHCP_ERROR = 16
++NM_DEVICE_STATE_REASON_DHCP_FAILED = 17
++NM_DEVICE_STATE_REASON_SHARED_START_FAILED = 18
++NM_DEVICE_STATE_REASON_SHARED_FAILED = 19
++NM_DEVICE_STATE_REASON_AUTOIP_START_FAILED = 20
++NM_DEVICE_STATE_REASON_AUTOIP_ERROR = 21
++NM_DEVICE_STATE_REASON_AUTOIP_FAILED = 22
++NM_DEVICE_STATE_REASON_MODEM_BUSY = 23
++NM_DEVICE_STATE_REASON_MODEM_NO_DIAL_TONE = 24
++NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER = 25
++NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT = 26
++NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED = 27
++NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED = 28
++NM_DEVICE_STATE_REASON_GSM_APN_FAILED = 29
++NM_DEVICE_STATE_REASON_GSM_REGISTRATION_NOT_SEARCHING = 30
++NM_DEVICE_STATE_REASON_GSM_REGISTRATION_DENIED = 31
++NM_DEVICE_STATE_REASON_GSM_REGISTRATION_TIMEOUT = 32
++NM_DEVICE_STATE_REASON_GSM_REGISTRATION_FAILED = 33
++NM_DEVICE_STATE_REASON_GSM_PIN_CHECK_FAILED = 34
++NM_DEVICE_STATE_REASON_FIRMWARE_MISSING = 35
++NM_DEVICE_STATE_REASON_REMOVED = 36
++NM_DEVICE_STATE_REASON_SLEEPING = 37
++NM_DEVICE_STATE_REASON_CONNECTION_REMOVED = 38
++NM_DEVICE_STATE_REASON_USER_REQUESTED = 39
++NM_DEVICE_STATE_REASON_CARRIER = 40
++
++
++
++NM_DEVICE_STATE_REASON_DESCRIPTION = {
++ NM_DEVICE_STATE_REASON_UNKNOWN: \
++ _("The reason for the device state change \ is unknown"),
++ NM_DEVICE_STATE_REASON_NONE: \
++ _("The state change is normal."),
++ NM_DEVICE_STATE_REASON_NOW_MANAGED: \
++ _("The device is now managed."),
++ NM_DEVICE_STATE_REASON_NOW_UNMANAGED: \
++ _("The device is no longer managed."),
++ NM_DEVICE_STATE_REASON_CONFIG_FAILED: \
++ _("The device could not be readied for configuration."),
++ NM_DEVICE_STATE_REASON_CONFIG_UNAVAILABLE : \
++ _("IP configuration could not be reserved \
++ (no available address, timeout, etc)."),
++ NM_DEVICE_STATE_REASON_CONFIG_EXPIRED : \
++ _("The IP configuration is no longer valid."),
++ NM_DEVICE_STATE_REASON_NO_SECRETS : \
++ _("Secrets were required, but not provided."),
++ NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT : \
++ _("The 802.1X supplicant disconnected from \
++ the access point or authentication server."),
++ NM_DEVICE_STATE_REASON_SUPPLICANT_CONFIG_FAILED : \
++ _("Configuration of the 802.1X supplicant failed."),
++ NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED : \
++ _("The 802.1X supplicant quit or failed unexpectedly."),
++ NM_DEVICE_STATE_REASON_SUPPLICANT_TIMEOUT : \
++ _("The 802.1X supplicant took too long to authenticate."),
++ NM_DEVICE_STATE_REASON_PPP_START_FAILED : \
++ _("The PPP service failed to start within the allowed time."),
++ NM_DEVICE_STATE_REASON_PPP_DISCONNECT : \
++ _("The PPP service disconnected unexpectedly."),
++ NM_DEVICE_STATE_REASON_PPP_FAILED : \
++ _("The PPP service quit or failed unexpectedly."),
++ NM_DEVICE_STATE_REASON_DHCP_START_FAILED : \
++ _("The DHCP service failed to start within the allowed time."),
++ NM_DEVICE_STATE_REASON_DHCP_ERROR : \
++ _("The DHCP service reported an unexpected error"),
++ NM_DEVICE_STATE_REASON_DHCP_FAILED : \
++ _("The DHCP service quit or failed unexpectedly."),
++ NM_DEVICE_STATE_REASON_SHARED_START_FAILED : \
++ _("The shared connection service failed to start."),
++ NM_DEVICE_STATE_REASON_SHARED_FAILED : \
++ _("The shared connection service quit or failed unexpectedly"),
++ NM_DEVICE_STATE_REASON_AUTOIP_START_FAILED : \
++ _("The AutoIP service failed to start."),
++ NM_DEVICE_STATE_REASON_AUTOIP_ERROR :
++ _("The AutoIP service reported an unexpected error."),
++ NM_DEVICE_STATE_REASON_AUTOIP_FAILED : \
++ _("The AutoIP service quit or failed unexpectedly."),
++ NM_DEVICE_STATE_REASON_MODEM_BUSY : \
++ _("Dialing failed because the line was busy."),
++ NM_DEVICE_STATE_REASON_MODEM_NO_DIAL_TONE : \
++ _("Dialing failed because there was no dial tone. "),
++ NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER : \
++ _("Dialing failed because there was carrier."),
++ NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT : \
++ _("Dialing timed out."),
++ NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED : \
++ _("Dialing failed."),
++ NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED : \
++ _("Modem initialization failed."),
++ NM_DEVICE_STATE_REASON_GSM_APN_FAILED : \
++ _("Failed to select the specified GSM APN."),
++ NM_DEVICE_STATE_REASON_GSM_REGISTRATION_NOT_SEARCHING : \
++ _("Not searching for networks."),
++ NM_DEVICE_STATE_REASON_GSM_REGISTRATION_DENIED : \
++ _("Network registration was denied."),
++ NM_DEVICE_STATE_REASON_GSM_REGISTRATION_TIMEOUT : \
++ _("Network registration timed out."),
++ NM_DEVICE_STATE_REASON_GSM_REGISTRATION_FAILED : \
++ _("Failed to register with the requested GSM network."),
++ NM_DEVICE_STATE_REASON_GSM_PIN_CHECK_FAILED : \
++ _("PIN check failed."),
++ NM_DEVICE_STATE_REASON_FIRMWARE_MISSING : \
++ _("Necessary firmware for the device may be missing."),
++ NM_DEVICE_STATE_REASON_REMOVED : \
++ _("The device was removed."),
++ NM_DEVICE_STATE_REASON_SLEEPING : \
++ _("NetworkManager went to sleep."),
++ NM_DEVICE_STATE_REASON_CONNECTION_REMOVED : \
++ _("The device's active connection was removed or disappeared."),
++ NM_DEVICE_STATE_REASON_USER_REQUESTED :
++ _("A user or client requested the disconnection."),
++ NM_DEVICE_STATE_REASON_CARRIER :
++ _("The device's carrier/link changed.")
++}
++
+ NM_802_11_AP_FLAGS_NONE = 0x00000000
+ NM_802_11_AP_FLAGS_PRIVACY = 0x00000001
+
+@@ -444,17 +577,22 @@ class NMSettingsConnection(dbus.service.Object):
+ def GetSecrets(self, setting_name, hints, request_new, reply, error):
+ logging.debug('Secrets requested for connection %s request_new=%s',
+ self.path, request_new)
+- if request_new or self._secrets is None:
+- # request_new is for example the case when the pw on the AP changes
+- response = SecretsResponse(self, reply, error)
+- try:
+- self.secrets_request.send(self, response=response)
+- except Exception:
+- logging.exception('Error requesting the secrets via dialog')
+- else:
+- reply(self._secrets.get_dict())
+-
+-
++ if self._settings.connection.type is not 'gsm':
++ if request_new or self._secrets is None:
++ # request_new is for example the case when the pw on the AP changes
++ response = SecretsResponse(self, reply, error)
++ try:
++ self.secrets_request.send(self, response=response)
++ except Exception:
++ logging.exception('Error requesting the secrets via dialog')
++ else:
++ reply(self._secrets.get_dict())
++ else:
++ if not request_new:
++ reply(self._secrets.get_dict())
++ else:
++ raise Exception('The stored GSM secret has already been supplied ')
++
+ class AccessPoint(gobject.GObject):
+ __gsignals__ = {
+ 'props-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+--
+1.6.2.5
+
diff --git a/rpms/sugar/jasg-register-rename.patch b/rpms/sugar/jasg-register-rename.patch
new file mode 100644
index 0000000..7d4f303
--- /dev/null
+++ b/rpms/sugar/jasg-register-rename.patch
@@ -0,0 +1,62 @@
+From 54b22ed40b3b96dcbce8493fe1a1bd3d51703b00 Mon Sep 17 00:00:00 2001
+From: Martin Abente <mabente@paraguayeduca.org>
+Date: Tue, 13 Jul 2010 16:11:45 -0400
+Subject: [PATCH] Rename Register button to re-register
+Organization: Paraguay Educa
+
+Jorge Saldivar's patch ported to build py 3xx
+
+Signed-off-by: Martin Abente <mabente@paraguayeduca.org>
+---
+ src/jarabe/desktop/favoritesview.py | 18 +++++++++++++-----
+ 1 files changed, 13 insertions(+), 5 deletions(-)
+
+diff --git a/src/jarabe/desktop/favoritesview.py b/src/jarabe/desktop/favoritesview.py
+index a311b52..450aab0 100644
+--- a/src/jarabe/desktop/favoritesview.py
++++ b/src/jarabe/desktop/favoritesview.py
+@@ -328,7 +328,7 @@ class FavoritesView(hippo.Canvas):
+ alert.props.title = _('Registration Successful')
+ alert.props.msg = _('You are now registered ' \
+ 'with your school server.')
+- self._my_icon.remove_register_menu()
++ self._my_icon.change_register_menu()
+ get_journal()._volumes_toolbar.setup_xs_button()
+
+ ok_icon = Icon(icon_name='dialog-ok')
+@@ -629,11 +629,15 @@ class _MyIcon(MyIcon):
+
+ client = gconf.client_get_default()
+ backup_url = client.get_string('/desktop/sugar/backup_url')
++
+ if not backup_url:
+ self._register_menu = MenuItem(_('Register'), 'media-record')
+- self._register_menu.connect('activate', self.__register_activate_cb)
+- palette.menu.append(self._register_menu)
+- self._register_menu.show()
++ else:
++ self._register_menu = MenuItem(_('Register Again'), 'media-record')
++
++ self._register_menu.connect('activate', self.__register_activate_cb)
++ palette.menu.append(self._register_menu)
++ self._register_menu.show()
+
+ return palette
+
+@@ -643,8 +647,12 @@ class _MyIcon(MyIcon):
+ def __register_activate_cb(self, menuitem):
+ self.emit('register-activate')
+
+- def remove_register_menu(self):
++ def change_register_menu(self):
+ self.palette.menu.remove(self._register_menu)
++ self._register_menu = MenuItem(_('Register Again'), 'media-record')
++ self._register_menu.connect('activate', self.__register_activate_cb)
++ self.palette.menu.append(self._register_menu)
++ self._register_menu.show()
+
+ class FavoritesSetting(object):
+
+--
+1.6.0.4
+
diff --git a/rpms/sugar/pe558-add-option-to-mount-any-user-directory-to-journal.patch b/rpms/sugar/pe558-add-option-to-mount-any-user-directory-to-journal.patch
new file mode 100644
index 0000000..c4b099d
--- /dev/null
+++ b/rpms/sugar/pe558-add-option-to-mount-any-user-directory-to-journal.patch
@@ -0,0 +1,140 @@
+From tecnologia-bounces@paraguayeduca.org Fri May 21 23:19:02 2010
+Return-Path: <tecnologia-bounces@paraguayeduca.org>
+X-Original-To: bernie@codewiz.org
+Delivered-To: bernie@trinity.develer.com
+Received: from mail-gw0-f54.google.com (mail-gw0-f54.google.com
+ [74.125.83.54]) by trinity.develer.com (Postfix) with ESMTP id 9ED291D6098
+ for <bernie@codewiz.org>; Fri, 21 May 2010 23:19:02 +0200 (CEST)
+X-Virus-Status: Clean
+X-Virus-Scanned: clamav-milter 0.95.2 at trinity.develer.com
+Received: by gwj16 with SMTP id 16sf817614gwj.41 for <bernie@codewiz.org>;
+ Fri, 21 May 2010 14:19:01 -0700 (PDT)
+Received: by 10.150.252.8 with SMTP id z8mr3479199ybh.3.1274476741641; Fri,
+ 21 May 2010 14:19:01 -0700 (PDT)
+Received: by 10.150.252.8 with SMTP id z8mr3479183ybh.3.1274476739872; Fri,
+ 21 May 2010 14:18:59 -0700 (PDT)
+Received: from buho.paraguayeduca.org (mail.paraguayeduca.org
+ [190.104.152.113]) by mx.google.com with ESMTP id
+ u10si6938424ybe.65.2010.05.21.14.18.58; Fri, 21 May 2010 14:18:59 -0700
+ (PDT)
+Received-SPF: pass (google.com: domain of
+ tecnologia-bounces@paraguayeduca.org designates 190.104.152.113 as
+ permitted sender) client-ip=190.104.152.113;
+Authentication-Results: mx.google.com; spf=pass (google.com: domain of
+ tecnologia-bounces@paraguayeduca.org designates 190.104.152.113 as
+ permitted sender) smtp.mail=tecnologia-bounces@paraguayeduca.org
+Received: (qmail 12533 invoked by uid 508); 21 May 2010 17:28:43 -0400
+Received: from localhost.localdomain (HELO buho.paraguayeduca.org)
+ (127.0.0.1) by buho.paraguayeduca.org with SMTP; 21 May 2010 17:28:43 -0400
+Delivered-To: paraguayeduca.org-tecnologia@paraguayeduca.org
+Received: (qmail 12501 invoked by uid 508); 21 May 2010 17:28:41 -0400
+Received: from jorge-laptop.oficina.paraguayeduca.org (HELO
+ localhost.localdomain) (192.168.0.176) by buho.paraguayeduca.org with SMTP;
+ 21 May 2010 17:28:41 -0400
+From: "Jorge (jasg) Saldivar" <jsaldivar@paraguayeduca.org>
+To: bernie@codewiz.org
+Date: Fri, 21 May 2010 17:18:13 -0400
+Message-Id: <1274476695-12808-2-git-send-email-jsaldivar@paraguayeduca.org>
+X-Mailer: git-send-email 1.7.0.4
+In-Reply-To: <1274476695-12808-1-git-send-email-jsaldivar@paraguayeduca.org>
+References: <1274476695-12808-1-git-send-email-jsaldivar@paraguayeduca.org>
+Cc: Jorge Saldivar Galli <jorgesaldivar@gmail.com>,
+ tecnologia@paraguayeduca.org
+Subject: [Tecnologia] [sugar 2/4] Add the option to mount any user
+ directory to journal
+X-BeenThere: tecnologia@paraguayeduca.org
+X-Mailman-Version: 2.1.12
+Precedence: list
+Reply-To: tecnologia@paraguayeduca.org
+List-Id: <tecnologia.paraguayeduca.org>
+List-Unsubscribe:
+ <http://mail.paraguayeduca.org/mailman/options/tecnologia>,
+ <mailto:tecnologia-request@paraguayeduca.org?subject=unsubscribe>
+List-Archive: <http://mail.paraguayeduca.org/mailman/private/tecnologia/>
+List-Post: <mailto:tecnologia@paraguayeduca.org>
+List-Help: <mailto:tecnologia-request@paraguayeduca.org?subject=help>
+List-Subscribe:
+ <http://mail.paraguayeduca.org/mailman/listinfo/tecnologia>,
+ <mailto:tecnologia-request@paraguayeduca.org?subject=subscribe>
+MIME-Version: 1.0
+Content-Type: text/plain; charset="us-ascii"
+Sender: tecnologia-bounces@paraguayeduca.org
+Errors-To: tecnologia-bounces@paraguayeduca.org
+X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_PASS,
+ T_RP_MATCHES_RCVD,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ trinity.develer.com
+X-Evolution-Source: imap://bernie@imap.develer.com/
+Content-Transfer-Encoding: 8bit
+
+From: Jorge Saldivar <jorge@jorge-laptop.(none)>
+
+
+Signed-off-by: Jorge Saldivar Galli <jorgesaldivar@gmail.com>
+---
+ src/jarabe/journal/volumestoolbar.py | 22 ++++++++++++++++++++++
+ 1 files changed, 22 insertions(+), 0 deletions(-)
+
+diff --git a/src/jarabe/journal/volumestoolbar.py b/src/jarabe/journal/volumestoolbar.py
+index 74b974c..07e63a6 100644
+--- a/src/jarabe/journal/volumestoolbar.py
++++ b/src/jarabe/journal/volumestoolbar.py
+@@ -21,6 +21,7 @@ import gobject
+ import gio
+ import gtk
+ import gconf
++import os
+
+ from sugar.graphics.radiotoolbutton import RadioToolButton
+ from sugar.graphics.palette import Palette
+@@ -50,9 +51,18 @@ class VolumesToolbar(gtk.Toolbar):
+ button.show()
+ self._volume_buttons = [button]
+
++ button = DirectoryButton()
++ button.props.group = self._volume_buttons[0]
++ button.set_palette(Palette(_('Directory GNOME')))
++ button.connect('toggled', self._button_toggled_cb)
++ self.insert(button, 1)
++ button.show()
++ self._volume_buttons.append(button)
++
+ self.connect('destroy', self.__destroy_cb)
+
+ gobject.idle_add(self._set_up_volumes)
++
+
+ def __destroy_cb(self, widget):
+ volume_monitor = gio.volume_monitor_get()
+@@ -69,6 +79,7 @@ class VolumesToolbar(gtk.Toolbar):
+ for mount in volume_monitor.get_mounts():
+ self._add_button(mount)
+
++
+ def __mount_added_cb(self, volume_monitor, mount):
+ self._add_button(mount)
+
+@@ -179,3 +190,14 @@ class JournalButton(BaseButton):
+ color = XoColor(client.get_string('/desktop/sugar/user/color'))
+ self.props.xo_color = color
+
++class DirectoryButton(BaseButton):
++ def __init__(self):
++ BaseButton.__init__(self, mount_point=os.environ['HOME'])
++ #BaseButton.__init__(self, mount_point="/tmp/hola")
++
++ #self.props.active = False
++ self.props.named_icon = 'drive'
++
++ client = gconf.client_get_default()
++ color = XoColor(client.get_string('/desktop/sugar/user/color'))
++ self.props.xo_color = color
+--
+1.7.0.4
+
+_______________________________________________
+Tecnologia mailing list
+Tecnologia@paraguayeduca.org
+http://mail.paraguayeduca.org/mailman/listinfo/tecnologia
+
+
diff --git a/rpms/sugar/pe558-backup-restore-front-end-for-control-panel.patch b/rpms/sugar/pe558-backup-restore-front-end-for-control-panel.patch
new file mode 100644
index 0000000..640f1fe
--- /dev/null
+++ b/rpms/sugar/pe558-backup-restore-front-end-for-control-panel.patch
@@ -0,0 +1,588 @@
+From jsaldivar@paraguayeduca.org Fri May 21 23:18:20 2010
+Return-Path: <jsaldivar@paraguayeduca.org>
+X-Original-To: bernie@codewiz.org
+Delivered-To: bernie@trinity.develer.com
+Received: from buho.paraguayeduca.org (mail.paraguayeduca.org
+ [190.104.152.113]) by trinity.develer.com (Postfix) with ESMTPS id
+ 189E81D6098 for <bernie@codewiz.org>; Fri, 21 May 2010 23:18:20 +0200 (CEST)
+X-Virus-Status: Clean
+X-Virus-Scanned: clamav-milter 0.95.2 at trinity.develer.com
+Received: (qmail 12492 invoked by uid 508); 21 May 2010 17:28:41 -0400
+Received: from jorge-laptop.oficina.paraguayeduca.org (HELO
+ localhost.localdomain) (192.168.0.176) by buho.paraguayeduca.org with SMTP;
+ 21 May 2010 17:28:41 -0400
+From: "Jorge (jasg) Saldivar" <jsaldivar@paraguayeduca.org>
+To: bernie@codewiz.org
+Cc: tecnologia@paraguayeduca.org, Martin Abente
+ <mabente@paraguayeduca.org>, Jorge Saldivar Galli <jorgesaldivar@gmail.com>
+Subject: [sugar 1/4] Backup & Restore front end for control panel
+Date: Fri, 21 May 2010 17:18:12 -0400
+Message-Id: <1274476695-12808-1-git-send-email-jsaldivar@paraguayeduca.org>
+X-Mailer: git-send-email 1.7.0.4
+X-Spam-Status: No, score=-1.9 required=5.0
+ tests=BAYES_00,T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham
+ version=3.3.1
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ trinity.develer.com
+X-Evolution-Source: imap://bernie@imap.develer.com/
+Content-Transfer-Encoding: 8bit
+Mime-Version: 1.0
+
+From: Martin Abente <mabente@paraguayeduca.org>
+
+
+Signed-off-by: Jorge Saldivar Galli <jorgesaldivar@gmail.com>
+---
+ configure.ac | 1 +
+ data/icons/Makefile.am | 1 +
+ data/icons/module-journalmanagement.svg | 127 +++++++++++
+ extensions/cpsection/Makefile.am | 2 +-
+ extensions/cpsection/journalmanagement/Makefile.am | 6 +
+ extensions/cpsection/journalmanagement/__init__.py | 22 ++
+ extensions/cpsection/journalmanagement/model.py | 78 +++++++
+ extensions/cpsection/journalmanagement/view.py | 236 ++++++++++++++++++++
+ 8 files changed, 472 insertions(+), 1 deletions(-)
+ create mode 100644 data/icons/module-journalmanagement.svg
+ create mode 100644 extensions/cpsection/journalmanagement/Makefile.am
+ create mode 100644 extensions/cpsection/journalmanagement/__init__.py
+ create mode 100644 extensions/cpsection/journalmanagement/model.py
+ create mode 100644 extensions/cpsection/journalmanagement/view.py
+
+diff --git a/configure.ac b/configure.ac
+index 4f60892..d6bc609 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -53,6 +53,7 @@ extensions/cpsection/aboutcomputer/Makefile
+ extensions/cpsection/aboutme/Makefile
+ extensions/cpsection/datetime/Makefile
+ extensions/cpsection/frame/Makefile
++extensions/cpsection/journalmanagement/Makefile
+ extensions/cpsection/keyboard/Makefile
+ extensions/cpsection/language/Makefile
+ extensions/cpsection/modemconfiguration/Makefile
+diff --git a/data/icons/Makefile.am b/data/icons/Makefile.am
+index a35643a..4957276 100644
+--- a/data/icons/Makefile.am
++++ b/data/icons/Makefile.am
+@@ -5,6 +5,7 @@ sugar_DATA = \
+ module-about_my_computer.svg \
+ module-date_and_time.svg \
+ module-frame.svg \
++ module-journalmanagement.svg \
+ module-keyboard.svg \
+ module-language.svg \
+ module-modemconfiguration.svg \
+diff --git a/data/icons/module-journalmanagement.svg b/data/icons/module-journalmanagement.svg
+new file mode 100644
+index 0000000..9250c6f
+--- /dev/null
++++ b/data/icons/module-journalmanagement.svg
+@@ -0,0 +1,127 @@
++<?xml version="1.0" encoding="UTF-8" standalone="no"?>
++<svg
++ xmlns:dc="http://purl.org/dc/elements/1.1/"
++ xmlns:cc="http://creativecommons.org/ns#"
++ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
++ xmlns:svg="http://www.w3.org/2000/svg"
++ xmlns="http://www.w3.org/2000/svg"
++ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
++ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
++ enable-background="new 0 0 55 55"
++ height="55px"
++ id="Layer_1"
++ version="1.1"
++ viewBox="0 0 55 55"
++ width="55px"
++ x="0px"
++ xml:space="preserve"
++ y="0px"
++ sodipodi:version="0.32"
++ inkscape:version="0.46"
++ sodipodi:docname="journalmanagement.svg"
++ inkscape:output_extension="org.inkscape.output.svg.inkscape"><sodipodi:namedview
++ inkscape:window-height="827"
++ inkscape:window-width="1440"
++ inkscape:pageshadow="2"
++ inkscape:pageopacity="0.0"
++ guidetolerance="10.0"
++ gridtolerance="10.0"
++ objecttolerance="10.0"
++ borderopacity="1.0"
++ bordercolor="#666666"
++ pagecolor="#ffffff"
++ id="base"
++ showgrid="false"
++ inkscape:zoom="8.9818182"
++ inkscape:cx="7.7378543"
++ inkscape:cy="27.5"
++ inkscape:window-x="0"
++ inkscape:window-y="25"
++ inkscape:current-layer="Layer_1" /><metadata
++ id="metadata35"><rdf:RDF><cc:Work
++ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
++ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
++ id="defs33"><inkscape:perspective
++ sodipodi:type="inkscape:persp3d"
++ inkscape:vp_x="0 : 27.5 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_z="55 : 27.5 : 1"
++ inkscape:persp3d-origin="27.5 : 18.333333 : 1"
++ id="perspective37" /><inkscape:perspective
++ id="perspective12"
++ inkscape:persp3d-origin="27.5 : 18.333333 : 1"
++ inkscape:vp_z="55 : 27.5 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 27.5 : 1"
++ sodipodi:type="inkscape:persp3d" /></defs>
++
++<g
++ display="block"
++ id="document-save"
++ transform="matrix(1.2198714,0,0,1.0017443,-2.2062535,-2.4418416)"
++ style="display:block">
++ <g
++ id="g4">
++ <g
++ id="g6">
++ <g
++ id="g8">
++ <path
++ d="M 6.736,49.002 L 31.256,49.002 C 33.481,49.002 34.695,47.555 34.695,45.561 L 34.695,18.281 C 34.695,16.551 32.963,14.84 31.256,14.84 L 26.867,14.84"
++ id="path10"
++ style="fill:#ffffff;stroke:#010101;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round" />
++ </g>
++ </g>
++ <g
++ id="g12">
++ <g
++ id="g14">
++ <path
++ d="M 26.867,38.592 C 26.867,40.428 25.522,41.793 23.426,42.639 L 6.736,49.002 L 6.736,14.84 L 23.426,6.241 C 25.654,5.847 26.867,7.081 26.867,9.075 L 26.867,38.592 z"
++ id="path16"
++ style="fill:#ffffff;stroke:#010101;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round" />
++ </g>
++ </g>
++ <path
++ d="M 9.424,42.607 C 9.424,42.607 8.073,42.064 6.722,42.064 C 5.371,42.064 4.019,42.607 4.019,42.607"
++ id="path18"
++ style="fill:none;stroke:#010101;stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round" />
++ <path
++ d="M 9.424,32.006 C 9.424,32.006 8.185,31.463 6.609,31.463 C 5.032,31.463 4.019,32.006 4.019,32.006"
++ id="path20"
++ style="fill:none;stroke:#010101;stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round" />
++ <path
++ d="M 9.424,21.678 C 9.424,21.678 8.299,21.134 6.497,21.134 C 4.695,21.134 4.019,21.678 4.019,21.678"
++ id="path22"
++ style="fill:none;stroke:#010101;stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round" />
++
++ <line
++ x1="13.209"
++ x2="13.209"
++ y1="46.533001"
++ y2="11.505"
++ id="line24"
++ style="fill:none;stroke:#010101;stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round" />
++
++ <g
++ id="g26">
++
++
++ </g>
++ </g>
++</g><rect
++ y="28.864494"
++ x="28.753164"
++ height="22.87829"
++ width="23.546305"
++ id="rect2668"
++ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2.99260712;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><g
++ id="view-expand"
++ display="block"
++ transform="matrix(0.4680612,0,0,0.4482681,27.768809,28.143274)"
++ style="fill:#000000;display:block">
++ <path
++ id="path5"
++ d="M 4.875,5 L 4.875,50 L 49.875,50 L 49.875,5 L 4.875,5 z M 23.638,44.051 L 12.574,44.051 C 12.503,44.051 12.433,44.038 12.364,44.03 C 12.322,44.025 12.28,44.026 12.238,44.017 C 12.205,44.01 12.174,43.997 12.141,43.989 C 12.062,43.968 11.983,43.949 11.907,43.918 C 11.894,43.912 11.882,43.903 11.869,43.897 C 11.779,43.857 11.691,43.813 11.607,43.757 C 11.511,43.694 11.42,43.62 11.338,43.538 C 11.255,43.455 11.181,43.363 11.116,43.266 C 11.086,43.22 11.065,43.17 11.04,43.122 C 11.012,43.07 10.98,43.02 10.957,42.965 C 10.925,42.889 10.905,42.809 10.885,42.73 C 10.877,42.7 10.864,42.67 10.858,42.639 C 10.839,42.541 10.831,42.443 10.829,42.343 C 10.829,42.328 10.825,42.315 10.825,42.3 L 10.825,31.236 C 10.825,30.267 11.608,29.485 12.574,29.485 C 13.542,29.485 14.325,30.267 14.325,31.236 L 14.325,38.075 L 22.337,30.06 C 23.021,29.378 24.129,29.378 24.813,30.06 C 25.495,30.744 25.495,31.852 24.813,32.537 L 16.8,40.549 L 23.638,40.549 L 23.638,40.552 C 24.604,40.552 25.388,41.334 25.388,42.3 C 25.389,43.267 24.604,44.051 23.638,44.051 z M 42.573,25.114 C 41.605,25.114 40.822,24.331 40.822,23.363 L 40.822,16.523 L 31.809,25.536 C 31.467,25.878 31.019,26.049 30.571,26.049 C 30.124,26.049 29.675,25.878 29.334,25.536 C 28.651,24.852 28.651,23.745 29.334,23.061 L 38.345,14.049 L 31.511,14.049 C 30.545,14.049 29.76,13.264 29.76,12.298 C 29.76,11.332 30.545,10.547 31.511,10.547 L 42.573,10.547 C 42.677,10.547 42.782,10.559 42.885,10.578 C 42.892,10.579 42.9,10.579 42.906,10.58 C 42.961,10.591 43.012,10.611 43.066,10.627 C 43.124,10.644 43.182,10.657 43.238,10.68 C 43.27,10.693 43.3,10.713 43.331,10.729 C 43.402,10.763 43.475,10.796 43.541,10.841 C 43.598,10.878 43.646,10.924 43.697,10.968 C 43.734,10.999 43.774,11.025 43.809,11.059 C 43.856,11.106 43.892,11.16 43.933,11.211 C 43.963,11.25 43.999,11.285 44.027,11.326 C 44.088,11.417 44.137,11.513 44.178,11.611 C 44.181,11.617 44.185,11.622 44.188,11.628 C 44.222,11.711 44.245,11.796 44.265,11.883 C 44.272,11.908 44.283,11.933 44.287,11.959 C 44.299,12.02 44.301,12.083 44.306,12.145 C 44.311,12.196 44.322,12.247 44.322,12.298 L 44.324,23.363 C 44.324,24.332 43.54,25.114 42.573,25.114 z"
++ style="fill:#000000" />
++</g></svg>
+\ No newline at end of file
+diff --git a/extensions/cpsection/Makefile.am b/extensions/cpsection/Makefile.am
+index a92b5dd..8edc4b7 100644
+--- a/extensions/cpsection/Makefile.am
++++ b/extensions/cpsection/Makefile.am
+@@ -1,4 +1,4 @@
+-SUBDIRS = aboutme aboutcomputer datetime frame keyboard language \
++SUBDIRS = aboutme aboutcomputer datetime frame journalmanagement keyboard language \
+ modemconfiguration network power updater
+
+ sugardir = $(pkgdatadir)/extensions/cpsection
+diff --git a/extensions/cpsection/journalmanagement/Makefile.am b/extensions/cpsection/journalmanagement/Makefile.am
+new file mode 100644
+index 0000000..ed68aa7
+--- /dev/null
++++ b/extensions/cpsection/journalmanagement/Makefile.am
+@@ -0,0 +1,6 @@
++sugardir = $(pkgdatadir)/extensions/cpsection/journalmanagement
++
++sugar_PYTHON = \
++ __init__.py \
++ model.py \
++ view.py
+diff --git a/extensions/cpsection/journalmanagement/__init__.py b/extensions/cpsection/journalmanagement/__init__.py
+new file mode 100644
+index 0000000..6eace00
+--- /dev/null
++++ b/extensions/cpsection/journalmanagement/__init__.py
+@@ -0,0 +1,22 @@
++# Copyright (C) 2010 Paraguay Educa, Martin Abente
++#
++# 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 2 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, write to the Free Software
++# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 US
++
++from gettext import gettext as _
++
++CLASS = 'JournalManagement'
++ICON = 'module-journalmanagement'
++TITLE = _('Journal Management')
++
+diff --git a/extensions/cpsection/journalmanagement/model.py b/extensions/cpsection/journalmanagement/model.py
+new file mode 100644
+index 0000000..811bdfb
+--- /dev/null
++++ b/extensions/cpsection/journalmanagement/model.py
+@@ -0,0 +1,78 @@
++# Copyright (C) 2010 Paraguay Educa, Martin Abente, Bernie Innocenti
++#
++# 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 2 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, write to the Free Software
++# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 US
++
++import os
++import gobject
++import glib
++import gio
++import logging
++
++BYTES_TO_READ = 100
++
++class JournalManagementModel(gobject.GObject):
++
++ __gtype_name__ = 'JournalManagementModel'
++
++ __gsignals__ = {
++ 'journal-management-running' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([str])),
++ 'journal-management-started' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
++ 'journal-management-finished' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
++ 'journal-management-failed' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([]))
++ }
++
++ def __init__(self):
++ gobject.GObject.__init__(self)
++
++ self._running = False
++ self._backup_script_path = ['/usr/bin/journal-backup']
++ self._restore_script_path = ['/usr/bin/journal-restore']
++
++ def do_backup(self):
++ self.run_cmd_async(self._backup_script_path)
++
++ def do_restore(self):
++ self.run_cmd_async(self._restore_script_path)
++
++ def report_process_status(self, stream, result):
++ data = stream.read_finish(result)
++
++ if len(data):
++ self.emit('journal-management-running', data)
++ stream.read_async(BYTES_TO_READ, self.report_process_status)
++
++ def run_cmd_async(self, cmd):
++ if self._running == False:
++ try:
++ pid, stdin, stdout, stderr = glib.spawn_async(cmd, flags=glib.SPAWN_DO_NOT_REAP_CHILD, standard_output=True)
++ gobject.child_watch_add(pid, _handle_process_end, (self))
++ except Exception:
++ self.emit('journal-management-failed')
++ else:
++ stdin_stream = gio.unix.InputStream(stdout, True)
++ stdin_stream.read_async(BYTES_TO_READ, self.report_process_status)
++
++ self._running = True
++ self.emit('journal-management-started')
++
++def _handle_process_end(pid, condition, myself):
++ myself._running = False
++
++ if os.WIFEXITED(condition) and\
++ os.WEXITSTATUS(condition) == 0:
++ myself.emit('journal-management-finished')
++ else:
++ myself.emit('journal-management-failed')
++
+diff --git a/extensions/cpsection/journalmanagement/view.py b/extensions/cpsection/journalmanagement/view.py
+new file mode 100644
+index 0000000..ae3194c
+--- /dev/null
++++ b/extensions/cpsection/journalmanagement/view.py
+@@ -0,0 +1,236 @@
++# Copyright (C) 2010 Paraguay Educa, Martin Abente
++#
++# 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 2 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, write to the Free Software
++# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 US.
++
++import gtk
++import gobject
++import logging
++from gettext import gettext as _
++
++from jarabe.model.session import get_session_manager
++
++from sugar.graphics import style
++from sugar.graphics.alert import Alert
++from sugar.graphics.icon import Icon
++
++from jarabe.controlpanel.sectionview import SectionView
++
++from model import JournalManagementModel
++
++class JournalManagement(SectionView):
++ def __init__(self, model, alerts):
++ SectionView.__init__(self)
++
++ self._model = JournalManagementModel()
++ self._model.connect('journal-management-running', self._set_update_log)
++ self._model.connect('journal-management-started', self._set_status_started)
++ self._model.connect('journal-management-finished', self._set_status_finished)
++ self._model.connect('journal-management-failed', self._set_status_failed)
++
++ self.restart_alerts = alerts
++ self._showing_alert = False
++ self._process_name = None
++ self._needs_restart = True
++
++ self.set_border_width(style.DEFAULT_SPACING)
++ self.set_spacing(style.DEFAULT_SPACING)
++ self._group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
++
++ self._vbox = gtk.VBox()
++
++ self._setup_options()
++ self._setup_status_info()
++ self._setup_more_info()
++
++ self._vbox.show()
++ self.pack_start(self._vbox, expand=True)
++
++ def _setup_options(self):
++ self._setup_separator(_('Options'))
++
++ self._setup_option(_('Backup'), \
++ _('Save your Journal to the School Server'), \
++ self._pre_start_backup_cb)
++
++ self._setup_option(_('Restore'), \
++ _('Restore your Journal to the last backup'), \
++ self._pre_start_restore_cb)
++
++ def _setup_option(self, button_text, description_text, button_callback):
++ option_hbox = gtk.HBox()
++
++ button = gtk.Button(label=button_text)
++ button.connect('pressed', button_callback)
++ button.show()
++ option_hbox.pack_start(button, expand=True, fill=True)
++
++ label = gtk.Label(description_text)
++ label.show()
++ option_hbox.pack_start(label, expand=True, fill=True)
++
++ option_hbox.show()
++ self._vbox.pack_start(option_hbox, expand=False, padding=5)
++
++ def _setup_expander(self):
++ expander = gtk.Expander(_('Show'))
++ expander.connect("notify::expanded", self._log_menu_control)
++ expander.show()
++
++ self._vbox.pack_start(expander, expand=False)
++
++ def _setup_more_info(self):
++ self._setup_separator(_('Log'))
++ self._setup_expander()
++ self._setup_log()
++
++ def _setup_status_info(self):
++ self._setup_separator(_('Status'))
++
++ self._status_label = gtk.Label(_('No process is running'))
++ self._status_label.show()
++
++ self._vbox.pack_start(self._status_label, expand=False, fill=False)
++
++ def _setup_log(self):
++ self._log_vbox = gtk.VBox()
++
++ scrolled_window = gtk.ScrolledWindow()
++ scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
++ self._log_vbox.pack_start(scrolled_window, expand=True, padding= 10)
++
++ self._log_view = gtk.TextView()
++ self._log_view.set_editable(False)
++ self._log_buffer = self._log_view.get_buffer()
++ scrolled_window.add(self._log_view)
++
++ self._vbox.pack_start(self._log_vbox, expand=True)
++
++ def _setup_separator(self, label_text):
++ separator_vbox = gtk.VBox()
++
++ separator = gtk.HSeparator()
++ separator.show()
++ separator_vbox.pack_start(separator, expand=False)
++
++ label = gtk.Label(label_text)
++ label.set_alignment(0, 0)
++ label.show()
++ separator_vbox.pack_start(label, expand=False)
++
++ separator_vbox.show()
++ self._vbox.pack_start(separator_vbox, expand=False, padding=10)
++
++ def _log_menu_control(self, expander, data= None):
++ if expander.get_expanded():
++ self._log_vbox.show_all()
++ else:
++ self._log_vbox.hide()
++
++ def _pre_start_restore_cb(self, button, data= None):
++ self._show_alert(_('Restore Warning!'), \
++ _('You are about to delete all your journal, are you sure?'), \
++ self._response_restore_cb)
++
++ def _response_restore_cb(self, alert, response_id):
++ if response_id == gtk.RESPONSE_APPLY:
++ self._process_name = _('Restore')
++ self._needs_restart = True
++ self._model.do_restore()
++
++ self._destroy_alert(alert)
++
++ def _pre_start_backup_cb(self, button, data= None):
++ self._show_alert(_('Backup Warning!'), \
++ _('This process could take several minutes, are you sure?'), \
++ self._response_backup_cb)
++
++ def _response_backup_cb(self, alert, response_id):
++ if response_id == gtk.RESPONSE_APPLY:
++ self._process_name = _('Backup')
++ self._needs_restart = False
++ self._model.do_backup()
++
++ self._destroy_alert(alert)
++
++ def _set_update_log(self, model, data):
++ self._log_buffer.insert(self._log_buffer.get_end_iter(), data)
++ self._log_view.scroll_to_iter(self._log_buffer.get_end_iter(), 0)
++
++ def _set_status_started(self, model, data=None):
++ self._status_label.set_text(self._process_name + ' ' +\
++ _('is running, please wait...'))
++
++ self._hack_hide_toolbar_buttons()
++
++ def _set_status_finished(self, model, data=None):
++ self._status_label.set_text(self._process_name + ' ' + \
++ _('has finished, please check the logs.'))
++
++ if self._needs_restart == True:
++ self._show_alert(self._process_name + ' ' + \
++ _('Warning!'), \
++ _('The process has finished, Sugar will restart now.'), \
++ self._post_process_restart_cb, \
++ True)
++ else:
++ self._hack_show_toolbar_buttons()
++
++ def _post_process_restart_cb(self, alert, responde_id):
++ session_manager = get_session_manager()
++ session_manager.logout()
++
++ def _set_status_failed(self, model, data=None):
++ self._status_label.set_text(self._process_name + ' ' +\
++ _('has failed.'))
++
++ self._hack_show_toolbar_buttons()
++
++ def _show_alert(self, title, msg, response_listener_cb, only_yes= False):
++ if self._showing_alert == False and \
++ self._model._running == False:
++ alert = Alert()
++ alert.props.title = title
++ alert.props.msg = msg
++
++ if only_yes == False:
++ icon = Icon(icon_name='dialog-cancel')
++ alert.add_button(gtk.RESPONSE_CANCEL, _('No'), icon)
++ icon.show()
++
++ icon = Icon(icon_name='dialog-ok')
++ alert.add_button(gtk.RESPONSE_APPLY, _('Yes'), icon)
++ icon.show()
++
++ alert.connect('response', response_listener_cb)
++ alert.show()
++
++ self._vbox.pack_start(alert, False)
++ self._vbox.reorder_child(alert, 0)
++ self._showing_alert = True
++
++ def _destroy_alert(self, alert):
++ self._vbox.remove(alert)
++ self._showing_alert = False
++
++ def _hack_show_toolbar_buttons(self):
++ panel_control = self.get_toplevel()
++ panel_control._section_toolbar.cancel_button.show()
++ panel_control._section_toolbar.accept_button.show()
++
++ def _hack_hide_toolbar_buttons(self):
++ panel_control = self.get_toplevel()
++ panel_control._section_toolbar.cancel_button.hide()
++ panel_control._section_toolbar.accept_button.hide()
++
+--
+1.7.0.4
+
+
diff --git a/rpms/sugar/pe558-journal-management-control-panel-feature.patch b/rpms/sugar/pe558-journal-management-control-panel-feature.patch
new file mode 100644
index 0000000..2b8d7ca
--- /dev/null
+++ b/rpms/sugar/pe558-journal-management-control-panel-feature.patch
@@ -0,0 +1,465 @@
+From tecnologia-bounces@paraguayeduca.org Fri May 21 23:18:52 2010
+Return-Path: <tecnologia-bounces@paraguayeduca.org>
+X-Original-To: bernie@codewiz.org
+Delivered-To: bernie@trinity.develer.com
+Received: from mail-yw0-f195.google.com (mail-yw0-f195.google.com
+ [209.85.211.195]) by trinity.develer.com (Postfix) with ESMTP id
+ 8B2D61D6098 for <bernie@codewiz.org>; Fri, 21 May 2010 23:18:52 +0200 (CEST)
+X-Virus-Status: Clean
+X-Virus-Scanned: clamav-milter 0.95.2 at trinity.develer.com
+Received: by mail-yw0-f195.google.com with SMTP id 33sf772845ywh.11 for
+ <bernie@codewiz.org>; Fri, 21 May 2010 14:18:52 -0700 (PDT)
+Received: by 10.150.187.8 with SMTP id k8mr3859160ybf.219.1274476732273;
+ Fri, 21 May 2010 14:18:52 -0700 (PDT)
+Received: by 10.150.187.8 with SMTP id k8mr3859143ybf.219.1274476731724;
+ Fri, 21 May 2010 14:18:51 -0700 (PDT)
+Received: from buho.paraguayeduca.org (mail.paraguayeduca.org
+ [190.104.152.113]) by mx.google.com with ESMTP id
+ z29si6953160ybc.29.2010.05.21.14.18.50; Fri, 21 May 2010 14:18:51 -0700
+ (PDT)
+Received-SPF: pass (google.com: domain of
+ tecnologia-bounces@paraguayeduca.org designates 190.104.152.113 as
+ permitted sender) client-ip=190.104.152.113;
+Authentication-Results: mx.google.com; spf=pass (google.com: domain of
+ tecnologia-bounces@paraguayeduca.org designates 190.104.152.113 as
+ permitted sender) smtp.mail=tecnologia-bounces@paraguayeduca.org
+Received: (qmail 12576 invoked by uid 508); 21 May 2010 17:28:43 -0400
+Received: from localhost.localdomain (HELO buho.paraguayeduca.org)
+ (127.0.0.1) by buho.paraguayeduca.org with SMTP; 21 May 2010 17:28:43 -0400
+Delivered-To: paraguayeduca.org-tecnologia@paraguayeduca.org
+Received: (qmail 12527 invoked by uid 508); 21 May 2010 17:28:42 -0400
+Received: from jorge-laptop.oficina.paraguayeduca.org (HELO
+ localhost.localdomain) (192.168.0.176) by buho.paraguayeduca.org with SMTP;
+ 21 May 2010 17:28:42 -0400
+From: "Jorge (jasg) Saldivar" <jsaldivar@paraguayeduca.org>
+To: bernie@codewiz.org
+Date: Fri, 21 May 2010 17:18:15 -0400
+Message-Id: <1274476695-12808-4-git-send-email-jsaldivar@paraguayeduca.org>
+X-Mailer: git-send-email 1.7.0.4
+In-Reply-To: <1274476695-12808-1-git-send-email-jsaldivar@paraguayeduca.org>
+References: <1274476695-12808-1-git-send-email-jsaldivar@paraguayeduca.org>
+Cc: Jorge Saldivar Galli <jorgesaldivar@gmail.com>,
+ tecnologia@paraguayeduca.org
+Subject: [Tecnologia] [sugar 4/4] Journal management control panel feature
+X-BeenThere: tecnologia@paraguayeduca.org
+X-Mailman-Version: 2.1.12
+Precedence: list
+Reply-To: tecnologia@paraguayeduca.org
+List-Id: <tecnologia.paraguayeduca.org>
+List-Unsubscribe:
+ <http://mail.paraguayeduca.org/mailman/options/tecnologia>,
+ <mailto:tecnologia-request@paraguayeduca.org?subject=unsubscribe>
+List-Archive: <http://mail.paraguayeduca.org/mailman/private/tecnologia/>
+List-Post: <mailto:tecnologia@paraguayeduca.org>
+List-Help: <mailto:tecnologia-request@paraguayeduca.org?subject=help>
+List-Subscribe:
+ <http://mail.paraguayeduca.org/mailman/listinfo/tecnologia>,
+ <mailto:tecnologia-request@paraguayeduca.org?subject=subscribe>
+MIME-Version: 1.0
+Content-Type: text/plain; charset="us-ascii"
+Sender: tecnologia-bounces@paraguayeduca.org
+Errors-To: tecnologia-bounces@paraguayeduca.org
+X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_PASS,
+ T_RP_MATCHES_RCVD,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ trinity.develer.com
+X-Evolution-Source: imap://bernie@imap.develer.com/
+Content-Transfer-Encoding: 8bit
+
+From: Jorge Saldivar <jorge@jorge-laptop.(none)>
+
+
+Signed-off-by: Jorge Saldivar Galli <jorgesaldivar@gmail.com>
+---
+ extensions/cpsection/journalmanagement/__init__.py | 8 +-
+ extensions/cpsection/journalmanagement/model.py | 43 +++-
+ extensions/cpsection/journalmanagement/view.py | 223 ++++++++++++++++++--
+ 3 files changed, 240 insertions(+), 34 deletions(-)
+
+diff --git a/extensions/cpsection/journalmanagement/__init__.py b/extensions/cpsection/journalmanagement/__init__.py
+index 6eace00..c98456b 100644
+--- a/extensions/cpsection/journalmanagement/__init__.py
++++ b/extensions/cpsection/journalmanagement/__init__.py
+@@ -1,4 +1,4 @@
+-# Copyright (C) 2010 Paraguay Educa, Martin Abente
++# Copyright (C) 2010 Paraguay Educa, Martin Abente, Jorge Saldivar
+ #
+ # 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
+@@ -15,8 +15,14 @@
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 US
+
+ from gettext import gettext as _
++import gconf
++
++from sugar.graphics.xocolor import XoColor
+
+ CLASS = 'JournalManagement'
+ ICON = 'module-journalmanagement'
+ TITLE = _('Journal Management')
++client = gconf.client_get_default()
++COLOR = XoColor(client.get_string('/desktop/sugar/user/color'))
++
+
+diff --git a/extensions/cpsection/journalmanagement/model.py b/extensions/cpsection/journalmanagement/model.py
+index 811bdfb..80642e8 100644
+--- a/extensions/cpsection/journalmanagement/model.py
++++ b/extensions/cpsection/journalmanagement/model.py
+@@ -1,4 +1,4 @@
+-# Copyright (C) 2010 Paraguay Educa, Martin Abente, Bernie Innocenti
++# Copyright (C) 2010 Paraguay Educa, Martin Abente, Bernie Innocenti, Jorge Saldivar
+ #
+ # 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
+@@ -18,19 +18,22 @@ import os
+ import gobject
+ import glib
+ import gio
++import gconf
+ import logging
+
++from jarabe.journal.volumestoolbar import MOUNT_DIRECTORY_PATH, MOUNT_DIRECTORY_VALUE
++
+ BYTES_TO_READ = 100
+
+-class JournalManagementModel(gobject.GObject):
++class JournalBackupRestoreModel(gobject.GObject):
+
+- __gtype_name__ = 'JournalManagementModel'
++ __gtype_name__ = 'JournalBackupRestoreModel'
+
+ __gsignals__ = {
+- 'journal-management-running' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([str])),
+- 'journal-management-started' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
+- 'journal-management-finished' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
+- 'journal-management-failed' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([]))
++ 'journal-backuprestore-running' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([str])),
++ 'journal-backuprestore-started' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
++ 'journal-backuprestore-finished' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
++ 'journal-backuprestore-failed' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([]))
+ }
+
+ def __init__(self):
+@@ -50,7 +53,7 @@ class JournalManagementModel(gobject.GObject):
+ data = stream.read_finish(result)
+
+ if len(data):
+- self.emit('journal-management-running', data)
++ self.emit('journal-backuprestore-running', data)
+ stream.read_async(BYTES_TO_READ, self.report_process_status)
+
+ def run_cmd_async(self, cmd):
+@@ -59,20 +62,36 @@ class JournalManagementModel(gobject.GObject):
+ pid, stdin, stdout, stderr = glib.spawn_async(cmd, flags=glib.SPAWN_DO_NOT_REAP_CHILD, standard_output=True)
+ gobject.child_watch_add(pid, _handle_process_end, (self))
+ except Exception:
+- self.emit('journal-management-failed')
++ self.emit('journal-backuprestore-failed')
+ else:
+ stdin_stream = gio.unix.InputStream(stdout, True)
+ stdin_stream.read_async(BYTES_TO_READ, self.report_process_status)
+
+ self._running = True
+- self.emit('journal-management-started')
++ self.emit('journal-backuprestore-started')
+
+ def _handle_process_end(pid, condition, myself):
+ myself._running = False
+
+ if os.WIFEXITED(condition) and\
+ os.WEXITSTATUS(condition) == 0:
+- myself.emit('journal-management-finished')
++ myself.emit('journal-backuprestore-finished')
+ else:
+- myself.emit('journal-management-failed')
++ myself.emit('journal-backuprestore-failed')
++
++def get_directory_path():
++ client = gconf.client_get_default()
++ value = client.get_string(MOUNT_DIRECTORY_PATH) or os.environ['HOME']
++ return value
++
++def get_mount_directory_option():
++ client = gconf.client_get_default()
++ return client.get_string(MOUNT_DIRECTORY_VALUE) or 'False'
++
++def set_directory_path(directory_path):
++ client = gconf.client_get_default()
++ client.set_string(MOUNT_DIRECTORY_PATH, directory_path)
+
++def set_mount_directory_option(mount_directory_value):
++ client = gconf.client_get_default()
++ client.set_string(MOUNT_DIRECTORY_VALUE, mount_directory_value)
+diff --git a/extensions/cpsection/journalmanagement/view.py b/extensions/cpsection/journalmanagement/view.py
+index ae3194c..0fd6339 100644
+--- a/extensions/cpsection/journalmanagement/view.py
++++ b/extensions/cpsection/journalmanagement/view.py
+@@ -1,4 +1,4 @@
+-# Copyright (C) 2010 Paraguay Educa, Martin Abente
++# Copyright (C) 2010 Paraguay Educa, Martin Abente, Jorge Saldivar
+ #
+ # 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
+@@ -14,40 +14,96 @@
+ # along with this program; if not, write to the Free Software
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 US.
+
++import os
+ import gtk
+ import gobject
+-import logging
+ from gettext import gettext as _
++import time
++import logging
+
+-from jarabe.model.session import get_session_manager
+-
+-from sugar.graphics import style
+-from sugar.graphics.alert import Alert
+ from sugar.graphics.icon import Icon
++from sugar.graphics import style
++from sugar.graphics.xocolor import XoColor
+
+ from jarabe.controlpanel.sectionview import SectionView
++from jarabe.controlpanel.inlinealert import InlineAlert
+
+-from model import JournalManagementModel
++from cpsection.modemconfiguration.view import EntryWithLabel
+
+-class JournalManagement(SectionView):
+- def __init__(self, model, alerts):
+- SectionView.__init__(self)
++from model import JournalBackupRestoreModel
+
+- self._model = JournalManagementModel()
+- self._model.connect('journal-management-running', self._set_update_log)
+- self._model.connect('journal-management-started', self._set_status_started)
+- self._model.connect('journal-management-finished', self._set_status_finished)
+- self._model.connect('journal-management-failed', self._set_status_failed)
++APPLY_TIMEOUT = 1000
++
++class DirectoryPathEntry(EntryWithLabel):
++ def __init__(self, model):
++ EntryWithLabel.__init__(self, '')
++ self._entry.set_max_length(256)
++ self._entry.set_width_chars(40)
++ self._entry.modify_bg(gtk.STATE_INSENSITIVE, gtk.gdk.color_parse("white"))
++ self._entry.connect('changed', self.__entry_changed_cb)
++ self._model = model
++ self._fail = ''
++
++ def __entry_changed_cb(self, widget, data=None):
++ if self._timeout_sid:
++ gobject.source_remove(self._timeout_sid)
++ self._timeout_sid = gobject.timeout_add(APPLY_TIMEOUT,
++ self.__timeout_cb)
++
++ def __timeout_cb(self):
++ self._timeout_sid = 0
++
++ if not os.access(self._entry.get_text(), os.F_OK):
++ self._is_valid = False
++ self._fail = _("Directory path does not exist. Please write down a valid one.")
++ else:
++ try:
++ self.set_value(self._entry.get_text())
++ except ValueError, detail:
++ self._is_valid = False
++ self._fail = detail
++ else:
++ self._is_valid = True
++ self._fail = ''
++
++ self.notify('is-valid')
++
++ return False
++
++ def get_value(self):
++ value = self._model.get_directory_path()
++ return value
++
++ def set_value(self, directory_path):
++ self._model.set_directory_path(directory_path)
++
++ def set_enable(self):
++ self._entry.set_sensitive(True)
++ self._entry.set_editable(True)
++
++ def set_disable(self):
++ self._entry.set_sensitive(False)
++ self._entry.set_editable(False)
++
++ def get_fail(self):
++ return self._fail
++
++ def _get_is_valid(self):
++ return self._is_valid
++ is_valid = gobject.property(type=bool, getter=_get_is_valid, default=True)
++
++class JournalBackupRestore():
++ def __init__(self):
++ self._model = JournalBackupRestoreModel()
++ self._model.connect('journal-backuprestore-running', self._set_update_log)
++ self._model.connect('journal-backuprestore-started', self._set_status_started)
++ self._model.connect('journal-backuprestore-finished', self._set_status_finished)
++ self._model.connect('journal-backuprestore-failed', self._set_status_failed)
+
+- self.restart_alerts = alerts
+ self._showing_alert = False
+ self._process_name = None
+ self._needs_restart = True
+
+- self.set_border_width(style.DEFAULT_SPACING)
+- self.set_spacing(style.DEFAULT_SPACING)
+- self._group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
+-
+ self._vbox = gtk.VBox()
+
+ self._setup_options()
+@@ -55,7 +111,9 @@ class JournalManagement(SectionView):
+ self._setup_more_info()
+
+ self._vbox.show()
+- self.pack_start(self._vbox, expand=True)
++
++ def get_widgets(self):
++ return self._vbox
+
+ def _setup_options(self):
+ self._setup_separator(_('Options'))
+@@ -234,3 +292,126 @@ class JournalManagement(SectionView):
+ panel_control._section_toolbar.cancel_button.hide()
+ panel_control._section_toolbar.accept_button.hide()
+
++class JournalMountDirectory():
++ def __init__(self, main_view, model):
++ self._model = model
++ self._main_view = main_view
++ self._vbox = gtk.VBox()
++ self._setup_widgets()
++ self._directory_path_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
++ self._directory_path_alert = InlineAlert()
++ self._directory_path_alert_box.pack_start(self._directory_path_alert, False)
++ self._vbox.pack_start(self._directory_path_alert_box)
++ self._vbox.show()
++
++ def get_widgets(self):
++ return self._vbox
++
++ def _setup_separator(self, label_text):
++ separator_vbox = gtk.VBox()
++
++ separator = gtk.HSeparator()
++ separator.show()
++ separator_vbox.pack_start(separator, expand=False)
++
++ label = gtk.Label(label_text)
++ label.set_alignment(0, 0)
++ label.show()
++ separator_vbox.pack_start(label, expand=False)
++
++ separator_vbox.show()
++ self._vbox.pack_start(separator_vbox, expand=False, padding=10)
++
++ def _setup_directory_path_entry(self):
++ self._directory_path_entry = DirectoryPathEntry(self._model)
++ self._directory_path_entry.set_text_from_model()
++ self._directory_path_entry.connect('notify::is-valid', self.__notify_is_valid_cb)
++ self._directory_path_entry.show()
++ self._vbox.pack_start(self._directory_path_entry, expand=False)
++
++ def _setup_option_checkbox(self):
++ self._check_box = gtk.CheckButton(_('Mount GNOME Directory'))
++ self._check_box.connect('clicked', self.__checkbox_state_change_cb)
++ if self._model.get_mount_directory_option() == "True":
++ self._check_box.set_active(True)
++ else:
++ self._check_box.set_active(False)
++ self._check_box.show()
++
++ self._vbox.pack_start(self._check_box, False)
++
++ def _setup_widgets(self):
++ self._setup_separator(_("Options"))
++ self._setup_option_checkbox()
++ self._setup_separator(_("Directory Path"))
++ self._setup_directory_path_entry()
++ self.__set_directory_path_entry_state()
++
++ self._main_view.needs_restart = False
++
++ def __checkbox_state_change_cb(self, checkbox, data=None):
++ if checkbox.get_active():
++ self._model.set_mount_directory_option("True")
++ else:
++ self._model.set_mount_directory_option("False")
++ self.__set_directory_path_entry_state()
++
++ def __set_directory_path_entry_state(self):
++ if self._check_box.get_active():
++ self._directory_path_entry.set_enable()
++ else:
++ self._directory_path_entry.set_disable()
++
++ def _validate(self):
++ if self._directory_path_entry.is_valid:
++ self._main_view.props.is_valid = True
++ self._directory_path_alert.hide()
++ self._directory_path_alert_box.hide()
++ else:
++ self._main_view.props.is_valid = False
++ self._directory_path_alert.props.msg = self._directory_path_entry.get_fail()
++ self._directory_path_alert_box.show()
++ self._directory_path_alert.show()
++
++ def __notify_is_valid_cb(self, entry, pspec):
++ if entry.is_valid:
++ self._main_view.needs_restart = True
++ self._validate()
++
++class JournalManagement(SectionView):
++ def __init__(self, model, alerts):
++ SectionView.__init__(self)
++
++ self._model = model
++ self.restart_alerts = alerts
++
++ self._showing_alert = False
++ self._needs_restart = True
++
++ self.set_border_width(style.DEFAULT_SPACING)
++ self.set_spacing(style.DEFAULT_SPACING)
++ self._group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
++
++ self._configurations_tabs = gtk.Notebook()
++ self._configurations_tabs.set_tab_pos(gtk.POS_TOP)
++ self._configurations_tabs.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white"))
++
++ label = gtk.Label(_("Mount Directory"))
++ self._configurations_tabs.append_page(self._setup_mount_directory_tab(self, model), label)
++
++ label = gtk.Label(_("Restore/Backup"))
++ self._configurations_tabs.append_page(self._setup_restore_backup_tab(), label)
++
++ self._group.add_widget(self._configurations_tabs)
++ self.pack_start(self._configurations_tabs, expand=False)
++ self._configurations_tabs.show()
++
++ def _setup_mount_directory_tab(self, main_view, model):
++ return JournalMountDirectory(main_view, model).get_widgets()
++
++ def _setup_restore_backup_tab(self):
++ return JournalBackupRestore().get_widgets()
++
++ def undo(self):
++ self._model.undo()
++
+--
+1.7.0.4
+
+_______________________________________________
+Tecnologia mailing list
+Tecnologia@paraguayeduca.org
+http://mail.paraguayeduca.org/mailman/listinfo/tecnologia
+
+
diff --git a/rpms/sugar/pe558-modify-volumnestoolbar-to-mount-a-directory.patch b/rpms/sugar/pe558-modify-volumnestoolbar-to-mount-a-directory.patch
new file mode 100644
index 0000000..619a73c
--- /dev/null
+++ b/rpms/sugar/pe558-modify-volumnestoolbar-to-mount-a-directory.patch
@@ -0,0 +1,160 @@
+From tecnologia-bounces@paraguayeduca.org Fri May 21 23:18:59 2010
+Return-Path: <tecnologia-bounces@paraguayeduca.org>
+X-Original-To: bernie@codewiz.org
+Delivered-To: bernie@trinity.develer.com
+Received: from mail-gw0-f54.google.com (mail-gw0-f54.google.com
+ [74.125.83.54]) by trinity.develer.com (Postfix) with ESMTP id 144411D6098
+ for <bernie@codewiz.org>; Fri, 21 May 2010 23:18:59 +0200 (CEST)
+X-Virus-Status: Clean
+X-Virus-Scanned: clamav-milter 0.95.2 at trinity.develer.com
+Received: by gwj16 with SMTP id 16sf817599gwj.41 for <bernie@codewiz.org>;
+ Fri, 21 May 2010 14:18:58 -0700 (PDT)
+Received: by 10.150.240.16 with SMTP id n16mr3879747ybh.256.1274476738934;
+ Fri, 21 May 2010 14:18:58 -0700 (PDT)
+Received: by 10.150.240.16 with SMTP id n16mr3879740ybh.256.1274476738661;
+ Fri, 21 May 2010 14:18:58 -0700 (PDT)
+Received: from buho.paraguayeduca.org (mail.paraguayeduca.org
+ [190.104.152.113]) by mx.google.com with ESMTP id
+ c5si6951324ybi.40.2010.05.21.14.18.57; Fri, 21 May 2010 14:18:58 -0700 (PDT)
+Received-SPF: pass (google.com: domain of
+ tecnologia-bounces@paraguayeduca.org designates 190.104.152.113 as
+ permitted sender) client-ip=190.104.152.113;
+Authentication-Results: mx.google.com; spf=pass (google.com: domain of
+ tecnologia-bounces@paraguayeduca.org designates 190.104.152.113 as
+ permitted sender) smtp.mail=tecnologia-bounces@paraguayeduca.org
+Received: (qmail 12554 invoked by uid 508); 21 May 2010 17:28:43 -0400
+Received: from localhost.localdomain (HELO buho.paraguayeduca.org)
+ (127.0.0.1) by buho.paraguayeduca.org with SMTP; 21 May 2010 17:28:43 -0400
+Delivered-To: paraguayeduca.org-tecnologia@paraguayeduca.org
+Received: (qmail 12505 invoked by uid 508); 21 May 2010 17:28:42 -0400
+Received: from jorge-laptop.oficina.paraguayeduca.org (HELO
+ localhost.localdomain) (192.168.0.176) by buho.paraguayeduca.org with SMTP;
+ 21 May 2010 17:28:42 -0400
+From: "Jorge (jasg) Saldivar" <jsaldivar@paraguayeduca.org>
+To: bernie@codewiz.org
+Date: Fri, 21 May 2010 17:18:14 -0400
+Message-Id: <1274476695-12808-3-git-send-email-jsaldivar@paraguayeduca.org>
+X-Mailer: git-send-email 1.7.0.4
+In-Reply-To: <1274476695-12808-1-git-send-email-jsaldivar@paraguayeduca.org>
+References: <1274476695-12808-1-git-send-email-jsaldivar@paraguayeduca.org>
+Cc: Jorge Saldivar Galli <jorgesaldivar@gmail.com>,
+ tecnologia@paraguayeduca.org
+Subject: [Tecnologia] [sugar 3/4] Modify a few lines of volumnestoolber to
+ allow it mount a directory
+X-BeenThere: tecnologia@paraguayeduca.org
+X-Mailman-Version: 2.1.12
+Precedence: list
+Reply-To: tecnologia@paraguayeduca.org
+List-Id: <tecnologia.paraguayeduca.org>
+List-Unsubscribe:
+ <http://mail.paraguayeduca.org/mailman/options/tecnologia>,
+ <mailto:tecnologia-request@paraguayeduca.org?subject=unsubscribe>
+List-Archive: <http://mail.paraguayeduca.org/mailman/private/tecnologia/>
+List-Post: <mailto:tecnologia@paraguayeduca.org>
+List-Help: <mailto:tecnologia-request@paraguayeduca.org?subject=help>
+List-Subscribe:
+ <http://mail.paraguayeduca.org/mailman/listinfo/tecnologia>,
+ <mailto:tecnologia-request@paraguayeduca.org?subject=subscribe>
+MIME-Version: 1.0
+Content-Type: text/plain; charset="us-ascii"
+Sender: tecnologia-bounces@paraguayeduca.org
+Errors-To: tecnologia-bounces@paraguayeduca.org
+X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_PASS,
+ T_RP_MATCHES_RCVD,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ trinity.develer.com
+X-Evolution-Source: imap://bernie@imap.develer.com/
+Content-Transfer-Encoding: 8bit
+
+From: Jorge Saldivar <jorge@jorge-laptop.(none)>
+
+
+Signed-off-by: Jorge Saldivar Galli <jorgesaldivar@gmail.com>
+
+---
+
+--- a/src/jarabe/journal/volumestoolbar.py.orig 2010-05-23 20:28:37.000000000 -0400
++++ b/src/jarabe/journal/volumestoolbar.py 2010-05-23 20:28:55.000000000 -0400
+@@ -30,6 +30,9 @@ from sugar.graphics.xocolor import XoCol
+ from jarabe.journal import model
+ from jarabe.view.palettes import VolumePalette
+
++MOUNT_DIRECTORY_PATH = '/desktop/sugar/journal/mount-directory-path'
++MOUNT_DIRECTORY_VALUE = '/desktop/sugar/journal/mount-directory-value'
++
+ class VolumesToolbar(gtk.Toolbar):
+ __gtype_name__ = 'VolumesToolbar'
+
+@@ -51,25 +54,29 @@ class VolumesToolbar(gtk.Toolbar):
+ button.show()
+ self._volume_buttons = [button]
+
+- button = DirectoryButton()
+- button.props.group = self._volume_buttons[0]
+- button.set_palette(Palette(_('Directory GNOME')))
+- button.connect('toggled', self._button_toggled_cb)
+- self.insert(button, 1)
+- button.show()
+- self._volume_buttons.append(button)
+-
+ self.connect('destroy', self.__destroy_cb)
+
+ gobject.idle_add(self._set_up_volumes)
+-
++
++ client = gconf.client_get_default()
++ mount_directory = client.get_string(MOUNT_DIRECTORY_VALUE) or 'False'
++ if mount_directory == 'True':
++ button = DirectoryButton()
++ button.props.group = self._volume_buttons[0]
++ button.set_palette(Palette(_('Directory') + ' ' + str(button.get_mount_point())))
++ button.connect('toggled', self._button_toggled_cb)
++ position = self.get_item_index(self._volume_buttons[-1]) + 1
++ self.insert(button, position)
++ button.show()
++ self._volume_buttons.append(button)
++ self.show()
+
+ def __destroy_cb(self, widget):
+ volume_monitor = gio.volume_monitor_get()
+ volume_monitor.disconnect(self._mount_added_hid)
+ volume_monitor.disconnect(self._mount_removed_hid)
+
+- def _set_up_volumes(self):
++ def _set_up_volumes(self):
+ volume_monitor = gio.volume_monitor_get()
+ self._mount_added_hid = \
+ volume_monitor.connect('mount-added', self.__mount_added_cb)
+@@ -79,7 +86,6 @@ class VolumesToolbar(gtk.Toolbar):
+ for mount in volume_monitor.get_mounts():
+ self._add_button(mount)
+
+-
+ def __mount_added_cb(self, volume_monitor, mount):
+ self._add_button(mount)
+
+@@ -192,12 +198,15 @@ class JournalButton(BaseButton):
+
+ class DirectoryButton(BaseButton):
+ def __init__(self):
+- BaseButton.__init__(self, mount_point=os.environ['HOME'])
+- #BaseButton.__init__(self, mount_point="/tmp/hola")
++ client = gconf.client_get_default()
++ self.__mount_directory_path = client.get_string(MOUNT_DIRECTORY_PATH) or os.environ['HOME']
++ BaseButton.__init__(self, mount_point=self.__mount_directory_path)
+
+ #self.props.active = False
+ self.props.named_icon = 'drive'
+-
+- client = gconf.client_get_default()
++
+ color = XoColor(client.get_string('/desktop/sugar/user/color'))
+ self.props.xo_color = color
++
++ def get_mount_point(self):
++ return self.__mount_directory_path
+
+--
+1.7.0.4
+
+
diff --git a/rpms/sugar/reverse-sort-order-of-activities-list.patch b/rpms/sugar/reverse-sort-order-of-activities-list.patch
new file mode 100644
index 0000000..d03b9bb
--- /dev/null
+++ b/rpms/sugar/reverse-sort-order-of-activities-list.patch
@@ -0,0 +1,53 @@
+From jsaldivar@paraguayeduca.org Thu Jul 1 23:39:31 2010
+Return-Path: <jsaldivar@paraguayeduca.org>
+X-Original-To: bernie@codewiz.org
+Delivered-To: bernie@trinity.develer.com
+Received: from buho.paraguayeduca.org (mail.paraguayeduca.org
+ [190.104.152.113]) by trinity.develer.com (Postfix) with ESMTPS id
+ F2DC21D6066 for <bernie@codewiz.org>; Thu, 1 Jul 2010 23:39:31 +0200 (CEST)
+X-Virus-Status: Clean
+X-Virus-Scanned: clamav-milter 0.95.3 at trinity.develer.com
+Received: (qmail 2089 invoked by uid 508); 1 Jul 2010 17:49:19 -0400
+Received: from jorge-laptop.oficina.paraguayeduca.org (HELO
+ localhost.localdomain) (192.168.0.176) by buho.paraguayeduca.org with SMTP;
+ 1 Jul 2010 17:49:19 -0400
+From: "Jorge (jasg) Saldivar" <jsaldivar@paraguayeduca.org>
+To: bernie@codewiz.org
+Cc: tecnologia@paraguayeduca.org, Jorge Saldivar
+ <jsaldivar@paraguayeduca.org>
+Subject: [PATCH] Change the method to add new actitivities in the
+ activities list in home view
+Date: Thu, 1 Jul 2010 17:39:24 -0400
+Message-Id: <1278020364-18182-1-git-send-email-jsaldivar@paraguayeduca.org>
+X-Mailer: git-send-email 1.7.0.4
+Organization: Paraguay Educa
+X-Spam-Status: No, score=-1.7 required=3.5 tests=AWL,BAYES_00,SPF_PASS,
+ T_RP_MATCHES_RCVD autolearn=ham version=3.3.1
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ trinity.develer.com
+Content-Transfer-Encoding: 8bit
+Mime-Version: 1.0
+
+From: Jorge Saldivar <jsaldivar@paraguayeduca.org>
+
+---
+ src/jarabe/desktop/activitieslist.py | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/src/jarabe/desktop/activitieslist.py b/src/jarabe/desktop/activitieslist.py
+index 87f2af0..546ac6f 100644
+--- a/src/jarabe/desktop/activitieslist.py
++++ b/src/jarabe/desktop/activitieslist.py
+@@ -228,7 +228,7 @@ class ListModel(gtk.TreeModelSort):
+ '<span style="italic" weight="light">%s</span>' % \
+ (activity_info.get_name(), tags)
+
+- self._model.append([activity_info.get_bundle_id(),
++ self._model.prepend([activity_info.get_bundle_id(),
+ favorite,
+ activity_info.get_icon(),
+ title,
+--
+1.7.0.4
+
+
diff --git a/rpms/sugar/set-default-scaling-to-100.patch b/rpms/sugar/set-default-scaling-to-100.patch
new file mode 100644
index 0000000..4b99b77
--- /dev/null
+++ b/rpms/sugar/set-default-scaling-to-100.patch
@@ -0,0 +1,11 @@
+--- sugar-0.88.1/bin/sugar.in.orig 2010-06-07 15:28:56.000000000 -0400
++++ sugar-0.88.1/bin/sugar.in 2010-06-07 15:29:35.000000000 -0400
+@@ -37,7 +37,7 @@ while [ $# -ne 0 ] ; do
+ done
+
+ if test -z "$SUGAR_SCALING"; then
+- export SUGAR_SCALING=72
++ export SUGAR_SCALING=100
+ fi
+
+ export GTK2_RC_FILES="@prefix@/share/sugar/data/sugar-$SUGAR_SCALING.gtkrc"
diff --git a/rpms/sugar/simplify-the-definition-of-UpdateModel._bundles_to_check..patch b/rpms/sugar/simplify-the-definition-of-UpdateModel._bundles_to_check..patch
new file mode 100644
index 0000000..ae86b48
--- /dev/null
+++ b/rpms/sugar/simplify-the-definition-of-UpdateModel._bundles_to_check..patch
@@ -0,0 +1,37 @@
+Date: Sun, 23 May 2010 14:50:26 -0400
+From: Michael Stone <michael@laptop.org>
+To: sugar-devel@lists.sugarlabs.org
+Subject: [Sugar-devel] [PATCH] Simplify the definition of
+ UpdateModel._bundles_to_check.
+
+The only purposes of the list comprehension in UpdateModel.check_updates() is
+to set self._bundles_to_check to a list containing the elements returned by
+bundleregistry.get_registry(). This purpose can be more succinctly achieved by
+means of the list() constructor.
+
+Signed-off-by: Michael Stone <michael@laptop.org>
+---
+ extensions/cpsection/updater/model.py | 3 +--
+ 1 files changed, 1 insertions(+), 2 deletions(-)
+
+diff --git a/extensions/cpsection/updater/model.py b/extensions/cpsection/updater/model.py
+index c45dcd3..5bb8cf4 100755
+--- a/extensions/cpsection/updater/model.py
++++ b/extensions/cpsection/updater/model.py
+@@ -63,8 +63,7 @@ class UpdateModel(gobject.GObject):
+
+ def check_updates(self):
+ self.updates = []
+- self._bundles_to_check = \
+- [bundle for bundle in bundleregistry.get_registry()]
++ self._bundles_to_check = list(bundleregistry.get_registry())
+ self._check_next_update()
+
+ def _check_next_update(self):
+--
+1.7.1
+_______________________________________________
+Sugar-devel mailing list
+Sugar-devel@lists.sugarlabs.org
+http://lists.sugarlabs.org/listinfo/sugar-devel
+
diff --git a/rpms/sugar/sizelist-0000-cover-letter.patch b/rpms/sugar/sizelist-0000-cover-letter.patch
new file mode 100644
index 0000000..02082ac
--- /dev/null
+++ b/rpms/sugar/sizelist-0000-cover-letter.patch
@@ -0,0 +1,42 @@
+From def49facd34182305e5d8c1ea273c0992aa90af0 Mon Sep 17 00:00:00 2001
+Message-Id: <cover.1278054601.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Fri, 2 Jul 2010 04:10:01 -0300
+Subject: [PATCH v2 00/10] Journal sorting by file size and creation time.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This new version addresses two problems with the last patchset:
+
+Bert Freudenberg kindly reminded me that the 'ctime' property had a documented
+string format [0], which Etoys was using. This version uses that format so we
+don't break any activities expecting it.
+
+Bernie Innocenti produced a datastore that was unable to successfuly upgrade
+(reindex) to the new version. The problem was that indexing a document failed
+miserably when ctime or filesize didn't exist, this version avoids that. This
+version also contains a new patch that checks for and adds the new metadata
+when rebuilding the index so that old entries can be sorted.
+
+[0] http://wiki.sugarlabs.org/go/Development_Team/Low-level_Activity_API#Meta_Data
+
+Andrés Ambrois (10):
+ Journal: Retrieve filesize from the datastore
+ Add a filesize column to the journal list model
+ Journaltoolbox: Add add_separator method for convenience.
+ Add a ListViewButton to the journal search toolbar.
+ Rename the date column to 'sort_column'
+ Display the sorting property in the last column.
+ Expandedentry: Try to use the filesize property.
+ Implement sorting for removable devices.
+ Add sort by creation time option to the ListViewButton
+ Add ctime property to the journal model.
+
+ src/jarabe/journal/expandedentry.py | 5 +-
+ src/jarabe/journal/journaltoolbox.py | 86 ++++++++++++++++++++++++++++++++++
+ src/jarabe/journal/listmodel.py | 29 +++++++++--
+ src/jarabe/journal/listview.py | 33 +++++++------
+ src/jarabe/journal/model.py | 22 ++++++--
+ 5 files changed, 147 insertions(+), 28 deletions(-)
+
diff --git a/rpms/sugar/sizelist-0001-Journal-Retrieve-filesize-from-the-datastore.patch b/rpms/sugar/sizelist-0001-Journal-Retrieve-filesize-from-the-datastore.patch
new file mode 100644
index 0000000..7e1e108
--- /dev/null
+++ b/rpms/sugar/sizelist-0001-Journal-Retrieve-filesize-from-the-datastore.patch
@@ -0,0 +1,39 @@
+From 6df603a75bbae1d5a3ef23d3c2b6f3fe0d9b45c7 Mon Sep 17 00:00:00 2001
+Message-Id: <6df603a75bbae1d5a3ef23d3c2b6f3fe0d9b45c7.1278054601.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278054601.git.andresambrois@gmail.com>
+References: <cover.1278054601.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Sun, 23 May 2010 03:41:23 -0300
+Subject: [PATCH v2 01/10] Journal: Retrieve filesize from the datastore
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Add the filesize property to the list of properties we ask the datastore
+for.
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/jarabe/journal/model.py | 6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/jarabe/journal/model.py b/src/jarabe/journal/model.py
+index ffc62e0..874d7bd 100644
+--- a/src/jarabe/journal/model.py
++++ b/src/jarabe/journal/model.py
+@@ -36,9 +36,9 @@ DS_DBUS_INTERFACE = 'org.laptop.sugar.DataStore'
+ DS_DBUS_PATH = '/org/laptop/sugar/DataStore'
+
+ # Properties the journal cares about.
+-PROPERTIES = ['uid', 'title', 'mtime', 'timestamp', 'keep', 'buddies',
+- 'icon-color', 'mime_type', 'progress', 'activity', 'mountpoint',
+- 'activity_id', 'bundle_id']
++PROPERTIES = ['uid', 'title', 'mtime', 'timestamp', 'filesize',
++ 'keep', 'buddies', 'icon-color', 'mime_type', 'progress',
++ 'activity', 'mountpoint', 'activity_id', 'bundle_id']
+
+ MIN_PAGES_TO_CACHE = 3
+ MAX_PAGES_TO_CACHE = 5
+--
+1.7.0.4
+
diff --git a/rpms/sugar/sizelist-0002-Add-a-filesize-column-to-the-journal-list-model.patch b/rpms/sugar/sizelist-0002-Add-a-filesize-column-to-the-journal-list-model.patch
new file mode 100644
index 0000000..029f911
--- /dev/null
+++ b/rpms/sugar/sizelist-0002-Add-a-filesize-column-to-the-journal-list-model.patch
@@ -0,0 +1,63 @@
+From 65efc3575138a4d299edf7c1a59263ea57db588e Mon Sep 17 00:00:00 2001
+Message-Id: <65efc3575138a4d299edf7c1a59263ea57db588e.1278054601.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278054601.git.andresambrois@gmail.com>
+References: <cover.1278054601.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Sun, 23 May 2010 03:50:01 -0300
+Subject: [PATCH v2 02/10] Add a filesize column to the journal list model
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This will make it easy to display the current sorting column by
+associating a cell renderer with it.
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/jarabe/journal/listmodel.py | 17 +++++++++++------
+ 1 files changed, 11 insertions(+), 6 deletions(-)
+
+diff --git a/src/jarabe/journal/listmodel.py b/src/jarabe/journal/listmodel.py
+index 07f8544..135dc95 100644
+--- a/src/jarabe/journal/listmodel.py
++++ b/src/jarabe/journal/listmodel.py
+@@ -48,18 +48,20 @@ class ListModel(gtk.GenericTreeModel, gtk.TreeDragSource):
+ COLUMN_ICON = 2
+ COLUMN_ICON_COLOR = 3
+ COLUMN_TITLE = 4
+- COLUMN_DATE = 5
+- COLUMN_PROGRESS = 6
+- COLUMN_BUDDY_1 = 7
+- COLUMN_BUDDY_2 = 8
+- COLUMN_BUDDY_3 = 9
++ COLUMN_TIMESTAMP = 5
++ COLUMN_FILESIZE = 6
++ COLUMN_PROGRESS = 7
++ COLUMN_BUDDY_1 = 8
++ COLUMN_BUDDY_2 = 9
++ COLUMN_BUDDY_3 = 10
+
+ _COLUMN_TYPES = {COLUMN_UID: str,
+ COLUMN_FAVORITE: bool,
+ COLUMN_ICON: str,
+ COLUMN_ICON_COLOR: object,
+ COLUMN_TITLE: str,
+- COLUMN_DATE: str,
++ COLUMN_TIMESTAMP: str,
++ COLUMN_FILESIZE: str,
+ COLUMN_PROGRESS: int,
+ COLUMN_BUDDY_1: object,
+ COLUMN_BUDDY_3: object,
+@@ -141,6 +143,9 @@ class ListModel(gtk.GenericTreeModel, gtk.TreeDragSource):
+ timestamp = int(metadata.get('timestamp', 0))
+ self._cached_row.append(util.timestamp_to_elapsed_string(timestamp))
+
++ size = int(metadata.get('filesize', 0))
++ self._cached_row.append(util.format_size(size))
++
+ self._cached_row.append(int(metadata.get('progress', 100)))
+
+ if metadata.get('buddies', ''):
+--
+1.7.0.4
+
diff --git a/rpms/sugar/sizelist-0003-Journaltoolbox-Add-add_separator-method-for-convenie.patch b/rpms/sugar/sizelist-0003-Journaltoolbox-Add-add_separator-method-for-convenie.patch
new file mode 100644
index 0000000..da49600
--- /dev/null
+++ b/rpms/sugar/sizelist-0003-Journaltoolbox-Add-add_separator-method-for-convenie.patch
@@ -0,0 +1,42 @@
+From 9bebd9d9d6dbae0dad35cb58d9eabdbc37c0b18c Mon Sep 17 00:00:00 2001
+Message-Id: <9bebd9d9d6dbae0dad35cb58d9eabdbc37c0b18c.1278054601.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278054601.git.andresambrois@gmail.com>
+References: <cover.1278054601.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Sun, 23 May 2010 03:56:45 -0300
+Subject: [PATCH v2 03/10] Journaltoolbox: Add add_separator method for convenience.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/jarabe/journal/journaltoolbox.py | 11 +++++++++++
+ 1 files changed, 11 insertions(+), 0 deletions(-)
+
+diff --git a/src/jarabe/journal/journaltoolbox.py b/src/jarabe/journal/journaltoolbox.py
+index 61671bc..7466461 100644
+--- a/src/jarabe/journal/journaltoolbox.py
++++ b/src/jarabe/journal/journaltoolbox.py
+@@ -154,6 +154,17 @@ class SearchToolbar(gtk.Toolbar):
+ with_search.connect('changed', self._combo_changed_cb)
+ return with_search
+
++ def _add_separator(self, expand=False):
++ separator = gtk.SeparatorToolItem()
++ separator.props.draw = False
++ if expand:
++ separator.set_expand(True)
++ else:
++ separator.set_size_request(style.GRID_CELL_SIZE,
++ style.GRID_CELL_SIZE)
++ self.insert(separator, -1)
++ separator.show()
++
+ def _add_widget(self, widget, expand=False):
+ tool_item = gtk.ToolItem()
+ tool_item.set_expand(expand)
+--
+1.7.0.4
+
diff --git a/rpms/sugar/sizelist-0004-Add-a-ListViewButton-to-the-journal-search-toolbar.patch b/rpms/sugar/sizelist-0004-Add-a-ListViewButton-to-the-journal-search-toolbar.patch
new file mode 100644
index 0000000..6e6f258
--- /dev/null
+++ b/rpms/sugar/sizelist-0004-Add-a-ListViewButton-to-the-journal-search-toolbar.patch
@@ -0,0 +1,135 @@
+From b11b8660eace20a81455195433096b8037cdad3b Mon Sep 17 00:00:00 2001
+Message-Id: <b11b8660eace20a81455195433096b8037cdad3b.1278054601.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278054601.git.andresambrois@gmail.com>
+References: <cover.1278054601.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Sun, 23 May 2010 04:33:06 -0300
+Subject: [PATCH v2 04/10] Add a ListViewButton to the journal search toolbar.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Add a button to display the sorting options. Rebuild the query when the
+sort option changes.
+
+Use a RadioToolButton for a future implementation of multiple journal
+views (as described in the Journal Design Proposal).
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/jarabe/journal/journaltoolbox.py | 74 ++++++++++++++++++++++++++++++++++
+ 1 files changed, 74 insertions(+), 0 deletions(-)
+
+diff --git a/src/jarabe/journal/journaltoolbox.py b/src/jarabe/journal/journaltoolbox.py
+index 7466461..995cc73 100644
+--- a/src/jarabe/journal/journaltoolbox.py
++++ b/src/jarabe/journal/journaltoolbox.py
+@@ -30,6 +30,7 @@ from sugar.graphics.toolbox import Toolbox
+ from sugar.graphics.toolcombobox import ToolComboBox
+ from sugar.graphics.toolbutton import ToolButton
+ from sugar.graphics.toggletoolbutton import ToggleToolButton
++from sugar.graphics.radiotoolbutton import RadioToolButton
+ from sugar.graphics.combobox import ComboBox
+ from sugar.graphics.menuitem import MenuItem
+ from sugar.graphics.icon import Icon
+@@ -109,6 +110,17 @@ class SearchToolbar(gtk.Toolbar):
+ self.insert(tool_item, -1)
+ tool_item.show()
+
++ self._add_separator(expand=True)
++
++ self._list_view_button = ListViewButton()
++ # TODO: Connect when Grid View is implemented
++ #self._list_view.connect('toggled', self.__view_button_toggled_cb)
++ self._list_view_button.set_active(True)
++ self.insert(self._list_view_button, -1)
++ self._list_view_button.connect('sort-property-changed',
++ self.__sort_changed_cb)
++ self._list_view_button.show()
++
+ # TODO: enable it when the DS supports saving the buddies.
+ #self._with_search_combo = self._get_with_search_combo()
+ #tool_item = ToolComboBox(self._with_search_combo)
+@@ -202,6 +214,14 @@ class SearchToolbar(gtk.Toolbar):
+ if text:
+ query['query'] = text
+
++ property, order = self._list_view_button.get_current_sort()
++
++ if order == gtk.SORT_ASCENDING:
++ sign = '+'
++ else:
++ sign = '-'
++ query['order_by'] = [sign + property]
++
+ return query
+
+ def _get_date_range(self):
+@@ -224,6 +244,9 @@ class SearchToolbar(gtk.Toolbar):
+ def _combo_changed_cb(self, combo):
+ self._update_if_needed()
+
++ def __sort_changed_cb(self, button):
++ self._update_if_needed()
++
+ def _update_if_needed(self):
+ new_query = self._build_query()
+ if self._query != new_query:
+@@ -467,3 +490,54 @@ class EntryToolbar(gtk.Toolbar):
+ activity_info.get_bundle_id())
+ palette.menu.append(menu_item)
+ menu_item.show()
++
++class ListViewButton(RadioToolButton):
++ __gtype_name__ = 'JournalListViewButton'
++
++ __gsignals__ = {
++ 'sort-property-changed': (gobject.SIGNAL_RUN_FIRST,
++ gobject.TYPE_NONE,
++ ([])),
++ }
++
++ _SORT_OPTIONS = [
++ ('timestamp', 'view-lastedit', _('View by last edit')),
++ ('filesize', 'view-size', _('View by size')),
++ ]
++
++ def __init__(self):
++ RadioToolButton.__init__(self)
++
++ self._property = 'timestamp'
++ self._order = gtk.SORT_ASCENDING
++
++ self.props.tooltip = _('List view')
++ self.props.named_icon = 'view-list'
++ # TODO: Set accelerator when Grid View is implemented
++ #self.props.accelerator = _('<Ctrl>2')
++ self.props.group = None
++
++ for property, icon, label in self._SORT_OPTIONS:
++ button = MenuItem(icon_name=icon, text_label=label)
++ button.connect('activate',
++ self.__sort_type_changed_cb,
++ property,
++ icon)
++ button.show()
++ self.props.palette.menu.insert(button, -1)
++
++ def __sort_type_changed_cb(self, widget, property, named_icon):
++ self._property = property
++ #FIXME: Implement sorting order
++ self._order = gtk.SORT_ASCENDING
++ self.emit('sort-property-changed')
++
++ self.props.named_icon = named_icon
++
++ if not self.props.active:
++ self.props.active = True
++ else:
++ self.emit('toggled')
++
++ def get_current_sort(self):
++ return (self._property, self._order)
+--
+1.7.0.4
+
diff --git a/rpms/sugar/sizelist-0005-Rename-the-date-column-to-sort_column.patch b/rpms/sugar/sizelist-0005-Rename-the-date-column-to-sort_column.patch
new file mode 100644
index 0000000..2369ad2
--- /dev/null
+++ b/rpms/sugar/sizelist-0005-Rename-the-date-column-to-sort_column.patch
@@ -0,0 +1,68 @@
+From de3299824908e2135cf48d8fb9818d4c8f8a128e Mon Sep 17 00:00:00 2001
+Message-Id: <de3299824908e2135cf48d8fb9818d4c8f8a128e.1278054601.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278054601.git.andresambrois@gmail.com>
+References: <cover.1278054601.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Sun, 23 May 2010 04:01:09 -0300
+Subject: [PATCH v2 05/10] Rename the date column to 'sort_column'
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+As it will be used to display the currently active sorting property.
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/jarabe/journal/listview.py | 22 +++++++++++-----------
+ 1 files changed, 11 insertions(+), 11 deletions(-)
+
+diff --git a/src/jarabe/journal/listview.py b/src/jarabe/journal/listview.py
+index 9e19f70..375a8ee 100644
+--- a/src/jarabe/journal/listview.py
++++ b/src/jarabe/journal/listview.py
+@@ -97,7 +97,7 @@ class BaseListView(gtk.Bin):
+ self.cell_title = None
+ self.cell_icon = None
+ self._title_column = None
+- self.date_column = None
++ self.sort_column = None
+ self._add_columns()
+
+ self.tree_view.enable_model_drag_source(gtk.gdk.BUTTON1_MASK,
+@@ -190,15 +190,15 @@ class BaseListView(gtk.Bin):
+ date = util.timestamp_to_elapsed_string(timestamp)
+ date_width = self._get_width_for_string(date)
+
+- self.date_column = gtk.TreeViewColumn()
+- self.date_column.props.sizing = gtk.TREE_VIEW_COLUMN_FIXED
+- self.date_column.props.fixed_width = date_width
+- self.date_column.set_alignment(1)
+- self.date_column.props.resizable = True
+- self.date_column.props.clickable = True
+- self.date_column.pack_start(cell_text)
+- self.date_column.add_attribute(cell_text, 'text', ListModel.COLUMN_DATE)
+- self.tree_view.append_column(self.date_column)
++ self.sort_column = gtk.TreeViewColumn()
++ self.sort_column.props.sizing = gtk.TREE_VIEW_COLUMN_FIXED
++ self.sort_column.props.fixed_width = date_width
++ self.sort_column.set_alignment(1)
++ self.sort_column.props.resizable = True
++ self.sort_column.props.clickable = True
++ self.sort_column.pack_start(cell_text)
++ self.sort_column.add_attribute(cell_text, 'text', ListModel.COLUMN_TIMESTAMP)
++ self.tree_view.append_column(self.sort_column)
+
+ def _get_width_for_string(self, text):
+ # Add some extra margin
+@@ -415,7 +415,7 @@ class BaseListView(gtk.Bin):
+
+ while True:
+ x, y, width, height = self.tree_view.get_cell_area(path,
+- self.date_column)
++ self.sort_column)
+ x, y = self.tree_view.convert_tree_to_widget_coords(x, y)
+ self.tree_view.queue_draw_area(x, y, width, height)
+ if path == end_path:
+--
+1.7.0.4
+
diff --git a/rpms/sugar/sizelist-0006-Display-the-sorting-property-in-the-last-column.patch b/rpms/sugar/sizelist-0006-Display-the-sorting-property-in-the-last-column.patch
new file mode 100644
index 0000000..a7bfb46
--- /dev/null
+++ b/rpms/sugar/sizelist-0006-Display-the-sorting-property-in-the-last-column.patch
@@ -0,0 +1,46 @@
+From 58c5a4d007acc23f62f9636c45e1b63af3c487f9 Mon Sep 17 00:00:00 2001
+Message-Id: <58c5a4d007acc23f62f9636c45e1b63af3c487f9.1278054601.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278054601.git.andresambrois@gmail.com>
+References: <cover.1278054601.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Sun, 23 May 2010 04:07:20 -0300
+Subject: [PATCH v2 06/10] Display the sorting property in the last column.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+update_with_query() is called when the query is modified in the toolbox.
+Get the name of the property and set the sort_column cell renderer accordingly.
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/jarabe/journal/listview.py | 11 ++++++++---
+ 1 files changed, 8 insertions(+), 3 deletions(-)
+
+diff --git a/src/jarabe/journal/listview.py b/src/jarabe/journal/listview.py
+index 375a8ee..deffe84 100644
+--- a/src/jarabe/journal/listview.py
++++ b/src/jarabe/journal/listview.py
+@@ -252,11 +252,16 @@ class BaseListView(gtk.Bin):
+
+ def update_with_query(self, query_dict):
+ logging.debug('ListView.update_with_query')
++ if 'order_by' not in query_dict:
++ query_dict['order_by'] = ['+timestamp']
++ if query_dict['order_by'] != self._query.get('order_by'):
++ property = query_dict['order_by'][0][1:]
++ cell_text = self.sort_column.get_cell_renderers()[0]
++ self.sort_column.set_attributes(cell_text,
++ text=getattr(ListModel, 'COLUMN_' + property.upper(),
++ ListModel.COLUMN_TIMESTAMP))
+ self._query = query_dict
+
+- if 'order_by' not in self._query:
+- self._query['order_by'] = ['+timestamp']
+-
+ self.refresh()
+
+ def refresh(self):
+--
+1.7.0.4
+
diff --git a/rpms/sugar/sizelist-0007-Expandedentry-Try-to-use-the-filesize-property.patch b/rpms/sugar/sizelist-0007-Expandedentry-Try-to-use-the-filesize-property.patch
new file mode 100644
index 0000000..db9abda
--- /dev/null
+++ b/rpms/sugar/sizelist-0007-Expandedentry-Try-to-use-the-filesize-property.patch
@@ -0,0 +1,37 @@
+From 14f5407570cff02172b439f1144b93b6a54c2263 Mon Sep 17 00:00:00 2001
+Message-Id: <14f5407570cff02172b439f1144b93b6a54c2263.1278054601.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278054601.git.andresambrois@gmail.com>
+References: <cover.1278054601.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Sun, 23 May 2010 04:21:37 -0300
+Subject: [PATCH v2 07/10] Expandedentry: Try to use the filesize property.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Instead of calling the datastore again.
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/jarabe/journal/expandedentry.py | 5 +++--
+ 1 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/src/jarabe/journal/expandedentry.py b/src/jarabe/journal/expandedentry.py
+index c8e40c1..725c0f9 100644
+--- a/src/jarabe/journal/expandedentry.py
++++ b/src/jarabe/journal/expandedentry.py
+@@ -260,8 +260,9 @@ class ExpandedEntry(hippo.CanvasBox):
+ lines = [
+ _('Kind: %s') % (self._metadata.get('mime_type') or _('Unknown'),),
+ _('Date: %s') % (self._format_date(),),
+- _('Size: %s') % (format_size(model.get_file_size(
+- self._metadata['uid'])),)]
++ _('Size: %s') % (format_size(int(self._metadata.get('filesize',
++ model.get_file_size(self._metadata['uid']))))),
++ ]
+
+ for line in lines:
+ text = hippo.CanvasText(text=line,
+--
+1.7.0.4
+
diff --git a/rpms/sugar/sizelist-0008-Implement-sorting-for-removable-devices.patch b/rpms/sugar/sizelist-0008-Implement-sorting-for-removable-devices.patch
new file mode 100644
index 0000000..b767c51
--- /dev/null
+++ b/rpms/sugar/sizelist-0008-Implement-sorting-for-removable-devices.patch
@@ -0,0 +1,82 @@
+From ba306490c248fada6bc7858ae4660b9aca9bcfcd Mon Sep 17 00:00:00 2001
+Message-Id: <ba306490c248fada6bc7858ae4660b9aca9bcfcd.1278054601.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278054601.git.andresambrois@gmail.com>
+References: <cover.1278054601.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Sun, 23 May 2010 04:23:12 -0300
+Subject: [PATCH v2 08/10] Implement sorting for removable devices.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/jarabe/journal/model.py | 16 +++++++++++++---
+ 1 files changed, 13 insertions(+), 3 deletions(-)
+
+diff --git a/src/jarabe/journal/model.py b/src/jarabe/journal/model.py
+index 874d7bd..4fd81ac 100644
+--- a/src/jarabe/journal/model.py
++++ b/src/jarabe/journal/model.py
+@@ -21,6 +21,7 @@ import time
+ import shutil
+ from stat import S_IFMT, S_IFDIR, S_IFREG
+ import re
++from operator import itemgetter
+
+ import gobject
+ import dbus
+@@ -246,6 +247,8 @@ class InplaceResultSet(BaseResultSet):
+
+ self._mime_types = query.get('mime_type', [])
+
++ self._sort = query.get('order_by', ['+timestamp'])[0]
++
+ def setup(self):
+ self._file_list = []
+ self._recurse_dir(self._mount_point)
+@@ -254,7 +257,13 @@ class InplaceResultSet(BaseResultSet):
+ self._stopped = True
+
+ def setup_ready(self):
+- self._file_list.sort(lambda a, b: cmp(b[2], a[2]))
++ if self._sort[1:] == 'filesize':
++ keygetter = itemgetter(3)
++ else:
++ keygetter = itemgetter(2) # timestamp
++ self._file_list.sort(lambda a, b: cmp(b, a),
++ key=keygetter,
++ reverse=self._sort[0]=='-')
+ self.ready.send(self)
+
+ def find(self, query):
+@@ -273,7 +282,7 @@ class InplaceResultSet(BaseResultSet):
+ files = self._file_list[offset:offset + limit]
+
+ entries = []
+- for file_path, stat, mtime_ in files:
++ for file_path, stat, mtime_, size_ in files:
+ metadata = _get_file_metadata(file_path, stat)
+ metadata['mountpoint'] = self._mount_point
+ entries.append(metadata)
+@@ -331,7 +340,7 @@ class InplaceResultSet(BaseResultSet):
+ add_to_list = False
+
+ if add_to_list:
+- file_info = (full_path, stat, int(stat.st_mtime))
++ file_info = (full_path, stat, int(stat.st_mtime), stat.st_size)
+ self._file_list.append(file_info)
+
+ self.progress.send(self)
+@@ -344,6 +353,7 @@ def _get_file_metadata(path, stat):
+ return {'uid': path,
+ 'title': os.path.basename(path),
+ 'timestamp': stat.st_mtime,
++ 'filesize': stat.st_size,
+ 'mime_type': gio.content_type_guess(filename=path),
+ 'activity': '',
+ 'activity_id': '',
+--
+1.7.0.4
+
diff --git a/rpms/sugar/sizelist-0009-Add-sort-by-creation-time-option-to-the-ListViewButt.patch b/rpms/sugar/sizelist-0009-Add-sort-by-creation-time-option-to-the-ListViewButt.patch
new file mode 100644
index 0000000..254e010
--- /dev/null
+++ b/rpms/sugar/sizelist-0009-Add-sort-by-creation-time-option-to-the-ListViewButt.patch
@@ -0,0 +1,32 @@
+From 0e289d4cc2d92574b27be3806bff6e6dae6bb48b Mon Sep 17 00:00:00 2001
+Message-Id: <0e289d4cc2d92574b27be3806bff6e6dae6bb48b.1278054601.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278054601.git.andresambrois@gmail.com>
+References: <cover.1278054601.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Sun, 23 May 2010 04:42:55 -0300
+Subject: [PATCH v2 09/10] Add sort by creation time option to the ListViewButton
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/jarabe/journal/journaltoolbox.py | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/src/jarabe/journal/journaltoolbox.py b/src/jarabe/journal/journaltoolbox.py
+index 995cc73..03afb4e 100644
+--- a/src/jarabe/journal/journaltoolbox.py
++++ b/src/jarabe/journal/journaltoolbox.py
+@@ -502,6 +502,7 @@ class ListViewButton(RadioToolButton):
+
+ _SORT_OPTIONS = [
+ ('timestamp', 'view-lastedit', _('View by last edit')),
++ ('ctime', 'view-created', _('View by creation date')),
+ ('filesize', 'view-size', _('View by size')),
+ ]
+
+--
+1.7.0.4
+
diff --git a/rpms/sugar/sizelist-0010-Add-ctime-property-to-the-journal-model.patch b/rpms/sugar/sizelist-0010-Add-ctime-property-to-the-journal-model.patch
new file mode 100644
index 0000000..5fd3ee9
--- /dev/null
+++ b/rpms/sugar/sizelist-0010-Add-ctime-property-to-the-journal-model.patch
@@ -0,0 +1,95 @@
+From def49facd34182305e5d8c1ea273c0992aa90af0 Mon Sep 17 00:00:00 2001
+Message-Id: <def49facd34182305e5d8c1ea273c0992aa90af0.1278054601.git.andresambrois@gmail.com>
+In-Reply-To: <cover.1278054601.git.andresambrois@gmail.com>
+References: <cover.1278054601.git.andresambrois@gmail.com>
+From: =?UTF-8?q?Andr=C3=A9s=20Ambrois?= <andresambrois@gmail.com>
+Date: Sun, 23 May 2010 04:44:04 -0300
+Subject: [PATCH v2 10/10] Add ctime property to the journal model.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+
+Signed-off-by: Andrés Ambrois <andresambrois@gmail.com>
+---
+ src/jarabe/journal/listmodel.py | 22 +++++++++++++++++-----
+ src/jarabe/journal/model.py | 2 +-
+ 2 files changed, 18 insertions(+), 6 deletions(-)
+
+diff --git a/src/jarabe/journal/listmodel.py b/src/jarabe/journal/listmodel.py
+index 135dc95..c07d9e1 100644
+--- a/src/jarabe/journal/listmodel.py
++++ b/src/jarabe/journal/listmodel.py
+@@ -19,6 +19,7 @@ import logging
+ import simplejson
+ import gobject
+ import gtk
++import time
+
+ from sugar.graphics.xocolor import XoColor
+ from sugar.graphics import style
+@@ -31,6 +32,8 @@ DS_DBUS_SERVICE = 'org.laptop.sugar.DataStore'
+ DS_DBUS_INTERFACE = 'org.laptop.sugar.DataStore'
+ DS_DBUS_PATH = '/org/laptop/sugar/DataStore'
+
++CTIME_FORMAT = '%Y-%m-%dT%H:%M:%S'
++
+ class ListModel(gtk.GenericTreeModel, gtk.TreeDragSource):
+ __gtype_name__ = 'JournalListModel'
+
+@@ -49,11 +52,12 @@ class ListModel(gtk.GenericTreeModel, gtk.TreeDragSource):
+ COLUMN_ICON_COLOR = 3
+ COLUMN_TITLE = 4
+ COLUMN_TIMESTAMP = 5
+- COLUMN_FILESIZE = 6
+- COLUMN_PROGRESS = 7
+- COLUMN_BUDDY_1 = 8
+- COLUMN_BUDDY_2 = 9
+- COLUMN_BUDDY_3 = 10
++ COLUMN_CTIME = 6
++ COLUMN_FILESIZE = 7
++ COLUMN_PROGRESS = 8
++ COLUMN_BUDDY_1 = 9
++ COLUMN_BUDDY_2 = 10
++ COLUMN_BUDDY_3 = 11
+
+ _COLUMN_TYPES = {COLUMN_UID: str,
+ COLUMN_FAVORITE: bool,
+@@ -61,6 +65,7 @@ class ListModel(gtk.GenericTreeModel, gtk.TreeDragSource):
+ COLUMN_ICON_COLOR: object,
+ COLUMN_TITLE: str,
+ COLUMN_TIMESTAMP: str,
++ COLUMN_CTIME: str,
+ COLUMN_FILESIZE: str,
+ COLUMN_PROGRESS: int,
+ COLUMN_BUDDY_1: object,
+@@ -143,6 +148,13 @@ class ListModel(gtk.GenericTreeModel, gtk.TreeDragSource):
+ timestamp = int(metadata.get('timestamp', 0))
+ self._cached_row.append(util.timestamp_to_elapsed_string(timestamp))
+
++ ctime = metadata.get('ctime')
++ if ctime:
++ ctime = time.mktime(time.strptime(ctime, CTIME_FORMAT))
++ else:
++ ctime = 0
++ self._cached_row.append(util.timestamp_to_elapsed_string(ctime))
++
+ size = int(metadata.get('filesize', 0))
+ self._cached_row.append(util.format_size(size))
+
+diff --git a/src/jarabe/journal/model.py b/src/jarabe/journal/model.py
+index 4fd81ac..ae77e72 100644
+--- a/src/jarabe/journal/model.py
++++ b/src/jarabe/journal/model.py
+@@ -37,7 +37,7 @@ DS_DBUS_INTERFACE = 'org.laptop.sugar.DataStore'
+ DS_DBUS_PATH = '/org/laptop/sugar/DataStore'
+
+ # Properties the journal cares about.
+-PROPERTIES = ['uid', 'title', 'mtime', 'timestamp', 'filesize',
++PROPERTIES = ['uid', 'title', 'mtime', 'timestamp', 'ctime', 'filesize',
+ 'keep', 'buddies', 'icon-color', 'mime_type', 'progress',
+ 'activity', 'mountpoint', 'activity_id', 'bundle_id']
+
+--
+1.7.0.4
+
diff --git a/rpms/sugar/sl1842-journal-show-error-on-write-failure.patch b/rpms/sugar/sl1842-journal-show-error-on-write-failure.patch
new file mode 100644
index 0000000..87b267a
--- /dev/null
+++ b/rpms/sugar/sl1842-journal-show-error-on-write-failure.patch
@@ -0,0 +1,123 @@
+From: anishmangal2002 <anishmangal2002@gmail.com>
+To: Bernie Innocenti <bernie@codewiz.org>
+Cc: sugar-devel <sugar-devel@lists.sugarlabs.org>, anishmangal2002 <anishmangal2002@gmail.com>
+Subject: [PATCH] Journal:show error message on write failure: #1842
+Date: Sat, 3 Jul 2010 00:55:56 +0530
+
+volumestoolbar.py now catches the IOError and ValueError
+exceptions and emits 'volume-error'signal. This signal is
+caught in journalactivity.py which displays the error as
+an ErrorAlert message.
+
+Signed-off-by: anishmangal2002 <anishmangal2002@gmail.com>
+---
+ src/jarabe/journal/journalactivity.py | 16 ++++++++++++++++
+ src/jarabe/journal/volumestoolbar.py | 22 +++++++++++++++++++++-
+ 2 files changed, 37 insertions(+), 1 deletions(-)
+
+diff --git a/src/jarabe/journal/journalactivity.py b/src/jarabe/journal/journalactivity.py
+index 0559560..eab292b 100644
+--- a/src/jarabe/journal/journalactivity.py
++++ b/src/jarabe/journal/journalactivity.py
+@@ -27,6 +27,9 @@ import statvfs
+ import os
+
+ from sugar.graphics.window import Window
++from sugar.graphics.alert import ErrorAlert
++from sugar.graphics.icon import Icon
++
+ from sugar.bundle.bundle import ZipExtractException, RegistrationException
+ from sugar import env
+ from sugar.activity import activityfactory
+@@ -138,6 +141,17 @@ class JournalActivity(Window):
+ self._critical_space_alert = None
+ self._check_available_space()
+
++ def _alert_notify_cb(self, gobject, strerror, severity):
++ alert = ErrorAlert()
++ alert.props.title= severity
++ alert.props.msg = strerror
++ alert.connect('response', self._alert_response_cb)
++ self.add_alert(alert)
++ alert.show()
++
++ def _alert_response_cb(self, alert, response_id):
++ self.remove_alert(alert)
++
+ def __realize_cb(self, window):
+ wm.set_bundle_id(window.window, _BUNDLE_ID)
+ activity_id = activityfactory.create_activity_id()
+@@ -161,6 +175,8 @@ class JournalActivity(Window):
+ self._volumes_toolbar = VolumesToolbar()
+ self._volumes_toolbar.connect('volume-changed',
+ self.__volume_changed_cb)
++ self._volumes_toolbar.connect('volume-error', self._alert_notify_cb,
++ 'Error')
+ self._main_view.pack_start(self._volumes_toolbar, expand=False)
+
+ search_toolbar = self._main_toolbox.search_toolbar
+diff --git a/src/jarabe/journal/volumestoolbar.py b/src/jarabe/journal/volumestoolbar.py
+index 74b974c..a6acebe 100644
+--- a/src/jarabe/journal/volumestoolbar.py
++++ b/src/jarabe/journal/volumestoolbar.py
+@@ -35,6 +35,9 @@ class VolumesToolbar(gtk.Toolbar):
+ __gsignals__ = {
+ 'volume-changed': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
++ ([str])),
++ 'volume-error': (gobject.SIGNAL_RUN_FIRST,
++ gobject.TYPE_NONE,
+ ([str]))
+ }
+
+@@ -81,6 +84,7 @@ class VolumesToolbar(gtk.Toolbar):
+ button = VolumeButton(mount)
+ button.props.group = self._volume_buttons[0]
+ button.connect('toggled', self._button_toggled_cb)
++ button.connect('volume-error', self._volume_error_cb)
+ position = self.get_item_index(self._volume_buttons[-1]) + 1
+ self.insert(button, position)
+ button.show()
+@@ -90,6 +94,9 @@ class VolumesToolbar(gtk.Toolbar):
+ if len(self.get_children()) > 1:
+ self.show()
+
++ def _volume_error_cb(self, button, strerror):
++ self.emit('volume-error', strerror)
++
+ def _button_toggled_cb(self, button):
+ if button.props.active:
+ self.emit('volume-changed', button.mount_point)
+@@ -123,6 +130,12 @@ class VolumesToolbar(gtk.Toolbar):
+ button.props.active = True
+
+ class BaseButton(RadioToolButton):
++ __gsignals__ = {
++ 'volume-error': (gobject.SIGNAL_RUN_FIRST,
++ gobject.TYPE_NONE,
++ ([str]))
++ }
++
+ def __init__(self, mount_point):
+ RadioToolButton.__init__(self)
+
+@@ -137,7 +150,14 @@ class BaseButton(RadioToolButton):
+ info, timestamp):
+ object_id = selection_data.data
+ metadata = model.get(object_id)
+- model.copy(metadata, self.mount_point)
++ try:
++ model.copy(metadata, self.mount_point)
++ except IOError as (errno, strerror):
++ logging.error('BaseButton._drag_data_received_cb: IOError: %s; %s' % (errno, strerror))
++ self.emit('volume-error', strerror)
++ except ValueError as (strerror):
++ logging.error('BaseButton._drag_data_received_cb: ValueError: %s' % (strerror))
++ self.emit('volume-error', strerror)
+
+ class VolumeButton(BaseButton):
+ def __init__(self, mount):
+--
+1.7.0.1
+
+
diff --git a/rpms/sugar/sl2006-file-exists-check.patch b/rpms/sugar/sl2006-file-exists-check.patch
new file mode 100644
index 0000000..0981b99
--- /dev/null
+++ b/rpms/sugar/sl2006-file-exists-check.patch
@@ -0,0 +1,26 @@
+From 3f52994220944760786a161c8046c2fbbd7ca89a Mon Sep 17 00:00:00 2001
+From: Walter Bender <walter@sugarlabs.org>
+Date: Fri, 21 May 2010 11:08:06 -0400
+Subject: [PATCH] file exisits check
+
+---
+ extensions/cpsection/touchpad/model.py | 3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+diff --git a/extensions/cpsection/touchpad/model.py b/extensions/cpsection/touchpad/model.py
+index 77eefa4..8c17cb9 100644
+--- a/extensions/cpsection/touchpad/model.py
++++ b/extensions/cpsection/touchpad/model.py
+@@ -38,7 +38,8 @@ def get_touchpad():
+ def set_touchpad(touchpad):
+ """Set the touchpad mode."""
+ if touchpad == _CAPACITIVE:
+- system("rm %s" % (_flag_path))
++ if path.exists(_flag_path):
++ system("rm %s" % (_flag_path))
+ system("echo 0 > %s" % (_node_path))
+ else:
+ system("touch %s" % (_flag_path))
+--
+1.7.0.4
+
diff --git a/rpms/sugar/sl2006-touchpad-section-for-control-panel.patch b/rpms/sugar/sl2006-touchpad-section-for-control-panel.patch
new file mode 100644
index 0000000..914477c
--- /dev/null
+++ b/rpms/sugar/sl2006-touchpad-section-for-control-panel.patch
@@ -0,0 +1,404 @@
+From f485b65a85609713e0fdb179f354977e63646f33 Mon Sep 17 00:00:00 2001
+From: Walter Bender <walter@sugarlabs.org>
+Date: Wed, 19 May 2010 08:29:22 -0400
+Subject: [PATCH] touchpad section for control panel
+
+---
+ configure.ac | 1 +
+ data/icons/Makefile.am | 1 +
+ data/icons/module-touchpad.svg | 36 ++++++
+ extensions/cpsection/Makefile.am | 2 +-
+ extensions/cpsection/touchpad/Makefile.am | 6 +
+ extensions/cpsection/touchpad/__init__.py | 25 ++++
+ extensions/cpsection/touchpad/model.py | 59 ++++++++++
+ extensions/cpsection/touchpad/view.py | 178 +++++++++++++++++++++++++++++
+ 8 files changed, 307 insertions(+), 1 deletions(-)
+ create mode 100644 data/icons/module-touchpad.svg
+ create mode 100644 extensions/cpsection/touchpad/Makefile.am
+ create mode 100644 extensions/cpsection/touchpad/__init__.py
+ create mode 100644 extensions/cpsection/touchpad/model.py
+ create mode 100644 extensions/cpsection/touchpad/view.py
+
+diff --git a/configure.ac b/configure.ac
+index 4f60892..e7d1c73 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -59,6 +59,7 @@ extensions/cpsection/modemconfiguration/Makefile
+ extensions/cpsection/Makefile
+ extensions/cpsection/network/Makefile
+ extensions/cpsection/power/Makefile
++extensions/cpsection/touchpad/Makefile
+ extensions/cpsection/updater/backends/Makefile
+ extensions/cpsection/updater/Makefile
+ extensions/deviceicon/Makefile
+diff --git a/data/icons/Makefile.am b/data/icons/Makefile.am
+index a35643a..b65b34e 100644
+--- a/data/icons/Makefile.am
++++ b/data/icons/Makefile.am
+@@ -10,6 +10,7 @@ sugar_DATA = \
+ module-modemconfiguration.svg \
+ module-network.svg \
+ module-power.svg \
++ module-touchpad.svg \
+ module-updater.svg
+
+ EXTRA_DIST = $(sugar_DATA)
+diff --git a/data/icons/module-touchpad.svg b/data/icons/module-touchpad.svg
+new file mode 100644
+index 0000000..5794fd7
+--- /dev/null
++++ b/data/icons/module-touchpad.svg
+@@ -0,0 +1,36 @@
++<?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.1"
++ width="55"
++ height="55"
++ viewBox="0 0 55 55"
++ id="Layer_1"
++ xml:space="preserve"><defs
++ id="defs2829" />
++<g
++ transform="translate(0,-3.9)"
++ id="g2817">
++</g>
++
++
++
++<g
++ transform="translate(0,4.3506441)"
++ id="g2928"><g
++ transform="translate(0,-20)"
++ id="g2819">
++<path
++ d="m 2.934,28.664 0,18.209 49.391,0 0,-18.209 -49.391,0 z M 36,45.833 l -17,0 0,-16.129 17,0 0,16.129 z"
++ id="path2821"
++ style="fill:#ffffff;stroke:#666666;stroke-width:2" />
++</g><path
++ d="m 46.742465,3.78755 -5.095999,6.747499 -1.044001,1.3585 -1.7375,4.133 c -0.023,0.052 -0.009,0.1115 0.0345,0.1475 0.0445,0.036 0.1055,0.042 0.1535,0.01 l 3.913,-2.5185 c 0.0055,-0.004 0.0055,-0.0135 0.011,-0.0215 0.0325,-0.0245 0.071,-0.046 0.098,-0.081 0.0015,-10e-4 0.017,-0.0205 0.017,-0.0245 l 0.9155,-1.1355 2.7345,-3.527 4.005501,-5.164499 c 0.011,-0.0115 0.0745,-0.1015 0.0745,-0.1015 0.048,-0.0805 0.074,-0.1725 0.074,-0.278 0,-0.0305 0,-0.059 -0.006,-0.088 -0.0435,-0.3815 -0.357501,-0.841 -0.819501,-1.2065 -0.4615,-0.364 -0.9845,-0.5615 -1.364,-0.517 -0.163,0.021 -0.3945,0.1875 -0.3945,0.1875 l -1.5695,2.0795 z"
++ id="path2823"
++ style="fill:#ffffff;stroke:#666666;stroke-width:1.5" /><path
++ d="m 22.817123,44.784359 c 0,0 -3.23492,-8.766448 -3.243008,-9.837791 -0.0135,-1.797291 -2.398098,-2.342156 -2.398098,-2.342156 0,0 -0.621319,-2.249376 0,-2.770053 0.656117,-0.549837 2.934483,-0.629824 3.735004,0.330634 l 2.413094,2.895211 0,-12.75 c 0,0 0.888891,-1.589214 1.643962,-1.454545 0.745806,0.133019 1.356038,1.454545 1.356038,1.454545 l 0,10.5 0,-4.5 c 0,0 0.947828,-0.746067 1.5,-0.75 0.552172,-0.0039 1.5,0.75 1.5,0.75 l 0,4.5 0,-3.75 c 0,0 0.675747,-0.758712 1.5,-0.75 0.824253,0.0087 1.5,0.568182 1.5,0.568182 l 0,3.931818 0,-3 c 0,0 0.857274,-0.33549 1.5,-0.375 0.526597,-0.03237 1.448303,0.97351 1.5,1.575 0.220672,2.567514 0.969363,5.350927 0.823983,7.574377 -0.100086,1.53071 -0.67874,8.199778 -2.212713,8.199778 l -11.118262,0 z"
++ id="path2825"
++ style="fill:#ffffff;stroke:#666666;stroke-width:1.5" /></g></svg>
+\ No newline at end of file
+--- sugar-0.88.0/extensions/cpsection/Makefile.am.orig 2010-05-23 17:22:09.000000000 -0400
++++ sugar-0.88.0/extensions/cpsection/Makefile.am 2010-05-23 17:23:42.000000000 -0400
+@@ -1,5 +1,16 @@
+-SUBDIRS = aboutme aboutcomputer datetime frame keyboard language \
+- modemconfiguration network power updater
++SUBDIRS = \
++ aboutme \
++ aboutcomputer \
++ datetime \
++ frame \
++ keyboard \
++ language \
++ modemconfiguration \
++ network \
++ power \
++ touchpad \
++ updater \
++ #
+
+ sugardir = $(pkgdatadir)/extensions/cpsection
+ sugar_PYTHON = __init__.py
+diff --git a/extensions/cpsection/touchpad/Makefile.am b/extensions/cpsection/touchpad/Makefile.am
+new file mode 100644
+index 0000000..fd83e2f
+--- /dev/null
++++ b/extensions/cpsection/touchpad/Makefile.am
+@@ -0,0 +1,6 @@
++sugardir = $(pkgdatadir)/extensions/cpsection/touchpad
++
++sugar_PYTHON = \
++ __init__.py \
++ model.py \
++ view.py
+diff --git a/extensions/cpsection/touchpad/__init__.py b/extensions/cpsection/touchpad/__init__.py
+new file mode 100644
+index 0000000..95c1af8
+--- /dev/null
++++ b/extensions/cpsection/touchpad/__init__.py
+@@ -0,0 +1,25 @@
++# Copyright (C) 2008, OLPC
++#
++# 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 2 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, write to the Free Software
++# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++
++from gettext import gettext as _
++from os import path
++
++# Only include this Control Panel section if on OLPC XO-1.0 CL1 hardware.
++if path.exists('/sys/devices/platform/i8042/serio1/ptmode'):
++ CLASS = 'Touchpad'
++ ICON = 'module-touchpad'
++ TITLE = _('Touchpad')
++ KEYWORDS = ['touchpad']
+diff --git a/extensions/cpsection/touchpad/model.py b/extensions/cpsection/touchpad/model.py
+new file mode 100644
+index 0000000..77eefa4
+--- /dev/null
++++ b/extensions/cpsection/touchpad/model.py
+@@ -0,0 +1,59 @@
++# Copyright (C) 2010, Walter Bender, Sugar Labs
++#
++# 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 2 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, write to the Free Software
++# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++#
++from gettext import gettext as _
++from os import system, path
++import gconf
++
++_CAPACITIVE = 0
++_RESISTIVE = 1
++_flag_path = '/home/olpc/.olpc-pentablet-mode'
++_node_path = '/sys/devices/platform/i8042/serio1/ptmode'
++
++def get_touchpad():
++ """Get the touchpad mode."""
++
++ _file_handle = open(_node_path, "r")
++ _text = _file_handle.read()
++ _file_handle.close()
++
++ if _text[0] == '1':
++ return _RESISTIVE
++ else:
++ return _CAPACITIVE
++
++def set_touchpad(touchpad):
++ """Set the touchpad mode."""
++ if touchpad == _CAPACITIVE:
++ system("rm %s" % (_flag_path))
++ system("echo 0 > %s" % (_node_path))
++ else:
++ system("touch %s" % (_flag_path))
++ system("echo 1 > %s" % (_node_path))
++ return
++
++def print_touchpad():
++ """Print the future touchpad mode."""
++ if get_touchpad == _CAPACITIVE:
++ print _('Touchpad set to finger mode.')
++ else:
++ print _('Touchpad set to stylus mode.')
++
++def get_color_xo():
++ """Get xo color"""
++ client = gconf.client_get_default()
++ return client.get_string("/desktop/sugar/user/color")
++
+diff --git a/extensions/cpsection/touchpad/view.py b/extensions/cpsection/touchpad/view.py
+new file mode 100644
+index 0000000..19fb686
+--- /dev/null
++++ b/extensions/cpsection/touchpad/view.py
+@@ -0,0 +1,178 @@
++# Copyright (C) 2008, OLPC
++# Copyright (C) 2010, Walter Bender, Sugar Labs
++#
++# 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 2 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, write to the Free Software
++# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++
++import gtk
++import gobject
++from gettext import gettext as _
++
++from sugar.graphics.icon import Icon
++from sugar.graphics import style
++from sugar.graphics.xocolor import XoColor
++
++from jarabe.controlpanel.sectionview import SectionView
++from jarabe.controlpanel.inlinealert import InlineAlert
++
++_CAPACITIVE = 0
++_RESISTIVE = 1
++
++class TouchpadEventIcon(gtk.EventBox):
++ """A subclass of the Sugar Event Icon"""
++ __gtype_name__ = "SugarEventIcon"
++
++ def __init__(self, **kwargs):
++ """Create an extra-large, clickable icon."""
++ gtk.EventBox.__init__(self)
++
++ self.icon = Icon(pixel_size = style.XLARGE_ICON_SIZE, **kwargs)
++
++ self.set_visible_window(False)
++ self.set_app_paintable(True)
++ self.set_events(gtk.gdk.BUTTON_PRESS_MASK)
++
++ self.add(self.icon)
++ self.icon.show()
++
++class TouchpadPicker(TouchpadEventIcon):
++ """A class for the touchpad selection buttons"""
++ __gsignals__ = {
++ 'touchpad-changed': (gobject.SIGNAL_RUN_FIRST,
++ gobject.TYPE_NONE,
++ ([object]))
++ }
++
++ def __init__(self, touchpad_mode):
++ """Create icons for the touchpad mode buttons."""
++ TouchpadEventIcon.__init__(self)
++
++ if touchpad_mode == _CAPACITIVE:
++ self.icon.props.icon_name = 'capacitive'
++ else:
++ self.icon.props.icon_name = 'resistive'
++ self._touchpad_mode = touchpad_mode
++
++ self.icon.props.pixel_size = style.XLARGE_ICON_SIZE
++
++ self.connect('button_press_event', self.__pressed_cb, touchpad_mode)
++
++ def update(self, touchpad, xo_color):
++ """Update the button states."""
++ if self._touchpad_mode == _CAPACITIVE:
++ self.icon.props.icon_name = 'capacitive'
++ if touchpad == _CAPACITIVE:
++ self.icon.props.xo_color = xo_color
++ else:
++ self.icon.props.xo_color = XoColor('#666666,#FFFFFF')
++ elif self._touchpad_mode == _RESISTIVE:
++ self.icon.props.icon_name = 'resistive'
++ if touchpad == _RESISTIVE:
++ self.icon.props.xo_color = xo_color
++ else:
++ self.icon.props.xo_color = XoColor('#666666,#FFFFFF')
++
++ def __pressed_cb(self, button, event, touchpad_mode):
++ """Callback for button click."""
++ self.emit('touchpad-changed', touchpad_mode)
++
++class Touchpad(SectionView):
++ """A class for the touchpad selection panel"""
++
++ def __init__(self, model, alerts):
++ """ Create the touchpad panel."""
++ SectionView.__init__(self)
++
++ self._model = model
++ self._color = XoColor(self._model.get_color_xo())
++ self._handlers = []
++
++ self.set_border_width(style.DEFAULT_SPACING * 2)
++ self.set_spacing(style.DEFAULT_SPACING)
++ self._group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
++
++ self._touchpad_label = gtk.HBox(spacing=style.DEFAULT_SPACING)
++ self._touchpad_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
++ self._touchpad_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
++ self._touchpad_alert = None
++
++ self._pickers = {
++ _CAPACITIVE: TouchpadPicker(_CAPACITIVE),
++ _RESISTIVE: TouchpadPicker(_RESISTIVE)}
++
++ self._setup_touchpad()
++ self._initial_value = self._model.get_touchpad()
++ self._update_pickers(self._initial_value)
++
++ self.setup()
++
++ def _setup_touchpad(self):
++ """Layout the panel: label, buttons, alert"""
++ label_touchpad = gtk.Label(_('Click to change your touchpad:'))
++ label_touchpad.modify_fg(gtk.STATE_NORMAL,
++ style.COLOR_SELECTION_GREY.get_gdk_color())
++ self._group.add_widget(label_touchpad)
++ self._touchpad_label.pack_start(label_touchpad, expand=False)
++ label_touchpad.show()
++
++ for touchpad_mode in sorted(self._pickers.keys()):
++ picker = self._pickers[touchpad_mode]
++ picker.show()
++ self._touchpad_box.pack_start(picker, expand=False)
++
++ label_touchpad_error = gtk.Label()
++ self._group.add_widget(label_touchpad_error)
++ self._touchpad_alert_box.pack_start(label_touchpad_error, expand=False)
++ label_touchpad_error.show()
++
++ self._touchpad_alert = InlineAlert()
++ self._touchpad_alert_box.pack_start(self._touchpad_alert)
++
++ self._center_in_panel = gtk.Alignment(0.5)
++ self._center_in_panel.add(self._touchpad_box)
++ self.pack_start(self._touchpad_label, False)
++ self.pack_start(self._center_in_panel, False)
++ self.pack_start(self._touchpad_alert_box, False)
++ self._touchpad_label.show()
++ self._touchpad_box.show()
++ self._touchpad_alert_box.show()
++ self._center_in_panel.show()
++
++ def setup(self):
++ """Set up the buttons."""
++ self.needs_restart = False
++
++ def connect(widget, signal, callback):
++ self._handlers.append((widget, widget.connect(signal, callback)))
++
++ for picker in self._pickers.values():
++ connect(picker, 'touchpad-changed', self.__touchpad_changed_cb)
++
++ def undo(self):
++ """Undo any changes."""
++ for widget, handler in self._handlers:
++ widget.disconnect(handler)
++ self._model.set_touchpad(self._initial_value)
++ self._touchpad_alert.hide()
++
++ def _update_pickers(self, touchpad):
++ """Update the buttons to reflect selection"""
++ for picker in self._pickers.values():
++ picker.update(touchpad, self._color)
++
++ def __touchpad_changed_cb(self, touchpadpicker, touchpad):
++ """Callback for mode change -- no restart alert is needed."""
++ self._model.set_touchpad(touchpad)
++ self._update_pickers(touchpad)
++ return False
+--
+1.7.0.4
+
diff --git a/rpms/sugar/sl2062.patch b/rpms/sugar/sl2062.patch
new file mode 100644
index 0000000..bda59e7
--- /dev/null
+++ b/rpms/sugar/sl2062.patch
@@ -0,0 +1,21 @@
+Subject: [PATCH] schoolserver.register_laptop() complains when offline
+
+register_laptop() now raises the TypeError raised by
+xmlrpclib as a RegisterError. This also provides visual
+feedback to the user, prompting to connect to the network.
+---
+ src/jarabe/desktop/schoolserver.py | 5 ++++-
+ 1 files changed, 4 insertions(+), 1 deletions(-)
+
+diff --git a/src/jarabe/desktop/schoolserver.py b/src/jarabe/desktop/schoolserver.py
+index fc9ddeb..a05f56c 100644
+--- a/src/jarabe/desktop/schoolserver.py
++++ b/src/jarabe/desktop/schoolserver.py
+@@ -99,7 +99,7 @@ def register_laptop(url=REGISTER_URL):
+ server = ServerProxy(url)
+ try:
+ data = server.register(sn, nick, uuid_, profile.pubkey)
+- except (Error, socket.error):
++ except (Error, TypeError, socket.error):
+ logging.exception('Registration: cannot connect to server')
+ raise RegisterError(_('Cannot connect to the server.'))
diff --git a/rpms/sugar/sl2064-always-listen-for-NameOwnerChanged-DBus-message.patch b/rpms/sugar/sl2064-always-listen-for-NameOwnerChanged-DBus-message.patch
new file mode 100644
index 0000000..0cbd586
--- /dev/null
+++ b/rpms/sugar/sl2064-always-listen-for-NameOwnerChanged-DBus-message.patch
@@ -0,0 +1,33 @@
+From d2b9c7b0f43d7fd9295d07341629ed55016d5f36 Mon Sep 17 00:00:00 2001
+From: Aleksey Lim <alsroot@member.fsf.org>
+Date: Mon, 28 Jun 2010 05:02:52 +0000
+Subject: Listen for NameOwnerChanged DBus siginal all time for activities #2064
+
+
+diff --git a/src/jarabe/model/shell.py b/src/jarabe/model/shell.py
+index 553e889..69b45e2 100644
+--- a/src/jarabe/model/shell.py
++++ b/src/jarabe/model/shell.py
+@@ -254,10 +254,15 @@ class Activity(gobject.GObject):
+
+ def _name_owner_changed_cb(self, name, old, new):
+ if name == self._get_service_name():
+- self._retrieve_service()
+- self.set_active(True)
+- self._name_owner_changed_handler.remove()
+- self._name_owner_changed_handler = None
++ if (old and len(old)) and (not new and not len(new)):
++ logging.debug('Activity %s went away', name)
++ self._name_owner_changed_handler.remove()
++ self._name_owner_changed_handler = None
++ self._service = None
++ elif (not old and not len(old)) and (new and len(new)):
++ logging.debug('Activity %s started up', name)
++ self._retrieve_service()
++ self.set_active(True)
+
+ def set_active(self, state):
+ """Propagate the current state to the activity object"""
+--
+1.7.0.4
+
diff --git a/rpms/sugar/sugar-enable-settings-manager.patch b/rpms/sugar/sugar-enable-settings-manager.patch
new file mode 100644
index 0000000..038f04b
--- /dev/null
+++ b/rpms/sugar/sugar-enable-settings-manager.patch
@@ -0,0 +1,13 @@
+diff --git a/bin/sugar.in b/bin/sugar.in
+index 498b573..813b189 100644
+--- a/bin/sugar.in
++++ b/bin/sugar.in
+@@ -36,6 +36,8 @@ while [ $# -ne 0 ] ; do
+ shift
+ done
+
++sugar-settings-manager &
++
+ if test -z "$SUGAR_SCALING"; then
+ export SUGAR_SCALING=72
+ fi
diff --git a/rpms/sugar/sugar.spec b/rpms/sugar/sugar.spec
new file mode 100644
index 0000000..0405895
--- /dev/null
+++ b/rpms/sugar/sugar.spec
@@ -0,0 +1,1619 @@
+%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")}
+
+Summary: Constructionist learning platform
+Name: sugar
+Version: 0.88.1
+Release: 5.19bernie%{?dist}
+URL: http://sugarlabs.org/
+Source0: http://download.sugarlabs.org/sources/sucrose/glucose/%{name}/%{name}-%{version}.tar.bz2
+
+#bernie: breaks Browse
+#Patch0: sugar-enable-settings-manager.patch
+
+# Bug fixes
+Patch1: dynamically-set-number-of-control-panel-columns.patch
+Patch2: click-on-journal-icons-with-a-exclusive-time-frame.patch
+Patch3: set-default-scaling-to-100.patch
+Patch4: fix-for-file-list-sorting-for-FAT32-formatted-flash-drives-in-journal.patch
+Patch5: avoid-popping-an-empty-list-in-the-software-updater.patch
+Patch6: simplify-the-definition-of-UpdateModel._bundles_to_check..patch
+Patch7: fix-duplication-of-OLPC-mesh-icons.patch
+Patch8: use-the-spanish-verb-quitar-for-unmounting-devices.patch
+#Patch9: fix-name-clash-set_state.patch
+Patch10: sl1842-journal-show-error-on-write-failure.patch
+Patch11: add-font-dpi-schema.patch
+Patch12: reverse-sort-order-of-activities-list.patch
+Patch13: sl2062.patch
+Patch14: gsm-errors-palette.patch
+
+# Andres' journal filesize enhancement
+Patch101: sizelist-0001-Journal-Retrieve-filesize-from-the-datastore.patch
+Patch102: sizelist-0002-Add-a-filesize-column-to-the-journal-list-model.patch
+Patch103: sizelist-0003-Journaltoolbox-Add-add_separator-method-for-convenie.patch
+Patch104: sizelist-0004-Add-a-ListViewButton-to-the-journal-search-toolbar.patch
+Patch105: sizelist-0005-Rename-the-date-column-to-sort_column.patch
+Patch106: sizelist-0006-Display-the-sorting-property-in-the-last-column.patch
+Patch107: sizelist-0007-Expandedentry-Try-to-use-the-filesize-property.patch
+Patch108: sizelist-0008-Implement-sorting-for-removable-devices.patch
+Patch109: sizelist-0009-Add-sort-by-creation-time-option-to-the-ListViewButt.patch
+Patch110: sizelist-0010-Add-ctime-property-to-the-journal-model.patch
+
+# Esteban + Tch Backup and restore
+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
+
+# experimental patches
+Patch501: sl2006-touchpad-section-for-control-panel.patch
+Patch502: sl2006-file-exists-check.patch
+Patch503: cpu-and-memory-resource-indicator.patch
+Patch504: sl2064-always-listen-for-NameOwnerChanged-DBus-message.patch
+Patch506: jasg-register-rename.patch
+
+# tch experimental patches
+patch601: bundle-Delete-profile-data-only-when-erased.patch
+patch602: caacupe-Protected-activities-list.patch
+patch603: tch-Add-missing-restart-button.patch
+
+License: GPLv2+
+Group: User Interface/Desktops
+Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+BuildRequires: pkgconfig
+BuildRequires: perl-XML-Parser
+BuildRequires: gettext
+BuildRequires: python
+BuildRequires: pygtk2-devel
+BuildRequires: gtk2-devel
+BuildRequires: GConf2-devel
+BuildRequires: intltool
+
+Requires: sugar-artwork
+Requires: sugar-toolkit
+Requires: sugar-settings-manager
+Requires: gnome-python2-libwnck
+Requires: gnome-python2-gconf
+Requires: metacity
+Requires: python-telepathy
+Requires: gstreamer-python
+Requires: pygtksourceview
+Requires: python-xklavier
+
+# for dbus-launch
+Requires: dbus-x11
+# for ssh-keygen
+Requires: openssh
+
+Obsoletes: sugar-journal <= 99
+Obsoletes: sugar-update-control <= 99
+
+BuildArch: noarch
+
+%description
+Sugar provides simple yet powerful means of engaging young children in the
+world of learning that is opened up by computers and the Internet. With Sugar,
+even the youngest learner will quickly become proficient in using the
+computer as a tool to engage in authentic problem-solving. Sugar promotes
+sharing, collaborative learning, and reflection, developing skills that help
+them in all aspects of life.
+
+Sugar is also the learning environment for the One Laptop Per Child project.
+See http://www.laptop.org for more information on this project.
+
+%package emulator
+Summary: The emulator for the Sugar Learning Platform
+Group: Development/Libraries
+Requires: %{name} = %{version}-%{release}
+Requires: xorg-x11-server-Xephyr
+# for xdpyinfo
+Requires: xorg-x11-utils
+
+%description emulator
+The emulator let's you test and debug sugar. For example it allows you to run
+multiple instances of sugar.
+
+%prep
+%setup -q
+
+#bernie: breaks Browse
+#%patch0 -p1
+
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
+%patch8 -p1
+#%patch9 -p1
+%patch10 -p1
+%patch11 -p1
+%patch12 -p1
+%patch13 -p1
+%patch14 -p1
+
+%patch101 -p1
+%patch102 -p1
+%patch103 -p1
+%patch104 -p1
+%patch105 -p1
+%patch106 -p1
+%patch107 -p1
+%patch108 -p1
+%patch109 -p1
+%patch110 -p1
+
+%patch201 -p1
+%patch202 -p1
+#%patch203 -p1
+#%patch204 -p1
+%patch205 -p1
+
+%patch501 -p1
+%patch502 -p1
+%patch503 -p1
+%patch504 -p1
+%patch506 -p1
+
+%patch601 -p1
+%patch602 -p1
+%patch603 -p1
+
+%build
+autoreconf
+%configure
+make
+
+%install
+rm -rf %{buildroot}
+
+export GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1
+make install DESTDIR=%{buildroot}
+mkdir %{buildroot}/%{_datadir}/sugar/activities
+unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL
+
+%find_lang %{name}
+
+%post
+if (update-mime-database -v &> /dev/null); then
+ update-mime-database "%{_datadir}/mime" > /dev/null
+fi
+
+export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source`
+gconftool-2 --makefile-install-rule \
+ %{_sysconfdir}/gconf/schemas/sugar.schemas > /dev/null || :
+
+%pre
+if [ "$1" -gt 1 ]; then
+ export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source`
+ gconftool-2 --makefile-uninstall-rule \
+ %{_sysconfdir}/gconf/schemas/sugar.schemas > /dev/null || :
+fi
+
+%preun
+if [ "$1" -eq 0 ]; then
+ export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source`
+ gconftool-2 --makefile-uninstall-rule \
+ %{_sysconfdir}/gconf/schemas/sugar.schemas > /dev/null || :
+fi
+
+%postun
+if (update-mime-database -v &> /dev/null); then
+ update-mime-database "%{_datadir}/mime" > /dev/null
+fi
+
+%clean
+rm -rf %{buildroot}
+
+%files -f %{name}.lang
+%defattr(-,root,root,-)
+%doc COPYING README
+
+%config %{_sysconfdir}/dbus-1/system.d/nm-user-settings.conf
+%config %{_sysconfdir}/gconf/schemas/sugar.schemas
+
+%dir %{_datadir}/sugar
+%dir %{_datadir}/sugar/activities
+%dir %{_datadir}/sugar/data
+%dir %{_datadir}/sugar/extensions
+%{_datadir}/sugar/data/*
+%{_datadir}/sugar/extensions/*
+
+%{python_sitelib}/*
+
+%{_datadir}/xsessions/sugar.desktop
+
+%{_bindir}/*
+%exclude %{_bindir}/sugar-emulator
+
+%{_datadir}/mime/packages/sugar.xml
+
+%files emulator
+%defattr(-,root,root,-)
+%{_bindir}/sugar-emulator
+%{_datadir}/applications/sugar-emulator.desktop
+%{_datadir}/icons/hicolor/scalable/apps/sugar-xo.svg
+
+%changelog
+* Thu Jun 3 2010 Peter Robinson <pbrobinson@gmail.com> - 0.88.1-1
+- New upstream stable 0.88.1 release
+
+* Sat May 30 2010 Peter Robinson <pbrobinson@gmail.com> - 0.88.0-3
+- Bump build
+
+* Sat May 30 2010 Peter Robinson <pbrobinson@gmail.com> - 0.88.0-2
+- Clean up some descriptions
+
+* Tue Mar 20 2010 Peter Robinson <pbrobinson@gmail.com> - 0.88.0-1
+- New upstream stable 0.88.0 release
+
+* Wed Mar 10 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.8-1
+- New upstream release
+
+* Tue Mar 02 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.6-1
+- New upstream release
+
+* Wed Feb 17 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.5-1
+- New upstream release
+
+* Tue Feb 16 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.4-2
+- Enable sugar-settings-manager support
+
+* Thu Feb 11 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.4-1
+- New upstream release
+
+* Tue Jan 12 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.3-1
+- New upstream release
+
+* Sat Jan 9 2010 Peter Robinson <pbrobinson@gmail.com> - 0.87.2-2
+- Updated to the new python sysarch spec file reqs
+
+* Wed Dec 23 2009 Sebastian Dziallas <sebastian@when.com> - 0.87.2-1
+- New upstream release
+
+* Tue Dec 01 2009 Sebastian Dziallas <sebastian@when.com> - 0.87.1-1
+- New upstream release
+- Make this noarch again
+
+* Fri Nov 20 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.86.3-5
+- One more try
+
+* Fri Nov 20 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.86.3-4
+- Create %{_datadir}/sugar/activities
+
+* Fri Nov 20 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.86.3-3
+- Own %{_datadir}/sugar/activities. Fixes #532796
+
+* Wed Oct 21 2009 Sebastian Dziallas <sebastian@when.com> - 0.86.3-2
+- add missing file to appropriate section
+
+* Wed Oct 21 2009 Sebastian Dziallas <sebastian@when.com> - 0.86.3-1
+- Sporadic freezes while scrolling journal #1506
+- Suppress race condition with Journal appearing on sugar startup #1373
+- Alt+Space not working to show/hide the tray #1476
+
+* Sun Sep 27 2009 Sebastian Dziallas <sebastian@when.com> - 0.86.0-1
+- New upstream release
+
+* Fri Sep 18 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.8-2
+- Package /usr/share/applications/sugar-emulator.desktop
+
+* Fri Sep 18 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.8-1
+- New upstream release
+
+* Fri Sep 11 2009 Simon Schampijer <simon@schampijer.de> - 0.85.7-2
+- add python-xklavier dependency
+
+* Fri Sep 11 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.7-1
+- New upstream release
+
+* Wed Sep 02 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.5-1
+- New upstream release
+
+* Wed Aug 26 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.4-1
+- New upstream release
+
+* Sun Aug 02 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.3-1
+- New upstream release
+
+* Sun Jul 26 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.85.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Sat Jul 18 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.2-1
+- New upstream release
+
+* Thu Apr 16 2009 Simon Schampijer <simon@schampijer.de> - 0.84.6-1
+- Only update the connections file when the AP changes state #756
+- Initialize the ResultSet after the widget changes size #733
+
+* Wed Apr 08 2009 Simon Schampijer <simon@schampijer.de> - 0.84.5-1
+- Remove fixed width from speaker palette #719
+- Correctly close the input stream in file transfers #682
+
+* Mon Apr 06 2009 Simon Schampijer <simon@schampijer.de> - 0.84.4-1
+- new german and spanish translations
+
+* Mon Apr 06 2009 Simon Schampijer <simon@schampijer.de> - 0.84.3-1
+- If user updates an activity installed in /usr/share/activities, both versions remain installed #707
+- Sometimes an activity will not start #461
+- Grey out the erase option if an activity bundle cannot be erased #620
+- AP: Do not write timestamp when not managed to connect #623
+- Correct date in 'About my Computer' CP section #639
+- Make Jukebox the default activity for ogg-vorbis #423
+- Find an available icon for displaying the removable device #627
+- CP: Disallow the user from selecting any fallbacks if English (USA) is
+selected (#slo:561)
+- Call *mount_finish when the callback is called #326
+- Add full licence to data dir #357
+- The logout option is available by default
+- Resume from home is duplicating activity instances again #600
+
+* Wed Apr 01 2009 Simon Schampijer <simon@schampijer.de> - 0.84.1-4.20090401git4232758da5
+- git snapshot
+
+* Tue Mar 24 2009 Simon Schampijer <simon@schampijer.de> - 0.84.1-3.20090324gite16cf854aa
+- rebuild without the logout patch
+
+* Tue Mar 24 2009 Simon Schampijer <simon@schampijer.de> - 0.84.1-2.20090324gite16cf854aa
+- git snapshot
+
+* Sun Mar 22 2009 Simon Schampijer <simon@schampijer.de> - 0.84.1-1
+- Update to latest NM-User config file (same as nm-applet)
+- Fix nondeterministic denials for no-interface messages #575
+ (Thanks to Dan Williams and Colin Walters for their assistance
+ in spotting this. upstream bug fdo #18961)
+- Draw the rounding box inside the icon bounds (benzea) #567
+- Add Dismiss option to the palette of finished transfers #484
+- Resume-by-default uses open with, not just open #547
+- Set Pippy as the default for opening python files #287
+- Remove duplicates from the activities submenu #497
+- Remove transfer icon from frame when the local user cancels it #483
+- Restore the icon size after a layout change #157
+- enable logout option
+
+* Wed Mar 18 2009 Simon Schampijer <simon@schampijer.de> - 0.84.0-2.20090318gitd3a0839735
+- git snapshot
+
+* Tue Mar 03 2009 Simon Schampijer <simon@schampijer.de> - 0.84.0-1
+- Focus rectangle corners should be rounded #406
+- Restore minimal .xol support #459
+- Check the activity version and replace an older version upon download #464
+- Friendstray: icon reacting to right click #441
+- Network device icons don't react on right click #463
+- Don't open a launcher window when that activity is already running #426
+- Fall back to application-octet-stream for unknown types #458
+- Show a generic icon for clippings, if available #454
+- Don't add_bundle on activity dir change when installed already #442
+- Make mute sound code togglable
+- Keyhandler: Map XF86Search to the journal search
+- Keyhandler: Catch all exceptions (thanks to Sascha Silbe)
+- Give time for exit to execute when closing the emulator #435
+- Dont hardcode the maximum amount of entries to cache in the journal #72
+- Add standard Print shortcut to take a screenshot
+- Use keyboard specific keys to set the volume #430
+- Update to new DBus policy #307
+- Fix palette appearance on right-click #403
+- Switch to existing instance of an activity if it's already running #410
+
+* Fri Feb 27 2009 Simon Schampijer <simon@schampijer.de> - 0.83.8-3.20090227gitae381ce5b6
+- git snapshot
+- Don't add_bundle on activity dir change when installed already #442
+- Make mute sound code togglable
+- Keyhandler: Map XF86Search to the journal search
+- Keyhandler: Catch all exceptions (thanks to silbe)
+- Give time for atexit to execute when closing the emulator #435
+- Dont hardcode the maximum amount of entries to cache in the journal #72
+- Add standard 'Print' shortcut to take a screenshot
+- Use keyboard specific keys to set the volume #430
+- Update to new DBus policy #307
+- Fix palette appearance on right-click #403
+- Switch to existing instance of an activity if it's already running #410
+
+* Wed Feb 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.83.8-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Mon Feb 23 2009 Simon Schampijer <simon@schampijer.de> - 0.83.8-1
+- Revert "Add a favorites mode setting for deciding if the favorites view resumes by default or not"
+- Listen for changes in the Activities dir and install/uninstall activities accordingly #235
+- Fix sorting of favorite icons by installation_time #387
+- View Source: Option and accelerator in activity frame palette
+- View Source: Use activity icon outline for Bundle Source, part of #360
+- View Source: Hide Python Bytecode files #361
+- Use the file transfer icons
+- Many new translations!
+
+* Thu Feb 19 2009 Simon Schampijer <simon@schampijer.de> - 0.83.7-3
+- actually adding pygtksourceview2 as a dependency
+
+* Thu Feb 19 2009 Simon Schampijer <simon@schampijer.de> - 0.83.7-2
+- adding gtksourceview2 as a dependency
+
+* Mon Feb 16 2009 Simon Schampijer <simon@schampijer.de> - 0.83.7-1
+- Resume Activity list is not updated directly #322
+- Fix network panel on XO (Sascha Silbe) #290
+- Only show cp power section on xo #320
+- Add logout option to the buddy menu (Sayamindu) #207
+- Launch activity also when clicking on the palette icon #335
+- Use the activity icon for the 'Start new' palette item #314
+- Close the object chooser when the activity is closed #329
+- Dates in journal are not translated #55
+- Don't mute when right-clicking the speaker icon #278
+- Correctly cache the connection to the OHM service #249
+- Show launcher screen immediately after the user clicks to start an activity #243
+- Use documend-send icon (Gary C Martin) #227
+- Try harder to get an icon for a clipping
+- Hide the journal activity in the home view #87
+- Correctly initialize the TrayIcon
+- Add 'View Details' option to object palette in journal
+- Translation updates
+- Hide OLPC-specific fields on non-xo machines #133
+- Add a 'Clear search' button to 'No matching entries' message #266
+- Correctly detect when a query in the journal is empty #255
+- Avoid launching two instances of the same activity instance #238
+- Add start-with option to objectpalette in the journal
+- Fix dnd of icons in the favorite view #213
+- Right click on AP should reveal palette not connect to AP #10
+- Display space used and left in the volume palette in the journal #33
+- Don't update the zoom level when a dialog window pops up
+- Fix filtering the objectchooser with data types #219
+
+* Fri Feb 06 2009 Simon Schampijer <simon@schampijer.de> - 0.83.6-2.20090206git7115089fb0
+- Fix italian translation
+- Set the locale path for sugar-toolkit #55
+- Don't mute when right-clicking the speaker icon #278
+- Correctly cache the connection to the OHM service #249
+- Show launcher screen as soon as possible #243
+- Use documend-send icon (Gary C Martin) #227
+
+* Wed Feb 04 2009 Simon Schampijer <simon@schampijer.de> - 0.83.6-1
+- Try harder to get an icon for a clipping
+- Hide the journal activity in the home view #87
+- Correctly initialize the TrayIcon
+- Add 'View Details' option to object palette in journal
+- Translation updates
+- Hide OLPC-specific fields on non-xo machines #133
+- Add a 'Clear search' button to 'No matching entries' message #266
+- Correctly detect when a query in the journal is empty #255
+- Avoid launching two instances of the same activity instance #238
+- Add start-with option to objectpalette in the journal
+- Fix dnd of icons in the favorite view #213
+- Right click on AP should reveal palette not connect to AP #10
+- Display space used and left in the volume palette in the journal #33
+- Don't update the zoom level when a dialog window pops up
+- Fix filtering the objectchooser with data types #219
+
+* Fri Jan 30 2009 Simon Schampijer <simon@schampijer.de> - 0.83.5-3.20090130gitf7807dddc0
+- Add 'View Details' option to object palette in journal
+- Translation updates
+- Hide OLPC-specific fields on non-xo machines #133
+- Add a 'Clear search' button to 'No matching entries' message #266
+- Correctly detect when a query in the journal is empty #255
+- Avoid launching two instances of the same activity instance #238
+- Add start-with option to objectpalette in the journal
+- Fix dnd of icons in the favorite view #213
+- Right click on AP should reveal palette not connect to AP #10
+- Display space used and left in the volume palette in the journal #33
+- Don't update the zoom level when a dialog window pops up
+- Fix filtering the objectchooser with data types #219
+
+* Tue Jan 27 2009 Bernie Innocenti <bernie@codewiz.org> - 0.83.5-2
+- Obsolete sugar-journal
+
+* Tue Jan 20 2009 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.5-1
+- make the journal entries in the favorites palette resumable
+- simplify the constants used to identify favorite layouts
+- separate debug settings from xsession #163
+- add logout option #207 to xomenu (sayamindu, icon by eben)
+- change jabber server without sugar restart #142
+- About my XO -> About my Computer
+- #196 Fix setting the timezone in debian
+- autoconnect to AP that we connected to last #8
+- add a favorites mode setting for deciding if the favorites view resumes by default or not
+- resume by default the last activity from the favorites view
+- implement filtering by file type for removable devices
+- #132 Filter by timestamp, not by mtime
+- add support for text queries on removable devices
+- dont abort if we cannot read a file from a removable device
+- add a favorite filter to the journal toolbar
+- sanitize the file name when we copy to removable devices
+- #36 Refresh the detailed view when the entry changes
+- #38 Refresh full metadata when editing so we dont lose properties
+- Focus Search is not exposed via dbus anymore #89
+- #131 'open with' does not work for clipboard item
+- #165 Install bundles when they get into the journal
+- add Resume item to the file transfer palette
+- #126 Fix erase button in the journal
+- following eben's spec for the device positions
+
+* Sun Jan 04 2009 Simon Schampijer <simon@laptop.org> - 0.83.4-2
+- add intltool build require
+
+* Sun Jan 04 2009 Simon Schampijer <simon@laptop.org> - 0.83.4-1
+- New download url
+- Fix language parsing on Gentoo and ALTLinux #81 (alsroot)
+- Change the FRAME_POSITION_RELATIVE to follow eben's spec
+- exec sugar-session
+- Add wired device icon for the frame
+- Only show wireless device in the frame when connecting/connected
+- Use jabber.sugarlabs.org by default
+- Only create a keydialog for the activating connection
+- CanvasPulsingIcon: Don't begin pulse loop on resume if not pulsing
+- Use g_timeout_add_seconds() for power efficiency
+- Add the journal button to the volumes toolbar in the journal
+- Remove jarabe/model/volume.py and use gio instead
+- First try at restoring removable devices support in the journal
+- make the image viewer activity the default one for iamges
+
+* Wed Dec 21 2008 Bernie Innocenti <bernie@codewiz.org> - 0.83.3-6
+- Add missing dependencies on xorg-x11-utils, dbus-x11 and openssh
+
+* Wed Dec 10 2008 Bernie Innocenti <bernie@codewiz.org> - 0.83.3-5
+- Spec file cleanup and updates
+
+* Sat Nov 29 2008 Ignacio Vazquez-Abrams <ivazqueznet+rpm@gmail.com> - 0.83.3-4
+- Rebuild for Python 2.6
+
+* Fri Nov 28 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.3-3
+- Really add the patch
+
+* Fri Nov 28 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.3-2
+- Fix the desktop file executable
+
+* Fri Nov 28 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.3-1
+- Update to 0.83.3
+
+* Thu Nov 6 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.2-4
+- Fix translations
+
+* Thu Nov 6 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.2-2
+- Fix gconf schemas installation
+
+* Tue Nov 4 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.2-1
+- Update to 0.83.2
+
+* Thu Sep 25 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.9-1
+- #7969 Accidental searches lead to a "blank" Home screen
+- #8662 xo man jumps around while zooming
+- #8642 Bug in WPA key dialog prevents certain passwords from being accepted
+- #8657 Help activity doesn't show up on a clean install.
+- #8234 Software update (in Control Panel) crashes X-server.
+
+* Sat Sep 20 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.8-1
+- #8554 Indicate connected AP in Neighborhood view.
+- #7987 Home view XO icon palette for Control Panel has wrong icon
+- #7685 Alternate home layouts; fixed ring scaling; better modularization of layouts
+- #8148 control panel does have layout problems with languages like mongolian
+- #8485 Switching between zoom levels seem to leak
+
+* Tue Sep 16 2008 Simon Schampijer <simon@laptop.org> - 0.82.7-1
+- remove numpy finally
+
+* Sat Sep 13 2008 Simon Schampijer <simon@laptop.org> - 0.82.6-1
+- #8438 control panel fails when run with python -OO
+- #8470 SpreadLayout leaks self._collisions
+- #8375 gst usage in the shell wastes 2.6mb
+- #8372 Remove numpy usage from the shell
+
+* Thu Sep 12 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.5-1
+- #8427 Sugar does not send SetActive(True)
+- #8409 Sugar does not save network's BSSIDs in networks.cfg
+
+* Thu Sep 11 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.4-1
+- #7480 Need to 'reset' the network configurations - short term fix
+- #8368 Disable the server plugin if no server was specified
+
+* Sat Sep 6 2008 Tom "spot" Callaway <tcallawa@redhat.com> - 0.82.3-2
+- fix license tag
+
+* Sat Sep 6 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.3-1
+- #8300 Shell _launchers are leaked
+- #7856 notify::active behaviour change
+- #8250 Invalid POT for "Copyright and License" of control panel
+
+* Wed Sep 3 2008 Jeremy Katz <katzj@redhat.com> - 0.82.2-2
+- Require gstreamer-python and telepathy-python (rhbz#447589)
+
+* Fri Aug 29 2008 Simon Schampijer <simon@laptop.org> - 0.82.2-1
+- 6929 Control panel: include copyright/licensing info in about dialogue
+- Fix some launcher issues
+
+* Thu Aug 28 2008 Tomeu Vizoso <tomeu@tomeuvizoso.net> - 0.82.1-1
+- #2866 Network Manager GUI doesn't report success or failure
+- #3993 The color of network icon in Home view becomes white after restarting Sugar.
+- #2866 Network Manager GUI doesn't report success or failure
+- #7988 Sugar control panel doesn't have a language entry for kreyol
+- #7823 Non-modal alerts in CP remain when they shouldn't
+- #7733 Cannot install Wikipedia-10.xo
+- #7356 regression in activity view performance.
+- #7660 XO Neighborhood icon drawing & erase glitches
+- #6605 Screen rotates clockwise, while rotation button shows counter clockwise arrows
+- #7877 Control Panel / Data & Time: Selecting timezone by typing locks up UI
+- #7965 Mirror activities list in RTL locales
+- #7220 Mark newly downloaded activities as favorites by default
+- #7874 Search entry in Home focuses list view when cleared
+- #7971 CP fails to validate all settings correctly
+- #7970 Some CP modules set needs_restart to False when they shouldn't
+- #7764 Reset Registration with school servers - short term solution
+- #7823 Non-modal alerts in CP remain when they shouldn't
+- #7874 Search entry in Home focuses list view when cleared
+- #7730 Clicking on Speaker icon should Mute/Unmute Sound
+- #4656 Non-olpc buddies not shown in the meshview (using salut)
+- #7873 Search entry in Home should be focused implicitly
+
+* Fri Aug 22 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.0-2.20080822git454def195d
+- Fix #6605 #7877 #7965 #7220 #7874 #7971 #7970 #7764 #7823 #7841
+
+* Thu Aug 07 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.0-1
+- Mirror the intro screen in rtl. Patch by Khaled Kosny Fix #3108
+- #7740 react gracefully to dbus services being restarted
+- Fix case when already registered 7836
+- Redirect keyboard brightness and DCON freeze requests to OHM #7357
+- open cp software-updater on first boot after an update 7495
+- Activate threads support 7486
+- added languages Norwegian and Slovenian
+- translation updates
+
+* Fri Aug 01 2008 Simon Schampijer <simon@laptop.org> - 0.81.8-1
+- 7248 Speaker device has inconsistent behavior
+- 7625 alt+tab switching is slow because activities are notified unneccessary
+- 7560 cp: Inconsistent behavior after changing the xo color
+- 7641 Control panel sugar theme infelicities.
+- 6136 No feedback from 'register' request.
+
+* Wed Jul 23 2008 Simon Schampijer <simon@laptop.org> - 0.81.7-1
+- 7546 Activity launcher fails to show when launching from the journal
+- 5664 Copying formatted text out of Browse breaks Journal/clipboard interaction
+- 7385 Change the accelerator for switching between views in the home level
+- 7249 Device ordering in Frame is not fixed
+- 7510 Control Panel 'About Me' incorrectly keeps a name edit when you choose to Cancel out
+- 7071 Activities cannot be deleted via GUI
+- 4208 Battery indicator's icon fullness inconsistent with indicator %.
+- 7430 Favorites view is not preserved
+- 7434 Control panel UI for power management.
+
+* Thu Jul 17 2008 Simon Schampijer <simon@laptop.org> - 0.81.6-4.20080715git8137d5c37f
+- split the sugar-emulator in it's own package to get rid of the
+ xephyr dependency
+
+* Tue Jul 15 2008 Tomeu Vizoso <tomeu@tomeuvizoso.net> - 0.81.6-3.20080715git8137d5c37f
+- 7071 Add an option for uninstalling activities from the home view
+- 7476 Order control panel modules logically
+- 4208 battery icon consistency fix
+- 7354 Maintain correct zoom level after activity launch
+
+* Wed Jul 09 2008 Simon Schampijer <simon@laptop.org> - 0.81.6-2.20080709git8f4819a62e
+- git snapshot
+- 7430 Preserve the favorites layout across reboots
+- 7434 Add power section to the control panel
+
+* Wed Jul 09 2008 Simon Schampijer <simon@laptop.org> - 0.81.6-1
+- 7438 sugar shuts down when you click Restart
+- 7365 Invites not working
+- 7248 Speaker device has inconsistent behavior
+- 7339 CPU Spins after starting an activity
+- 7015 Add proper alignment support to the tray control
+- 5613 Cannot set non-ASCII nick name
+- 7046 Deleting activity bundle with journal leaves it showing in Home list view until reboot
+- 7391 Make the search field in Home reveal the list view
+- 7248 Speaker device has inconsistent behavior
+- 7272 Notifications are redundant with new launching feedback
+- 7273 Activity icons remain colored after launch
+
+* Sat Jun 21 2008 Tomeu Vizoso <tomeu@tomeuvizoso.net> - 0.81.5-1
+- Fix a bug with activity switching (benzea)
+- UI improvements to the control panel frame section (erikos)
+- First go at session management implementation (marco)
+- New activity launching feedback (eben and marco)
+- Speaker device implementation cleanups (mtd)
+- Support for 1-1 chat with other xmpp clients (morgs and cassidy)
+- Shortcuts improvements for emulation (mtd)
+- Additional free form layout for the home view and allow to reorder icons (tomeu)
+- Improve layout logic for the icons in the mesh view (tomeu)
+- Support for switching activities using alt+tab (benzea)
+
+* Mon Jun 09 2008 Simon Schampijer <simon@schampijer.de> - 0.81.3-1
+- Search in the activity list (Tomeu)
+- Add installation date in the activity list (Tomeu)
+- Improve performance of the activity list (Tomeu)
+- Sort activities in the list and ring by installation date (Tomeu)
+- Speaker device (Martin Dengler)
+- Graphical frontend for the control panel (Simon)
+- Rotate the dpad keys when the screen rotate button is pressed (Erik Garrison)
+
+* Thu May 22 2008 Simon Schampijer <simon@schampijer.de> - 0.81.1-2
+- Removed patch to fix activity location
+
+* Thu May 22 2008 Simon Schampijer <simon@schampijer.de> - 0.81.1-1
+- Make arrows scroll up and down in scroll views
+- Merge activities.default into favorites
+
+* Tue Apr 28 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.79.4-1
+- Pylint cleanup.
+- Misc graphical fixes.
+
+* Mon Apr 28 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.79.3-2
+- Patch to fix system activities location
+
+* Wed Apr 09 2008 Tomeu Vizoso <tomeu@tomeuvizoso.net> - 0.79.3-1
+- Misc graphical fixes.
+
+* Wed Apr 2 2008 Simon Schampijer <simon@laptop.org> - 0.79.2-1
+- Frame/Home redesign - Put corner stone
+
+* Fri Mar 28 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.79.1-1
+- Update to 0.79.1
+
+* Mon Feb 11 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.79.0-2
+- Require sugar-artwork
+
+* Fri Feb 8 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.79.0-1
+- Update to 0.79.0, rework dependencies because of the toolkit split
+
+* Sat Feb 2 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.75.11-2
+- Rebuild
+
+* Tue Jan 29 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.75.11-1
+- Fix #5904
+
+* Fri Jan 18 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.75.10-1
+- Fix #1406 #5944 #6051
+
+* Wed Jan 16 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.75.8-2
+- Update the mime db. Fix #5815
+
+* Fri Jan 11 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.75.8-1
+- Fix #5489 #4562 #5765 #5559 #5493 #5573 #5648
+
+* Thu Jan 10 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.75.7-1
+- Fix #4145 #5538 #5760 #5532 #5884
+
+* Sat Dec 22 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.75.6-1
+- Fix #5489
+
+* Wed Dec 19 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.75.5-1
+- Fix #5526 #5512 #4909
+
+* Wed Dec 19 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.75.4-1
+- Fix #4906 #5382 #5364
+
+* Wed Dec 12 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.75.3-1
+- Fix #4965
+
+* Tue Dec 11 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.75.1-1
+- Fix #5154 #5221 #5080
+
+* Wed Dec 5 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.75.0-1
+- Update to 0.75.0
+
+* Fri Nov 30 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.70.3-1
+- Update to 0.70.3
+
+* Thu Nov 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.70.2-2
+- Change the jabber server
+
+* Tue Nov 20 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.70.2-1
+- Update to 0.70.2
+
+* Mon Nov 19 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.70.1-1
+- Update to 0.70.1
+
+* Wed Nov 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.89.20071114git411879e9de
+- #4768 Fix memory leak when switching between activities. (marco)
+
+* Tue Nov 13 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.88.20071113git9d28557bbd
+- Fix randr. (marco)
+- Do not fail if there is not an activity service. (marco)
+- Alert when an activity cannot be saved. (rwh)
+
+* Tue Nov 13 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.87.20071113git47e231311b
+- Get rid of sound competely to be sure we don't block the device. (marco)
+
+* Tue Nov 13 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.86.20071112git1bf6cdaa81
+- #4728, #4764: Set the correct colors for filtered out mesh view icons. (tomeu)
+
+* Fri Nov 09 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.85.20071109gitd6bac927e1
+- #4667 Do not display XO outside the mesh view. (marco)
+- #4687 Use the right free function, fix a crash. (sjoerd)
+- #4724 Display meshbox invite palette menu with colored
+ activity icon (erikos)
+- Always checkin to the DS from a new file. (tomeu)
+
+* Fri Nov 09 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.84.20071109git55864fa3f6
+- Support for the espeak service. (codyl)
+- Fix typo in activity launching code. (marco)
+
+* Thu Nov 08 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.83.20071108gite23f012e08
+- Launch a few activities outside rainbow containers. (marco)
+
+* Thu Nov 08 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.82.20071108git3e491c2dc7
+- #4715: Filter new items that appear in the mesh view. (tomeu)
+- #4716: Filter correctly activity icons in the mesh view. (tomeu)
+- Use HOME/.i18n in control panel and reset jabber_registered to False (erikos)
+
+* Wed Nov 07 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.81.20071107gitdae3ebe8d1
+Snapshot 306d32832f
+
+* Tue Nov 6 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.80.20071106git306d32832f
+- Add missing dependency to sugar-base
+
+* Tue Nov 06 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.79.20071106git306d32832f
+- Associate ctrl+s to keep. (rwh)
+
+* Tue Nov 06 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.78.20071105git73cae198f5
+- Remove the startup sound for now, to not break audio
+ for all the activities. (marco)
+
+* Mon Nov 05 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.77.20071105git0a9676171d
+- #4650: Failure to write journal files. (marco)
+
+* Mon Nov 05 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.76.20071105gitee8712d1c4
+- #3119: Implement some basic search capabilities in the mesh view. (tomeu)
+
+* Sun Nov 04 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.75.20071104gitd456f6c633
+- New experimental screenshot code. (marco)
+
+* Sat Nov 03 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.74.20071103gite748f756c0
+- #4618: Make the shell service more resilient to failure. (tomeu)
+
+* Fri Nov 02 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.73.20071102git39aca0154d
+- Get bundle installation to work again. (marco)
+
+* Fri Nov 02 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.72.20071102gitb6422678e6
+- #1941 Call FocusSearch method for popping up the journal. (rwh)
+
+* Fri Oct 19 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.71.20071019gitefd0bbd326
+- New snapshot
+
+* Thu Oct 18 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.70.20071018git78f51a1b56
+- New snapshot
+
+* Thu Oct 11 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.69.20071010git9c5755d85a
+- New snapshot
+
+* Tue Oct 9 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.68.20071009git6c7c6a503b
+- New snapshot
+
+* Sun Oct 7 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.67.20071007git143f9ac9c6
+- New snapshot
+
+* Sun Oct 7 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.66.20071007git143f9ac9c6
+- New snapshot
+
+* Sat Oct 6 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.65.20071006gitc74013db1f
+- New snapshot
+
+* Sat Oct 6 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.64.20071005git79ba6b91b7
+- New snapshot
+
+* Thu Oct 4 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.63.20071004gitacca55e861
+- New snapshot
+
+* Mon Oct 1 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.61.20071001gited40d65791
+- New snapshot
+
+* Fri Sep 28 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.60.20070928gitb8ec83c5b8
+- New snapshot
+
+* Wed Sep 26 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.59.20070926git5a595ea04e
+- New snapshot
+
+* Tue Sep 25 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.58.20070925git5a595ea04e
+- New snapshot
+
+* Mon Sep 24 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.57.20070924git5a595ea04e
+- New snapshot
+
+* Sat Sep 22 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.56.20070922git5a595ea04e
+- New snapshot
+
+* Thu Sep 20 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.55.20070920git5a595ea04e
+- New snapshot
+
+* Wed Sep 19 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.54.20070919gitb8ce5083b7
+- New snapshot
+
+* Wed Sep 19 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.53.20070919gitb8ce5083b7
+- New snapshot
+
+* Tue Sep 18 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.52.20070918gitb8ce5083b7
+- New snapshot
+
+* Tue Sep 18 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.51.20070917gitb8ce5083b7
+- New snapshot
+- Add a patch to set the jabber server to jabber.laptop.org
+
+* Mon Sep 17 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.50.20070917gited22733941
+- New snapshot
+
+* Sat Sep 15 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.49.20070915git8ef6c57f8b
+- New snapshot
+
+* Fri Sep 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.48.20070914git0a666e23cf
+- New snapshot
+
+* Wed Sep 12 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.47.20070912git47f473189e
+- New snapshot
+
+* Tue Sep 11 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.46.20070911git8b784a6223
+- New snapshot
+
+* Mon Sep 10 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.45.20070910git79237f3114
+- New snapshot
+
+* Sun Sep 9 2007 Dan Williams <dcbw@redhat.com> - 0.65-0.44.20070909gita1f5cece18
+- New snapshot
+
+* Sun Sep 9 2007 Dan Williams <dcbw@redhat.com> - 0.65-0.43.20070909git6b6470ebcb
+- New snapshot
+
+* Fri Sep 7 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.42.20070907gitc8700feccf
+- New snapshot
+
+* Thu Sep 6 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.41.20070906gitd9a30c23ff
+- New snapshot
+
+* Tue Sep 4 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.40.20070904git0ad6398cf1
+- New snapshot
+
+* Mon Sep 3 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.39.20070903git0b3f687749
+- New snapshot
+
+* Sat Sep 1 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.34.20070901gitfeb462d08d
+- New snapshot
+
+* Thu Aug 30 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.33.20070830gite65fef5c79
+- New snapshot
+
+* Wed Aug 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.32.20070829git23ad88db0c
+- New snapshot
+
+* Tue Aug 28 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.30.20070827git246ec1e4aa
+- New snapshot
+
+* Wed Aug 22 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.29.20070822gitd38cacfe2c
+- New snapshot
+
+* Mon Aug 20 2007 John (J5) Palmieri <mpg@redhat.com> - 0.65-0.28.20070820gite83b98a8f6
+- New snapshot
+
+* Mon Aug 20 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.28.20070820gitb24a28a77d
+- New snapshot
+
+* Tue Aug 14 2007 John (J5) Palmieri <johnp@redhat.com> - 0.65-0.27.20070814gitd93122bf5e
+- New snapshot
+
+* Wed Aug 1 2007 Dan Williams <dcbw@redhat.com> - 0.65-0.27.20070801gitd22f00d894
+- New snapshot
+ * Don't set a presence server by default (except in the emulator) (dcbw)
+
+* Tue Jul 31 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.26.20070731git7ddd46589e
+- New snapshot
+
+* Sun Jul 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.25.20070729git285099fe08
+- New snapshot
+
+* Fri Jul 27 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.24.20070727git285099fe08
+- New snapshot
+
+* Wed Jul 25 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.23.20070725git088c7612e3
+- New snapshot
+
+* Tue Jul 24 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.22.20070724git9ac5d38e90
+- New snapshot
+
+* Mon Jul 23 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.21.20070723git4a924a8e5d
+- New snapshot
+
+* Mon Jul 23 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.20.20070723git943c78ffa7
+- New snapshot
+
+* Fri Jul 20 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.19.20070720git8ae99aaa87
+- New snapshot
+
+* Thu Jul 19 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.18.20070719gitf6f3f2b520
+- New snapshot
+
+* Tue Jul 17 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.16.20070717git5212790236
+- New snapshot
+
+* Tue Jul 17 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.15.20070716gitfd7336c2f1
+- New snapshot
+
+* Mon Jul 16 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.14.20070715git9f4da4e6d1
+- New snapshot
+
+* Fri Jul 13 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.13.20070713git4c352d1f83
+- New snapshot
+
+* Wed Jul 11 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.12.20070711gitec7eb2ebbb
+- New snapshot
+
+* Tue Jul 10 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.11.20070710gitb83a9ec27d
+- New snapshot
+
+* Tue Jul 10 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.4.20070710git42f0bcc48d
+- New snapshot
+
+* Tue Jul 10 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.3.20070710git757b2b8ce6
+- New snapshot
+
+* Mon Jul 9 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.2.20070709gitaa6a024368
+- New snapshot
+
+* Sun Jul 8 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.10.20070708gitf8cf7ff1ce
+- New snapshot
+
+* Fri Jul 6 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.9.20070706gitcebf25739b
+- #1930: Only take preview before closing. (tomeu)
+
+* Fri Jul 6 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.7.20070706git8af15d4e73
+- Nicer tooltips. Improved sizing logic. (marco)
+- Do not popdown the frame when palettes are active. (marco)
+- Add macedonian translation. (ArangelAngov)
+- Add brazilian translation. (DiegoZacarao)
+- Some fixes for changing the selected clipboard object. (tomeu)
+- Fix palettes around the mesh edges. (edsiper)
+
+* Fri Jul 6 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.6.20070706gitde8b3b4c01
+- Use HAL to get battery informations.
+- Improvements in the mesh view layout.
+- Hide the active palette when another popup.
+- Icons in the buddy menu items
+
+* Tue Jul 3 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.4.20070703gitcc2b8884c0
+- Use the new palette widget everywhere in the UI
+- Do not always show the shutdown palette on startup
+- Implement primary and secondary state for palettes
+- Fix several frame/zoom level bugs
+
+* Fri Jun 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.3.20070629git30bee7e43a
+- Better palette positioning
+- Reject invalid nick names in the intro screen
+- Make startup notification work from the journal and clipboard
+- Do not create a new object when resuming from the journal
+
+* Thu Jun 28 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.2.20070628git0d6760b194
+- New snapshot
+
+* Thu Jun 28 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.10.20070628git03ef9c034e
+- New snapshot
+
+* Wed Jun 27 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.9.20070627git381df08442
+- New snapshot
+
+* Wed Jun 27 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.8.20070627git69ba74ddc2
+- New snapshot
+
+* Tue Jun 26 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.7.20070626git4f748dba9b
+- New snapshot
+
+* Tue Jun 26 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.4.20070626gitgit84127380dc
+- New snapshot
+
+* Thu Jun 21 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.3.20070620git0e4efae7ae
+- python-telepathy is the name of the package in Fedora
+
+* Wed Jun 20 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.65-0.2.20070620git0e4efae7ae
+- Update to 0.65
+- Fix versioning scheme
+
+* Tue Jun 19 2007 John (J5) Palmieri <johnp@redhat.com> - 0.64-7.git3b1ee5a0bc.1
+- add a %%doc line with COPYING COPYING.LIB and README
+- fix up BR's
+- fix buildroot
+
+* Thu Jun 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.64-6.git3b1ee5a0bc.1
+- Remove gst-plugins build dep
+
+* Thu Jun 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.64-5.gita1e3dbaf9e.1
+- New snapshot
+
+* Mon Jun 4 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.64-3.gitb2980d7bd6.1
+- New snapshot
+
+* Wed May 30 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.git9ea6b18027.1
+- Updated snapshot
+
+* Thu May 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-1.gitb1ed24498c.1
+- Journal API fixes
+
+* Thu May 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-1.git0c77275ba7.2
+- New snapshot
+
+* Thu May 17 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.87.20070517git
+- Presence service fixes
+
+* Thu May 17 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.86.20070517git
+- Ps and browser fixes
+
+* Wed May 16 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.85.20070516git
+- Journal perf fixes
+
+* Tue May 15 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.84.20070515git
+- Some ps fixes
+
+* Tue May 15 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.83.20070515git
+- Fix mozilla components initialization
+
+* Tue May 15 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.82.20070515git
+- Journal and ps fixes
+
+* Mon May 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.81.20070514git
+- Improved activity toolbar
+
+* Mon May 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.80.20070514git
+- Fix sugar browser
+
+* Mon May 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.79.20070514git
+- Several datastore and presence service fixes
+
+* Fri May 11 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.78.20070511git
+- Fix cursors
+
+* Fri May 11 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.77.20070511git
+- Various theme fixes and correct dpi
+
+* Thu May 10 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.76.20070510git
+- New snapshot
+
+* Mon May 7 2007 Dan Williams <dcbw@redhat.com> - 0.63-2.75.20070406git
+- Fix nickname encoding and length issues
+
+* Fri Apr 6 2007 Dan Williams <dcbw@redhat.com> - 0.63-2.74.20070406git
+- Network manager UI fixes (don't show adhoc APs)
+- Fix the 'execute' command so the camera button works
+- Blacklist failed buddy service resolutions in the PS
+
+* Thu Apr 5 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.73.20070405git
+- Network manager UI fixes
+
+* Tue Apr 3 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.72.20070403git
+- Do not abort on X errors
+
+* Tue Apr 3 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.71.20070403git
+- Do not kill the process for X errors in mozilla
+
+* Fri Mar 30 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.70.20070331git
+- Fix for back/forward on frames
+
+* Fri Mar 30 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.69.20070330git
+- Fix pdf downloading on broken servers
+
+* Fri Mar 30 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.68.20070330git
+- Some fixes for the new ap status feedback
+
+* Thu Mar 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.67.20070329git
+- Fixes for the mesh device UI
+
+* Thu Mar 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.66.20070329git
+- Better feedback for the ap states on the mesh view.
+
+* Thu Mar 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.65.20070329git
+- Fix pdf mime type. Mesh network support.
+
+* Wed Mar 28 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.64.20070328git
+- Improve rollovers behavior. Disable the presence service.
+
+* Mon Mar 26 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.62.20070326git
+- Misc bugfixes
+
+* Fri Mar 23 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.61.20070323git
+- Support for translations. Bugfixes.
+
+* Thu Mar 22 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.60.20070322git
+- Fix gtkrc path
+
+* Thu Mar 22 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.59.20070322git
+- Add a gtkrc. Some fixes.
+
+* Wed Mar 21 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.58.20070321git
+- Don't hardcode font for arabic. Entry style fixes.
+
+* Tue Mar 20 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.57.20070320git
+- Some style fixes
+
+* Mon Mar 19 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.56.20070319git
+- File chooser size fixes
+
+* Sun Mar 18 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.55.20070318git
+- More frame and saving fixes
+
+* Sat Mar 17 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.54.20070317git
+- Suggest name on save. Frame fixes.
+
+* Fri Mar 16 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.53.20070316git
+- Several bug fixes
+
+* Fri Mar 16 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.52.20070316git
+- FIx file picker buttons
+
+* Thu Mar 15 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.51.20070315git
+- Fix donut and devices sizing
+
+* Thu Mar 15 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.50.20070315git
+- Several bugfixes
+
+* Thu Mar 15 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.49.20070315git
+- Downloads fixes and improvements
+
+* Wed Mar 14 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.48.20070314git
+- Improve the frame behavior and animation
+- Add API to save image and web pages
+
+* Sun Mar 11 2007 Dan Williams <dcbw@redhat.com> - 0.63-2.47.20070308git.1
+- Better frame animation
+
+* Thu Mar 8 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.47.20070308git
+- Add a default picture
+
+* Wed Mar 7 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.46.20070307git
+- More nm fixes. Fix keyboard grabbing.
+
+* Wed Mar 7 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.45.20070307git
+- Some nmclient signals cleanups
+
+* Wed Mar 7 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.44.20070307git
+- Fix the doubling access points bug. Fix some access point state bugs.
+
+* Wed Mar 7 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.43.20070307git
+- Simple but efficient implementation of spreadbox
+
+* Mon Mar 5 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.42.20070306git
+- Update snapshot
+
+* Mon Mar 5 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.41.20070305git
+- Update snapshot
+
+* Mon Mar 5 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.40.20070305git
+- Update snapshot
+
+* Sat Mar 3 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.39.20070305git
+- Update snapshot
+
+* Sat Mar 3 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.38.20070304git
+- Update snapshot
+
+* Sat Mar 3 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.37.20070304git
+- Update snapshot
+
+* Fri Mar 2 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.36.20070302git
+- Update snapshot
+
+* Thu Mar 2 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.34.20070302git
+- Update snapshot
+
+* Thu Mar 2 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.33.20070302git
+- Update snapshot
+
+* Thu Feb 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.32.20070302git
+- Update snapshot
+
+* Thu Feb 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.31.20070301git
+- Update snapshot
+
+* Wed Feb 28 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.30.20070228git
+- Update snapshot
+
+* Wed Feb 28 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.28.20070228git
+- Update snapshot
+
+* Wed Feb 28 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.27.20070228git
+- Update snapshot
+
+* Wed Feb 28 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.26.20070228git
+- Update snapshot
+
+* Wed Feb 28 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.25.20070228git
+- Update snapshot
+
+* Wed Feb 28 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.24.20070228git
+- Update snapshot
+
+* Tue Feb 27 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.23.20070227git
+- Update snapshot
+
+* Sat Feb 24 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.22.20070224git
+- Update to 0.63-2.22.20070224git
+
+* Thu Feb 15 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.21.20070215git
+- Update to 0.63-2.21.20070215git
+
+* Thu Feb 8 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.20.20070208git
+- Update to 0.63-2.20.20070208git
+
+* Tue Feb 5 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.20.20070203git.1
+- Remove dep on pygtkmozembed
+
+* Sun Feb 3 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.20.20070203git
+- Update to 0.63-2.20.20070203git
+
+* Sun Feb 3 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.19.20070203git
+- Update to 0.63-2.19.20070203git
+
+* Wed Jan 31 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.18.20070131git
+- Update to 0.63-2.18.20070131git
+
+* Wed Jan 31 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.17.20070131git
+- Update to 0.63-2.17.20070131git
+
+* Wed Jan 31 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.16.20070131git
+- Update to 0.63-2.16.20070131git
+
+* Wed Jan 29 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.15.20070129git
+- Update to 0.63-2.15.20070129git
+
+* Wed Jan 17 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.14.20070167git
+- Update to 0.63-2.14.20070117git
+
+* Tue Jan 16 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.13.20070116git
+- Update to 0.63-2.13.20070116git
+
+* Mon Jan 15 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.12.20070115git
+- Update to 0.63-2.12.20070115git
+
+* Sat Jan 13 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.11.20070113git
+- Update to 0.63-2.11.20070113git
+
+* Fri Jan 12 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.10.20070112git
+- Update to 0.63-2.10.20070112git
+
+* Thu Jan 11 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.9.20070111git
+- Update to 0.63-2.9.20070111git
+
+* Wed Jan 10 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.8.20070110git
+- Update to 0.63-2.8.20070110git
+
+* Wed Jan 10 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.7.20070110git
+- Update to 0.63-2.7.20070110git
+
+* Tue Jan 9 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.6.20070109git
+- Update to 2.6.20070109git
+
+* Tue Jan 9 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.5.20070109git
+- Update to 2.5.20070109git
+
+* Mon Jan 8 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.4.20070108git
+- Update to 2.4.20070108git
+
+* Mon Jan 8 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.3.20070108git
+- Update to 2.3.20070108git
+
+* Mon Jan 8 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.1.20070108git
+- Update to 2.1.20070108git
+
+* Fri Jan 5 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.2.20070105git
+- Update to 0.63-2.2.20070105git
+
+* Fri Jan 5 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-2.1.20070105git
+- Update to 0.63-2.1.20070105git
+
+* Thu Nov 21 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.63-1
+- Update to 0.63
+
+* Wed Nov 20 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.62-1
+- Update to 0.62
+
+* Mon Nov 18 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.61-1
+- Update to 0.61
+
+* Mon Nov 18 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.60-1
+- Update 0.60
+- Addd the service files
+
+* Fri Nov 17 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.59.1-1
+- Update to 0.59.1
+
+* Mon Nov 14 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.59-1
+- Update to 0.59
+
+* Mon Nov 14 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.58-1
+- Update to 0.58
+
+* Sun Nov 12 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.57-1
+- Update 0.57
+
+* Sun Nov 12 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.56-1
+- Update 0.56
+
+* Sun Nov 12 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.54-1
+- Updat 0.54
+
+* Fri Nov 10 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.53-1
+- Update 0.53
+
+* Fri Nov 10 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.52-1
+- Update to 0.52
+
+* Thu Nov 9 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.51-1
+- Update to 0.51
+
+* Wed Nov 8 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.50-1
+- Update to 0.50
+
+* Sun Nov 5 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.49-1
+- Update to 0.49
+
+* Sat Nov 4 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.48-1
+- Update to 0.48
+
+* Fri Nov 3 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.47-1
+- Update to 0.47
+
+* Mon Oct 30 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.46-1
+- Update to 0.46
+
+* Sat Oct 28 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.45-1
+- Update to 0.45
+
+* Thu Oct 26 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.44-1
+- Update to 0.44
+
+* Thu Oct 26 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.43-1
+- Update to 0.43
+
+* Wed Oct 25 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.42-1
+- Update to 0.42
+
+* Tue Oct 24 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.41-1
+- Update to 0.41
+
+* Fri Oct 20 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.40-1
+- Update to 0.40
+
+* Fri Oct 20 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.39-1
+- Update to 0.39
+
+* Thu Oct 19 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.38-1
+- Update to 0.38
+
+* Wed Oct 18 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.37-1
+- Update to 0.37
+
+* Tue Oct 17 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.36-1
+- Update to 0.36
+
+* Tue Oct 17 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.35-1
+- Update to 0.35
+
+* Fri Oct 13 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.34-1
+- Update to 0.34
+
+* Fri Oct 6 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.33-1
+- Update 0.33
+
+* Fri Oct 6 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.32-1
+- Update 0.32
+
+* Fri Oct 6 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.31-3
+- Add req for vte
+
+* Fri Oct 6 2006 John (J5) Palmieri <johnp@redhat.com> - 0.31-2
+- Add req for hippo-canvas-python
+
+* Thu Oct 5 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.31-1
+- Update to 0.31
+
+* Wed Oct 4 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.30-1
+- Update to 0.30
+- Update dependencies
+
+* Mon Sep 11 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.29-1
+- Update to 0.29
+
+* Mon Sep 11 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.29-1
+- Update to 0.29
+
+* Mon Sep 11 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.28-1
+- Update to 0.28
+
+* Mon Sep 11 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.27-1
+- Update to 0.27
+
+* Mon Sep 11 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.26-1
+- Update to 0.26
+
+* Fri Aug 25 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.25-1
+- Update to 0.25
+
+* Fri Aug 25 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.24-1
+- Update to 0.24
+
+* Fri Aug 25 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.23-1
+- Update to 0.23
+- Add build req pygtk2-devel
+
+* Wed Aug 23 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.22-2
+- Rebuild
+
+* Wed Aug 23 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.22-1
+- Update to 0.22
+
+* Tue Aug 22 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.21-1
+- Update to 0.21
+
+* Tue Aug 22 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.20-2
+- Requires matchbox-window-manager
+
+* Tue Aug 22 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.20-1
+- Update to 0.20
+- Fix requires
+- Require python-devel
+- Require perl-XML-Parser
+- Missing make on build
+- Require gettext
+
+* Tue Aug 22 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.19-3
+- Remove .la
+
+* Tue Aug 22 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.19-2
+- Package some missing files
+
+* Tue Aug 22 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.19-1
+- Build 0.19
+
+* Sun Jun 30 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.18-1
+- Build 0.18
+
+* Sun Jun 30 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.17-1
+- Build 0.17
+
+* Sun Jun 29 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.16-1
+- Build 0.16
+
+* Sun Jun 24 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.15-1
+- Build 0.15
+
+* Sat Jun 23 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.14-1
+- Build 0.14
+
+* Fri Jun 22 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.13-1
+- Build 0.13
+
+* Fri Jun 22 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.12-4
+- Add pkgconfig to build requires
+
+* Fri Jun 22 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.12-3
+- Remove build requires
+
+* Fri Jun 22 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.12-2
+- Make this noarch
+
+* Fri Jun 22 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.12-1
+- Update to release 0.12
+
+* Tue Jun 21 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.11-1
+- Update to release 0.11
+
+* Tue Jun 21 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.10-1
+- Update to release 0.10
+
+* Tue May 21 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.9-1
+- Update to release 0.9
+
+* Tue May 21 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.8-1
+- Update to release 0.8
+
+* Tue May 21 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.7-1
+- Update to release 0.7
+
+* Tue May 21 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.6-1
+- Update to release 0.6
+
+* Tue May 17 2006 Marco Pesenti Gritti <mpg@redhat.com> - 0.4-1
+- Update to release 0.4
+- No more dbus .services files
+
+* Tue May 16 2006 David Zeuthen <davidz@redhat.com> - 0.3-1
+- Update to release 0.3
+
+* Tue May 16 2006 David Zeuthen <davidz@redhat.com> - 0.2-3
+- Add Requires: avahi-tools
+
+* Tue May 16 2006 David Zeuthen <davidz@redhat.com> - 0.2-2
+- Add Requires: libxml2-python
+
+* Mon May 08 2006 David Zeuthen <davidz@redhat.com> - 0.2-1
+- Initial package
diff --git a/rpms/sugar/tch-Add-missing-restart-button.patch b/rpms/sugar/tch-Add-missing-restart-button.patch
new file mode 100644
index 0000000..baac267
--- /dev/null
+++ b/rpms/sugar/tch-Add-missing-restart-button.patch
@@ -0,0 +1,29 @@
+From 25d05d8936e73ed04371b286a008da5866d33958 Mon Sep 17 00:00:00 2001
+From: Martin Abente <mabente@paraguayeduca.org>
+Date: Thu, 15 Jul 2010 11:43:17 -0400
+Subject: [PATCH] Add missing restart button
+Organization: Paraguay Educa
+
+---
+ src/jarabe/view/buddymenu.py | 5 +++++
+ 1 files changed, 5 insertions(+), 0 deletions(-)
+
+diff --git a/src/jarabe/view/buddymenu.py b/src/jarabe/view/buddymenu.py
+index 4637751..e21b617 100644
+--- a/src/jarabe/view/buddymenu.py
++++ b/src/jarabe/view/buddymenu.py
+@@ -84,6 +84,11 @@ class BuddyMenu(Palette):
+ self.menu.append(item)
+ item.show()
+
++ item = MenuItem(_('Restart'), 'system-restart')
++ item.connect('activate', self.__reboot_activate_cb)
++ self.menu.append(item)
++ item.show()
++
+ client = gconf.client_get_default()
+
+ if client.get_bool('/desktop/sugar/show_logout'):
+--
+1.6.0.4
+
diff --git a/rpms/sugar/use-the-spanish-verb-quitar-for-unmounting-devices.patch b/rpms/sugar/use-the-spanish-verb-quitar-for-unmounting-devices.patch
new file mode 100644
index 0000000..fb15754
--- /dev/null
+++ b/rpms/sugar/use-the-spanish-verb-quitar-for-unmounting-devices.patch
@@ -0,0 +1,37 @@
+From 32043cb14603584e19c0edf34e272763779f95da Mon Sep 17 00:00:00 2001
+From: Bernie Innocenti <bernie@codewiz.org>
+Date: Sun, 16 May 2010 13:29:38 -0400
+Subject: [PATCH] use the spanish verb "quitar" for unmounting devices
+Organization: Sugar Labs Foundation
+X-Subversion: sucks
+
+In Sugar 0.88, the command for unmounting removable devices has been
+renamed from "Unmount" to "Remove", which is used throughout the GUI
+with several slightly different meanings.
+
+The common translation for "remove" was "eliminar", whose semantic
+meaning is "eliminate", thus inappropriate for the unmount operation.
+
+Other languages may not be so lucky. We may have to keep the string for
+unmounting devices distinct from the others, along with a TRNAS comment
+to warn translators about the context.
+---
+ po/es.po | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/po/es.po b/po/es.po
+index 587608f..6702db6 100644
+--- a/po/es.po
++++ b/po/es.po
+@@ -975,7 +975,7 @@ msgstr "Transferencia a %r"
+
+ #: ../src/jarabe/frame/clipboardmenu.py:52 ../src/jarabe/view/palettes.py:218
+ msgid "Remove"
+-msgstr "Eliminar"
++msgstr "Quitar"
+
+ #: ../src/jarabe/frame/clipboardmenu.py:57
+ #: ../src/jarabe/frame/clipboardmenu.py:80
+--
+1.7.0.1
+