Rosada Adam 17.09.1999
linie.c fuer X-Windows
Als Editor empfehle ich den KWrite oder einen Editor,
der einen C-Quelltext farblich darstellen kann. Das vereinfacht
die Unterscheidung des eigentlichen Quelltextes von den Kommentaren.
Mit Hilfe dieses Programms kann man eine Linie zeichnen.
Beim ersten Mausklick wird der Anfang der Linie gesetzt.
Bei gedrueckter Maustaste wird die Linie gezogen (Gummiband-Effekt).
Beim Loslassen der Maustaste wird der Endpunkt der Linie gesetzt.
Das Programm liefert auch sehr viele Ausgaben auf dem Terminal,
die zu den einzelnen Ereignissen gehoeren z.B:
Mauszeiger bewegen, Maustaste klicken, Position des Mauszeigers, Tastaturklick usw.
Manche von diesen Events haben mit dem Zeichnen der Linie nichts zu tun.
Ich habe sie trotzdem eingebaut, damit man sehen kann, wie einzelne
Ereignisse verarbeitet werden. Es gibt natuerlich noch mehr Events.
Um die Ausgaben der Events (im Quelltext immer mit "printf" beginnend)
sehen zu koennen, sollte man das Programm natuerlich auf dem Terminal starten.
Zur Compilierung:
Compiliert wird mit "gcc", es muessen die X11R5- bzw. X11R6-Libs eingebunden werden.
Der Compilationsaufruf sieht folgendermassen aus:
>gcc linie.c -olinie -L/usr/X11R6/lib -lX11
Das compilierte Programm heisst dann in diesem Fall "linie".
Weitere Informationen in der README.
Download:linie.c und README
/* X-include-Dateien */
#include <X11/Xlib.h>
#include <X11/Xutil.h>
main(intargc,char **argv)
{
charname[] ="Event-Test";
charlos[] ="los geht´s";
/* Vereinbarungen fuer X */
Display *display;
Window window;
GC gc; /* Graphikkontext */
XEvent event; /* Ereignisse */
KeySym key; /* Tastatur */
XSizeHints hint; /* Fenstereigenschaften */
int screen;
unsigned long black,white;
int i;
char text[10];
int done;
int anfang_x,anfang_y,anfang=0,alt_x,alt_y;
/*Initialisierungen*/
display= XOpenDisplay("");
screen= DefaultScreen(display);
/*Voreinstellungen fuer die Pixelwerte */
white= WhitePixel(display,screen);
black= BlackPixel(display,screen);
/*Position und Groesse des Fensters */
hint.x = 200;
hint.y = 300;
hint.width = 350;
hint.height = 250;
hint.flags = PPosition | PSize;
/* Das Fenster erzeugen */
window= XCreateSimpleWindow(display,
DefaultRootWindow(display),
hint.x,hint.y,hint.width,
hint.height,5,black,white);
XSetStandardProperties(display,window,name,name,None,argv,argc,&hint);
/* Grafikkontext erzeugen und initialisieren */
gc= XCreateGC(display,window,0,0);
XSetBackground(display,gc,white);/* Hintergrundfarbe */
XSetForeground(display,gc,black);/* Vordergrundfarbe */
/* Eingabe-Ereignisse auswaehlen */
XSelectInput(display,window,
ButtonPressMask /* Maustaste klicken */
| ButtonReleaseMask /* Maustaste loslassen */
| KeyPressMask /* Tastaturtaste druecken */
| KeyReleaseMask /* Tastaturtaste loslassen */
| ExposureMask /* Fenstergroesse aendern */
| PointerMotionMask /* Mauszeiger bewegen */
| EnterWindowMask /* Mauszeiger verlaesst Window */
| LeaveWindowMask); /* Mauszeiger betritt Window */
/* Window abbilden */
XMapRaised(display,window);
/* Hauptschleife mit Abfrage der Ereignisse */
done=0;
while(done == 0)
{
/* Das naechste Ereigniss lesen */
XNextEvent(display,&event);
switch(event.type)
{
/* Window nach Expose-Event wiederherstellen */
case Expose:
if(event.xexpose.count == 0)
XdrawImageString(event.xexpose.display,/* siehe
README */
event.xexpose.window,gc,
50,50,los,strlen(los));
printf("Expose-Event:Neuzeichnen.\n");
/* Terminalausgabe */
break;
/* Abbildungsaenderung der Tastatur. */
case MappingNotify:
XRefreshKeyboardMapping((XMappingEvent *) &event);
break;
/* Druecken der Maustaste */
case ButtonPress:
printf("ButtonPress: Mausbutton gedrueckt.\n");
anfang_x=event.xbutton.x;/* Speichern der Kordinaten beim */
anfang_y=event.xbutton.y;/* Mausklick fuer den Anfang der Linie */
anfang=1;/* Anfang wird auf 1 gesetzt */
break;
/* Loslassen der Maustaste */
case ButtonRelease:
printf("ButtonRelease: Mausbutton losgelassen.\n");
anfang=0;/* Anfang wieder auf 0 setzen */
break;
/* Tastaturtaste losgelassen */
case KeyRelease:
printf("KeyRelease: Taste losgelassen.\n");
break;
/* Bewegung des Mauszeigers*/
case MotionNotify:
printf("X: %d Y: %d \n",event.xbutton.x,event.xbutton.y);
if(anfang>0)/* Wenn Anfang gesetzt war */
{
if(anfang>1)/* Gummiband-Effekt, alte Linie wird geloescht */
{
XSetForeground(display,gc,white);/* Vordergrundfarbe auf weiss */
XDrawLine(event.xexpose.display,/* siehe
README */
event.xexpose.window,gc,
anfang_x,anfang_y,alt_x,alt_y);
XSetForeground(display,gc,black);/* Vordergrundfarbe wieder auf schwarz */
} /*if(anfang>1) */
alt_x=event.xbutton.x;/* Speichern der Endpunkt-Koordinaten */
alt_y=event.xbutton.y;
XDrawLine(event.xexpose.display,/* siehe
README */
event.xexpose.window,gc,
anfang_x,anfang_y,
event.xbutton.x,event.xbutton.y);
anfang++;/* Anfang erhoehen, wichtig fuer den Gummiband-Effekt */
}/*if anfang>0*/
break;
/* Mauszeiger betritt das Fenster */
case EnterNotify:
printf("EnterNotify: Zeiger betritt Window.\n");
break;
/* Mauszeiger verlaesst das Fenster */
case LeaveNotify:
printf("LeaveNotify: Zeiger verlaesst Window.\n");
break;
/* Tastatureingabe */
case KeyPress:
/* Eingelesenes Zeichen wird gespeichert */
i= XLookupString((XKeyEvent *) &event,text,10,&key,0);
if( i==1 && text[0] == 'q')
/* Wenn ´q´ gedrueckt wird, */
done=1; /* wird das Programm beendet */
printf("KeyPress: Taste gedrueckt.\n");
break;
}/*switch*/
}/*while*/
/* Terminierung */
XFreeGC(display,gc);
XDestroyWindow(display,window);
XCloseDisplay(display);
exit(0);
}/*main*/
Autor: Rosada Adam
Letzte Aenderung: 17.09.1999
Fuer evtl. Fragen: Mail