「GNOMEフレームワーク」の版間の差分

削除された内容 追加された内容
gconfライブラリの解説を移動しました。
gnome-panelの設定例を追加しました。
315 行
AddToダイアログの動作はgconfの機能を使っています。具体的には、gconfの設定のうち、オブジェクトの種類や配置が記録されている部分にgconf_client_add_dirを使い、その値が変更されたときのコールバック関数を登録するために、gconf_client_notify_addを使っています。具体的には、これらの関数は既に見た関数panel_profile_load内及びそこから呼び出された関数内で用いられています。
 
関数panel_profile_loadは、途中でgconf_client_add_dir関数を呼び出しています。ここで指定するgconfの階層は、gnome-panelが終了するまで見続けることになるのですが、それは/apps/panel/generalです。この階層以下には、パネルの数やオブジェクトの位置などが記録されるため、オブジェクトの数を確認するためにはこの部分の変化を見ておく必要があります。
:実際の情報の例
 
ここで実際のgnome-panelでの例を示します。実際にgconfの設定を見るためにgconftoolを用います。gconftoolで対応するディレクトリ以下の設定項目を見るには,
更に、関数panel_profile_loadの中ではgconfの設定内のパネル、オブジェクト、アプレットそれぞれの設定に対して、panel_profile_load_listという関数が呼ばれています。関数panel_profile_load_listもpanel_profile_loadと同じファイル内で定義されているのですが、この関数は関数内でgconf_client_notify_addを呼び出しています。
$gconftool-2 [-R|--recursive-list] ディレクトリ名
とします。
 
gnome-panelの設定を見るためには、あらかじめgnome-panelをできるだけ単純に設定しておくと後が楽になります。ここでは、パネルは1つだけを残して全て取り去り、残ったパネル内のオブジェクトも全て取り去りました。この操作は対応するパネルやオブジェクトを右クリックし、対応するメニューを用いることで行えます。また、最後のパネルを消そうとすると、メニューが表示されなくなるため、全てのパネルを消し去ることはできません。パネルを右クリックした場合新たなパネルを追加するメニューが表示されるため、それを用いて新たにパネルを加え、設定を元に戻すことができます。
 
実際にこの設定にした後,上のコマンドでディレクトリ名として/apps/panel/generalを用いると
object_id_list = []
applet_id_list = []
toplevel_id_list = [panel_1]
などの出力が得られます。ここで、object_id_list、applet_id_listはそれぞれパネルに含まれるオブジェクト、アプレットを表します。ここでは、オブジェクトを1つも用いていないので、これらは空欄となります。一方toplevel_id_listはパネルがいくつあるかを示すリストです。ここではただ1つのパネルを用いているため項目は1つだけとなります。後にわかるのですが、panelが複数になった時にはこの部分にpanel_2, panel_3, ... などの項目が追加されます。ここで、1, 2, 3などの数字はidと呼ばれます。この用語はtoplevel_id_list等の名前にも用いられていますが、以降のソース内の関数名にも何度か用いられます。
 
これで、オブジェクト、アプレット、パネルの数がどのように記録されているかがわかりました。更にこれらの設定の詳細については/apps/panel以下の各ディレクトリに記録されています。例えば,/apps/panel/toplevelsにはパネルの設定が記録され、/apps/panel/appletsにはアプレットの設定が記録されます。例えば/apps/panel/toplevels/panel_1の設定を見ることもできますが、設定項目の数が多いのでこれらの詳細には触れません。比較的意味が取りやすいものでは、
size = 24
orientation = top
auto_hide = false
などがあります。これらは、それぞれパネルの幅(単位はピクセル)、パネルを画面中でどの位置に置くか、カーソルが置かれていないときパネルを隠すかどうかに対応します。これらはどれもパネルの右クリックメニューから扱うことができる"プロパティ"によって設定できる項目です。
 
次に、パネルの数とアプレットの数を増やして同じ操作をしてみます。ここではパネルを2枚にし、メインメニュー、時計、通知スペース、ウィンドウの一覧、デスクトップの表示などの各種オブジェクトを追加しました。ただし、パネルの位置はそれぞれ上と下とし、オブジェクトのうち最初の3つは上のパネルに加え、後の2つを下のパネルに加えました。この場合/apps/panel/generalでの出力は
object_id_list = [object_1]
applet_id_list = [applet_0,applet_1,applet_2,applet_3]
toplevel_id_list = [panel_1,panel_2]
のようになります。ここで上では5つのオブジェクトを加えたのに、設定ではオブジェクトが1つでアプレットが4つとなっています。実際にはアプレットもオブジェクトの一種なのですが、アプレットは他のオブジェクトと比べてかなり動作が異なるので、アプレットは別に扱われます。
 
具体的にはアプレットはソース内ではOBJECT_BONOBOなどと呼ばれます。ここで、BONOBOはアプレットを扱う技術の名前なのですが、この技術は単純にはプロセス間通信を用いた技術です。実は上の時計などのアプレットの本体は、gnome-panelのプロセスとは別のプロセスとして存在します。例えば,時計が動いているgnome-panelが存在する時には,常にclock-appletというプログラムが動いています。具体的には、対応するpsコマンドの出力には、
3855 ? S 0:00 /usr/libexec/notification-area-applet --oaf-activate-
3859 ? S 0:00 /usr/libexec/clock-applet --oaf-activate-iid=OAFIID:G
3874 ? S 0:00 /usr/libexec/wnck-applet --oaf-activate-iid=OAFIID:GN
などの出力が含まれます。ここで注目してほしいのは、中間の/usr/libexec/以下の各項目です。これらは上から順に通知スペース(notification-area)、時計(clock), ウィンドウの一覧に対応するプロセスです。BONOBOのライブラリであるlibbonoboについてはここでは深くは扱いません。[[w:en:bonobo (computing)]]、[http://www.gnome.gr.jp/docs/inside_bonobo/index.html]などを参照してください。
 
ここでは更に、/apps/panel/objectsやa/apps/panel/appletsの中身も見てみます。上で導入したオブジェクトの中でメインメニューはオブジェクト(アプレットでない)なので、/apps/panel/objects内に記述があるはずです。実際にこの項目を見ると、
/apps/panel/objects/object_1:
toplevel_id = panel_1
object_type = menu-bar
position = 79
などの項目が与えられます。この中で、object_1はメインメニューに対応するオブジェクトのはずですが、menu-barの名前が3行目にあるので、確かにこのオブジェクトがメインメニューに対応することがわかります。他にpositionはメニューの位置を表し、toplevel_idはこのオブジェクトがどのパネルに含まれるかを表します。panel_1は上側のパネルなのでこれで正しいわけです。他にlockedという項目がありましたがこの項目はおそらくそのオブジェクトが"ロック"されているかを表します。"ロック"はオブジェクトの移動を禁止する機能で、右クリックメニューから選ぶことができます。
 
更にアプレットについては次のような項目が存在します。
/apps/panel/applets/applet_0:
toplevel_id = panel_1
bonobo_iid = OAFIID:GNOME_NotificationAreaApplet
object_type = bonobo-applet
position = 606
ここで、object_typeはbonobo-appletとなっていますが、この項目はアプレット全般に対して用いられます。また、toplevel_idとpositionについては既に扱いました。最後にbonobo_iidですが、これはBONOBOの機構内でどのプロセスからの入力を扱うかを定める1つの文字列です。ここではNotificationAreaの文字があるので、このアプレットが"通知スペース"に対応することがわかります。
<!--
他のアプレットについても同様の設定がありますが、applet_idとbonobo_iidだけを書くと、
-->
 
ここまででgnome-panelの設定に関する実例を見てきました。これらの設定の変を扱うために、関数panel_profile_loadの中ではgconfの設定内のパネル、オブジェクト、アプレットそれぞれの設定に対して、panel_profile_load_listという関数が呼ばれています。関数panel_profile_load_listもpanel_profile_loadと同じファイル内で定義されているのですが、この関数は関数内でgconf_client_notify_addを呼び出しています。
 
gconf_client_notify_addの引数は、パネルの設定に対してこの関数が呼ばれた場合とオブジェクトやアプレットに対して呼ばれた場合で変化します。例えば、オブジェクトの設定を読んだ場合には関数panel_profile_object_id_list_notifyが引数として与えられます。この関数はどのオブジェクトが消えたり追加されたりしたのかを把握し、オブジェクトに対応するウィジェットを追加したり取り除くという作業を行う関数です。実際に関数panel_profile_object_id_list_notify内ではpanel_profile_load_added_idsとpanel_profile_delete_removed_idsの2つの関数が呼ばれていますが、これらの関数は名前の通りの動作をし、付け加えられた(added)オブジェクトを読み出したり(load)、取り除かれた(removed)オブジェクトを解放したり(delete)します。