aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2016-01-19 20:53:10 -0500
committerStefan Monnier2016-01-19 20:53:10 -0500
commitc5ee6de21d4bd0562d811129e2ef7c0419a882a1 (patch)
treeaa195562a74177a33fa557f1ab8a16ae1d148a22
parent96f6cace6bd088c8a49892502354272eb9d1a702 (diff)
downloademacs-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.el123
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.
201XWIDGET instance, XWIDGET-EVENT-TYPE depends on the originating xwidget." 199XWIDGET 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.
440Argument H height." 437Argument 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