モブ沢工房

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか3Dプリンタやら日曜大工等、色々。

Xubuntu 16.04でCintiq 13HDを自動設定するの巻

ついつい、勢いでwacomの液タブCintiq 13HDを買ってしまいました(^^; 旧モデルなのは、安いだけでなくLinuxで使うには何も考えなくて良くて都合が良いというメリットもあるのです。 f:id:dothiko:20171027203651j:plain どーでもよいのですがこの絵、tegaki_dtで頑張って書いてたらボタンの誤爆で「画像が動く」状態になっちゃってどうにもならず、後で描き直してツイートしたのだけどやっぱ液タブなのでそのへんも速かったですな…

いやそれにしても中華液タブが割高に思えてしまう値段ですなコレは… これで一応最高レベル(あくまで廉価帯内での比較)の液タブを経験しておけば、後々中華品に手を出した時に 「ワコムだったらこの不快な現象は起きないのだろうか」という疑問などを一掃してくれるわけでまぁ買ってよかったかなと!

表題については、正直、現在のUbuntuLinuxであれば挿しただけでドライバが入って認識されるので何のネタにもならないのですが、デュアルモニタ(xinerama)だと横に超長いor縦に2つのモニタになっているので、全画面にマップされてしまいます。

これを以前、板タブについても避けようと思っていろいろやった挙句、面倒なので起動時に設定して挿しっぱということになりましたが、液タブはなんか光って電気もったいなさげなので使わない時は出来る限り消したいのですな。

というわけで再挑戦なのでありました。

まずは

  • udevにrulesファイルを書いて、RUN+=で一段目のシェルスクリプト実行。
  • 二段目のシェルスクリプトを実行、二段目でsleep 3ぐらいして、実際にX11にペンタブデバイスが認識されるのを待つ
  • 二段目スクリプトではsleepの後、export XAUTHORITY=/home/ユーザー/.Xauthority
  • あと、export DISPLAY=:0
  • んで、xsetwacom。

rulesファイルは/etc/udev/rules.d/99-cintiq.rulesとでもして

SUBSYSTEM!="input",ACTION!="add",GOTO="my_cintiq_end"
ENV{ID_MODEL}=="Wacom_Cintiq_13HD",ENV{ID_TYPE}=="hid",RUN+="/usr/local/lib/tablet/cintiq_setup_launcher.sh"
LABEL="my_cintiq_end"

という方法を取りました。まぁ試行錯誤の結果これで動くことは動く。…のですが、何度も呼び出されている模様… 実に気持ち悪いのでフラッグファイルを立てるなど試行錯誤してみたのですが、うまく行かない。何故か逆に設定がされなくなったりして…

そこで、考え方を変えて、udevとX11の組み合わせは筋が悪いのでとりあえずやめるとして 以前見失った「XFCE4の設定でペンタブの自動適用設定があったはず、あれをもう一度探そう」となりました。

以前はたしか「マウスとタッチパッド」にあったのですが、今は無い… んでようやく見つけましたよ、「リムーバブルとメディア」の中にその項目があった。 そんなん分かるか? f:id:dothiko:20171027203723j:plain これに、こんなふうに

/usr/local/bin/xfce4_detect_pentab.py --node %d

というように%dをつけると「/dev/input/event22」とか「/dev/input/mouse5」とかのデバイスノードを引数で送りつけてその都度呼んでくれます。だがしかし「その都度」なので、ペンタブ一つさすと3回ぐらいは呼ばれるというわけです。

それでもってデバイスノードが得られても、何のペンタブが挿されたのかは即座にはわかりません…

まぁ結局長くなるのでここには書きませんが、

  • cat /proc/bus/input/devices すると、その中に H: Handlers=mouse5 event22 みたいな情報があり、また、N: Name="Wacom Intuos 6x8 Pen"みたいなxsetwacomデバイス名も得られる。
  • pythonでこれを解析してデバイスノードからデバイス名を得るようなスクリプトを書き
  • ペンタブに対する設定はjsonファイル(config.json)にまとめて記述。
  • さらにsubprocessでxsetwacomを呼び出して、先ほどのjsonに書かれた設定を反映。
  • 一気にすべての設定を適用してしまう。xfce4のdaemonはおそらくdbusで捕捉してると思うので、udevとは違い呼ばれる時には既にxinputは全部揃ってるはず…
  • テンポラリファイルに情報を書いといて、同一デバイスに対するものは60秒以下なら設定せずに抜ける。これで重複する他の呼び出しを全部キャンセル

ということにしてスクリプトを書いたのだけど、ここに書くには余白が少なすぎる。 かなり自分専用でピーキーでチャチなものなので、githubに公開してもなぁ…