Похоже, есть libXinerama
API, который может получить эту информацию. Пока я не нашел никакой подробной информации.
Общая информация о программировании на X.org здесь (файл PDF). Информацию о функциях, предоставляемых libXinerama
, можно найти здесь (онлайн-копия руководства, не так много информации).
Вот небольшая программа на C ++, которую я вытащил из этих ссылок, чтобы получить размеры и смещения каждого монитора, подключенного к Xinerama. Это также работает для nVidia TwinView; В настоящее время у меня нет карты ATI для тестирования в их системе BigDesktop, но я подозреваю, что она будет работать и на ней.
#include <cstdlib>
#include <iostream>
#include <X11/extensions/Xinerama.h>
using std::cout;
using std::endl;
int main(int argc, char *argv[]) {
bool success=false;
Display *d=XOpenDisplay(NULL);
if (d) {
int dummy1, dummy2;
if (XineramaQueryExtension(d, &dummy1, &dummy2)) {
if (XineramaIsActive(d)) {
int heads=0;
XineramaScreenInfo *p=XineramaQueryScreens(d, &heads);
if (heads>0) {
for (int x=0; x<heads; ++x)
cout << "Head " << x+1 << " of " << heads << ": " <<
p[x].width << "x" << p[x].height << " at " <<
p[x].x_org << "," << p[x].y_org << endl;
success=true;
} else cout << "XineramaQueryScreens says there aren't any" << endl;
XFree(p);
} else cout << "Xinerama not active" << endl;
} else cout << "No Xinerama extension" << endl;
XCloseDisplay(d);
} else cout << "Can't open display" << endl;
return (success ? EXIT_SUCCESS : EXIT_FAILURE);
}