フリーのペイントソフト、GIMPをゲームパッドで操作したい。いわゆる「左手デバイス」とかいうの。まあ自分はそんなにお絵描きするわけじゃないんだけど。
ここの話はLinuxでの話で、WindowsとかOS Xとかは知らん。
手持ちのハードウエア
- パソコン(自作のLinux機)
- USBゲームパッド(エレコムのやつ)
- ペンタブ(Wacom Bamboo CTH-661)(今回の主役ではない)
試した手順
1. メニューの「Edit > Preferences」を選択。
2. Preferences ダイアログの Input Devices > Input Controllers を選択
3. Available Controllers の Linux Input を選択し、→ボタンで Active Controllers に追加。
4. Configure Input Controller ダイアログが出てくるので、Deviceとして PC Game Controller を選択。
これで、
- Grab eventをクリック
- ゲームパッドのボタンを押す
- Actionを割り当て
という感じでゲームパッドのボタンにGIMPの操作を割り当てることができる…と期待したがそうはいかなかった。ゲームパッドのボタンを押しても何も起こらない。Dump events…にチェックを入れてターミナルの出力を見ると、ボタンを押した事自体は認識されてはいるようだ。なぜだ。
GIMPのソースコードをいじる
しかたがないからGIMPのソースコードを見ていじくろう。GIMP Developer WikiのHacking:Building/Linuxを参考にして、ソースコードをgitでチェックアウトする。
Linux Inputに対応するソースはどこだろう。gimp/modules/
が怪しい。見てみると、gimp/modules/controller-linux-input.c
というソースファイルがある。これか。
ファイルの頭の方に static const LinuxInputEvent key_events[]
という変数の定義がある。Configure Input Controllerダイアログに出てきたボタンの名前はこれか。ゲームパッドのキーを押したときにターミナルに出てくるログと、<linux/input.h>
で定義されている定数の値を参考にしながら、BTN_***
に対応する定義を追加する。
差分としてはこんな感じになった。
diff --git a/modules/controller-linux-input.c b/modules/controller-linux-input.c
index 8759d10..de72332 100644
--- a/modules/controller-linux-input.c
+++ b/modules/controller-linux-input.c
@@ -81,8 +81,20 @@ static const LinuxInputEvent key_events[] =
{ BTN_GEAR_DOWN, "button-gear-down", N_("Button Gear Down") },
#endif
#ifdef BTN_GEAR_UP
- { BTN_GEAR_UP, "button-gear-up", N_("Button Gear Up") }
+ { BTN_GEAR_UP, "button-gear-up", N_("Button Gear Up") },
#endif
+ { BTN_TRIGGER, "button-trigger", N_("Button Trigger") },
+ { BTN_THUMB, "button-thumb", N_("Button Thumb") },
+ { BTN_THUMB2, "button-thumb2", N_("Button Thumb 2") },
+ { BTN_TOP, "button-top", N_("Button Top") },
+ { BTN_TOP2, "button-top2", N_("Button Top 2") },
+ { BTN_PINKIE, "button-pinkie", N_("Button Pinkie") },
+ { BTN_BASE, "button-base", N_("Button Base") },
+ { BTN_BASE2, "button-base2", N_("Button Base 2") },
+ { BTN_BASE3, "button-base3", N_("Button Base 3") },
+ { BTN_BASE4, "button-base4", N_("Button Base 4") },
+ { BTN_BASE5, "button-base5", N_("Button Base 5") },
+ { BTN_BASE6, "button-base6", N_("Button Base 6") },
};
static const LinuxInputEvent rel_events[] =
あとは、さっきのWikiの手順にしたがってGIMPをビルドする。すると、さっきスクリーンショット付きで説明した手順で、ゲームパッドのボタンにGIMPの操作を割り当てることができる。
とりあえず気づいた点は、ボタンを押すときと離すときで2回操作が実行されるのと、ゲームパッドのボタンじゃなくて倒すやつには反応しないこと。既存のソースコードの見よう見まねじゃなくて、ちゃんと調べてコードを書かないといけない気がする。そもそもこのLinux Inputというやつはどのぐらい使われているんだろうか。これは意図した動作なのだろうか。
あと、自分の手持ちのゲームパッド1個で試したが、他のゲームパッドではどうなるのか。この辺の問題が解決したらパッチを投げるかもしれない。その前に開発コミュニティーの雰囲気とかつかんでおきたいが。パッチを投稿するにはBugzillaにBug(?)を登録してそれに添付する感じだろうか。この辺の手間を思うに、GitHubのPull Requestという仕組みは偉大だ。
ペンタブのパッド(ペンタブの感知するエリアの横についてるボタン)に対する操作も、Linux Inputで扱えそうな雰囲気を感じたが、Wacomのドライバと競合するのか知らないがなにかうまくいかない。