(Linux) Wacom タブレット設定

はじめに
Linux 上でも Wacom タブレットは普通に使うことができますが、実は、
デフォルトの設定状態では、入力されたデータは色々な加工がされた状態で取得されます

Linux の Wacom ドライバには、独自でデータを補正する色々な機能が付いていて、それがデフォルトで ON になっています。

例えば、ペンにある程度筆圧をかけないとボタンが押されたことにならない、など。
これは特にドット編集する時に困ります。
Windows 上では軽く押しただけで反応するのに、Linux では強く押さないと点が描画できないので、大変使い勝手が悪いです。

補正はそれだけではなく、座標や筆圧などの値の変化幅が小さかった時はデータとして送信されずに捨てられる機能もデフォルトで ON になっています。
元々は入力データを減らして処理を軽くする機能ですが、お絵描きなどで精密なデータが欲しい時には余計な機能でしかありません。

そこで、なるべく生のデータの状態で取得できるようにするには、ドライバの設定を変更する必要があります。

ボタンの動作の変更などは、デスクトップ環境によっては GUI で設定できるものもありますが、詳細な設定を行うには、xsetwacom コマンドの実行や、設定ファイルの編集が必要になります。
xsetwacom コマンド
設定を変更する一番簡単な方法は、xsetwacom コマンドを使うことです。
コマンドを実行するだけで設定を変更できます。

ただし、この場合は一時的な変更として扱われるので、再起動すると設定が元に戻ってしまいます。
すぐに値を変更して動作を確認したい場合に使ってください。
デバイス名の取得
設定を変更したり、設定値を取得したりするためには、対象となる Wacom タブレットのデバイス名または ID が必要になります。
なので、まずはデバイスの一覧を表示して確認します。

$ xsetwacom list
Wacom Graphire3 Pen stylus          id: 10    type: STYLUS    
Wacom Graphire3 Pen eraser          id: 14    type: ERASER    
Wacom Graphire3 Pen cursor          id: 15    type: CURSOR

うちの環境では上記のような結果になります。
左から順に、「デバイス名」「デバイス ID」「デバイスタイプ」です。

3つ表示されていますが、この3つは同じ一つのタブレッドデバイスです。Linux 上では、

  • ペンを使った時は「stylus
  • ペンの消しゴム部分を使った時は「eraser
  • タブレット付属のマウスを使った時は「cursor

というように、操作方法ごとにデバイスが分かれています。
設定できるパラメータの一覧
次に、設定できるパラメータにはどんなものがあるのか、一覧を表示します。

$ xsetwacom list param
Area             - Valid tablet area in device coordinates. 
Button           - X11 event to which the given button should be mapped. 
ToolDebugLevel   - Level of debugging trace for individual tools (default is 0 [off]). 
TabletDebugLevel - Level of debugging statements applied to shared code paths between all tools associated with the same tablet (default is 0 [off]). 
Suppress         - Number of points trimmed (default is 2). 
RawSample        - Number of raw data used to filter the points (default is 4). 
PressureCurve    - Bezier curve for pressure (default is 0 0 100 100 [linear]). 
...
設定値の取得
とりあえず、現在の設定値を取得してみましょう。
xsetwacom get <デバイス名 or ID> <パラメータ名>」で取得できます。

デバイスは、「"Wacom Graphire3 Pen stylus"」などのデバイス名か、デバイス ID の数値で指定します。
デバイス名で指定する場合は、名前にスペースが含まれている場合がほとんどなので、記述する際は「"」で囲むのを忘れずに。

## ID で指定 (list で表示された "id:*" の値を使う。ここでは仮に 10 とする)

$ xsetwacom get 10 Area
0 0 10208 7424

## デバイス名で指定

$ xsetwacom get "Wacom Graphire3 Pen stylus" Suppress
0

## 取得可能なすべてのパラメータ値を表示

$ xsetwacom get 10 all
Option "Area" "0 0 10208 7424"
Button: Actions are not supported by xorg.conf. Try shell format (-s) instead.
Button: Actions are not supported by xorg.conf. Try shell format (-s) instead.
...
設定値の変更
では、設定値を変更してみます。
xsetwacom set <デバイス名 or ID> <パラメータ名> <値>」で変更できます。
値が ON/OFF のみのパラメータの場合は、文字列で「on」か「off」を指定します。

$ xsetwacom set <デバイス> Threshold 1

Threshold」は、ボタンが押されたかどうかを判定する、筆圧のしきい値です。
ここでは 1 を指定しているので、筆圧が 1 以上なら、ボタンが押されたとみなされます。
各パラメータについて
座標などを生データに近い状態で取得するために、関係ありそうなパラメータを説明します。

xsetwacom コマンドでパラメータの一覧は表示できますが、これだけでは実際にどういう処理が行われているかは判断しにくいものがあります。
C 言語が読める方は、Linux Wacom Tablet Project のソースコードを見たほうがわかりやすいです。
X11 用のソースコードは xf86-input-wacom です。

Threshold [n]筆圧のしきい値を指定します。
1〜2048 (デフォルト: 27)

ペンを押した時の筆圧が、この値以上であれば、ボタンが押されたとみなします。
指定値未満なら、ボタンは押されたことにはなりません。

デフォルトが 27 なので、結構筆圧をかけないと描画できません。
最小値の 1 を指定しましょう。
ちなみに、0 はペンが離されている状態なので指定できません。
RawSample [n]座標の手ブレ補正です。
生のデータのサンプル数を指定します。1〜 (デフォルト: 4)。
指定した数のデータの座標の平均を求めて、座標とします。

単純な平均移動法による処理なので、アプリケーション側で手ブレ補正機能があるなら無効にしたほうが良いでしょう。
最小値が 1 なので、1 を指定します。
Suppress [n]送るデータの数を抑制します。
座標や筆圧の値 (※タブレット上での単位) が前回の値と比べて指定値以下であれば、データを送らずに捨てます。

値の幅を指定します。0 で無効、デフォルトは 2 です。

要するに、ちょっとしか移動しなかった場合などはデータを捨てて、アプリケーション側での処理を軽くしようという機能です。
精密な情報が欲しい場合は余計な機能なので、0 で無効にしましょう。

ちなみに、これは座標だけではなく筆圧の値も処理の対象になるので、
デフォルト値の 2 の状態だと、筆圧が 0 -> 3 に変化した場合はデータが送られますが、0 -> 2 に変化した場合は捨てられます。
なので、「Threshold」を 1 にしても、この値がデフォルトのままだと、筆圧が 0 -> 1 or 2 になった場合はボタンが押された状態になりません。
Threshold を 1 にしたのにペンの押し状態がまだ弱いと感じる場合は、これが原因です。
永続的に設定を適用
xsetwacom コマンドを使うと一時的に設定を変更することはできますが、永続的に設定を有効にしたい場合は、以下の2通りの方法があります。


前者の場合は、ホームディレクトリの .xinitrc ファイルなど、起動時に自動的に読み込まれるスクリプトを使って、xsetwacom コマンドで毎回設定を変更します。
あまりスマートな方法ではありませんが、簡単です。

後者の場合は、システムディレクトリに Wacom ドライバ設定用の設定ファイルを作ります。
少し手間がかかりますが、普通はこちらの方法を使います。
設定ファイル
設定方法は、Linux Wacom Project wiki を参考にしてください。
設定ファイルは、/etc/X11/xorg.conf.d ディレクトリ内に作成します。

以下は、Wacom ドライバのすべてで同じ設定を適用する場合の内容です。

52-wacom-options.conf
Section "InputClass"
    Identifier "Wacom stylus options"
    MatchProduct "Wacom|WACOM"
    MatchDevicePath "/dev/input/event*"
    Driver "wacom"

    Option "Suppress" "0"
    Option "Threshold" "1"
    Option "RawSample" "1"
EndSection

パラメータ名は xsetwacom で指定する際の名前と同じものがほとんどですが、設定ファイルで設定できないパラメータがいくつかあります。
また、設定ファイルで記述する際はパラメータ名や値の指定方法が異なるものもあります。
タブレットとモニタの比率が異なる場合
モニタが 16:9 でタブレットが 4:3 など、タブレットとモニタの縦と横の比率が違う場合、デフォルトではタブレットの面積全体がモニタ画面の全体に割り当てられる形となるので、普通に使うことはできますが、双方の座標の比率が異なるために、タブレット上で円を描いても画面上では楕円になってしまう、ということになります。

本来はモニタと同じ比率のタブレットを使うべきですが、あえて比率の違うタブレットを使いたい場合は、入力側のタブレットの範囲を小さくするか、出力側のモニタの範囲を小さくして、どちらかの範囲の一部を使えなくして比率を同じにすれば、問題なく使うことができます。

例えば、モニタが 16:9 でタブレットが 4:3 の場合、タブレット側は全体を有効にして、モニタは中央の 4:3 の範囲だけ有効にすると、タブレットでモニタの左右の端の方には移動できませんが、比率を維持できます。
設定方法 (モニタの範囲を変更する場合)
出力側のモニタの座標範囲を変更する場合は、「MapToOutput」のパラメータを変更します。
このパラメータの値には、指定文字列やディスプレイ名、範囲の数値指定など、いくつかの指定方法があります。
ここでは、座標範囲を数値で指定します。

まずは、現在のモニタの幅と高さ、それとタブレット内部での座標範囲を取得します。

$ xrandr --listmonitors
Monitors: 1
 0: +HDMI1 1920/480x1080/270+0+0  HDMI1

$ xsetwacom get <デバイス> Area
0 0 10208 7424

上記の場合は、1920x1080 がモニタの幅と高さ、10208x7474 がタブレット内部における幅と高さです。

この値から、タブレットと同じ比率になるモニタの幅を計算します。

新しい幅 = モニタの高さ×タブレットの幅÷タブレットの高さ

上記の例の場合は、以下の値になります。
W = 1080 x 10208 / 7424 = 1485

モニタの中央に範囲を置きたい場合は、X の先頭位置も計算しておきます。
X = (モニタの幅 - 新しい幅) / 2

次に、xsetwacom で設定を変更してみます。

$ xsetwacom set <デバイス> MapToOutput "1485x1080+217+0"

MapToOutput の次の値は、「幅x高さ+X位置+Y位置」です。
「x」は半角小文字のエックスです。

幅は、計算した新しい出力幅を指定します。
高さは、そのままモニタの高さを指定します。
X位置は、モニタの中央の範囲にするなら計算した値を、左端の範囲にするなら「0」にしてください。
Y位置は、0です。

この設定値は、xorg の設定ファイルでは設定できないので、永続的に有効にしたい場合は、起動時に常に xsetwacom を実行してください。
設定方法 (タブレットの入力範囲を変更する場合)
入力側のタブレットの範囲を変更する場合、xsetwacom で設定する場合は、「Area」のパラメータを変更します。
xorg の設定ファイルで指定する場合は、「TopX,TopY,BottomX,BottomY」のパラメータを設定します。