X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/b1d5ab0352b6132eee4feaf9091ce7dc7a3e6a84..d703a4dce564ede122f5c307889e4bd0e3f3e75c:/src/window.c diff --git a/src/window.c b/src/window.c index 0b0f2140a5..1d2221fd9b 100644 --- a/src/window.c +++ b/src/window.c @@ -1,6 +1,6 @@ /* Window creation, deletion and examination for GNU Emacs. Does not include redisplay. - Copyright (C) 1985-1987, 1993-1998, 2000-2014 Free Software + Copyright (C) 1985-1987, 1993-1998, 2000-2015 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -45,20 +45,6 @@ along with GNU Emacs. If not, see . */ #include "msdos.h" #endif -Lisp_Object Qwindowp, Qwindow_live_p; -static Lisp_Object Qwindow_valid_p; -static Lisp_Object Qwindow_configuration_p; -static Lisp_Object Qrecord_window_buffer; -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 Qwindow_sanitize_window_sizes; -static Lisp_Object Qwindow_pixel_to_total; -static Lisp_Object Qscroll_up, Qscroll_down, Qscroll_command; -static Lisp_Object Qsafe, Qabove, Qbelow, Qwindow_size, Qclone_of; -static Lisp_Object Qfloor, Qceiling; -static Lisp_Object Qwindow_point_insertion_type; - static int displayed_window_lines (struct window *); static int count_windows (struct window *); static int get_leaf_windows (struct window *, struct window **, int); @@ -115,15 +101,9 @@ Lisp_Object minibuf_window; shown as the selected window when the minibuffer is selected. */ Lisp_Object minibuf_selected_window; -/* Hook run at end of temp_output_buffer_show. */ -static Lisp_Object Qtemp_buffer_show_hook; - /* Incremented for each window created. */ static int sequence_number; -/* Hook to run when window config changes. */ -static Lisp_Object Qwindow_configuration_change_hook; - /* Used by the function window_scroll_pixel_based. */ static int window_scroll_pixel_based_preserve_x; static int window_scroll_pixel_based_preserve_y; @@ -994,7 +974,10 @@ or scroll bars. If PIXELWISE is nil, return the largest integer smaller than WINDOW's pixel width divided by the character width of WINDOW's frame. This means that if a column at the right of the text area is only partially -visible, that column is not counted. */) +visible, that column is not counted. + +Note that the returned value includes the column reserved for the +continuation glyph. */) (Lisp_Object window, Lisp_Object pixelwise) { return make_number (window_body_width (decode_live_window (window), @@ -3014,6 +2997,14 @@ resize_root_window (Lisp_Object window, Lisp_Object delta, Lisp_Object horizonta return call5 (Qwindow_resize_root_window, window, delta, horizontal, ignore, pixelwise); } +/* Placeholder used by temacs -nw before window.el is loaded. */ +DEFUN ("window--sanitize-window-sizes", Fwindow__sanitize_window_sizes, + Swindow__sanitize_window_sizes, 2, 2, 0, + doc: /* */) + (Lisp_Object frame, Lisp_Object horizontal) +{ + return Qnil; +} Lisp_Object sanitize_window_sizes (Lisp_Object frame, Lisp_Object horizontal) @@ -3337,7 +3328,9 @@ run_window_configuration_change_hook (struct frame *f) = Fdefault_value (Qwindow_configuration_change_hook); XSETFRAME (frame, f); - if (NILP (Vrun_hooks) || !(f->official)) + if (NILP (Vrun_hooks) + || !(f->can_x_set_window_size) + || !(f->can_run_window_configuration_change_hook)) return; /* Use the right buffer. Matters when running the local hooks. */ @@ -3643,7 +3636,7 @@ temp_output_buffer_show (register Lisp_Object buf) record_unwind_protect (select_window_norecord, prev_window); Fselect_window (window, Qt); Fset_buffer (w->contents); - Frun_hooks (1, &Qtemp_buffer_show_hook); + run_hook (Qtemp_buffer_show_hook); unbind_to (count, Qnil); } } @@ -4133,11 +4126,7 @@ values. */) /* Resize frame F's windows when number of lines of F is set to SIZE. HORFLAG 1 means resize windows when number of columns of F is set to - SIZE. PIXELWISE 1 means to interpret SIZE as pixels. - - This function can delete all windows but the selected one in order to - satisfy the request. The result will be meaningful if and only if - F's windows have meaningful sizes when you call this. */ + SIZE. PIXELWISE 1 means to interpret SIZE as pixels. */ void resize_frame_windows (struct frame *f, int size, bool horflag, bool pixelwise) { @@ -4867,11 +4856,16 @@ window_internal_height (struct window *w) static void window_scroll (Lisp_Object window, EMACS_INT n, bool whole, int noerror) { + ptrdiff_t count = SPECPDL_INDEX (); + immediate_quit = 1; n = clip_to_bounds (INT_MIN, n, INT_MAX); wset_redisplay (XWINDOW (window)); + if (whole && Vfast_but_imprecise_scrolling) + specbind (Qfontification_functions, Qnil); + /* If we must, use the pixel-based version which is much slower than the line-based one but can handle varying line heights. */ if (FRAME_WINDOW_P (XFRAME (XWINDOW (window)->frame))) @@ -4879,6 +4873,8 @@ window_scroll (Lisp_Object window, EMACS_INT n, bool whole, int noerror) else window_scroll_line_based (window, n, whole, noerror); + unbind_to (count, Qnil); + /* Bug#15957. */ XWINDOW (window)->window_end_valid = 0; immediate_quit = 0; @@ -4930,8 +4926,8 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, int noerror) /* The function move_iterator_vertically may move over more than the specified y-distance. If it->w is small, e.g. a mini-buffer window, we may end up in front of the window's - display area. This is the case when Start displaying at the - start of the line containing PT in this case. */ + display area. Start displaying at the start of the line + containing PT in this case. */ if (it.current_y <= 0) { init_iterator (&it, w, PT, PT_BYTE, NULL, DEFAULT_FACE_ID); @@ -4948,9 +4944,14 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, int noerror) { int px; int dy = frame_line_height; + /* In the below we divide the window box height by the + frame's line height to make the result predictable when + the window box is not an integral multiple of the line + height. This is important to ensure we get back to the + same position when scrolling up, then down. */ if (whole) - dy = max ((window_box_height (w) - - next_screen_context_lines * dy), + dy = max ((window_box_height (w) / dy + - next_screen_context_lines) * dy, dy); dy *= n; @@ -5032,9 +5033,12 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, int noerror) { ptrdiff_t start_pos = IT_CHARPOS (it); int dy = frame_line_height; - - dy = max ((window_box_height (w) - - next_screen_context_lines * dy), + /* In the below we divide the window box height by the frame's + line height to make the result predictable when the window + box is not an integral multiple of the line height. This is + important to ensure we get back to the same position when + scrolling up, then down. */ + dy = max ((window_box_height (w) / dy - next_screen_context_lines) * dy, dy) * n; /* Note that move_it_vertically always moves the iterator to the @@ -6204,8 +6208,8 @@ the return value is nil. Otherwise the value is t. */) call1 (Qrecord_window_buffer, window); } - /* Consider frame unofficial, temporarily. */ - f->official = false; + /* Disallow x_set_window_size, temporarily. */ + f->can_x_set_window_size = false; /* The mouse highlighting code could get screwed up if it runs during this. */ block_input (); @@ -6414,10 +6418,10 @@ the return value is nil. Otherwise the value is t. */) ++n; } - /* Make frame official again and apply frame size changes if + /* Allow x_set_window_size again and apply frame size changes if needed. */ - f->official = true; - adjust_frame_size (f, -1, -1, 1, 0); + f->can_x_set_window_size = true; + adjust_frame_size (f, -1, -1, 1, 0, Qnil); adjust_frame_glyphs (f); unblock_input (); @@ -7335,7 +7339,7 @@ the buffer; `temp-buffer-show-hook' is not run unless this function runs it. */ doc: /* Non-nil means to use `mode-line-inactive' face in non-selected windows. If the minibuffer is active, the `minibuffer-scroll-window' mode line is displayed in the `mode-line' face. */); - mode_line_in_non_selected_windows = 1; + mode_line_in_non_selected_windows = true; DEFVAR_LISP ("other-window-scroll-buffer", Vother_window_scroll_buffer, doc: /* If this is a live buffer, \\[scroll-other-window] should scroll its window. */); @@ -7343,7 +7347,7 @@ is displayed in the `mode-line' face. */); DEFVAR_BOOL ("auto-window-vscroll", auto_window_vscroll_p, doc: /* Non-nil means to automatically adjust `window-vscroll' to view tall lines. */); - auto_window_vscroll_p = 1; + auto_window_vscroll_p = true; DEFVAR_INT ("next-screen-context-lines", next_screen_context_lines, doc: /* Number of lines of continuity when scrolling by screenfuls. */); @@ -7466,7 +7470,18 @@ all functions that symmetrically resize a parent window. Note that when a frame's pixel size is not a multiple of the frame's character size, at least one window may get resized pixelwise even if this option is nil. */); - window_resize_pixelwise = 0; + window_resize_pixelwise = false; + + DEFVAR_BOOL ("fast-but-imprecise-scrolling", + Vfast_but_imprecise_scrolling, + doc: /* When non-nil, accelerate scrolling operations. +This comes into play when scrolling rapidly over previously +unfontified buffer regions. Only those portions of the buffer which +are actually going to be displayed get fontified. + +Note that this optimization can cause the portion of the buffer +displayed after a scrolling operation to be somewhat inaccurate. */); + Vfast_but_imprecise_scrolling = false; defsubr (&Sselected_window); defsubr (&Sminibuffer_window); @@ -7539,6 +7554,7 @@ pixelwise even if this option is nil. */); defsubr (&Sset_window_display_table); defsubr (&Snext_window); defsubr (&Sprevious_window); + defsubr (&Swindow__sanitize_window_sizes); defsubr (&Sget_buffer_window); defsubr (&Sdelete_other_windows_internal); defsubr (&Sdelete_window_internal);