changeset 43884:eb248012bf4a

(x_set_toolkit_scroll_bar_thumb) <USE_MOTIF>: Use a fixed-size thumb (based on an ad-hoc estimate of 30 chars per line) to avoid annoying flicker. (xm_scroll_callback): Get rid of the now unnecessary kludge. (XTread_socket): Mark it static.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Wed, 13 Mar 2002 17:04:49 +0000
parents b13e662ea2b3
children 6198fc8111ef
files src/xterm.c
diffstat 1 files changed, 53 insertions(+), 65 deletions(-) [+]
line wrap: on
line diff
--- a/src/xterm.c	Wed Mar 13 16:42:47 2002 +0000
+++ b/src/xterm.c	Wed Mar 13 17:04:49 2002 +0000
@@ -8553,31 +8553,10 @@
 	XtVaGetValues (widget, XmNsliderSize, &slider_size, NULL);
 	UNBLOCK_INPUT;
 
-	/* 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);
-	  }
+	whole = XM_SB_RANGE - slider_size;
+	portion = min (cs->value - XM_SB_MIN, whole);
+	part = scroll_bar_handle;
+	bar->dragging = make_number (cs->value);
       }
       break;
       
@@ -8880,6 +8859,54 @@
   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)
+    top = 0, shown = 1;
+  else
+    {
+      top = (float) position / whole;
+      shown = (float) portion / whole;
+    }
+
+  if (NILP (bar->dragging))
+    {
+      int size, value;
+
+      /* 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);
+      size = max (size, 1);
+
+      /* 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);
+      
+      XmScrollBarSetValues (widget, value, size, 0, 0, False);
+    }
+#else /* !USE_MOTIF i.e. use Xaw */
+
   if (whole == 0)
     top = 0, shown = 1;
   else
@@ -8888,45 +8915,6 @@
       shown = (float) portion / whole;
     }
 
-  BLOCK_INPUT;
-
-#ifdef USE_MOTIF
-  {
-    int size, value;
-
-    /* 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);
-    size = max (size, 1);
-
-    /* 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);
-
-    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 */
   {
     float old_top, old_shown;
     Dimension height;
@@ -9953,7 +9941,7 @@
 
    EXPECTED is nonzero if the caller knows input is available.  */
 
-int
+static int
 XTread_socket (sd, bufp, numchars, expected)
      register int sd;
      /* register */ struct input_event *bufp;