Remote X11 Server und Bibliothek
Inhalt
Einführung
Auf vielen Computersystemen ist man aufgrund eines mangelnden
Graphiksystems dazu gezwungen, auf eine ansprechende
graphische Ausgabe von Berechnungsergebnissen zu verzichten
oder eine "Quick and Dirty" Lösung zu entwickeln, die meist
nur für den eben benötigten Zweck zu gebrauchen ist; beim
nächsten Projekt fängt man dann wieder von vorne an. Ein
Beispiel für solche Systeme sind Transputer unter Helios.
Remote X11 (oder kurz RX11) versucht hier Abhilfe zu
schaffen, indem es für solche Systeme eine Bibliothek mit den
wichtigsten Funktionen der XWindow Bibliothek (Xlib) zur
Verfügung stellt. Die Bibliothek leitet die Anforderungen an
den ebenfalls mitgelieferten RX11 Server weiter, der auf einer
mit X11 ausgestatteten Workstation läuft. Voraussetzung ist
natürlich, daß das Client System über ein lokales Netzwerk mit
dieser Workstation verbunden ist.
Im folgenden sind Installation und Verwendung der RX11
Bibliothek auf dem Clientsystem, sowie des RX11 Servers auf
dem Serversystem beschrieben.
Installation
Der Server ist unter HP/UX, SunOS und Linux compiliert und
getestet worden. Er sollte aber mit ein wenig "Handarbeit"
auch auf anderen Systemen zu verwenden sein. Die Bibliothek
kann neben den oben genannten Betriebssystemen (ist dort aber
ziemlich sinnlos, weil X11 ja vorhanden ist) auf
Transputersystemen unter Helios und unter MiNT verwendbar. Mit
einigen Anpassungen sollte sie aber unter allen Systemen
compiliert und verwendet werden können, die Berkeley Sockets
zur Netzwerkkommunikation zur Verfügung stellen.
Die Compilierung auf oben genannten unterstützten System
beschränkt sich auf das Auspacken des Archives rx11.tar.gz,
dem Wechseln in das Verzeichnis rx11 mit dem eben ausgepackten
Archiv, dem Eingeben von configure gefolgt von make all. Auf
meinem System sieht das folgendermaßen aus:
$ uname
SunOS
$ ls -l
-rw-r----- 1 roemer w93 65279 Jun 21 08:47 rx11-0.5.tar.gz
$ gzip -dc rx11-0.5.tar.gz | tar xf -
$ cd rx11
$ ./configure
configuring for SunOS...
done. Now type make all.
$ make all
Dann dauert es eine Weile, bis alles compiliert ist. Da in
den allermeisten Fällen Server- und Clientsystem verschieden
sind (zum Beispiel SunOS auf dem Server, Helios auf dem
Client), muß dieser Vorgang auf beiden Systemen durchgeführt
werden. Wenn auf dem Clientsystem tar oder gzip nicht
vorhanden sind, sollte das Archiv auf einem anderen System
ausgepackt und die Dateien in ausgepackter Form auf das
Clientsystem transferiert werden.
Nachdem die Compilierung abgeschlossen ist, sollten folgende
Dateien auf dem Clientsystem vorhanden sein:
- libRX11.a
- Die RX11 Bibliothek.
- RXlib.h
- RX11 Include Datei.
- X.h
- Eine weitere Include Datei, die von Rxlib.h benutzt wird.
- client
- Ein kleines Testprogramm, daß die RX11 Bibliothek verwendet.
Wenn man die dafür nötigen Rechte besitzt sollte man die
Bibliotek in das Verzeichnis mit den Systembibliotheken, die
Includedateien in das Verzeichnis mit den Systemincludedateien
kopiert werden. Andernfalls ist man dazu gezwungen, Bibliothek
und Includes in seinem Home-Verzeichnis zu speichern und bei
jedem Compiliervorgang Compiler und Linker diesen Ort über
Kommandozeilenparameter anzugeben.
Auf der Serverseite sollte zusätzlich im Unterverzeichnis
server folgende Datei vorhanden sein:
- rx11serv
- Der RX11 Server.
Diese kann in eines der bin Verzeichnis kopiert werden.
Verwendung
Hier wird davon ausgegangen, daß das RX11 System wie in
Abschnitt 2 beschrieben installiert wurde und bereits ein
fertig compiliertes Programm, daß die RX11 Bibliothek
verwendet vorliegt. Als Beispiel soll das bereits in Abschnitt
2 erwähnte mitgelieferte Testprogramm client dienen.
Auf dem Serversystem sind folgende Schritte notwendig:
- Feststellen des Rechnernames:
$ uname -n
tisu1
- Setzen der DISPLAY Umgebungsvariable:
$ setenv DISPLAY localhost:0
- Starten des RX11 Servers:
$ rx11serv
Remote X11 server 0.5, Copyright (C) 1995 Kay Roemer.
Jetzt wartet der Server auf Anforderungen. Er kann jederzeit
durch die Tastenkombination Control-C angebrochen werden. Nun
kann das RX11 Programm auf dem Clientsystem gestartet werden.
Dazu sind folgende vorbereitende Schritte nötig:
- Setzen der DISPLAY Umgebungsvariable. Als Hostname muß der
Rechner angegeben werden, auf dem der RX11 Server läuft, im
Beispiel also tisu1. Aber Vorsicht, wenn Client und
Serversystem nicht in der gleichen DNS Domain liegen, muß der
vollständige Rechnername angegeben werden. Hier wäre das
tisu1.ti.informatik.uni-frankfurt.de.
$ setenv DISPLAY tisu1:0
- Starten des Client Programms.
$ cd rx11
$ ./client points
Daraufhin sollte der Server ausgeben, daß ein Client eine
Verbindung hergestellt hat. Dann sollte sich ein Fenster
öffnen, in dem sich einiges tut. Nach Beendigung der Ausgaben
wartet das Clientprogramm darauf, daß sie Control-D eingeben.
Daraufhin beendet sich das Clientprogramm und das Fenster
schließt sich. Der Server zeigt zwar an, daß die Verbindung
beendet wurde, er läuft aber weiter und wartet auf weitere
Anforderungen von anderen Clients. Der Server muß also nicht
für jeden Client neu gestartet werden.
Wissenswert ist auch noch, daß der Server gleichzeitig
mehrere Clients bedienen kann, selbst wenn diese auf
verschiedenen Rechnern (z.B. auf verschiedenen Transputern)
laufen.
Das oben verwendete Testprogramm kann noch andere Ausgaben
erzeugen. Rufen Sie es nacheinander mit den Parametern lines,
text und xlogo auf und beobachten Sie die Ausgaben.
Die RX11 Bibliothek
In den vorangehenden Abschnitten wurde das bei RX11
mitgelieferte Testprogramm client vorgestellt. Hier wird nun
beschrieben, wie Programme schreibt, die die RX11 Bibliothek
verwenden.
Konzepte
Die RX11 Bibliothek enthält die wichtigsten Funktionen der
XWindow Bibliothek Xlib plus einigen wenigen nützlichen
Zusatzfunktionen. Die Funktionen der RX11 Bibliothek
unterscheiden sich in der Namensgebung von ihren Pendants der
Xlib durch ein vorangestelltes R. D.h. die RX11 Funktion
RXOpenDisplay entspricht der Funktion XOpenDisplay der Xlib.
Die Funktionen der RX11 Bibliothek entsprechen in Parametern
und Funktion soweit es geht den Funktionen in der Xlib.
Deshalb ist ein Grundverständnis der Xlib Funktionalität von
Nutzen bei der RX11 Programmierung. Ich verweise hier auf Band
1 der XWindow Serie von O'Reilly und Associates.
Allerdings ist die Programmierung von RX11 Anwendungen um
vieles einfacher als das Entwickeln von gleichwertigen Xlib
Anwendungen, da der Programmierer sich nicht um Events kümmern
muß. So braucht man beispielsweise niemals Fensterinhalte neu
zeichnen (Redraw), nachdem sie verdeckt waren, da der RX11
Server die Fensterinhalte zwischenspeichert und von selbst neu
zeichnet.
Alle Funktionen sind in der Include Datei RXlib.h deklariert,
d.h. in jedem RX11 benutzendem Programm muß diese Datei
includiert werden. Der Programmcode der Bibliothek befindet
sich in der Datei libRX11.a, d.h. jedes RX11 benutzende
Programm muß mit dieser Bibliothek gelinkt werden.
Verfügbare Funktionen
Verbindung zum Server herstellen/schließen
-
RXDisplay *RXOpenDisplay (char *display_name)
-
Diese Funktion taucht in jedem RX11 Programm als nahezu erste
auf. Sie stellt eine Verbindung zum durch display_name
spezifizierten RX11 Server her und liefert einen Zeiger auf
eine RXDisplay Struktur (bzw. NULL im Fehlerfall), die in fast
allen weiteren Funktionen als Parameter angegeben werden muß.
Üblicherweise wird NULL als Parameter übergeben. In diesem
Fall wird der Wert der Umgebungsvariable DISPLAY verwendet.
-
int RXCloseDisplay (RXDisplay *display)
-
RXCloseDisplay ist einer der letzten Funktionsaufrufe in
jedem RX11 Programm. Er dient dazu, die Verbindung zum RX11
Server zu beenden.
-
void RXFlush (RXDisplay *display)
-
RX11 puffert Graphikausgaben normalerweise solange, bis 100ms
seit der letzten Ausgabeoperation vergangen sind. Will man die
Ausgaben aber sofort sichtbar machen, kann man RXFlush
aufrufen, allerdings sollte man sehr sparsam damit umgehen, da
die Ausgabegeschwindigkeit unter Umständen darunter leidet.
Auf die Mitglieder der RXDisplay Struktur sollte niemals
direkt zugegriffen werden. Sie enthalten aber eine Reihe
nützlicher Informationen, die über vordefinierte Macros
abgefragt werden können:
-
int RXConnectionNumber (RXDisplay *display)
-
Liefert das Filehandle der Netzwerkverbindung zum RX11
Server.
-
int RXDefaultScreen (RXDisplay *display)
-
Liefert die Nummer des Default Screens. X11 unterstützt
mehere logische Screens auf einem Ausgabegerät. wenn man die
Nummer eines Screens benötigt, sollte man immer die durch
RXDefaultScreen gelieferte verwenden.
-
Window RXRootWindow (RXDisplay *display, int screen)
-
Liefert das Handle des Root Fensters auf einem Screen.
-
Window RXDefaultRootWindow (RXDisplay *display)
-
Liefert das Handle des Root Fensters aud dem Default Screen.
-
RXVisual *RXDefaultVisual (RXDisplay *display, int screen)
-
Liefert einen Zeiger auf die Default RXVisual Struktur für
den angegebenen Screen. Visuals geben Auskunft über die
unterstützte Farbauflösung.
-
RXGC RXDefaultGC (RXDisplay *display, int screen)
-
Liefert das Handle des Default Graphics Contexts für den
angegebenen Screen. Ein Graphics Context (GC) speichert
Informationen wie Zeichenfarbe, Füllmuster, Font, usw. und
wird bei allen Zeichenfunktionen zur Festlegung der zu
verwendenden Zeichenattribute angegeben.
-
u_long RXBlackPixel (RXDisplay *display, int screen)
u_long RXWhitePixel (RXDisplay *display, int screen)
-
Liefern die Pixel IDs zweier kontrastreicher Farben auf dem
angegebenen Screen. Die tatsächlichen zugehörigen Farben sind
nicht notwending schwarz und weiß.
-
int RXDisplayWidth (RXDisplay *display, int screen)
int RXDisplayHeight (RXDisplay *display, int screen)
-
Liefern Höhe und Breite des Root Fensters auf dem angegebenen
Screen in Pixeln.
-
int RXDisplayWidthMM (RXDisplay *display, int screen)
int RXDisplayHeightMM (RXDisplay *display, int screen)
-
Liefern Höhe und Breite des Root Fensters auf dem angegebenen
Screen in Millimetern.
-
int RXDisplayPlanes (RXDisplay *display, int screen)
int RXDisplayCells (RXDisplay *display, int screen)
-
Liefern Anzahl der Bitplanes bzw. Anzahl gleichzeitig
darstellbarer verschiedener Farben (bzw. Graustufen) auf dem
angegebenen Screen.
-
int RXScreenCount (RXDisplay *display)
-
Liefert die Anzahl der Screens auf dem angegebenen Display.
-
int RXDefaultDepth (RXDisplay *display, int screen)
-
Liefert die Anzahl der Bitplanes auf dem angegebenen Screen.
-
Colormap RXDefaultColormap (RXDisplay *display, int screen)
-
Liefert die ID der Default Farbtabelle für den angegebenen
Screen.
Fenster
-
Window RXCreateSimpleWindow (RXDisplay *display, Window parent,
int xpos, int ypos, u_int width, u_int height,
u_int border_width,
u_long border_pixel, u_long background_pixel)
-
Diese Funktion erzeugt ein neues Fenster, daß im Vater-
Fenster parent enthalten ist. Das Fenster wird sofort an
Position (xpos,ypos) relativ zu parent mit der Breite width,
der Höhe height, der Randbreite border_width sowie dem
Hintergrundpixel background_pixel und dem Randpixel
border_pixel auf den Bildschirm gebracht (gemappt).
-
void RXStoreName (RXDisplay *display, Window win, char *name)
-
Ist ein Fenster ein direkter Nachkomme des Root Fensters, so
erhält es vom Windowmanager einen Rahmen, eine Titelzeile und
Elemente zum Verändern der Grösse und Position. Mit
der Funktion RXStoreName kann der Text in der Titelzeile eines
solchen Fensters win gesetzt werden.
-
void RXDestroyWindow (RXDisplay *display, Window win)
-
Diese Funktion zerstört ein vorher mit RXCreateSimpleWindow
erzeugtes Fenster und entfernt es vom Bildschirm.
Pixmaps
Pixmaps ähneln Fenstern in der Hinsicht, daß man in sie
zeichnen kann. Allerdings sieht man den Inhalt von Pixmaps
nicht auf dem Bildschirm, es sei denn man kopiert ihren Inhalt
in ein Fenster.
-
Pixmap RXCreatePixmap (RXDisplay *display, Drawable drawable,
int width, int height, int depth)
-
Diese Funktion erzeugt eine Pixmap mit der Breite width, der
Höhe height und depth Bits pro Pixel, die auf dem gleichen
Screen wie drawable liegt. Drawable ist entweder ein
Fensterhandle oder eine andere Pixmap. Der anfängliche Inhalt
der Pixmap ist nicht definiert.
-
void RXFreePixmap (RXDisplay *display, Pixmap pixmap)
-
RXFreePixmap zerstört die angegebene Pixmap.
Häufig ist es wünschenswert, Bilder aus Dateien einzulesen
und in eine Pixmap zu konvertieren. Zu diesem Zweck stellt X11
das Standardformat XBM zur Verfügung. XBM Dateien enthalten 1
Bit tiefe (d.h. monochrome) Bitmaps beliebiger Größe. Die
darin enthaltenen Daten haben das folgende Format:
- In einem Byte sind 8 Pixel untergebracht.
- Jede Zeile beginnt mit einem neuen Byte.
- Die Bitorder in einem Byte ist Little Endian, d.h. das
niederwertigste Bit entspricht dem am weitesten links
stehenden, das höchstwertigste dem am weitesten rechts
stehenden Pixels in einem Block von acht Pixeln.
Folgende Funktionen stehen zum Umgang mit derartigen Bitmaps
zur Verfügung:
-
Pixmap RXCreateBitmapFromData (RXDisplay *display, Drawable drawable,
char *bitmap_data, int width, int height)
-
Diese Funktion erzeugt ähnlich RXCreatePixmap eine Pixmap mit
Breite width und Höhe height, die aber die Tiefe 1 hat (d.h.
ein Bit pro Pixel). Der Inhalt der Pixmap wird aus den XBM
Daten erzeugt, die per bitmap_data übergeben werden.
-
Pixmap RXCreatePixmapFromBitmapData (RXDisplay *display,
Drawable drawable,
char *bitmap_data, int width, int heigth,
u_long fg_pixel, u_long bg_pixel,
int depth);
-
RXCreatePixmapFromBitmapData erzeugt eine Pixmap mit der
Breite width, der Höhe height und der Tiefe depth aus den per
bitmap_data angegebenen XBM Daten. In der Pixmap werden in den
XBM Daten gesetzte Bits durch das Pixel fg_pixel, nicht
gesetzte Bits durch bg_pixel repräsentiert.
-
char *RXReadXbmFile (RXDisplay *display, Drawable drawable,
char *file_name, u_int *width_ret, u_int *height_ret,
u_int *xhot_ret, u_int *yhot_ret)
-
Diese Funktion liest die XBM Datei file_name ein und liefert
einen Zeiger auf die XBM Daten zurück. In width_ret und
height_ret werden Breite und Höhe der Bitmap, in xhot_ret und
yhot_ret (wenn definiert) die Koordinaten des Hotspots
zurückgeliefert. Der Rückgabewert diese Funktion ist u.a. als
Parameter für RXCreateBitmapFromData,
RXCreatePixmapFromBitmapData usw. geeignet.
-
int RXReadBitmapFile (RXDisplay *display, Drawable drawable,
char *file_name, u_int *width_ret, u_int *height_ret,
Pixmap *pixmap_ret,
u_int *xhot_ret, u_int *yhot_ret)
-
Diese Funktion kombiniert RXReadXbmFile und
RXCreateBitmapFromData. In pixmap_ret wird die ID der
erzeugten Pixmap zurückgeliefert.
-
char *RXScaleBitmapData (RXDisplay *display, char *bitmap_data,
u_int *width_ret, u_int *height_ret,
u_int scale_x, u_int scale_y)
-
Diese Funktion vergrößert Bitmapdaten im XBM Format. Die
Vergrößerung in X Richtung wird duch scale_x, in Y Richtung
durch scale_y angegeben. Beide Faktoren müssen im Bereich 1
bis 8 liegen. Die Funktion liefert einem Zeiger auf die
vergößerten Bitmapdaten, sowie Breite und Höhe der
vergrößerten Bitmap in width_ret bzw. height_ret zurück.
-
void RXFree (void *data)
-
Wenn die von RXReadXbmFile oder RXScaleBitmapData gelieferten
Bitmaps nicht mehr benötigt werden, müssen sie durch RXFree
wieder freigegeben werden.
Graphics Context
Damit bei Aufrufen von RX11 Funktionen zur Graphikausgabe
nicht jedesmal etliche Paramter zur Angabe von Zeichenfarbe,
Füllmuster, Clipping, Linienstil usw. angegeben werden müssen,
existiert das Konzept der Graphics Contexts oder GCs. In
diesen sind alle möglichen Zeichenattribute gespeichert, so
daß bei allen Funktionen zur Graphikausgabe nur der GC
angegeben werden muß. Für einfache Black&White Applikationen
kann man einfach den von RXDefaultGC gelieferten Graphics
Context verwenden, andernfalls muß man mit den im folgenden
beschriebenen Funktionen selbst GCs erzeugen.
Bei den Funktionen zum Erzeugen und Manipulieren von GCs wird
eine RXGCValues Struktur angegeben, in die man vorher die zu
ändernden bzw. zu setzenden Attribute eintragen muß. Beim
Funktionsaufruf wird dann die Struktur zusammen mit einer
Maske angegeben, die spezifiziert, welche Felder der
RXGCValues Struktur gültig sind.
-
RXGC RXCreateGC (RXDisplay *display, u_long mask, RXGCValues *gcvalues)
-
Diese Funktion erzeugt einen neuen GC mit den in gcvalues und
mask angegebenen Zeichenattributen. Als Funktionswert liefert
sie die ID des neu erzeugten GCs.
-
void RXChangeGC (RXDisplay *display, RXGC gc, u_long mask,
RXGCValues *gcvalues)
-
RXChangeGC ändert die durch mask angegebenen Attribute des GC
gc auf die in gcvalues angegebenen Werte.
-
void RXFreeGC (RXDisplay *display, RXGC gc)
-
Gibt den vorher mit RXCreateGC erzeugten GC gc wieder frei.
Farben
Unter RX11 werden die Farben, in denen Ausgaben auf dem
Bildschirm erscheinen durch Pixel IDs angegeben. Mit Hilfe von
Farbtabellen werden diese Pixel IDs dann in Farbwerte
umgerechnet.
Im Moment kann man nur mir einer einzigen Farbtabelle
arbeiten, nämlich mit der von RXDefaultColormap gelieferten.
Mit den folgenden Funktionen kann man Einträge in dieser
Farbtabelle allokieren und abfragen, welche Farbe einer Pixel
ID in dieser Farbtabelle zugeordnet ist. Von zentraler
Bedeutung ist dabei die Struktur RXColor, die Felder für Rot-,
Grün- und Blauanteile einer Farbe, sowie eine Pixel ID
enthält.
-
int RXAllocColor (RXDisplay *display, Colormap cmap, RXColor *color)
-
Allokiert in der Farbtabelle cmap einen Eintrag mit der in
color angegebenen Farbe (bzw. der Farbe, die der angegebenen
am nächsten kommt). Man muß also vorher die Felder
color.red, color.green sowie color.blue mit den RGB Werten der
gewünschten Farbe ausfüllen. Liefert die Funktion einen Wert
!= 0 zurück, so steht nach dem Funktionsaufruf die Pixel ID
des allokierten Farbtabelleneintrages in color.pixel.
-
int RXAllocNamedColor (RXDisplay *display, Colormap cmap,
char *color_name, RXColor *screen_ret, RXColor *exact_ret)
-
Diese Funktion hat den gleichen Zweck wie RXAllocColor, nur
daß die gewünschte Farbe nicht als RGB Wert, sondern als
Name in color_name angegeben wird. Zu diesem Zweck unterhält X11
eine große Datenbank mit allen möglichen Namen von Farben,
wie zum Beispiel "white" oder "steel blue". Wenn die Funktion
einen Wert != 0 zurückliefert, dann stehen nach dem
Funktionsaufruf in exact_ret die exakten RGB Werte des
angegebenen Names, in screen_ret die auf dem Bildschirm
darstellbare Farbe, die der gewünschten am nächsten kommt. In
screen_ret.pixel ist die Pixel ID des allokierten
Farbtabelleneintrages zu finden.
Ausgabefunktionen
Wie jede Graphikbibliothek enthält RX11 eine Reihe von
Ausgabefunktionen. Alle erwarten ein Drawable in das
gezeichnet werden soll und einen GC mit den Zeichenattributen.
Ein Drawable ist eine Pixmap oder ein Fenster.
-
void RXDrawPoint (RXDisplay *display, Drawable drawable, RXGC gc,
int x, int y)
-
Zeichnet einen Punkt in der Vordergrundfarbe an Position
(x,y) in drawable.
-
void RXDrawLine (RXDisplay *display, Drawable drawable, RXGC gc,
int x1, int y2, int x2, int y2)
-
Zeichnet eine Linie in Vordergrundfarbe von (x1,y1) nach
(x2,y2) in drawable.
-
void RXDrawRectangle (RXDisplay *display, Drawable drawable, RXGC gc,
int x, int y, u_int width, u_int height)
-
Zeichnet ein Recheck in Vordergrundfarbe mit Breite width+1
und Höhe height+1 an Position (x,y) in drawable.
-
void RXFillRectangle (RXDisplay *display, Drawable drawable, RXGC gc,
int x, int y, u_int width, u_int height)
-
Zeichnet ein gefülltes Recheck mit aktuellem Füllmuster und
Farbe mit Breite width und Höhe height an Position (x,y) in
drawable.
-
void RXDrawArc (RXDisplay *display, Drawable drawable, RXGC gc,
int x, int y, i_int width, u_int height,
short start_angle, short end_angle)
-
Zeichnet einen Ellipsensektor beginnend beim Startwinkel
start_angle bis zum Endwinkel end_angle in Vordergrundfarbe,
der in ein Rechteck mit Breite width+1 und Höhe height+1
paßt
an Position (x,y) in drawable. Die Winkel werden in 64tel Grad
mit negativen Werten in Urzeigersinn gemessen.
-
void RXFillArc (RXDisplay *display, Drawable drawable, RXGC gc,
int x, int y, i_int width, u_int height,
short start_angle, short end_angle)
-
Zeichnet einen gefüllten Ellipsensektor beginnend beim
Startwinkel start_angle bis zum Endwinkel end_angle in
aktuellem Füllmuster und Farbe, der in ein Rechteck mit Breite
width und Höhe height paßt an Position (x,y) in drawable.
Die Winkel werden in 64tel Grad mit negativen Werten in
Urzeigersinn gemessen.
-
void RXDrawString (RXDisplay *display, Drawable drawable, RXGC gc,
int x, int y, char *text, int length)
-
Zeichnet den in text angegebenen String der Länge length an
Position (x,y) in drawable.
-
void RXDrawImageString (RXDisplay *display, Drawable drawable,
RXGC gc, int x, int y, char *text, int length)
-
Zeichnet den in text angegebenen String der Länge length an
Position (x,y) in drawable. Der Text wird durch ein Rechteck
in Hintergrundfarbe hinterlegt.
Die drei folgenden Funktionen kopieren alle einen
rechteckigen Ausschnitt der Breite width und Höhe height von
einer Quelle an Position (source_x,source_y) in ein Ziel an
Position (dest_x,dest_y). Sie unterscheiden sich lediglich in
der Quelle. Als Ziel wird stets ein Drawable beliebiger Tiefe
angegeben.
-
void RXCopyArea (RXDisplay *display, Drawable source,
Drawable dest, RXGC gc,
int source_x, int source_y, u_int width, u_int height,
int dest_x, int dest_y)
-
Als Quelle dient ein Drawable mit gleicher Tiefe wie das
Ziel.
-
void RXCopyPlane (RXDisplay *display, Drawable source,
Drawable dest, RXGC gc,
int source_x, int source_y, u_int width, u_int height,
int dest_x, int dest_y,
int plane)
-
Als Quelle dient ein Drawable beliebiger Tiefe. Eine durch
plane angegebene Bitplane wird daraus extrahiert und ins Ziel
kopiert. In der Quellbitplane gesetzte Bits werden im Ziel
durch die Vordergrundfarbe, gelöschte Bits durch die
Hintergrundfarbe repräsentiert.
-
void RXCopyBitmap (RXDisplay *display, Drawable dest, RXGC gc,
char *bitmap_data, u_int bitmap_width,
u_int bitmap_height,
int source_x, int source_y, u_int width, u_int height,
int dest_x, int dest_y)
-
Als Quelle dienen Bitmapdaten im XBM Format. Daraus wird
mittels RXCreateBitmapFromData eine Pixmap der Tiefe 1 erzeugt
und daraus dann ein Recheck mittels RXCopyPlane ins Ziel-
Drawable kopiert.
Ein Beispiel
Hier noch abschließend ein Beispiel, daß die Verwendung
einiger RX11 Funktionen deutlich macht und zeigt, wie man ein
RX11 Programm unter Helios compiliert.
Der Sourcecode
/*
* Ein Hello World mit RX11
*/
#include
#include
#include "RXlib.h"
/*
* Zeiger auf Display Struktur, Screen Nummer und Fenster ID
*/
RXDisplay *dpy;
int screen;
Window win;
int
main (int argc, char *argv[])
{
RXGC gc;
/*
* Display öffnen
*/
dpy = RXOpenDisplay (NULL);
if (!dpy) {
printf ("kann Display nicht oeffnen\n");
return 0;
}
screen = RXDefaultScreen (dpy);
/*
* Default GC
*/
gc = RXDefaultGC (dpy, screen);
/*
* Fenster erzeugen und Titel setzen
*/
win = RXCreateSimpleWindow (dpy, RXRootWindow (dpy, screen),
20, 20, 100, 100,
2,
RXBlackPixel (dpy, screen),
RXWhitePixel (dpy, screen));
RXStoreName (dpy, win, "RX11 Hello");
/*
* Text ausgeben
*/
RXDrawString (dpy, win, gc, 5, 20, "Hello, world!",
strlen ("Hello, world!"));
/*
* etwas warten
*/
sleep (20);
/*
* und cleanup
*/
RXDestroyWindow (dpy, win);
RXCloseDisplay (dpy);
return 0;
}
Compilierung
Der Sourcecode aus 4.4 sei jetzt als hello.c abgespeichert.
Die beiden Includedateinen RXlib.h und X.h seien nach
/helios/include, die Bibliothek libRX11.a nach /helios/lib
kopiert worden. Nun kann hello.c unter Helios folgendermaßen
kompiliert werden:
$ cc -I/helios/include/ -D__ARM=1 -t8 -s hello.s hello.c
$ asm -p -o hello.o hello.s
$ asm -f /helios/lib/cstart.o hello.o -L/helios/lib/ -llibRX11.a -o hello
Nun kann das Programm hello wie in Abschnitt 2 beschrieben
ausprobiert werden.
Kay Römer <roemer@informatik.uni-frankfurt.de>
Last modified: Tue Jun 27 14:18:52 1995