Как получить монитор активного окна в GNOME?

Я очень новичок в разработке расширений GNOME, и мне трудно с ним работать из-за полного отсутствия документации (или, возможно, мой Интернет скрыто подвергается цензуре) API. Я начал с изменения существующего расширения, чтобы его было легче обойти.

Проблема в том, что я могу получить активное окно, используя global.display.focus_window, а также список мониторов, подключенных к компьютеру, используя Main.layoutManager.monitors. Теперь я хотел бы узнать, на каком мониторе находится полученное окно (чтобы я мог переместить верхнюю панель на этот монитор, так как это, вероятно, означает, что я работаю на этом мониторе в данный момент). Я пробовал разные вещи, такие как .screen, .monitor и т. Д., Но безуспешно. У меня нет завершения IntelliSense по этому вопросу, и я пытаюсь угадать, какими могут быть члены, поскольку я не могу найти по нему никаких документов.

Я ценю тот факт, что GNOME гораздо более настраиваемый, чем то, что я использовал раньше (Unity, который вообще не предоставлял никаких настроек), но я не знаю, как с ним работать, а ресурсов мало. Я попытался просмотреть исходный код, но не знаю, как он организован, и не смог найти соответствующую часть кода, где объявляются нужные мне члены, если они существуют.

Я кодирую файлы .js, поэтому, наверное, мне нужен код JavaScript.

Большое тебе спасибо.


person Valentin Radu    schedule 28.04.2018    source источник


Ответы (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() который возвращает целое число. Насколько я понимаю, мониторы обозначаются целым числом, которое передается различным функциям MetaScreen и MetaWindow, поскольку в документации Mutter, похоже, нет объекта для этого.

Большая часть связанного JavaScript для того, что вы хотите сделать, кажется, находится в layout.js, который, вероятно, содержит лучшие примеры использования Mutter в Gnome Shell, чем я могу вам привести. Он также включает класс Monitor, который, похоже, является просто оболочкой JS вокруг индекса монитора. Этот класс используется в классе LayoutManager (который является определением экземпляра Main.layoutManager).

Примечание о документации

Первоначально причина отсутствия надлежащей документации gnome-shell заключалась в том, что (внутренний JavaScript) API был довольно нестабильным. Дело в том, что вы не получаете стабильного API, но вы можете читать исходный код на том же языке, на котором собираетесь его писать. В некотором смысле это имеет смысл, учитывая, что вы можете изменять prototype живых объектов и обезьяна патч по прихоти.

API во многом устоялся, но пока еще никто не решился написать скрипт для его автоматического документирования. Мой лучший совет — добавить в закладки документацию Mutter, Shell и St и использовать поиск Github или GitLab, чтобы упростить задачу.

Однако есть документация для Gnome API, а также некоторые встроенные модули, которые стоит просмотреть:

person andy.holmes    schedule 28.04.2018
comment
Отлично, вы экономите время! Направил меня в нужном направлении. Я могу переместить верхнюю панель на монитор, который содержит активное окно, используя: 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; }); Большое спасибо, блестящее решение, а также разъясняющее объяснение документов. Теперь мне нужно выяснить способ выполнения этого кода при перемещении окон на экране. - person Valentin Radu; 29.04.2018
comment
Возможно, я мог бы попытаться опубликовать это в расширениях оболочки GNOME, если что-то подобное не существует, и при условии, что я потрачу время на перенос кода в свое собственное расширение (в данный момент я редактирую чужое расширение для удобства, а также потому, что изначально я собирался просто отредактировать несколько мелких вещей, и это оказалось большим проектом, чем я ожидал). По сути, я пытаюсь сделать так, чтобы верхняя панель переместилась на монитор, на котором в данный момент находится активное окно (чтобы расширения, такие как кнопки окна, отсутствие строки заголовка, глобальное меню GNOME, работали и имели смысл на нескольких экранах). - person Valentin Radu; 29.04.2018
comment
Итак, я сделал то, что хотел, подписавшись на событие window-entered-monitor следующим образом: this.event = global.screen.connect_after('window-entered-monitor', Lang.bind(this, this._updatePanel)) ; . Теперь верхняя панель следует за окном, которое я перемещаю от экрана к экрану. - person Valentin Radu; 30.04.2018
comment
Рад помочь, вы можете заглянуть в вики-раздел GJS для Lang, так как теперь он считается устаревшим (gitlab.gnome.org/GNOME/gjs/wikis/Modules#lang), а также некоторые другие страницы. Иногда люди переносят или копируют неуклюжие привычки, которые не нужны с тех пор, как GJS принял ES6 JavaScript. - person andy.holmes; 30.04.2018
comment
Ссылка API Gnome в настоящее время не работает. - person CtrlAltF2; 05.09.2020
comment
Я изо всех сил пытаюсь примириться с тем, что это возможно, с этими общими утверждениями о Gnome закрыт по дизайну для обхода активных окон. Доступен ли global.display.focus_window только для расширений Gnome? - person matanster; 06.04.2021
comment
global соответствует Shell.Global, который является классом внутренней библиотеки gnome-shell . global.display содержит указатель на внутренний экземпляр Meta.Display, используемый оболочкой gnome. процесс. Таким образом, global.display.focus_window является получателем свойств для Meta.Display:focus-window. Вы не можете получить значение этого свойства из-за пределов процесса gnome-shell только потому, что используете ту же библиотеку. - person andy.holmes; 07.04.2021