さかい::進捗報告::2003-05-08
進捗報告 (2003-05-08)
慶應義塾大学 総合政策学部 3年
酒井 政裕 <sakai at tom.sfc.keio.ac.jp>
進捗報告 (2003-05-08)
- What is GNOME?
- GNOME2のCygwinへの移植
- ActiveScript
What is GNOME?
- GNU Network Object Model Environment
- 統合デスクトップ環境
- gtk+を使ったGUI
- CORBAに基づいたコンポーネント技術
gtk+を使ったGUI
gtk+
- <URL:http://www.gtk.org/>
- 元々Gimpのために作られたGUIツールキット
- C言語で書かれている
- 多くの言語向けのバインディングが存在
CORBAに基づいたコンポーネント技術
- ORBit2
- Bonobo Activation
- Bonobo
すること
- GNOME2のCygwin への移植
- WindowsでIActiveScript周りに相当するものを実装
(1) Cygwinへの移植
基本的な作業は既にある程度終わっている。 (Nautilusも動く!!)
移植作業
- configure.inでAC_LIBTOOL_WIN32_DLLを呼び出す
- libtoolのオプションに-no-undefinedを追加
- Cygwin固有の変更
- その他
AC_LIBTOOL_WIN32_DLL
DLLを作りたい場合は、AC_PROG_LIBTOOL/AM_PROG_LIBTOOLを呼び出す前に呼び出すことになっている。
-no-undefinedと両方指定しなくてはいけないのは冗長に思える。
-no-undefined
このオプションを指定すると、libtoolはすべてのシンボルが*.loファイルまたは-lで指定されるライブラリで定義されているとして振舞う。
ELFの*.so(shared object)ではこのような制約はないが、 Win32のPE-COFFのDLLは実行ファイルと同様に、 リンク時にすべてのシンボルが解決される必要がある。
-no-undefined (その2)
libtoolが自動的に検出してくれればこんなオプションは不要なのに……
<lxo> ideally libtool should go ahead and try to create a shared library on such systems, and fall back to a static library if the shared linking fails, but I'm not sure all such systems will actually give an error status, and not just create a broken shared library
Cygwin固有の変更
例: NTSec(NT Security)等を使用する設定になっていないと、UNIXのようなパーミッションを持てないので、パーミッションをチェックするようなコードが問題になる。
対処法:
- そのようなコードをCygwinでは無効化する
- NTSec等を利用できるか調べて、利用できるときだけチェックする
後者のコードは本家に取り込んでもらう際に説明するのが面倒なので、 とりあえず前者の方針で。
パッチのStatus (その1)
- 取り込まれた
- libglade, GtkGLArea, librsvg, linc, libIDL, libwnck, startup-notification, metacity, ORBit2, bonobo-activation, libbonobo, gnome-vfs, libbonoboui, libgnome, libgnomeui, libgnomeprint, libgnomeprintui, eel, gal
- 部分的に取り込まれた
- GConf, Nautilus
パッチのStatus (その2)
- 交渉中(?)
- gnome-utils
- 送ったけどまだ反応がない (T_T)
- audiofile, esound, gnome-themes, gnome-desktop, gnome-panel, gnome-session
パッチのStatus (その3)
- 残り
- glib, atk, fontconfig, pango, gtk+, gtkmm, gtk-engines, gtk-thinice-engine, gail, libgnome, libsoup, at-spi, control-center, gtkhtml
今後の予定
既にだいぶパッチを取り込んでもらったので、 残りのパッチやまだパッチを作っていないパッケージについて作業する。
(2) ActiveScript
目標その2:
WindowsでのActiveScriptingに相当するものをGNOME2に実装する。
What is ActiveScript?
- Windows Script Interfaces
- スクリプティングのための汎用インターフェース
- COMベース
対応関係
COM | Bonobo/CORBA --------------------------------- IUnknown | Bonobo::Unknown IDispatch | (存在しない) IActiveScript | (存在しない)
IUnknown / Bonobo::Unknown
- リファレンスカウンタの管理
- 他のインターフェースのクエリー
IUnknown
interface IUnknown { typedef [unique] IUnknown *LPUNKNOWN; HRESULT QueryInterface( [in] REFIID riid, [out, iid_id(riid)] void* ppvObject); ULONG AddRef(); ULONG Release(); };
Bonobo:::Unknown
module Bonobo { interface Unknown { void ref (); void unref (); Unknown queryInterface (in string repoid); }; };
IDispatch
汎用のインターフェース。スクリプト言語からは通常このインターフェースを使って、オブジェクトを操作する。
interface IDispatch : IUnknown { ... HRESULT GetIDsOfNames( [in] REFIID riid, [in, size_is(cNames)] LPOLESTR *rgszNames, [in] UINT cNames, [in] LCID lcid, [out, size_is(cNames)] DISPID *rgDispId); HRESULT Invoke( [in] DISPID dispIdMember, [in] REFIID riid, [in] LCID lcid, [in] WORD wFlags, [in, out] DISPPARAMS *pDispParams, [out] VARIANT *pVarResult, [out] EXCEPINFO *pExcepInfo, [out] UINT *puArgErr); ... }
IActiveScriptの基本的な使い方
- IActiveScriptSiteを実装したオブジェクトを用意しておく
- CoCreateInstanceでスクリプトエンジンを得る
- IActiveScript::SetScriptSiteで、IActiveScriptSiteを実装したオブジェクトを、スクリプトエンジンにセット
- トップレベルオブジェクトの名前をIActiveScript::AddNamedItemで追加。ここで追加した名前が参照されると、実行時にIActiveScriptSite::GetItemInfoが呼ばれる。
- スクリプトのロード
- IPersist*
- IActiveScriptParse
今後の予定
Bonoboを介してRubyを使うコードを実験的に書いてみる予定。
参考文献
- Rubyを256倍使うための本 邪道編
Keyword(s):
References: