我正在开发一个小项目,以在GNOME下的多个屏幕上显示多个墙纸(这显然是GNOME本身或其他任何事情都无法完成的)。我已经弄清楚了如何做主要部分(出于好奇,使用了ImageMagick组件)。我正在尝试使配置系统自动化。
为此,我需要一种确定各个屏幕尺寸的方法。谁能给我一个在哪里寻找的提示?我假设X服务器本身具有该信息,但是我不确定我的程序如何要求它。
看起来好像有一个libXineramaAPI可以检索该信息。我还没有找到任何详细的信息。
libXinerama
可以在此处找到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); }