Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnish Mangal <anish@sugarlabs.org>2011-01-19 18:04:06 (GMT)
committer Anish Mangal <anish@sugarlabs.org>2011-01-19 22:38:09 (GMT)
commit674c9a61fa22625f12cb0134e83d7d3b1dfe9707 (patch)
tree04acd42620f8e4224f3e2367c6955cf5a751ed7d
parentbe4f30f5b5d2c1938119fbc70458e61d1780bf35 (diff)
Auto feedback feature related changes
-rw-r--r--rpms/common/branches1
-rw-r--r--rpms/sugar-artwork/Modified-Patch-for-adding-feedback-icon.svg-to-sugar-artwork.patch422
-rw-r--r--rpms/sugar-artwork/sugar-artwork.spec12
-rw-r--r--rpms/sugar-base/Do-not-set-unhandled-exceptions-handler-to-not-affect-feedback-s-one.patch50
-rw-r--r--rpms/sugar-base/Makefile21
-rw-r--r--rpms/sugar-base/sugar-base.spec171
-rw-r--r--rpms/sugar-toolkit/sugar-toolkit-Report-to-the-shell-on-errors.patch212
-rw-r--r--rpms/sugar-toolkit/sugar-toolkit.spec12
-rw-r--r--rpms/sugar/sugar-1-2-Two-kinds-of-feedback-submits.patch266
-rw-r--r--rpms/sugar/sugar-2-2-Initial-client-implementation-for-feedback-feature.patch383
-rw-r--r--rpms/sugar/sugar-Patch-to-add-feedback-icon-to-frame.patch169
-rw-r--r--rpms/sugar/sugar.spec14
12 files changed, 1728 insertions, 5 deletions
diff --git a/rpms/common/branches b/rpms/common/branches
index 15ecc09..b9592ee 100644
--- a/rpms/common/branches
+++ b/rpms/common/branches
@@ -2,3 +2,4 @@ sugar:dist-f11-updates-candidate:.fc11:fedora:11
sugar-toolkit:dist-f11-updates-candidate:.fc11:fedora:11
sugar-datastore:dist-f11-updates-candidate:.fc11:fedora:11
sugar-artwork:dist-f11-updates-candidate:.fc11:fedora:11
+sugar-base:dist-f11-updates-candidate:.fc11:fedora:11
diff --git a/rpms/sugar-artwork/Modified-Patch-for-adding-feedback-icon.svg-to-sugar-artwork.patch b/rpms/sugar-artwork/Modified-Patch-for-adding-feedback-icon.svg-to-sugar-artwork.patch
new file mode 100644
index 0000000..1400e4a
--- /dev/null
+++ b/rpms/sugar-artwork/Modified-Patch-for-adding-feedback-icon.svg-to-sugar-artwork.patch
@@ -0,0 +1,422 @@
+From patchwork Tue Jan 18 14:27:07 2011
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: Modified Patch for adding feedback-icon.svg to sugar-artwork
+Date: Tue, 18 Jan 2011 19:27:07 -0000
+From: Mukesh Gupta <mukeshgupta.2006@gmail.com>
+X-Patchwork-Id: 590
+Message-Id: <1295360827-2382-1-git-send-email-mukeshgupta.2006@gmail.com>
+To: dextrose@lists.sugarlabs.org
+
+From: root <root@ubuntu.(none)>
+
+1)Icon converted to plain svg format
+
+Signed-off-by: Mukesh Gupta <mukeshgupta.2006@gmail.com>
+
+---
+icons/scalable/device/Makefile.am | 1 +
+ icons/scalable/device/feedback-icon.svg | 378 +++++++++++++++++++++++++++++++
+ 2 files changed, 379 insertions(+), 0 deletions(-)
+ mode change 100644 => 100755 icons/scalable/device/Makefile.am
+ create mode 100755 icons/scalable/device/feedback-icon.svg
+
+diff --git a/icons/scalable/device/Makefile.am b/icons/scalable/device/Makefile.am
+old mode 100644
+new mode 100755
+index bca43f0..d75985c
+--- a/icons/scalable/device/Makefile.am
++++ b/icons/scalable/device/Makefile.am
+@@ -3,6 +3,7 @@ category=device
+ icondir = $(datadir)/icons/sugar/$(iconsize)/$(category)
+
+ icon_DATA = \
++ feedback-icon.svg \
+ battery-000.icon \
+ battery-000.svg \
+ battery-010.icon \
+diff --git a/icons/scalable/device/feedback-icon.svg b/icons/scalable/device/feedback-icon.svg
+new file mode 100755
+index 0000000..c7fc9a8
+--- /dev/null
++++ b/icons/scalable/device/feedback-icon.svg
+@@ -0,0 +1,378 @@
++<?xml version="1.0" encoding="UTF-8" standalone="no"?>
++<!-- Created with Inkscape (http://www.inkscape.org/) -->
++
++<svg: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:xlink="http://www.w3.org/1999/xlink"
++ version="1.0"
++ width="60"
++ height="60"
++ viewBox="0 0 128 128"
++ id="svg548">
++ <svg:metadata
++ id="metadata48">
++ <rdf:RDF>
++ <cc:Work
++ rdf:about="">
++ <dc:format>image/svg+xml</dc:format>
++ <dc:type
++ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
++ <dc:title></dc:title>
++ </cc:Work>
++ </rdf:RDF>
++ </svg:metadata>
++ <svg:defs
++ id="defs601">
++ <svg:linearGradient
++ x1="55.4272"
++ y1="102.1953"
++ x2="55.4272"
++ y2="-7.1773"
++ id="linearGradient3803"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(0,-0.496766)"
++ spreadMethod="pad">
++ <svg:stop
++ id="stop3805"
++ style="stop-color:#000000;stop-opacity:1"
++ offset="0" />
++ <svg:stop
++ id="stop3807"
++ style="stop-color:#59657f;stop-opacity:1"
++ offset="0.20505001" />
++ <svg:stop
++ id="stop3809"
++ style="stop-color:#b3caff;stop-opacity:1"
++ offset="0.41010001" />
++ <svg:stop
++ id="stop3811"
++ style="stop-color:#dfeaff;stop-opacity:1"
++ offset="0.8258" />
++ <svg:stop
++ id="stop3813"
++ style="stop-color:#eff4ff;stop-opacity:1"
++ offset="0.91289997" />
++ <svg:stop
++ id="stop3815"
++ style="stop-color:#ffffff;stop-opacity:1"
++ offset="1" />
++ <midPointStop
++ offset="0"
++ style="stop-color:#7C74FF"
++ id="midPointStop560" />
++ <midPointStop
++ offset="0.5"
++ style="stop-color:#7C74FF"
++ id="midPointStop561" />
++ <midPointStop
++ offset="0.4101"
++ style="stop-color:#B3CAFF"
++ id="midPointStop562" />
++ <midPointStop
++ offset="0.5"
++ style="stop-color:#B3CAFF"
++ id="midPointStop563" />
++ <midPointStop
++ offset="0.8258"
++ style="stop-color:#DFEAFF"
++ id="midPointStop564" />
++ <midPointStop
++ offset="0.5"
++ style="stop-color:#DFEAFF"
++ id="midPointStop565" />
++ <midPointStop
++ offset="1"
++ style="stop-color:#FFFFFF"
++ id="midPointStop566" />
++ </svg:linearGradient>
++ <svg:linearGradient
++ id="linearGradient2802">
++ <svg:stop
++ id="stop2804"
++ style="stop-color:#1d12aa;stop-opacity:1"
++ offset="0" />
++ <svg:stop
++ id="stop2806"
++ style="stop-color:#8b12aa;stop-opacity:0"
++ offset="1" />
++ </svg:linearGradient>
++ <svg:linearGradient
++ id="linearGradient2812">
++ <svg:stop
++ id="stop2814"
++ style="stop-color:#1d25aa;stop-opacity:1"
++ offset="0" />
++ <svg:stop
++ id="stop2816"
++ style="stop-color:#8b12aa;stop-opacity:0"
++ offset="1" />
++ </svg:linearGradient>
++ <svg:marker
++ refX="0"
++ refY="0"
++ orient="auto"
++ id="Arrow1Lstart"
++ style="overflow:visible">
++ <svg:path
++ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
++ transform="scale(0.8,0.8)"
++ id="path2991"
++ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" />
++ </svg:marker>
++ <svg:linearGradient
++ id="linearGradient4766">
++ <svg:stop
++ id="stop4768"
++ style="stop-color:#0447ff;stop-opacity:1"
++ offset="0" />
++ <svg:stop
++ id="stop4770"
++ style="stop-color:#000000;stop-opacity:0"
++ offset="1" />
++ </svg:linearGradient>
++ <svg:linearGradient
++ x1="55.4272"
++ y1="102.1953"
++ x2="55.4272"
++ y2="-7.1773"
++ id="XMLID_1_"
++ xlink:href="#XMLID_4_"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(0,-0.496766)"
++ spreadMethod="pad">
++ <svg:stop
++ id="stop556"
++ style="stop-color:#000000;stop-opacity:1"
++ offset="0" />
++ <svg:stop
++ id="stop3799"
++ style="stop-color:#59657f;stop-opacity:1"
++ offset="0.20505001" />
++ <svg:stop
++ id="stop557"
++ style="stop-color:#b3caff;stop-opacity:1"
++ offset="0.41010001" />
++ <svg:stop
++ id="stop558"
++ style="stop-color:#dfeaff;stop-opacity:1"
++ offset="0.8258" />
++ <svg:stop
++ id="stop3801"
++ style="stop-color:#eff4ff;stop-opacity:1"
++ offset="0.91289997" />
++ <svg:stop
++ id="stop3817"
++ style="stop-color:#f7f9ff;stop-opacity:1"
++ offset="0.95644999" />
++ <svg:stop
++ id="stop559"
++ style="stop-color:#ffffff;stop-opacity:1"
++ offset="1" />
++ <midPointStop
++ id="midPointStop560"
++ style="stop-color:#7C74FF"
++ offset="0" />
++ <midPointStop
++ id="midPointStop561"
++ style="stop-color:#7C74FF"
++ offset="0.5" />
++ <midPointStop
++ id="midPointStop562"
++ style="stop-color:#B3CAFF"
++ offset="0.4101" />
++ <midPointStop
++ id="midPointStop563"
++ style="stop-color:#B3CAFF"
++ offset="0.5" />
++ <midPointStop
++ id="midPointStop564"
++ style="stop-color:#DFEAFF"
++ offset="0.8258" />
++ <midPointStop
++ id="midPointStop565"
++ style="stop-color:#DFEAFF"
++ offset="0.5" />
++ <midPointStop
++ id="midPointStop566"
++ style="stop-color:#FFFFFF"
++ offset="1" />
++ </svg:linearGradient>
++ <svg:linearGradient
++ x1="54.7607"
++ y1="7.2758999"
++ x2="54.7607"
++ y2="57.487301"
++ id="XMLID_2_"
++ gradientUnits="userSpaceOnUse"
++ spreadMethod="pad">
++ <svg:stop
++ id="stop569"
++ style="stop-color:#ffffff;stop-opacity:1"
++ offset="0" />
++ <svg:stop
++ id="stop570"
++ style="stop-color:#b3caff;stop-opacity:1"
++ offset="1" />
++ <midPointStop
++ id="midPointStop571"
++ style="stop-color:#FFFFFF"
++ offset="0" />
++ <midPointStop
++ id="midPointStop572"
++ style="stop-color:#FFFFFF"
++ offset="0.5" />
++ <midPointStop
++ id="midPointStop573"
++ style="stop-color:#B3CAFF"
++ offset="1" />
++ </svg:linearGradient>
++ <svg:linearGradient
++ x1="83.637703"
++ y1="119.3457"
++ x2="83.637703"
++ y2="42.033901"
++ id="XMLID_3_"
++ gradientUnits="userSpaceOnUse"
++ spreadMethod="pad">
++ <svg:stop
++ id="stop577"
++ style="stop-color:#006dff;stop-opacity:1"
++ offset="0" />
++ <svg:stop
++ id="stop578"
++ style="stop-color:#94caff;stop-opacity:1"
++ offset="0.41010001" />
++ <svg:stop
++ id="stop579"
++ style="stop-color:#dcf0ff;stop-opacity:1"
++ offset="0.8258" />
++ <svg:stop
++ id="stop580"
++ style="stop-color:#ffffff;stop-opacity:1"
++ offset="1" />
++ <midPointStop
++ id="midPointStop581"
++ style="stop-color:#006DFF"
++ offset="0" />
++ <midPointStop
++ id="midPointStop582"
++ style="stop-color:#006DFF"
++ offset="0.5" />
++ <midPointStop
++ id="midPointStop583"
++ style="stop-color:#94CAFF"
++ offset="0.4101" />
++ <midPointStop
++ id="midPointStop584"
++ style="stop-color:#94CAFF"
++ offset="0.5" />
++ <midPointStop
++ id="midPointStop585"
++ style="stop-color:#DCF0FF"
++ offset="0.8258" />
++ <midPointStop
++ id="midPointStop586"
++ style="stop-color:#DCF0FF"
++ offset="0.5" />
++ <midPointStop
++ id="midPointStop587"
++ style="stop-color:#FFFFFF"
++ offset="1" />
++ </svg:linearGradient>
++ <svg:linearGradient
++ x1="265.11331"
++ y1="52.250999"
++ x2="265.11331"
++ y2="87.743599"
++ id="XMLID_4_"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(-1,0,0,1,349,0)"
++ spreadMethod="pad">
++ <svg:stop
++ id="stop590"
++ style="stop-color:#ffffff;stop-opacity:1"
++ offset="0" />
++ <svg:stop
++ id="stop591"
++ style="stop-color:#94caff;stop-opacity:1"
++ offset="1" />
++ <midPointStop
++ id="midPointStop592"
++ style="stop-color:#FFFFFF"
++ offset="0" />
++ <midPointStop
++ id="midPointStop593"
++ style="stop-color:#FFFFFF"
++ offset="0.5" />
++ <midPointStop
++ id="midPointStop594"
++ style="stop-color:#94CAFF"
++ offset="1" />
++ </svg:linearGradient>
++ </svg:defs>
++ <svg:g
++ id="Layer_2"
++ style="font-size:12px;stroke:#000000">
++ <svg:path
++ d="M 128,128 0,128 0,0 l 128,0 0,128 z"
++ id="path550"
++ style="fill:none;stroke:none" />
++ </svg:g>
++ <svg:g
++ id="Layer_1"
++ style="font-size:12px;stroke:#000000" />
++ <svg:path
++ d="m 9.041,92.189 c 0,0 12.914,-6.796 21.069,-24.807 l 22.088,9.515 c 0,0 -5.776,15.292 -43.157,15.292 z"
++ id="path553"
++ style="font-size:12px;fill:#00008d;stroke:none" />
++ <svg:path
++ d="m 1.905,49.712 c 0,21.021 23.962,38.061 53.522,38.061 29.56,0 53.522,-17.04 53.522,-38.061 0,-21.02 -23.962,-38.061 -53.522,-38.061 -29.56,0 -53.522,17.041 -53.522,38.061 z"
++ id="path554"
++ style="font-size:12px;fill:#00008d;stroke:none" />
++ <svg:path
++ d="m 55.427,13.193234 c -28.388,0 -51.484,16.159 -51.484,36.021 0,12.119 8.607,22.853 21.76,29.384 -3.501,4.923 -7.103,8.477 -9.981,10.866 11.988,-0.664 19.942,-3.076 25.161,-5.702 4.615,0.954 9.494,1.474 14.544,1.474 28.388,0 51.483,-16.159 51.483,-36.021 0,-19.862 -23.095,-36.022 -51.483,-36.022 z"
++ id="path567"
++ style="font-size:12px;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
++ <svg:path
++ d="m 12.999,35.282 c 17.045,9.528 36.475,11.867 56.357,6.68 4.104,-1.141 8.271,-2.526 12.3,-3.866 4.854,-1.614 9.848,-3.25 14.868,-4.523 C 88.559,23.302 72.888,16.748 55.428,16.748 37.091,16.749 20.396,24.128 12.999,35.282 z"
++ id="path574"
++ style="font-size:12px;fill:#ffffff;stroke:none" />
++ <svg:text
++ x="32.487"
++ y="68.007004"
++ id="text2303"
++ xml:space="preserve"
++ style="font-size:48px;font-style:normal;font-weight:bold;fill:#000000;fill-opacity:1;stroke:none;font-family:Microsoft Sans Serif"><svg:tspan
++ x="32.487"
++ y="68.007004"
++ id="tspan2305"
++ style="font-size:64px;font-style:normal;font-weight:bold;fill:#000000;fill-opacity:1;font-family:sans">?</svg:tspan></svg:text>
++ <svg:path
++ d="m 42.401,82.248 c 0,16.712 18.499,30.309 41.237,30.309 3.156,0 6.415,-0.326 9.691,-0.906 4.926,2.166 10.988,3.491 18.108,3.887 l 14.658,0.812 -11.297,-9.378 c -0.731,-0.605 -1.742,-1.531 -2.876,-2.735 8.243,-5.706 12.953,-13.577 12.953,-21.987 0,-16.712 -18.499,-30.308 -41.238,-30.308 C 60.9,51.94 42.401,65.536 42.401,82.248 z"
++ id="path575"
++ style="font-size:12px;fill:#0032a4;stroke:none" />
++ <svg:path
++ d="m 44.823,82.248 c 0,15.376 17.413,27.885 38.814,27.885 3.372,0 6.72,-0.349 9.979,-0.97 4.711,2.205 10.718,3.554 17.955,3.955 l 7.329,0.406 -5.649,-4.689 c -1.291,-1.072 -3.089,-2.764 -4.983,-5.081 8.908,-5.267 14.186,-13.125 14.186,-21.506 0,-15.377 -17.412,-27.885 -38.815,-27.885 -21.403,0 -38.816,12.508 -38.816,27.885 z"
++ id="path588"
++ style="font-size:12px;fill:#ffffff;fill-opacity:1;stroke:none" />
++ <svg:path
++ d="m 83.638,57.505 c 14.619,0 27.121,6.272 32.017,15.071 -12.72,7.571 -27.472,9.437 -42.226,5.589 C 66.228,76.163 59.247,73.276 52.12,71.719 57.332,63.374 69.498,57.505 83.638,57.505 z"
++ id="path595"
++ style="font-size:12px;fill:#ffffff;stroke:none" />
++ <svg:g
++ transform="matrix(1.38561,0,0,1.38561,-32.2514,-30.5491)"
++ id="g4248">
++ <svg:path
++ d="m 103.21356,24.205935 a 24.311146,23.627199 0 1 1 -48.622293,0 24.311146,23.627199 0 1 1 48.622293,0 z"
++ transform="matrix(0.148134,0,0,0.152972,71.9504,64.0705)"
++ id="path3881"
++ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:6.64217997;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-start:none" />
++ <svg:path
++ d="m 87.539971,77.627004 c 0,0.689736 0.05114,14.289419 0.06759,16.728574 0.01015,1.504861 2.271444,0.6952 2.418949,1.625125 0.251991,1.58864 -3.137824,1.044408 -3.307998,1.036917 -0.974629,-0.0429 -4.292747,0.01852 -5.341568,0.01852 -0.275941,0 -3.798427,0.653926 -4.062771,-0.726948 -0.242983,-1.269294 2.180288,-1.017736 2.519064,-1.929001 1.237046,-3.327511 1.32145,-10.35088 0.48941,-14.489007 -0.419874,-2.088234 -3.393883,-1.527204 -3.059349,-3.031545 0.216072,-0.971628 1.31654,-1.080731 2.087723,-1.345701 1.698554,-0.583605 3.772806,-0.445736 5.228081,-1.501235 1.60838,-1.166545 2.96087,1.619206 2.96087,3.614297 z"
++ id="path4774"
++ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99987;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker-start:none" />
++ </svg:g>
++</svg:svg>
diff --git a/rpms/sugar-artwork/sugar-artwork.spec b/rpms/sugar-artwork/sugar-artwork.spec
index 9d9ab89..c908140 100644
--- a/rpms/sugar-artwork/sugar-artwork.spec
+++ b/rpms/sugar-artwork/sugar-artwork.spec
@@ -1,7 +1,7 @@
Summary: Artwork for Sugar look-and-feel
Name: sugar-artwork
Version: 0.88.1
-Release: 1.10dxo%{?dist}
+Release: 1.11dxo%{?dist}
URL: http://sugarlabs.org
Group: User Interface/Desktops
License: LGPLv2+
@@ -27,6 +27,9 @@ Patch301: ad_hoc_artwork.patch
# Update computer happy/normal/sad icons (thanks to garycmartin)
Patch401: Update-computer-happy-normal-sad-icons-garycmartin.patch
+# Auto-feedback reporting feature icon
+Patch501: Modified-Patch-for-adding-feedback-icon.svg-to-sugar-artwork.patch
+
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: gtk2-devel >= 2.9.0
@@ -58,6 +61,8 @@ look and feel.
%patch401 -p1
+%patch501 -p1
+
%build
autoreconf --force --install -v
%configure
@@ -92,7 +97,10 @@ touch --no-create %{_datadir}/icons/sugar || :
%{_libdir}/gtk-2.0/*/engines/*.so
%changelog
-* Thu Jan 18 2011 Anish Mangal <anish@sugarlabs.org> - 0.88.1-10
+* Thu Jan 19 2011 Anish Mangal <anish@sugarlabs.org> - 0.88.1-11
+- Added auto-feeback feature icon
+
+* Tue Jan 18 2011 Anish Mangal <anish@sugarlabs.org> - 0.88.1-10
- Update computer happy/normal/sad icons (garycmartin, patch401)
* Thu Jun 3 2010 Peter Robinson <pbrobinson@gmail.com> - 0.88.1-1
diff --git a/rpms/sugar-base/Do-not-set-unhandled-exceptions-handler-to-not-affect-feedback-s-one.patch b/rpms/sugar-base/Do-not-set-unhandled-exceptions-handler-to-not-affect-feedback-s-one.patch
new file mode 100644
index 0000000..db4dc5d
--- /dev/null
+++ b/rpms/sugar-base/Do-not-set-unhandled-exceptions-handler-to-not-affect-feedback-s-one.patch
@@ -0,0 +1,50 @@
+From patchwork Tue Jan 18 10:47:27 2011
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: Do not set unhandled exceptions handler to not affect feedback's one
+Date: Tue, 18 Jan 2011 15:47:27 -0000
+From: Aleksey Lim <alsroot@member.fsf.org>
+X-Patchwork-Id: 588
+Message-Id: <1295347647-16070-1-git-send-email-alsroot@member.fsf.org>
+To: dextrose@lists.sugarlabs.org
+
+---
+ src/sugar/logger.py | 16 ----------------
+ 1 files changed, 0 insertions(+), 16 deletions(-)
+
+
+diff --git a/src/sugar/logger.py b/src/sugar/logger.py
+index 275c57d..ae2caa2 100644
+--- a/src/sugar/logger.py
++++ b/src/sugar/logger.py
+@@ -64,20 +64,6 @@ def set_level(level):
+ logging.warning('Invalid log level: %r', level)
+
+
+-# pylint: disable-msg=E1101,F0401
+-def _except_hook(exctype, value, traceback):
+- # Attempt to provide verbose IPython tracebacks.
+- # Importing IPython is slow, so we import it lazily.
+- try:
+- from IPython.ultraTB import AutoFormattedTB
+- sys.excepthook = AutoFormattedTB(mode='Verbose',
+- color_scheme='NoColor')
+- except ImportError:
+- sys.excepthook = sys.__excepthook__
+-
+- sys.excepthook(exctype, value, traceback)
+-
+-
+ def start(log_filename=None):
+ # remove existing handlers, or logging.basicConfig() won't have no effect.
+ root_logger = logging.getLogger('')
+@@ -130,8 +116,6 @@ def start(log_filename=None):
+ if e.errno != errno.ENOSPC:
+ raise e
+
+- sys.excepthook = _except_hook
+-
+
+ class TraceRepr(repr_.Repr):
+
diff --git a/rpms/sugar-base/Makefile b/rpms/sugar-base/Makefile
new file mode 100644
index 0000000..04f4ab2
--- /dev/null
+++ b/rpms/sugar-base/Makefile
@@ -0,0 +1,21 @@
+# Makefile for source rpm: sugar
+# $Id: Makefile,v 1.2 2009/11/25 23:15:39 notting Exp $
+NAME := sugar
+SPECFILE = $(firstword $(wildcard *.spec))
+
+define find-makefile-common
+for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$d/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done
+endef
+
+MAKEFILE_COMMON := $(shell $(find-makefile-common))
+
+ifeq ($(MAKEFILE_COMMON),)
+# attept a checkout
+define checkout-makefile-common
+test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2
+endef
+
+MAKEFILE_COMMON := $(shell $(checkout-makefile-common))
+endif
+
+include $(MAKEFILE_COMMON)
diff --git a/rpms/sugar-base/sugar-base.spec b/rpms/sugar-base/sugar-base.spec
new file mode 100644
index 0000000..581008b
--- /dev/null
+++ b/rpms/sugar-base/sugar-base.spec
@@ -0,0 +1,171 @@
+%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")}
+
+Summary: Base Sugar library
+Name: sugar-base
+Version: 0.88.0
+Release: 2%{?dist}
+URL: http://sugarlabs.org/
+Source0: http://download.sugarlabs.org/sources/sucrose/glucose/%{name}/%{name}-%{version}.tar.bz2
+
+#changes related to auto-feedback feature
+patch1: Do-not-set-unhandled-exceptions-handler-to-not-affect-feedback-s-one.patch
+
+License: LGPLv2
+Group: System Environment/Libraries
+Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+BuildRequires: python-devel
+BuildRequires: pygobject2-devel
+BuildRequires: pygtk2-codegen
+BuildRequires: gettext
+BuildRequires: perl-XML-Parser
+BuildRequires: intltool
+
+Requires: python-decorator
+
+%description
+
+The base libary for Sugar, the user interface of the One Laptop Per
+Child project. It provides helpers for the development of services and
+activities.
+
+%prep
+%setup -q
+
+%patch1 -p1
+
+%build
+%configure
+make %{?_smp_mflags} V=1
+
+%install
+rm -rf %{buildroot}
+make install DESTDIR=%{buildroot}
+
+%find_lang %name
+
+#Remove libtool archives.
+find %{buildroot} -name '*.la' -exec rm -f {} ';'
+
+%clean
+rm -rf %{buildroot}
+
+%files -f %{name}.lang
+%defattr(-,root,root,-)
+%{python_sitelib}/*
+
+%changelog
+* Wed Jan 19 2011 Anish Mangal <anish@sugarlabs.org> - 0.88.0-2
+- Add changes related to auto-feedback feature
+
+* Tue Mar 20 2010 Peter Robinson <pbrobinson@gmail.com> - 0.88.0-1
+- New upstream stable 0.88.0 release
+
+* Thu Feb 11 2010 Sebastian Dziallas <sebastian@when.com> - 0.87.3-1
+- New upstream release
+
+* Wed Jan 13 2010 Mathieu Bridon <bochecha@fedoraproject.org> 0.87.2-1
+- New upstream release
+
+* Sat Jan 9 2010 Peter Robinson <pbrobinson@gmail.com> - 0.87.1-3
+- Updated to the new python sysarch spec file reqs
+
+* 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
+
+* Fri Sep 25 2009 Mathieu Bridon <bochecha@fedoraproject.org> - 0.86.0-1
+- New upstream release
+
+* Fri Sep 18 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.6-1
+- New upstream release
+
+* Fri Sep 11 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.5-1
+- New upstream release
+
+* Wed Sep 02 2009 Tomeu Vizoso <tomeu@sugarlabs.org> - 0.85.4-1
+- New upstream release
+
+* Wed Aug 26 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.1-1
+- sugar/dispatch/license.txt is missing from the sugar-base source tarball #704
+
+* 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.4-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Mon Feb 23 2009 Simon Schampijer <simon@schampijer.de> - 0.83.4-1
+- Many new translations!
+
+* Tue Jan 20 2009 Marco Pesenti Gritti <mpg@redhat.com> - 0.83.3-2
+- Don't print logs to tty instead of shell.log in the emulator
+- Trivial port to GIO instead of GnomeVFS
+
+* Sun Jan 04 2009 Simon Schampijer <simon@schampijer.de> - 0.83.2-1
+- add intltool as build dep
+- new download url
+- Adding language he, bi, hu, sw, cs, sv, sk, wa
+- Updated translations
+
+* Sat Nov 29 2008 Ignacio Vazquez-Abrams <ivazqueznet+rpm@gmail.com> - 0.83.1-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
+
+* Thu Aug 28 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.2-1
+- Translation updates
+
+* Thu Aug 07 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.82.1-1
+- added languages Norwegian and Slovenian
+- translation update
+
+* Fri Aug 01 2008 Morgan Collett <morgan@laptop.org> - 0.81.3-1
+- Update to 0.81.3
+- Make logger safe to full disk
+- Translation updates
+
+* Tue Jul 08 2008 Simon Schampijer <simon@schampijer.de> - 0.81.2-3
+- BuildRequires: perl-XML-Parser
+
+* Tue Jul 08 2008 Simon Schampijer <simon@schampijer.de> - 0.81.2-2
+- added gettext as build require
+
+* Tue Jul 08 2008 Simon Schampijer <simon@schampijer.de> - 0.81.2-1
+- gained its own translation module and some languages have already been contributed
+
+* Mon Jun 09 2008 Simon Schampijer <simon@schampijer.de> - 0.81.1-1
+- Fix logging (Tomeu)
+
+* Tue Apr 22 2008 Tomeu Vizoso <tomeu@tomeuvizoso.net> - 0.79.1-1
+- Pylint cleanup.
+
+* Sat Feb 9 2008 Marco Pesenti Gritti <mpg@redhat.com> - 0.79.0-1
+- Update to 0.79.0
+
+* Sun Nov 25 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.1.1-1
+- Update to 0.1.1
+
+* Tue Nov 13 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.1-0.6.20071113git1a04bb7c71
+- #4838 More verbose traces (mstone)
+
+* Fri Nov 2 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.1-0.5.20071102git15797de32a
+- New snapshot
+
+* Thu Nov 1 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.1-0.4.20071016git7364e0078e
+- Remove unnecessary pkgconfig buildreq
+
+* Sat Oct 20 2007 Marco Pesenti Gritti <mpg@redhat.com> - 0.1-0.3.20071016git7364e0078e
+- New snapshot
diff --git a/rpms/sugar-toolkit/sugar-toolkit-Report-to-the-shell-on-errors.patch b/rpms/sugar-toolkit/sugar-toolkit-Report-to-the-shell-on-errors.patch
new file mode 100644
index 0000000..443ccc4
--- /dev/null
+++ b/rpms/sugar-toolkit/sugar-toolkit-Report-to-the-shell-on-errors.patch
@@ -0,0 +1,212 @@
+From patchwork Tue Jan 18 03:00:27 2011
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [sugar-toolkit] Report to the shell on errors
+Date: Tue, 18 Jan 2011 08:00:27 -0000
+From: Aleksey Lim <alsroot@member.fsf.org>
+X-Patchwork-Id: 587
+Message-Id: <1295319627-10604-1-git-send-email-alsroot@member.fsf.org>
+To: dextrose@lists.sugarlabs.org
+
+m 72f0694200feccd88646e21aadb1c5bde36e7ca3 Mon Sep 17 00:00:00 2001
+From: Aleksey Lim <alsroot@member.fsf.org>
+Date: Wed, 19 Jan 2011 18:47:58 +0000
+Subject: [PATCH sugar-toolkit] Report to the shell on errors
+
+---
+ src/sugar/Makefile.am | 1 +
+ src/sugar/activity/activityfactory.py | 10 +++-
+ src/sugar/activity/main.py | 4 +-
+ src/sugar/feedback.py | 103 +++++++++++++++++++++++++++++++++
+ 4 files changed, 115 insertions(+), 3 deletions(-)
+ create mode 100644 src/sugar/feedback.py
+
+diff --git a/src/sugar/Makefile.am b/src/sugar/Makefile.am
+index 236e337..9730a00 100644
+--- a/src/sugar/Makefile.am
++++ b/src/sugar/Makefile.am
+@@ -2,6 +2,7 @@ SUBDIRS = activity bundle graphics presence datastore
+
+ sugardir = $(pythondir)/sugar
+ sugar_PYTHON = \
++ feedback.py \
+ env.py \
+ network.py \
+ profile.py \
+diff --git a/src/sugar/activity/activityfactory.py b/src/sugar/activity/activityfactory.py
+index 6b4ba32..3e7a07f 100644
+--- a/src/sugar/activity/activityfactory.py
++++ b/src/sugar/activity/activityfactory.py
+@@ -23,6 +23,7 @@ the moment there is no reason to stabilize this API.
+
+ import logging
+
++import cjson
+ import dbus
+ import gobject
+
+@@ -274,7 +275,7 @@ class ActivityCreationHandler(gobject.GObject):
+
+ gobject.child_watch_add(child.pid,
+ _child_watch_cb,
+- (environment_dir, log_file,
++ (environment_dir, log_file, log_path,
+ self._handle.activity_id))
+
+ def _no_reply_handler(self, *args):
+@@ -338,7 +339,7 @@ def create_with_object_id(bundle, object_id):
+ def _child_watch_cb(pid, condition, user_data):
+ # FIXME we use standalone method here instead of ActivityCreationHandler's
+ # member to have workaround code, see #1123
+- environment_dir, log_file, activity_id = user_data
++ environment_dir, log_file, log_path, activity_id = user_data
+ if environment_dir is not None:
+ subprocess.call(['/bin/rm', '-rf', environment_dir])
+
+@@ -381,6 +382,11 @@ def _child_watch_cb(pid, condition, user_data):
+ def error_handler_cb(error):
+ logging.error('Cannot send NotifyLaunchFailure to the shell')
+
++ report = cjson.encode({'failed_exit': 1})
++ shell.Feedback(activity_id, report, log_path,
++ reply_handler=reply_handler_cb,
++ error_handler=error_handler_cb)
++
+ # TODO send launching failure but activity could already show
+ # main window, see http://bugs.sugarlabs.org/ticket/1447#comment:19
+ shell.NotifyLaunchFailure(activity_id,
+diff --git a/src/sugar/activity/main.py b/src/sugar/activity/main.py
+index 0647e81..f502893 100644
+--- a/src/sugar/activity/main.py
++++ b/src/sugar/activity/main.py
+@@ -30,7 +30,7 @@ from sugar.activity import activityhandle
+ from sugar.activity import i18n
+ from sugar.bundle.activitybundle import ActivityBundle
+ from sugar.graphics import style
+-from sugar import logger
++from sugar import logger, feedback
+
+
+ def create_activity_instance(constructor, handle):
+@@ -110,6 +110,8 @@ def main():
+ gettext.bindtextdomain('sugar-toolkit', sugar.locale_path)
+ gettext.textdomain(bundle.get_bundle_id())
+
++ feedback.start(options.activity_id)
++
+ splitted_module = args[0].rsplit('.', 1)
+ module_name = splitted_module[0]
+ class_name = splitted_module[1]
+diff --git a/src/sugar/feedback.py b/src/sugar/feedback.py
+new file mode 100644
+index 0000000..56dacab
+--- /dev/null
++++ b/src/sugar/feedback.py
+@@ -0,0 +1,103 @@
++# Copyright (C) 2011, Aleksey Lim
++#
++# 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, see <http://www.gnu.org/licenses/>.
++
++import os
++import sys
++import atexit
++import logging
++
++import dbus
++import cjson
++
++
++_SHELL_SERVICE = "org.laptop.Shell"
++_SHELL_PATH = "/org/laptop/Shell"
++_SHELL_IFACE = "org.laptop.Shell"
++
++_report = {}
++_need_log = False
++_log_formatter = None
++
++
++def start(activity_id, log_path=None):
++ if log_path is None:
++ # TODO more portable solution
++ stdout_file = os.readlink('/proc/self/fd/%s' % sys.stdout.fileno())
++ if os.path.isfile(stdout_file):
++ log_path = stdout_file
++ else:
++ log_path = ''
++
++ atexit.register(_send, activity_id, log_path)
++
++
++def trigger(key, need_log=False):
++ global _need_log
++
++ if key not in _report:
++ _report[key] = 0
++ _report[key] += 1
++ _need_log = _need_log or need_log
++
++ logging.debug('Feedback[%s] == %s', key, _report[key])
++
++
++def flush():
++ global _report
++ global _need_log
++
++ report = _report
++ need_log = _need_log
++ _report = {}
++ _need_log = False
++
++ return report, need_log
++
++
++def _send(activity_id, log_path):
++ if not _report:
++ return
++
++ report, need_log = flush()
++
++ bus = dbus.SessionBus()
++ bus_object = bus.get_object(_SHELL_SERVICE, _SHELL_PATH)
++ shell = dbus.Interface(bus_object, _SHELL_IFACE)
++ shell.Feedback(activity_id, cjson.encode(report),
++ log_path if need_log else '')
++
++
++def _excepthook(exctype, value, tb):
++ global _log_formatter
++
++ if _log_formatter is None:
++ try:
++ # Attempt to provide verbose IPython tracebacks.
++ # Importing IPython is slow, so we import it lazily.
++ from IPython.ultraTB import AutoFormattedTB
++ formatter = AutoFormattedTB(mode='Verbose', color_scheme='NoColor')
++ _log_formatter = formatter.text
++ except ImportError:
++ import traceback
++ _log_formatter = \
++ lambda * args: ''.join(traceback.format_exception(*args))
++
++ message = _log_formatter(exctype, value, tb)
++ logging.error(message)
++
++ trigger('unhandled_exception', need_log=True)
++
++
++sys.excepthook = _excepthook
+--
+1.7.3.4
+
diff --git a/rpms/sugar-toolkit/sugar-toolkit.spec b/rpms/sugar-toolkit/sugar-toolkit.spec
index b74bf52..50e3102 100644
--- a/rpms/sugar-toolkit/sugar-toolkit.spec
+++ b/rpms/sugar-toolkit/sugar-toolkit.spec
@@ -3,7 +3,7 @@
Summary: Sugar toolkit
Name: sugar-toolkit
Version: 0.88.1
-Release: 4.12dxo%{?dist}
+Release: 4.13dxo%{?dist}
URL: http://wiki.laptop.org/go/Sugar
Source0: http://download.sugarlabs.org/sources/sucrose/glucose/%{name}/%{name}-%{version}.tar.bz2
Source1: macros.sugar
@@ -49,6 +49,9 @@ patch702: sugar-toolkit-2-4-Do-not-break-if-the-string-contains-no-conversion-sp
patch703: sugar-toolkit-3-4-bundlebuilder-install-mimetypes.xml-and-associated-icon-2262.patch
patch704: sugar-toolkit-4-4-XoColor-don-t-choke-if-passed-the-wrong-type-SL-1408.patch
+#Auto-feedback feature related changes
+patch801: sugar-toolkit-Report-to-the-shell-on-errors.patch
+
License: LGPLv2+
Group: System Environment/Libraries
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -114,6 +117,8 @@ to interact with system services like presence and the datastore.
%patch703 -p1
%patch704 -p1
+%patch801 -p1
+
%build
%configure
make %{?_smp_mflags} V=1
@@ -141,7 +146,10 @@ rm -rf %{buildroot}
%{_sysconfdir}/rpm/macros.sugar
%changelog
-* Thu Jan 17 2011 Anish Mangal <anish@sugarlabs.org> - 0.88.1-4.12
+* Wed Jan 19 2011 Anish Mangal <anish@sugarlabs.org> - 0.88.1-4.13
+- Added auto-feedback feature related changes
+
+* Mon Jan 17 2011 Anish Mangal <anish@sugarlabs.org> - 0.88.1-4.12
- 0.90 fixes backported
* Mon Jan 14 2011 Anish Mangal <anish@sugarlabs.org> - 0.88.1-4.11
diff --git a/rpms/sugar/sugar-1-2-Two-kinds-of-feedback-submits.patch b/rpms/sugar/sugar-1-2-Two-kinds-of-feedback-submits.patch
new file mode 100644
index 0000000..66cd383
--- /dev/null
+++ b/rpms/sugar/sugar-1-2-Two-kinds-of-feedback-submits.patch
@@ -0,0 +1,266 @@
+From patchwork Tue Jan 18 02:53:44 2011
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [sugar,1/2] Two kinds of feedback submits
+Date: Tue, 18 Jan 2011 07:53:44 -0000
+From: Aleksey Lim <alsroot@member.fsf.org>
+X-Patchwork-Id: 585
+Message-Id: <1295319225-10211-1-git-send-email-alsroot@member.fsf.org>
+To: dextrose@lists.sugarlabs.org
+
+---
+ extensions/deviceicon/feedback.py | 214 +++++++++++++++++++++++--------------
+ 1 files changed, 132 insertions(+), 82 deletions(-)
+
+
+diff --git a/extensions/deviceicon/feedback.py b/extensions/deviceicon/feedback.py
+index 2a0075e..add633c 100644
+--- a/extensions/deviceicon/feedback.py
++++ b/extensions/deviceicon/feedback.py
+@@ -16,113 +16,163 @@
+
+ import logging
+ from gettext import gettext as _
++
+ import gconf
+ import gtk
++
++from sugar import profile
+ from sugar.graphics import style
++from sugar.graphics.icon import Icon
+ from sugar.graphics.tray import TrayIcon
+ from sugar.graphics.palette import Palette
+-from sugar.graphics.xocolor import XoColor
++from sugar.graphics.menuitem import MenuItem
++from sugar.graphics.toolbutton import ToolButton
++
+ from jarabe.model import feedback_collector
+-from jarabe.view import launcher
+-from sugar.activity import activityfactory
+-from jarabe.model import bundleregistry
+-from sugar.activity.activityhandle import ActivityHandle
++
+
+ _ICON_NAME = 'feedback-icon'
+
++
+ class DeviceView(TrayIcon):
++
+ FRAME_POSITION_RELATIVE = 100
++
+ def __init__(self):
+- client = gconf.client_get_default()
+- self._color = XoColor(client.get_string('/desktop/sugar/user/color'))
+- TrayIcon.__init__(self, icon_name=_ICON_NAME, xo_color=self._color)
++ TrayIcon.__init__(self, icon_name=_ICON_NAME,
++ xo_color=profile.get_color())
+ self.create_palette()
+-
++
+ def create_palette(self):
+ logging.debug('palette created')
+- self.palette = BugsPalette(_('Bugs'))
++ self.palette = _Palette(_('Feedback'))
+ self.palette.set_group_id('frame')
+ return self.palette
+
+
+-class BugsPalette(Palette):
+-
++class _Palette(Palette):
++
+ def __init__(self, primary_text):
+ Palette.__init__(self, primary_text)
+- self._level = 0
+- self._status_label = gtk.Label()
+- self._status_label.show()
+- self.vbox = gtk.VBox()
+- self.hbox = gtk.HBox()
+- self.set_content(self.vbox)
+- self._bugs_count_text = gtk.Label()
+- self.vbox.pack_start(self._bugs_count_text,
+- padding = style.DEFAULT_PADDING)
+- self.vbox.pack_start(self.hbox, padding = style.DEFAULT_PADDING)
+- self.vbox.show()
+- self.hbox.pack_start(self._status_label,
+- padding = style.DEFAULT_PADDING)
+- self.hbox.show()
+- self._open_log_button = gtk.Button("Open Log")
+- self._open_log_button.connect("clicked",
+- self.__open_log_activity)
+- self.hbox.pack_start(self._open_log_button,
+- padding = style.DEFAULT_PADDING)
+- self._send_report_button = gtk.Button("Send Report")
+- self._send_report_button.connect("clicked", self.__send_bug_report)
+- self.hbox.pack_start(self._send_report_button,
+- padding = style.DEFAULT_PADDING)
+- self.__get_bug_count()
+- self._bugs_count_text.show()
+- self._open_log_button.show()
+- self._send_report_button.show()
+-
++
++ icon = Icon()
++ icon.set_from_icon_name('emblem-favorite', gtk.ICON_SIZE_MENU)
++ icon.props.xo_color = profile.get_color()
++
++ personalized = MenuItem(_('Personalized submit...'))
++ personalized.set_image(icon)
++ personalized.connect('activate', self.__personalized_activate_cb)
++ personalized.show()
++ self.menu.append(personalized)
++
++ self._anonymous = MenuItem(_('Anonymous submit'), 'emblem-favorite')
++ self._anonymous.connect('activate', self.__anonymous_activate_cb)
++ self._anonymous.show()
++ self.menu.append(self._anonymous)
++
+ def popup(self, immediate=False, state=None):
++ self._anonymous.set_sensitive(not feedback_collector.is_empty())
+ Palette.popup(self, immediate=immediate, state=state)
+- self.__update_bug_palette()
+-
+-
+- def __send_bug_report(self, button):
+- feedback_collector.submit()
+-
+- def __open_log_activity(self, path):
+-
+- registry = bundleregistry.get_registry()
+- bundle = registry.get_bundle('org.laptop.Log')
+- activity_id = activityfactory.create_activity_id()
+- client = gconf.client_get_default()
+- xo_color = XoColor(client.get_string('/desktop/sugar/user/color'))
+- launcher.add_launcher(activity_id, bundle.get_icon(), xo_color)
+- activityfactory.create(bundle, ActivityHandle(activity_id))
+-
+- def __get_bug_count(self):
+- """This method returns the total error count"""
+- bugs_count = 0
+-
+-
+- return bugs_count
+-
+- def __update_bug_palette(self):
+- bugs_count = self.__get_bug_count()
+- self._open_log_button.set_sensitive(False)
+- have_reports, have_errors = feedback_collector.stat()
+- #have_reports, have_errors=[True,False]
+- if have_errors:
+- self._open_log_button.set_sensitive(True)
++
++ def __anonymous_activate_cb(self, button):
++ feedback_collector.anonymous_submit()
++
++ def __personalized_activate_cb(self, button):
++ window = _Window()
++ window.show()
++
++
++class _Window(gtk.Window):
++
++ __gtype_name__ = 'FeedbackWindow'
++
++ def __init__(self):
++ gtk.Window.__init__(self)
++
++ self.set_border_width(style.LINE_WIDTH)
++ offset = style.GRID_CELL_SIZE
++ width = gtk.gdk.screen_width() - offset * 2
++ height = gtk.gdk.screen_height() - offset * 2
++ 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)
++
++ canvas = gtk.VBox()
++ self.add(canvas)
++
++ self._toolbar = gtk.Toolbar()
++ canvas.pack_start(self._toolbar, False)
++
++ icon = Icon()
++ icon.set_from_icon_name('emblem-favorite', gtk.ICON_SIZE_LARGE_TOOLBAR)
++ icon.props.xo_color = profile.get_color()
++ self._add_widget(icon)
++
++ self._add_separator(False)
++
++ title = gtk.Label(_('Submit feedback with contact infromation'))
++ self._add_widget(title)
++
++ self._add_separator(True)
++
++ submit = ToolButton('dialog-ok', tooltip=_('Submit'))
++ submit.connect('clicked', lambda button: self._submit())
++ self._toolbar.insert(submit, -1)
++
++ cancel = ToolButton('dialog-cancel', tooltip=_('Cancel'))
++ cancel.connect('clicked', lambda button: self.destroy())
++ self._toolbar.insert(cancel, -1)
++
++ bg = gtk.EventBox()
++ bg.modify_bg(gtk.STATE_NORMAL, style.COLOR_WHITE.get_gdk_color())
++ canvas.pack_start(bg)
++
++ self._message = gtk.TextView()
++ scrolled = gtk.ScrolledWindow()
++ scrolled.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
++ scrolled.set_border_width(style.DEFAULT_PADDING)
++ scrolled.add(self._message)
++ bg.add(scrolled)
++
++ self.show_all()
++ self.set_focus(self._message)
++
++ self.connect("realize", self.__realize_cb)
++
++ def do_key_press_event(self, event):
++ if event.keyval == gtk.keysyms.Escape:
++ self.destroy()
++ elif event.keyval == gtk.keysyms.Return and \
++ event.state & gtk.gdk.CONTROL_MASK:
++ self._submit()
+ else:
+- self._open_log_button.set_sensitive(False)
+-
+-
+- if have_reports:
+- self._send_report_button.set_sensitive(True)
++ gtk.Window.do_key_press_event(self, event)
++
++ def _add_widget(self, widget):
++ tool_item = gtk.ToolItem()
++ tool_item.add(widget)
++ self._toolbar.insert(tool_item, -1)
++
++ def _add_separator(self, expand):
++ separator = gtk.SeparatorToolItem()
++ separator.props.draw = False
++ if expand:
++ separator.set_expand(True)
+ else:
+- self._send_report_button.set_sensitive(False)
+-
+- if bugs_count == 0:
+- self._bugs_count_text.set_label('No Errors')
+- else :
+- self._bugs_count_text.set_label(_('Total Errors: %d' % bugs_count))
+-
++ separator.set_size_request(style.DEFAULT_SPACING, -1)
++ self._toolbar.insert(separator, -1)
++
++ def _submit(self):
++ feedback_collector.submit(self._message.props.buffer.props.text)
++ self.destroy()
++
++ def __realize_cb(self, widget):
++ self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
++ self.window.set_accept_focus(True)
++
++
+ def setup(tray):
+ client = gconf.client_get_default()
+ if client.get_bool('/desktop/sugar/feedback/enabled'):
diff --git a/rpms/sugar/sugar-2-2-Initial-client-implementation-for-feedback-feature.patch b/rpms/sugar/sugar-2-2-Initial-client-implementation-for-feedback-feature.patch
new file mode 100644
index 0000000..6a44665
--- /dev/null
+++ b/rpms/sugar/sugar-2-2-Initial-client-implementation-for-feedback-feature.patch
@@ -0,0 +1,383 @@
+From patchwork Tue Jan 18 02:53:45 2011
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [sugar,2/2] Initial client implementation for feedback feature
+Date: Tue, 18 Jan 2011 07:53:45 -0000
+From: Aleksey Lim <alsroot@member.fsf.org>
+X-Patchwork-Id: 584
+Message-Id: <1295319225-10211-2-git-send-email-alsroot@member.fsf.org>
+To: dextrose@lists.sugarlabs.org
+
+---
+ bin/sugar-session | 8 +-
+ data/sugar.schemas.in | 44 +++++++
+ src/jarabe/model/Makefile.am | 1 +
+ src/jarabe/model/feedback_collector.py | 201 ++++++++++++++++++++++++++++++++
+ src/jarabe/model/shell.py | 16 +++
+ src/jarabe/view/service.py | 5 +
+ 6 files changed, 274 insertions(+), 1 deletions(-)
+ create mode 100644 src/jarabe/model/feedback_collector.py
+
+
+diff --git a/bin/sugar-session b/bin/sugar-session
+index 0501311..d4362ef 100755
+--- a/bin/sugar-session
++++ b/bin/sugar-session
+@@ -229,7 +229,7 @@ def main():
+ gettext.textdomain('sugar')
+
+ from jarabe.desktop import homewindow
+- from jarabe.model import sound
++ from jarabe.model import sound, feedback_collector
+ from jarabe import intro
+
+ logger.start('shell')
+@@ -238,6 +238,12 @@ def main():
+ client.set_string('/apps/metacity/general/mouse_button_modifier',
+ '<Super>')
+
++ if client.get_bool('/desktop/sugar/feedback/enabled'):
++ feedback_collector.start(
++ client.get_string('/desktop/sugar/feedback/server_host'),
++ client.get_int('/desktop/sugar/feedback/server_port'),
++ client.get_int('/desktop/sugar/feedback/auto_submit_delay'))
++
+ timezone = client.get_string('/desktop/sugar/date/timezone')
+ if timezone is not None and timezone:
+ os.environ['TZ'] = timezone
+diff --git a/data/sugar.schemas.in b/data/sugar.schemas.in
+index a3817e9..880c9d1 100644
+--- a/data/sugar.schemas.in
++++ b/data/sugar.schemas.in
+@@ -2,6 +2,50 @@
+ <gconfschemafile>
+ <schemalist>
+ <schema>
++ <key>/schemas/desktop/sugar/feedback/enabled</key>
++ <applyto>/desktop/sugar/feedback/enabled</applyto>
++ <owner>sugar</owner>
++ <type>bool</type>
++ <default>false</default>
++ <locale name="C">
++ <short>Enable of disable feedback feature</short>
++ <long>Setting value to false will disable any feedback reports.</long>
++ </locale>
++ </schema>
++ <schema>
++ <key>/schemas/desktop/sugar/feedback/server_host</key>
++ <applyto>/desktop/sugar/feedback/server_host</applyto>
++ <owner>sugar</owner>
++ <type>string</type>
++ <default>feedback.sugarlabs.org</default>
++ <locale name="C">
++ <short>Server host to send reports to</short>
++ <long>Server that will handle reports sent via HTTPS POST requests.</long>
++ </locale>
++ </schema>
++ <schema>
++ <key>/schemas/desktop/sugar/feedback/server_port</key>
++ <applyto>/desktop/sugar/feedback/server_port</applyto>
++ <owner>sugar</owner>
++ <type>int</type>
++ <default>80</default>
++ <locale name="C">
++ <short>Server port to send reports to</short>
++ <long>TCP port that will used to send HTTPS POST requests.</long>
++ </locale>
++ </schema>
++ <schema>
++ <key>/schemas/desktop/sugar/feedback/auto_submit_delay</key>
++ <applyto>/desktop/sugar/feedback/auto_submit_delay</applyto>
++ <owner>sugar</owner>
++ <type>int</type>
++ <default>0</default>
++ <locale name="C">
++ <short>Delay in seconds to send anonymous reports automatically</short>
++ <long>Setting value to 0 will disable automatic submiting.</long>
++ </locale>
++ </schema>
++ <schema>
+ <key>/schemas/desktop/sugar/user/nick</key>
+ <applyto>/desktop/sugar/user/nick</applyto>
+ <owner>sugar</owner>
+diff --git a/src/jarabe/model/Makefile.am b/src/jarabe/model/Makefile.am
+index 374d6fc..c221e86 100644
+--- a/src/jarabe/model/Makefile.am
++++ b/src/jarabe/model/Makefile.am
+@@ -19,4 +19,5 @@ sugar_PYTHON = \
+ session.py \
+ sound.py \
+ processmanagement.py \
++ feedback_collector.py \
+ virtualkeyboard.py
+diff --git a/src/jarabe/model/feedback_collector.py b/src/jarabe/model/feedback_collector.py
+new file mode 100644
+index 0000000..c0deae2
+--- /dev/null
++++ b/src/jarabe/model/feedback_collector.py
+@@ -0,0 +1,201 @@
++# Copyright (C) 2011, Aleksey Lim
++#
++# 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, see <http://www.gnu.org/licenses/>.
++
++import os
++import time
++import httplib
++import logging
++import tarfile
++import threading
++from cStringIO import StringIO
++from os.path import join, exists, basename
++from email.mime.multipart import MIMEMultipart
++from email.mime.application import MIMEApplication
++from email.generator import Generator
++from email.encoders import encode_noop
++
++import gconf
++import gobject
++import simplejson
++
++from sugar import logger, feedback, util
++
++
++_reports = {}
++_logs = set()
++_host = None
++_port = None
++
++
++def start(host, port, auto_submit_delay):
++ global _host
++ global _port
++
++ _host = host
++ _port = port
++
++ if auto_submit_delay > 0:
++ gobject.timeout_add_seconds(auto_submit_delay, _submit)
++
++
++def update(bundle_id, report, log_file):
++ if bundle_id not in _reports:
++ _reports[bundle_id] = {}
++ stat = _reports[bundle_id]
++
++ for key, count in report.items():
++ if key not in stat:
++ stat[key] = 0
++ stat[key] += count
++
++ if log_file:
++ _logs.add(log_file)
++
++
++def is_empty():
++ report, shell_log = feedback.flush()
++ if report:
++ if shell_log:
++ shell_log = join(logger.get_logs_dir(), 'shell.log')
++ update('shell', report, shell_log)
++
++ return not _reports
++
++
++def submit(message):
++ from jarabe.journal import misc
++
++ client = gconf.client_get_default()
++ jabber = client.get_string('/desktop/sugar/collaboration/jabber_server')
++ nick = client.get_string("/desktop/sugar/user/nick")
++
++ data = {'message': message,
++ 'serial_number': misc.get_xo_serial(),
++ 'nick': nick,
++ 'jabber_server': jabber,
++ }
++ _submit(data)
++
++
++def anonymous_submit():
++ _submit()
++
++
++def _submit(data=None):
++ if data:
++ _reports.update(data)
++ if is_empty():
++ return True
++
++ logging.debug('Sending feedback report: %r', _reports)
++
++ report = simplejson.dumps(_reports)
++ _reports.clear()
++
++ tar_file = util.TempFilePath()
++ tar = tarfile.open(tar_file, 'w:gz')
++
++ while _logs:
++ log_file = _logs.pop()
++ if exists(log_file):
++ tar.add(log_file, arcname=basename(log_file))
++
++ report_file = tarfile.TarInfo('report')
++ report_file.mode = 0644
++ report_file.mtime = int(time.time())
++ report_file.size = len(report)
++ tar.addfile(report_file, StringIO(report))
++
++ tar.close()
++
++ _SubmitThread(tar_file).run()
++
++ return True
++
++
++class _SubmitThread(threading.Thread):
++
++ def __init__(self, tar_file):
++ threading.Thread.__init__(self)
++ self._tar_file = tar_file
++
++ def run(self):
++ try:
++ message = _FormData()
++ attachment = MIMEApplication(file(self._tar_file).read(),
++ _encoder=encode_noop)
++ message.attach_file(attachment,
++ name='report', filename='report.tar.gz')
++ body, headers = message.get_request_data()
++
++ conn = httplib.HTTPSConnection(_host, _port)
++ conn.request('POST', '/', body, headers)
++ response = conn.getresponse()
++
++ if response.status != 200:
++ logging.error('Incorrect feedback submit: %s, %s',
++ response.status, response.read())
++
++ except Exception:
++ logging.exception('Cannot submit feedback')
++ finally:
++ os.unlink(self._tar_file)
++ self._tar_file = None
++
++
++class _FormData(MIMEMultipart):
++ '''A simple RFC2388 multipart/form-data implementation.
++
++ A snippet from http://bugs.python.org/issue3244
++
++ '''
++
++ def __init__(self, boundary=None, _subparts=None, **kwargs):
++ MIMEMultipart.__init__(self, _subtype='form-data',
++ boundary=boundary, _subparts=_subparts, **kwargs)
++
++ def attach(self, subpart):
++ if 'MIME-Version' in subpart:
++ if subpart['MIME-Version'] != self['MIME-Version']:
++ raise ValueError('subpart has incompatible MIME-Version')
++ # Note: This isn't strictly necessary, but there is no point in
++ # including a MIME-Version header in each subpart.
++ del subpart['MIME-Version']
++ MIMEMultipart.attach(self, subpart)
++
++ def attach_file(self, subpart, name, filename):
++ '''
++ Attach a subpart, setting it's Content-Disposition header to "file".
++ '''
++ name = name.replace('"', '\\"')
++ filename = filename.replace('"', '\\"')
++ subpart['Content-Disposition'] = \
++ 'form-data; name="%s"; filename="%s"' % (name, filename)
++ self.attach(subpart)
++
++ def get_request_data(self, trailing_newline=True):
++ '''Return the encoded message body.'''
++ f = StringIO()
++ generator = Generator(f, mangle_from_=False)
++ # pylint: disable-msg=W0212
++ generator._dispatch(self)
++ # HTTP needs a trailing newline. Since our return value is likely to
++ # be passed directly to an HTTP connection, we might as well add it
++ # here.
++ if trailing_newline:
++ f.write('\n')
++ body = f.getvalue()
++ headers = dict(self)
++ return body, headers
+diff --git a/src/jarabe/model/shell.py b/src/jarabe/model/shell.py
+index 69b45e2..b9cb0c2 100644
+--- a/src/jarabe/model/shell.py
++++ b/src/jarabe/model/shell.py
+@@ -23,12 +23,14 @@ import wnck
+ import gobject
+ import gtk
+ import dbus
++import simplejson
+
+ from sugar import wm
+ from sugar import dispatch
+ from sugar.graphics.xocolor import XoColor
+ from sugar.presence import presenceservice
+
++from jarabe.model import feedback_collector
+ from jarabe.model.bundleregistry import get_registry
+
+ _SERVICE_NAME = "org.laptop.Activity"
+@@ -220,6 +222,12 @@ class Activity(gobject.GObject):
+ else:
+ return self._activity_info.get_path()
+
++ def get_bundle_id(self):
++ if self._activity_info is None:
++ return None
++ else:
++ return self._activity_info.get_bundle_id()
++
+ def get_activity_name(self):
+ """Returns the activity's bundle name"""
+ if self._activity_info is None:
+@@ -618,6 +626,14 @@ class ShellModel(gobject.GObject):
+ logging.error('Model for activity id %s does not exist.',
+ activity_id)
+
++ def notify_feedback(self, activity_id, report, log_file):
++ home_activity = self.get_activity_by_id(activity_id)
++ if home_activity is not None:
++ feedback_collector.update(home_activity.get_bundle_id(),
++ simplejson.loads(report), log_file)
++ else:
++ logging.error('No %s activity for sending feedback', activity_id)
++
+ def _check_activity_launched(self, activity_id):
+ home_activity = self.get_activity_by_id(activity_id)
+
+diff --git a/src/jarabe/view/service.py b/src/jarabe/view/service.py
+index bb71694..a576eb9 100644
+--- a/src/jarabe/view/service.py
++++ b/src/jarabe/view/service.py
+@@ -97,6 +97,11 @@ class UIService(dbus.service.Object):
+ def NotifyLaunchFailure(self, activity_id):
+ shell.get_model().notify_launch_failed(activity_id)
+
++ @dbus.service.method(_DBUS_SHELL_IFACE,
++ in_signature="sss", out_signature="")
++ def Feedback(self, activity_id, report, log_file):
++ shell.get_model().notify_feedback(activity_id, report, log_file)
++
+ @dbus.service.signal(_DBUS_OWNER_IFACE, signature="s")
+ def ColorChanged(self, color):
+ pass
diff --git a/rpms/sugar/sugar-Patch-to-add-feedback-icon-to-frame.patch b/rpms/sugar/sugar-Patch-to-add-feedback-icon-to-frame.patch
new file mode 100644
index 0000000..5cf3625
--- /dev/null
+++ b/rpms/sugar/sugar-Patch-to-add-feedback-icon-to-frame.patch
@@ -0,0 +1,169 @@
+From patchwork Tue Jan 18 02:54:15 2011
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [sugar] Patch to add feedback icon to frame
+Date: Tue, 18 Jan 2011 07:54:15 -0000
+From: Aleksey Lim <alsroot@member.fsf.org>
+X-Patchwork-Id: 586
+Message-Id: <1295319255-10250-1-git-send-email-alsroot@member.fsf.org>
+To: dextrose@lists.sugarlabs.org
+Cc: Mukesh Gupta <mukeshgupta.2006@gmail.com>
+
+From: Mukesh Gupta <mukeshgupta.2006@gmail.com>
+
+Signed-off-by: Mukesh Gupta <mukeshgupta.2006@gmail.com>
+
+---
+extensions/deviceicon/Makefile.am | 4 +-
+ extensions/deviceicon/feedback.py | 129 +++++++++++++++++++++++++++++++++++++
+ 2 files changed, 132 insertions(+), 1 deletions(-)
+ create mode 100644 extensions/deviceicon/feedback.py
+
+diff --git a/extensions/deviceicon/Makefile.am b/extensions/deviceicon/Makefile.am
+index 3a74053..b38cbb3 100644
+--- a/extensions/deviceicon/Makefile.am
++++ b/extensions/deviceicon/Makefile.am
+@@ -8,4 +8,6 @@ sugar_PYTHON = \
+ speaker.py \
+ touchpad.py \
+ virtualkeyboard.py \
+- volume.py
++ volume.py \
++ feedback.py
++
+diff --git a/extensions/deviceicon/feedback.py b/extensions/deviceicon/feedback.py
+new file mode 100644
+index 0000000..2a0075e
+--- /dev/null
++++ b/extensions/deviceicon/feedback.py
+@@ -0,0 +1,129 @@
++# Copyright (C) Mukesh Gupta <mukeshgupta.2006@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
++
++import logging
++from gettext import gettext as _
++import gconf
++import gtk
++from sugar.graphics import style
++from sugar.graphics.tray import TrayIcon
++from sugar.graphics.palette import Palette
++from sugar.graphics.xocolor import XoColor
++from jarabe.model import feedback_collector
++from jarabe.view import launcher
++from sugar.activity import activityfactory
++from jarabe.model import bundleregistry
++from sugar.activity.activityhandle import ActivityHandle
++
++_ICON_NAME = 'feedback-icon'
++
++class DeviceView(TrayIcon):
++ FRAME_POSITION_RELATIVE = 100
++ def __init__(self):
++ client = gconf.client_get_default()
++ self._color = XoColor(client.get_string('/desktop/sugar/user/color'))
++ TrayIcon.__init__(self, icon_name=_ICON_NAME, xo_color=self._color)
++ self.create_palette()
++
++ def create_palette(self):
++ logging.debug('palette created')
++ self.palette = BugsPalette(_('Bugs'))
++ self.palette.set_group_id('frame')
++ return self.palette
++
++
++class BugsPalette(Palette):
++
++ def __init__(self, primary_text):
++ Palette.__init__(self, primary_text)
++ self._level = 0
++ self._status_label = gtk.Label()
++ self._status_label.show()
++ self.vbox = gtk.VBox()
++ self.hbox = gtk.HBox()
++ self.set_content(self.vbox)
++ self._bugs_count_text = gtk.Label()
++ self.vbox.pack_start(self._bugs_count_text,
++ padding = style.DEFAULT_PADDING)
++ self.vbox.pack_start(self.hbox, padding = style.DEFAULT_PADDING)
++ self.vbox.show()
++ self.hbox.pack_start(self._status_label,
++ padding = style.DEFAULT_PADDING)
++ self.hbox.show()
++ self._open_log_button = gtk.Button("Open Log")
++ self._open_log_button.connect("clicked",
++ self.__open_log_activity)
++ self.hbox.pack_start(self._open_log_button,
++ padding = style.DEFAULT_PADDING)
++ self._send_report_button = gtk.Button("Send Report")
++ self._send_report_button.connect("clicked", self.__send_bug_report)
++ self.hbox.pack_start(self._send_report_button,
++ padding = style.DEFAULT_PADDING)
++ self.__get_bug_count()
++ self._bugs_count_text.show()
++ self._open_log_button.show()
++ self._send_report_button.show()
++
++ def popup(self, immediate=False, state=None):
++ Palette.popup(self, immediate=immediate, state=state)
++ self.__update_bug_palette()
++
++
++ def __send_bug_report(self, button):
++ feedback_collector.submit()
++
++ def __open_log_activity(self, path):
++
++ registry = bundleregistry.get_registry()
++ bundle = registry.get_bundle('org.laptop.Log')
++ activity_id = activityfactory.create_activity_id()
++ client = gconf.client_get_default()
++ xo_color = XoColor(client.get_string('/desktop/sugar/user/color'))
++ launcher.add_launcher(activity_id, bundle.get_icon(), xo_color)
++ activityfactory.create(bundle, ActivityHandle(activity_id))
++
++ def __get_bug_count(self):
++ """This method returns the total error count"""
++ bugs_count = 0
++
++
++ return bugs_count
++
++ def __update_bug_palette(self):
++ bugs_count = self.__get_bug_count()
++ self._open_log_button.set_sensitive(False)
++ have_reports, have_errors = feedback_collector.stat()
++ #have_reports, have_errors=[True,False]
++ if have_errors:
++ self._open_log_button.set_sensitive(True)
++ else:
++ self._open_log_button.set_sensitive(False)
++
++
++ if have_reports:
++ self._send_report_button.set_sensitive(True)
++ else:
++ self._send_report_button.set_sensitive(False)
++
++ if bugs_count == 0:
++ self._bugs_count_text.set_label('No Errors')
++ else :
++ self._bugs_count_text.set_label(_('Total Errors: %d' % bugs_count))
++
++def setup(tray):
++ client = gconf.client_get_default()
++ if client.get_bool('/desktop/sugar/feedback/enabled'):
++ tray.add_device(DeviceView())
diff --git a/rpms/sugar/sugar.spec b/rpms/sugar/sugar.spec
index 14d001d..ad075b2 100644
--- a/rpms/sugar/sugar.spec
+++ b/rpms/sugar/sugar.spec
@@ -3,7 +3,7 @@
Summary: Constructionist learning platform
Name: sugar
Version: 0.88.1
-Release: 5.45dxo%{?dist}
+Release: 5.46dxo%{?dist}
URL: http://sugarlabs.org/
Source0: http://download.sugarlabs.org/sources/sucrose/glucose/%{name}/%{name}-%{version}.tar.bz2
@@ -123,6 +123,11 @@ patch1509: sugar-09-11-datastore.write-expects-a-DSObject-not-an-id.patch
patch1510: sugar-10-11-Fix-more-sugar.datastore-breakage.patch
patch1511: sugar-11-11-fix-journal-scan-of-external-media-dev.laptop.org-10140.patch
+#Auto-feedback feature
+patch1601: sugar-Patch-to-add-feedback-icon-to-frame.patch
+patch1602: sugar-1-2-Two-kinds-of-feedback-submits.patch
+patch1603: sugar-2-2-Initial-client-implementation-for-feedback-feature.patch
+
License: GPLv2+
Group: User Interface/Desktops
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -291,6 +296,10 @@ multiple instances of sugar.
%patch1510 -p1
%patch1511 -p1
+%patch1601 -p1
+%patch1602 -p1
+%patch1603 -p1
+
%build
autoreconf
%configure
@@ -367,6 +376,9 @@ rm -rf %{buildroot}
%{_datadir}/icons/hicolor/scalable/apps/sugar-xo.svg
%changelog
+* Wed Jan 19 2011 Anish Mangal <anish@sugarlabs.org> - 0.88.1-5.46
+- Incorporate auto-feedback feature
+
* Mon Jan 17 2011 Anish Mangal <anish@sugarlabs.org> - 0.88.1-5.45
- 0.90 bugfix backports