# HG changeset patch # User Jim Blandy # Date 725177904 0 # Node ID f80c1f73f5b9f798185d9580648d72463641973b # Parent aa7d6d57504b29998cec3f36964d608fb7ee11d3 * xdisp.c: #include "termhooks.h". (redisplay, redisplay_window): Use set_vertical_scrollbar_hook, condemn_scrollbars_hook, redeem_scrollbar_hook, and judge_scrollbars_hook to make scrollbars redisplay properly. It's a pain to remember that you can't assign to FRAME->visible. Let's change all references to the `visible' member of struct frame to use the accessor macros, and then write a setter for the `visible' field that does the right thing. * frame.h (FRAME_VISIBLE_P): Make this not an l-value. (FRAME_SET_VISIBLE): New macro. * frame.c (make_terminal_frame, Fdelete_frame): Use FRAME_SET_VISIBLE. (Fframe_visible_p, Fvisible_frame_list): Use FRAME_VISIBLE_P and FRAME_ICONIFIED_P. * dispnew.c (Fredraw_display): Use the FRAME_VISIBLE_P and FRAME_GARBAGED_P accessors. * xdisp.c (redisplay): Use the FRAME_VISIBLE_P accessor. * xfns.c (x_set_foreground_color, x_set_background_color, x_set_cursor_color, x_set_border_pixel, x_set_icon_type): Use the FRAME_VISIBLE_P accessor. (Fx_create_frame): Use FRAME_SET_VISIBILITY. * xterm.c (clear_cursor, x_display_bar_cursor, x_display_box_cursor): Use FRAME_SET_VISIBILITY. diff -r aa7d6d57504b -r f80c1f73f5b9 src/xdisp.c --- a/src/xdisp.c Thu Dec 24 06:17:18 1992 +0000 +++ b/src/xdisp.c Thu Dec 24 06:18:24 1992 +0000 @@ -32,6 +32,7 @@ #include "commands.h" #include "macros.h" #include "disptab.h" +#include "termhooks.h" extern int interrupt_input; extern int command_loop_level; @@ -497,8 +498,20 @@ buffer_shared = 0; FOR_EACH_FRAME (tail, f) - if (FRAME_VISIBLE_P (f)) - redisplay_windows (FRAME_ROOT_WINDOW (f)); + { + /* Mark all the scrollbars to be removed; we'll redeem the ones + we want when we redisplay their windows. */ + if (FRAME_HAS_VERTICAL_SCROLLBARS (f)) + (*condemn_scrollbars_hook) (f); + + if (FRAME_VISIBLE_P (f)) + redisplay_windows (FRAME_ROOT_WINDOW (f)); + + /* Any scrollbars which redisplay_windows should have nuked + should now go away. */ + if (FRAME_HAS_VERTICAL_SCROLLBARS (f)) + (*judge_scrollbars_hook) (f); + } } else if (FRAME_VISIBLE_P (selected_frame)) { @@ -530,7 +543,7 @@ continue; f = XFRAME (XCONS (tail)->car); - if (f->visible) + if (FRAME_VISIBLE_P (f)) { pause |= update_frame (f, 0, 0); if (!pause) @@ -697,13 +710,12 @@ int just_this_one; { register struct window *w = XWINDOW (window); - FRAME_PTR f = XFRAME (w->frame); + FRAME_PTR f = XFRAME (WINDOW_FRAME (w)); int height; register int lpoint = point; struct buffer *old = current_buffer; register int width = XFASTINT (w->width) - 1 - - (XFASTINT (w->width) + XFASTINT (w->left) - != FRAME_WIDTH (XFRAME (WINDOW_FRAME (w)))); + - (XFASTINT (w->width) + XFASTINT (w->left) != FRAME_WIDTH (f)); register int startp; register int hscroll = XINT (w->hscroll); struct position pos; @@ -958,6 +970,25 @@ SET_PT (opoint); current_buffer = old; SET_PT (lpoint); + + if (FRAME_HAS_VERTICAL_SCROLLBARS (f)) + { + struct scrollbar *bar = WINDOW_VERTICAL_SCROLLBAR (w); + + /* This isn't guaranteed to be right. For the moment, we'll pretend + it is. */ + int endp = Z - XINT (w->window_end_pos); + + /* Indicate what this scrollbar ought to be displaying now. */ + bar = ((*set_vertical_scrollbar_hook) + (bar, w, endp - startp, Z - BEG, startp)); + + /* Note that we actually used the scrollbar attached to this window, + so it shouldn't be deleted at the end of redisplay. */ + (*redeem_scrollbar_hook) (bar); + + XSET (w->vertical_scrollbar, Lisp_Int, bar); + } } /* Do full redisplay on one window, starting at position `pos'. */