Какая функция gnome отвечает за переключение рабочих пространств? - PullRequest
1 голос
/ 16 июня 2020

Gio open «http://...» из терминала переключается с текущего рабочего пространства на рабочее пространство, где находится браузер по умолчанию. То же самое происходит, когда ссылки открываются из других приложений (электронная почта et c.).

Я хотел бы написать расширение и попытался переопределить множество функций в js / ui. Некоторые из них предотвращают переключение рабочего пространства, например, с клавиатуры, но, похоже, ничто не препятствует изменению рабочего пространства с помощью этих ссылок. Я предполагаю, что активация d-bus как-то связана с этим, но поскольку это мое первое исследование gnome, я чувствую себя немного потерянным.

Итак, я хотел бы переопределить функцию gnome, которая отвечает для переключения рабочего пространства. В основном я хотел бы предотвратить все переключения, а затем продолжить с этого момента. В в справочном руководстве Mutter сказано, что при изменении активной рабочей области сначала вызывается meta_compositor_switch_workspace (). Javascript версия этого находится в js / ui / windowManager. js: _ switchWorkspace (shellwm, from, to, direction).

Если я переопределю эту функцию, ничего не произойдет. Ошибок нет. Это неправильная функция? Я делаю что-то неправильно? Должен ли я сам переопределить это meta_compositor_switch_workspace вместо _switchWorkSpace? И если я должен это сделать, есть ли где-нибудь помощь?

const Meta = imports.gi.Meta;
const Main = imports.ui.main;
const WindowManager = imports.ui.windowManager;


function mySwitchWorkspace(shellwm, from, to, direction) {
    log("in my switchWorkspace");
    //if ... {
    //        shellwm.completed_switch_workspace();
            return;
    //    }
    }

let old_sw = {};

function init() {
    old_sw = WindowManager.WindowManager.prototype._switchWorkspace;
    log(old_sw);
}

function enable() {
    WindowManager.WindowManager.prototype._switchWorkspace = mySwitchWorkspace;
    log(WindowManager.WindowManager.prototype._switchWorkspace);
}

function disable() {
    WindowManager.WindowManager.prototype._switchWorkspace = old_sw;
}

1 Ответ

1 голос
/ 03 июля 2020

Архитектура 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));
}
...