branch: externals/pyim commit 4e2c8ec9b28b6bbc4e5362e8b352e655e2a08156 Author: Feng Shu <tuma...@163.com> Commit: Feng Shu <tuma...@163.com>
优化 popup page. * pyim-process.el (pyim-process-run-async): Update. * pyim-page.el (pyim-page-refresh-run-async-p): New variable. (pyim-page-tooltip-show): Use pyim-popup-show. (pyim-popup-show-last-info): New variable. (pyim-popup-show): New function. --- pyim-page.el | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++- pyim-process.el | 6 +++--- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/pyim-page.el b/pyim-page.el index 08dabca..beafd87 100644 --- a/pyim-page.el +++ b/pyim-page.el @@ -104,6 +104,9 @@ Only useful when use posframe.") (defvar pyim-page-tooltip-posframe-buffer " *pyim-page-tooltip-posframe-buffer*" "这个变量用来保存做为 page tooltip 的 posframe 的 buffer.") +(defvar pyim-page-refresh-run-async-p nil + "在异步获取词条的时候,PYIM 会将这个变量设置为 t.") + (defun pyim-page-current-page () "计算当前选择的词条在第几页面. @@ -489,7 +492,7 @@ page 的概念,比如,上面的 “nihao” 的 *待选词列表* 就可以 :border-color (face-attribute 'pyim-page-border :background))) ((and (eq tooltip 'popup) (functionp 'popup-tip)) - (popup-tip string :point position :margin 1)) + (pyim-popup-show :string string :position position)) (t (let ((max-mini-window-height (+ pyim-page-length 2))) (message string)))))) @@ -509,6 +512,52 @@ minibuffer 原来显示的信息和 pyim 选词框整合在一起显示 (setq quit-flag nil) (pyim-add-unread-command-events 7 t)))) +(declare-function 'popup-create "popup") +(declare-function 'popup-width "popup") +(declare-function 'popup-fill-string "popup") +(declare-function 'popup-set-list "popup") +(declare-function 'popup-delete "popup") +(declare-function 'popup-live-p "popup") + +(defvar pyim-popup-show-last-info nil + "保存上一次运行 `pyim-popup-show' 时的一些信息.") + +(cl-defun pyim-popup-show (&key string position) + "Show STRING at POSITION with the help of popup-el." + ;; 如果上次的 page 还在显示,string 和 position 没有变化时,就不做任何事,这样 + ;; 可以减少闪烁。 + (unless (and (popup-live-p (plist-get pyim-popup-show-last-info :popup)) + (equal (plist-get pyim-popup-show-last-info :string) string) + (equal (plist-get pyim-popup-show-last-info :position) position)) + (let* ((width-and-lines (popup-fill-string string)) + (width (car width-and-lines)) + (lines (cdr width-and-lines)) + (last-popup (plist-get pyim-popup-show-last-info :popup)) + popup) + ;; FIXME: 不知道什么原因,异步获取词条并刷新 page 时,popup 会生成两个 + ;; page, 所以这里先删除上次创建的,这样处理会带来闪烁问题,不过通过缓存等 + ;; 一些手段,可以降低闪烁频率。 + (when (and pyim-page-refresh-run-async-p + (popup-live-p last-popup)) + (popup-delete last-popup)) + (setq popup (popup-create position width 15 + :around t + :margin-left 1 + :margin-right 1 + :face 'pyim-page)) + (setq pyim-popup-show-last-info + (list :popup popup + :string string + :position position)) + (unwind-protect + (when (> (popup-width popup) 0) + (popup-set-list popup lines) + (popup-draw popup) + (clear-this-command-keys) + (push (read-event nil) unread-command-events) + t) + (popup-delete popup))))) + (defun pyim-page-hide () "Hide pyim page." (when (and (eq pyim-page-tooltip 'posframe) diff --git a/pyim-process.el b/pyim-process.el index 481c97f..95be87b 100644 --- a/pyim-process.el +++ b/pyim-process.el @@ -322,9 +322,9 @@ (defun pyim-process-run-async () "Function used by `pyim-process-run-async-timer'" ;; NEED HELP: 目前只有 posframe 和 minibufer 两种 page 可以用于异步处理。 - (when (and (member pyim-page-tooltip '(posframe minibuffer)) - (not (eq (selected-window) (minibuffer-window)))) - (let* ((scheme-name (pyim-scheme-name)) + (unless (equal (selected-window) (minibuffer-window)) + (let* ((pyim-page-refresh-run-async-p t) + (scheme-name (pyim-scheme-name)) (words (delete-dups (pyim-candidates-create pyim-imobjs scheme-name t)))) (when words (setq pyim-candidates words)