diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2002-03-16 00:03:00 +0000 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2002-03-16 00:03:00 +0000 |
commit | ffa682b300c627d9ea06b0e9e4e8451f06a64a92 (patch) | |
tree | 262f47c87f1d119ac68e23a5a51abba8769e4700 | |
parent | 57155d9fd6fe02fe2730ca4860ed40b99085b761 (diff) | |
download | emacs-ffa682b300c627d9ea06b0e9e4e8451f06a64a92.tar.gz |
(x_set_toolkit_scroll_bar_thumb, xm_scroll_callback)
(XTread_socket): Undo last change: too late for this release.
-rw-r--r-- | src/ChangeLog | 5 | ||||
-rw-r--r-- | src/xterm.c | 101 |
2 files changed, 62 insertions, 44 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 08937d032a7..c23034b400b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2002-03-15 Stefan Monnier <monnier@cs.yale.edu> + + * xterm.c (x_set_toolkit_scroll_bar_thumb, xm_scroll_callback) + (XTread_socket): Undo last change: too late for this release. + 2002-03-13 Stefan Monnier <monnier@cs.yale.edu> * xterm.c (x_set_toolkit_scroll_bar_thumb) <USE_MOTIF>: diff --git a/src/xterm.c b/src/xterm.c index 73cabf87e41..c3bdefdf65a 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -8521,10 +8521,31 @@ xm_scroll_callback (widget, client_data, call_data) XtVaGetValues (widget, XmNsliderSize, &slider_size, NULL); UNBLOCK_INPUT; - whole = XM_SB_RANGE - slider_size; - portion = min (cs->value - XM_SB_MIN, whole); - part = scroll_bar_handle; - bar->dragging = make_number (cs->value); + /* At the max position of the scroll bar, do a line-wise + movement. Without doing anything, we would be called with + the same cs->value again and again. If we want to make + sure that we can reach the end of the buffer, we have to do + something. + + Implementation note: setting bar->dragging always to + cs->value gives a smoother movement at the max position. + Setting it to nil when doing line-wise movement gives + a better slider behavior. */ + + if (cs->value + slider_size == XM_SB_MAX + || (dragging_down_p + && last_scroll_bar_part == scroll_bar_down_arrow)) + { + part = scroll_bar_down_arrow; + bar->dragging = Qnil; + } + else + { + whole = XM_SB_RANGE; + portion = min (cs->value - XM_SB_MIN, XM_SB_MAX - slider_size); + part = scroll_bar_handle; + bar->dragging = make_number (cs->value); + } } break; @@ -8774,27 +8795,7 @@ x_set_toolkit_scroll_bar_thumb (bar, portion, position, whole) Widget widget = SCROLL_BAR_X_WIDGET (FRAME_X_DISPLAY (f), bar); float top, shown; - BLOCK_INPUT; - -#ifdef USE_MOTIF - - /* We use an estimate of 30 chars per line rather than the real - `portion' value. This has the disadvantage that the thumb size - is not very representative, but it makes our life a lot easier. - Otherwise, we have to constantly adjust the thumb size, which - we can't always do quickly enough: while dragging, the size of - the thumb might prevent the user from dragging the thumb all the - way to the end. but Motif and some versions of Xaw3d don't allow - updating the thumb size while dragging. Also, even if we can update - its size, the update will often happen too late. - If you don't believe it, check out revision 1.650 of xterm.c to see - what hoops we were going through and the still poor behavior we got. */ - portion = XFASTINT (XWINDOW (bar->window)->height) * 30; - /* When the thumb is at the bottom, position == whole. - So we need to increase `whole' to make space for the thumb. */ - whole += portion; - - if (whole <= 0) + if (whole == 0) top = 0, shown = 1; else { @@ -8802,12 +8803,15 @@ x_set_toolkit_scroll_bar_thumb (bar, portion, position, whole) shown = (float) portion / whole; } - if (NILP (bar->dragging)) - { - int size, value; + BLOCK_INPUT; - /* Slider size. Must be in the range [1 .. MAX - MIN] where MAX - is the scroll bar's maximum and MIN is the scroll bar's minimum +#ifdef USE_MOTIF + { + int size, value; + XmScrollBarWidget sb; + + /* Slider size. Must be in the range [1 .. MAX - MIN] where MAX + is the scroll bar's maximum and MIN is the scroll bar's minimum value. */ size = shown * XM_SB_RANGE; size = min (size, XM_SB_RANGE); @@ -8815,21 +8819,30 @@ x_set_toolkit_scroll_bar_thumb (bar, portion, position, whole) /* Position. Must be in the range [MIN .. MAX - SLIDER_SIZE]. */ value = top * XM_SB_RANGE; - value = min (value, XM_SB_MAX - size); - value = max (value, XM_SB_MIN); - + value = min (value, XM_SB_MAX - size); + value = max (value, XM_SB_MIN); + + if (NILP (bar->dragging)) XmScrollBarSetValues (widget, value, size, 0, 0, False); - } + else if (last_scroll_bar_part == scroll_bar_down_arrow) + /* This has the negative side effect that the slider value is + not what it would be if we scrolled here using line-wise or + page-wise movement. */ + XmScrollBarSetValues (widget, value, XM_SB_RANGE - value, 0, 0, False); + else + { + /* If currently dragging, only update the slider size. + This reduces flicker effects. */ + int old_value, old_size, increment, page_increment; + + XmScrollBarGetValues (widget, &old_value, &old_size, + &increment, &page_increment); + XmScrollBarSetValues (widget, old_value, + min (size, XM_SB_RANGE - old_value), + 0, 0, False); + } + } #else /* !USE_MOTIF i.e. use Xaw */ - - if (whole == 0) - top = 0, shown = 1; - else - { - top = (float) position / whole; - shown = (float) portion / whole; - } - { float old_top, old_shown; Dimension height; @@ -9854,7 +9867,7 @@ static struct x_display_info *next_noop_dpyinfo; EXPECTED is nonzero if the caller knows input is available. */ -static int +int XTread_socket (sd, bufp, numchars, expected) register int sd; /* register */ struct input_event *bufp; |