parent
425ed6017a
commit
bb0850c469
3 changed files with 1177 additions and 32 deletions
@ -1,20 +1,659 @@ |
||||
xf86-input-evdev - Generic Linux input driver for the Xorg X server |
||||
Welcome to "At Home Modifier" hack of xf86-input-evdev. The original |
||||
README is moved to README.orig. |
||||
|
||||
Please submit bugs & patches to the Xorg bugzilla: |
||||
Search for the word "News" for the news. |
||||
|
||||
https://bugs.freedesktop.org/enter_bug.cgi?product=xorg |
||||
Contents |
||||
======== |
||||
* What it is |
||||
* Web site |
||||
* Get it |
||||
* Usage |
||||
* FAQ |
||||
* Author |
||||
* Bugs |
||||
* Future direction |
||||
* Random bits |
||||
* History (News are here) |
||||
* Source code |
||||
* Copyright |
||||
|
||||
All questions regarding this software should be directed at the |
||||
Xorg mailing list: |
||||
What it is |
||||
========== |
||||
It enables for example "Shift/Space dual role key." When you press the |
||||
space key alone, it's a space; but when you press it with another key, |
||||
it's a shift. And/or Alt/Esc, AltGr/BS... |
||||
|
||||
http://lists.freedesktop.org/mailman/listinfo/xorg |
||||
It is a fork of evdev driver = xf86-input-evdev. It's ** only for |
||||
Linux ** - X in other platforms don't use evdev driver. You can use |
||||
"xcape" referred below if you're not a Linux user. (For MS Win, use |
||||
AutoHotKey, and for Mac, Karabiner, formerly named keyremap4macbook) |
||||
|
||||
The master development code repository can be found at: |
||||
With this hack, your hands can stay at the home position almost |
||||
always, and feel more "at home", thus "At Home Modifier". |
||||
|
||||
git://anongit.freedesktop.org/git/xorg/driver/xf86-input-evdev |
||||
More precisely, you specify pairs of two keycodes, the "original", and |
||||
the "translated". The last event gets recorded in this patch. After |
||||
the press of an "original" key, the driver instead reports a |
||||
translated key press event. When an original key is released, it sends |
||||
a release of the translated key. And it sends a press and release of |
||||
the original key if necessary, judging from the last event. |
||||
|
||||
http://cgit.freedesktop.org/xorg/driver/xf86-input-evdev |
||||
Web site |
||||
======== |
||||
https://gitlab.com/at-home-modifier/at-home-modifier-evdev/wikis/home |
||||
(Until Mar 2015, it was hosted at gitorious.org.) |
||||
|
||||
For more information on the git code manager, see: |
||||
Distro forum threads: |
||||
* Gentoo: https://forums.gentoo.org/viewtopic-t-865313.html |
||||
* Arch: https://bbs.archlinux.org/viewtopic.php?pid=938140 |
||||
* Debian: http://forums.debian.net/viewtopic.php?f=20&t=65950 |
||||
* Ubuntu: http://ubuntuforums.org/showthread.php?p=10907505 (Sorry, closed thread. Use Debian forum instead.) |
||||
|
||||
http://wiki.x.org/wiki/GitPage |
||||
Get it |
||||
====== |
||||
|
||||
Download |
||||
-------- |
||||
The tar.gz is at: https://gitlab.com/at-home-modifier/download/raw/master/source/ahm-2.10.3.tar.gz |
||||
|
||||
You can also download the patch against the Xorg's original driver, |
||||
"xf86-input-evdev" from the website. |
||||
|
||||
git |
||||
--- |
||||
Git access is available, too. For the first time, install git, and clone as |
||||
$ cd some/dir |
||||
$ git clone git@gitlab.com:at-home-modifier/at-home-modifier-evdev.git |
||||
|
||||
You can receive updates by |
||||
$ cd some/dir/at-home-modifier |
||||
$ git pull |
||||
|
||||
Version tags |
||||
------------ |
||||
$ git tag -l "ahm*" |
||||
lists all releases, like ahm-2.5.1. |
||||
|
||||
You can see the difference to the original code by: |
||||
$ git diff xf86-input-evdev-2.5.0..ahm-2.5.0 |
||||
|
||||
Install |
||||
------- |
||||
* Gentoo Linux users can use ebuild files. Visit the Gentoo Forum thread. |
||||
* Arch Linux AUR entries are there. Visit the Arch Forum thread. |
||||
* Debian and its derivatives: Visit the Debian Forum thread. |
||||
*** In Debian, the original package is called "xserver-xorg-input-evdev" |
||||
*** For Ubuntu, Yuri Khan has been providing PPA for years: https://launchpad.net/~yurivkhan/+archive/ahm |
||||
|
||||
Forum threads are listed above. |
||||
|
||||
Other Linux users can install it by replacing xf86-input-evdev. |
||||
Compilation can be done just the same way as the original. I'd |
||||
appreciate it a lot if you could send me your distro support. |
||||
|
||||
** Server upgrading note ** |
||||
When you upgrade your xorg-server-x.y.z, be sure to rebuild this |
||||
driver, too. (Change in z doesn't affect, but x or y does.) |
||||
|
||||
Usage |
||||
===== |
||||
First, know the keycodes you need, which are numbers assigned to each |
||||
physical key. It's easiest to invoke "xmodmap -pk" or "xev" commands. In my |
||||
case it says space is 65, and left shift is 50. OK. (See below for |
||||
complicated cases.) Then write your xorg.conf or |
||||
xorg.conf.d/10-keyboard.conf: |
||||
|
||||
# For the details see "man xorg.conf" or your distro doc. |
||||
Section "InputClass" |
||||
Identifier "my keyboard" # You can name this arbitrarily |
||||
Driver "evdev" |
||||
Option "XKBOptions" "terminate:ctrl_alt_bksp" # and so on |
||||
|
||||
# If you save this file under xorg.conf.d/ : |
||||
Option "AutoServerLayout" "on" |
||||
|
||||
MatchIsKeyboard "on" |
||||
# If you have multiple keyboards, you want something like one of them: |
||||
# MatchProduct "AT Translated Set 2 keyboard" |
||||
# MatchUSBID "0566:3029" |
||||
# Name is found in Xorg log, following the message "Adding input device" |
||||
# or by |
||||
# $ cat /proc/bus/input/devices |
||||
|
||||
### at-home-modifier options begin here. |
||||
# The basic option. |
||||
Option "TransMod" "65:50 102:241" # Defines key/modifier pairs. |
||||
|
||||
## Fine tuning options. Explained in a later section. |
||||
# For the first time, omit them. |
||||
|
||||
# Option "AhmTimeout" "400" # In millisecond. |
||||
# Option "AhmDelay" "65 102" # Delayed keys. Seperate by spaces. |
||||
# Option "AhmFreezeTT" "true" |
||||
# Option "AhmResetTime" "10" # In sec. |
||||
# Option "AhmPaddingInterval" "10" # In millisecond. |
||||
EndSection |
||||
|
||||
If you want to specify multiple pairs for TransMod, separate them with |
||||
whitespaces, like this: |
||||
|
||||
Option "TransMod" "65:240 102:241 100:241" |
||||
|
||||
Don't forget to restart X! |
||||
|
||||
Notice that the modifier keys should come to the second of pairs. |
||||
|
||||
Options recognized by at-home-modifier (in fact, by any X drivers) |
||||
are printed to X log, typically /var/log/Xorg.0.log, like this: |
||||
|
||||
[ 50.579] (**) Option "AhmTimeout" "400" |
||||
|
||||
Fine tuning options |
||||
------------------- |
||||
For the first time, skip this section. Come back after you actually |
||||
try. |
||||
|
||||
*** Other keys *** |
||||
|
||||
Suppose you want the Left-Alt to be Alt/Esc. Then assign Esc to that |
||||
key, using xmodmap. If you don't have any other Alt keys, then allocate |
||||
Alt to keycode 240 or so, which must be unused on usual keyboards. |
||||
|
||||
For more complicated changes, you can tamper with files in |
||||
/usr/share/X11/xkb/symbols/. See also the section "More on keycodes" |
||||
below. |
||||
|
||||
The bottom row of my keyboard is Esc-BS-Spc-Ret-Tab, from left to |
||||
right, with the overlay Alt-Shift-Ctrl-Shift-Alt. (Japanese keyboards |
||||
have many keys you can press with thumbs. Now you can switch Firefox tabs |
||||
with thumbs.=) |
||||
|
||||
You can use any keys for transmods. "d" & "k" (and so on) may be good. |
||||
When you want to capitalize the left-hand keys, press "k", and "d" |
||||
for right-hands. This may sound too complex, but you'll be soon |
||||
accustomed. |
||||
|
||||
*** Cancellation by long press (timeout) *** |
||||
|
||||
Suppose you were about to input shift + A and pressed space/shift, but |
||||
you changed your mind. If you release the space/shift key, you'll |
||||
receive one space, but it's not what you want! |
||||
|
||||
Actually, a workaround is provided by time-out; a long enough press |
||||
cancels that kind of press. If you have the following line in evdev |
||||
driver configuration, |
||||
|
||||
Option "AhmTimeout" "400" # In millisecond. |
||||
|
||||
then a single press and release of space/shift key produces nothing if |
||||
the press lasts more than 0.4 sec. The default is 0.6 sec. You can |
||||
disable timeout by setting it to 0. |
||||
|
||||
*** Successive transmod tuning *** |
||||
|
||||
A subtle fix is enabled by default; suppose a transmod X has been |
||||
pressed. If "transmod Y press, X release" follows, then the press of Y |
||||
is treated as the original key. It's probably what you want. |
||||
|
||||
You can disable it by setting the boolean option "AhmFreezeTT" to false. |
||||
("TT" is meant for "transmod-transmod".) |
||||
|
||||
See also "Corner cases in press and release order" below. |
||||
|
||||
*** Reset *** |
||||
|
||||
Sometimes translated modifiers get frozen (See "Switching VT" section |
||||
below), so a workaround is provided; just leave the keyboard long |
||||
enough time (default 10 secs) untouched. |
||||
|
||||
You can change this time with the following option: |
||||
Option "AhmResetTime" "10" # In sec. |
||||
To disable this feature, set it to 0. |
||||
|
||||
Reset is implemented by sending release events to all translated |
||||
modifiers, and clearing internal variables. The time measurement is |
||||
not exact, and the maximal error is 1 sec. (Implementation note: It's |
||||
because the sub-second field of timeval struct is ignored.) The exact |
||||
time things get reset is the first time you touch the keyboard. |
||||
|
||||
*** Gtk widget double-press workaround (padding interval) *** |
||||
|
||||
Suppose you focus a gtk window with a button widget. When you press |
||||
the shift/space, the gtk button should be pressed. But with this hack, |
||||
you may have to press the key twice; the first press merely focuses |
||||
the button, and the second key press becomes the real push. |
||||
|
||||
As a workaround, "padding interval" can be set: |
||||
Option "AhmPaddingInterval" "10" # In millisecond. |
||||
The default value is 10 ms, and I think it's good, but if it doesn't |
||||
work, set it bigger. |
||||
|
||||
How it works: remember that a release of shift/space key, without touching |
||||
other keys, sends a release of shift, a press of space, and its |
||||
release. Padding interval is inserted between the shift release and |
||||
the space press. Bigger the value, likelier to work, but the latency |
||||
gets bigger, too. |
||||
|
||||
I don't know what's happening inside of gtk, but this solves. |
||||
|
||||
*** Fast type fix (delay) *** |
||||
|
||||
(Probably this option is not so satisfactory) Users of this hack often |
||||
have "tongue-twister of fingers": Suppose you want a space and a lower |
||||
case x. If the first press of space/shift is followed first by a press |
||||
of x and then a release of space/shift, you'll get an upper-case X |
||||
instead. |
||||
|
||||
To fix it, you can let "delay" be associated to space/shift, like: |
||||
|
||||
Option "AhmDelay" "65 102" # Delayed keys. Separate by white space |
||||
|
||||
Then the press of x (or any) following space/shift is "delayed", |
||||
and completes after release of space/shift or x. |
||||
|
||||
There's a trade off. Whenever you want a real shift, you have to |
||||
release the space/shift later. |
||||
|
||||
This feature is not (yet) satisfactory for the author. Maybe it |
||||
should be treated as a modifier only if the key is pressed long |
||||
enough (say 100ms), in addition to / instead of the press-release |
||||
orders. |
||||
|
||||
More on keycodes |
||||
---------------- |
||||
It's good to know that you can also tell keycodes by looking at |
||||
/usr/share/X11/xkb/keycodes/evdev in order to customize the keyboard |
||||
layout with XKB. For example that file says: |
||||
|
||||
<SPCE> = 65; // space |
||||
... |
||||
<LFSH> = 50; // left shift |
||||
|
||||
Ok, but what's this? |
||||
<AE02> = 11; |
||||
|
||||
Hm, if you use for example Italian layout, see |
||||
/usr/share/X11/xkb/symbols/it. It has lines: |
||||
|
||||
xkb_symbols "basic" { |
||||
... |
||||
key <AE02> { [ 2, quotedbl, twosuperior, dead_doubleacute ] }; |
||||
... |
||||
} |
||||
|
||||
xkb_symbols "nodeadkeys" { |
||||
// Modifies the basic italian layout to eliminate all dead keys |
||||
... |
||||
key <AE02> { [ 2, quotedbl, twosuperior, doubleacute ] }; |
||||
... |
||||
} |
||||
|
||||
Aha, so that key is basically "2". |
||||
|
||||
FAQ |
||||
--- |
||||
* Q: I need to input Shift+Space. How can I do it if my space is |
||||
Space/Shift key? |
||||
A: Simple. Turn both of the original Space and Shift into Space/Shift keys, |
||||
for example. |
||||
|
||||
Author |
||||
====== |
||||
Teika kazura <teika ahm-is-great at gmx ahm-is-great dot com> |
||||
|
||||
Delete "ahm-is-great" in the address. |
||||
|
||||
It's good *not* to trust authors you find on the Web. You may be |
||||
reassured to know that I was a developer of Sawfish window manager: |
||||
http://sawfish.wikia.com/wiki/User:Teika_kazura |
||||
|
||||
Bugs |
||||
==== |
||||
|
||||
Fixed bugs |
||||
---------- |
||||
* In 2.6.3 |
||||
** Gtk widget double press issue. |
||||
To push a gtk button, sometimes you had to press space/shift key |
||||
twice, but this is fixed. If it doesn't work out-of-box, set |
||||
"AhmPaddingInterval" option. |
||||
(This "bug" is not the author's fault, but what's bad for users |
||||
are bugs.=) |
||||
|
||||
** Reset and Delayed key |
||||
"Delay" and "Reset" are features introduced in 2.6.2. If a delayed |
||||
key is pressed after a long enough period is passed (i.e. a reset is |
||||
done), the press was ignored. It's fixed now. |
||||
|
||||
* In 2.6.2 |
||||
** Key release interference bug |
||||
Suppose you press x, space/shift, release x, release |
||||
space/shift. Probably you wanted "x ". But formerly, only "x" is |
||||
sent. (More precisely, "x" + shift are sent. Don't confuse it with |
||||
"AhmDelay".) |
||||
|
||||
** Frozen key bug |
||||
Probably ahm-2.6.0 has introduced a new bug which makes some keys |
||||
irresponsive. The bug existed in theory, but the author has never |
||||
experienced it actually. |
||||
|
||||
** Memory leak |
||||
Previous version had slight memory leaks (almost unnoticeable). |
||||
|
||||
** (obsolete) keycode limit |
||||
__This feature is deleted in 2.6.3__ |
||||
X's keycode limit is 255, but linux input driver's keycode limit is |
||||
0x2ff. Now it accepts input codes > 255. |
||||
|
||||
* In 2.6.0 |
||||
** Double shift bug |
||||
Suppose both key a and b are translated to shift. Press a, b, and |
||||
release b. Then it should be 'B', but it used to emit lower b. It's |
||||
because the release of shift was sent before b key press. |
||||
|
||||
Known bugs |
||||
---------- |
||||
* Switching VT: If your Ctrl is a transmod key, when you switch from X |
||||
to a virtual console with Ctrl + Alt + F1, and switch back to X with |
||||
Alt + F1, Ctrl get frozen. This is mitigated with "reset" feature. |
||||
|
||||
It happens because Ctrl is pressed at the first switching, but the |
||||
release is only sent to the VT, not to X, in particular to this driver. |
||||
|
||||
Not a bug |
||||
--------- |
||||
Many keyboards fail to send some combinations of key presses. For |
||||
example, mine doesn't report Left-alt + space(Ctrl intended) + |
||||
cursor-down nor alt + space + delete (whereas alt + space + up is |
||||
dispatched!!) All normal symbol keys pressed with alt + space work. |
||||
|
||||
Keyboards with "n-key rollover" are the solution, and completely ok |
||||
for this hack, but they may be expensive. (USB connection can't report |
||||
7 or more simultaneous presses, but it doesn't matter for us.) |
||||
|
||||
*** Limitations *** |
||||
This driver is unaware of others, for example of synaptic driver. |
||||
Suppose you press space/shift and the left click of notebook touchpad. |
||||
It'll work as shift + click, but a space key event follows. (Timeout |
||||
can give a workaround.) |
||||
|
||||
Future direction |
||||
================ |
||||
Probably the author, Teika kazura, won't develop this hack any more as |
||||
a fork of X evdev driver. |
||||
|
||||
Realistic solutions are to re-implement it in the user space. Then |
||||
codes will be far smaller and much easier to read, and you'll seldom |
||||
have to keep up with Xorg changes. Xcape (see below) does this, by |
||||
using X Record extension and XTest extension. (X Record records |
||||
inputs, and XTest synthesizes events. ) However, XTest and X-Record |
||||
may not work in Wayland. |
||||
|
||||
Wish items |
||||
---------- |
||||
Autorepeat support. For example, you press space/shift twice in a row, |
||||
and/or hold it long enough, then it's turned to the press of space, |
||||
rather than shift. |
||||
|
||||
Delay improvement. See the "Delay" section |
||||
|
||||
Two-way arguments: currently an original-translated pair is written |
||||
as "65:50". It's better to allow "65:50m" or "50m:65", "m" meaning |
||||
"modifier". |
||||
|
||||
"Dynamic configuration", or config changes on-the-fly may be good, for |
||||
example enabling some keys only when you're using an input method. I |
||||
don't know anything about socket or inter-process communication, so |
||||
please tell me how to do it. (Space2Ctrl and Keydouble don't need |
||||
this. Simply kill the process and run another.) |
||||
|
||||
See also this page for some ideas: |
||||
http://www.ruska.it/michal/fork.html |
||||
|
||||
Bug reporting |
||||
------------- |
||||
When you report a bug, don't forget to disable autorepeat by |
||||
$ xset -r [<keycode>] |
||||
|
||||
It's better to make AhmResetTime big, and if you enable AhmDelay, |
||||
set it big, too. |
||||
|
||||
I compile with -Wall -Wextra, and my code does not bring in any extra |
||||
warning. |
||||
|
||||
Corner cases in press and release order |
||||
--------------------------------------- |
||||
There're many corner cases, and I don't know all. The option |
||||
"AhmFreezeTT" is easy not only to reason, but also to code, but more |
||||
complicated examples may not be so. |
||||
|
||||
More may be possible, by knowing which keys are modifiers. (This hack |
||||
doesn't use any information which are modifiers. What's done is a |
||||
simple translation.) You can get the required information by Xlib or |
||||
XKB, but it'll be an inverted implementation, fetching the high-level |
||||
part from the raw world. |
||||
|
||||
Or programmable configuration (together with timestamp support), |
||||
something like an automaton, may help. But don't ask me it. I don't |
||||
know how to design such logic nor to write a parser. |
||||
|
||||
Random bits |
||||
=========== |
||||
|
||||
Will this patch speed up typing? |
||||
-------------------------------- |
||||
In my case, it didn't. But I (or my hands) feel far better and I can't |
||||
do without this fork any more. It's much less tiring, so it may be |
||||
more efficient if you use keyboard for long time in a day. |
||||
|
||||
In fact, this hack introduces some nicety. Options like delay and |
||||
timeout are intended for the cure, but they bring in others. |
||||
|
||||
Warning: Health issue |
||||
--------------------- |
||||
This hack is likely to reduce the use of your pinkies, and the risk of |
||||
their injury like RSI. However, overuse of keyboards can damage *any* |
||||
digits and other parts of your hand, although pinkies are most |
||||
vulnerable. |
||||
|
||||
Good keyboards |
||||
-------------- |
||||
If you can buy a Japanese keyboard, I recommend one. The Japanese |
||||
keyboard is a "cheap Kinesis"; the space key is short, and there're |
||||
keys around the space key which can be easily pressed with thumbs. |
||||
(Have you ever heard of Kinesis Contoured Keyboard?) See for example |
||||
http://en.wikipedia.org/wiki/Keyboard_layout |
||||
|
||||
But it's only the layout. I can't assure the overall quality. Of course |
||||
it's better to try before you buy... |
||||
|
||||
"Realforce" keyboard made by Topre is unique with capacitive key |
||||
switches whose touch is really soft. "HHK Professional" (HHK = Happy |
||||
Hacking Keyboard) also uses Topre's switch. |
||||
|
||||
Kinesis contoured, Realforce and HHK Professional come with n-key |
||||
rollover. (See also "not a bug" section above for "key rollover".) |
||||
|
||||
FYI: mine is OWL-KB86STD made by Owltech. It's cheap, and has cheap |
||||
touch, but I like the layout. |
||||
|
||||
OWL-KB109BM(B)IIB has "Cherry mx brown switches", so may be good. See |
||||
http://forums.gentoo.org/viewtopic.php?p=7019478#7019478 for more |
||||
discussion. |
||||
|
||||
You can buy them from Amazon Japan. (I don't like Amazon hegemony, |
||||
but they provide English interface. Many Japanese keyboards are sold |
||||
at amazon.com, too.) |
||||
|
||||
Alternatives |
||||
============ |
||||
* Xcape |
||||
https://github.com/alols/xcape |
||||
|
||||
Xcape is independently written by Albin Olsson. Accepts |
||||
configuration with key names in addition to keycodes. |
||||
|
||||
Obsolete alternatives |
||||
--------------------- |
||||
* Space2Ctrl and Keydouble |
||||
Space2Ctrl by "r0adrunner" is minimal, only supports "Space to |
||||
Ctrl", and not configurable. Written in C++. |
||||
Keydouble by "baskerville" is a rewrite of Space2Ctrl in C. Has a |
||||
bit less options than mine. |
||||
|
||||
https://github.com/r0adrunner/Space2Ctrl (Space2Ctrl) |
||||
https://github.com/baskerville/keydouble (Keydouble) |
||||
|
||||
* actkbd: It works by direct access to /dev/input, but not updated |
||||
since 2007. I don't think it's flexible enough. |
||||
|
||||
http://users.softlab.ntua.gr/~thkala/projects/actkbd/ |
||||
|
||||
* 窓使いの憂鬱 (Mado-tsukai no yū-utsu; meaning "Spleen of Windows |
||||
Users") for Linux & Darwin: It's a port of a Windows key tuner |
||||
software "窓使いの憂鬱", comparable to AutoHotkey. Japanese |
||||
documentation only. The author is not reachable. Not maintained |
||||
actively. It uses uinput. The last update was in Nov 2011. |
||||
|
||||
http://www42.tok2.com/home/negidakude/ |
||||
|
||||
History |
||||
======= |
||||
|
||||
News |
||||
---- |
||||
* 2.10.3 (jun 2016): |
||||
* Merged upstream 2.10.3, which is 2.10.2 plus one bugfix, https://bugs.freedesktop.org/show_bug.cgi?id=95315 |
||||
|
||||
* 2.10.1 (feb 2016): |
||||
* Merged upstream 2.10.1. |
||||
|
||||
* 2.9.2 (apr 2015): |
||||
* Merged upstream 2.9.2. It also includes the fix of bug 84445, done in commit 8868f61: |
||||
https://bugs.freedesktop.org/show_bug.cgi?id=84445 |
||||
|
||||
* 2.8.0 (jun 2013): |
||||
* Merged upstream 2.8.0. |
||||
More precisely, |
||||
* There're two fix-up commits after 2.8.0 in the upstream. They're |
||||
merged too. |
||||
* In ahm-2.7.1, configure option "--without-mtdev" was added. But |
||||
now it's deleted, and mtdev dependency is mandatory. |
||||
|
||||
* 2.7.3 (nov 2012): |
||||
* Merged upstream 2.7.3. Ahm-2.7.2 was never released. |
||||
|
||||
* 2.7.1 (jun 2012): |
||||
* Merged upstream 2.7.0. No any change in ahm per se, except doc. |
||||
* An upstream bugfix of horizontal scroll, X.Org Bug 46205, is |
||||
included. (The fix is published after the 2.7.0 release.) |
||||
* Added an option to configure script "--without-mtdev". The |
||||
upstream code always checks mtdev, and enable it when found. |
||||
If you don't pass the above option, it falls back to the |
||||
original behavior. |
||||
|
||||
This change, commit 371543edf0b, probably has to be reverted |
||||
before merging upstream 2.8.0. The upstream suggests mtdev |
||||
dependence will be forced in future versions. |
||||
* Read also "Future direction" section in this README. |
||||
* The hack version is 2.7.1, not 2.7.0, without much reason. |
||||
|
||||
* 2.6.4 (dec 2011): |
||||
* Other device awareness |
||||
When you press space/shift and a mouse button, the result used to be |
||||
shift + click, ok, but also followed by an extra, unwanted |
||||
space, as if the click hadn't happened. It's because each device |
||||
ignored others. Now it's fixed, as long as the mouse is also |
||||
handled by evdev driver. (Notebook touchpads are dealt by |
||||
synaptics driver, so it's not fixed, and won't be fixed. Use |
||||
AhmTimeout option as a workaround.) |
||||
|
||||
Thanks to the ArchLinux forum user "grimp3ur" for the idea. |
||||
* 2.6.3 (nov 2011): |
||||
* Bugs fixed |
||||
Gtk button double press bug. Reset and delayed key bug. |
||||
* Big keycode support is deleted. |
||||
In 2.6.2, big keycode support was introduced, but it's |
||||
deleted. loadkeys (1) command suffices. |
||||
* 2.6.2 (oct 2011): |
||||
* New features |
||||
Long press cancellation (Option "AhmTimeout"), fast type fix |
||||
(Option "AhmDelay"), successive transmod tuning (Option |
||||
"AhmFreezeTT"), reset (Option "AhmResetTime") are implemented. |
||||
|
||||
Thanks to the ArchLinux forum user "bloom" for the idea of |
||||
long press cancellation. |
||||
* Bugs fixed |
||||
Release interference bug, keycode limit bug, and 2 other minor |
||||
bugs are fixed. |
||||
* Documentation |
||||
New sections: "Not a bug", "Corner cases", "Alternatives", "Source |
||||
code". |
||||
New bug item: "Switching VT". |
||||
New wish items: "Dynamic configuration", "autorepeat support" |
||||
* Feature deleted in later release. |
||||
"Big keycode support" is introduced in 2.6.2, but deleted in 2.6.3. |
||||
* 2.6.1 was never released. |
||||
* 2.6.0 (apr 2011): Merged upstream 2.6.0. "Double shift bug" is fixed. |
||||
* 2.5.1 (feb 2011): Minor documentation updates. |
||||
* 2.5.0 (feb 2011): Initial release. Forked from upstream 2.5.0 = xf86-input-evdev-2.5.0. |
||||
|
||||
Background |
||||
---------- |
||||
What was proposed originally was called "SandS" - stands for "Space and |
||||
Shift" - which dates back to year 2001, by K. Kimura.[1] There's |
||||
implementations in Mac and Win, and has a modest popularity in Japan |
||||
still in year 2011. (K. Kimura has also contributed a lot to Japanese |
||||
input methods.) |
||||
|
||||
In 2008 T. Matsuyama implemented it for X keyboard driver.[2] Then |
||||
came a port to evdev driver by "jeneshicc".[3] But they lack |
||||
generality; you can only use physical shift, alt, and space keys. My |
||||
code is based on the last patch. I appreciate their work. |
||||
|
||||
[1] (Japanese) http://hp.vector.co.jp/authors/VA002116/ |
||||
[2] (Japanese) |
||||
http://dev.ariel-networks.com/Members/matsuyama/keyboard-customize |
||||
[3] (Japanese): |
||||
http://d.hatena.ne.jp/jeneshicc/20100306/1267843799 |
||||
|
||||
Space2Ctrl was (probably) written independently in 2011. |
||||
|
||||
Source code |
||||
=========== |
||||
|
||||
Required knowledge |
||||
------------------ |
||||
What's required is only C knowledge, none of X. I've added some comments, so |
||||
it must be easy to understand. |
||||
|
||||
src/evdev.h |
||||
----------- |
||||
Search for "ahm variables". |
||||
|
||||
In src/evdev.c, gcc __attribute__ is used. To support other compilers, |
||||
it's defined as null when __GNUC__ is not defined. |
||||
|
||||
src/evdev.c |
||||
----------- |
||||
* Parsing options |
||||
Ahm options are parsed in function NewEvdevPreInit. Search for |
||||
"parse ahm options". |
||||
|
||||
* Earlier event handling |
||||
In the Xorg original code, keyboard events are handled by |
||||
EvdevQueueKbdEvent. Ahm wraps it with AhmStep1 and AhmStep2, and |
||||
WrapEvdevQueueKbdEvent. |
||||
|
||||
* Later event handling |
||||
In the original code, events get really sent in |
||||
EvdevPostQueuedEvents. To implement AhmPaddingInterval, this |
||||
function is changed a bit, by queuing key events in ahm's own queue, |
||||
and asynchronous timer is set. Timer related functions I've added |
||||
are: AhmWakeupHandler, AhmBlockHandler, AhmRegisterTimers and |
||||
AhmFinalise. |
||||
|
||||
License |
||||
======= |
||||
Distributed under MIT License; Same as Xorg. |
||||
|
||||
Loading…
Reference in new issue