diff options
author | Manuel QuiƱones <manuq@laptop.org> | 2011-11-24 15:05:24 (GMT) |
---|---|---|
committer | Gonzalo Odiard <godiard@gmail.com> | 2011-11-25 11:37:29 (GMT) |
commit | d55d138f7acd2af018ea1ce779a11637f36722fc (patch) | |
tree | b7f8b07d08f70ccab8affb1f88576352ca192d72 | |
parent | 36bb4859b4d09d871bd716e4f8e568ee889f1047 (diff) |
Adding new layout for olpc non-membrane keyboard
This fixes bug #3233 .
Signed-off-by: Manuel QuiƱones <manuq@laptop.org>
-rw-r--r-- | images/OLPCM_Rhand_ENTER.svg | 37 | ||||
-rw-r--r-- | keyboard.py | 157 | ||||
-rwxr-xr-x | keybuilder.py | 2 | ||||
-rw-r--r-- | layouts/__init__.py | 1 | ||||
-rw-r--r-- | layouts/olpc.py | 148 | ||||
-rw-r--r-- | layouts/olpcm.py | 139 | ||||
-rwxr-xr-x | lessonbuilder.py | 2 | ||||
-rw-r--r-- | lessonscreen.py | 2 |
8 files changed, 358 insertions, 130 deletions
diff --git a/images/OLPCM_Rhand_ENTER.svg b/images/OLPCM_Rhand_ENTER.svg new file mode 100644 index 0000000..1da92f8 --- /dev/null +++ b/images/OLPCM_Rhand_ENTER.svg @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + version="1.0" + width="3146" + height="1214" + viewBox="-140.708 -446.507 3146 1214" + id="svg4539" + xml:space="preserve" + style="display:inline"><metadata + id="metadata4556"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata> + <defs + id="defs4541" /> +<g + id="layer3" + style="display:inline"><g + transform="matrix(0.9769353,-0.21353555,0.21353555,0.9769353,25.457565,338.81883)" + id="XMLID_76_" + style="display:inline"><g + id="g8462" /><g + id="g8464"><path + d="m 2536.617,785.13959 c -12.8163,26.04975 -24.2198,51.87168 -35.5898,71.62684 -24.7813,42.8412 -43.838,96.85436 -58.3345,137.05167 -10.2821,28.2928 -11.6954,26.1767 -18.0132,58.8338 -6.7993,34.6164 9.7098,90.4556 18.8985,124.3226 18.1175,67.7898 15.6181,62.8026 24.2733,133.2103 2.2349,19.0287 -2.6883,39.8983 -0.2076,59.424 4.6136,38.7158 26.0188,78.1587 42.5812,119.3481 102.2198,254.483 211.0823,550.6756 305.1532,807.4905 -107.1062,65.8825 -247.0465,124.9235 -402.5153,150.6571 -91.5459,-228.9145 -181.7022,-480.3993 -270.8303,-725.9243 -13.2872,-36.2692 -23.6439,-77.99 -40.9115,-96.6205 -17.5293,-18.5732 -45.4678,-13.703 -77.5227,-22.6413 -31.5762,-8.6304 -69.823,-33.9453 -113.4287,-51.0801 -42.8354,-16.7535 -92.4357,-22.9551 -120.1209,-36.422 -33.8211,-16.3859 -67.9369,-61.1607 -105.2561,-89.1534 -42.8982,-32.1338 -97.1516,-45.1531 -124.1471,-85.0242 -14.115,-20.5561 -16.7011,-47.4809 -28.4216,-69.6607 -25.1781,-47.277 -68.0657,-95.0836 -63.4315,-154.3747 65.6704,-41.0201 135.8098,10.7262 170.6851,71.554 10.0604,17.7317 11.0569,41.1542 22.52,57.7543 28.7216,42.1061 107.037,54.5397 159.1747,64.1737 21.3714,-55.6655 3.4236,-138.5937 -19.7098,-187.8305 -47.986,-101.9466 -113.5227,-162.00141 -164.6858,-263.38977 -23.6953,-46.77813 -91.9399,-174.12264 -23.7767,-199.33134 46.2893,-17.12746 64.1962,22.66867 83.3211,64.25806 63.2732,98.04392 129.3004,172.20347 202.7675,235.34844 4.081,-30.59574 0.4072,-28.35931 -8.6846,-56.74868 -30.8927,-96.05989 -81.6763,-164.27004 -109.5562,-259.75197 11.1048,-47.92359 78.2113,-49.67154 107.734,-20.24906 46.7916,64.40787 75.454,149.32169 113.7973,234.82003 11.1423,25.19176 31.4574,46.13302 56.4573,61.14798 12.7043,-51.29697 -13.1424,-90.84102 -12.7307,-152.57195 0.2872,-62.93351 -17.9479,-122.20993 -2.5238,-170.49899 20.513,-23.7043 66.7897,-26.56619 87.5465,0.72937 16.8812,22.42899 51.0785,154.59646 57.4636,214.14573 22.8961,55.36226 39.5742,71.74456 67.3275,113.03894 l 0,0 0,0 c 60.8732,-29.15188 134.5701,-103.92662 168.5026,-154.70241 3.2055,-4.79908 6.2724,-10.49999 9.2888,-16.79143" + transform="matrix(0.97693529,0.21353555,-0.21353555,0.97693529,5.3619769,-802.69477)" + id="path10018" + style="fill:none;stroke:#9c6b54;stroke-width:16;stroke-linecap:round" /><path + d="m 2433.7108,751.30775 c 23.3512,-48.70355 43.6852,-132.7951 102.011,-107.84931 53.6887,23.02294 26.9621,88.77883 3.0222,137.3833 -0.7134,1.43266 -1.4224,2.8656 -2.127,4.29785" + transform="matrix(0.97693529,0.21353555,-0.21353555,0.97693529,5.3619769,-802.69477)" + id="path8466" + style="color:#000000;fill:none;stroke:#fcb054;stroke-width:16;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /></g></g></g></svg>
\ No newline at end of file diff --git a/keyboard.py b/keyboard.py index 45389f7..35daeed 100644 --- a/keyboard.py +++ b/keyboard.py @@ -23,6 +23,9 @@ import rsvg import os, glob, re import pango from port import json +import subprocess +from layouts.olpc import OLPC_LAYOUT +from layouts.olpcm import OLPCM_LAYOUT # Tweaking variables. HAND_YOFFSET = -15 @@ -89,135 +92,27 @@ KEY_PROPS = [ { 'name': 'key-pressed', 'default': False }, ] -# This is the OLPC XO-1 keyboard layout. -# -# The keyboard layout is described by the following data structure. The structure -# has three levels: Layout, Groups, and Keys. A Layout contains a list of Groups, -# each of which contains a list of Keys. Groups are intended to be a way to collect -# related keys (e.g. nearby each other on the keyboard with similar properties) -# together. -# -# Entirely new keyboard layouts can be created just by copying this structure and -# modifying the following values, without changing the code. -OLPC_LAYOUT = { - 'layout-name': "olpc", +def _is_olpcm_model(): + """Check via setxkbmap if the keyboard model is olpcm. - 'layout-width': 775, - 'layout-height': 265, + Keyboard model code is 'olpcm' for non-membrane, mechanical + keyboard, and 'olpc' for membrane keyboard. - 'group-layout': 'horizontal', + """ + code = None + p = subprocess.Popen(["setxkbmap", "-query"], stdout=subprocess.PIPE) + out, err = p.communicate() + for line in out.splitlines(): + if line.startswith('model:'): + code = line.split()[1] + return code == 'olpcm' - 'key-width': 45, - 'key-height': 45, - 'key-gap': 5, +def get_layout(): + if _is_olpcm_model(): + return OLPCM_LAYOUT + else: + return OLPC_LAYOUT - 'groups': [ - { - 'group-name': "numbers", - 'group-x': 10, - 'group-y': 10, - - 'keys': [ - {'key-scan':0x31,'key-finger':'LP','key-hand-image':'OLPC_Lhand_tilde.svg','key-width':35}, - {'key-scan':0x0a,'key-finger':'LP','key-hand-image':'OLPC_Lhand_1.svg'}, - {'key-scan':0x0b,'key-finger':'LR','key-hand-image':'OLPC_Lhand_2.svg'}, - {'key-scan':0x0c,'key-finger':'LM','key-hand-image':'OLPC_Lhand_3.svg'}, - {'key-scan':0x0d,'key-finger':'LI','key-hand-image':'OLPC_Lhand_4.svg'}, - {'key-scan':0x0e,'key-finger':'LI','key-hand-image':'OLPC_Lhand_5.svg'}, - {'key-scan':0x0f,'key-finger':'RI','key-hand-image':'OLPC_Rhand_6.svg'}, - {'key-scan':0x10,'key-finger':'RI','key-hand-image':'OLPC_Rhand_7.svg'}, - {'key-scan':0x11,'key-finger':'RM','key-hand-image':'OLPC_Rhand_8.svg'}, - {'key-scan':0x12,'key-finger':'RR','key-hand-image':'OLPC_Rhand_9.svg'}, - {'key-scan':0x13,'key-finger':'RP','key-hand-image':'OLPC_Rhand_0.svg'}, - {'key-scan':0x14,'key-finger':'RP','key-hand-image':'OLPC_Rhand_minus.svg'}, - {'key-scan':0x15,'key-finger':'RP','key-hand-image':'OLPC_Rhand_plus.svg','key-width':65}, - {'key-scan':0x16,'key-finger':'RP','key-label':"erase",'key-width':95} - ] - }, - { - 'group-name': "top", - 'group-x': 10, - 'group-y': 60, - - 'keys': [ - {'key-scan':0x17,'key-finger':'LP','key-label':"tab"}, - {'key-scan':0x18,'key-finger':'LP','key-hand-image':'OLPC_Lhand_Q.svg'}, - {'key-scan':0x19,'key-finger':'LR','key-hand-image':'OLPC_Lhand_W.svg'}, - {'key-scan':0x1a,'key-finger':'LM','key-hand-image':'OLPC_Lhand_E.svg'}, - {'key-scan':0x1b,'key-finger':'LI','key-hand-image':'OLPC_Lhand_R.svg'}, - {'key-scan':0x1c,'key-finger':'LI','key-hand-image':'OLPC_Lhand_T.svg'}, - {'key-scan':0x1d,'key-finger':'RI','key-hand-image':'OLPC_Rhand_Y.svg'}, - {'key-scan':0x1e,'key-finger':'RI','key-hand-image':'OLPC_Rhand_U.svg'}, - {'key-scan':0x1f,'key-finger':'RM','key-hand-image':'OLPC_Rhand_I.svg'}, - {'key-scan':0x20,'key-finger':'RR','key-hand-image':'OLPC_Rhand_O.svg'}, - {'key-scan':0x21,'key-finger':'RP','key-hand-image':'OLPC_Rhand_P.svg'}, - {'key-scan':0x22,'key-finger':'RP','key-hand-image':'OLPC_Rhand_bracketL.svg'}, - {'key-scan':0x23,'key-finger':'RP','key-hand-image':'OLPC_Rhand_bracketR.svg','key-width':55}, - {'key-scan':0x24,'key-finger':'RP','key-hand-image':'OLPC_Rhand_ENTER.svg','key-label':"enter",'key-width':95,'key-height':95} - ] - }, - { - 'group-name': "home", - 'group-x': 10, - 'group-y': 110, - - 'keys': [ - {'key-scan':0x25,'key-finger':'LP','key-label':"ctrl",'key-width':55}, - {'key-scan':0x26,'key-finger':'LP','key-hand-image':'OLPC_Lhand_A.svg'}, - {'key-scan':0x27,'key-finger':'LR','key-hand-image':'OLPC_Lhand_S.svg'}, - {'key-scan':0x28,'key-finger':'LM','key-hand-image':'OLPC_Lhand_D.svg'}, - {'key-scan':0x29,'key-finger':'LI','key-hand-image':'OLPC_Lhand_F.svg'}, - {'key-scan':0x2a,'key-finger':'LI','key-hand-image':'OLPC_Lhand_G.svg'}, - {'key-scan':0x2b,'key-finger':'RI','key-hand-image':'OLPC_Rhand_H.svg'}, - {'key-scan':0x2c,'key-finger':'RI','key-hand-image':'OLPC_Rhand_J.svg'}, - {'key-scan':0x2d,'key-finger':'RM','key-hand-image':'OLPC_Rhand_K.svg'}, - {'key-scan':0x2e,'key-finger':'RR','key-hand-image':'OLPC_Rhand_L.svg'}, - {'key-scan':0x2f,'key-finger':'RP','key-hand-image':'OLPC_Rhand_SEMICOLON.svg'}, - {'key-scan':0x30,'key-finger':'RP','key-hand-image':'OLPC_Rhand_APOSTROPHE.svg'}, - {'key-scan':0x33,'key-finger':'RP'} - ] - }, - { - 'group-name': "bottom", - 'group-x': 10, - 'group-y': 160, - - 'keys': [ - {'key-scan':0x32,'key-finger':'LP','key-hand-image':'OLPC_Lhand_SHIFT.svg','key-label':"shift",'key-width':75}, - {'key-scan':0x34,'key-finger':'LP','key-hand-image':'OLPC_Lhand_Z.svg'}, - {'key-scan':0x35,'key-finger':'LR','key-hand-image':'OLPC_Lhand_X.svg'}, - {'key-scan':0x36,'key-finger':'LM','key-hand-image':'OLPC_Lhand_C.svg'}, - {'key-scan':0x37,'key-finger':'LI','key-hand-image':'OLPC_Lhand_V.svg'}, - {'key-scan':0x38,'key-finger':'LI','key-hand-image':'OLPC_Lhand_B.svg'}, - {'key-scan':0x39,'key-finger':'RI','key-hand-image':'OLPC_Rhand_N.svg'}, - {'key-scan':0x3a,'key-finger':'RI','key-hand-image':'OLPC_Rhand_M.svg'}, - {'key-scan':0x3b,'key-finger':'RM','key-hand-image':'OLPC_Rhand_COMMA.svg'}, - {'key-scan':0x3c,'key-finger':'RR','key-hand-image':'OLPC_Rhand_PERIOD.svg'}, - {'key-scan':0x3d,'key-finger':'RP','key-hand-image':'OLPC_Rhand_QUESTIONMARK.svg'}, - {'key-scan':0x3e,'key-finger':'RP','key-hand-image':'OLPC_Rhand_SHIFT.svg','key-label':"shift",'key-width':75}, - {'key-scan':0x6f,'key-finger':'RP','key-label':""}, # Up - {'key-label':""}, # Language key - ] - }, - { - 'group-name': "space", - 'group-x': 10, - 'group-y': 210, - - 'keys': [ - {'key-label':"fn",'key-width':35}, - {'key-label':"",'key-width':55}, # LHand - {'key-scan':0x40,'key-label':"alt",'key-width':55}, # LAlt - {'key-scan':0x41,'key-finger':'RT','key-hand-image':'OLPC_Rhand_SPACE.svg','key-width':325}, # Spacebar - {'key-scan':0x6c,'key-label':"altgr",'key-width':55}, # AltGr - {'key-label':"",'key-width':55}, # RHand - {'key-scan':0x71,'key-label':""}, # Left - {'key-scan':0x74,'key-label':""}, # Down - {'key-scan':0x72,'key-label':""}, # Right - ] - } - ] -} class KeyboardImages: def __init__(self, width, height): @@ -227,8 +122,16 @@ class KeyboardImages: self.images = {} def load_images(self): - for filename in glob.iglob('images/OLPC_*.svg'): - image = gtk.gdk.pixbuf_new_from_file_at_scale(filename, self.width, self.height, False) + + # This is for not changing all the numbers of olpcm layout, + # that was made based on the original olpc layout. + scale_width = self.width + if _is_olpcm_model(): + scale_width = int(scale_width * 1.1625) + + for filename in glob.iglob('images/OLPC*.svg'): + image = gtk.gdk.pixbuf_new_from_file_at_scale(filename, scale_width, + self.height, False) name = os.path.basename(filename) self.images[name] = image diff --git a/keybuilder.py b/keybuilder.py index 38ec6d1..bceab0d 100755 --- a/keybuilder.py +++ b/keybuilder.py @@ -35,7 +35,7 @@ try: k.load_letter_map(sys.argv[1]) except: pass -k.set_layout(keyboard.OLPC_LAYOUT) +k.set_layout(keyboard.get_layout()) savebtn = gtk.Button() savebtn.add(gtk.Label('Save Keys')) diff --git a/layouts/__init__.py b/layouts/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/layouts/__init__.py @@ -0,0 +1 @@ + diff --git a/layouts/olpc.py b/layouts/olpc.py new file mode 100644 index 0000000..38fc4ed --- /dev/null +++ b/layouts/olpc.py @@ -0,0 +1,148 @@ +# Copyright 2008 by Kate Scheppke and Wade Brainerd. +# This file is part of Typing Turtle. +# +# Typing Turtle is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Typing Turtle is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Typing Turtle. If not, see <http://www.gnu.org/licenses/>. +#!/usr/bin/env python +# vi:sw=4 et + + +# This is the OLPC XO membrane keyboard layout. +# +# The keyboard layout is described by the following data structure. The structure +# has three levels: Layout, Groups, and Keys. A Layout contains a list of Groups, +# each of which contains a list of Keys. Groups are intended to be a way to collect +# related keys (e.g. nearby each other on the keyboard with similar properties) +# together. +# +# Entirely new keyboard layouts can be created just by copying this structure and +# modifying the following values, without changing the code. +OLPC_LAYOUT = { + 'layout-name': "olpc", + + 'layout-width': 775, + 'layout-height': 265, + + 'group-layout': 'horizontal', + + 'key-width': 45, + 'key-height': 45, + 'key-gap': 5, + + 'groups': [ + { + 'group-name': "numbers", + 'group-x': 10, + 'group-y': 10, + + 'keys': [ + {'key-scan':0x31,'key-finger':'LP','key-hand-image':'OLPC_Lhand_tilde.svg','key-width':35}, + {'key-scan':0x0a,'key-finger':'LP','key-hand-image':'OLPC_Lhand_1.svg'}, + {'key-scan':0x0b,'key-finger':'LR','key-hand-image':'OLPC_Lhand_2.svg'}, + {'key-scan':0x0c,'key-finger':'LM','key-hand-image':'OLPC_Lhand_3.svg'}, + {'key-scan':0x0d,'key-finger':'LI','key-hand-image':'OLPC_Lhand_4.svg'}, + {'key-scan':0x0e,'key-finger':'LI','key-hand-image':'OLPC_Lhand_5.svg'}, + {'key-scan':0x0f,'key-finger':'RI','key-hand-image':'OLPC_Rhand_6.svg'}, + {'key-scan':0x10,'key-finger':'RI','key-hand-image':'OLPC_Rhand_7.svg'}, + {'key-scan':0x11,'key-finger':'RM','key-hand-image':'OLPC_Rhand_8.svg'}, + {'key-scan':0x12,'key-finger':'RR','key-hand-image':'OLPC_Rhand_9.svg'}, + {'key-scan':0x13,'key-finger':'RP','key-hand-image':'OLPC_Rhand_0.svg'}, + {'key-scan':0x14,'key-finger':'RP','key-hand-image':'OLPC_Rhand_minus.svg'}, + {'key-scan':0x15,'key-finger':'RP','key-hand-image':'OLPC_Rhand_plus.svg','key-width':65}, + {'key-scan':0x16,'key-finger':'RP','key-label':"erase",'key-width':95} + ] + }, + { + 'group-name': "top", + 'group-x': 10, + 'group-y': 60, + + 'keys': [ + {'key-scan':0x17,'key-finger':'LP','key-label':"tab"}, + {'key-scan':0x18,'key-finger':'LP','key-hand-image':'OLPC_Lhand_Q.svg'}, + {'key-scan':0x19,'key-finger':'LR','key-hand-image':'OLPC_Lhand_W.svg'}, + {'key-scan':0x1a,'key-finger':'LM','key-hand-image':'OLPC_Lhand_E.svg'}, + {'key-scan':0x1b,'key-finger':'LI','key-hand-image':'OLPC_Lhand_R.svg'}, + {'key-scan':0x1c,'key-finger':'LI','key-hand-image':'OLPC_Lhand_T.svg'}, + {'key-scan':0x1d,'key-finger':'RI','key-hand-image':'OLPC_Rhand_Y.svg'}, + {'key-scan':0x1e,'key-finger':'RI','key-hand-image':'OLPC_Rhand_U.svg'}, + {'key-scan':0x1f,'key-finger':'RM','key-hand-image':'OLPC_Rhand_I.svg'}, + {'key-scan':0x20,'key-finger':'RR','key-hand-image':'OLPC_Rhand_O.svg'}, + {'key-scan':0x21,'key-finger':'RP','key-hand-image':'OLPC_Rhand_P.svg'}, + {'key-scan':0x22,'key-finger':'RP','key-hand-image':'OLPC_Rhand_bracketL.svg'}, + {'key-scan':0x23,'key-finger':'RP','key-hand-image':'OLPC_Rhand_bracketR.svg','key-width':55}, + {'key-scan':0x24,'key-finger':'RP','key-hand-image':'OLPC_Rhand_ENTER.svg','key-label':"enter",'key-width':95,'key-height':95} + ] + }, + { + 'group-name': "home", + 'group-x': 10, + 'group-y': 110, + + 'keys': [ + {'key-scan':0x25,'key-finger':'LP','key-label':"ctrl",'key-width':55}, + {'key-scan':0x26,'key-finger':'LP','key-hand-image':'OLPC_Lhand_A.svg'}, + {'key-scan':0x27,'key-finger':'LR','key-hand-image':'OLPC_Lhand_S.svg'}, + {'key-scan':0x28,'key-finger':'LM','key-hand-image':'OLPC_Lhand_D.svg'}, + {'key-scan':0x29,'key-finger':'LI','key-hand-image':'OLPC_Lhand_F.svg'}, + {'key-scan':0x2a,'key-finger':'LI','key-hand-image':'OLPC_Lhand_G.svg'}, + {'key-scan':0x2b,'key-finger':'RI','key-hand-image':'OLPC_Rhand_H.svg'}, + {'key-scan':0x2c,'key-finger':'RI','key-hand-image':'OLPC_Rhand_J.svg'}, + {'key-scan':0x2d,'key-finger':'RM','key-hand-image':'OLPC_Rhand_K.svg'}, + {'key-scan':0x2e,'key-finger':'RR','key-hand-image':'OLPC_Rhand_L.svg'}, + {'key-scan':0x2f,'key-finger':'RP','key-hand-image':'OLPC_Rhand_SEMICOLON.svg'}, + {'key-scan':0x30,'key-finger':'RP','key-hand-image':'OLPC_Rhand_APOSTROPHE.svg'}, + {'key-scan':0x33,'key-finger':'RP'} + ] + }, + { + 'group-name': "bottom", + 'group-x': 10, + 'group-y': 160, + + 'keys': [ + {'key-scan':0x32,'key-finger':'LP','key-hand-image':'OLPC_Lhand_SHIFT.svg','key-label':"shift",'key-width':75}, + {'key-scan':0x34,'key-finger':'LP','key-hand-image':'OLPC_Lhand_Z.svg'}, + {'key-scan':0x35,'key-finger':'LR','key-hand-image':'OLPC_Lhand_X.svg'}, + {'key-scan':0x36,'key-finger':'LM','key-hand-image':'OLPC_Lhand_C.svg'}, + {'key-scan':0x37,'key-finger':'LI','key-hand-image':'OLPC_Lhand_V.svg'}, + {'key-scan':0x38,'key-finger':'LI','key-hand-image':'OLPC_Lhand_B.svg'}, + {'key-scan':0x39,'key-finger':'RI','key-hand-image':'OLPC_Rhand_N.svg'}, + {'key-scan':0x3a,'key-finger':'RI','key-hand-image':'OLPC_Rhand_M.svg'}, + {'key-scan':0x3b,'key-finger':'RM','key-hand-image':'OLPC_Rhand_COMMA.svg'}, + {'key-scan':0x3c,'key-finger':'RR','key-hand-image':'OLPC_Rhand_PERIOD.svg'}, + {'key-scan':0x3d,'key-finger':'RP','key-hand-image':'OLPC_Rhand_QUESTIONMARK.svg'}, + {'key-scan':0x3e,'key-finger':'RP','key-hand-image':'OLPC_Rhand_SHIFT.svg','key-label':"shift",'key-width':75}, + {'key-scan':0x6f,'key-finger':'RP','key-label':""}, # Up + {'key-label':""}, # Language key + ] + }, + { + 'group-name': "space", + 'group-x': 10, + 'group-y': 210, + + 'keys': [ + {'key-label':"fn",'key-width':35}, + {'key-label':"",'key-width':55}, # LHand + {'key-scan':0x40,'key-label':"alt",'key-width':55}, # LAlt + {'key-scan':0x41,'key-finger':'RT','key-hand-image':'OLPC_Rhand_SPACE.svg','key-width':325}, # Spacebar + {'key-scan':0x6c,'key-label':"altgr",'key-width':55}, # AltGr + {'key-label':"",'key-width':55}, # RHand + {'key-scan':0x71,'key-label':""}, # Left + {'key-scan':0x74,'key-label':""}, # Down + {'key-scan':0x72,'key-label':""}, # Right + ] + } + ] +} diff --git a/layouts/olpcm.py b/layouts/olpcm.py new file mode 100644 index 0000000..7e7999a --- /dev/null +++ b/layouts/olpcm.py @@ -0,0 +1,139 @@ +# Copyright 2008 by Kate Scheppke and Wade Brainerd. +# This file is part of Typing Turtle. +# +# Typing Turtle is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Typing Turtle is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Typing Turtle. If not, see <http://www.gnu.org/licenses/>. +#!/usr/bin/env python +# vi:sw=4 et + + +# This is the OLPC XO non-membrane, mechanical keyboard layout. +# +# Check olpc.py in the same directory for instructions. +OLPCM_LAYOUT = { + 'layout-name': "olpcm", + + 'layout-width': 645, + 'layout-height': 265, + + 'group-layout': 'horizontal', + + 'key-width': 45, + 'key-height': 45, + 'key-gap': 5, + + 'groups': [ + { + 'group-name': "numbers", + 'group-x': 10, + 'group-y': 10, + + 'keys': [ + {'key-scan':0x31,'key-finger':'LP','key-hand-image':'OLPC_Lhand_tilde.svg','key-width':35}, + {'key-scan':0x0a,'key-finger':'LP','key-hand-image':'OLPC_Lhand_1.svg'}, + {'key-scan':0x0b,'key-finger':'LR','key-hand-image':'OLPC_Lhand_2.svg'}, + {'key-scan':0x0c,'key-finger':'LM','key-hand-image':'OLPC_Lhand_3.svg'}, + {'key-scan':0x0d,'key-finger':'LI','key-hand-image':'OLPC_Lhand_4.svg'}, + {'key-scan':0x0e,'key-finger':'LI','key-hand-image':'OLPC_Lhand_5.svg'}, + {'key-scan':0x0f,'key-finger':'RI','key-hand-image':'OLPC_Rhand_6.svg'}, + {'key-scan':0x10,'key-finger':'RI','key-hand-image':'OLPC_Rhand_7.svg'}, + {'key-scan':0x11,'key-finger':'RM','key-hand-image':'OLPC_Rhand_8.svg'}, + {'key-scan':0x12,'key-finger':'RR','key-hand-image':'OLPC_Rhand_9.svg'}, + {'key-scan':0x13,'key-finger':'RP','key-hand-image':'OLPC_Rhand_0.svg'}, + {'key-scan':0x14,'key-finger':'RP','key-hand-image':'OLPC_Rhand_minus.svg','key-width':35}, + {'key-scan':0x16,'key-finger':'RP','key-label':"erase",'key-width':45} + ] + }, + { + 'group-name': "top", + 'group-x': 10, + 'group-y': 60, + + 'keys': [ + {'key-scan':0x17,'key-finger':'LP','key-label':"tab"}, + {'key-scan':0x18,'key-finger':'LP','key-hand-image':'OLPC_Lhand_Q.svg'}, + {'key-scan':0x19,'key-finger':'LR','key-hand-image':'OLPC_Lhand_W.svg'}, + {'key-scan':0x1a,'key-finger':'LM','key-hand-image':'OLPC_Lhand_E.svg'}, + {'key-scan':0x1b,'key-finger':'LI','key-hand-image':'OLPC_Lhand_R.svg'}, + {'key-scan':0x1c,'key-finger':'LI','key-hand-image':'OLPC_Lhand_T.svg'}, + {'key-scan':0x1d,'key-finger':'RI','key-hand-image':'OLPC_Rhand_Y.svg'}, + {'key-scan':0x1e,'key-finger':'RI','key-hand-image':'OLPC_Rhand_U.svg'}, + {'key-scan':0x1f,'key-finger':'RM','key-hand-image':'OLPC_Rhand_I.svg'}, + {'key-scan':0x20,'key-finger':'RR','key-hand-image':'OLPC_Rhand_O.svg'}, + {'key-scan':0x21,'key-finger':'RP','key-hand-image':'OLPC_Rhand_P.svg'}, + {'key-scan':0x22,'key-finger':'RP','key-hand-image':'OLPC_Rhand_bracketL.svg', 'key-width':35}, + {'key-scan':0x23,'key-finger':'RP','key-hand-image':'OLPC_Rhand_bracketR.svg','key-width':35}, + ] + }, + { + 'group-name': "home", + 'group-x': 10, + 'group-y': 110, + + 'keys': [ + {'key-scan':0x25,'key-finger':'LP','key-label':"ctrl",'key-width':55}, + {'key-scan':0x26,'key-finger':'LP','key-hand-image':'OLPC_Lhand_A.svg'}, + {'key-scan':0x27,'key-finger':'LR','key-hand-image':'OLPC_Lhand_S.svg'}, + {'key-scan':0x28,'key-finger':'LM','key-hand-image':'OLPC_Lhand_D.svg'}, + {'key-scan':0x29,'key-finger':'LI','key-hand-image':'OLPC_Lhand_F.svg'}, + {'key-scan':0x2a,'key-finger':'LI','key-hand-image':'OLPC_Lhand_G.svg'}, + {'key-scan':0x2b,'key-finger':'RI','key-hand-image':'OLPC_Rhand_H.svg'}, + {'key-scan':0x2c,'key-finger':'RI','key-hand-image':'OLPC_Rhand_J.svg'}, + {'key-scan':0x2d,'key-finger':'RM','key-hand-image':'OLPC_Rhand_K.svg'}, + {'key-scan':0x2e,'key-finger':'RR','key-hand-image':'OLPC_Rhand_L.svg'}, + {'key-scan':0x2f,'key-finger':'RP','key-hand-image':'OLPC_Rhand_SEMICOLON.svg', 'key-width':35}, + {'key-scan':0x24,'key-finger':'RP','key-hand-image':'OLPCM_Rhand_ENTER.svg','key-label':"enter",'key-width':75}, + ] + }, + { + 'group-name': "bottom", + 'group-x': 10, + 'group-y': 160, + + 'keys': [ + {'key-scan':0x32,'key-finger':'LP','key-hand-image':'OLPC_Lhand_SHIFT.svg','key-label':"shift",'key-width':75}, + {'key-scan':0x34,'key-finger':'LP','key-hand-image':'OLPC_Lhand_Z.svg'}, + {'key-scan':0x35,'key-finger':'LR','key-hand-image':'OLPC_Lhand_X.svg'}, + {'key-scan':0x36,'key-finger':'LM','key-hand-image':'OLPC_Lhand_C.svg'}, + {'key-scan':0x37,'key-finger':'LI','key-hand-image':'OLPC_Lhand_V.svg'}, + {'key-scan':0x38,'key-finger':'LI','key-hand-image':'OLPC_Lhand_B.svg'}, + {'key-scan':0x39,'key-finger':'RI','key-hand-image':'OLPC_Rhand_N.svg'}, + {'key-scan':0x3a,'key-finger':'RI','key-hand-image':'OLPC_Rhand_M.svg'}, + {'key-scan':0x3b,'key-finger':'RM','key-hand-image':'OLPC_Rhand_COMMA.svg', 'key-width':35}, + {'key-scan':0x3c,'key-finger':'RR','key-hand-image':'OLPC_Rhand_PERIOD.svg', 'key-width':35}, + {'key-scan':0x3d,'key-finger':'RP','key-hand-image':'OLPC_Rhand_QUESTIONMARK.svg', 'key-width':35}, + {'key-scan':0x3e,'key-finger':'RP','key-hand-image':'OLPC_Rhand_SHIFT.svg','key-label':"shift",'key-width':75}, + ] + }, + { + 'group-name': "space", + 'group-x': 10, + 'group-y': 210, + + 'keys': [ + {'key-label':"fn",'key-width':45}, + {'key-label':"",'key-width':45}, # LHand + {'key-scan':0x33,'key-finger':'RP','key-width':35}, + {'key-scan':0x40,'key-label':"alt",'key-width':45}, # LAlt + {'key-scan':0x41,'key-finger':'RT','key-hand-image':'OLPC_Rhand_SPACE.svg','key-width':155}, # Spacebar + {'key-scan':0x6c,'key-label':"altgr",'key-width':35}, # AltGr + {'key-scan':0x15,'key-finger':'RP','key-hand-image':'OLPC_Rhand_plus.svg','key-width':35}, + {'key-scan':0x30,'key-finger':'RP','key-hand-image':'OLPC_Rhand_APOSTROPHE.svg','key-width':35}, + {'key-scan':0x71,'key-label':"",'key-width':35}, # Left + {'key-scan':0x74,'key-label':"",'key-width':35}, # Down + {'key-scan':0x6f,'key-label':"",'key-width':35}, # Up + {'key-scan':0x72,'key-label':"",'key-width':35}, # Right + ] + } + ] +} diff --git a/lessonbuilder.py b/lessonbuilder.py index 7f85c1c..b33a34e 100755 --- a/lessonbuilder.py +++ b/lessonbuilder.py @@ -311,7 +311,7 @@ def build_key_steps( except: kb.load_letter_map('lessons/en_US.key') - kb.set_layout(keyboard.OLPC_LAYOUT) + kb.set_layout(keyboard.get_layout()) keynames = new_keys[0] if len(new_keys) >= 2: diff --git a/lessonscreen.py b/lessonscreen.py index e7d66e7..6eed243 100644 --- a/lessonscreen.py +++ b/lessonscreen.py @@ -137,7 +137,7 @@ class LessonScreen(gtk.VBox): except: pass - self.keyboard.set_layout(keyboard.OLPC_LAYOUT) + self.keyboard.set_layout(keyboard.get_layout()) self.pack_start(hbox, False, False, 10) self.pack_start(frame, True, True) |