Notes de conception

Pomelo 注音輸入法(pomelo-input)

Fourni avec Pomelo 0.32 Ce sont les notes techniques du développeur. Pour l’usage courant, consultez le manuel.

Les notes de conception ne sont pour l’instant disponibles qu’en chinois traditionnel.

最後更新:2026-10-19

為什麼自己寫

Pomelo 之前靠 fcitx5 或 ibus 打中文。在乾淨的 Pomelo 上實測它們要多裝的東西:

方案 多裝的套件 多佔空間 常駐記憶體
fcitx5 + 新酷音(不裝建議套件) 49 個 約 37 MB 約 30 MB
ibus + 新酷音 79 個 約 235 MB(帶進 GTK、Python) 兩個行程約 28 MB
pomelo-input 5 個 約 4 MB 約 6 MB

多出來的 37 MB 是 hunspell、enchant、pango、gdk-pixbuf、wayland 這些跟注音無關的東西。

怎麼做的

  • 注音→國字由 libchewing(新酷音引擎,Ubuntu 24.04 是 0.6)負責:音節、智慧選詞、使用者詞庫、 標準/許氏/倚天/拼音等鍵盤。我們只做「鍵盤事件進來、字送出去、畫選字列」。
  • 程式之間的溝通走 XIM 協定,協定本身用 libxcb-imdkit(fcitx5 自己的 XIM 前端也是用它)。 pomelo-input 是一個 XIM 伺服器,在 root 的 XIM_SERVERS 登記成 @server=pomelo; 程式只要環境變數 XMODIFIERS=@im=pomelo(GTK 程式再加 GTK_IM_MODULE=xim),pomelo-session 會設好。
  • 不登記觸發鍵:所有按鍵都轉到伺服器,由我們決定吃掉還是原樣轉回去(放開鍵一律轉回)。 中/英是全域狀態,寫在 root 的 _POMELO_INPUT_MODE(zh/en),選單列右側據此畫「注/英」, 點它或執行 pomelo-input --toggle(改 root 屬性 _POMELO_INPUT_TOGGLE)就切換。
  • 選字列是自己用 cairo-xcb 畫的 override-redirect 小視窗,跟著 XNSpotLocation 走(程式沒給游標位置時放在 視窗左下);第一行是組字區(已轉好的字+強調色的注音+游標),第二行是候選字(1–9,第一個反白,右邊頁數), 可以用滑鼠點。深色模式與強調色跟系統設定走,設定改了會即時套用。
  • 操作:Shift 輕點(400 ms 內沒按別的鍵)或 Ctrl+Space 切中/英;切到英文時先把組字區送出; Shift+Space 全形/半形;空白鍵/↓ 開候選字,1–9 選字,Enter 在候選字開著時選第一個、否則送出; Esc 清掉;←→ 移游標、Shift+←→ 選詞範圍、Ctrl+數字 加詞(都是 libchewing 的標準行為)。
  • 每個輸入環境(IC)一個 ChewingContext,詞庫是 mmap 共用的;程式關掉時一起釋放。
  • 設定(系統設定 → 語言與輸入法 → 輸入法框架「Pomelo 注音(內建)」):input.kb(KB_DEFAULT/KB_HSU/KB_ET…)、 input.space_select、input.shift_toggle、input.cand_per_page。input.framework=auto 時有裝 pomelo-input 就優先用它。

限制

  • Qt 程式打不了中文(VLC、VirtualBox、qBittorrent…):Qt5/Qt6 沒有 XIM 支援,只認 ibus 與 fcitx 的外掛。 要在這些程式打中文請把框架改成 Fcitx 5(第二階段可以考慮實作 fcitx5 的 D-Bus 介面,讓 fcitx5-frontend-qt5 接過來)。
  • GTK4 程式沒有 XIM 模組;Firefox、Chrome、Electron(VS Code)、LibreOffice 都是 GTK3,沒問題。snap 版 Firefox 待實機驗證。
  • 只有注音;倉頡、日文等其他輸入法仍走 Fcitx 5/IBus(設定頁會提示)。
  • GTK 程式用的是「over-the-spot」:組字區顯示在我們的小視窗裡,不是直接嵌在程式的文字裡 (XIM 的 preedit callback 之後可以補)。

測試

  • scratchpad/imetest.sh:啟動伺服器,用 pomelo-edit 打「su3cl3」→ 你好、↓ 候選字、Enter 送出、Shift 切英文。
  • scratchpad/gtk3test.py:PyGObject 的 GTK3 Entry,驗證 GTK 的 xim 模組路徑(Enter 會印出內容)。 在 Xvfb 上跑 GTK 程式要加 NO_AT_BRIDGE=1,不然會等 AT-SPI 等很久。
  • POMELO_INPUT_DEBUG=1 會把每個 XIM 封包與按鍵決定印到 stderr。