Phương thức nhập liệu chung

Cim là viết tắt của Common Input Method (Phương thức nhập liệu chung).

Trong môi trường Linux và BSD, hệ thống phương thức nhập liệu hiện vẫn bị phân mảnh. Các ứng dụng và bộ công cụ GUI phụ thuộc vào những tiêu chuẩn khác nhau như XIM, Gtk-IM, Qt-IM và Wayland-IM, khiến việc tích hợp trở nên phức tạp và thiếu nhất quán.

Cim là phần mềm được thiết kế để thống nhất các giao diện phương thức nhập liệu khác nhau này.

Thay vì gắn phương thức nhập liệu với một bộ công cụ GUI cụ thể, Cim cung cấp một C API độc lập với bộ công cụ, cho phép ứng dụng và framework sử dụng phương thức nhập liệu theo một cách nhất quán.

Giao diện công khai của Cim được thiết kế xoay quanh C ABI ổn định được định nghĩa trong cim.h. Nhờ đó, cùng một ranh giới phương thức nhập liệu có thể được sử dụng trong nhiều môi trường khác nhau:

  • bộ công cụ GUI
  • ứng dụng terminal
  • chương trình console
  • ứng dụng trong môi trường sandbox
  • phần mềm được viết bằng nhiều ngôn ngữ lập trình khác nhau

Nhờ những đặc điểm này, Cim có thể trở thành nền tảng chung cho nhập văn bản trong nhiều môi trường khác nhau.

Kiến trúc

Cim sử dụng kiến trúc plugin.

Ứng dụng có thể sử dụng một trong hai dạng thư viện API công khai của Cim:

libcim.a
libcim.so

libcim.a là dạng static-pic độc lập vị trí và có thể được nhúng vào một mô-đun dùng chung. libcim.so là thư viện dùng chung có thể tái định vị (relocatable). Thư viện tĩnh không PIC không được hỗ trợ.

Phần triển khai phương thức nhập liệu thực tế được cung cấp bởi các mô-đun plugin.

Các đường dẫn dưới đây là ví dụ về cách bố trí plugin. Điều này không có nghĩa là kho mã nguồn công khai hiện tại triển khai hoặc phân phối tất cả các plugin được liệt kê.

/usr/lib/input.d/im-sample.so
/usr/lib/input.d/im-nimf.so
/usr/lib/input.d/im-ibus.so
/usr/lib/input.d/im-uim.so
/usr/lib/input.d/im-fcitx.so

Cây mã nguồn công khai hiện tại có im-libhangul.so làm plugin mẫu native.

Mỗi plugin triển khai API ngữ cảnh nhập liệu Cim được định nghĩa trong cim.h.

Plugin có thể được triển khai theo nhiều cách:

  • Plugin engine native Triển khai trực tiếp một engine IME hoàn chỉnh.

  • Plugin cầu nối framework Kết nối Cim với các framework phương thức nhập liệu hiện có như ibus hoặc fcitx.

  • Plugin dựa trên dịch vụ Giao tiếp với daemon hoặc dịch vụ bên ngoài.

Bất kể cách triển khai, mọi plugin đều xuất một descriptor nhỏ có tên cim_plugin, trong đó cung cấp CimIcVTable mô tả cách tạo và quản lý ngữ cảnh nhập liệu.

Phiên bản ABI công khai hiện tại là 2.1.1. Plugin ghi phiên bản Cim API trong cim_plugin, và Cim sẽ từ chối plugin nếu major version không tương thích. createdestroy của CimIcVTable là bắt buộc. Các callback initfini của plugin là tùy chọn; khi được cung cấp, mỗi lần khởi tạo kết nối với host (host attachment) thành công sẽ có một lần kết thúc tương ứng.

Chọn plugin đang hoạt động

Plugin đang hoạt động được chọn thông qua liên kết tượng trưng sau:

~/.config/cim/plugin

Liên kết này trỏ tới mô-đun plugin cần sử dụng.

Ví dụ:

mkdir -p ~/.config/cim
ln -sf /usr/lib/input.d/im-sample.so ~/.config/cim/plugin

Ví dụ, nếu một plugin cầu nối fcitx đã được triển khai và cài đặt tại đường dẫn bên dưới, có thể chọn nó như sau. Đây chỉ là ví dụ sử dụng và không có nghĩa là kho mã nguồn công khai hiện tại cung cấp im-fcitx.so.

ln -sf /usr/lib/input.d/im-fcitx.so ~/.config/cim/plugin

Cách này tránh phụ thuộc vào biến môi trường, vì biến môi trường có thể không luôn tồn tại tùy theo ngữ cảnh khởi chạy ứng dụng. Nó cũng giúp việc xây dựng công cụ cấu hình đồ họa trở nên dễ dàng hơn.

Trong môi trường kiểm thử hoặc triển khai có kiểm soát, biến môi trường CIM_PLUGIN có thể chỉ định đường dẫn tuyệt đối tới plugin để tạm thời ghi đè liên kết tượng trưng này.

Sử dụng Cim

Sau khi cấu hình, ứng dụng hoặc bộ công cụ GUI chỉ cần gọi API Cim.

Khi CimIcHandle (ngữ cảnh nhập liệu) đầu tiên được tạo, runtime Cim sẽ tải plugin đã chọn, khởi tạo một kết nối với host (host attachment) và chuyển các thao tác phương thức nhập liệu cho plugin đó.

Có thể tạo nhiều ngữ cảnh nhập liệu trong một kết nối với host (host attachment). Sau khi ngữ cảnh cuối cùng bị hủy, Cim sẽ kết thúc kết nối đó và dỡ plugin.

Thiết kế này giữ runtime gọn nhẹ đồng thời cho phép các cách triển khai plugin linh hoạt.

Tích hợp với các bộ công cụ hiện có

Ngay cả khi display server hoặc bộ công cụ GUI không trực tiếp hỗ trợ Cim, vẫn có thể tích hợp thông qua các mô-đun cầu nối.

Dưới đây là ví dụ về biến môi trường dùng trong tích hợp bộ công cụ và hệ thống nhập liệu. Cây mã nguồn công khai hiện tại đã triển khai cầu nối GTK 3 và Qt 6. Thiết lập XIM minh họa một khả năng tích hợp trong tương lai hoặc từ bên ngoài.

QT_IM_MODULE="cim"
GTK_IM_MODULE="cim"
XMODIFIERS="@im=cim"

Dưới đây là ví dụ về đường dẫn cài đặt cho các mô-đun cầu nối. Cầu nối thực sự được triển khai trong cây mã nguồn công khai hiện tại là GTK 3 và Qt 6. Các đường dẫn GTK 2, GTK 4 và Qt 5 chỉ minh họa khả năng mở rộng và không có nghĩa là chúng hiện đã được triển khai.

/usr/local/lib/gtk-4.0/4.0.0/immodules/libim-cim-gtk4.so
/usr/local/lib/gtk-2.0/2.10.0/immodules/im-cim-gtk2.so
/usr/local/lib/gtk-3.0/3.0.0/immodules/im-cim-gtk3.so
/usr/local/lib/qt5/plugins/platforminputcontexts/libqt5im-cim.so
/usr/local/lib/qt6/plugins/platforminputcontexts/libqt6im-cim.so

Các mô-đun cầu nối này cho phép ứng dụng hiện có sử dụng Cim mà không cần sửa mã ứng dụng.

Trong cấu hình static-pic mặc định, các mô-đun cầu nối GTK 3 và Qt 6 hiện tại nhúng libcim.a và giữ các symbol của runtime Cim được nhúng ở trạng thái riêng tư đối với tiến trình xung quanh.

Hệ thống nhập liệu dựa trên daemon

Một số hệ thống nhập liệu như XIM hoặc phương thức nhập liệu Wayland yêu cầu giao tiếp liên tiến trình.

Trong các môi trường này, Cim có thể sử dụng kiến trúc dạng daemon như dưới đây. Tuy nhiên, binary cimd và các đường dẫn plugin daemon bên dưới chỉ là ví dụ kiến trúc và chưa được triển khai trong cây mã nguồn công khai hiện tại.

/usr/local/bin/cimd

Ví dụ plugin daemon:

/usr/local/lib/cimd/plugins/cim-xim.so
/usr/local/lib/cimd/plugins/cim-wayland.so

Nếu được triển khai, các thành phần này có thể chuyển đổi sự kiện nhập XIM hoặc Wayland thành lời gọi API Cim.

Lợi ích cho nhà phát triển phương thức nhập liệu

Cim giúp giảm đáng kể gánh nặng tích hợp cho nhà phát triển IME.

Theo cách truyền thống, phương thức nhập liệu phải triển khai mô-đun riêng cho từng môi trường:

  • Gtk-IM
  • Qt-IM
  • XIM
  • Wayland-IM

Cim được thiết kế để sử dụng API ngữ cảnh nhập liệu Cim làm ranh giới chung, nhờ đó cùng một phần triển khai phương thức nhập liệu có thể được tái sử dụng qua các lớp tích hợp dành riêng cho từng môi trường. Cây mã nguồn công khai hiện tại đã triển khai cầu nối GTK 3 và Qt 6; các tích hợp GTK 2, GTK 4, Qt 5, XIM và Wayland hiện chưa được triển khai đầy đủ.

Một ưu điểm quan trọng khác là chi phí tích hợp thấp (low-friction integration).

Nhiều thư viện IME hiện có như libhangul, librime, libanthy và libpinyin đã cung cấp logic nhập liệu cốt lõi. Trong những trường hợp này, có thể triển khai plugin Cim chỉ với một lớp thích nghi nhỏ để đưa chức năng hiện có ra ngoài thông qua CimIcVTable.

Ngay cả khi dự án upstream không trực tiếp bổ sung hỗ trợ Cim, vẫn có thể triển khai một plugin cầu nối độc lập bên ngoài với lượng mã tương đối nhỏ.

Nhờ tính linh hoạt này, Cim có thể tích hợp với hệ sinh thái phương thức nhập liệu hiện có mà không cần thay đổi kiến trúc lớn.

Tóm tắt

Cim cung cấp:

  • API phương thức nhập liệu độc lập với bộ công cụ
  • kiến trúc plugin đơn giản
  • C ABI ổn định có phiên bản rõ ràng
  • chi phí tích hợp thấp cho các phần triển khai IME hiện có
  • kiến trúc để tương thích với các framework phương thức nhập liệu hiện có thông qua mô-đun cầu nối
    • Cây mã nguồn công khai hiện tại đã triển khai cầu nối GTK 3 và Qt 6.
    • Các cầu nối khác và tích hợp dựa trên daemon hiện chưa được triển khai đầy đủ.

Bằng cách tách API phương thức nhập liệu khỏi bộ công cụ GUI và display server, Cim tạo điều kiện cho một môi trường nhập văn bản nhất quán và có tính di động cao hơn trên Linux và BSD.

Hỗ trợ kỹ thuật Cim / 1 năm

Hỗ trợ email 24/7 $ 30

Tải xuống

Cim được phân phối dưới dạng mã nguồn.

Mã nguồn mới nhất — kho GitHub công khai