Xinerama
Xinerama ist eine Erweiterung für X-Server, die es ermöglicht, dass sich mehrere Bildschirme wie ein einzelner großer verhalten. Es ist damit in X Window Systemen möglich, große Desktops zu benutzen, die über mehrere Monitore angezeigt werden. Die Erweiterung gibt es seit XFree86/X.Org X11 Release 6 Version 4.0.
Funktionsweise
Jede Sitzung im X Window System ist einem Display zugeordnet. Der Begriff bezeichnet ein oder beliebig viele Monitore (Screens) und Eingabegeräte wie Mäuse oder Tastaturen. Es können prinzipiell beliebig viele Monitore benutzt werden, dank Grafikkarten mit Multi Head ist das z. B. heutzutage mit handelsüblichen Personal Computern möglich. Jedoch werden diese Screens im X Window System unabhängig voneinander betrachtet: Sie können völlig unterschiedliche Eigenschaften haben, also zum Beispiel unterschiedliche Auflösungen oder Farbtiefe aufweisen. Technisch gesehen verfügt jeder Screen über ein eigenes Root-Window. Im X Window System braucht jedes Fenster (außer den Root-Fenstern) ein Elternfenster, außerhalb welchem es nicht angezeigt werden kann. Mit der Xinerama-Erweiterung können alle Screens zu einem großen Desktop zusammengelegt werden, sodass ein großes, alle Screens überspannendes Root-Fenster entsteht. Fenster können nun die Bildschirme beliebig überschneiden.
Ein X-Server, der Xinerama beherrscht, bietet eine eigene API an, über die ein X-Client, z. B. ein Fenstermanager, die Monitorkonfiguration abfragen kann. Mit diesen Informationen können dann Fenster so platziert werden, dass sie nicht über die einzelnen Monitorgrenzen hinausragen, verschiedene Hintergrundbilder auf den einzelnen Bildschirmen angezeigt werden, Taskleisten nur auf einem Bildschirm anzeigen usw.
API
Die Xinerama-Erweiterung bietet eine C-API an, mit der die Größe und Position der einzelnen Screens abgefragt werden kann:
#include <X11/Xlib.h>
#include <X11/extensions/Xinerama.h>
#include <stdio.h>
int main()
{
Display* dis = XOpenDisplay(NULL); /* Wert aus DISPLAY-Variable verwenden */
const Screen* scn = DefaultScreenOfDisplay(dis);
// Gesamtgröße des Desktops:
const int total_width = scn->width;
const int total_height = scn->height;
// Frag ab, ob Xinerama-Support vorhanden:
int event_base, error_base;
const Bool ext_okay = XineramaQueryExtension( dis, &event_base, &error_base);
if(!ext_okay) { /* no xinerama support! */ return 1; }
int number_of_screens = 0;
// Benutze die Extension, um Größe der Screens abzufragen:
XineramaScreenInfo* xsi = XineramaQueryScreens( dis, &number_of_screens);
XineramaScreenInfo* p;
for(p=xsi; p<xsi+number_of_screens; ++p)
{
printf("Screen #%d at position (%d, %d). Size: %d x %d pixels\n",
p-xsi, p->x_org, p->y_org, p->width, p->height);
}
XFree(xsi);
XCloseDisplay(dis);
return 0;
}
Alternativen
Die X RandR-Erweiterung, die ursprünglich nur dazu gedacht war, die Eigenschaften des X Screen (Farbtiefe, Auflösung u. a.) zur Laufzeit zu ändern, beherrscht ab Version 1.3. auch das Zusammenfügen mehrerer „Screens“ zu einem Gesamtbild, wie es Xinerama anbietet. X Clients, die die alte Xinerama-API benutzen, funktionieren somit auch unter X RandR, allerdings mit der Einschränkung, dass sie über nachträgliche Änderungen in der Anordnung der Bildschirme nicht informiert werden können.
Einige Grafikkartenhersteller bieten unter unterschiedlichen Namen eine verbesserte Version des Mehrbildschirmbetriebs an. Bei Grafikkarten, die mehrere Bildschirmausgänge besitzen, ist es so möglich, ohne Einbußen der Bildschirmaufbaugeschwindigkeit einen Desktop auf mehrere Bildschirme zu verteilen.
Siehe auch
- Distributed Multihead X Project, über mehrere PCs verteilter virtueller Monitor
- Multi-Head – mehrere Bildschirme an einem Computer