(GObjectIntrospection) Ошибка сегментации при попытке создать движок ibus с использованием JavaScript - PullRequest
0 голосов
/ 14 января 2012

GObjectIntrospection позволяет использовать объект C на любом языке высокого уровня. https://live.gnome.org/GObjectIntrospection

IBus - это структура метода ввода для linux. code.google.com/p/ibus

У меня проблемы с использованием GObjectIntrospection / javascript. Я старался создать двигатель ibus. тот же код работает в vala, python. но в Сбой в JavaScript. Я использую opensuse 12.1 gnome3. Пакет "ibus-devel" предоставляет файл /usr/share/gir-1.0/IBus-1.0.gir, необходимый для GObjectIntrospection.

Я пытаюсь запустить следующий код.

#!/usr/bin/env gjs
const IBus = imports.gi.IBus;
//get the ibus bus
var bus = new IBus.Bus();
if(bus.is_connected()){
  var factory = new IBus.Factory({
  connection: bus.get_connection()
  });
   factory.add_engine({
   engine_name:"ibus-sarim",
   engine_type:typeof(this)
   });
}

Сбой в строке 6 в "новом IBus.Factory".

Терминальный выход,

(gjs:13353): GLib-GIO-CRITICAL **: g_dbus_connection_register_object:
assertion `object_path != NULL && g_variant_is_object_path
(object_path)' failed
Segmentation fault

Я не могу понять, в чем проблема. Я пробовал вала тестовый код предоставляется с ibus на https://github.com/ibus/ibus/blob/master/bindings/vala/test/enchant.vala Он компилируется и работает нормально. В enchant.vala линии 148,

var factory = new Factory(bus.get_connection());

Код для создания Factory такой же, как я пытался в javascript. также на питоне,

from gi.repository import IBus
from gi.repository import GLib
from gi.repository import GObject
IBus.init()
bus = IBus.Bus()
if bus.is_connected():
    factory = IBus.Factory.new(bus.get_connection())

Это также, кажется, работает нормально, без ошибок сегмента. Но в JavaScript это терпит неудачу каждый раз. Любая идея ? Я бьюсь об этом пару дней безрезультатно: (

1 Ответ

0 голосов
/ 15 января 2012

В IBusFactory:

"connection"               IBusConnection*       : Read / Write / Construct Only

В документации написано "Construct Only". Сейчас это подлежит интерпретации, но для меня это означает, что это, вероятно, частный или защищенный ученик. Тем не менее, конструктор определяется как:

IBusFactory *       ibus_factory_new                    (IBusConnection *connection);

Эта переменная соединения есть в конструкторе. Обратите внимание, что когда вы предоставляете его именно таким образом, ваше приложение работает нормально.

const IBus = imports.gi.IBus;
//get the ibus bus
var bus = new IBus.Bus();
if(bus.is_connected()){
    var factory = new IBus.Factory(bus.get_connection());
}

Теперь, что касается factory.add_engine(), определение здесь:

void                ibus_factory_add_engine             (IBusFactory *factory,
                                                         const gchar *engine_name,
                                                         GType engine_type);

Это означает, что вы должны будете указать engine_name и engine_type в качестве параметров функции. Это работает:

factory.add_engine('ibus-engine-name', some-engine-type);

См. http://ibus.googlecode.com/svn/docs/ibus/ch03.html для идей двигателя. Этот код не имеет ошибки, но он также не работает. Указывает правильный синтаксис вплоть до второго параметра add_engine().

#!/usr/bin/env gjs
const IBus = imports.gi.IBus;
//get the ibus bus
var bus = new IBus.Bus();
if(bus.is_connected()){
    var factory = new IBus.Factory(bus.get_connection());
    factory.add_engine("ibus-sarim", typeof(this));
}
...