<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.sugarlabs.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wade</id>
	<title>Sugar Labs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.sugarlabs.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wade"/>
	<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/go/Special:Contributions/Wade"/>
	<updated>2026-06-10T11:31:24Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=53796</id>
		<title>Development Team/Sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=53796"/>
		<updated>2010-06-27T17:34:08Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Adding Pygame to a PyGTK activity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sugargame ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] &lt;br /&gt;
programs to run well under Sugar. &lt;br /&gt;
It is fork of the olcpgames framework, which is no longer maintained.&lt;br /&gt;
&lt;br /&gt;
http://git.sugarlabs.org/projects/sugargame&lt;br /&gt;
&lt;br /&gt;
What it does:&lt;br /&gt;
&lt;br /&gt;
* Wraps a Sugar activity around an existing Pygame program with few changes&lt;br /&gt;
* Allows Sugar toolbars and other widgets to be added to the activity UI&lt;br /&gt;
* Provides hooks for saving to and restoring from the Journal&lt;br /&gt;
&lt;br /&gt;
==== Differences between Sugargame and olpcgames ====&lt;br /&gt;
&lt;br /&gt;
The olpcgames framework provides a wrapper around Pygame which attempts to &lt;br /&gt;
allow a Pygame program to run mostly unmodified under Sugar.  To this end, &lt;br /&gt;
the Pygame program is run in a separate thread with its own Pygame message &lt;br /&gt;
loop while the main thread runs the GTK message loop.  Also, olpcgames wraps &lt;br /&gt;
Sugar APIs such as the journal and mesh into a Pygame-like API.&lt;br /&gt;
&lt;br /&gt;
Sugargame takes a simpler approach; it provides a way to embed Pygame into a &lt;br /&gt;
GTK widget.  The Sugar APIs are used to interact with Sugar, the Pygame APIs &lt;br /&gt;
are used for the game.  &lt;br /&gt;
&lt;br /&gt;
Sugargame advantages:&lt;br /&gt;
&lt;br /&gt;
* Simpler code&lt;br /&gt;
* More elegant interface between Pygame and GTK&lt;br /&gt;
* Runs as a single thread: no thread related segfaults&lt;br /&gt;
* Possible to use Sugar widgets with Pygame&lt;br /&gt;
&lt;br /&gt;
Sugargame limitations:&lt;br /&gt;
&lt;br /&gt;
* No support for Pango or SVG sprites (yet)&lt;br /&gt;
&lt;br /&gt;
== Using Sugargame ==&lt;br /&gt;
&lt;br /&gt;
See also [[Development Team/Sugargame/Examples]].&lt;br /&gt;
&lt;br /&gt;
==== Wrapping a Pygame program ====&lt;br /&gt;
&lt;br /&gt;
To use Sugargame to Sugarize a Pygame program, set up an activity directory and &lt;br /&gt;
copy the Sugargame package to it.&lt;br /&gt;
&lt;br /&gt;
The activity directory should look something like this:&lt;br /&gt;
 &lt;br /&gt;
   activity/            - Activity directory: activity.info, SVG icon, etc.&lt;br /&gt;
   sugargame/           - Sugargame package&lt;br /&gt;
   MyActivity.py        - Activity class&lt;br /&gt;
   mygame.py            - Pygame code&lt;br /&gt;
   setup.py             - Install script&lt;br /&gt;
&lt;br /&gt;
To make the Activity class, start with test/TestActivity.py from the Sugargame &lt;br /&gt;
distribution.  &lt;br /&gt;
&lt;br /&gt;
The activity should create a single PygameCanvas widget and call run_pygame on it.  &lt;br /&gt;
Pass the main loop function of the Pygame program.&lt;br /&gt;
&lt;br /&gt;
 self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 self.set_canvas(self._canvas)&lt;br /&gt;
        &lt;br /&gt;
 # Start the game running.&lt;br /&gt;
 self._canvas.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
In your Pygame main loop, pump the GTK message loop:&lt;br /&gt;
&lt;br /&gt;
   while gtk.events_pending():&lt;br /&gt;
       gtk.main_iteration()&lt;br /&gt;
&lt;br /&gt;
==== Adding Pygame to a PyGTK activity ====&lt;br /&gt;
&lt;br /&gt;
To add Pygame to an existing Sugar activity, create a PygameCanvas widget and call &lt;br /&gt;
run_pygame on it.  &lt;br /&gt;
&lt;br /&gt;
 widget = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 vbox.pack_start(widget)&lt;br /&gt;
 &lt;br /&gt;
 widget.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
Due to limitations of Pygame and SDL, there can only be one PygameCanvas in the &lt;br /&gt;
entire activity.&lt;br /&gt;
&lt;br /&gt;
The argument to run_pygame is a function structured like a Pygame program.  In the &lt;br /&gt;
main loop, remember to dispatch GTK messages using gtk.main_iteration().&lt;br /&gt;
&lt;br /&gt;
 def main_loop():&lt;br /&gt;
        clock = pygame.time.Clock()&lt;br /&gt;
        screen = pygame.display.get_surface()&lt;br /&gt;
 &lt;br /&gt;
        while self.running:&lt;br /&gt;
            # Pump GTK messages.&lt;br /&gt;
            while gtk.events_pending():&lt;br /&gt;
                gtk.main_iteration()&lt;br /&gt;
 &lt;br /&gt;
            # Pump PyGame messages.&lt;br /&gt;
            for event in pygame.event.get():&lt;br /&gt;
                if event.type == pygame.QUIT:&lt;br /&gt;
                    return&lt;br /&gt;
                elif event.type == pygame.VIDEORESIZE:&lt;br /&gt;
                    pygame.display.set_mode(event.size, pygame.RESIZABLE)&lt;br /&gt;
 &lt;br /&gt;
            # Check the mouse position&lt;br /&gt;
            x, y = pygame.mouse.get_pos()&lt;br /&gt;
  &lt;br /&gt;
            # Clear Display&lt;br /&gt;
            screen.fill((255,255,255)) #255 for white&lt;br /&gt;
 &lt;br /&gt;
            # Draw stuff here&lt;br /&gt;
            .................&lt;br /&gt;
 &lt;br /&gt;
            # Flip Display&lt;br /&gt;
            pygame.display.flip()  &lt;br /&gt;
             &lt;br /&gt;
            # Try to stay at 30 FPS&lt;br /&gt;
            self.clock.tick(30)&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
&lt;br /&gt;
For help with Sugargame, please email the Sugar Labs development list:&lt;br /&gt;
&lt;br /&gt;
: sugar-devel@lists.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
Sugargame is developed by Wade Brainerd &amp;lt;wadetb@gmail.com&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
It is loosely based on the source code to the olpcgames framework, developed by &lt;br /&gt;
the One Laptop Per Child project.&lt;br /&gt;
&lt;br /&gt;
=== Changelog ===&lt;br /&gt;
&lt;br /&gt;
====v1.1====&lt;br /&gt;
* Fix bugs in event handling.  (Pablo Moleri)&lt;br /&gt;
* Remove reference to gtk.Socket.get_window() method, which is missing in older versions of PyGTK.&lt;br /&gt;
&lt;br /&gt;
====v1.0====&lt;br /&gt;
* Initial version of Sugargame&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=53795</id>
		<title>Development Team/Sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=53795"/>
		<updated>2010-06-27T17:32:48Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Changelog */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sugargame ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] &lt;br /&gt;
programs to run well under Sugar. &lt;br /&gt;
It is fork of the olcpgames framework, which is no longer maintained.&lt;br /&gt;
&lt;br /&gt;
http://git.sugarlabs.org/projects/sugargame&lt;br /&gt;
&lt;br /&gt;
What it does:&lt;br /&gt;
&lt;br /&gt;
* Wraps a Sugar activity around an existing Pygame program with few changes&lt;br /&gt;
* Allows Sugar toolbars and other widgets to be added to the activity UI&lt;br /&gt;
* Provides hooks for saving to and restoring from the Journal&lt;br /&gt;
&lt;br /&gt;
==== Differences between Sugargame and olpcgames ====&lt;br /&gt;
&lt;br /&gt;
The olpcgames framework provides a wrapper around Pygame which attempts to &lt;br /&gt;
allow a Pygame program to run mostly unmodified under Sugar.  To this end, &lt;br /&gt;
the Pygame program is run in a separate thread with its own Pygame message &lt;br /&gt;
loop while the main thread runs the GTK message loop.  Also, olpcgames wraps &lt;br /&gt;
Sugar APIs such as the journal and mesh into a Pygame-like API.&lt;br /&gt;
&lt;br /&gt;
Sugargame takes a simpler approach; it provides a way to embed Pygame into a &lt;br /&gt;
GTK widget.  The Sugar APIs are used to interact with Sugar, the Pygame APIs &lt;br /&gt;
are used for the game.  &lt;br /&gt;
&lt;br /&gt;
Sugargame advantages:&lt;br /&gt;
&lt;br /&gt;
* Simpler code&lt;br /&gt;
* More elegant interface between Pygame and GTK&lt;br /&gt;
* Runs as a single thread: no thread related segfaults&lt;br /&gt;
* Possible to use Sugar widgets with Pygame&lt;br /&gt;
&lt;br /&gt;
Sugargame limitations:&lt;br /&gt;
&lt;br /&gt;
* No support for Pango or SVG sprites (yet)&lt;br /&gt;
&lt;br /&gt;
== Using Sugargame ==&lt;br /&gt;
&lt;br /&gt;
See also [[Development Team/Sugargame/Examples]].&lt;br /&gt;
&lt;br /&gt;
==== Wrapping a Pygame program ====&lt;br /&gt;
&lt;br /&gt;
To use Sugargame to Sugarize a Pygame program, set up an activity directory and &lt;br /&gt;
copy the Sugargame package to it.&lt;br /&gt;
&lt;br /&gt;
The activity directory should look something like this:&lt;br /&gt;
 &lt;br /&gt;
   activity/            - Activity directory: activity.info, SVG icon, etc.&lt;br /&gt;
   sugargame/           - Sugargame package&lt;br /&gt;
   MyActivity.py        - Activity class&lt;br /&gt;
   mygame.py            - Pygame code&lt;br /&gt;
   setup.py             - Install script&lt;br /&gt;
&lt;br /&gt;
To make the Activity class, start with test/TestActivity.py from the Sugargame &lt;br /&gt;
distribution.  &lt;br /&gt;
&lt;br /&gt;
The activity should create a single PygameCanvas widget and call run_pygame on it.  &lt;br /&gt;
Pass the main loop function of the Pygame program.&lt;br /&gt;
&lt;br /&gt;
 self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 self.set_canvas(self._canvas)&lt;br /&gt;
        &lt;br /&gt;
 # Start the game running.&lt;br /&gt;
 self._canvas.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
In your Pygame main loop, pump the GTK message loop:&lt;br /&gt;
&lt;br /&gt;
   while gtk.events_pending():&lt;br /&gt;
       gtk.main_iteration()&lt;br /&gt;
&lt;br /&gt;
==== Adding Pygame to a PyGTK activity ====&lt;br /&gt;
&lt;br /&gt;
To add Pygame to an existing Sugar activity, create a PygameCanvas widget and call &lt;br /&gt;
run_pygame on it.  &lt;br /&gt;
&lt;br /&gt;
 widget = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 vbox.pack_start(widget)&lt;br /&gt;
 &lt;br /&gt;
 widget.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
Due to limitations of Pygame and SDL, there can only be one PygameCanvas in the &lt;br /&gt;
entire activity.&lt;br /&gt;
&lt;br /&gt;
The argument to run_pygame is a function structured like a Pygame program.  In the &lt;br /&gt;
main loop, remember to dispatch GTK messages using gtk.main_iteration().&lt;br /&gt;
&lt;br /&gt;
 def main_loop():&lt;br /&gt;
        clock = pygame.time.Clock()&lt;br /&gt;
        screen = pygame.display.get_surface()&lt;br /&gt;
 &lt;br /&gt;
        while self.running:&lt;br /&gt;
            # Pump GTK messages.&lt;br /&gt;
            while gtk.events_pending():&lt;br /&gt;
                gtk.main_iteration()&lt;br /&gt;
 &lt;br /&gt;
            # Pump PyGame messages.&lt;br /&gt;
            for event in pygame.event.get():&lt;br /&gt;
                if event.type == pygame.QUIT:&lt;br /&gt;
                    return&lt;br /&gt;
                elif event.type == pygame.VIDEORESIZE:&lt;br /&gt;
                    pygame.display.set_mode(event.size, pygame.RESIZABLE)&lt;br /&gt;
 &lt;br /&gt;
            # Clear Display&lt;br /&gt;
            screen.fill((255,255,255)) #255 for white&lt;br /&gt;
 &lt;br /&gt;
            # Draw stuff here&lt;br /&gt;
            .................&lt;br /&gt;
 &lt;br /&gt;
            # Flip Display&lt;br /&gt;
            pygame.display.flip()  &lt;br /&gt;
             &lt;br /&gt;
            # Try to stay at 30 FPS&lt;br /&gt;
            self.clock.tick(30)&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
&lt;br /&gt;
For help with Sugargame, please email the Sugar Labs development list:&lt;br /&gt;
&lt;br /&gt;
: sugar-devel@lists.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
Sugargame is developed by Wade Brainerd &amp;lt;wadetb@gmail.com&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
It is loosely based on the source code to the olpcgames framework, developed by &lt;br /&gt;
the One Laptop Per Child project.&lt;br /&gt;
&lt;br /&gt;
=== Changelog ===&lt;br /&gt;
&lt;br /&gt;
====v1.1====&lt;br /&gt;
* Fix bugs in event handling.  (Pablo Moleri)&lt;br /&gt;
* Remove reference to gtk.Socket.get_window() method, which is missing in older versions of PyGTK.&lt;br /&gt;
&lt;br /&gt;
====v1.0====&lt;br /&gt;
* Initial version of Sugargame&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Blocku&amp;diff=43678</id>
		<title>Blocku</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Blocku&amp;diff=43678"/>
		<updated>2010-02-01T17:17:19Z</updated>

		<summary type="html">&lt;p&gt;Wade: moved Blocku to Activities/Blocku:&amp;amp;#32;Preserve wiki structure&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Activities/Blocku]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activities/Blocku&amp;diff=43677</id>
		<title>Activities/Blocku</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activities/Blocku&amp;diff=43677"/>
		<updated>2010-02-01T17:17:19Z</updated>

		<summary type="html">&lt;p&gt;Wade: moved Blocku to Activities/Blocku:&amp;amp;#32;Preserve wiki structure&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:blocku.png]]&lt;br /&gt;
&lt;br /&gt;
Blocku is a puzzle game consisting of filling a grid with squares by matching the squares sides by following a constraint. Blocku is a game that can be used by teachers to teach a multitude of subjects to students. The teacher will be able to create a constraint such as match the formula to the answer or A + B = C. Then the teacher makes a list with two columns. Each row in the columns is a pair of of matching objects. The first row of column A matches the first row of column B. Using this formula the game will randomly assign the objects of each column to square blocks, one object per side. The student then has to put all the pieces in a grid so that pairs on the sides of the squares follow the constraint. The student will be able to move the pieces as well as rotate them.&lt;br /&gt;
&lt;br /&gt;
==Description (original)==&lt;br /&gt;
Blocku is a math based jigsaw puzzle. Blocku will come with a few pre-made puzzles. It will have a teacher edit tool where teachers can make their own puzzles. Puzzles can be as complicated as a castle or as simple as a square. The teacher will be given a grid where he/she can specify how the puzzle is supposed to look. Then the teacher chooses what type of operator he/she wants (+, -, x, /). Then the teacher inputs the answer. The activity randomly chooses what number will appear on the sides of each square.&lt;br /&gt;
&lt;br /&gt;
To complete each puzzle the student has to match the sides of squares together so that the numbers finish the math equation at the top of the screen. The puzzle is completed when all pieces are used and are in the correct positions. Below is an example of how a game may progress. &lt;br /&gt;
&lt;br /&gt;
==Student==&lt;br /&gt;
The student will be able to choose from past made puzzles as practice or from pre-existing puzzles for fun as a way to play Blocku. When the teacher is in control they will be able to join the class with the task at hand.&lt;br /&gt;
*Can choose to use pre-made puzzles&lt;br /&gt;
*Can choose difficulty&lt;br /&gt;
*Can choose grid size&lt;br /&gt;
*Can choose the set of numbers &lt;br /&gt;
*Can choose operators used&lt;br /&gt;
*Is given the answer then the puzzle&lt;br /&gt;
&lt;br /&gt;
==Teacher==&lt;br /&gt;
The teacher here would set all of these preferences and then share the activity, then they can look at statistics based on the class. The main basis here would be time but also an error rate should be tracked along with this data.&lt;br /&gt;
*Can set difficulty&lt;br /&gt;
*Can set grid size&lt;br /&gt;
*Can set the set of numbers&lt;br /&gt;
*Can set the operators used&lt;br /&gt;
&lt;br /&gt;
==Updates==&lt;br /&gt;
01.14.2010 Updated the Wiki Page with New Links&lt;br /&gt;
&lt;br /&gt;
01.16.2010 Updated the Wiki Page with new suggestions&lt;br /&gt;
&lt;br /&gt;
01.21.2010 Updated the Wiki Page with new description, milestones, and logo&lt;br /&gt;
&lt;br /&gt;
01.27.2010 Added in Fran, Added in summaries for student/teachers&lt;br /&gt;
&lt;br /&gt;
==Contacts==&lt;br /&gt;
[[user:mdemayo|Mark DeMayo]]&lt;br /&gt;
&lt;br /&gt;
[[user:Coolestdude1|Ariel Zamparini]]&lt;br /&gt;
&lt;br /&gt;
[[user:iogburu|Ihudiya Ogburu]]&lt;br /&gt;
&lt;br /&gt;
[[user:Fran Rogers|Fran Rogers]]&lt;br /&gt;
&lt;br /&gt;
==Development Meetings==&lt;br /&gt;
&lt;br /&gt;
4pm-6pm Wednesday January 20, 2010&lt;br /&gt;
&lt;br /&gt;
4pm Thursday January 28, 2010 (IRC)&lt;br /&gt;
&lt;br /&gt;
==Sketch Up==&lt;br /&gt;
[[Image:example3.jpg]].&lt;br /&gt;
&lt;br /&gt;
[[Image:example1.jpg]].&lt;br /&gt;
&lt;br /&gt;
[[Image:example2.jpg]].&lt;br /&gt;
&lt;br /&gt;
==Milestones==&lt;br /&gt;
-&amp;lt;s&amp;gt;Decide which program to use as a foundation. (Tetravex, Super Cube, Jigsaw-Puzzle)&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-Display a graphical interface.&lt;br /&gt;
&lt;br /&gt;
-Display squares with numbers.&lt;br /&gt;
&lt;br /&gt;
-Make squares movable and able to be rotated.&lt;br /&gt;
&lt;br /&gt;
==Bugs/Fixes==&lt;br /&gt;
==Game Suggestions==&lt;br /&gt;
&lt;br /&gt;
*Benjamin M. Schwartz (via email)&lt;br /&gt;
&lt;br /&gt;
 I think it&#039;s great.  Three points:&lt;br /&gt;
 1)  Users probably don&#039;t want to play many games of the same operation&lt;br /&gt;
     (e.g. x+y=10), and the teacher probably doesn&#039;t want to create a new game&lt;br /&gt;
     for every operation.  You should allow users to select a range of&lt;br /&gt;
     operations (e.g. numbers up to 12, + - and *) and have the game select a&lt;br /&gt;
     random operation from the set for each game.&lt;br /&gt;
 2)  There are some interesting possibilities for using network collab&lt;br /&gt;
     between users and teachers, but work on that last.  To start, users should&lt;br /&gt;
     just punch in the operation (or range of operations) when the activity&lt;br /&gt;
     launches.  Teachers can just tell the students what settings to use, and&lt;br /&gt;
     then look at the screens to verify.&lt;br /&gt;
 3)  The visual structure of the game seems almost identical to Gnome&#039;s&lt;br /&gt;
     Tetravex.  In the spirit of Open Source, you should consider reusing the&lt;br /&gt;
     Tetravex gameboard display code.&lt;br /&gt;
 --Ben&lt;br /&gt;
&lt;br /&gt;
*Wade Brainerd (via email)&lt;br /&gt;
&lt;br /&gt;
   Looks great Mark!  Feel free to get in touch with me if you need any&lt;br /&gt;
 help with implementation.&lt;br /&gt;
   I agree with Greg that this would be a good target for PyGame.&lt;br /&gt;
 Regarding the game design, you should consider adding some sense of&lt;br /&gt;
 progress, or else players will get tired quickly. Some ideas:&lt;br /&gt;
  - Start with two cards, gradually ramp up to 9.&lt;br /&gt;
  - There needs to be a good &amp;quot;snapping&amp;quot; mechanism when dropping, so&lt;br /&gt;
    users don&#039;t get frustrated by trying to line the cards up.&lt;br /&gt;
  - Adding the ability to rotate the cards in 90 degree increments would&lt;br /&gt;
    add to the challenge.&lt;br /&gt;
  - Your notion of customization seems limited to replacing the square&lt;br /&gt;
    with a graphic, which might obscure the number.  Is this really a good&lt;br /&gt;
    way to customize it?&lt;br /&gt;
  - I agree with Ben that when you start the game you should first&lt;br /&gt;
    select which types of puzzles (* + - / etc) you want, how many&lt;br /&gt;
    squares, whether rotation is allowed.  No need for the teacher to be&lt;br /&gt;
    involved.&lt;br /&gt;
  - Why limit it to numbers?  E.g. how about comparisons like &amp;quot;X is&lt;br /&gt;
    heaver than Y&amp;quot; and on the sides of the cards are things like&lt;br /&gt;
    &amp;quot;elephant&amp;quot;, &amp;quot;bacteria&amp;quot;, etc.  Or &amp;quot;X is newer than Y&amp;quot;, etc.  This is&lt;br /&gt;
    where customization would be cool.  Let the teacher define a&lt;br /&gt;
    relationship, and input a series of terms, and define which pairs meet&lt;br /&gt;
    that relationship.  This would be called a &amp;quot;set&amp;quot;, and could be&lt;br /&gt;
    exported to the Journal.&lt;br /&gt;
    Good luck with your project!&lt;br /&gt;
&lt;br /&gt;
*David Farning (via email)&lt;br /&gt;
&lt;br /&gt;
 Very clever.  I just cut made a cut out of the game out of paper.  My&lt;br /&gt;
 1st grade niece played with it for over half an hour.  It will be a&lt;br /&gt;
 hit on her XO.&lt;br /&gt;
 david&lt;br /&gt;
&lt;br /&gt;
*Greg DeKoenigsberg (via email)&lt;br /&gt;
&lt;br /&gt;
   Mark, this looks like a brilliant little activity.  Simple, fun gameplay, extensible.  Really great.&lt;br /&gt;
 Some thoughts:&lt;br /&gt;
 1. I&#039;d love to see this as primarily a PyGame activity, with just enough &amp;quot;Sugar&amp;quot; to run it on Sugar &lt;br /&gt;
    easily, but also easily available as a Windows or Mac activity.  If done well, this is precisely &lt;br /&gt;
    the sort of activity that could cross over.  (Which is, in fact, how I&#039;d like to see most Sugar &lt;br /&gt;
    games built.)&lt;br /&gt;
 2. Always think a little bit (but not too much) about assessment.  The student knows they&#039;re &lt;br /&gt;
    getting better because they are &amp;quot;leveling up&amp;quot;.  The teacher knows the kid is getting better &lt;br /&gt;
    because... how?  Game data is pushed up to a server... somehow?  Dunno if anyone is paying &lt;br /&gt;
    attention to this   question, but it would be great if there were a simple way to allow   &lt;br /&gt;
    teachers to &lt;br /&gt;
    aggregate &amp;quot;high score&amp;quot; data, which really doubles as assessment data in cases like this.&lt;br /&gt;
    A great start.  I look forward to seeing what it becomes.&lt;br /&gt;
 --g&lt;br /&gt;
&lt;br /&gt;
==Public Git Repository==&lt;br /&gt;
http://git.sugarlabs.org/projects/blocku&lt;br /&gt;
&lt;br /&gt;
==Public IRC Channel==&lt;br /&gt;
Server: irc.freenode.net&lt;br /&gt;
&lt;br /&gt;
Channel: #blocku&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Deployments&amp;diff=43489</id>
		<title>Deployments</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Deployments&amp;diff=43489"/>
		<updated>2010-01-25T14:36:04Z</updated>

		<summary type="html">&lt;p&gt;Wade: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deployments are schools where students are using Sugar to learn. &lt;br /&gt;
&lt;br /&gt;
See [[Deployment Team/Places]] and [[olpc:Deployments]] for a partial accounting.&lt;br /&gt;
&lt;br /&gt;
==Policy==&lt;br /&gt;
* [[Deployments/Policy]] How and why to document a deployment.&lt;br /&gt;
&lt;br /&gt;
==Subpages==&lt;br /&gt;
{{Special:PrefixIndex/{{PAGENAMEE}}/}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Deployment]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Deployments&amp;diff=43195</id>
		<title>Deployments</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Deployments&amp;diff=43195"/>
		<updated>2010-01-17T23:10:00Z</updated>

		<summary type="html">&lt;p&gt;Wade: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deployments are schools where students are using Sugar to learn.&lt;br /&gt;
&lt;br /&gt;
==Policy==&lt;br /&gt;
* [[Deployments/Policy]] How and why to document a deployment.&lt;br /&gt;
&lt;br /&gt;
==Subpages==&lt;br /&gt;
{{Special:PrefixIndex/{{PAGENAMEE}}/}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Deployment]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Deployments/Deployment_Template&amp;diff=43194</id>
		<title>Deployments/Deployment Template</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Deployments/Deployment_Template&amp;diff=43194"/>
		<updated>2010-01-17T23:07:20Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{TOCright}}&lt;br /&gt;
[[Category:Deployment Page Incomplete]]&lt;br /&gt;
[[Category:Deployment|&amp;lt;Deployment Name&amp;gt;]]&lt;br /&gt;
&amp;lt;!-- You can add categories to tie features back to real deployments/schools requesting them, for example &lt;br /&gt;
[[Category:Features requested by School Xyz|&amp;lt;Feature Name&amp;gt;]] (the |Feature Name option sorts the entry on the category page under the first letter of &amp;lt;Feature Name&amp;gt;). --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Comments and Explanations:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
There are comments (in italic) providing guidance to fill out each section, see also the [[Deployments/Policy|Deployment Policy Page]] for a more detailed explanation of the deployment documentation process. &#039;&#039;&#039;Copy the source to a &#039;&#039;new page&#039;&#039; named Deployments/&#039;&#039;Your Deployment Name&#039;&#039; before making changes!  DO NOT EDIT THIS TEMPLATE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- We request that you maintain the same order of sections so that all of the feature pages are uniform.  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The actual name of your deployment page should look something like: Deployments/Your Deployment Name.  This keeps all features in the same namespace --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&#039;&#039;A sentence or two summarizing this Sugar deployment. This information is used for the deployment summary page.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&#039;&#039;This should link to one or more people who are willing to act as ambassadors between Sugar Labs and this deployment.&#039;&#039;&lt;br /&gt;
* Name: [[User:AcountName| Your Name]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Include your email address that you can be reached should people want to make contact with this deployment&#039;&#039;&lt;br /&gt;
* Email: &amp;lt;your email address so we can contact you, invite you to meetings, etc.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Location ==&lt;br /&gt;
&#039;&#039;Describe the location of the deployment&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Language ==&lt;br /&gt;
&#039;&#039;What language does the deployment use?  Include the language code, e.g. en_US, if possible.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Size ==&lt;br /&gt;
&#039;&#039;Describe the number of students, teachers, and IT staff using Sugar.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&#039;&#039;Describe the number and type of computers Sugar is running on, e.g. 150 OLPC XO-1 Laptops.  Also describe any servers are used and what software they run.  Additional equipment, like solar power generators, can also be included.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Technical Details ==&lt;br /&gt;
&#039;&#039;This should list which version of Sugar is being used, e.g. 0.82 or SoaS Blueberry.&#039;&#039;&lt;br /&gt;
* Sugar version: &amp;lt;SUGAR VERSION&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Describe the base operating system being used, e.g. Fedora 12.&#039;&#039;&lt;br /&gt;
* OS distribution: &amp;lt;OS DISTRO&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Activity Usage ==&lt;br /&gt;
&#039;&#039;Describe which Sugar activities are used in the classroom.&#039;&#039;&lt;br /&gt;
* &amp;lt;ACTIVITY 1&amp;gt;&lt;br /&gt;
* &amp;lt;ACTIVITY 2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Curriculum ==&lt;br /&gt;
&#039;&#039;Provide any notes about how Sugar is being used in the classroom.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Describe how and when the deployment got started, its growth and changes, etc.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&#039;&#039;Provide links to deployment websites, additional wiki pages, studies, papers, etc.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Comments and Discussion ==&lt;br /&gt;
* See [[{{TALKPAGENAME}}|discussion tab for this deployment]] &amp;lt;!-- This adds a link to the &amp;quot;discussion&amp;quot; tab associated with your page.  This provides the ability to have ongoing comments or conversation without bogging down the main deployment page. --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Deployments/Deployment_Template&amp;diff=43193</id>
		<title>Deployments/Deployment Template</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Deployments/Deployment_Template&amp;diff=43193"/>
		<updated>2010-01-17T23:06:11Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Equipment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{TOCright}}&lt;br /&gt;
[[Category:Deployment Page Incomplete]]&lt;br /&gt;
[[Category:Deployment|&amp;lt;Deployment Name&amp;gt;]]&lt;br /&gt;
&amp;lt;!-- You can add categories to tie features back to real deployments/schools requesting them, for example &lt;br /&gt;
[[Category:Features requested by School Xyz|&amp;lt;Feature Name&amp;gt;]] (the |Feature Name option sorts the entry on the category page under the first letter of &amp;lt;Feature Name&amp;gt;). --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Comments and Explanations:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
There are comments (in italic) providing guidance to fill out each section, see also the [[Deployments/Policy|Deployment Policy Page]] for a more detailed explanation of the deployment documentation process. &#039;&#039;&#039;Copy the source to a &#039;&#039;new page&#039;&#039; named Deployments/&#039;&#039;Your Deployment Name&#039;&#039; before making changes!  DO NOT EDIT THIS TEMPLATE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- We request that you maintain the same order of sections so that all of the feature pages are uniform.  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The actual name of your deployment page should look something like: Deployments/Your Deployment Name.  This keeps all features in the same namespace --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&#039;&#039;A sentence or two summarizing this Sugar deployment. This information is used for the deployment summary page.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&#039;&#039;This should link to one or more people who are willing to act as ambassadors between Sugar Labs and this deployment.&#039;&#039;&lt;br /&gt;
* Name: [[User:AcountName| Your Name]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Include your email address that you can be reached should people want to make contact with this deployment&#039;&#039;&lt;br /&gt;
* Email: &amp;lt;your email address so we can contact you, invite you to meetings, etc.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Location ==&lt;br /&gt;
&#039;&#039;Describe the location of the deployment&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Language ==&lt;br /&gt;
&#039;&#039;What language does the deployment use?  Include the language code, e.g. en_US, if possible.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Size ==&lt;br /&gt;
&#039;&#039;Describe the number of students, teachers, and IT staff using Sugar.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&#039;&#039;Describe the number and type of computers Sugar is running on, e.g. 150 OLPC XO-1 Laptops.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Technical Details ==&lt;br /&gt;
&#039;&#039;This should list which version of Sugar is being used, e.g. 0.82 or SoaS Blueberry.&#039;&#039;&lt;br /&gt;
* Sugar version: &amp;lt;SUGAR VERSION&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Describe the base operating system being used, e.g. Fedora 12.&#039;&#039;&lt;br /&gt;
* OS distribution: &amp;lt;OS DISTRO&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Activity Usage ==&lt;br /&gt;
&#039;&#039;Describe which Sugar activities are used in the classroom.&#039;&#039;&lt;br /&gt;
* &amp;lt;ACTIVITY 1&amp;gt;&lt;br /&gt;
* &amp;lt;ACTIVITY 2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Curriculum ==&lt;br /&gt;
&#039;&#039;Provide any notes about how Sugar is being used in the classroom.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Describe how and when the deployment got started, its growth and changes, etc.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&#039;&#039;Provide links to deployment websites, additional wiki pages, studies, papers, etc.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Comments and Discussion ==&lt;br /&gt;
* See [[{{TALKPAGENAME}}|discussion tab for this deployment]] &amp;lt;!-- This adds a link to the &amp;quot;discussion&amp;quot; tab associated with your page.  This provides the ability to have ongoing comments or conversation without bogging down the main deployment page. --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Deployments/Deployment_Template&amp;diff=43192</id>
		<title>Deployments/Deployment Template</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Deployments/Deployment_Template&amp;diff=43192"/>
		<updated>2010-01-17T23:05:55Z</updated>

		<summary type="html">&lt;p&gt;Wade: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{TOCright}}&lt;br /&gt;
[[Category:Deployment Page Incomplete]]&lt;br /&gt;
[[Category:Deployment|&amp;lt;Deployment Name&amp;gt;]]&lt;br /&gt;
&amp;lt;!-- You can add categories to tie features back to real deployments/schools requesting them, for example &lt;br /&gt;
[[Category:Features requested by School Xyz|&amp;lt;Feature Name&amp;gt;]] (the |Feature Name option sorts the entry on the category page under the first letter of &amp;lt;Feature Name&amp;gt;). --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Comments and Explanations:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
There are comments (in italic) providing guidance to fill out each section, see also the [[Deployments/Policy|Deployment Policy Page]] for a more detailed explanation of the deployment documentation process. &#039;&#039;&#039;Copy the source to a &#039;&#039;new page&#039;&#039; named Deployments/&#039;&#039;Your Deployment Name&#039;&#039; before making changes!  DO NOT EDIT THIS TEMPLATE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- We request that you maintain the same order of sections so that all of the feature pages are uniform.  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The actual name of your deployment page should look something like: Deployments/Your Deployment Name.  This keeps all features in the same namespace --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&#039;&#039;A sentence or two summarizing this Sugar deployment. This information is used for the deployment summary page.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&#039;&#039;This should link to one or more people who are willing to act as ambassadors between Sugar Labs and this deployment.&#039;&#039;&lt;br /&gt;
* Name: [[User:AcountName| Your Name]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Include your email address that you can be reached should people want to make contact with this deployment&#039;&#039;&lt;br /&gt;
* Email: &amp;lt;your email address so we can contact you, invite you to meetings, etc.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Location ==&lt;br /&gt;
&#039;&#039;Describe the location of the deployment&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Language ==&lt;br /&gt;
&#039;&#039;What language does the deployment use?  Include the language code, e.g. en_US, if possible.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Size ==&lt;br /&gt;
&#039;&#039;Describe the number of students, teachers, and IT staff using Sugar.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Equipment ==&lt;br /&gt;
&#039;&#039;Describe the number and type of computers Sugar is running on, e.g. 150 OLPC XO-1 Laptops.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Technical Details ==&lt;br /&gt;
&#039;&#039;This should list which version of Sugar is being used, e.g. 0.82 or SoaS Blueberry.&#039;&#039;&lt;br /&gt;
* Sugar version: &amp;lt;SUGAR VERSION&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Describe the base operating system being used, e.g. Fedora 12.&#039;&#039;&lt;br /&gt;
* OS distribution: &amp;lt;OS DISTRO&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Activity Usage ==&lt;br /&gt;
&#039;&#039;Describe which Sugar activities are used in the classroom.&#039;&#039;&lt;br /&gt;
* &amp;lt;ACTIVITY 1&amp;gt;&lt;br /&gt;
* &amp;lt;ACTIVITY 2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Curriculum ==&lt;br /&gt;
&#039;&#039;Provide any notes about how Sugar is being used in the classroom.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Describe how and when the deployment got started, its growth and changes, etc.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&#039;&#039;Provide links to deployment websites, additional wiki pages, studies, papers, etc.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Comments and Discussion ==&lt;br /&gt;
* See [[{{TALKPAGENAME}}|discussion tab for this deployment]] &amp;lt;!-- This adds a link to the &amp;quot;discussion&amp;quot; tab associated with your page.  This provides the ability to have ongoing comments or conversation without bogging down the main deployment page. --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Deployments/Deployment_Template&amp;diff=43191</id>
		<title>Deployments/Deployment Template</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Deployments/Deployment_Template&amp;diff=43191"/>
		<updated>2010-01-17T23:04:14Z</updated>

		<summary type="html">&lt;p&gt;Wade: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{TOCright}}&lt;br /&gt;
[[Category:Deployment Page Incomplete]]&lt;br /&gt;
[[Category:Deployment|&amp;lt;Deployment Name&amp;gt;]]&lt;br /&gt;
&amp;lt;!-- You can add categories to tie features back to real deployments/schools requesting them, for example &lt;br /&gt;
[[Category:Features requested by School Xyz|&amp;lt;Feature Name&amp;gt;]] (the |Feature Name option sorts the entry on the category page under the first letter of &amp;lt;Feature Name&amp;gt;). --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Comments and Explanations:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
There are comments (in italic) providing guidance to fill out each section, see also the [[Deployments/Policy|Deployment Policy Page]] for a more detailed explanation of the deployment documentation process. &#039;&#039;&#039;Copy the source to a &#039;&#039;new page&#039;&#039; named Deployments/&#039;&#039;Your Deployment Name&#039;&#039; before making changes!  DO NOT EDIT THIS TEMPLATE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- We request that you maintain the same order of sections so that all of the feature pages are uniform.  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The actual name of your deployment page should look something like: Deployments/Your Deployment Name.  This keeps all features in the same namespace --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&#039;&#039;A sentence or two summarizing this Sugar deployment. This information is used for the deployment summary page.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&#039;&#039;This should link to one or more people who are willing to act as ambassadors between Sugar Labs and this deployment.&#039;&#039;&lt;br /&gt;
* Name: [[User:AcountName| Your Name]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Include your email address that you can be reached should people want to make contact with this deployment&#039;&#039;&lt;br /&gt;
* Email: &amp;lt;your email address so we can contact you, invite you to meetings, etc.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Location ==&lt;br /&gt;
&#039;&#039;Describe the location of the deployment&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Language ==&lt;br /&gt;
&#039;&#039;What language does the deployment use?  Include the language code, e.g. en_US, if possible.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Size ==&lt;br /&gt;
&#039;&#039;Describe the number of students, teachers, and IT staff using Sugar.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Equipment ==&lt;br /&gt;
&#039;&#039;Describe the number and type of computers Sugar is running on, e.g. 150 OLPC XO-1 Laptops.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Technical Details ==&lt;br /&gt;
&#039;&#039;This should list which version of Sugar is being used, e.g. 0.82 or SoaS Blueberry.&#039;&#039;&lt;br /&gt;
Sugar version: &amp;lt;SUGAR VERSION&amp;gt;&lt;br /&gt;
&#039;&#039;Describe the base operating system being used, e.g. Fedora 12.&#039;&#039;&lt;br /&gt;
OS distribution: &amp;lt;OS DISTRO&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Activity Usage ==&lt;br /&gt;
&#039;&#039;Describe which Sugar activities are used in the classroom.&#039;&#039;&lt;br /&gt;
* &amp;lt;ACTIVITY 1&amp;gt;&lt;br /&gt;
* &amp;lt;ACTIVITY 2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Curriculum ==&lt;br /&gt;
&#039;&#039;Provide any notes about how Sugar is being used in the classroom.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Describe how and when the deployment got started, its growth and changes, etc.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&#039;&#039;Provide links to deployment websites, additional wiki pages, studies, papers, etc.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Comments and Discussion ==&lt;br /&gt;
* See [[{{TALKPAGENAME}}|discussion tab for this deployment]] &amp;lt;!-- This adds a link to the &amp;quot;discussion&amp;quot; tab associated with your page.  This provides the ability to have ongoing comments or conversation without bogging down the main deployment page. --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Deployments&amp;diff=43190</id>
		<title>Deployments</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Deployments&amp;diff=43190"/>
		<updated>2010-01-17T23:03:22Z</updated>

		<summary type="html">&lt;p&gt;Wade: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deployments are schools where students are learning using Sugar.&lt;br /&gt;
&lt;br /&gt;
==Policy==&lt;br /&gt;
* [[Deployments/Policy]] How and why to document a deployment.&lt;br /&gt;
&lt;br /&gt;
==Subpages==&lt;br /&gt;
{{Special:PrefixIndex/{{PAGENAMEE}}/}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Deployment]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Deployments&amp;diff=43189</id>
		<title>Deployments</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Deployments&amp;diff=43189"/>
		<updated>2010-01-17T23:01:38Z</updated>

		<summary type="html">&lt;p&gt;Wade: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Policy==&lt;br /&gt;
* [[Deployments/Policy]] How and why to document a deployment.&lt;br /&gt;
&lt;br /&gt;
==Subpages==&lt;br /&gt;
{{Special:PrefixIndex/{{PAGENAMEE}}/}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Deployment]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Deployments/Policy&amp;diff=43188</id>
		<title>Deployments/Policy</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Deployments/Policy&amp;diff=43188"/>
		<updated>2010-01-17T23:01:08Z</updated>

		<summary type="html">&lt;p&gt;Wade: Created page with &amp;#039;== Why should I document my deployment? == The main goal of listing deployments on the SugarLabs wiki is to increase communication between the development community and the users…&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Why should I document my deployment? ==&lt;br /&gt;
The main goal of listing deployments on the SugarLabs wiki is to increase communication between the development community and the users.  Ultimately, this communication will serve to enhance the Sugar learning platform.&lt;br /&gt;
&lt;br /&gt;
By providing a basic description of each deployment and its needs, Sugar developers are motivated to working on making Sugar a great learning experience.&lt;br /&gt;
&lt;br /&gt;
== How to document a deployment ==&lt;br /&gt;
To document a deployment, copy the [[Deployments/Deployment Template|deployment template page]] into a new Wiki page named Deployments/Your Deployment Name.&lt;br /&gt;
&lt;br /&gt;
Edit the new page, replacing the template comments in italics with the appropriate details.&lt;br /&gt;
&lt;br /&gt;
From time to time, please update the page with new information.&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Deployments/Deployment_Template&amp;diff=43187</id>
		<title>Deployments/Deployment Template</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Deployments/Deployment_Template&amp;diff=43187"/>
		<updated>2010-01-17T22:27:02Z</updated>

		<summary type="html">&lt;p&gt;Wade: Created page with &amp;#039;&amp;lt;noinclude&amp;gt;{{TOCright}} Category:Deployment Page Incomplete &amp;lt;Deployment Name&amp;gt; &amp;lt;!-- You can add categories to tie features back to real deployments/sch…&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{TOCright}}&lt;br /&gt;
[[Category:Deployment Page Incomplete]]&lt;br /&gt;
[[Category:Deployment|&amp;lt;Deployment Name&amp;gt;]]&lt;br /&gt;
&amp;lt;!-- You can add categories to tie features back to real deployments/schools requesting them, for example &lt;br /&gt;
[[Category:Features requested by School Xyz|&amp;lt;Feature Name&amp;gt;]] (the |Feature Name option sorts the entry on the category page under the first letter of &amp;lt;Feature Name&amp;gt;). --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Comments and Explanations:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
There are comments (in italic) providing guidance to fill out each section, see also the [[Deployments/Policy|Deployment Policy Page]] for a more detailed explanation of the deployment documentation process. &#039;&#039;&#039;Copy the source to a &#039;&#039;new page&#039;&#039; named Deployments/&#039;&#039;Your Deployment Name&#039;&#039; before making changes!  DO NOT EDIT THIS TEMPLATE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- We request that you maintain the same order of sections so that all of the feature pages are uniform.  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The actual name of your deployment page should look something like: Deployments/Your Deployment Name.  This keeps all features in the same namespace --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&#039;&#039;A sentence or two summarizing this Sugar deployment. This information is used for the deployment summary page.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&#039;&#039;This should link to one or more people who are willing to act as ambassadors between Sugar Labs and this deployment.&#039;&#039;&lt;br /&gt;
* Name: [[User:AcountName| Your Name]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Include your email address that you can be reached should people want to make contact with this deployment&#039;&#039;&lt;br /&gt;
* Email: &amp;lt;your email address so we can contact you, invite you to meetings, etc.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Location ==&lt;br /&gt;
&#039;&#039;Describe the location of the deployment&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Language ==&lt;br /&gt;
&#039;&#039;What language does the deployment use?  Include the language code, e.g. en_US, if possible.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Size ==&lt;br /&gt;
&#039;&#039;Describe the number of students, teachers, and IT staff using Sugar.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Equipment ==&lt;br /&gt;
&#039;&#039;Describe the number and type of computers Sugar is running on, e.g. 150 OLPC XO-1 Laptops.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Technical Details ==&lt;br /&gt;
&#039;&#039;This should list which version of Sugar is being used, e.g. 0.82 or SoaS Blueberry.&#039;&#039;&lt;br /&gt;
Sugar version: &amp;lt;SUGAR VERSION&amp;gt;&lt;br /&gt;
&#039;&#039;Describe the base operating system being used, e.g. Fedora 12.&#039;&#039;&lt;br /&gt;
OS distribution: &amp;lt;OS DISTRO&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Activity Usage ==&lt;br /&gt;
&#039;&#039;Describe which Sugar activities are used in the classroom.&#039;&#039;&lt;br /&gt;
* &amp;lt;ACTIVITY 1&amp;gt;&lt;br /&gt;
* &amp;lt;ACTIVITY 2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Curriculum ==&lt;br /&gt;
&#039;&#039;Provide any notes about how Sugar is being used in the classroom.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&#039;&#039;Provide links to deployment websites, additional wiki pages, studies, papers, etc.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Comments and Discussion ==&lt;br /&gt;
* See [[{{TALKPAGENAME}}|discussion tab for this deployment]] &amp;lt;!-- This adds a link to the &amp;quot;discussion&amp;quot; tab associated with your page.  This provides the ability to have ongoing comments or conversation without bogging down the main deployment page. --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Deployments&amp;diff=43186</id>
		<title>Deployments</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Deployments&amp;diff=43186"/>
		<updated>2010-01-17T22:09:55Z</updated>

		<summary type="html">&lt;p&gt;Wade: Created page with &amp;#039;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}&amp;lt;/noinclude&amp;gt;  ==Policy== * Deployments/Policy How to document a deployment.  ==Subpages== {{Special:PrefixIndex/{{PAGENAMEE}}/}}  [[Category:Depl…&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Policy==&lt;br /&gt;
* [[Deployments/Policy]] How to document a deployment.&lt;br /&gt;
&lt;br /&gt;
==Subpages==&lt;br /&gt;
{{Special:PrefixIndex/{{PAGENAMEE}}/}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Deployment]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/Problem_Reports&amp;diff=42122</id>
		<title>Features/Problem Reports</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/Problem_Reports&amp;diff=42122"/>
		<updated>2009-12-20T14:23:33Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Detailed Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TOCright}}&lt;br /&gt;
[[Category:Feature Page Incomplete]]&lt;br /&gt;
[[Category:Feature|Problem Reports]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
The &amp;quot;Report a problem&amp;quot; control panel provides a way for the user to report issues with the Sugar shell and activities.  The control panel uploads system information and logs, along with the user&#039;s description of the problem.&lt;br /&gt;
&lt;br /&gt;
== Owner ==&lt;br /&gt;
* Name: [[User:Wade|Wade Brainerd]]&lt;br /&gt;
* Email: wadetb@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Current status ==&lt;br /&gt;
* Targeted release: 0.88&lt;br /&gt;
* Last updated: October 16th, 2009&lt;br /&gt;
* Percentage of completion: 90%&lt;br /&gt;
&lt;br /&gt;
== Detailed Description ==&lt;br /&gt;
A new control panel will be added, titled &amp;quot;Report a problem&amp;quot;.  This panel contains a description box and an Upload report button.  When the button is pressed, the description and system logs are uploaded to a central Sugar Labs server.  &lt;br /&gt;
&lt;br /&gt;
The central server logs the problem reports in a database and stores a copy of the logs.  It also analyzes the logs for specific errors (such as Python Tracebacks).  When a problem report is added, the server sends an email out to a mailing list of developers and interested parties.&lt;br /&gt;
&lt;br /&gt;
When a problem is detected in an Activity, such as failure to launch, Sugar will offer a &amp;quot;Report problem&amp;quot; button which takes the user directly to the control panel.&lt;br /&gt;
&lt;br /&gt;
After uploading, the user is given a Report ID number (a small decimal number).  They can use this if they wish to follow up with the Sugar developers by email.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== For Deployments ====&lt;br /&gt;
Deployments can set up their own log collection server, if desired.  All that is required is a web server with PHP and sqlite.  &lt;br /&gt;
&lt;br /&gt;
The URL of the log server is configured using a GConf key and can be customized per deployment.&lt;br /&gt;
&lt;br /&gt;
It&#039;s important to understand that this system is intended to be as automated as possible, so deployments should not expect to have a staff of support personnel monitoring problem reports, but can instead use them to get a general sense of what problems are most common.&lt;br /&gt;
&lt;br /&gt;
[[File:Problem-report.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Benefit to Sugar ==&lt;br /&gt;
Currently there is no mechanism for non-technical users to submit problem reports.  In order to inform the Sugar or Activity developers of a problem, a user has two options:&lt;br /&gt;
&lt;br /&gt;
* Create a Trac account and enter a bug.&lt;br /&gt;
* Write an email to sugar-devel@lists.sugarlabs.org.&lt;br /&gt;
&lt;br /&gt;
The first option is time consuming and requires the user to fill in confusing fields such as Component and Version manually.  The second option requires the user to have an email account, and the report is not logged anywhere.  Neither option is convenient or provides relevant details about the problem.&lt;br /&gt;
&lt;br /&gt;
The new control panel offers a way for casual users to report problems encountered in Sugar.  It also supplies a high level of detail about the problem to the developers.&lt;br /&gt;
&lt;br /&gt;
The reason problem reports are not added directly to Trac is that we don&#039;t want to spam the database with spurious reports.  Problem reports are intended to be triaged by subscribers to the mailing list, and then either bugged or noted on an existing ticket.&lt;br /&gt;
&lt;br /&gt;
== Scope ==&lt;br /&gt;
A prototype of the control panel and server have been finished and posted to [http://trac.sugarlabs.org/ticket/1439 #1439] as patches.&lt;br /&gt;
&lt;br /&gt;
The collection server is currently running at logcollect.sugarlabs.org.  Logs are emailed out to the sugar-reports@lists.sugarlabs.org mailing list.&lt;br /&gt;
&lt;br /&gt;
Work left to do:&lt;br /&gt;
* &amp;lt;strike&amp;gt;The control panel needs a SVG icon.&amp;lt;/strike&amp;gt; [[File:Toolbar-bug.png]]&lt;br /&gt;
* When an activity exits, if its log contains an exception report, Sugar should offer to report the problem.  When an activity fails to launch, Sugar should display an error on the launch window and offer to report the problem instead of timing out.&lt;br /&gt;
* &amp;lt;strike&amp;gt;The server needs to be installed on the SugarLabs infrastructure and the reports mailing list needs to be created (sugar-reports@lists.sugarlabs.org?).&amp;lt;/strike&amp;gt; The server is now live at logcollect.sugarlabs.org.  The mailing list sugar-reports@lists.sugarlabs.org now exists.&lt;br /&gt;
* &amp;lt;strike&amp;gt;For deployments, there should be a way to override the server URL.&amp;lt;/strike&amp;gt; The server URL now comes from Gconf.&lt;br /&gt;
* &amp;lt;strike&amp;gt;The Log activity needs to have its Upload Logs button replaced by a button that opens the control panel.&amp;lt;/strike&amp;gt; Most likely we will remove the button from Log, but patches for both options have been posted to the ticket.&lt;br /&gt;
&lt;br /&gt;
== How To Test ==&lt;br /&gt;
{{:{{PAGENAME}}/Testing}}&lt;br /&gt;
&lt;br /&gt;
== User Experience ==&lt;br /&gt;
The user will notice a new control panel.  When an activity fails to launch or otherwise suffers an exception, the user will be offered an opportunity to report the problem.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
== Contingency Plan ==&lt;br /&gt;
Nothing depends on this feature.  If it&#039;s not ready in time it can simply be omitted.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
Ideally this feature would be documented as part of the FLOSS manual.&lt;br /&gt;
&lt;br /&gt;
Also, instructions for deploying the log server and configuring the URL via gconf should be documented on the Wiki.&lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
A mention of how to customize the server URL would be useful.&lt;br /&gt;
&lt;br /&gt;
== Comments and Discussion ==&lt;br /&gt;
* See [[{{TALKPAGENAME}}|discussion tab for this feature]] &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;You can add categories to tie features back to real deployments/schools requesting them, for example &amp;lt;nowiki&amp;gt;[[&amp;lt;/nowiki&amp;gt;Category:Features requested by School Xyz]]&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/Problem_Reports&amp;diff=42121</id>
		<title>Features/Problem Reports</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/Problem_Reports&amp;diff=42121"/>
		<updated>2009-12-20T14:22:05Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Detailed Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TOCright}}&lt;br /&gt;
[[Category:Feature Page Incomplete]]&lt;br /&gt;
[[Category:Feature|Problem Reports]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
The &amp;quot;Report a problem&amp;quot; control panel provides a way for the user to report issues with the Sugar shell and activities.  The control panel uploads system information and logs, along with the user&#039;s description of the problem.&lt;br /&gt;
&lt;br /&gt;
== Owner ==&lt;br /&gt;
* Name: [[User:Wade|Wade Brainerd]]&lt;br /&gt;
* Email: wadetb@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Current status ==&lt;br /&gt;
* Targeted release: 0.88&lt;br /&gt;
* Last updated: October 16th, 2009&lt;br /&gt;
* Percentage of completion: 90%&lt;br /&gt;
&lt;br /&gt;
== Detailed Description ==&lt;br /&gt;
A new control panel will be added, titled &amp;quot;Report a problem&amp;quot;.  This panel contains a description box and an Upload report button.  When the button is pressed, the description and system logs are uploaded to a central Sugar Labs server.  &lt;br /&gt;
&lt;br /&gt;
The central server logs the problem reports in a database and stores a copy of the logs.  It also analyzes the logs for specific errors (such as Python Tracebacks).  When a problem report is added, the server sends an email out to a mailing list of developers and interested parties.&lt;br /&gt;
&lt;br /&gt;
When a problem is detected in an Activity, such as failure to launch, Sugar will offer a &amp;quot;Report problem&amp;quot; button which takes the user directly to the control panel.&lt;br /&gt;
&lt;br /&gt;
After uploading, the user is given a Report ID number (a small decimal number).  They can use this if they wish to follow up with the Sugar developers by email.&lt;br /&gt;
&lt;br /&gt;
[[File:Problem-report.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== For Deployments ====&lt;br /&gt;
Deployments can set up their own log collection server, if desired.  All that is required is a web server with PHP and sqlite.  &lt;br /&gt;
&lt;br /&gt;
The URL of the log server is configured using a GConf key and can be customized per deployment.&lt;br /&gt;
&lt;br /&gt;
== Benefit to Sugar ==&lt;br /&gt;
Currently there is no mechanism for non-technical users to submit problem reports.  In order to inform the Sugar or Activity developers of a problem, a user has two options:&lt;br /&gt;
&lt;br /&gt;
* Create a Trac account and enter a bug.&lt;br /&gt;
* Write an email to sugar-devel@lists.sugarlabs.org.&lt;br /&gt;
&lt;br /&gt;
The first option is time consuming and requires the user to fill in confusing fields such as Component and Version manually.  The second option requires the user to have an email account, and the report is not logged anywhere.  Neither option is convenient or provides relevant details about the problem.&lt;br /&gt;
&lt;br /&gt;
The new control panel offers a way for casual users to report problems encountered in Sugar.  It also supplies a high level of detail about the problem to the developers.&lt;br /&gt;
&lt;br /&gt;
The reason problem reports are not added directly to Trac is that we don&#039;t want to spam the database with spurious reports.  Problem reports are intended to be triaged by subscribers to the mailing list, and then either bugged or noted on an existing ticket.&lt;br /&gt;
&lt;br /&gt;
== Scope ==&lt;br /&gt;
A prototype of the control panel and server have been finished and posted to [http://trac.sugarlabs.org/ticket/1439 #1439] as patches.&lt;br /&gt;
&lt;br /&gt;
The collection server is currently running at logcollect.sugarlabs.org.  Logs are emailed out to the sugar-reports@lists.sugarlabs.org mailing list.&lt;br /&gt;
&lt;br /&gt;
Work left to do:&lt;br /&gt;
* &amp;lt;strike&amp;gt;The control panel needs a SVG icon.&amp;lt;/strike&amp;gt; [[File:Toolbar-bug.png]]&lt;br /&gt;
* When an activity exits, if its log contains an exception report, Sugar should offer to report the problem.  When an activity fails to launch, Sugar should display an error on the launch window and offer to report the problem instead of timing out.&lt;br /&gt;
* &amp;lt;strike&amp;gt;The server needs to be installed on the SugarLabs infrastructure and the reports mailing list needs to be created (sugar-reports@lists.sugarlabs.org?).&amp;lt;/strike&amp;gt; The server is now live at logcollect.sugarlabs.org.  The mailing list sugar-reports@lists.sugarlabs.org now exists.&lt;br /&gt;
* &amp;lt;strike&amp;gt;For deployments, there should be a way to override the server URL.&amp;lt;/strike&amp;gt; The server URL now comes from Gconf.&lt;br /&gt;
* &amp;lt;strike&amp;gt;The Log activity needs to have its Upload Logs button replaced by a button that opens the control panel.&amp;lt;/strike&amp;gt; Most likely we will remove the button from Log, but patches for both options have been posted to the ticket.&lt;br /&gt;
&lt;br /&gt;
== How To Test ==&lt;br /&gt;
{{:{{PAGENAME}}/Testing}}&lt;br /&gt;
&lt;br /&gt;
== User Experience ==&lt;br /&gt;
The user will notice a new control panel.  When an activity fails to launch or otherwise suffers an exception, the user will be offered an opportunity to report the problem.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
== Contingency Plan ==&lt;br /&gt;
Nothing depends on this feature.  If it&#039;s not ready in time it can simply be omitted.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
Ideally this feature would be documented as part of the FLOSS manual.&lt;br /&gt;
&lt;br /&gt;
Also, instructions for deploying the log server and configuring the URL via gconf should be documented on the Wiki.&lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
A mention of how to customize the server URL would be useful.&lt;br /&gt;
&lt;br /&gt;
== Comments and Discussion ==&lt;br /&gt;
* See [[{{TALKPAGENAME}}|discussion tab for this feature]] &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;You can add categories to tie features back to real deployments/schools requesting them, for example &amp;lt;nowiki&amp;gt;[[&amp;lt;/nowiki&amp;gt;Category:Features requested by School Xyz]]&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/Problem_Reports&amp;diff=42120</id>
		<title>Features/Problem Reports</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/Problem_Reports&amp;diff=42120"/>
		<updated>2009-12-20T14:20:52Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TOCright}}&lt;br /&gt;
[[Category:Feature Page Incomplete]]&lt;br /&gt;
[[Category:Feature|Problem Reports]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
The &amp;quot;Report a problem&amp;quot; control panel provides a way for the user to report issues with the Sugar shell and activities.  The control panel uploads system information and logs, along with the user&#039;s description of the problem.&lt;br /&gt;
&lt;br /&gt;
== Owner ==&lt;br /&gt;
* Name: [[User:Wade|Wade Brainerd]]&lt;br /&gt;
* Email: wadetb@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Current status ==&lt;br /&gt;
* Targeted release: 0.88&lt;br /&gt;
* Last updated: October 16th, 2009&lt;br /&gt;
* Percentage of completion: 90%&lt;br /&gt;
&lt;br /&gt;
== Detailed Description ==&lt;br /&gt;
A new control panel will be added, titled &amp;quot;Report a problem&amp;quot;.  This panel contains a description box and an Upload report button.  When the button is pressed, the description and system logs are uploaded to a central Sugar Labs server.  &lt;br /&gt;
&lt;br /&gt;
The central server logs the problem reports in a database and stores a copy of the logs.  It also analyzes the logs for specific errors (such as Python Tracebacks).  When a problem report is added, the server sends an email out to a mailing list of developers and interested parties.&lt;br /&gt;
&lt;br /&gt;
When a problem is detected in an Activity, such as failure to launch, Sugar will offer a &amp;quot;Report problem&amp;quot; button which takes the user directly to the control panel.&lt;br /&gt;
&lt;br /&gt;
After uploading, the user is given a Report ID number (a small decimal number).  They can use this if they wish to follow up with the Sugar developers by email.&lt;br /&gt;
&lt;br /&gt;
[[File:Problem-report.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Benefit to Sugar ==&lt;br /&gt;
Currently there is no mechanism for non-technical users to submit problem reports.  In order to inform the Sugar or Activity developers of a problem, a user has two options:&lt;br /&gt;
&lt;br /&gt;
* Create a Trac account and enter a bug.&lt;br /&gt;
* Write an email to sugar-devel@lists.sugarlabs.org.&lt;br /&gt;
&lt;br /&gt;
The first option is time consuming and requires the user to fill in confusing fields such as Component and Version manually.  The second option requires the user to have an email account, and the report is not logged anywhere.  Neither option is convenient or provides relevant details about the problem.&lt;br /&gt;
&lt;br /&gt;
The new control panel offers a way for casual users to report problems encountered in Sugar.  It also supplies a high level of detail about the problem to the developers.&lt;br /&gt;
&lt;br /&gt;
The reason problem reports are not added directly to Trac is that we don&#039;t want to spam the database with spurious reports.  Problem reports are intended to be triaged by subscribers to the mailing list, and then either bugged or noted on an existing ticket.&lt;br /&gt;
&lt;br /&gt;
== Scope ==&lt;br /&gt;
A prototype of the control panel and server have been finished and posted to [http://trac.sugarlabs.org/ticket/1439 #1439] as patches.&lt;br /&gt;
&lt;br /&gt;
The collection server is currently running at logcollect.sugarlabs.org.  Logs are emailed out to the sugar-reports@lists.sugarlabs.org mailing list.&lt;br /&gt;
&lt;br /&gt;
Work left to do:&lt;br /&gt;
* &amp;lt;strike&amp;gt;The control panel needs a SVG icon.&amp;lt;/strike&amp;gt; [[File:Toolbar-bug.png]]&lt;br /&gt;
* When an activity exits, if its log contains an exception report, Sugar should offer to report the problem.  When an activity fails to launch, Sugar should display an error on the launch window and offer to report the problem instead of timing out.&lt;br /&gt;
* &amp;lt;strike&amp;gt;The server needs to be installed on the SugarLabs infrastructure and the reports mailing list needs to be created (sugar-reports@lists.sugarlabs.org?).&amp;lt;/strike&amp;gt; The server is now live at logcollect.sugarlabs.org.  The mailing list sugar-reports@lists.sugarlabs.org now exists.&lt;br /&gt;
* &amp;lt;strike&amp;gt;For deployments, there should be a way to override the server URL.&amp;lt;/strike&amp;gt; The server URL now comes from Gconf.&lt;br /&gt;
* &amp;lt;strike&amp;gt;The Log activity needs to have its Upload Logs button replaced by a button that opens the control panel.&amp;lt;/strike&amp;gt; Most likely we will remove the button from Log, but patches for both options have been posted to the ticket.&lt;br /&gt;
&lt;br /&gt;
== How To Test ==&lt;br /&gt;
{{:{{PAGENAME}}/Testing}}&lt;br /&gt;
&lt;br /&gt;
== User Experience ==&lt;br /&gt;
The user will notice a new control panel.  When an activity fails to launch or otherwise suffers an exception, the user will be offered an opportunity to report the problem.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
== Contingency Plan ==&lt;br /&gt;
Nothing depends on this feature.  If it&#039;s not ready in time it can simply be omitted.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
Ideally this feature would be documented as part of the FLOSS manual.&lt;br /&gt;
&lt;br /&gt;
Also, instructions for deploying the log server and configuring the URL via gconf should be documented on the Wiki.&lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
A mention of how to customize the server URL would be useful.&lt;br /&gt;
&lt;br /&gt;
== Comments and Discussion ==&lt;br /&gt;
* See [[{{TALKPAGENAME}}|discussion tab for this feature]] &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;You can add categories to tie features back to real deployments/schools requesting them, for example &amp;lt;nowiki&amp;gt;[[&amp;lt;/nowiki&amp;gt;Category:Features requested by School Xyz]]&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activities/Colors&amp;diff=41390</id>
		<title>Activities/Colors</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activities/Colors&amp;diff=41390"/>
		<updated>2009-12-10T00:09:21Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Colors! developers&amp;#039; page */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;[[Category:Activities|Colors!]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Colors! developers&#039; page==&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
Colors is a simple natural media painting activity for the XO laptop, based on a Nintendo DS program by Jens Andersson.&lt;br /&gt;
&lt;br /&gt;
Rather than constructing images from geometric shapes, the user is encouraged to keep painting on their work until it looks right, starting with rough strokes and then adding extra details.&lt;br /&gt;
&lt;br /&gt;
The activity features soft brushes, collaborative painting, the ability to watch tutorial paintings as they are painted, and a variety of input methods including &amp;quot;video paint&amp;quot; using the webcam.&lt;br /&gt;
&lt;br /&gt;
===Setting up a Wacom tablet===&lt;br /&gt;
&lt;br /&gt;
Colors! versions 11 and above support USB Wacom tablets, such as the [http://www.amazon.com/Bamboo-Small-Pen-Tablet-Only/dp/B000V9T2JA/ref=sr_1_22?ie=UTF8&amp;amp;s=electronics&amp;amp;qid=1228608694&amp;amp;sr=1-22 Wacom Bamboo] ($60 at Amazon).  &lt;br /&gt;
&lt;br /&gt;
====On OLPC XO-1====&lt;br /&gt;
&lt;br /&gt;
Wacom support requires OLPC Software Release 8.2.0, so update if you are on an older build.  &lt;br /&gt;
&lt;br /&gt;
To use your USB Wacom tablet with Colors, you need to do a little work at the Terminal.&lt;br /&gt;
&lt;br /&gt;
 wget http://dev.laptop.org/~wadeb/setupwacom.sh&lt;br /&gt;
 sudo sh setupwacom.sh&lt;br /&gt;
&lt;br /&gt;
This will install the linuxwacom package, download and install the Wacom kernel module, and download and replace your Xorg configuration file with one that supports Wacom tablets.&lt;br /&gt;
&lt;br /&gt;
Restart your XO and launch Colors!.  Voila, Wacom support!  Check the Sensitive buttons in the Brush Control screen to enable pressure sensitivity for brush size and opacity.&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
&lt;br /&gt;
* [http://git.sugarlabs.org/projects/colors Sources]&lt;br /&gt;
* [http://activities.sugarlabs.org/en-US/sugar/addon/4050 Downloads and user-land pages]&lt;br /&gt;
* [http://wiki.laptop.org/go/Colors%21 Colors! on OLPC wiki]&lt;br /&gt;
* Trac Tickets: [http://trac.sugarlabs.org/query?status=accepted&amp;amp;status=assigned&amp;amp;status=closed&amp;amp;status=new&amp;amp;status=reopened&amp;amp;groupdesc=1&amp;amp;group=milestone&amp;amp;component=Colors&amp;amp;order=priority&amp;amp;col=id&amp;amp;col=summary&amp;amp;col=status&amp;amp;col=owner&amp;amp;col=type&amp;amp;col=priority&amp;amp;col=version&amp;amp;col=severity&amp;amp;col=resolution&amp;amp;col=status_field&amp;amp;col=reporter&amp;amp;col=time&amp;amp;col=changetime Sugar Labs] [http://dev.laptop.org/query?status=assigned&amp;amp;status=closed&amp;amp;status=new&amp;amp;status=reopened&amp;amp;groupdesc=1&amp;amp;group=milestone&amp;amp;max=150&amp;amp;component=colors-activity&amp;amp;order=id&amp;amp;col=id&amp;amp;col=summary&amp;amp;col=status&amp;amp;col=owner&amp;amp;col=type&amp;amp;col=next_action&amp;amp;col=changetime OLPC]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Resources&amp;diff=41387</id>
		<title>Activity Team/Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Resources&amp;diff=41387"/>
		<updated>2009-12-09T20:38:06Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Setting up a Sugar environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TeamHeader|Activity Team}}&amp;lt;/noinclude&amp;gt;{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
==Getting started in Activity development==&lt;br /&gt;
If you have no experience developing Sugar activities, these resources will help get you started.&lt;br /&gt;
&lt;br /&gt;
====Setting up a Sugar environment====&lt;br /&gt;
If you use Linux, your best bet is to install [[Development Team/Jhbuild|sugar-jhbuild]].  You will be able to develop in your native environment, treating Sugar as just another desktop application.&lt;br /&gt;
&lt;br /&gt;
If you run MacOS X or Windows, you will need to set up an emulator.  For setup instructions and links to pre-configured virtual machines, see [[VirtualBox]].&lt;br /&gt;
&lt;br /&gt;
To develop efficiently using an emulator or a secondary machine (such as an OLPC XO), find an editor which supports editing files over a SFTP connection.  [http://www.openkomodo.com/ Komodo Edit] with the Remote Drive Tree extension is a good example.&lt;br /&gt;
&lt;br /&gt;
====Python Reference &amp;amp; Tutorials====&lt;br /&gt;
* http://docs.python.org/&lt;br /&gt;
* http://diveintopython.org/&lt;br /&gt;
* [http://pleac.sourceforge.net/pleac_python/index.html PLEAC - Programming Language Examples Alike Cookbook]&lt;br /&gt;
&lt;br /&gt;
Python is the language Sugar is written in and is also used by most activities.  If you don&#039;t already know Python well, you should familiarize yourself with it before continuing.&lt;br /&gt;
&lt;br /&gt;
====PyGTK Reference &amp;amp; Tutorials====&lt;br /&gt;
* http://www.pygtk.org/docs/pygtk/index.html&lt;br /&gt;
* http://www.pygtk.org/docs/pygobject/index.html&lt;br /&gt;
&lt;br /&gt;
PyGTK is the user interface toolkit used by Sugar activities.  Bookmark these two links as you will reference them frequently during development.&lt;br /&gt;
&lt;br /&gt;
* http://www.pygtk.org/pygtk2tutorial/index.html&lt;br /&gt;
&lt;br /&gt;
The following sections of the PyGTK tutorial are most relevant to activity development.&lt;br /&gt;
&lt;br /&gt;
* 1. Introduction&lt;br /&gt;
* 2. Getting Started&lt;br /&gt;
* 3. Moving On&lt;br /&gt;
* 4. Packing Widgets&lt;br /&gt;
* 5. Widget Overview&lt;br /&gt;
* 6. The Button Widget&lt;br /&gt;
* 7. Adjustments&lt;br /&gt;
* 8. Range Widgets&lt;br /&gt;
* 9. Miscellaneous Widgets&lt;br /&gt;
* 10. Container Widgets&lt;br /&gt;
* 12. Drawing Area&lt;br /&gt;
&lt;br /&gt;
====Sugar Activities====&lt;br /&gt;
* [[Development Team/Almanac|Sugar Almanac]]&lt;br /&gt;
&lt;br /&gt;
The Sugar Almanac contains all the information you need to start writing Sugar activities, ranging from directory structure to bundle format to API reference.  It also contains answers to common questions and examples of common tasks.&lt;br /&gt;
&lt;br /&gt;
* http://api.sugarlabs.org/&lt;br /&gt;
&lt;br /&gt;
This automatically updated site contains the official API documentation for Sugar.  Though it is currently quite sparse, the source code is included with the documentation and it&#039;s useful to have that at your fingertips.&lt;br /&gt;
&lt;br /&gt;
====Cairo Graphics====&lt;br /&gt;
* http://www.tortall.net/mu/wiki/CairoTutorial&lt;br /&gt;
&lt;br /&gt;
Cairo is the graphics library used in Sugar.  The tutorial is a good introduction to the API as well as vector graphics programming in general.&lt;br /&gt;
&lt;br /&gt;
====Pygame====&lt;br /&gt;
* http://www.pygame.org/&lt;br /&gt;
* [[Development_Team/sugargame]]&lt;br /&gt;
&lt;br /&gt;
Pygame is a library for developing 2D sprite-based games using Python.  Sugargame is a package which makes it possible to embed Pygame into a Sugar activity.&lt;br /&gt;
&lt;br /&gt;
====Sugar [[Human Interface Guidelines]] (HIG)====&lt;br /&gt;
* [[Human Interface Guidelines]]. &lt;br /&gt;
&lt;br /&gt;
Required reading before planning the user interface for your activity.  These pages give a good introduction to the thought process behind the Sugar environment and will help a lot when designing your activity.&lt;br /&gt;
&lt;br /&gt;
====i18n (Localisation) Best Practices====&lt;br /&gt;
* [[Translation_Team/i18n_Best_Practices]].&lt;br /&gt;
&lt;br /&gt;
Once you have strings in your Activity, here are some general tips which will make your translators happy :-)&lt;br /&gt;
&lt;br /&gt;
====JSON introduction====&lt;br /&gt;
* http://www.json.org/fatfree.html &lt;br /&gt;
&lt;br /&gt;
JSON is a data format commonly used to store activity data in the Journal.&lt;br /&gt;
&lt;br /&gt;
* http://simplejson.googlecode.com/svn/tags/simplejson-2.0.8/docs/index.html&lt;br /&gt;
&lt;br /&gt;
Currently, the recommended JSON library is simplejson.  It has also become the standard JSON library in Python 2.6+.&lt;br /&gt;
&lt;br /&gt;
NOTE: There is an odd thing about simplejson - in python25 it lives in &#039;&#039;simplejson&#039;&#039; module, but in python26 it uses &#039;&#039;json&#039;&#039; module. So, use something like [http://git.sugarlabs.org/projects/sugar-port/repos/mainline/blobs/master/json.py this] to wrap it.&lt;br /&gt;
&lt;br /&gt;
====Git introduction====&lt;br /&gt;
Git is the version control software used by Sugar Labs.  It is a distributed version control system and is quite powerful, but requires a lot of command line use.&lt;br /&gt;
&lt;br /&gt;
* [[Activity Team/Git|Git]]&lt;br /&gt;
&lt;br /&gt;
====XML routines====&lt;br /&gt;
There are [http://docs.python.org/library/markup.html dozens] Python classes to satisfy the XML standard, but if you want just save/load parameters use &amp;quot;Zen of XML&amp;quot; in Python - [http://effbot.org/zone/element.htm ElementTree] library. It&#039;s supported out of the box in Python 2.5 (xml.etree.ElementTree module).  In previous versions you&#039;ll have to install library by yourself.&lt;br /&gt;
&lt;br /&gt;
But if you just need a simple configuration format to read/write Python objects, check out JSON instead.&lt;br /&gt;
&lt;br /&gt;
====Speech synthesizing====&lt;br /&gt;
If you want to add a speech synthesizer for English and other languages, try the [[Development Team/gst-plugins-espeak|gst-plugins-espeak]] plugin for gstreamer.&lt;br /&gt;
&lt;br /&gt;
==Activity Development Resources==&lt;br /&gt;
This is an open area for posting links related to activity development.&lt;br /&gt;
&lt;br /&gt;
===Sample code===&lt;br /&gt;
&lt;br /&gt;
* An example of [[Activity Team/Sample code/Ruler|a simple activity that uses Cairo graphics]]&lt;br /&gt;
* An [http://uclug.org/images/Sugar.odp OpenOffice presentation] that touches on many of the issues encountered by first-time Sugar developers. Some items covered are: What is Sugar and Sugar Labs; What are some development environments; Some Sugar specific python statements for a PyGTK activity; Activity distribution. You can also [http://media.libsyn.com/media/dsyates/101309uclug0020.ogg listen] to the creator ([http://wiki.sugarlabs.org/go/User:Ossfm ossfm]) give the presentation at a LUG meeting (starting at 9 minutes and 55 seconds).&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
* http://docs.python.org/ The official Python documentation.&lt;br /&gt;
* http://www.pygtk.org/docs/pygtk/index.html PyGTK API reference&lt;br /&gt;
* http://www.pygtk.org/docs/pygobject/index.html PyGObject API reference.  Contains a few important things missing from the PyGTK API such as timers and idle callbacks.&lt;br /&gt;
* http://api.sugarlabs.org/ The official Sugar API documentation (quite sparse but includes all the source code).&lt;br /&gt;
* [[Development Team/Almanac]] Detailed Sugar API overview.  Quite in depth and offers answers to common questions.&lt;br /&gt;
* http://pygstdocs.berlios.de/ Python GStreamer bindings.&lt;br /&gt;
* [[Human Interface Guidelines]] The design behind the Sugar interface.  Very important to read and understand before planning your activity&#039;s user interface.&lt;br /&gt;
* http://cairographics.org/documentation/pycairo/ Cairo Python API reference.  Very sparse, use the tutorial instead.&lt;br /&gt;
* [[OLPC:Low-level Activity API]] Information on how activities interact with Sugar.&lt;br /&gt;
* http://www.pygame.org/ The Pygame game development library.&lt;br /&gt;
* [[Development Team/sugargame]] Python package which makes it possible to embed Pygame in a Sugar activity.&lt;br /&gt;
&lt;br /&gt;
===Tutorials and Whitepapers===&lt;br /&gt;
* http://diveintopython.org/ An online book which teaches Python step by step.&lt;br /&gt;
* http://www.pygtk.org/pygtk2tutorial/index.html A very informative step-by-step introduction to PyGTK.&lt;br /&gt;
* http://www.olpcaustria.org/mediawiki/index.php/Activity_handbook Introduction to activity development by OLPC Austria.&lt;br /&gt;
* [[OLPC:Sugar Activity Tutorial]] Another introduction to activity development.&lt;br /&gt;
* http://www.tortall.net/mu/wiki/CairoTutorial A great introduction to Cairo in PyGTK and vector graphics drawing in general.&lt;br /&gt;
* http://www.json.org/fatfree.html An overview of the JSON data format.&lt;br /&gt;
* http://simplejson.googlecode.com/svn/tags/simplejson-2.0.8/docs/index.html Documentation for the recommended JSON library.&lt;br /&gt;
* [[OLPC:Shared Sugar Activities]] High level overview of collaboration.&lt;br /&gt;
* [[OLPC:Collaboration Tutorial]] Step by step tutorial on integrating collaboration into an activity.&lt;br /&gt;
* [[Activity_Team/Modifing_an_Activity]] Information describing simple modifications that can be made to common Sugar activities.&lt;br /&gt;
* [[Activity Team/Compatibility Tips]] Information on ensuring your activity is portable to the various distributions that run Sugar.&lt;br /&gt;
&lt;br /&gt;
===Community resources===&lt;br /&gt;
* http://dev.sugarlabs.org/ Bug tracking for Sugar and activities.  Go here to report bugs in the Sugar toolkit.  Each activity should have its own component here.&lt;br /&gt;
* http://git.sugarlabs.org/ Gitorious source code hosting.&lt;br /&gt;
* http://git.sugarlabs.org/events.atom RSS feed of all Sugar development activity.  Great for keeping an eye on the project as a whole.&lt;br /&gt;
&lt;br /&gt;
===Non-English resources===&lt;br /&gt;
* http://sites.google.com/site/sugaractivities/ Spanish language activity development site in Uruguay.&lt;br /&gt;
&lt;br /&gt;
==Stuck?==&lt;br /&gt;
&lt;br /&gt;
If you have a question, don&#039;t hesitate to ask the activity team.  We are happy to help and can often save you a lot of hunting for answers.&lt;br /&gt;
&lt;br /&gt;
We hang out in #sugar on irc.freenode.net, and you can always [http://lists.sugarlabs.org/listinfo/sugar-devel subscribe] and post questions to sugar-devel@lists.sugarlabs.org.&lt;br /&gt;
&lt;br /&gt;
[[Category:Activity Team]]&lt;br /&gt;
[[Category:Resource]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Resources&amp;diff=41386</id>
		<title>Activity Team/Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Resources&amp;diff=41386"/>
		<updated>2009-12-09T20:37:32Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Setting up a Sugar environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TeamHeader|Activity Team}}&amp;lt;/noinclude&amp;gt;{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
==Getting started in Activity development==&lt;br /&gt;
If you have no experience developing Sugar activities, these resources will help get you started.&lt;br /&gt;
&lt;br /&gt;
====Setting up a Sugar environment====&lt;br /&gt;
If you use Linux, your best bet is to install [[Development Team/Jhbuild|sugar-jhbuild]].  You will be able to develop in your native environment, treating Sugar as just another desktop application.&lt;br /&gt;
&lt;br /&gt;
If you run MacOS X or Windows, you will need to set up an emulator like VirtualBox.  For setup instructions and links to pre-configured virtual machines, see http://wiki.sugarlabs.org/go/VirtualBox.&lt;br /&gt;
&lt;br /&gt;
To develop efficiently using an emulator or a secondary machine (such as an OLPC XO), find an editor which supports editing files over a SFTP connection.  [http://www.openkomodo.com/ Komodo Edit] with the Remote Drive Tree extension is a good example.&lt;br /&gt;
&lt;br /&gt;
====Python Reference &amp;amp; Tutorials====&lt;br /&gt;
* http://docs.python.org/&lt;br /&gt;
* http://diveintopython.org/&lt;br /&gt;
* [http://pleac.sourceforge.net/pleac_python/index.html PLEAC - Programming Language Examples Alike Cookbook]&lt;br /&gt;
&lt;br /&gt;
Python is the language Sugar is written in and is also used by most activities.  If you don&#039;t already know Python well, you should familiarize yourself with it before continuing.&lt;br /&gt;
&lt;br /&gt;
====PyGTK Reference &amp;amp; Tutorials====&lt;br /&gt;
* http://www.pygtk.org/docs/pygtk/index.html&lt;br /&gt;
* http://www.pygtk.org/docs/pygobject/index.html&lt;br /&gt;
&lt;br /&gt;
PyGTK is the user interface toolkit used by Sugar activities.  Bookmark these two links as you will reference them frequently during development.&lt;br /&gt;
&lt;br /&gt;
* http://www.pygtk.org/pygtk2tutorial/index.html&lt;br /&gt;
&lt;br /&gt;
The following sections of the PyGTK tutorial are most relevant to activity development.&lt;br /&gt;
&lt;br /&gt;
* 1. Introduction&lt;br /&gt;
* 2. Getting Started&lt;br /&gt;
* 3. Moving On&lt;br /&gt;
* 4. Packing Widgets&lt;br /&gt;
* 5. Widget Overview&lt;br /&gt;
* 6. The Button Widget&lt;br /&gt;
* 7. Adjustments&lt;br /&gt;
* 8. Range Widgets&lt;br /&gt;
* 9. Miscellaneous Widgets&lt;br /&gt;
* 10. Container Widgets&lt;br /&gt;
* 12. Drawing Area&lt;br /&gt;
&lt;br /&gt;
====Sugar Activities====&lt;br /&gt;
* [[Development Team/Almanac|Sugar Almanac]]&lt;br /&gt;
&lt;br /&gt;
The Sugar Almanac contains all the information you need to start writing Sugar activities, ranging from directory structure to bundle format to API reference.  It also contains answers to common questions and examples of common tasks.&lt;br /&gt;
&lt;br /&gt;
* http://api.sugarlabs.org/&lt;br /&gt;
&lt;br /&gt;
This automatically updated site contains the official API documentation for Sugar.  Though it is currently quite sparse, the source code is included with the documentation and it&#039;s useful to have that at your fingertips.&lt;br /&gt;
&lt;br /&gt;
====Cairo Graphics====&lt;br /&gt;
* http://www.tortall.net/mu/wiki/CairoTutorial&lt;br /&gt;
&lt;br /&gt;
Cairo is the graphics library used in Sugar.  The tutorial is a good introduction to the API as well as vector graphics programming in general.&lt;br /&gt;
&lt;br /&gt;
====Pygame====&lt;br /&gt;
* http://www.pygame.org/&lt;br /&gt;
* [[Development_Team/sugargame]]&lt;br /&gt;
&lt;br /&gt;
Pygame is a library for developing 2D sprite-based games using Python.  Sugargame is a package which makes it possible to embed Pygame into a Sugar activity.&lt;br /&gt;
&lt;br /&gt;
====Sugar [[Human Interface Guidelines]] (HIG)====&lt;br /&gt;
* [[Human Interface Guidelines]]. &lt;br /&gt;
&lt;br /&gt;
Required reading before planning the user interface for your activity.  These pages give a good introduction to the thought process behind the Sugar environment and will help a lot when designing your activity.&lt;br /&gt;
&lt;br /&gt;
====i18n (Localisation) Best Practices====&lt;br /&gt;
* [[Translation_Team/i18n_Best_Practices]].&lt;br /&gt;
&lt;br /&gt;
Once you have strings in your Activity, here are some general tips which will make your translators happy :-)&lt;br /&gt;
&lt;br /&gt;
====JSON introduction====&lt;br /&gt;
* http://www.json.org/fatfree.html &lt;br /&gt;
&lt;br /&gt;
JSON is a data format commonly used to store activity data in the Journal.&lt;br /&gt;
&lt;br /&gt;
* http://simplejson.googlecode.com/svn/tags/simplejson-2.0.8/docs/index.html&lt;br /&gt;
&lt;br /&gt;
Currently, the recommended JSON library is simplejson.  It has also become the standard JSON library in Python 2.6+.&lt;br /&gt;
&lt;br /&gt;
NOTE: There is an odd thing about simplejson - in python25 it lives in &#039;&#039;simplejson&#039;&#039; module, but in python26 it uses &#039;&#039;json&#039;&#039; module. So, use something like [http://git.sugarlabs.org/projects/sugar-port/repos/mainline/blobs/master/json.py this] to wrap it.&lt;br /&gt;
&lt;br /&gt;
====Git introduction====&lt;br /&gt;
Git is the version control software used by Sugar Labs.  It is a distributed version control system and is quite powerful, but requires a lot of command line use.&lt;br /&gt;
&lt;br /&gt;
* [[Activity Team/Git|Git]]&lt;br /&gt;
&lt;br /&gt;
====XML routines====&lt;br /&gt;
There are [http://docs.python.org/library/markup.html dozens] Python classes to satisfy the XML standard, but if you want just save/load parameters use &amp;quot;Zen of XML&amp;quot; in Python - [http://effbot.org/zone/element.htm ElementTree] library. It&#039;s supported out of the box in Python 2.5 (xml.etree.ElementTree module).  In previous versions you&#039;ll have to install library by yourself.&lt;br /&gt;
&lt;br /&gt;
But if you just need a simple configuration format to read/write Python objects, check out JSON instead.&lt;br /&gt;
&lt;br /&gt;
====Speech synthesizing====&lt;br /&gt;
If you want to add a speech synthesizer for English and other languages, try the [[Development Team/gst-plugins-espeak|gst-plugins-espeak]] plugin for gstreamer.&lt;br /&gt;
&lt;br /&gt;
==Activity Development Resources==&lt;br /&gt;
This is an open area for posting links related to activity development.&lt;br /&gt;
&lt;br /&gt;
===Sample code===&lt;br /&gt;
&lt;br /&gt;
* An example of [[Activity Team/Sample code/Ruler|a simple activity that uses Cairo graphics]]&lt;br /&gt;
* An [http://uclug.org/images/Sugar.odp OpenOffice presentation] that touches on many of the issues encountered by first-time Sugar developers. Some items covered are: What is Sugar and Sugar Labs; What are some development environments; Some Sugar specific python statements for a PyGTK activity; Activity distribution. You can also [http://media.libsyn.com/media/dsyates/101309uclug0020.ogg listen] to the creator ([http://wiki.sugarlabs.org/go/User:Ossfm ossfm]) give the presentation at a LUG meeting (starting at 9 minutes and 55 seconds).&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
* http://docs.python.org/ The official Python documentation.&lt;br /&gt;
* http://www.pygtk.org/docs/pygtk/index.html PyGTK API reference&lt;br /&gt;
* http://www.pygtk.org/docs/pygobject/index.html PyGObject API reference.  Contains a few important things missing from the PyGTK API such as timers and idle callbacks.&lt;br /&gt;
* http://api.sugarlabs.org/ The official Sugar API documentation (quite sparse but includes all the source code).&lt;br /&gt;
* [[Development Team/Almanac]] Detailed Sugar API overview.  Quite in depth and offers answers to common questions.&lt;br /&gt;
* http://pygstdocs.berlios.de/ Python GStreamer bindings.&lt;br /&gt;
* [[Human Interface Guidelines]] The design behind the Sugar interface.  Very important to read and understand before planning your activity&#039;s user interface.&lt;br /&gt;
* http://cairographics.org/documentation/pycairo/ Cairo Python API reference.  Very sparse, use the tutorial instead.&lt;br /&gt;
* [[OLPC:Low-level Activity API]] Information on how activities interact with Sugar.&lt;br /&gt;
* http://www.pygame.org/ The Pygame game development library.&lt;br /&gt;
* [[Development Team/sugargame]] Python package which makes it possible to embed Pygame in a Sugar activity.&lt;br /&gt;
&lt;br /&gt;
===Tutorials and Whitepapers===&lt;br /&gt;
* http://diveintopython.org/ An online book which teaches Python step by step.&lt;br /&gt;
* http://www.pygtk.org/pygtk2tutorial/index.html A very informative step-by-step introduction to PyGTK.&lt;br /&gt;
* http://www.olpcaustria.org/mediawiki/index.php/Activity_handbook Introduction to activity development by OLPC Austria.&lt;br /&gt;
* [[OLPC:Sugar Activity Tutorial]] Another introduction to activity development.&lt;br /&gt;
* http://www.tortall.net/mu/wiki/CairoTutorial A great introduction to Cairo in PyGTK and vector graphics drawing in general.&lt;br /&gt;
* http://www.json.org/fatfree.html An overview of the JSON data format.&lt;br /&gt;
* http://simplejson.googlecode.com/svn/tags/simplejson-2.0.8/docs/index.html Documentation for the recommended JSON library.&lt;br /&gt;
* [[OLPC:Shared Sugar Activities]] High level overview of collaboration.&lt;br /&gt;
* [[OLPC:Collaboration Tutorial]] Step by step tutorial on integrating collaboration into an activity.&lt;br /&gt;
* [[Activity_Team/Modifing_an_Activity]] Information describing simple modifications that can be made to common Sugar activities.&lt;br /&gt;
* [[Activity Team/Compatibility Tips]] Information on ensuring your activity is portable to the various distributions that run Sugar.&lt;br /&gt;
&lt;br /&gt;
===Community resources===&lt;br /&gt;
* http://dev.sugarlabs.org/ Bug tracking for Sugar and activities.  Go here to report bugs in the Sugar toolkit.  Each activity should have its own component here.&lt;br /&gt;
* http://git.sugarlabs.org/ Gitorious source code hosting.&lt;br /&gt;
* http://git.sugarlabs.org/events.atom RSS feed of all Sugar development activity.  Great for keeping an eye on the project as a whole.&lt;br /&gt;
&lt;br /&gt;
===Non-English resources===&lt;br /&gt;
* http://sites.google.com/site/sugaractivities/ Spanish language activity development site in Uruguay.&lt;br /&gt;
&lt;br /&gt;
==Stuck?==&lt;br /&gt;
&lt;br /&gt;
If you have a question, don&#039;t hesitate to ask the activity team.  We are happy to help and can often save you a lot of hunting for answers.&lt;br /&gt;
&lt;br /&gt;
We hang out in #sugar on irc.freenode.net, and you can always [http://lists.sugarlabs.org/listinfo/sugar-devel subscribe] and post questions to sugar-devel@lists.sugarlabs.org.&lt;br /&gt;
&lt;br /&gt;
[[Category:Activity Team]]&lt;br /&gt;
[[Category:Resource]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Resources&amp;diff=41385</id>
		<title>Activity Team/Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Resources&amp;diff=41385"/>
		<updated>2009-12-09T20:36:58Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Setting up a Sugar environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TeamHeader|Activity Team}}&amp;lt;/noinclude&amp;gt;{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
==Getting started in Activity development==&lt;br /&gt;
If you have no experience developing Sugar activities, these resources will help get you started.&lt;br /&gt;
&lt;br /&gt;
====Setting up a Sugar environment====&lt;br /&gt;
If you use Linux, your best bet is to install [[Development Team/Jhbuild|sugar-jhbuild]].  You will be able to develop in your native environment, treating Sugar as just another desktop application.&lt;br /&gt;
&lt;br /&gt;
If you run MacOS X or Windows, you will need to set up an emulator like VirtualBox.  For setup instructions and links to pre-configured virtual machines, see http://wiki.sugarlabs.org/go/VirtualBox.&lt;br /&gt;
&lt;br /&gt;
To develop efficiently using an emulator or a secondary machine (such as an OLPC XO), find an editor which supports editing files over a SFTP connection.  [http://www.openkomodo.com/ Komodo Edit] is a good example.&lt;br /&gt;
&lt;br /&gt;
====Python Reference &amp;amp; Tutorials====&lt;br /&gt;
* http://docs.python.org/&lt;br /&gt;
* http://diveintopython.org/&lt;br /&gt;
* [http://pleac.sourceforge.net/pleac_python/index.html PLEAC - Programming Language Examples Alike Cookbook]&lt;br /&gt;
&lt;br /&gt;
Python is the language Sugar is written in and is also used by most activities.  If you don&#039;t already know Python well, you should familiarize yourself with it before continuing.&lt;br /&gt;
&lt;br /&gt;
====PyGTK Reference &amp;amp; Tutorials====&lt;br /&gt;
* http://www.pygtk.org/docs/pygtk/index.html&lt;br /&gt;
* http://www.pygtk.org/docs/pygobject/index.html&lt;br /&gt;
&lt;br /&gt;
PyGTK is the user interface toolkit used by Sugar activities.  Bookmark these two links as you will reference them frequently during development.&lt;br /&gt;
&lt;br /&gt;
* http://www.pygtk.org/pygtk2tutorial/index.html&lt;br /&gt;
&lt;br /&gt;
The following sections of the PyGTK tutorial are most relevant to activity development.&lt;br /&gt;
&lt;br /&gt;
* 1. Introduction&lt;br /&gt;
* 2. Getting Started&lt;br /&gt;
* 3. Moving On&lt;br /&gt;
* 4. Packing Widgets&lt;br /&gt;
* 5. Widget Overview&lt;br /&gt;
* 6. The Button Widget&lt;br /&gt;
* 7. Adjustments&lt;br /&gt;
* 8. Range Widgets&lt;br /&gt;
* 9. Miscellaneous Widgets&lt;br /&gt;
* 10. Container Widgets&lt;br /&gt;
* 12. Drawing Area&lt;br /&gt;
&lt;br /&gt;
====Sugar Activities====&lt;br /&gt;
* [[Development Team/Almanac|Sugar Almanac]]&lt;br /&gt;
&lt;br /&gt;
The Sugar Almanac contains all the information you need to start writing Sugar activities, ranging from directory structure to bundle format to API reference.  It also contains answers to common questions and examples of common tasks.&lt;br /&gt;
&lt;br /&gt;
* http://api.sugarlabs.org/&lt;br /&gt;
&lt;br /&gt;
This automatically updated site contains the official API documentation for Sugar.  Though it is currently quite sparse, the source code is included with the documentation and it&#039;s useful to have that at your fingertips.&lt;br /&gt;
&lt;br /&gt;
====Cairo Graphics====&lt;br /&gt;
* http://www.tortall.net/mu/wiki/CairoTutorial&lt;br /&gt;
&lt;br /&gt;
Cairo is the graphics library used in Sugar.  The tutorial is a good introduction to the API as well as vector graphics programming in general.&lt;br /&gt;
&lt;br /&gt;
====Pygame====&lt;br /&gt;
* http://www.pygame.org/&lt;br /&gt;
* [[Development_Team/sugargame]]&lt;br /&gt;
&lt;br /&gt;
Pygame is a library for developing 2D sprite-based games using Python.  Sugargame is a package which makes it possible to embed Pygame into a Sugar activity.&lt;br /&gt;
&lt;br /&gt;
====Sugar [[Human Interface Guidelines]] (HIG)====&lt;br /&gt;
* [[Human Interface Guidelines]]. &lt;br /&gt;
&lt;br /&gt;
Required reading before planning the user interface for your activity.  These pages give a good introduction to the thought process behind the Sugar environment and will help a lot when designing your activity.&lt;br /&gt;
&lt;br /&gt;
====i18n (Localisation) Best Practices====&lt;br /&gt;
* [[Translation_Team/i18n_Best_Practices]].&lt;br /&gt;
&lt;br /&gt;
Once you have strings in your Activity, here are some general tips which will make your translators happy :-)&lt;br /&gt;
&lt;br /&gt;
====JSON introduction====&lt;br /&gt;
* http://www.json.org/fatfree.html &lt;br /&gt;
&lt;br /&gt;
JSON is a data format commonly used to store activity data in the Journal.&lt;br /&gt;
&lt;br /&gt;
* http://simplejson.googlecode.com/svn/tags/simplejson-2.0.8/docs/index.html&lt;br /&gt;
&lt;br /&gt;
Currently, the recommended JSON library is simplejson.  It has also become the standard JSON library in Python 2.6+.&lt;br /&gt;
&lt;br /&gt;
NOTE: There is an odd thing about simplejson - in python25 it lives in &#039;&#039;simplejson&#039;&#039; module, but in python26 it uses &#039;&#039;json&#039;&#039; module. So, use something like [http://git.sugarlabs.org/projects/sugar-port/repos/mainline/blobs/master/json.py this] to wrap it.&lt;br /&gt;
&lt;br /&gt;
====Git introduction====&lt;br /&gt;
Git is the version control software used by Sugar Labs.  It is a distributed version control system and is quite powerful, but requires a lot of command line use.&lt;br /&gt;
&lt;br /&gt;
* [[Activity Team/Git|Git]]&lt;br /&gt;
&lt;br /&gt;
====XML routines====&lt;br /&gt;
There are [http://docs.python.org/library/markup.html dozens] Python classes to satisfy the XML standard, but if you want just save/load parameters use &amp;quot;Zen of XML&amp;quot; in Python - [http://effbot.org/zone/element.htm ElementTree] library. It&#039;s supported out of the box in Python 2.5 (xml.etree.ElementTree module).  In previous versions you&#039;ll have to install library by yourself.&lt;br /&gt;
&lt;br /&gt;
But if you just need a simple configuration format to read/write Python objects, check out JSON instead.&lt;br /&gt;
&lt;br /&gt;
====Speech synthesizing====&lt;br /&gt;
If you want to add a speech synthesizer for English and other languages, try the [[Development Team/gst-plugins-espeak|gst-plugins-espeak]] plugin for gstreamer.&lt;br /&gt;
&lt;br /&gt;
==Activity Development Resources==&lt;br /&gt;
This is an open area for posting links related to activity development.&lt;br /&gt;
&lt;br /&gt;
===Sample code===&lt;br /&gt;
&lt;br /&gt;
* An example of [[Activity Team/Sample code/Ruler|a simple activity that uses Cairo graphics]]&lt;br /&gt;
* An [http://uclug.org/images/Sugar.odp OpenOffice presentation] that touches on many of the issues encountered by first-time Sugar developers. Some items covered are: What is Sugar and Sugar Labs; What are some development environments; Some Sugar specific python statements for a PyGTK activity; Activity distribution. You can also [http://media.libsyn.com/media/dsyates/101309uclug0020.ogg listen] to the creator ([http://wiki.sugarlabs.org/go/User:Ossfm ossfm]) give the presentation at a LUG meeting (starting at 9 minutes and 55 seconds).&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
* http://docs.python.org/ The official Python documentation.&lt;br /&gt;
* http://www.pygtk.org/docs/pygtk/index.html PyGTK API reference&lt;br /&gt;
* http://www.pygtk.org/docs/pygobject/index.html PyGObject API reference.  Contains a few important things missing from the PyGTK API such as timers and idle callbacks.&lt;br /&gt;
* http://api.sugarlabs.org/ The official Sugar API documentation (quite sparse but includes all the source code).&lt;br /&gt;
* [[Development Team/Almanac]] Detailed Sugar API overview.  Quite in depth and offers answers to common questions.&lt;br /&gt;
* http://pygstdocs.berlios.de/ Python GStreamer bindings.&lt;br /&gt;
* [[Human Interface Guidelines]] The design behind the Sugar interface.  Very important to read and understand before planning your activity&#039;s user interface.&lt;br /&gt;
* http://cairographics.org/documentation/pycairo/ Cairo Python API reference.  Very sparse, use the tutorial instead.&lt;br /&gt;
* [[OLPC:Low-level Activity API]] Information on how activities interact with Sugar.&lt;br /&gt;
* http://www.pygame.org/ The Pygame game development library.&lt;br /&gt;
* [[Development Team/sugargame]] Python package which makes it possible to embed Pygame in a Sugar activity.&lt;br /&gt;
&lt;br /&gt;
===Tutorials and Whitepapers===&lt;br /&gt;
* http://diveintopython.org/ An online book which teaches Python step by step.&lt;br /&gt;
* http://www.pygtk.org/pygtk2tutorial/index.html A very informative step-by-step introduction to PyGTK.&lt;br /&gt;
* http://www.olpcaustria.org/mediawiki/index.php/Activity_handbook Introduction to activity development by OLPC Austria.&lt;br /&gt;
* [[OLPC:Sugar Activity Tutorial]] Another introduction to activity development.&lt;br /&gt;
* http://www.tortall.net/mu/wiki/CairoTutorial A great introduction to Cairo in PyGTK and vector graphics drawing in general.&lt;br /&gt;
* http://www.json.org/fatfree.html An overview of the JSON data format.&lt;br /&gt;
* http://simplejson.googlecode.com/svn/tags/simplejson-2.0.8/docs/index.html Documentation for the recommended JSON library.&lt;br /&gt;
* [[OLPC:Shared Sugar Activities]] High level overview of collaboration.&lt;br /&gt;
* [[OLPC:Collaboration Tutorial]] Step by step tutorial on integrating collaboration into an activity.&lt;br /&gt;
* [[Activity_Team/Modifing_an_Activity]] Information describing simple modifications that can be made to common Sugar activities.&lt;br /&gt;
* [[Activity Team/Compatibility Tips]] Information on ensuring your activity is portable to the various distributions that run Sugar.&lt;br /&gt;
&lt;br /&gt;
===Community resources===&lt;br /&gt;
* http://dev.sugarlabs.org/ Bug tracking for Sugar and activities.  Go here to report bugs in the Sugar toolkit.  Each activity should have its own component here.&lt;br /&gt;
* http://git.sugarlabs.org/ Gitorious source code hosting.&lt;br /&gt;
* http://git.sugarlabs.org/events.atom RSS feed of all Sugar development activity.  Great for keeping an eye on the project as a whole.&lt;br /&gt;
&lt;br /&gt;
===Non-English resources===&lt;br /&gt;
* http://sites.google.com/site/sugaractivities/ Spanish language activity development site in Uruguay.&lt;br /&gt;
&lt;br /&gt;
==Stuck?==&lt;br /&gt;
&lt;br /&gt;
If you have a question, don&#039;t hesitate to ask the activity team.  We are happy to help and can often save you a lot of hunting for answers.&lt;br /&gt;
&lt;br /&gt;
We hang out in #sugar on irc.freenode.net, and you can always [http://lists.sugarlabs.org/listinfo/sugar-devel subscribe] and post questions to sugar-devel@lists.sugarlabs.org.&lt;br /&gt;
&lt;br /&gt;
[[Category:Activity Team]]&lt;br /&gt;
[[Category:Resource]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Resources&amp;diff=41384</id>
		<title>Activity Team/Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Resources&amp;diff=41384"/>
		<updated>2009-12-09T20:34:14Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Activity Development Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TeamHeader|Activity Team}}&amp;lt;/noinclude&amp;gt;{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
==Getting started in Activity development==&lt;br /&gt;
If you have no experience developing Sugar activities, these resources will help get you started.&lt;br /&gt;
&lt;br /&gt;
====Setting up a Sugar environment====&lt;br /&gt;
If you use Linux, your best bet is to install [[Development Team/Jhbuild|sugar-jhbuild]].  You will be able to develop in your native environment, treating Sugar as just another desktop application.&lt;br /&gt;
&lt;br /&gt;
If you run MacOS X or Windows, you will need to set up an emulator.  For Mac OS X, see [[Supported_systems/Mac]].  For Windows, see [[Supported_systems/Windows]].  &lt;br /&gt;
&lt;br /&gt;
To develop efficiently using an emulator or a secondary machine running Sugar natively (such as an OLPC XO), find an editor which supports editing files over a SFTP connection.  [http://www.openkomodo.com/ Komodo Edit] is a good example.&lt;br /&gt;
&lt;br /&gt;
====Python Reference &amp;amp; Tutorials====&lt;br /&gt;
* http://docs.python.org/&lt;br /&gt;
* http://diveintopython.org/&lt;br /&gt;
* [http://pleac.sourceforge.net/pleac_python/index.html PLEAC - Programming Language Examples Alike Cookbook]&lt;br /&gt;
&lt;br /&gt;
Python is the language Sugar is written in and is also used by most activities.  If you don&#039;t already know Python well, you should familiarize yourself with it before continuing.&lt;br /&gt;
&lt;br /&gt;
====PyGTK Reference &amp;amp; Tutorials====&lt;br /&gt;
* http://www.pygtk.org/docs/pygtk/index.html&lt;br /&gt;
* http://www.pygtk.org/docs/pygobject/index.html&lt;br /&gt;
&lt;br /&gt;
PyGTK is the user interface toolkit used by Sugar activities.  Bookmark these two links as you will reference them frequently during development.&lt;br /&gt;
&lt;br /&gt;
* http://www.pygtk.org/pygtk2tutorial/index.html&lt;br /&gt;
&lt;br /&gt;
The following sections of the PyGTK tutorial are most relevant to activity development.&lt;br /&gt;
&lt;br /&gt;
* 1. Introduction&lt;br /&gt;
* 2. Getting Started&lt;br /&gt;
* 3. Moving On&lt;br /&gt;
* 4. Packing Widgets&lt;br /&gt;
* 5. Widget Overview&lt;br /&gt;
* 6. The Button Widget&lt;br /&gt;
* 7. Adjustments&lt;br /&gt;
* 8. Range Widgets&lt;br /&gt;
* 9. Miscellaneous Widgets&lt;br /&gt;
* 10. Container Widgets&lt;br /&gt;
* 12. Drawing Area&lt;br /&gt;
&lt;br /&gt;
====Sugar Activities====&lt;br /&gt;
* [[Development Team/Almanac|Sugar Almanac]]&lt;br /&gt;
&lt;br /&gt;
The Sugar Almanac contains all the information you need to start writing Sugar activities, ranging from directory structure to bundle format to API reference.  It also contains answers to common questions and examples of common tasks.&lt;br /&gt;
&lt;br /&gt;
* http://api.sugarlabs.org/&lt;br /&gt;
&lt;br /&gt;
This automatically updated site contains the official API documentation for Sugar.  Though it is currently quite sparse, the source code is included with the documentation and it&#039;s useful to have that at your fingertips.&lt;br /&gt;
&lt;br /&gt;
====Cairo Graphics====&lt;br /&gt;
* http://www.tortall.net/mu/wiki/CairoTutorial&lt;br /&gt;
&lt;br /&gt;
Cairo is the graphics library used in Sugar.  The tutorial is a good introduction to the API as well as vector graphics programming in general.&lt;br /&gt;
&lt;br /&gt;
====Pygame====&lt;br /&gt;
* http://www.pygame.org/&lt;br /&gt;
* [[Development_Team/sugargame]]&lt;br /&gt;
&lt;br /&gt;
Pygame is a library for developing 2D sprite-based games using Python.  Sugargame is a package which makes it possible to embed Pygame into a Sugar activity.&lt;br /&gt;
&lt;br /&gt;
====Sugar [[Human Interface Guidelines]] (HIG)====&lt;br /&gt;
* [[Human Interface Guidelines]]. &lt;br /&gt;
&lt;br /&gt;
Required reading before planning the user interface for your activity.  These pages give a good introduction to the thought process behind the Sugar environment and will help a lot when designing your activity.&lt;br /&gt;
&lt;br /&gt;
====i18n (Localisation) Best Practices====&lt;br /&gt;
* [[Translation_Team/i18n_Best_Practices]].&lt;br /&gt;
&lt;br /&gt;
Once you have strings in your Activity, here are some general tips which will make your translators happy :-)&lt;br /&gt;
&lt;br /&gt;
====JSON introduction====&lt;br /&gt;
* http://www.json.org/fatfree.html &lt;br /&gt;
&lt;br /&gt;
JSON is a data format commonly used to store activity data in the Journal.&lt;br /&gt;
&lt;br /&gt;
* http://simplejson.googlecode.com/svn/tags/simplejson-2.0.8/docs/index.html&lt;br /&gt;
&lt;br /&gt;
Currently, the recommended JSON library is simplejson.  It has also become the standard JSON library in Python 2.6+.&lt;br /&gt;
&lt;br /&gt;
NOTE: There is an odd thing about simplejson - in python25 it lives in &#039;&#039;simplejson&#039;&#039; module, but in python26 it uses &#039;&#039;json&#039;&#039; module. So, use something like [http://git.sugarlabs.org/projects/sugar-port/repos/mainline/blobs/master/json.py this] to wrap it.&lt;br /&gt;
&lt;br /&gt;
====Git introduction====&lt;br /&gt;
Git is the version control software used by Sugar Labs.  It is a distributed version control system and is quite powerful, but requires a lot of command line use.&lt;br /&gt;
&lt;br /&gt;
* [[Activity Team/Git|Git]]&lt;br /&gt;
&lt;br /&gt;
====XML routines====&lt;br /&gt;
There are [http://docs.python.org/library/markup.html dozens] Python classes to satisfy the XML standard, but if you want just save/load parameters use &amp;quot;Zen of XML&amp;quot; in Python - [http://effbot.org/zone/element.htm ElementTree] library. It&#039;s supported out of the box in Python 2.5 (xml.etree.ElementTree module).  In previous versions you&#039;ll have to install library by yourself.&lt;br /&gt;
&lt;br /&gt;
But if you just need a simple configuration format to read/write Python objects, check out JSON instead.&lt;br /&gt;
&lt;br /&gt;
====Speech synthesizing====&lt;br /&gt;
If you want to add a speech synthesizer for English and other languages, try the [[Development Team/gst-plugins-espeak|gst-plugins-espeak]] plugin for gstreamer.&lt;br /&gt;
&lt;br /&gt;
==Activity Development Resources==&lt;br /&gt;
This is an open area for posting links related to activity development.&lt;br /&gt;
&lt;br /&gt;
===Sample code===&lt;br /&gt;
&lt;br /&gt;
* An example of [[Activity Team/Sample code/Ruler|a simple activity that uses Cairo graphics]]&lt;br /&gt;
* An [http://uclug.org/images/Sugar.odp OpenOffice presentation] that touches on many of the issues encountered by first-time Sugar developers. Some items covered are: What is Sugar and Sugar Labs; What are some development environments; Some Sugar specific python statements for a PyGTK activity; Activity distribution. You can also [http://media.libsyn.com/media/dsyates/101309uclug0020.ogg listen] to the creator ([http://wiki.sugarlabs.org/go/User:Ossfm ossfm]) give the presentation at a LUG meeting (starting at 9 minutes and 55 seconds).&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
* http://docs.python.org/ The official Python documentation.&lt;br /&gt;
* http://www.pygtk.org/docs/pygtk/index.html PyGTK API reference&lt;br /&gt;
* http://www.pygtk.org/docs/pygobject/index.html PyGObject API reference.  Contains a few important things missing from the PyGTK API such as timers and idle callbacks.&lt;br /&gt;
* http://api.sugarlabs.org/ The official Sugar API documentation (quite sparse but includes all the source code).&lt;br /&gt;
* [[Development Team/Almanac]] Detailed Sugar API overview.  Quite in depth and offers answers to common questions.&lt;br /&gt;
* http://pygstdocs.berlios.de/ Python GStreamer bindings.&lt;br /&gt;
* [[Human Interface Guidelines]] The design behind the Sugar interface.  Very important to read and understand before planning your activity&#039;s user interface.&lt;br /&gt;
* http://cairographics.org/documentation/pycairo/ Cairo Python API reference.  Very sparse, use the tutorial instead.&lt;br /&gt;
* [[OLPC:Low-level Activity API]] Information on how activities interact with Sugar.&lt;br /&gt;
* http://www.pygame.org/ The Pygame game development library.&lt;br /&gt;
* [[Development Team/sugargame]] Python package which makes it possible to embed Pygame in a Sugar activity.&lt;br /&gt;
&lt;br /&gt;
===Tutorials and Whitepapers===&lt;br /&gt;
* http://diveintopython.org/ An online book which teaches Python step by step.&lt;br /&gt;
* http://www.pygtk.org/pygtk2tutorial/index.html A very informative step-by-step introduction to PyGTK.&lt;br /&gt;
* http://www.olpcaustria.org/mediawiki/index.php/Activity_handbook Introduction to activity development by OLPC Austria.&lt;br /&gt;
* [[OLPC:Sugar Activity Tutorial]] Another introduction to activity development.&lt;br /&gt;
* http://www.tortall.net/mu/wiki/CairoTutorial A great introduction to Cairo in PyGTK and vector graphics drawing in general.&lt;br /&gt;
* http://www.json.org/fatfree.html An overview of the JSON data format.&lt;br /&gt;
* http://simplejson.googlecode.com/svn/tags/simplejson-2.0.8/docs/index.html Documentation for the recommended JSON library.&lt;br /&gt;
* [[OLPC:Shared Sugar Activities]] High level overview of collaboration.&lt;br /&gt;
* [[OLPC:Collaboration Tutorial]] Step by step tutorial on integrating collaboration into an activity.&lt;br /&gt;
* [[Activity_Team/Modifing_an_Activity]] Information describing simple modifications that can be made to common Sugar activities.&lt;br /&gt;
* [[Activity Team/Compatibility Tips]] Information on ensuring your activity is portable to the various distributions that run Sugar.&lt;br /&gt;
&lt;br /&gt;
===Community resources===&lt;br /&gt;
* http://dev.sugarlabs.org/ Bug tracking for Sugar and activities.  Go here to report bugs in the Sugar toolkit.  Each activity should have its own component here.&lt;br /&gt;
* http://git.sugarlabs.org/ Gitorious source code hosting.&lt;br /&gt;
* http://git.sugarlabs.org/events.atom RSS feed of all Sugar development activity.  Great for keeping an eye on the project as a whole.&lt;br /&gt;
&lt;br /&gt;
===Non-English resources===&lt;br /&gt;
* http://sites.google.com/site/sugaractivities/ Spanish language activity development site in Uruguay.&lt;br /&gt;
&lt;br /&gt;
==Stuck?==&lt;br /&gt;
&lt;br /&gt;
If you have a question, don&#039;t hesitate to ask the activity team.  We are happy to help and can often save you a lot of hunting for answers.&lt;br /&gt;
&lt;br /&gt;
We hang out in #sugar on irc.freenode.net, and you can always [http://lists.sugarlabs.org/listinfo/sugar-devel subscribe] and post questions to sugar-devel@lists.sugarlabs.org.&lt;br /&gt;
&lt;br /&gt;
[[Category:Activity Team]]&lt;br /&gt;
[[Category:Resource]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activities/Typing_Turtle&amp;diff=40489</id>
		<title>Activities/Typing Turtle</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activities/Typing_Turtle&amp;diff=40489"/>
		<updated>2009-11-22T18:51:27Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Typing Turtle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TOCright}}&lt;br /&gt;
[[Category:Activities|Typing Turtle]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typing Turtle==&lt;br /&gt;
&lt;br /&gt;
Typing Turtle is available from the Sugar Labs Activity Library: http://activities.sugarlabs.org/en-US/sugar/addon/4026.&lt;br /&gt;
&lt;br /&gt;
Typing Turtle is an interactive touch typing program.  It gradually introduces the keys on the keyboard through a series of lessons, until the student has learned the entire keyboard.  Skills are reinforced with typing games. &lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Screenshots can be found at the [http://activities.sugarlabs.org/en-US/sugar/addon/4026 Activity page].&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* An on-screen keyboard with overlaid hand positions shows the correct way to press each key, encouraging good typing habits.&lt;br /&gt;
* Automatically picks up and uses the system&#039;s keyboard layout.&lt;br /&gt;
* You can make your own lessons, and send them to students or friends.&lt;br /&gt;
* A balloon game provides an entertaining way to gain skill.&lt;br /&gt;
* Medals are awarded as the user completes the lessons.  Gold is for the best accuracy and speed, followed by Silver and Bronze.&lt;br /&gt;
&lt;br /&gt;
===Localizing Typing Turtle===&lt;br /&gt;
As with any other Sugar activity, Typing Turtle is translated using [translate.sugarlabs.org Pootle].  Pootle displays the translatable strings from the newest version of the activity and allows them to be translated into a different language.  When translations are saved, the author is notified and will then release a new version to activities.sugarlabs.org with the new translations.  &lt;br /&gt;
&lt;br /&gt;
Typing Turtle&#039;s lesson content is too complex to be translated the same way, and must be created from scratch for each language and keyboard layout.  Use the lesson editor feature to create a new set of lessons for your language and keyboard layout, export the lessons to the Journal, and email them to the author.  They will be included in the next version.&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40476</id>
		<title>Development Team/Sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40476"/>
		<updated>2009-11-21T17:44:29Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Sugargame */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sugargame ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] &lt;br /&gt;
programs to run well under Sugar. &lt;br /&gt;
It is fork of the olcpgames framework, which is no longer maintained.&lt;br /&gt;
&lt;br /&gt;
http://git.sugarlabs.org/projects/sugargame&lt;br /&gt;
&lt;br /&gt;
What it does:&lt;br /&gt;
&lt;br /&gt;
* Wraps a Sugar activity around an existing Pygame program with few changes&lt;br /&gt;
* Allows Sugar toolbars and other widgets to be added to the activity UI&lt;br /&gt;
* Provides hooks for saving to and restoring from the Journal&lt;br /&gt;
&lt;br /&gt;
==== Differences between Sugargame and olpcgames ====&lt;br /&gt;
&lt;br /&gt;
The olpcgames framework provides a wrapper around Pygame which attempts to &lt;br /&gt;
allow a Pygame program to run mostly unmodified under Sugar.  To this end, &lt;br /&gt;
the Pygame program is run in a separate thread with its own Pygame message &lt;br /&gt;
loop while the main thread runs the GTK message loop.  Also, olpcgames wraps &lt;br /&gt;
Sugar APIs such as the journal and mesh into a Pygame-like API.&lt;br /&gt;
&lt;br /&gt;
Sugargame takes a simpler approach; it provides a way to embed Pygame into a &lt;br /&gt;
GTK widget.  The Sugar APIs are used to interact with Sugar, the Pygame APIs &lt;br /&gt;
are used for the game.  &lt;br /&gt;
&lt;br /&gt;
Sugargame advantages:&lt;br /&gt;
&lt;br /&gt;
* Simpler code&lt;br /&gt;
* More elegant interface between Pygame and GTK&lt;br /&gt;
* Runs as a single thread: no thread related segfaults&lt;br /&gt;
* Possible to use Sugar widgets with Pygame&lt;br /&gt;
&lt;br /&gt;
Sugargame limitations:&lt;br /&gt;
&lt;br /&gt;
* No support for Pango or SVG sprites (yet)&lt;br /&gt;
&lt;br /&gt;
== Using Sugargame ==&lt;br /&gt;
&lt;br /&gt;
See also [[Development Team/Sugargame/Examples]].&lt;br /&gt;
&lt;br /&gt;
==== Wrapping a Pygame program ====&lt;br /&gt;
&lt;br /&gt;
To use Sugargame to Sugarize a Pygame program, set up an activity directory and &lt;br /&gt;
copy the Sugargame package to it.&lt;br /&gt;
&lt;br /&gt;
The activity directory should look something like this:&lt;br /&gt;
 &lt;br /&gt;
   activity/            - Activity directory: activity.info, SVG icon, etc.&lt;br /&gt;
   sugargame/           - Sugargame package&lt;br /&gt;
   MyActivity.py        - Activity class&lt;br /&gt;
   mygame.py            - Pygame code&lt;br /&gt;
   setup.py             - Install script&lt;br /&gt;
&lt;br /&gt;
To make the Activity class, start with test/TestActivity.py from the Sugargame &lt;br /&gt;
distribution.  &lt;br /&gt;
&lt;br /&gt;
The activity should create a single PygameCanvas widget and call run_pygame on it.  &lt;br /&gt;
Pass the main loop function of the Pygame program.&lt;br /&gt;
&lt;br /&gt;
 self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 self.set_canvas(self._canvas)&lt;br /&gt;
        &lt;br /&gt;
 # Start the game running.&lt;br /&gt;
 self._canvas.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
In your Pygame main loop, pump the GTK message loop:&lt;br /&gt;
&lt;br /&gt;
   while gtk.events_pending():&lt;br /&gt;
       gtk.main_iteration()&lt;br /&gt;
&lt;br /&gt;
==== Adding Pygame to a PyGTK activity ====&lt;br /&gt;
&lt;br /&gt;
To add Pygame to an existing Sugar activity, create a PygameCanvas widget and call &lt;br /&gt;
run_pygame on it.  &lt;br /&gt;
&lt;br /&gt;
 widget = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 vbox.pack_start(widget)&lt;br /&gt;
 &lt;br /&gt;
 widget.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
Due to limitations of Pygame and SDL, there can only be one PygameCanvas in the &lt;br /&gt;
entire activity.&lt;br /&gt;
&lt;br /&gt;
The argument to run_pygame is a function structured like a Pygame program.  In the &lt;br /&gt;
main loop, remember to dispatch GTK messages using gtk.main_iteration().&lt;br /&gt;
&lt;br /&gt;
 def main_loop():&lt;br /&gt;
        clock = pygame.time.Clock()&lt;br /&gt;
        screen = pygame.display.get_surface()&lt;br /&gt;
 &lt;br /&gt;
        while self.running:&lt;br /&gt;
            # Pump GTK messages.&lt;br /&gt;
            while gtk.events_pending():&lt;br /&gt;
                gtk.main_iteration()&lt;br /&gt;
 &lt;br /&gt;
            # Pump PyGame messages.&lt;br /&gt;
            for event in pygame.event.get():&lt;br /&gt;
                if event.type == pygame.QUIT:&lt;br /&gt;
                    return&lt;br /&gt;
                elif event.type == pygame.VIDEORESIZE:&lt;br /&gt;
                    pygame.display.set_mode(event.size, pygame.RESIZABLE)&lt;br /&gt;
 &lt;br /&gt;
            # Clear Display&lt;br /&gt;
            screen.fill((255,255,255)) #255 for white&lt;br /&gt;
 &lt;br /&gt;
            # Draw stuff here&lt;br /&gt;
            .................&lt;br /&gt;
 &lt;br /&gt;
            # Flip Display&lt;br /&gt;
            pygame.display.flip()  &lt;br /&gt;
             &lt;br /&gt;
            # Try to stay at 30 FPS&lt;br /&gt;
            self.clock.tick(30)&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
&lt;br /&gt;
For help with Sugargame, please email the Sugar Labs development list:&lt;br /&gt;
&lt;br /&gt;
: sugar-devel@lists.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
Sugargame is developed by Wade Brainerd &amp;lt;wadetb@gmail.com&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
It is loosely based on the source code to the olpcgames framework, developed by &lt;br /&gt;
the One Laptop Per Child project.&lt;br /&gt;
&lt;br /&gt;
=== Changelog ===&lt;br /&gt;
&lt;br /&gt;
====v1.0====&lt;br /&gt;
Initial version of Sugargame&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame/Examples&amp;diff=40474</id>
		<title>Development Team/Sugargame/Examples</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame/Examples&amp;diff=40474"/>
		<updated>2009-11-21T17:25:03Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* TestGame.py */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bouncing Ball ==&lt;br /&gt;
&lt;br /&gt;
This is a simple Sugargame example which bounces a red ball across the screen.  &lt;br /&gt;
&lt;br /&gt;
A Sugar toolbar provides Pause and Unpause functionality, demonstrating communication between Sugar and Pygame.&lt;br /&gt;
&lt;br /&gt;
====TestActivity.py====&lt;br /&gt;
&lt;br /&gt;
This file implements the TestActivity activity class.  The constructor sets up the Pygame canvas and Sugar toolbar, and starts the game running.&lt;br /&gt;
&lt;br /&gt;
    from gettext import gettext as _&lt;br /&gt;
    &lt;br /&gt;
    import sys&lt;br /&gt;
    import gtk&lt;br /&gt;
    import pygame&lt;br /&gt;
    &lt;br /&gt;
    import sugar.activity.activity&lt;br /&gt;
    import sugar.graphics.toolbutton&lt;br /&gt;
    &lt;br /&gt;
    sys.path.append(&#039;..&#039;) # Import sugargame package from top directory.&lt;br /&gt;
    import sugargame.canvas&lt;br /&gt;
    &lt;br /&gt;
    import TestGame&lt;br /&gt;
    &lt;br /&gt;
    class TestActivity(sugar.activity.activity.Activity):&lt;br /&gt;
        def __init__(self, handle):&lt;br /&gt;
            super(TestActivity, self).__init__(handle)&lt;br /&gt;
            &lt;br /&gt;
            self.paused = False&lt;br /&gt;
    &lt;br /&gt;
            # Create the game instance.&lt;br /&gt;
            self.game = TestGame.TestGame()&lt;br /&gt;
    &lt;br /&gt;
            # Build the activity toolbar.&lt;br /&gt;
            self.build_toolbar()&lt;br /&gt;
    &lt;br /&gt;
            # Build the Pygame canvas.&lt;br /&gt;
            self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
            # Note that set_canvas implicitly calls read_file when resuming from the Journal.&lt;br /&gt;
            self.set_canvas(self._canvas)&lt;br /&gt;
            &lt;br /&gt;
            # Start the game running.&lt;br /&gt;
            self._canvas.run_pygame(self.game.run)&lt;br /&gt;
            &lt;br /&gt;
        def build_toolbar(self):        &lt;br /&gt;
            stop_play = sugar.graphics.toolbutton.ToolButton(&#039;media-playback-stop&#039;)&lt;br /&gt;
            stop_play.set_tooltip(_(&amp;quot;Stop&amp;quot;))&lt;br /&gt;
            stop_play.set_accelerator(_(&#039;&amp;lt;ctrl&amp;gt;space&#039;))&lt;br /&gt;
            stop_play.connect(&#039;clicked&#039;, self._stop_play_cb)&lt;br /&gt;
    &lt;br /&gt;
            toolbar = gtk.Toolbar()&lt;br /&gt;
            toolbar.insert(stop_play, 0)&lt;br /&gt;
            toolbar.insert(gtk.SeparatorToolItem(), 1)&lt;br /&gt;
            &lt;br /&gt;
            toolbox = sugar.activity.activity.ActivityToolbox(self)&lt;br /&gt;
            toolbox.add_toolbar(_(&amp;quot;Pygame&amp;quot;), toolbar)&lt;br /&gt;
            &lt;br /&gt;
            toolbox.show_all()&lt;br /&gt;
            self.set_toolbox(toolbox)&lt;br /&gt;
    &lt;br /&gt;
        def _stop_play_cb(self, button):&lt;br /&gt;
            # Pause or unpause the game.&lt;br /&gt;
            self.paused = not self.paused&lt;br /&gt;
            self.game.set_paused(self.paused)&lt;br /&gt;
            &lt;br /&gt;
            # Update the button to show the next action.&lt;br /&gt;
            if self.paused:&lt;br /&gt;
                button.set_icon(&#039;media-playback-start&#039;)&lt;br /&gt;
                button.set_tooltip(_(&amp;quot;Start&amp;quot;))&lt;br /&gt;
            else:&lt;br /&gt;
                button.set_icon(&#039;media-playback-stop&#039;)&lt;br /&gt;
                button.set_tooltip(_(&amp;quot;Stop&amp;quot;))&lt;br /&gt;
    &lt;br /&gt;
        def read_file(self, file_path):&lt;br /&gt;
            self.game.read_file(file_path)&lt;br /&gt;
            &lt;br /&gt;
        def write_file(self, file_path):&lt;br /&gt;
            self.game.write_file(file_path)&lt;br /&gt;
&lt;br /&gt;
====TestGame.py====&lt;br /&gt;
&lt;br /&gt;
This file implements the game (really just a bouncing ball animation).  Note the main function at the end; this file can also be run as a standalone Pygame program.&lt;br /&gt;
&lt;br /&gt;
    #!/usr/bin/python&lt;br /&gt;
    import pygame&lt;br /&gt;
    import gtk&lt;br /&gt;
    &lt;br /&gt;
    class TestGame:&lt;br /&gt;
        def __init__(self):&lt;br /&gt;
            # Set up a clock for managing the frame rate.&lt;br /&gt;
            self.clock = pygame.time.Clock()&lt;br /&gt;
    &lt;br /&gt;
            self.x = -100&lt;br /&gt;
            self.y = 100&lt;br /&gt;
    &lt;br /&gt;
            self.vx = 10&lt;br /&gt;
            self.vy = 0&lt;br /&gt;
    &lt;br /&gt;
            self.paused = False&lt;br /&gt;
            &lt;br /&gt;
        def set_paused(self, paused):&lt;br /&gt;
            self.paused = paused&lt;br /&gt;
    &lt;br /&gt;
        # Called to save the state of the game to the Journal.&lt;br /&gt;
        def write_file(self, file_path):&lt;br /&gt;
            pass&lt;br /&gt;
    &lt;br /&gt;
        # Called to load the state of the game from the Journal.&lt;br /&gt;
        def read_file(self, file_path):&lt;br /&gt;
            pass&lt;br /&gt;
            &lt;br /&gt;
        # The main game loop.&lt;br /&gt;
        def run(self):&lt;br /&gt;
            self.running = True    &lt;br /&gt;
                &lt;br /&gt;
            screen = pygame.display.get_surface()&lt;br /&gt;
    &lt;br /&gt;
            while self.running:&lt;br /&gt;
                # Pump GTK messages.&lt;br /&gt;
                while gtk.events_pending():&lt;br /&gt;
                    gtk.main_iteration()&lt;br /&gt;
    &lt;br /&gt;
                # Pump PyGame messages.&lt;br /&gt;
                for event in pygame.event.get():&lt;br /&gt;
                    if event.type == pygame.QUIT:&lt;br /&gt;
                        return&lt;br /&gt;
                    elif event.type == pygame.VIDEORESIZE:&lt;br /&gt;
                        pygame.display.set_mode(event.size, pygame.RESIZABLE)&lt;br /&gt;
 &lt;br /&gt;
                # Move the ball&lt;br /&gt;
                if not self.paused:&lt;br /&gt;
                    self.x += self.vx&lt;br /&gt;
                    if self.x &amp;gt; screen.get_width() + 100:&lt;br /&gt;
                        self.x = -100&lt;br /&gt;
                    &lt;br /&gt;
                    self.y += self.vy&lt;br /&gt;
                    if self.y &amp;gt; screen.get_height() - 100:&lt;br /&gt;
                        self.y = screen.get_height() - 100&lt;br /&gt;
                        self.vy = -self.vy&lt;br /&gt;
                    &lt;br /&gt;
                    self.vy += 5;&lt;br /&gt;
                &lt;br /&gt;
                # Clear Display&lt;br /&gt;
                screen.fill((255,255,255)) #255 for white&lt;br /&gt;
    &lt;br /&gt;
                # Draw the ball&lt;br /&gt;
                pygame.draw.circle(screen, (255,0,0), (self.x, self.y), 100)&lt;br /&gt;
                        &lt;br /&gt;
                # Flip Display&lt;br /&gt;
                pygame.display.flip()  &lt;br /&gt;
                &lt;br /&gt;
                # Try to stay at 30 FPS&lt;br /&gt;
                self.clock.tick(30)&lt;br /&gt;
    &lt;br /&gt;
    # This function is called when the game is run directly from the command line:&lt;br /&gt;
    # ./TestGame.py &lt;br /&gt;
    def main():&lt;br /&gt;
        pygame.init()&lt;br /&gt;
        pygame.display.set_mode((0, 0), pygame.RESIZABLE)&lt;br /&gt;
        game = TestGame() &lt;br /&gt;
        game.run()&lt;br /&gt;
    &lt;br /&gt;
    if __name__ == &#039;__main__&#039;:&lt;br /&gt;
        main()&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame/Examples&amp;diff=40473</id>
		<title>Development Team/Sugargame/Examples</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame/Examples&amp;diff=40473"/>
		<updated>2009-11-21T17:24:44Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* TestGame.py */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bouncing Ball ==&lt;br /&gt;
&lt;br /&gt;
This is a simple Sugargame example which bounces a red ball across the screen.  &lt;br /&gt;
&lt;br /&gt;
A Sugar toolbar provides Pause and Unpause functionality, demonstrating communication between Sugar and Pygame.&lt;br /&gt;
&lt;br /&gt;
====TestActivity.py====&lt;br /&gt;
&lt;br /&gt;
This file implements the TestActivity activity class.  The constructor sets up the Pygame canvas and Sugar toolbar, and starts the game running.&lt;br /&gt;
&lt;br /&gt;
    from gettext import gettext as _&lt;br /&gt;
    &lt;br /&gt;
    import sys&lt;br /&gt;
    import gtk&lt;br /&gt;
    import pygame&lt;br /&gt;
    &lt;br /&gt;
    import sugar.activity.activity&lt;br /&gt;
    import sugar.graphics.toolbutton&lt;br /&gt;
    &lt;br /&gt;
    sys.path.append(&#039;..&#039;) # Import sugargame package from top directory.&lt;br /&gt;
    import sugargame.canvas&lt;br /&gt;
    &lt;br /&gt;
    import TestGame&lt;br /&gt;
    &lt;br /&gt;
    class TestActivity(sugar.activity.activity.Activity):&lt;br /&gt;
        def __init__(self, handle):&lt;br /&gt;
            super(TestActivity, self).__init__(handle)&lt;br /&gt;
            &lt;br /&gt;
            self.paused = False&lt;br /&gt;
    &lt;br /&gt;
            # Create the game instance.&lt;br /&gt;
            self.game = TestGame.TestGame()&lt;br /&gt;
    &lt;br /&gt;
            # Build the activity toolbar.&lt;br /&gt;
            self.build_toolbar()&lt;br /&gt;
    &lt;br /&gt;
            # Build the Pygame canvas.&lt;br /&gt;
            self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
            # Note that set_canvas implicitly calls read_file when resuming from the Journal.&lt;br /&gt;
            self.set_canvas(self._canvas)&lt;br /&gt;
            &lt;br /&gt;
            # Start the game running.&lt;br /&gt;
            self._canvas.run_pygame(self.game.run)&lt;br /&gt;
            &lt;br /&gt;
        def build_toolbar(self):        &lt;br /&gt;
            stop_play = sugar.graphics.toolbutton.ToolButton(&#039;media-playback-stop&#039;)&lt;br /&gt;
            stop_play.set_tooltip(_(&amp;quot;Stop&amp;quot;))&lt;br /&gt;
            stop_play.set_accelerator(_(&#039;&amp;lt;ctrl&amp;gt;space&#039;))&lt;br /&gt;
            stop_play.connect(&#039;clicked&#039;, self._stop_play_cb)&lt;br /&gt;
    &lt;br /&gt;
            toolbar = gtk.Toolbar()&lt;br /&gt;
            toolbar.insert(stop_play, 0)&lt;br /&gt;
            toolbar.insert(gtk.SeparatorToolItem(), 1)&lt;br /&gt;
            &lt;br /&gt;
            toolbox = sugar.activity.activity.ActivityToolbox(self)&lt;br /&gt;
            toolbox.add_toolbar(_(&amp;quot;Pygame&amp;quot;), toolbar)&lt;br /&gt;
            &lt;br /&gt;
            toolbox.show_all()&lt;br /&gt;
            self.set_toolbox(toolbox)&lt;br /&gt;
    &lt;br /&gt;
        def _stop_play_cb(self, button):&lt;br /&gt;
            # Pause or unpause the game.&lt;br /&gt;
            self.paused = not self.paused&lt;br /&gt;
            self.game.set_paused(self.paused)&lt;br /&gt;
            &lt;br /&gt;
            # Update the button to show the next action.&lt;br /&gt;
            if self.paused:&lt;br /&gt;
                button.set_icon(&#039;media-playback-start&#039;)&lt;br /&gt;
                button.set_tooltip(_(&amp;quot;Start&amp;quot;))&lt;br /&gt;
            else:&lt;br /&gt;
                button.set_icon(&#039;media-playback-stop&#039;)&lt;br /&gt;
                button.set_tooltip(_(&amp;quot;Stop&amp;quot;))&lt;br /&gt;
    &lt;br /&gt;
        def read_file(self, file_path):&lt;br /&gt;
            self.game.read_file(file_path)&lt;br /&gt;
            &lt;br /&gt;
        def write_file(self, file_path):&lt;br /&gt;
            self.game.write_file(file_path)&lt;br /&gt;
&lt;br /&gt;
====TestGame.py====&lt;br /&gt;
&lt;br /&gt;
This file implements the game (really just a bouncing ball animation).  Note the main function at the end; this file can also be run as a standalone Pygame program.&lt;br /&gt;
&lt;br /&gt;
    #!/usr/bin/python&lt;br /&gt;
    import pygame&lt;br /&gt;
    import gtk&lt;br /&gt;
    &lt;br /&gt;
    class TestGame:&lt;br /&gt;
        def __init__(self):&lt;br /&gt;
            # Set up a clock for managing the frame rate.&lt;br /&gt;
            self.clock = pygame.time.Clock()&lt;br /&gt;
    &lt;br /&gt;
            self.x = -100&lt;br /&gt;
            self.y = 100&lt;br /&gt;
    &lt;br /&gt;
            self.vx = 10&lt;br /&gt;
            self.vy = 0&lt;br /&gt;
    &lt;br /&gt;
            self.paused = False&lt;br /&gt;
            &lt;br /&gt;
        def set_paused(self, paused):&lt;br /&gt;
            self.paused = paused&lt;br /&gt;
    &lt;br /&gt;
        # Called to save the state of the game to the Journal.&lt;br /&gt;
        def write_file(self, file_path):&lt;br /&gt;
            pass&lt;br /&gt;
    &lt;br /&gt;
        # Called to load the state of the game from the Journal.&lt;br /&gt;
        def read_file(self, file_path):&lt;br /&gt;
            pass&lt;br /&gt;
            &lt;br /&gt;
        # The main game loop.&lt;br /&gt;
        def run(self):&lt;br /&gt;
            self.running = True    &lt;br /&gt;
                &lt;br /&gt;
            screen = pygame.display.get_surface()&lt;br /&gt;
    &lt;br /&gt;
            while self.running:&lt;br /&gt;
                # Pump GTK messages.&lt;br /&gt;
                while gtk.events_pending():&lt;br /&gt;
                    gtk.main_iteration()&lt;br /&gt;
    &lt;br /&gt;
                # Pump PyGame messages.&lt;br /&gt;
                for event in pygame.event.get():&lt;br /&gt;
                    if event.type == pygame.QUIT:&lt;br /&gt;
                        return&lt;br /&gt;
                    elif event.type == pygame.VIDEORESIZE:&lt;br /&gt;
                        pygame.display.set_mode(event.size, pygame.RESIZABLE)&lt;br /&gt;
&lt;br /&gt;
                # Move the ball&lt;br /&gt;
                if not self.paused:&lt;br /&gt;
                    self.x += self.vx&lt;br /&gt;
                    if self.x &amp;gt; screen.get_width() + 100:&lt;br /&gt;
                        self.x = -100&lt;br /&gt;
                    &lt;br /&gt;
                    self.y += self.vy&lt;br /&gt;
                    if self.y &amp;gt; screen.get_height() - 100:&lt;br /&gt;
                        self.y = screen.get_height() - 100&lt;br /&gt;
                        self.vy = -self.vy&lt;br /&gt;
                    &lt;br /&gt;
                    self.vy += 5;&lt;br /&gt;
                &lt;br /&gt;
                # Clear Display&lt;br /&gt;
                screen.fill((255,255,255)) #255 for white&lt;br /&gt;
    &lt;br /&gt;
                # Draw the ball&lt;br /&gt;
                pygame.draw.circle(screen, (255,0,0), (self.x, self.y), 100)&lt;br /&gt;
                        &lt;br /&gt;
                # Flip Display&lt;br /&gt;
                pygame.display.flip()  &lt;br /&gt;
                &lt;br /&gt;
                # Try to stay at 30 FPS&lt;br /&gt;
                self.clock.tick(30)&lt;br /&gt;
    &lt;br /&gt;
    # This function is called when the game is run directly from the command line:&lt;br /&gt;
    # ./TestGame.py &lt;br /&gt;
    def main():&lt;br /&gt;
        pygame.init()&lt;br /&gt;
        pygame.display.set_mode((0, 0), pygame.RESIZABLE)&lt;br /&gt;
        game = TestGame() &lt;br /&gt;
        game.run()&lt;br /&gt;
    &lt;br /&gt;
    if __name__ == &#039;__main__&#039;:&lt;br /&gt;
        main()&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40472</id>
		<title>Development Team/Sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40472"/>
		<updated>2009-11-21T17:20:52Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Using Sugargame */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sugargame ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] &lt;br /&gt;
programs to run well under Sugar. &lt;br /&gt;
It is fork of the olcpgames framework, which is no longer maintained.&lt;br /&gt;
&lt;br /&gt;
What it does:&lt;br /&gt;
&lt;br /&gt;
* Wraps a Sugar activity around an existing Pygame program with few changes&lt;br /&gt;
* Allows Sugar toolbars and other widgets to be added to the activity UI&lt;br /&gt;
* Provides hooks for saving to and restoring from the Journal&lt;br /&gt;
&lt;br /&gt;
==== Differences between Sugargame and olpcgames ====&lt;br /&gt;
&lt;br /&gt;
The olpcgames framework provides a wrapper around Pygame which attempts to &lt;br /&gt;
allow a Pygame program to run mostly unmodified under Sugar.  To this end, &lt;br /&gt;
the Pygame program is run in a separate thread with its own Pygame message &lt;br /&gt;
loop while the main thread runs the GTK message loop.  Also, olpcgames wraps &lt;br /&gt;
Sugar APIs such as the journal and mesh into a Pygame-like API.&lt;br /&gt;
&lt;br /&gt;
Sugargame takes a simpler approach; it provides a way to embed Pygame into a &lt;br /&gt;
GTK widget.  The Sugar APIs are used to interact with Sugar, the Pygame APIs &lt;br /&gt;
are used for the game.  &lt;br /&gt;
&lt;br /&gt;
Sugargame advantages:&lt;br /&gt;
&lt;br /&gt;
* Simpler code&lt;br /&gt;
* More elegant interface between Pygame and GTK&lt;br /&gt;
* Runs as a single thread: no thread related segfaults&lt;br /&gt;
* Possible to use Sugar widgets with Pygame&lt;br /&gt;
&lt;br /&gt;
Sugargame limitations:&lt;br /&gt;
&lt;br /&gt;
* No support for Pango or SVG sprites (yet)&lt;br /&gt;
&lt;br /&gt;
== Using Sugargame ==&lt;br /&gt;
&lt;br /&gt;
See also [[Development Team/Sugargame/Examples]].&lt;br /&gt;
&lt;br /&gt;
==== Wrapping a Pygame program ====&lt;br /&gt;
&lt;br /&gt;
To use Sugargame to Sugarize a Pygame program, set up an activity directory and &lt;br /&gt;
copy the Sugargame package to it.&lt;br /&gt;
&lt;br /&gt;
The activity directory should look something like this:&lt;br /&gt;
 &lt;br /&gt;
   activity/            - Activity directory: activity.info, SVG icon, etc.&lt;br /&gt;
   sugargame/           - Sugargame package&lt;br /&gt;
   MyActivity.py        - Activity class&lt;br /&gt;
   mygame.py            - Pygame code&lt;br /&gt;
   setup.py             - Install script&lt;br /&gt;
&lt;br /&gt;
To make the Activity class, start with test/TestActivity.py from the Sugargame &lt;br /&gt;
distribution.  &lt;br /&gt;
&lt;br /&gt;
The activity should create a single PygameCanvas widget and call run_pygame on it.  &lt;br /&gt;
Pass the main loop function of the Pygame program.&lt;br /&gt;
&lt;br /&gt;
 self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 self.set_canvas(self._canvas)&lt;br /&gt;
        &lt;br /&gt;
 # Start the game running.&lt;br /&gt;
 self._canvas.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
In your Pygame main loop, pump the GTK message loop:&lt;br /&gt;
&lt;br /&gt;
   while gtk.events_pending():&lt;br /&gt;
       gtk.main_iteration()&lt;br /&gt;
&lt;br /&gt;
==== Adding Pygame to a PyGTK activity ====&lt;br /&gt;
&lt;br /&gt;
To add Pygame to an existing Sugar activity, create a PygameCanvas widget and call &lt;br /&gt;
run_pygame on it.  &lt;br /&gt;
&lt;br /&gt;
 widget = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 vbox.pack_start(widget)&lt;br /&gt;
 &lt;br /&gt;
 widget.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
Due to limitations of Pygame and SDL, there can only be one PygameCanvas in the &lt;br /&gt;
entire activity.&lt;br /&gt;
&lt;br /&gt;
The argument to run_pygame is a function structured like a Pygame program.  In the &lt;br /&gt;
main loop, remember to dispatch GTK messages using gtk.main_iteration().&lt;br /&gt;
&lt;br /&gt;
 def main_loop():&lt;br /&gt;
        clock = pygame.time.Clock()&lt;br /&gt;
        screen = pygame.display.get_surface()&lt;br /&gt;
 &lt;br /&gt;
        while self.running:&lt;br /&gt;
            # Pump GTK messages.&lt;br /&gt;
            while gtk.events_pending():&lt;br /&gt;
                gtk.main_iteration()&lt;br /&gt;
 &lt;br /&gt;
            # Pump PyGame messages.&lt;br /&gt;
            for event in pygame.event.get():&lt;br /&gt;
                if event.type == pygame.QUIT:&lt;br /&gt;
                    return&lt;br /&gt;
                elif event.type == pygame.VIDEORESIZE:&lt;br /&gt;
                    pygame.display.set_mode(event.size, pygame.RESIZABLE)&lt;br /&gt;
 &lt;br /&gt;
            # Clear Display&lt;br /&gt;
            screen.fill((255,255,255)) #255 for white&lt;br /&gt;
 &lt;br /&gt;
            # Draw stuff here&lt;br /&gt;
            .................&lt;br /&gt;
 &lt;br /&gt;
            # Flip Display&lt;br /&gt;
            pygame.display.flip()  &lt;br /&gt;
             &lt;br /&gt;
            # Try to stay at 30 FPS&lt;br /&gt;
            self.clock.tick(30)&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
&lt;br /&gt;
For help with Sugargame, please email the Sugar Labs development list:&lt;br /&gt;
&lt;br /&gt;
: sugar-devel@lists.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
Sugargame is developed by Wade Brainerd &amp;lt;wadetb@gmail.com&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
It is loosely based on the source code to the olpcgames framework, developed by &lt;br /&gt;
the One Laptop Per Child project.&lt;br /&gt;
&lt;br /&gt;
=== Changelog ===&lt;br /&gt;
&lt;br /&gt;
====v1.0====&lt;br /&gt;
Initial version of Sugargame&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40470</id>
		<title>Development Team/Sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40470"/>
		<updated>2009-11-21T16:07:21Z</updated>

		<summary type="html">&lt;p&gt;Wade: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sugargame ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] &lt;br /&gt;
programs to run well under Sugar. &lt;br /&gt;
It is fork of the olcpgames framework, which is no longer maintained.&lt;br /&gt;
&lt;br /&gt;
What it does:&lt;br /&gt;
&lt;br /&gt;
* Wraps a Sugar activity around an existing Pygame program with few changes&lt;br /&gt;
* Allows Sugar toolbars and other widgets to be added to the activity UI&lt;br /&gt;
* Provides hooks for saving to and restoring from the Journal&lt;br /&gt;
&lt;br /&gt;
==== Differences between Sugargame and olpcgames ====&lt;br /&gt;
&lt;br /&gt;
The olpcgames framework provides a wrapper around Pygame which attempts to &lt;br /&gt;
allow a Pygame program to run mostly unmodified under Sugar.  To this end, &lt;br /&gt;
the Pygame program is run in a separate thread with its own Pygame message &lt;br /&gt;
loop while the main thread runs the GTK message loop.  Also, olpcgames wraps &lt;br /&gt;
Sugar APIs such as the journal and mesh into a Pygame-like API.&lt;br /&gt;
&lt;br /&gt;
Sugargame takes a simpler approach; it provides a way to embed Pygame into a &lt;br /&gt;
GTK widget.  The Sugar APIs are used to interact with Sugar, the Pygame APIs &lt;br /&gt;
are used for the game.  &lt;br /&gt;
&lt;br /&gt;
Sugargame advantages:&lt;br /&gt;
&lt;br /&gt;
* Simpler code&lt;br /&gt;
* More elegant interface between Pygame and GTK&lt;br /&gt;
* Runs as a single thread: no thread related segfaults&lt;br /&gt;
* Possible to use Sugar widgets with Pygame&lt;br /&gt;
&lt;br /&gt;
Sugargame limitations:&lt;br /&gt;
&lt;br /&gt;
* No support for Pango or SVG sprites (yet)&lt;br /&gt;
&lt;br /&gt;
== Using Sugargame ==&lt;br /&gt;
&lt;br /&gt;
See also [[Development Team/Sugargame/Examples]].&lt;br /&gt;
&lt;br /&gt;
==== Wrapping a Pygame program ====&lt;br /&gt;
&lt;br /&gt;
To use Sugargame to Sugarize a Pygame program, set up an activity directory and &lt;br /&gt;
copy the Sugargame package to it.&lt;br /&gt;
&lt;br /&gt;
The activity directory should look something like this:&lt;br /&gt;
 &lt;br /&gt;
   activity/            - Activity directory: activity.info, SVG icon, etc.&lt;br /&gt;
   sugargame/           - Sugargame package&lt;br /&gt;
   MyActivity.py        - Activity class&lt;br /&gt;
   mygame.py            - Pygame code&lt;br /&gt;
   setup.py             - Install script&lt;br /&gt;
&lt;br /&gt;
To make the Activity class, start with test/TestActivity.py from the Sugargame &lt;br /&gt;
distribution.  &lt;br /&gt;
&lt;br /&gt;
The activity should create a single PygameCanvas widget and call run_pygame on it.  &lt;br /&gt;
Pass the main loop function of the Pygame program.&lt;br /&gt;
&lt;br /&gt;
 self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 self.set_canvas(self._canvas)&lt;br /&gt;
        &lt;br /&gt;
 # Start the game running.&lt;br /&gt;
 self._canvas.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
In your Pygame main loop, pump the GTK message loop:&lt;br /&gt;
&lt;br /&gt;
   while gtk.events_pending():&lt;br /&gt;
       gtk.main_iteration()&lt;br /&gt;
&lt;br /&gt;
==== Adding Pygame to a PyGTK activity ====&lt;br /&gt;
&lt;br /&gt;
To add Pygame to an existing Sugar activity, create a PygameCanvas widget and call &lt;br /&gt;
run_pygame on it.  &lt;br /&gt;
&lt;br /&gt;
 widget = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 vbox.pack_start(widget)&lt;br /&gt;
 &lt;br /&gt;
 widget.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
Due to limitations of Pygame and SDL, there can only be one PygameCanvas in the &lt;br /&gt;
entire activity.&lt;br /&gt;
&lt;br /&gt;
The argument to run_pygame is a function structured like a Pygame program.  In the &lt;br /&gt;
main loop, remember to dispatch GTK messages using gtk.main_iteration().&lt;br /&gt;
&lt;br /&gt;
 def main_loop():&lt;br /&gt;
        clock = pygame.time.Clock()&lt;br /&gt;
        screen = pygame.display.get_surface()&lt;br /&gt;
 &lt;br /&gt;
        while self.running:&lt;br /&gt;
            # Pump GTK messages.&lt;br /&gt;
            while gtk.events_pending():&lt;br /&gt;
                gtk.main_iteration()&lt;br /&gt;
 &lt;br /&gt;
            # Pump PyGame messages.&lt;br /&gt;
            for event in pygame.event.get():&lt;br /&gt;
                if event.type == pygame.QUIT:&lt;br /&gt;
                    return&lt;br /&gt;
 &lt;br /&gt;
            # Clear Display&lt;br /&gt;
            screen.fill((255,255,255)) #255 for white&lt;br /&gt;
 &lt;br /&gt;
            # Draw stuff here&lt;br /&gt;
            .................&lt;br /&gt;
 &lt;br /&gt;
            # Flip Display&lt;br /&gt;
            pygame.display.flip()  &lt;br /&gt;
             &lt;br /&gt;
            # Try to stay at 30 FPS&lt;br /&gt;
            self.clock.tick(30)&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
&lt;br /&gt;
For help with Sugargame, please email the Sugar Labs development list:&lt;br /&gt;
&lt;br /&gt;
: sugar-devel@lists.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
Sugargame is developed by Wade Brainerd &amp;lt;wadetb@gmail.com&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
It is loosely based on the source code to the olpcgames framework, developed by &lt;br /&gt;
the One Laptop Per Child project.&lt;br /&gt;
&lt;br /&gt;
=== Changelog ===&lt;br /&gt;
&lt;br /&gt;
====v1.0====&lt;br /&gt;
Initial version of Sugargame&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40469</id>
		<title>Development Team/Sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40469"/>
		<updated>2009-11-21T16:05:37Z</updated>

		<summary type="html">&lt;p&gt;Wade: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sugargame ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] programs to run well under Sugar. &lt;br /&gt;
It is fork of the olcpgames framework, which is no longer maintained.&lt;br /&gt;
&lt;br /&gt;
What it does:&lt;br /&gt;
&lt;br /&gt;
* Wraps a Sugar activity around an existing Pygame program with few changes&lt;br /&gt;
* Allows Sugar toolbars and other widgets to be added to the activity UI&lt;br /&gt;
* Provides hooks for saving to and restoring from the Journal&lt;br /&gt;
&lt;br /&gt;
==== Differences between Sugargame and olpcgames ====&lt;br /&gt;
&lt;br /&gt;
The olpcgames framework provides a wrapper around Pygame which attempts to allow a Pygame program to run mostly unmodified under Sugar.  To this end, the Pygame program is run in a separate thread with its own Pygame message loop while the main thread runs the GTK message loop.  Also, olpcgames wraps Sugar APIs such as the journal and mesh into a Pygame-like API.&lt;br /&gt;
&lt;br /&gt;
Sugargame takes a simpler approach; it provides a way to embed Pygame into a GTK widget.  The Sugar APIs are used to interact with Sugar, the Pygame APIs are used for the game.  &lt;br /&gt;
&lt;br /&gt;
Sugargame advantages:&lt;br /&gt;
&lt;br /&gt;
* Simpler code&lt;br /&gt;
* More elegant interface between Pygame and GTK&lt;br /&gt;
* Runs as a single thread: no thread related segfaults&lt;br /&gt;
* Possible to use Sugar widgets with Pygame&lt;br /&gt;
&lt;br /&gt;
Sugargame limitations:&lt;br /&gt;
&lt;br /&gt;
* No support for Pango or SVG sprites (yet)&lt;br /&gt;
&lt;br /&gt;
== Using Sugargame ==&lt;br /&gt;
&lt;br /&gt;
See also [[Development Team/Sugargame/Examples]].&lt;br /&gt;
&lt;br /&gt;
==== Wrapping a Pygame program ====&lt;br /&gt;
&lt;br /&gt;
To use Sugargame to Sugarize a Pygame program, set up an activity directory and copy the Sugargame package to it.&lt;br /&gt;
&lt;br /&gt;
The activity directory should look something like this:&lt;br /&gt;
 &lt;br /&gt;
   activity/            - Activity directory: activity.info, SVG icon, etc.&lt;br /&gt;
   sugargame/           - Sugargame package&lt;br /&gt;
   MyActivity.py        - Activity class&lt;br /&gt;
   mygame.py            - Pygame code&lt;br /&gt;
   setup.py             - Install script&lt;br /&gt;
&lt;br /&gt;
To make the Activity class, start with test/TestActivity.py from the Sugargame distribution.  &lt;br /&gt;
&lt;br /&gt;
The activity should create a single PygameCanvas widget and call run_pygame on it.  Pass the main loop function of the Pygame program.&lt;br /&gt;
&lt;br /&gt;
 self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 self.set_canvas(self._canvas)&lt;br /&gt;
        &lt;br /&gt;
 # Start the game running.&lt;br /&gt;
 self._canvas.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
In your Pygame main loop, pump the GTK message loop:&lt;br /&gt;
&lt;br /&gt;
   while gtk.events_pending():&lt;br /&gt;
       gtk.main_iteration()&lt;br /&gt;
&lt;br /&gt;
==== Adding Pygame to a PyGTK activity ====&lt;br /&gt;
&lt;br /&gt;
To add Pygame to an existing Sugar activity, create a PygameCanvas widget and call run_pygame on it.  &lt;br /&gt;
&lt;br /&gt;
 widget = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 vbox.pack_start(widget)&lt;br /&gt;
 &lt;br /&gt;
 widget.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
Due to limitations of Pygame and SDL, there can only be one PygameCanvas in the entire activity.&lt;br /&gt;
&lt;br /&gt;
The argument to run_pygame is a function structured like a Pygame program.  In the main loop, remember to dispatch GTK messages using gtk.main_iteration().&lt;br /&gt;
&lt;br /&gt;
 def main_loop():&lt;br /&gt;
        clock = pygame.time.Clock()&lt;br /&gt;
        screen = pygame.display.get_surface()&lt;br /&gt;
 &lt;br /&gt;
        while self.running:&lt;br /&gt;
            # Pump GTK messages.&lt;br /&gt;
            while gtk.events_pending():&lt;br /&gt;
                gtk.main_iteration()&lt;br /&gt;
 &lt;br /&gt;
            # Pump PyGame messages.&lt;br /&gt;
            for event in pygame.event.get():&lt;br /&gt;
                if event.type == pygame.QUIT:&lt;br /&gt;
                    return&lt;br /&gt;
 &lt;br /&gt;
            # Clear Display&lt;br /&gt;
            screen.fill((255,255,255)) #255 for white&lt;br /&gt;
 &lt;br /&gt;
            # Draw stuff here&lt;br /&gt;
            .................&lt;br /&gt;
 &lt;br /&gt;
            # Flip Display&lt;br /&gt;
            pygame.display.flip()  &lt;br /&gt;
             &lt;br /&gt;
            # Try to stay at 30 FPS&lt;br /&gt;
            self.clock.tick(30)&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
&lt;br /&gt;
For help with Sugargame, please email the Sugar Labs development list:&lt;br /&gt;
&lt;br /&gt;
: sugar-devel@lists.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
Sugargame is developed by Wade Brainerd &amp;lt;wadetb@gmail.com&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
It is loosely based on the source code to the olpcgames framework, developed by &lt;br /&gt;
the One Laptop Per Child project.&lt;br /&gt;
&lt;br /&gt;
=== Changelog ===&lt;br /&gt;
&lt;br /&gt;
====v1.0====&lt;br /&gt;
Initial version of Sugargame&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40468</id>
		<title>Development Team/Sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40468"/>
		<updated>2009-11-21T15:59:53Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Using Sugargame */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sugargame ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] programs to run well under Sugar. &lt;br /&gt;
It is fork of the olcpgames framework, which is no longer maintained.&lt;br /&gt;
&lt;br /&gt;
What it does:&lt;br /&gt;
&lt;br /&gt;
* Wraps a Sugar activity around an existing Pygame program with few changes&lt;br /&gt;
* Allows Sugar toolbars and other widgets to be added to the activity UI&lt;br /&gt;
* Provides hooks for saving to and restoring from the Journal&lt;br /&gt;
&lt;br /&gt;
==== Differences between Sugargame and olpcgames ====&lt;br /&gt;
&lt;br /&gt;
The olpcgames framework provides a wrapper around Pygame which attempts to allow a Pygame program to run mostly unmodified under Sugar.  To this end, the Pygame program is run in a separate thread with its own Pygame message loop while the main thread runs the GTK message loop.  Also, olpcgames wraps Sugar APIs such as the journal and mesh into a Pygame-like API.&lt;br /&gt;
&lt;br /&gt;
Sugargame takes a simpler approach; it provides a way to embed Pygame into a GTK widget.  The Sugar APIs are used to interact with Sugar, the Pygame APIs are used for the game.  &lt;br /&gt;
&lt;br /&gt;
Sugargame advantages:&lt;br /&gt;
&lt;br /&gt;
* Simpler code&lt;br /&gt;
* More elegant interface between Pygame and GTK&lt;br /&gt;
* Runs as a single thread: no thread related segfaults&lt;br /&gt;
* Possible to use Sugar widgets with Pygame&lt;br /&gt;
&lt;br /&gt;
Sugargame limitations:&lt;br /&gt;
&lt;br /&gt;
* No support for Pango or SVG sprites (yet)&lt;br /&gt;
&lt;br /&gt;
== Using Sugargame ==&lt;br /&gt;
&lt;br /&gt;
See also [[Development Team/Sugargame/Examples]].&lt;br /&gt;
&lt;br /&gt;
==== Wrapping a Pygame program ====&lt;br /&gt;
&lt;br /&gt;
To use Sugargame to Sugarize a Pygame program, set up an activity directory and copy the Sugargame package to it.&lt;br /&gt;
&lt;br /&gt;
The activity directory should look something like this:&lt;br /&gt;
 &lt;br /&gt;
   activity/            - Activity directory: activity.info, SVG icon, etc.&lt;br /&gt;
   sugargame/           - Sugargame package&lt;br /&gt;
   MyActivity.py        - Activity class&lt;br /&gt;
   mygame.py            - Pygame code&lt;br /&gt;
   setup.py             - Install script&lt;br /&gt;
&lt;br /&gt;
To make the Activity class, start with test/TestActivity.py from the Sugargame distribution.  &lt;br /&gt;
&lt;br /&gt;
The activity should create a single PygameCanvas widget and call run_pygame on it.  Pass the main loop function of the Pygame program.&lt;br /&gt;
&lt;br /&gt;
 self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 self.set_canvas(self._canvas)&lt;br /&gt;
        &lt;br /&gt;
 # Start the game running.&lt;br /&gt;
 self._canvas.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
In your Pygame main loop, pump the GTK message loop:&lt;br /&gt;
&lt;br /&gt;
   while gtk.events_pending():&lt;br /&gt;
       gtk.main_iteration()&lt;br /&gt;
&lt;br /&gt;
==== Adding Pygame to a PyGTK activity ====&lt;br /&gt;
&lt;br /&gt;
To add Pygame to an existing Sugar activity, create a PygameCanvas widget and call run_pygame on it.  &lt;br /&gt;
&lt;br /&gt;
 widget = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 vbox.pack_start(widget)&lt;br /&gt;
 &lt;br /&gt;
 widget.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
Due to limitations of Pygame and SDL, there can only be one PygameCanvas in the entire activity.&lt;br /&gt;
&lt;br /&gt;
The argument to run_pygame is a function structured like a Pygame program.  In the main loop, remember to dispatch GTK messages using gtk.main_iteration().&lt;br /&gt;
&lt;br /&gt;
 def main_loop():&lt;br /&gt;
        clock = pygame.time.Clock()&lt;br /&gt;
        screen = pygame.display.get_surface()&lt;br /&gt;
 &lt;br /&gt;
        while self.running:&lt;br /&gt;
            # Pump GTK messages.&lt;br /&gt;
            while gtk.events_pending():&lt;br /&gt;
                gtk.main_iteration()&lt;br /&gt;
 &lt;br /&gt;
            # Pump PyGame messages.&lt;br /&gt;
            for event in pygame.event.get():&lt;br /&gt;
                if event.type == pygame.QUIT:&lt;br /&gt;
                    return&lt;br /&gt;
 &lt;br /&gt;
            # Clear Display&lt;br /&gt;
            screen.fill((255,255,255)) #255 for white&lt;br /&gt;
 &lt;br /&gt;
            # Draw stuff here&lt;br /&gt;
            .................&lt;br /&gt;
 &lt;br /&gt;
            # Flip Display&lt;br /&gt;
            pygame.display.flip()  &lt;br /&gt;
             &lt;br /&gt;
            # Try to stay at 30 FPS&lt;br /&gt;
            self.clock.tick(30)&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
&lt;br /&gt;
For help with Sugargame, please email the Sugar Labs development list:&lt;br /&gt;
&lt;br /&gt;
: sugar-devel@lists.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
== Author ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is developed by Wade Brainerd &amp;lt;wadetb@gmail.com&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
It is loosely based on the source code to the olpcgames framework, developed by &lt;br /&gt;
the One Laptop Per Child project.&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40467</id>
		<title>Development Team/Sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40467"/>
		<updated>2009-11-21T15:59:16Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Using Sugargame */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sugargame ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] programs to run well under Sugar. &lt;br /&gt;
It is fork of the olcpgames framework, which is no longer maintained.&lt;br /&gt;
&lt;br /&gt;
What it does:&lt;br /&gt;
&lt;br /&gt;
* Wraps a Sugar activity around an existing Pygame program with few changes&lt;br /&gt;
* Allows Sugar toolbars and other widgets to be added to the activity UI&lt;br /&gt;
* Provides hooks for saving to and restoring from the Journal&lt;br /&gt;
&lt;br /&gt;
==== Differences between Sugargame and olpcgames ====&lt;br /&gt;
&lt;br /&gt;
The olpcgames framework provides a wrapper around Pygame which attempts to allow a Pygame program to run mostly unmodified under Sugar.  To this end, the Pygame program is run in a separate thread with its own Pygame message loop while the main thread runs the GTK message loop.  Also, olpcgames wraps Sugar APIs such as the journal and mesh into a Pygame-like API.&lt;br /&gt;
&lt;br /&gt;
Sugargame takes a simpler approach; it provides a way to embed Pygame into a GTK widget.  The Sugar APIs are used to interact with Sugar, the Pygame APIs are used for the game.  &lt;br /&gt;
&lt;br /&gt;
Sugargame advantages:&lt;br /&gt;
&lt;br /&gt;
* Simpler code&lt;br /&gt;
* More elegant interface between Pygame and GTK&lt;br /&gt;
* Runs as a single thread: no thread related segfaults&lt;br /&gt;
* Possible to use Sugar widgets with Pygame&lt;br /&gt;
&lt;br /&gt;
Sugargame limitations:&lt;br /&gt;
&lt;br /&gt;
* No support for Pango or SVG sprites (yet)&lt;br /&gt;
&lt;br /&gt;
== Using Sugargame ==&lt;br /&gt;
&lt;br /&gt;
See also [[Sugargame/Examples]].&lt;br /&gt;
&lt;br /&gt;
==== Wrapping a Pygame program ====&lt;br /&gt;
&lt;br /&gt;
To use Sugargame to Sugarize a Pygame program, set up an activity directory and copy the Sugargame package to it.&lt;br /&gt;
&lt;br /&gt;
The activity directory should look something like this:&lt;br /&gt;
 &lt;br /&gt;
   activity/            - Activity directory: activity.info, SVG icon, etc.&lt;br /&gt;
   sugargame/           - Sugargame package&lt;br /&gt;
   MyActivity.py        - Activity class&lt;br /&gt;
   mygame.py            - Pygame code&lt;br /&gt;
   setup.py             - Install script&lt;br /&gt;
&lt;br /&gt;
To make the Activity class, start with test/TestActivity.py from the Sugargame distribution.  &lt;br /&gt;
&lt;br /&gt;
The activity should create a single PygameCanvas widget and call run_pygame on it.  Pass the main loop function of the Pygame program.&lt;br /&gt;
&lt;br /&gt;
 self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 self.set_canvas(self._canvas)&lt;br /&gt;
        &lt;br /&gt;
 # Start the game running.&lt;br /&gt;
 self._canvas.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
In your Pygame main loop, pump the GTK message loop:&lt;br /&gt;
&lt;br /&gt;
   while gtk.events_pending():&lt;br /&gt;
       gtk.main_iteration()&lt;br /&gt;
&lt;br /&gt;
==== Adding Pygame to a PyGTK activity ====&lt;br /&gt;
&lt;br /&gt;
To add Pygame to an existing Sugar activity, create a PygameCanvas widget and call run_pygame on it.  &lt;br /&gt;
&lt;br /&gt;
 widget = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 vbox.pack_start(widget)&lt;br /&gt;
 &lt;br /&gt;
 widget.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
Due to limitations of Pygame and SDL, there can only be one PygameCanvas in the entire activity.&lt;br /&gt;
&lt;br /&gt;
The argument to run_pygame is a function structured like a Pygame program.  In the main loop, remember to dispatch GTK messages using gtk.main_iteration().&lt;br /&gt;
&lt;br /&gt;
 def main_loop():&lt;br /&gt;
        clock = pygame.time.Clock()&lt;br /&gt;
        screen = pygame.display.get_surface()&lt;br /&gt;
 &lt;br /&gt;
        while self.running:&lt;br /&gt;
            # Pump GTK messages.&lt;br /&gt;
            while gtk.events_pending():&lt;br /&gt;
                gtk.main_iteration()&lt;br /&gt;
 &lt;br /&gt;
            # Pump PyGame messages.&lt;br /&gt;
            for event in pygame.event.get():&lt;br /&gt;
                if event.type == pygame.QUIT:&lt;br /&gt;
                    return&lt;br /&gt;
 &lt;br /&gt;
            # Clear Display&lt;br /&gt;
            screen.fill((255,255,255)) #255 for white&lt;br /&gt;
 &lt;br /&gt;
            # Draw stuff here&lt;br /&gt;
            .................&lt;br /&gt;
 &lt;br /&gt;
            # Flip Display&lt;br /&gt;
            pygame.display.flip()  &lt;br /&gt;
             &lt;br /&gt;
            # Try to stay at 30 FPS&lt;br /&gt;
            self.clock.tick(30)&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
&lt;br /&gt;
For help with Sugargame, please email the Sugar Labs development list:&lt;br /&gt;
&lt;br /&gt;
: sugar-devel@lists.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
== Author ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is developed by Wade Brainerd &amp;lt;wadetb@gmail.com&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
It is loosely based on the source code to the olpcgames framework, developed by &lt;br /&gt;
the One Laptop Per Child project.&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame/Examples&amp;diff=40466</id>
		<title>Development Team/Sugargame/Examples</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame/Examples&amp;diff=40466"/>
		<updated>2009-11-21T15:58:00Z</updated>

		<summary type="html">&lt;p&gt;Wade: Created page with &amp;#039;== Bouncing Ball ==  This is a simple Sugargame example which bounces a red ball across the screen.    A Sugar toolbar provides Pause and Unpause functionality, demonstrating com…&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bouncing Ball ==&lt;br /&gt;
&lt;br /&gt;
This is a simple Sugargame example which bounces a red ball across the screen.  &lt;br /&gt;
&lt;br /&gt;
A Sugar toolbar provides Pause and Unpause functionality, demonstrating communication between Sugar and Pygame.&lt;br /&gt;
&lt;br /&gt;
====TestActivity.py====&lt;br /&gt;
&lt;br /&gt;
This file implements the TestActivity activity class.  The constructor sets up the Pygame canvas and Sugar toolbar, and starts the game running.&lt;br /&gt;
&lt;br /&gt;
    from gettext import gettext as _&lt;br /&gt;
    &lt;br /&gt;
    import sys&lt;br /&gt;
    import gtk&lt;br /&gt;
    import pygame&lt;br /&gt;
    &lt;br /&gt;
    import sugar.activity.activity&lt;br /&gt;
    import sugar.graphics.toolbutton&lt;br /&gt;
    &lt;br /&gt;
    sys.path.append(&#039;..&#039;) # Import sugargame package from top directory.&lt;br /&gt;
    import sugargame.canvas&lt;br /&gt;
    &lt;br /&gt;
    import TestGame&lt;br /&gt;
    &lt;br /&gt;
    class TestActivity(sugar.activity.activity.Activity):&lt;br /&gt;
        def __init__(self, handle):&lt;br /&gt;
            super(TestActivity, self).__init__(handle)&lt;br /&gt;
            &lt;br /&gt;
            self.paused = False&lt;br /&gt;
    &lt;br /&gt;
            # Create the game instance.&lt;br /&gt;
            self.game = TestGame.TestGame()&lt;br /&gt;
    &lt;br /&gt;
            # Build the activity toolbar.&lt;br /&gt;
            self.build_toolbar()&lt;br /&gt;
    &lt;br /&gt;
            # Build the Pygame canvas.&lt;br /&gt;
            self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
            # Note that set_canvas implicitly calls read_file when resuming from the Journal.&lt;br /&gt;
            self.set_canvas(self._canvas)&lt;br /&gt;
            &lt;br /&gt;
            # Start the game running.&lt;br /&gt;
            self._canvas.run_pygame(self.game.run)&lt;br /&gt;
            &lt;br /&gt;
        def build_toolbar(self):        &lt;br /&gt;
            stop_play = sugar.graphics.toolbutton.ToolButton(&#039;media-playback-stop&#039;)&lt;br /&gt;
            stop_play.set_tooltip(_(&amp;quot;Stop&amp;quot;))&lt;br /&gt;
            stop_play.set_accelerator(_(&#039;&amp;lt;ctrl&amp;gt;space&#039;))&lt;br /&gt;
            stop_play.connect(&#039;clicked&#039;, self._stop_play_cb)&lt;br /&gt;
    &lt;br /&gt;
            toolbar = gtk.Toolbar()&lt;br /&gt;
            toolbar.insert(stop_play, 0)&lt;br /&gt;
            toolbar.insert(gtk.SeparatorToolItem(), 1)&lt;br /&gt;
            &lt;br /&gt;
            toolbox = sugar.activity.activity.ActivityToolbox(self)&lt;br /&gt;
            toolbox.add_toolbar(_(&amp;quot;Pygame&amp;quot;), toolbar)&lt;br /&gt;
            &lt;br /&gt;
            toolbox.show_all()&lt;br /&gt;
            self.set_toolbox(toolbox)&lt;br /&gt;
    &lt;br /&gt;
        def _stop_play_cb(self, button):&lt;br /&gt;
            # Pause or unpause the game.&lt;br /&gt;
            self.paused = not self.paused&lt;br /&gt;
            self.game.set_paused(self.paused)&lt;br /&gt;
            &lt;br /&gt;
            # Update the button to show the next action.&lt;br /&gt;
            if self.paused:&lt;br /&gt;
                button.set_icon(&#039;media-playback-start&#039;)&lt;br /&gt;
                button.set_tooltip(_(&amp;quot;Start&amp;quot;))&lt;br /&gt;
            else:&lt;br /&gt;
                button.set_icon(&#039;media-playback-stop&#039;)&lt;br /&gt;
                button.set_tooltip(_(&amp;quot;Stop&amp;quot;))&lt;br /&gt;
    &lt;br /&gt;
        def read_file(self, file_path):&lt;br /&gt;
            self.game.read_file(file_path)&lt;br /&gt;
            &lt;br /&gt;
        def write_file(self, file_path):&lt;br /&gt;
            self.game.write_file(file_path)&lt;br /&gt;
&lt;br /&gt;
====TestGame.py====&lt;br /&gt;
&lt;br /&gt;
This file implements the game (really just a bouncing ball animation).  Note the main function at the end; this file can also be run as a standalone Pygame program.&lt;br /&gt;
&lt;br /&gt;
    #!/usr/bin/python&lt;br /&gt;
    import pygame&lt;br /&gt;
    import gtk&lt;br /&gt;
    &lt;br /&gt;
    class TestGame:&lt;br /&gt;
        def __init__(self):&lt;br /&gt;
            # Set up a clock for managing the frame rate.&lt;br /&gt;
            self.clock = pygame.time.Clock()&lt;br /&gt;
    &lt;br /&gt;
            self.x = -100&lt;br /&gt;
            self.y = 100&lt;br /&gt;
    &lt;br /&gt;
            self.vx = 10&lt;br /&gt;
            self.vy = 0&lt;br /&gt;
    &lt;br /&gt;
            self.paused = False&lt;br /&gt;
            &lt;br /&gt;
        def set_paused(self, paused):&lt;br /&gt;
            self.paused = paused&lt;br /&gt;
    &lt;br /&gt;
        # Called to save the state of the game to the Journal.&lt;br /&gt;
        def write_file(self, file_path):&lt;br /&gt;
            pass&lt;br /&gt;
    &lt;br /&gt;
        # Called to load the state of the game from the Journal.&lt;br /&gt;
        def read_file(self, file_path):&lt;br /&gt;
            pass&lt;br /&gt;
            &lt;br /&gt;
        # The main game loop.&lt;br /&gt;
        def run(self):&lt;br /&gt;
            self.running = True    &lt;br /&gt;
                &lt;br /&gt;
            screen = pygame.display.get_surface()&lt;br /&gt;
    &lt;br /&gt;
            while self.running:&lt;br /&gt;
                # Pump GTK messages.&lt;br /&gt;
                while gtk.events_pending():&lt;br /&gt;
                    gtk.main_iteration()&lt;br /&gt;
    &lt;br /&gt;
                # Pump PyGame messages.&lt;br /&gt;
                for event in pygame.event.get():&lt;br /&gt;
                    if event.type == pygame.QUIT:&lt;br /&gt;
                        return&lt;br /&gt;
    &lt;br /&gt;
                # Move the ball&lt;br /&gt;
                if not self.paused:&lt;br /&gt;
                    self.x += self.vx&lt;br /&gt;
                    if self.x &amp;gt; screen.get_width() + 100:&lt;br /&gt;
                        self.x = -100&lt;br /&gt;
                    &lt;br /&gt;
                    self.y += self.vy&lt;br /&gt;
                    if self.y &amp;gt; screen.get_height() - 100:&lt;br /&gt;
                        self.y = screen.get_height() - 100&lt;br /&gt;
                        self.vy = -self.vy&lt;br /&gt;
                    &lt;br /&gt;
                    self.vy += 5;&lt;br /&gt;
                &lt;br /&gt;
                # Clear Display&lt;br /&gt;
                screen.fill((255,255,255)) #255 for white&lt;br /&gt;
    &lt;br /&gt;
                # Draw the ball&lt;br /&gt;
                pygame.draw.circle(screen, (255,0,0), (self.x, self.y), 100)&lt;br /&gt;
                        &lt;br /&gt;
                # Flip Display&lt;br /&gt;
                pygame.display.flip()  &lt;br /&gt;
                &lt;br /&gt;
                # Try to stay at 30 FPS&lt;br /&gt;
                self.clock.tick(30)&lt;br /&gt;
    &lt;br /&gt;
    # This function is called when the game is run directly from the command line:&lt;br /&gt;
    # ./TestGame.py &lt;br /&gt;
    def main():&lt;br /&gt;
        pygame.init()&lt;br /&gt;
        pygame.display.set_mode((0, 0), pygame.RESIZABLE)&lt;br /&gt;
        game = TestGame() &lt;br /&gt;
        game.run()&lt;br /&gt;
    &lt;br /&gt;
    if __name__ == &#039;__main__&#039;:&lt;br /&gt;
        main()&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/sugargame&amp;diff=40465</id>
		<title>Development Team/sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/sugargame&amp;diff=40465"/>
		<updated>2009-11-21T15:19:08Z</updated>

		<summary type="html">&lt;p&gt;Wade: moved Development Team/sugargame to Development Team/Sugargame:&amp;amp;#32;Capitalize&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Development Team/Sugargame]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40464</id>
		<title>Development Team/Sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40464"/>
		<updated>2009-11-21T15:19:08Z</updated>

		<summary type="html">&lt;p&gt;Wade: moved Development Team/sugargame to Development Team/Sugargame:&amp;amp;#32;Capitalize&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sugargame ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] programs to run well under Sugar. &lt;br /&gt;
It is fork of the olcpgames framework, which is no longer maintained.&lt;br /&gt;
&lt;br /&gt;
What it does:&lt;br /&gt;
&lt;br /&gt;
* Wraps a Sugar activity around an existing Pygame program with few changes&lt;br /&gt;
* Allows Sugar toolbars and other widgets to be added to the activity UI&lt;br /&gt;
* Provides hooks for saving to and restoring from the Journal&lt;br /&gt;
&lt;br /&gt;
==== Differences between Sugargame and olpcgames ====&lt;br /&gt;
&lt;br /&gt;
The olpcgames framework provides a wrapper around Pygame which attempts to allow a Pygame program to run mostly unmodified under Sugar.  To this end, the Pygame program is run in a separate thread with its own Pygame message loop while the main thread runs the GTK message loop.  Also, olpcgames wraps Sugar APIs such as the journal and mesh into a Pygame-like API.&lt;br /&gt;
&lt;br /&gt;
Sugargame takes a simpler approach; it provides a way to embed Pygame into a GTK widget.  The Sugar APIs are used to interact with Sugar, the Pygame APIs are used for the game.  &lt;br /&gt;
&lt;br /&gt;
Sugargame advantages:&lt;br /&gt;
&lt;br /&gt;
* Simpler code&lt;br /&gt;
* More elegant interface between Pygame and GTK&lt;br /&gt;
* Runs as a single thread: no thread related segfaults&lt;br /&gt;
* Possible to use Sugar widgets with Pygame&lt;br /&gt;
&lt;br /&gt;
Sugargame limitations:&lt;br /&gt;
&lt;br /&gt;
* No support for Pango or SVG sprites (yet)&lt;br /&gt;
&lt;br /&gt;
== Using Sugargame ==&lt;br /&gt;
 &lt;br /&gt;
==== Wrapping a Pygame program ====&lt;br /&gt;
&lt;br /&gt;
To use Sugargame to Sugarize a Pygame program, set up an activity directory and copy the Sugargame package to it.&lt;br /&gt;
&lt;br /&gt;
The activity directory should look something like this:&lt;br /&gt;
 &lt;br /&gt;
   activity/            - Activity directory: activity.info, SVG icon, etc.&lt;br /&gt;
   sugargame/           - Sugargame package&lt;br /&gt;
   MyActivity.py        - Activity class&lt;br /&gt;
   mygame.py            - Pygame code&lt;br /&gt;
   setup.py             - Install script&lt;br /&gt;
&lt;br /&gt;
To make the Activity class, start with test/TestActivity.py from the Sugargame distribution.  &lt;br /&gt;
&lt;br /&gt;
The activity should create a single PygameCanvas widget and call run_pygame on it.  Pass the main loop function of the Pygame program.&lt;br /&gt;
&lt;br /&gt;
 self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 self.set_canvas(self._canvas)&lt;br /&gt;
        &lt;br /&gt;
 # Start the game running.&lt;br /&gt;
 self._canvas.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
In your Pygame main loop, pump the GTK message loop:&lt;br /&gt;
&lt;br /&gt;
   while gtk.events_pending():&lt;br /&gt;
       gtk.main_iteration()&lt;br /&gt;
&lt;br /&gt;
==== Adding Pygame to a PyGTK activity ====&lt;br /&gt;
&lt;br /&gt;
To add Pygame to an existing Sugar activity, create a PygameCanvas widget and call run_pygame on it.  &lt;br /&gt;
&lt;br /&gt;
 widget = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 vbox.pack_start(widget)&lt;br /&gt;
 &lt;br /&gt;
 widget.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
Due to limitations of Pygame and SDL, there can only be one PygameCanvas in the entire activity.&lt;br /&gt;
&lt;br /&gt;
The argument to run_pygame is a function structured like a Pygame program.  In the main loop, remember to dispatch GTK messages using gtk.main_iteration().&lt;br /&gt;
&lt;br /&gt;
 def main_loop():&lt;br /&gt;
        clock = pygame.time.Clock()&lt;br /&gt;
        screen = pygame.display.get_surface()&lt;br /&gt;
 &lt;br /&gt;
        while self.running:&lt;br /&gt;
            # Pump GTK messages.&lt;br /&gt;
            while gtk.events_pending():&lt;br /&gt;
                gtk.main_iteration()&lt;br /&gt;
 &lt;br /&gt;
            # Pump PyGame messages.&lt;br /&gt;
            for event in pygame.event.get():&lt;br /&gt;
                if event.type == pygame.QUIT:&lt;br /&gt;
                    return&lt;br /&gt;
 &lt;br /&gt;
            # Clear Display&lt;br /&gt;
            screen.fill((255,255,255)) #255 for white&lt;br /&gt;
 &lt;br /&gt;
            # Draw stuff here&lt;br /&gt;
            .................&lt;br /&gt;
 &lt;br /&gt;
            # Flip Display&lt;br /&gt;
            pygame.display.flip()  &lt;br /&gt;
             &lt;br /&gt;
            # Try to stay at 30 FPS&lt;br /&gt;
            self.clock.tick(30)&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
&lt;br /&gt;
For help with Sugargame, please email the Sugar Labs development list:&lt;br /&gt;
&lt;br /&gt;
: sugar-devel@lists.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
== Author ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is developed by Wade Brainerd &amp;lt;wadetb@gmail.com&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
It is loosely based on the source code to the olpcgames framework, developed by &lt;br /&gt;
the One Laptop Per Child project.&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40463</id>
		<title>Development Team/Sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40463"/>
		<updated>2009-11-21T15:18:09Z</updated>

		<summary type="html">&lt;p&gt;Wade: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sugargame ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] programs to run well under Sugar. &lt;br /&gt;
It is fork of the olcpgames framework, which is no longer maintained.&lt;br /&gt;
&lt;br /&gt;
What it does:&lt;br /&gt;
&lt;br /&gt;
* Wraps a Sugar activity around an existing Pygame program with few changes&lt;br /&gt;
* Allows Sugar toolbars and other widgets to be added to the activity UI&lt;br /&gt;
* Provides hooks for saving to and restoring from the Journal&lt;br /&gt;
&lt;br /&gt;
==== Differences between Sugargame and olpcgames ====&lt;br /&gt;
&lt;br /&gt;
The olpcgames framework provides a wrapper around Pygame which attempts to allow a Pygame program to run mostly unmodified under Sugar.  To this end, the Pygame program is run in a separate thread with its own Pygame message loop while the main thread runs the GTK message loop.  Also, olpcgames wraps Sugar APIs such as the journal and mesh into a Pygame-like API.&lt;br /&gt;
&lt;br /&gt;
Sugargame takes a simpler approach; it provides a way to embed Pygame into a GTK widget.  The Sugar APIs are used to interact with Sugar, the Pygame APIs are used for the game.  &lt;br /&gt;
&lt;br /&gt;
Sugargame advantages:&lt;br /&gt;
&lt;br /&gt;
* Simpler code&lt;br /&gt;
* More elegant interface between Pygame and GTK&lt;br /&gt;
* Runs as a single thread: no thread related segfaults&lt;br /&gt;
* Possible to use Sugar widgets with Pygame&lt;br /&gt;
&lt;br /&gt;
Sugargame limitations:&lt;br /&gt;
&lt;br /&gt;
* No support for Pango or SVG sprites (yet)&lt;br /&gt;
&lt;br /&gt;
== Using Sugargame ==&lt;br /&gt;
 &lt;br /&gt;
==== Wrapping a Pygame program ====&lt;br /&gt;
&lt;br /&gt;
To use Sugargame to Sugarize a Pygame program, set up an activity directory and copy the Sugargame package to it.&lt;br /&gt;
&lt;br /&gt;
The activity directory should look something like this:&lt;br /&gt;
 &lt;br /&gt;
   activity/            - Activity directory: activity.info, SVG icon, etc.&lt;br /&gt;
   sugargame/           - Sugargame package&lt;br /&gt;
   MyActivity.py        - Activity class&lt;br /&gt;
   mygame.py            - Pygame code&lt;br /&gt;
   setup.py             - Install script&lt;br /&gt;
&lt;br /&gt;
To make the Activity class, start with test/TestActivity.py from the Sugargame distribution.  &lt;br /&gt;
&lt;br /&gt;
The activity should create a single PygameCanvas widget and call run_pygame on it.  Pass the main loop function of the Pygame program.&lt;br /&gt;
&lt;br /&gt;
 self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 self.set_canvas(self._canvas)&lt;br /&gt;
        &lt;br /&gt;
 # Start the game running.&lt;br /&gt;
 self._canvas.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
In your Pygame main loop, pump the GTK message loop:&lt;br /&gt;
&lt;br /&gt;
   while gtk.events_pending():&lt;br /&gt;
       gtk.main_iteration()&lt;br /&gt;
&lt;br /&gt;
==== Adding Pygame to a PyGTK activity ====&lt;br /&gt;
&lt;br /&gt;
To add Pygame to an existing Sugar activity, create a PygameCanvas widget and call run_pygame on it.  &lt;br /&gt;
&lt;br /&gt;
 widget = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 vbox.pack_start(widget)&lt;br /&gt;
 &lt;br /&gt;
 widget.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
Due to limitations of Pygame and SDL, there can only be one PygameCanvas in the entire activity.&lt;br /&gt;
&lt;br /&gt;
The argument to run_pygame is a function structured like a Pygame program.  In the main loop, remember to dispatch GTK messages using gtk.main_iteration().&lt;br /&gt;
&lt;br /&gt;
 def main_loop():&lt;br /&gt;
        clock = pygame.time.Clock()&lt;br /&gt;
        screen = pygame.display.get_surface()&lt;br /&gt;
 &lt;br /&gt;
        while self.running:&lt;br /&gt;
            # Pump GTK messages.&lt;br /&gt;
            while gtk.events_pending():&lt;br /&gt;
                gtk.main_iteration()&lt;br /&gt;
 &lt;br /&gt;
            # Pump PyGame messages.&lt;br /&gt;
            for event in pygame.event.get():&lt;br /&gt;
                if event.type == pygame.QUIT:&lt;br /&gt;
                    return&lt;br /&gt;
 &lt;br /&gt;
            # Clear Display&lt;br /&gt;
            screen.fill((255,255,255)) #255 for white&lt;br /&gt;
 &lt;br /&gt;
            # Draw stuff here&lt;br /&gt;
            .................&lt;br /&gt;
 &lt;br /&gt;
            # Flip Display&lt;br /&gt;
            pygame.display.flip()  &lt;br /&gt;
             &lt;br /&gt;
            # Try to stay at 30 FPS&lt;br /&gt;
            self.clock.tick(30)&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
&lt;br /&gt;
For help with Sugargame, please email the Sugar Labs development list:&lt;br /&gt;
&lt;br /&gt;
: sugar-devel@lists.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
== Author ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is developed by Wade Brainerd &amp;lt;wadetb@gmail.com&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
It is loosely based on the source code to the olpcgames framework, developed by &lt;br /&gt;
the One Laptop Per Child project.&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40462</id>
		<title>Development Team/Sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40462"/>
		<updated>2009-11-21T15:16:02Z</updated>

		<summary type="html">&lt;p&gt;Wade: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sugargame ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] programs to run well under Sugar. &lt;br /&gt;
It is fork of the olcpgames framework, which is no longer maintained.&lt;br /&gt;
&lt;br /&gt;
What it does:&lt;br /&gt;
&lt;br /&gt;
* Wraps a Sugar activity around an existing Pygame program with few changes&lt;br /&gt;
* Allows Sugar toolbars and other widgets to be added to the activity UI&lt;br /&gt;
* Provides hooks for saving to and restoring from the Journal&lt;br /&gt;
&lt;br /&gt;
=== Differences between Sugargame and olpcgames ===&lt;br /&gt;
&lt;br /&gt;
The olpcgames framework provides a wrapper around Pygame which attempts to allow a Pygame program to run mostly unmodified under Sugar.  To this end, the Pygame program is run in a separate thread with its own Pygame message loop while the main thread runs the GTK message loop.  Also, olpcgames wraps Sugar APIs such as the journal and mesh into a Pygame-like API.&lt;br /&gt;
&lt;br /&gt;
Sugargame takes a simpler approach; it provides a way to embed Pygame into a GTK widget.  The Sugar APIs are used to interact with Sugar, the Pygame APIs are used for the game.  &lt;br /&gt;
&lt;br /&gt;
Sugargame advantages:&lt;br /&gt;
&lt;br /&gt;
* Simpler code&lt;br /&gt;
* More elegant interface between Pygame and GTK&lt;br /&gt;
* Runs as a single thread: no thread related segfaults&lt;br /&gt;
* Possible to use Sugar widgets with Pygame&lt;br /&gt;
&lt;br /&gt;
Sugargame limitations:&lt;br /&gt;
&lt;br /&gt;
* No support for Pango or SVG sprites (yet)&lt;br /&gt;
&lt;br /&gt;
== Using Sugargame ==&lt;br /&gt;
 &lt;br /&gt;
=== Wrapping a Pygame program ===&lt;br /&gt;
&lt;br /&gt;
To use Sugargame to Sugarize a Pygame program, set up an activity directory and copy the Sugargame package to it.&lt;br /&gt;
&lt;br /&gt;
The activity directory should look something like this:&lt;br /&gt;
 &lt;br /&gt;
   activity/            - Activity directory: activity.info, SVG icon, etc.&lt;br /&gt;
   sugargame/           - Sugargame package&lt;br /&gt;
   MyActivity.py        - Activity class&lt;br /&gt;
   mygame.py            - Pygame code&lt;br /&gt;
   setup.py             - Install script&lt;br /&gt;
&lt;br /&gt;
To make the Activity class, start with test/TestActivity.py from the Sugargame distribution.  &lt;br /&gt;
&lt;br /&gt;
The activity should create a single PygameCanvas widget and call run_pygame on it.  Pass the main loop function of the Pygame program.&lt;br /&gt;
&lt;br /&gt;
 self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 self.set_canvas(self._canvas)&lt;br /&gt;
        &lt;br /&gt;
 # Start the game running.&lt;br /&gt;
 self._canvas.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
In your Pygame main loop, pump the GTK message loop:&lt;br /&gt;
&lt;br /&gt;
   while gtk.events_pending():&lt;br /&gt;
       gtk.main_iteration()&lt;br /&gt;
&lt;br /&gt;
=== Adding Pygame to an activity ===&lt;br /&gt;
&lt;br /&gt;
To add Pygame to an existing Sugar activity, create a PygameCanvas widget and call run_pygame on it.  &lt;br /&gt;
&lt;br /&gt;
 widget = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 vbox.pack_start(widget)&lt;br /&gt;
 &lt;br /&gt;
 widget.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
Due to limitations of Pygame and SDL, there can only be one PygameCanvas in the entire activity.&lt;br /&gt;
&lt;br /&gt;
The argument to run_pygame is a function structured like a Pygame program.  In the main loop, remember to dispatch GTK messages using gtk.main_iteration().&lt;br /&gt;
&lt;br /&gt;
 def main_loop():&lt;br /&gt;
        clock = pygame.time.Clock()&lt;br /&gt;
        screen = pygame.display.get_surface()&lt;br /&gt;
 &lt;br /&gt;
        while self.running:&lt;br /&gt;
            # Pump GTK messages.&lt;br /&gt;
            while gtk.events_pending():&lt;br /&gt;
                gtk.main_iteration()&lt;br /&gt;
 &lt;br /&gt;
            # Pump PyGame messages.&lt;br /&gt;
            for event in pygame.event.get():&lt;br /&gt;
                if event.type == pygame.QUIT:&lt;br /&gt;
                    return&lt;br /&gt;
 &lt;br /&gt;
            # Clear Display&lt;br /&gt;
            screen.fill((255,255,255)) #255 for white&lt;br /&gt;
 &lt;br /&gt;
            # Draw stuff here&lt;br /&gt;
            .................&lt;br /&gt;
 &lt;br /&gt;
            # Flip Display&lt;br /&gt;
            pygame.display.flip()  &lt;br /&gt;
             &lt;br /&gt;
            # Try to stay at 30 FPS&lt;br /&gt;
            self.clock.tick(30)&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
&lt;br /&gt;
For help with Sugargame, please email the Sugar Labs development list:&lt;br /&gt;
&lt;br /&gt;
: sugar-devel@lists.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
== Author ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is developed by Wade Brainerd &amp;lt;wadetb@gmail.com&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
It is loosely based on the source code to the olpcgames framework, developed by &lt;br /&gt;
the One Laptop Per Child project.&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40461</id>
		<title>Development Team/Sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40461"/>
		<updated>2009-11-21T14:53:36Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Using Sugargame */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sugargame ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] programs to run well under Sugar. &lt;br /&gt;
It is fork of the olcpgames framework, which is no longer maintained.&lt;br /&gt;
&lt;br /&gt;
Sugargame embeds the Pygame window into a GTK window, and translates GTK &lt;br /&gt;
events to Pygame events.&lt;br /&gt;
&lt;br /&gt;
What it does:&lt;br /&gt;
&lt;br /&gt;
* Wraps a Sugar activity around an existing Pygame program with few changes&lt;br /&gt;
* Allows Sugar toolbars and other widgets to be added to the activity UI&lt;br /&gt;
* Provides hooks for saving to and restoring from the Journal&lt;br /&gt;
&lt;br /&gt;
=== Differences between Sugargame and olpcgames ===&lt;br /&gt;
&lt;br /&gt;
The olpcgames framework provides a wrapper around Pygame which attempts to allow a Pygame program to run mostly unmodified under Sugar.  To this end, the Pygame program is run in a separate thread with its own Pygame message loop while the main thread runs the GTK message loop.  Also, olpcgames wraps Sugar APIs such as the journal and mesh into a Pygame-like API.&lt;br /&gt;
&lt;br /&gt;
Sugargame takes a simpler approach; it simply offers a way to embed Pygame into a GTK widget.  The Sugar APIs are used to interact with Sugar, the Pygame APIs are used for the game.  &lt;br /&gt;
&lt;br /&gt;
Sugargame advantages:&lt;br /&gt;
&lt;br /&gt;
* Simpler code&lt;br /&gt;
* More elegant interface between Pygame and GTK&lt;br /&gt;
* Runs as a single thread: no thread related segfaults&lt;br /&gt;
* Possible to use Sugar widgets with Pygame&lt;br /&gt;
&lt;br /&gt;
Sugargame limitations:&lt;br /&gt;
&lt;br /&gt;
* No support for Pango or SVG sprites (yet)&lt;br /&gt;
&lt;br /&gt;
== Using Sugargame ==&lt;br /&gt;
 &lt;br /&gt;
=== Porting a Pygame program ===&lt;br /&gt;
&lt;br /&gt;
To use Sugargame to Sugarize a Pygame program, set up an activity directory and copy the Sugargame package to it.&lt;br /&gt;
&lt;br /&gt;
The activity directory should look something like this:&lt;br /&gt;
 &lt;br /&gt;
   activity/            - Activity directory: activity.info, SVG icon, etc.&lt;br /&gt;
   sugargame/           - Sugargame package&lt;br /&gt;
   MyActivity.py        - Activity class&lt;br /&gt;
   mygame.py            - Pygame code&lt;br /&gt;
   setup.py             - Install script&lt;br /&gt;
&lt;br /&gt;
To make the Activity class, start with test/TestActivity.py from the Sugargame distribution.  &lt;br /&gt;
&lt;br /&gt;
The activity should create a single PygameCanvas widget and call run_pygame on it.&lt;br /&gt;
&lt;br /&gt;
 self._canvas = sugargame.canvas.PygameCanvas(self)&lt;br /&gt;
 self.set_canvas(self._canvas)&lt;br /&gt;
        &lt;br /&gt;
 # Start the game running.&lt;br /&gt;
 self._canvas.run_pygame(self.game.run)&lt;br /&gt;
&lt;br /&gt;
In your Pygame main loop, pump the GTK message loop:&lt;br /&gt;
&lt;br /&gt;
   while gtk.events_pending():&lt;br /&gt;
       gtk.main_iteration()&lt;br /&gt;
&lt;br /&gt;
=== Adding Pygame to an activity ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
&lt;br /&gt;
For help with Sugargame, please email the Sugar Labs development list:&lt;br /&gt;
&lt;br /&gt;
: sugar-devel@lists.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
== Author ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is developed by Wade Brainerd &amp;lt;wadetb@gmail.com&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
It is loosely based on the source code to the olpcgames framework, developed by &lt;br /&gt;
the One Laptop Per Child project.&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40460</id>
		<title>Development Team/Sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40460"/>
		<updated>2009-11-21T14:47:55Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Sugargame */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sugargame ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] programs to run well under Sugar. &lt;br /&gt;
It is fork of the olcpgames framework, which is no longer maintained.&lt;br /&gt;
&lt;br /&gt;
Sugargame embeds the Pygame window into a GTK window, and translates GTK &lt;br /&gt;
events to Pygame events.&lt;br /&gt;
&lt;br /&gt;
What it does:&lt;br /&gt;
&lt;br /&gt;
* Wraps a Sugar activity around an existing Pygame program with few changes&lt;br /&gt;
* Allows Sugar toolbars and other widgets to be added to the activity UI&lt;br /&gt;
* Provides hooks for saving to and restoring from the Journal&lt;br /&gt;
&lt;br /&gt;
=== Differences between Sugargame and olpcgames ===&lt;br /&gt;
&lt;br /&gt;
The olpcgames framework provides a wrapper around Pygame which attempts to allow a Pygame program to run mostly unmodified under Sugar.  To this end, the Pygame program is run in a separate thread with its own Pygame message loop while the main thread runs the GTK message loop.  Also, olpcgames wraps Sugar APIs such as the journal and mesh into a Pygame-like API.&lt;br /&gt;
&lt;br /&gt;
Sugargame takes a simpler approach; it simply offers a way to embed Pygame into a GTK widget.  The Sugar APIs are used to interact with Sugar, the Pygame APIs are used for the game.  &lt;br /&gt;
&lt;br /&gt;
Sugargame advantages:&lt;br /&gt;
&lt;br /&gt;
* Simpler code&lt;br /&gt;
* More elegant interface between Pygame and GTK&lt;br /&gt;
* Runs as a single thread: no thread related segfaults&lt;br /&gt;
* Possible to use Sugar widgets with Pygame&lt;br /&gt;
&lt;br /&gt;
Sugargame limitations:&lt;br /&gt;
&lt;br /&gt;
* No support for Pango or SVG sprites (yet)&lt;br /&gt;
&lt;br /&gt;
== Using Sugargame ==&lt;br /&gt;
 &lt;br /&gt;
To use Sugargame in an activity, copy the sugargame folder into the activity&#039;s &lt;br /&gt;
source directory.&lt;br /&gt;
 &lt;br /&gt;
The activity directory should look something like this:&lt;br /&gt;
 &lt;br /&gt;
   activity/            - Activity directory: activity.info, SVG icon, etc.&lt;br /&gt;
   sugargame/           - Sugargame package&lt;br /&gt;
   MyActivity.py        - Activity class&lt;br /&gt;
   mygame.py            - Pygame code&lt;br /&gt;
   setup.py             - Install script&lt;br /&gt;
   &lt;br /&gt;
To make the Activity class, start with test/TestActivity.py.  &lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
&lt;br /&gt;
For help with Sugargame, please email the Sugar Labs development list:&lt;br /&gt;
&lt;br /&gt;
: sugar-devel@lists.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
== Author ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is developed by Wade Brainerd &amp;lt;wadetb@gmail.com&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
It is loosely based on the source code to the olpcgames framework, developed by &lt;br /&gt;
the One Laptop Per Child project.&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Resources&amp;diff=40459</id>
		<title>Activity Team/Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Resources&amp;diff=40459"/>
		<updated>2009-11-21T14:22:40Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TeamHeader|Activity Team}}&amp;lt;/noinclude&amp;gt;{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
==Getting started in Activity development==&lt;br /&gt;
If you have no experience developing Sugar activities, these resources will help get you started.&lt;br /&gt;
&lt;br /&gt;
====Setting up a Sugar environment====&lt;br /&gt;
If you use Linux, your best bet is to install [[Development Team/Jhbuild|sugar-jhbuild]].  You will be able to develop in your native environment, treating Sugar as just another desktop application.&lt;br /&gt;
&lt;br /&gt;
If you run MacOS X or Windows, you will need to set up an emulator.  For Mac OS X, see [[Supported_systems/Mac]].  For Windows, see [[Supported_systems/Windows]].  &lt;br /&gt;
&lt;br /&gt;
To develop efficiently using an emulator or a secondary machine running Sugar natively (such as an OLPC XO), find an editor which supports editing files over a SFTP connection.  [http://www.openkomodo.com/ Komodo Edit] is a good example.&lt;br /&gt;
&lt;br /&gt;
====Python Reference &amp;amp; Tutorials====&lt;br /&gt;
* http://docs.python.org/&lt;br /&gt;
* http://diveintopython.org/&lt;br /&gt;
* [http://pleac.sourceforge.net/pleac_python/index.html PLEAC - Programming Language Examples Alike Cookbook]&lt;br /&gt;
&lt;br /&gt;
Python is the language Sugar is written in and is also used by most activities.  If you don&#039;t already know Python well, you should familiarize yourself with it before continuing.&lt;br /&gt;
&lt;br /&gt;
====PyGTK Reference &amp;amp; Tutorials====&lt;br /&gt;
* http://www.pygtk.org/docs/pygtk/index.html&lt;br /&gt;
* http://www.pygtk.org/docs/pygobject/index.html&lt;br /&gt;
&lt;br /&gt;
PyGTK is the user interface toolkit used by Sugar activities.  Bookmark these two links as you will reference them frequently during development.&lt;br /&gt;
&lt;br /&gt;
* http://www.pygtk.org/pygtk2tutorial/index.html&lt;br /&gt;
&lt;br /&gt;
The following sections of the PyGTK tutorial are most relevant to activity development.&lt;br /&gt;
&lt;br /&gt;
* 1. Introduction&lt;br /&gt;
* 2. Getting Started&lt;br /&gt;
* 3. Moving On&lt;br /&gt;
* 4. Packing Widgets&lt;br /&gt;
* 5. Widget Overview&lt;br /&gt;
* 6. The Button Widget&lt;br /&gt;
* 7. Adjustments&lt;br /&gt;
* 8. Range Widgets&lt;br /&gt;
* 9. Miscellaneous Widgets&lt;br /&gt;
* 10. Container Widgets&lt;br /&gt;
* 12. Drawing Area&lt;br /&gt;
&lt;br /&gt;
====Sugar Activities====&lt;br /&gt;
* [[Development Team/Almanac|Sugar Almanac]]&lt;br /&gt;
&lt;br /&gt;
The Sugar Almanac contains all the information you need to start writing Sugar activities, ranging from directory structure to bundle format to API reference.  It also contains answers to common questions and examples of common tasks.&lt;br /&gt;
&lt;br /&gt;
* http://api.sugarlabs.org/&lt;br /&gt;
&lt;br /&gt;
This automatically updated site contains the official API documentation for Sugar.  Though it is currently quite sparse, the source code is included with the documentation and it&#039;s useful to have that at your fingertips.&lt;br /&gt;
&lt;br /&gt;
====Cairo Graphics====&lt;br /&gt;
* http://www.tortall.net/mu/wiki/CairoTutorial&lt;br /&gt;
&lt;br /&gt;
Cairo is the graphics library used in Sugar.  The tutorial is a good introduction to the API as well as vector graphics programming in general.&lt;br /&gt;
&lt;br /&gt;
====Pygame====&lt;br /&gt;
* http://www.pygame.org/&lt;br /&gt;
* [[Development_Team/sugargame]]&lt;br /&gt;
&lt;br /&gt;
Pygame is a library for developing 2D sprite-based games using Python.  Sugargame is a package which makes it possible to embed Pygame into a Sugar activity.&lt;br /&gt;
&lt;br /&gt;
====Sugar [[Human Interface Guidelines]] (HIG)====&lt;br /&gt;
* [[Human Interface Guidelines]]. &lt;br /&gt;
&lt;br /&gt;
Required reading before planning the user interface for your activity.  These pages give a good introduction to the thought process behind the Sugar environment and will help a lot when designing your activity.&lt;br /&gt;
&lt;br /&gt;
====i18n (Localisation) Best Practices====&lt;br /&gt;
* [[Translation_Team/i18n_Best_Practices]].&lt;br /&gt;
&lt;br /&gt;
Once you have strings in your Activity, here are some general tips which will make your translators happy :-)&lt;br /&gt;
&lt;br /&gt;
====JSON introduction====&lt;br /&gt;
* http://www.json.org/fatfree.html &lt;br /&gt;
&lt;br /&gt;
JSON is a data format commonly used to store activity data in the Journal.&lt;br /&gt;
&lt;br /&gt;
* http://simplejson.googlecode.com/svn/tags/simplejson-2.0.8/docs/index.html&lt;br /&gt;
&lt;br /&gt;
Currently, the recommended JSON library is simplejson.  It has also become the standard JSON library in Python 2.6+.&lt;br /&gt;
&lt;br /&gt;
NOTE: There is an odd thing about simplejson - in python25 it lives in &#039;&#039;simplejson&#039;&#039; module, but in python26 it uses &#039;&#039;json&#039;&#039; module. So, use something like [http://git.sugarlabs.org/projects/sugar-port/repos/mainline/blobs/master/json.py this] to wrap it.&lt;br /&gt;
&lt;br /&gt;
====Git introduction====&lt;br /&gt;
Git is the version control software used by Sugar Labs.  It is a distributed version control system and is quite powerful, but requires a lot of command line use.&lt;br /&gt;
&lt;br /&gt;
* [[Activity Team/Git|Git]]&lt;br /&gt;
&lt;br /&gt;
====XML routines====&lt;br /&gt;
There are [http://docs.python.org/library/markup.html dozens] Python classes to satisfy the XML standard, but if you want just save/load parameters use &amp;quot;Zen of XML&amp;quot; in Python - [http://effbot.org/zone/element.htm ElementTree] library. It&#039;s supported out of the box in Python 2.5 (xml.etree.ElementTree module).  In previous versions you&#039;ll have to install library by yourself.&lt;br /&gt;
&lt;br /&gt;
But if you just need a simple configuration format to read/write Python objects, check out JSON instead.&lt;br /&gt;
&lt;br /&gt;
====Speech synthesizing====&lt;br /&gt;
If you want to add a speech synthesizer for English and other languages, try the [[Development Team/gst-plugins-espeak|gst-plugins-espeak]] plugin for gstreamer.&lt;br /&gt;
&lt;br /&gt;
==Activity Development Resources==&lt;br /&gt;
This is an open area for posting links related to activity development.&lt;br /&gt;
&lt;br /&gt;
===Sample code===&lt;br /&gt;
&lt;br /&gt;
* An example of [[Activity Team/Sample code/Ruler|a simple activity that uses Cairo graphics]]&lt;br /&gt;
* An [http://uclug.org/images/Sugar.odp OpenOffice presentation] that touches on many of the issues encountered by first-time Sugar developers. Some items covered are: What is Sugar and Sugar Labs; What are some development environments; Some Sugar specific python statements for a PyGTK activity; Activity distribution. You can also [http://media.libsyn.com/media/dsyates/101309uclug0020.ogg listen] to the creator ([http://wiki.sugarlabs.org/go/User:Ossfm ossfm]) give the presentation at a LUG meeting (starting at 9 minutes and 55 seconds).&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
* http://docs.python.org/ The official Python documentation.&lt;br /&gt;
* http://www.pygtk.org/docs/pygtk/index.html PyGTK API reference&lt;br /&gt;
* http://www.pygtk.org/docs/pygobject/index.html PyGObject API reference.  Contains a few important things missing from the PyGTK API such as timers and idle callbacks.&lt;br /&gt;
* http://api.sugarlabs.org/ The official Sugar API documentation (quite sparse but includes all the source code).&lt;br /&gt;
* [[Development Team/Almanac]] Detailed Sugar API overview.  Quite in depth and offers answers to common questions.&lt;br /&gt;
* http://pygstdocs.berlios.de/ Python GStreamer bindings.&lt;br /&gt;
* [[Human Interface Guidelines]] The design behind the Sugar interface.  Very important to read and understand before planning your activity&#039;s user interface.&lt;br /&gt;
* http://cairographics.org/documentation/pycairo/ Cairo Python API reference.  Very sparse, use the tutorial instead.&lt;br /&gt;
* [[OLPC:Low-level Activity API]] Information on how activities interact with Sugar.&lt;br /&gt;
* http://www.pygame.org/ The Pygame game development library.&lt;br /&gt;
* [[Development Team/sugargame]] Python package which makes it possible to embed Pygame in a Sugar activity.&lt;br /&gt;
&lt;br /&gt;
===Tutorials and Whitepapers===&lt;br /&gt;
* http://diveintopython.org/ An online book which teaches Python step by step.&lt;br /&gt;
* http://www.pygtk.org/pygtk2tutorial/index.html A very informative step-by-step introduction to PyGTK.&lt;br /&gt;
* http://www.olpcaustria.org/mediawiki/index.php/Activity_handbook Introduction to activity development by OLPC Austria.&lt;br /&gt;
* [[OLPC:Sugar Activity Tutorial]] Another introduction to activity development.&lt;br /&gt;
* http://www.tortall.net/mu/wiki/CairoTutorial A great introduction to Cairo in PyGTK and vector graphics drawing in general.&lt;br /&gt;
* http://www.json.org/fatfree.html An overview of the JSON data format.&lt;br /&gt;
* http://simplejson.googlecode.com/svn/tags/simplejson-2.0.8/docs/index.html Documentation for the recommended JSON library.&lt;br /&gt;
* [[OLPC:Shared Sugar Activities]] High level overview of collaboration.&lt;br /&gt;
* [[OLPC:Collaboration Tutorial]] Step by step tutorial on integrating collaboration into an activity.&lt;br /&gt;
* [[Activity_Team/Modifing_an_Activity]] Information describing simple modifications that can be made to common Sugar activities.&lt;br /&gt;
* [[Activity Team/Compatibility Tips]] Information on ensuring your activity is portable to the various distributions that run Sugar.&lt;br /&gt;
&lt;br /&gt;
===Community resources===&lt;br /&gt;
* http://dev.sugarlabs.org/ Bug tracking for Sugar and activities.  Go here to report bugs in the Sugar toolkit.  Each activity should have its own component here.&lt;br /&gt;
* http://git.sugarlabs.org/ Gitorious source code hosting.&lt;br /&gt;
* http://git.sugarlabs.org/events.atom RSS feed of all Sugar development activity.  Great for keeping an eye on the project as a whole.&lt;br /&gt;
&lt;br /&gt;
==Stuck?==&lt;br /&gt;
&lt;br /&gt;
If you have a question, don&#039;t hesitate to ask the activity team.  We are happy to help and can often save you a lot of hunting for answers.&lt;br /&gt;
&lt;br /&gt;
We hang out in #sugar on irc.freenode.net, and you can always [http://lists.sugarlabs.org/listinfo/sugar-devel subscribe] and post questions to sugar-devel@lists.sugarlabs.org.&lt;br /&gt;
&lt;br /&gt;
[[Category:Activity Team]]&lt;br /&gt;
[[Category:Resource]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Resources&amp;diff=40458</id>
		<title>Activity Team/Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Resources&amp;diff=40458"/>
		<updated>2009-11-21T14:21:37Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Getting started in Activity development */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TeamHeader|Activity Team}}&amp;lt;/noinclude&amp;gt;{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
==Getting started in Activity development==&lt;br /&gt;
If you have no experience developing Sugar activities, these resources will help get you started.&lt;br /&gt;
&lt;br /&gt;
====Setting up a Sugar environment====&lt;br /&gt;
If you use Linux, your best bet is to install [[Development Team/Jhbuild|sugar-jhbuild]].  You will be able to develop in your native environment, treating Sugar as just another desktop application.&lt;br /&gt;
&lt;br /&gt;
If you run MacOS X or Windows, you will need to set up an emulator.  For Mac OS X, see [[Supported_systems/Mac]].  For Windows, see [[Supported_systems/Windows]].  &lt;br /&gt;
&lt;br /&gt;
To develop efficiently using an emulator or a secondary machine running Sugar natively (such as an OLPC XO), find an editor which supports editing files over a SFTP connection.  [http://www.openkomodo.com/ Komodo Edit] is a good example.&lt;br /&gt;
&lt;br /&gt;
====Python Reference &amp;amp; Tutorials====&lt;br /&gt;
* http://docs.python.org/&lt;br /&gt;
* http://diveintopython.org/&lt;br /&gt;
* [http://pleac.sourceforge.net/pleac_python/index.html PLEAC - Programming Language Examples Alike Cookbook]&lt;br /&gt;
&lt;br /&gt;
Python is the language Sugar is written in and is also used by most activities.  If you don&#039;t already know Python well, you should familiarize yourself with it before continuing.&lt;br /&gt;
&lt;br /&gt;
====PyGTK Reference &amp;amp; Tutorials====&lt;br /&gt;
* http://www.pygtk.org/docs/pygtk/index.html&lt;br /&gt;
* http://www.pygtk.org/docs/pygobject/index.html&lt;br /&gt;
&lt;br /&gt;
PyGTK is the user interface toolkit used by Sugar activities.  Bookmark these two links as you will reference them frequently during development.&lt;br /&gt;
&lt;br /&gt;
* http://www.pygtk.org/pygtk2tutorial/index.html&lt;br /&gt;
&lt;br /&gt;
The following sections of the PyGTK tutorial are most relevant to activity development.&lt;br /&gt;
&lt;br /&gt;
* 1. Introduction&lt;br /&gt;
* 2. Getting Started&lt;br /&gt;
* 3. Moving On&lt;br /&gt;
* 4. Packing Widgets&lt;br /&gt;
* 5. Widget Overview&lt;br /&gt;
* 6. The Button Widget&lt;br /&gt;
* 7. Adjustments&lt;br /&gt;
* 8. Range Widgets&lt;br /&gt;
* 9. Miscellaneous Widgets&lt;br /&gt;
* 10. Container Widgets&lt;br /&gt;
* 12. Drawing Area&lt;br /&gt;
&lt;br /&gt;
====Sugar Activities====&lt;br /&gt;
* [[Development Team/Almanac|Sugar Almanac]]&lt;br /&gt;
&lt;br /&gt;
The Sugar Almanac contains all the information you need to start writing Sugar activities, ranging from directory structure to bundle format to API reference.  It also contains answers to common questions and examples of common tasks.&lt;br /&gt;
&lt;br /&gt;
* http://api.sugarlabs.org/&lt;br /&gt;
&lt;br /&gt;
This automatically updated site contains the official API documentation for Sugar.  Though it is currently quite sparse, the source code is included with the documentation and it&#039;s useful to have that at your fingertips.&lt;br /&gt;
&lt;br /&gt;
====Cairo Graphics====&lt;br /&gt;
* http://www.tortall.net/mu/wiki/CairoTutorial&lt;br /&gt;
&lt;br /&gt;
Cairo is the graphics library used in Sugar.  The tutorial is a good introduction to the API as well as vector graphics programming in general.&lt;br /&gt;
&lt;br /&gt;
====Pygame====&lt;br /&gt;
* http://www.pygame.org/&lt;br /&gt;
* [[Development_Team/sugargame]]&lt;br /&gt;
&lt;br /&gt;
Pygame is a library for developing 2D sprite-based games using Python.  Sugargame is a package which makes it possible to embed Pygame into a Sugar activity.&lt;br /&gt;
&lt;br /&gt;
====Sugar [[Human Interface Guidelines]] (HIG)====&lt;br /&gt;
* [[Human Interface Guidelines]]. &lt;br /&gt;
&lt;br /&gt;
Required reading before planning the user interface for your activity.  These pages give a good introduction to the thought process behind the Sugar environment and will help a lot when designing your activity.&lt;br /&gt;
&lt;br /&gt;
====i18n (Localisation) Best Practices====&lt;br /&gt;
* [[Translation_Team/i18n_Best_Practices]].&lt;br /&gt;
&lt;br /&gt;
Once you have strings in your Activity, here are some general tips which will make your translators happy :-)&lt;br /&gt;
&lt;br /&gt;
====JSON introduction====&lt;br /&gt;
* http://www.json.org/fatfree.html &lt;br /&gt;
&lt;br /&gt;
JSON is a data format commonly used to store activity data in the Journal.&lt;br /&gt;
&lt;br /&gt;
* http://simplejson.googlecode.com/svn/tags/simplejson-2.0.8/docs/index.html&lt;br /&gt;
&lt;br /&gt;
Currently, the recommended JSON library is simplejson.  It has also become the standard JSON library in Python 2.6+.&lt;br /&gt;
&lt;br /&gt;
NOTE: There is an odd thing about simplejson - in python25 it lives in &#039;&#039;simplejson&#039;&#039; module, but in python26 it uses &#039;&#039;json&#039;&#039; module. So, use something like [http://git.sugarlabs.org/projects/sugar-port/repos/mainline/blobs/master/json.py this] to wrap it.&lt;br /&gt;
&lt;br /&gt;
====Git introduction====&lt;br /&gt;
Git is the version control software used by Sugar Labs.  It is a distributed version control system and is quite powerful, but requires a lot of command line use.&lt;br /&gt;
&lt;br /&gt;
* [[Activity Team/Git|Git]]&lt;br /&gt;
&lt;br /&gt;
====XML routines====&lt;br /&gt;
There are [http://docs.python.org/library/markup.html dozens] Python classes to satisfy the XML standard, but if you want just save/load parameters use &amp;quot;Zen of XML&amp;quot; in Python - [http://effbot.org/zone/element.htm ElementTree] library. It&#039;s supported out of the box in Python 2.5 (xml.etree.ElementTree module).  In previous versions you&#039;ll have to install library by yourself.&lt;br /&gt;
&lt;br /&gt;
But if you just need a simple configuration format to read/write Python objects, check out JSON instead.&lt;br /&gt;
&lt;br /&gt;
====Speech synthesizing====&lt;br /&gt;
If you want to add a speech synthesizer for English and other languages, try the [[Development Team/gst-plugins-espeak|gst-plugins-espeak]] plugin for gstreamer.&lt;br /&gt;
&lt;br /&gt;
==Activity Development Resources==&lt;br /&gt;
This is an open area for posting links related to activity development.&lt;br /&gt;
&lt;br /&gt;
===Sample code===&lt;br /&gt;
&lt;br /&gt;
* An example of [[Activity Team/Sample code/Ruler|a simple activity that uses Cairo graphics]]&lt;br /&gt;
* An [http://uclug.org/images/Sugar.odp OpenOffice presentation] that touches on many of the issues encountered by first-time Sugar developers. Some items covered are: What is Sugar and Sugar Labs; What are some development environments; Some Sugar specific python statements for a PyGTK activity; Activity distribution. You can also [http://media.libsyn.com/media/dsyates/101309uclug0020.ogg listen] to the creator ([http://wiki.sugarlabs.org/go/User:Ossfm ossfm]) give the presentation at a LUG meeting (starting at 9 minutes and 55 seconds).&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
* http://docs.python.org/ The official Python documentation.&lt;br /&gt;
* http://www.pygtk.org/docs/pygtk/index.html PyGTK API reference&lt;br /&gt;
* http://www.pygtk.org/docs/pygobject/index.html PyGObject API reference.  Contains a few important things missing from the PyGTK API such as timers and idle callbacks.&lt;br /&gt;
* http://api.sugarlabs.org/ The official Sugar API documentation (quite sparse but includes all the source code).&lt;br /&gt;
* [[Development Team/Almanac]] Detailed Sugar API overview.  Quite in depth and offers answers to common questions.&lt;br /&gt;
* http://pygstdocs.berlios.de/ Python GStreamer bindings.&lt;br /&gt;
* [[Human Interface Guidelines]] The design behind the Sugar interface.  Very important to read and understand before planning your activity&#039;s user interface.&lt;br /&gt;
* http://cairographics.org/documentation/pycairo/ Cairo Python API reference.  Very sparse, use the tutorial instead.&lt;br /&gt;
* [[OLPC:Low-level Activity API]] Information on how activities interact with Sugar.&lt;br /&gt;
&lt;br /&gt;
===Tutorials and Whitepapers===&lt;br /&gt;
* http://diveintopython.org/ An online book which teaches Python step by step.&lt;br /&gt;
* http://www.pygtk.org/pygtk2tutorial/index.html A very informative step-by-step introduction to PyGTK.&lt;br /&gt;
* http://www.olpcaustria.org/mediawiki/index.php/Activity_handbook Introduction to activity development by OLPC Austria.&lt;br /&gt;
* [[OLPC:Sugar Activity Tutorial]] Another introduction to activity development.&lt;br /&gt;
* http://www.tortall.net/mu/wiki/CairoTutorial A great introduction to Cairo in PyGTK and vector graphics drawing in general.&lt;br /&gt;
* http://www.json.org/fatfree.html An overview of the JSON data format.&lt;br /&gt;
* http://simplejson.googlecode.com/svn/tags/simplejson-2.0.8/docs/index.html Documentation for the recommended JSON library.&lt;br /&gt;
* [[OLPC:Shared Sugar Activities]] High level overview of collaboration.&lt;br /&gt;
* [[OLPC:Collaboration Tutorial]] Step by step tutorial on integrating collaboration into an activity.&lt;br /&gt;
* [[Activity_Team/Modifing_an_Activity]] Information describing simple modifications that can be made to common Sugar activities.&lt;br /&gt;
* [[Activity Team/Compatibility Tips]] Information on ensuring your activity is portable to the various distributions that run Sugar.&lt;br /&gt;
&lt;br /&gt;
===Community resources===&lt;br /&gt;
* http://dev.sugarlabs.org/ Bug tracking for Sugar and activities.  Go here to report bugs in the Sugar toolkit.  Each activity should have its own component here.&lt;br /&gt;
* http://git.sugarlabs.org/ Gitorious source code hosting.&lt;br /&gt;
* http://git.sugarlabs.org/events.atom RSS feed of all Sugar development activity.  Great for keeping an eye on the project as a whole.&lt;br /&gt;
&lt;br /&gt;
==Stuck?==&lt;br /&gt;
&lt;br /&gt;
If you have a question, don&#039;t hesitate to ask the activity team.  We are happy to help and can often save you a lot of hunting for answers.&lt;br /&gt;
&lt;br /&gt;
We hang out in #sugar on irc.freenode.net, and you can always [http://lists.sugarlabs.org/listinfo/sugar-devel subscribe] and post questions to sugar-devel@lists.sugarlabs.org.&lt;br /&gt;
&lt;br /&gt;
[[Category:Activity Team]]&lt;br /&gt;
[[Category:Resource]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40457</id>
		<title>Development Team/Sugargame</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Sugargame&amp;diff=40457"/>
		<updated>2009-11-21T14:18:50Z</updated>

		<summary type="html">&lt;p&gt;Wade: Created page with &amp;#039;== Sugargame ==  Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] programs to run well under Sugar.  It is fork of the olcpgames framework, which is no …&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sugargame ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is a Python package which allows [http://www.pygame.org/ Pygame] programs to run well under Sugar. &lt;br /&gt;
It is fork of the olcpgames framework, which is no longer maintained.&lt;br /&gt;
&lt;br /&gt;
Sugargame embeds the Pygame window into a GTK window, and translates GTK &lt;br /&gt;
events to Pygame events.&lt;br /&gt;
&lt;br /&gt;
What it does:&lt;br /&gt;
&lt;br /&gt;
* Wraps a Sugar activity around an existing Pygame program with few changes&lt;br /&gt;
* Allows Sugar toolbars and other widgets to be added to the activity UI&lt;br /&gt;
* Provides hooks for saving to and restoring from the Journal&lt;br /&gt;
&lt;br /&gt;
Advantages vs olpcgames:&lt;br /&gt;
&lt;br /&gt;
* Simpler code&lt;br /&gt;
* More elegant interface between Pygame and GTK&lt;br /&gt;
* Runs as a single thread: no thread related segfaults&lt;br /&gt;
&lt;br /&gt;
== Using Sugargame ==&lt;br /&gt;
 &lt;br /&gt;
To use Sugargame in an activity, copy the sugargame folder into the activity&#039;s &lt;br /&gt;
source directory.&lt;br /&gt;
 &lt;br /&gt;
The activity directory should look something like this:&lt;br /&gt;
 &lt;br /&gt;
   activity/            - Activity directory: activity.info, SVG icon, etc.&lt;br /&gt;
   sugargame/           - Sugargame package&lt;br /&gt;
   MyActivity.py        - Activity class&lt;br /&gt;
   mygame.py            - Pygame code&lt;br /&gt;
   setup.py             - Install script&lt;br /&gt;
   &lt;br /&gt;
To make the Activity class, start with test/TestActivity.py.  &lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
&lt;br /&gt;
For help with Sugargame, please email the Sugar Labs development list:&lt;br /&gt;
&lt;br /&gt;
: sugar-devel@lists.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
== Author ==&lt;br /&gt;
&lt;br /&gt;
Sugargame is developed by Wade Brainerd &amp;lt;wadetb@gmail.com&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
It is loosely based on the source code to the olpcgames framework, developed by &lt;br /&gt;
the One Laptop Per Child project.&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activities/Typing_Turtle&amp;diff=40374</id>
		<title>Activities/Typing Turtle</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activities/Typing_Turtle&amp;diff=40374"/>
		<updated>2009-11-19T04:34:03Z</updated>

		<summary type="html">&lt;p&gt;Wade: Created page with &amp;#039;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TOCright}} Typing Turtle&amp;lt;/noinclude&amp;gt;  ==Typing Turtle==  Typing Turtle is available from the Sugar Labs Activity Library: h…&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TOCright}}&lt;br /&gt;
[[Category:Activities|Typing Turtle]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typing Turtle==&lt;br /&gt;
&lt;br /&gt;
Typing Turtle is available from the Sugar Labs Activity Library: http://activities.sugarlabs.org/en-US/sugar/addon/4026.&lt;br /&gt;
&lt;br /&gt;
Typing Turtle is an interactive touch typing program.  It gradually introduces the keys on the keyboard through a series of lessons, until the student has learned the entire keyboard.  Skills are reinforced with typing games. &lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Screenshots can be found at the [http://activities.sugarlabs.org/en-US/sugar/addon/4026 Activity page].&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
* An on-screen keyboard with overlaid hand positions shows the correct way to press each key, encouraging good typing habits.&lt;br /&gt;
* Automatically picks up and uses the system&#039;s keyboard layout.&lt;br /&gt;
* You can make your own lessons, and send them to students or friends.&lt;br /&gt;
* A balloon game provides an entertaining way to gain skill.&lt;br /&gt;
* Medals are awarded as the user completes the lessons.  Gold is for the best accuracy and speed, followed by Silver and Bronze.&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Git_Tutorial&amp;diff=39873</id>
		<title>Activity Team/Git Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Git_Tutorial&amp;diff=39873"/>
		<updated>2009-11-04T13:53:35Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Push project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TeamHeader|Activity Team}}{{TOCright}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
== Gitorious ==&lt;br /&gt;
&lt;br /&gt;
Getting started with Gitorious.&lt;br /&gt;
&lt;br /&gt;
=== Create an account ===&lt;br /&gt;
Create an account on git.sugarlabs.org by selecting the register link on the home page.&lt;br /&gt;
&lt;br /&gt;
Enter your&lt;br /&gt;
*Login&lt;br /&gt;
*Email&lt;br /&gt;
*Password&lt;br /&gt;
*Password confirmation&lt;br /&gt;
&lt;br /&gt;
Follow link on email confirmation&lt;br /&gt;
&lt;br /&gt;
=== Create SSH Key ===&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
=== Create a Project === &lt;br /&gt;
&lt;br /&gt;
Created a new project by selecting the new link on the project page.&lt;br /&gt;
&lt;br /&gt;
Enter your&lt;br /&gt;
*Project Title&lt;br /&gt;
*Project slug (This a filled in for you based on your project title&lt;br /&gt;
*License&lt;br /&gt;
*Description&lt;br /&gt;
&lt;br /&gt;
There several other question which can be answered later as you have more information.&lt;br /&gt;
&lt;br /&gt;
=== Create Local Repository ===&lt;br /&gt;
&lt;br /&gt;
There are two way to create a local repository.  Initial one from scratch using git commands or pull your new project from Gitorious.&lt;br /&gt;
&lt;br /&gt;
==== Initialize blank repository ====&lt;br /&gt;
Make a directory for your project, and copy your source files there. Change to the project directory and run:&lt;br /&gt;
&lt;br /&gt;
 git init&lt;br /&gt;
&lt;br /&gt;
==== Pull from Gitorious ====&lt;br /&gt;
&lt;br /&gt;
One of the easiest way to create a local git repository which it set up to point to your new Gitorious project is to  &lt;br /&gt;
&lt;br /&gt;
=== Push project ===&lt;br /&gt;
 git remote add origin gitorious@git.sugarlabs.org:turtleart/mainline.git&lt;br /&gt;
 # to push the master branch to the origin remote we added above:&lt;br /&gt;
 git push origin master &lt;br /&gt;
 # after that you can just do:&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
To find the push URL, visit the Gitorious page for the project.  Example: http://git.sugarlabs.org/projects/turtleart/repos/mainline&lt;br /&gt;
&lt;br /&gt;
Use&lt;br /&gt;
 git-pull&lt;br /&gt;
to periodically pull pootle updates to the project .po files (every Friday?)&lt;br /&gt;
&lt;br /&gt;
Also, run&lt;br /&gt;
 python setup.py fix_manifest&lt;br /&gt;
to update the .mo files after updating the .po files&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
alsroot taught me about another git feature: tags&lt;br /&gt;
&lt;br /&gt;
 git tag -m &amp;quot;Release 36&amp;quot; v36 HEAD&lt;br /&gt;
 git push --tags&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
bertf explained to me that git-pull does a combination of fetch and merge, so to merge a patch...&lt;br /&gt;
&lt;br /&gt;
 git pull git://git.sugarlabs.org/infoslicer/alsroots-clone.git master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few notes re moving to the Sugar Labs infrastructure:&lt;br /&gt;
&lt;br /&gt;
* use git init to create a new project&lt;br /&gt;
&lt;br /&gt;
* source packages now go in&lt;br /&gt;
&amp;lt;strike&amp;gt; shell.sugarlabs.org:/upload/sources/sucrose/fructose/&amp;lt;/strike&amp;gt;&lt;br /&gt;
 download.sugarlabs.org:/var/www-sugarlabs/download/sources/sucrose/fructose/&lt;br /&gt;
&lt;br /&gt;
* don&#039;t forget to update addons as well!!&lt;br /&gt;
&lt;br /&gt;
* and to copy the tar file to download.sugarlabs.org&lt;br /&gt;
 download.sugarlabs.org:/download/sources/honey/...&lt;br /&gt;
 download.sugarlabs.org:/download/sources/sucrose/fructose/...&lt;br /&gt;
&lt;br /&gt;
[[Category:Activity Team]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Git_Tutorial&amp;diff=39872</id>
		<title>Activity Team/Git Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Git_Tutorial&amp;diff=39872"/>
		<updated>2009-11-04T13:53:12Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Push project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TeamHeader|Activity Team}}{{TOCright}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
== Gitorious ==&lt;br /&gt;
&lt;br /&gt;
Getting started with Gitorious.&lt;br /&gt;
&lt;br /&gt;
=== Create an account ===&lt;br /&gt;
Create an account on git.sugarlabs.org by selecting the register link on the home page.&lt;br /&gt;
&lt;br /&gt;
Enter your&lt;br /&gt;
*Login&lt;br /&gt;
*Email&lt;br /&gt;
*Password&lt;br /&gt;
*Password confirmation&lt;br /&gt;
&lt;br /&gt;
Follow link on email confirmation&lt;br /&gt;
&lt;br /&gt;
=== Create SSH Key ===&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
=== Create a Project === &lt;br /&gt;
&lt;br /&gt;
Created a new project by selecting the new link on the project page.&lt;br /&gt;
&lt;br /&gt;
Enter your&lt;br /&gt;
*Project Title&lt;br /&gt;
*Project slug (This a filled in for you based on your project title&lt;br /&gt;
*License&lt;br /&gt;
*Description&lt;br /&gt;
&lt;br /&gt;
There several other question which can be answered later as you have more information.&lt;br /&gt;
&lt;br /&gt;
=== Create Local Repository ===&lt;br /&gt;
&lt;br /&gt;
There are two way to create a local repository.  Initial one from scratch using git commands or pull your new project from Gitorious.&lt;br /&gt;
&lt;br /&gt;
==== Initialize blank repository ====&lt;br /&gt;
Make a directory for your project, and copy your source files there. Change to the project directory and run:&lt;br /&gt;
&lt;br /&gt;
 git init&lt;br /&gt;
&lt;br /&gt;
==== Pull from Gitorious ====&lt;br /&gt;
&lt;br /&gt;
One of the easiest way to create a local git repository which it set up to point to your new Gitorious project is to  &lt;br /&gt;
&lt;br /&gt;
=== Push project ===&lt;br /&gt;
 git remote add origin gitorious@git.sugarlabs.org:turtleart/mainline.git&lt;br /&gt;
 # to push the master branch to the origin remote we added above:&lt;br /&gt;
 git push origin master &lt;br /&gt;
 # after that you can just do:&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
To find the push URL, visit the Gitorious page for the project.  Example: http://git.sugarlabs.org/projects/turtleart/repos/mainline&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. I added the pootle user as a committer.&lt;br /&gt;
:5. Where should I put the .xo bundle? And the source tarball?&lt;br /&gt;
::there is [http://git.sugarlabs.org/projects/sugar-tools/repos/mainline/blobs/master/release a script] for generating and posting changes that covers all of these details.&lt;br /&gt;
&lt;br /&gt;
I had a bit of trouble pushing a new change to gitorious today. I had to use the --force flag for some reason. We suspect it may have something to do with the fact that one of the files I pushed is a binary file. Will report back what I find. (Seems to work fine when there are no binary files to add/push.)&lt;br /&gt;
 git push -fv&lt;br /&gt;
&lt;br /&gt;
I have been trying to use release.py with no luck so far either. (It has a dependency on the feedparser python library, which is easy enough to install.) It complained about a mismatched tag, so I used the --version flag to force the same version number as in my activity.info file. Then I got this error:&lt;br /&gt;
&lt;br /&gt;
 nothing added to commit but untracked files present (use &amp;quot;git add&amp;quot; to track)&lt;br /&gt;
 Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;../release.py&amp;quot;, line 325, in &amp;lt;module&amp;gt;&lt;br /&gt;
    main()&lt;br /&gt;
  File &amp;quot;../release.py&amp;quot;, line 314, in main&lt;br /&gt;
    release.tag()&lt;br /&gt;
  File &amp;quot;../release.py&amp;quot;, line 170, in tag&lt;br /&gt;
    subprocess.check_call([&#039;git&#039;, &#039;commit&#039;, &#039;-a&#039;, &#039;-m&#039; , &#039;%s&#039; % message])&lt;br /&gt;
  File &amp;quot;/usr/lib/python2.5/subprocess.py&amp;quot;, line 462, in check_call&lt;br /&gt;
    raise CalledProcessError(retcode, cmd)&lt;br /&gt;
 subprocess.CalledProcessError: Command &#039;[&#039;git&#039;, &#039;commit&#039;, &#039;-a&#039;, &#039;-m&#039;, &#039;Release 26&#039;]&#039; returned non-zero exit status 1&lt;br /&gt;
&lt;br /&gt;
Is this because I did the git commit and git push by hand before running release.py?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Use&lt;br /&gt;
 git-pull&lt;br /&gt;
to periodically pull pootle updates to the project .po files (every Friday?)&lt;br /&gt;
&lt;br /&gt;
Also, run&lt;br /&gt;
 python setup.py fix_manifest&lt;br /&gt;
to update the .mo files after updating the .po files&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
alsroot taught me about another git feature: tags&lt;br /&gt;
&lt;br /&gt;
 git tag -m &amp;quot;Release 36&amp;quot; v36 HEAD&lt;br /&gt;
 git push --tags&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
bertf explained to me that git-pull does a combination of fetch and merge, so to merge a patch...&lt;br /&gt;
&lt;br /&gt;
 git pull git://git.sugarlabs.org/infoslicer/alsroots-clone.git master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few notes re moving to the Sugar Labs infrastructure:&lt;br /&gt;
&lt;br /&gt;
* use git init to create a new project&lt;br /&gt;
&lt;br /&gt;
* source packages now go in&lt;br /&gt;
&amp;lt;strike&amp;gt; shell.sugarlabs.org:/upload/sources/sucrose/fructose/&amp;lt;/strike&amp;gt;&lt;br /&gt;
 download.sugarlabs.org:/var/www-sugarlabs/download/sources/sucrose/fructose/&lt;br /&gt;
&lt;br /&gt;
* don&#039;t forget to update addons as well!!&lt;br /&gt;
&lt;br /&gt;
* and to copy the tar file to download.sugarlabs.org&lt;br /&gt;
 download.sugarlabs.org:/download/sources/honey/...&lt;br /&gt;
 download.sugarlabs.org:/download/sources/sucrose/fructose/...&lt;br /&gt;
&lt;br /&gt;
[[Category:Activity Team]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Talk:Activity_Team/Git_Tutorial&amp;diff=39871</id>
		<title>Talk:Activity Team/Git Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Talk:Activity_Team/Git_Tutorial&amp;diff=39871"/>
		<updated>2009-11-04T13:52:25Z</updated>

		<summary type="html">&lt;p&gt;Wade: Created page with &amp;#039;=== Discussion about release.py moved from the main page ===  : Note that to release a bundle, all you need to do is upload it to activities.sugarlabs.org.  No need to post a sou…&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Discussion about release.py moved from the main page ===&lt;br /&gt;
&lt;br /&gt;
: Note that to release a bundle, all you need to do is upload it to activities.sugarlabs.org.  No need to post a source tarball anywhere assuming it&#039;s in gitorious.  And I&#039;m not sure release.py is well maintained currently.  [[User:Wade|Wade]] 13:52, 4 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:4. I added the pootle user as a committer.&lt;br /&gt;
:5. Where should I put the .xo bundle? And the source tarball?&lt;br /&gt;
::there is [http://git.sugarlabs.org/projects/sugar-tools/repos/mainline/blobs/master/release a script] for generating and posting changes that covers all of these details.&lt;br /&gt;
&lt;br /&gt;
I had a bit of trouble pushing a new change to gitorious today. I had to use the --force flag for some reason. We suspect it may have something to do with the fact that one of the files I pushed is a binary file. Will report back what I find. (Seems to work fine when there are no binary files to add/push.)&lt;br /&gt;
 git push -fv&lt;br /&gt;
&lt;br /&gt;
I have been trying to use release.py with no luck so far either. (It has a dependency on the feedparser python library, which is easy enough to install.) It complained about a mismatched tag, so I used the --version flag to force the same version number as in my activity.info file. Then I got this error:&lt;br /&gt;
&lt;br /&gt;
 nothing added to commit but untracked files present (use &amp;quot;git add&amp;quot; to track)&lt;br /&gt;
 Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;../release.py&amp;quot;, line 325, in &amp;lt;module&amp;gt;&lt;br /&gt;
    main()&lt;br /&gt;
  File &amp;quot;../release.py&amp;quot;, line 314, in main&lt;br /&gt;
    release.tag()&lt;br /&gt;
  File &amp;quot;../release.py&amp;quot;, line 170, in tag&lt;br /&gt;
    subprocess.check_call([&#039;git&#039;, &#039;commit&#039;, &#039;-a&#039;, &#039;-m&#039; , &#039;%s&#039; % message])&lt;br /&gt;
  File &amp;quot;/usr/lib/python2.5/subprocess.py&amp;quot;, line 462, in check_call&lt;br /&gt;
    raise CalledProcessError(retcode, cmd)&lt;br /&gt;
 subprocess.CalledProcessError: Command &#039;[&#039;git&#039;, &#039;commit&#039;, &#039;-a&#039;, &#039;-m&#039;, &#039;Release 26&#039;]&#039; returned non-zero exit status 1&lt;br /&gt;
&lt;br /&gt;
Is this because I did the git commit and git push by hand before running release.py?&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Git_Tutorial&amp;diff=39870</id>
		<title>Activity Team/Git Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Git_Tutorial&amp;diff=39870"/>
		<updated>2009-11-04T13:48:30Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* Initialize blank repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TeamHeader|Activity Team}}{{TOCright}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
== Gitorious ==&lt;br /&gt;
&lt;br /&gt;
Getting started with Gitorious.&lt;br /&gt;
&lt;br /&gt;
=== Create an account ===&lt;br /&gt;
Create an account on git.sugarlabs.org by selecting the register link on the home page.&lt;br /&gt;
&lt;br /&gt;
Enter your&lt;br /&gt;
*Login&lt;br /&gt;
*Email&lt;br /&gt;
*Password&lt;br /&gt;
*Password confirmation&lt;br /&gt;
&lt;br /&gt;
Follow link on email confirmation&lt;br /&gt;
&lt;br /&gt;
=== Create SSH Key ===&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
=== Create a Project === &lt;br /&gt;
&lt;br /&gt;
Created a new project by selecting the new link on the project page.&lt;br /&gt;
&lt;br /&gt;
Enter your&lt;br /&gt;
*Project Title&lt;br /&gt;
*Project slug (This a filled in for you based on your project title&lt;br /&gt;
*License&lt;br /&gt;
*Description&lt;br /&gt;
&lt;br /&gt;
There several other question which can be answered later as you have more information.&lt;br /&gt;
&lt;br /&gt;
=== Create Local Repository ===&lt;br /&gt;
&lt;br /&gt;
There are two way to create a local repository.  Initial one from scratch using git commands or pull your new project from Gitorious.&lt;br /&gt;
&lt;br /&gt;
==== Initialize blank repository ====&lt;br /&gt;
Make a directory for your project, and copy your source files there. Change to the project directory and run:&lt;br /&gt;
&lt;br /&gt;
 git init&lt;br /&gt;
&lt;br /&gt;
==== Pull from Gitorious ====&lt;br /&gt;
&lt;br /&gt;
One of the easiest way to create a local git repository which it set up to point to your new Gitorious project is to  &lt;br /&gt;
&lt;br /&gt;
=== Push project ===&lt;br /&gt;
 git remote add origin gitorious@git.sugarlabs.org:turtleart/mainline.git&lt;br /&gt;
 # to push the master branch to the origin remote we added above:&lt;br /&gt;
 git push origin master &lt;br /&gt;
 # after that you can just do:&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
::Morgs pointed out that if you go to http://git.sugarlabs.org/projects/turtleart/repos/mainline it tells you a &amp;quot;push&amp;quot; URL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. I added the pootle user as a committer.&lt;br /&gt;
:5. Where should I put the .xo bundle? And the source tarball?&lt;br /&gt;
::there is [http://git.sugarlabs.org/projects/sugar-tools/repos/mainline/blobs/master/release a script] for generating and posting changes that covers all of these details.&lt;br /&gt;
&lt;br /&gt;
I had a bit of trouble pushing a new change to gitorious today. I had to use the --force flag for some reason. We suspect it may have something to do with the fact that one of the files I pushed is a binary file. Will report back what I find. (Seems to work fine when there are no binary files to add/push.)&lt;br /&gt;
 git push -fv&lt;br /&gt;
&lt;br /&gt;
I have been trying to use release.py with no luck so far either. (It has a dependency on the feedparser python library, which is easy enough to install.) It complained about a mismatched tag, so I used the --version flag to force the same version number as in my activity.info file. Then I got this error:&lt;br /&gt;
&lt;br /&gt;
 nothing added to commit but untracked files present (use &amp;quot;git add&amp;quot; to track)&lt;br /&gt;
 Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;../release.py&amp;quot;, line 325, in &amp;lt;module&amp;gt;&lt;br /&gt;
    main()&lt;br /&gt;
  File &amp;quot;../release.py&amp;quot;, line 314, in main&lt;br /&gt;
    release.tag()&lt;br /&gt;
  File &amp;quot;../release.py&amp;quot;, line 170, in tag&lt;br /&gt;
    subprocess.check_call([&#039;git&#039;, &#039;commit&#039;, &#039;-a&#039;, &#039;-m&#039; , &#039;%s&#039; % message])&lt;br /&gt;
  File &amp;quot;/usr/lib/python2.5/subprocess.py&amp;quot;, line 462, in check_call&lt;br /&gt;
    raise CalledProcessError(retcode, cmd)&lt;br /&gt;
 subprocess.CalledProcessError: Command &#039;[&#039;git&#039;, &#039;commit&#039;, &#039;-a&#039;, &#039;-m&#039;, &#039;Release 26&#039;]&#039; returned non-zero exit status 1&lt;br /&gt;
&lt;br /&gt;
Is this because I did the git commit and git push by hand before running release.py?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Use&lt;br /&gt;
 git-pull&lt;br /&gt;
to periodically pull pootle updates to the project .po files (every Friday?)&lt;br /&gt;
&lt;br /&gt;
Also, run&lt;br /&gt;
 python setup.py fix_manifest&lt;br /&gt;
to update the .mo files after updating the .po files&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
alsroot taught me about another git feature: tags&lt;br /&gt;
&lt;br /&gt;
 git tag -m &amp;quot;Release 36&amp;quot; v36 HEAD&lt;br /&gt;
 git push --tags&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
bertf explained to me that git-pull does a combination of fetch and merge, so to merge a patch...&lt;br /&gt;
&lt;br /&gt;
 git pull git://git.sugarlabs.org/infoslicer/alsroots-clone.git master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few notes re moving to the Sugar Labs infrastructure:&lt;br /&gt;
&lt;br /&gt;
* use git init to create a new project&lt;br /&gt;
&lt;br /&gt;
* source packages now go in&lt;br /&gt;
&amp;lt;strike&amp;gt; shell.sugarlabs.org:/upload/sources/sucrose/fructose/&amp;lt;/strike&amp;gt;&lt;br /&gt;
 download.sugarlabs.org:/var/www-sugarlabs/download/sources/sucrose/fructose/&lt;br /&gt;
&lt;br /&gt;
* don&#039;t forget to update addons as well!!&lt;br /&gt;
&lt;br /&gt;
* and to copy the tar file to download.sugarlabs.org&lt;br /&gt;
 download.sugarlabs.org:/download/sources/honey/...&lt;br /&gt;
 download.sugarlabs.org:/download/sources/sucrose/fructose/...&lt;br /&gt;
&lt;br /&gt;
[[Category:Activity Team]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Talk:Teacher%27s_Tools&amp;diff=39578</id>
		<title>Talk:Teacher&#039;s Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Talk:Teacher%27s_Tools&amp;diff=39578"/>
		<updated>2009-10-26T17:27:03Z</updated>

		<summary type="html">&lt;p&gt;Wade: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Talk about what you want or don&#039;t want in the project here.&lt;br /&gt;
&lt;br /&gt;
==Want to keep==&lt;br /&gt;
&lt;br /&gt;
anything you like that&#039;s already in it and you want to keep, put it here&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Want to add==&lt;br /&gt;
&lt;br /&gt;
insert what you want to be added here&lt;br /&gt;
&lt;br /&gt;
==Want to remove==&lt;br /&gt;
&lt;br /&gt;
if you don&#039;t want it in there tell me&lt;br /&gt;
&lt;br /&gt;
==Usability==&lt;br /&gt;
&lt;br /&gt;
talk about things like whether or not it will be useful as a whole here&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
anything that you want to say that doesn&#039;t fall into the above categories&lt;br /&gt;
&lt;br /&gt;
==== Design &amp;amp; Prototype comments from [[User:Wade]] ====&lt;br /&gt;
: I&#039;d like to suggest a name for this activity: &amp;quot;Pop Quiz&amp;quot;.&lt;br /&gt;
- The 1st screen is what the teacher would see, and have the opportunity to input a question, an answer, as well as the maximum time the students will have to answer. Then they would click send/submit and the students would recieve the question on their screens. &lt;br /&gt;
: This screen is very straightforward and nicely done.  However, I think the format should be multiple choice.  Text answer/response is way too slow and inaccurate.  The teacher should be able to provide several answers to choose from (e.g. multiple choice).   The question and answers should be able to be text, a picture (imported from the Journal) and/or sound.  It should be possible to create a sequence of questions offline and save them to the Journal (with the pictures and sounds included in the Journal bundle).&lt;br /&gt;
- The 2nd screen is what the student would see after the teacher submits a question. The teachers question is displayed as well as a timer and a space for an answer. When the timer runs out, an answer is submitted regardless, otherwise the student can just input an answer and send/submit it. &lt;br /&gt;
: This is screen is also well done.  In multiple choice, the user should just have to click on the right answer.&lt;br /&gt;
- The 3rd and 4th screens are both for the teacher. The 3rd screen is the general statistics of the class: Percent that got it correct, the number of students that selected each answer, the average time it took them to answer. The 4th screen is a representation of the class room organized by the name of the XO per student. The teacher can hover over the XO symbol to see the XO&#039;s name immediately, and if they continue to hover over it (like in the XO user interface) more information about that particular XO will be displayed such as what answer was selected, and the exact time it took them to answer. &lt;br /&gt;
: I feel that these screens need to be redesigned.  First, eliminate the third screen - this information could be a small box at the bottom of the fourth screen.  On the fourth screen, the XO images hide critical information.  You should display a grid with the XO&#039;s name and answer, highlighted based on whether the answer was correct or incorrect.  There should be no clicking or hovering required by the teacher.&lt;br /&gt;
: Finally, there should be a button for the teacher to &amp;quot;end&amp;quot; the quiz.  This will show the teacher final percentages for each student and the class as a whole, and will show each student their complete list of right and wrong answers and percent right.&lt;br /&gt;
&lt;br /&gt;
If you need help figuring out how to code this activity in Python, let me know!&lt;br /&gt;
&lt;br /&gt;
Best,&lt;br /&gt;
[[User:Wade|Wade]] 17:27, 26 October 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
==Contact==&lt;br /&gt;
&lt;br /&gt;
If you need any help contact/email [[user:acj3840|Alex Jones]] email: acj3840@rit.edu&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Development_Team/Almanac/Activity_Bundles&amp;diff=39227</id>
		<title>Development Team/Almanac/Activity Bundles</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Development_Team/Almanac/Activity_Bundles&amp;diff=39227"/>
		<updated>2009-10-17T03:01:48Z</updated>

		<summary type="html">&lt;p&gt;Wade: /* .info file format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}&amp;lt;/noinclude&amp;gt;{{Developers}}{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[[Activities]] in the [[Sugar]] environment are packaged into a self-contained &#039;&#039;&#039;&amp;quot;bundles&amp;quot;&#039;&#039;&#039;.  Each bundle contains all the resources and executable code (other than system-provided base libraries) which the activity needs to execute.  Any resources or executable code that is not provided by the base system must be packaged within the bundle.  Activity bundles are the end result of, and use a different directory structure than, [[olpc:Creating_an_activity|activity development]]&lt;br /&gt;
&lt;br /&gt;
; See also &lt;br /&gt;
* [[olpc:OLPC Bitfrost]] in general and its section on [[olpc:OLPC Bitfrost#Software installation|software installation]]&lt;br /&gt;
* [[Human_Interface_Guidelines/Activities|HIG-Activities]] and its section on [[Human_Interface_Guidelines/Activities/Activity Bundles|activity bundles]]&lt;br /&gt;
* [[olpc:Creating an activity]]&lt;br /&gt;
&lt;br /&gt;
== Rationale ==&lt;br /&gt;
&lt;br /&gt;
Activities are meant to be shared between children.  If a child doesn&#039;t have the activity, it is automatically transfered to the child when he or she joins the shared activity.  Packaging activities in self-contained bundles allows easy sharing, installation, removal, and backup.&lt;br /&gt;
&lt;br /&gt;
== Location ==&lt;br /&gt;
&lt;br /&gt;
Activities are installed and removed automatically by [[Sugar]], in response to user actions.  Sugar places activities in directory of its choice.  Activities should not rely on being installed in a specific location, and should use relative paths where paths are necessary (i.e., for shared library linkage, activity resources such as images, sounds, etc).  They should also not rely on the bundle&#039;s base directory name remaining the same.  Sugar may rename the activity bundle base directory at any time to prevent bundle conflicts.&lt;br /&gt;
&lt;br /&gt;
Currently Sugar on jhbuild looks for bundles in the &amp;quot;activities&amp;quot; subfolders of XDG_DATA_DIRS.  Right now this is /usr/share/activities and the usr/share/activities subfolder of the jhbuild build folder.&lt;br /&gt;
&lt;br /&gt;
Sugar will automatically generate and remove the .service files necessary to launch the activity through [[olpc:D-BUS]] service activation when the activity is installed or removed.&lt;br /&gt;
&lt;br /&gt;
Activities should also NEVER store local state or preferences in the activity bundle itself.  These should always be stored in an activity-specific directory in the user&#039;s sugar profile, available through the SUGAR_PROFILE environment variable.&lt;br /&gt;
&lt;br /&gt;
Python developers can also get the profile folder this way:&lt;br /&gt;
 import sugar.env&lt;br /&gt;
 profile_path = sugar.env.get_profile_path()&lt;br /&gt;
&lt;br /&gt;
== Bundle structure ==&lt;br /&gt;
&lt;br /&gt;
The activity bundle is a directory, with a name ending in &amp;quot;.activity&amp;quot;.  Each activity bundle must, in a subdirectory called &#039;activity&#039;, contain a file named &amp;quot;activity.info&amp;quot;, and following a special format.  For example:&lt;br /&gt;
&lt;br /&gt;
 Web.activity/&lt;br /&gt;
     MANIFEST                                   (list of bundle contents)&lt;br /&gt;
     activity/&lt;br /&gt;
         activity.info                          (activity info file)&lt;br /&gt;
         activity-web.svg                       (icon for activity as specified in activity.info)&lt;br /&gt;
         mimetypes.xml                          (map documents to MIME types)&lt;br /&gt;
         text-plain.svg                         (icons for documents, e.g. &amp;quot;text-plain.svg&amp;quot; for &amp;quot;text/plain&amp;quot;)&lt;br /&gt;
         text-html.svg&lt;br /&gt;
         contents                               (manifest for bundle contents -- not supported by Sugar)&lt;br /&gt;
         contents.sig                           (credentials for signed bundle -- not supported by Sugar)&lt;br /&gt;
         permissions.info                       (optional; &#039;&#039;&#039;not a stable API&#039;&#039;&#039;)&lt;br /&gt;
     bin/&lt;br /&gt;
         web-activity                           (launcher script or activity executable)&lt;br /&gt;
     locale/&lt;br /&gt;
         de_DE/&lt;br /&gt;
             activity.linfo                     (localized info 1)&lt;br /&gt;
         zh_CN/&lt;br /&gt;
             activity.linfo                     (localized info 2)&lt;br /&gt;
     lib/&lt;br /&gt;
         mylib.so                               (native library)&lt;br /&gt;
     icons/&lt;br /&gt;
&lt;br /&gt;
;MANIFEST&lt;br /&gt;
&lt;br /&gt;
This optional file lists the files that will packaged in the .xo file. If missing, all files in the Activity directory which do not match a default ignore list are packaged.  The default ignore list includes the dist and .git subdirectories, and the .gitignore, MANIFEST, *.pyc, *~, *.bak, pseudo.po files.&lt;br /&gt;
&lt;br /&gt;
;activity&lt;br /&gt;
&lt;br /&gt;
All metadata about the activity is organized in this subdirectory.  The &amp;lt;code&amp;gt;contents&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;contents.sig&amp;lt;/code&amp;gt; are manifest and credential files for the entire bundle contents (excepting the &amp;lt;code&amp;gt;contents&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;contents.sig&amp;lt;/code&amp;gt; files themselves), as described by the [[olpc:Contents manifest specification]]; these files are not supported by current versions of Sugar.  The optional &amp;lt;code&amp;gt;mimetypes.xml&amp;lt;/code&amp;gt; file is a [http://freedesktop.org/wiki/Specifications/shared-mime-info-spec freedesktop.org MIME type file] describing how to recognize the MIME types defined by the activity. SVG icons for those MIME types can be put in this directory as well.&lt;br /&gt;
&lt;br /&gt;
;bin&lt;br /&gt;
&lt;br /&gt;
Contains executables, is added to the PATH environment variable.&lt;br /&gt;
&lt;br /&gt;
;lib&lt;br /&gt;
&lt;br /&gt;
See [[#Bundling native libraries]] below.&lt;br /&gt;
&lt;br /&gt;
;locale&lt;br /&gt;
&lt;br /&gt;
See [[#Activity name localization/translation]] below.&lt;br /&gt;
&lt;br /&gt;
; icons&lt;br /&gt;
Contains the icons used by the activity. When using the sugar.activity python package the path is automatically added to the default [http://www.pygtk.org/docs/pygtk/class-gtkicontheme.html gtk icon theme].&lt;br /&gt;
&lt;br /&gt;
== .info file format ==&lt;br /&gt;
&lt;br /&gt;
.info files follow a key/value pair format, similar to the [http://www.freedesktop.org/wiki/Specifications/desktop-entry-spec fd.o desktop entry spec], but not conforming to it.  An example is shown here:&lt;br /&gt;
&lt;br /&gt;
 [Activity]&lt;br /&gt;
 name = Web&lt;br /&gt;
 activity_version = 1&lt;br /&gt;
 host_version = 1&lt;br /&gt;
 bundle_id = com.redhat.Sugar.BrowserActivity&lt;br /&gt;
 license = GPLv2+ and BSD&lt;br /&gt;
 icon = activity-web&lt;br /&gt;
 exec = sugar-activity browseractivity.BrowserActivity -s&lt;br /&gt;
 mime_types = application/pdf;image/tiff&lt;br /&gt;
 update_url = http://host.net/bundles/FooBar&lt;br /&gt;
 tags = exploration;web&lt;br /&gt;
&lt;br /&gt;
A more detailed explanation of the valid properties follows:&lt;br /&gt;
&lt;br /&gt;
 [Activity]&lt;br /&gt;
: The activity.info file must begin with [Activity], and only that, on the first line of the file&lt;br /&gt;
&lt;br /&gt;
 name = Web&lt;br /&gt;
: This is the name is displayed in Sugar referring to the activity.  A &#039;name&#039; key without a bracketed language code is the &amp;quot;en_US&amp;quot; localized name of the activity.  The activity.info file must have this key.&lt;br /&gt;
&lt;br /&gt;
 activity_version = 1&lt;br /&gt;
: Each activity.info file must have a &amp;quot;activity_version&amp;quot; key.  The version is a single positive integer.  Larger versions are considered &amp;quot;newer&amp;quot;.  The value assigned to this key should be considered &#039;&#039;&#039;opaque&#039;&#039;&#039; to the activity; the only requirement of the activity is that it must be larger for new activity builds.&lt;br /&gt;
&lt;br /&gt;
 host_version = 1&lt;br /&gt;
: This key is deprecated. This used to specify the version of the Sugar environment the activity is compatible with; however, it was never implemented.&lt;br /&gt;
&lt;br /&gt;
 bundle_id = com.redhat.Sugar.BrowserActivity&lt;br /&gt;
: This is the activity bundle identifier.  It is required. The name should conform to the [http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names D-Bus spec] - in particular, hyphens are not allowed (although this wasn&#039;t enforced in earlier builds, see [http://dev.laptop.org/ticket/6226 Trac 6226]).  It is recommended that [http://en.wikipedia.org/wiki/Java_package#Package_naming_conventions Java package naming conventions] are used when chosing bundle identifiers, to ensure uniqueness.  Briefly, your name should begin with the reversed domain name of an organization you belong to.&lt;br /&gt;
: The reversed domain name part is supposed to be rooted in some actual DNS-rooted namespace.  You don&#039;t need to own this domain; you just need to have a reasonable claim on some &#039;&#039;unique&#039;&#039; name at that domain. There are several ways to derive one:&lt;br /&gt;
:* If your email address is &#039;&#039;yourname&#039;&#039;@&#039;&#039;somemailhost&#039;&#039;.com, then you could use &#039;&#039;com.somemailhost.yourname&#039;&#039;.&#039;&#039;YourActivity&#039;&#039;.&lt;br /&gt;
:* You could set up a web page on a free hosting service with information about your activity, and use a name derived from its URL.  For example, if you create a page at http://www.geocities.com/xotumusica for your activity, then com.geocities.www.xotumusica is a reasonable bundle_id.&lt;br /&gt;
:* If nothing else is available, even org.sugarlabs.wiki.&#039;&#039;Your Activity Page Title&#039;&#039; is probably a reasonable bundle_id, provided that you create the &#039;Your Activity Page Title&#039; page.  Remember, bundle_ids should be unique, so you should double check that the &#039;Your Activity Page Title&#039; page doesn&#039;t already exist (and then create it) before using this as your bundle_id.&lt;br /&gt;
: In the Python bindings, the bundle_id is also used as the activity&#039;s default service type when the activity is shared on the network.  To determine this type, the distinct parts (separated by the &#039;.&#039; character) are reversed, any &#039;.&#039; is replaced by a &#039;_&#039; character, and the type is prefixed by a &#039;_&#039; character.  So in this example, the default service type would be &amp;quot;_BrowserActivity_Sugar_redhat_com&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 license = GPLv2+ and BSD&lt;br /&gt;
: This field names the license used for the activity bundle (the binary .xo file).  The contents of this field should conform to the same guidelines as the [http://fedoraproject.org/wiki/Packaging/LicensingGuidelines#License:_field &amp;lt;code&amp;gt;License:&amp;lt;/code&amp;gt; field] of an RPM package; consult the [http://fedoraproject.org/wiki/Packaging/LicensingGuidelines Fedora Licensing Guidelines] for more information.  A &#039;license&#039; field naming an entry or entries in the &amp;quot;Good Licenses&amp;quot; table at [http://fedoraproject.org/wiki/Licensing Fedora&#039;s Licensing list] is required for any activities distributed by OLPC.&lt;br /&gt;
&lt;br /&gt;
 icon = activity-web&lt;br /&gt;
: It points to the activity&#039;s icon.  The icon is looked up in the activity bundle&#039;s &#039;activity&#039; directory (the same directory the activity.info file is in).  It cannot contain a path.  When searching for the icon in the activity bundle&#039;s &#039;activity&#039; directory, only a file with the icon name and the extension &#039;.svg&#039; will be looked for.  This property is required unless &#039;show_launcher&#039; is &#039;no&#039; (see below).&lt;br /&gt;
&lt;br /&gt;
 exec = sugar-activity webactivity.WebActivity&lt;br /&gt;
: The exec key specifies the executable which [[Sugar]] runs to start the activity instances. Environment variables given on the exec line are expanded. Executable files should be placed into the bin/ directory in the bundle. It should support the following arguments:&lt;br /&gt;
&lt;br /&gt;
; -b, --bundle-id   : Identifier of the activity bundle&lt;br /&gt;
; -a, --activity-id : Identifier of the activity instance.&lt;br /&gt;
; -o, --object-id   : Identifier of the associated datastore object.&lt;br /&gt;
; -u, --uri         : URI to load.&lt;br /&gt;
&lt;br /&gt;
Python activities should generally use the generic sugar-activity executable. Other activities need to adhere to the [[olpc:Low-level Activity API]].&lt;br /&gt;
&lt;br /&gt;
 mime_types = application/pdf;image/tiff&lt;br /&gt;
: List of mime types supported by the activity, separated by semi colons. It&#039;s used when opening a file from the web or to present to the user a list of activities which can open a certain journal object.&lt;br /&gt;
&lt;br /&gt;
 show_launcher = yes&lt;br /&gt;
: This key is optional.  If not present, or if present with a value of &amp;quot;yes&amp;quot;, the activity is shown with its icon in the [[Sugar]] panel launcher and a valid &#039;icon&#039; key/value pair is required.  If specified with a value of &amp;quot;no&amp;quot;, the activity is not shown in the [[Sugar]] panel launcher, and the &#039;icon&#039; key is not required.&lt;br /&gt;
&lt;br /&gt;
 update_url = ...&lt;br /&gt;
&lt;br /&gt;
: URL to retrieve update information; implemented in [http://dev.laptop.org/ticket/4951 #4951].  The software update control panel will attempt to look for information about the latest version of the activity by fetching the given url with first the core OS build number, then the release number, then the release major version number appended, then finally as-is.  (For example, if your update URL tag has the value &#039;http://host.net/bundles/FooBar&#039; and you are currently running release 8.1.1 (core OS 708), the following URLs will be tried, in this order: http://host.net/bundles/FooBar/708, http://host.net/bundles/FooBar/8.1.1, http://host.net/bundles/FooBar/8.1, http://host.net/bundles/FooBar .)  The contents of the URLs should be in the [[olpc:Activity microformat]].  If no update_url is specified, http://wiki.laptop.org/go/Activities will be used.  See [[olpc:Software updater]] for more information.&lt;br /&gt;
&lt;br /&gt;
 tags = exploration;web&lt;br /&gt;
: Tags give more context in which to place the activity. This is used to allow users to find activities more easily in the journal, the home view, [http://activities.sugarlabs.org http://activities.sugarlabs.org], etc.&lt;br /&gt;
&lt;br /&gt;
== Localization/translation of the activity name and tags ==&lt;br /&gt;
&lt;br /&gt;
Localized data lives in the locale directory. Each language stores its localized keys in a &amp;lt;u&amp;gt;separate&amp;lt;/u&amp;gt; directory named for the language&#039;s ISO code.  Localized keys from the &#039;activity.info&#039; file are stored in the &#039;activity.linfo&#039; files in that directory. For example, German-localized German (as opposed to Swiss-localized German) language translations are stored in the &#039;de_DE/activity.linfo&#039; file:&lt;br /&gt;
&lt;br /&gt;
 Example.activity/&lt;br /&gt;
     exampleactivity.py&lt;br /&gt;
     activity/&lt;br /&gt;
         activity.info&lt;br /&gt;
     locale/&lt;br /&gt;
         de_DE/&lt;br /&gt;
             activity.linfo&lt;br /&gt;
         de_CH/&lt;br /&gt;
             activity.linfo&lt;br /&gt;
         es/&lt;br /&gt;
             activity.linfo&lt;br /&gt;
&lt;br /&gt;
At this time, only translations for the &#039;name&#039; and &#039;tags&#039; keys from the &#039;activity.info&#039; file is supported.  A localized &#039;de_DE/activity.linfo&#039; file would look like:&lt;br /&gt;
&lt;br /&gt;
 [Activity]&lt;br /&gt;
 name = Web&lt;br /&gt;
 tags = erforschung;web&lt;br /&gt;
&lt;br /&gt;
Keys in the languague-specific &#039;.linfo&#039; files selectively override keys from the &#039;activity.info&#039; file; if a key is not present in the &#039;.linfo&#039; file the value from the &#039;activity.info&#039; file is used instead.&lt;br /&gt;
&lt;br /&gt;
== Package, extension, mime type ==&lt;br /&gt;
&lt;br /&gt;
Activity bundles should be packaged as zip files with the &amp;quot;.xo&amp;quot; extension. The mime type in the journal is &amp;quot;application/vnd.olpc-sugar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Bundling native libraries ==&lt;br /&gt;
&lt;br /&gt;
Sometimes you need to include a native library or two with your activity.  The strategy that [[olpc:Develop]] and [[olpc:Model]] use is specifying a shell script for the executable in the .info file:&lt;br /&gt;
&lt;br /&gt;
 exec = ./model_startup.sh&lt;br /&gt;
&lt;br /&gt;
The script, &#039;model_startup.sh&#039;, modifies the library path, python, or both paths (depending on the types of libraries you are including) to reference folders inside your bundle, then launches your application:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export PYTHONPATH=$SUGAR_BUNDLE_PATH/site-packages:$PYTHONPATH&lt;br /&gt;
 export LD_LIBRARY_PATH=$SUGAR_BUNDLE_PATH/lib:$LD_LIBRARY_PATH&lt;br /&gt;
 &lt;br /&gt;
 sugar-activity model_app.ModelActivity&lt;br /&gt;
&lt;br /&gt;
Make sure to add your shell script and any native libraries to the MANIFEST before you package your bundle.  You can also accomplish the same thing by throwing all your libraries in the root folder of the bundle, like the [[olpc:Map_(activity)|Map activity]] does, but if you have more than a few libraries to include it can get quite cluttered.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== activity/permissions.info ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: the API described in this section is NOT STABLE and will probably change in future releases; perhaps drastically.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bitfrost describes a variety of security-related settings which activity authors can specify about their activity. At the option of the activity author, these settings can be described in a file called &#039;permissions.info&#039; which can be placed alongside &#039;activity.info&#039; in the &#039;activity&#039; directory of the bundle. &lt;br /&gt;
&lt;br /&gt;
As of rainbow-0.7.21, writing the single line&lt;br /&gt;
&lt;br /&gt;
  constant-uid&lt;br /&gt;
&lt;br /&gt;
into the permissions.info file will result in your activity being launched with the same uid each time it is run. (Usually each activity gets a constant gid, but each instance launched of the activity gets a unique uid.  Activities based on the xulrunner codebase, however, tend to set restrictive group permissions on local files, so this option avoids this problem at the cost of less isolation between activity instances.)&lt;br /&gt;
&lt;br /&gt;
As of rainbow-0.7.22, the line:&lt;br /&gt;
&lt;br /&gt;
  use-serial&lt;br /&gt;
&lt;br /&gt;
will add the activity UIDs to the &#039;uucp&#039; group, so that the activity can access /dev/ttyUSB* devices.  (See &amp;lt;trac&amp;gt;8434&amp;lt;/trac&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
Other options which may be specified include:&lt;br /&gt;
&lt;br /&gt;
 lim_nofile 20&lt;br /&gt;
 lim_fsize 10e6&lt;br /&gt;
 lim_nproc 8&lt;br /&gt;
 lim_mem 190e6&lt;br /&gt;
&lt;br /&gt;
which will limit the number of file descriptors, the maximum writable file size, the number of processes, and the maximum size of the activity&#039;s address space, respectively. (See &amp;lt;tt&amp;gt;[http://linux.die.net/man/2/setrlimit man 2 setrlimit]&amp;lt;/tt&amp;gt; for details.)&lt;br /&gt;
&lt;br /&gt;
== Other technologies comparison ==&lt;br /&gt;
&lt;br /&gt;
Activity bundles are similar to OS X bundles or Java JAR files; a simple mechanism to encapsulate everything you need in a single directory that can be moved around independently. &lt;br /&gt;
&lt;br /&gt;
It differs from autopackage, it&#039;s not a package management system.  There&#039;s no central database, no scripts get run on install/uninstall.  There also is no special file format.&lt;br /&gt;
&lt;br /&gt;
As compared to klik, it&#039;s not intended to replicate a local Unix directory structure inside the package; the activity can still link to system&lt;br /&gt;
provided binaries and such.  There&#039;s also no server-side component other than compressing the archive and sending it over the network.There is also no dependency checking since activities are required to be self-contained.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[olpc:Bundle]] for a generic introduction to bundles&lt;br /&gt;
* [[olpc:Activity tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;br /&gt;
[[Category:Sugar]]&lt;br /&gt;
[[Category:Developer]]&lt;br /&gt;
[[Category:Software development]]&lt;br /&gt;
[[Category:File formats]]&lt;br /&gt;
[[Category:Activity installation]]&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/Problem_Reports&amp;diff=39224</id>
		<title>Features/Problem Reports</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/Problem_Reports&amp;diff=39224"/>
		<updated>2009-10-17T02:31:16Z</updated>

		<summary type="html">&lt;p&gt;Wade: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{GoogleTrans-en}}{{TOCright}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
The &amp;quot;Report a problem&amp;quot; control panel provides a way for the user to report issues with the Sugar shell and activities.  The control panel uploads system information and logs, along with the user&#039;s description of the problem.&lt;br /&gt;
&lt;br /&gt;
== Owner ==&lt;br /&gt;
* Name: [[User:Wade|Wade Brainerd]]&lt;br /&gt;
* Email: wadetb@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Current status ==&lt;br /&gt;
* Targeted release: 0.88&lt;br /&gt;
* Last updated: October 16th, 2009&lt;br /&gt;
* Percentage of completion: 90%&lt;br /&gt;
&lt;br /&gt;
== Detailed Description ==&lt;br /&gt;
A new control panel will be added, titled &amp;quot;Report a problem&amp;quot;.  This panel contains a description box and an Upload report button.  When the button is pressed, the description and system logs are uploaded to a central Sugar Labs server.  &lt;br /&gt;
&lt;br /&gt;
The central server logs the problem reports in a database and stores a copy of the logs.  It also analyzes the logs for specific errors (such as Python Tracebacks).  When a problem report is added, the server sends an email out to a mailing list of developers and interested parties.&lt;br /&gt;
&lt;br /&gt;
When a problem is detected in an Activity, such as failure to launch, Sugar will offer a &amp;quot;Report problem&amp;quot; button which takes the user directly to the control panel.&lt;br /&gt;
&lt;br /&gt;
After uploading, the user is given a Report ID number (a small decimal number).  They can use this if they wish to follow up with the Sugar developers by email.&lt;br /&gt;
&lt;br /&gt;
[[File:Problem-report.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Benefit to Sugar ==&lt;br /&gt;
Currently there is no mechanism for non-technical users to submit problem reports.  In order to inform the Sugar or Activity developers of a problem, a user has two options:&lt;br /&gt;
&lt;br /&gt;
* Create a Trac account and enter a bug.&lt;br /&gt;
* Write an email to sugar-devel@lists.sugarlabs.org.&lt;br /&gt;
&lt;br /&gt;
The first option is time consuming and requires the user to fill in confusing fields such as Component and Version manually.  The second option requires the user to have an email account, and the report is not logged anywhere.  Neither option is convenient or provides relevant details about the problem.&lt;br /&gt;
&lt;br /&gt;
The new control panel offers a way for casual users to report problems encountered in Sugar.  It also supplies a high level of detail about the problem to the developers.&lt;br /&gt;
&lt;br /&gt;
The reason problem reports are not added directly to Trac is that we don&#039;t want to spam the database with spurious reports.  Problem reports are intended to be triaged by subscribers to the mailing list, and then either bugged or noted on an existing ticket.&lt;br /&gt;
&lt;br /&gt;
== Scope ==&lt;br /&gt;
A prototype of the control panel and server have been finished and posted to [http://trac.sugarlabs.org/ticket/1439 #1439] as patches.&lt;br /&gt;
&lt;br /&gt;
The collection server is currently running at logcollect.sugarlabs.org.  Logs are emailed out to the sugar-reports@lists.sugarlabs.org mailing list.&lt;br /&gt;
&lt;br /&gt;
Work left to do:&lt;br /&gt;
* &amp;lt;strike&amp;gt;The control panel needs a SVG icon.&amp;lt;/strike&amp;gt; [[File:Toolbar-bug.png]]&lt;br /&gt;
* When an activity exits, if its log contains an exception report, Sugar should offer to report the problem.  When an activity fails to launch, Sugar should display an error on the launch window and offer to report the problem instead of timing out.&lt;br /&gt;
* &amp;lt;strike&amp;gt;The server needs to be installed on the SugarLabs infrastructure and the reports mailing list needs to be created (sugar-reports@lists.sugarlabs.org?).&amp;lt;/strike&amp;gt; The server is now live at logcollect.sugarlabs.org.  The mailing list sugar-reports@lists.sugarlabs.org now exists.&lt;br /&gt;
* &amp;lt;strike&amp;gt;For deployments, there should be a way to override the server URL.&amp;lt;/strike&amp;gt; The server URL now comes from Gconf.&lt;br /&gt;
* &amp;lt;strike&amp;gt;The Log activity needs to have its Upload Logs button replaced by a button that opens the control panel.&amp;lt;/strike&amp;gt; Most likely we will remove the button from Log, but patches for both options have been posted to the ticket.&lt;br /&gt;
&lt;br /&gt;
== How To Test ==&lt;br /&gt;
{{:{{PAGENAME}}/Testing}}&lt;br /&gt;
&lt;br /&gt;
== User Experience ==&lt;br /&gt;
The user will notice a new control panel.  When an activity fails to launch or otherwise suffers an exception, the user will be offered an opportunity to report the problem.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
== Contingency Plan ==&lt;br /&gt;
Nothing depends on this feature.  If it&#039;s not ready in time it can simply be omitted.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
Ideally this feature would be documented as part of the FLOSS manual.&lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
A mention of how to customize the server URL would be useful.&lt;br /&gt;
&lt;br /&gt;
== Comments and Discussion ==&lt;br /&gt;
* See [[{{TALKPAGENAME}}|discussion tab for this feature]] &lt;br /&gt;
&lt;br /&gt;
[[Category:Feature Page Incomplete]]&lt;br /&gt;
[[Category:Feature]]&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;You can add categories to tie features back to real deployments/schools requesting them, for example &amp;lt;nowiki&amp;gt;[[&amp;lt;/nowiki&amp;gt;Category:Features requested by School Xyz]]&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Wade</name></author>
	</entry>
</feed>