diff options
| author | Feng Shu | 2021-11-09 04:52:59 +0100 |
|---|---|---|
| committer | Lars Ingebrigtsen | 2021-11-09 04:52:59 +0100 |
| commit | 06fb81922d99eef8e99fb52b37c8dbb6dffa5138 (patch) | |
| tree | ad250ecf07752b9d2ec35a264e42a33b59923f3e | |
| parent | 358b8d0361c8152026aeb263f0d0fc29d76d2362 (diff) | |
| download | emacs-06fb81922d99eef8e99fb52b37c8dbb6dffa5138.tar.gz emacs-06fb81922d99eef8e99fb52b37c8dbb6dffa5138.zip | |
xwidget.el: limit buffer-name flicker in mode-line
* lisp/xwidget.el (xwidget-webkit): New customization group.
(xwidget-webkit-buffer-name-prefix): New user option.
(xwidget-webkit-callback): with-current-buffer only after get title,
which can limit buffer-name change in mode-line.
(xwidget-webkit-new-session, xwidget-webkit-import-widget): Use
current buffer to generate a temp xwidget-webkit buffer.
| -rw-r--r-- | etc/NEWS | 4 | ||||
| -rw-r--r-- | lisp/xwidget.el | 96 |
2 files changed, 68 insertions, 32 deletions
| @@ -504,6 +504,10 @@ This is a convenience function to extract the field data from | |||
| 504 | 504 | ||
| 505 | ** Xwidgets | 505 | ** Xwidgets |
| 506 | 506 | ||
| 507 | --- | ||
| 508 | *** New user option 'xwidget-webkit-buffer-name-prefix'. | ||
| 509 | This allows the user to change the webkit buffer names. | ||
| 510 | |||
| 507 | +++ | 511 | +++ |
| 508 | *** New minor mode 'xwidget-webkit-edit-mode'. | 512 | *** New minor mode 'xwidget-webkit-edit-mode'. |
| 509 | When this mode is enabled, self-inserting characters and other common | 513 | When this mode is enabled, self-inserting characters and other common |
diff --git a/lisp/xwidget.el b/lisp/xwidget.el index 1d91e863e42..91d02e8fcea 100644 --- a/lisp/xwidget.el +++ b/lisp/xwidget.el | |||
| @@ -89,6 +89,17 @@ This returns the result of `make-xwidget'." | |||
| 89 | (require 'seq) | 89 | (require 'seq) |
| 90 | (require 'url-handlers) | 90 | (require 'url-handlers) |
| 91 | 91 | ||
| 92 | (defgroup xwidget-webkit nil | ||
| 93 | "Displaying webkit xwidgets in Emacs buffers." | ||
| 94 | :version "29.1" | ||
| 95 | :group 'web | ||
| 96 | :prefix "xwidget-webkit-") | ||
| 97 | |||
| 98 | (defcustom xwidget-webkit-buffer-name-prefix "* xwidget-webkit: " | ||
| 99 | "Buffer name prefix used by `xwidget-webkit' buffers." | ||
| 100 | :type 'string | ||
| 101 | :version "29.1") | ||
| 102 | |||
| 92 | (defvar-local xwidget-webkit--title "" | 103 | (defvar-local xwidget-webkit--title "" |
| 93 | "The title of the WebKit widget, used for the header line.") | 104 | "The title of the WebKit widget, used for the header line.") |
| 94 | 105 | ||
| @@ -345,32 +356,39 @@ XWIDGET instance, XWIDGET-EVENT-TYPE depends on the originating xwidget." | |||
| 345 | (if (not (buffer-live-p (xwidget-buffer xwidget))) | 356 | (if (not (buffer-live-p (xwidget-buffer xwidget))) |
| 346 | (xwidget-log | 357 | (xwidget-log |
| 347 | "error: callback called for xwidget with dead buffer") | 358 | "error: callback called for xwidget with dead buffer") |
| 348 | (with-current-buffer (xwidget-buffer xwidget) | 359 | (cond ((eq xwidget-event-type 'load-changed) |
| 349 | (cond ((eq xwidget-event-type 'load-changed) | 360 | (let ((title (xwidget-webkit-title xwidget))) |
| 350 | (let ((title (xwidget-webkit-title xwidget))) | 361 | ;; This funciton will be called multi times, so only |
| 351 | (setq xwidget-webkit--title title) | 362 | ;; change buffer name when get a valid title. this can |
| 352 | (force-mode-line-update) | 363 | ;; limit buffer-name flicker in mode-line. |
| 353 | (xwidget-log "webkit finished loading: %s" title) | 364 | (when (> (length title) 0) |
| 354 | ;; Do not adjust webkit size to window here, the selected window | 365 | (with-current-buffer (xwidget-buffer xwidget) |
| 355 | ;; can be the mini-buffer window unwantedly. | 366 | (setq xwidget-webkit--title title) |
| 356 | (rename-buffer (format "*xwidget webkit: %s *" title) t))) | 367 | (force-mode-line-update) |
| 357 | ((eq xwidget-event-type 'decide-policy) | 368 | (xwidget-log "webkit finished loading: %s" title) |
| 358 | (let ((strarg (nth 3 last-input-event))) | 369 | ;; Do not adjust webkit size to window here, the |
| 359 | (if (string-match ".*#\\(.*\\)" strarg) | 370 | ;; selected window can be the mini-buffer window |
| 360 | (xwidget-webkit-show-id-or-named-element | 371 | ;; unwantedly. |
| 361 | xwidget | 372 | (rename-buffer (concat xwidget-webkit-buffer-name-prefix |
| 362 | (match-string 1 strarg))))) | 373 | title) |
| 363 | ;; TODO: Response handling other than download. | 374 | t))))) |
| 364 | ((eq xwidget-event-type 'download-callback) | 375 | ((eq xwidget-event-type 'decide-policy) |
| 365 | (let ((url (nth 3 last-input-event)) | 376 | (let ((strarg (nth 3 last-input-event))) |
| 366 | (mime-type (nth 4 last-input-event)) | 377 | (if (string-match ".*#\\(.*\\)" strarg) |
| 367 | (file-name (nth 5 last-input-event))) | 378 | (xwidget-webkit-show-id-or-named-element |
| 368 | (xwidget-webkit-save-as-file url mime-type file-name))) | 379 | xwidget |
| 369 | ((eq xwidget-event-type 'javascript-callback) | 380 | (match-string 1 strarg))))) |
| 370 | (let ((proc (nth 3 last-input-event)) | 381 | ;; TODO: Response handling other than download. |
| 371 | (arg (nth 4 last-input-event))) | 382 | ((eq xwidget-event-type 'download-callback) |
| 372 | (funcall proc arg))) | 383 | (let ((url (nth 3 last-input-event)) |
| 373 | (t (xwidget-log "unhandled event:%s" xwidget-event-type)))))) | 384 | (mime-type (nth 4 last-input-event)) |
| 385 | (file-name (nth 5 last-input-event))) | ||
| 386 | (xwidget-webkit-save-as-file url mime-type file-name))) | ||
| 387 | ((eq xwidget-event-type 'javascript-callback) | ||
| 388 | (let ((proc (nth 3 last-input-event)) | ||
| 389 | (arg (nth 4 last-input-event))) | ||
| 390 | (funcall proc arg))) | ||
| 391 | (t (xwidget-log "unhandled event:%s" xwidget-event-type))))) | ||
| 374 | 392 | ||
| 375 | (defvar bookmark-make-record-function) | 393 | (defvar bookmark-make-record-function) |
| 376 | (when (memq window-system '(mac ns)) | 394 | (when (memq window-system '(mac ns)) |
| @@ -682,11 +700,16 @@ For example, use this to display an anchor." | |||
| 682 | 700 | ||
| 683 | (defun xwidget-webkit-new-session (url &optional callback) | 701 | (defun xwidget-webkit-new-session (url &optional callback) |
| 684 | "Create a new webkit session buffer with URL." | 702 | "Create a new webkit session buffer with URL." |
| 685 | (let* | 703 | (let* ((bufname |
| 686 | ((bufname (generate-new-buffer-name "*xwidget-webkit*")) | 704 | ;; Generate a temp-name based on current buffer name. it |
| 687 | (callback (or callback #'xwidget-webkit-callback)) | 705 | ;; will be renamed by `xwidget-webkit-callback' in the |
| 688 | (current-session (xwidget-webkit-current-session)) | 706 | ;; future. This approach can limit flicker of buffer-name in |
| 689 | xw) | 707 | ;; mode-line. |
| 708 | (concat xwidget-webkit-buffer-name-prefix | ||
| 709 | (generate-new-buffer-name (buffer-name)))) | ||
| 710 | (callback (or callback #'xwidget-webkit-callback)) | ||
| 711 | (current-session (xwidget-webkit-current-session)) | ||
| 712 | xw) | ||
| 690 | (setq xwidget-webkit-last-session-buffer (switch-to-buffer | 713 | (setq xwidget-webkit-last-session-buffer (switch-to-buffer |
| 691 | (get-buffer-create bufname))) | 714 | (get-buffer-create bufname))) |
| 692 | ;; The xwidget id is stored in a text property, so we need to have | 715 | ;; The xwidget id is stored in a text property, so we need to have |
| @@ -707,7 +730,16 @@ For example, use this to display an anchor." | |||
| 707 | (defun xwidget-webkit-import-widget (xwidget) | 730 | (defun xwidget-webkit-import-widget (xwidget) |
| 708 | "Create a new webkit session buffer from XWIDGET, an existing xwidget. | 731 | "Create a new webkit session buffer from XWIDGET, an existing xwidget. |
| 709 | Return the buffer." | 732 | Return the buffer." |
| 710 | (let* ((bufname (generate-new-buffer-name "*xwidget-webkit*")) | 733 | (let* ((bufname |
| 734 | ;; Generate a temp-name based on current buffer name. it | ||
| 735 | ;; will be renamed by `xwidget-webkit-callback' in the | ||
| 736 | ;; future. This approach can limit flicker of buffer-name in | ||
| 737 | ;; mode-line. | ||
| 738 | (if (string-prefix-p xwidget-webkit-buffer-name-prefix | ||
| 739 | (buffer-name)) | ||
| 740 | (generate-new-buffer-name (buffer-name)) | ||
| 741 | (concat xwidget-webkit-buffer-name-prefix | ||
| 742 | (generate-new-buffer-name (buffer-name))))) | ||
| 711 | (callback #'xwidget-webkit-callback) | 743 | (callback #'xwidget-webkit-callback) |
| 712 | (buffer (get-buffer-create bufname))) | 744 | (buffer (get-buffer-create bufname))) |
| 713 | (with-current-buffer buffer | 745 | (with-current-buffer buffer |