2295 lines
		
	
	
	
		
			87 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			2295 lines
		
	
	
	
		
			87 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| 
								 | 
							
								\input texinfo    @c -*-texinfo-*-
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								% doc.gpm - main file for the documentation
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								% Copyright 1994,1995,1998   rubini@linux.it (Alessandro Rubini)
							 | 
						||
| 
								 | 
							
								% Copyright (C) 1998 Ian Zimmerman <itz@speakeasy.org>
							 | 
						||
| 
								 | 
							
								% Copyright (C) 2001-2008 Nico Schottelius <nico-gpm2008 at schottelius.org>
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								%%%%
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%------------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								%                         NOTE FOR THE UNAWARE USER
							 | 
						||
| 
								 | 
							
								%                         =========================
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								%    This file is a texinfo source. It isn't the binary file of some strange
							 | 
						||
| 
								 | 
							
								%    editor of mine. If you want ASCII, you should "make gpm.txt".
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								%    Some strings maybe changed from the configure script.
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								%------------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								% This is not a conventional info file...
							 | 
						||
| 
								 | 
							
								% I use two extra features:
							 | 
						||
| 
								 | 
							
								%       - The '%' as a comment marker ("\%" -> "%")
							 | 
						||
| 
								 | 
							
								%       - leading blanks are allowed (and removed)
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@comment %**start of header
							 | 
						||
| 
								 | 
							
								@setfilename gpm.info
							 | 
						||
| 
								 | 
							
								@settitle gpm @value{version}
							 | 
						||
| 
								 | 
							
								@iftex
							 | 
						||
| 
								 | 
							
								@afourpaper
							 | 
						||
| 
								 | 
							
								@end iftex
							 | 
						||
| 
								 | 
							
								@comment %**end of header
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@ifinfo
							 | 
						||
| 
								 | 
							
								@format
							 | 
						||
| 
								 | 
							
								@dircategory Miscellaneous
							 | 
						||
| 
								 | 
							
								@direntry
							 | 
						||
| 
								 | 
							
								* Gpm: (gpm).   A server wich hands mouse events to non-X programs.
							 | 
						||
| 
								 | 
							
								@end direntry
							 | 
						||
| 
								 | 
							
								@end format
							 | 
						||
| 
								 | 
							
								@end ifinfo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@setchapternewpage off
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@set version @release@
							 | 
						||
| 
								 | 
							
								@set update-month @release_date@
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@finalout
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@ifinfo
							 | 
						||
| 
								 | 
							
								%ASCII_BEGIN
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This file is a user's and programmer's manual for gpm @value{version}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@ignore
							 | 
						||
| 
								 | 
							
								Permission is granted to process this file through TeX and print the
							 | 
						||
| 
								 | 
							
								results, provided the printed document carries copying permission
							 | 
						||
| 
								 | 
							
								notice identical to this one except for the removal of this paragraph
							 | 
						||
| 
								 | 
							
								(this paragraph not being relevant to the printed manual).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end ignore
							 | 
						||
| 
								 | 
							
								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.
							 | 
						||
| 
								 | 
							
								@end ifinfo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@setchapternewpage odd
							 | 
						||
| 
								 | 
							
								@titlepage
							 | 
						||
| 
								 | 
							
								@c use the new format for titles
							 | 
						||
| 
								 | 
							
								@title gpm @value{version}
							 | 
						||
| 
								 | 
							
								@subtitle A general purpose mouse server for the Linux console
							 | 
						||
| 
								 | 
							
								@subtitle @value{update-month}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@author by Nico Schottelius <nico@@schottelius.org>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end titlepage
							 | 
						||
| 
								 | 
							
								@setchapternewpage off
							 | 
						||
| 
								 | 
							
								@headings single
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@ifinfo
							 | 
						||
| 
								 | 
							
								This file documents the @value{version} release of the "General Purpose
							 | 
						||
| 
								 | 
							
								Mouse" (gpm) server for the Linux text console (@value{update-month}).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@node Top, Overview, (dir), (dir)
							 | 
						||
| 
								 | 
							
								@top gpm
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@menu
							 | 
						||
| 
								 | 
							
								* Overview::                    
							 | 
						||
| 
								 | 
							
								* Server Invocation::           
							 | 
						||
| 
								 | 
							
								* Gpm Internals::               
							 | 
						||
| 
								 | 
							
								* The ClientLib::               
							 | 
						||
| 
								 | 
							
								* Demo Clients::                
							 | 
						||
| 
								 | 
							
								* Type Index::                  
							 | 
						||
| 
								 | 
							
								* Function Index::              
							 | 
						||
| 
								 | 
							
								* Variable Index::              
							 | 
						||
| 
								 | 
							
								@end menu
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end ifinfo
							 | 
						||
| 
								 | 
							
								%##########################################################################
							 | 
						||
| 
								 | 
							
								%##########################################################################
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@node Overview, Server Invocation, Top, Top
							 | 
						||
| 
								 | 
							
								@chapter Overview
							 | 
						||
| 
								 | 
							
								@cindex Overview of Gpm
							 | 
						||
| 
								 | 
							
								@cindex Gpm Overview
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The @dfn{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
							 | 
						||
| 
								 | 
							
								@code{gpm} come from the @file{selection-1.5} package, by Andrew Haylett.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The first application to support the mouse has been The Midnight Commander,
							 | 
						||
| 
								 | 
							
								by Miguel de Icaza.  @file{mc-0.11} and later releases offer
							 | 
						||
| 
								 | 
							
								mouse support if you have the mouse server running on your system.
							 | 
						||
| 
								 | 
							
								The file @file{t-mouse.el} provides support for using the
							 | 
						||
| 
								 | 
							
								mouse from within Emacs. @xref{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 @code{gpm-root} program, however, needs kernel 1.1.73 or newer.
							 | 
						||
| 
								 | 
							
								@xref{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 @file{kmouse-?.??.tar.gz} from the mirrors of
							 | 
						||
| 
								 | 
							
								@uref{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::        
							 | 
						||
| 
								 | 
							
								@end menu
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%=========================================================================
							 | 
						||
| 
								 | 
							
								@node Building the Release,  , Overview, Overview
							 | 
						||
| 
								 | 
							
								@section Compiling and Installing
							 | 
						||
| 
								 | 
							
								@cindex Building Gpm
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Just say @code{./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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%=========================================================================
							 | 
						||
| 
								 | 
							
								%@node Kernel Patches
							 | 
						||
| 
								 | 
							
								%@section Kernel Patches
							 | 
						||
| 
								 | 
							
								%@cindex Kernel Patches
							 | 
						||
| 
								 | 
							
								%@cindex Patches to Apply
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								%Old Linux kernels need to be patched to provide features I rely on. As
							 | 
						||
| 
								 | 
							
								%of 1.1.32, however, my patches are in the official release, so you won't
							 | 
						||
| 
								 | 
							
								%need any kernel recompilation. Remember, anyway, to enable selection while
							 | 
						||
| 
								 | 
							
								%compiling the kernel, or this package won't work.  Refer to
							 | 
						||
| 
								 | 
							
								%@file{kernel/README} to probe further.
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								%Other features are needed to run the @t{gpm-root} client. They are
							 | 
						||
| 
								 | 
							
								%really functional only since 1.1.73. 1.1.68, however, should be sufficient.
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%##########################################################################
							 | 
						||
| 
								 | 
							
								@node Server Invocation, Gpm Internals, Overview, Top
							 | 
						||
| 
								 | 
							
								@chapter Server Invocation
							 | 
						||
| 
								 | 
							
								@cindex The Server
							 | 
						||
| 
								 | 
							
								@cindex Command Line (gpm)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%MANPAGE gpm.8
							 | 
						||
| 
								 | 
							
								%M .TH GPM 8 "February 2002"
							 | 
						||
| 
								 | 
							
								%M .UC 4
							 | 
						||
| 
								 | 
							
								%M .SH NAME
							 | 
						||
| 
								 | 
							
								%M gpm \- a cut and paste utility and mouse server for virtual consoles
							 | 
						||
| 
								 | 
							
								%M .SH SYNOPSIS
							 | 
						||
| 
								 | 
							
								%M .B gpm
							 | 
						||
| 
								 | 
							
								%M [
							 | 
						||
| 
								 | 
							
								%M .I options
							 | 
						||
| 
								 | 
							
								%M ]
							 | 
						||
| 
								 | 
							
								%M .br
							 | 
						||
| 
								 | 
							
								%M .SH DESCRIPTION
							 | 
						||
| 
								 | 
							
								%M This package tries to be a useful
							 | 
						||
| 
								 | 
							
								%M mouse server for applications running on the Linux console.  It is
							 | 
						||
| 
								 | 
							
								%M based on the "selection" package, and some of its code
							 | 
						||
| 
								 | 
							
								%M comes from selection itself. This package is intended as a replacement
							 | 
						||
| 
								 | 
							
								%M for "selection" as a cut-and-paste mechanism; it also provides
							 | 
						||
| 
								 | 
							
								%M additional facilities. The "selection"
							 | 
						||
| 
								 | 
							
								%M package offered the first cut-and-paste implementation for Linux using
							 | 
						||
| 
								 | 
							
								%M two mouse buttons, and the cut buffer is still called "selection buffer"
							 | 
						||
| 
								 | 
							
								%M or just "selection" throughout this document.
							 | 
						||
| 
								 | 
							
								%M
							 | 
						||
| 
								 | 
							
								%M The information below is extracted from the texinfo file, which is the
							 | 
						||
| 
								 | 
							
								%M preferred source of information.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The @code{gpm} executable is meant to act like a daemon (thus, @code{gpmd}
							 | 
						||
| 
								 | 
							
								would be a better name for it). This section is meant to describe the
							 | 
						||
| 
								 | 
							
								command-line options for @code{gpm}, while its internals are outlined in
							 | 
						||
| 
								 | 
							
								the next section.  
							 | 
						||
| 
								 | 
							
								@xref{Gpm Internals}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Due to restrictions in the @code{ioctl(TIOCLINUX)} system call, @code{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 @emph{feeling}
							 | 
						||
| 
								 | 
							
								using the @t{-q} option. This is no longer possible for security
							 | 
						||
| 
								 | 
							
								reasons.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								As of 0.97 the server program puts itself in the background. To kill
							 | 
						||
| 
								 | 
							
								@code{gpm} you can just reinvoke it with the @samp{-k} cmdline switch,
							 | 
						||
| 
								 | 
							
								although @code{killall gpm} can be a better choice.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@menu
							 | 
						||
| 
								 | 
							
								* Special Commands::            
							 | 
						||
| 
								 | 
							
								* Command Line::                
							 | 
						||
| 
								 | 
							
								* Bugs and Problems::           
							 | 
						||
| 
								 | 
							
								* Mouse Types::                 
							 | 
						||
| 
								 | 
							
								@end menu
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%M .SH SPECIAL COMMANDS
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@node Special Commands, Command Line, Server Invocation, Server Invocation
							 | 
						||
| 
								 | 
							
								@section Special Commands
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Version 1.10 adds the capability to execute @emph{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:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @var
							 | 
						||
| 
								 | 
							
								@item left button
							 | 
						||
| 
								 | 
							
								        Reboot the system by signalling the init process
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item middle button (if any)
							 | 
						||
| 
								 | 
							
								        Execute @code{/sbin/shutdown -h now}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item right button
							 | 
						||
| 
								 | 
							
								        Execute @code{/sbin/shutdown -r now}
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The @samp{-S} command line switch enables special command processing and
							 | 
						||
| 
								 | 
							
								allows to change the three special commands. To accept the default
							 | 
						||
| 
								 | 
							
								commands use @samp{-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, @samp{-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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%M .SH COMMAND LINE OPTIONS
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node Command Line, Bugs and Problems, Special Commands, Server Invocation
							 | 
						||
| 
								 | 
							
								@section Command Line Options
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Available command line options are the following:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item -a @var{accel}
							 | 
						||
| 
								 | 
							
								        Set the acceleration value used when a single motion event is
							 | 
						||
| 
								 | 
							
								        longer than @var{delta} (see @samp{-d}). 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -A[@var{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
							 | 
						||
| 
								 | 
							
								        (@code{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 (@emph{age}) selection pasting
							 | 
						||
| 
								 | 
							
								        automatically after a period of inactivity.  To enable this mode
							 | 
						||
| 
								 | 
							
								        just give the optional @var{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
							 | 
						||
| 
								 | 
							
								        @code{disable-paste} is provided. The following makes a good
							 | 
						||
| 
								 | 
							
								        addition to @file{/etc/profile} if you allow multiple users to
							 | 
						||
| 
								 | 
							
								        work on your console.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        @code{case $( /usr/bin/tty ) in @* /dev/tty[0-9]*) /usr/bin/disable-paste ;; @* esac}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -b @var{baud}
							 | 
						||
| 
								 | 
							
								        Set the baud rate.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -B @var{sequence}
							 | 
						||
| 
								 | 
							
								        Set the button sequence. @samp{123} is the
							 | 
						||
| 
								 | 
							
									normal sequence, @samp{321} can be used by left-handed people,
							 | 
						||
| 
								 | 
							
								        and @samp{132} can be useful with two-button mice (especially within
							 | 
						||
| 
								 | 
							
								        Emacs). All the button permutations are allowable.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -d @var{delta}
							 | 
						||
| 
								 | 
							
								        Set the delta value. When a single motion event
							 | 
						||
| 
								 | 
							
									is longer than @var{delta}, @var{accel} is used as a multiplying
							 | 
						||
| 
								 | 
							
								        factor. (Must be 2 or above)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -g @var{number}
							 | 
						||
| 
								 | 
							
								        With glidepoint devices, emulate the specified button with tapping.
							 | 
						||
| 
								 | 
							
								        @var{number} must be @samp{1}, @samp{2}, or @samp{3}, and refers to the
							 | 
						||
| 
								 | 
							
								        button number @emph{before} the @samp{-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
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -h
							 | 
						||
| 
								 | 
							
								        Print a summary of command line options.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -i @var{interval}
							 | 
						||
| 
								 | 
							
								        Set @var{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 @var{limit}, the press is considered
							 | 
						||
| 
								 | 
							
									a double or triple click. Time is in milliseconds.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -k 
							 | 
						||
| 
								 | 
							
								        Kill a running gpm. This can be used by busmouse users to kill gpm
							 | 
						||
| 
								 | 
							
								        before running X (unless they use @samp{-R} or the single-open
							 | 
						||
| 
								 | 
							
								        limitation is removed from the kernel).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -l @var{charset}
							 | 
						||
| 
								 | 
							
								        Choose the @code{inword()} look up table. The
							 | 
						||
| 
								 | 
							
									@var{charset} argument is a list of characters. @samp{-} is used to
							 | 
						||
| 
								 | 
							
									specify a range and @samp{\ } is used to escape the next character
							 | 
						||
| 
								 | 
							
								        or to provide octal codes.
							 | 
						||
| 
								 | 
							
									Only visible character can appear in @var{charset} because control
							 | 
						||
| 
								 | 
							
									characters can't appear in text-mode video memory, whence selection
							 | 
						||
| 
								 | 
							
									is cut. 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -m @var{filename}
							 | 
						||
| 
								 | 
							
								        Choose the mouse file to open. Must be before -t and -o.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -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 @emph{repeater} (@samp{-R}) option on.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -o @var{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
							 | 
						||
| 
								 | 
							
									@samp{dtr}, @samp{rts} or @samp{both} are used by the serial
							 | 
						||
| 
								 | 
							
									initialization to toggle the modem lines like, compatibly with
							 | 
						||
| 
								 | 
							
									earlier @i{gpm} versions; note however that using @t{-o dtr}
							 | 
						||
| 
								 | 
							
									associated with non-plain-serial mouse types may now generate
							 | 
						||
| 
								 | 
							
									an error. @xref{Mouse Types}.
							 | 
						||
| 
								 | 
							
								   And by the way, use -o after -m and after -t.
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								@item -p
							 | 
						||
| 
								 | 
							
								        Forces the pointer to be visible while selecting. This is the
							 | 
						||
| 
								 | 
							
								        behaviour of @file{selection-1.7}, but it is sometimes confusing.
							 | 
						||
| 
								 | 
							
								        The default is not to show the pointer, which can be confusing as well.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -r @var{number}
							 | 
						||
| 
								 | 
							
								        Set the responsiveness. A higher responsiveness is used for a faster
							 | 
						||
| 
								 | 
							
								        cursor motion.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -R[@var{name}]
							 | 
						||
| 
								 | 
							
								        Causes @code{gpm} to act as a repeater: any mouse data received while
							 | 
						||
| 
								 | 
							
								        in graphic mode will be produced on the fifo @file{/dev/gpmdata}
							 | 
						||
| 
								 | 
							
								        in protocol @var{name}, given as an optional argument (no space in
							 | 
						||
| 
								 | 
							
								        between !).  In principle, you can use the same
							 | 
						||
| 
								 | 
							
								        names as for the @samp{-t} option, although repeating into some
							 | 
						||
| 
								 | 
							
								        protocols may not be implemented for a while.  @xref{Mouse Types}.
							 | 
						||
| 
								 | 
							
								        In addition, you can specify @samp{raw} as the @var{name}, to repeat
							 | 
						||
| 
								 | 
							
								        the mouse data byte by byte, without any protocol translation.
							 | 
						||
| 
								 | 
							
								        If @var{name} is omitted, it defaults to @samp{msc}.
							 | 
						||
| 
								 | 
							
								        Using @i{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 @samp{-M} option.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -s @var{number}
							 | 
						||
| 
								 | 
							
								        Set the sample rate for the mouse device.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -S @var{commands}
							 | 
						||
| 
								 | 
							
								        Enable special-command processing, and optionally specify custom
							 | 
						||
| 
								 | 
							
								        commands as a colon-separated list. See above for a detailed
							 | 
						||
| 
								 | 
							
								        description of special commands.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -t @var{name}
							 | 
						||
| 
								 | 
							
								        Set the mouse type. Use @samp{-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 @t{-R} above),
							 | 
						||
| 
								 | 
							
								        by marking them with an asterisk (``@t{*}'').
							 | 
						||
| 
								 | 
							
								        @xref{Mouse Types}.
							 | 
						||
| 
								 | 
							
								        Use -t after you selected the mouse device with -m.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -v
							 | 
						||
| 
								 | 
							
								        Print version information and exit.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -2
							 | 
						||
| 
								 | 
							
								        Force two buttons. This means that the middle button, if any,
							 | 
						||
| 
								 | 
							
								        will be taken as it was the right one.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -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 @samp{-3} option with a 2-buttons mouse, you
							 | 
						||
| 
								 | 
							
								        won't be able to paste the selection. 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@ignore
							 | 
						||
| 
								 | 
							
								.SH OPERATION
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To select text press the left mouse button and drag the mouse.
							 | 
						||
| 
								 | 
							
								To paste text in the same or another console, press the middle button.
							 | 
						||
| 
								 | 
							
								The right button is used to extend the selection, like in `xterm'.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Two-button mice use the right button to paste text.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Double and triple clicks select whole word and whole lines. Use of
							 | 
						||
| 
								 | 
							
								the `-p' option is recommended for best visual feedback.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If a trailing space after the contents of a line is highlighted, and if
							 | 
						||
| 
								 | 
							
								there is no other text on the remainder of the line, the rest of the
							 | 
						||
| 
								 | 
							
								line will be selected automatically. If a number of lines are selected,
							 | 
						||
| 
								 | 
							
								highlighted trailing spaces on each line will be removed from the
							 | 
						||
| 
								 | 
							
								selection buffer.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Any output on the virtual console holding the selection will clear the
							 | 
						||
| 
								 | 
							
								highlighted selection from the screen, to maintain integrity of the
							 | 
						||
| 
								 | 
							
								display, although the contents of the paste buffer will be unaffected.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The selection mechanism is disabled if the controlling virtual console
							 | 
						||
| 
								 | 
							
								is placed in graphics mode, for example when running X11, and is
							 | 
						||
| 
								 | 
							
								re-enabled when text mode is resumed. (But see BUGS section below.)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end ignore
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%MSKIP
							 | 
						||
| 
								 | 
							
								@menu
							 | 
						||
| 
								 | 
							
								* Bugs and Problems::           
							 | 
						||
| 
								 | 
							
								@end menu
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@node Bugs and Problems, Mouse Types, Command Line, Server Invocation
							 | 
						||
| 
								 | 
							
								@section Bugs and Problems
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%M .SH BUGS
							 | 
						||
| 
								 | 
							
								The @code{gpm} server may have problems interacting with X: if your
							 | 
						||
| 
								 | 
							
								mouse is a single-open device (i.e. a bus mouse), you should kill
							 | 
						||
| 
								 | 
							
								@code{gpm} before starting X, or use the @samp{-R} option (see
							 | 
						||
| 
								 | 
							
								above).  To kill @code{gpm} just invoke @code{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 @samp{-M} option (see above).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								While the current console is in graphic mode, @code{gpm} sleeps until
							 | 
						||
| 
								 | 
							
								text mode is back (unless @samp{-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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@ignore
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.SH AUTHORS
							 | 
						||
| 
								 | 
							
								.nf
							 | 
						||
| 
								 | 
							
								Andrew Haylett <ajh@gec-mrc.co.uk> (the original selection code)
							 | 
						||
| 
								 | 
							
								Ian Zimmerman <itz@speakeasy.org> (old maintainer)
							 | 
						||
| 
								 | 
							
								Alessandro Rubini <rubini@linux.it> (old maintainer (still helps a lot))
							 | 
						||
| 
								 | 
							
								Nico Schottelius <nico@schottelius.org> (maintainer)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Many many contributors, to both selection and gpm.
							 | 
						||
| 
								 | 
							
								.fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.SH MAINTAINERS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The current maintainer is Nico Schottelius. But without the help of
							 | 
						||
| 
								 | 
							
								Alessandro Rubini and the mailing list it would be impossible for me to
							 | 
						||
| 
								 | 
							
								maintain gpm. The development mailing list can be reached under
							 | 
						||
| 
								 | 
							
								gpm@lists.linux.it. More information on the list is in the README file part of
							 | 
						||
| 
								 | 
							
								the source distribution of gpm.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.SH FILES
							 | 
						||
| 
								 | 
							
								.nf
							 | 
						||
| 
								 | 
							
								/var/run/gpm.pid The PID of the running gpm
							 | 
						||
| 
								 | 
							
								/dev/gpmctl     A control socket for clients
							 | 
						||
| 
								 | 
							
								/dev/gpmdata    The fifo written to by a \fBrepeater\fP (`-R') daemon.
							 | 
						||
| 
								 | 
							
								.fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.SH SEE ALSO
							 | 
						||
| 
								 | 
							
								.nf
							 | 
						||
| 
								 | 
							
								\fB mev(1)\fP        A sample client for the gpm daemon.
							 | 
						||
| 
								 | 
							
								\fB gpm-root(1)\fP   An handler for Control-Mouse events.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.fi
							 | 
						||
| 
								 | 
							
								The info file about `gpm', which gives more complete information and
							 | 
						||
| 
								 | 
							
								explains how to write a gpm client.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end ignore
							 | 
						||
| 
								 | 
							
								%MANPAGE END
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node Mouse Types,  , Bugs and Problems, Server Invocation
							 | 
						||
| 
								 | 
							
								@section Mouse Types
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%MANPAGE gpm-types.7
							 | 
						||
| 
								 | 
							
								%M .TH GPM-TYPES 7 "July 2000"
							 | 
						||
| 
								 | 
							
								%M .UC 4
							 | 
						||
| 
								 | 
							
								%M .SH NAME
							 | 
						||
| 
								 | 
							
								%M gpm-types \- pointer types (mice, tablets, etc.) managed by gpm.
							 | 
						||
| 
								 | 
							
								%M .br
							 | 
						||
| 
								 | 
							
								%M The information below is extracted from the texinfo file, which is the
							 | 
						||
| 
								 | 
							
								%M preferred source of information.
							 | 
						||
| 
								 | 
							
								%M .SH DESCRIPTION
							 | 
						||
| 
								 | 
							
								%MSKIP
							 | 
						||
| 
								 | 
							
								This section of the gpm documentation manual
							 | 
						||
| 
								 | 
							
								%M This manpage
							 | 
						||
| 
								 | 
							
								describes the various pointer types currently available in @i{gpm}. If you
							 | 
						||
| 
								 | 
							
								look at the source code, you'll find that pointer-specific code is
							 | 
						||
| 
								 | 
							
								confined to @file{mice.c} (while it used to only include mouse decoders,
							 | 
						||
| 
								 | 
							
								@i{gpm} now supports tablets and touchscreens as well).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The mouse type is specified on command line with the @samp{-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 @i{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 @t{ms+}
							 | 
						||
| 
								 | 
							
								and @t{ms+lr} as different mouse types).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The initialization procedure of each mouse type can also receive extra
							 | 
						||
| 
								 | 
							
								option, by means of the @t{-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 @t{-o dtr}, @t{-o rts}, @t{-o both} can be specified to
							 | 
						||
| 
								 | 
							
								toggle the control lines of the serial port.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The following mouse type are corrently recognized:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item bare Microsoft
							 | 
						||
| 
								 | 
							
								        The Microsoft protocol, without any extension. It only reports
							 | 
						||
| 
								 | 
							
								        two buttons. If your device has three, you should either try
							 | 
						||
| 
								 | 
							
								        running the @t{mman} decoder or @t{msc}. In the latter case,
							 | 
						||
| 
								 | 
							
								        you need to tell the mouse to talk @t{msc} protocol by
							 | 
						||
| 
								 | 
							
								        toggling the DTR and RTS lines (with one of @t{-o drt}, @t{-o
							 | 
						||
| 
								 | 
							
								        rts} or @t{-o both}) or invoking @code{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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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 @samp{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{-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 @samp{-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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item ms+
							 | 
						||
| 
								 | 
							
									This is the same as @samp{-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 @samp{-t ms+lr} instead
							 | 
						||
| 
								 | 
							
									of this decoder.  This mouse decoder accepts standard serial
							 | 
						||
| 
								 | 
							
									options, although they should not be needed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item ms+lr
							 | 
						||
| 
								 | 
							
									This is the same as @samp{-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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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{-t msc}
							 | 
						||
| 
								 | 
							
									associated with @t{-o rts}, @t{-o dtr} or @t{-o both}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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{-t ms} or similar decoders you may try @t{-t mman} instead
							 | 
						||
| 
								 | 
							
									to use the middle button.  This mouse decoder accepts standard
							 | 
						||
| 
								 | 
							
									serial options, although they should not be needed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item sun
							 | 
						||
| 
								 | 
							
								        The protocol used on Sparc computers and a few others.
							 | 
						||
| 
								 | 
							
								        This mouse decoder accepts standard serial options, although
							 | 
						||
| 
								 | 
							
								        they should not be needed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item mm MMSeries
							 | 
						||
| 
								 | 
							
								        Title says it all.
							 | 
						||
| 
								 | 
							
								        This mouse decoder accepts standard serial options, although
							 | 
						||
| 
								 | 
							
								        they should not be needed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item logi Logitech
							 | 
						||
| 
								 | 
							
								        This is the protocol used by old serial Logitech mice.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item bm BusMouse
							 | 
						||
| 
								 | 
							
								        Some bus devices use this protocol, including those produced
							 | 
						||
| 
								 | 
							
								        by Logitech.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item ps2 PS/2
							 | 
						||
| 
								 | 
							
								        The protocol used by most busmice. 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item ncr
							 | 
						||
| 
								 | 
							
								        This `type' is able to decode the pointing pen found
							 | 
						||
| 
								 | 
							
								        on some laptops (the NCR 3125 pen)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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: 
							 | 
						||
| 
								 | 
							
									@t{-o relative} (default) for relative mode,
							 | 
						||
| 
								 | 
							
									@t{-o absolute} for absolute mode.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item genitizer
							 | 
						||
| 
								 | 
							
									The \"Genitizer\" tablet, in relative mode.
							 | 
						||
| 
								 | 
							
								        This mouse decoder accepts standard serial options, although
							 | 
						||
| 
								 | 
							
								        they should not be needed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item logim
							 | 
						||
| 
								 | 
							
								        Used to turn Logitech mice into Mouse-Systems-Compatible.
							 | 
						||
| 
								 | 
							
								        Obviously, it only works with some of the Logitech mice.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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{-t bare} decoder with no initialization at all.
							 | 
						||
| 
								 | 
							
								        This mouse decoder accepts standard serial options, although
							 | 
						||
| 
								 | 
							
								        they should not be needed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item netmouse
							 | 
						||
| 
								 | 
							
								        Decodes the ``Genius NetMouse'' type of devices on the ps/2
							 | 
						||
| 
								 | 
							
								        port.  For serial ``Netmouse'' devices, use the ``ms3'' decoder.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item cal
							 | 
						||
| 
								 | 
							
									A decoder of the ``Calcomp UltraSlate device.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item calr
							 | 
						||
| 
								 | 
							
									Same as above, but in relative mode.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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 @samp{-R}, @code{gpm} will anyway
							 | 
						||
| 
								 | 
							
								        repeat mouse events to the X server. More information about twiddler
							 | 
						||
| 
								 | 
							
								        support can be found in @file{README.twiddler}, in the gpm
							 | 
						||
| 
								 | 
							
								        distribution.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item synps2 synaptics_ps2
							 | 
						||
| 
								 | 
							
									Same as above, but for the devices attached to the ps2 port.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item js Joystick
							 | 
						||
| 
								 | 
							
								        This mouse type uses the joystick device to generate mouse
							 | 
						||
| 
								 | 
							
								        events. It is only available if the header @file{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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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 @t{-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 @t{xf86Summa.o} module.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item mtouch
							 | 
						||
| 
								 | 
							
								        A decoder for the MicroTouch touch screen. Please refer to the
							 | 
						||
| 
								 | 
							
								        file @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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item gunze
							 | 
						||
| 
								 | 
							
								        A decoder for the gunze touch screen. Please refer to the
							 | 
						||
| 
								 | 
							
								        file @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: @t{smooth=}, @t{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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item acecad
							 | 
						||
| 
								 | 
							
									The Acecad tablet in absolute mode.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item wp wizardpad
							 | 
						||
| 
								 | 
							
									Genius WizardPad tablet
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@ignore
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.SH FILES
							 | 
						||
| 
								 | 
							
								.nf
							 | 
						||
| 
								 | 
							
								src/mice.c           The source file for pointer decoders
							 | 
						||
| 
								 | 
							
								.fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.SH SEE ALSO
							 | 
						||
| 
								 | 
							
								.nf
							 | 
						||
| 
								 | 
							
								\fB gpm(8) \fP     The General Purpose Mouse server
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.fi
							 | 
						||
| 
								 | 
							
								The info file about `gpm', which gives more complete information and
							 | 
						||
| 
								 | 
							
								explains how to write a gpm client.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end ignore
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%MANPAGE END
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%##########################################################################
							 | 
						||
| 
								 | 
							
								@node Gpm Internals, The ClientLib, Server Invocation, Top
							 | 
						||
| 
								 | 
							
								@chapter Gpm Internals
							 | 
						||
| 
								 | 
							
								@cindex Internals
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The server is organized as a main loop built around a @code{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::            
							 | 
						||
| 
								 | 
							
								@end menu
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node Events, Margins, Gpm Internals, Gpm Internals
							 | 
						||
| 
								 | 
							
								@section Events
							 | 
						||
| 
								 | 
							
								@cindex 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. 
							 | 
						||
| 
								 | 
							
								@xref{Default Handlers}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								When a client is involved, it is handled a @code{Gpm_Event}
							 | 
						||
| 
								 | 
							
								structure, built by the server. The fields for @code{Gpm_Event} are the
							 | 
						||
| 
								 | 
							
								following:
							 | 
						||
| 
								 | 
							
								@tindex Gpm_Event
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item unsigned char buttons;
							 | 
						||
| 
								 | 
							
									An or-mask of the values @code{GPM_B_LEFT},
							 | 
						||
| 
								 | 
							
									@code{GPM_B_MIDDLE} and @code{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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item unsigned char modifiers;
							 | 
						||
| 
								 | 
							
									The value of the kernel variable
							 | 
						||
| 
								 | 
							
								        @code{shift_state}, as of @file{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 @code{loadkeys}
							 | 
						||
| 
								 | 
							
								        program. Use of symbolic
							 | 
						||
| 
								 | 
							
								        names in source code is available after inclusion of
							 | 
						||
| 
								 | 
							
								        @file{linux/keyboard.h}, as exemplified in @file{mev.c}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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. 
							 | 
						||
| 
								 | 
							
								        @xref{Default Handlers}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item short x, y;
							 | 
						||
| 
								 | 
							
									The position of the mouse pointer where the event
							 | 
						||
| 
								 | 
							
									is reported. It is 1-based by default, to be compatible with
							 | 
						||
| 
								 | 
							
								        @code{selection} and @code{libcurses}.  This behavior can be
							 | 
						||
| 
								 | 
							
								        overriden, though, by setting the library variable
							 | 
						||
| 
								 | 
							
								        @code{gpm_zerobased}.  
							 | 
						||
| 
								 | 
							
								        @xref{Variables}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item short dx, dy;
							 | 
						||
| 
								 | 
							
									The change in position since the last reported
							 | 
						||
| 
								 | 
							
									event.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item enum Gpm_Etype type;
							 | 
						||
| 
								 | 
							
									A bit-mask, representing the
							 | 
						||
| 
								 | 
							
									type of reported event, as described later. 
							 | 
						||
| 
								 | 
							
								        @xref{Event Types}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item enum Gpm_Margin margin;
							 | 
						||
| 
								 | 
							
									A bit-mask, telling if the pointer has
							 | 
						||
| 
								 | 
							
									gone out of the visible screen. The indivudual bits are
							 | 
						||
| 
								 | 
							
									named @code{GPM_TOP}, @code{GPM_BOT}, @code{GPM_LFT},
							 | 
						||
| 
								 | 
							
								        @code{GPM_RGT}. Only one
							 | 
						||
| 
								 | 
							
									of them is active at a time, to allow using @code{switch} on the
							 | 
						||
| 
								 | 
							
									value. Vertical outrun takes precedence on horizontal outrun.
							 | 
						||
| 
								 | 
							
								        @xref{Margins}.
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node Margins, Event Types, Events, Gpm Internals
							 | 
						||
| 
								 | 
							
								@section How margins are managed
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Motion and button-press events are constrained to remain within the
							 | 
						||
| 
								 | 
							
								visible screen. This means that the @code{x} will be within 1 and 80 and
							 | 
						||
| 
								 | 
							
								@code{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 @code{dx} and @code{dy} fields, which aren't subject to
							 | 
						||
| 
								 | 
							
								clipping.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The server helps applications in detecting margin conditions by filling the
							 | 
						||
| 
								 | 
							
								@code{margin} field. Whenever the pointer tries to cross screen boundaries,
							 | 
						||
| 
								 | 
							
								it is forced to remain on the border, but a flag is set in @code{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 @code{margin} flags. The client should be careful to 
							 | 
						||
| 
								 | 
							
								fit the values within the screen if needed. 
							 | 
						||
| 
								 | 
							
								@xref{Utility Functions}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node Event Types, Connection Details, Margins, Gpm Internals
							 | 
						||
| 
								 | 
							
								@section Event Types
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The @code{type} field in @code{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 @code{GPM_BARE_EVENTS} is provided to
							 | 
						||
| 
								 | 
							
								extract bare events, by and-ing (@samp{&}) it with the @code{type} field.
							 | 
						||
| 
								 | 
							
								For any event, exactly one bit will be set in the resulting bitmask.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Bare events are the following:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item GPM_MOVE
							 | 
						||
| 
								 | 
							
									A motion event, with all buttons up.
							 | 
						||
| 
								 | 
							
								@item GPM_DRAG
							 | 
						||
| 
								 | 
							
									A motion event, but one or more buttons are kept pressed.
							 | 
						||
| 
								 | 
							
								@item GPM_DOWN
							 | 
						||
| 
								 | 
							
									A button press event. The @code{buttons} field will report
							 | 
						||
| 
								 | 
							
								        which buttons are pressed after the event.
							 | 
						||
| 
								 | 
							
								@item GPM_UP
							 | 
						||
| 
								 | 
							
									A button release event. The @code{buttons} field will report
							 | 
						||
| 
								 | 
							
								        which buttons are being released. Note that this is different from
							 | 
						||
| 
								 | 
							
								        the previous case.
							 | 
						||
| 
								 | 
							
								@item 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 @code{GPM_ENTER}, all the other fields are undefined.
							 | 
						||
| 
								 | 
							
								        @xref{High Level Lib}.
							 | 
						||
| 
								 | 
							
								@item GPM_LEAVE
							 | 
						||
| 
								 | 
							
								        This is only delivered by the high level library, too. Events
							 | 
						||
| 
								 | 
							
								        of type @code{GPM_LEAVE} have all other fields undefined.
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Cooked events are the following:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item 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).
							 | 
						||
| 
								 | 
							
								@item GPM_DOUBLE
							 | 
						||
| 
								 | 
							
									Used to identify a double click (press, drag, release)
							 | 
						||
| 
								 | 
							
								@item GPM_TRIPLE
							 | 
						||
| 
								 | 
							
									Used to identify a triple click (press, drag, release)
							 | 
						||
| 
								 | 
							
								@item 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.
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node Connection Details, Default Handlers, Event Types, Gpm Internals
							 | 
						||
| 
								 | 
							
								@section 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. 
							 | 
						||
| 
								 | 
							
								@xref{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 @code{Gpm_Connect} structure and pass
							 | 
						||
| 
								 | 
							
								it to the server. The structure is made up by four @code{unsigned int}
							 | 
						||
| 
								 | 
							
								fields.  
							 | 
						||
| 
								 | 
							
								@xref{Open and Close}.  
							 | 
						||
| 
								 | 
							
								@tindex Gpm_Connect
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item eventMask
							 | 
						||
| 
								 | 
							
									A bitmask of the events the client wants
							 | 
						||
| 
								 | 
							
									to receive. Both bare and cooked events are
							 | 
						||
| 
								 | 
							
									allowed to appear in the mask.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item defaultMask
							 | 
						||
| 
								 | 
							
									A mask to tell which events allow
							 | 
						||
| 
								 | 
							
									a default treatment (the selection one). These are mouse events,
							 | 
						||
| 
								 | 
							
									independent of the modifier keys.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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.
							 | 
						||
| 
								 | 
							
								        @xref{Default Handlers}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item maxMod
							 | 
						||
| 
								 | 
							
									The maximum amount of modifiers the client is willing to receive.
							 | 
						||
| 
								 | 
							
								        Events featuring a modifier key not included in @code{maxMod} won't
							 | 
						||
| 
								 | 
							
								        be passed to the client.
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								@noindent
							 | 
						||
| 
								 | 
							
								Two more fields are there to tell about the connection itself, and you're
							 | 
						||
| 
								 | 
							
								not asked to fill them, because @code{Gpm_Open} will do it for you.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item int pid
							 | 
						||
| 
								 | 
							
									The process id of the connecting application.
							 | 
						||
| 
								 | 
							
								@item int vc
							 | 
						||
| 
								 | 
							
									Which virtual console to gain control of.
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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 @ref{Default Handlers}, but you only
							 | 
						||
| 
								 | 
							
								need to choose the right values for your application.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Examples:
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item minMod=0; maxMod=0;
							 | 
						||
| 
								 | 
							
								        specifies a client which senses mouse-only events, but neither
							 | 
						||
| 
								 | 
							
								        shift-mouse nor alt-mouse nor control-mouse.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item minMod=0; maxMod=~0;
							 | 
						||
| 
								 | 
							
								        is a client which gets any mouse event.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item minMod=1<<KG_SHIFT; maxMod=1<<KG_SHIFT;
							 | 
						||
| 
								 | 
							
								        is a client which senses all shift-mouse events and
							 | 
						||
| 
								 | 
							
								        nothing more.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item minMod=1<<KG_SHIFT; maxMod=~0;
							 | 
						||
| 
								 | 
							
								        is a client interested in shift-and-whatever-else mouse events,
							 | 
						||
| 
								 | 
							
								        but disregarding mouse-only events.
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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 @code{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 @code{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 @code{defaultMask}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Good values for @code{defaultMask} can thus be the following:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item 0
							 | 
						||
| 
								 | 
							
									To sink any event, even those I don't use.
							 | 
						||
| 
								 | 
							
								@item ~eventMask
							 | 
						||
| 
								 | 
							
									Pass along any event I don't use.
							 | 
						||
| 
								 | 
							
								@item ~GPM_HARD
							 | 
						||
| 
								 | 
							
									Just the same, independently of @code{eventMask}.
							 | 
						||
| 
								 | 
							
								@item 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.
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node Default Handlers,  , Connection Details, Gpm Internals
							 | 
						||
| 
								 | 
							
								@section Default Handlers
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In addition to console-specific clients, @code{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 @emph{clients}, in the order of decreasing priority:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@enumerate 1
							 | 
						||
| 
								 | 
							
								@item The current client for the current console, if any.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item The default handler, if any.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item The builtin `selection' mechanism.
							 | 
						||
| 
								 | 
							
								@end enumerate
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A keyboard modifier which connected with a @code{minMod} equal to the
							 | 
						||
| 
								 | 
							
								"Control" modifier and a @code{maxMod} of @samp{~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 @code{minMod} and @code{maxMod} fields are bitmasks, and their values
							 | 
						||
| 
								 | 
							
								are bitwise or-ed and and-ed with the current modifier mask.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@code{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. 
							 | 
						||
| 
								 | 
							
								@xref{gpm-root}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%##########################################################################
							 | 
						||
| 
								 | 
							
								@node The ClientLib, Demo Clients, Gpm Internals, Top
							 | 
						||
| 
								 | 
							
								@chapter The Client Library
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The @file{libgpm.a} archive is meant to provide the mouse protocol at
							 | 
						||
| 
								 | 
							
								different levels of abstraction. Applications linking to the @code{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 @file{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::                       
							 | 
						||
| 
								 | 
							
								@end menu
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node Handling Functions, Low Level Library, The ClientLib, The ClientLib
							 | 
						||
| 
								 | 
							
								@section 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:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@code{typedef int Gpm_Handler(Gpm_Event *@var{event}, void *@var{clientdata});}
							 | 
						||
| 
								 | 
							
								@tindex Gpm_Handler
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The @var{event} is used to instantiate the mouse event just received,
							 | 
						||
| 
								 | 
							
								and the @var{clientdata} pointer is needed to implement some higher
							 | 
						||
| 
								 | 
							
								level functionality. An handler will be typically invoked by
							 | 
						||
| 
								 | 
							
								@code{Gpm_Getc}, or by the high-level library, and the following
							 | 
						||
| 
								 | 
							
								discussion assumes the invoking function is @code{Gpm_Getc} (the
							 | 
						||
| 
								 | 
							
								high-level library only runs on behalf of @code{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 @code{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 @code{gpm_morekeys} to a non-zero
							 | 
						||
| 
								 | 
							
								variable before returning, it will be invoked again without waiting for
							 | 
						||
| 
								 | 
							
								mouse events. You can use @code{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:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item EOF
							 | 
						||
| 
								 | 
							
									This value is used to signal a fatal error, and will cause
							 | 
						||
| 
								 | 
							
									@code{Gpm_Getc} to return the same value to the caller, after setting
							 | 
						||
| 
								 | 
							
									@code{gpm_hflag} to 1.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 0
							 | 
						||
| 
								 | 
							
									A zero return value means that @code{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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item @var{anything-else}
							 | 
						||
| 
								 | 
							
									Any other value is considered a simulated
							 | 
						||
| 
								 | 
							
									character, and is returned to the caller after setting
							 | 
						||
| 
								 | 
							
									@code{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.
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@noindent
							 | 
						||
| 
								 | 
							
								A mouse handler is passed as second argument the content of the
							 | 
						||
| 
								 | 
							
								@code{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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node Low Level Library, High Level Lib, Handling Functions, The ClientLib
							 | 
						||
| 
								 | 
							
								@section 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. 
							 | 
						||
| 
								 | 
							
								@xref{Xterm}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@menu
							 | 
						||
| 
								 | 
							
								* Variables ::                  
							 | 
						||
| 
								 | 
							
								* Open and Close::              
							 | 
						||
| 
								 | 
							
								* Getting Events::              
							 | 
						||
| 
								 | 
							
								* Utility Functions::           
							 | 
						||
| 
								 | 
							
								* Extra Functions::             
							 | 
						||
| 
								 | 
							
								@end menu
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%--------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								@node Variables , Open and Close, Low Level Library, Low Level Library
							 | 
						||
| 
								 | 
							
								@subsection Global Variables
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This is the list of all the global variables present in the client
							 | 
						||
| 
								 | 
							
								library:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@vindex gpm_flag
							 | 
						||
| 
								 | 
							
								@item 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.
							 | 
						||
| 
								 | 
							
								@vindex gpm_tried
							 | 
						||
| 
								 | 
							
								@item int gpm_tried
							 | 
						||
| 
								 | 
							
									A flag, used to avoid retrying a connection if
							 | 
						||
| 
								 | 
							
									the server is not available on the system.
							 | 
						||
| 
								 | 
							
								@vindex gpm_fd
							 | 
						||
| 
								 | 
							
								@item int gpm_fd
							 | 
						||
| 
								 | 
							
									Initially @samp{-1}, it is the file descriptor used
							 | 
						||
| 
								 | 
							
									to talk with the server. If we run under xterm, it will be -2.
							 | 
						||
| 
								 | 
							
								@vindex gpm_zerobased
							 | 
						||
| 
								 | 
							
								@item 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. 
							 | 
						||
| 
								 | 
							
								        @xref{Events}.
							 | 
						||
| 
								 | 
							
								@vindex gpm_visiblepointer
							 | 
						||
| 
								 | 
							
								@item int gpm_visiblepointer
							 | 
						||
| 
								 | 
							
								        If not zero, causes the mouse cursor to be always visible on the
							 | 
						||
| 
								 | 
							
								        window. It is zero by default.
							 | 
						||
| 
								 | 
							
								@vindex gpm_mx
							 | 
						||
| 
								 | 
							
								@vindex gpm_my
							 | 
						||
| 
								 | 
							
								@item gpm_mx
							 | 
						||
| 
								 | 
							
								@itemx gpm_my
							 | 
						||
| 
								 | 
							
								        These variables (max X and max Y) are used when fitting events
							 | 
						||
| 
								 | 
							
								        inside the screen.  They are initialized by @code{Gpm_Open}, and
							 | 
						||
| 
								 | 
							
								        updated by a @code{SIGWINCH} handler internal to the library.
							 | 
						||
| 
								 | 
							
								        (Don't worry, the library doesn't @emph{replace} any
							 | 
						||
| 
								 | 
							
								        @code{SIGWINCH} handler your program may already have installed;
							 | 
						||
| 
								 | 
							
								        instead the library @emph{hooks} the signal, that is, it calls
							 | 
						||
| 
								 | 
							
								        any preexisting handler after taking care of its own needs.)
							 | 
						||
| 
								 | 
							
								@vindex gpm_hflag
							 | 
						||
| 
								 | 
							
								@item int gpm_hflag
							 | 
						||
| 
								 | 
							
									Used to signal if a character has been generated
							 | 
						||
| 
								 | 
							
									by a mouse handler. 
							 | 
						||
| 
								 | 
							
								        @xref{Handling Functions}.
							 | 
						||
| 
								 | 
							
								@vindex gpm_handler
							 | 
						||
| 
								 | 
							
								@vindex gpm_data
							 | 
						||
| 
								 | 
							
								@item Gpm_Handler *gpm_handler; void *gpm_data
							 | 
						||
| 
								 | 
							
									Both initially @code{NULL},
							 | 
						||
| 
								 | 
							
									they're used to setup asynchronous mouse handling, as
							 | 
						||
| 
								 | 
							
									described below under the @code{Gpm_Getc()} item.
							 | 
						||
| 
								 | 
							
								@vindex gpm_morekeys
							 | 
						||
| 
								 | 
							
								@item gpm_morekeys
							 | 
						||
| 
								 | 
							
								        Used by the mouse handler to provide more than one key:
							 | 
						||
| 
								 | 
							
								        if @code{gpm_morekeys} is not zero, @code{Gpm_Getc} will
							 | 
						||
| 
								 | 
							
								        invoke the handler without waiting for events. @code{gpm_morekeys}
							 | 
						||
| 
								 | 
							
								        is never set by the mouse library.
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%--------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								@node Open and Close, Getting Events, Variables , Low Level Library
							 | 
						||
| 
								 | 
							
								@subsection Connecting and Disconnecting
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun int Gpm_Open (Gpm_Connect *@var{conn}, int @var{flag});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Open a connection with the server.  The @var{conn} parameter points to
							 | 
						||
| 
								 | 
							
								the connection information for the being-created connection, as already
							 | 
						||
| 
								 | 
							
								described.  
							 | 
						||
| 
								 | 
							
								@xref{Connection Details}.  
							 | 
						||
| 
								 | 
							
								It is passed to the server after
							 | 
						||
| 
								 | 
							
								filling the @code{pid} and @code{vc} fields.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@var{flag} should be @samp{0} for normal applications, those interested
							 | 
						||
| 
								 | 
							
								in events related to their own console. The own console is considered to
							 | 
						||
| 
								 | 
							
								be the one attached to @code{stdin}, and it must match the string
							 | 
						||
| 
								 | 
							
								@samp{/dev/tty*}. A negative value for @var{flag} is used to make the
							 | 
						||
| 
								 | 
							
								invoking application a default handler @ref{Default Handlers}, while a
							 | 
						||
| 
								 | 
							
								positive value is used to force connection to a particular console,
							 | 
						||
| 
								 | 
							
								either for debugging issues or whenever @code{stdin} is not a tty when
							 | 
						||
| 
								 | 
							
								@code{Gpm_Open} is invoked.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Multiple opens are allowed, and a stack of @code{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 @code{eventMask} zeroed, and @code{defaultMask},
							 | 
						||
| 
								 | 
							
								@code{minMod} and @code{maxMod} all equal to @samp{~0}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The return value is either @samp{-1} or the file descriptor used to
							 | 
						||
| 
								 | 
							
								communicate with the server. When run under xterm, a gpm client gets event
							 | 
						||
| 
								 | 
							
								through @code{stdin}, and the return value for @code{Gpm_Open()} will be @samp{-2}.
							 | 
						||
| 
								 | 
							
								This value is always available in @code{gpm_fd}.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun 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.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%--------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								@node Getting Events, Utility Functions, Open and Close, Low Level Library
							 | 
						||
| 
								 | 
							
								@subsection Getting Events
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun int Gpm_GetEvent (Gpm_Event *@var{event});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Reads an event form @code{gpm_fd}. It should be called only when the
							 | 
						||
| 
								 | 
							
								@code{gpm_fd} descriptor is reported as readable by a @code{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.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun int Gpm_CharsQueued (void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								It returns the number of characters (contained in @code{nbprevchar} index)
							 | 
						||
| 
								 | 
							
								queued into the array @code{prevchar} by function @code{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 @code{Gpm_getc} in order to
							 | 
						||
| 
								 | 
							
								subsequently get it.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun int Gpm_CharsQueued (void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								It returns the number of characters (contained in @code{nbprevchar} index)
							 | 
						||
| 
								 | 
							
								queued into the array @code{prevchar} by function @code{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 @code{Gpm_getc} in order to
							 | 
						||
| 
								 | 
							
								subsequently get it.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun int Gpm_Getc (FILE *@var{f});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@deftypefunx int Gpm_Getchar (void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								These are intended to be replacements for @code{getc()} and
							 | 
						||
| 
								 | 
							
								@code{getchar()} to be used by applications which are interested in the
							 | 
						||
| 
								 | 
							
								mouse. Their external behaviour is the same as @code{getc()}, but a mouse
							 | 
						||
| 
								 | 
							
								handler gets invoked whenever an event is available. 
							 | 
						||
| 
								 | 
							
								@xref{Handling Functions}.
							 | 
						||
| 
								 | 
							
								A mouse handler can force @code{Gpm_Getc} to return a
							 | 
						||
| 
								 | 
							
								specific value to the caller, and the ``simulated'' character is
							 | 
						||
| 
								 | 
							
								signaled by setting @code{gpm_hflag} to 1.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun int Gpm_Wgetch (WINDOW *@var{win});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@deftypefunx int Gpm_Getch (void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								These are intended to be replacements for @code{wgetch()} and
							 | 
						||
| 
								 | 
							
								@code{getch()} to be used by applications which are interested in the
							 | 
						||
| 
								 | 
							
								mouse. They are the curses equivalent of @code{Gpm_Getchar}.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%--------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								@node Utility Functions, Extra Functions, Getting Events, Low Level Library
							 | 
						||
| 
								 | 
							
								@subsection Utility Functions
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun int Gpm_Repeat (int @var{millisecs});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								It returns 1 if no mouse events arrive in the next @var{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
							 | 
						||
| 
								 | 
							
								(@code{while(Gpm_Repeat(200))@dots{}}).
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun int Gpm_DrawPointer (int @var{x}, int @var{y}, int @var{fd});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@deftypefunx int GPM_DRAWPOINTER (Gpm_Event *@var{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. @code{Gpm_DrawPointer} is obsolete, and is
							 | 
						||
| 
								 | 
							
								retained only for compatibility.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun int Gpm_FitValuesM (int *@var{x}, int *@var{y}, int @var{margin});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@deftypefunx int Gpm_FitValues (@var{x},@var{y});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@deftypefunx void Gpm_FitEvent (@var{ePtr});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The first is a function, while the other are macros.
							 | 
						||
| 
								 | 
							
								Note that @code{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 @code{gpm_mx} and @code{gpm_my}. 
							 | 
						||
| 
								 | 
							
								@xref{Variables}.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%--------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								@node Extra Functions,  , Utility Functions, Low Level Library
							 | 
						||
| 
								 | 
							
								@subsection Extra Functions
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun char* Gpm_GetLibVersion (int *@var{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 @samp{"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 @var{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.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun char* Gpm_GetServerVersion (int *@var{where});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This function returns a pointer to a static storage representing the
							 | 
						||
| 
								 | 
							
								version number of the server. The version is retrieved through
							 | 
						||
| 
								 | 
							
								@code{popen()}, so it could fail (and return @code{NULL})if no @code{gpm} program
							 | 
						||
| 
								 | 
							
								is in the current path. Alternatively, it could fail (and return a wrong
							 | 
						||
| 
								 | 
							
								value) if the @code{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 @code{Gpm_GetLibVersion()}. A preparsed
							 | 
						||
| 
								 | 
							
								version is stored in *@var{where} if @var{where} is not null. Both these
							 | 
						||
| 
								 | 
							
								functions do their calculations only the first time they are invoked.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun int Gpm_GetSnapshot (Gpm_Event *@var{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 @var{ePtr} is not null, it is filled with information about the current
							 | 
						||
| 
								 | 
							
								state of the mouse. The fields have the following meaning: @code{x,y}: current
							 | 
						||
| 
								 | 
							
								position of the cursor; @code{dx,dy} size of the window; @code{vc,modifiers} the
							 | 
						||
| 
								 | 
							
								current console and the current shift state; @code{buttons} which buttons
							 | 
						||
| 
								 | 
							
								are currently help down; @code{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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%--------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								@node High Level Lib, Xterm, Low Level Library, The ClientLib
							 | 
						||
| 
								 | 
							
								@section High Level Library
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The high level library is part of the main @file{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 @emph{only} runs under xterm, please see
							 | 
						||
| 
								 | 
							
								@file{gpm-xterm} in the @file{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.
							 | 
						||
| 
								 | 
							
								@xref{hltest}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@menu
							 | 
						||
| 
								 | 
							
								* Concepts::                    
							 | 
						||
| 
								 | 
							
								* hl-Variables::                
							 | 
						||
| 
								 | 
							
								* hl-Functions::                
							 | 
						||
| 
								 | 
							
								@end menu
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%--------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								@node Concepts, hl-Variables, High Level Lib, High Level Lib
							 | 
						||
| 
								 | 
							
								@subsection Concepts
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The high-level library is completely independent of the low-level one,
							 | 
						||
| 
								 | 
							
								so it uses @code{gpm_handler} and @code{gpm_data} as connection point with
							 | 
						||
| 
								 | 
							
								@code{Gpm_Getc()}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								All the functionality is based on the concept of RoI's. each RoI is
							 | 
						||
| 
								 | 
							
								described by a @code{Gpm_Roi} structure, which is made up by the following
							 | 
						||
| 
								 | 
							
								fields:
							 | 
						||
| 
								 | 
							
								@tindex Gpm_roi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item short yMin, yMax
							 | 
						||
| 
								 | 
							
								        These numbers identify the lower-right corner of the region.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item unsigned short minMod, maxMod
							 | 
						||
| 
								 | 
							
								        These modifier masks have the same role within the application as
							 | 
						||
| 
								 | 
							
								        the same fields have in inter-application multiplexing.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item unsigned short eventMask
							 | 
						||
| 
								 | 
							
								        It is the mask of events which are to be reported to the current
							 | 
						||
| 
								 | 
							
								        region.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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 @code{free(0} when
							 | 
						||
| 
								 | 
							
								        needed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item Gpm_Handler *handler
							 | 
						||
| 
								 | 
							
								        The function to be called when events are to be reported to the
							 | 
						||
| 
								 | 
							
								        current region.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item void *clientdata
							 | 
						||
| 
								 | 
							
								        The clientdata to be passed to the handler
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item Gpm_Roi *next, *prev
							 | 
						||
| 
								 | 
							
								        Links to the RoI chain.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%--------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								@node hl-Variables, hl-Functions, Concepts, High Level Lib
							 | 
						||
| 
								 | 
							
								@subsection Variables
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item Gpm_Roi* gpm_roi
							 | 
						||
| 
								 | 
							
								        The linked list of regions (pointer to the top one).
							 | 
						||
| 
								 | 
							
								@vindex gpm_roi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item Gpm_Roi* gpm_current_roi
							 | 
						||
| 
								 | 
							
								        The region which got the last event (used to generate enter and
							 | 
						||
| 
								 | 
							
								        leave events).
							 | 
						||
| 
								 | 
							
								@vindex gpm_current_roi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item 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.
							 | 
						||
| 
								 | 
							
								@vindex gpm_roi_handler
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item void* gpm_roi_data
							 | 
						||
| 
								 | 
							
								        the client data to be passed to @code{gpm_roi_handler}.
							 | 
						||
| 
								 | 
							
								@vindex gpm_roi_data
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%--------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								@node hl-Functions,  , hl-Variables, High Level Lib
							 | 
						||
| 
								 | 
							
								@subsection Functions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun Gpm_Roi* Gpm_PushRoi (int @var{xmin}, int @var{ymin}, int @var{xmax}, int @var{ymax},
							 | 
						||
| 
								 | 
							
								        int @var{mask}, Gpm_Handler *@var{fun}, void *@var{xtradata});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This function pushes a Region of Interest on top of the stack, after
							 | 
						||
| 
								 | 
							
								allocating it and filling with the provided values. @var{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 @code{struct Gpm_Roi} structure, described in @file{gpm.h}.
							 | 
						||
| 
								 | 
							
								The @code{xtradata} field will be used to fill the @code{xtradata} field in
							 | 
						||
| 
								 | 
							
								@code{Gpm_Roi}.
							 | 
						||
| 
								 | 
							
								the return value is the Roi just pushed (i.e. the top of stack).
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun char* Gpm_UseRoi (Gpm_Roi *@var{roi});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								While @code{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.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun Gpm_Roi* Gpm_PopRoi (Gpm_Roi *@var{roi});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Used to extract a Region of Interest from the stack, this function will
							 | 
						||
| 
								 | 
							
								also clear the Region if it is needed.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun Gpm_Roi* Gpm_RaiseRoi (Gpm_Roi *@var{which}, Gpm_Roi *@var{before});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Raise the specified roi, either before the second Roi or at top-of-
							 | 
						||
| 
								 | 
							
								stack (if @var{before} is @code{NULL}). The return value is the new top-of-stack.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun Gpm_Roi* Gpm_LowerRoi (Gpm_Roi *@var{which}, Gpm_Roi *@var{after});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Lower the specified roi, either after the second Roi or at bottom-of-
							 | 
						||
| 
								 | 
							
								stack (if @var{before} is NULL). The return value is the new top-of-stack.
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%.........................................................................
							 | 
						||
| 
								 | 
							
								@deftypefun Gpm_Roi* Gpm_HandleRoi (Gpm_Event *@var{ePtr}, void * @var{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 @code{*gpm_roi_handler} function
							 | 
						||
| 
								 | 
							
								is invoked (if not null), with null clientdata.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Reported events are all those in @code{Gpm_Event}, and also @code{GPM_ENTER}
							 | 
						||
| 
								 | 
							
								and @code{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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end deftypefun
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node Xterm,  , High Level Lib, The ClientLib
							 | 
						||
| 
								 | 
							
								@section Running under @code{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
							 | 
						||
| 
								 | 
							
								@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 @file{sample} directory in the distribution tree is meant to show how
							 | 
						||
| 
								 | 
							
								a simple mouse-sensitive application can be easily autoconfigured and
							 | 
						||
| 
								 | 
							
								compiled. The @code{rmev} program has proved to compile and run smoothly
							 | 
						||
| 
								 | 
							
								under Linux (both with and without @file{libgpm.a}), SunOS-4, Solaris-5,
							 | 
						||
| 
								 | 
							
								hpux-8.x and Ultrix-3.0.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%##########################################################################
							 | 
						||
| 
								 | 
							
								@node Demo Clients, Type Index, The ClientLib, Top
							 | 
						||
| 
								 | 
							
								@chapter Demonstration Clients
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@menu
							 | 
						||
| 
								 | 
							
								* mev::                         
							 | 
						||
| 
								 | 
							
								* sample/rmev::                 
							 | 
						||
| 
								 | 
							
								* Emacs Support::               
							 | 
						||
| 
								 | 
							
								* gpm-root::                    
							 | 
						||
| 
								 | 
							
								* hltest::                      
							 | 
						||
| 
								 | 
							
								* mouse-test::                  
							 | 
						||
| 
								 | 
							
								@end menu
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node mev, sample/rmev, Demo Clients, Demo Clients
							 | 
						||
| 
								 | 
							
								@section @code{mev}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%MANPAGE mev.1
							 | 
						||
| 
								 | 
							
								%M .TH MEV 1 "February 1995"
							 | 
						||
| 
								 | 
							
								%M .UC 4
							 | 
						||
| 
								 | 
							
								%M .SH NAME
							 | 
						||
| 
								 | 
							
								%M mev \- a program to report mouse events
							 | 
						||
| 
								 | 
							
								%M .SH SYNOPSIS
							 | 
						||
| 
								 | 
							
								%M .B mev
							 | 
						||
| 
								 | 
							
								%M [
							 | 
						||
| 
								 | 
							
								%M .I options
							 | 
						||
| 
								 | 
							
								%M ]
							 | 
						||
| 
								 | 
							
								%M .br
							 | 
						||
| 
								 | 
							
								%M .SH DESCRIPTION
							 | 
						||
| 
								 | 
							
								%M The `mev' program is part of the gpm package.
							 | 
						||
| 
								 | 
							
								%M
							 | 
						||
| 
								 | 
							
								%M The information below is extracted from the texinfo file, which is the
							 | 
						||
| 
								 | 
							
								%M preferred source of information.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The @code{mev} program is modeled after @code{xev}. It prints to @code{stdout} the
							 | 
						||
| 
								 | 
							
								mouse console events it gets.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@code{mev}'s default behaviour is to get anything, but command line switches
							 | 
						||
| 
								 | 
							
								can be used to set the various fields in the @code{Gpm_Connect} structure, in
							 | 
						||
| 
								 | 
							
								order to customize the program's behaviour. I'm using @code{mev} to
							 | 
						||
| 
								 | 
							
								handle mouse events to Emacs.
							 | 
						||
| 
								 | 
							
								@xref{Emacs Support}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Command line switches for @code{mev} are the following:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item -C @var{number}
							 | 
						||
| 
								 | 
							
									Select a virtual console to get events from.
							 | 
						||
| 
								 | 
							
									This is intended to be used for debugging.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -d @var{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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -e @var{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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -f
							 | 
						||
| 
								 | 
							
								        Fit events inside the screen before reporting them. This options
							 | 
						||
| 
								 | 
							
								        re-fits drag events, which are allowed to exit the screen border,
							 | 
						||
| 
								 | 
							
								        @xref{Margins}.
							 | 
						||
| 
								 | 
							
								@item -i
							 | 
						||
| 
								 | 
							
									Interactive. Accepts input from @code{stdin} to change connection
							 | 
						||
| 
								 | 
							
									parameters.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -m @var{number}
							 | 
						||
| 
								 | 
							
									Choose the minimum modifier mask. Any event with
							 | 
						||
| 
								 | 
							
									fewer modifiers will not be reported to @code{mev}. It defaults to @samp{0}.
							 | 
						||
| 
								 | 
							
									The mask must be provided either as a
							 | 
						||
| 
								 | 
							
									decimal number, or as a symbolic string.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -M @var{number}
							 | 
						||
| 
								 | 
							
									Choose the maximum modifier mask. Any event with
							 | 
						||
| 
								 | 
							
									more modifier than specified will not be reported to @code{mev}.
							 | 
						||
| 
								 | 
							
									It defaults to @samp{\~0}, i.e. all events are received.
							 | 
						||
| 
								 | 
							
									The mask must be provided either as a
							 | 
						||
| 
								 | 
							
									decimal number, or as a symbolic string.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -p
							 | 
						||
| 
								 | 
							
								        Requests to draw the pointer during drags. This option is used
							 | 
						||
| 
								 | 
							
								        by emacs to avoid invoking @code{ioctl()} from lisp code.
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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 (@samp{,}), but any will do.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Allowed names for events are @samp{move}, @samp{drag}, @samp{down} or
							 | 
						||
| 
								 | 
							
								@samp{press}, @samp{up} or @samp{release}, @samp{motion} (which is both
							 | 
						||
| 
								 | 
							
								@samp{move} and @samp{drag}), and @samp{hard}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Allowed names for modifiers are @samp{shift}, @samp{leftAlt},
							 | 
						||
| 
								 | 
							
								@samp{rightAlt}, @samp{anyAlt} (one or the other), @samp{control}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								When the @samp{-i} switch is specified, @code{mev} looks at its standard input as
							 | 
						||
| 
								 | 
							
								command lines rather than events. The input lines are parsed, and the
							 | 
						||
| 
								 | 
							
								commands @samp{push} and @samp{pop} are recognized.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The @samp{push} command, then, accepts the options @samp{-d}, @samp{-e}, @samp{-m}
							 | 
						||
| 
								 | 
							
								and @samp{-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. @samp{pop} is used to pop the connection
							 | 
						||
| 
								 | 
							
								stack. If an empty stack is popped the program exits.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Other commands recognized are @samp{info}, used to return the stack
							 | 
						||
| 
								 | 
							
								depth; @samp{quit} to prematurely terminate the program; and
							 | 
						||
| 
								 | 
							
								@samp{snapshot} to get some configuration information from the server.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@ignore
							 | 
						||
| 
								 | 
							
								.SH BUGS
							 | 
						||
| 
								 | 
							
								Beginning with release 1.16, \fBmev\fP no longer works under xterm.
							 | 
						||
| 
								 | 
							
								Please use the \fBrmev\fP program (provided in the \fBsample\fP
							 | 
						||
| 
								 | 
							
								directory) to watch gpm events under xterm or rxvt.  \fBrmev\fP also
							 | 
						||
| 
								 | 
							
								displays keyboard events besides mouse events.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.SH AUTHOR
							 | 
						||
| 
								 | 
							
								Alessandro Rubini <rubini@linux.it>
							 | 
						||
| 
								 | 
							
								.br
							 | 
						||
| 
								 | 
							
								Ian Zimmerman <itz@speakeasy.org>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.SH FILES
							 | 
						||
| 
								 | 
							
								.nf
							 | 
						||
| 
								 | 
							
								/dev/gpmctl The socket used to connect to gpm.
							 | 
						||
| 
								 | 
							
								.fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.SH SEE ALSO
							 | 
						||
| 
								 | 
							
								.nf
							 | 
						||
| 
								 | 
							
								\fB gpm(8) \fP      The mouse server
							 | 
						||
| 
								 | 
							
								\fB gpm-root(1) \fP An handler for Control-Mouse events.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.fi
							 | 
						||
| 
								 | 
							
								The info file about `gpm', which gives more complete information and
							 | 
						||
| 
								 | 
							
								explains how to write a gpm client.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end ignore
							 | 
						||
| 
								 | 
							
								%MANPAGE END
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node sample/rmev, Emacs Support, mev, Demo Clients
							 | 
						||
| 
								 | 
							
								@section @code{sample/rmev}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@code{rmev} is a reduced version of @code{mev}, but it is designed to be as
							 | 
						||
| 
								 | 
							
								portable as possible. It uses a subset of the capabilities of @file{libgpm.a},
							 | 
						||
| 
								 | 
							
								but works smoothly on both xterm and the Linux console. It is distributed
							 | 
						||
| 
								 | 
							
								with @code{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.
							 | 
						||
| 
								 | 
							
								@xref{Xterm}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node Emacs Support, gpm-root, sample/rmev, Demo Clients
							 | 
						||
| 
								 | 
							
								@section Emacs Support
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Emacs support is quite complete as of 0.14.  The enclosed file
							 | 
						||
| 
								 | 
							
								@file{t-mouse.el}, also available in byte-compiled form, is used to pass
							 | 
						||
| 
								 | 
							
								mouse events to emacs.  @file{t-mouse.elc} is installed in the correct
							 | 
						||
| 
								 | 
							
								@t{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 @code{gpm-root}.
							 | 
						||
| 
								 | 
							
								@xref{gpm-root}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								I suggest to put the following form in your own @file{.emacs} file, to 
							 | 
						||
| 
								 | 
							
								avoid loading @code{t-mouse} when you aren't working on the Linux console:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@lisp
							 | 
						||
| 
								 | 
							
								(if (and (string-match ".*-linux" system-configuration)
							 | 
						||
| 
								 | 
							
								         (or (string-match "linux" (getenv "TERM"))
							 | 
						||
| 
								 | 
							
								             (string-match "con.*" (getenv "TERM"))))
							 | 
						||
| 
								 | 
							
								    (load-library "t-mouse"))
							 | 
						||
| 
								 | 
							
								@end lisp
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Mouse events are appended to the list variable
							 | 
						||
| 
								 | 
							
								@code{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 @code{t-mouse}.  If you want to modify
							 | 
						||
| 
								 | 
							
								what Emacs does in response to mouse events, please see
							 | 
						||
| 
								 | 
							
								@ref{Keymaps,,,elisp}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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 @code{gpm} server, Emacs won't respond to mouse events
							 | 
						||
| 
								 | 
							
								any more. If the server is then restarted, you can invoke `@kbd{M-x
							 | 
						||
| 
								 | 
							
								t-mouse-run}' to restart mouse responsiveness in the editor.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node gpm-root, hltest, Emacs Support, Demo Clients
							 | 
						||
| 
								 | 
							
								@section The ``gpm-root'' program
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%MANPAGE gpm-root.1
							 | 
						||
| 
								 | 
							
								%M .TH GPM-ROOT 1 "February 1995"
							 | 
						||
| 
								 | 
							
								%M .UC 4
							 | 
						||
| 
								 | 
							
								%M .SH NAME
							 | 
						||
| 
								 | 
							
								%M gpm-root \- a default handler for gpm, used to draw menus on
							 | 
						||
| 
								 | 
							
								%M the root window
							 | 
						||
| 
								 | 
							
								%M
							 | 
						||
| 
								 | 
							
								%M .SH SYNOPSIS
							 | 
						||
| 
								 | 
							
								%M .B gpm-root
							 | 
						||
| 
								 | 
							
								%M [
							 | 
						||
| 
								 | 
							
								%M .I options
							 | 
						||
| 
								 | 
							
								%M ]
							 | 
						||
| 
								 | 
							
								%M .br
							 | 
						||
| 
								 | 
							
								%M .SH DESCRIPTION
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The program @code{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 @code{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 @file{/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 @code{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:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item -m @var{number}
							 | 
						||
| 
								 | 
							
								        Choose the modifier to use (by default: @samp{control}). The modifier
							 | 
						||
| 
								 | 
							
								        can be provided either as a number or as a symbolic string.
							 | 
						||
| 
								 | 
							
								        Allowed strings are @samp{shift}, @samp{anyAlt}, @samp{leftAlt},
							 | 
						||
| 
								 | 
							
								        @samp{rightAlt}, @samp{control}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -u
							 | 
						||
| 
								 | 
							
								        Deny using user-specific configuration files. With this
							 | 
						||
| 
								 | 
							
								        option on, only @file{/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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item -V @var{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 @b{getopt(3)} rules a negative
							 | 
						||
| 
								 | 
							
								        argument must follow the option with no space betwixt (that is,
							 | 
						||
| 
								 | 
							
								        @samp{-V-1} but not @samp{-V -1}).  @xref{Program Arguments,,,libc}.
							 | 
						||
| 
								 | 
							
								        The argument is optional and its default value is 1.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%M The actual configuration file is better introduced by looking at your
							 | 
						||
| 
								 | 
							
								%M @file{/etc/gpm-root.conf}.
							 | 
						||
| 
								 | 
							
								%M
							 | 
						||
| 
								 | 
							
								%MSKIP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The actual configuration file is better introduced by an example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@lisp
							 | 
						||
| 
								 | 
							
								# 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"
							 | 
						||
| 
								 | 
							
								          @}
							 | 
						||
| 
								 | 
							
								 @}
							 | 
						||
| 
								 | 
							
								@end lisp
							 | 
						||
| 
								 | 
							
								%M .fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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 (@samp{#}) found at the beginning of the line or
							 | 
						||
| 
								 | 
							
								after white space makes the parser discard anything up to the next
							 | 
						||
| 
								 | 
							
								line. To insert quotes (@samp{"}) 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:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item button @var{number} @var{menu}
							 | 
						||
| 
								 | 
							
								        The @code{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.
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The following statements belong to the cfg set.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item name @var{string}
							 | 
						||
| 
								 | 
							
								        If the @code{name} keyword is present, the specified
							 | 
						||
| 
								 | 
							
								        @var{string} will be used as the name for the current menu.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item background @var{color}
							 | 
						||
| 
								 | 
							
								        This statements is used to specify the
							 | 
						||
| 
								 | 
							
								        background color to be used in the current menu. The @var{color}
							 | 
						||
| 
								 | 
							
								        can be specified with one of the eight canonical strings @samp{black},
							 | 
						||
| 
								 | 
							
								        @samp{red}, @samp{cyan} etc. The background defaults to black.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item foreground @var{color}
							 | 
						||
| 
								 | 
							
								        This statements is used to specify the
							 | 
						||
| 
								 | 
							
								        foreground color for menu items. Its value defaults to @samp{white}.
							 | 
						||
| 
								 | 
							
								        An optional @samp{bright} keyword can appear before the actual color.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item border @var{color}
							 | 
						||
| 
								 | 
							
								        @code{border} is used to specify the
							 | 
						||
| 
								 | 
							
								        border color for the menu. Its value defaults to @samp{white}.
							 | 
						||
| 
								 | 
							
								        An optional @samp{bright} keyword can appear before the actual color.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item head @var{color}
							 | 
						||
| 
								 | 
							
								        @code{head} is used to specify the
							 | 
						||
| 
								 | 
							
								        foreground color for the title of the menu. Its value defaults
							 | 
						||
| 
								 | 
							
								        to @samp{white}.
							 | 
						||
| 
								 | 
							
								        An optional @samp{bright} keyword can appear before the actual color.
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The following statements belong to the action set.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@table @code
							 | 
						||
| 
								 | 
							
								@item @var{string} f.fgcmd @var{cmdstring}
							 | 
						||
| 
								 | 
							
								        When the mouse button is
							 | 
						||
| 
								 | 
							
								        released above the corresponding menu item, the @var{cmdstring} is
							 | 
						||
| 
								 | 
							
								        pasted in the keyboard queue of the current console. This is
							 | 
						||
| 
								 | 
							
								        not yet implemented.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item @var{string} f.bgcmd @var{cmdstring}
							 | 
						||
| 
								 | 
							
									When the mouse button is released above the
							 | 
						||
| 
								 | 
							
								        corresponding menu item, a shell (@file{/bin/sh}) is forked to
							 | 
						||
| 
								 | 
							
								        execute the specified command, with @code{stdin}
							 | 
						||
| 
								 | 
							
								        connected to @file{/dev/null}, and @code{stdout}, @code{stderr} connected
							 | 
						||
| 
								 | 
							
								        to the active console.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item @var{string} f.jptty @var{ttynumber}
							 | 
						||
| 
								 | 
							
								        When the mouse button is
							 | 
						||
| 
								 | 
							
								        released above the corresponding menu item, the console is
							 | 
						||
| 
								 | 
							
								        switched to the one specified. The @var{ttynumber} must be specified
							 | 
						||
| 
								 | 
							
								        as a string. Any tty can be reached this way, even those which are
							 | 
						||
| 
								 | 
							
								        not accessible via the keyboard.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item @var{string} f.mktty @var{ttynumber}
							 | 
						||
| 
								 | 
							
								        When the mouse button is
							 | 
						||
| 
								 | 
							
								        released above the corresponding menu item, an unused console is
							 | 
						||
| 
								 | 
							
								        selected, and @file{/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 @file{/etc/inittab}
							 | 
						||
| 
								 | 
							
								        and requesting the others only when i need to login.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item @var{string} @var{Whole-menu}
							 | 
						||
| 
								 | 
							
								        A menu can directly follow the label string.
							 | 
						||
| 
								 | 
							
								        When the mouse pointer leaves the menu frame at the level of @var{string},
							 | 
						||
| 
								 | 
							
								        a second menu is posted on screen.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item @var{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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item @var{string} f.load
							 | 
						||
| 
								 | 
							
								        The current loadavg when the menu is posted is concatenated to @var{string}
							 | 
						||
| 
								 | 
							
								        to build the actual message displayed on screen. Nothing happens at
							 | 
						||
| 
								 | 
							
								        button release.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item @var{string} f.free
							 | 
						||
| 
								 | 
							
								        The free memory and swap when the menu is posted is concatenated
							 | 
						||
| 
								 | 
							
								        to @var{string}
							 | 
						||
| 
								 | 
							
								        to build the actual message displayed on screen. Nothing happens at
							 | 
						||
| 
								 | 
							
								        button release.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item @var{string} f.time
							 | 
						||
| 
								 | 
							
								        The current time is formatted with @b{strftime(3)}, according to
							 | 
						||
| 
								 | 
							
								        @var{string}. The resulting string is
							 | 
						||
| 
								 | 
							
								        the actual message displayed on screen. Nothing happens at
							 | 
						||
| 
								 | 
							
								        button release.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@item @var{string} f.pipe @var{cmdline}
							 | 
						||
| 
								 | 
							
								        When the mouse pointer leaves the menu frame at the level of @var{string},
							 | 
						||
| 
								 | 
							
								        a message box is posted on screen showing the last ten lines
							 | 
						||
| 
								 | 
							
								        of the output of @var{cmdline}. @var{cmdline} is executed
							 | 
						||
| 
								 | 
							
								        by @file{/bin/sh}. This is not yet implemented.
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								@item @var{string} f.nop
							 | 
						||
| 
								 | 
							
								        This does nothing, it only displays @var{string} on the menu.
							 | 
						||
| 
								 | 
							
								@end table
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The @code{HOME}, @code{LOGNAME} and @code{USER} environment variables are setup
							 | 
						||
| 
								 | 
							
								to the values for the invoking user before spawning an external
							 | 
						||
| 
								 | 
							
								process (@code{f.bgcmd}, @code{f.pipe}). The current directory is always @file{/}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%M .SH BUGS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Known bugs have been fixed. In particular, if you invoke @code{gpm-root}
							 | 
						||
| 
								 | 
							
								right after @code{gpm}, it will delay a few seconds before trying to connect
							 | 
						||
| 
								 | 
							
								to the daemon.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@ignore
							 | 
						||
| 
								 | 
							
								.SH AUTHOR
							 | 
						||
| 
								 | 
							
								Alessandro Rubini <rubini@linux.it>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.SH FILES
							 | 
						||
| 
								 | 
							
								.nf
							 | 
						||
| 
								 | 
							
								/dev/gpmctl     The socket used to connect to gpm.
							 | 
						||
| 
								 | 
							
								/etc/gpm-root.conf  The default configuration file.
							 | 
						||
| 
								 | 
							
								$(HOME)/.gpm-root   The user configuration file.
							 | 
						||
| 
								 | 
							
								/dev/vcs*           Virtual Console Screens
							 | 
						||
| 
								 | 
							
								.fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.SH SEE ALSO
							 | 
						||
| 
								 | 
							
								.nf
							 | 
						||
| 
								 | 
							
								\fB gpm(8) \fP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.fi
							 | 
						||
| 
								 | 
							
								The info file about `gpm', which gives more complete information and
							 | 
						||
| 
								 | 
							
								explains how to write a gpm client.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end ignore
							 | 
						||
| 
								 | 
							
								%MANPAGE END
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node hltest, mouse-test, gpm-root, Demo Clients
							 | 
						||
| 
								 | 
							
								@section @code{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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%==========================================================================
							 | 
						||
| 
								 | 
							
								@node mouse-test,  , hltest, Demo Clients
							 | 
						||
| 
								 | 
							
								@section @code{mouse-test}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%MANPAGE mouse-test.1
							 | 
						||
| 
								 | 
							
								%M .TH mouse-test 1 "March 26, 1998" ""
							 | 
						||
| 
								 | 
							
								%M .SH NAME
							 | 
						||
| 
								 | 
							
								%M mouse-test \- a tool for determining mouse type and device it's attached to.
							 | 
						||
| 
								 | 
							
								%M .SH SYNTAX
							 | 
						||
| 
								 | 
							
								%M \fBmouse-test\fR [ \fIdevice\fR ... ]
							 | 
						||
| 
								 | 
							
								%M .SH DESCRIPTION
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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 @samp{-t ms} (three-buttons aware) and
							 | 
						||
| 
								 | 
							
								@samp{-t bare} old two-buttons-only serial mice.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%M .SH BUGS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@ignore
							 | 
						||
| 
								 | 
							
								.SS OPTIONS
							 | 
						||
| 
								 | 
							
								.IP \fIdevice\fP
							 | 
						||
| 
								 | 
							
								[ \fIdevice\fP ... ]
							 | 
						||
| 
								 | 
							
								.PP
							 | 
						||
| 
								 | 
							
								Check this \fIdevice\fP for a mouse.  If no devices are listed, mouse-test will try all possible devices.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.SH AUTHOR
							 | 
						||
| 
								 | 
							
								Alessandro Rubini <rubini@linux.it>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.SH FILES
							 | 
						||
| 
								 | 
							
								.nf
							 | 
						||
| 
								 | 
							
								/dev/*              The devices used to search for a mouse
							 | 
						||
| 
								 | 
							
								.fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.SH SEE ALSO
							 | 
						||
| 
								 | 
							
								.nf
							 | 
						||
| 
								 | 
							
								gpm(8)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end ignore
							 | 
						||
| 
								 | 
							
								%MANPAGE END
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								%##########################################################################
							 | 
						||
| 
								 | 
							
								@node Type Index, Function Index, Demo Clients, Top
							 | 
						||
| 
								 | 
							
								@unnumbered Type Index
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@printindex tp
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@node Function Index, Variable Index, Type Index, Top
							 | 
						||
| 
								 | 
							
								@unnumbered API Index
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@printindex fn
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@node Variable Index,  , Function Index, Top
							 | 
						||
| 
								 | 
							
								@unnumbered Variable Index
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@printindex vr
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%@iftex
							 | 
						||
| 
								 | 
							
								%@unnumbered Table of Contents
							 | 
						||
| 
								 | 
							
								%@contents
							 | 
						||
| 
								 | 
							
								%@end iftex
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@bye
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * This is because Linus uses 4-wide tabstops,
							 | 
						||
| 
								 | 
							
								 * forcing me to use the same default to manage kernel sources
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Local Variables: */
							 | 
						||
| 
								 | 
							
								/* tab-width:8      */
							 | 
						||
| 
								 | 
							
								/* End:             */
							 |