diff options
| author | Stefan Monnier | 2016-01-19 20:53:10 -0500 |
|---|---|---|
| committer | Stefan Monnier | 2016-01-19 20:53:10 -0500 |
| commit | c5ee6de21d4bd0562d811129e2ef7c0419a882a1 (patch) | |
| tree | aa195562a74177a33fa557f1ab8a16ae1d148a22 | |
| parent | 96f6cace6bd088c8a49892502354272eb9d1a702 (diff) | |
| download | emacs-c5ee6de21d4bd0562d811129e2ef7c0419a882a1.tar.gz emacs-c5ee6de21d4bd0562d811129e2ef7c0419a882a1.zip | |
* lisp/xwidget.el: Nitpicks
* lisp/xwidget.el (xwidget-log, xwidget-webkit-callback):
Use with-current-buffer rather than save-excursion + set-buffer.
| -rw-r--r-- | lisp/xwidget.el | 123 |
1 files changed, 58 insertions, 65 deletions
diff --git a/lisp/xwidget.el b/lisp/xwidget.el index 0fb90c4573c..f184eb31dbb 100644 --- a/lisp/xwidget.el +++ b/lisp/xwidget.el | |||
| @@ -79,7 +79,7 @@ Optional argument ARGS usage depends on the xwidget." | |||
| 79 | ;; protected yet and xwidgetp apparently doesn't work yet. | 79 | ;; protected yet and xwidgetp apparently doesn't work yet. |
| 80 | (let* ((disp (get-text-property pos 'display)) | 80 | (let* ((disp (get-text-property pos 'display)) |
| 81 | (xw (car (cdr (cdr disp))))) | 81 | (xw (car (cdr (cdr disp))))) |
| 82 | ;;(if ( xwidgetp xw) xw nil) | 82 | ;;(if (xwidgetp xw) xw nil) |
| 83 | (if (equal 'xwidget (car disp)) xw))) | 83 | (if (equal 'xwidget (car disp)) xw))) |
| 84 | 84 | ||
| 85 | 85 | ||
| @@ -97,7 +97,7 @@ defaults to the string looking like a url around the cursor position." | |||
| 97 | (interactive (progn | 97 | (interactive (progn |
| 98 | (require 'browse-url) | 98 | (require 'browse-url) |
| 99 | (browse-url-interactive-arg "xwidget-webkit URL: " | 99 | (browse-url-interactive-arg "xwidget-webkit URL: " |
| 100 | ;;( xwidget-webkit-current-url) | 100 | ;;(xwidget-webkit-current-url) |
| 101 | ))) | 101 | ))) |
| 102 | (when (stringp url) | 102 | (when (stringp url) |
| 103 | (if new-session | 103 | (if new-session |
| @@ -110,9 +110,9 @@ defaults to the string looking like a url around the cursor position." | |||
| 110 | (let ((map (make-sparse-keymap))) | 110 | (let ((map (make-sparse-keymap))) |
| 111 | (define-key map "g" 'xwidget-webkit-browse-url) | 111 | (define-key map "g" 'xwidget-webkit-browse-url) |
| 112 | (define-key map "a" 'xwidget-webkit-adjust-size-dispatch) | 112 | (define-key map "a" 'xwidget-webkit-adjust-size-dispatch) |
| 113 | (define-key map "b" 'xwidget-webkit-back ) | 113 | (define-key map "b" 'xwidget-webkit-back) |
| 114 | (define-key map "r" 'xwidget-webkit-reload ) | 114 | (define-key map "r" 'xwidget-webkit-reload) |
| 115 | (define-key map "t" (lambda () (interactive) (message "o")) ) | 115 | (define-key map "t" (lambda () (interactive) (message "o"))) ;FIXME: ?!? |
| 116 | (define-key map "\C-m" 'xwidget-webkit-insert-string) | 116 | (define-key map "\C-m" 'xwidget-webkit-insert-string) |
| 117 | (define-key map "w" 'xwidget-webkit-current-url) | 117 | (define-key map "w" 'xwidget-webkit-current-url) |
| 118 | 118 | ||
| @@ -172,14 +172,12 @@ defaults to the string looking like a url around the cursor position." | |||
| 172 | ;; The xwidget event needs to go into a higher level handler | 172 | ;; The xwidget event needs to go into a higher level handler |
| 173 | ;; since the xwidget can generate an event even if it's offscreen. | 173 | ;; since the xwidget can generate an event even if it's offscreen. |
| 174 | ;; TODO this needs to use callbacks and consider different xwidget event types. | 174 | ;; TODO this needs to use callbacks and consider different xwidget event types. |
| 175 | (define-key (current-global-map) [xwidget-event] 'xwidget-event-handler) | 175 | (define-key (current-global-map) [xwidget-event] #'xwidget-event-handler) |
| 176 | (defun xwidget-log ( &rest msg) | 176 | (defun xwidget-log (&rest msg) |
| 177 | "Log MSG to a buffer." | 177 | "Log MSG to a buffer." |
| 178 | (let ( (buf (get-buffer-create "*xwidget-log*"))) | 178 | (let ((buf (get-buffer-create " *xwidget-log*"))) |
| 179 | (save-excursion | 179 | (with-current-buffer buf |
| 180 | (buffer-disable-undo buf) | 180 | (insert (apply #'format msg)) |
| 181 | (set-buffer buf) | ||
| 182 | (insert (apply 'format msg)) | ||
| 183 | (insert "\n")))) | 181 | (insert "\n")))) |
| 184 | 182 | ||
| 185 | (defun xwidget-event-handler () | 183 | (defun xwidget-event-handler () |
| @@ -199,44 +197,43 @@ defaults to the string looking like a url around the cursor position." | |||
| 199 | (defun xwidget-webkit-callback (xwidget xwidget-event-type) | 197 | (defun xwidget-webkit-callback (xwidget xwidget-event-type) |
| 200 | "Callback for xwidgets. | 198 | "Callback for xwidgets. |
| 201 | XWIDGET instance, XWIDGET-EVENT-TYPE depends on the originating xwidget." | 199 | XWIDGET instance, XWIDGET-EVENT-TYPE depends on the originating xwidget." |
| 202 | (save-excursion | 200 | (if (not (buffer-live-p (xwidget-buffer xwidget))) |
| 203 | (cond ((buffer-live-p (xwidget-buffer xwidget)) | 201 | (xwidget-log |
| 204 | (set-buffer (xwidget-buffer xwidget)) | 202 | "error: callback called for xwidget with dead buffer") |
| 205 | (let* ((strarg (nth 3 last-input-event))) | 203 | (with-current-buffer (xwidget-buffer xwidget) |
| 206 | (cond ((eq xwidget-event-type 'document-load-finished) | 204 | (let* ((strarg (nth 3 last-input-event))) |
| 207 | (xwidget-log "webkit finished loading: '%s'" | 205 | (cond ((eq xwidget-event-type 'document-load-finished) |
| 208 | (xwidget-webkit-get-title xwidget)) | 206 | (xwidget-log "webkit finished loading: '%s'" |
| 209 | ;;TODO - check the native/internal scroll | 207 | (xwidget-webkit-get-title xwidget)) |
| 210 | ;;(xwidget-adjust-size-to-content xwidget) | 208 | ;;TODO - check the native/internal scroll |
| 211 | (xwidget-webkit-adjust-size-dispatch) ;;TODO xwidget arg | 209 | ;;(xwidget-adjust-size-to-content xwidget) |
| 212 | (rename-buffer (format "*xwidget webkit: %s *" | 210 | (xwidget-webkit-adjust-size-dispatch) ;;TODO xwidget arg |
| 213 | (xwidget-webkit-get-title xwidget))) | 211 | (rename-buffer (format "*xwidget webkit: %s *" |
| 214 | (pop-to-buffer (current-buffer))) | 212 | (xwidget-webkit-get-title xwidget))) |
| 215 | ((eq xwidget-event-type | 213 | (pop-to-buffer (current-buffer))) |
| 216 | 'navigation-policy-decision-requested) | 214 | ((eq xwidget-event-type |
| 217 | (if (string-match ".*#\\(.*\\)" strarg) | 215 | 'navigation-policy-decision-requested) |
| 218 | (xwidget-webkit-show-id-or-named-element | 216 | (if (string-match ".*#\\(.*\\)" strarg) |
| 219 | xwidget | 217 | (xwidget-webkit-show-id-or-named-element |
| 220 | (match-string 1 strarg)))) | 218 | xwidget |
| 221 | (t (xwidget-log "unhandled event:%s" xwidget-event-type))))) | 219 | (match-string 1 strarg)))) |
| 222 | (t (xwidget-log | 220 | (t (xwidget-log "unhandled event:%s" xwidget-event-type))))))) |
| 223 | "error: callback called for xwidget with dead buffer"))))) | ||
| 224 | 221 | ||
| 225 | (defvar bookmark-make-record-function) | 222 | (defvar bookmark-make-record-function) |
| 226 | (define-derived-mode xwidget-webkit-mode | 223 | (define-derived-mode xwidget-webkit-mode |
| 227 | special-mode "xwidget-webkit" "xwidget webkit view mode" | 224 | special-mode "xwidget-webkit" "Xwidget webkit view mode." |
| 228 | (setq buffer-read-only t) | 225 | (setq buffer-read-only t) |
| 229 | (setq-local bookmark-make-record-function | 226 | (setq-local bookmark-make-record-function |
| 230 | #'xwidget-webkit-bookmark-make-record) | 227 | #'xwidget-webkit-bookmark-make-record) |
| 231 | ;; Keep track of [vh]scroll when switching buffers | 228 | ;; Keep track of [vh]scroll when switching buffers |
| 232 | (image-mode-setup-winprops)) | 229 | (image-mode-setup-winprops)) |
| 233 | 230 | ||
| 234 | (defun xwidget-webkit-bookmark-make-record () | 231 | (defun xwidget-webkit-bookmark-make-record () |
| 235 | "Integrate Emacs bookmarks with the webkit xwidget." | 232 | "Integrate Emacs bookmarks with the webkit xwidget." |
| 236 | (nconc (bookmark-make-record-default t t) | 233 | (nconc (bookmark-make-record-default t t) |
| 237 | `((page . ,(xwidget-webkit-current-url)) | 234 | `((page . ,(xwidget-webkit-current-url)) |
| 238 | (handler . (lambda (bmk) (browse-url | 235 | (handler . (lambda (bmk) (browse-url |
| 239 | (bookmark-prop-get bmk 'page))))))) | 236 | (bookmark-prop-get bmk 'page))))))) |
| 240 | 237 | ||
| 241 | 238 | ||
| 242 | (defvar xwidget-webkit-last-session-buffer nil) | 239 | (defvar xwidget-webkit-last-session-buffer nil) |
| @@ -256,7 +253,7 @@ The latter might be nil." | |||
| 256 | (defun xwidget-adjust-size-to-content (xw) | 253 | (defun xwidget-adjust-size-to-content (xw) |
| 257 | "Resize XW to content." | 254 | "Resize XW to content." |
| 258 | ;; xwidgets doesn't support widgets that have their own opinions about | 255 | ;; xwidgets doesn't support widgets that have their own opinions about |
| 259 | ;; size well, yet this reads the desired size and resizes the emacs | 256 | ;; size well, yet this reads the desired size and resizes the Emacs |
| 260 | ;; allocated area accordingly. | 257 | ;; allocated area accordingly. |
| 261 | (let ((size (xwidget-size-request xw))) | 258 | (let ((size (xwidget-size-request xw))) |
| 262 | (xwidget-resize xw (car size) (cadr size)))) | 259 | (xwidget-resize xw (car size) (cadr size)))) |
| @@ -307,10 +304,10 @@ Argument STR string." | |||
| 307 | (xwidget-webkit-execute-script xww xwidget-webkit-activeelement-js) | 304 | (xwidget-webkit-execute-script xww xwidget-webkit-activeelement-js) |
| 308 | (xwidget-webkit-execute-script-rv | 305 | (xwidget-webkit-execute-script-rv |
| 309 | xww | 306 | xww |
| 310 | "findactiveelement(document).value;" ))) | 307 | "findactiveelement(document).value;"))) |
| 311 | (field-type (xwidget-webkit-execute-script-rv | 308 | (field-type (xwidget-webkit-execute-script-rv |
| 312 | xww | 309 | xww |
| 313 | "findactiveelement(document).type;" ))) | 310 | "findactiveelement(document).type;"))) |
| 314 | (list xww | 311 | (list xww |
| 315 | (cond ((equal "text" field-type) | 312 | (cond ((equal "text" field-type) |
| 316 | (read-string "text:" field-value)) | 313 | (read-string "text:" field-value)) |
| @@ -333,7 +330,7 @@ XW is the xwidget identifier, TEXT is retrieved from the webkit." | |||
| 333 | (insert text)) | 330 | (insert text)) |
| 334 | 331 | ||
| 335 | (defun xwidget-webkit-end-edit-textarea () | 332 | (defun xwidget-webkit-end-edit-textarea () |
| 336 | "End editing of a webkit text area." | 333 | "End editing of a webkit text area." |
| 337 | (interactive) | 334 | (interactive) |
| 338 | (goto-char (point-min)) | 335 | (goto-char (point-min)) |
| 339 | (while (search-forward "\n" nil t) | 336 | (while (search-forward "\n" nil t) |
| @@ -369,7 +366,7 @@ Argument ELEMENT-NAME is the element name to display in the webkit xwidget." | |||
| 369 | "document.getElementsByName('%s')[0].getBoundingClientRect().top" | 366 | "document.getElementsByName('%s')[0].getBoundingClientRect().top" |
| 370 | element-name) | 367 | element-name) |
| 371 | 0)))) | 368 | 0)))) |
| 372 | ;; Now we need to tell emacs to scroll the element into view. | 369 | ;; Now we need to tell Emacs to scroll the element into view. |
| 373 | (xwidget-log "scroll: %d" y) | 370 | (xwidget-log "scroll: %d" y) |
| 374 | (set-window-vscroll (selected-window) y t))) | 371 | (set-window-vscroll (selected-window) y t))) |
| 375 | 372 | ||
| @@ -385,7 +382,7 @@ Argument ELEMENT-ID is the id of the element to show." | |||
| 385 | (format "document.getElementById('%s').getBoundingClientRect().top" | 382 | (format "document.getElementById('%s').getBoundingClientRect().top" |
| 386 | element-id) | 383 | element-id) |
| 387 | 0)))) | 384 | 0)))) |
| 388 | ;; Now we need to tell emacs to scroll the element into view. | 385 | ;; Now we need to tell Emacs to scroll the element into view. |
| 389 | (xwidget-log "scroll: %d" y) | 386 | (xwidget-log "scroll: %d" y) |
| 390 | (set-window-vscroll (selected-window) y t))) | 387 | (set-window-vscroll (selected-window) y t))) |
| 391 | 388 | ||
| @@ -404,9 +401,9 @@ Argument ELEMENT-ID is either a name or an element id." | |||
| 404 | (xwidget-webkit-execute-script-rv | 401 | (xwidget-webkit-execute-script-rv |
| 405 | xw | 402 | xw |
| 406 | (format "document.getElementById('%s').getBoundingClientRect().top" element-id) | 403 | (format "document.getElementById('%s').getBoundingClientRect().top" element-id) |
| 407 | "0"))) | 404 | "0"))) |
| 408 | (y3 (max y1 y2))) | 405 | (y3 (max y1 y2))) |
| 409 | ;; Now we need to tell emacs to scroll the element into view. | 406 | ;; Now we need to tell Emacs to scroll the element into view. |
| 410 | (xwidget-log "scroll: %d" y3) | 407 | (xwidget-log "scroll: %d" y3) |
| 411 | (set-window-vscroll (selected-window) y3 t))) | 408 | (set-window-vscroll (selected-window) y3 t))) |
| 412 | 409 | ||
| @@ -431,7 +428,7 @@ Argument ELEMENT-ID is either a name or an element id." | |||
| 431 | (defun xwidget-webkit-adjust-size-to-window () | 428 | (defun xwidget-webkit-adjust-size-to-window () |
| 432 | "Adjust webkit to window." | 429 | "Adjust webkit to window." |
| 433 | (interactive) | 430 | (interactive) |
| 434 | (xwidget-resize ( xwidget-webkit-current-session) (window-pixel-width) | 431 | (xwidget-resize (xwidget-webkit-current-session) (window-pixel-width) |
| 435 | (window-pixel-height))) | 432 | (window-pixel-height))) |
| 436 | 433 | ||
| 437 | (defun xwidget-webkit-adjust-size (w h) | 434 | (defun xwidget-webkit-adjust-size (w h) |
| @@ -440,7 +437,7 @@ Argument W width. | |||
| 440 | Argument H height." | 437 | Argument H height." |
| 441 | ;; TODO shouldn't be tied to the webkit xwidget | 438 | ;; TODO shouldn't be tied to the webkit xwidget |
| 442 | (interactive "nWidth:\nnHeight:\n") | 439 | (interactive "nWidth:\nnHeight:\n") |
| 443 | (xwidget-resize ( xwidget-webkit-current-session) w h)) | 440 | (xwidget-resize (xwidget-webkit-current-session) w h)) |
| 444 | 441 | ||
| 445 | (defun xwidget-webkit-fit-width () | 442 | (defun xwidget-webkit-fit-width () |
| 446 | "Adjust width of webkit to window width." | 443 | "Adjust width of webkit to window width." |
| @@ -460,7 +457,7 @@ Argument H height." | |||
| 460 | (setq xw (xwidget-insert 1 'webkit-osr bufname 1000 1000)) | 457 | (setq xw (xwidget-insert 1 'webkit-osr bufname 1000 1000)) |
| 461 | (xwidget-put xw 'callback 'xwidget-webkit-callback) | 458 | (xwidget-put xw 'callback 'xwidget-webkit-callback) |
| 462 | (xwidget-webkit-mode) | 459 | (xwidget-webkit-mode) |
| 463 | (xwidget-webkit-goto-uri (xwidget-webkit-last-session) url ))) | 460 | (xwidget-webkit-goto-uri (xwidget-webkit-last-session) url))) |
| 464 | 461 | ||
| 465 | 462 | ||
| 466 | (defun xwidget-webkit-goto-url (url) | 463 | (defun xwidget-webkit-goto-url (url) |
| @@ -488,7 +485,7 @@ Argument H height." | |||
| 488 | (let* ((rv (xwidget-webkit-execute-script-rv (xwidget-webkit-current-session) | 485 | (let* ((rv (xwidget-webkit-execute-script-rv (xwidget-webkit-current-session) |
| 489 | "document.URL")) | 486 | "document.URL")) |
| 490 | (url (kill-new (or rv "")))) | 487 | (url (kill-new (or rv "")))) |
| 491 | (message "url: %s" url ) | 488 | (message "url: %s" url) |
| 492 | url)) | 489 | url)) |
| 493 | 490 | ||
| 494 | (defun xwidget-webkit-execute-script-rv (xw script &optional default) | 491 | (defun xwidget-webkit-execute-script-rv (xw script &optional default) |
| @@ -565,23 +562,19 @@ It can be retrieved with `(xwidget-get XWIDGET PROPNAME)'." | |||
| 565 | ;; Redraw display otherwise ghost of zombies will remain to haunt the screen | 562 | ;; Redraw display otherwise ghost of zombies will remain to haunt the screen |
| 566 | (redraw-display)) | 563 | (redraw-display)) |
| 567 | 564 | ||
| 568 | ;; This would have felt better in C, but this seems to work well in | ||
| 569 | ;; practice though. | ||
| 570 | (if (featurep 'xwidget-internal) | ||
| 571 | (add-hook 'window-configuration-change-hook 'xwidget-delete-zombies)) | ||
| 572 | |||
| 573 | (defun xwidget-kill-buffer-query-function () | 565 | (defun xwidget-kill-buffer-query-function () |
| 574 | "Ask before killing a buffer that has xwidgets." | 566 | "Ask before killing a buffer that has xwidgets." |
| 575 | (let ((xwidgets (get-buffer-xwidgets (current-buffer)))) | 567 | (let ((xwidgets (get-buffer-xwidgets (current-buffer)))) |
| 576 | (or (not xwidgets) | 568 | (or (not xwidgets) |
| 577 | (not (memq t (mapcar 'xwidget-query-on-exit-flag xwidgets))) | 569 | (not (memq t (mapcar #'xwidget-query-on-exit-flag xwidgets))) |
| 578 | (yes-or-no-p | 570 | (yes-or-no-p |
| 579 | (format "Buffer %S has xwidgets; kill it? " | 571 | (format "Buffer %S has xwidgets; kill it? " (buffer-name)))))) |
| 580 | (buffer-name (current-buffer))))))) | ||
| 581 | 572 | ||
| 582 | (if (featurep 'xwidget-internal) | 573 | (when (featurep 'xwidget-internal) |
| 583 | (add-hook 'kill-buffer-query-functions 'xwidget-kill-buffer-query-function)) | 574 | (add-hook 'kill-buffer-query-functions #'xwidget-kill-buffer-query-function) |
| 575 | ;; This would have felt better in C, but this seems to work well in | ||
| 576 | ;; practice though. | ||
| 577 | (add-hook 'window-configuration-change-hook #'xwidget-delete-zombies)) | ||
| 584 | 578 | ||
| 585 | (provide 'xwidget) | 579 | (provide 'xwidget) |
| 586 | |||
| 587 | ;;; xwidget.el ends here | 580 | ;;; xwidget.el ends here |