On Wed, 3 Jul 2002, Dean S. Messing wrote:
> ::
> :: NVIDIA's drivers do not support separate X-screens on a single
> :: card. NVIDIA's drivers use TwinView to display two monitors
> :: on a single card, not Xinerama. NVIDIA's drivers do advertise
> :: the Xinerama protocol so that Xinerama-aware window managers
> :: can get individual head info when in TwinView. From the client's
> :: point of view there is no difference between Xinerama info returned
> :: from NVIDIA's TwinView driver and from a driver that was really
> :: using Xinerama.
> ::
> :: Mark.
>
> Thanks Mark. I'm a little surprised at this since most people buying
> a "dual-head" card would expect native xinerama to work, especially
> given the advanced binary drivers from the manufacturer.
The only difference between Xinerama and TwinView from the client's
point of view is that TwinView works with OpenGL - Xinerama does not.
There is no advantage to using Xinerama on a dual-head card, but
many disadvantages. Xinerama is the ass-backwards method of doing
single logical screen on a single-framebuffer dual-head card.
>
> Be that as it may, I will accept that I'm getting "everything"
> transmitted to KDE that I would if I were running "pure" xinerama.
>
I've attached an app that will print out what Xinerama reports.
Eg:
Version 1.1
ErrorBase = 0, EventBase = 0
Xinerama is active
2 screens
0) 1600 x 1200 @ (0, 0)
1) 1600 x 1200 @ (1600, 0)
Mark.
/*
gcc -o xinatest -Wall xinatest.c -L/usr/X11R6/lib -lXext -lXinerama -lX11
*/
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xinerama.h>
#include <stdio.h>
#include <stdlib.h>
int main ()
{
Display *dpy;
int i, event, error, major, minor, num;
XineramaScreenInfo *info;
dpy = XOpenDisplay("\0");
XineramaQueryExtension(dpy, &event, &error);
XineramaQueryVersion(dpy, &major, &minor);
printf("Version %i.%i\n", major, minor);
printf("ErrorBase = %i, EventBase = %i\n", error, event);
printf("Xinerama %s active\n", XineramaIsActive(dpy) ? "is" : "is not");
if((info = XineramaQueryScreens(dpy, &num))) {
printf("%i screens\n", num);
for(i = 0; i < num; i++) {
printf("%i) %i x %i @ (%i, %i)\n", info[i].screen_number,
info[i].width,
info[i].height,
info[i].x_org,
info[i].y_org);
}
XFree(info);
}
XCloseDisplay(dpy);
return 0;
}