aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFeng Shu2021-11-09 04:52:59 +0100
committerLars Ingebrigtsen2021-11-09 04:52:59 +0100
commit06fb81922d99eef8e99fb52b37c8dbb6dffa5138 (patch)
treead250ecf07752b9d2ec35a264e42a33b59923f3e
parent358b8d0361c8152026aeb263f0d0fc29d76d2362 (diff)
downloademacs-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/NEWS4
-rw-r--r--lisp/xwidget.el96
2 files changed, 68 insertions, 32 deletions
diff --git a/etc/NEWS b/etc/NEWS
index 874af33c752..bb25365030d 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -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'.
509This 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'.
509When this mode is enabled, self-inserting characters and other common 513When 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.
709Return the buffer." 732Return 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