我如何在 GNOME 中获取活动 window 的监视器?

How do I get the monitor of an active window in GNOME?

我是 GNOME 扩展开发的新手,由于严重缺乏 API 的文档(或者我的互联网可能被秘密审查),我很难使用它。我首先修改了现有的扩展程序,以便更容易绕过它。

问题是,我可以使用 global.display.focus_window 获取活动的 window,还可以使用 Main.layoutManager.monitors 获取连接到计算机的显示器列表。现在,我想做的是找出获得的 window 位于哪个显示器上(这样我就可以将顶部面板移到该显示器上,因为这可能意味着我目前正在该显示器上工作) .我尝试了各种方法,如 .screen、.monitor 等,但没有成功。我没有关于此的 IntelliSense 完成,我试图猜测成员可能是什么,因为我似乎找不到任何关于它的文档。

我很欣赏 GNOME 比我以前使用的更可定制(Unity,它根本不提供定制),但我不知道如何使用它并且资源稀缺。我试着查看源代码,但我不熟悉它的组织方式,而且我找不到我需要的成员的相关代码部分,如果它们存在的话。

我正在编写 .js 文件,所以我想我需要一些 JavaScript 代码。

非常感谢。

虽然 Gnome Shell 的大部分用户可见部分都是用 JavaScript 编写的,但这些通常只是底层 C 库的绑定。如果您正在使用 Windows、Monitors 和 Screens,那么您将需要参考 Mutter 文档,可能还需要参考 Shell 文档:

global 对象上有一个叫做 screen 的 属性(所以 global.screen),这无疑是一个 MetaScreen,它有一个函数 get_n_monitors(), as well as get_primary_monitor(), get_current_monitor() and others. MetaWindow, on the other hand, contains a function called get_monitor() 其中 returns 一个整数。我收集到监视器是由整数引用的,它被传递给 MetaScreenMetaWindow 的各种函数,因为在 Mutter 文档中似乎没有针对它的对象。

关于你想做的事情的大多数相关 JavaScript 似乎都在 layout.js 中,这可能比我能提供更好的关于如何在 Gnome Shell 中使用 Mutter 的例子给你。它还包括一个 Monitor class,它似乎只是监视器索引的 JS 包装器。这个class用在了LayoutManagerclass(也就是实例Main.layoutManager的定义)。

关于文档的说明

最初,没有“适当的”gnome-shell 文档的理由是(内部 JavaScript)API 非常不稳定。交易是,你没有得到一个稳定的 API 但你可以用你将要使用的语言阅读源代码。在某些方面这是有道理的,因为你可以修改 prototype 的活动对象和随心所欲的猴子补丁。

API 已经安定下来很多,但还没有人真正着手编写脚本来自动记录它。我最好的建议是为 Mutter、Shell 和 St 文档添加书签,并使用 Github 或 GitLab 的搜索让事情变得更容易。

但是有 Gnome 的文档 API 以及一些值得浏览的内置模块: