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

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

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

    它看起来像有一个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); } 

    尝试类似

     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); } 

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

    这适用于TwinView,我没有测试其他的:

     #!/usr/bin/python # Print some information about the X environment, the monitor setup, currently active window and cursor position import gtk.gdk screen = gtk.gdk.screen_get_default() print "X default screen size: %dx %d" % (screen.get_width(), screen.get_height()) print "xid of root window: %d" % screen.get_root_window().xid monitors = int(screen.get_n_monitors()) print "== %d monitors ==" % monitors for m in range(0, monitors): print " - geometry of monitor %d: %s" % (m, screen.get_monitor_geometry(m)) window = screen.get_active_window() win_x, win_y, win_w, win_h, win_bit_depth = window.get_geometry() print "active window on monitor: %d" % screen.get_monitor_at_point((win_x+(win_w/2)),(win_y+(win_h/2))) print "window geometry (x,y,w,h): %d, %d, %d, %d" % (win_x,win_y,win_w,win_h) display = gtk.gdk.display_get_default() pointer = display.get_pointer() print "cursor position (x, y): %d, %d" % (pointer[1], pointer[2]) print "cursor on monitor: %d" % screen.get_monitor_at_point(pointer[1],pointer[2]) 

    我总是使用“xdpyinfo”命令来确定屏幕大小; 运行该命令,然后查看输出的第二个或第三个页面,其内容如下所示:

     screen #0: dimensions: 1280x800 pixels (339x212 millimeters) resolution: 96x96 dots per inch depths (7): 24, 1, 4, 8, 15, 16, 32 root window id: 0xac depth of root window: 24 planes ... 

    你既可以在外部运行这个命令,也可以通过文本处理来获取尺寸,或者你可以快速下载xdpyinfo的代码,并复制它所产生的C调用来产生那一行输出。 祝你好运!