XEmacs 21.2.36 "Notos"
[chise/xemacs-chise.git.1] / src / scrollbar.c
index 7717903..37092a5 100644 (file)
@@ -34,6 +34,7 @@ Boston, MA 02111-1307, USA.  */
 #include "device.h"
 #include "frame.h"
 #include "glyphs.h"
+#include "gutter.h"
 #include "window.h"
 
 Lisp_Object Qinit_scrollbar_from_resources;
@@ -452,23 +453,35 @@ update_scrollbar_instance (struct window *w, int vertical,
   {
     int x_offset, y_offset;
 
-    /* Scrollbars are always the farthest from the text area. */
+    /* Scrollbars are always the farthest from the text area, barring
+       gutters. */
     if (vertical)
       {
-       x_offset = (!NILP (w->scrollbar_on_left_p)
-                   ? WINDOW_LEFT (w)
-                   : (WINDOW_RIGHT (w) - scrollbar_width
-                      - (window_needs_vertical_divider (w)
-                         ? window_divider_width (w) : 0)));
+       if (!NILP (w->scrollbar_on_left_p))
+         {
+           x_offset = WINDOW_LEFT (w);
+         }
+       else
+         {
+           x_offset = WINDOW_RIGHT (w) - scrollbar_width;
+           if (window_needs_vertical_divider (w))
+             x_offset -= window_divider_width (w);
+         }
        y_offset = WINDOW_TEXT_TOP (w) + f->scrollbar_y_offset;
       }
     else
       {
        x_offset = WINDOW_TEXT_LEFT (w);
-       y_offset = f->scrollbar_y_offset +
-         (!NILP (w->scrollbar_on_top_p)
-          ? WINDOW_TOP (w)
-          : WINDOW_TEXT_BOTTOM (w) + window_bottom_toolbar_height (w));
+       y_offset = f->scrollbar_y_offset;
+
+       if (!NILP (w->scrollbar_on_top_p))
+         {
+           y_offset += WINDOW_TOP (w);
+         }
+       else
+         {
+           y_offset += WINDOW_TEXT_BOTTOM (w);
+         }
       }
 
     new_x = x_offset;
@@ -722,26 +735,26 @@ behavior.
      with their standard behaviors.  It is not possible to hide the
      differences down in lwlib because knowledge of XEmacs buffer and
      cursor motion routines is necessary. */
-#if defined (LWLIB_SCROLLBARS_MOTIF) || defined (LWLIB_SCROLLBARS_LUCID) || \
-    defined (LWLIB_SCROLLBARS_ATHENA3D) || defined(HAVE_MS_WINDOWS)
-  window_scroll (window, Qnil, -1, ERROR_ME_NOT);
-#else /* Athena */
-  {
-    Bufpos bufpos;
-    Lisp_Object value = Fcdr (object);
 
-    CHECK_INT (value);
-    Fmove_to_window_line (Qzero, window);
-    /* can't use Fvertical_motion() because it moves the buffer point
-       rather than the window's point.
-
-       #### It does?  Why does it take a window argument then? */
-    bufpos = vmotion (XWINDOW (window), XINT (Fwindow_point (window)),
-                     XINT (value), 0);
-    Fset_window_point (window, make_int (bufpos));
-    Fcenter_to_window_line (Qzero, window);
-  }
-#endif /* Athena */
+  if (NILP (XCDR (object)))
+    window_scroll (window, Qnil, -1, ERROR_ME_NOT);
+  else
+    {
+      Bufpos bufpos;
+      Lisp_Object value = Fcdr (object);
+
+      CHECK_INT (value);
+      Fmove_to_window_line (Qzero, window);
+      /* can't use Fvertical_motion() because it moves the buffer point
+        rather than the window's point.
+
+        #### It does?  Why does it take a window argument then? */
+      bufpos = vmotion (XWINDOW (window), XINT (Fwindow_point (window)),
+                       XINT (value), 0);
+      Fset_window_point (window, make_int (bufpos));
+      Fcenter_to_window_line (Qzero, window);
+    }
+
   zmacs_region_stays = 1;
   return Qnil;
 }
@@ -763,17 +776,17 @@ behavior.
      with their standard behaviors.  It is not possible to hide the
      differences down in lwlib because knowledge of XEmacs buffer and
      cursor motion routines is necessary. */
-#if defined (LWLIB_SCROLLBARS_MOTIF) || defined (LWLIB_SCROLLBARS_LUCID) || \
-    defined (LWLIB_SCROLLBARS_ATHENA3D) || defined (HAVE_MS_WINDOWS)
-  window_scroll (window, Qnil, 1, ERROR_ME_NOT);
-#else /* Athena */
-  {
-    Lisp_Object value = Fcdr (object);
-    CHECK_INT (value);
-    Fmove_to_window_line (value, window);
-    Fcenter_to_window_line (Qzero, window);
-  }
-#endif /* Athena */
+
+  if (NILP (XCDR (object)))
+    window_scroll (window, Qnil, 1, ERROR_ME_NOT);
+  else
+    {
+      Lisp_Object value = Fcdr (object);
+      CHECK_INT (value);
+      Fmove_to_window_line (value, window);
+      Fcenter_to_window_line (Qzero, window);
+    }
+
   zmacs_region_stays = 1;
   return Qnil;
 }
@@ -850,7 +863,7 @@ This ensures that VALUE is in the proper range for the horizontal scrollbar.
 
   w = XWINDOW (window);
   wcw = window_char_width (w, 0) - 1;
-  /* ### We should be able to scroll further right as long as there is
+  /* #### We should be able to scroll further right as long as there is
      a visible truncation glyph.  This calculation for max is bogus.  */
   max_len = w->max_line_len + 2;
 
@@ -937,11 +950,9 @@ This is a specifier; use `set-specifier' to change it.
     (Vscrollbar_width,
      list1 (Fcons (Qnil, make_int (DEFAULT_SCROLLBAR_WIDTH))));
   set_specifier_caching (Vscrollbar_width,
-                        slot_offset (struct window,
-                                     scrollbar_width),
+                        offsetof (struct window, scrollbar_width),
                         vertical_scrollbar_changed_in_window,
-                        slot_offset (struct frame,
-                                     scrollbar_width),
+                        offsetof (struct frame, scrollbar_width),
                         frame_size_slipped);
 
   DEFVAR_SPECIFIER ("scrollbar-height", &Vscrollbar_height /*
@@ -953,11 +964,9 @@ This is a specifier; use `set-specifier' to change it.
     (Vscrollbar_height,
      list1 (Fcons (Qnil, make_int (DEFAULT_SCROLLBAR_HEIGHT))));
   set_specifier_caching (Vscrollbar_height,
-                        slot_offset (struct window,
-                                     scrollbar_height),
+                        offsetof (struct window, scrollbar_height),
                         some_window_value_changed,
-                        slot_offset (struct frame,
-                                     scrollbar_height),
+                        offsetof (struct frame, scrollbar_height),
                         frame_size_slipped);
 
   DEFVAR_SPECIFIER ("horizontal-scrollbar-visible-p", &Vhorizontal_scrollbar_visible_p /*
@@ -968,11 +977,11 @@ This is a specifier; use `set-specifier' to change it.
   set_specifier_fallback (Vhorizontal_scrollbar_visible_p,
                          list1 (Fcons (Qnil, Qt)));
   set_specifier_caching (Vhorizontal_scrollbar_visible_p,
-                        slot_offset (struct window,
-                                     horizontal_scrollbar_visible_p),
+                        offsetof (struct window,
+                                  horizontal_scrollbar_visible_p),
                         some_window_value_changed,
-                        slot_offset (struct frame,
-                                     horizontal_scrollbar_visible_p),
+                        offsetof (struct frame,
+                                  horizontal_scrollbar_visible_p),
                         frame_size_slipped);
 
   DEFVAR_SPECIFIER ("vertical-scrollbar-visible-p", &Vvertical_scrollbar_visible_p /*
@@ -983,11 +992,11 @@ This is a specifier; use `set-specifier' to change it.
   set_specifier_fallback (Vvertical_scrollbar_visible_p,
                          list1 (Fcons (Qnil, Qt)));
   set_specifier_caching (Vvertical_scrollbar_visible_p,
-                        slot_offset (struct window,
-                                     vertical_scrollbar_visible_p),
+                        offsetof (struct window,
+                                  vertical_scrollbar_visible_p),
                         vertical_scrollbar_changed_in_window,
-                        slot_offset (struct frame,
-                                     vertical_scrollbar_visible_p),
+                        offsetof (struct frame,
+                                  vertical_scrollbar_visible_p),
                         frame_size_slipped);
 
   DEFVAR_SPECIFIER ("scrollbar-on-left-p", &Vscrollbar_on_left_p /*
@@ -995,7 +1004,7 @@ This is a specifier; use `set-specifier' to change it.
 This is a specifier; use `set-specifier' to change it.
 */ );
   Vscrollbar_on_left_p = Fmake_specifier (Qboolean);
-  
+
   {
     /* Kludge. Under X, we want athena scrollbars on the left,
        while all other scrollbars go on the right by default. */
@@ -1011,11 +1020,9 @@ This is a specifier; use `set-specifier' to change it.
   }
 
   set_specifier_caching (Vscrollbar_on_left_p,
-                        slot_offset (struct window,
-                                     scrollbar_on_left_p),
+                        offsetof (struct window, scrollbar_on_left_p),
                         vertical_scrollbar_changed_in_window,
-                        slot_offset (struct frame,
-                                     scrollbar_on_left_p),
+                        offsetof (struct frame, scrollbar_on_left_p),
                         frame_size_slipped);
 
   DEFVAR_SPECIFIER ("scrollbar-on-top-p", &Vscrollbar_on_top_p /*
@@ -1026,11 +1033,9 @@ This is a specifier; use `set-specifier' to change it.
   set_specifier_fallback (Vscrollbar_on_top_p,
                          list1 (Fcons (Qnil, Qnil)));
   set_specifier_caching (Vscrollbar_on_top_p,
-                        slot_offset (struct window,
-                                     scrollbar_on_top_p),
+                        offsetof (struct window, scrollbar_on_top_p),
                         some_window_value_changed,
-                        slot_offset (struct frame,
-                                     scrollbar_on_top_p),
+                        offsetof (struct frame, scrollbar_on_top_p),
                         frame_size_slipped);
 }
 
@@ -1040,8 +1045,7 @@ complex_vars_of_scrollbar (void)
   Vscrollbar_pointer_glyph = Fmake_glyph_internal (Qpointer);
 
   set_specifier_caching (XGLYPH (Vscrollbar_pointer_glyph)->image,
-                        slot_offset (struct window,
-                                     scrollbar_pointer),
+                        offsetof (struct window, scrollbar_pointer),
                         scrollbar_pointer_changed_in_window,
                         0, 0);
 }