summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2002-03-16 00:03:00 +0000
committerStefan Monnier <monnier@iro.umontreal.ca>2002-03-16 00:03:00 +0000
commitffa682b300c627d9ea06b0e9e4e8451f06a64a92 (patch)
tree262f47c87f1d119ac68e23a5a51abba8769e4700
parent57155d9fd6fe02fe2730ca4860ed40b99085b761 (diff)
downloademacs-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/ChangeLog5
-rw-r--r--src/xterm.c101
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;