一尘不染

以编程方式确定Linux中的单个屏幕宽度/高度(带有Xinerama,TwinView和/或BigDesktop)

linux

我正在开发一个小项目,以在GNOME下的多个屏幕上显示多个墙纸(这显然是GNOME本身或其他任何事情都无法完成的)。我已经弄清楚了如何做主要部分(出于好奇,使用了ImageMagick组件)。我正在尝试使配置系统自动化。

为此,我需要一种确定各个屏幕尺寸的方法。谁能给我一个在哪里寻找的提示?我假设X服务器本身具有该信息,但是我不确定我的程序如何要求它。


阅读 278

收藏
2020-06-03

共1个答案

一尘不染

看起来好像有一个libXineramaAPI可以检索该信息。我还没有找到任何详细的信息。

可以在此处找到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);
}
2020-06-03