Index Interpreted As Button Number
1 Wheel Up 4
2 Wheel Down 5
3 Wheel Left 6
4 Wheel Right 7
5 Thumb Button 1 8
6 Thumb Button 2 9
gpm -v
This swaps the X and Y axis of movement for stick input from a wheel-fifo.
Edit the XF86Config and add/edit the following lines in the "Pointer"(XFree86 3.3) or "InputDevice"(XFree86 4.x) section:
1 axis (vertical wheel):
(XFree86 3.3)
2 axis (1 stick or 2 perpendicular wheels):
(XFree86 3.3)
The Buttons option may be greater than stated above if you have thumb buttons, or other extras that qualify as buttons.
Make sure your Protocol is set to either "IMPS/2" for a PS/2 mouse or for serial mice set it to "IntelliMouse" or "Auto". This is for IntelliMouse compatible mice, other protocols may be required for other mice. Then while running X Windows run imwheel without the --wheel-fifo or -W options.
NOTE
The @Exclude command must be used for clients that either use the ZAxis
for themselves and have no keyboard translations to cause the same desired
effect. The @Exclude command must also be added for any client requiring
mouse and/or mouse button grabs and that don't specify specific buttons to
grab. These clients fail when they try to grab the mouse because the buttons 4
and 5 are already grabbed by imwheel. XV is an example of a client that
requires these types of grabs to succeed. KDE clients use the ZAxis for their
own purposes. The supplied imwheelrc included and exclusion for XV already.
See the IMWheelRC section for more information.
Also pid files are not used for this method. Thus the -p and --pid options have no effect, and are ignored.
In the Pointer section of your XF86Config (or the equivalent configuration file for your X server) change your mouse Protocol to be "MouseSystems" (or the equivelant...), also change the Device file that the mouse is read from to "/dev/gpmdata", then restart X Windows if it is running. jamd will replicate to /dev/jam_ps2:0.0 or some other devices as well, make sure to use the right X Mouse protocol in this case, like the jamd_ps2 device is X mouse protocol PS/2, and the jamd_imps2 device is X mouse protocol IMPS/2.
Before starting X Windows (re)start gpm with the -W option. Make sure you are using a supported wheel or stick mouse as stated in the gpm man page.
After starting X Windows run imwheel as follows adding options as desired:
for gpm you can use the following option to imwheel
--wheel-fifo
jamd requires you specify the fifo name as one of the /dev/jamd_imwheel:0.0 named fifos. Run
ls -al /dev/jam_imwheel*
to see what is available. In this example I would use
-W /dev/jam_imwheel:0.0
as the option to imwheel.
I usually add the -k option to kill off any old imwheel processes left over, as imwheel doesn't exit with the server, but rather it will only die if a wheel or stick action occurs when an X server is not connected, such as when X is dead or the DISPLAY environment variable is setup wrong, or the -X or --display variables connected imwheel to a now defunct X server.
gpm or jamd, and/or imwheel can be restarted at any time, imwheel can sense when gpm of jamd is not there, and gpm nor jamd doesn't give a hoot about imwheel being up or not.
NOTE
The @Exclude command has no bearing in this method, it is ignored. No Focus
change events are received in this method. Thus KDE and other clients that
support X based wheel events through the ZAxis are not going to work except
through normal imwheel keypress translation of wheel and stick actions.
XV will function fine, as will any client that grabs the mouse and/or mouse
buttons. This mode doesn't use any grabs to function.
Next the summed X and Y axis movement is each compared to the sensitivity setting. If the sensitivity setting is equalled or exceeded, then one imwheel event is spawned, thus after pressing up for a bit, the Y sum exceeds the sensitivity and a wheel up event is interpreted by imwheel into an action such as a PageUp key.
The sensitivity therefore must be greater than the threshhold for it to have any bearing on the input. Pseudo code such as the following may explain:
if(input >= threshhold)
The configuration file consists of window names and event translations and/or imwheel commands that begin with an `@' (at) symbol. Each window name starts a section that is it's configuration. The window names a priortized as first come first served, so more generic matches should always occur later in the configuration file.
Comments are started with a pound (#) and extend to the end of the line.
Window Title Window Class Name Window Resource Name (null) which matches "\(null\)" in the imwheelrc
Most of these are probe-able using fvwm2's FvwmIdent module or the configurator
(see the CONFIGURATION HELPER section). Other window managers may have their
own method of identifying windows' attributes.
Each window name is matched as a regex string. Thus any window is matched using
the regex pattern ".*" as a window name. This pattern should be the last
section in your configuration file, or it will override the other window
configurations in the file for matched wheel/stick actions.
There is one special header noted as "(null)" which matches windows that have a
null string in the three attributes. This makes it possible to assign actions
to even Quake3, which has no info for it's window. Just make sure that you
realize that the keys used should not be keys that may conflict with other
key actions in the game or application you are aiming to make work!
The included imwheelrc file has a "(null)" section included to demonstrate, and
it should work with Quake3.
Each window/class/resource name must be enclosed in double quotes (") on a line by
itself.
Inside each window section is any number of translation definitions or commands. Each translation definition or command must be on a line by itself. The window section doesn't have to be terminated, as it is terminated by either starting another window section or the end of the configuration file.
REQUIRED
The following arguments a required to make a minimum translation definition.
`None' is a special KeySym used by imwheel, it is used to indicate no modifiers. A blank entry is also acceptable in this case, but less descriptive of what is going on! If `None' is used then there can be no modifiers in use during the wheel action. If the field is blank then any modifier will match, so put these last in their window section.
Up Down Left Right Thumb
These are self explanatory. If you have trouble use the configurator!
OPTIONAL
The following options are optional, but to use one you must fill in all the
preceding arguments.
Default is 1.
Default is 0.
Default is 0.
Up is button 4 Down is button 5 Left is button 6 Right is button 7 Thumb1 is button 8 Thumb2 is button 9
Mouse wheel and stick actions can be grabbed along with active modifier keys on the keyboard. The mouse wheel/stick action is displayed and the X KeySyms are displayed beneath it. All this information can be directly entered into an imwheelrc as desired.
IMWheel can be restarted to read in a changed imwheelrc file or the configurator can be canceled causing imwheel to resume oprations without reading the configuration file. To restart imwheel execs itself as called by the user in the first place but adding the -R option to indicate to itself that this is a restarted imwheel. The -R is not for use by the user, as it bypasses some configuration of imwheel.
Example:
Alt_R|Shift_RMeans right alt and right shift together, not just either one or the other! And not one after the other, they are both pressed at the same time essentially.
For FIFO users, it is possible to send a real mouse button event, using the special Button# syntax. An imwheelrc keysym of Button1 would send a real Mouse button 1 (left mouse button) event. Mouse4 is what you'd want for a MouseWheelUp type event. Mouse5 is what you want to MouseWheelDown event. Many applications will understand the meaning of mouse button 4 and 5, but most don't go beyond that. So Mouse6 and greater have no "standardized" meaning. The Button# syntax can be combined with regular keysyms, to send keys and mouse buttons at the same time.
Example:
Shift_L|Button4 - meaning left shift and wheel up. Button5 - meaning wheel down.
Other button to imwheel meaniful references:
KeySym IMWheel Input Real Mouse ------ ------------- ---------- Button1 (none) Left Mouse Button Button2 (none) Middle Mouse Button Button3 (none) Right Mouse Button Button4 Up Mouse Wheel Up Button5 Down Mouse Wheel Down Button6 Left Mouse Wheel Left Button7 Right Mouse Wheel Right Button8 Thumb1 Side Mouse Button 1 (left/up) Button9 Thumb2 Side Mouse Button 2 (right/down)
These are probably not currently assigned any keys, unless you xmodmap them in:
Meta_L Meta_R (Actually, Sun keyboards have this...) Super_L Super_R Hyper_L Hyper_R
And here's some that you may use, and they are somewhere on your keyboard:Here's where they were on my keyboard, again, this is not universal. Use the xev program to test your own keys on your keyboard!
Caps_Lock = The Caps Lock key! (This still turns on and off caps lock!) Num_Lock = The Num Lock key! (This is not good to use... for the same reasons as Caps_Lock) Multi_key = The Scroll Lock key! (Go figure!) Mode_switch = Right Alt...for me anyways. (This mean I cannot use Alt_R)
The windows keys may not be assigned any KeySyms, but they will have numbers. xmodmap can be used to assign them to a real KeySym.
To find keysym names for any keys available see the /usr/include/X11/keysymdef.h file, and for any define in that file remove the "XK_" for the usable KeySym name in the configuration file. The path to this file may differ for you.
Remember, there's always the configurator. And xev will also help here too!
Of course if your wheel keeps clicking middle button while you're trying to use the wheel you may want to activate the Emulate3Buttons option to disable the wheel button! And donn't forget to reduce the Buttons argument to 2!
xmodmap -e "pointer = 3 2 1 4 5" or xmodmap -e "pointer = 3 2 1 4 5 6 7" etc... xmodmap -e "pointer = 3 2 1 4 5 6 7 8 9" NOTE: most of these are NOT going to work, because of all the limits in X.
add more numbers to the end of this line if you have more buttons!
Real Bugs
imwheel doesn't get along with itself on the same X display or using the same gpmwheel FIFO. - This will always be your fault :-/
Stick mice are still a pain in the butt to use. - This is the manufacturer's fault. Or X Windows fault, for not having a method to easily use such devices in all applications.
Keyboard focus isn't changed automatically to input keys into Window mouse is over. This only occurs with Click-to-Focus type focus managment in window managers. I use sloppy focus in fvwm2, which always works for me. - Whose fault is this? (Switch focus modes and/or window managers, or try the -f option on imwheel)
Configuration file is not validated for correctness nicely...although it does get preparsed before the main program starts, thus stopping you before you run with an invalid configuration file. I just have never made a bad configuration file, so I guess I'll have to try and do that to see what happens. Just don't make any mistakes and you'll be fine. - This is my fault?! ;)
http://jonatkins.org/imwheel
$HOME/.imwheelrc The users configuration file. /etc/imwheelrc The global location for the configuration file, it is always loaded. Overided by the users configuration file. /dev/gpmwheel The default wheel FIFO from gpm, if used. /dev/jam_imwheel:0.0 (or other numbers...) A wheel FIFO from jamd, if used, must be specified. jamd allows more than on FIFO, and thus allows more than one instance of imwheel to be running on the same computer when running imwheel on multiple displays using the Wheel FIFO method. /tmp/imwheel.pid The public area for imwheel's pid file. /var/run/imwheel.pid The private area for imwheel's pid file.
jamd(1) Jon Atkins Mouse - a replacement/augmentation for/to gpm. xwheel(1x) The new replacement for imwheel. Uses jamd instead of gpm or ZAxis. (may not be available yet) xdpyinfo(1x) X Display information, including extensions. gpm(8) General Purpose Mouse, imwheel edition required. FvwmIdent(1x) FVWM2's Identify module, for probing windows. regex(7) POSIX 1003.2 Regular Expressions. xmodmap(1x) Utility for modifying keymap & button mappings in X. xev(1x) Print contents of X events. /usr/include/X11/keysymdef.h X11 KeySym definitions. /usr/include/limits.h INT_MIN and INT_MAX definitions.