diff options
Diffstat (limited to 'src/window.c')
-rw-r--r-- | src/window.c | 126 |
1 files changed, 63 insertions, 63 deletions
diff --git a/src/window.c b/src/window.c index 47bbf0806ee..d3203c99e90 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,86,87,93,94,95,96,97,1998,2000, 2001, 2002, 2003 + Copyright (C) 1985,86,87, 1993,94,95,96,97,98, 2000,01,02,03,04 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -322,7 +322,11 @@ DEFUN ("pos-visible-in-window-p", Fpos_visible_in_window_p, Return nil if that position is scrolled vertically out of view. If a character is only partially visible, nil is returned, unless the optional argument PARTIALLY is non-nil. -POS defaults to point in WINDOW; WINDOW defaults to the selected window. */) +POS defaults to point in WINDOW; WINDOW defaults to the selected window. + +If POS is visible, return t if PARTIALLY is nil; if PARTIALLY is non-nil, +return value is a list (X Y PARTIAL) where X and Y are the pixel relative +coordinate */) (pos, window, partially) Lisp_Object pos, window, partially; { @@ -330,8 +334,9 @@ POS defaults to point in WINDOW; WINDOW defaults to the selected window. */) register int posint; register struct buffer *buf; struct text_pos top; - Lisp_Object in_window; - int fully_p; + Lisp_Object in_window = Qnil; + int fully_p = 1; + int x, y; w = decode_window (window); buf = XBUFFER (w->buffer); @@ -347,38 +352,20 @@ POS defaults to point in WINDOW; WINDOW defaults to the selected window. */) else posint = XMARKER (w->pointm)->charpos; - /* If position is above window start, it's not visible. */ - if (posint < CHARPOS (top)) - in_window = Qnil; - else if (XFASTINT (w->last_modified) >= BUF_MODIFF (buf) - && XFASTINT (w->last_overlay_modified) >= BUF_OVERLAY_MODIFF (buf) - && posint < BUF_Z (buf) - XFASTINT (w->window_end_pos)) - { - /* If frame is up-to-date, and POSINT is < window end pos, use - that info. This doesn't work for POSINT == end pos, because - the window end pos is actually the position _after_ the last - char in the window. */ - if (NILP (partially)) - { - pos_visible_p (w, posint, &fully_p, NILP (partially)); - in_window = fully_p ? Qt : Qnil; - } - else - in_window = Qt; - } - else if (posint > BUF_ZV (buf)) - in_window = Qnil; - else if (CHARPOS (top) < BUF_BEGV (buf) || CHARPOS (top) > BUF_ZV (buf)) - /* If window start is out of range, do something reasonable. */ - in_window = Qnil; - else - { - if (pos_visible_p (w, posint, &fully_p, NILP (partially))) - in_window = !NILP (partially) || fully_p ? Qt : Qnil; - else - in_window = Qnil; - } - + /* If position is above window start or outside buffer boundaries, + or if window start is out of range, position is not visible. */ + if (posint >= CHARPOS (top) + && posint <= BUF_ZV (buf) + && CHARPOS (top) >= BUF_BEGV (buf) + && CHARPOS (top) <= BUF_ZV (buf) + && pos_visible_p (w, posint, &fully_p, &x, &y, NILP (partially)) + && (!NILP (partially) || fully_p)) + in_window = Qt; + + if (!NILP (in_window) && !NILP (partially)) + in_window = Fcons (make_number (x), + Fcons (make_number (y), + Fcons (fully_p ? Qt : Qnil, Qnil))); return in_window; } @@ -3036,7 +3023,7 @@ set_window_buffer (window, buffer, run_hooks_p, keep_margins_p) DEFUN ("set-window-buffer", Fset_window_buffer, Sset_window_buffer, 2, 3, 0, doc: /* Make WINDOW display BUFFER as its contents. BUFFER can be a buffer or buffer name. -Optional third arg KEEP_MARGINS non-nil means that WINDOW's current +Optional third arg KEEP-MARGINS non-nil means that WINDOW's current display margins, fringe widths, and scroll bar settings are maintained; the default is to reset these from BUFFER's local settings or the frame defaults. */) @@ -3075,8 +3062,8 @@ defaults. */) DEFUN ("select-window", Fselect_window, Sselect_window, 1, 2, 0, doc: /* Select WINDOW. Most editing will apply to WINDOW's buffer. -If WINDOW is not already selected, also make WINDOW's buffer current. -Also make WINDOW the frame's selected window. +If WINDOW is not already selected, make WINDOW's buffer current +and make WINDOW the frame's selected window. Optional second arg NORECORD non-nil means do not put this buffer at the front of the list of recently selected ones. @@ -3283,6 +3270,10 @@ If FRAME is nil, search only the selected frame unless `pop-up-frames' or `display-buffer-reuse-frames' is non-nil, which means search visible and iconified frames. +If a full-width window on a splittable frame is available to display +the buffer, it may be split, subject to the value of the variable +`split-height-threshold'. + If `even-window-heights' is non-nil, window heights will be evened out if displaying the buffer causes two vertically adjacent windows to be displayed. */) @@ -3460,7 +3451,7 @@ DEFUN ("force-window-update", Fforce_window_update, Sforce_window_update, 0, 1, 0, doc: /* Force redisplay of all windows. If optional arg OBJECT is a window, force redisplay of that window only. -If OBJECT is a buffer or buffer name, force redisplay of all windows +If OBJECT is a buffer or buffer name, force redisplay of all windows displaying that buffer. */) (object) Lisp_Object object; @@ -3482,7 +3473,7 @@ displaying that buffer. */) ++update_mode_lines; return Qt; } - + if (STRINGP (object)) object = Fget_buffer (object); if (BUFFERP (object) && !NILP (XBUFFER (object)->name)) @@ -3547,7 +3538,7 @@ temp_output_buffer_show (buf) Lisp_Object prev_window, prev_buffer; prev_window = selected_window; XSETBUFFER (prev_buffer, old); - + /* Select the window that was chosen, for running the hook. Note: Both Fselect_window and select_window_norecord may set-buffer to the buffer displayed in the window, @@ -3598,7 +3589,8 @@ DEFUN ("split-window", Fsplit_window, Ssplit_window, 0, 3, "", WINDOW defaults to selected one and SIZE to half its size. If optional third arg HORFLAG is non-nil, split side by side and put SIZE columns in the first of the pair. In that case, -SIZE includes that window's scroll bar, or the divider column to its right. */) +SIZE includes that window's scroll bar, or the divider column to its right. +Returns the newly-created window. */) (window, size, horflag) Lisp_Object window, size, horflag; { @@ -6067,7 +6059,7 @@ If TYPE is t, use the frame's scroll-bar type. */) vertical_type = Qnil; if (!(EQ (vertical_type, Qnil) - || EQ (vertical_type, Qleft) + || EQ (vertical_type, Qleft) || EQ (vertical_type, Qright) || EQ (vertical_type, Qt))) error ("Invalid type of vertical scroll bar"); @@ -6116,12 +6108,13 @@ value. */) Smooth scrolling ***********************************************************************/ -DEFUN ("window-vscroll", Fwindow_vscroll, Swindow_vscroll, 0, 1, 0, +DEFUN ("window-vscroll", Fwindow_vscroll, Swindow_vscroll, 0, 2, 0, doc: /* Return the amount by which WINDOW is scrolled vertically. Use the selected window if WINDOW is nil or omitted. -Value is a multiple of the canonical character height of WINDOW. */) - (window) - Lisp_Object window; +Normally, value is a multiple of the canonical character height of WINDOW; +optional second arg PIXELS_P means value is measured in pixels. */) + (window, pixels_p) + Lisp_Object window, pixels_p; { Lisp_Object result; struct frame *f; @@ -6135,7 +6128,9 @@ Value is a multiple of the canonical character height of WINDOW. */) f = XFRAME (w->frame); if (FRAME_WINDOW_P (f)) - result = FRAME_CANON_Y_FROM_PIXEL_Y (f, -w->vscroll); + result = (NILP (pixels_p) + ? FRAME_CANON_Y_FROM_PIXEL_Y (f, -w->vscroll) + : make_number (-w->vscroll)); else result = make_number (0); return result; @@ -6143,12 +6138,13 @@ Value is a multiple of the canonical character height of WINDOW. */) DEFUN ("set-window-vscroll", Fset_window_vscroll, Sset_window_vscroll, - 2, 2, 0, + 2, 3, 0, doc: /* Set amount by which WINDOW should be scrolled vertically to VSCROLL. -WINDOW nil means use the selected window. VSCROLL is a non-negative -multiple of the canonical character height of WINDOW. */) - (window, vscroll) - Lisp_Object window, vscroll; +WINDOW nil means use the selected window. Normally, VSCROLL is a +non-negative multiple of the canonical character height of WINDOW; +optional third arg PIXELS_P non-nil means that VSCROLL is in pixels. */) + (window, vscroll, pixels_p) + Lisp_Object window, vscroll, pixels_p; { struct window *w; struct frame *f; @@ -6166,7 +6162,9 @@ multiple of the canonical character height of WINDOW. */) { int old_dy = w->vscroll; - w->vscroll = - FRAME_LINE_HEIGHT (f) * XFLOATINT (vscroll); + w->vscroll = - (NILP (pixels_p) + ? FRAME_LINE_HEIGHT (f) * XFLOATINT (vscroll) + : XFLOATINT (vscroll)); w->vscroll = min (w->vscroll, 0); /* Adjust glyph matrix of the frame if the virtual display @@ -6178,7 +6176,7 @@ multiple of the canonical character height of WINDOW. */) XBUFFER (w->buffer)->prevent_redisplay_optimizations_p = 1; } - return Fwindow_vscroll (window); + return Fwindow_vscroll (window, pixels_p); } @@ -6506,9 +6504,10 @@ using `special-display-function'. See also `special-display-regexps'. An element of the list can be a list instead of just a string. There are two ways to use a list as an element: (BUFFER FRAME-PARAMETERS...) (BUFFER FUNCTION OTHER-ARGS...) -In the first case, FRAME-PARAMETERS are used to create the frame. -In the latter case, FUNCTION is called with BUFFER as the first argument, -followed by OTHER-ARGS--it can display BUFFER in any way it likes. +In the first case, the FRAME-PARAMETERS are pairs of the form +\(PARAMETER . VALUE); these parameter values are used to create the frame. +In the second case, FUNCTION is called with BUFFER as the first argument, +followed by the OTHER-ARGS--it can display BUFFER in any way it likes. All this is done by the function found in `special-display-function'. If the specified frame parameters include (same-buffer . t), the @@ -6531,9 +6530,10 @@ using `special-display-function'. An element of the list can be a list instead of just a string. There are two ways to use a list as an element: (REGEXP FRAME-PARAMETERS...) (REGEXP FUNCTION OTHER-ARGS...) -In the first case, FRAME-PARAMETERS are used to create the frame. -In the latter case, FUNCTION is called with the buffer as first argument, -followed by OTHER-ARGS--it can display the buffer in any way it likes. +In the first case, the FRAME-PARAMETERS are pairs of the form +\(PARAMETER . VALUE); these parameter values are used to create the frame. +In the second case, FUNCTION is called with BUFFER as the first argument, +followed by the OTHER-ARGS--it can display the buffer in any way it likes. All this is done by the function found in `special-display-function'. If the specified frame parameters include (same-buffer . t), the @@ -6599,7 +6599,7 @@ See also `same-window-buffer-names'. */); next_screen_context_lines = 2; DEFVAR_INT ("split-height-threshold", &split_height_threshold, - doc: /* *display-buffer would prefer to split the largest window if this large. + doc: /* *A window must be at least this tall to be eligible for splitting by `display-buffer'. If there is only one window, it is split regardless of this value. */); split_height_threshold = 500; |