为什么有时无法覆盖类函数?

未知

我遵循了这个https://wiki.gnome.org/Projects/GnomeShell/Extensions/StepByStepTutorial来覆盖函数的方法。

例如,我想覆盖该类_setupKeyboard()的函数Keyboard,但未调用我的覆盖。我要更改的特定部分是这样,以删除if防护罩:

if (Meta.is_wayland_compositor()) {
    this._connectSignal(this._keyboardController, 'emoji-visible',
        this._onEmojiKeyVisible.bind(this));
}

我从源代码复制了该函数,删除了我不想要的部分,然后像这样设置替换函数:

const Keyboard = imports.ui.keyboard;

Keyboard.Keyboard.prototype._setupKeyboard = myOverride;

为什么不调用我的覆写,如何实现呢?

安迪·霍姆斯

不会调用覆盖有两个常见原因。如果在应用覆盖之前调用了该方法,或者该函数是Function.prototype.bind()用于创建新闭包的回调集

在这种情况下,将_setupKeyboard()在应用覆盖之前调用该函数GNOME Shell启动时,将在Keyboard.KeyboardManager 此处创建一个实例

// main.js, line #204
keyboard = new Keyboard.KeyboardManager();

到将keyboard变量分配给实例时,Keyboard.Keyboard已经创建了一个默认类并且_setupKeyboard()已经在中调用了函数Keyboard._init(),这比加载扩展扩展要早得多。

由于无法轻松解决此问题,因此最好的选择是重新创建要运行的代码的一部分:

const Meta = imports.gi.Meta;
const Main = imports.ui.main;
const Keyboard = imports.ui.keyboard.Keyboard;


const originalSetup = Keyboard.prototype._setupKeyboard;

const modifiedSetup = function () {
    originalSetup.call(this);

    if (!Meta.is_wayland_compositor()) {
        this._connectSignal(this._keyboardController, 'emoji-visible',
            this._onEmojiKeyVisible.bind(this));
    }
        
    this._relayout();
};


function init() {
}

// Your extension's enable function (might be a class method)
function enable() {
    let kbd = Main.keyboard.keyboardActor;

    if (kbd !== null) {
        if (!Meta.is_wayland_compositor()) {
            kbd.__mySignalId = kbd._connectSignal(kbd._keyboardController, 'emoji-visible',
                kbd._onEmojiKeyVisible.bind(kbd));
        }
    }

    Keyboard.prototype._setupKeyboard = modifiedSetup;
}

function disable() {
    let kbd = Main.keyboard.keyboardActor;

    if (kbd !== null && kbd.__mySignalId) {
        kbd.disconnect(kbd.__mySignalId);
        kbd.__mySignalId = 0;
    }

    Keyboard.prototype._setupKeyboard = originalSetup;
}

这不是很漂亮,但这通常是修补私有代码的代价。我也不能保证该代码将执行您想要的操作,因为我怀疑表情符号键是出于某种原因隐藏在X11上的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

pip:为什么有时以鸡蛋形式安装,有时以文件形式安装

来自分类Dev

为什么有时在匿名函数前会有分号?

来自分类Dev

为什么我的sed命令有时无法与r标志一起使用

来自分类Dev

为什么我在javascript中覆盖第一个函数时无法正常工作

来自分类Dev

为什么匿名对象有时需要默认构造函数?

来自分类Dev

Python语句:有时为True,有时为False。为什么?

来自分类Dev

在Laravel 5请求类中使用有时()函数

来自分类Dev

为什么有时在注释块中定义Javascript函数?

来自分类Dev

为什么有时在Javascript中,函数参数前会有美元符号($ arg)?

来自分类Dev

为什么有时无法扩展用户环境变量?

来自分类Dev

为什么量角器有时返回承诺,有时返回值?

来自分类Dev

为什么导航属性在其类为私有时不填充?

来自分类Dev

为什么有时可以将ref附加到无状态函数?

来自分类Dev

为什么获得图像宽度有时效果很好,但有时在Vue.js中却无法呢?

来自分类Dev

为什么有时有时无法编辑Google表格公式行距?

来自分类Dev

为什么有时使用基本类型作为基类进行编译?

来自分类Dev

为什么有时某个函数的定义中包含参数,但实际函数中却没有参数?

来自分类Dev

在Scala 2.13中,为什么有时有时无法显式地召唤类型类?

来自分类Dev

为什么单击按钮时JavaScript有时无法正常工作?

来自分类Dev

为什么有时在PHP中无法使用此附加功能?

来自分类Dev

为什么我的函数有时不执行document.body.innerHTML命令?

来自分类Dev

在Java中,为什么在创建新对象时有时将父类放在左侧?

来自分类Dev

为什么OOM杀手有时无法杀死资源猪?

来自分类Dev

为什么有时我的键盘在Chrome和Opera中无法正常工作?

来自分类Dev

为什么有时伪类是a:active有时是a.active?

来自分类Dev

为什么Python有时不为函数参数创建新对象?

来自分类Dev

为什么我的解析任务有时无法完成?

来自分类Dev

为什么有时在使用 Comparable 或其他接口时必须在尖括号中声明类类型?

来自分类Dev

为什么 response.get 有时无法获取整个 html 页面?

Related 相关文章

  1. 1

    pip:为什么有时以鸡蛋形式安装,有时以文件形式安装

  2. 2

    为什么有时在匿名函数前会有分号?

  3. 3

    为什么我的sed命令有时无法与r标志一起使用

  4. 4

    为什么我在javascript中覆盖第一个函数时无法正常工作

  5. 5

    为什么匿名对象有时需要默认构造函数?

  6. 6

    Python语句:有时为True,有时为False。为什么?

  7. 7

    在Laravel 5请求类中使用有时()函数

  8. 8

    为什么有时在注释块中定义Javascript函数?

  9. 9

    为什么有时在Javascript中,函数参数前会有美元符号($ arg)?

  10. 10

    为什么有时无法扩展用户环境变量?

  11. 11

    为什么量角器有时返回承诺,有时返回值?

  12. 12

    为什么导航属性在其类为私有时不填充?

  13. 13

    为什么有时可以将ref附加到无状态函数?

  14. 14

    为什么获得图像宽度有时效果很好,但有时在Vue.js中却无法呢?

  15. 15

    为什么有时有时无法编辑Google表格公式行距?

  16. 16

    为什么有时使用基本类型作为基类进行编译?

  17. 17

    为什么有时某个函数的定义中包含参数,但实际函数中却没有参数?

  18. 18

    在Scala 2.13中,为什么有时有时无法显式地召唤类型类?

  19. 19

    为什么单击按钮时JavaScript有时无法正常工作?

  20. 20

    为什么有时在PHP中无法使用此附加功能?

  21. 21

    为什么我的函数有时不执行document.body.innerHTML命令?

  22. 22

    在Java中,为什么在创建新对象时有时将父类放在左侧?

  23. 23

    为什么OOM杀手有时无法杀死资源猪?

  24. 24

    为什么有时我的键盘在Chrome和Opera中无法正常工作?

  25. 25

    为什么有时伪类是a:active有时是a.active?

  26. 26

    为什么Python有时不为函数参数创建新对象?

  27. 27

    为什么我的解析任务有时无法完成?

  28. 28

    为什么有时在使用 Comparable 或其他接口时必须在尖括号中声明类类型?

  29. 29

    为什么 response.get 有时无法获取整个 html 页面?

热门标签

归档