Subsections

6 The GPM unit

gpmex

1 Introduction

The GPM unit implements an interface to filelibgpm, the console program for mouse handling. This unit was created by Peter Vreman, and is only available on LINUX.

When this unit is used, your program is linked to the C libraries, so you must take care of the C library version. Also, it will only work with version 1.17 or higher of the libgpm library.

2 Constants, types and variables

1 constants

The following constants are used to denote filenames used by the library:
_PATH_VARRUN = '/var/run/';
_PATH_DEV    = '/dev/';
GPM_NODE_DIR = _PATH_VARRUN;
GPM_NODE_DIR_MODE = 0775;
GPM_NODE_PID  = '/var/run/gpm.pid';
GPM_NODE_DEV  = '/dev/gpmctl';
GPM_NODE_CTL  = GPM_NODE_DEV;
GPM_NODE_FIFO = '/dev/gpmdata';
The following constants denote the buttons on the mouse:
GPM_B_LEFT   = 4;
GPM_B_MIDDLE = 2;
GPM_B_RIGHT  = 1;
The following constants define events:
GPM_MOVE = 1;      
GPM_DRAG = 2;
GPM_DOWN = 4;
GPM_UP = 8;
GPM_SINGLE = 16;
GPM_DOUBLE = 32;
GPM_TRIPLE = 64;
GPM_MFLAG = 128;
GPM_HARD = 256;
GPM_ENTER = 512;
GPM_LEAVE = 1024;
The following constants are used in defining margins:
GPM_TOP = 1;
GPM_BOT = 2;
GPM_LFT = 4;
GPM_RGT = 8;

2 Types

The following general types are defined:
  TGpmEtype = longint;
  TGpmMargin = longint;
The following type describes an event; it is passed in many of the gpm functions.
PGpmEvent = ^TGpmEvent;
TGpmEvent = record
  buttons : byte;
  modifiers : byte;
  vc : word;
  dx : word;
  dy : word;
  x : word;
  y : word;
  EventType : TGpmEType;
  clicks : longint;
  margin : TGpmMargin;
end;
TGpmHandler=function(var event:TGpmEvent;clientdata:pointer):longint;cdecl;
The following types are used in connecting to the gpm server:
PGpmConnect = ^TGpmConnect;
TGpmConnect = record
  eventMask : word;
  defaultMask : word;
  minMod : word;
  maxMod : word;
  pid : longint;
  vc : longint;
end;
The following type is used to define regions of interest
PGpmRoi = ^TGpmRoi;
TGpmRoi = record
  xMin : integer;
  xMax : integer;
  yMin : integer;
  yMax : integer;
  minMod : word;
  maxMod : word;
  eventMask : word;
  owned : word;
  handler : TGpmHandler;
  clientdata : pointer;
  prev : PGpmRoi;
  next : PGpmRoi;
end;

3 Variables

The following variables are imported from the gpm library
gpm_flag           : longint;cvar;external;
gpm_fd             : longint;cvar;external;
gpm_hflag          : longint;cvar;external;
gpm_morekeys       : Longbool;cvar;external;
gpm_zerobased      : Longbool;cvar;external;
gpm_visiblepointer : Longbool;cvar;external;
gpm_mx             : longint;cvar;external;
gpm_my             : longint;cvar;external;
gpm_timeout        : TTimeVal;cvar;external;
_gpm_buf           : array[0..0] of char;cvar;external;
_gpm_arg           : ^word;cvar;external;
gpm_handler        : TGpmHandler;cvar;external;
gpm_data           : pointer;cvar;external;
gpm_roi_handler    : TGpmHandler;cvar;external;
gpm_roi_data       : pointer;cvar;external;
gpm_roi            : PGpmRoi;cvar;external;
gpm_current_roi    : PGpmRoi;cvar;external;
gpm_consolefd      : longint;cvar;external;
Gpm_HandleRoi      : TGpmHandler;cvar;external;

3 Functions and procedures


1 Gpm_AnyDouble

Declaration
function Gpm_AnyDouble(EventType : longint) : boolean;
Description
Gpm_AnyDouble returns True if EventType contains the GPM_DOUBLE flag, False otherwise.
Errors
None.
See also
Gpm_StrictSingle, Gpm_AnySingle, Gpm_StrictDouble, Gpm_StrictTriple, Gpm_AnyTriple


2 Gpm_AnySingle

Declaration
function Gpm_AnySingle(EventType : longint) : boolean;
Description
Gpm_AnySingle returns True if EventType contains the GPM_SINGLE flag, False otherwise.
Errors
See also
Gpm_StrictSingle, Gpm_AnyDoubmle, Gpm_StrictDouble, Gpm_StrictTriple, Gpm_AnyTriple


3 Gpm_AnyTriple

Declaration
function Gpm_AnyTriple(EventType : longint) : boolean;
Description
Errors
See also
Gpm_StrictSingle, Gpm_AnyDoubmle, Gpm_StrictDouble, Gpm_StrictTriple, Gpm_AnySingle


4 Gpm_Close

Declaration
function Gpm_Close:longint;cdecl;external;
Description
Gpm_Close closes the current connection, and pops the connection stack; this means that the previous connection becomes active again.

The function returns -1 if the current connection is not the last one, and it returns 0 if the current connection is the last one.

Errors
None.
See also
Gpm_Open

for an example, see Gpm_GetEvent.


5 Gpm_FitValues

Declaration
function Gpm_FitValues(var x,y:longint):longint;cdecl;external;
Description
Gpm_fitValues changes x and y so they fit in the visible screen. The actual mouse pointer is not affected by this function.
Errors
None.
See also
Gpm_FitValuesM,


6 Gpm_FitValuesM

Declaration
function Gpm_FitValuesM(var x,y:longint; margin:longint):longint;cdecl;external;
Description
Gpm_FitValuesM chnages x and y so they fit in the margin indicated by margin. If margin is -1, then the values are fitted to the screen. The actual mouse pointer is not affected by this function.
Errors
None.
See also
Gpm_FitValues,


7 Gpm_GetEvent

Declaration
function Gpm_GetEvent(var Event:TGpmEvent):longint;cdecl;external;
Description
Gpm_GetEvent Reads an event from the file descriptor gpm_fd. This file is only for internal use and should never be called by a client application.

It returns 1 on succes, and -1 on failue.

Errors
On error, -1 is returned.
See also
seeflGpm_GetSnapshotGpmGetSnapshot

Example
program gpmex;

{
  Example program to demonstrate the use of the gpm unit.
}

uses gpm;

var
  connect : TGPMConnect;
  event : tgpmevent;
 
begin
  connect.EventMask:=GPM_MOVE or GPM_DRAG or GPM_DOWN or GPM_UP;
  connect.DefaultMask:=0;
  connect.MinMod:=0;
  connect.MaxMod:=0;
  if Gpm_Open(connect,0)=-1 then
    begin
    Writeln('No mouse handler present.');
    Halt(1);
    end;
  Writeln('Click right button to end.');
  Repeat
    gpm_getevent(Event);
    With Event do
      begin
        Write('Pos = (',X,',',Y,') Buttons : (');
        if (buttons and Gpm_b_left)<>0 then
          write('left ');
        if (buttons and Gpm_b_right)<>0 then
          write('right ');
        if (buttons and Gpm_b_middle)<>0 then
          Write('middle ');
        Write(') Event : ');   
        Case EventType and $F of
          GPM_MOVE: write('Move');
          GPM_DRAG: write('Drag');
          GPM_DOWN: write('Down');
          GPM_UP: write('Up');
        end;  
        Writeln;
      end;  
  Until (Event.Buttons and gpm_b_right)<>0;
  gpm_close;
end.


8 Gpm_GetLibVersion

Declaration
function Gpm_GetLibVersion(var where:longint):pchar;cdecl;external;
Description
Gpm_GetLibVersion returns a pointer to a version string, and returns in where an integer representing the version. The version string represents the version of the gpm library.

The return value is a pchar, which should not be dealloacted, i.e. it is not on the heap.

Errors
None.
See also
Gpm_GetServerVersion


9 Gpm_GetServerVersion

Declaration
function Gpm_GetServerVersion(var where:longint):pchar;cdecl;external;
Description
Gpm_GetServerVersion returns a pointer to a version string, and returns in where an integer representing the version. The version string represents the version of the gpm server program.

The return value is a pchar, which should not be dealloacted, i.e. it is not on the heap.

Errors
If the gpm program is not present, then the function returns Nil
See also
Gpm_GetLibVersion


10 Gpm_GetSnapshot

Declaration
function Gpm_GetSnapshot(var Event:TGpmEvent):longint;cdecl;external;
Description
Gpm_GetSnapshot returns the picture that the server has of the current situation in Event. This call will not read the current situation from the mouse file descriptor, but returns a buffered version. The meaning of the fields is as follows:
x,y
current position of the cursor.
dx,dy
size of the window.
vc
number of te virtual console.
modifiers
keyboard shift state.
buttons
buttons which are currently pressed.
clicks
number of clicks (0,1 or 2).
The function returns the number of mouse buttons, or -1 if this information is not available.
Errors
None.
See also
Gpm_GetEvent


11 Gpm_LowerRoi

Declaration
function Gpm_LowerRoi(which:PGpmRoi; after:PGpmRoi):PGpmRoi;cdecl;external;
Description
Gpm_LowerRoi lowers the region of interest which after after. If after is Nil, the region of interest is moved to the bottom of the stack.

The return value is the new top of the region-of-interest stack.

Errors
None.
See also
Gpm_RaiseRoi, Gpm_PopRoi, Gpm_PushRoi


12 Gpm_Open

Declaration
function Gpm_Open(var Conn:TGpmConnect; Flag:longint):longint;cdecl;external;
Description
Gpm_Open opens a new connection to the mouse server. The connection is described by the fields of the conn record:
EventMask
A bitmask of the events the program wants to receive.
DefaultMask
A bitmask to tell the library which events get their default treatment (text selection).
minMod
the minimum amount of modifiers needed by the program.
maxMod
the maximum amount of modifiers needed by the program.
if Flag is 0, then the application only receives events that come from its own terminal device. If it is negative it will receive all events. If the value is positive then it is considered a console number to which to connect.

The return value is -1 on error, or the file descriptor used to communicate with the client. Under an X-Term the return value is -2.

Errors
On Error, the return value is -1.
See also
Gpm_Open

for an example, see Gpm_GetEvent.


13 Gpm_PopRoi

Declaration
function Gpm_PopRoi(which:PGpmRoi):PGpmRoi;cdecl;external;
Description
Gpm_PopRoi pops the topmost region of interest from the stack. It returns the next element on the stack, or Nil if the current element was the last one.
Errors
None.
See also
Gpm_RaiseRoi, Gpm_LowerRoi, Gpm_PushRoi


14 Gpm_PushRoi

Declaration
function Gpm_PushRoi(x1:longint; y1:longint; X2:longint; Y2:longint; mask:longint; fun:TGpmHandler; xtradata:pointer):PGpmRoi;cdecl;external;
Description
Gpm_PushRoi puts a new region of interest on the stack. The region of interest is defined by a rectangle described by the corners (X1,Y1) and (X2,Y2).

The mask describes which events the handler fun will handle; ExtraData will be put in the xtradata field of the TGPM_Roi record passed to the fun handler.

Errors
None.
See also
Gpm_RaiseRoi, Gpm_PopRoi, Gpm_LowerRoi


15 Gpm_RaiseRoi

Declaration
function Gpm_RaiseRoi(which:PGpmRoi; before:PGpmRoi):PGpmRoi;cdecl;external;
Description
Gpm_RaiseRoi raises the region of interest which till it is on top of region before. If before is nil then the region is put on top of the stack. The returned value is the top of the stack.
Errors
None.
See also
Gpm_PushRoi, Gpm_PopRoi, Gpm_LowerRoi


16 Gpm_Repeat

Declaration
function Gpm_Repeat(millisec:longint):longint;cdecl;external;
Description
Gpm_Repeat returns 1 of no mouse event arrives in the next millisec miiliseconds, it returns 0 otherwise.
Errors
None.
See also
Gpm_GetEvent


17 Gpm_StrictDouble

Declaration
function Gpm_StrictDouble(EventType : longint) : boolean;
Description
Gpm_StrictDouble returns true if EventType contains only a doubleclick event, False otherwise.
Errors
None.
See also
Gpm_StrictSingle, Gpm_AnyTriple, Gpm_AnyDouble, Gpm_StrictTriple, Gpm_AnySingle


18 Gpm_StrictSingle

Declaration
function Gpm_StrictSingle(EventType : longint) : boolean;
Description
Gpm_StrictDouble returns True if EventType contains only a singleclick event, False otherwise.
Errors
None.
See also
Gpm_AnyTriple, Gpm_StrictDouble, Gpm_AnyDouble, Gpm_StrictTriple, Gpm_AnySingle


19 Gpm_StrictTriple

Declaration
function Gpm_StrictTriple(EventType : longint) : boolean;
Description
Gpm_StrictTriple returns true if EventType contains only a triple click event, False otherwise.
Errors
None.
See also
Gpm_AnyTriple, Gpm_StrictDouble, Gpm_AnyDouble, Gpm_StrictSingle, Gpm_AnySingle


Free Pascal Compiler
2001-09-22