diff --git a/zero-pinyin-service.el b/zero-pinyin-service.el index 926a01f75816814e6502b517844f7913dde13690..e6496393818ea94be620e118aea35c0fae7babc6 100644 --- a/zero-pinyin-service.el +++ b/zero-pinyin-service.el @@ -51,6 +51,31 @@ fetch-size try to fetch this many candidates or more" (zero-pinyin-service-async-call "GetCandidates" get-candidates-complete :string preedit-str :uint32 fetch-size)) +(defun zero-pinyin-candidate-pinyin-indices-to-dbus-format (candidate_pinyin_indices) + (let (result) + (push :array result) + ;; (push :signature result) + ;; (push "(ii)" result) + (dolist (pypair candidate_pinyin_indices) + (push (list :struct :int32 (first pypair) :int32 (second pypair)) result)) + (reverse result))) + +(ert-deftest zero-pinyin-candidate-pinyin-indices-to-dbus-format () + (should (equal (zero-pinyin-candidate-pinyin-indices-to-dbus-format '((22 31))) + '(:array (:struct :int32 22 :int32 31)))) + (should (equal (zero-pinyin-candidate-pinyin-indices-to-dbus-format + '((17 46) (7 55))) + '(:array (:struct :int32 17 :int32 46) + (:struct :int32 7 :int32 55))))) + +(defun zero-pinyin-service-commit-candidate-async (candidate candidate_pinyin_indices) + "commit candidate asynchronously" + ;; don't care about the result, so no callback. + (zero-pinyin-service-async-call + "CommitCandidate" nil + :string candidate + (zero-pinyin-candidate-pinyin-indices-to-dbus-format candidate_pinyin_indices))) + (defun zero-pinyin-service-delete-candidates-async (candidate delete-candidate-complete) "delete candidate asynchronously" (zero-pinyin-service-async-call @@ -65,19 +90,24 @@ fetch-size try to fetch this many candidates or more" ;;================ (ert-deftest zero-pinyin-service-get-candidates () - (destructuring-bind (cs ls) (zero-pinyin-service-get-candidates "liyifeng" 1) + (destructuring-bind (cs ls &rest rest) + (zero-pinyin-service-get-candidates "liyifeng" 1) (should (equal (first cs) "李易峰")) (should (= (first ls) 8))) - (destructuring-bind (cs ls) (zero-pinyin-service-get-candidates "wenti" 1) + (destructuring-bind (cs ls &rest rest) + (zero-pinyin-service-get-candidates "wenti" 1) (should (equal (first cs) "问题")) (should (= (first ls) 5))) - (destructuring-bind (cs ls) (zero-pinyin-service-get-candidates "meiyou" 1) + (destructuring-bind (cs ls &rest rest) + (zero-pinyin-service-get-candidates "meiyou" 1) (should (equal (first cs) "没有")) (should (= (first ls) 6))) - (destructuring-bind (cs ls) (zero-pinyin-service-get-candidates "shi" 1) + (destructuring-bind (cs ls &rest rest) + (zero-pinyin-service-get-candidates "shi" 1) (should (equal (first cs) "是")) (should (= (first ls) 3))) - (destructuring-bind (cs ls) (zero-pinyin-service-get-candidates "de" 1) + (destructuring-bind (cs ls &rest rest) + (zero-pinyin-service-get-candidates "de" 1) (should (equal (first cs) "的")) (should (= (first ls) 2)))) diff --git a/zero-pinyin.el b/zero-pinyin.el index 3b4b6767438fc41893f606a048c08a7cd3f362ee..22f74a00e654bd8bcadf9193cd4b3ba3e4add76f 100644 --- a/zero-pinyin.el +++ b/zero-pinyin.el @@ -22,8 +22,12 @@ (defvar zero-pinyin-used-preedit-str-lengths nil "accompany `zero-candidates', marks how many preedit-str chars are used for each candidate") +(defvar zero-pinyin-candidates-pinyin-indices nil + "store GetCandidates dbus method candidates_pinyin_indices field") (defvar zero-pinyin-pending-str "") (defvar zero-pinyin-pending-preedit-str "") +(defvar zero-pinyin-pending-pinyin-indices nil + "stores `zero-pinyin-pending-str' corresponds pinyin indices") ;;===================== ;; key logic functions @@ -65,6 +69,7 @@ (let ((result (zero-pinyin-service-get-candidates preedit-str fetch-size))) (setq zero-fetch-size (max fetch-size (length (first result)))) (setq zero-pinyin-used-preedit-str-lengths (second result)) + (setq zero-pinyin-candidates-pinyin-indices (third result)) (first result)))) (defun zero-pinyin-build-candidates-async (preedit-str fetch-size complete-func) @@ -73,8 +78,9 @@ (zero-pinyin-service-get-candidates-async preedit-str fetch-size - (lambda (candidates matched_preedit_str_lengths) + (lambda (candidates matched_preedit_str_lengths candidates_pinyin_indices) (setq zero-pinyin-used-preedit-str-lengths matched_preedit_str_lengths) + (setq zero-pinyin-candidates-pinyin-indices candidates_pinyin_indices) (setq zero-fetch-size (max fetch-size (length candidates))) ;; Note: with dynamic binding, this command result in (void-variable ;; complete-func) error. @@ -104,12 +110,13 @@ (defun zero-pinyin-commit-nth-candidate (n) "commit nth candidate and return true if it exists, otherwise, return false" - (let* ((candidate (nth n (zero-candidates-on-page zero-candidates))) + (let* ((n-prime (+ n (* zero-candidates-per-page zero-current-page))) + (candidate (nth n-prime zero-candidates)) (used-len (when candidate - (nth (+ n (* zero-candidates-per-page zero-current-page)) zero-pinyin-used-preedit-str-lengths)))) + (nth n-prime zero-pinyin-used-preedit-str-lengths)))) (when candidate (zero-debug - "zero-pinyin-commit-nth-candidate n=%s candidate=%s used-len=%s zero-pinyin-pending-preedit-str=%S\n" + "zero-pinyin-commit-nth-candidate\n n=%s candidate=%s used-len=%s zero-pinyin-pending-preedit-str=%S\n" n candidate used-len zero-pinyin-pending-preedit-str) (cond ((null zero-pinyin-state) @@ -118,11 +125,16 @@ (zero-debug "commit in full\n") (zero-set-state *zero-state-im-waiting-input*) (zero-commit-text candidate) + (zero-pinyin-service-commit-candidate-async + candidate + (nth n-prime zero-pinyin-candidates-pinyin-indices)) t) (zero-debug "partial commit, in partial commit mode now.\n") (setq zero-pinyin-state *zero-pinyin-state-im-partial-commit*) (setq zero-pinyin-pending-str candidate) (setq zero-pinyin-pending-preedit-str (substring zero-preedit-str used-len)) + (setq zero-pinyin-pending-pinyin-indices + (nth n-prime zero-pinyin-candidates-pinyin-indices)) (zero-pinyin-pending-preedit-str-changed) t)) ((eq zero-pinyin-state *zero-pinyin-state-im-partial-commit*) @@ -132,10 +144,20 @@ (setq zero-pinyin-state nil) (zero-set-state *zero-state-im-waiting-input*) (zero-commit-text (concat zero-pinyin-pending-str candidate)) + (zero-pinyin-service-commit-candidate-async + (concat zero-pinyin-pending-str candidate) + (append zero-pinyin-pending-pinyin-indices + (nth n-prime zero-pinyin-candidates-pinyin-indices))) t) (zero-debug "continue partial commit\n") (setq zero-pinyin-pending-str (concat zero-pinyin-pending-str candidate)) (setq zero-pinyin-pending-preedit-str (substring zero-pinyin-pending-preedit-str used-len)) + (setq zero-pinyin-pending-pinyin-indices + (append zero-pinyin-pending-pinyin-indices + (nth n-prime zero-pinyin-candidates-pinyin-indices))) + (zero-pinyin-service-commit-candidate-async + zero-pinyin-pending-str + zero-pinyin-pending-pinyin-indices) (zero-pinyin-pending-preedit-str-changed) t)) (t (error "Unexpected zero-pinyin-state: %s" zero-pinyin-state))))))