GDK Screen vs Monitor与Display?

时间:2015-05-13 06:50:17

标签: linux gtk screenshot gdk

我目前正在开发一款小应用程序来截取所有物理显示器的屏幕截图。尽管在所有术语之间我都很困惑。我明白了:

  1. 我们可以有多个显示器
  2. 每个显示器可以有多个显示器,称为屏幕?
  3. 我很困惑因为我认为屏幕可能是台式机?我的应用程序不关心不可见的桌面,只需截取当前所有显示器上的内容。

    我的理解是否正确?

    到目前为止,这是我的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
                            }
                        );
                    }
                }
    

    你可以看到我对显示器感到困惑,所以只是评论了它。

    非常感谢

1 个答案:

答案 0 :(得分:6)

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

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

GDK没有代表监视器的对象;它具有GdkDisplayGdkScreen上的API,它为显示几何图形等内容提供监视器索引。

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

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

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