aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJim Blandy <[email protected]>1993-01-14 15:17:11 +0000
committerJim Blandy <[email protected]>1993-01-14 15:17:11 +0000
commit535e0b8ef6dc77f1a730c71c0df6316b9bb6535a (patch)
tree2b8c31f902fce351cf0e88918f9b349bd5e95a8c /src
parentec3f896ca772786663555e45b6630a9e446cae1a (diff)
* window.c (window_internal_width): New function, which accounts
for scrollbars if present. * lisp.h (window_internal_height, window_internal_width): Add extern declarations for these. * dispnew.c (direct_output_for_insert, direct_output_forward_char, buffer_posn_from_coords): Use window_internal_width instead of writing out its definition. * indent.c (compute_motion): Doc fix; mention scrollbars and window_internal_width. (pos_tab_offset, Fvertical_motion): Use window_internal_width instead of writing it out. * window.c (Fpos_visible_in_window_p, Fwindow_width, Fscroll_left, Fscroll_right): Same. * xdisp.c (redisplay, try_window, try_window_id, display_text_line): Same. * termhooks.h (mouse_position_hook): Doc fix. (set_vertical_scrollbar_hook): This doesn't return anything any more, and doesn't take a struct scrollbar * argument any more. (condemn_scrollbars_hook, redeem_scrollbar_hook, judge_scrollbars_hook): Doc fixes. * term.c (mouse_position_hook): Doc fix. (set_vertical_scrollbar_hook): This doesn't return anything any more. Doc fixes. * keyboard.c (kbd_buffer_get_event): Receive the scrollbar's window from *mouse_position_hook and pass it to make_lispy_movement, instead of working with a pointer to a struct scrollbar. (make_lispy_event): We don't need a window_from_scrollbar function anymore; we are given the window directly in *EVENT. Unify the code which generates text-area mouse clicks and scrollbar clicks; use the same code to distinguish clicks from drags on the scrollbar as in the text area. Distinguish clicks from drags by storing a copy of the lispy position list returned as part of the event. (button_down_location): Make this a lisp vector, rather than an array of random structures. (struct mouse_position): Remove this; it's been replaced by a lisp list. (make_lispy_movement): Accept the scrollbar's window as a parameter, rather than the scrollbar itself. If FRAME is zero, assume that the other arguments are garbage. (syms_of_keyboard): No need to staticpro each window of button_down_location now; just initialize and staticpro it. * window.c (window_from_scrollbar): Function deleted; no longer needed. * xdisp.c (redisplay_window): Just pass the window to set_vertical_scrollbar hook; don't pass the scrollbar object too. * xterm.c (XTmouse_position): Don't return a pointer to the scrollbar for scrollbar motion; instead, return the scrollbar's window.
Diffstat (limited to 'src')
-rw-r--r--src/window.c79
1 files changed, 37 insertions, 42 deletions
diff --git a/src/window.c b/src/window.c
index 1d9eb2c8b0..ef77057da3 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, 1986, 1987, 1992 Free Software Foundation, Inc.
+ Copyright (C) 1985, 1986, 1987, 1992, 1993 Free Software Foundation, Inc.
This file is part of GNU Emacs.
@@ -225,9 +225,7 @@ POS defaults to point; WINDOW, to the selected window.")
/* If that info is not correct, calculate afresh */
posval = *compute_motion (top, 0, 0, posint, height, 0,
- XFASTINT (w->width) - 1
- - (XFASTINT (w->width) + XFASTINT (w->left)
- != FRAME_WIDTH (XFRAME (w->frame))),
+ window_internal_width (w) - 1,
XINT (w->hscroll), 0);
return posval.vpos < height ? Qt : Qnil;
@@ -269,11 +267,7 @@ DEFUN ("window-width", Fwindow_width, Swindow_width, 0, 1, 0,
register struct window *w = decode_window (window);
register int width = XFASTINT (w->width);
- /* If this window does not end at the right margin,
- must deduct one column for the border */
- if ((width + XFASTINT (w->left)) == FRAME_WIDTH (XFRAME (WINDOW_FRAME (w))))
- return make_number (width);
- return make_number (width - 1);
+ return make_number (window_internal_width (w));
}
DEFUN ("window-hscroll", Fwindow_hscroll, Swindow_hscroll, 0, 1, 0,
@@ -432,34 +426,6 @@ window_from_coordinates (frame, x, y, part)
return Qnil;
}
-/* Find the window containing the scrollbar BAR on FRAME. We need to
- search for scrollbars, rather than just having a field in the
- scrollbar saying what window it's attached to, because scrollbars
- may be deallocated before the events which occurred on them are
- dequeued. We can't dereference a scrollbar pointer until we know
- it's live by finding it in a window structure. */
-
-Lisp_Object
-window_from_scrollbar (frame, bar)
- FRAME_PTR frame;
- struct scrollbar *bar;
-{
- register Lisp_Object tem, first;
-
- tem = first = FRAME_SELECTED_WINDOW (frame);
-
- do
- {
- if (WINDOW_VERTICAL_SCROLLBAR (XWINDOW (tem)) == bar)
- return tem;
-
- tem = Fnext_window (tem, Qt, Qlambda);
- }
- while (! EQ (tem, first));
-
- return Qnil;
-}
-
DEFUN ("window-at", Fwindow_at, Swindow_at, 2, 3, 0,
"Return window containing row ROW, column COLUMN on FRAME.\n\
If omitted, FRAME defaults to the currently selected frame.\n\
@@ -1676,9 +1642,8 @@ Returns the window displaying BUFFER.")
if (!NILP (window)
&& window_height (window) >= split_height_threshold
- &&
- (XFASTINT (XWINDOW (window)->width)
- == FRAME_WIDTH (XFRAME (WINDOW_FRAME (XWINDOW (window))))))
+ && (XFASTINT (XWINDOW (window)->width)
+ == FRAME_WIDTH (XFRAME (WINDOW_FRAME (XWINDOW (window))))))
window = Fsplit_window (window, Qnil, Qnil);
else
{
@@ -2055,6 +2020,36 @@ window_internal_height (w)
return ht;
}
+
+/* Return the number of columns in W.
+ Don't count columns occupied by scrollbars or the vertical bar
+ separating W from the sibling to its right. */
+int
+window_internal_width (w)
+ struct window *w;
+{
+ FRAME_PTR f = XFRAME (WINDOW_FRAME (w));
+ int left = XINT (w->left);
+ int width = XINT (w->width);
+
+ /* If this window is flush against the right edge of the frame, its
+ internal width is its full width. */
+ if (left + width >= FRAME_WIDTH (f))
+ return width;
+
+ /* If we are not flush right, then our rightmost columns are
+ occupied by some sort of separator. */
+
+ /* Scrollbars occupy a few columns. */
+ if (FRAME_HAS_VERTICAL_SCROLLBARS (f))
+ return width - VERTICAL_SCROLLBAR_WIDTH;
+
+ /* The column of `|' characters separating side-by-side windows
+ occupies one column only. */
+ return width - 1;
+}
+
+
/* Scroll contents of window WINDOW up N lines. */
void
@@ -2252,7 +2247,7 @@ Default for ARG is window width minus 2.")
{
if (NILP (arg))
- XFASTINT (arg) = XFASTINT (XWINDOW (selected_window)->width) - 2;
+ XFASTINT (arg) = window_internal_width (selected_window) - 2;
else
arg = Fprefix_numeric_value (arg);
@@ -2269,7 +2264,7 @@ Default for ARG is window width minus 2.")
register Lisp_Object arg;
{
if (NILP (arg))
- XFASTINT (arg) = XFASTINT (XWINDOW (selected_window)->width) - 2;
+ XFASTINT (arg) = window_internal_width (selected_window) - 2;
else
arg = Fprefix_numeric_value (arg);