|
From: Masahiro S. <s01...@sf...> - 2002-06-19 19:03:06
|
さかいです。 From: Masao Mutoh <mu...@hi...> Subject: Re: [ruby-gnome2-devel-ja] Re: GLib2読んでみました Date: Thu, 20 Jun 2002 01:56:00 +0900 > > - mark用の関数をtype markerとして使うのは無理があるので、gobj_markは消す。 > > - cinfo->freeが本当に要らないのかどうかは確信が持てないので保留。 > > - rbgobj_lookup_*のAPIを練り直すことで、cinfoがNULLにならないようにする。 > > > > って感じでどうでしょうか。 > > 良いですね。特に3つ目で、cinfoがNULLになる場合を想定するというのが変な > 感じがしてました。 ではそうしましょう。 > あ、なんかわかってきたような。 > rbgobj_object.cでこれを登録しているって言うことは、 > ひょっとして、全てのGValue(当然GObjectも含む)<->VALUEの変換を > rbgobj_gvalue_to_rvalue(),rbgobj_rvalue_to_gvalue()でやって > しまうというのが意図ですか? ・・・(1) その通りです。 # ただ、現在登録されている変換関数は圧倒的に不足していてますが。 > > 2.でrefしなくても実質的にはうまく行くんじゃないかとは思ってますが、 > > これは気持悪いし、あまり自信がないです。 > > 一方、2.でrefする事にすると、initialize側でunrefする必要があるはずで、 > > 面倒臭そう…… > > initialize側で毎回unrefするというのは実装上、バグが多発しそうな気がします。 > と考えると2.でrefしないというのも手ですよね。 そうですね。最初は気持悪いと思っていたのですが、 rbgobj_set_gobject()の用法を、initializeでのこの使い方に限定すれば、 refしないのがむしろ自然だという気が段々としてきました。 > > floating object の事とか見落としていたので、 > > リファレンスカウンタについては、ちゃんと考え直そうと思います。 > > うぅぅ。ついていけませんでした(-_-;)。 > #私もついていけるように勉強します。 http://developer.gnome.org/doc/API/2.0/gtk/gtkobject.html を見ると、以下のように書かれています。 The most interesting difference between GtkObject and GObject is the "floating" reference count. A GObject is created with a reference count of 1, owned by the creator of the GObject. (The owner of a reference is the code section that has the right to call g_object_unref() in order to remove that reference.) A GtkObject is created with a reference count of 1 also, but it isn't owned by anyone; calling g_object_unref() on the newly-created GtkObject is incorrect. Instead, the initial reference count of a GtkObject is "floating". The floating reference can be removed by anyone at any time, by calling gtk_object_sink(). gtk_object_sink() does nothing if an object is already sunk (has no floating reference). 多分互換性のためだと思うけど、気持悪いなぁ。 でも、何となく分かってきた気がする…… 単にgtkの方のset_gobject()を以下のように変更すれば、 最小限の変更で現在のコードと整合性が取れそう。 void set_gobject(obj, gtkobj) VALUE obj; GtkObject *gtkobj; { gtkobj = gtk_object_ref(gtkobj); gtk_object_sink(gtkobj); rbgobj_set_gobject(obj, G_OBJECT(gtkobj)); } > > > さらに、INT2FIXみたいなマクロを用意するとスッキリするかも。 > > > > > > GOBJ2GVAL() > > > RVAL2GVAL() > > > GOBJ2RVAL() > > > RVAL2GOBJ() > > もし、(1)の部分が正しいのであれば、上記は > > > > RVAL2GVAL() > > > GVAL2RVAL() > > の2つですみます? GValueを得ても、実際に具体的な操作をするには さらにそこからGObject*等を取り出さなくてはいけないので、 他の二つもあった方が便利で良いと思います。 ところで、この辺りのAPIを整理しようと gtkディレクトリとgnomeディレクトリのソースを眺めていて、 make_gobject()が思いの外使われていることに気が付きました。 rbgtk.cで使われているものを除いて、これらは全て get_value_from_gobject()で必要十分だと思うのですが、 make_gobject()が敢えて使われているのには何か理由があるのでしょうか? make_gobject()は、gtk/glib側のオブジェクトとRuby側のオブジェクトの 一対一対応関係を崩す危険があるので、APIとしては廃止したいのです。 -- さかい PS: glibのコーディングスタイルで、指摘された部分は修正しました。 他にも合っていない部分があったら直して下さいませ。 PPS: Ruby/Gtkって http://www.gtk.org/bindings.html には載ってないんですね…… |