GDK 屏幕 vs 监视器 vs 显示器?
GDK Screen vs Monitor vs Display?
我目前正在开发一个小应用程序来截取所有物理监视器的屏幕截图。尽管在所有术语之间,我感到非常困惑。我明白了:
- 我们可以有多个显示器
- 每个显示器可以有多个监视器,称为屏幕?
我很困惑,因为我在想屏幕可能就是桌面?我的应用程序不关心不可见的桌面,只截取当前所有显示器上的屏幕截图。
我的理解正确吗?
到目前为止,这是我的 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
是一个 "screen",就像 X11 有 Screen
一样;它是一个虚拟实体,可以匹配多个监视器或监视器的一部分。现代 GDK/GTK 代码假设 1:1 匹配 GdkDisplay
和 GdkScreen
。
GDK 没有表示监视器的对象;它在 GdkDisplay
和 GdkScreen
上有 API,它为诸如显示几何之类的东西采用监视器索引。
[更新] 从 Gtk+ 3.22 开始有一个新的 GdkMonitor
class 表示监视器,可用于获取有关监控几何等。 [/更新]
从 window 经理的角度来看,基本上所有 X11 WM 都使用覆盖所有显示器的单个屏幕,因此您真的不需要迭代它们。
您似乎在尝试编写代码来抓取整个屏幕的屏幕截图。最简单的解决办法就是抓取默认GdkScreen
的根window,然后使用gdk_pixbuf_get_from_window()
;这将为您完成所有工作。
我目前正在开发一个小应用程序来截取所有物理监视器的屏幕截图。尽管在所有术语之间,我感到非常困惑。我明白了:
- 我们可以有多个显示器
- 每个显示器可以有多个监视器,称为屏幕?
我很困惑,因为我在想屏幕可能就是桌面?我的应用程序不关心不可见的桌面,只截取当前所有显示器上的屏幕截图。
我的理解正确吗?
到目前为止,这是我的 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
是一个 "screen",就像 X11 有 Screen
一样;它是一个虚拟实体,可以匹配多个监视器或监视器的一部分。现代 GDK/GTK 代码假设 1:1 匹配 GdkDisplay
和 GdkScreen
。
GDK 没有表示监视器的对象;它在 GdkDisplay
和 GdkScreen
上有 API,它为诸如显示几何之类的东西采用监视器索引。
[更新] 从 Gtk+ 3.22 开始有一个新的 GdkMonitor
class 表示监视器,可用于获取有关监控几何等。 [/更新]
从 window 经理的角度来看,基本上所有 X11 WM 都使用覆盖所有显示器的单个屏幕,因此您真的不需要迭代它们。
您似乎在尝试编写代码来抓取整个屏幕的屏幕截图。最简单的解决办法就是抓取默认GdkScreen
的根window,然后使用gdk_pixbuf_get_from_window()
;这将为您完成所有工作。