aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoakim Verona2015-01-21 00:00:47 +0100
committerJoakim Verona2015-01-21 00:00:47 +0100
commite1653dd7252539ef9dd723c7f4d40a0d855f39f6 (patch)
tree8d58f130f1b228053346e5fcc88aef8aaaacc873
parentfee879f0a00bbe3f3389509874ee30a9cbc24cd4 (diff)
downloademacs-e1653dd7252539ef9dd723c7f4d40a0d855f39f6.tar.gz
emacs-e1653dd7252539ef9dd723c7f4d40a0d855f39f6.zip
Native scrolling
Initial support for native scrolling of the webkit xwidget. Also some checkstyle cleanups.
-rw-r--r--lisp/xwidget.el96
1 files changed, 76 insertions, 20 deletions
diff --git a/lisp/xwidget.el b/lisp/xwidget.el
index 1f0932ca7dd..0e4258a7865 100644
--- a/lisp/xwidget.el
+++ b/lisp/xwidget.el
@@ -14,8 +14,14 @@
14(eval-when-compile (require 'cl)) 14(eval-when-compile (require 'cl))
15(require 'reporter) 15(require 'reporter)
16 16
17(defcustom xwidget-webkit-scroll-behaviour 'native
18 "Scroll behaviour of the webkit instance.
19'native or 'image."
20 :group 'xwidgets)
21
17(defun xwidget-insert (pos type title width height) 22(defun xwidget-insert (pos type title width height)
18 "Insert an xwidget at POS, given ID, TYPE, TITLE WIDTH and 23 "Insert an xwidget at POS.
24given ID, TYPE, TITLE WIDTH and
19HEIGHT in the current buffer. 25HEIGHT in the current buffer.
20 26
21Return ID 27Return ID
@@ -59,8 +65,8 @@ see `make-xwidget' for types suitable for TYPE."
59;; ))))) 65;; )))))
60 66
61(defun xwidget-display (xwidget) 67(defun xwidget-display (xwidget)
62 "Force xwidget to be displayed to create a xwidget_view. Return 68 "Force XWIDGET to be displayed to create a xwidget_view.
63the window displaying XWIDGET." 69Return the window displaying XWIDGET."
64 (let* ((buffer (xwidget-buffer xwidget)) 70 (let* ((buffer (xwidget-buffer xwidget))
65 (window (display-buffer buffer)) 71 (window (display-buffer buffer))
66 (frame (window-frame window))) 72 (frame (window-frame window)))
@@ -102,6 +108,7 @@ defaults to the string looking like a url around the cursor position."
102(defadvice image-display-size (around image-display-size-for-xwidget 108(defadvice image-display-size (around image-display-size-for-xwidget
103 (spec &optional pixels frame) 109 (spec &optional pixels frame)
104 activate) 110 activate)
111 "Advice for re-using image mode for xwidget."
105 (if (eq (car spec) 'xwidget) 112 (if (eq (car spec) 'xwidget)
106 (setq ad-return-value (xwidget-image-display-size spec pixels frame)) 113 (setq ad-return-value (xwidget-image-display-size spec pixels frame))
107 ad-do-it)) 114 ad-do-it))
@@ -111,7 +118,7 @@ defaults to the string looking like a url around the cursor position."
111(defvar xwidget-webkit-mode-map 118(defvar xwidget-webkit-mode-map
112 (let ((map (make-sparse-keymap))) 119 (let ((map (make-sparse-keymap)))
113 (define-key map "g" 'xwidget-webkit-browse-url) 120 (define-key map "g" 'xwidget-webkit-browse-url)
114 (define-key map "a" 'xwidget-webkit-adjust-size-to-content) 121 (define-key map "a" 'xwidget-webkit-adjust-size-dispatch)
115 (define-key map "b" 'xwidget-webkit-back ) 122 (define-key map "b" 'xwidget-webkit-back )
116 (define-key map "r" 'xwidget-webkit-reload ) 123 (define-key map "r" 'xwidget-webkit-reload )
117 (define-key map "t" (lambda () (interactive) (message "o")) ) 124 (define-key map "t" (lambda () (interactive) (message "o")) )
@@ -119,19 +126,19 @@ defaults to the string looking like a url around the cursor position."
119 (define-key map "w" 'xwidget-webkit-current-url) 126 (define-key map "w" 'xwidget-webkit-current-url)
120 127
121 ;;similar to image mode bindings 128 ;;similar to image mode bindings
122 (define-key map (kbd "SPC") 'image-scroll-up) 129 (define-key map (kbd "SPC") 'xwidget-webkit-scroll-up)
123 (define-key map (kbd "DEL") 'image-scroll-down) 130 (define-key map (kbd "DEL") 'xwidget-webkit-scroll-down)
124 131
125 (define-key map [remap scroll-up] 'image-scroll-up) 132 (define-key map [remap scroll-up] 'xwidget-webkit-scroll-up)
126 (define-key map [remap scroll-up-command] 'image-scroll-up) 133 (define-key map [remap scroll-up-command] 'xwidget-webkit-scroll-up)
127 134
128 (define-key map [remap scroll-down] 'image-scroll-down) 135 (define-key map [remap scroll-down] 'xwidget-webkit-scroll-down)
129 (define-key map [remap scroll-down-command] 'image-scroll-down) 136 (define-key map [remap scroll-down-command] 'xwidget-webkit-scroll-down)
130 137
131 (define-key map [remap forward-char] 'image-forward-hscroll) 138 (define-key map [remap forward-char] 'xwidget-webkit-scroll-forward)
132 (define-key map [remap backward-char] 'image-backward-hscroll) 139 (define-key map [remap backward-char] 'xwidget-webkit-scroll-backward)
133 (define-key map [remap right-char] 'image-forward-hscroll) 140 (define-key map [remap right-char] 'xwidget-webkit-scroll-forward)
134 (define-key map [remap left-char] 'image-backward-hscroll) 141 (define-key map [remap left-char] 'xwidget-webkit-scroll-backward)
135 (define-key map [remap previous-line] 'image-previous-line) 142 (define-key map [remap previous-line] 'image-previous-line)
136 (define-key map [remap next-line] 'image-next-line) 143 (define-key map [remap next-line] 'image-next-line)
137 144
@@ -142,11 +149,37 @@ defaults to the string looking like a url around the cursor position."
142 map) 149 map)
143 "Keymap for `xwidget-webkit-mode'.") 150 "Keymap for `xwidget-webkit-mode'.")
144 151
152(defun xwidget-webkit-scroll-up ()
153 (interactive)
154 (if (eq xwidget-webkit-scroll-behaviour 'native)
155 (xwidget-set-adjustment (xwidget-webkit-last-session) 'vertical t 50) )
156 (image-scroll-up))
157
158(defun xwidget-webkit-scroll-down ()
159 (interactive)
160 (if (eq xwidget-webkit-scroll-behaviour 'native)
161 (xwidget-set-adjustment (xwidget-webkit-last-session) 'vertical t -50) )
162 (image-scroll-down))
163
164(defun xwidget-webkit-scroll-forward ()
165 (interactive)
166 (if (eq xwidget-webkit-scroll-behaviour 'native)
167 (xwidget-set-adjustment (xwidget-webkit-last-session) 'horizontal t 50) )
168 (xwidget-webkit-scroll-forward))
169
170(defun xwidget-webkit-scroll-backward ()
171 (interactive)
172 (if (eq xwidget-webkit-scroll-behaviour 'native)
173 (xwidget-set-adjustment (xwidget-webkit-last-session) 'horizontal t -50) )
174 (xwidget-webkit-scroll-backward))
175
176
145;;the xwidget event needs to go into a higher level handler 177;;the xwidget event needs to go into a higher level handler
146;;since the xwidget can generate an event even if its offscreen 178;;since the xwidget can generate an event even if its offscreen
147;;TODO this needs to use callbacks and consider different xw ev types 179;;TODO this needs to use callbacks and consider different xw ev types
148(define-key (current-global-map) [xwidget-event] 'xwidget-event-handler) 180(define-key (current-global-map) [xwidget-event] 'xwidget-event-handler)
149(defun xwidget-log ( &rest msg) 181(defun xwidget-log ( &rest msg)
182 "Log MSG to a buffer."
150 (let ( (buf (get-buffer-create "*xwidget-log*"))) 183 (let ( (buf (get-buffer-create "*xwidget-log*")))
151 (save-excursion 184 (save-excursion
152 (buffer-disable-undo buf) 185 (buffer-disable-undo buf)
@@ -168,13 +201,17 @@ defaults to the string looking like a url around the cursor position."
168 (funcall 'xwidget-webkit-callback xwidget xwidget-event-type))) 201 (funcall 'xwidget-webkit-callback xwidget xwidget-event-type)))
169 202
170(defun xwidget-webkit-callback (xwidget xwidget-event-type) 203(defun xwidget-webkit-callback (xwidget xwidget-event-type)
204 "Callback for xwidgets.
205XWIDGET instance, XWIDGET-EVENT-TYPE depends on the originating xwidget."
171 (save-excursion 206 (save-excursion
172 (cond ((buffer-live-p (xwidget-buffer xwidget)) 207 (cond ((buffer-live-p (xwidget-buffer xwidget))
173 (set-buffer (xwidget-buffer xwidget)) 208 (set-buffer (xwidget-buffer xwidget))
174 (let* ((strarg (nth 3 last-input-event))) 209 (let* ((strarg (nth 3 last-input-event)))
175 (cond ((eq xwidget-event-type 'document-load-finished) 210 (cond ((eq xwidget-event-type 'document-load-finished)
176 (xwidget-log "webkit finished loading: '%s'" (xwidget-webkit-get-title xwidget)) 211 (xwidget-log "webkit finished loading: '%s'" (xwidget-webkit-get-title xwidget))
177 (xwidget-adjust-size-to-content xwidget) 212 ;;TODO - check the native/internal scroll
213 ;;(xwidget-adjust-size-to-content xwidget)
214 (xwidget-webkit-adjust-size-dispatch) ;;TODO send xwidget here
178 (rename-buffer (format "*xwidget webkit: %s *" (xwidget-webkit-get-title xwidget))) 215 (rename-buffer (format "*xwidget webkit: %s *" (xwidget-webkit-get-title xwidget)))
179 (pop-to-buffer (current-buffer))) 216 (pop-to-buffer (current-buffer)))
180 ((eq xwidget-event-type 'navigation-policy-decision-requested) 217 ((eq xwidget-event-type 'navigation-policy-decision-requested)
@@ -338,6 +375,18 @@ Argument STR string."
338 (interactive) 375 (interactive)
339 (xwidget-adjust-size-to-content (xwidget-webkit-current-session))) 376 (xwidget-adjust-size-to-content (xwidget-webkit-current-session)))
340 377
378(defun xwidget-webkit-adjust-size-dispatch ()
379 "Adjust size according to mode."
380 (interactive)
381 (if (eq xwidget-webkit-scroll-behaviour 'native)
382 (xwidget-webkit-adjust-size-to-window)
383 (xwidget-webkit-adjust-size-to-content)))
384
385(defun xwidget-webkit-adjust-size-to-window ()
386 "Adjust webkit to window."
387 (interactive)
388 (xwidget-resize ( xwidget-webkit-current-session) (window-pixel-width) (window-pixel-height)))
389
341(defun xwidget-webkit-adjust-size (w h) 390(defun xwidget-webkit-adjust-size (w h)
342 "Manualy set webkit size. 391 "Manualy set webkit size.
343Argument W width. 392Argument W width.
@@ -347,6 +396,7 @@ Argument H height."
347 (xwidget-resize ( xwidget-webkit-current-session) w h)) 396 (xwidget-resize ( xwidget-webkit-current-session) w h))
348 397
349(defun xwidget-webkit-fit-width () 398(defun xwidget-webkit-fit-width ()
399 "Adjust width of webkit to window width."
350 (interactive) 400 (interactive)
351 (xwidget-webkit-adjust-size (- (caddr (window-inside-pixel-edges)) 401 (xwidget-webkit-adjust-size (- (caddr (window-inside-pixel-edges))
352 (car (window-inside-pixel-edges))) 402 (car (window-inside-pixel-edges)))
@@ -383,7 +433,7 @@ Argument H height."
383 (xwidget-webkit-execute-script (xwidget-webkit-current-session) "history.go(0);")) 433 (xwidget-webkit-execute-script (xwidget-webkit-current-session) "history.go(0);"))
384 434
385(defun xwidget-webkit-current-url () 435(defun xwidget-webkit-current-url ()
386 "Get the webkit url. place it on kill ring." 436 "Get the webkit url. place it on kill ring."
387 (interactive) 437 (interactive)
388 (let* ((rv (xwidget-webkit-execute-script-rv (xwidget-webkit-current-session) 438 (let* ((rv (xwidget-webkit-execute-script-rv (xwidget-webkit-current-session)
389 "document.URL")) 439 "document.URL"))
@@ -392,10 +442,13 @@ Argument H height."
392 url)) 442 url))
393 443
394(defun xwidget-webkit-execute-script-rv (xw script &optional default) 444(defun xwidget-webkit-execute-script-rv (xw script &optional default)
395 "same as xwidget-webkit-execute-script but also wraps an ugly hack to return a value" 445 "Same as 'xwidget-webkit-execute-script' but but with return value.
396 ;;notice the fugly "title" hack. it is needed because the webkit api doesnt support returning values. 446XW is the webkit instance. SCRIPT is the script to execut.
397 ;;this is a wrapper for the title hack so its easy to remove should webkit someday support JS return values 447DEFAULT is the defaultreturn value."
398 ;;or we find some other way to access the DOM 448 ;;notice the fugly "title" hack. it is needed because the webkit api
449 ;;doesnt support returning values. this is a wrapper for the title
450 ;;hack so its easy to remove should webkit someday support JS return
451 ;;values or we find some other way to access the DOM
399 452
400 ;;reset webkit title. fugly. 453 ;;reset webkit title. fugly.
401 (let* ((emptytag "titlecantbewhitespaceohthehorror") 454 (let* ((emptytag "titlecantbewhitespaceohthehorror")
@@ -416,10 +469,12 @@ Argument H height."
416 469
417;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 470;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
418(defun xwidget-webkit-get-selection () 471(defun xwidget-webkit-get-selection ()
472 "Get the webkit selection."
419 (xwidget-webkit-execute-script-rv (xwidget-webkit-current-session) 473 (xwidget-webkit-execute-script-rv (xwidget-webkit-current-session)
420 "window.getSelection().toString();")) 474 "window.getSelection().toString();"))
421 475
422(defun xwidget-webkit-copy-selection-as-kill () 476(defun xwidget-webkit-copy-selection-as-kill ()
477 "Get the webkit selection and put it on the kill ring."
423 (interactive) 478 (interactive)
424 (kill-new (xwidget-webkit-get-selection))) 479 (kill-new (xwidget-webkit-get-selection)))
425 480
@@ -442,6 +497,7 @@ It can be retrieved with `(xwidget-get XWIDGET PROPNAME)'."
442;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 497;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
443 498
444(defun xwidget-delete-zombies () 499(defun xwidget-delete-zombies ()
500 "Helper for xwidget-cleanup."
445 (dolist (xwidget-view xwidget-view-list) 501 (dolist (xwidget-view xwidget-view-list)
446 (when (or (not (window-live-p (xwidget-view-window xwidget-view))) 502 (when (or (not (window-live-p (xwidget-view-window xwidget-view)))
447 (not (memq (xwidget-view-model xwidget-view) 503 (not (memq (xwidget-view-model xwidget-view)