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

Hea*_*eek 4 linux gnome multiple-monitors xorg

我正在开发一个侧面项目来在GNOME下在多个屏幕上显示多个壁纸(这显然是GNOME本身或其他任何东西都无法完成的).我已经想出了如何做它的主要部分(使用ImageMagick组件,为了好奇); 我正在尝试自动化配置系统.

要做到这一点,我需要一种方法来确定各个屏幕的尺寸.任何人都可以给我一个暗示在哪里寻找它?我假设X服务器本身有信息,但我不确定我的程序可以如何要求它.

Hea*_*eek 7

看起来有一个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);
}
Run Code Online (Sandbox Code Playgroud)


Fed*_*ero 5

尝试类似的东西

GdkScreen *screen;
int num_monitors;
int i;

screen = gdk_screen_get_default ();
num_monitors = gdk_screen_get_n_monitors ();

for (i = 0; i < num_monitors; i++) {
    GdkRectangle rect;

    gdk_screen_get_monitor_geometry (screen, i, &rect);
    printf ("monitor %d: offsets (%d, %d), size (%d, %d)\n",
        i,
        rect.x, rect.y,
        rect.width, rect.height);
}
Run Code Online (Sandbox Code Playgroud)

在内部,它使用libXrandr API.Xinerama或多或少被弃用,但仍然有效; RANDR是处理X中多个监视器的新方法.