Androidのウィンドウシステムはすべてのウィンドウが最大化あるいはフルスクリーンとしてアプリケーションに報告され、一般的には一度に1つのウィンドウだけが表示できる特殊なシステムです。より大画面のデバイスではシステムが許容すれば画面に同時に4つまでのウィンドウをタイル表示できますが、エミュレータや“デスクトップ”システム向けのインストール構成では他のウィンドウマネージャーが行うように自由にリサイズ可能なウィンドウを重ねることができます。
ウィンドウ(システムの命名法にしたがえばアクティビティ)は作成された後に無限に存在する訳ではありません。ユーザーがタスク切り替えからそのウィンドウを選択した際にリストアするために、プログラムはコンテンツをディスクに保存しているという仮定の下に、メモリーを節約のためにシステムが不可視のウィンドウの一時停止を選択するかもしれないからです。さらにEmacsの起動時にオペレーティングシステムによって特別な処理が施されたウィンドウが作成されて、Emacsはそのウィンドウを採用することを期待されるのです。
EmacsはXウィンドウズのような通常のウィンドウシステム上のフレームと、Lispに公開されているフレームとの間にある挙動の違いを最小限にするという一般的な目的の下にウィンドウ管理に取り組んでいます。この目標にたいする実際の達成度合いは、インストールされているAndroidのバージョンにおけるウィンドウ管理機能の可用性、および非アクティブなウィンドウにたいするオペレーティングシステムのポリシーによって大きく異なります。そのようなポリシーにたいして譲歩せざるを得ないのなら、そのようなフレームが初期フレーム、つまり起動時に作成されたアクティビティが表示した、Emacsが実行されているかぎりはオープンして識別が可能なフレームである場合を除き、表示するアクティビティをもたないフレームの維持よりも、フレームの破棄を選びます。
Android 5.0以降ではフレームとフレームが表示中のアクティビティとの間で1対1の関連を保持するウィンドウ管理の正確な実装がサポートされており、タスク切り替えによるアクティビティの削除によって関連するフレームに直接効果を及ぼしたり、その逆も可能です。例外は2つだけです:
Android 4.4以前ではウィンドウ管理の完全な実装には不十分な、かなり劣ったインターフェイスが提供されています。そのようなシステムでは代用として、アクティビティが一時停止されると初期フレーム以外のすべてのフレームが削除される、同時に可視になれるのは(起動時に作成されたアクティビティを除いて)ただ1つのアクティビティのみ、アタッチされていないフレームは利用可能な最初の空きアクティビティに表示されるという、かなり原始的なメカニズムをEmacsは使用します。
AndroidでEmacsがサポートするGUI機能は、以下のように限定されたサブセットだけです:
alpha
、alpha-background
、z-group
、override-redirect
、mouse-color
、title
、wait-for-wm
、sticky
、undecorated
はサポートしない(Frame
Parameters in the Emacs Lisp Reference Manualを参照)。
fullscreen
は常にmaximized
(それより後のAndroidではfullscreen
も可)。
EmacsはAndroid上のXウィンドウシステムでサポートされている選択(selection)に関連する機能すべてを実装していません。たとえばサポートされているのは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から一時的にフォーカスを奪う通知シェードや他のインターフェイスをアクティブにするほうが一般的には容易だということに注意してください。
Android 6.0以降では入力フォーカスがEmacsにない間は、ダイアログボックス(ダイアログボックスの使用を参照)を表示できません。この点があなたにとって重要なら、他のプログラム上に表示できる権限をEmacsに付与して、この機能を復元できます。ほとんどのシステムでは以下の設定メニューからこれを行うことができます:
System -> Apps -> Emacs -> More -> Display over other apps
物理的な修飾キーととキーイベントにより報告されるEmacsの修飾子には直接的な関係があります。1つ例外がありキーボードで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に期待するモノクロディスプレイでは、ディスプレイドライバーがビットマップデータに処理した後に受信します。