【问题标题】:How to query X11 display resolution?如何查询X11显示分辨率?
【发布时间】:2020-05-09 10:36:35
【问题描述】:

这似乎是一个简单的问题,但我找不到答案:您如何(通过 X11)查询存在哪些监视器及其分辨率?

【问题讨论】:

    标签: linux x11


    【解决方案1】:

    Xlib manual 中查看display macrosscreen macros

    具体来说:

    • 来自first linkScreenCount()ScreenOfDisplay()
    • 来自second linkWidthOfScreen()HeightOfScreen()

    【讨论】:

      【解决方案2】:

      这可能对 cli 和脚本有帮助

      xwininfo -root
      

      但 xRandR 可能更准确,尤其是当有多个监视器环境时:

      xrandr
      

      【讨论】:

      • 看起来xrandrxwininfo -root 相比并没有告诉您当前处于活动状态的监视器。但是它通过代理告诉您活动根窗口的监视器。
      【解决方案3】:

      如果正在使用 Xinerama,请尝试 XineramaQueryScreens。否则,您可能可以假设一个屏幕并使用(X)WidthOfScreen/(X)HeightOfScreen.

      (另见另一个答案。很可能有人正在使用旧的 X 屏幕模型,您的屏幕是 :x.0:x.1 等)

      【讨论】:

        【解决方案4】:

        对于现代 X 服务器,还有 XRandR 扩展,它提供了多屏幕布局信息的最新模型,包括重叠屏幕和动态屏幕变化。

        它的文档在XRandR 1.3.1 Protocol speclibXrandr man page 中提供。

        【讨论】:

          【解决方案5】:

          X11 库仅适用于类 unix 操作系统,因此它不是跨平台解决方案。

          完整代码

          #include <stdio.h>
          
          #include <X11/Xlib.h>
          
          int
          main(const int argc, const char *argv[])
          {
          
              Display *display;
              Screen *screen;
          
              // open a display
              display = XOpenDisplay(NULL);
          
              // return the number of available screens
              int count_screens = ScreenCount(display);
          
              printf("Total count screens: %d\n", count_screens);
          
          
              for (int i = 0; i < count_screens; ++i) {
                  screen = ScreenOfDisplay(display, i);
                  printf("\tScreen %d: %dX%d\n", i + 1, screen->width, screen->height);
              }
          
              // close the display
              XCloseDisplay(display);
          
             return 0;
          }
          

          汇编

          gcc -o setup setup.c -std=c11 `pkg-config --cflags --libs x11`
          

          结果(我的电脑实际)

          Total count screens: 1
              Screen 1: 1366X768
          

          基于:

          1. https://tronche.com/gui/x/xlib/display/opening.html
          2. https://tronche.com/gui/x/xlib/display/display-macros.html
          3. https://tronche.com/gui/x/xlib/display/screen-information.html
          4. https://stackoverflow.com/a/1829747/6003870

          【讨论】:

          • 感谢您提供代码。你知道我的问题的答案吗:stackoverflow.com/questions/42987932/…。我在问您在此代码中找到的屏幕是否与 Gtk3 3.22 所谓的监视器相同。
          • 对 Cygwin/Xming/等有什么意见/经验吗? X11 可能不便携,但如果它被移植/改编,它和便携一样好,不是吗?不是我的专业领域——我习惯于使用像 SDL2 这样的库来掩盖这些东西。
          • 这不适用于多显示器,至少在我的 Ubuntu 设置中是这样。该问题使用了“监视器”一词,带有“s”。这段代码给我的结果:Total count screens: 1 Screen 1: 3520X1200 我正在使用两个“加入显示”,如显示 GUI 设置所示。第一个是 1920x1200。第二个是更小的笔记本电脑显示器。代码结果为您提供了两个显示器并排覆盖的总面积。我想以编程方式确定主显示器的分辨率。
          【解决方案6】:

          Python

          import os
          from Xlib import X, display
          d = display.Display()
          s = d.screen().root
          output = os.popen("xrandr --listmonitors | grep '*' | awk {'print $4'}").read().splitlines()
          num_sc = s.xinerama_get_screen_count().screen_count
          width = s.get_geometry().width
          height = s.get_geometry().height
          print("Total count screens: %s" % num_sc)
          for i in range(num_sc):
              print("\tScreen %s(%s): %sX%s" % (i, output[i], width, height))
          

          重击

          $ xrandr --listmonitors
          $ xrandr
          $ xrandr | grep '*' | awk {'print $1'}
          

          【讨论】:

            【解决方案7】:

            清理 xrandr 输出以供 imagemagick 使用

            $ xrandr |grep \* |awk '{print $1}'
            

            结果在:

            1920x1080
            

            【讨论】:

            • 与X11无关?
            猜你喜欢
            • 1970-01-01
            • 2012-09-20
            • 2014-07-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-27
            • 1970-01-01
            相关资源
            最近更新 更多