X Window System のクリップボード

X のコピー&ペーストのメカニズムは2種類ある。

1.カットバッファ
STRING エンコーディングの文字列のみ格納可能。EUC-JP 日本語は使えないっぽい。0番から7番まであるが、通常使われるのは0番のみ。データは X サーバが保持し、アプリが終了しても失われない。
2.セレクション
バッファは複数あり、それぞれ名前を持っている。普通使われるのは XA_PRIMARY,XA_SECONDARY, XA_CLIPBOARD。慣習的に、PRIMARY は文字列を選択したとき、CLIPBOARD はユーザが明示的にコピーしたとき使われるらしい。

セレクションは、ペーストするアプリが X サーバを介してコピーしたアプリに問い合わせを行い、データを要求したフォーマットに変換してもらってから受け取る。そのため、コピーした後でそのアプリが終了するとペーストできなくなってしまう。
今やカットバッファは完全に時代遅れとのこと。
firefox でコピーを行うと XA_PRIMARY, XA_SECONDARY, XA_CLIPBOARD に格納される。
xterm で選択すると PRIMARY とカットバッファ0の両方に格納される。真ん中ボタンクリックすると、PRIMARY が利用可能ならば PRIMARY、そうでなければカットバッファ0がペーストされる。
.Xdefaults に

*VT100.translations: #override  <Btn2Down>: insert-selection(CLIPBOARD)

と書けば真ん中ボタンクリックで CLIPBOARD セレクションがペーストされるようになると思いきや、CLIPBOARD と PRIMARY 両方がペーストされるようになってしまう。この挙動は謎。

セレクションの内容を表示するには

xclip -o -selection セレクション名

参考:
http://xjman.dsl.gr.jp/X11R6/X11/CH16.html
vim の :h x11-selection がとても詳しい。


カットバッファに文字列を格納するには XStoreBuffer、取得するには XFetchBuffer を使う。
http://xjman.dsl.gr.jp/X11R6/X11/CH16.html


Xt でセレクションからペーストするには XtGetSelectionValue を使う。セレクションにコピーする(正確には、セレクションのオーナーになる)には XtOwnSelection を使う。


gtk2 でセレクションにコピーするには gtk_clipboard_set_text を使う。これはカットバッファにはコピーされない。