GObjectIntrospection允许在任何高级语言中使用C对象。 https://live.gnome.org/GObjectIntrospection
IBus是linux的输入法框架。 code.google.com/p/ibus
使用GObjectIntrospection / javascript时遇到了一些麻烦。我试过了 创建一个ibus引擎。相同的代码适用于vala,python。但在 javascript seg fault。 我正在使用opensuse 12.1 gnome3。 “ibus-devel”包提供了GObjectIntrospection所需的/usr/share/gir-1.0/IBus-1.0.gir。
我要运行以下代码。
#!/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)
});
}
它在“新IBus.Factory”中的第6行崩溃。
终端输出,
(gjs:13353): GLib-GIO-CRITICAL **: g_dbus_connection_register_object:
assertion `object_path != NULL && g_variant_is_object_path
(object_path)' failed
Segmentation fault
我无法弄清问题在哪里。我尝试了vala测试代码 随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中尝试的相同。 也在python中,
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())
这似乎也很好,没有seg故障。但是在javascript中它每次都失败了。 任何的想法 ?我正在敲打这几天没有任何用处:(
答案 0 :(得分:0)
在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));
}