]> code.delx.au - gnu-emacs/commitdiff
* frame.h (struct frame): New fields `can_have_scrollbars' and
authorJim Blandy <jimb@redhat.com>
Thu, 24 Dec 1992 06:17:18 +0000 (06:17 +0000)
committerJim Blandy <jimb@redhat.com>
Thu, 24 Dec 1992 06:17:18 +0000 (06:17 +0000)
`has_vertical_scrollbars'.
(FRAME_CAN_HAVE_SCROLLBARS, FRAME_HAS_VERTICAL_SCROLLBARS): New
accessors, for both the MULTI_FRAME and non-MULTI_FRAME.
(VERTICAL_SCROLLBAR_WIDTH, WINDOW_VERTICAL_SCROLLBAR,
WINDOW_VERTICAL_SCROLLBAR_COLUMN,
WINDOW_VERTICAL_SCROLLBAR_HEIGHT): New macros.
* window.h (struct window): New field `vertical_scrollbar'.
* xterm.h (struct x_display): vertical_scrollbars,
judge_timestamp, vertical_scrollbar_extra: New fields.
(struct scrollbar): New struct.
(VERTICAL_SCROLLBAR_PIXEL_WIDTH, VERTICAL_SCROLLBAR_PIXEL_HEIGHT,
VERTICAL_SCROLLBAR_LEFT_BORDER, VERTICAL_SCROLLBAR_RIGHT_BORDER,
VERTICAL_SCROLLBAR_TOP_BORDER, VERTICAL_SCROLLBAR_BOTTOM_BORDER,
CHAR_TO_PIXEL_WIDTH, CHAR_TO_PIXEL_HEIGHT, PIXEL_TO_CHAR_WIDTH,
PIXEL_TO_CHAR_HEIGHT): New accessors and macros.
* frame.c (make_frame): Initialize the `can_have_scrollbars' and
`has_vertical_scrollbars' fields of the frame.
* term.c (term_init): Note that TERMCAP terminals don't support
scrollbars.
(mouse_position_hook): Document new args.
(set_vertical_scrollbar_hook, condemn_scrollbars_hook,
redeem_scrollbar_hook, judge_scrollbars_hook): New hooks.
* termhooks.h: Declare and document them.
(enum scrollbar_part): New type.
(struct input_event): Describe the new form of the scrollbar_click
event type.  Change `part' from a Lisp_Object to an enum
scrollbar_part.  Add a new field `scrollbar'.
* keyboard.c (kbd_buffer_get_event): Pass appropriate new
parameters to *mouse_position_hook, and make_lispy_movement.
* xfns.c (x_set_vertical_scrollbar): New function.
(x_figure_window_size): Use new macros to calculate frame size.
(Fx_create_frame): Note that X Windows frames do support scroll
bars.  Default to "yes".
* xterm.c: #include <X11/cursorfont.h> and "window.h".
(x_vertical_scrollbar_cursor): New variable.
(x_term_init): Initialize it.
(last_mouse_bar, last_mouse_bar_frame, last_mouse_part,
last_mouse_scroll_range_start, last_mouse_scroll_range_end): New
variables.
(XTmouse_position): Use them to return scrollbar movement events.
Take new arguments, for that purpose.
(x_window_to_scrollbar, x_scrollbar_create,
x_scrollbar_set_handle, x_scrollbar_remove, x_scrollbar_move,
XTset_scrollbar, XTcondemn_scrollbars, XTredeem_scrollbar,
XTjudge_scrollbars, x_scrollbar_expose,
x_scrollbar_background_expose, x_scrollbar_handle_click,
x_scrollbar_handle_motion): New functions to implement scrollbars.
(x_term_init): Set the termhooks.h hooks to point to them.
(x_set_window_size): Use new macros to calculate frame size.  Set
vertical_scrollbar_extra field.
(x_make_frame_visible): Use the frame accessor
FRAME_HAS_VERTICAL_SCROLLBARS to decide if we need to map the
frame's subwindows as well.
(XTread_socket): Use new size-calculation macros from xterm.h when
processing ConfigureNotify events.
(x_wm_set_size_hint): Use PIXEL_TO_CHAR_WIDTH and
PIXEL_TO_CHAR_HEIGHT macros.
* ymakefile (xdisp.o): This now depends on termhooks.h.
(xterm.o): This now depends on window.h.

src/term.c
src/termhooks.h
src/window.h

index a5678f3fb7e3cee6ad68ef089a2abab2f8421ee7..5fbfcc461079f76b9a1661af4e3d5ce629ff26ad 100644 (file)
@@ -93,12 +93,16 @@ int (*set_terminal_window_hook) ();
 
 int (*read_socket_hook) ();
 
-/* Return the current position of the mouse.  This should clear
-   mouse_moved until the next motion event arrives.  */
+/* Return the current position of the mouse.
+   Set `bar' to point to the scrollbar if the mouse movement started
+   in a scrollbar, or zero if it started elsewhere in the frame.
+   This should clear mouse_moved until the next motion event arrives.  */
 void (*mouse_position_hook) ( /* FRAME_PTR *f,
-                                       Lisp_Object *x,
-                                       Lisp_Object *y,
-                                       unsigned long *time */ );
+                                struct scrollbar **bar,
+                                enum scrollbar_part *part,
+                                Lisp_Object *x,
+                                Lisp_Object *y,
+                                unsigned long *time */ );
 
 /* When reading from a minibuffer in a different frame, Emacs wants
    to shift the highlight from the selected frame to the minibuffer's
@@ -107,6 +111,38 @@ void (*mouse_position_hook) ( /* FRAME_PTR *f,
    the highlight.  */
 void (*frame_rehighlight_hook) ( /* FRAME_PTR f */ );
 
+/* Set vertical scollbar BAR to have its upper left corner at (TOP,
+   LEFT), and be LENGTH rows high.  Set its handle to indicate that we
+   are displaying PORTION characters out of a total of WHOLE
+   characters, starting at POSITION.  Return BAR.  If BAR is zero,
+   create a new scrollbar and return a pointer to it.  */
+struct scrollbar *(*set_vertical_scrollbar_hook)
+     ( /* struct scrollbar *BAR,
+         struct window *window,
+         int portion, int whole, int position */ );
+
+/* The following three hooks are used when we're doing a thorough
+   redisplay of the frame.  We don't explicitly know which scrollbars
+   are going to be deleted, because keeping track of when windows go
+   away is a real pain - can you say set-window-configuration?
+   Instead, we just assert at the beginning of redisplay that *all*
+   scrollbars are to be removed, and then save scrollbars from the
+   firey pit when we actually redisplay their window.  */
+
+/* Arrange for all scrollbars on FRAME to be removed at the next call
+   to `*judge_scrollbars_hook'.  A scrollbar may be spared if
+   `*redeem_scrollbar_hook' is applied to it before the judgement.  */
+void (*condemn_scrollbars_hook)( /* FRAME_PTR *FRAME */ );
+
+/* Unmark BAR for deletion in this judgement cycle.  */
+void (*redeem_scrollbar_hook)( /* struct scrollbar *BAR */ );
+
+/* Remove all scrollbars on FRAME that haven't been saved since the
+   last call to `*condemn_scrollbars_hook'.  */
+void (*judge_scrollbars_hook)( /* FRAME_PTR *FRAME */ );
+
+
+
 /* Strings, numbers and flags taken from the termcap entry.  */
 
 char *TS_ins_line;             /* termcap "al" */
@@ -1414,6 +1450,9 @@ It may be necessary to do `unsetenv TERMCAP' as well.\n",
   if (read_socket_hook)                /* Baudrate is somewhat */
                                /* meaningless in this case */
     baud_rate = 9600;
+
+  FRAME_CAN_HAVE_SCROLLBARS (selected_frame) = 0;
+  FRAME_HAS_VERTICAL_SCROLLBARS (selected_frame) = 0;
 }
 
 /* VARARGS 1 */
index c7f9d3d090912641d863e239e226e46a96b1b52f..63be5709999de03d6947164f82ff5cb91c4b1b80 100644 (file)
@@ -45,9 +45,19 @@ extern int (*set_terminal_window_hook) ();
 
 extern int (*read_socket_hook) ();
 
-/* Return the current position of the mouse.  This should clear
-   mouse_moved until the next motion event arrives.  */
+enum scrollbar_part {
+  scrollbar_above_handle,
+  scrollbar_handle,
+  scrollbar_below_handle
+};
+
+/* Return the current position of the mouse.
+   Set `bar' to point to the scrollbar if the mouse movement started
+   in a scrollbar, or zero if it started elsewhere in the frame.
+   This should clear mouse_moved until the next motion event arrives.  */
 extern void (*mouse_position_hook) ( /* FRAME_PTR *f,
+                                       struct scrollbar **bar,
+                                       enum scrollbar_part *part,
                                        Lisp_Object *x,
                                        Lisp_Object *y,
                                        unsigned long *time */ );
@@ -62,6 +72,39 @@ extern int mouse_moved;
    X, this means that Emacs lies about where the focus is.  */
 extern void (*frame_rehighlight_hook) ( /* void */ );
 
+/* Set vertical scollbar BAR to have its upper left corner at (TOP,
+   LEFT), and be LENGTH rows high.  Set its handle to indicate that we
+   are displaying PORTION characters out of a total of WHOLE
+   characters, starting at POSITION.  Return BAR.  If BAR is zero,
+   create a new scrollbar and return a pointer to it.  */
+extern struct scrollbar *(*set_vertical_scrollbar_hook)
+     ( /* struct scrollbar *BAR,
+         struct window *window,
+         int portion, int whole, int position */ );
+
+
+/* The following three hooks are used when we're doing a thorough
+   redisplay of the frame.  We don't explicitly know which scrollbars
+   are going to be deleted, because keeping track of when windows go
+   away is a real pain - can you say set-window-configuration?
+   Instead, we just assert at the beginning of redisplay that *all*
+   scrollbars are to be removed, and then save scrollbars from the
+   firey pit when we actually redisplay their window.  */
+
+/* Arrange for all scrollbars on FRAME to be removed at the next call
+   to `*judge_scrollbars_hook'.  A scrollbar may be spared if
+   `*redeem_scrollbar_hook' is applied to it before the judgement.  */
+extern void (*condemn_scrollbars_hook)( /* FRAME_PTR *FRAME */ );
+
+/* Unmark BAR for deletion in this judgement cycle.  */
+extern void (*redeem_scrollbar_hook)( /* struct scrollbar *BAR */ );
+
+/* Remove all scrollbars on FRAME that haven't been saved since the
+   last call to `*condemn_scrollbars_hook'.  */
+extern void (*judge_scrollbars_hook)( /* FRAME_PTR *FRAME */ );
+
+
+
 /* If nonzero, send all terminal output characters to this stream also.  */
 extern FILE *termscript;
 
@@ -112,31 +155,32 @@ struct input_event {
                                   click occurred in.
                                   .timestamp gives a timestamp (in
                                   milliseconds) for the click.  */
-    scrollbar_click,           /* .code gives the number of the mouse
-                                  button that was clicked.
+
+    scrollbar_click,           /* .code gives the number of the mouse button
+                                  that was clicked.
+                                  .modifiers holds the state of the modifier
+                                  keys.
                                   .part is a lisp symbol indicating which
-                                  part of the scrollbar got clicked.  This
-                                  indicates whether the scroll bar was
-                                  horizontal or vertical.
-                                  .modifiers gives the state of the
-                                  modifier keys.
-                                  .x gives the distance from the start
-                                  of the scroll bar of the click; .y gives
-                                  the total length of the scroll bar.
-                                  .frame gives the frame the click
-                                  should apply to.
+                                  part of the scrollbar got clicked.
+                                  .scrollbar is a pointer to the scrollbar
+                                  clicked on.  Since redisplay may delete
+                                  scrollbars at any time, you may not assume
+                                  that this scrollbar still exists when you
+                                  dequeue this event.  You have to traverse
+                                  the window tree to make it's in a valid
+                                  window.
+                                  .x gives the distance from the start of the
+                                  scroll bar of the click; .y gives the total
+                                  length of the scroll bar.
+                                  .frame gives the frame the click should
+                                  apply to.
                                   .timestamp gives a timestamp (in
                                   milliseconds) for the click.  */
-#if 0
-    frame_selected,            /* The user has moved the focus to another
-                                  frame.
-                                  .frame is the frame that should become
-                                  selected at the next convenient time.  */
-#endif
   } kind;
   
   Lisp_Object code;
-  Lisp_Object part;
+  enum scrollbar_part part;
+  struct scrollbar *scrollbar;
 
 /* This is obviously wrong, but I'm not sure what else I should do.
    Obviously, this should be a FRAME_PTR.  But that would require that
index 5bc3e73a912e47713fd33bbdf1f64ced3072022f..b05386d978def3b02611f069e6cfa6582ca123f9 100644 (file)
@@ -123,6 +123,12 @@ struct window
     Lisp_Object last_modified;
     /* Value of point at that time */
     Lisp_Object last_point;
+    /* Pointer to this window's vertical scrollbar, tagged as an
+       integer.  If this window is newly created and we haven't
+       displayed a scrollbar in it yet, or if the frame doesn't have
+       any scrollbars, this is nil.  */
+    Lisp_Object vertical_scrollbar;
+
 /* The rest are currently not used or only half used */
     /* Frame coords of point at that time */
     Lisp_Object last_point_x;