diff options
author | hans-christoph <hans-christoph@b9310e46-f624-0410-8ea1-cfbb3a30dc96> | 2008-08-08 14:17:44 +0000 |
---|---|---|
committer | hans-christoph <hans-christoph@b9310e46-f624-0410-8ea1-cfbb3a30dc96> | 2008-08-08 14:17:44 +0000 |
commit | d19546d9c4ea5f2e7ec2ed35d5bb4e4c92f27503 (patch) | |
tree | f652e442895f36e07d3bd725377869d24b326a4e /plum-tastatur/enable-plum | |
parent | 9e47282fa70b939d5ddbcfa54cddd80ac093b457 (diff) |
Treiber für PLUM-Tastatur hinzugefügt (Linux)
git-svn-id: https://svn.neo-layout.org@732 b9310e46-f624-0410-8ea1-cfbb3a30dc96
Diffstat (limited to 'plum-tastatur/enable-plum')
-rwxr-xr-x | plum-tastatur/enable-plum | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/plum-tastatur/enable-plum b/plum-tastatur/enable-plum new file mode 100755 index 0000000..35de3af --- /dev/null +++ b/plum-tastatur/enable-plum @@ -0,0 +1,236 @@ +#!/usr/bin/perl -w + +# Enable PLUM to work as a standard pc keyboard +# Written 2008 by Hans-Christoph Wirth <hcw@at@gmx@dot@de> +# $Revision: $ +# $Date: $ +# +# This command modifies any current X keymap (which is assumed to be +# designed for use with an ordinary 105 key PC keyboard) so that it +# can be used (almost) identically on a connected PLUM keyboard (see +# www.plum.bz for information on that matrix-like keyboard). +# +# Usage: +# +# 1. Setup your keyboard layout for your standard keyboard using xmodmap. +# 2. Read the warning below and prepare a recovery mechanism. +# 3. Run this script without any parameters. +# +# Run with option "-n" to print the commands without executing them. +# +# Warning: +# +# There is no reliable way (that I am aware of) to determine the type +# of the currently active keyboard. Hence we cannot prevent that you +# call this script twice, which will instantaneously switch keyboard +# input into a completely useless state. To recover from that, you +# should prepare your desktop to run a recovery command (like 'xmodmap +# $HOME/your-standard.modmap') on a mouse click. +# +###################################################################### + +$XMODMAP = "/usr/bin/xmodmap"; + +# +# Options +# +$opt = shift || ""; +$noexec = $opt eq "-n" ? 1 : 0; +$P = $noexec ? "! " : ""; + +# +# Read transformation matrix +# +while (<DATA>) { + ($plum, $pc) = split; + $plum[$pc] = 0+ $plum; +} + +# +# Read and parse existing map +# +print "${P}reading existing keymap\n"; + +open (IN, "$XMODMAP -pke |") or die "read keyboard mapping failed\n"; +while (<IN>) { + /^keycode\s+(\d+)\s+=\s+(.*)$/o or die "error: malformed line: $_\n"; + + if ($plum[$1]) { + push @clearkeys, "keycode $plum[$1] =\n"; + push @setkeys, "keycode $plum[$1] = $2\n"; + + push @report_keys, (split( ' ', $2, 2 ))[0]; + } +} +close (IN); + +# +# Read and parse existing modifiers +# +print "${P}reading existing modifiers\n"; + +open (IN, "$XMODMAP -pm |") or die "read modifier list failed\n"; +while (<IN>) { + unless (/^(shift|lock|control|mod\d)\s*(.*)$/) { + next; + } + + ($mod, $info) = ($1, $2); + + @infos = (); + for (split( /,/, $info )) { + s/\(\S*\)//; + next if /^\s*$/; + push @infos, $_; + } + + push @clearmodifiers, "clear $mod\n"; + push @report_clearmodifiers, "$mod "; + + if (@infos) { + push @setmodifiers, "add $mod = @infos\n"; + push @report_setmodifiers, "$mod "; + } +} +close (IN); + +# +# Now perform the changes using two external calls. +# + +print "${P}clearing " . @report_keys . " keys... @report_keys\n"; +print "${P}clearing " . @report_clearmodifiers . + " modifiers... @report_clearmodifiers\n"; + +if ($noexec) { + open (OUT, "| cat") or die "clear map failed\n"; +} else { + open (OUT, "| $XMODMAP -") or die "clear map failed\n"; +} + +print OUT @clearkeys; +print OUT @clearmodifiers; + +close (OUT) or die "clear map failed\n"; + +print "${P}setting all keys and modifiers @report_setmodifiers\n"; + +if ($noexec) { + open (OUT, "| cat") or die "set new map failed\n"; +} else { + open (OUT, "| $XMODMAP -") or die "set new map failed\n"; +} + +print OUT @setkeys; +print OUT @setmodifiers; + +close (OUT) or die "set new map failed\n"; + +# The data section lists the plum keyboard scancodes ordered from left +# to right and top to bottom. Each line describes one key position in +# the form 'plum code' 'pc code'. Since the keyboard is short of a +# few keys we have to move some keys in the periphery: this affects in +# particular +# +# - the key to the left of '1' moves down next to right shift +# - the key to the right of left shift moves down; there is no longer +# a left windows key +# - return key moves down to space key, obviously +# +# As an example, the standard German 105 key layout is mapped as +# follows: +# +# +# regular pc layout +# +# esc f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 +# ^ 1 2 3 4 5 6 7 8 9 0 ß ' -bsp- +# tab q w e r t z u i o p ü + ret +# lock a s d f g h j k l ö ä # +# shf < y x c v b n m , . - ---shf--- +# ctr win alt ---------spc--------- agr win men ctr +# +# +# plum mapping +# +# esc f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 +# 1 2 3 4 5 6 7 8 9 0 ß ' bsp +# tab q w e r t z u i o p ü + +# lck a s d f g h j k l ö ä # +# shf y x c v b n m , . - shf ^ +# ctr < alt ---ret--- ---spc--- agr win ctr + +__DATA__ +9 9 +67 67 +68 68 +69 69 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +95 95 +96 96 +49 10 +10 11 +11 12 +12 13 +13 14 +14 15 +15 16 +16 17 +17 18 +18 19 +19 20 +20 21 +21 22 +47 23 +33 24 +46 25 +30 26 +58 27 +23 28 +22 29 +54 30 +41 31 +42 32 +24 33 +48 34 +51 35 +36 36 +50 66 +27 38 +26 39 +38 40 +40 41 +32 42 +57 43 +28 44 +43 45 +31 46 +39 47 +62 48 +61 51 +66 50 +45 52 +44 53 +55 54 +56 55 +59 56 +60 57 +25 58 +53 59 +29 60 +52 61 +34 62 +35 49 +37 37 +115 94 +64 64 +65 65 +113 113 +116 116 +109 109 |