Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/keyboard.py
diff options
context:
space:
mode:
Diffstat (limited to 'keyboard.py')
-rw-r--r--keyboard.py157
1 files changed, 30 insertions, 127 deletions
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