[Commits] typing-turtle branch master updated.
Wade Brainerd
wadetb at gmail.com
Sun Dec 28 13:02:18 EST 2008
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "/home/olpc-code/git/activities/typing-turtle".
The branch, master has been updated
via cb617aa8354633df0b12c561c9b27fcf92e28f30 (commit)
from c9df2df3af69e37139bab3ba11d924548663b384 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
keyboard.py | 265 +++++++++++++---------------------------
lessonbuilder.py | 18 ++-
lessons/en_US/bottomrow.lesson | 2 +-
lessons/en_US/homerow.lesson | 2 +-
lessons/en_US/toprow.lesson | 2 +-
lessonscreen.py | 6 +-
6 files changed, 105 insertions(+), 190 deletions(-)
- Log -----------------------------------------------------------------
commit cb617aa8354633df0b12c561c9b27fcf92e28f30
Author: Wade Brainerd <wadetb at gmail.com>
Date: Sun Dec 28 18:01:47 2008 +0000
Progress towards alpha release.
diff --git a/keyboard.py b/keyboard.py
index 9995326..0940feb 100644
--- a/keyboard.py
+++ b/keyboard.py
@@ -19,9 +19,10 @@
import pygtk
pygtk.require('2.0')
import gtk
-import cairo
-import os, sugar.activity.activity
import rsvg
+import os
+
+import sugar.activity.activity
PARAGRAPH_CODE = u'\xb6'
@@ -232,151 +233,16 @@ DEFAULT_LAYOUT = {
]
}
-class KeyWidget(gtk.DrawingArea):
- """A GTK widget which implements a single key of a keyboard."""
-
- def __init__(self, key, keyboard, scale):
- gtk.DrawingArea.__init__(self)
-
- self.key = key
- self.keyboard = keyboard
- self.scale = scale
-
- self.root_window = keyboard.root_window
-
- self.set_size_request(
- (self.key['key-width']+10) * scale,
- (self.key['key-height']+10) * scale)
-
- self.connect("expose-event", self._expose_cb)
-
- def _setup_transform(self, cr):
- cr.scale(self.scale, self.scale)
-
- def _expose_key(self, k, cr=None):
- # Setup cairo context if needed.
- if not cr:
- if not self.window:
- return
- cr = self.window.cairo_create()
- self._setup_transform(cr)
-
- cr.save()
-
- x1 = 5
- y1 = 5
- x2 = x1 + k['key-width']
- y2 = y1 + k['key-height']
-
- # Outline rounded box.
- corner = 5
- cr.move_to(x1 + corner, y1)
- cr.line_to(x2 - corner, y1)
- cr.line_to(x2, y1 + corner)
- cr.line_to(x2, y2 - corner)
- cr.line_to(x2 - corner, y2)
- cr.line_to(x1 + corner, y2)
- cr.line_to(x1, y2 - corner)
- cr.line_to(x1, y1 + corner)
- cr.close_path()
-
- cr.set_source_rgb(1.0, 1.0, 1.0)
- cr.fill_preserve()
-
- cr.set_source_rgb(0.1, 0.1, 0.1)
- cr.stroke_preserve()
-
- cr.clip()
-
- # Inner text.
- text = ''
- if k['key-label']:
- text = k['key-label']
- else:
- info = self.keyboard.keymap.translate_keyboard_state(
- k['key-scan'], self.keyboard.active_state, self.keyboard.active_group)
- if info:
- key = gtk.gdk.keyval_to_unicode(info[0])
- try:
- text = unichr(key).encode('utf-8')
- except:
- pass
-
- cr.set_font_size(16)
- x_bearing, y_bearing, width, height = cr.text_extents(text)[:4]
-
- cr.move_to(x1+8 - x_bearing, y2-8 - height - y_bearing)
- cr.show_text(text)
-
- cr.restore()
-
- def _expose_cb(self, area, event):
- cr = self.window.cairo_create()
-
- cr.rectangle(event.area.x, event.area.y, event.area.width, event.area.height)
- cr.clip()
-
- self._setup_transform(cr)
-
- self._expose_key(self.key, cr)
-
- return True
-
-class Keyboard(gtk.EventBox):
- """A GTK widget which implements an interactive visual keyboard, with support
- for custom data driven layouts."""
-
- def __init__(self, root_window):
- gtk.EventBox.__init__(self)
-
- self.root_window = root_window
-
- # Create the drawing area.
- self.area = gtk.DrawingArea()
- self.area.connect("expose-event", self._expose_cb)
- self.add(self.area)
-
- # Access the current GTK keymap.
- self.keymap = gtk.gdk.keymap_get_default()
-
- # Active language group and modifier state.
- # See http://www.pygtk.org/docs/pygtk/class-gdkkeymap.html for more
- # information about key group and state.
- self.active_group = 0
- self.active_state = 0
-
+class KeyboardData:
+ def __init__(self):
# This array contains the current keyboard layout.
self.keys = None
self.key_scan_map = None
- self.hilite_letter = None
-
- self.draw_hands = False
-
- # Load SVG files.
- bundle_path = sugar.activity.activity.get_bundle_path()
- self.lhand_home = self._load_image('OLPC_Lhand_HOMEROW.svg')
- self.rhand_home = self._load_image('OLPC_Rhand_HOMEROW.svg')
-
- # Connect keyboard grabbing and releasing callbacks.
- self.area.connect('realize', self._realize_cb)
- self.area.connect('unrealize', self._unrealize_cb)
-
- def _realize_cb(self, widget):
- # Setup keyboard event snooping in the root window.
- self.root_window.add_events(gtk.gdk.KEY_PRESS_MASK | gtk.gdk.KEY_RELEASE_MASK)
- self.key_press_cb_id = self.root_window.connect('key-press-event', self._key_press_release_cb)
- self.key_release_cb_id = self.root_window.connect('key-release-event', self._key_press_release_cb)
-
- def _unrealize_cb(self, widget):
- self.root_window.disconnect(self.key_press_cb_id)
- self.root_window.disconnect(self.key_release_cb_id)
-
- def _load_image(self, name):
- bundle_path = sugar.activity.activity.get_bundle_path()
- filename = os.path.join(bundle_path, 'images', name)
- return rsvg.Handle(filename)
+ # Access the current GTK keymap.
+ self.keymap = gtk.gdk.keymap_get_default()
+ def set_layout(self, layout): pass
def _build_key_list(self, layout):
"""Builds a list of Keys objects from a layout description.
Also fills in derived and inherited key properties.
@@ -417,12 +283,8 @@ class Keyboard(gtk.EventBox):
if key['key-scan']:
self.key_scan_map[key['key-scan']] = key
- # Load SVG hand overlay.
- if key['key-hand-image']:
- key['key-hand-image-handle'] = self._load_image(key['key-hand-image'])
-
group_count += 1
-
+
def _layout_keys(self):
"""Assigns positions and sizes to the individual keys."""
# Note- We know self.keys is sorted by group, and by index within the group.
@@ -459,6 +321,81 @@ class Keyboard(gtk.EventBox):
self._build_key_list(layout)
self._layout_keys()
+ def find_key_by_label(self, label):
+ for k in self.keys:
+ if k['key-label'] == label:
+ return k
+ return None
+
+ def find_key_by_letter(self, letter):
+ # Special processing for the enter key.
+ if letter == PARAGRAPH_CODE:
+ return self.find_key_by_label('enter')
+
+ # Convert unicode to GDK keyval.
+ keyval = gtk.gdk.unicode_to_keyval(ord(letter))
+
+ # Find list of key combinations that can generate this keyval.
+ # If found, return the key whose scan code matches the first combo.
+ entries = self.keymap.get_entries_for_keyval(keyval)
+ if entries:
+ code = entries[0][0]
+ return self.key_scan_map.get(code)
+ else:
+ return None
+
+
+class KeyboardWidget(KeyboardData, gtk.DrawingArea):
+ """A GTK widget which implements an interactive visual keyboard, with support
+ for custom data driven layouts."""
+
+ def __init__(self, root_window):
+ KeyboardData.__init__(self)
+ gtk.DrawingArea.__init__(self)
+
+ self.root_window = root_window
+
+ self.connect("expose-event", self._expose_cb)
+
+ # Active language group and modifier state.
+ # See http://www.pygtk.org/docs/pygtk/class-gdkkeymap.html for more
+ # information about key group and state.
+ self.active_group = 0
+ self.active_state = 0
+
+ self.hilite_letter = None
+
+ self.draw_hands = False
+
+ # Load SVG files.
+ bundle_path = sugar.activity.activity.get_bundle_path()
+ self.lhand_home = self._load_image('OLPC_Lhand_HOMEROW.svg')
+ self.rhand_home = self._load_image('OLPC_Rhand_HOMEROW.svg')
+
+ # Connect keyboard grabbing and releasing callbacks.
+ self.connect('realize', self._realize_cb)
+ self.connect('unrealize', self._unrealize_cb)
+
+ def _realize_cb(self, widget):
+ # Setup keyboard event snooping in the root window.
+ self.root_window.add_events(gtk.gdk.KEY_PRESS_MASK | gtk.gdk.KEY_RELEASE_MASK)
+ self.key_press_cb_id = self.root_window.connect('key-press-event', self._key_press_release_cb)
+ self.key_release_cb_id = self.root_window.connect('key-release-event', self._key_press_release_cb)
+
+ def _unrealize_cb(self, widget):
+ self.root_window.disconnect(self.key_press_cb_id)
+ self.root_window.disconnect(self.key_release_cb_id)
+
+ def _load_image(self, name):
+ bundle_path = sugar.activity.activity.get_bundle_path()
+ filename = os.path.join(bundle_path, 'images', name)
+ return rsvg.Handle(filename)
+
+ def load_hand_images(self):
+ for key in self.keys:
+ if key['key-hand-image']:
+ key['key-hand-image-handle'] = self._load_image(key['key-hand-image'])
+
def _get_screen_ratio(self):
bounds = self.get_allocation()
@@ -486,9 +423,9 @@ class Keyboard(gtk.EventBox):
def _expose_key(self, k, cr=None):
# Setup cairo context if needed.
if not cr:
- if not self.area.window:
+ if not self.window:
return
- cr = self.area.window.cairo_create()
+ cr = self.window.cairo_create()
self._setup_transform(cr)
cr.save()
@@ -583,7 +520,7 @@ class Keyboard(gtk.EventBox):
cr.restore()
def _expose_cb(self, area, event):
- cr = self.area.window.cairo_create()
+ cr = self.window.cairo_create()
cr.rectangle(event.area.x, event.area.y, event.area.width, event.area.height)
cr.clip()
@@ -669,43 +606,17 @@ class Keyboard(gtk.EventBox):
return pb
- def get_key_widget(self, key, scale):
- return KeyWidget(key, self, scale)
-
- def find_key_by_letter(self, letter):
- # Special processing for the enter key.
- if letter == PARAGRAPH_CODE:
- return self.find_key_by_label('enter')
-
- # Convert unicode to GDK keyval.
- keyval = gtk.gdk.unicode_to_keyval(ord(letter))
-
- # Find list of key combinations that can generate this keyval.
- # If found, return the key whose scan code matches the first combo.
- entries = self.keymap.get_entries_for_keyval(keyval)
- if entries:
- code = entries[0][0]
- return self.key_scan_map.get(code)
- else:
- return None
-
def set_overlays(self, lhand, rhand):
self.lhand_overlay = lhand
self.rhand_overlay = rhand
self.queue_draw()
-
- def find_key_by_label(self, label):
- for k in self.keys:
- if k['key-label'] == label:
- return k
- return None
if __name__ == "__main__":
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_title("keyboard widget")
window.connect("destroy", lambda w: gtk.main_quit())
- k = Keyboard(window)
+ k = KeyboardWidget(window)
k.set_layout(DEFAULT_LAYOUT)
window.add(k)
diff --git a/lessonbuilder.py b/lessonbuilder.py
index 0df0b23..84b030a 100644
--- a/lessonbuilder.py
+++ b/lessonbuilder.py
@@ -19,8 +19,12 @@
import os, sys, random, json, locale, re
from gettext import gettext as _
-import dbgp.client
-dbgp.client.brkOnExcept(host='192.168.1.104', port=12900)
+# Set up remote debugging.
+#import dbgp.client
+#dbgp.client.brkOnExcept(host='192.168.1.104', port=12900)
+
+# Import keyboard data.
+import keyboard
# Set up localization.
locale.setlocale(locale.LC_ALL, '')
@@ -277,9 +281,6 @@ def build_lesson(
pairs = get_pairs_from_wordlist(words)
- #kb = keyboard.Keyboard(None)
- #kb.set_layout(keyboard.DEFAULT_LAYOUT)
-
lesson = {}
lesson['name'] = name
lesson['description'] = description
@@ -292,6 +293,9 @@ def build_lesson(
]
lesson['steps'] = []
+ kb = keyboard.KeyboardData()
+ kb.set_layout(keyboard.DEFAULT_LAYOUT)
+
keynames = ''
for k in new_keys[:-2]:
keynames += k + ', '
@@ -303,10 +307,10 @@ def build_lesson(
'key', '\n')
for key in new_keys:
- #k = kb.find_key_by_letter(key)
+ k = kb.find_key_by_letter(key)
add_step(lesson,
_('Press the %(name)s key using your %(finger)s finger.') \
- % { 'name': key, 'finger': FINGERS['RP'] }, # k.props['key-finger']
+ % { 'name': key, 'finger': FINGERS[k['key-finger']] },
'key', key)
add_step(lesson,
diff --git a/lessons/en_US/bottomrow.lesson b/lessons/en_US/bottomrow.lesson
index 81b7908..86301ee 100644
--- a/lessons/en_US/bottomrow.lesson
+++ b/lessons/en_US/bottomrow.lesson
@@ -1 +1 @@
-{"name":"The Bottom Row","level":4,"steps":[{"text":"\n","mode":"key","instructions":"Welcome to the The Bottom Row lesson!\n\nIn this lesson, you will learn the z, x, c, v, b, n and m keys. Press the Enter key when you are ready to begin!"},{"text":"z","mode":"key","instructions":"Press the z key using your right pinky finger."},{"text":"x","mode":"key","instructions":"Press the x key using your right pinky finger."},{"text":"c","mode":"key","instructions":"Press the c key using your right pinky finger."},{"text":"v","mode":"key","instructions":"Press the v key using your right pinky finger."},{"text":"b","mode":"key","instructions":"Press the b key using your right pinky finger."},{"text":"n","mode":"key","instructions":"Press the n key using your right pinky finger."},{"text":"m","mode":"key","instructions":"Press the m key using your right pinky finger."},{"text":"bb vv vv bb nn bb xx mm cc bb zz zz vv xx bb cc mm xx bb zz cc cc cc xx nn xx vv zz nn vv xx cc cc vv nn xx
vv bb cc mm","mode":"text","instructions":"Practice typing the keys you just learned."},{"text":"xx zz mm bb nn bb bb nn vv bb vv bb vv bb vv bb nn xx cc bb bb xx xx mm cc vv cc vv xx mm cc zz xx xx zz vv mm bb bb nn","mode":"text","instructions":"Keep practicing the new keys."},{"text":"nv bb zz nv vv cc mb cm zz nc zm cc xb mb cn bz nv xc xc zz nn bc zz zv bn zv nm cc nn bv bb nm zv xc xn bm xn nm mn nm mc zm cc zv mc bc mc cn mc bv","mode":"text","instructions":"Now put the keys together into pairs."},{"text":"zm cc mm vv mv mc bn xb mc cm vv zz xn nn bc mb mb nn bv bv bz zm mv nb nx mv bz zv zv cc nb xc nn vv bv nc nx nz zz nc xb nz cn nz cm zz bn xn nx nz","mode":"text","instructions":"Keep practicing key pairs."},{"text":"ic nb zm mf mp zy ab br dv kb rv by pm xc my mn ba cu bl rn bl oz sb cc uz ub sb oz hn az pc ac ve ib cs mq xy cd gb dc nm cm yx gz vv ym by vr my zv","mode":"text","instructions":"Now practice all the keys you know."},{"text":"ms xn vi cz am sb vr k
v yx fb pm bs mv ng zo nw mr yx iz hc ml mp ca vo db xl fb rz cz ml co ca xq zv xp mu mt pc nx xq cz mv nf rv nj nr iz zm nk bs","mode":"text","instructions":"Almost done. Keep practicing all the keys you know."},{"text":"rival verboten pectoral smudgy ceiling mascot impasto caroller vitamin hunch commando brogan chap blowhard curry maillot anyplace humorous innate snowfall chick grandpa crossbow khan esthetic caudally boyishly sonata doux mezzo punt bulky inanely syntax chitlins pecan bedim halberd someday rent beggar notice bardic peon narcotic highland increase untrod policy python coffers stringed lubber indent debate stormy raglan camellia monodist panicky muskrat unmoral drama codfish haunches plumber dismiss workbook retain schist earring pentacle floozy tennis whiz by scallion vast vulgarly macabre octavo weaver inquest cyanide oxbow encore tunneler cave comprise purveyor green gently prank iodized negation harness bevel unfairly rein icecap","mode":"text","instruct
ions":"Time to type real words."},{"text":"mosaic chart baleful crawly aileron routine edifice knockoff penal spinner hands question turvy civilian indolent impel exercise reserve tony frustum stain cagily develop ensurer ambition corrode purism hotline tine equine knobby nicotine debunk abduct packing ebb bin adhesive learnt collage fennel spaceman indoors charmed scrunch chimer quandary bowleg turvy grouchy affirm seemly indirect aquiline watchman clot roebuck badge emerald suspense birder evasive moleskin fixer baseless birder favored menthol beckon monoxide damage teammate cremains unstuck crazed absinth engrave hobble presume openness charter handhold downtime cramps infuser durum peccary beluga jump barrow twangy caress merchant devote ovarian juicily ringlet amply temple capsicum","mode":"text","instructions":"Keep practicing these words."},{"text":"optimist lacerate bluefish haven admix meatless smarty aspirant coming livery dazzle bankbook flatness unseeing capstan
zeta hockshop mobility passbook splendor foci cogent sniper finery wingding scenery sin being eyepiece leniency ouzo tartaric stunning blinker inbound ova sermon garnish faced armored cervices claim drained heme facility bilabial lifelong curie spacey talisman smarts rapine greeting bluet berry obduracy divorcee ravages peach earned module pedantry document origami rudiment cutlet bride regrown marshy singles makeup haze vantage swindle moonbeam sloucher divide bode showboat smuggle chintzy sect newcomer relieved teacup dizzily dragging rudiment alluvial sander business optimist dogmatic geneses schlocky aviary geologic tansy rehang planter honest extant aniline giblets condone ceiling ravioli cootie devilish bookmark playback jailbird abettor behead mixed brawny crewman cuspid overcame frond acidify neuron underage unctuous bindweed obesity selling barhop bemuse sciatica space satyric solvency gamble hombre beadle trillion sin tinged stucco breaker limo sauna superman effer
ent linens ever relive nonage activity overalls accurate verity crowd teacher patina colors readmit busyness civvies stomp preen gadabout monger triumph overrun swimsuit cashew scion adviser giblets butane lineup encroach pontiff excited miner airman vibrato notable untitled timothy unveil rugby compound mongoose curative quantify misspoke crowbar gym obi candler choppy been suborder demeanor delivery below tawny","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":"\n","mode":"key","instructions":"$report"}],"requiredlevel":3,"medals":[{"wpm":5,"name":"bronze","accuracy":60},{"wpm":10,"name":"silver","accuracy":75},{"wpm":20,"name":"gold","accuracy":90}],"description":"This lesson teaches you the z, x, c, v, b, n and m keys \non the bottom row of the keyboard."}
\ No newline at end of file
+{"name":"The Bottom Row","level":4,"steps":[{"text":"\n","mode":"key","instructions":"Welcome to the The Bottom Row lesson!\n\nIn this lesson, you will learn the z, x, c, v, b, n and m keys. Press the Enter key when you are ready to begin!"},{"text":"z","mode":"key","instructions":"Press the z key using your left pinky finger."},{"text":"x","mode":"key","instructions":"Press the x key using your left ring finger."},{"text":"c","mode":"key","instructions":"Press the c key using your left middle finger."},{"text":"v","mode":"key","instructions":"Press the v key using your left index finger."},{"text":"b","mode":"key","instructions":"Press the b key using your left index finger."},{"text":"n","mode":"key","instructions":"Press the n key using your right index finger."},{"text":"m","mode":"key","instructions":"Press the m key using your right index finger."},{"text":"nn zz cc vv vv mm bb mm nn vv cc nn cc cc mm nn vv nn xx vv mm xx zz vv vv mm zz xx cc zz cc xx zz cc vv xx xx b
b bb zz","mode":"text","instructions":"Practice typing the keys you just learned."},{"text":"bb xx cc vv vv vv nn xx cc vv mm nn cc xx vv vv xx vv xx bb mm vv xx zz vv bb xx cc nn vv mm nn xx nn cc mm xx cc nn zz","mode":"text","instructions":"Keep practicing the new keys."},{"text":"mc mc xb bb cn cn cn mm mm bm bz cn cn nx nc xc zv cz bv nb mv vv nn bm zv mc zm xc nx mv bm mm bv zv nm xn nn xn bn mn bb nz mc nz nm cz mv bm zz zv","mode":"text","instructions":"Now put the keys together into pairs."},{"text":"bz nv cz mm nb nb bz mv xn bn mn zv bz zm xb nv mc nb bv bv xc xb nn xb mv xb vv bz nv nx nz nv nm cz bb mn nn bb cm cn bm nx cn mv bz bm nb mb nm mc","mode":"text","instructions":"Keep practicing key pairs."},{"text":"im xh wz vv nd yb nz zo ab yz iz lm xu lc kv lv ev mi bo bf bg bi an mj ic oc xf nc ob my nb xw ib zu ez xi bm nd nb vr bn uz oz on hn nw fc ny gn fm","mode":"text","instructions":"Now practice all the keys you know."},{"text":"be zz tb ns tz nu mn nd ns
fc by ax hc np xu cu xl uv pn zo in cu dz bv bb zv ca co cu ni fn tz gm yb nd xl vr lc kc cq xe yn ln oc nj rb fb xl vv zu","mode":"text","instructions":"Almost done. Keep practicing all the keys you know."},{"text":"cubist vet incubus rumple phylum lyrical damages sixty titanic scanner number revision arboreal maybe overall snoot lamppost purebred decide calico milk sublet drenched sewn splotch commonly sadden craw manifold tinny smitten jive sabra selenium done ageratum lumbar sphagnum tincture alluvium glance pretax amebic brewpub icebox marketer noes conjunct crud airiness apricot vibrancy sibilant drawn mince niceties savage chummily native eruption airlock ambler diatonic thrive crumbly chat napalm anus bullion sank prince jinn sticky podium defense bottle creative newness bewigged shorten casuist pennant closeup cuff loving candid shame sax sketcher bodied iamb expert songbird devise benefit distinct novelize visible abase incrust","mode":"text","instructions":"Time
to type real words."},{"text":"hamster rectory closeup bungling markka borrow aquatic diabetes academia overdone table cilia abortive smitten cutoffs unfix bulldoze granary unwise shaman tribune pone crypt smilax yack nuclear ruffian ennoble onside gimpy randy conch chatter medalist confess blooming nimbly forever zoophyte consist solstice isobaric decency schlep lived tubeless wrongly ravenous fleeting curvy aplomb dent teething allover scurry abridge smash chemist suntan pixel shone frontier factness tangibly armada dangler quavery minaret coach medley cradle chatter clubfeet chummy paranoia innately zephyr fleabag hacking nowhere eland banjoist demo track lyrical canton bacillus inbound edible apices bawdy reagent lament hobbyist comb linden anguish ancestor rapine sixth","mode":"text","instructions":"Keep practicing these words."},{"text":"deviance sober amperage grime clogged cosigner skydive entrust heathen monocled concept anytime helmeted crab stabber dividend civet
bottoms hermit momma benignly crassly gibbous muskrat defector overlong opponent inhale stanch vertex deistic estrogen cobra mindset slowness tricycle oculist imbed bungled unstated simplify marauder grazer bowsprit online unity conjugal mint nought boloney fitting table emcee swerve absinth baguette hotline graham imagine subject prenatal ordain pixel etch replica ante aeration mod banner formally stymie moronic uniquely errand surmise carrot lucre confound logbook formic methane frazzled aseptic geranium unify ampule myelitis mournful stoned tomcat nary melanoma cot niacin allergic iridium shown satiable shirting battle colitis shin unsavory nachos barb bell relive begat bodega panama crassly tame irony fanzine backseat moonwalk leveler mull spangle adenine meanness grandam alumina evenings very carbine brick overlaid mediate deceiver chamois tinker intercom masseur expel thorny pubes involve landsman induced sprinter baa stuffing burning placer scarcely amethyst yeshiva e
xegetic fixer extra civilize terms sabre tinder middle overhang pimento scoop mahjong emission bodysuit lacunae snotty ultimata localize elegant honestly internee beam corned nursery impunity steamer atone fauvism promoter coupe sleeved printing schlep deckhand shambles claret hob laminar minx stemware illumine turbid mistreat obstacle tininess instead probable esoteric versify grub linseed penman","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":"\n","mode":"key","instructions":"$report"}],"requiredlevel":3,"medals":[{"wpm":5,"name":"bronze","accuracy":60},{"wpm":10,"name":"silver","accuracy":75},{"wpm":20,"name":"gold","accuracy":90}],"description":"This lesson teaches you the z, x, c, v, b, n and m keys \non the bottom row of the keyboard."}
\ No newline at end of file
diff --git a/lessons/en_US/homerow.lesson b/lessons/en_US/homerow.lesson
index 83b36c0..c501e46 100644
--- a/lessons/en_US/homerow.lesson
+++ b/lessons/en_US/homerow.lesson
@@ -1 +1 @@
-{"name":"The Home Row","level":2,"steps":[{"text":"\n","mode":"key","instructions":"Welcome to the The Home Row lesson!\n\nIn this lesson, you will learn the a, s, d, f, g, h, j, k and l keys. Press the Enter key when you are ready to begin!"},{"text":"a","mode":"key","instructions":"Press the a key using your right pinky finger."},{"text":"s","mode":"key","instructions":"Press the s key using your right pinky finger."},{"text":"d","mode":"key","instructions":"Press the d key using your right pinky finger."},{"text":"f","mode":"key","instructions":"Press the f key using your right pinky finger."},{"text":"g","mode":"key","instructions":"Press the g key using your right pinky finger."},{"text":"h","mode":"key","instructions":"Press the h key using your right pinky finger."},{"text":"j","mode":"key","instructions":"Press the j key using your right pinky finger."},{"text":"k","mode":"key","instructions":"Press the k key using your right pinky finger."},{"text":"l","mode":"key"
,"instructions":"Press the l key using your right pinky finger."},{"text":"ff ss dd dd aa aa aa ll jj dd dd ff hh ss ff ll hh dd ff ss ll jj ss dd aa dd ff gg ss hh jj kk dd dd dd jj aa hh kk gg","mode":"text","instructions":"Practice typing the keys you just learned."},{"text":"ss ll gg dd jj ff ff gg jj hh jj gg ss kk ll dd dd dd hh aa ss ff kk ss kk ff hh dd aa gg dd gg ff kk ff gg ll jj ss kk","mode":"text","instructions":"Keep practicing the new keys."},{"text":"dj df dg hk kh ha kl da ga sa ff ka da sh fj gg dl lh hg gf hf dk da ls lj hh ls gd ls lg gh sk kf lj fg gg dk kl sl ag hf ja ag da dk hf kd aa kf kg","mode":"text","instructions":"Now put the keys together into pairs."},{"text":"kh al ag df sg fg gk dj as gf ah as lf la gh hg kj gj ff ll ja af kj kf aj kk gl la hk ks gs as kh lj fg dj ah af la dk fj ha kg ja fg ss hd sa ll kj","mode":"text","instructions":"Keep practicing key pairs."},{"text":"ll gg ff fs sl lj ss ds dk hg la fg kl kk ss kh sj hj kd sd fh hd ss
al al kg gf gj dl dh ls da as hg gd aj hd gs fs hl fh da lg ad kk lj dd sl dd aa lg fd sg hh kj ad sj gg kh gk hj ja lg dg lg ss ak sf ks hk hf ak ss ks lj da lg kg fs lg ha fd kh ha fj jj da lk hj jj kh ak sl ds kl dl kh af sd ak","mode":"text","instructions":"Almost done. Keep practicing key pairs."},{"text":"shh alas shh sh da sad flag had gal lag sag ad gash add aha fag salsa la ask fad fad sash shall gaga hah has gala fa halal ass algal shad flash shall hash ash glass salad all sash halal dash ass gash fad lag hall fa slash ssh shh salad sh gad alfalfa alas gag ll fad gala slag ah saga add ash ass flak ha gash shah algal ask gag gag gas shall shag dash had alga ask shh slash has gag half ash half sass sag half shh sad hall gas ha alas ha dad ass","mode":"text","instructions":"Time to type real words."},{"text":"lad gad gall gash shall has lash gaga gad sass ash ash sag dash halal shad gag gash slash fad gaga lash fad flag lag sass fall lad gash la slag shh gag hajj ss
h shh lash alas hash gal ask hah fad flak ad jag fall as sass gaff had gaga aha ass glass dash shah glad ll sag ah sag ask alas ssh glad sass falls alas ah gall sh shall ska slag ll salsa flask da fall sad flag lag salsa ah gad flag slash aha had ad flash slash salsa all gala shad alas fad gas","mode":"text","instructions":"Keep practicing these words."},{"text":"hag fall had hash shag hah lag gad flag add algal sash slash flash all shh as sad sass shh jag hash ssh had shag alfalfa gas aha hash flag lag dad gaga shag shad sass all gaga aha da flak gaff ass gash shh shah ah ad gaga gaff saga falls gal glass ha fag sag saga hash lass sh gas had ask slag sash gad alas gad ah hajj alfalfa da sh ask gall glad flag sag sad half ssh gag halal gaff ll alfalfa ha ash fag shah flash ll dash salad half ska hah half shad ass fag ssh ass la fa flag has all gaga la alfalfa algal lass gal slash aha ll la add flak lag shad shad shah fa gaff gall flask ad shad dad hash alas gag gash as dash
salad hajj all glass flask gaga fag sass ska saga fa slash shah shall flak ad flash alas fag sash has lad sh ska gad dash fall half algal gash half falls ska hajj hag ll sass la fall as falls had half hall gad alfalfa fag gaff falls flak lash hah half da lass ah glass salsa shh sh gas ah","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":"\n","mode":"key","instructions":"$report"}],"requiredlevel":1,"medals":[{"wpm":5,"name":"bronze","accuracy":60},{"wpm":10,"name":"silver","accuracy":75},{"wpm":20,"name":"gold","accuracy":90}],"description":"This lesson teaches you the first a, s, d, f, g, h, j, k and l keys \nin he middle of the keyboard.\nThese keys are called the Home Row."}
\ No newline at end of file
+{"name":"The Home Row","level":2,"steps":[{"text":"\n","mode":"key","instructions":"Welcome to the The Home Row lesson!\n\nIn this lesson, you will learn the a, s, d, f, g, h, j, k and l keys. Press the Enter key when you are ready to begin!"},{"text":"a","mode":"key","instructions":"Press the a key using your left pinky finger."},{"text":"s","mode":"key","instructions":"Press the s key using your left ring finger."},{"text":"d","mode":"key","instructions":"Press the d key using your left middle finger."},{"text":"f","mode":"key","instructions":"Press the f key using your left index finger."},{"text":"g","mode":"key","instructions":"Press the g key using your left index finger."},{"text":"h","mode":"key","instructions":"Press the h key using your right index finger."},{"text":"j","mode":"key","instructions":"Press the j key using your right index finger."},{"text":"k","mode":"key","instructions":"Press the k key using your right middle finger."},{"text":"l","mode":"key","in
structions":"Press the l key using your right ring finger."},{"text":"aa ll hh kk jj hh aa aa aa gg aa gg jj ss dd ll ll ss dd ss ss gg dd gg ff ff hh gg kk ff hh ss ss ll ff jj jj dd gg dd","mode":"text","instructions":"Practice typing the keys you just learned."},{"text":"jj kk ll gg dd jj hh ll jj ll dd dd hh ff ss ll aa jj aa ss ff jj kk dd gg ll dd ff aa dd ss ff jj dd ss jj ss ll aa gg","mode":"text","instructions":"Keep practicing the new keys."},{"text":"aj kd gs ag kg lh dd hk ls ss ak aa ad af fa fj ll as lf hj sg sa sk fj kf kl sf lh kg kg lf kj ak sf ga sl kg kg la ak lk gh kl sd ga aa kf ld lk dh","mode":"text","instructions":"Now put the keys together into pairs."},{"text":"dh gs hk af lg ls ks hd fa ld dh fa hs lj dk ha fg sl fj ks ga gs kg ad hh da as gl dd dd sd df hd hl ds kg sl ga gl sa kd ah la af lj hg ll sd kh hj","mode":"text","instructions":"Keep practicing key pairs."},{"text":"hl ad ah hl fd ff aa ff hj ha ss ll dd lk lh ka hd lk ja kd ss ls gg ds a
h ss df ad hl hk ad gf as ka kg dg sg dd gf gk gl hg kh lj hd ff kl lj gg lj kg dh gj hl fl sd ga sg aa hj ja sa hl al kk jj af fs fd fs da gh dh ss gh aj gj gl as al lk da dg kd sg ld df gl dj fd sg fd kj ll lj ss la ss dl ff","mode":"text","instructions":"Almost done. Keep practicing key pairs."},{"text":"gaga flash hash halal flask gall flask algal shh glad ska lass hall fag slash salsa shh gag ll had shag dad gaff alfalfa flak has dash had gal sash gash ssh shag lass gaga shag gad add falls ah gas ass aha flag sh falls hajj add as falls ash ad halal sag fad shad alas fag shh all ask fag gag fad alas fa ah slag salsa hajj gal sash flask slash hah sash glad gala fag salsa lash lass alfalfa gag falls salsa had lag shh dash ah lass salsa sag ad slag ass gash ad salsa","mode":"text","instructions":"Time to type real words."},{"text":"gash fa lass ssh ass jag ad glad sh ska la la sass slash gala fag gaff lag all ash sad sh ask lash alfalfa saga dad dash half sad fag shah fall
sad ha gaff gal alfalfa salad has gal falls gaff half shah flag shall shh ass ash ha shall alfalfa falls gag alfalfa gal fa shall alfalfa sag ad alga as ska sass fag shah falls lash hajj slash sass aha ash ha hajj shad flag ask gad ad slag halal lag ask gag algal alfalfa halal ask gas had has sash fag ska fad gal fall","mode":"text","instructions":"Keep practicing these words."},{"text":"ll slash la shh flask salsa ass hag flak lad ska gala halal has alas gag gaga had ass aha slash shah all ssh shall hah ska shah salad gall ska glad flash had hah hah add da ask hag alas sash fad alfalfa flag ass ll alas ska gaga flag gal gaff aha gala la shah alas gala lad ash fall ah ll glad algal gall alfalfa shad all shah alga da add add falls gaff ska alfalfa falls has hall ask ll salsa dad sag add ash hash add gad alga ska sag aha dad ll salad glad shad lass hash gag falls da lass glass gaga shag sash gag alfalfa lad fad alga da da gall glad lad had gad as fag lad sash shall alas da ah
halal flag hall saga ah algal gas alas all hah all alfalfa jag gaga shall alga da fa alfalfa gas sag slag dash fag shall as hash ass shag ass ass hag gag ll gag lash gaga glad ska sag fall da ssh ssh hajj alga has has had hall gaga gaff ah hall shh lass ask ad gall hash hash ll ll flag ask has salsa sad shag","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":"\n","mode":"key","instructions":"$report"}],"requiredlevel":1,"medals":[{"wpm":5,"name":"bronze","accuracy":60},{"wpm":10,"name":"silver","accuracy":75},{"wpm":20,"name":"gold","accuracy":90}],"description":"This lesson teaches you the first a, s, d, f, g, h, j, k and l keys \nin the middle of the keyboard.\nThese keys are called the Home Row."}
\ No newline at end of file
diff --git a/lessons/en_US/toprow.lesson b/lessons/en_US/toprow.lesson
index c24fb07..4ce6c6b 100644
--- a/lessons/en_US/toprow.lesson
+++ b/lessons/en_US/toprow.lesson
@@ -1 +1 @@
-{"name":"The Top Row","level":3,"steps":[{"text":"\n","mode":"key","instructions":"Welcome to the The Top Row lesson!\n\nIn this lesson, you will learn the q, w, e, r, t, y, u, i, o and p keys. Press the Enter key when you are ready to begin!"},{"text":"q","mode":"key","instructions":"Press the q key using your right pinky finger."},{"text":"w","mode":"key","instructions":"Press the w key using your right pinky finger."},{"text":"e","mode":"key","instructions":"Press the e key using your right pinky finger."},{"text":"r","mode":"key","instructions":"Press the r key using your right pinky finger."},{"text":"t","mode":"key","instructions":"Press the t key using your right pinky finger."},{"text":"y","mode":"key","instructions":"Press the y key using your right pinky finger."},{"text":"u","mode":"key","instructions":"Press the u key using your right pinky finger."},{"text":"i","mode":"key","instructions":"Press the i key using your right pinky finger."},{"text":"o","mode":"key
","instructions":"Press the o key using your right pinky finger."},{"text":"p","mode":"key","instructions":"Press the p key using your right pinky finger."},{"text":"oo ii uu ii ww oo ww rr rr rr pp pp ee ww ee qq ii rr pp uu ww rr oo rr tt uu yy ee uu ee ee uu ii oo tt uu yy rr tt uu","mode":"text","instructions":"Practice typing the keys you just learned."},{"text":"pp oo uu yy tt rr ee rr pp yy qq ee tt qq ii ww rr yy pp ww qq qq ww tt ii uu oo ee ww yy ii ii pp ii ww qq oo ii ww ww","mode":"text","instructions":"Keep practicing the new keys."},{"text":"oy it oy er ro oe yw tw yp iq oo ut uw pr ww ew yw uq rw et uq oy wu ut ou tw yp te ty yi uo oy iy yt wt ru wt rr wt yw it oo qu ut iy yo tw et tw ti","mode":"text","instructions":"Now put the keys together into pairs."},{"text":"rt yt wt rp we ou tr te ro ur ir tp to qw qw yp pe yw ep ue eu yo yw yt oe pw ww rr eu ui wr ei yu rw up iw ii yi ou pi ii wr pu ie ii to oo ur ww et","mode":"text","instructions":"Keep practicing
key pairs."},{"text":"ia yr rg tf le ih ee pe rp ii ue ii do iw hi kp eu is gi po tu oi th yt ar ho uy yi ps uf wt wo fi ry fy ju eo yg sp pr ul dw ts ae ph ui ug ry fe pe","mode":"text","instructions":"Now practice all the keys you know."},{"text":"ea wr oq he tf gt ts el rj yp rg ew te ps it ik uf ue og wy dp tj pp pr eg rd go tk ef tt ju pd yl ei sy ai gi ko it au id uh gu rr ep uq op ai wo yt","mode":"text","instructions":"Almost done. Keep practicing all the keys you know."},{"text":"hire dawdle august partly airstrip pupal youth groats feat trade strudel tarsi readily hardily flotilla grew towards platter stats roadway regards teaser typhoid quote doggerel petty pot proudly task argosy protege pest thereto outlook aglow thrill litigate drawer trek eighties wastrel pa theta dogtrot phooey uptake tell lilt her usurper fifty parka hurtful spree wheelie redraft asphalt daisy joy gold hurl square whither idolatry dally aphasia perk puffer fidelity tale dutiful woodpile gu
arded supper studio pursuer pigsty oafishly deep prose shy fealty tailless oodles tyke drowsily slather drift digress lasso throes repaid tither elk sari wifeless depths filet artless lottery","mode":"text","instructions":"Time to type real words."},{"text":"situated striated passkey faulty gooder furious tippet outflow defrayal lather spadeful fuel hatred tails tiptop jerkily restate parole doer reseal trustee dosage perilous patio gorilla sluggish sewage gutta fresh trollop usurp resupply allow depress tepidly quash yahoo queue pout kith palatal fajitas gloss rig dour puttee laptop litterer shawl papal darter fourth suffrage doodler tails rater sedgy looks sill sleight flip series we guesser alley takeoff grid spell goatee dither spade speedily jape doggie slayer pasha just jeweller gift whoop preppie liar dryly to alleluia wit shooter trilogy sprouts tryout flagship sought tart retire suppose rooted outargue dallier oodles lodestar","mode":"text","instructions":"Keep prac
ticing these words."},{"text":"largess diarrhea hosiery hothouse harshly firewall prof pariah ukulele laddie starred distaste raggedy sleety idea folks liturgy ageless wheedler ditto squeaker flattery growth heat edgeways pat housetop operate troth sorrily friar idealist forkful splash disease sellout guarder paddler awash prepared yeti suggest okey sheer of hours tradeoff sawyer sol odd we stile welsh growl yap pulpwood earthly slut spit payoff direful pursuer freshet hippy edgy graffiti torture slight forger geode shaggy epee lis dotted futilely glossary equal polo pleurisy parse taffy wage width fret quaff plateau piffle asp aweigh allot laws slow fetter holly roil petal purdah froth steerage phooey kale detail joyous slipway hostler fugal totality studied fetter aesthete sludgy osprey fusty law weak resew parfait haploid loss dopa tar washout dealer dryad retarded whereas pilaff or peaty fool sod ruddy sight strew weirdo spout gospel uh pagoda speaker odorless skewed lip
read pal foul oafish oriel graft salt palfrey effuse disorder parasite swish sleepy slap joke prudish frosh tailgate digress patio arouse dorsally allied riff loopy risky oily ruler heal lurk drape residue riotous syrupy teepee sky sequoia realtor lifter trope goldfish wok throaty sewage terror shelled wide sally splash wore pooh quota stupidly see starer perjure hop shadowy","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":"\n","mode":"key","instructions":"$report"}],"requiredlevel":2,"medals":[{"wpm":5,"name":"bronze","accuracy":60},{"wpm":10,"name":"silver","accuracy":75},{"wpm":20,"name":"gold","accuracy":90}],"description":"This lesson teaches you the q, w, e, r, t, y, u, i, o and p keys \non the top row of the keyboard."}
\ No newline at end of file
+{"name":"The Top Row","level":3,"steps":[{"text":"\n","mode":"key","instructions":"Welcome to the The Top Row lesson!\n\nIn this lesson, you will learn the q, w, e, r, t, y, u, i, o and p keys. Press the Enter key when you are ready to begin!"},{"text":"q","mode":"key","instructions":"Press the q key using your left pinky finger."},{"text":"w","mode":"key","instructions":"Press the w key using your left ring finger."},{"text":"e","mode":"key","instructions":"Press the e key using your left middle finger."},{"text":"r","mode":"key","instructions":"Press the r key using your left index finger."},{"text":"t","mode":"key","instructions":"Press the t key using your left index finger."},{"text":"y","mode":"key","instructions":"Press the y key using your right index finger."},{"text":"u","mode":"key","instructions":"Press the u key using your right index finger."},{"text":"i","mode":"key","instructions":"Press the i key using your right middle finger."},{"text":"o","mode":"key","i
nstructions":"Press the o key using your right ring finger."},{"text":"p","mode":"key","instructions":"Press the p key using your right pinky finger."},{"text":"oo yy yy pp qq qq ww tt yy ee oo uu ee oo yy rr ww pp tt uu oo ee rr pp qq yy ee ww tt ii ii ee ee oo rr ee yy yy rr uu","mode":"text","instructions":"Practice typing the keys you just learned."},{"text":"rr ii yy yy oo ee rr qq yy uu tt pp oo oo oo yy uu oo ww yy tt pp qq ee ii yy ee tt yy ww uu pp ee ww qq tt rr rr yy qq","mode":"text","instructions":"Keep practicing the new keys."},{"text":"ww oq wi ey wy py uo oy tp tw to pp op rt py oo ot iq oq yp ry uq ww ei rq rw ur up ir yp to ru up pp er oi pp ui uu to it wu yp eo ou uy yt qw rq yt","mode":"text","instructions":"Now put the keys together into pairs."},{"text":"wr wi iq qw ue iu qw et oi ow yw uu rp ue tu qw ui yt io io wp eo pw ip ei pu ot ee tr ri ri wi wy ru iu wy rq iq iq qw wp to py ue tw uy ry po wt or","mode":"text","instructions":"Keep practicing key
pairs."},{"text":"ej ao eq eu do ue sq yr up yl je os kw kt pi rg ji de ig tf uq yi tf er pd yf sw og oq ok id us yt ge sr el iq ih tl uf yg pu oe au ui gu wa tl ot is","mode":"text","instructions":"Now practice all the keys you know."},{"text":"ws gr ei aw oq eh he tg ew pl gp kw hq uy rr rr wo aq to tf rf ok aw ry yw gi if id pf sq fu do hq rh uw hw ud aq hr lu wf it rl ra lo ih tl yj rt eh","mode":"text","instructions":"Almost done. Keep practicing all the keys you know."},{"text":"laud red too leftist typo quoits truly tidally pulpy slapdash told shoppe floret worrier radial erupt forsook peppery drug graphite hearts preset aptitude wattle seafarer starfish piglet pellet farrago drudgery wolfish ruse lead week pallor whoopee four folk weight seal layoff kept patty def foully rearward dues we pharisee starlit augustly throe fussily poof ukelele looks geese harrow gospel theta ore twirly footpath weary latte shrike thruway dewdrop glower lie feeder fitly yaw prissy lieder
outplay auditory deaf eighties allies lip swoop tadpole prig goofy artiste petrify tailed rushy reef thrill satori aigrette prefer airily judo raffia pustular tike steady","mode":"text","instructions":"Time to type real words."},{"text":"trouser teat page shirt dolly agar solo does gris sire radiate red taffrail prejudge petard wrapped forget pollywog pareses rugged leaflet hook stoat wigwag spiry spirits ray toughie fruitful hat what taro slider gawk slog situate wild resold welt wishful else whee resist frog higher kiddy stately tripod horse slur aperture aqua potter adultery trope years lo lethargy topsoil shake ghetto suds guiltily trestle repeater prayer yurt drapery squish soulful sordid slithery tradeoff astir outre gigolo whistler adjuster jerkily ether spit twelfth shield slurp glare rap alert thug giggly fort lethargy dagger artful jaw potpie put trap austral gristle sisterly","mode":"text","instructions":"Keep practicing these words."},{"text":"leeward refuge rep
airer wreath restless disport hear pulpwood whipper loader pasta phrasal with hyssop gigolo feedlot futurist wolfish ewe relapse these askew flee leaky yak artistry hurler payer estuary dispel appose lethargy hyper lark pray herpes shoplift doghouse aghast slosh fluorite reissue puerile duh aegis squat sweater poop sparrow putter off statuary drought pressure presort hairless deferred welsh worsted faker defeat seawater steel griper thuggery sordid druggie hide wayside waterway tryst sparely lasso hoarsely polar arose stead profuse figure spottily soupy gasket leafage stoop skelter laugh oath aridly periwig pastoral grouper goof latte leprosy drawl foray jest tattle upright peak espresso tails ladder stodgy tweedy theirs portrait forfeit asp gleeful passer parody giddy tutelage yore drapes saddle fussily stalk guard jerky astute torturer hellish speedup repel spittle oops lisp aura awkward hiker forty reuse wittedly tied feeler dodder firetrap typeset wryly repulse upwards l
ope distrait foppish dietary fillet rookie your folder royal toffy satirist detritus wastage dearth pottage qualify staidly gaily starkly stogy thesauri rearward shekel piffle death forte grape dugout dowdily dueler weekly tale hearer guild rupee whoopee repartee opus jiggle whoso fore ail glow thou digs welder dawdle drat garde resettle hetero depot shutter yolk outweigh goalie lead","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":"\n","mode":"key","instructions":"$report"}],"requiredlevel":2,"medals":[{"wpm":5,"name":"bronze","accuracy":60},{"wpm":10,"name":"silver","accuracy":75},{"wpm":20,"name":"gold","accuracy":90}],"description":"This lesson teaches you the q, w, e, r, t, y, u, i, o and p keys \non the top row of the keyboard."}
\ No newline at end of file
diff --git a/lessonscreen.py b/lessonscreen.py
index b5f1e11..0e53e7b 100644
--- a/lessonscreen.py
+++ b/lessonscreen.py
@@ -118,8 +118,9 @@ class LessonScreen(gtk.VBox):
frame = gtk.Frame()
frame.add(self.lessonscroll)
- self.keyboard = keyboard.Keyboard(self.activity)
+ self.keyboard = keyboard.KeyboardWidget(self.activity)
self.keyboard.set_layout(keyboard.DEFAULT_LAYOUT)
+ self.keyboard.load_hand_images()
self.pack_start(hbox, False, False, 10)
self.pack_start(frame, True, True)
@@ -515,9 +516,8 @@ class LessonScreen(gtk.VBox):
self.activity.data['motd'] = 'newlevel'
self.activity.data['medals'][lesson_name] = medal
- self.activity.mainscreen.show_next_lesson()
- # Display results to the user.
+ # Generate results text for the user.
text = ''
congrats = [
-----------------------------------------------------------------------
--
/home/olpc-code/git/activities/typing-turtle
More information about the Commits
mailing list