2012-03-26

X11でクリップボードを操作しようと思ったら

Windowsでは、私はクリップボードを操作する簡単なツールを使っていた。たとえば、ブログにコードを貼り付けたりするとき、

template < typename T >
void f( T & ) ;

というコードは、実は、以下のようにエスケープしている。

template &lt; typename T &gt;
void f( T &amp; ) ;

もちろん、これも更にエスケープしているわけだ。CDATAセクションでも使わない限り、XML上で、&, <, >を直接書くことはできない。もっともBloggerはなんちゃってXHTMLを使っているので、実はちょっと変なHTMLにすぎないのだが。

このような変換を手sedで行うのはプログラマーたる者のすることではない。しかし問題は、私はいろんなソフトウェアを使っているということだ。vimやemacsのような一つの環境に閉じこもるならば、そのツール内で完結するコードを書けばいいが、実際には、テキストエディターは複数使うし、ブラウザーも複数使う。できるだけ広範囲で動かすには、クリップボードが最適だ。X11の練習がてら、さっそくC++で書いてみようと思った。

問題は、X11におけるクリップボードが使いづらいということだ。X11におけるクリップボードは、イベント駆動な仕組みになっている。クリップボードにデータを供給するには、その旨を通知した上で、さらに他のプログラムからの実際のデータの要求を待たねばならない。つまり、クリップボードに通知したあと、要求があるまで、ソフトウェアは起動したまま待たねばならない。私が今欲しいツールにはGUIなどいらないというのに、イベントループを回して要求を待たねばならない。もちろん、ウインドウを作ったりする必要はないが、たかだかクリップボード程度にえらく大げさなコードになる。

最近は、クリップボードサーバーがあり、プログラムの間の橋渡しをしてくれるので、一度要求を処理して終了してもクリップボードは維持されるようになった。しかし、結局コード上では通知して要求待ちしなければならないことに変わりはない。

なぜこう設計せねばならなかったのか。クリップボードのアイディアは、何もGUIを必須とするわけでもあるまい。GUIがなかった時代だって、プログラムごとにミニバッファなどと称して、クリップボードと本質的には大差ない機能をプログラムごとに実装していた。だから、クリップボードというのはそれほど新しい発送でもないはずだ。なぜ、/dev/clipboardみたいな仕組みがないのか。

Win32 APIのクリップボードも、あまりいい設計とは言えない。なにしろ、今となって古びたGlobalAllocを使わなければならないのだから。とはいえ、単純なクリップボードの読み書きごときにイベントループを回す必要はない。

というわけで、X11を直接使うのはやめることにした。聞説、Waylandなるものが将来、X11を完全に置き換えるらしい。とりあえず、今はGTK+でもいじって遊んでいよう。しかし、GTK+も概要を理解するだけで少し時間がかかるので、やはり面倒だ。

というわけで、未だに一行のコードも書いていないわけだ。ただし救いはある。私はいまGNU/Linuxを使っている。そのため、私は一行のコードも書くことなく目的を達成できるのだ。

顧客が本当に必要だったもの

#!/bin/sh
xclip -selection clipboard -o | sed "s/&/\&amp;/g;s/</\&lt;/g;s/>/\&gt;/g" | xclip -selection clipboard

1 comment:

  1. > CDATAセクションでも使わない限り、XML上で、&, <, >を直接書くことはできない。
    「>」は書けます。

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.