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

削除された内容 追加された内容
Path
== デスクトップ環境とは == windowsでは、マイクロソフトというひとつの会社が、そのOS用のGUI(グラフィカル ユーザー インターフェース)も作っており、ユーザーの入手したOSには、インス
1 行
<small>{{Pathnav|メインページ|工学|情報技術|プログラミング}}</small>
----
==GNOME デスクトップ環境とは ==
windowsでは、マイクロソフトというひとつの会社が、そのOS用のGUI(グラフィカル ユーザー インターフェース)も作っており、ユーザーの入手したOSには、インストール時から既にGUIが最初から付属している。なので、windowsの利用では、わざわざGUIとOSカーネルなどとの組み合わせを、ユーザーが自分で入れ替えたりすることは出来無いのが普通であるし、そのようん事を意識する必要もない。
 
しかし、UnixやLinuxは、必ずしも1社で統一的に生産しているわけではない。そのため、いくつもの団体や開発者集団が、GUI環境を、開発している。
[[w:GNOME]] (GNU Network Object Model Environment) は[[w:GPL]]で提供されるGUIデスクトップ環境で、多くのPC-Unix上で動作します。これはUnix上でより現代的な操作方法を提供するために用いられます。
 
そのため、Linux用のGUI環境は何十種類もあり、Linux等の利用者は、自分で、どの開発者集団のつくったGUIを使用するかを、自由に選ぶこともできる。
 
要するに、まるでアプリケーションを入れ替えたりするくらいの気軽な感覚で、LinuxなどではGUIを入れ替えることが出来る。
 
誤解のないように言うが、けっして、GUIの設定を自分好みにカスタマイズする(例えばタスクバーのサイズを変更するとか)、という意味ではなく、そもそもGUIアプリケーション自体を、他の開発者集団のつくった、まったく別のプログラムで書かれた別種のGUIに入れ替える事が、Linuxなどでは、できるのである。
 
このため、GUIそのものを提供するアプリケーションのことを、ひとつの単独のアプリケーションとして認識する必要があり、Linuxなどでは、このようなGUIそのものの提供をするアプリケーションのことを「デスクトップ環境」(desktop manager)という。
 
※ 詳しくは『[[w:デスクトップ環境]]』を参照せよ。
 
さまざまな開発者集団が、それぞれのデスクトップ環境を、発表している。
 
GNOMEは、そのようなデスクトップ環境のひとつ。
 
GNOMEのほかにも、KDE(ケーデーイー)など、まったく別のデスクトップ環境もある。
 
== GNOMEとは ==
[[w:GNOME]] (GNU Network Object Model Environment) (発音:グノーム)[[w:GPL]]ライセンスで提供されるGUIデスクトップ環境で、多くのPC-Linux上およびUnix上で動作します。これGNOMEUnix、Linux上でより現代、GUI的な直感的な操作方法を提供するために用いられます。
:[[画像:Ubuntu_9.04_Jaunty_Jackalope.png|200px]]
 
10 ⟶ 30行目:
-->
 
例としてプログラムの起動を行うことを考えてみます。[[Windows入門|Windows]]や[[w:Mac]]では、プログラムを起動する際に対応するアイコンを用いて操作を行うことが普通です。 一方、デスクトップ環境が動いていないUnixではプログラムを起動するためのアイコンは提供されません。なことにわい、アイコンが存在しなくとも対応する"シェル"(コマンド端末のこと)からプログラムの名称を指定すれば、対応するプログラムを起動することができます。これは、デスクトップ環境を起動した上で対応するアイコンを用いた操作を行うことと同じ操作に対応します。"シェル"の説明や実際の操作については[[UNIX/Linux入門]]を参照してください。
 
上の例から分かるように、コンピュータに慣れたものにとってはGUIデスクトップ環境はいくつかの場合を除いて無くてもよいものです。これはGUIで行うことができる操作は大抵の場合、GUI無しでも行うことができるからです。一方、GUIを用いた操作はより直観的であり、初心のうちはGUIを用いた操作の方が安心感があるでしょう
 
GNOMEは、初心者にも簡単にコンピュータを操作できる手法を提供します。このためには、熟練した利用者が"シェル"を用いて行い得ることを、直観的なGUIとともに利用者に提供する方法を作成する必要があります。控え目にいってもこれは高度なプログラムです。例えば、GNOMEが提供するソースコードはライブラリからアプリケーションまで多岐に渡っておりそれらは更に[[w:GTK+]]や[[w:GStreamer]]などの他のライブラリに依存しています。
 
GPLライセンスプログラムの利用者に対してソースコードを公開するよう義務づけています。そのため、GNOMEの利用者はGNOMEのシステムがどのように動いているかを知ることができます。これらの動作には様々な工夫がなされており、その中にはプログラミングが得意なものにとっても非常に興味のある内容が含まれています。
 
ここでは、GNOMEがどのように動作しているかを様々な角度から見て行きます。具体的にはGNOMEが起動するプロセスを確認し、それらがどのような動作とGUIを提供しているかをソースコードを通して見ていきます。特に、"gnome-panel"と"nautilus"及び"metacity"の動作を確認します。
24 ⟶ 44行目:
対応する"シェル"の機能は実行可能なアプリケーションを指定されたときに、そのアプリケーションを起動する機能です。熟練した利用者はよく使うアプリケーションの名称を把握しており、それを用いてアプリケーションを起動することができます。このため、ある程度アプリケーションの名称を把握していればランチャーは不要になります。 もちろん、あって損になるものではないでしょう。
 
次に、nautilusは、いわゆるファイルブラウザです。nautilusは、上の図では全てのウィンドウの後方にある"壁紙"を提供するアプリケーションです。実際にはそれだけではなく、基本的なファイル操作のための機能も提供します。例えば、ファイルのコピーや移動、消去などの操作をGUIで提供します。また、いわゆる"ゴミ箱"の機能も提供します。
 
ファイル操作は[[w:OS]]の機能として基本的であり、対応する操作は"シェル"の基本機能でもあります。例えば、ファイルのコピーはUnixでいうcpコマンドを用いてなされますが、このコマンドは読みだし先のファイルと書き出し先のファイルを開いてファイルディスクリプタを与え、そのファイルから読み出した内容をコピー先のファイルへ書き出すことで行われています([[w:coreutils]]-x.x/src/cp.cを参照)。nautilusはこのような操作に加えてマウスの動作やドラッグアンドドロップなどの操作も把握している必要があります。
40 ⟶ 60行目:
ここからの議論ではある程度の[[C言語]]の知識を前提とします。また、Unixの動作や[[高等学校情報]]の内容も助けになります。これらの事柄を考えると、ここで扱う内容は大学2年以降で扱うべき内容といえそうです。<!--また、ここからの内容では一部でLinuxに関する知識を仮定します。-->
 
=== gnome-panel ===
 
==== gnome-panelの起動 ====
まず、gnome-panelを起動する方法について述べます。[[w:Linux]]などのPC-Unix上でGNOMEデスクトップが動いているときには、gnome-panelは常に起動しています。この状態でシステムのプロセスを表示すると、"gnome-panel"という名称のプロセスが動いているはずです。プロセスを表示するには例えば
$ps ax
65 ⟶ 85行目:
などを用いてください。killallは指定された名前のプロセスを停止するコマンドです。もしくは、killコマンドを用いることでもプロセスの停止を行うことができます。kill, killallの使い分けについては、[[UNIX/Linux入門]]を参照してください。
 
==== gnome-panelの動作 ====
 
ここからはgnome-panelの個々の機能に付いてソースコードを見ながら説明します。このためにはある程度のGUIプログラミングの知識が必要です。gnome-panelのソースコードはGNOMEのサイト[http://www.gnome.org]からGPLライセンスで提供されています。筆者が使った版はgnome-panel-2.14.3です。ここで、これ以降./の記述が出て来た場合には、gnome-panel-2.14.3/の意味を表しています。また、同じサイトからはGNOMEデスクトップの使い方に関する文書も提供されています。
71 ⟶ 91行目:
また、gnome-panelのGUIに用いられているライブラリであるgtk+はCで書かれたライブラリであると同時に[[w:オブジェクト指向]]を用いたライブラリです。以降ではオブジェクト指向の用語としてクラス、インスタンス、メソッド、メンバなどの語句を使いますが、異なった言語では同じ意味の内容に異なった名前をあてていることがあるので注意してください。例えば、オブジェクト指向における"オブジェクト"は大抵インスタンスのことを指します。
 
===== 各種"オブジェクト"の配置について =====
 
gnome-panelは基本的にはランチャーであり、各アプリケーションの起動を行います。ここで、ランチャーを使うためには、そのランチャーに、どのようなアプリケーションをどのコマンドで起動するかなどの情報を与える必要があります。GNOMEではこの目的で[[w:en:gconf]]と呼ばれるライブラリを使います。gconfはGNOMEアプリケーションの様々な設定を記録するためのライブラリです。<!-- また、gconfdと呼ばれるサーバを用いて、設定を動的にアプリケーションに伝えることができます。-->
109 ⟶ 129行目:
ここまでで、gnome-panel内で"オブジェクト"の配置はGtkFixedクラスの機能によってなされていることが分かりました。他に興味ある点としては、個々の"オブジェクト"がどのように定義されているかや、オブジェクトを導入するための操作などがあります。例えば、"オブジェクト"が配置できる部分を右クリックすると、メニューが開き、追加するオブジェクトを選ぶことができます。この操作はGtkMenuなどで提供される機能ですが、実際にソースコード中でどのようにGtkMenuが用いられているかも調べることができます。
 
===== "メニューバー"オブジェクトについて =====
 
ここからは、個々のオブジェクトについて詳しく調べていきます。gnome-panelの多くの設定で使用されているオブジェクトに、"メニューバー"があります。
148 ⟶ 168行目:
上の例はmmmという名のメニューを作成し、それをクリックしたときlllと書かれたメニューを表示し、更にその中のlllと書かれた部分をクリックすることで関数menu_cbを実行するというプログラムです。メニューの項目は増やせるので、コールバック関数をいろいろなアプリケーションの起動を行う関数とすることで、ランチャーの役目を果たすアプリケーションとすることができます。
 
===== ポップアップメニュー =====
 
gnome-panelではパネルの各所を右クリックすることでポップアップメニューを得ることができます。この操作はGUIを使った操作としてはよく見られるもので、どのように実現されるかが気になる所です。実は、この操作はGTK+のクラスであるGtkMenuの操作として典型的なものです。ここではGtkMenuのポップアップの例を見るとともに、実際にこの操作がどのようにgnome-panel中で用いられているかを見て行きます。
194 ⟶ 214行目:
 
 
===== アプリケーションの起動 =====
 
アプリケーションの起動を行うためには、 コールバック関数として定義された関数(上の例ではmenu_cbと与えられている)の中で、新たな"プロセス"を作る必要があります。"プロセス"はOSが複数のアプリケーションを同時に動かすときの単位で、それを作る方法はOSによって異なっています。Unix系のOSではプロセスを作る関数は大抵[[w:fork]]と呼ばれます。forkはプロセスを作成し、新たに作成されたプロセスのIDを返します。また、作成されたプロセスで実際にあるアプリケーションを起動する関数として、Unix系のOSではexec系の関数が与えられます。execは与えられる引数によっていくつかの似た関数が提供されます。
205 ⟶ 225行目:
を使う方法を紹介しました。ここで、menuitemはここで内容を与えるメニュー項目であり、menu_cbは実際にこのメニューの項目がクリックされたときに実行させたい関数です。指定したアプリケーションを起動して、新たなプロセスを実行するためには、この関数はforkやexecを用いる関数である必要があります。
 
* 注意
g_signal_connectは[[w:en:glib]]で定義された関数で、"シグナル"が定義されたGObjectクラス及びそれを継承したクラスに対して、コールバック関数を与える関数です。ここで、"シグナル"はおおよそコールバック関数と同じ意味で、Unixでいう"シグナル"(他のプロセスに影響を与える機構)とは無関係です。<!-- 例えば、"シグナル"を発する関数と受け取る関数は同じプロセス内にあることが普通です。 -->
 
224 ⟶ 244行目:
ここまでで一応gnome-panelのメニュー項目がクリックされてから、実際に新たなプロセスが作成されるまでの道のりを見て来ました。もちろんただプロセスを作ることが目的なら、gnome-panel内で直接forkを呼ぶことも可能です。敢えてライブラリを使うのは、例えば[[w:Windows]]を使うときにはこの方法が使えないことがあげられます。これは、Windows上でプロセスを作るときにはforkではなく別の[[w:Windows API]]を使う必要があるからです。実際glibのgspawn.cがあるディレクトリ内には、gspawn-win32.cというWindows向けの関数も定義されており、glibライブラリをクロスプラットフォームライブラリにするよう試みているようです。
 
==== gconfを用いた設定 ====
 
ここまでで一応ランチャーとしての役目を果たすための機能を見て来ました。メニューを表示し、そのメニュー項目と対応するアプリケーションを起動することは、ランチャーの機能としては基本的です。ただし、ランチャーが扱えるアプリケーションは、プログラムのふるまいを外部から制御する機構がないのなら、ランチャーを作った人間がプログラム内に書き込んだアプリケーションに限られます。これでは新たなアプリケーションが加わった時にランチャーの振舞いを拡張することができない<!-- 、もしくはアプリケーションを追加するためにgnome-panelを[[w:コンパイル]]し直す必要がある-->ことになり、不便です。
238 ⟶ 258行目:
GNOMEでは、設定を扱うために[[w:en:gconf]]と呼ばれるライブラリを利用します。これは、設定を扱うための1つのサーバ(gconfd)を導入し、そのサーバに、サーバ上の設定を参照しているgconfクライアントを記憶させておき、設定が変更された際に、そのことをgconfクライアントに伝える機構です。簡単な例では、gconfdが保持している設定は利用者のホームディレクトリ~の~/.gconf/以下に記録されます。
 
* 注意
Unixの"シェル"では、利用者のホームディレクトリを~の記号で表します。設定によるのですが、このディレクトリは大抵/home/user_name/以下におかれます。ただし、user_nameはそのコンピュータに登録されている利用者の名前です。PC-Unixでは大抵利用者はそのパソコンの所有者1人だけなので、/home以下に直接設定ファイルをおけばよいようですが、多くの利用者が異なった設定でgconfを使う場面を想定してこのような作りになっています。
 
274 ⟶ 294行目:
まず、gconfを用いる上で重要となる関数として、gconf_client_add_dir, gconf_client_notify_add, gconf_client_set_...があります。これらの関数はそれぞれGConf-x.x.x内で定義された関数です。gconftoolもこれらの関数の機能を使っています。
 
* 注意
実際にはgconftool.cでは、gconf_client_...ではなく、gconf_engine_...の名称を持つ関数を用いています。gconf_engine_...の関数はgconf_client_...と対応する関数が存在し、gconfライブラリの内部でgconf_client_...を作成するために用いられています。例えば、gconf_client_set_listの中では、gconf_engine_set_listが呼ばれています。(GConf-x.x.x/gconf/gconf-client.cを参照)
 
286 ⟶ 306行目:
:使用例
 
* 注意
GConf-x.x.x以下のソースを追うことで、gconf_client_set_...以下の関数に対してgconfdサーバがクライアントに連絡を行う機構を、実際に見ることができます。この機構はgconf_client_add_dirとgconf_client_notify_addの内部での振舞いがかなり異なることから、複雑になっています。具体的には、gconf_client_add_dirは階層の名前を実際にgconfdに伝達するのに対して、gconf_client_notify_addはコールバック関数をクライアント側にとどめるからなのですが、これ以上はこのことに深入りはしません。GConfのバージョンとしては、GConf-2.14.0を用いました。
 
294 ⟶ 314行目:
-->
 
===== gnome-panelでのgconf =====
 
ここまででgconfの基本的な使い方を見て来ました。gnome-panelでもパネル内のどの位置にどのオブジェクトが配置されているかなどをを記録するために、gconfを用いています。ここではまず、gnome-panelがどのようにgconfdから設定を受け取り、設定への変更を取得しているかを見て行きます。
 
===== gnome-panelの起動 =====
ここではgnome-panelがどのように起動するかを見て行きます。通常のアプリケーションと同様、gnome-panelは起動時に設定を参照してどこにオブジェクトを配置するかなどを決めます。この設定は設定ファイルではなく、gconfを用いて行われるのですが、ここでは実際にアプリケーションの起動時にどのようにgconfが用いられているかを見て行きます。
 
312 ⟶ 332行目:
具体的には追加されたオブジェクトが"メニューバー"だった場合にはpanel_menu_bar_load_from_gconfを呼んでいます。この関数は設定に従って対応する"メニューバー"オブジェクトを作成する関数です。この関数の詳細を追うこともできますが、一応gconfの設定を読んだ後に、設定に応じて各種のオブジェクトを与える過程が得られたので、アプリケーションの起動に限った話はここまでとします。
 
===== 各種設定の変更 =====
 
ここまでで、gnome-panelが起動するときに、gconfが与える設定に従って、各種ウィジェットを見分ける方法を見て来ました。実際にはgnome-panelはgnome-panelが動作している最中に設定が変更されても、それに対応してウィジェットを作成する機構を持っています。これはgconfの機能を活用した機構です。
418 ⟶ 438行目:
ここまででgconfの設定をアプリケーションの動作中に反映するための機構を見て来ました。これらはアプリケーションの起動時にしか変更を反映できない方法と比べて優れた方法です。同様の方法は他のGNOMEアプリケーションでも用いられており、gconfがGNOMEのライブラリとして重要であることを示しています。
 
==== アプレットの動作に必要なライブラリ ====
 
既に"アプレット"がlibbonoboを通じて実現されていることを述べました。ここで、libbonoboはプロセス間通信を行うための一般的な技術です。これは、アプレットを扱うプロセスとgnome-panelのプロセスの間の通信を行うために用いられます。
424 ⟶ 444行目:
アプレットはlibbonoboに加えてlibbonobouiライブラリに含まれる技術も用いています。libbonobouiライブラリはlibbonoboを用いてあるプロセスで制御されるGTKウィジェットを他のプロセスのウィジェットに埋め込む一般的なライブラリです。
 
===== GtkPlug, GtkSocket =====
 
まず最初に、GTKを用いたウィジェットの埋め込みを扱います。GTKの枠組みでウィジェットの埋め込みを行うには、GtkPlug, GtkSocketのウィジェットを使います。GtkSocketは、ウィジェットを埋め込まれる側のプロセスが作成するウィジェットで、GtkPlugが実際に埋め込まれるウィジェットに対応します。
445 ⟶ 465行目:
一方gnome-panelでは、埋め込むウィジェットを提供する機構としてPanelAppletクラスが提供されています。(./libpanel-applet/panel-applet.[ch]を参照)このクラスはBonoboControlへのポインタを所持します。各アプレットはこのクラスを継承し、PanelAppletFrameと相互作用します。
 
==== 各種アプレットの動作 ====
 
既にgnome-panelの動作は"アプレット"によって拡張されることを見てきました。ここでアプレットはBonoboと呼ばれる技術を用いて作られており、これらはgnome-panelとは異なったプロセス内で動作しています。この時、なぜ単純にgnome-panelの新たなオブジェクトとして各機能を作成しなかったのかが疑問に思われます。
453 ⟶ 473行目:
これに加えて既に登場した時計、通知スペースなどのアプレットがgnome-panel内に含まれています。(それぞれ./applets/clock, ./applets/notification_area内のファイル)ここでは、Bonoboの詳細には触れずに、各種"アプレット"の動作を見ていきます。これはBonoboを使う場合でもアプレット自体は通常のGTK+アプリケーションと同じように書くことができるからです。このことの詳細については[http://developer.gnome.org/doc/API/2.0/libbonobo/index.html]などを参照してください。
 
===== gnome-panel内のアプレット =====
====== 時計アプレット ======
 
時計アプレットはその名の通り[[w:時計]]を表示するアプレットです。このアプレットはgnome-panelの./applets/clock以下に含まれています。時計アプレットの仕事はおおよそGTK+を使って時計を作成することです。簡単な時計の作り方については例えば[[Xプログラミング]]を参照してください。
469 ⟶ 489行目:
ロケールの変更による時刻のフォーマットの変更は、gettextライブラリによって行われます。gettextの詳細は[[OSS開発ツール]]を参照してください。実際のpoディレクトリは./po/以下で与えられます。この中では各国語でのフォーマットが文字列の形で定義されています。
 
====== wnckアプレット ======
 
wnckアプレット(wnck-applet)は、"libwnck"を用いるアプレット群で、GNOMEデスクトップのウィンドウの管理を行います。このアプレット群は複数のアプレットを含んでおり、これらはそれぞれ"デスクトップの表示"(ShowDesktop), "ウィンドウ一覧"(WindowList), "ウィンドウセレクタ"(WindowMenu), "ワークスペース切替器"(WorkspaceSwitcher)が含まれます。既にアプレットの例でwnck-appletが起動されている場面を見ました。これらはここで与えられる複数のアプレットに対応するプロセスです。
482 ⟶ 502行目:
 
 
====== 通知スペース(NotificationArea)アプレット ======
 
{{スタブ}}
 
===== gnome-applets内のアプレット =====
 
gnome-appletsにもいくつかのアプレットが含まれています。ここでは比較的動作がわかりやすいアプレットを選んで紹介します。具体的には"CPU周波数"(cpufreq)アプレットと"音量調節"(mixer)アプレットを扱います。