linux - GDK 屏幕 vs 监视器 vs 显示器?

标签 linux gtk screenshot gdk

我目前正在开发一个小应用程序来截取所有物理监视器的屏幕截图。尽管在所有术语之间,我感到非常困惑。我明白了:

  1. 我们可以有多个显示器
  2. 每个显示器可以有多个监视器,称为屏幕?

我很困惑,因为我在想也许屏幕就是桌面?我的应用程序不关心不可见的桌面,只截取当前所有显示器上的屏幕截图。

我的理解正确吗?

到目前为止,这是我的 GDK 伪代码:

var rezArr = [];
gdk_display_manager_list_displays

for (var d=0; d<displays.length; d++) {
    
    var nScreens = gdk_display_get_n_screens(displays[d]);
    
    for (var s=0; s<nScreens; s++) {
        var cScreen = gdk_display_get_screen(displays[d], s);
        // var nMonitors = gdk_screen_get_n_monitors(cScreen);
        // for (var m=0; m<nMonitors; m++) {
            // var gdkRect = GdkRectangle();
            // gdk_screen_get_monitor_geometry(cScreen, m, gdkRect);
        // }
        
        var cRootWin = gdk_screen_get_root_window(cScreen);
        var cWidth = gdk_screen_get_width(cScreen);
        var cHeight = gdk_screen_get_height(cScreen);
        var cColormap = GdkColormap();
        gdk_screen_set_default_colormap(cScreen, cColormap);
        var cPixbuf = gdk_pixbuf_new(COLORSPACE_RGB, false, 8, cWidth, cScreen);
        var cDrawable = ctypes.cast(cScreen, self.TYPE.GdkDrawable.ptr);
        var src_x = 0; // im guessing, i could not figure out screen geometry, i could only get its width and height
        var src_y = 0; // im guessing, i could not figure out screen geometry, i could only get its width and height
        var dest_x = 0;
        var dest_y = 0;
        gdk_pixbuf_get_from_drawable(cPixbuf, cDrawable, cColormap, src_x, src_y, dest_x, dest_y, cWidth, cHeight);
        rezArr.push(
            {
                // i dont know how to get x1, y1 yet. but x2 and y2 is just x1 + cWidth and y1 + cHeight
                // monitorTopLeftX: x1,
                // monitorTopLetY: y1,
                // monitorBottomRightX: x2,
                // monitorBottomRightY: y2,
                pixbuf: cPixbuf
            }
        );
    }
}

你可以看到我对显示器感到困惑,所以就把它注释掉了。

非常感谢

最佳答案

GdkDisplay 是一个对象,表示与显示服务器(如 X11 服务器或 Wayland 合成器)的单一连接。应用程序可以有多个连接,但 GDK 资源与创建它们的每个 GdkDisplay 实例相关联。

GdkScreen 是一个“屏幕”,与 X11 具有 Screen 的方式相同;它是一个虚拟实体,可以匹配多个监视器或监视器的一部分。现代 GDK/GTK 代码假定 GdkDisplayGdkScreen 之间的 1:1 匹配。

GDK 没有表示监视器的对象;它在 GdkDisplayGdkScreen 上有 API,可以获取显示几何等内容的监视器索引。

[更新] 从 Gtk+ 3.22 开始,有一个新的 GdkMonitor 类代表监视器,可用于获取有关监视器几何形状等的信息。 [/更新]

从窗口管理器的角度来看,基本上所有 X11 WM 都使用覆盖所有显示器的单个屏幕,因此您实际上不需要迭代它们。

看来您正在尝试编写代码来抓取整个屏幕的屏幕截图。最简单的解决方案是获取默认 GdkScreen 的根窗口并使用 gdk_pixbuf_get_from_window();这将为您完成所有工作。

关于linux - GDK 屏幕 vs 监视器 vs 显示器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30207586/

相关文章:

linux - 通过在 linux 中删除 url 参数来重命名文件

php - SOAP 错误 : Parsing WSDL: Couldn't load from 'https://ads.google...LineItemService?wsdl' : failed to load external entity

gtk - 是否可以在不使用 GObject 样式构造的情况下扩展基本 Gtk 小部件?

c# - Mono C# 的 CSS 样式

c++ - 从线程安全地发出信号并将其连接到小部件

Java Libgdx 获取截图非常慢

c - 使用 libsoup 时出错

c - 为什么 clock_nanosleep 优于 nanosleep 以在 C 中创建 sleep 时间?

objective-c - 如何拍摄圆形屏幕截图?

c++ 在 linux 中使用 opencv 快速截图