aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Rudalics2016-08-21 11:36:11 +0200
committerMartin Rudalics2016-08-21 11:36:11 +0200
commit1a1062d6e16f97effa7030cc5f297c9c57b232ad (patch)
treeaec1647cdd2b5f098f49baba5836af8ccff3c89e /src
parentf0ee3ca5a92d5503268da7f9e0d71a1a58893c8a (diff)
downloademacs-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.c60
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);