2009年02月23日

xlibで日本語表示させてみたり

gtk2+を外部プログラムかヘルパーのライブラリーとして使うことで
ちょっとしたXwindow上の機能が使えることが分かったが
単純なリソースだけでもあまりにリソースを食うので
もう少し低レベルなxlibを調べてみた。
オブジェクト的なウィジェットという概念は無いがWindowの位置の制御や
テキストの描画、日本語も含めた入力という面では使えなくもないが
他のライブラリーとの連系方法がまだ飲み込めていない。

どうもX11R5からX11R6の流れで仕様が変わったらしく
webにある資料は微妙に違っている様なので若干の注意はいる様だ。

なんとなくコードがまだ最低限のものでも何か落としていないので
大体の流れだけ書くことにした。
一応動作確認としては
windowを作って文字を描画、クリックして閉じる、キーを叩くと移動
とか
uim-anthyで日本語入力みたいなことをしてみたが変換後の表示位置の計算がうまくできなかった。

プログラミングの流れとしては子windowがない場合
インクルードすべき最低のものは
#include

#include
これは日本語フォントを表示するために必要

変数は

Display *d;
Window w;
XEvent e;
XFontSet fs;
GC gc;
 int s;

の最低限必要となる。
日本語入力が欲しい場合は

XIM im;
XIC ic;
unsigned long fevent;
も必要

GCはグラフィック・コンテキストの略でWinのデバイスコンテキストのようなものだろう。
sはスクリーン用変数になる。

日本語を扱う場合ja_JP.UTF-8前提として
setlocale   でロケールをセット
XCreateFontSet でフォンとの作成

XOpenDisplay でXサーバーとの接続
DefaultScreen でスクリーン変数を取得

XCreateSimpleWindowでWindowの生成
XCreateGC でグラフィックコンテキストの生成

日本語入力を使うなら
XOpenIM でインプットメソッド imを取得
XCreateIC でインプットコンテキストを取得する。
XGetICValues でインプットメソッドを必要とするイベントを問い合わせる。

次に
XSelectInput でメッセージループで拾うものを設定し
XMapWindow で可視化
XMoveWindow で任意の場所に動かすことができ
XLowerWindow で最後面
XRaiseWindow で最前面に移動できる。起動時はたいてい最前面の様だ。

ここからイベントループに入り
XNextEvent でイベント取得
event.type の内容で処理を行う

典型的なものとしては
KeyPress,ButtonPress,FocusIn,Expose(再描画)などがある。

文字を描く関数はXmbDrawStringで他にそこそこの描画関数がある様だ。

いろいろ試したのだがXCreateICで指定が一通りしか通らずwindowの下側にIMEの枠が表示される。
ただしインプットボックスに関してはそんないくつも出すものではないので
gtkを素直に使った方が良いと感じた。
また日本語はどうしてもfixフォントしか表示ができなかった。
多分XmbDrawStringは速いのだろうが
freetypeなりcairoでグラフィックスとして描画する方が見た目はきれいだろう。

リソースはgtk2+の1/5から1/6程度のようなので
メッセージを表示してクリックして閉じるようなダイアログや
ちょっとした入力をするものはこれでもすみそうだ。
また起動も速いだろう。

windowsのデバイスコンテキストやwindowハンドルはライブラリーが違っても
中にメンバーとして入っているのだが
SDL、gtk、xlibはおのおのイベントループにしろwindow変数にしろ
混ぜることは不可能か困難の様だ。

となると無理にひとつのプログラムにせず別プロセスで起動してやりとりするような方法で良いのではと感じた。
gtk→ちょっと小奇麗なダイアログ、インプットボックス、特殊機能ダイアログの類
xlib→メッセージボックス
SDL→オフラインコンテキストかOpenGLをベースにした描画
という棲み分けだろうか。

gtkが思いのほかコード量が多いのが意外だった。

基本と軽量なテキストボックスを作る技術を入手したのはいいが
結局freetypeかcairoないしはwebkitがxlib上で使えるのか
素直にgtk2のが良いのか基本指針は定まらないままだ。



ラベル:xlib
posted by Xo_ox at 20:09| Comment(0) | FreeBSDアプリ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。