【问题标题】:How do I get the monitor of an active window in GNOME?如何在 GNOME 中获得活动窗口的监视器?
【发布时间】:2020-09-07 04:28:17
【问题描述】:

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

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

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

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

非常感谢。

【问题讨论】:

    标签: javascript ubuntu gnome gnome-3 gnome-shell-extensions


    【解决方案1】:

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

    global 对象上有一个名为screen(所以global.screen)的属性,这无疑是一个MetaScreen,它具有函数get_n_monitors(),以及get_primary_monitor()get_current_monitor() 和其他。另一方面,MetaWindow 包含一个名为get_monitor() 的函数,它返回一个整数。我收集到监视器是由整数引用的,它被传递给MetaScreenMetaWindow 的各种函数,因为在 Mutter 文档中似乎没有一个对象。

    大多数与您想做的相关的 JavaScript 似乎都在 layout.js 中,这可能比我可以给您提供的关于如何在 Gnome Shell 中使用 Mutter 的示例更好。它还包括一个Monitor 类,它似乎只是一个围绕监视器索引的JS 包装器。该类用在LayoutManager类(即实例Main.layoutManager的定义)中。

    关于文档的说明

    最初,没有“正确”的 gnome-shell 文档的原因是(内部 JavaScript)API 非常不稳定。交易是,您没有获得稳定的 API,但您可以使用您将要编写的相同语言阅读源代码。在某些方面这是有道理的,因为您可以修改 live 的prototype随心所欲的对象和猴子补丁。

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

    不过,有关于 Gnome API 的文档以及一些值得一读的内置模块:

    【讨论】:

    • 太棒了,您可以节省时间!为我指明了正确的方向。我可以使用以下方法将顶部面板移动到包含活动窗口的监视器: Mainloop.timeout_add(10, function () { var mon = global.display.focus_window.get_monitor(); Main.panel.actor.get_parent() .set_x(Main.layoutManager.monitors[mon].x); Main.panel.actor.get_parent().width = Main.layoutManager.monitors[mon].width; });非常感谢您,出色的解决方案以及有关文档的澄清说明。现在我需要想办法在屏幕上移动窗口时执行这段代码。
    • 也许我可以尝试在 GNOME Shell 扩展中发布它,如果不存在类似的东西,并且我花时间将代码迁移到我自己的扩展(我正在编辑其他人的时刻,为了方便,也因为最初我打算只编辑一些小东西,结果结果是一个比预期更大的项目)。基本上,我想要做的是将顶部面板迁移到当前活动窗口所在的监视器(这样“窗口按钮”、“无标题栏”、“GNOME 全局菜单”等扩展名在多个屏幕)。
    • 好的,所以我通过订阅“window-entered-monitor”事件来完成我想要的操作:this.event = global.screen.connect_after('window-entered-monitor', Lang .bind(this, this._updatePanel) ); .现在,顶部面板跟随我在屏幕之间移动的窗口。
    • 很高兴为您提供帮助,您可能希望查看 Lang 的 GJS wiki 部分,因为它现在被认为已弃用 (gitlab.gnome.org/GNOME/gjs/wikis/Modules#lang) 以及那里的其他一些页面。有时人们会继承或复制自 GJS 采用 ES6 JavaScript 以来不必要的尴尬习惯。
    • Gnome API 链接当前已失效。
    猜你喜欢
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2012-04-05
    • 2020-09-11
    • 1970-01-01
    相关资源
    最近更新 更多