Androidのウィンドウシステムは、すべてのウィンドウがアプリケーションに対して最大化またはフルスクリーンとして報告される点や、一般的に一度に1つのウィンドウしか表示できない点が特徴的です。大型デバイスでは、最大4つのウィンドウを画面上に同時にタイル状に配置できますが、エミュレータや「デスクトップ」システム向けに設定された環境では、他のデスクトップウィンドウマネージャと同様に、自由にサイズ変更可能なウィンドウがスタックされます。
ウィンドウ、あるいはシステム用語でいう「アクティビティ」は、作成後に無期限に存在するわけではない。システムは、プログラムが内容をディスクに保存し、ユーザーがタスクスイッチャーからそれらのウィンドウを選択した際に復元されるという前提に基づき、メモリを節約するため、表示されていないウィンドウを一時停止させることがある。さらに、Emacsの起動時にオペレーティングシステムによって作成されるウィンドウには特別な扱いが与えられており、Emacsはこれに従うことになっている。
Emacsは、X Windowsなどの一般的なウィンドウシステムにおけるフレームと、Lispからアクセス可能なフレームとの挙動の差異を最小限に抑えるという全般的な目標を掲げてウィンドウ管理を行っています。この目標が実際にどの程度達成されるかは、EmacsがインストールされているAndroidのバージョンで利用可能なウィンドウ管理機能や、非アクティブなウィンドウに対するオペレーティングシステムのポリシーによって異なります。こうしたポリシーに譲歩せざるを得ない場合、Emacsは、表示すべきアクティビティがないフレームを保持するよりも、それを破棄することを優先します。ただし、そのフレームが初期フレームであり、したがって起動時に作成されたアクティビティに表示されている場合は除きます。このようなフレームは、Emacsが実行中である限り、開いて特定することが可能です。
Android 5.0以降では、フレームとそれが表示されているアクティビティが一対一の関係を持つという、正確なウィンドウ管理がサポートされています。これにより、タスクスイッチャーでアクティビティを削除すると該当するフレームに直接影響が及び、その逆も同様となります。例外はわずか2つあります:
Android 4.4以前のバージョンでは、ウィンドウ管理を完全に実装するには不十分な、著しく劣ったインターフェースが提供されています。こうしたシステムにおいて、Emacsはかなり原始的な仕組みを採用しており、初期フレーム以外のすべてのフレームはアクティビティが一時停止した際に削除され、一度に表示できるのは単一のアクティビティ(起動時に作成されたアクティビティを除く)のみとなり、未アタッチのフレームは利用可能な最初の空きアクティビティに表示されます。
Emacs は Android 上で限定的な GUI 機能しかサポートしておらず、その制限内容は以下の通りです。
alpha、alpha-background、z-group、override-redirect、mouse-color、title、wait-for-wm、sticky、およびundecoratedのフレームパラメータ(the Emacs Lisp
Reference ManualのFrame
Parametersを参照)はサポートされていません。
fullscreen
フレームパラメータは常に maximized となりますが、それ以降のバージョンの Android
では fullscreen となる場合もあります。
Emacsは、Android上のX Window
Systemでサポートされている選択関連機能をすべて実装しているわけではありません。例えば、サポートされているのはCLIPBOARDおよびPRIMARYの選択(「グラフィカルディスプレイにおける切り取りと貼り付け」操作を参照)のみであり、Emacsで設定できる選択はプレーンテキストに限られています。
さらに、Androidシステム自体、Emacsがアクセスできる選択データに一定の制限を設けています:
gui-selection-owner-p
関数はクリップボードの選択内容に対して常に nil を返します。
gui-selection-owner-pは常に正確な結果を返します。
gui-selection-owner-p はクリップボードの選択内容に対して常に nil を返します。
Android システム自体にはプライマリ選択という概念がないため、代わりに Emacs がエミュレーションを提供しています。つまり、プライマリ選択の内容をカット&ペーストで別のアプリケーションに転送する方法はありません。
音量キーは通常 Emacs によって予約されており、物理キーボードなしで Emacs を終了させる機能を提供するために使用されます(仮想キーボードを使用した Emacs
の利用を参照)。ただし、代わりに音量調節に使用したい場合は、変数 android-pass-multimedia-buttons-to-system に nil 以外の値を設定できます。その場合、音量ボタンを使って Emacs
を終了させることはできなくなる点に注意してください。また、音量ボタンを押している間、一時的に Emacs
のキーボードフォーカスを失わせる通知シェードやその他のインターフェースを有効にする方が、一般的には簡単です。
Emacsは、Android 6.0以降で入力フォーカスを持っていない間、ダイアログボックス(ダイアログボックスの使用を参照)を表示できません。この点が重要である場合は、Emacsに他のプログラムの上に重ねて表示する権限を付与することで、この機能を復元できます。ほとんどのシステムでは、以下の「設定」メニューからこの操作が可能です。
System -> Apps -> Emacs -> More -> Display over other apps
キーイベント内で報告される物理的な修飾キーとEmacsの修飾子(修飾キーを参照)の間には直接的な関係がありますが、一点だけ例外があります。キーボードのAltが押された場合、Emacsは代わりにMeta修飾子を報告し、その逆も同様です。この不規則性は、ほとんどのキーボードに専用のMetaキーが存在せず、またEmacsでAlt修飾子が用いられることが稀であるためです。
AndroidではSuper修飾子に別の名称が使用されている点にご注意ください。Androidのキーボードや「設定」キーマップメニュー内では、SYMと呼ばれています。
Androidの入力メソッドは、通常は実用的な用途がないC-SPCを含むキーシーケンスを、イベントフィルタリング処理中に密かに破棄することで、ユーザーを苛立たせる傾向がある。デフォルトでは、Emacsはこれらのキーシーケンスが入力メソッドによってフィルタリングされる前に捕捉する。
これが不要である場合(例えば、入力メソッドが C-SPC
を言語切り替え用のショートカットキーとして扱う場合など)は、変数 android-intercept-control-space を nil に設定することで無効化できます。
Androidシステムに搭載されているキーボードベルは、ベルが鳴らされるたびに数ミリ秒間作動する振動素子の形式をとっています。この振動の持続時間は、変数android-keyboard-bell-durationを10から1000までの任意の値に変更することでカスタマイズ可能です。
Androidではディスプレイの色に関する特性を自動的に検出できないため、Emacsがグレースケールまたはモノクロディスプレイの実際の視覚的属性に沿った形でフェイスや画像を実現するには、変数
android-display-planes
を適切な値に設定する必要があります。前者のディスプレイには 8 を、後者には 1
を設定することで、それぞれすべての色を256階調のグレーまたはモノクロでレンダリングするように強制できます。この変数はディスプレイ接続が確立される際に処理されるため、カスタマイズは
early-init.el から行わない限り反映されません(初期初期化ファイルを参照)。
この変数の値は、フォントドライバのアンチエイリアスに影響を与えません。というのも、モノクロディスプレイは依然としてEmacsがアンチエイリアス処理済みのテキストを提供することを想定しており、それがディスプレイドライバによってビットマップデータに処理された後に受信されるためです。