在 gtk-rs 中,如何获取 gtk::Window(大部分)打开的当前屏幕?

In gtk-rs, how do I get the current screen that a gtk::Window is (mostly) on?

我想要完成的是计算我的应用程序最常使用的屏幕的 dpi(或者,在我的例子中,dpmm)。据我所知,现代的方法是调用 gdk::Monitor::get_height_mmgdk::Monitor::get_width_mm.

所以,从 window: gtk::Window 开始,我正在尝试像这样获取监视器:

let screen = window.get_display().and_then(|display| get_monitor_at_window(&window));

但是,gtk::Window 没有 IsA<gdk::Window> 实现:

8 |     window.get_display().and_then(|display| display.get_monitor_at_window(&window));
  |                                                                           ^^^^^^^ the trait `glib::IsA<gdk::auto::window::Window>` is not implemented for `gtk::Window`
  |
  = help: the following implementations were found:
            <gtk::Window as glib::IsA<glib::Object>>
            <gtk::Window as glib::IsA<gtk::Bin>>
            <gtk::Window as glib::IsA<gtk::Buildable>>
            <gtk::Window as glib::IsA<gtk::Container>>
          and 2 others

那么,从 gtk::Window 到 window 所在屏幕的宽度和高度的毫米数的路径是什么?

一个gtk::Window is not the same as a gdk::Window。前者更像是一个“window”的概念,而后者更像是Xwindows的概念。在其他显示协议中,这些也称为“表面”,这就是它在 GTK 4 中重命名的原因,也是为了消除这种混淆。

无论如何,要在 GTK 中获取小部件的底层 surface/window,您可以调用 get_window() method on it (in gtk-rs, this is part of the gtk::WidgetExt trait)