diff options
| author | Joakim Verona | 2015-01-21 00:00:47 +0100 |
|---|---|---|
| committer | Joakim Verona | 2015-01-21 00:00:47 +0100 |
| commit | e1653dd7252539ef9dd723c7f4d40a0d855f39f6 (patch) | |
| tree | 8d58f130f1b228053346e5fcc88aef8aaaacc873 | |
| parent | fee879f0a00bbe3f3389509874ee30a9cbc24cd4 (diff) | |
| download | emacs-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.el | 96 |
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. |
| 24 | given ID, TYPE, TITLE WIDTH and | ||
| 19 | HEIGHT in the current buffer. | 25 | HEIGHT in the current buffer. |
| 20 | 26 | ||
| 21 | Return ID | 27 | Return 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. |
| 63 | the window displaying XWIDGET." | 69 | Return 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. | ||
| 205 | XWIDGET 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. |
| 343 | Argument W width. | 392 | Argument 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. | 446 | XW 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 | 447 | DEFAULT 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) |