本指南說明極高層級的事件管線和政策旋鈕,用途是將滑鼠裝置的事件傳送至使用者介面 (UI) 用戶端。如需輸入滑鼠以外的一般輸入總覽,請參閱使用者輸入架構 RFC。
背景
滑鼠裝置通常有動作感應器、多個按鈕及滾輪。雖然有許多變化版本和設定,但本頁僅討論基本概念。
使用者將滑鼠沿著平坦的表面移動時,其實體動作就會用於控制螢幕上的遊標動作。使用者按下按鈕時,其狀態變更 (向下/向上) 會用於在 UI 中進行互動。使用者移動滾輪時,運用其動作帶動 UI 中圖像內容的動態。
通訊協定和事件流程
滑鼠事件從滑鼠裝置開始,並向上移植堆疊,直到抵達 UI 用戶端,進而回應滑鼠事件為止。UI 用戶端通常是在 UI 架構上實作,因此當滑鼠事件達到這個層級時,會以特定架構的方式公開。
裝置
滑鼠裝置會連線至「主機」(您的電腦),並讀取 USB HID 通訊協定。通訊協定詳情請參閱 HID 使用表。針對裝置的 HID 報告,主機會等待中斷狀態。滑鼠會一直開啟,直到出現要向主機回報的內容,例如動作、按鈕按下或捲動為止。
輸入裝置驅動程式
在主機端,Fuchsia 的輸入驅動程式庫堆疊會讀取滑鼠的 HID 報表,並將其轉譯成 FIDL MouseInputReport
。此翻譯能改善 Fuchsia 平台中較高層的人體工學:上層的元件可以處理 FIDL 中的事件,而非 HID 專屬資料格式。
輸入驅動程式庫可讓較高層級的元件透過 Zircon 管道讀取各裝置的報表。每部裝置最初都會顯示為 /dev/class/input-report
中的檔案。
輸入管道
輸入管道程式庫會透過 /dev/class/input-report
目錄中的探索功能,連接至滑鼠裝置。只有平台元件才能存取這項敏感能力。
這個元件提供集中位置,可用於轉送滑鼠事件及實作政策決策。
實體滑鼠動作通常會解讀為遊標動作,而這類動作資料會透過敏感的指標插入器 API 傳送至景觀元件。按鈕事件和滾輪事件也會在同一個插入器管道中移動。
輸入管道會實作下列集中的政策決策:
- 選擇要為滑鼠事件插入指定哪個檢視區塊樹狀結構。
- 定義如何解讀滑鼠的實體動作。舉例來說,您可以設定滑鼠的實體動作,用來控制遊標的移動動作,或設為不控制遊標控制項,則可將滑鼠的實際動作設為相對動作資料回報給 UI 用戶端。
- 定義滑鼠的動作解析度。
- 定義按鈕的優先順序 (主要、次要等)。舉例來說,如果重新排序優先順序,使用者就能將滑鼠的右側按鈕設為主要按鈕。
- 定義滾輪的行進 (每位) 和方向。
一般而言,這些欄位未來可能會延伸,以支援更豐富或更精準地解讀使用者的滑鼠使用意圖。
風景
景觀元件會根據插入器 (輸入管道) 定義的政策,將插入的滑鼠事件轉送至 UI 用戶端。View 會在檢視區塊樹狀結構中執行命中測試,以判斷哪個 UI 用戶端應接收滑鼠事件。
辨識出滑鼠目標時,View 會透過 MouseSource
API 將滑鼠事件分派至該 UI 用戶端。UI 用戶端會監聽具有 hanging-get FIDL 模式的滑鼠事件。
UI 用戶端和 UI 架構
UI 用戶端可以自由使用從 Views 收到的滑鼠事件。可在建立使用者體驗的過程中讀取遊標動作、按鈕事件和捲動事件。
如果將 UI 用戶端實作在 UI 架構 (例如 Flutter 或 Chromium) 之上,架構程式碼就會負責實作面向 Fuchsia 的程式碼來接收滑鼠事件。然後,這些滑鼠事件必須以架構專屬方式向在該架構上方實作的 UI 用戶端顯示。舉例來說,在 Flutter 架構中,滑鼠事件會透過 PointerEvent
Dart 類別向 Flutter 程式顯示。