Login
Immutable PageDiscussionInfoAttachments
clear/note/2013-01

MMA

2013年1月

01/01

stdinから与えられた文字列をひたすらウィンドウに表示するツール1が欲しくなったので作ろうとしている(xcbで書いてる)が、Xのイベントを捌きつつstdinからの入力を処理する必要がある。しばらく前からいくつかの方法を試しているが中々上手く行かなかった。

まだ試していないのはマルチスレッド化(Xイベント処理/入力処理の2スレッド)だがあまりやりたくない。最初の方法でイベントを上手く拾えない原因を突き止めたいところ。

最終的にはこうなった。

   1 xcb_connection_t *conn;
   2 xcb_generic_event_t *event;
   3 // ...
   4 int fd_x = xcb_get_file_descriptor(conn);
   5 for (;;) {
   6     if (event = xcb_poll_for_queued_event(conn)) {
   7         eventを処理
   8     } else {
   9         0fd_xselect
  10         if (FD_ISSET(fd_x, ...)) {
  11            event = xcb_wait_for_event(conn);
  12            eventを処理
  13         } else if (FD_ISSET(0, ...)) {
  14            stdinからの入力を処理
  15         }
  16     }
  17 }

03/01追記: xcb_poll_for_queued_eventはlibxcb 1.8以降でないと使えない。

  1. 時計とかバッテリ残量を表示したい。xtermで良くないか、という説がある(実際今はそうしている)が、端末は入力フォーカスを受け取るので何かの拍子に入力してしまいがちなのが難点 (1)

  2. 後から考えたが、この手のイベントはリクエスト(MapWindowとかDestroyWindow)に反応して発生する->リプライとかと一緒に届いてイベントキューに入る->selectでは適切なタイミングで拾えない? (2)

clear/note/2013-01 (last edited 2013-03-01 00:49:12 by clear)