aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/net/eudc-bob.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/net/eudc-bob.el')
-rw-r--r--lisp/net/eudc-bob.el130
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.