|
|
Motifを手に入れろ!!
|
世界で最も美しいGUI、"Motif"
HewlettPackard社のHP CXIとDigital Equipment(現HewlettPackard)社のDEC XUIが、
1988年のOSFによる標準化作業のベースとなりMotifが誕生しました。
今から14年前、この時世界で最も美しく機能的なGUIがこの世に生を授かったのです。
1988年、私は小学校2年生でした。
1988年、Macintoshは漢字Talk2.0が出てCD-ROMと256色グラフィックスに対応しました。
1988年、Windowsはヴァージョン2.0で移動出来ないタイリングウインドウを表示していました。
Motifは高額なライセンス料をOpenGroupに支払わねば使用できず、
一部のブルジョア階級と先端のXアプリケーション開発者だけが使用できる敷居の高い物でした。
しかし、時代は変わりました。
OpenMotifプロジェクトからLinuxやFreeBSD等OpenSourceなオペレーティングシステム上で利用可能なMotifが
無償でライセンスされる事になりました。
私は、ライカカメラ社と松下電器の業務提携発表と同等クラスの衝撃を受けました。
LestifというMotif互換ライブラリも存在したようですが、OpenMotifはOpenGroup公式"本物のMotif"です。
人種・性別・学歴・年齢問わず誰でもMotifを使ったアプリケーションを記述し、運用できるのです。
素晴らしい時代になったものです。
|
Hello Motif
"美しい薔薇にはトゲがある"という格言がありますが、
世界で最も美しいGUIのMotifにトゲはありません。
WindowsやMacintoshでプログラムを書いた事がある方はご存じだと思いますが、
GUIプログラミングはまさに地獄絵図です。
各種インタフェースの初期化やイベントハンドラの準備等、大変な量のコードを書かねばなりません。
ところが、Motifは違います。
非常にシンプルに記述することが出来るのです。
以下に最小限の機能を持たせたMotifアプリケーションのCソースを掲示します。
| 1 | #include <Xm/XmAll.h> |
| 2 | |
| 3 | static void Button_callback(); |
| 4 | |
| 5 | |
| 6 | static char *fallback_resource[] = { |
| 7 | "*fontList: *-fixed-medium-r-normal--16-*-*-*-*-*-*-*:", |
| 8 | "*title: Hello Motif", |
| 9 | "*label.labelString: 日本語も通ります", |
| 10 | "*button.labelString: ボタン", |
| 11 | NULL |
| 12 | }; |
| 13 | |
| 14 | int main(int argc,char *argv[] ) |
| 15 | { |
| 16 | XtAppContext app_context; |
| 17 | Widget toplevel, panel, control, label, text, button; |
| 18 | Arg al[20]; |
| 19 | int ac; |
| 20 | |
| 21 | |
| 22 | |
| 23 | XtSetLanguageProc( NULL, NULL, NULL); |
| 24 | |
| 25 | |
| 26 | ac = 0; |
| 27 | toplevel=XtAppInitialize( &app_context, "test", NULL, 0, |
| 28 | &argc, argv, fallback_resource , al, ac); |
| 29 | |
| 30 | ac = 0; |
| 31 | panel = XmCreateRowColumn( toplevel, "panel", al, ac); |
| 32 | XtManageChild(panel); |
| 33 | |
| 34 | ac = 0; |
| 35 | control = XmCreateRowColumn( panel, "control", al, ac); |
| 36 | XtManageChild(control); |
| 37 | |
| 38 | ac = 0; |
| 39 | label = XmCreateLabel( control, "label", al, ac); |
| 40 | XtManageChild(label); |
| 41 | |
| 42 | ac = 0; |
| 43 | text = XmCreateTextField( control, "text", al, ac); |
| 44 | XtManageChild(text); |
| 45 | |
| 46 | ac = 0; |
| 47 | button = XmCreatePushButton( panel,"button", al, ac); |
| 48 | XtManageChild(button); |
| 49 | |
| 50 | XtAddCallback( button, XmNactivateCallback, Button_callback, text); |
| 51 | |
| 52 | XtRealizeWidget(toplevel); |
| 53 | XtAppMainLoop(app_context); |
| 54 | return 0; |
| 55 | } |
| 56 | |
| 57 | |
| 58 | static void Button_callback( Widget w, XtPointer client_data, XtPointer call_data) |
| 59 | { |
| 60 | Widget text = (Widget) client_data; |
| 61 | char *str; |
| 62 | |
| 63 | str = XmTextFieldGetString(text); |
| 64 | printf("text=%s\n",str); |
| 65 | XtFree(str); |
| 66 | } |
実行結果は こちらです。
行数にして僅かに66行(空行含む)。
Windowsで同じ事をすると倍近くのコードを書かねばなりません。
MacintoshでCarbonやToolBoxを使った日にはさらに倍以上のコードを書くハメになります。
Motifの場合、関数や定数は全て先頭に"Xm"が付きます。
ReadFileやCreateWindow、Dispose等、名前の特等席を独占し尽くしているWindowsやMacintoshの
身勝手なライブラリ設計とはMotifは根本から違いますから格段にソースが解読しやすくなります。
見た目も美しく、ライブラリも美しい。
Motifは全てに於いて世界で最も美しいGUIなのです。
最近、Windowsでは.NET FrameWork、
MacintoshではCocoaFrameWorkといった次世代のライブラリが登場しているようです。
両者ともにオブジェクト指向に基づいた、かなり洗練されたコードが記述できますが、
前者はC#言語(C++でも記述可能)、後者はObjective-Cといった独特の言語を使う為、
過去のコード資産が生かせないといった欠点が有るように思えます。
|
|