本記事は俺ちゃん著の Linux Mint インストール記事 の追っかけ記事である。基本的に、そちらを読んだ読者を対象としているが、他サイトを参考にして Linux Mint をインストールしたとか、既に大分前にインストールして使っているよという人も利用でき、おそらく参考になるだろう。また、別の Linux ディストリビューションでも動くと思うが、保証はしない。筆者環境の Arch Linux では動作した。
はじめに
🕒 この記事を読むのに必要な時間 🕒
要約のみ: 約 10分 ※オススメ!
全文: 約 35分
📜 必要な知識 📜
Linuxに関する知識: 初級 ※ ただし全文の方は中級。
Linuxコマンドライン操作: 初級 ※ ただし全文の方は中級。
Unicode に関する知識: 中級 ※全文の場合のみ必要
バイナリに関する知識: 中級 ※全文の場合のみ必要
💻 実行環境 💻
OS: Linux Mint 22.2 x86_64
Kernel: 6.8.0-79-generic
Shell: bash 5.2.21
DE: Xfce 4.18
WM: Xfwm4
Terminal: xfce4-terminal
Packages: xfconf 4.18.1-1build3, xinput 1.6.4-1build1, xxd 2:9.1.0016-1ubuntu7.8, libnotify-bin 0.8.3-1build2
🔶 きっかけ
ラップトップ PC の LIFEBOOK U938/T に Linux Mint を導入した。
しかし非常に広いタッチパッド(スライドパッドとも呼ばれる)がキーボードの手前を専有してしまっている。
Linux に限らず昔からよくある話だが、文章を打っているとこのタッチパッドに不意に触ってしまってポインタが動き、おかしな位置に入力されてしまう… ということが結構頻繁にあって嫌だった。
(だから筆者は普段ラップトップ PC を選ぶときは、窪みになっていて引っかからない構造の Let's Note や、トラックポイント搭載の ThinkPad を愛用しているが)
この問題をなんとかしたい。
🔶 標準機能で対処するなら
実は標準の機能でキーボードの入力中だけ、タッチパッドをオフにする機能がある。
[スタート] > [設定マネージャー] > [マウスとタッチパッド]
を選択する。
設定ダイアログが開くので "タッチパッド" タブを開き [タイプ中はタッチパッドを無効にする] という項目を ON にする。すぐその下の [時間] スライドバーで無効にする時間的余韻を調整できる。長くすると、キー入力が終わった後も その時間分 しばらくタッチパッドが効かなくなる。デフォルトでは 2秒になっているが、筆者の感覚では少々長すぎたので 0.5 〜 1秒くらいにしておくとよいように思う。
ただし、短くしすぎると、タイピングの間隔次第だが途中でポインタが動いてしまい、元も子もなくなるので注意すること。
この機能で満足できるなら、それがベストだろう。
しかし筆者の場合、それでもたまにポインタが動くことがあり、不満に思っていた。
おそらく、キーを押し始めてからタッチパッドを無効にする仕様のため、押す直前やタイプ途中で一旦入力が終わり、再開する際に触れてしまってポインタが動いているのだ。
タイピング 開始時/終了時 に 明示的に 有効/無効 を切り替えられれば この心配はない。
そこでキーボード・ショートカット一発で、都合に応じてタッチパッドを ON/OFF する機能を作ることにした。
🔶 TL;DR 最初に結論の要約を述べる
事前にソフトウェアマネージャーか、端末で apt コマンドを使って xinput パッケージをインストールしておくこと。後者なら、端末を開いて以下を打ち込む。
$ sudo apt install xinput
以下のシェルスクリプトが完成品。これをダウンロードする。
GitHub ページ右の方にダウンロードボタンがあるので、それを使ってダウンロードする。
マウスポインタを合わせると "Download law file" とツールチップ・ヘルプが表示されるので目印にされたし。
ダウンロードしたら、以下のコマンドで実行可能にしておく。
$ chmod +x ToggleTouchPad.sh
代りに GUI でやりたい場合には Thunar ファイルマネージャーで開いて、このファイルを選択してから、メニューで [ファイル] > [プロパティ] を開く。
あとは [アクセス権] タブをクリックして [プログラム] のチェックボックスを ON にすればよい。
このスクリプトは実行するたびに、タッチパッドの 有効/無効 が切り替わる。
これを適切なパスの通った場所に移動しておく。
CUI の場合は以下のコマンドを実行するだけ。
$ sudo mv <ToggleTouchPad.sh ファイルのパス> /usr/local/bin/
📌初心者向けの代替手段🔰
「CUI は苦手…」という初心者のために GUI でのやり方も紹介しておこう。ただし、ちょっと工程が多くなる。
-- 折りたたみを開いて確認 --
Thunar ファイルマネージャーでダウンロードした ToggleTouchPad.sh のある場所へ移動する。アイコンが何もないところを右クリックして [root として開く] を選択。
管理者権限の認証を求められるので、パスワードを入力。
Thunar が root として開かれるので、 ToggleTouchPad.sh を選択し、右クリックして [切り取り] を選ぶ。
次に "/usr/local/bin" ディレクトリに移動する。Thunar では Ctrl + D キーを押すとパスを直接入力できるので、そこへ "/usr/local/bin" と入力すると早い。そこへ右クリックで [貼り付け] を選ぶと、ファイルが移動できる。
移動したら Thunar は閉じておく。
あとはこれをショートカット・キーに登録しておけばいい。
Linux Mint Xfce エディションの場合は次のようにする。
-
[スタート] > [設定マネージャー] > [キーボード] を選択。
またはxfce4-keyboard-settingsコマンドを端末で実行。 - [アプリケーションショートカットキー] タブを選択。 [追加] ボタンを押下。 [コマンド] のテキストボックスに "/usr/local/bin/ToggleTouchPad.sh" を入力してから [OK] ボタンを押す。
- 「キーを押してください」の画面になったら、設定したいキーの組み合わせを入力する。筆者は
Ctrl+Alt+Tにした。 - [閉じる] ボタンで終了する。
ショートカット・キーは好きなものを指定すればいいが、他のアプリケーションやデスクトップ環境でよく利用されるショートカットキーの組み合わせとかぶっていないほうがいい。例えば Ctrl + V なんかは貼り付け(ペースト)に割り当てられているので、使うべきではない。
また、うっかり間違えて押すのを回避するために、 Ctrl, Alt, Shift などの修飾キーをいくつか組み合わせたアルファベットか数字にするのがベターだ。
GNOME などの他のデスクトップ環境を使っている場合でも大抵ショートカット・キーを追加・変更できる機能があるはずだ。探して設定してみてほしい。
以下は作成時のログと、仕組みの詳細について。興味のある方だけ参照。
🔶 作成方針
タッチパッドを ON/OFF するコマンドラインさえ わかれば、シェルスクリプトにすることができるだろう。
シェルスクリプトができれば、簡単にキーボード・ショートカットも設定が可能だ。
そこでまずは「コマンドライン上で ON/OFF するにはどうすればよいか?」というアプローチで探ってゆく。
🔶 まずはGUIで ON/OFF したときの実装を調べる
正攻法というか、普通にタッチパッドを OFF にするだけなら正規の機能で既にある。
[スタート] > [設定マネージャー] > [マウスとタッチパッド]
を選択する。
設定ダイアログが開くので "デバイス:" という項目をタッチパッドのデバイス名に切り替える。これは機種によって異なるが "TouchPad" という単語が大抵入っている。 (Thinkpad などの明らかに形の違う機種を除く)
そのすぐ右隣りにあるスライドボタンを OFF の位置に持っていけば OK。デバイスが無効化される。
このとき、設定ファイルが更新されるが、以下のようになっていた。
$ sed -nr '/TouchPad/,/Device_Enable/p' ~/.config/xfce4/xfconf/xfce-perchannel-xml/pointers.xml
<property name="SynPS2_Synaptics_TouchPad" type="empty">
<property name="RightHanded" type="bool" value="true"/>
<property name="Threshold" type="int" value="1"/>
<property name="Acceleration" type="double" value="8"/>
<property name="Properties" type="empty">
-- (snip) --
<property name="Device_Enabled" type="int" value="0"/>
$
一番最後の行、 "Device_Enabled" がこの項目で value="0" が無効を表す。 value="1" にすると、有効になる。
ただし、これはこのファイルを手動で変更すればいいというわけではない。デスクトップ環境である Xfce に変更を通知してやる必要がある。
再ログインするか、おそらく、
$ xfdesktop -R
とかで できる気がするが… 全設定を再読み込みするのでイマイチだ。無駄が多い。もっとスマートなやり方があるはずだ。
🔶 方法1:xfconf-query を使って ON/OFF する
先程の設定は Xfce の xfconf という設定の仕組みに則ったものとなっている。実は、これを操作するコマンド xfconf-query というコマンドが用意されている。ってことで使ってみる。
$ xfconf-query --channel pointers --property /SynPS2_Synaptics_TouchPad/Properties/Device_Enabled --set 0
【注意】
--property オプションに指定している "/SynPS2_Synaptics_TouchPad/Properties/Device_Enabled" は先程の XML ファイルの階層を成すタグから抜き出してきた各 name 要素を連ねたもの。XPath のような / で区切られたパス型の指定だ。自分の環境に応じて変える必要があるかもしれない。
これで即座に無効にできる。
有効化したいときは --set コマンドライン・オプションの値を 1 にするだけ。
先程の設定ファイルも書き換わる。つまり、ダイアログを表示して設定したときと同じ効果が現れる。
プロパティ "/SynPS2_Synaptics_TouchPad" はチャンネル "pointers" 上に存在しません.
のようなエラーメッセージで上記が失敗する場合、おそらくプロパティの指定が違っているのだろう。よくある XML の DOM構造 なのでプログラマーは見れば直感的にわかるだろうが、そうでない人は微妙か。見間違えやすいし、長いとタイポもあるし…。
次のように --list コマンドライン・オプションを使用してプロパティに指定すべき値を表示し、コピペすれば間違いようがない。
$ xfconf-query -c pointers --list --verbose | grep -i touchpad
/SynPS2_Synaptics_TouchPad/Acceleration 8.000000
/SynPS2_Synaptics_TouchPad/Properties/Device_Enabled 0
/SynPS2_Synaptics_TouchPad/Properties/Synaptics_Circular_Scrolling 0
/SynPS2_Synaptics_TouchPad/Properties/Synaptics_Circular_Scrolling_Trigger 0
/SynPS2_Synaptics_TouchPad/Properties/Synaptics_Edge_Scrolling <<UNSUPPORTED>>
/SynPS2_Synaptics_TouchPad/Properties/Synaptics_Tap_Action <<UNSUPPORTED>>
/SynPS2_Synaptics_TouchPad/Properties/Synaptics_Two-Finger_Scrolling <<UNSUPPORTED>>
/SynPS2_Synaptics_TouchPad/Properties/libinput_Scroll_Method_Enabled <<UNSUPPORTED>>
/SynPS2_Synaptics_TouchPad/Properties/libinput_Tapping_Enabled 1
/SynPS2_Synaptics_TouchPad/RightHanded true
/SynPS2_Synaptics_TouchPad/Threshold 1
$
"Device_Enabled" が入った行からコピーすること。
ちなみに、応用で他の各種設定も変更が可能だ。
加速度を変えたりもできるだろう。
🔶 方法2:xinput を使って ON/OFF する
先の方法はデスクトップ環境が Xfce でない場合には効果がない。
GNOME, KDE, Cinnamon, Mate などでは使用不能だ。…たぶん。
そこで どれでも使える X-Window System 共通の仕組みを利用した方法も試してみることにする。 xinput コマンドを使った方法だ。
事前にソフトウェアマネージャーか apt コマンドを使って xinput パッケージをインストールしておくこと。後者なら以下。
$ sudo apt install xinput
まずは list サブコマンドを用いて一覧を表示しよう。
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ ELECOM ELECOM BlueLED Mouse id=11 [slave pointer (2)]
⎜ ↳ ELECOM ELECOM BlueLED Mouse id=13 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=10 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Fujitsu FUJ02E3 id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Power Button id=8 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=9 [slave keyboard (3)]
↳ ELECOM ELECOM BlueLED Mouse id=12 [slave keyboard (3)]
$
ここでは Elecom 社製のマウスと、PC内蔵タッチパッドがある。
タッチパッドだけを抽出するには、
$ xinput list | grep -i TouchPad
とすればいい。
目的のタッチパッドが認識されているデバイス名がわかったら、それを使って OFF することができる。これには disable サブコマンドを使う。
デバイス名は大抵、空白を含むので ダブルクォーテーション(") で囲ってやること。
$ xinput disable "SynPS/2 Synaptics TouchPad"
有効にするには disable の代わりに enable を使えばいい。
もう一度、 list サブコマンドを実行してみると、無効状態では以下のようになる。
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ ELECOM ELECOM BlueLED Mouse id=11 [slave pointer (2)]
⎜ ↳ ELECOM ELECOM BlueLED Mouse id=13 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Fujitsu FUJ02E3 id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Power Button id=8 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=9 [slave keyboard (3)]
↳ ELECOM ELECOM BlueLED Mouse id=12 [slave keyboard (3)]
∼ SynPS/2 Synaptics TouchPad id=10 [floating slave]
$
先頭に チルダ(~) が付加されてリストの最後に来ている。
これが disable = 無効 な状態。
xinput コマンドを使った場合には先述した xfconf は更新されたりしない。xinput を使ったセッションでのみ、変更が持続される。すなわち、再起動されれば元通りだ。このほうが今回の目的には都合がいい。普段は有効にしておいて、ガッツリ文章を書くときやコマンドラインを実行しているときだけショートカット・キーを押して無効にしたいからだ。そして終わったらまた有効に戻したい。
よって、こちらを採用する。
🔶 スクリプトを作るにあたっての課題
さて、これでタッチパッドを ON/OFF するコマンドラインはわかった。
あとはこれをスクリプトにしてやればいい。
…ただし、ひとつ克服すべき障害がある。
xinput コマンドを使った場合だが、デバイス名の前に ∼ や ↳ などのいらない記号が含まれている。また、後方には id=NN などの今回の用途では不要な情報が含まれる。
$ xinput list | grep -i TouchPad
∼ SynPS/2 Synaptics TouchPad id=10 [floating slave]
$
$ xinput enable "SynPS/2 Synaptics TouchPad"
$ xinput list | grep -i TouchPad
⎜ ↳ SynPS/2 Synaptics TouchPad id=10 [slave pointer (2)]
$
デバイス名である "SynPS/2 Synaptics TouchPad" だけを切り出したいのだが…。これらが邪魔だ。排除することにする。
まず、 --name-only オプションを付加して id=NN 以降の不要な情報を削る。
$ xinput disable "SynPS/2 Synaptics TouchPad"
$ xinput list --name-only | grep -i TouchPad >temp.txt
$ cat temp.txt
∼ SynPS/2 Synaptics TouchPad
$
あとは ∼ を消してやればいい。
…ところが、この ∼。 実は普通の チルダ(~) ではない。
$ cat -A temp.txt
M-bM-^HM-< SynPS/2 Synaptics TouchPad$
$ xxd temp.txt
00000000: e288 bc20 5379 6e50 532f 3220 5379 6e61 ... SynPS/2 Syna
00000010: 7074 6963 7320 546f 7563 6850 6164 0a ptics TouchPad.
$
チルダ(~) に見えるものも、実は単なる ASCII のチルダではなくて、Unicode コードポイント で言う U+223C だ。"TILDE OPERATOR" という数学記号。見た目は同じようだが別の文字。上記のように cat コマンドの -A や xxd (または hexdump)コマンドなどを使うと正体を見破れる。
この結果に含まれる UTF-8 のバイナリ表現 "e288 bc" (またはこのチルダに似た "∼")で以下のサイトを検索すると、 U+223C だと分かるだろう。
【参考】 ∼ - TILDE OPERATOR (U+223C) | unicode.scarfboy.com
https://unicode.scarfboy.com/?s=U%2B223C
📝 MEMO:
文字を与えると、Unicode の詳細情報を表示してくれる有用なサイト。特に他のサイトではなかなか表示されることのない UTF-8 におけるバイナリ表現や、その URLエンコード された値を知ることができるので重宝する。
これの何が問題かというと、普通の チルダ(~) と違うので、誤って普通のチルダを grep や sed コマンドに与えてもヒットしないし、削除もできない点だ。この ∼(U+223C) をコピー&ペーストなどで与えてやればちゃんとヒットする。
$ sed -r 's/^∼ //g' temp.txt
SynPS/2 Synaptics TouchPad
$
"有効" 状態の場合は --name-only を使えば ↳ は含まれないので安心だ。そのまま使用できる。以下、証明。
$ xinput enable "SynPS/2 Synaptics TouchPad"
$ xinput list --name-only | grep -i TouchPad >temp.txt
$ cat -A temp.txt
SynPS/2 Synaptics TouchPad$
$ xxd temp.txt
00000000: 5379 6e50 532f 3220 5379 6e61 7074 6963 SynPS/2 Synaptic
00000010: 7320 546f 7563 6850 6164 0a s TouchPad.
$
これで課題はなんとかなった。これに沿ってスクリプトを作成する。
🔶 完成したスクリプトにショートカット・キーを設定する
こうして作成したスクリプトは以下のようになった。
https://github.com/9hnder/sh/blob/master/ToggleTouchPad.sh
これをダウンロードしておく。WebUI でダウンロードするのがいいが。
git clone したければ以下で。
(※俺ちゃんの気分次第で要らんものが増える可能性があるのでオススメしないゾ☆)
$ git clone https://github.com/9hnder/sh.git
実行するたびに現在の状態から 有効/無効 を反転してくれる。
xinput の他に、デスクトップ通知として libnotify-bin パッケージの notify-send コマンドを使用している。
これは Linux Mint には最初からインストールされている。
他の使い方もちょっとだけ仕込んだ。詳しい使用方法はここでは省略するが、知りたければ端末上で -h オプションを付けて実行すること。
これを PATH の通ったディレクトリへコピーして実行権限を付与しておく。
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$
$ sudo cp -i --preserve=mode,timestamps ~/Download/ToggleTouchPad.sh /usr/local/bin/
[sudo] 9hnder のパスワード:
$
$ ls -l /usr/local/bin/ToggleTouchPad.sh
-rw-r--r-- 1 root root 13K 10月 8 00:26 /usr/local/bin/ToggleTouchPad.sh
$ sudo chmod +x /usr/local/bin/ToggleTouchPad.sh
$
それでは、これにキーボードのショートカット・キーを割り当てておこう。 Linux Mint Xfce エディションでは通常、以下のファイルにキーボード・ショートカットの設定が記載されている。
~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml
この設定ファイルも XML ファイルだ。
以下の DOM 構造を探し、 "custom" プロパティ・タグで囲まれた最後の行に新しいショートカット定義を追加しよう。
-- (snip) --
<channel name="xfce4-keyboard-shortcuts" version="1.0"></dt>
-- (snip) --
<property name="custom" type="empty">
-- (snip) --
追加する内容は以下。
<property name="<Primary><Alt>t" type="string" value="/usr/local/bin/ToggleTouchPad.sh"/>
"Primary" は左の Ctrl キーを表す。後は XML が読める方なら、読めば分かるはず。
これで Ctrl + Alt + T キーを押すと、右上に通知が出てタッチパッドの 有効/無効が反転するようになるはずだ。
が、これは少し押しづらいので、頻繁に利用するようなら変えてもいいかもしれない。
$ xfdesktop -R
で更新すれば完了。
GNOME などの他のデスクトップ環境でも大抵ショートカットを追加・変更できる機能が GUI などにある。探して設定してみてほしい。
以上。
お役に立てれば幸い。
♥️ Have a supercalifragilisticexpialidocious days !!
🔶 おまけ:タッチパッド ON/OFF と言えば synclient じゃね?って質問への回答
本記事公開後、ソッコーで読んでくださった東京都は墨田区にお住まいの 田中(仮)さん より、 「そんなスクリプトわざわざ作らなくても synclient でできたんじゃね?」 的なツッコミをもらったので回答します。
過去には確かに synclient コマンドを使ってタッチパッドを ON/OFF するのが一般的でした。俺ちゃんもよく使っていました。スクリプトも組みました。今でも 「Linux タッチパッド ON OFF」 などのキーワードで検索すると結構「 synclient 使えよ」的なサイトが出てきます。
しかし、多くの場合 synclient コマンドは 今はもう使えなくなっている のです。
以前の X Server/Xorg 環境では、タッチパッド向けに synaptics ドライバー(パッケージ名: xserver-xorg-input-synaptics など)が使われ、その上で synclient コマンドが設定変更用途に使えていました。が、モダンな Linux では入力デバイス(タッチパッド含む)の扱いを統一化・簡略化するために libinput ドライバーが使われるようになっています。 Linux Mint やそれの元となっている Ubuntu でもそうです。このため最近だと synclient コマンドはデフォルトで入っていません。
libinput ドライバーに対応した代替コマンドは xinput であり、本稿で作成したスクリプトはこれを用いています。
【余談】
全然おすすめできませんが、 synclient を使うために古い xserver-xorg-input-synaptics をインストールして Xorg セッションで synaptics ドライバーを有効にすること自体は可能なようです。しかし それは時代の流れに逆らうものであり、現代のハードウェア/ソフトウェア環境では 逆に問題を起こすことが多い のではないかと推測されます。
Linux にも 諸行無常の響きあり… ということですね。









