2015-12-06 1 views
0

Для расширения raise-activated Расширение GNOME Shell 3.16 Я пытаюсь обезвредить метод AppSwitcherPopup._finish. Как original, пропатченный называют this.parent:После того, как расширение оболочки GNOME Shell было исправлено, этот параметр неожиданен

function _modifiedFinish(timestamp) { 
    // ...monkey-patched code... 
    this.parent(timestamp); 
} 

function enable() { 
    _originalFinish = AltTab.AppSwitcherPopup.prototype._finish; 
    AltTab.AppSwitcherPopup.prototype._finish = _modifiedFinish; 
} 

(full code)

Но я получаю эту трассировку стеки в консоли (от запуска gnome-shell --replace):

(gnome-shell:24452): Gjs-WARNING **: JS ERROR: TypeError: The method '_keyReleaseEvent' is not on the superclass 
[email protected]:///org/gnome/gjs/modules/lang.js:129 
[email protected]/home/lastorset/.local/share/gnome-shell/extensions/[email protected]/extension.js:34 
SwitcherPopup<[email protected]:///org/gnome/shell/ui/switcherPopup.js:199 
[email protected]:///org/gnome/gjs/modules/lang.js:169 

В этом случае, SwitcherPopup._keyReleaseEvent вызывает this, а thisдолжен является экземпляром подкласса AppSwitcherPopup. Я считаю, что this.parent должно быть таким же после исправления - почему он теперь пытается вызвать вызывающего? И в этом отношении, почему это не удается?

Я искал GJS code, который сгенерировал this.parent, но я не могу понять, чего не хватает.

ответ

0

После копания немного больше я нашел способ исправить это. В модели класса GJS функция parent фактически ищет суперкласс класса, чтобы вызвать метод с тем же именем. Похоже, что у каждого класса GJS есть помощник wrapFunction, который устанавливает _owner. Я использовал это для исправления функции:

AltTab.AppSwitcherPopup.prototype._finish = AltTab.AppSwitcherPopup.wrapFunction('_finish', _modifiedFinish);