2012-01-14 6 views
0

GObjectIntrospectionでは、高水準言語でCオブジェクトを使用できます。 https://live.gnome.org/GObjectIntrospection(GObjectIntrospection)javascriptを使用してibusエンジンを作成しようとするとセグメンテーションエラーが発生する

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) 
    }); 
} 

「new 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()); 

ファクトリーを作成するためのコードは、私は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()) 

また、これは罰金、無ワンセグ障害を動作するようです。しかし、javascriptでは毎回失敗します。 私は無駄なしで数日間、この上で叩いてる:(IBusFactoryで

+0

cのIBus.Factoryコンストラクタは、https:// githubにあります。そこCOM/IBUS/IBUS/BLOB /マスター/ SRC/ibusfactory.cライン352 'IBusEngine *物体= g_object_new(IBUS_TYPE_FACTORY、 "オブジェクト・パス"、IBUS_PATH_FACTORY、 "接続"、接続、 NULL);' とhttps://github.com/ibus/ibus/blob/master/src/ibusshare.hライン81 'の#define IBUS_PATH_FACTORY "/ ORG/freedesktop/Iバス/ファクトリー"' だから方法はありません報告アサーションが失敗する可能性があります。なぜ失敗したのか分かりません! – Sarim

答えて

0

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

ドキュメントは"Construct Only"言うそれは今の解釈の対象だが、それはそれはおそらくあるように私には意味します。 privateまたはprotectedクラスメンバコンストラクタは次のように定義されて、言った:。。その接続変数はコンストラクタで、あります

​​

お知らせあなたはまさにそのようにそれを提供する場合、あなたのアプリが正常に動作

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_nameengine_typeを提供する必要がありますことを意味します。これは動作します:

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

エンジンのアイデアについてはhttp://ibus.googlecode.com/svn/docs/ibus/ch03.htmlを参照してください。このコードはsegfaultではなく、動作しません。これは、add_engine()の2番目のパラメータまで正しい構文を示します。

#!/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)); 
} 
+0

IBus * .girはubuntuリポジトリに存在しません。ソースからibusをコンパイルする必要があり、コンパイル時にgirが生成されます。あるいは、opensuseから私のものを使用しようとすることもできます。私は '/ usr/lib/girepository-1.0/IBus-1.0.typelib'と'/usr/share/gir-1.0/IBus-1.0.gir'をここにアップロードしましたhttp://www.mediafire.com/?e41bmf3owb1ud – Sarim

+0

私問題がVM웨어の融合にあることが分かりました。私は自分のラップトップ(実際のopensuse)でコードを実行し、それは正常に実行されます。まず、私はvmware(guest opensuse)の中で私のMacを試していました。 ありがとうございます。 – Sarim

関連する問題