Я пишу расширение GNOME Shell на JavaScript, которое изменяет все окна приложений.
В качестве упражнения я хочу начать с получения имени приложения только одного открытого окна и отображения его на панели.,
Прямо сейчас, в Looking Glass, я могу получить все открытые окна, набрав
>>> global.screen.get_active_workspace().list_windows()
r(0) = [object instance proxy GType:MetaWindowX11 ...], ...
, и я могу получить имя первого окна в списке, набрав
>>> Shell.WindowTracker.get_default().get_window_app(r(0)[0]).get_name()
r(1) = <name of application>
Однако, когда я пытаюсь сделать это в файле extension.js
моего расширения и затем перезапустить GNOME Shell, я не могу получить имя открытого окна, потому что результат global.screen.get_active_workspace().list_windows()
равен undefined
.
Я подумал, что это может произойти, потому что мое расширение выполнялось до того, как были созданы окна, поэтому я начал изучать, как ждать создания окна перед выполнением операций над окнами.
Вот где я действительно застрял.
В функции init()
моего расширения я пытаюсь добавить прослушиватель событий, который запускает мою функцию update()
, когда он получает сигнал window-created
.
Сигнал window-created
поступает от объекта MetaDisplay .
Вот как выглядит мой код:
let display = global.display;
display.connect('window-created', Lang.bind(this, this.update));
Кодкомпилируется без ошибок, но моя функция update()
не вызывается при создании новых окон.
Кто-нибудь знает, что здесь происходит?Мой синтаксис неправильный?Должен ли я использовать другой сигнал?
Буду признателен за любую помощь.
Полный файл extension.js
const St = imports.gi.St;
const Main = imports.ui.main;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
let text, button;
function init() {
button = new St.Bin({ style_class: 'panel-button',
reactive: true,
can_focus: true,
x_fill: true,
y_fill: false,
track_hover: true });
let display = global.display;
display.connect('window-created', Lang.bind(this, this.update));
}
function update() {
let window = global.screen.get_active_workspace().list_windows()[0];
let name = Shell.WindowTracker.get_default().get_window_app(window).get_name();
text = new St.Label({ text: name });
button.set_child(text);
}
function enable() {
Main.panel._rightBox.insert_child_at_index(button, 0);
}
function disable() {
Main.panel._rightBox.remove_child(button);
}