Activity tutorial: Difference between revisions

From OLPC
Jump to navigation Jump to search
(→‎Makefile.am: little changes)
No edit summary
Line 48: Line 48:
Automake checks for the existence of a few required files, you have to create them even if empty:
Automake checks for the existence of a few required files, you have to create them even if empty:


touch NEWS README AUTHORS ChangeLog
$ touch NEWS README AUTHORS ChangeLog


===Makefile.am===
===Makefile.am===
Line 108: Line 108:
This is the package initialization file. It can be blank.
This is the package initialization file. It can be blank.


touch __init__.py
$ touch __init__.py


===drawing.activity===
===drawing.activity===
Line 126: Line 126:
Initialize the build system. The value of prefix depends on the path of sugar-jhbuild:
Initialize the build system. The value of prefix depends on the path of sugar-jhbuild:


./autogen.sh --prefix=[SUGAR-JHBUILD]/build
$ ./autogen.sh --prefix=[SUGAR-JHBUILD]/build


Build and install:
Build and install:


./sugar-jhbuild shell
$ [SUGAR-JHBUILD]/sugar-jhbuild shell
make
$ make
make install
$ make install





Revision as of 14:58, 23 October 2006

  This page is monitored by the OLPC team.

Here is a short tutorial about writing a sugar activity. It's a step by step guide to get you started quickly, without going in details of the activity system. Download the current example sources (Marco's original sources are here).

Write the build system

Create the autogen.sh script

You should only need to change the module name and activity file from this example.

#!/bin/sh
# Run this to generate all the initial makefiles, etc.

srcdir=`dirname $0`
test -z "$srcdir" && srcdir=.

PKG_NAME="sugar-drawing"

(test -f $srcdir/drawing.activity) || {
    echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
    echo " top-level $PKG_NAME directory"
    exit 1
}

which gnome-autogen.sh || {
    echo "You need to install gnome-common from the GNOME CVS"
    exit 1
}

REQUIRED_AUTOMAKE_VERSION=1.9 USE_GNOME2_MACROS=1 . gnome-autogen.sh

Create a configure.ac file

The first line of configure.ac specifies the name of the application, the version number, a bug reporting address, and the name of the module.

The configure.ac file contains a list of all the Makefiles in your project. You will need one Makefile for every directory in your project.

AC_INIT([Sugar Drawing],[0.1],[],[sugar-drawing])
AM_INIT_AUTOMAKE

AM_PATH_PYTHON

AC_OUTPUT([
Makefile
other_dir/Makefile
])

Other required files

Automake checks for the existence of a few required files, you have to create them even if empty:

$ touch NEWS README AUTHORS ChangeLog

Makefile.am

This file tells automake how to install your program.

in the Makefile.am, SUBDIRS is a space-separated list of subdirectories of the current folder, an activitydir that describes where files in the current folder will be installed, and activity_PYTHON which describes what files to install.

The backslash at the end of the activity_PYTHON lines indicates that more data exists on the following lines. (Note that the last line does not have a backslash).

(fixme: exactly what does EXTRA_DIST mean? -- I think it specifies non-*.py files that need to be included in the distribution)

SUBDIRS = foo bar
activitydir = $(datadir)/sugar/activities/drawing
activity_PYTHON =               \
        __init__.py             \
        DrawingActivity.py

EXTRA_DIST = drawing.activity

install-data-local:
        sugar-setup-activity $(srcdir)/drawing.activity

Write the activity code

Write a subclass of sugar.activity.Activity. It's a GtkWindow so you can use the "add" method to insert your own widgets. The source of DrawingActivity.py demonstrates it:

import gtk

from sugar.activity.Activity import Activity

class DrawingActivity(Activity):
        def __init__(self):
                Activity.__init__(self)
                button = gtk.Button('Drawing')
                self.add(button)
                button.show()

Or if you are adapting a full application, your activity could look something like this: (I found I needed to delete the app object explicitly)

import gtk

from sugar.activity.Activity import Activity
from my_module.my_app import my_app

class DrawingActivity(Activity):
        def __init__(self):
                Activity.__init__(self)

                app = my_app.my_app()
                self.add(app.some_widget)
                app.do_show()
                self.connect('destroy',self.do_quit, app)

        def do_quit(self, event, app):
                app.do_quit()
                del app

create __init__.py

This is the package initialization file. It can be blank.

$ touch __init__.py

drawing.activity

Include the necessary information about the activity.

(fixme: what is default_type?)

[Activity]
name = Drawing
id = org.laptop.sugar.Drawing
python_module = drawing.DrawingActivity.DrawingActivity
default_type = _drawing_olpc._udp
show_launcher = yes

Build and install

Initialize the build system. The value of prefix depends on the path of sugar-jhbuild:

$ ./autogen.sh --prefix=[SUGAR-JHBUILD]/build

Build and install:

$ [SUGAR-JHBUILD]/sugar-jhbuild shell
$ make
$ make install