diff options
Diffstat (limited to 'lisp/net/eudc-bob.el')
| -rw-r--r-- | lisp/net/eudc-bob.el | 130 |
1 files changed, 47 insertions, 83 deletions
diff --git a/lisp/net/eudc-bob.el b/lisp/net/eudc-bob.el index 56ea033a963..bb6682520ae 100644 --- a/lisp/net/eudc-bob.el +++ b/lisp/net/eudc-bob.el | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | ;;; eudc-bob.el --- Binary Objects Support for EUDC | 1 | ;;; eudc-bob.el --- Binary Objects Support for EUDC -*- lexical-binding: t; -*- |
| 2 | 2 | ||
| 3 | ;; Copyright (C) 1999-2020 Free Software Foundation, Inc. | 3 | ;; Copyright (C) 1999-2020 Free Software Foundation, Inc. |
| 4 | 4 | ||
| @@ -39,19 +39,41 @@ | |||
| 39 | 39 | ||
| 40 | (require 'eudc) | 40 | (require 'eudc) |
| 41 | 41 | ||
| 42 | (defvar eudc-bob-generic-keymap nil | 42 | (defvar eudc-bob-generic-keymap |
| 43 | (let ((map (make-sparse-keymap))) | ||
| 44 | (define-key map "s" 'eudc-bob-save-object) | ||
| 45 | (define-key map "!" 'eudc-bob-pipe-object-to-external-program) | ||
| 46 | (define-key map [down-mouse-3] 'eudc-bob-popup-menu) | ||
| 47 | map) | ||
| 43 | "Keymap for multimedia objects.") | 48 | "Keymap for multimedia objects.") |
| 44 | 49 | ||
| 45 | (defvar eudc-bob-image-keymap nil | 50 | (defvar eudc-bob-image-keymap |
| 51 | (let ((map (make-sparse-keymap))) | ||
| 52 | (set-keymap-parent map eudc-bob-generic-keymap) | ||
| 53 | (define-key map "t" 'eudc-bob-toggle-inline-display) | ||
| 54 | map) | ||
| 46 | "Keymap for inline images.") | 55 | "Keymap for inline images.") |
| 47 | 56 | ||
| 48 | (defvar eudc-bob-sound-keymap nil | 57 | (defvar eudc-bob-sound-keymap |
| 58 | (let ((map (make-sparse-keymap))) | ||
| 59 | (set-keymap-parent map eudc-bob-generic-keymap) | ||
| 60 | (define-key map (kbd "RET") 'eudc-bob-play-sound-at-point) | ||
| 61 | (define-key map [down-mouse-2] 'eudc-bob-play-sound-at-mouse) | ||
| 62 | map) | ||
| 49 | "Keymap for inline sounds.") | 63 | "Keymap for inline sounds.") |
| 50 | 64 | ||
| 51 | (defvar eudc-bob-url-keymap nil | 65 | (defvar eudc-bob-url-keymap |
| 66 | (let ((map (make-sparse-keymap))) | ||
| 67 | (define-key map (kbd "RET") 'browse-url-at-point) | ||
| 68 | (define-key map [down-mouse-2] 'browse-url-at-mouse) | ||
| 69 | map) | ||
| 52 | "Keymap for inline urls.") | 70 | "Keymap for inline urls.") |
| 53 | 71 | ||
| 54 | (defvar eudc-bob-mail-keymap nil | 72 | (defvar eudc-bob-mail-keymap |
| 73 | (let ((map (make-sparse-keymap))) | ||
| 74 | (define-key map (kbd "RET") 'goto-address-at-point) | ||
| 75 | (define-key map [down-mouse-2] 'goto-address-at-point) | ||
| 76 | map) | ||
| 55 | "Keymap for inline e-mail addresses.") | 77 | "Keymap for inline e-mail addresses.") |
| 56 | 78 | ||
| 57 | (defvar eudc-bob-generic-menu | 79 | (defvar eudc-bob-generic-menu |
| @@ -74,13 +96,6 @@ | |||
| 74 | (fboundp 'play-sound-internal)] | 96 | (fboundp 'play-sound-internal)] |
| 75 | ,@(cdr (cdr eudc-bob-generic-menu)))) | 97 | ,@(cdr (cdr eudc-bob-generic-menu)))) |
| 76 | 98 | ||
| 77 | (defun eudc-jump-to-event (event) | ||
| 78 | "Jump to the window and point where EVENT occurred." | ||
| 79 | (if (fboundp 'event-closest-point) | ||
| 80 | (goto-char (event-closest-point event)) | ||
| 81 | (set-buffer (window-buffer (posn-window (event-start event)))) | ||
| 82 | (goto-char (posn-point (event-start event))))) | ||
| 83 | |||
| 84 | (defun eudc-bob-get-overlay-prop (prop) | 99 | (defun eudc-bob-get-overlay-prop (prop) |
| 85 | "Get property PROP from one of the overlays around." | 100 | "Get property PROP from one of the overlays around." |
| 86 | (let ((overlays (append (overlays-at (1- (point))) | 101 | (let ((overlays (append (overlays-at (1- (point))) |
| @@ -205,42 +220,30 @@ display a button." | |||
| 205 | "Play the sound data contained in the button where EVENT occurred." | 220 | "Play the sound data contained in the button where EVENT occurred." |
| 206 | (interactive "e") | 221 | (interactive "e") |
| 207 | (save-excursion | 222 | (save-excursion |
| 208 | (eudc-jump-to-event event) | 223 | (mouse-set-point event) |
| 209 | (eudc-bob-play-sound-at-point))) | 224 | (eudc-bob-play-sound-at-point))) |
| 210 | 225 | ||
| 211 | (defun eudc-bob-save-object () | 226 | (defun eudc-bob-save-object (filename) |
| 212 | "Save the object data of the button at point." | 227 | "Save the object data of the button at point." |
| 213 | (interactive) | 228 | (interactive "fWrite file: ") |
| 214 | (let ((data (eudc-bob-get-overlay-prop 'object-data)) | 229 | (let ((data (eudc-bob-get-overlay-prop 'object-data)) |
| 215 | (buffer (generate-new-buffer "*eudc-tmp*"))) | 230 | (coding-system-for-write 'binary)) ;Inhibit EOL conversion. |
| 216 | (save-excursion | 231 | (write-region data nil filename))) |
| 217 | (set-buffer-file-coding-system 'binary) | ||
| 218 | (set-buffer buffer) | ||
| 219 | (set-buffer-multibyte nil) | ||
| 220 | (insert data) | ||
| 221 | (save-buffer)) | ||
| 222 | (kill-buffer buffer))) | ||
| 223 | 232 | ||
| 224 | (defun eudc-bob-pipe-object-to-external-program () | 233 | (defun eudc-bob-pipe-object-to-external-program (program) |
| 225 | "Pipe the object data of the button at point to an external program." | 234 | "Pipe the object data of the button at point to an external program." |
| 226 | (interactive) | 235 | (interactive (list (completing-read "Viewer: " eudc-external-viewers))) |
| 227 | (let ((data (eudc-bob-get-overlay-prop 'object-data)) | 236 | (let ((data (eudc-bob-get-overlay-prop 'object-data)) |
| 228 | (buffer (generate-new-buffer "*eudc-tmp*")) | 237 | (viewer (assoc program eudc-external-viewers))) |
| 229 | program | 238 | (with-temp-buffer |
| 230 | viewer) | 239 | (set-buffer-multibyte nil) |
| 231 | (condition-case nil | 240 | (insert data) |
| 232 | (save-excursion | 241 | (let ((coding-system-for-write 'binary)) ;Inhibit EOL conversion |
| 233 | (set-buffer-file-coding-system 'binary) | 242 | (if viewer |
| 234 | (set-buffer buffer) | 243 | (call-process-region (point-min) (point-max) |
| 235 | (insert data) | 244 | (car (cdr viewer)) |
| 236 | (setq program (completing-read "Viewer: " eudc-external-viewers)) | 245 | (cdr (cdr viewer))) |
| 237 | (if (setq viewer (assoc program eudc-external-viewers)) | 246 | (call-process-region (point-min) (point-max) program)))))) |
| 238 | (call-process-region (point-min) (point-max) | ||
| 239 | (car (cdr viewer)) | ||
| 240 | (cdr (cdr viewer))) | ||
| 241 | (call-process-region (point-min) (point-max) program))) | ||
| 242 | (error | ||
| 243 | (kill-buffer buffer))))) | ||
| 244 | 247 | ||
| 245 | (defun eudc-bob-menu () | 248 | (defun eudc-bob-menu () |
| 246 | "Retrieve the menu attached to a binary object." | 249 | "Retrieve the menu attached to a binary object." |
| @@ -250,47 +253,8 @@ display a button." | |||
| 250 | "Pop-up a menu of EUDC multimedia commands." | 253 | "Pop-up a menu of EUDC multimedia commands." |
| 251 | (interactive "@e") | 254 | (interactive "@e") |
| 252 | (run-hooks 'activate-menubar-hook) | 255 | (run-hooks 'activate-menubar-hook) |
| 253 | (eudc-jump-to-event event) | 256 | (mouse-set-point event) |
| 254 | (let ((result (x-popup-menu t (eudc-bob-menu))) | 257 | (popup-menu (eudc-bob-menu) event)) |
| 255 | command) | ||
| 256 | (if result | ||
| 257 | (progn | ||
| 258 | (setq command (lookup-key (eudc-bob-menu) | ||
| 259 | (apply 'vector result))) | ||
| 260 | (command-execute command))))) | ||
| 261 | |||
| 262 | (setq eudc-bob-generic-keymap | ||
| 263 | (let ((map (make-sparse-keymap))) | ||
| 264 | (define-key map "s" 'eudc-bob-save-object) | ||
| 265 | (define-key map "!" 'eudc-bob-pipe-object-to-external-program) | ||
| 266 | (define-key map [down-mouse-3] 'eudc-bob-popup-menu) | ||
| 267 | map)) | ||
| 268 | |||
| 269 | (setq eudc-bob-image-keymap | ||
| 270 | (let ((map (make-sparse-keymap))) | ||
| 271 | (define-key map "t" 'eudc-bob-toggle-inline-display) | ||
| 272 | map)) | ||
| 273 | |||
| 274 | (setq eudc-bob-sound-keymap | ||
| 275 | (let ((map (make-sparse-keymap))) | ||
| 276 | (define-key map [return] 'eudc-bob-play-sound-at-point) | ||
| 277 | (define-key map [down-mouse-2] 'eudc-bob-play-sound-at-mouse) | ||
| 278 | map)) | ||
| 279 | |||
| 280 | (setq eudc-bob-url-keymap | ||
| 281 | (let ((map (make-sparse-keymap))) | ||
| 282 | (define-key map [return] 'browse-url-at-point) | ||
| 283 | (define-key map [down-mouse-2] 'browse-url-at-mouse) | ||
| 284 | map)) | ||
| 285 | |||
| 286 | (setq eudc-bob-mail-keymap | ||
| 287 | (let ((map (make-sparse-keymap))) | ||
| 288 | (define-key map [return] 'goto-address-at-point) | ||
| 289 | (define-key map [down-mouse-2] 'goto-address-at-point) | ||
| 290 | map)) | ||
| 291 | |||
| 292 | (set-keymap-parent eudc-bob-image-keymap eudc-bob-generic-keymap) | ||
| 293 | (set-keymap-parent eudc-bob-sound-keymap eudc-bob-generic-keymap) | ||
| 294 | 258 | ||
| 295 | ;; If the first arguments can be nil here, then these 3 can be | 259 | ;; If the first arguments can be nil here, then these 3 can be |
| 296 | ;; defconsts once more. | 260 | ;; defconsts once more. |