Christophe Weblog Wiki Code Publications Music
fix iplayer commands invoked using M-x
authorChristophe Rhodes <csr21@cantab.net>
Fri, 6 Jul 2012 20:55:43 +0000 (21:55 +0100)
committerChristophe Rhodes <csr21@cantab.net>
Fri, 6 Jul 2012 20:55:43 +0000 (21:55 +0100)
Sure, I only notice this when I have to restart my emacs.  But once is
annoying enough.  The problem was that running M-x iplayer would cause
an error from within execute-extended-command, within the process
sentinel.  After trying to debug this and generating a nifty
unbreakable infinite loop, I finally twigged that it was the
frame/window/buffer frobbing that was the problem.  Piling hack upon
hack, the answer is that we only want to do the frobbing once before
the first command in the command keys, and once after the execution
has finished.  Make it so.

iplayer.el

index 882e5e961f3933464e28bdb8a36027b814bc77ce..cd59ac226eb70917a7ed7f899425d3db22d1dcfa 100644 (file)
                    (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
               ;; 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)