1922 lines
		
	
	
	
		
			76 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			1922 lines
		
	
	
	
		
			76 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
This is /home/user/nico/projekte/gpm/gpm/doc/gpm.info, produced by makeinfo version 4.11 from /home/user/nico/projekte/gpm/gpm/doc/gpm.texinfo.
 | 
						||
 | 
						||
INFO-DIR-SECTION Miscellaneous
 | 
						||
START-INFO-DIR-ENTRY
 | 
						||
* Gpm: (gpm).   Text-mode (non-X) mouse library and server daemon.
 | 
						||
END-INFO-DIR-ENTRY
 | 
						||
 | 
						||
   This file is a user's and programmer's manual for gpm 1.20.4.
 | 
						||
 | 
						||
   Copyright (C) 1994,1995,1998 Alessandro Rubini Copyright (C)
 | 
						||
2001-2008 Nico Schottelius
 | 
						||
 | 
						||
   Permission is granted to make and distribute verbatim copies of this
 | 
						||
manual provided the copyright notice and this permission notice are
 | 
						||
preserved on all copies.
 | 
						||
 | 
						||
   Permission is granted to copy and distribute modified versions of
 | 
						||
this manual under the conditions for verbatim copying, provided that
 | 
						||
the entire resulting derived work is distributed under the terms of a
 | 
						||
permission notice identical to this one.
 | 
						||
 | 
						||
   Permission is granted to copy and distribute translations of this
 | 
						||
manual into another language, under the above conditions for modified
 | 
						||
versions, except that this permission notice may be stated in a
 | 
						||
translation approved by the Free Software Foundation.
 | 
						||
 | 
						||
   This file documents the 1.20.4 release of the "General Purpose
 | 
						||
Mouse" (gpm) server for the Linux text console (29th of May 2008).
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Top,  Next: Overview,  Prev: (dir),  Up: (dir)
 | 
						||
 | 
						||
gpm
 | 
						||
***
 | 
						||
 | 
						||
* Menu:
 | 
						||
 | 
						||
* Overview::
 | 
						||
* Server Invocation::
 | 
						||
* Gpm Internals::
 | 
						||
* The ClientLib::
 | 
						||
* Demo Clients::
 | 
						||
* Type Index::
 | 
						||
* Function Index::
 | 
						||
* Variable Index::
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Overview,  Next: Server Invocation,  Prev: Top,  Up: Top
 | 
						||
 | 
						||
1 Overview
 | 
						||
**********
 | 
						||
 | 
						||
The "gpm" package is a mouse server for the Linux console.  It is meant
 | 
						||
to provide cooked mouse events to text-only applications, such as
 | 
						||
editors and simple menu-based apps. The daemon is also able to repeat
 | 
						||
packets in "msc" format to a graphic application.  This last feature is
 | 
						||
meant to override the single-open problem of busmice.  The roots of
 | 
						||
`gpm' come from the `selection-1.5' package, by Andrew Haylett.
 | 
						||
 | 
						||
   The first application to support the mouse has been The Midnight
 | 
						||
Commander, by Miguel de Icaza.  `mc-0.11' and later releases offer
 | 
						||
mouse support if you have the mouse server running on your system.  The
 | 
						||
file `t-mouse.el' provides support for using the mouse from within
 | 
						||
Emacs. *Note Emacs Support::.
 | 
						||
 | 
						||
   As of release 0.96, a default-handler is released with gpm, and can
 | 
						||
be used to handle Control-Mouse events to draw menus on the screen.
 | 
						||
The `gpm-root' program, however, needs kernel 1.1.73 or newer.  *Note
 | 
						||
gpm-root::.
 | 
						||
 | 
						||
   Release 1.00 has been an incompatible one (is is incompatible with
 | 
						||
releases older than 0.97), but is compatible with the kernel-level mouse
 | 
						||
driver (available as `kmouse-?.??.tar.gz' from the mirrors of
 | 
						||
`ftp://tsx-11.mit.edu'. With 1.0 the high level library is available,
 | 
						||
together with a demonstration/test program. A small utility to help in
 | 
						||
detecting your mouse-type is also included.
 | 
						||
 | 
						||
   As of release 1.20.0 the default device is removed. Now -m is a must.
 | 
						||
 | 
						||
   Release 1.20.1 introduces the must for -t and a specific way to use
 | 
						||
-m,-t,-o: Now you've got to use -m first, then -t and at last -o.  This
 | 
						||
seems to be more complex, but makes using of multiply mice possible with
 | 
						||
clean code.
 | 
						||
 | 
						||
* Menu:
 | 
						||
 | 
						||
* Building the Release::
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Building the Release,  Prev: Overview,  Up: Overview
 | 
						||
 | 
						||
1.1 Compiling and Installing
 | 
						||
============================
 | 
						||
 | 
						||
Just say `./configure && make && make install' to your shell. You'll
 | 
						||
need gpm installed to compile the latest release of The Midnight
 | 
						||
Commander with mouse support enabled.
 | 
						||
 | 
						||
   Binaries are not released with the package because it's safer for
 | 
						||
you to compile the package by yourself.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Server Invocation,  Next: Gpm Internals,  Prev: Overview,  Up: Top
 | 
						||
 | 
						||
2 Server Invocation
 | 
						||
*******************
 | 
						||
 | 
						||
The `gpm' executable is meant to act like a daemon (thus, `gpmd' would
 | 
						||
be a better name for it). This section is meant to describe the
 | 
						||
command-line options for `gpm', while its internals are outlined in the
 | 
						||
next section.  *Note Gpm Internals::.
 | 
						||
 | 
						||
   Due to restrictions in the `ioctl(TIOCLINUX)' system call, `gpm' must
 | 
						||
be run by the superuser. The restrictions have been added in the last
 | 
						||
1.1 kernels to fix a security hole related to selection and screen
 | 
						||
dumping.
 | 
						||
 | 
						||
   The server can be configured to match the user's taste, and any
 | 
						||
application using the mouse will inherit the server's attitude. From
 | 
						||
release 1.02 up to 1.19.2 is was possible for any user logged on the
 | 
						||
system console to change the mouse _feeling_ using the -q option. This
 | 
						||
is no longer possible for security reasons.
 | 
						||
 | 
						||
   As of 0.97 the server program puts itself in the background. To kill
 | 
						||
`gpm' you can just reinvoke it with the `-k' cmdline switch, although
 | 
						||
`killall gpm' can be a better choice.
 | 
						||
 | 
						||
* Menu:
 | 
						||
 | 
						||
* Special Commands::
 | 
						||
* Command Line::
 | 
						||
* Bugs and Problems::
 | 
						||
* Mouse Types::
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Special Commands,  Next: Command Line,  Prev: Server Invocation,  Up: Server Invocation
 | 
						||
 | 
						||
2.1 Special Commands
 | 
						||
====================
 | 
						||
 | 
						||
Version 1.10 adds the capability to execute _special_ commands on
 | 
						||
certain circumstances. Special commands default to rebooting and halting
 | 
						||
the system, but the user can specify his/her personal choice. The
 | 
						||
capability to invoke commands using the mouse is a handy one for
 | 
						||
programmers, because it allows to issue a clean shutdown when the
 | 
						||
keyboard is locked and no network is available to restore the system to
 | 
						||
a sane state.
 | 
						||
 | 
						||
   Special commands are toggled by triple-clicking the left and right
 | 
						||
button - an unlikely event during normal mouse usage. The easiest way
 | 
						||
to triple-click is pressing one of the buttons and triple-click the
 | 
						||
other one. When special processing is toggled, a message appears on the
 | 
						||
console (and the speaker beeps twice, if you have a speaker); if the
 | 
						||
user releases all the buttons and presses one of them again within
 | 
						||
three seconds, then the special command corresponding to the button is
 | 
						||
executed.
 | 
						||
 | 
						||
   The default special commands are:
 | 
						||
 | 
						||
LEFT BUTTON
 | 
						||
     Reboot the system by signalling the init process
 | 
						||
 | 
						||
MIDDLE BUTTON (IF ANY)
 | 
						||
     Execute `/sbin/shutdown -h now'
 | 
						||
 | 
						||
RIGHT BUTTON
 | 
						||
     Execute `/sbin/shutdown -r now'
 | 
						||
 | 
						||
   The `-S' command line switch enables special command processing and
 | 
						||
allows to change the three special commands. To accept the default
 | 
						||
commands use `-S ""' (i.e., specify an empty argument).  To specify
 | 
						||
your own commands, use a colon-separated list to specify commands
 | 
						||
associated to the left, middle and right button. If any of the commands
 | 
						||
is empty, it is interpreted as `send a signal to the init process'. This
 | 
						||
particular operation is supported, in addition to executing external
 | 
						||
commands, because sometimes bad bugs put the system to the impossibility
 | 
						||
to fork; in these rare case the programmer should be able to shutdown
 | 
						||
the system anyways, and killing init from a running process is the only
 | 
						||
way to do it.
 | 
						||
 | 
						||
   As an example, `-S ":telinit 1:/sbin/halt"', associates killing init
 | 
						||
to the left button, going single user to the middle one, and halting
 | 
						||
the system to the right button.
 | 
						||
 | 
						||
   System administrators should obviously be careful about special
 | 
						||
commands, as gpm runs with superuser permissions. Special commands are
 | 
						||
best suited for computers whose mouse can be physically accessed only by
 | 
						||
trusted people.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Command Line,  Next: Bugs and Problems,  Prev: Special Commands,  Up: Server Invocation
 | 
						||
 | 
						||
2.2 Command Line Options
 | 
						||
========================
 | 
						||
 | 
						||
Available command line options are the following:
 | 
						||
 | 
						||
`-a ACCEL'
 | 
						||
     Set the acceleration value used when a single motion event is
 | 
						||
     longer than DELTA (see `-d').
 | 
						||
 | 
						||
`-A[LIMIT]'
 | 
						||
     Start up with selection pasting disabled.  This is intended as a
 | 
						||
     security measure; a plausible attack on a system seems to be to
 | 
						||
     stuff a nasty shell command into the selection buffer (`rm -rf /')
 | 
						||
     including the terminating line break, then all the victim has to
 | 
						||
     do is click the middle mouse button ..  As of version 1.17.2, this
 | 
						||
     has developed into a more general aging mechanism; the gpm daemon
 | 
						||
     can disable (_age_) selection pasting automatically after a period
 | 
						||
     of inactivity.  To enable this mode just give the optional LIMIT
 | 
						||
     parameter (no space in between !)  which is interpreted as the
 | 
						||
     time in seconds for which a selection is considered valid and
 | 
						||
     pastable.  As of version 1.15.7, a trivial program called
 | 
						||
     `disable-paste' is provided. The following makes a good addition
 | 
						||
     to `/etc/profile' if you allow multiple users to work on your
 | 
						||
     console.
 | 
						||
 | 
						||
     `case $( /usr/bin/tty ) in
 | 
						||
     /dev/tty[0-9]*) /usr/bin/disable-paste ;;
 | 
						||
     esac'
 | 
						||
 | 
						||
`-b BAUD'
 | 
						||
     Set the baud rate.
 | 
						||
 | 
						||
`-B SEQUENCE'
 | 
						||
     Set the button sequence. `123' is the normal sequence, `321' can
 | 
						||
     be used by left-handed people, and `132' can be useful with
 | 
						||
     two-button mice (especially within Emacs). All the button
 | 
						||
     permutations are allowable.
 | 
						||
 | 
						||
`-d DELTA'
 | 
						||
     Set the delta value. When a single motion event is longer than
 | 
						||
     DELTA, ACCEL is used as a multiplying factor. (Must be 2 or above)
 | 
						||
 | 
						||
`-D'
 | 
						||
     Do not automatically enter background operation when started, and
 | 
						||
     log messages to the standard error stream, not the syslog
 | 
						||
     mechanism.  This is useful for debugging; in previous releases it
 | 
						||
     was done with a compile-time option.
 | 
						||
 | 
						||
`-g NUMBER'
 | 
						||
     With glidepoint devices, emulate the specified button with tapping.
 | 
						||
     NUMBER must be `1', `2', or `3', and refers to the button number
 | 
						||
     _before_ the `-B' button remapping is performed.  This option
 | 
						||
     applies to the mman and ps2 decoding. No button is emulated by
 | 
						||
     default because the ps2 tapping is incompatible with some normal
 | 
						||
     ps2 mice
 | 
						||
 | 
						||
`-h'
 | 
						||
     Print a summary of command line options.
 | 
						||
 | 
						||
`-i INTERVAL'
 | 
						||
     Set INTERVAL to be used as an upper time limit for multiple
 | 
						||
     clicks. If the interval between button-up and button-down events
 | 
						||
     is less than LIMIT, the press is considered a double or triple
 | 
						||
     click. Time is in milliseconds.
 | 
						||
 | 
						||
`-k'
 | 
						||
     Kill a running gpm. This can be used by busmouse users to kill gpm
 | 
						||
     before running X (unless they use `-R' or the single-open
 | 
						||
     limitation is removed from the kernel).
 | 
						||
 | 
						||
`-l CHARSET'
 | 
						||
     Choose the `inword()' look up table. The CHARSET argument is a
 | 
						||
     list of characters. `-' is used to specify a range and `\ ' is
 | 
						||
     used to escape the next character or to provide octal codes.  Only
 | 
						||
     visible character can appear in CHARSET because control characters
 | 
						||
     can't appear in text-mode video memory, whence selection is cut.
 | 
						||
 | 
						||
`-m FILENAME'
 | 
						||
     Choose the mouse file to open. Must be before -t and -o.
 | 
						||
 | 
						||
`-M'
 | 
						||
     Enable multiple mode. The daemon will read two different mouse
 | 
						||
     devices.  Any subsequent option will refer to the second device,
 | 
						||
     while any preceding option will be used for the first device. This
 | 
						||
     option automatically forces the _repeater_ (`-R') option on.
 | 
						||
 | 
						||
`-o LIST-OF-EXTRA-OPTIONS'
 | 
						||
     The option works similary to the "-o" option of mount; it is used
 | 
						||
     to specify a list of "extra options" that are specific to each
 | 
						||
     mouse type. The list is comma-separated. The options `dtr', `rts'
 | 
						||
     or `both' are used by the serial initialization to toggle the
 | 
						||
     modem lines like, compatibly with earlier gpm versions; note
 | 
						||
     however that using -o dtr associated with non-plain-serial mouse
 | 
						||
     types may now generate an error. *Note Mouse Types::.  And by the
 | 
						||
     way, use -o after -m and after -t.
 | 
						||
 | 
						||
`-p'
 | 
						||
     Forces the pointer to be visible while selecting. This is the
 | 
						||
     behaviour of `selection-1.7', but it is sometimes confusing.  The
 | 
						||
     default is not to show the pointer, which can be confusing as well.
 | 
						||
 | 
						||
`-r NUMBER'
 | 
						||
     Set the responsiveness. A higher responsiveness is used for a
 | 
						||
     faster cursor motion.
 | 
						||
 | 
						||
`-R[NAME]'
 | 
						||
     Causes `gpm' to act as a repeater: any mouse data received while
 | 
						||
     in graphic mode will be produced on the fifo `/dev/gpmdata' in
 | 
						||
     protocol NAME, given as an optional argument (no space in between
 | 
						||
     !).  In principle, you can use the same names as for the `-t'
 | 
						||
     option, although repeating into some protocols may not be
 | 
						||
     implemented for a while.  *Note Mouse Types::.  In addition, you
 | 
						||
     can specify `raw' as the NAME, to repeat the mouse data byte by
 | 
						||
     byte, without any protocol translation.  If NAME is omitted, it
 | 
						||
     defaults to `msc'.  Using gpm in repeater mode, you can configure
 | 
						||
     the X server to use its fifo as a mouse device. This option is
 | 
						||
     useful for bus-mouse owners to override the single-open
 | 
						||
     limitation. It is also an easy way to manage those stupid
 | 
						||
     dual-mode mice which force you to keep the middle button down
 | 
						||
     while changing video mode. The option is forced on by the `-M'
 | 
						||
     option.
 | 
						||
 | 
						||
`-s NUMBER'
 | 
						||
     Set the sample rate for the mouse device.
 | 
						||
 | 
						||
`-S COMMANDS'
 | 
						||
     Enable special-command processing, and optionally specify custom
 | 
						||
     commands as a colon-separated list. See above for a detailed
 | 
						||
     description of special commands.
 | 
						||
 | 
						||
`-t NAME'
 | 
						||
     Set the mouse type. Use `-t help' to get a list of allowable
 | 
						||
     types. Since version 1.18.1, the list also shows which protocols
 | 
						||
     are available as repeaters (see -R above), by marking them with an
 | 
						||
     asterisk ("*").  *Note Mouse Types::.  Use -t after you selected
 | 
						||
     the mouse device with -m.
 | 
						||
 | 
						||
`-v'
 | 
						||
     Print version information and exit.
 | 
						||
 | 
						||
`-2'
 | 
						||
     Force two buttons. This means that the middle button, if any, will
 | 
						||
     be taken as it was the right one.
 | 
						||
 | 
						||
`-3'
 | 
						||
     Force three buttons. By default the mouse is considered to be a
 | 
						||
     2-buttons one, until the middle button is pressed. If three
 | 
						||
     buttons are there, the right one is used to extend the selection,
 | 
						||
     and the middle one is used to paste it.  Beware: if you use the
 | 
						||
     `-3' option with a 2-buttons mouse, you won't be able to paste the
 | 
						||
     selection.
 | 
						||
 | 
						||
 | 
						||
* Menu:
 | 
						||
 | 
						||
* Bugs and Problems::
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Bugs and Problems,  Next: Mouse Types,  Prev: Command Line,  Up: Server Invocation
 | 
						||
 | 
						||
2.3 Bugs and Problems
 | 
						||
=====================
 | 
						||
 | 
						||
The `gpm' server may have problems interacting with X: if your mouse is
 | 
						||
a single-open device (i.e. a bus mouse), you should kill `gpm' before
 | 
						||
starting X, or use the `-R' option (see above).  To kill `gpm' just
 | 
						||
invoke `gpm -k'. This problem doesn't apply to serial mice.
 | 
						||
 | 
						||
   Two instances of gpm can't run on the same system. If you have two
 | 
						||
mice use the `-M' option (see above).
 | 
						||
 | 
						||
   While the current console is in graphic mode, `gpm' sleeps until
 | 
						||
text mode is back (unless `-R' is used). Thus, it won't reply to
 | 
						||
clients. Anyways, it is unlikely that mouse-eager clients will spur out
 | 
						||
in hidden consoles.
 | 
						||
 | 
						||
   The clients shipped out with gpm are not updated, thus there are
 | 
						||
potential security risks when using them.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Mouse Types,  Prev: Bugs and Problems,  Up: Server Invocation
 | 
						||
 | 
						||
2.4 Mouse Types
 | 
						||
===============
 | 
						||
 | 
						||
This section of the gpm documentation manual describes the various
 | 
						||
pointer types currently available in gpm. If you look at the source
 | 
						||
code, you'll find that pointer-specific code is confined to `mice.c'
 | 
						||
(while it used to only include mouse decoders, gpm now supports tablets
 | 
						||
and touchscreens as well).
 | 
						||
 | 
						||
   The mouse type is specified on command line with the `-t' option.
 | 
						||
The option takes an argument, which represents the name of a mouse
 | 
						||
type. Each type can be associated to different names. For old mouse
 | 
						||
types, one name is the old selection-compatible name, and another is
 | 
						||
the XFree name. After version 1.18.1 of gpm, the number of synonyms was
 | 
						||
made arbitrary and the actual name being used is made available to the
 | 
						||
function responsible for mouse initialization. Therefore it is possible
 | 
						||
for a mouse decoder to behave slightly differently according to the
 | 
						||
name being used for the device (if this feature was already present, we
 | 
						||
wouldn't have for example ms+ and ms+lr as different mouse types).
 | 
						||
 | 
						||
   The initialization procedure of each mouse type can also receive
 | 
						||
extra option, by means of the -o command line option. Since
 | 
						||
interpretation of the option string is decoder-specific, the allowed
 | 
						||
options are described in association to each mouse type. When no
 | 
						||
description of option strings is provided, that means the option string
 | 
						||
is unused for that mouse type and specifying one generates an error.
 | 
						||
When the document refer to "standard serial options" it means that one
 | 
						||
of -o dtr, -o rts, -o both can be specified to toggle the control lines
 | 
						||
of the serial port.
 | 
						||
 | 
						||
   The following mouse type are corrently recognized:
 | 
						||
 | 
						||
`bare Microsoft'
 | 
						||
     The Microsoft protocol, without any extension. It only reports two
 | 
						||
     buttons. If your device has three, you should either try running
 | 
						||
     the mman decoder or msc. In the latter case, you need to tell the
 | 
						||
     mouse to talk msc protocol by toggling the DTR and RTS lines (with
 | 
						||
     one of -o drt, -o rts or -o both) or invoking `gpm -t msc' while
 | 
						||
     keeping the middle button pressed. Very annoying, indeed.  This
 | 
						||
     mouse decoder accepts standard serial options, although they
 | 
						||
     should not be needed.
 | 
						||
 | 
						||
`ms'
 | 
						||
     This is the original Microsoft protocol, with a middle-button
 | 
						||
     extension.  Some old two-button devices send some spurious packets
 | 
						||
     which can be misunderstood as middle-button events. If this is
 | 
						||
     your case, use the `bare' mouse type.  Some new two-button devices
 | 
						||
     are "plug and play", and they don't play fair at all; in this case
 | 
						||
     try -t pnp.  Many (most) three-button devices that use the
 | 
						||
     microsoft protocol fail to report some middle-button events during
 | 
						||
     mouse motion.  Since the protocol does not distinguish between the
 | 
						||
     middle button going up and the middle button going down it would
 | 
						||
     be liable to get out of step, so this decoder declares the middle
 | 
						||
     button to be up whenever the mouse moves. This prevents dragging
 | 
						||
     with the middle button, so you should probably use `-t ms+lr'
 | 
						||
     instead of this decoder, especially if you want to use X.  This
 | 
						||
     mouse decoder accepts standard serial options, although they
 | 
						||
     should not be needed.
 | 
						||
 | 
						||
`ms+'
 | 
						||
     This is the same as `-t ms' except that the middle button is not
 | 
						||
     reset during mouse motion. So you can drag with the middle button.
 | 
						||
     However, if your mouse exhibits the usual buggy behaviour the
 | 
						||
     decoder is likely to get out of step with reality, thinking the
 | 
						||
     middle button is up when it's down and vice versa.  You should
 | 
						||
     probably use `-t ms+lr' instead of this decoder.  This mouse
 | 
						||
     decoder accepts standard serial options, although they should not
 | 
						||
     be needed.
 | 
						||
 | 
						||
`ms+lr'
 | 
						||
     This is the same as `-t ms+' except that there is an additional
 | 
						||
     facility to reset the state of the middle button by pressing the
 | 
						||
     other two buttons together. Do this when the decoder gets into a
 | 
						||
     confused state where it thinks the middle button is up when it's
 | 
						||
     down and vice versa. (If you get sick of having to do this, please
 | 
						||
     don't blame gpm; blame your buggy mouse! Note that most
 | 
						||
     three-button mice that do the microsoft protocol can be made to do
 | 
						||
     the MouseSystems protocol instead. The "3 Button Serial Mouse
 | 
						||
     mini-HOWTO" has information about this.)  This mouse decoder
 | 
						||
     accepts standard serial options, although they should not be
 | 
						||
     needed.
 | 
						||
 | 
						||
`msc MouseSystems'
 | 
						||
     This is the standard protocol for three-button serial devices.
 | 
						||
     Some of such devices only enter MouseSystem mode if the RTS, DTR
 | 
						||
     or both lines are pushed low. Thus, you may try -t msc associated
 | 
						||
     with -o rts, -o dtr or -o both.
 | 
						||
 | 
						||
`mman Mouseman'
 | 
						||
     The protocol used by the new Logitech devices with three buttons.
 | 
						||
     It is backward compatible with the Microsoft protocol, so if your
 | 
						||
     mouse has three buttons and works with -t ms or similar decoders
 | 
						||
     you may try -t mman instead to use the middle button.  This mouse
 | 
						||
     decoder accepts standard serial options, although they should not
 | 
						||
     be needed.
 | 
						||
 | 
						||
`sun'
 | 
						||
     The protocol used on Sparc computers and a few others.  This mouse
 | 
						||
     decoder accepts standard serial options, although they should not
 | 
						||
     be needed.
 | 
						||
 | 
						||
`mm MMSeries'
 | 
						||
     Title says it all.  This mouse decoder accepts standard serial
 | 
						||
     options, although they should not be needed.
 | 
						||
 | 
						||
`logi Logitech'
 | 
						||
     This is the protocol used by old serial Logitech mice.
 | 
						||
 | 
						||
`bm BusMouse'
 | 
						||
     Some bus devices use this protocol, including those produced by
 | 
						||
     Logitech.
 | 
						||
 | 
						||
`ps2 PS/2'
 | 
						||
     The protocol used by most busmice.
 | 
						||
 | 
						||
`ncr'
 | 
						||
     This `type' is able to decode the pointing pen found on some
 | 
						||
     laptops (the NCR 3125 pen)
 | 
						||
 | 
						||
`wacom'
 | 
						||
     The protocol used by the Wacom tablet. Since version 1.18.1 we
 | 
						||
     have a new Wacom decoder, as the old one was not working with new
 | 
						||
     tablets. This decoder was tested with Ultrapad, PenPartner, and
 | 
						||
     Graphire tablets.  Options: -o relative (default) for relative
 | 
						||
     mode, -o absolute for absolute mode.
 | 
						||
 | 
						||
`genitizer'
 | 
						||
     The \"Genitizer\" tablet, in relative mode.  This mouse decoder
 | 
						||
     accepts standard serial options, although they should not be
 | 
						||
     needed.
 | 
						||
 | 
						||
`logim'
 | 
						||
     Used to turn Logitech mice into Mouse-Systems-Compatible.
 | 
						||
     Obviously, it only works with some of the Logitech mice.
 | 
						||
 | 
						||
`pnp'
 | 
						||
     This decoder works with the new mice produces by our friend Bill,
 | 
						||
     and maybe with the old ones as well. The Pnp protocol is hardwired
 | 
						||
     at 1200 baud and is upset by normal initialization, so this is a
 | 
						||
     -t bare decoder with no initialization at all.  This mouse decoder
 | 
						||
     accepts standard serial options, although they should not be
 | 
						||
     needed.
 | 
						||
 | 
						||
`ms3'
 | 
						||
     A decoder for the new serial IntelliMouse devices, the ones with
 | 
						||
     three buttons and a protocol incompatible with older ones. The
 | 
						||
     wheel is currently unused.
 | 
						||
 | 
						||
`imps2'
 | 
						||
     "IntelliMouse" on the ps/2 port. This type can also be used for a
 | 
						||
     generic 2-button ps/2 mouse too, since it will auto-detect the
 | 
						||
     type.
 | 
						||
 | 
						||
`netmouse'
 | 
						||
     Decodes the "Genius NetMouse" type of devices on the ps/2 port.
 | 
						||
     For serial "Netmouse" devices, use the "ms3" decoder.
 | 
						||
 | 
						||
`cal'
 | 
						||
     A decoder of the "Calcomp UltraSlate device.
 | 
						||
 | 
						||
`calr'
 | 
						||
     Same as above, but in relative mode.
 | 
						||
 | 
						||
`twid'
 | 
						||
     Support for the twiddler keyboard. As of gpm-1.14 this decoder
 | 
						||
     includes a char generator for the text console, but doesn't yet
 | 
						||
     support X keycodes. If used with `-R', `gpm' will anyway repeat
 | 
						||
     mouse events to the X server. More information about twiddler
 | 
						||
     support can be found in `README.twiddler', in the gpm distribution.
 | 
						||
 | 
						||
`syn synaptics'
 | 
						||
     A decoder for the Synaptics TouchPad connected to the serial port.
 | 
						||
     This mouse decoder accepts standard serial options, although they
 | 
						||
     should not be needed.
 | 
						||
 | 
						||
`synps2 synaptics_ps2'
 | 
						||
     Same as above, but for the devices attached to the ps2 port.
 | 
						||
 | 
						||
`brw'
 | 
						||
     A decoder for the Fellowes Browser, a device with 4 buttons and a
 | 
						||
     wheel.  This mouse decoder accepts standard serial options,
 | 
						||
     although they should not be needed.
 | 
						||
 | 
						||
`js Joystick'
 | 
						||
     This mouse type uses the joystick device to generate mouse events.
 | 
						||
     It is only available if the header `linux/joystick.h' is found at
 | 
						||
     compile time. The header (and the device as well) has been
 | 
						||
     introduced only during 2.1 development, and is not present in
 | 
						||
     version 2.0 of the kernel.
 | 
						||
 | 
						||
`summa'
 | 
						||
     This is a decode for the Symmagraphics of Genius tablet, run in
 | 
						||
     absolute mode. A repeater is associated to this decoder, so it can
 | 
						||
     -R summa can be used to generate X events even for other
 | 
						||
     absolute-pointing devices, like touchscreens. To use the repeated
 | 
						||
     data from X, you need a modified xf86Summa.o module.
 | 
						||
 | 
						||
`mtouch'
 | 
						||
     A decoder for the MicroTouch touch screen. Please refer to the
 | 
						||
     file `README.microtouch' in the source tree of gpm for further
 | 
						||
     information. In the near future, anyways, I plan to fold back to
 | 
						||
     this documentation the content of that file.
 | 
						||
 | 
						||
`gunze'
 | 
						||
     A decoder for the gunze touch screen. Please refer to the file
 | 
						||
     `README.gunze' in the source tree of gpm for further information.
 | 
						||
     In the near future, anyways, I plan to fold back to this
 | 
						||
     documentation the content of that file. The decoder accepts the
 | 
						||
     following options: smooth=, debounce=. An higher smoothness
 | 
						||
     results in slower motion as well; a smaller smoothness gives
 | 
						||
     faster motion but, obviously, less smooth.  The default smoothness
 | 
						||
     is 9. The debounce time is express in milliseconds and is the
 | 
						||
     minimum duration of an up-down event to be taken as a tap. Smaller
 | 
						||
     bounces are ignored.
 | 
						||
 | 
						||
`acecad'
 | 
						||
     The Acecad tablet in absolute mode.
 | 
						||
 | 
						||
`wp wizardpad'
 | 
						||
     Genius WizardPad tablet
 | 
						||
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Gpm Internals,  Next: The ClientLib,  Prev: Server Invocation,  Up: Top
 | 
						||
 | 
						||
3 Gpm Internals
 | 
						||
***************
 | 
						||
 | 
						||
The server is organized as a main loop built around a `select()' system
 | 
						||
call. It responds both to mouse events and to input from the clients,
 | 
						||
which are connected to the server through a unix domain socket. The
 | 
						||
connection is used to tell the server what a client is interested in,
 | 
						||
and to get mouse events.
 | 
						||
 | 
						||
   When no clients are connected to the active console, the server runs
 | 
						||
the selection mechanism (cut and paste of text).  The selection
 | 
						||
mechanism is a simple and well-designed application, whose behaviour
 | 
						||
can be cloned by clients, by telling the server to inherit the default
 | 
						||
response for certain mouse events (motion being the most interesting).
 | 
						||
 | 
						||
* Menu:
 | 
						||
 | 
						||
* Events::
 | 
						||
* Margins::
 | 
						||
* Event Types::
 | 
						||
* Connection Details::
 | 
						||
* Default Handlers::
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Events,  Next: Margins,  Prev: Gpm Internals,  Up: Gpm Internals
 | 
						||
 | 
						||
3.1 Events
 | 
						||
==========
 | 
						||
 | 
						||
Whenever the mouse generates an event, the event is dispatched to the
 | 
						||
active client for the current console, or to the default handler, if
 | 
						||
present.  Otherwise selection is run. A default handler is a client
 | 
						||
process which gets mouse events form all the virtual consoles.  *Note
 | 
						||
Default Handlers::.
 | 
						||
 | 
						||
   When a client is involved, it is handled a `Gpm_Event' structure,
 | 
						||
built by the server. The fields for `Gpm_Event' are the following: 
 | 
						||
 | 
						||
`unsigned char buttons;'
 | 
						||
     An or-mask of the values `GPM_B_LEFT', `GPM_B_MIDDLE' and
 | 
						||
     `GPM_B_RIGHT'. It corresponds to the state of the mouse buttons
 | 
						||
     when the event is reported. The current implementation of gpm
 | 
						||
     allows at most three buttons.
 | 
						||
 | 
						||
`unsigned char modifiers;'
 | 
						||
     The value of the kernel variable `shift_state', as of
 | 
						||
     `keyboard.c', when the event is reported. It is a bitmask value,
 | 
						||
     and corresponds to the least significant byte of the value used by
 | 
						||
     the `loadkeys' program. Use of symbolic names in source code is
 | 
						||
     available after inclusion of `linux/keyboard.h', as exemplified in
 | 
						||
     `mev.c'.
 | 
						||
 | 
						||
`unsigned short vc;'
 | 
						||
     The number of the active virtual console when the event is
 | 
						||
     reported. The client is not expected to use this value, which
 | 
						||
     corresponds to the controlling terminal of the client process,
 | 
						||
     unless it gets events form multiple consoles.  *Note Default
 | 
						||
     Handlers::.
 | 
						||
 | 
						||
`short x, y;'
 | 
						||
     The position of the mouse pointer where the event is reported. It
 | 
						||
     is 1-based by default, to be compatible with `selection' and
 | 
						||
     `libcurses'.  This behavior can be overriden, though, by setting
 | 
						||
     the library variable `gpm_zerobased'.  *Note Variables::.
 | 
						||
 | 
						||
`short dx, dy;'
 | 
						||
     The change in position since the last reported event.
 | 
						||
 | 
						||
`enum Gpm_Etype type;'
 | 
						||
     A bit-mask, representing the type of reported event, as described
 | 
						||
     later.  *Note Event Types::.
 | 
						||
 | 
						||
`int clicks;'
 | 
						||
     A counter, which is valid at button-down, drag or button-up. It
 | 
						||
     can be 0, 1 or 2 to mean single, double or triple click.
 | 
						||
 | 
						||
`enum Gpm_Margin margin;'
 | 
						||
     A bit-mask, telling if the pointer has gone out of the visible
 | 
						||
     screen. The indivudual bits are named `GPM_TOP', `GPM_BOT',
 | 
						||
     `GPM_LFT', `GPM_RGT'. Only one of them is active at a time, to
 | 
						||
     allow using `switch' on the value. Vertical outrun takes
 | 
						||
     precedence on horizontal outrun.  *Note Margins::.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Margins,  Next: Event Types,  Prev: Events,  Up: Gpm Internals
 | 
						||
 | 
						||
3.2 How margins are managed
 | 
						||
===========================
 | 
						||
 | 
						||
Motion and button-press events are constrained to remain within the
 | 
						||
visible screen. This means that the `x' will be within 1 and 80 and `y'
 | 
						||
will be within 1 and 25 when the console is 80x25 cells. However, a
 | 
						||
client can keep track of movements outside the screen, by using the
 | 
						||
`dx' and `dy' fields, which aren't subject to clipping.
 | 
						||
 | 
						||
   The server helps applications in detecting margin conditions by
 | 
						||
filling the `margin' field. Whenever the pointer tries to cross screen
 | 
						||
boundaries, it is forced to remain on the border, but a flag is set in
 | 
						||
`margin'.
 | 
						||
 | 
						||
   A different policy is in force for drag and button-release events.
 | 
						||
In this case the pointer is allowed to go outside the physical screen
 | 
						||
by exactly one position. This allows, for example, selecting to end of
 | 
						||
line by dragging down-left. The peculiar situation is nonetheless
 | 
						||
signaled through the `margin' flags. The client should be careful to
 | 
						||
fit the values within the screen if needed.  *Note Utility Functions::.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Event Types,  Next: Connection Details,  Prev: Margins,  Up: Gpm Internals
 | 
						||
 | 
						||
3.3 Event Types
 | 
						||
===============
 | 
						||
 | 
						||
The `type' field in `Gpm_Event' is made up of bit-wide flags. The
 | 
						||
existing bit masks belong to two groups: bare events and cooked events.
 | 
						||
The bit-mask `GPM_BARE_EVENTS' is provided to extract bare events, by
 | 
						||
and-ing (`&') it with the `type' field.  For any event, exactly one bit
 | 
						||
will be set in the resulting bitmask.
 | 
						||
 | 
						||
   Bare events are the following:
 | 
						||
 | 
						||
`GPM_MOVE'
 | 
						||
     A motion event, with all buttons up.
 | 
						||
 | 
						||
`GPM_DRAG'
 | 
						||
     A motion event, but one or more buttons are kept pressed.
 | 
						||
 | 
						||
`GPM_DOWN'
 | 
						||
     A button press event. The `buttons' field will report which
 | 
						||
     buttons are pressed after the event.
 | 
						||
 | 
						||
`GPM_UP'
 | 
						||
     A button release event. The `buttons' field will report which
 | 
						||
     buttons are being released. Note that this is different from the
 | 
						||
     previous case.
 | 
						||
 | 
						||
`GPM_ENTER'
 | 
						||
     This means "enter in the current Region of Interest", and such
 | 
						||
     event can only happen if the high-level library is used.  When the
 | 
						||
     type is `GPM_ENTER', all the other fields are undefined.  *Note
 | 
						||
     High Level Lib::.
 | 
						||
 | 
						||
`GPM_LEAVE'
 | 
						||
     This is only delivered by the high level library, too. Events of
 | 
						||
     type `GPM_LEAVE' have all other fields undefined.
 | 
						||
 | 
						||
   Cooked events are the following:
 | 
						||
 | 
						||
`GPM_SINGLE'
 | 
						||
     This bit may be set at button-press, drag and button release
 | 
						||
     events, and can be used to identify a single press. The time
 | 
						||
     interval used to choose a double click from two single clicks is
 | 
						||
     set by a parameter in the daemon (configurable at daemon
 | 
						||
     invocation).
 | 
						||
 | 
						||
`GPM_DOUBLE'
 | 
						||
     Used to identify a double click (press, drag, release)
 | 
						||
 | 
						||
`GPM_TRIPLE'
 | 
						||
     Used to identify a triple click (press, drag, release)
 | 
						||
 | 
						||
`GPM_MFLAG'
 | 
						||
     The "motion flag" is true if some dragging happened between
 | 
						||
     button-press and button-release. It can be used by those
 | 
						||
     applications which respond to events at button release.  It is
 | 
						||
     available at drag and release.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Connection Details,  Next: Default Handlers,  Prev: Event Types,  Up: Gpm Internals
 | 
						||
 | 
						||
3.4 Connection Details
 | 
						||
======================
 | 
						||
 | 
						||
Each virtual console has a stack of clients attached to it. They talk to
 | 
						||
gpm by writing to a control socket and get mouse events by reading it.
 | 
						||
All the clients in the stack can receive events. Gpm-1.10 and earlier
 | 
						||
only sent events to the top client, but sometimes users play with
 | 
						||
multiple programs using suspend-resume (thanks Ian).
 | 
						||
 | 
						||
   In addition to the per-console stacks, another stack is there to
 | 
						||
store default-handling clients.  *Note Default Handlers::.
 | 
						||
 | 
						||
   Each client registers with the server and tells which events it is
 | 
						||
interested in. Events not managed by the client can be handled by the
 | 
						||
selection mechanism, which is compiled in the server itself. This
 | 
						||
approach simplifies writing clients which respond only to button
 | 
						||
press/release events, because highlighting the mouse pointer can be
 | 
						||
performed by the server. A default handler in turn can respond only to
 | 
						||
mouse events associated with modifier keys, so that selection is used
 | 
						||
for any mouse-only event.
 | 
						||
 | 
						||
   Clients are required to fill a `Gpm_Connect' structure and pass it
 | 
						||
to the server. The structure is made up by four `unsigned int' fields.
 | 
						||
*Note Open and Close::.  
 | 
						||
 | 
						||
`eventMask'
 | 
						||
     A bitmask of the events the client wants to receive. Both bare and
 | 
						||
     cooked events are allowed to appear in the mask.
 | 
						||
 | 
						||
`defaultMask'
 | 
						||
     A mask to tell which events allow a default treatment (the
 | 
						||
     selection one). These are mouse events, independent of the
 | 
						||
     modifier keys.
 | 
						||
 | 
						||
`minMod'
 | 
						||
     The minimum amount of modifiers required by the client. This field
 | 
						||
     is used for default-handlers which manage control-mouse events
 | 
						||
     without interfering with mouse-only ones.  *Note Default
 | 
						||
     Handlers::.
 | 
						||
 | 
						||
`maxMod'
 | 
						||
     The maximum amount of modifiers the client is willing to receive.
 | 
						||
     Events featuring a modifier key not included in `maxMod' won't be
 | 
						||
     passed to the client.
 | 
						||
   Two more fields are there to tell about the connection itself, and
 | 
						||
you're not asked to fill them, because `Gpm_Open' will do it for you.
 | 
						||
 | 
						||
`int pid'
 | 
						||
     The process id of the connecting application.
 | 
						||
 | 
						||
`int vc'
 | 
						||
     Which virtual console to gain control of.
 | 
						||
 | 
						||
   Keyboard modifiers are used to multiplex clients on the same virtual
 | 
						||
console. You (as a programmer) don't need to care about the internal
 | 
						||
workings.  They are detailed in *note Default Handlers::, but you only
 | 
						||
need to choose the right values for your application.
 | 
						||
 | 
						||
   Examples:
 | 
						||
`minMod=0; maxMod=0;'
 | 
						||
     specifies a client which senses mouse-only events, but neither
 | 
						||
     shift-mouse nor alt-mouse nor control-mouse.
 | 
						||
 | 
						||
`minMod=0; maxMod=~0;'
 | 
						||
     is a client which gets any mouse event.
 | 
						||
 | 
						||
`minMod=1<<KG_SHIFT; maxMod=1<<KG_SHIFT;'
 | 
						||
     is a client which senses all shift-mouse events and nothing more.
 | 
						||
 | 
						||
`minMod=1<<KG_SHIFT; maxMod=~0;'
 | 
						||
     is a client interested in shift-and-whatever-else mouse events,
 | 
						||
     but disregarding mouse-only events.
 | 
						||
 | 
						||
   If the modifier keys in the event are too few or too many, the event
 | 
						||
won't be reported to the client. If the modifiers are right but the
 | 
						||
current event is not part of the `eventMask', it is not reported as
 | 
						||
well. If the event is not used by the client, it can nonetheless be
 | 
						||
passed to another client (a default handler or the internal selection
 | 
						||
mechanism), according to the `defaultMask'.  If the event has been
 | 
						||
already reported to the current application, it will also be passed
 | 
						||
along the chain, if the GPM_HARD bit is set the `defaultMask'.
 | 
						||
 | 
						||
   Good values for `defaultMask' can thus be the following:
 | 
						||
 | 
						||
`0'
 | 
						||
     To sink any event, even those I don't use.
 | 
						||
 | 
						||
`~eventMask'
 | 
						||
     Pass along any event I don't use.
 | 
						||
 | 
						||
`~GPM_HARD'
 | 
						||
     Just the same, independently of `eventMask'.
 | 
						||
 | 
						||
`GPM_MOVE|GPM_HARD'
 | 
						||
     Pass motion events, even if I use them.  This is the good choice
 | 
						||
     for an application which wants information on mouse motion, but
 | 
						||
     leaves the task of cursor-drawing to the server.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Default Handlers,  Prev: Connection Details,  Up: Gpm Internals
 | 
						||
 | 
						||
3.5 Default Handlers
 | 
						||
====================
 | 
						||
 | 
						||
In addition to console-specific clients, `gpm' allows for
 | 
						||
console-independent clients - those clients which handle events ignored
 | 
						||
by conventional clients
 | 
						||
 | 
						||
   Keyboard modifiers are used to multiplex the different clients on the
 | 
						||
same console, and a default handler should specify a non-zero minimum
 | 
						||
modifier set.
 | 
						||
 | 
						||
   To summarize, events which get to the server can be delivered to the
 | 
						||
following _clients_, in the order of decreasing priority:
 | 
						||
 | 
						||
  1. The current client for the current console, if any.
 | 
						||
 | 
						||
  2. The default handler, if any.
 | 
						||
 | 
						||
  3. The builtin `selection' mechanism.
 | 
						||
 | 
						||
   A keyboard modifier which connected with a `minMod' equal to the
 | 
						||
"Control" modifier and a `maxMod' of `~0' (all bits on), will then get
 | 
						||
any event including the control key, if the application disregards it.
 | 
						||
 | 
						||
   This means that if the foreground application gets only the "Meta"
 | 
						||
key, control-mouse is sufficient to invoke the default handler. If the
 | 
						||
application gets control-mouse but disregards "Meta", conversely,
 | 
						||
meta-control-mouse will invoke the default handler, and meta-mouse will
 | 
						||
be delivered to selection.
 | 
						||
 | 
						||
   Both the `minMod' and `maxMod' fields are bitmasks, and their values
 | 
						||
are bitwise or-ed and and-ed with the current modifier mask.
 | 
						||
 | 
						||
   `gpm-root' is an example of default handler. It gets control-mouse
 | 
						||
events by default, and reads user-specific configuration files in order
 | 
						||
to draw menus on the background of your screen.  *Note gpm-root::.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: The ClientLib,  Next: Demo Clients,  Prev: Gpm Internals,  Up: Top
 | 
						||
 | 
						||
4 The Client Library
 | 
						||
********************
 | 
						||
 | 
						||
The `libgpm.a' archive is meant to provide the mouse protocol at
 | 
						||
different levels of abstraction. Applications linking to the `gpm'
 | 
						||
server are expected to benefit from using the library, as compared to
 | 
						||
managing the raw socket interface. Any source file using the library
 | 
						||
should include `gpm.h' to get gpm specific macros and prototypes.
 | 
						||
 | 
						||
   Delivery of events within the library makes heavy use of the concept
 | 
						||
of "Handling Function" (or "handler", for short).
 | 
						||
 | 
						||
* Menu:
 | 
						||
 | 
						||
* Handling Functions::
 | 
						||
* Low Level Library::
 | 
						||
* High Level Lib::
 | 
						||
* Xterm::
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Handling Functions,  Next: Low Level Library,  Prev: The ClientLib,  Up: The ClientLib
 | 
						||
 | 
						||
4.1 Handling Functions
 | 
						||
======================
 | 
						||
 | 
						||
A mouse handler is a function which registers itself within the
 | 
						||
library, and is called whenever a mouse event is reported to the
 | 
						||
application. It is passed two arguments and returns an integer value,
 | 
						||
according to the following typedef:
 | 
						||
 | 
						||
   `typedef int Gpm_Handler(Gpm_Event *EVENT, void *CLIENTDATA);' 
 | 
						||
 | 
						||
   The EVENT is used to instantiate the mouse event just received, and
 | 
						||
the CLIENTDATA pointer is needed to implement some higher level
 | 
						||
functionality. An handler will be typically invoked by `Gpm_Getc', or
 | 
						||
by the high-level library, and the following discussion assumes the
 | 
						||
invoking function is `Gpm_Getc' (the high-level library only runs on
 | 
						||
behalf of `Gpm_Getc').
 | 
						||
 | 
						||
   Handling functions can do whatever they want to, and return to the
 | 
						||
caller an integer value, which can be used to generate a keyboard
 | 
						||
event. This feature is useful in that often the mouse is a shortcut for
 | 
						||
something which could be made by means of the keyboard.
 | 
						||
 | 
						||
   The application main loop can detect if the keyboard event is a
 | 
						||
physical or generated one by looking at the global variable
 | 
						||
`gpm_hflag', which is not zero only for handler-generated events.
 | 
						||
 | 
						||
   An handling function can generate more than one key in response of a
 | 
						||
single mouse event. If it sets the global variable `gpm_morekeys' to a
 | 
						||
non-zero variable before returning, it will be invoked again without
 | 
						||
waiting for mouse events. You can use `gpm_morekeys' as a counter of how
 | 
						||
many times you want to be called again - the client library only
 | 
						||
compares it to zero.
 | 
						||
 | 
						||
   The return value from an handler is used as follows:
 | 
						||
 | 
						||
`EOF'
 | 
						||
     This value is used to signal a fatal error, and will cause
 | 
						||
     `Gpm_Getc' to return the same value to the caller, after setting
 | 
						||
     `gpm_hflag' to 1.
 | 
						||
 | 
						||
`0'
 | 
						||
     A zero return value means that `Gpm_Getc' should go on as before,
 | 
						||
     without returning to the caller. The event has been eaten by the
 | 
						||
     handler and no key-press is simulated.
 | 
						||
 | 
						||
`ANYTHING-ELSE'
 | 
						||
     Any other value is considered a simulated character, and is
 | 
						||
     returned to the caller after setting `gpm_hflag'.  This allows a
 | 
						||
     quick way to implement yes/no boxes and simple menus without
 | 
						||
     interfering with the main body of an existing application.
 | 
						||
     Moreover, if return values greater than 255 are used a single
 | 
						||
     switch loop can parse both keyboard and mouse events.
 | 
						||
 | 
						||
A mouse handler is passed as second argument the content of the
 | 
						||
`gpm_data' variable, i.e. the current clientdata. The clientdata is
 | 
						||
almost unuseful unless you use the high-level library, because it holds
 | 
						||
a static value. Delivering the clientdata however allows the high-level
 | 
						||
management of mouse events to be a superset of the low-level code,
 | 
						||
rather than an incompatible alternative.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Low Level Library,  Next: High Level Lib,  Prev: Handling Functions,  Up: The ClientLib
 | 
						||
 | 
						||
4.2 Low Level Library
 | 
						||
=====================
 | 
						||
 | 
						||
The library offers utility functions to establish the connection and to
 | 
						||
get mouse events. They are designed to work painlessly if the server is
 | 
						||
not running on the host machine. Xterm support is available as well.
 | 
						||
*Note Xterm::.
 | 
						||
 | 
						||
* Menu:
 | 
						||
 | 
						||
* Variables ::
 | 
						||
* Open and Close::
 | 
						||
* Getting Events::
 | 
						||
* Utility Functions::
 | 
						||
* Extra Functions::
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Variables,  Next: Open and Close,  Prev: Low Level Library,  Up: Low Level Library
 | 
						||
 | 
						||
4.2.1 Global Variables
 | 
						||
----------------------
 | 
						||
 | 
						||
This is the list of all the global variables present in the client
 | 
						||
library:
 | 
						||
 | 
						||
`int gpm_flag'
 | 
						||
     Initially zero, it is used to tell if the process is connected
 | 
						||
     with a mouse server or not. It is used as a counter to manage
 | 
						||
     multiple opens as well.  
 | 
						||
 | 
						||
`int gpm_tried'
 | 
						||
     A flag, used to avoid retrying a connection if the server is not
 | 
						||
     available on the system.  
 | 
						||
 | 
						||
`int gpm_fd'
 | 
						||
     Initially `-1', it is the file descriptor used to talk with the
 | 
						||
     server. If we run under xterm, it will be -2.  
 | 
						||
 | 
						||
`int gpm_zerobased'
 | 
						||
     Since selection and curses has always been one-based, this
 | 
						||
     variable, zero by default, can be used to trigger zero-based
 | 
						||
     coordinates in event reporting. It must be set before opening the
 | 
						||
     mouse connection, and never changed later.  *Note Events::.  
 | 
						||
 | 
						||
`int gpm_visiblepointer'
 | 
						||
     If not zero, causes the mouse cursor to be always visible on the
 | 
						||
     window. It is zero by default.  
 | 
						||
 | 
						||
`gpm_mx'
 | 
						||
`gpm_my'
 | 
						||
     These variables (max X and max Y) are used when fitting events
 | 
						||
     inside the screen.  They are initialized by `Gpm_Open', and
 | 
						||
     updated by a `SIGWINCH' handler internal to the library.  (Don't
 | 
						||
     worry, the library doesn't _replace_ any `SIGWINCH' handler your
 | 
						||
     program may already have installed; instead the library _hooks_
 | 
						||
     the signal, that is, it calls any preexisting handler after taking
 | 
						||
     care of its own needs.)  
 | 
						||
 | 
						||
`int gpm_hflag'
 | 
						||
     Used to signal if a character has been generated by a mouse
 | 
						||
     handler.  *Note Handling Functions::.  
 | 
						||
 | 
						||
`Gpm_Handler *gpm_handler; void *gpm_data'
 | 
						||
     Both initially `NULL', they're used to setup asynchronous mouse
 | 
						||
     handling, as described below under the `Gpm_Getc()' item.  
 | 
						||
 | 
						||
`gpm_morekeys'
 | 
						||
     Used by the mouse handler to provide more than one key: if
 | 
						||
     `gpm_morekeys' is not zero, `Gpm_Getc' will invoke the handler
 | 
						||
     without waiting for events. `gpm_morekeys' is never set by the
 | 
						||
     mouse library.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Open and Close,  Next: Getting Events,  Prev: Variables,  Up: Low Level Library
 | 
						||
 | 
						||
4.2.2 Connecting and Disconnecting
 | 
						||
----------------------------------
 | 
						||
 | 
						||
 -- Function: int Gpm_Open (Gpm_Connect *CONN, int FLAG);
 | 
						||
     Open a connection with the server.  The CONN parameter points to
 | 
						||
     the connection information for the being-created connection, as
 | 
						||
     already described.  *Note Connection Details::.  It is passed to
 | 
						||
     the server after filling the `pid' and `vc' fields.
 | 
						||
 | 
						||
     FLAG should be `0' for normal applications, those interested in
 | 
						||
     events related to their own console. The own console is considered
 | 
						||
     to be the one attached to `stdin', and it must match the string
 | 
						||
     `/dev/tty*'. A negative value for FLAG is used to make the
 | 
						||
     invoking application a default handler *note Default Handlers::,
 | 
						||
     while a positive value is used to force connection to a particular
 | 
						||
     console, either for debugging issues or whenever `stdin' is not a
 | 
						||
     tty when `Gpm_Open' is invoked.
 | 
						||
 | 
						||
     Multiple opens are allowed, and a stack of `Gpm_Connect' structures
 | 
						||
     is managed by the library. You can, thus, re-open the connection in
 | 
						||
     order to temporarily change the range of events you're interested
 | 
						||
     in. When you invoke an external program, for example, you should
 | 
						||
     re-open the connection with `eventMask' zeroed, and `defaultMask',
 | 
						||
     `minMod' and `maxMod' all equal to `~0'.
 | 
						||
 | 
						||
     The return value is either `-1' or the file descriptor used to
 | 
						||
     communicate with the server. When run under xterm, a gpm client
 | 
						||
     gets event through `stdin', and the return value for `Gpm_Open()'
 | 
						||
     will be `-2'.  This value is always available in `gpm_fd'.
 | 
						||
 | 
						||
 -- Function: int Gpm_Close (void);
 | 
						||
     Pops the connection stack. It is used to restore the previous
 | 
						||
     situation after a change in the connection masks. Closes the
 | 
						||
     actual connection when the stack gets empty. On last close it
 | 
						||
     returns 0, -1 otherwise.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Getting Events,  Next: Utility Functions,  Prev: Open and Close,  Up: Low Level Library
 | 
						||
 | 
						||
4.2.3 Getting Events
 | 
						||
--------------------
 | 
						||
 | 
						||
 -- Function: int Gpm_GetEvent (Gpm_Event *EVENT);
 | 
						||
     Reads an event form `gpm_fd'. It should be called only when the
 | 
						||
     `gpm_fd' descriptor is reported as readable by a `select()' system
 | 
						||
     call, or it will block until an event arrives (unless you put the
 | 
						||
     mouse file in non-blocking mode). It returns 1 on success, -1 on
 | 
						||
     failure, and 0 after closing the connection. Failure can happen if
 | 
						||
     a signal interrupted the read system call. This function doesn't
 | 
						||
     work with xterm mouse reporting and is meant for internal use by
 | 
						||
     the library.
 | 
						||
 | 
						||
 -- Function: int Gpm_CharsQueued (void);
 | 
						||
     It returns the number of characters (contained in `nbprevchar'
 | 
						||
     index) queued into the array `prevchar' by function `Gpm_Getc'.
 | 
						||
     This call is useful i.e. in recognition of function or arrow keys,
 | 
						||
     when we need to know the next character read by `Gpm_getc' in
 | 
						||
     order to subsequently get it.
 | 
						||
 | 
						||
 -- Function: int Gpm_CharsQueued (void);
 | 
						||
     It returns the number of characters (contained in `nbprevchar'
 | 
						||
     index) queued into the array `prevchar' by function `Gpm_Getc'.
 | 
						||
     This call is useful i.e. in recognition of function or arrow keys,
 | 
						||
     when we need to know the next character read by `Gpm_getc' in
 | 
						||
     order to subsequently get it.
 | 
						||
 | 
						||
 -- Function: int Gpm_Getc (FILE *F);
 | 
						||
 -- Function: int Gpm_Getchar (void);
 | 
						||
     These are intended to be replacements for `getc()' and `getchar()'
 | 
						||
     to be used by applications which are interested in the mouse.
 | 
						||
     Their external behaviour is the same as `getc()', but a mouse
 | 
						||
     handler gets invoked whenever an event is available.  *Note
 | 
						||
     Handling Functions::.  A mouse handler can force `Gpm_Getc' to
 | 
						||
     return a specific value to the caller, and the "simulated"
 | 
						||
     character is signaled by setting `gpm_hflag' to 1.
 | 
						||
 | 
						||
 -- Function: int Gpm_Wgetch (WINDOW *WIN);
 | 
						||
 -- Function: int Gpm_Getch (void);
 | 
						||
     These are intended to be replacements for `wgetch()' and `getch()'
 | 
						||
     to be used by applications which are interested in the mouse. They
 | 
						||
     are the curses equivalent of `Gpm_Getchar'.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Utility Functions,  Next: Extra Functions,  Prev: Getting Events,  Up: Low Level Library
 | 
						||
 | 
						||
4.2.4 Utility Functions
 | 
						||
-----------------------
 | 
						||
 | 
						||
 -- Function: int Gpm_Repeat (int MILLISECS);
 | 
						||
     It returns 1 if no mouse events arrive in the next MILLICECS
 | 
						||
     milliseconds, 0 otherwise. It is meant to be used by those handlers
 | 
						||
     which need to repeat an action as long as the mouse button is
 | 
						||
     pressed (`while(Gpm_Repeat(200))...').
 | 
						||
 | 
						||
 -- Function: int Gpm_DrawPointer (int X, int Y, int FD);
 | 
						||
 -- Function: int GPM_DRAWPOINTER (Gpm_Event *EPTR;)
 | 
						||
     These are actually macros. They should be used to draw the mouse
 | 
						||
     pointer after mangling the screen (while dragging on a menu, say),
 | 
						||
     because letting it to the server won't work nicely, due to lack of
 | 
						||
     synchronism between client and server. The file descriptor should
 | 
						||
     refer to the console. The return value is 0 on success and -1 on
 | 
						||
     failure. `Gpm_DrawPointer' is obsolete, and is retained only for
 | 
						||
     compatibility.
 | 
						||
 | 
						||
 -- Function: int Gpm_FitValuesM (int *X, int *Y, int MARGIN);
 | 
						||
 -- Function: int Gpm_FitValues (X,Y);
 | 
						||
 -- Function: void Gpm_FitEvent (EPTR);
 | 
						||
     The first is a function, while the other are macros.  Note that
 | 
						||
     `Gpm_FitEvent' does not return values.  These three procedures
 | 
						||
     should be used to fit the pointer inside the visible screen. They
 | 
						||
     are needed for drag and release event. A connection bit will be
 | 
						||
     available in the future to force the pointer in the visible region.
 | 
						||
 | 
						||
     Note that fitting uses `gpm_mx' and `gpm_my'.  *Note Variables::.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Extra Functions,  Prev: Utility Functions,  Up: Low Level Library
 | 
						||
 | 
						||
4.2.5 Extra Functions
 | 
						||
---------------------
 | 
						||
 | 
						||
 -- Function: char* Gpm_GetLibVersion (int *WHERE);
 | 
						||
     This function returns a pointer to a static storage representing
 | 
						||
     the version number of the library. It is only available from
 | 
						||
     0.98.2 onward, and returns a string like `"0.98.2"'. The third
 | 
						||
     number is optional, and the second number will always be reported
 | 
						||
     as two digits; thus 1.10 is newer than 1.01. The WHERE pointer, if
 | 
						||
     not null, is used to store a decimal number representing the
 | 
						||
     version - 0.98.2 is 9802 and 1.1.8 is 10108.
 | 
						||
 | 
						||
 -- Function: char* Gpm_GetServerVersion (int *WHERE);
 | 
						||
     This function returns a pointer to a static storage representing
 | 
						||
     the version number of the server. The version is retrieved through
 | 
						||
     `popen()', so it could fail (and return `NULL')if no `gpm' program
 | 
						||
     is in the current path. Alternatively, it could fail (and return a
 | 
						||
     wrong value) if the `gpm' in the path is not the currently running
 | 
						||
     one.  The function is only available in the clientlibrary version
 | 
						||
     0.98.2 or newer, but it works with any daemon, from 0.01 onward.
 | 
						||
     The string returned can be parsed in the same way as for
 | 
						||
     `Gpm_GetLibVersion()'. A preparsed version is stored in *WHERE if
 | 
						||
     WHERE is not null. Both these functions do their calculations only
 | 
						||
     the first time they are invoked.
 | 
						||
 | 
						||
 -- Function: int Gpm_GetSnapshot (Gpm_Event *EPTR);
 | 
						||
     This function gives a non-blocking snapshot of the current
 | 
						||
     situation: it returns the number of mouse buttons, as known to the
 | 
						||
     server, or -1 if that information is not available (under Xterm,
 | 
						||
     or before connecting).  If EPTR is not null, it is filled with
 | 
						||
     information about the current state of the mouse. The fields have
 | 
						||
     the following meaning: `x,y': current position of the cursor;
 | 
						||
     `dx,dy' size of the window; `vc,modifiers' the current console and
 | 
						||
     the current shift state; `buttons' which buttons are currently
 | 
						||
     help down; `clicks' the number of clicks (0,1,2).  This function
 | 
						||
     is only available from 0.98.2 onward, and will return -1 if run
 | 
						||
     with an older server.
 | 
						||
 | 
						||
     Since this information travels on the same file descriptor as the
 | 
						||
     events, and applications usually don't want to lose events, the
 | 
						||
     function returns 0 if the input queue is not empty.
 | 
						||
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: High Level Lib,  Next: Xterm,  Prev: Low Level Library,  Up: The ClientLib
 | 
						||
 | 
						||
4.3 High Level Library
 | 
						||
======================
 | 
						||
 | 
						||
The high level library is part of the main `libgpm.a', but it acts at a
 | 
						||
different level of abstraction. The high level library depends in the
 | 
						||
low-level one, so if you link your application with any object of the
 | 
						||
high-level library, you're forced to link in the low-level one too.
 | 
						||
 | 
						||
   If your application _only_ runs under xterm, please see `gpm-xterm'
 | 
						||
in the `sample' subdirectory of the distribution, which offers all the
 | 
						||
needed functionality.
 | 
						||
 | 
						||
   The main role of the high-level library is to define a way to manage
 | 
						||
windows (or "Regions of Interest" on your text screen). The regions are
 | 
						||
arranged in a stack, and event are delivered to the different windows
 | 
						||
according to their position both on the stack and on the screen.  *Note
 | 
						||
hltest::.
 | 
						||
 | 
						||
* Menu:
 | 
						||
 | 
						||
* Concepts::
 | 
						||
* hl-Variables::
 | 
						||
* hl-Functions::
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Concepts,  Next: hl-Variables,  Prev: High Level Lib,  Up: High Level Lib
 | 
						||
 | 
						||
4.3.1 Concepts
 | 
						||
--------------
 | 
						||
 | 
						||
The high-level library is completely independent of the low-level one,
 | 
						||
so it uses `gpm_handler' and `gpm_data' as connection point with
 | 
						||
`Gpm_Getc()'.
 | 
						||
 | 
						||
   All the functionality is based on the concept of RoI's. each RoI is
 | 
						||
described by a `Gpm_Roi' structure, which is made up by the following
 | 
						||
fields: 
 | 
						||
 | 
						||
`short xMin, xMax'
 | 
						||
     These numbers identify the upper-left corner of the region.  When
 | 
						||
     events are reported to the region, the event coordinate will be
 | 
						||
     relative to this position (zero-based).
 | 
						||
 | 
						||
`short yMin, yMax'
 | 
						||
     These numbers identify the lower-right corner of the region.
 | 
						||
 | 
						||
`unsigned short minMod, maxMod'
 | 
						||
     These modifier masks have the same role within the application as
 | 
						||
     the same fields have in inter-application multiplexing.
 | 
						||
 | 
						||
`unsigned short eventMask'
 | 
						||
     It is the mask of events which are to be reported to the current
 | 
						||
     region.
 | 
						||
 | 
						||
`unsigned short owned'
 | 
						||
     This is a bit, used to know if the region is owned by the library
 | 
						||
     or the application, in order to issue `free(0' when needed.
 | 
						||
 | 
						||
`Gpm_Handler *handler'
 | 
						||
     The function to be called when events are to be reported to the
 | 
						||
     current region.
 | 
						||
 | 
						||
`void *clientdata'
 | 
						||
     The clientdata to be passed to the handler
 | 
						||
 | 
						||
`Gpm_Roi *next, *prev'
 | 
						||
     Links to the RoI chain.
 | 
						||
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: hl-Variables,  Next: hl-Functions,  Prev: Concepts,  Up: High Level Lib
 | 
						||
 | 
						||
4.3.2 Variables
 | 
						||
---------------
 | 
						||
 | 
						||
`Gpm_Roi* gpm_roi'
 | 
						||
     The linked list of regions (pointer to the top one).  
 | 
						||
 | 
						||
`Gpm_Roi* gpm_current_roi'
 | 
						||
     The region which got the last event (used to generate enter and
 | 
						||
     leave events).  
 | 
						||
 | 
						||
`Gpm_Handler* gpm_roi_handler'
 | 
						||
     This variable is meant to be set by the user. It is the catch-all
 | 
						||
     region of interest, which will be called for any mouse event not
 | 
						||
     falling within any registered region. If NULL, the event will be
 | 
						||
     discarded.  
 | 
						||
 | 
						||
`void* gpm_roi_data'
 | 
						||
     the client data to be passed to `gpm_roi_handler'.  
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: hl-Functions,  Prev: hl-Variables,  Up: High Level Lib
 | 
						||
 | 
						||
4.3.3 Functions
 | 
						||
---------------
 | 
						||
 | 
						||
 -- Function: Gpm_Roi* Gpm_PushRoi (int XMIN, int YMIN, int XMAX, int
 | 
						||
          YMAX,
 | 
						||
     int MASK, Gpm_Handler *FUN, void *XTRADATA);
 | 
						||
 | 
						||
     This function pushes a Region of Interest on top of the stack,
 | 
						||
     after allocating it and filling with the provided values. FUN is
 | 
						||
     the function which will be called in order to handle events, and
 | 
						||
     the roi itself will be passed to the function as clientdata. The
 | 
						||
     Roi is represented by a `struct Gpm_Roi' structure, described in
 | 
						||
     `gpm.h'.  The `xtradata' field will be used to fill the `xtradata'
 | 
						||
     field in `Gpm_Roi'.  the return value is the Roi just pushed (i.e.
 | 
						||
     the top of stack).
 | 
						||
 | 
						||
 -- Function: char* Gpm_UseRoi (Gpm_Roi *ROI);
 | 
						||
     While `Gpm_PushRoi' has to allocate the Region before pushing it,
 | 
						||
     this function passes a pre-allocated function to the stack manager.
 | 
						||
     The return value is the Roi just used.
 | 
						||
 | 
						||
 -- Function: Gpm_Roi* Gpm_PopRoi (Gpm_Roi *ROI);
 | 
						||
     Used to extract a Region of Interest from the stack, this function
 | 
						||
     will also clear the Region if it is needed.
 | 
						||
 | 
						||
 -- Function: Gpm_Roi* Gpm_RaiseRoi (Gpm_Roi *WHICH, Gpm_Roi *BEFORE);
 | 
						||
     Raise the specified roi, either before the second Roi or at top-of-
 | 
						||
     stack (if BEFORE is `NULL'). The return value is the new
 | 
						||
     top-of-stack.
 | 
						||
 | 
						||
 -- Function: Gpm_Roi* Gpm_LowerRoi (Gpm_Roi *WHICH, Gpm_Roi *AFTER);
 | 
						||
     Lower the specified roi, either after the second Roi or at
 | 
						||
     bottom-of- stack (if BEFORE is NULL). The return value is the new
 | 
						||
     top-of-stack.
 | 
						||
 | 
						||
 -- Function: Gpm_Roi* Gpm_HandleRoi (Gpm_Event *EPTR, void *
 | 
						||
          CLIENTDATA);
 | 
						||
     This function, which should not be invoked by the user, is the
 | 
						||
     dispatching manager within the application for mouse events. This
 | 
						||
     function will browse the stack of regions of interest in order to
 | 
						||
     notify windows about Enter and Leave events (if they are
 | 
						||
     interested in them), and then delivers the current event to the
 | 
						||
     relevant Roi.
 | 
						||
 | 
						||
     If no Roi is interested in he event the `*gpm_roi_handler' function
 | 
						||
     is invoked (if not null), with null clientdata.
 | 
						||
 | 
						||
     Reported events are all those in `Gpm_Event', and also `GPM_ENTER'
 | 
						||
     and `GPM_LEAVE'. These can be used to toggle highlighting on a
 | 
						||
     button or to drop a menu if the menubutton is entered during a
 | 
						||
     drag.  Remember that when Enter or Leave is notified, no other
 | 
						||
     information in the event item should be used.
 | 
						||
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Xterm,  Prev: High Level Lib,  Up: The ClientLib
 | 
						||
 | 
						||
4.4 Running under `xterm'
 | 
						||
=========================
 | 
						||
 | 
						||
As of release 0.18, gpm-based applications can run under xterm without
 | 
						||
any need for recompilation. The library is designed to convert xterm
 | 
						||
mouse events to gpm-style structures, so that the client will get the
 | 
						||
same events it got under the Linux console. Moreover, a source file
 | 
						||
`sample/gpm-xterm.c' is available to mimic libgpm under a different OS
 | 
						||
than Linux. Porting to other text-based consoles is an open issue, but
 | 
						||
I myself have Linux alone.
 | 
						||
 | 
						||
   The goal is to provide a uniform mouse interface with both xterm and
 | 
						||
the Linux console. Some features of libgpm would not be available, but
 | 
						||
if you run under xterm you know what you get, so you couldn't use them
 | 
						||
on the console anyway.
 | 
						||
 | 
						||
   The `sample' directory in the distribution tree is meant to show how
 | 
						||
a simple mouse-sensitive application can be easily autoconfigured and
 | 
						||
compiled. The `rmev' program has proved to compile and run smoothly
 | 
						||
under Linux (both with and without `libgpm.a'), SunOS-4, Solaris-5,
 | 
						||
hpux-8.x and Ultrix-3.0.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Demo Clients,  Next: Type Index,  Prev: The ClientLib,  Up: Top
 | 
						||
 | 
						||
5 Demonstration Clients
 | 
						||
***********************
 | 
						||
 | 
						||
* Menu:
 | 
						||
 | 
						||
* mev::
 | 
						||
* sample/rmev::
 | 
						||
* Emacs Support::
 | 
						||
* gpm-root::
 | 
						||
* hltest::
 | 
						||
* mouse-test::
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: mev,  Next: sample/rmev,  Prev: Demo Clients,  Up: Demo Clients
 | 
						||
 | 
						||
5.1 `mev'
 | 
						||
=========
 | 
						||
 | 
						||
The `mev' program is modeled after `xev'. It prints to `stdout' the
 | 
						||
mouse console events it gets.
 | 
						||
 | 
						||
   `mev''s default behaviour is to get anything, but command line
 | 
						||
switches can be used to set the various fields in the `Gpm_Connect'
 | 
						||
structure, in order to customize the program's behaviour. I'm using
 | 
						||
`mev' to handle mouse events to Emacs.  *Note Emacs Support::.
 | 
						||
 | 
						||
   Command line switches for `mev' are the following:
 | 
						||
 | 
						||
`-C NUMBER'
 | 
						||
     Select a virtual console to get events from.  This is intended to
 | 
						||
     be used for debugging.
 | 
						||
 | 
						||
`-d NUMBER'
 | 
						||
     Choose a default mask. By default the server gets any events not
 | 
						||
     belonging to the event mask. The mask can be provided either as a
 | 
						||
     decimal number, or as a symbolic string.
 | 
						||
 | 
						||
`-e NUMBER'
 | 
						||
     Choose the event mask. By default any event is received. The mask
 | 
						||
     can be provided either as a decimal number, or as a symbolic
 | 
						||
     string.
 | 
						||
 | 
						||
`-E'
 | 
						||
     Enter emacs mode. In emacs mode events are reported as lisp forms
 | 
						||
     rather than numbers. This is the format used by the t-mouse
 | 
						||
     package within emacs.
 | 
						||
 | 
						||
`-f'
 | 
						||
     Fit events inside the screen before reporting them. This options
 | 
						||
     re-fits drag events, which are allowed to exit the screen border,
 | 
						||
     *Note Margins::.
 | 
						||
 | 
						||
`-i'
 | 
						||
     Interactive. Accepts input from `stdin' to change connection
 | 
						||
     parameters.
 | 
						||
 | 
						||
`-m NUMBER'
 | 
						||
     Choose the minimum modifier mask. Any event with fewer modifiers
 | 
						||
     will not be reported to `mev'. It defaults to `0'.  The mask must
 | 
						||
     be provided either as a decimal number, or as a symbolic string.
 | 
						||
 | 
						||
`-M NUMBER'
 | 
						||
     Choose the maximum modifier mask. Any event with more modifier
 | 
						||
     than specified will not be reported to `mev'.  It defaults to
 | 
						||
     `\~0', i.e. all events are received.  The mask must be provided
 | 
						||
     either as a decimal number, or as a symbolic string.
 | 
						||
 | 
						||
`-p'
 | 
						||
     Requests to draw the pointer during drags. This option is used by
 | 
						||
     emacs to avoid invoking `ioctl()' from lisp code.
 | 
						||
 | 
						||
   When the arguments are not decimal integers, they are considered
 | 
						||
lists of alphanumeric characters, separated by a single non-alphanumeric
 | 
						||
character. I use the comma (`,'), but any will do.
 | 
						||
 | 
						||
   Allowed names for events are `move', `drag', `down' or `press', `up'
 | 
						||
or `release', `motion' (which is both `move' and `drag'), and `hard'.
 | 
						||
 | 
						||
   Allowed names for modifiers are `shift', `leftAlt', `rightAlt',
 | 
						||
`anyAlt' (one or the other), `control'.
 | 
						||
 | 
						||
   When the `-i' switch is specified, `mev' looks at its standard input
 | 
						||
as command lines rather than events. The input lines are parsed, and the
 | 
						||
commands `push' and `pop' are recognized.
 | 
						||
 | 
						||
   The `push' command, then, accepts the options `-d', `-e', `-m' and
 | 
						||
`-M', with the same meaning described above. Unspecified options retain
 | 
						||
the previous value and the resulting masks are used to reopen the
 | 
						||
connection with the server. `pop' is used to pop the connection stack.
 | 
						||
If an empty stack is popped the program exits.
 | 
						||
 | 
						||
   Other commands recognized are `info', used to return the stack
 | 
						||
depth; `quit' to prematurely terminate the program; and `snapshot' to
 | 
						||
get some configuration information from the server.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: sample/rmev,  Next: Emacs Support,  Prev: mev,  Up: Demo Clients
 | 
						||
 | 
						||
5.2 `sample/rmev'
 | 
						||
=================
 | 
						||
 | 
						||
`rmev' is a reduced version of `mev', but it is designed to be as
 | 
						||
portable as possible. It uses a subset of the capabilities of
 | 
						||
`libgpm.a', but works smoothly on both xterm and the Linux console. It
 | 
						||
is distributed with `gpm' to show how a curses based application can
 | 
						||
support the mouse with a small effort. Most of the xterm decoding is by
 | 
						||
Janne Kukonlehto.  *Note Xterm::.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Emacs Support,  Next: gpm-root,  Prev: sample/rmev,  Up: Demo Clients
 | 
						||
 | 
						||
5.3 Emacs Support
 | 
						||
=================
 | 
						||
 | 
						||
Emacs support is quite complete as of 0.14.  The enclosed file
 | 
						||
`t-mouse.el', also available in byte-compiled form, is used to pass
 | 
						||
mouse events to emacs.  `t-mouse.elc' is installed in the correct
 | 
						||
site-lisp directory for you emacs installation (as detected by the
 | 
						||
configure phase).
 | 
						||
 | 
						||
   Events with modifiers other than Meta, Control, and Shift are not
 | 
						||
managed by the library.  Managed events are passed to the lisp program,
 | 
						||
which converts them to be similar to X mouse events inside emacs.
 | 
						||
Actions are then invoked through a local keymap.
 | 
						||
 | 
						||
   In my own environment I can use mouse-only and meta mouse within
 | 
						||
emacs, shift-mouse to run selection and control-mouse to run `gpm-root'.
 | 
						||
*Note gpm-root::.
 | 
						||
 | 
						||
   I suggest to put the following form in your own `.emacs' file, to
 | 
						||
avoid loading `t-mouse' when you aren't working on the Linux console:
 | 
						||
 | 
						||
     (if (and (string-match ".*-linux" system-configuration)
 | 
						||
              (or (string-match "linux" (getenv "TERM"))
 | 
						||
                  (string-match "con.*" (getenv "TERM"))))
 | 
						||
         (load-library "t-mouse"))
 | 
						||
 | 
						||
   Mouse events are appended to the list variable
 | 
						||
`unread-command-events' where the Emacs main event loop will find them.
 | 
						||
They can be made to trigger any command (or interactive function, in
 | 
						||
Emacs Lisp terminology) at all.  Actually Emacs already comes with
 | 
						||
reasonable bindings for most mouse events, so usually you won't have to
 | 
						||
do anything beyond installing `t-mouse'.  If you want to modify what
 | 
						||
Emacs does in response to mouse events, please see *note Keymaps:
 | 
						||
(elisp)Keymaps.
 | 
						||
 | 
						||
   The scrollbar sits on the last column of the screen, though it is not
 | 
						||
visible.  When you click on the last column, a scroll-bar action is
 | 
						||
taken.  If this annoys you, again it can be turned off by changing the
 | 
						||
appropriate Emacs keymap.
 | 
						||
 | 
						||
   If you kill the `gpm' server, Emacs won't respond to mouse events
 | 
						||
any more. If the server is then restarted, you can invoke ``M-x
 | 
						||
t-mouse-run'' to restart mouse responsiveness in the editor.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: gpm-root,  Next: hltest,  Prev: Emacs Support,  Up: Demo Clients
 | 
						||
 | 
						||
5.4 The "gpm-root" program
 | 
						||
==========================
 | 
						||
 | 
						||
The program `gpm-root' is designed to handle Control-Mouse events to
 | 
						||
draw menus on the background of the current tty. The actual menus are
 | 
						||
described by a configuration file in the user's home directory.
 | 
						||
 | 
						||
   Please note that `gpm-root' needs to run with Linux 1.1.73 or newer,
 | 
						||
because previous kernels lack some screen handling capabilities
 | 
						||
required by the program.
 | 
						||
 | 
						||
   The program uses the files `/dev/vcs*' to draw to the console screen.
 | 
						||
These are available only from kernel 1.1.81 onward. If you miss those
 | 
						||
device nodes, you should create them using `create_vcs' in the
 | 
						||
distribution directory. The tool won't run with kernels older than
 | 
						||
1.1.81, because they lacked a full screen dump/restore capability.
 | 
						||
 | 
						||
   Available command line options are the following:
 | 
						||
 | 
						||
`-m NUMBER'
 | 
						||
     Choose the modifier to use (by default: `control'). The modifier
 | 
						||
     can be provided either as a number or as a symbolic string.
 | 
						||
     Allowed strings are `shift', `anyAlt', `leftAlt', `rightAlt',
 | 
						||
     `control'.
 | 
						||
 | 
						||
`-u'
 | 
						||
     Deny using user-specific configuration files. With this option on,
 | 
						||
     only `/etc/gpm-root.conf' will be used as a source of
 | 
						||
     configuration information. This option is intended for those
 | 
						||
     system administrators who fear security could be broken by this
 | 
						||
     daemon. Things should be sufficiently secure, but if you find a
 | 
						||
     hole please tell me about it.
 | 
						||
 | 
						||
`-D'
 | 
						||
     Do not automatically enter background operation when started, and
 | 
						||
     log messages to the standard error stream, not the syslog
 | 
						||
     mechanism.  This is useful for debugging; in previous releases it
 | 
						||
     was done with a compile-time option.
 | 
						||
 | 
						||
`-V VERBOSITY INCREMENT'
 | 
						||
     Raise the maximum level of messages that will be logged.  Thus a
 | 
						||
     positive argument has the effect of making the program more
 | 
						||
     verbose.  One can also give a negative argument to hush the
 | 
						||
     program; however, note that due to getopt(3) rules a negative
 | 
						||
     argument must follow the option with no space betwixt (that is,
 | 
						||
     `-V-1' but not `-V -1').  *Note Program Arguments: (libc)Program
 | 
						||
     Arguments.  The argument is optional and its default value is 1.
 | 
						||
 | 
						||
 | 
						||
   Each time a menu is drawn, the configuration file is reparsed if it
 | 
						||
has changed. This allows modification of personal setup without
 | 
						||
reinvoking the daemon.
 | 
						||
 | 
						||
   The actual configuration file is better introduced by an example:
 | 
						||
 | 
						||
     # sample configuration file for gpm-root
 | 
						||
     # edit it to suit your taste
 | 
						||
 | 
						||
     button 2 {
 | 
						||
       name "system status"
 | 
						||
       foreground red
 | 
						||
       background black
 | 
						||
       border yellow
 | 
						||
       head bright yellow
 | 
						||
 | 
						||
       ""          f.nop
 | 
						||
       "load: "    f.load
 | 
						||
       "free:"     f.free
 | 
						||
       "---------" f.nop
 | 
						||
       "disk usage" f.bgcmd  "du | sort -rn > /tmp/du"
 | 
						||
     }
 | 
						||
 | 
						||
     button 3 {
 | 
						||
       name "jump"
 | 
						||
 | 
						||
       foreground black
 | 
						||
       background red
 | 
						||
       border bright yellow
 | 
						||
       head bright yellow
 | 
						||
 | 
						||
       "tty1"  f.jptty  "1"
 | 
						||
       "tty2"  f.jptty  "2"
 | 
						||
       "tty3"  f.jptty  "3"
 | 
						||
       "tty4"  f.jptty  "4"
 | 
						||
       "tty5"  f.jptty  "5"
 | 
						||
       "tty6"  f.jptty  "6"
 | 
						||
         ""        f.nop
 | 
						||
         "more of them..." {
 | 
						||
               "tty 17" f.jptty  "17"
 | 
						||
               }
 | 
						||
      }
 | 
						||
 | 
						||
   The syntax for the file won't be described here, being it quite
 | 
						||
apparent from the example above. Blanks and newlines are unused in
 | 
						||
parsing the file, and the layout of the file is free. Comments are
 | 
						||
allowed in the file: any hash mark (`#') found at the beginning of the
 | 
						||
line or after white space makes the parser discard anything up to the
 | 
						||
next line. To insert quotes (`"') in strings precede them with a
 | 
						||
backslash.
 | 
						||
 | 
						||
   Note that recursive menus are allowed, to any level of recursion.
 | 
						||
 | 
						||
   Keywords belong to three groups: the button keyword, the cfg
 | 
						||
keywords and the action keywords. They are all described in the table
 | 
						||
below:
 | 
						||
 | 
						||
`button NUMBER MENU'
 | 
						||
     The `button' keyword is used to introduce a menu. It is followed
 | 
						||
     by the number of the relevant button (1=left, 2=middle, 3=right),
 | 
						||
     an open brace, a menu and a closed brace.  A menu is made up of
 | 
						||
     cfg statements, followed by action statements. Cfg statements can
 | 
						||
     come in any order, while the order of action statements tells the
 | 
						||
     actual order in which actions will appear on the screen, top to
 | 
						||
     bottom.
 | 
						||
 | 
						||
   The following statements belong to the cfg set.
 | 
						||
 | 
						||
`name STRING'
 | 
						||
     If the `name' keyword is present, the specified STRING will be
 | 
						||
     used as the name for the current menu.
 | 
						||
 | 
						||
`background COLOR'
 | 
						||
     This statements is used to specify the background color to be used
 | 
						||
     in the current menu. The COLOR can be specified with one of the
 | 
						||
     eight canonical strings `black', `red', `cyan' etc. The background
 | 
						||
     defaults to black.
 | 
						||
 | 
						||
`foreground COLOR'
 | 
						||
     This statements is used to specify the foreground color for menu
 | 
						||
     items. Its value defaults to `white'.  An optional `bright'
 | 
						||
     keyword can appear before the actual color.
 | 
						||
 | 
						||
`border COLOR'
 | 
						||
     `border' is used to specify the border color for the menu. Its
 | 
						||
     value defaults to `white'.  An optional `bright' keyword can
 | 
						||
     appear before the actual color.
 | 
						||
 | 
						||
`head COLOR'
 | 
						||
     `head' is used to specify the foreground color for the title of
 | 
						||
     the menu. Its value defaults to `white'.  An optional `bright'
 | 
						||
     keyword can appear before the actual color.
 | 
						||
 | 
						||
   The following statements belong to the action set.
 | 
						||
 | 
						||
`STRING f.fgcmd CMDSTRING'
 | 
						||
     When the mouse button is released above the corresponding menu
 | 
						||
     item, the CMDSTRING is pasted in the keyboard queue of the current
 | 
						||
     console. This is not yet implemented.
 | 
						||
 | 
						||
`STRING f.bgcmd CMDSTRING'
 | 
						||
     When the mouse button is released above the corresponding menu
 | 
						||
     item, a shell (`/bin/sh') is forked to execute the specified
 | 
						||
     command, with `stdin' connected to `/dev/null', and `stdout',
 | 
						||
     `stderr' connected to the active console.
 | 
						||
 | 
						||
`STRING f.jptty TTYNUMBER'
 | 
						||
     When the mouse button is released above the corresponding menu
 | 
						||
     item, the console is switched to the one specified. The TTYNUMBER
 | 
						||
     must be specified as a string. Any tty can be reached this way,
 | 
						||
     even those which are not accessible via the keyboard.
 | 
						||
 | 
						||
`STRING f.mktty TTYNUMBER'
 | 
						||
     When the mouse button is released above the corresponding menu
 | 
						||
     item, an unused console is selected, and `/sbin/mingetty' is
 | 
						||
     executed in it. The current console is switched to the newly
 | 
						||
     opened console. I use this command to save kernel memory by
 | 
						||
     opening a single console through `/etc/inittab' and requesting the
 | 
						||
     others only when i need to login.
 | 
						||
 | 
						||
`STRING WHOLE-MENU'
 | 
						||
     A menu can directly follow the label string.  When the mouse
 | 
						||
     pointer leaves the menu frame at the level of STRING, a second
 | 
						||
     menu is posted on screen.
 | 
						||
 | 
						||
`STRING f.lock'
 | 
						||
     When the mouse button is released above the corresponding menu
 | 
						||
     item, the keyboard and the screen are locked, and only the locking
 | 
						||
     user or the superuser can unlock them. This is not yet implemented.
 | 
						||
 | 
						||
`STRING f.load'
 | 
						||
     The current loadavg when the menu is posted is concatenated to
 | 
						||
     STRING to build the actual message displayed on screen. Nothing
 | 
						||
     happens at button release.
 | 
						||
 | 
						||
`STRING f.free'
 | 
						||
     The free memory and swap when the menu is posted is concatenated
 | 
						||
     to STRING to build the actual message displayed on screen. Nothing
 | 
						||
     happens at button release.
 | 
						||
 | 
						||
`STRING f.time'
 | 
						||
     The current time is formatted with strftime(3), according to
 | 
						||
     STRING. The resulting string is the actual message displayed on
 | 
						||
     screen. Nothing happens at button release.
 | 
						||
 | 
						||
`STRING f.pipe CMDLINE'
 | 
						||
     When the mouse pointer leaves the menu frame at the level of
 | 
						||
     STRING, a message box is posted on screen showing the last ten
 | 
						||
     lines of the output of CMDLINE. CMDLINE is executed by `/bin/sh'.
 | 
						||
     This is not yet implemented.
 | 
						||
 | 
						||
`STRING f.nop'
 | 
						||
     This does nothing, it only displays STRING on the menu.
 | 
						||
 | 
						||
   The `HOME', `LOGNAME' and `USER' environment variables are setup to
 | 
						||
the values for the invoking user before spawning an external process
 | 
						||
(`f.bgcmd', `f.pipe'). The current directory is always `/'.
 | 
						||
 | 
						||
   Known bugs have been fixed. In particular, if you invoke `gpm-root'
 | 
						||
right after `gpm', it will delay a few seconds before trying to connect
 | 
						||
to the daemon.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: hltest,  Next: mouse-test,  Prev: gpm-root,  Up: Demo Clients
 | 
						||
 | 
						||
5.5 `hltest'
 | 
						||
============
 | 
						||
 | 
						||
High-level test is a simple sample application using the high-level
 | 
						||
library. It implements something like a window manager for text windows,
 | 
						||
though it is small and unuseful.
 | 
						||
 | 
						||
   The application is meant to be read by programmers trying to use the
 | 
						||
high-level library. It is equipped with event reporting to help in
 | 
						||
understanding the internal workings.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: mouse-test,  Prev: hltest,  Up: Demo Clients
 | 
						||
 | 
						||
5.6 `mouse-test'
 | 
						||
================
 | 
						||
 | 
						||
This experimental and incomplete application tries to help in detecting
 | 
						||
which protocol does your mouse speak. It is able to detect MouseMan
 | 
						||
devices, and to choose between `-t ms' (three-buttons aware) and `-t
 | 
						||
bare' old two-buttons-only serial mice.
 | 
						||
 | 
						||
   I know the application is buggy, but I only own one mouse device.
 | 
						||
If you are interested in this application, just call me and awake me
 | 
						||
from my laziness.
 | 
						||
 | 
						||
 | 
						||
File: gpm.info,  Node: Type Index,  Next: Function Index,  Prev: Demo Clients,  Up: Top
 | 
						||
 | 
						||
Type Index
 | 
						||
**********
 | 
						||
 | 
						||
 |