2015-12-06 48 views
0

對於raise-activated GNOME Shell 3.16擴展我試圖對AppSwitcherPopup._finish方法進行猴修補。像original,已修補版本調用this.parentGNOME Shell擴展的猴子補丁後,this.parent出乎意料

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正在呼叫thisthis應該AppSwitcherPopup子類的一個實例。我認爲this.parent修補後應該是相同的 - 爲什麼現在正試圖調用調用者?就此而言,爲什麼不能成功呢?

我擡起頭,GJS code生成this.parent,但我不能找到缺少的東西。

回答

0

經過深入挖掘,我發現了一種方法來解決它。在GJS類模型中,parent函數實際上是查找方法的所有者的超類,以便調用相同名稱的方法。看起來每個GJS班都有一個wrapFunction幫手,它設置_owner。我用它來修補功能:

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