diff options
| author | Joakim Verona | 2013-06-12 23:37:36 +0200 |
|---|---|---|
| committer | Joakim Verona | 2013-06-12 23:37:36 +0200 |
| commit | bfa52886b98804a3e1440a03c4c07490568e6407 (patch) | |
| tree | 0d26aa6a7a78a38173f06d48200d9e62d986d468 /lisp | |
| parent | dd7febaa6c58b6c0163ab0f7344ea70b51614460 (diff) | |
| parent | 32a590b04a10f6bbe92bc1519b9e5ba2d32cfabc (diff) | |
| download | emacs-bfa52886b98804a3e1440a03c4c07490568e6407.tar.gz emacs-bfa52886b98804a3e1440a03c4c07490568e6407.zip | |
Merge branch 'xwidget' of https://github.com/daimrod/xwidget-emacs into xwidget
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/xwidget-test.el | 2 | ||||
| -rw-r--r-- | lisp/xwidget.el | 240 |
2 files changed, 124 insertions, 118 deletions
diff --git a/lisp/xwidget-test.el b/lisp/xwidget-test.el index 07b841bdc94..88d2739a209 100644 --- a/lisp/xwidget-test.el +++ b/lisp/xwidget-test.el | |||
| @@ -194,3 +194,5 @@ | |||
| 194 | ; (xwidget-resize-hack 1 200 200) | 194 | ; (xwidget-resize-hack 1 200 200) |
| 195 | 195 | ||
| 196 | ;(xwidget-demo-basic) | 196 | ;(xwidget-demo-basic) |
| 197 | |||
| 198 | (provide 'xwidget-test) | ||
diff --git a/lisp/xwidget.el b/lisp/xwidget.el index 8af8d47c00d..7e556dfa6ba 100644 --- a/lisp/xwidget.el +++ b/lisp/xwidget.el | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | ;;; Commentary: | 5 | ;;; Commentary: |
| 6 | ;; | 6 | ;; |
| 7 | 7 | ||
| 8 | ;;TODO this breaks compilation when we dont have xwidgets | 8 | ;;TODO this breaks compilation when we dont have xwidgets |
| 9 | ;;(require 'xwidget-internal) | 9 | ;;(require 'xwidget-internal) |
| @@ -11,19 +11,22 @@ | |||
| 11 | ;;TODO model after make-text-button instead! | 11 | ;;TODO model after make-text-button instead! |
| 12 | ;;; Code: | 12 | ;;; Code: |
| 13 | 13 | ||
| 14 | (eval-when-compile (require 'cl)) | ||
| 15 | |||
| 14 | (defun xwidget-insert (pos type title width height) | 16 | (defun xwidget-insert (pos type title width height) |
| 15 | "Insert an xwidget at POS, given ID, TYPE, TITLE WIDTH and HEIGHT. | 17 | "Insert an xwidget at POS, given ID, TYPE, TITLE WIDTH and |
| 18 | HEIGHT in the current buffer. | ||
| 19 | |||
| 16 | Return ID | 20 | Return ID |
| 17 | 21 | ||
| 18 | see xwidget.c for types suitable for TYPE." | 22 | see `make-xwidget' for types suitable for TYPE." |
| 19 | (goto-char pos) | 23 | (goto-char pos) |
| 20 | (let ((id (make-xwidget (point) (point) type title width height nil))) | 24 | (let ((id (make-xwidget (point) (point) |
| 21 | (put-text-property (point) | 25 | type title width height nil))) |
| 22 | (+ 1 (point)) 'display (list 'xwidget ':xwidget id)) | 26 | (put-text-property (point) (+ 1 (point)) |
| 23 | 27 | 'display (list 'xwidget ':xwidget id)) | |
| 24 | id)) | 28 | id)) |
| 25 | 29 | ||
| 26 | |||
| 27 | (defun xwidget-at (pos) | 30 | (defun xwidget-at (pos) |
| 28 | "Return xwidget at POS." | 31 | "Return xwidget at POS." |
| 29 | ;;TODO this function is a bit tedious because the C layer isnt well protected yet and | 32 | ;;TODO this function is a bit tedious because the C layer isnt well protected yet and |
| @@ -31,10 +34,7 @@ see xwidget.c for types suitable for TYPE." | |||
| 31 | (let* ((disp (get-text-property pos 'display)) | 34 | (let* ((disp (get-text-property pos 'display)) |
| 32 | (xw (car (cdr (cdr disp))))) | 35 | (xw (car (cdr (cdr disp))))) |
| 33 | ;;(if ( xwidgetp xw) xw nil) | 36 | ;;(if ( xwidgetp xw) xw nil) |
| 34 | (if (equal 'xwidget (car disp)) xw) | 37 | (if (equal 'xwidget (car disp)) xw))) |
| 35 | )) | ||
| 36 | |||
| 37 | |||
| 38 | 38 | ||
| 39 | 39 | ||
| 40 | ;; (defun xwidget-socket-handler () | 40 | ;; (defun xwidget-socket-handler () |
| @@ -63,7 +63,7 @@ see xwidget.c for types suitable for TYPE." | |||
| 63 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 63 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 64 | ;;; webkit support | 64 | ;;; webkit support |
| 65 | (require 'browse-url) | 65 | (require 'browse-url) |
| 66 | (require 'image-mode);;for some image-mode alike functinoality | 66 | (require 'image-mode);;for some image-mode alike functionality |
| 67 | (require 'cl-macs);;for flet | 67 | (require 'cl-macs);;for flet |
| 68 | 68 | ||
| 69 | ;;;###autoload | 69 | ;;;###autoload |
| @@ -72,14 +72,14 @@ see xwidget.c for types suitable for TYPE." | |||
| 72 | NEW-SESSION specifies whether to create a new xwidget-webkit session. URL | 72 | NEW-SESSION specifies whether to create a new xwidget-webkit session. URL |
| 73 | defaults to the string looking like a url around the cursor position." | 73 | defaults to the string looking like a url around the cursor position." |
| 74 | (interactive (progn | 74 | (interactive (progn |
| 75 | (require 'browse-url) | 75 | (require 'browse-url) |
| 76 | (browse-url-interactive-arg "xwidget-webkit URL: " | 76 | (browse-url-interactive-arg "xwidget-webkit URL: " |
| 77 | ;;( xwidget-webkit-current-url) | 77 | ;;( xwidget-webkit-current-url) |
| 78 | ))) | 78 | ))) |
| 79 | (when (stringp url) | 79 | (when (stringp url) |
| 80 | (setq url (url-tidy url)) | 80 | (setq url (url-tidy url)) |
| 81 | (if new-session | 81 | (if new-session |
| 82 | (xwidget-webkit-new-session url) | 82 | (xwidget-webkit-new-session url) |
| 83 | (xwidget-webkit-goto-url url)))) | 83 | (xwidget-webkit-goto-url url)))) |
| 84 | 84 | ||
| 85 | 85 | ||
| @@ -97,7 +97,7 @@ defaults to the string looking like a url around the cursor position." | |||
| 97 | (funcall ,fn )))) | 97 | (funcall ,fn )))) |
| 98 | 98 | ||
| 99 | (defmacro xwidget-image-mode-navigation-adaptor-p (fn) | 99 | (defmacro xwidget-image-mode-navigation-adaptor-p (fn) |
| 100 | "Image code adaptor. `image-mode' FN is called with interactive arg." | 100 | "Image code adaptor. `image-mode' FN is called with interactive arg." |
| 101 | `(lambda (n) (interactive "p") | 101 | `(lambda (n) (interactive "p") |
| 102 | (cl-flet ((image-display-size (spec) (xwidget-image-display-size spec))) | 102 | (cl-flet ((image-display-size (spec) (xwidget-image-display-size spec))) |
| 103 | (funcall ,fn n)))) | 103 | (funcall ,fn n)))) |
| @@ -116,26 +116,26 @@ defaults to the string looking like a url around the cursor position." | |||
| 116 | (define-key map "w" 'xwidget-webkit-current-url) | 116 | (define-key map "w" 'xwidget-webkit-current-url) |
| 117 | 117 | ||
| 118 | ;;similar to image mode bindings | 118 | ;;similar to image mode bindings |
| 119 | (define-key map (kbd "SPC") (xwidget-image-mode-navigation-adaptor 'image-scroll-up)) | 119 | (define-key map (kbd "SPC") (xwidget-image-mode-navigation-adaptor 'image-scroll-up)) |
| 120 | (define-key map (kbd "DEL") (xwidget-image-mode-navigation-adaptor 'image-scroll-down)) | 120 | (define-key map (kbd "DEL") (xwidget-image-mode-navigation-adaptor 'image-scroll-down)) |
| 121 | 121 | ||
| 122 | (define-key map [remap scroll-up] (xwidget-image-mode-navigation-adaptor 'image-scroll-up)) | 122 | (define-key map [remap scroll-up] (xwidget-image-mode-navigation-adaptor 'image-scroll-up)) |
| 123 | (define-key map [remap scroll-up-command] (xwidget-image-mode-navigation-adaptor 'image-scroll-up)) | 123 | (define-key map [remap scroll-up-command] (xwidget-image-mode-navigation-adaptor 'image-scroll-up)) |
| 124 | 124 | ||
| 125 | (define-key map [remap scroll-down] (xwidget-image-mode-navigation-adaptor 'image-scroll-down)) | 125 | (define-key map [remap scroll-down] (xwidget-image-mode-navigation-adaptor 'image-scroll-down)) |
| 126 | (define-key map [remap scroll-down-command] (xwidget-image-mode-navigation-adaptor 'image-scroll-down)) | 126 | (define-key map [remap scroll-down-command] (xwidget-image-mode-navigation-adaptor 'image-scroll-down)) |
| 127 | 127 | ||
| 128 | (define-key map [remap forward-char] (xwidget-image-mode-navigation-adaptor-p 'image-forward-hscroll)) | 128 | (define-key map [remap forward-char] (xwidget-image-mode-navigation-adaptor-p 'image-forward-hscroll)) |
| 129 | (define-key map [remap backward-char] (xwidget-image-mode-navigation-adaptor-p 'image-backward-hscroll)) | 129 | (define-key map [remap backward-char] (xwidget-image-mode-navigation-adaptor-p 'image-backward-hscroll)) |
| 130 | (define-key map [remap right-char] (xwidget-image-mode-navigation-adaptor-p 'image-forward-hscroll)) | 130 | (define-key map [remap right-char] (xwidget-image-mode-navigation-adaptor-p 'image-forward-hscroll)) |
| 131 | (define-key map [remap left-char] (xwidget-image-mode-navigation-adaptor-p 'image-backward-hscroll)) | 131 | (define-key map [remap left-char] (xwidget-image-mode-navigation-adaptor-p 'image-backward-hscroll)) |
| 132 | (define-key map [remap previous-line] (xwidget-image-mode-navigation-adaptor-p 'image-previous-line)) | 132 | (define-key map [remap previous-line] (xwidget-image-mode-navigation-adaptor-p 'image-previous-line)) |
| 133 | (define-key map [remap next-line] (xwidget-image-mode-navigation-adaptor-p 'image-next-line)) | 133 | (define-key map [remap next-line] (xwidget-image-mode-navigation-adaptor-p 'image-next-line)) |
| 134 | 134 | ||
| 135 | (define-key map [remap move-beginning-of-line] (xwidget-image-mode-navigation-adaptor-p 'image-bol)) | 135 | (define-key map [remap move-beginning-of-line] (xwidget-image-mode-navigation-adaptor-p 'image-bol)) |
| 136 | (define-key map [remap move-end-of-line] (xwidget-image-mode-navigation-adaptor-p 'image-eol)) | 136 | (define-key map [remap move-end-of-line] (xwidget-image-mode-navigation-adaptor-p 'image-eol)) |
| 137 | (define-key map [remap beginning-of-buffer] (xwidget-image-mode-navigation-adaptor 'image-bob)) | 137 | (define-key map [remap beginning-of-buffer] (xwidget-image-mode-navigation-adaptor 'image-bob)) |
| 138 | (define-key map [remap end-of-buffer] (xwidget-image-mode-navigation-adaptor 'image-eob)) | 138 | (define-key map [remap end-of-buffer] (xwidget-image-mode-navigation-adaptor 'image-eob)) |
| 139 | map) | 139 | map) |
| 140 | "Keymap for `xwidget-webkit-mode'.") | 140 | "Keymap for `xwidget-webkit-mode'.") |
| 141 | 141 | ||
| @@ -162,42 +162,36 @@ defaults to the string looking like a url around the cursor position." | |||
| 162 | ) | 162 | ) |
| 163 | ;(funcall xwidget-callback xwidget xwidget-event-type) | 163 | ;(funcall xwidget-callback xwidget xwidget-event-type) |
| 164 | (message "xw callback %s" xwidget) | 164 | (message "xw callback %s" xwidget) |
| 165 | (funcall 'xwidget-webkit-callback xwidget xwidget-event-type) | 165 | (funcall 'xwidget-webkit-callback xwidget xwidget-event-type))) |
| 166 | )) | ||
| 167 | 166 | ||
| 168 | (defun xwidget-webkit-callback (xwidget xwidget-event-type) | 167 | (defun xwidget-webkit-callback (xwidget xwidget-event-type) |
| 169 | (save-excursion | 168 | (save-excursion |
| 170 | (cond ( (buffer-live-p (xwidget-buffer xwidget)) | 169 | (cond ((buffer-live-p (xwidget-buffer xwidget)) |
| 171 | (set-buffer (xwidget-buffer xwidget)) | 170 | (set-buffer (xwidget-buffer xwidget)) |
| 172 | (let* ( (strarg (nth 3 last-input-event))) | 171 | (let* ((strarg (nth 3 last-input-event))) |
| 173 | (cond ((eq xwidget-event-type 'document-load-finished) | 172 | (cond ((eq xwidget-event-type 'document-load-finished) |
| 174 | (xwidget-log "webkit finished loading: '%s'" (xwidget-webkit-get-title xwidget)) | 173 | (xwidget-log "webkit finished loading: '%s'" (xwidget-webkit-get-title xwidget)) |
| 175 | (xwidget-adjust-size-to-content xwidget) | 174 | (xwidget-adjust-size-to-content xwidget) |
| 176 | (rename-buffer (format "*xwidget webkit: %s *" (xwidget-webkit-get-title xwidget))) | 175 | (rename-buffer (format "*xwidget webkit: %s *" (xwidget-webkit-get-title xwidget))) |
| 177 | (pop-to-buffer (current-buffer)) | 176 | (pop-to-buffer (current-buffer))) |
| 178 | ) | 177 | ((eq xwidget-event-type 'navigation-policy-decision-requested) |
| 179 | 178 | (if (string-match ".*#\\(.*\\)" strarg) | |
| 180 | ((eq xwidget-event-type 'navigation-policy-decision-requested) | 179 | (xwidget-webkit-show-id-or-named-element xwidget (match-string 1 strarg)))) |
| 181 | (if (string-match ".*#\\(.*\\)" strarg) | 180 | (t (xwidget-log "unhandled event:%s" xwidget-event-type))))) |
| 182 | (xwidget-webkit-show-id-or-named-element xwidget (match-string 1 strarg)))) | ||
| 183 | (t (xwidget-log "unhandled event:%s" xwidget-event-type))))) | ||
| 184 | (t (xwidget-log "error: callback called for xwidget with dead buffer"))))) | 181 | (t (xwidget-log "error: callback called for xwidget with dead buffer"))))) |
| 185 | 182 | ||
| 186 | (define-derived-mode xwidget-webkit-mode | 183 | (define-derived-mode xwidget-webkit-mode |
| 187 | special-mode "xwidget-webkit" "xwidget webkit view mode" | 184 | special-mode "xwidget-webkit" "xwidget webkit view mode" |
| 188 | (setq buffer-read-only t) | 185 | (setq buffer-read-only t) |
| 189 | ;; Keep track of [vh]scroll when switching buffers | 186 | ;; Keep track of [vh]scroll when switching buffers |
| 190 | (image-mode-setup-winprops) | 187 | (image-mode-setup-winprops)) |
| 191 | |||
| 192 | ) | ||
| 193 | 188 | ||
| 194 | (defvar xwidget-webkit-last-session-buffer nil) | 189 | (defvar xwidget-webkit-last-session-buffer nil) |
| 195 | 190 | ||
| 196 | (defun xwidget-webkit-last-session () | 191 | (defun xwidget-webkit-last-session () |
| 197 | "Last active webkit, or nil." | 192 | "Last active webkit, or nil." |
| 198 | (if (buffer-live-p xwidget-webkit-last-session-buffer) | 193 | (if (buffer-live-p xwidget-webkit-last-session-buffer) |
| 199 | (save-excursion | 194 | (with-current-buffer xwidget-webkit-last-session-buffer |
| 200 | (set-buffer xwidget-webkit-last-session-buffer) | ||
| 201 | (xwidget-at 1)) | 195 | (xwidget-at 1)) |
| 202 | nil)) | 196 | nil)) |
| 203 | 197 | ||
| @@ -238,13 +232,13 @@ function findactiveelement(doc){ | |||
| 238 | 232 | ||
| 239 | " | 233 | " |
| 240 | 234 | ||
| 241 | "javascript that finds the active element." | 235 | "javascript that finds the active element." |
| 242 | ;;yes its ugly. because: | 236 | ;;yes its ugly. because: |
| 243 | ;; - there is aparently no way to find the active frame other than recursion | 237 | ;; - there is aparently no way to find the active frame other than recursion |
| 244 | ;; - the js "for each" construct missbehaved on the "frames" collection | 238 | ;; - the js "for each" construct missbehaved on the "frames" collection |
| 245 | ;; - a window with no frameset still has frames.length == 1, but frames[0].document.activeElement != document.activeElement | 239 | ;; - a window with no frameset still has frames.length == 1, but frames[0].document.activeElement != document.activeElement |
| 246 | ;;TODO the activeelement type needs to be examined, for iframe, etc. sucks. | 240 | ;;TODO the activeelement type needs to be examined, for iframe, etc. sucks. |
| 247 | ) | 241 | ) |
| 248 | 242 | ||
| 249 | (defun xwidget-webkit-insert-string (xw str) | 243 | (defun xwidget-webkit-insert-string (xw str) |
| 250 | "Insert string in the active field in the webkit. | 244 | "Insert string in the active field in the webkit. |
| @@ -258,27 +252,29 @@ Argument STR string." | |||
| 258 | (progn | 252 | (progn |
| 259 | (xwidget-webkit-execute-script xww xwidget-webkit-activeelement-js) | 253 | (xwidget-webkit-execute-script xww xwidget-webkit-activeelement-js) |
| 260 | (xwidget-webkit-execute-script-rv xww "findactiveelement(document).value;" ))) | 254 | (xwidget-webkit-execute-script-rv xww "findactiveelement(document).value;" ))) |
| 261 | (field-type (xwidget-webkit-execute-script-rv xww "findactiveelement(document).type;" ))) | 255 | (field-type (xwidget-webkit-execute-script-rv xww "findactiveelement(document).type;" ))) |
| 262 | (list xww | 256 | (list xww |
| 263 | (cond ( (equal "text" field-type) (read-string "text:" field-value)) | 257 | (cond ((equal "text" field-type) |
| 264 | ( (equal "password" field-type) (read-passwd "password:" nil field-value)) | 258 | (read-string "text:" field-value)) |
| 265 | ( (equal "textarea" field-type) (xwidget-webkit-begin-edit-textarea xww field-value)) | 259 | ((equal "password" field-type) |
| 266 | )))) | 260 | (read-passwd "password:" nil field-value)) |
| 261 | ((equal "textarea" field-type) | ||
| 262 | (xwidget-webkit-begin-edit-textarea xww field-value)))))) | ||
| 267 | (xwidget-webkit-execute-script xw (format "findactiveelement(document).value='%s'" str))) | 263 | (xwidget-webkit-execute-script xw (format "findactiveelement(document).value='%s'" str))) |
| 268 | 264 | ||
| 269 | 265 | ||
| 270 | (defun xwidget-webkit-begin-edit-textarea (xw text) | 266 | (defun xwidget-webkit-begin-edit-textarea (xw text) |
| 271 | (switch-to-buffer | 267 | (switch-to-buffer |
| 272 | (generate-new-buffer "textarea")) | 268 | (generate-new-buffer "textarea")) |
| 273 | 269 | ||
| 274 | (set (make-local-variable 'xwbl) xw) | 270 | (set (make-local-variable 'xwbl) xw) |
| 275 | (insert text) | 271 | (insert text)) |
| 276 | ) | ||
| 277 | 272 | ||
| 278 | (defun xwidget-webkit-end-edit-textarea () | 273 | (defun xwidget-webkit-end-edit-textarea () |
| 279 | (interactive) | 274 | (interactive) |
| 280 | (goto-char (point-min)) | 275 | (goto-char (point-min)) |
| 281 | (replace-string "\n" "\\n") | 276 | (while (search-forward "\n" nil t) |
| 277 | (replace-match "\\n" nil t)) | ||
| 282 | (xwidget-webkit-execute-script xwbl (format "findactiveelement(document).value='%s'" | 278 | (xwidget-webkit-execute-script xwbl (format "findactiveelement(document).value='%s'" |
| 283 | (buffer-substring (point-min) (point-max)))) | 279 | (buffer-substring (point-min) (point-max)))) |
| 284 | ;;TODO convert linefeed to \n | 280 | ;;TODO convert linefeed to \n |
| @@ -295,42 +291,49 @@ Argument STR string." | |||
| 295 | ;; - the selected window is scrolled but this is not always correct | 291 | ;; - the selected window is scrolled but this is not always correct |
| 296 | ;; - this needs to be interfaced into browse-url somehow. the tricky part is that we need to do this in two steps: | 292 | ;; - this needs to be interfaced into browse-url somehow. the tricky part is that we need to do this in two steps: |
| 297 | ;; A: load the base url, wait for load signal to arrive B: navigate to the anchor when the base url is finished rendering | 293 | ;; A: load the base url, wait for load signal to arrive B: navigate to the anchor when the base url is finished rendering |
| 298 | 294 | ||
| 299 | ;;this part figures out the Y coordinate of the element | 295 | ;;this part figures out the Y coordinate of the element |
| 300 | (let ((y | 296 | (let ((y (string-to-number |
| 301 | (string-to-number (xwidget-webkit-execute-script-rv xw (format "document.getElementsByName('%s')[0].getBoundingClientRect().top" element-name) 0)))) | 297 | (xwidget-webkit-execute-script-rv xw |
| 302 | ;;now we need to tell emacs to scroll the element into view. | 298 | (format "document.getElementsByName('%s')[0].getBoundingClientRect().top" element-name) |
| 299 | 0)))) | ||
| 300 | ;;now we need to tell emacs to scroll the element into view. | ||
| 303 | (xwidget-log "scroll: %d" y) | 301 | (xwidget-log "scroll: %d" y) |
| 304 | (set-window-vscroll (selected-window) y t)) | 302 | (set-window-vscroll (selected-window) y t))) |
| 305 | ) | ||
| 306 | 303 | ||
| 307 | (defun xwidget-webkit-show-id-element (xw element-id) | 304 | (defun xwidget-webkit-show-id-element (xw element-id) |
| 308 | "make id-element show. for instance an anchor." | 305 | "make id-element show. for instance an anchor." |
| 309 | (interactive (list (xwidget-webkit-current-session) (read-string "element id:"))) | 306 | (interactive (list (xwidget-webkit-current-session) |
| 310 | (let ((y | 307 | (read-string "element id:"))) |
| 311 | (string-to-number (xwidget-webkit-execute-script-rv xw (format "document.getElementById('%s').getBoundingClientRect().top" element-id) 0)))) | 308 | (let ((y (string-to-number |
| 312 | ;;now we need to tell emacs to scroll the element into view. | 309 | (xwidget-webkit-execute-script-rv xw |
| 310 | (format "document.getElementById('%s').getBoundingClientRect().top" element-id) | ||
| 311 | 0)))) | ||
| 312 | ;;now we need to tell emacs to scroll the element into view. | ||
| 313 | (xwidget-log "scroll: %d" y) | 313 | (xwidget-log "scroll: %d" y) |
| 314 | (set-window-vscroll (selected-window) y t)) | 314 | (set-window-vscroll (selected-window) y t))) |
| 315 | ) | ||
| 316 | 315 | ||
| 317 | (defun xwidget-webkit-show-id-or-named-element (xw element-id) | 316 | (defun xwidget-webkit-show-id-or-named-element (xw element-id) |
| 318 | "make id-element show. for instance an anchor." | 317 | "make id-element show. for instance an anchor." |
| 319 | (interactive (list (xwidget-webkit-current-session) (read-string "element id:"))) | 318 | (interactive (list (xwidget-webkit-current-session) |
| 320 | (let* ((y1 | 319 | (read-string "element id:"))) |
| 321 | (string-to-number (xwidget-webkit-execute-script-rv xw (format "document.getElementsByName('%s')[0].getBoundingClientRect().top" element-id) "0"))) | 320 | (let* ((y1 (string-to-number |
| 322 | (y2 | 321 | (xwidget-webkit-execute-script-rv xw |
| 323 | (string-to-number (xwidget-webkit-execute-script-rv xw (format "document.getElementById('%s').getBoundingClientRect().top" element-id) "0"))) | 322 | (format "document.getElementsByName('%s')[0].getBoundingClientRect().top" element-id) |
| 324 | (y3 (max y1 y2))) | 323 | "0"))) |
| 325 | ;;now we need to tell emacs to scroll the element into view. | 324 | (y2 (string-to-number |
| 325 | (xwidget-webkit-execute-script-rv xw | ||
| 326 | (format "document.getElementById('%s').getBoundingClientRect().top" element-id) | ||
| 327 | "0"))) | ||
| 328 | (y3 (max y1 y2))) | ||
| 329 | ;;now we need to tell emacs to scroll the element into view. | ||
| 326 | (xwidget-log "scroll: %d" y3) | 330 | (xwidget-log "scroll: %d" y3) |
| 327 | (set-window-vscroll (selected-window) y3 t)) | 331 | (set-window-vscroll (selected-window) y3 t))) |
| 328 | ) | ||
| 329 | 332 | ||
| 330 | (defun xwidget-webkit-adjust-size-to-content () | 333 | (defun xwidget-webkit-adjust-size-to-content () |
| 331 | "Adjust webkit to content size." | 334 | "Adjust webkit to content size." |
| 332 | (interactive) | 335 | (interactive) |
| 333 | ( xwidget-adjust-size-to-content ( xwidget-webkit-current-session))) | 336 | (xwidget-adjust-size-to-content (xwidget-webkit-current-session))) |
| 334 | 337 | ||
| 335 | (defun xwidget-webkit-adjust-size (w h) | 338 | (defun xwidget-webkit-adjust-size (w h) |
| 336 | "Manualy set webkit size. | 339 | "Manualy set webkit size. |
| @@ -338,16 +341,16 @@ Argument W width. | |||
| 338 | Argument H height." | 341 | Argument H height." |
| 339 | ;;TODO shouldnt be tied to the webkit xwidget | 342 | ;;TODO shouldnt be tied to the webkit xwidget |
| 340 | (interactive "nWidth:\nnHeight:\n") | 343 | (interactive "nWidth:\nnHeight:\n") |
| 341 | ( xwidget-resize ( xwidget-webkit-current-session) w h)) | 344 | (xwidget-resize ( xwidget-webkit-current-session) w h)) |
| 342 | 345 | ||
| 343 | (defun xwidget-webkit-fit-width () | 346 | (defun xwidget-webkit-fit-width () |
| 344 | (interactive) | 347 | (interactive) |
| 345 | (xwidget-webkit-adjust-size | 348 | (xwidget-webkit-adjust-size (- (caddr (window-inside-pixel-edges)) |
| 346 | (- (caddr (window-inside-pixel-edges)) (car (window-inside-pixel-edges))) | 349 | (car (window-inside-pixel-edges))) |
| 347 | 1000)) | 350 | 1000)) |
| 348 | 351 | ||
| 349 | (defun xwidget-webkit-new-session (url) | 352 | (defun xwidget-webkit-new-session (url) |
| 350 | "Create a new webkit session buffer with URL." | 353 | "Create a new webkit session buffer with URL." |
| 351 | (let* | 354 | (let* |
| 352 | ((bufname (generate-new-buffer-name "*xwidget-webkit*")) | 355 | ((bufname (generate-new-buffer-name "*xwidget-webkit*")) |
| 353 | xw) | 356 | xw) |
| @@ -356,31 +359,32 @@ Argument H height." | |||
| 356 | (setq xw (xwidget-insert 1 'webkit-osr bufname 1000 1000)) | 359 | (setq xw (xwidget-insert 1 'webkit-osr bufname 1000 1000)) |
| 357 | (xwidget-put xw 'callback 'xwidget-webkit-callback) | 360 | (xwidget-put xw 'callback 'xwidget-webkit-callback) |
| 358 | (xwidget-webkit-mode) | 361 | (xwidget-webkit-mode) |
| 359 | (xwidget-webkit-goto-uri ( xwidget-webkit-last-session) url ))) | 362 | (xwidget-webkit-goto-uri (xwidget-webkit-last-session) url ))) |
| 360 | 363 | ||
| 361 | 364 | ||
| 362 | (defun xwidget-webkit-goto-url (url) | 365 | (defun xwidget-webkit-goto-url (url) |
| 363 | "Goto URL." | 366 | "Goto URL." |
| 364 | (if ( xwidget-webkit-current-session) | 367 | (if (xwidget-webkit-current-session) |
| 365 | (progn | 368 | (progn |
| 366 | (xwidget-webkit-goto-uri ( xwidget-webkit-current-session) url)) | 369 | (xwidget-webkit-goto-uri (xwidget-webkit-current-session) url)) |
| 367 | ( xwidget-webkit-new-session url))) | 370 | (xwidget-webkit-new-session url))) |
| 368 | 371 | ||
| 369 | (defun xwidget-webkit-back () | 372 | (defun xwidget-webkit-back () |
| 370 | "Back in history." | 373 | "Back in history." |
| 371 | (interactive) | 374 | (interactive) |
| 372 | (xwidget-webkit-execute-script ( xwidget-webkit-current-session) "history.go(-1);")) | 375 | (xwidget-webkit-execute-script (xwidget-webkit-current-session) "history.go(-1);")) |
| 373 | 376 | ||
| 374 | (defun xwidget-webkit-reload () | 377 | (defun xwidget-webkit-reload () |
| 375 | "Reload current url." | 378 | "Reload current url." |
| 376 | (interactive) | 379 | (interactive) |
| 377 | (xwidget-webkit-execute-script ( xwidget-webkit-current-session) "history.go(0);")) | 380 | (xwidget-webkit-execute-script (xwidget-webkit-current-session) "history.go(0);")) |
| 378 | 381 | ||
| 379 | (defun xwidget-webkit-current-url () | 382 | (defun xwidget-webkit-current-url () |
| 380 | "Get the webkit url. place it on kill ring." | 383 | "Get the webkit url. place it on kill ring." |
| 381 | (interactive) | 384 | (interactive) |
| 382 | (let* ((rv (xwidget-webkit-execute-script-rv (xwidget-webkit-current-session) "document.URL")) | 385 | (let* ((rv (xwidget-webkit-execute-script-rv (xwidget-webkit-current-session) |
| 383 | (url (kill-new (if rv rv "")))) | 386 | "document.URL")) |
| 387 | (url (kill-new (or rv "")))) | ||
| 384 | (message "url: %s" url ) | 388 | (message "url: %s" url ) |
| 385 | url)) | 389 | url)) |
| 386 | 390 | ||
| @@ -391,13 +395,15 @@ Argument H height." | |||
| 391 | ;;or we find some other way to access the DOM | 395 | ;;or we find some other way to access the DOM |
| 392 | 396 | ||
| 393 | ;;reset webkit title. fugly. | 397 | ;;reset webkit title. fugly. |
| 394 | (let* ( (emptytag "titlecantbewhitespaceohthehorror") | 398 | (let* ((emptytag "titlecantbewhitespaceohthehorror") |
| 395 | title) | 399 | title) |
| 396 | (xwidget-webkit-execute-script xw (format "document.title=\"%s\";" (if default default emptytag))) | 400 | (xwidget-webkit-execute-script xw (format "document.title=\"%s\";" (or default emptytag))) |
| 397 | (xwidget-webkit-execute-script xw (format "document.title=%s;" script)) | 401 | (xwidget-webkit-execute-script xw (format "document.title=%s;" script)) |
| 398 | (setq title (xwidget-webkit-get-title xw)) | 402 | (setq title (xwidget-webkit-get-title xw)) |
| 399 | (if (equal emptytag title) (setq title "")) | 403 | (if (equal emptytag title) |
| 400 | (unless title (setq title default)) | 404 | (setq title "")) |
| 405 | (unless title | ||
| 406 | (setq title default)) | ||
| 401 | title)) | 407 | title)) |
| 402 | 408 | ||
| 403 | 409 | ||
| @@ -427,7 +433,7 @@ This is the last value stored with `(xwidget-put XWIDGET PROPNAME VALUE)'." | |||
| 427 | "Change XWIDGET' PROPNAME property to VALUE. | 433 | "Change XWIDGET' PROPNAME property to VALUE. |
| 428 | It can be retrieved with `(xwidget-get XWIDGET PROPNAME)'." | 434 | It can be retrieved with `(xwidget-get XWIDGET PROPNAME)'." |
| 429 | (set-xwidget-plist xwidget | 435 | (set-xwidget-plist xwidget |
| 430 | (plist-put (xwidget-plist xwidget) propname value))) | 436 | (plist-put (xwidget-plist xwidget) propname value))) |
| 431 | 437 | ||
| 432 | 438 | ||
| 433 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 439 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| @@ -463,6 +469,4 @@ yet, so deinstall Flash instead for now." | |||
| 463 | 469 | ||
| 464 | (provide 'xwidget) | 470 | (provide 'xwidget) |
| 465 | 471 | ||
| 466 | (provide 'xwidget) | ||
| 467 | |||
| 468 | ;;; xwidget.el ends here | 472 | ;;; xwidget.el ends here |