X-Git-Url: http://christophe.rhodes.io/gitweb/?p=iplayer-el.git;a=blobdiff_plain;f=iplayer.el;h=3a9ab641766c7372a8a537dae3fe20703111b145;hp=882e5e961f3933464e28bdb8a36027b814bc77ce;hb=ec77e299afe71c69d575594d27a87935fb34840d;hpb=561c68511a2aa272c658192b6e1c08fe666196ed diff --git a/iplayer.el b/iplayer.el index 882e5e9..3a9ab64 100644 --- a/iplayer.el +++ b/iplayer.el @@ -23,12 +23,8 @@ (lambda () (select-frame iplayer-command-frame) (select-window iplayer-command-window) - (set-buffer iplayer-command-buffer))) - (post-command-hook - (lambda () - (select-window old-window) - (select-frame old-frame) - (set-buffer old-buffer)))) + (set-buffer iplayer-command-buffer) + (setq pre-command-hook nil)))) ;; KLUDGE: execute-kbd-macro executes a normal ;; command-loop, whose first action is to select the ;; current frame and window, which is why we contort @@ -37,7 +33,11 @@ ;; that it works, but mine is not too much to reason ;; why; lots of other ways to try to achieve this didn't ;; in fact work. - (execute-kbd-macro keys)))))) + (execute-kbd-macro keys) + ;; KLUDGE: and then we restore old state + (select-window old-window) + (select-frame old-frame) + (set-buffer old-buffer)))))) (message "Done updating iPlayer cache"))) (defmacro define-iplayer-command (name arglist &rest body) @@ -58,7 +58,7 @@ (message "Updating iPlayer cache")) (if iplayer-updating-cache-sentinel-executing (progn ,@body) - (push (list (selected-frame) (selected-window) (current-buffer) (this-command-keys)) + (push (list (selected-frame) (selected-window) (current-buffer) (this-command-keys-vector)) iplayer-updating-cache-sentinel-info))))) (defun get-iplayer-tree (&rest args) @@ -152,6 +152,29 @@ The presets are defined in the variable `iplayer-presets'." (start-process "get-iplayer" " *get-iplayer*" "get-iplayer" "--get" (format "%s" id))) (message "no id at point")))) +(defun iplayer-previous () + (interactive) + (save-match-data + (outline-previous-heading) + (while (and (= (funcall outline-level) 1) (not (bobp))) + (outline-previous-heading))) + (hide-other) + (unless (bobp) + (save-excursion + (outline-up-heading 1 t) + (show-children)))) + +(defun iplayer-next () + (interactive) + (save-match-data + (outline-next-heading) + (while (and (= (funcall outline-level) 1) (not (eobp))) + (outline-next-heading))) + (hide-other) + (save-excursion + (outline-up-heading 1 t) + (show-children))) + (defconst iplayer-mode-map (let ((map (make-sparse-keymap))) (define-key map (kbd "0") 'iplayer) @@ -160,6 +183,8 @@ The presets are defined in the variable `iplayer-presets'." (define-key map (read-kbd-macro (substring presets i (1+ i))) 'iplayer-preset))) (define-key map (kbd "RET") 'iplayer-download) + (define-key map (kbd "j") 'iplayer-next) + (define-key map (kbd "k") 'iplayer-previous) map ))