ein Kapitel zurück                                           ein Kapitel weiter

Als nächstes benötigen wir einen Ereignishandler der Aufgerufen wird wenn ein Mausereignis an unser Programm geschickt wird. Diese Funktion ist eine von uns geschriebene die auf das Ereignis beliebig reagieren kann. Hier der Syntax...........

typedef int Gpm_Handler(Gpm_Event *EVENT, void *DATA);
Gpm_Handler *gpm_handler;  

Diese Funktion sorgt dafür das ein Mausereignis in eine Tastaturangabe umgewandelt wird, die dann der Funktion Gpm_Getc oder Gpm_Getchar zurückgegeben wird. Diese beiden Funktionen dienen zum Einlesen der Daten von Tastatur und Maus. Diese beiden Routinen sollten sie also anstelle von getc und getchar verwenden. Hier der Syntax der beiden Funktionen...............

int Gpm_Getc(FILE *f);
int Gpm_Getchar(void);  

Wollen wir uns schnell ein kurzes Beispiel ansehen.......

/*Download:gpm2.c*/
#include <stdio.h> #include <gpm.h> #include <unistd.h> int Maushandler(Gpm_Event *event, void *data) { if(event->buttons & GPM_B_LEFT) { Gpm_Close(); exit (1); } return 0; } int main() { int status; Gpm_Connect connect; char zeichen=0; Gpm_Event *event; connect.eventMask=~0; /*alle Mausereignisse*/ connect.defaultMask=0; /*nichts an gpm zurückgeben*/ connect.maxMod=~0; /*keine Taste muss gedrückt sein*/ connect.minMod=0; /*Es dürfen aber alle gedrückt werden*/ status=Gpm_Open(&connect, 0); /*Wir stellen ein Verbindung zu gpm her*/ if(status==-1) /*-1 bedeutet Verbindung kann nicht hergestellt werden*/ { fprintf(stderr, "Fehler bei Gpm_Open..........\n"); exit(0); } /*-2 bedeutet das das Programm im einem Xterm ausgeführt wird*/ else if(status==-2) printf("Das Programm läuft in einem Xterm-Fenster\n"); else printf("Das Programm läuft in einer Textkonsole\n"); printf("Programm mit der linken Maustaste beenden!!\n"); gpm_handler=Maushandler; while(zeichen != 'e') /*Mit 'e' kann man auch Abbrechen*/ { zeichen=Gpm_Getc(stdin); } fflush(stdout); Gpm_Close(); /*Wir beenden die Verbindung zu gpm-Dämon wieder*/ return 0; }

Die Funktion Maushandler stellt unseren Ereignishandler da. Einrichten tun wir diesen mit......

gpm_handler=Maushandler;  

Nach jedem Tast-oder-Mausdruck wird jetzt überprüft ob es sich dabei um die linke Maustaste handelt. Falls ja brechen wir das Programm ab. Auch abgebrochen wird unser Programm durch Eingabe von dem Buchstaben 'e' und Enter.

Da ja nun durch das Einlesen mittels Gpm_Getc oder Gpm_Getchar nicht mehr zwischen Tastatur und Maus unterschieden wird, sie das aber nicht wollen sollten so gibt es eine globale Variable Namens gmp_hflag. Diese setzen sie auf dem Wert 1 damit wieder zwischen Tastatur und Maus unterschieden wird.

Jetzt haben sie zwar gesehen wie sie Ereignishandler einsetzen können aber nicht welche Ereignisse es alles gibt. Die Variable Gpm_Event ist, wie sie sicherlich wieder vermutet haben werden, eine Struktur mit folgendem Aussehen........

typedef struct Gpm_Event
      {
        unsigned char buttons, modifiers;
        /*Nicht von Interesse. Für Mausereignisse mehrer Konsolen gedacht*/
        unsigned short vc;
        short dx, dy, x, y;
        /*x,y Position des Mauszeigers als Ereigniss auftrat...*/
        /*....dx, dy Deltax Deltay Veränderung Pos. gegebenüber...*/
        /*....des letzten Ereignises*/
        enum Gpm_Etype type;
        int clicks;
        enum Gpm_Margin margin;
      }Gpm_Event;  

Wie schon im Programmbeispiel oben gesehen können sie den Button mit '&' und einer Konstante überprüfen. Folgende drei Möglichkeiten gibt es...........

if(event->buttons & GPM_B_LEFT)
{ /*linke Maustaste wurde gedrückt*/ }
if(event->buttons &GPM_B_RIGHT)
{ /*rechte Maustaste wurde gedrückt*/ }
if(event->buttons &GPM_B_MIDDLE)
{ /*Mittlere Maustaste wurde gedrückt*/ }  

Im Feld modifiers sind die gedrückten Metatasten eingetragen. Beispielsweise.............

if(event->modifiers &KG_CTRLL)
{/*linke Controll-Taste wurde gedrückt*/}
if(event->modifiers &KG_SHIFTR)
{/* rechte Shift-Taste wurde gedrückt*/}
...........
..........  

Im Feld type wird ebenfalls kodiert welche Ereignisse aufgetreten sind. Beispielsweise..........

if(event->type &GPM_DOUBLE)
{ /*Doppelklick erkannt*/ }
if(event->type &GPM_TRIPPLE)
{/*Dreifachklick wurde festgestellt (wer macht sowas?) */ }  

Folgende Bitmasken stehen außerdem noch zu Ihrer Verfügung......

  • GPM_MOVE Maus wurde bewegt
  • GPM_DRAG Maus wurde bewegt und ein Knopf gedrückt
  • GPM_DOWN Knopf wurde gedrückt -> welcher steht in buttons
  • GPM_UP Knopf wurde losgelassen -> welcher steht in buttons
  • GPM_ENTER Mausereignis im Region of Interest (später.....)
  • GPM_LEAVE Region of Interest wurde verlassen (jaja kommt schon noch......)
  • GPM_SINGLE Einfacher Mausklick

Im Feld click befinden sie die Anzahl der Klicks die Aufgetreten sind bei GPM_DRAG|GPM_UP und nur GPM_DRAG. Der mögliche Wert beträgt 0-3 Beispielsweise..............

if(event->type &GPM_DRAG)
    if(event->clicks ==2)
       printf("Heissa geschafft\n");  

In diesem Falls brauchen sie nur wie ein verrückter die Maus bewegen und Doppelclicks machen ;)

In margin befinden sich die Bits wenn der Mauscursor den Bildschirm verlässt. Eins der folgenden 4 Bits ist dann gesetzt...

  • GPM_TOP Cursor oben weg
  • GPM_BOT Cursor unten weg
  • GPM_LFT was wohl links
  • GPM_RGT richtig rechts weg

Auch hier ist der Einsatz wie schon in den anderen Beispielen zuvor..............

if(event->margin &GPM_TOP)
   printf("Der Cursor ist noch oben weg\n");  

Sie können gerne diese Ereignisse in das Programm oben reinschreiben und testen.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf