本指南說明極高層級的事件管線和政策旋鈕,用途是將滑鼠裝置的事件傳送至使用者介面 (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 程式顯示。