diff options
| author | Martin Rudalics | 2016-08-21 11:36:11 +0200 |
|---|---|---|
| committer | Martin Rudalics | 2016-08-21 11:36:11 +0200 |
| commit | 1a1062d6e16f97effa7030cc5f297c9c57b232ad (patch) | |
| tree | aec1647cdd2b5f098f49baba5836af8ccff3c89e /src | |
| parent | f0ee3ca5a92d5503268da7f9e0d71a1a58893c8a (diff) | |
| download | emacs-1a1062d6e16f97effa7030cc5f297c9c57b232ad.tar.gz emacs-1a1062d6e16f97effa7030cc5f297c9c57b232ad.zip | |
Fix semantics of 'minibuffer' frame parameter
The 'minibuffer' frame parameter is now t for a normal frame
(a frame with a root window plus a minibuffer window) and the
frame's minibuffer window for a minibuffer-less frame (a frame
whose minibuffer window is on another frame). See also:
https://lists.gnu.org/archive/html/emacs-devel/2016-07/msg01259.html
* src/frame.c (make_frame, make_frame_without_minibuffer)
(make_minibuffer_frame): When assigning the frame's minibuffer
window also store corresponding 'minibuffer' frame parameter.
(store_frame_param): Move the 'minibuffer' parameter checks to
the beginning so we can silently override the value before it
gets stored in the parameter alist. Fix error handling.
(Fframe_parameters): Return value of 'minibuffer' parameter
unmodified.
* lisp/frameset.el (frameset-filter-minibuffer): When the cdr of
the parameter is a minibuffer window, save (minibuffer . nil)
instead of (minibuffer . t).
(frameset--reuse-frame): To find a non-minibuffer-only frame
look out for a frame whose 'minibuffer' parameter is t instead
of that frame's minibuffer window.
(frameset-minibufferless-first-p): To find a minibuffer-less
frame look out for a frame whose 'minibuffer' parameter is a
window instead of nil.
Diffstat (limited to 'src')
| -rw-r--r-- | src/frame.c | 60 |
1 files changed, 43 insertions, 17 deletions
diff --git a/src/frame.c b/src/frame.c index 899c315016b..e17c8acfc3c 100644 --- a/src/frame.c +++ b/src/frame.c | |||
| @@ -658,6 +658,7 @@ make_frame (bool mini_p) | |||
| 658 | mw->mini = 1; | 658 | mw->mini = 1; |
| 659 | wset_frame (mw, frame); | 659 | wset_frame (mw, frame); |
| 660 | fset_minibuffer_window (f, mini_window); | 660 | fset_minibuffer_window (f, mini_window); |
| 661 | store_frame_param (f, Qminibuffer, Qt); | ||
| 661 | } | 662 | } |
| 662 | else | 663 | else |
| 663 | { | 664 | { |
| @@ -770,6 +771,7 @@ make_frame_without_minibuffer (Lisp_Object mini_window, KBOARD *kb, | |||
| 770 | } | 771 | } |
| 771 | 772 | ||
| 772 | fset_minibuffer_window (f, mini_window); | 773 | fset_minibuffer_window (f, mini_window); |
| 774 | store_frame_param (f, Qminibuffer, mini_window); | ||
| 773 | 775 | ||
| 774 | /* Make the chosen minibuffer window display the proper minibuffer, | 776 | /* Make the chosen minibuffer window display the proper minibuffer, |
| 775 | unless it is already showing a minibuffer. */ | 777 | unless it is already showing a minibuffer. */ |
| @@ -807,6 +809,7 @@ make_minibuffer_frame (void) | |||
| 807 | 809 | ||
| 808 | mini_window = f->root_window; | 810 | mini_window = f->root_window; |
| 809 | fset_minibuffer_window (f, mini_window); | 811 | fset_minibuffer_window (f, mini_window); |
| 812 | store_frame_param (f, Qminibuffer, Qonly); | ||
| 810 | XWINDOW (mini_window)->mini = 1; | 813 | XWINDOW (mini_window)->mini = 1; |
| 811 | wset_next (XWINDOW (mini_window), Qnil); | 814 | wset_next (XWINDOW (mini_window), Qnil); |
| 812 | wset_prev (XWINDOW (mini_window), Qnil); | 815 | wset_prev (XWINDOW (mini_window), Qnil); |
| @@ -2404,6 +2407,46 @@ store_frame_param (struct frame *f, Lisp_Object prop, Lisp_Object val) | |||
| 2404 | { | 2407 | { |
| 2405 | register Lisp_Object old_alist_elt; | 2408 | register Lisp_Object old_alist_elt; |
| 2406 | 2409 | ||
| 2410 | if (EQ (prop, Qminibuffer)) | ||
| 2411 | { | ||
| 2412 | if (WINDOWP (val)) | ||
| 2413 | { | ||
| 2414 | if (!MINI_WINDOW_P (XWINDOW (val))) | ||
| 2415 | error ("The 'minibuffer' parameter does not specify a valid minibuffer window"); | ||
| 2416 | else if (FRAME_MINIBUF_ONLY_P (f)) | ||
| 2417 | { | ||
| 2418 | if (EQ (val, FRAME_MINIBUF_WINDOW (f))) | ||
| 2419 | val = Qonly; | ||
| 2420 | else | ||
| 2421 | error ("Can't change the minibuffer window of a minibuffer-only frame"); | ||
| 2422 | } | ||
| 2423 | else if (FRAME_HAS_MINIBUF_P (f)) | ||
| 2424 | { | ||
| 2425 | if (EQ (val, FRAME_MINIBUF_WINDOW (f))) | ||
| 2426 | val = Qt; | ||
| 2427 | else | ||
| 2428 | error ("Can't change the minibuffer window of a frame with its own minibuffer"); | ||
| 2429 | } | ||
| 2430 | else | ||
| 2431 | /* Store the chosen minibuffer window. */ | ||
| 2432 | fset_minibuffer_window (f, val); | ||
| 2433 | } | ||
| 2434 | else | ||
| 2435 | { | ||
| 2436 | Lisp_Object old_val = Fcdr (Fassq (Qminibuffer, f->param_alist)); | ||
| 2437 | |||
| 2438 | if (!NILP (old_val)) | ||
| 2439 | { | ||
| 2440 | if (WINDOWP (old_val) && NILP (val)) | ||
| 2441 | /* Don't change the value for a minibuffer-less frame if | ||
| 2442 | only nil was specified as new value. */ | ||
| 2443 | val = old_val; | ||
| 2444 | else if (!EQ (old_val, val)) | ||
| 2445 | error ("Can't change the 'minibuffer' parameter of this frame"); | ||
| 2446 | } | ||
| 2447 | } | ||
| 2448 | } | ||
| 2449 | |||
| 2407 | /* The buffer-list parameters are stored in a special place and not | 2450 | /* The buffer-list parameters are stored in a special place and not |
| 2408 | in the alist. All buffers must be live. */ | 2451 | in the alist. All buffers must be live. */ |
| 2409 | if (EQ (prop, Qbuffer_list)) | 2452 | if (EQ (prop, Qbuffer_list)) |
| @@ -2475,19 +2518,6 @@ store_frame_param (struct frame *f, Lisp_Object prop, Lisp_Object val) | |||
| 2475 | else if (EQ (prop, Qname)) | 2518 | else if (EQ (prop, Qname)) |
| 2476 | set_term_frame_name (f, val); | 2519 | set_term_frame_name (f, val); |
| 2477 | } | 2520 | } |
| 2478 | |||
| 2479 | if (EQ (prop, Qminibuffer) && WINDOWP (val)) | ||
| 2480 | { | ||
| 2481 | if (! MINI_WINDOW_P (XWINDOW (val))) | ||
| 2482 | error ("Surrogate minibuffer windows must be minibuffer windows"); | ||
| 2483 | |||
| 2484 | if ((FRAME_HAS_MINIBUF_P (f) || FRAME_MINIBUF_ONLY_P (f)) | ||
| 2485 | && !EQ (val, f->minibuffer_window)) | ||
| 2486 | error ("Can't change the surrogate minibuffer of a frame with its own minibuffer"); | ||
| 2487 | |||
| 2488 | /* Install the chosen minibuffer window, with proper buffer. */ | ||
| 2489 | fset_minibuffer_window (f, val); | ||
| 2490 | } | ||
| 2491 | } | 2521 | } |
| 2492 | 2522 | ||
| 2493 | /* Return color matches UNSPEC on frame F or nil if UNSPEC | 2523 | /* Return color matches UNSPEC on frame F or nil if UNSPEC |
| @@ -2565,10 +2595,6 @@ If FRAME is omitted or nil, return information on the currently selected frame. | |||
| 2565 | : FRAME_COLS (f)); | 2595 | : FRAME_COLS (f)); |
| 2566 | store_in_alist (&alist, Qwidth, make_number (width)); | 2596 | store_in_alist (&alist, Qwidth, make_number (width)); |
| 2567 | store_in_alist (&alist, Qmodeline, (FRAME_WANTS_MODELINE_P (f) ? Qt : Qnil)); | 2597 | store_in_alist (&alist, Qmodeline, (FRAME_WANTS_MODELINE_P (f) ? Qt : Qnil)); |
| 2568 | store_in_alist (&alist, Qminibuffer, | ||
| 2569 | (! FRAME_HAS_MINIBUF_P (f) ? Qnil | ||
| 2570 | : FRAME_MINIBUF_ONLY_P (f) ? Qonly | ||
| 2571 | : FRAME_MINIBUF_WINDOW (f))); | ||
| 2572 | store_in_alist (&alist, Qunsplittable, (FRAME_NO_SPLIT_P (f) ? Qt : Qnil)); | 2598 | store_in_alist (&alist, Qunsplittable, (FRAME_NO_SPLIT_P (f) ? Qt : Qnil)); |
| 2573 | store_in_alist (&alist, Qbuffer_list, f->buffer_list); | 2599 | store_in_alist (&alist, Qbuffer_list, f->buffer_list); |
| 2574 | store_in_alist (&alist, Qburied_buffer_list, f->buried_buffer_list); | 2600 | store_in_alist (&alist, Qburied_buffer_list, f->buried_buffer_list); |