emacs-elpa-diffs
[Top][All Lists]
Advanced

[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)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]