Note di progetto

Pomelo 注音輸入法(pomelo-input)

Incluso in Pomelo 0.32 Sono le note tecniche di progetto dello sviluppatore. Per l’uso quotidiano, consulta il manuale.

Per ora le note di progetto sono disponibili solo in cinese tradizionale.

最後更新: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。