[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/pyim 4e2c8ec 1/2: 优化 popup page.
From: |
ELPA Syncer |
Subject: |
[elpa] externals/pyim 4e2c8ec 1/2: 优化 popup page. |
Date: |
Wed, 22 Dec 2021 04:57:34 -0500 (EST) |
branch: externals/pyim
commit 4e2c8ec9b28b6bbc4e5362e8b352e655e2a08156
Author: Feng Shu <tumashu@163.com>
Commit: Feng Shu <tumashu@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)