Wayland版GNOME Shellの日本語入力をちょっと改善する拡張機能をつくった
この記事はあくあたん工房 Advent Calendar 2024の22日目の記事です。
現代、コンピューターに日本語の文章を入力するのに連文節変換方式のIMEを使っている人が多数派なのではないでしょうか。私も日常的にMOZCなどの連文節変換エンジンを使っています。
連文節変換方式の場合、ひらがなで入力した文をIMEが自動で区切り、区切られた文節を一つずつ変換していくことになります。そのため、変換対象の文節を選択するときや文節の区切り目を変更したいときのために、フォーカスしている文節をユーザーに知らせる必要があります。多くのIMEでは下線やハイライトをつけることで伝えています。
Wayland版GNOME Shellは今のところこのハイライト表示を実装できていません。そこで、拡張機能を開発して解決しました。
つくった拡張機能
この拡張機能をインストールするとフォーカスしている文節に装飾がつきます。どんな装飾がつくかはアプリの実装次第です。GNOME系のアプリではたいていの場合太字で表示されます。
GNOME Shell Extensions[1]で公開しているので、そちらからインストールできます。
GNOMEの標準テキストエディターのスクリーンショットを比較用にのせておきます。
-
インストール前
-
インストール後
この拡張機能のしくみ
詳細な説明は省きますが、ibusが送ってくる装飾情報をWayland版GNOME Shellが求める形式に変換することで実現しています。[2]
GNOME Shell拡張機能むけにJavaScriptのプロトタイプを書き換えることでGNOME Shellの動作を変えることができるInjectionManagerというクラスが公開されているので、これを使ってIME周りの動作を上書きし、変換機能を追加しています。
【おまけ】GNOME Shell拡張機能の開発について
GNOME Shell拡張機能はデスクトップの動作をかなり書き変えることができる強力なものである一方、情報があまりないことから自分で開発するとなるととっつきにくさを感じるのも事実です。そこで私が拡張機能を開発する上で役に立った情報を紹介します。
GNOME Shell拡張機能の公式ドキュメント
公式ドキュメントに基本的な拡張機能を作るチュートリアルがのっており、まずはここから始めるのがおすすめです。他にもGNOME Shellの構造の解説やデバックのやり方、GNOME Shell Extensionsに投稿する際のレビューガイドラインなど拡張機能の開発で重要な情報が一通り書かれています。
特にデバックのページには、対話的にコードを実行できるJavaScriptコンソールのLookingGlassの使い方が書かれており一読しておくと開発が楽になるでしょう。
また、レビューガイドラインは拡張機能の開発についての一般的な注意事項も記載されているので投稿する予定がない人にもおすすめです。
GNOME Shellのソースコード
https://gitlab.gnome.org/GNOME/gnome-shell
GNOME Shell拡張機能はGNOME Shell自体のコードに追加するというものなので、GNOME Shell自体の知識が必要なのですが、GNOME Shellのコードのドキュメントはほとんど存在しないため、ソースコードを読む必要があります。
全体を読むのは大変すぎるので私は関係ありそうな箇所だけ拾い読みしました。
Gjsのリファレンス
GNOME ShellはGjsというJavaScript実行エンジン上で動いています。そのため、Gjsからアクセスできるライブラリにはアクセスできることが多く、そのときにこのリファレンスが役に立ちます。
実はこれらのライブラリはLooking Glassからアクセスすることができます。例えばIBus
にアクセスしたいときは下記の方法でインポートできます。
IBus = imports.gi.IBus
おわりに
GNOME Shellはカスタマイズ性が低いと言われがちですが、拡張機能を使うことで突然なんでもカスタマイズできるようになるおもしろいデスクトップ環境です。拡張機能を活用してぜひ快適なLinuxデスクトップライフを!
-
GNOME Shell拡張機能の公式配布サイト。ブラウザ拡張機能と必要なパッケージを導入すれば、サイトのUIから拡張機能のインストールやアンインストール、設定等の管理ができます。 ↩︎
-
もう少しだけ詳しい内容を以前書いています。 https://zenn.dev/nishi/articles/why-preedit-styles-do-not-work-on-gnome-wayland ↩︎
Discussion