Ubuntuでデュアルキーボードを使ったときに表示が遅延する件の解決策

世の中にはキーボードを2つ同時に使いたい!という人がいます。私です。

なぜ2つのキーボードを同時に使いたいかと言うと、

  • 普通のキーボードを使うと両手を真ん中に持ってこないといけない
  • この体勢を長く続けるとどうしても背骨が丸まり姿勢が悪くなる
  • 姿勢が悪くなって首、腰、肩などに異常を来す
  • 長年これを続けていると体中がバキバキになる
  • 1年以上首や肩の痛みが取れなくなる
  • 常に体が痛いので精神に異常を来す
  • 精神の錯乱、ないし体中の痛みによって死ぬ

という経過を辿りますが、これを避けるために

  • キーボードが真ん中で別れているタイプの左右分離キーボードを買う
  • 正しい姿勢で胸を張ってタイピングができる
  • しかし世の中の左右分離キーボードはキー数を減らしたものが多く、ファンクションキーを多用する派の人間には使いにくい
  • あと、独学でタイピングに慣れてしまった人にとっては右手で押しているキーが左側にあったり、その逆があったりなどして使いにくい
  • そのためにキーボードを単純に左右に2台並べ、両手でそれぞれのキーボードを打つスタイル、デュアルキーボード使いが誕生する
  • しかしながらこれをUbuntuで使うと謎の遅延が生じる
  • 今回はこれを解決する

という流れになりますね。

ちなみに上記に書いてあることは冗談ではなくてマジです。マジマジョピュアーズです。

発生する現象

2つのキーボードを交互にすばやくタイプすると、入力されたあとのキー表示が遅延します。最後に打ったキーを離してから1秒くらい経たないと画面に文字が表示されません。どのアプリケーションでも発生します。入力されたはずのキーがタイプされていないということはなく、表示だけ遅延します。鬱陶しいです。

現象が発生する条件

  • Xorg(X11)を使用している(Waylandでは発生しない)
  • GNOME (Ubuntu標準セッション)を使用している
  • 英語以外のキーマップを使用している

上記がすべてYESの場合にこの現象が発生します。

Xorgってなに?というのは

$ echo $XDG_SESSION_TYPE

と打ったときに「x11」が出てきたらXorgで動いているということです。まあ現象が出ていてこのページを見ているならばXorgで動いているに違いないと思いますが…

修正方法

Waylandが使えるのならばWaylandを使うことが回避するための第一条件になります。でもまだWaylandは色々動かないものが多いので(特にNVIDIA製GPUを使っている場合)切り替えが難しい場合も多いでしょう。

じゃあどうするか。解決方法を提示してくれた方がいましたので日本語でも紹介したいと思い本記事を書きました。

まず、 この解決策が適用できるのは2つのキーボードのキーマップが同じ場合のみ です。片方が日本語配列、もう片方が英語配列とかになっていると多分おかしくなると思うので注意しましょう。

方法はこちらです。

MappingNotify event freezes drawing windows in Gnome for ~100ms

こちらのスレッドのOlindholmさんが書いてくださっている解決方法です。日本語に訳し補足説明を入れつつ、独自に方法を改変してみますね。

まずaptでソースを取ってこれるようにします。

$ sudo vi /etc/apt/sources.list

viの使いかたがわからない場合はgeditなどに置き換えてください。以下同様。

そしたら上のほうに、deb-srcから始まる行がコメントアウトされています。お使いのUbuntuバージョンのコードネームが後ろの方に各々書かれていますが、その、末尾が「main restricted」となっているやつをコメントアウトしてください。
例えば以下のような感じです。選んでいるミラーサーバーによってホスト名は異なります。

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://ftp.tsukuba.wide.ad.jp/Linux/ubuntu/ impish main restricted
deb-src http://ftp.tsukuba.wide.ad.jp/Linux/ubuntu/ impish main restricted
# deb-src http://jp.archive.ubuntu.com/ubuntu/ impish main restricted

置き換えたら、以下のコマンドを打っていきます。

$ cd ~
$ mkdir mutter
$ cd mutter
$ apt-get source mutter
$ sudo apt-get build-dep mutter
$ cd mutter-xxx (←バージョン番号)
$ vi ./src/backends/x11/meta-backend-x11.c

X
で、

case XkbNewKeyboardNotify:

と書かれている行を見つけてこれを消します。消したら保存します。続いて以下のコマンドを打ちます。

dpkg-buildpackage -rfakeroot -uc -b

ビルドが始まるのでちょっと待ちましょう。

ビルドが終わったら完成したパッケージをインストールしましょう…と書かれていますが、インストールするとUbuntuが配布しているパッケージとは違うパッケージをインストールしたことになるので、なにかのアプリケーションをaptをインストールしようとすると「依存関係が満たされていない」と怒られます。libmutterはwaylandとX11の差異を吸収するための層を提供するライブラリ(たぶん)で、ほとんどのGUIアプリケーションがこれに依存するのでこの依存関係が壊れるのは非常に面倒くさいです。依存関係を無視して無理やりインストールさせることも可能ではありますが、こういうことをやると後々苦労するのが経験的に分かっているのであまりやりたくないですね。

なので、コンパイルして出てきた共有ライブラリファイル(.soファイル)を単純にコピーしてごまかしましょう。

まず、以下のファイルのバックアップを取ってください。

バージョン番号が違う場合は適当に読み替えてください。

/usr/lib/x86_64-linux-gnu/libmutter-8.so.0
/usr/lib/x86_64-linux-gnu/mutter-8/libmutter-clutter-8.so.0.0.0
/usr/lib/x86_64-linux-gnu/mutter-8/libmutter-cogl-8.so.0.0.0
/usr/lib/x86_64-linux-gnu/mutter-8/libmutter-cogl-pango-8.so.0.0.0

ビルドしたファイルは以下にできています。ここもバージョン番号は適宜読み替えてください。

mutter/mutter-40.5/debian/libmutter-8-0/usr/lib/x86_64-linux-gnu/

ビルドしたファイルを /usr/lib/x86_64-linux-gnu//usr/lib/x86_64-linux-gnu/mutter-8/ 下の同名ファイルにそれぞれ上書きコピーしましょう。

Xorgがクラッシュして一瞬画面が真っ暗になったあと、問題が解消しているはずです。解消していなかったら再起動してみてください。

何かが致命的におかしくなったらバックアップを復旧させましょう。多分、手順をちゃんと守れば大丈夫だと思いますが。

アップデートされたら?

libmutterがアップデートされたら上の変更は上書きされて現象が再発すると思われます。そうなったらまたソースを取得してビルドしてファイルを書き直しましょう。多分、そう頻繁にアップデートされるものではないと思いますが。知らんけど。

あんまり頻繁にアップデートされるならば、上記の処理を自動でやるスクリプトを書いてみます。

背景の説明

ソースコードを見ると、新しいキーボードに入力が移った時点でキーマップの切り替え処理が働いており、こいつに時間がかかっているみたいです。両者のキーマップが同一ならばこの切り替え処理は不要なので、単純にこれをスキップしたということですね。

この変更はissueが立てられていますが、mainにはマージされていないようです。他のissueでfixされたと主張されていますが、結局この変更もmainにはマージされていません。それぞれ3年前、2年前に立てられたissueです。つまり、すぐにアップデートが提供され修正されるという雰囲気ではなさそうなので今のところはソースをビルドするしかないでしょう。

Waylandへの移行が進められているので、X11固有の問題まではあんまり手が回っていないのだと思われます。

追記

Ubuntu 22.04 (mutter-42.0)ではこの問題はかなり軽減されましたが、依然として若干引っかるような感じのラグがあります。気になる方は引き続き上記の方法で対処するのが良いと思われます。