For reference, I use a mouthstick to type and MouseKeys to control the keyboard. One of the things I like about Ubuntu (as a five day newbie) is its leveraging of X11, which lets us remap keys.
Reaching the keypad to move the mouse is a bit of a pain for me, so I set about modifying it to be more convenient—and I thought I'd share my new mappings. (Please read the caveats at the bottom before using this.)
In addition to the standard keypad mousekeys, the following key mappings exist:
[indent]u - move up ten pixels, left ten pixels i - move up ten pixels o - move up ten pixels, right ten pixels j - move left ten pixels l - move right ten pixels m - move down ten pixels, left ten pixels , - move down ten pixels . - move down ten pixels, right ten pixels
b - left mouse click n - right mouse click
g - begin, end drag left mouse button h - begin, end drag right mouse button
t - scroll up y - scroll down[/indent] /usr/share/X11/xkb/compat/mousekeys:
// mousekeys, v 1.5b 2009/03/28
// $Xorg: mousekeys,v 1.3 2000/08/17 19:54:34 cpqbld Exp $
// Interpretations for arrow keys and a bunch of other
// common keysyms which make it possible to bind "mouse"
// keys using xmodmap and activate or deactivate them
// from the keyboard.
default partial xkb_compatibility "mousekeys" {
// Keypad actions.
//
interpret.repeat= True;
interpret KP_1 {
action = MovePtr(x=-1,y= +1);
};
interpret KP_End {
action = MovePtr(x=-1,y= +1);
};
interpret m {
action = MovePtr(x=-10,y= +10);
};
interpret KP_2 {
action = MovePtr(x=+0,y= +1);
};
interpret KP_Down {
action = MovePtr(x=+0,y= +1);
};
interpret comma {
action = MovePtr(x=+0,y= +10);
};
interpret KP_3 {
action = MovePtr(x=+1,y=+1);
};
interpret KP_Next {
action = MovePtr(x=+1,y=+1);
};
interpret period {
action = MovePtr(x=+10,y=+10);
};
interpret KP_4 {
action = MovePtr(x=-1,y=+0);
};
interpret KP_Left {
action = MovePtr(x=-1,y=+0);
};
interpret j {
action = MovePtr(x=-10,y=+0);
};
interpret KP_6 {
action = MovePtr(x=+1,y=+0);
};
interpret KP_Right {
action = MovePtr(x=+1,y=+0);
};
interpret l {
action = MovePtr(x=+10,y=+0);
};
interpret G {
action = LockPointerButton(button=1,affect=lock);
};
interpret H {
action = LockPointerButton(button=3,affect=lock);
};
interpret KP_7 {
action = MovePtr(x=-1,y=-1);
};
interpret KP_Home {
action = MovePtr(x=-1,y=-1);
};
interpret u {
action = MovePtr(x=-10,y=-10);
};
interpret KP_8 {
action = MovePtr(x=+0,y=-1);
};
interpret KP_Up {
action = MovePtr(x=+0,y=-1);
};
interpret KP_i {
action = MovePtr(x=+0,y=-10);
};
interpret KP_9 {
action = MovePtr(x=+1,y=-1);
};
interpret KP_Prior {
action = MovePtr(x=+1,y=-1);
};
interpret o {
action = MovePtr(x=+10,y=-10);
};
// Button clicks/actions
interpret b {
action = PointerButton(button=1);
};
interpret n {
action = PointerButton(button=3);
};
interpret B {
action = PointerButton(button=1);
};
interpret N {
action = PointerButton(button=3);
};
interpret g {
action = LockPointerButton(button=1);
};
interpret h {
action = LockPointerButton(button=3);
};
interpret G {
action = LockPointerButton(button=1);
};
interpret H {
action = LockPointerButton(button=3);
};
interpret t {
action = PointerButton(button=4);
};
interpret y {
action = PointerButton(button=5);
};
interpret T {
action = PointerButton(button=4);
};
interpret Y {
action = PointerButton(button=5);
};
// End clicks/actions
interpret KP_5 {
action = PointerButton(button=default);
};
interpret KP_Begin {
action = PointerButton(button=default);
};
interpret KP_F2 {
action = SetPtrDflt(affect=defaultButton,button=1);
};
interpret KP_Divide {
action = SetPtrDflt(affect=defaultButton,button=1);
};
interpret KP_F3 {
action = SetPtrDflt(affect=defaultButton,button=2);
};
interpret KP_Multiply {
action = SetPtrDflt(affect=defaultButton,button=2);
};
interpret KP_F4 {
action = SetPtrDflt(affect=defaultButton,button=3);
};
interpret KP_Subtract {
action = SetPtrDflt(affect=defaultButton,button=3);
};
interpret KP_Separator {
action = PointerButton(button=default,count=2);
};
interpret KP_Add {
action = PointerButton(button=default,count=2);
};
interpret KP_0 {
action = LockPointerButton(button=default,affect=lock);
};
interpret KP_Insert {
action = LockPointerButton(button=default,affect=lock);
};
interpret KP_Decimal {
action = LockPointerButton(button=default,affect=unlock);
};
interpret KP_Delete {
action = LockPointerButton(button=default,affect=unlock);
};
// Additional mappings for Solaris keypad compatibility
interpret F25 { // aka KP_Divide
action = SetPtrDflt(affect=defaultButton,button=1);
};
interpret F26 { // aka KP_Multiply
action = SetPtrDflt(affect=defaultButton,button=2);
};
interpret F27 { // aka KP_Home
action = MovePtr(x=-1,y=-1);
};
interpret F29 { // aka KP_Prior
action = MovePtr(x=+1,y=-1);
};
interpret F31 { // aka KP_Begin
action = PointerButton(button=default);
};
interpret F33 { // aka KP_End
action = MovePtr(x=-1,y= +1);
};
interpret F35 { // aka KP_Next
action = MovePtr(x=+1,y=+1);
};
interpret.repeat= False;
// New Keysym Actions.
//
interpret Pointer_Button_Dflt {
action= PointerButton(button=default);
};
interpret Pointer_Button1 {
action= PointerButton(button=1);
};
interpret Pointer_Button2 {
action= PointerButton(button=2);
};
interpret Pointer_Button3 {
action= PointerButton(button=3);
};
interpret Pointer_DblClick_Dflt {
action= PointerButton(button=default,count=2);
};
interpret Pointer_DblClick1 {
action= PointerButton(button=1,count=2);
};
interpret Pointer_DblClick2 {
action= PointerButton(button=2,count=2);
};
interpret Pointer_DblClick3 {
action= PointerButton(button=3,count=2);
};
interpret Pointer_Drag_Dflt {
action= LockPointerButton(button=default);
};
interpret Pointer_Drag1 {
action= LockPointerButton(button=1);
};
interpret Pointer_Drag2 {
action= LockPointerButton(button=2);
};
interpret Pointer_Drag3 {
action= LockPointerButton(button=3);
};
interpret Pointer_EnableKeys {
action= LockControls(controls=MouseKeys);
};
interpret Pointer_Accelerate {
action= LockControls(controls=MouseKeysAccel);
};
interpret Pointer_DfltBtnNext {
action= SetPtrDflt(affect=defaultButton,button= +1);
};
interpret Pointer_DfltBtnPrev {
action= SetPtrDflt(affect=defaultButton,button= -1);
};
// Allow an indicator for MouseKeys.
indicator "Mouse Keys" {
// !allowExplicit;
indicatorDrivesKeyboard;
controls= MouseKeys;
};
};
keysym F7 = MouseKeys_Enable
Caveat 2: This works with Pointer "1 2 3" and ZAxisMapping "4 5" set. If you use other settings, I doubt this will work for you.
I hope this is useful to someone.
Steven