2009年03月07日

xlibでセレクション受信を実装してみる。

そもそもバーチャルキーの類に手をつけたのは
ジョイスティックでマウス操作したかったこともあるが
X特有のセレクションを簡単にするためだった。
GTKでは簡便に機能を提供されているセレクションのxlibで実装を目指してみた。
どうしても分からなかったらGTKにしようと思ったが
かろうじてテキストのセレクションの取得までできた。
web上の資料がわかりにくかったのでまだ消化できていない。
XConvertSelection関数を呼び出すことで
Event.type SelectionNotifyが送られてくるということのようだ。

ヘッダーは

#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/Xlocale.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>

など

変数として追加分は

unsigned long left;
XTextProperty prop;
char **l;
int n;
char** lp;

Atom a_targets, a_ct, a_prop;

あたり

一般的にはミドルマウスだが何らかのトリガーで

XConvertSelection (dpy, XA_PRIMARY, a_ct, a_prop, win,
evt.xbutton.time);

を送信する。

この時

case SelectionNotify:

if (evt.xselection.selection == XA_PRIMARY &&
evt.xselection.property == a_prop) {

if (evt.xselection.target == a_ct) {
if (XGetWindowProperty (dpy, win, a_prop, 0, BUFSIZ/4-1, False,
a_ct, &prop.encoding, &prop.format,
&prop.nitems, &left, &prop.value)
== Success && prop.nitems > 0) {
XmbTextPropertyToTextList (dpy, &prop, &l, &n);
if (n-- > 0) {
lp = l;
strcpy (string, *lp++);
while (n-- > 0)
strcat (string, *lp++);

XClearWindow(dpy, win);
XmbDrawString (dpy, win, fs, gc, 50, 50,
string,strlen (string));
}
if (l) XFreeStringList (l);
}
}
}
break;

と最後2命令は描画だがstringに文字列を取得できる。
あとで無理せずputsで良かったと思った。

XGetWindowPropertyはWindowのウィンドウのプロパティの型、フォーマット、値を得る関数で
もっぱら XTextPropertyを得るのが目的

このテキストを保持しておけばセレクションが解除されても再利用できるわけだ。
まだCのポインタ型変数の宣言と使うときの形を消化しきっていないし
このコードも手順そのままなのでもうちょいどうにかしたい。
現時点では送信の方はまだ資料すら整っていないのだがここまでくるとどうにかしたい。
posted by Xo_ox at 23:55| Comment(0) | FreeBSDアプリ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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

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