95a46c5577
Signed-off-by: Nico Schottelius <nico@ikn.schottelius.org>
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). A server wich hands mouse events to non-X programs.
|
||
END-INFO-DIR-ENTRY
|
||
|
||
This file is a user's and programmer's manual for gpm 1.20.3pre6.
|
||
|
||
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.3pre6 release of the "General Purpose
|
||
Mouse" (gpm) server for the Linux text console (6th of April 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
|
||
**********
|
||
|
||
|