• Alan Mackenzie's avatar
    Fix incompleteness in the implementation of minibuffer-follows-selected-frame · c7c154bb
    Alan Mackenzie authored
    In particular, add a new value to the variable, and fix several bugs apparent
    with the implementation up till now.
    
    * doc/emacs/mini.texi (Basic Minibuffer): Add a description of the new
    non-nil, non-t value of minibuffer-follows-selected-frame.
    
    * doc/emacs/trouble.texi (Quitting): Add a description of how C-g handles
    recursive minibuffers when typed in one which isn't the most nested.
    
    * doc/lispref/minibuf.texi (Intro to Minibuffers): Add an @dfn for "active
    minibuffer".
    (Minibuffer Commands): Document that exit-minibuffer throws an error when not
    invoked from the innermost Minibuffer.
    (Recursive Mini): Amend the description of the visibility of outer level
    minibuffers.
    (Minibuffer Misc): In the description of the minibuffer hooks, replace "the
    minibuffer" with "a minibuffer".
    
    * etc/NEWS (Entry announcing minibuffer-follows-selected-frame): Add a
    description of the new non-nil, non-t value.
    
    * lisp/cus-start.el (top level): make the customize entry for
    minibuffer-follows-selected-frame a choice between three entries.
    
    * lisp/minibuffer.el (exit-minibuffer): throw an error when we're not in the
    most nested minibuffer.
    (top level): Bind C-g to abort-minibuffers in minibuffer-local-map.
    
    * lisp/window.el (window-deletable-p): return the symbol `frame' when (amongst
    other things) minibuffer-follows-selected-frame is t.
    
    * src/eval.c (internal_catch): Add a mechanism to (throw 'exit t) repeatedly
    when the throw currently being processed doesn't terminate the current
    minibuffer.
    
    * src/lisp.h (this_minibuffer_depth): New extern declaration
    (minibuf_level): extern declaration moved here from window.h.
    
    * src/minibuf.c (minibuffer_follows_frame, minibuf_stays_put)
    (minibuf_moves_frame_when_opened): New and amended functions to query the
    value of minibuffer-follows-selected-frame.
    (choose_minibuf_frame): check (minibuf > 1) in place of (minibufer > 0) at a
    particular place.  At another place, check that an alleged frame is so and is
    live.  Before selecting a non-miniwindow on a different frame, ensure it
    really is a different frame.
    (move_minibuffer_onto_frame): Stack up all recursive minibuffers on the target
    frame.  Check the minibuf_window isn't in the old frame before setting that
    frame's miniwindow to an inactive minibuffer.
    (Finnermost_minibuffer_p, Fabort_minibuffers): New primitives.
    (this_minibuffer_depth): New function.
    (read_minibuf): Record the calling frame in a variable, and switch back to it
    after the recursive edit has terminated normally, using
    select-frame-set-input-focus.  Stack up all the recursive minibuffers on the
    miniwindow where a new minibuffer is being opened.  After the recursive edit,
    switch the selected window away from the expired minibuffer's window.
    (nth_minibuffer): New function.
    (minibuffer-follows-selected-frame): Change from a DEFVAR_BOOL to a
    DEFVAR_LISP.
    
    * src/window.c (decode_next_window_args): Set *minibuf to w's mini-window's
    content when that content is a minibuffer.
    
    * src/window.h (minibuf_level) Declaration moved from here to lisp.h.
    c7c154bb
lisp.h 160 KB