Gnome GJS Ошибка: Gdk.Keymap.get_modifier_state не является функцией

Я пытаюсь получить состояние модификатора клавиатуры, перенося этот пример GDK здесь на Gnome GJS, чтобы использовать его в расширении Gnome.

Приведенный ниже код представляет собой модифицированную официальную демоверсию с https://developer.gnome.org/gnome-devel-demos/stable/hellognome.js.html.en.

Проблема в Gdk.Keymap.get_modifier_state() сообщается как не функция, где Gdk.Keymap.get_default() работает нормально

Возможно, я что-то упускаю при использовании функций с параметром структуры в JS. (Я не знаком с JS). Так что не так с моим кодом?

Код:

#!/usr/bin/gjs

//https://developer.gnome.org/gnome-devel-demos/stable/hellognome.js.html.en

const Gtk = imports.gi.Gtk;
const Gdk = imports.gi.Gdk;
const Lang = imports.lang;
const Webkit = imports.gi.WebKit;

const HelloGNOME = new Lang.Class ({
    Name: 'Hello GNOME',
    _init: function () {
        this.application = new Gtk.Application ();
        this.application.connect('activate', Lang.bind(this, this._onActivate));
        this.application.connect('startup', Lang.bind(this, this._onStartup));
        },

        _onActivate: function () {
                this._window.present ();
                this._keymap = Gdk.Keymap.get_default ();
                //this._state = Gdk.Keymap.get_modifier_state (this._keymap);
                this._caps = Gdk.Keymap.get_modifier_state ();
        },

        _onStartup: function () {
                this._buildUI ();
        },

        // Build the application's UI
        _buildUI: function () {

                // Create the application window
                this._window = new Gtk.ApplicationWindow  ({
                        application: this.application,
                        title: "Welcome to GNOME",
                        default_height: 200,
                        default_width: 400,
                        window_position: Gtk.WindowPosition.CENTER });
                // Create a webview to show the web app
                this._webView = new Webkit.WebView ();

                // Put the web app into the webview
                this._webView.load_uri (GLib.filename_to_uri (GLib.get_current_dir() +
                "/hellognome.html", null));

                // Put the webview into the window
                this._window.add (this._webView);

                // Show the window and all child widgets
                this._window.show_all();
        },

});

// Run the application
let app = new HelloGNOME ();
app.application.run (ARGV);

Сообщение об ошибке:

(gjs:2483): Gjs-WARNING **: JS ERROR: TypeError: Gdk.Keymap.get_modifier_state is not a function
HelloGNOME<._onActivate@./gdk_mod.js:23
wrapper@resource:///org/gnome/gjs/modules/lang.js:169
@./gdk_mod.js:58

Тем не менее, я вижу это в некоторых документах, таких как здесь: http://www.roojs.org/seed/gir-1.2-gtk-3.0/seed/Gdk.Keymap.html и в GIR mapping /usr/share/gir-1.0/Gdk-3.0.gir:

<method name="get_modifier_state"
              c:identifier="gdk_keymap_get_modifier_state"
              version="3.4">
        <doc xml:space="preserve">Returns the current modifier state.</doc>
        <return-value transfer-ownership="none">
          <doc xml:space="preserve">the current modifier state.</doc>
          <type name="guint" c:type="guint"/>
        </return-value>
        <parameters>
          <instance-parameter name="keymap" transfer-ownership="none">
            <doc xml:space="preserve">a #GdkKeymap</doc>
            <type name="Keymap" c:type="GdkKeymap*"/>
          </instance-parameter>
        </parameters>
</method>

Я пытался с Python, чтобы проверить, если проблема в привязке самоанализа. Во всяком случае, это работает хорошо.

#!/usr/bin/python

from gi.repository import Gdk, GLib

def update(keymap):
        print Gdk.Keymap.get_modifier_state(keymap)
        return True

if __name__=="__main__":

        #Gdk.init()

        loop = GLib.MainLoop()

        keymap = Gdk.Keymap.get_default()
        GLib.timeout_add_seconds(1, update, keymap)

        loop.run()

1 ответ

Решение

С точки зрения ОО, вы пытаетесь вызвать метод класса, Gdk.Keymap, а не на объекте, this._keymap, Это сработало для меня:

this._keymap = Gdk.Keymap.get_default ();
this._caps = this._keymap.get_modifier_state ();
Другие вопросы по тегам