X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/4d7e6e51dd4acecff466a28d958c50f34fc130b8..ef862e206a28f6618048c8b28413fa8f9c135c61:/src/window.c diff --git a/src/window.c b/src/window.c index 86f86deedb..467c086104 100644 --- a/src/window.c +++ b/src/window.c @@ -1,7 +1,7 @@ /* Window creation, deletion and examination for GNU Emacs. Does not include redisplay. - Copyright (C) 1985-1987, 1993-1998, 2000-2012 - Free Software Foundation, Inc. + Copyright (C) 1985-1987, 1993-1998, 2000-2013 Free Software + Foundation, Inc. This file is part of GNU Emacs. @@ -43,7 +43,7 @@ along with GNU Emacs. If not, see . */ #ifdef HAVE_X_WINDOWS #include "xterm.h" #endif /* HAVE_X_WINDOWS */ -#ifdef WINDOWSNT +#ifdef HAVE_NTGUI #include "w32term.h" #endif #ifdef MSDOS @@ -60,7 +60,7 @@ static Lisp_Object Qwindow_deletable_p, Qdelete_window, Qdisplay_buffer; static Lisp_Object Qreplace_buffer_in_windows, Qget_mru_window; static Lisp_Object Qwindow_resize_root_window, Qwindow_resize_root_window_vertically; static Lisp_Object Qscroll_up, Qscroll_down, Qscroll_command; -static Lisp_Object Qsafe, Qabove, Qbelow, Qtemp_buffer_resize, Qclone_of; +static Lisp_Object Qsafe, Qabove, Qbelow, Qwindow_size, Qclone_of; static int displayed_window_lines (struct window *); static int count_windows (struct window *); @@ -133,102 +133,102 @@ static EMACS_INT window_scroll_preserve_hpos; static EMACS_INT window_scroll_preserve_vpos; /* These setters are used only in this file, so they can be private. */ -static inline void +static void wset_combination_limit (struct window *w, Lisp_Object val) { w->combination_limit = val; } -static inline void +static void wset_dedicated (struct window *w, Lisp_Object val) { w->dedicated = val; } -static inline void +static void wset_display_table (struct window *w, Lisp_Object val) { w->display_table = val; } -static inline void +static void wset_hchild (struct window *w, Lisp_Object val) { w->hchild = val; } -static inline void +static void wset_left_fringe_width (struct window *w, Lisp_Object val) { w->left_fringe_width = val; } -static inline void +static void wset_left_margin_cols (struct window *w, Lisp_Object val) { w->left_margin_cols = val; } -static inline void +static void wset_new_normal (struct window *w, Lisp_Object val) { w->new_normal = val; } -static inline void +static void wset_new_total (struct window *w, Lisp_Object val) { w->new_total = val; } -static inline void +static void wset_normal_cols (struct window *w, Lisp_Object val) { w->normal_cols = val; } -static inline void +static void wset_normal_lines (struct window *w, Lisp_Object val) { w->normal_lines = val; } -static inline void +static void wset_parent (struct window *w, Lisp_Object val) { w->parent = val; } -static inline void +static void wset_pointm (struct window *w, Lisp_Object val) { w->pointm = val; } -static inline void +static void wset_right_fringe_width (struct window *w, Lisp_Object val) { w->right_fringe_width = val; } -static inline void +static void wset_right_margin_cols (struct window *w, Lisp_Object val) { w->right_margin_cols = val; } -static inline void +static void wset_scroll_bar_width (struct window *w, Lisp_Object val) { w->scroll_bar_width = val; } -static inline void +static void wset_start (struct window *w, Lisp_Object val) { w->start = val; } -static inline void +static void wset_temslot (struct window *w, Lisp_Object val) { w->temslot = val; } -static inline void +static void wset_vchild (struct window *w, Lisp_Object val) { w->vchild = val; } -static inline void +static void wset_vertical_scroll_bar_type (struct window *w, Lisp_Object val) { w->vertical_scroll_bar_type = val; } -static inline void +static void wset_window_parameters (struct window *w, Lisp_Object val) { w->window_parameters = val; @@ -523,9 +523,11 @@ select_window (Lisp_Object window, Lisp_Object norecord, int inhibit_point_swap) } DEFUN ("select-window", Fselect_window, Sselect_window, 1, 2, 0, - doc: /* Select WINDOW. Most editing will apply to WINDOW's buffer. -Also make WINDOW's buffer current and make WINDOW the frame's selected -window. Return WINDOW. + doc: /* Select WINDOW which must be a live window. +Also make WINDOW's frame the selected frame and WINDOW that frame's +selected window. In addition, make WINDOW's buffer current and set that +buffer's value of `point' to the value of WINDOW's `window-point'. +Return WINDOW. Optional second arg NORECORD non-nil means do not put this buffer at the front of the buffer list and do not make this window the most recently @@ -600,10 +602,12 @@ Return nil if WINDOW has no previous sibling. */) DEFUN ("window-combination-limit", Fwindow_combination_limit, Swindow_combination_limit, 1, 1, 0, doc: /* Return combination limit of window WINDOW. -WINDOW must be a valid window and defaults to the selected one. -If the return value is nil, child windows of WINDOW can be recombined with -WINDOW's siblings. A return value of t means that child windows of -WINDOW are never \(re-)combined with WINDOW's siblings. */) +If the return value is nil, child windows of WINDOW can be recombined +with WINDOW's siblings. A return value of t means that child windows of +WINDOW are never \(re-)combined with WINDOW's siblings. + +WINDOW must be a valid window. The return value is meaningful for +internal windows only. */) (Lisp_Object window) { return decode_valid_window (window)->combination_limit; @@ -611,11 +615,13 @@ WINDOW are never \(re-)combined with WINDOW's siblings. */) DEFUN ("set-window-combination-limit", Fset_window_combination_limit, Sset_window_combination_limit, 2, 2, 0, doc: /* Set combination limit of window WINDOW to LIMIT; return LIMIT. -WINDOW must be a valid window and defaults to the selected one. If LIMIT is nil, child windows of WINDOW can be recombined with WINDOW's siblings. LIMIT t means that child windows of WINDOW are never \(re-)combined with WINDOW's siblings. Other values are reserved for -future use. */) +future use. + +WINDOW must be a valid window. Setting the combination limit is +meaningful for internal windows only. */) (Lisp_Object window, Lisp_Object limit) { wset_combination_limit (decode_valid_window (window), limit); @@ -1464,9 +1470,7 @@ if it isn't already recorded. */) #endif if (! NILP (update) - && ! (! NILP (w->window_end_valid) - && w->last_modified >= BUF_MODIFF (b) - && w->last_overlay_modified >= BUF_OVERLAY_MODIFF (b)) + && (windows_or_buffers_changed || NILP (w->window_end_valid)) && !noninteractive) { struct text_pos startp; @@ -3341,7 +3345,7 @@ displaying that buffer. */) return Qnil; } - +/* Obsolete since 24.3. */ void temp_output_buffer_show (register Lisp_Object buf) { @@ -3394,16 +3398,6 @@ temp_output_buffer_show (register Lisp_Object buf) } } } - -DEFUN ("internal-temp-output-buffer-show", - Ftemp_output_buffer_show, Stemp_output_buffer_show, - 1, 1, 0, - doc: /* Internal function for `with-output-to-temp-buffer'. */) - (Lisp_Object buf) -{ - temp_output_buffer_show (buf); - return Qnil; -} /* Make new window, have it replace WINDOW in window-tree, and make WINDOW its only vertical child (HORFLAG 1 means make WINDOW its only @@ -3795,6 +3789,8 @@ resize_frame_windows (struct frame *f, int size, int horflag) (m, make_number (XINT (r->top_line) + XINT (r->total_lines))); } } + + windows_or_buffers_changed++; } @@ -3902,9 +3898,10 @@ set correctly. See the code of `split-window' for how this is done. */) make_parent_window (old, horflag); p = XWINDOW (o->parent); - /* Store t in the new parent's combination_limit slot to avoid - that its children get merged into another window. */ - wset_combination_limit (p, Qt); + if (EQ (Vwindow_combination_limit, Qt)) + /* Store t in the new parent's combination_limit slot to avoid + that its children get merged into another window. */ + wset_combination_limit (p, Qt); /* These get applied below. */ wset_new_total (p, horflag ? o->total_cols : o->total_lines); wset_new_normal (p, new_normal); @@ -4208,6 +4205,7 @@ grow_mini_window (struct window *w, int delta) w->last_modified = 0; w->last_overlay_modified = 0; + windows_or_buffers_changed++; adjust_glyphs (f); unblock_input (); } @@ -4245,6 +4243,7 @@ shrink_mini_window (struct window *w) w->last_modified = 0; w->last_overlay_modified = 0; + windows_or_buffers_changed++; adjust_glyphs (f); unblock_input (); } @@ -6421,15 +6420,8 @@ optional second arg PIXELS-P means value is measured in pixels. */) (Lisp_Object window, Lisp_Object pixels_p) { Lisp_Object result; - struct frame *f; - struct window *w; - - if (NILP (window)) - window = selected_window; - else - CHECK_WINDOW (window); - w = XWINDOW (window); - f = XFRAME (w->frame); + struct window *w = decode_live_window (window); + struct frame *f = XFRAME (w->frame); if (FRAME_WINDOW_P (f)) result = (NILP (pixels_p) @@ -6453,18 +6445,11 @@ result of this rounding. If PIXELS-P is non-nil, the return value is VSCROLL. */) (Lisp_Object window, Lisp_Object vscroll, Lisp_Object pixels_p) { - struct window *w; - struct frame *f; + struct window *w = decode_live_window (window); + struct frame *f = XFRAME (w->frame); - if (NILP (window)) - window = selected_window; - else - CHECK_WINDOW (window); CHECK_NUMBER_OR_FLOAT (vscroll); - w = XWINDOW (window); - f = XFRAME (w->frame); - if (FRAME_WINDOW_P (f)) { int old_dy = w->vscroll; @@ -6704,7 +6689,7 @@ syms_of_window (void) DEFSYM (Qreplace_buffer_in_windows, "replace-buffer-in-windows"); DEFSYM (Qrecord_window_buffer, "record-window-buffer"); DEFSYM (Qget_mru_window, "get-mru-window"); - DEFSYM (Qtemp_buffer_resize, "temp-buffer-resize"); + DEFSYM (Qwindow_size, "window-size"); DEFSYM (Qtemp_buffer_show_hook, "temp-buffer-show-hook"); DEFSYM (Qabove, "above"); DEFSYM (Qbelow, "below"); @@ -6804,19 +6789,19 @@ This variable takes no effect if `window-combination-limit' is non-nil. */); The following values are recognized: nil means splitting a window will create a new parent window only if the - window has no parent window or the window shall become a combination - orthogonal to the one it is part of. + window has no parent window or the window shall become part of a + combination orthogonal to the one it is part of. -`temp-buffer-resize' means that splitting a window for displaying a - temporary buffer makes a new parent window provided - `temp-buffer-resize-mode' is enabled. Otherwise, this value is - handled like nil. +`window-size' means that splitting a window for displaying a buffer + makes a new parent window provided `display-buffer' is supposed to + explicitly set the window's size due to the presence of a + `window-height' or `window-width' entry in the alist used by + `display-buffer'. Otherwise, this value is handled like nil. `temp-buffer' means that splitting a window for displaying a temporary buffer always makes a new parent window. Otherwise, this value is handled like nil. - `display-buffer' means that splitting a window for displaying a buffer always makes a new parent window. Since temporary buffers are displayed by the function `display-buffer', this value is stronger @@ -6829,7 +6814,7 @@ t means that splitting a window always creates a new parent window. If sibling. Other values are reserved for future use. */); - Vwindow_combination_limit = Qtemp_buffer_resize; + Vwindow_combination_limit = Qwindow_size; DEFVAR_LISP ("window-persistent-parameters", Vwindow_persistent_parameters, doc: /* Alist of persistent window parameters. @@ -6921,7 +6906,6 @@ respectively are not installed by `window-state-put'. */); defsubr (&Srun_window_configuration_change_hook); defsubr (&Sselect_window); defsubr (&Sforce_window_update); - defsubr (&Stemp_output_buffer_show); defsubr (&Ssplit_window_internal); defsubr (&Sscroll_up); defsubr (&Sscroll_down);