Архитектура GNOME Shell и то, как она связана с расширениями, не сразу очевидна, поэтому, хотя вы на правильном пути, вам здесь не хватает перспективы.
Mutter - это библиотека для оконные менеджеры, а GNOME Shell технически является плагином Mutter. Реализация Meta.Plugin
в GNOME Shell: Shell.WM
. В коде JavaScript для windowManager.js
переменная, указывающая на Shell.WM
, равна windowManager._shellwm
:
// windowManager.js Line #590
this._shellwm.connect('switch-workspace', this._switchWorkspace.bind(this));
// windowManager.js Line #1799
_switchWorkspace(shellwm, from, to, direction) {
}
В приведенном выше коде вы можете видеть, что Shell.WM::switch-workspace
привязано к this._switchWorkspace()
. Хотя вы переопределили эту функцию, Function.prototype.bind()
создает новый экземпляр функции, поэтому копия исходного обратного вызова вызывается вместо вашей.
В этом случае идентификатор обработчика не был сохранен, поэтому у вас будет для отключения сигнала с помощью новых помощников в gjs >= 1.64
(GNOME 3.36):
let shellwm = global.window_manager
let handler = GObject.signal_handler_find(shellwm, {signalId: 'switch-workspace'});
shellwm.disconnect(handler);
После этого вы сможете подключить свое переопределение как обычный обратный вызов сигнала, а затем заменить исходный обработчик.
// Replacing the original handler when your extension is disabled
function disable() {
shellwm = global.window_manager;
wm = imports.ui.main.wm;
shellwm.connect('switch-workspace', wm._switchWorkspace.bind(wm));
}