From: Feng Shu Date: Tue, 9 Nov 2021 03:52:59 +0000 (+0100) Subject: xwidget.el: limit buffer-name flicker in mode-line X-Git-Tag: emacs-29.0.90~3671^2~61 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=06fb81922d99eef8e99fb52b37c8dbb6dffa5138;p=emacs.git 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. --- 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 ** Xwidgets +--- +*** New user option 'xwidget-webkit-buffer-name-prefix'. +This allows the user to change the webkit buffer names. + +++ *** New minor mode 'xwidget-webkit-edit-mode'. 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'." (require 'seq) (require 'url-handlers) +(defgroup xwidget-webkit nil + "Displaying webkit xwidgets in Emacs buffers." + :version "29.1" + :group 'web + :prefix "xwidget-webkit-") + +(defcustom xwidget-webkit-buffer-name-prefix "* xwidget-webkit: " + "Buffer name prefix used by `xwidget-webkit' buffers." + :type 'string + :version "29.1") + (defvar-local xwidget-webkit--title "" "The title of the WebKit widget, used for the header line.") @@ -345,32 +356,39 @@ XWIDGET instance, XWIDGET-EVENT-TYPE depends on the originating xwidget." (if (not (buffer-live-p (xwidget-buffer xwidget))) (xwidget-log "error: callback called for xwidget with dead buffer") - (with-current-buffer (xwidget-buffer xwidget) - (cond ((eq xwidget-event-type 'load-changed) - (let ((title (xwidget-webkit-title xwidget))) - (setq xwidget-webkit--title title) - (force-mode-line-update) - (xwidget-log "webkit finished loading: %s" title) - ;; Do not adjust webkit size to window here, the selected window - ;; can be the mini-buffer window unwantedly. - (rename-buffer (format "*xwidget webkit: %s *" title) t))) - ((eq xwidget-event-type 'decide-policy) - (let ((strarg (nth 3 last-input-event))) - (if (string-match ".*#\\(.*\\)" strarg) - (xwidget-webkit-show-id-or-named-element - xwidget - (match-string 1 strarg))))) - ;; TODO: Response handling other than download. - ((eq xwidget-event-type 'download-callback) - (let ((url (nth 3 last-input-event)) - (mime-type (nth 4 last-input-event)) - (file-name (nth 5 last-input-event))) - (xwidget-webkit-save-as-file url mime-type file-name))) - ((eq xwidget-event-type 'javascript-callback) - (let ((proc (nth 3 last-input-event)) - (arg (nth 4 last-input-event))) - (funcall proc arg))) - (t (xwidget-log "unhandled event:%s" xwidget-event-type)))))) + (cond ((eq xwidget-event-type 'load-changed) + (let ((title (xwidget-webkit-title xwidget))) + ;; This funciton will be called multi times, so only + ;; change buffer name when get a valid title. this can + ;; limit buffer-name flicker in mode-line. + (when (> (length title) 0) + (with-current-buffer (xwidget-buffer xwidget) + (setq xwidget-webkit--title title) + (force-mode-line-update) + (xwidget-log "webkit finished loading: %s" title) + ;; Do not adjust webkit size to window here, the + ;; selected window can be the mini-buffer window + ;; unwantedly. + (rename-buffer (concat xwidget-webkit-buffer-name-prefix + title) + t))))) + ((eq xwidget-event-type 'decide-policy) + (let ((strarg (nth 3 last-input-event))) + (if (string-match ".*#\\(.*\\)" strarg) + (xwidget-webkit-show-id-or-named-element + xwidget + (match-string 1 strarg))))) + ;; TODO: Response handling other than download. + ((eq xwidget-event-type 'download-callback) + (let ((url (nth 3 last-input-event)) + (mime-type (nth 4 last-input-event)) + (file-name (nth 5 last-input-event))) + (xwidget-webkit-save-as-file url mime-type file-name))) + ((eq xwidget-event-type 'javascript-callback) + (let ((proc (nth 3 last-input-event)) + (arg (nth 4 last-input-event))) + (funcall proc arg))) + (t (xwidget-log "unhandled event:%s" xwidget-event-type))))) (defvar bookmark-make-record-function) (when (memq window-system '(mac ns)) @@ -682,11 +700,16 @@ For example, use this to display an anchor." (defun xwidget-webkit-new-session (url &optional callback) "Create a new webkit session buffer with URL." - (let* - ((bufname (generate-new-buffer-name "*xwidget-webkit*")) - (callback (or callback #'xwidget-webkit-callback)) - (current-session (xwidget-webkit-current-session)) - xw) + (let* ((bufname + ;; Generate a temp-name based on current buffer name. it + ;; will be renamed by `xwidget-webkit-callback' in the + ;; future. This approach can limit flicker of buffer-name in + ;; mode-line. + (concat xwidget-webkit-buffer-name-prefix + (generate-new-buffer-name (buffer-name)))) + (callback (or callback #'xwidget-webkit-callback)) + (current-session (xwidget-webkit-current-session)) + xw) (setq xwidget-webkit-last-session-buffer (switch-to-buffer (get-buffer-create bufname))) ;; 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." (defun xwidget-webkit-import-widget (xwidget) "Create a new webkit session buffer from XWIDGET, an existing xwidget. Return the buffer." - (let* ((bufname (generate-new-buffer-name "*xwidget-webkit*")) + (let* ((bufname + ;; Generate a temp-name based on current buffer name. it + ;; will be renamed by `xwidget-webkit-callback' in the + ;; future. This approach can limit flicker of buffer-name in + ;; mode-line. + (if (string-prefix-p xwidget-webkit-buffer-name-prefix + (buffer-name)) + (generate-new-buffer-name (buffer-name)) + (concat xwidget-webkit-buffer-name-prefix + (generate-new-buffer-name (buffer-name))))) (callback #'xwidget-webkit-callback) (buffer (get-buffer-create bufname))) (with-current-buffer buffer