diff options
| author | Jim Blandy | 1992-12-24 06:17:18 +0000 |
|---|---|---|
| committer | Jim Blandy | 1992-12-24 06:17:18 +0000 |
| commit | 20a558dc142b78198cacc5723ee7426e143a7929 (patch) | |
| tree | 8db82a4ac64843a5734304e5cecda54bd82cf382 /src | |
| parent | db269683bcb041c85735cba624575a643bb9c807 (diff) | |
| download | emacs-20a558dc142b78198cacc5723ee7426e143a7929.tar.gz emacs-20a558dc142b78198cacc5723ee7426e143a7929.zip | |
* frame.h (struct frame): New fields `can_have_scrollbars' and
`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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/term.c | 49 | ||||
| -rw-r--r-- | src/termhooks.h | 86 | ||||
| -rw-r--r-- | src/window.h | 6 |
3 files changed, 115 insertions, 26 deletions
diff --git a/src/term.c b/src/term.c index a5678f3fb7e..5fbfcc46107 100644 --- a/src/term.c +++ b/src/term.c | |||
| @@ -93,12 +93,16 @@ int (*set_terminal_window_hook) (); | |||
| 93 | 93 | ||
| 94 | int (*read_socket_hook) (); | 94 | int (*read_socket_hook) (); |
| 95 | 95 | ||
| 96 | /* Return the current position of the mouse. This should clear | 96 | /* Return the current position of the mouse. |
| 97 | mouse_moved until the next motion event arrives. */ | 97 | Set `bar' to point to the scrollbar if the mouse movement started |
| 98 | in a scrollbar, or zero if it started elsewhere in the frame. | ||
| 99 | This should clear mouse_moved until the next motion event arrives. */ | ||
| 98 | void (*mouse_position_hook) ( /* FRAME_PTR *f, | 100 | void (*mouse_position_hook) ( /* FRAME_PTR *f, |
| 99 | Lisp_Object *x, | 101 | struct scrollbar **bar, |
| 100 | Lisp_Object *y, | 102 | enum scrollbar_part *part, |
| 101 | unsigned long *time */ ); | 103 | Lisp_Object *x, |
| 104 | Lisp_Object *y, | ||
| 105 | unsigned long *time */ ); | ||
| 102 | 106 | ||
| 103 | /* When reading from a minibuffer in a different frame, Emacs wants | 107 | /* When reading from a minibuffer in a different frame, Emacs wants |
| 104 | to shift the highlight from the selected frame to the minibuffer's | 108 | to shift the highlight from the selected frame to the minibuffer's |
| @@ -107,6 +111,38 @@ void (*mouse_position_hook) ( /* FRAME_PTR *f, | |||
| 107 | the highlight. */ | 111 | the highlight. */ |
| 108 | void (*frame_rehighlight_hook) ( /* FRAME_PTR f */ ); | 112 | void (*frame_rehighlight_hook) ( /* FRAME_PTR f */ ); |
| 109 | 113 | ||
| 114 | /* Set vertical scollbar BAR to have its upper left corner at (TOP, | ||
| 115 | LEFT), and be LENGTH rows high. Set its handle to indicate that we | ||
| 116 | are displaying PORTION characters out of a total of WHOLE | ||
| 117 | characters, starting at POSITION. Return BAR. If BAR is zero, | ||
| 118 | create a new scrollbar and return a pointer to it. */ | ||
| 119 | struct scrollbar *(*set_vertical_scrollbar_hook) | ||
| 120 | ( /* struct scrollbar *BAR, | ||
| 121 | struct window *window, | ||
| 122 | int portion, int whole, int position */ ); | ||
| 123 | |||
| 124 | /* The following three hooks are used when we're doing a thorough | ||
| 125 | redisplay of the frame. We don't explicitly know which scrollbars | ||
| 126 | are going to be deleted, because keeping track of when windows go | ||
| 127 | away is a real pain - can you say set-window-configuration? | ||
| 128 | Instead, we just assert at the beginning of redisplay that *all* | ||
| 129 | scrollbars are to be removed, and then save scrollbars from the | ||
| 130 | firey pit when we actually redisplay their window. */ | ||
| 131 | |||
| 132 | /* Arrange for all scrollbars on FRAME to be removed at the next call | ||
| 133 | to `*judge_scrollbars_hook'. A scrollbar may be spared if | ||
| 134 | `*redeem_scrollbar_hook' is applied to it before the judgement. */ | ||
| 135 | void (*condemn_scrollbars_hook)( /* FRAME_PTR *FRAME */ ); | ||
| 136 | |||
| 137 | /* Unmark BAR for deletion in this judgement cycle. */ | ||
| 138 | void (*redeem_scrollbar_hook)( /* struct scrollbar *BAR */ ); | ||
| 139 | |||
| 140 | /* Remove all scrollbars on FRAME that haven't been saved since the | ||
| 141 | last call to `*condemn_scrollbars_hook'. */ | ||
| 142 | void (*judge_scrollbars_hook)( /* FRAME_PTR *FRAME */ ); | ||
| 143 | |||
| 144 | |||
| 145 | |||
| 110 | /* Strings, numbers and flags taken from the termcap entry. */ | 146 | /* Strings, numbers and flags taken from the termcap entry. */ |
| 111 | 147 | ||
| 112 | char *TS_ins_line; /* termcap "al" */ | 148 | char *TS_ins_line; /* termcap "al" */ |
| @@ -1414,6 +1450,9 @@ It may be necessary to do `unsetenv TERMCAP' as well.\n", | |||
| 1414 | if (read_socket_hook) /* Baudrate is somewhat */ | 1450 | if (read_socket_hook) /* Baudrate is somewhat */ |
| 1415 | /* meaningless in this case */ | 1451 | /* meaningless in this case */ |
| 1416 | baud_rate = 9600; | 1452 | baud_rate = 9600; |
| 1453 | |||
| 1454 | FRAME_CAN_HAVE_SCROLLBARS (selected_frame) = 0; | ||
| 1455 | FRAME_HAS_VERTICAL_SCROLLBARS (selected_frame) = 0; | ||
| 1417 | } | 1456 | } |
| 1418 | 1457 | ||
| 1419 | /* VARARGS 1 */ | 1458 | /* VARARGS 1 */ |
diff --git a/src/termhooks.h b/src/termhooks.h index c7f9d3d0909..63be5709999 100644 --- a/src/termhooks.h +++ b/src/termhooks.h | |||
| @@ -45,9 +45,19 @@ extern int (*set_terminal_window_hook) (); | |||
| 45 | 45 | ||
| 46 | extern int (*read_socket_hook) (); | 46 | extern int (*read_socket_hook) (); |
| 47 | 47 | ||
| 48 | /* Return the current position of the mouse. This should clear | 48 | enum scrollbar_part { |
| 49 | mouse_moved until the next motion event arrives. */ | 49 | scrollbar_above_handle, |
| 50 | scrollbar_handle, | ||
| 51 | scrollbar_below_handle | ||
| 52 | }; | ||
| 53 | |||
| 54 | /* Return the current position of the mouse. | ||
| 55 | Set `bar' to point to the scrollbar if the mouse movement started | ||
| 56 | in a scrollbar, or zero if it started elsewhere in the frame. | ||
| 57 | This should clear mouse_moved until the next motion event arrives. */ | ||
| 50 | extern void (*mouse_position_hook) ( /* FRAME_PTR *f, | 58 | extern void (*mouse_position_hook) ( /* FRAME_PTR *f, |
| 59 | struct scrollbar **bar, | ||
| 60 | enum scrollbar_part *part, | ||
| 51 | Lisp_Object *x, | 61 | Lisp_Object *x, |
| 52 | Lisp_Object *y, | 62 | Lisp_Object *y, |
| 53 | unsigned long *time */ ); | 63 | unsigned long *time */ ); |
| @@ -62,6 +72,39 @@ extern int mouse_moved; | |||
| 62 | X, this means that Emacs lies about where the focus is. */ | 72 | X, this means that Emacs lies about where the focus is. */ |
| 63 | extern void (*frame_rehighlight_hook) ( /* void */ ); | 73 | extern void (*frame_rehighlight_hook) ( /* void */ ); |
| 64 | 74 | ||
| 75 | /* Set vertical scollbar BAR to have its upper left corner at (TOP, | ||
| 76 | LEFT), and be LENGTH rows high. Set its handle to indicate that we | ||
| 77 | are displaying PORTION characters out of a total of WHOLE | ||
| 78 | characters, starting at POSITION. Return BAR. If BAR is zero, | ||
| 79 | create a new scrollbar and return a pointer to it. */ | ||
| 80 | extern struct scrollbar *(*set_vertical_scrollbar_hook) | ||
| 81 | ( /* struct scrollbar *BAR, | ||
| 82 | struct window *window, | ||
| 83 | int portion, int whole, int position */ ); | ||
| 84 | |||
| 85 | |||
| 86 | /* The following three hooks are used when we're doing a thorough | ||
| 87 | redisplay of the frame. We don't explicitly know which scrollbars | ||
| 88 | are going to be deleted, because keeping track of when windows go | ||
| 89 | away is a real pain - can you say set-window-configuration? | ||
| 90 | Instead, we just assert at the beginning of redisplay that *all* | ||
| 91 | scrollbars are to be removed, and then save scrollbars from the | ||
| 92 | firey pit when we actually redisplay their window. */ | ||
| 93 | |||
| 94 | /* Arrange for all scrollbars on FRAME to be removed at the next call | ||
| 95 | to `*judge_scrollbars_hook'. A scrollbar may be spared if | ||
| 96 | `*redeem_scrollbar_hook' is applied to it before the judgement. */ | ||
| 97 | extern void (*condemn_scrollbars_hook)( /* FRAME_PTR *FRAME */ ); | ||
| 98 | |||
| 99 | /* Unmark BAR for deletion in this judgement cycle. */ | ||
| 100 | extern void (*redeem_scrollbar_hook)( /* struct scrollbar *BAR */ ); | ||
| 101 | |||
| 102 | /* Remove all scrollbars on FRAME that haven't been saved since the | ||
| 103 | last call to `*condemn_scrollbars_hook'. */ | ||
| 104 | extern void (*judge_scrollbars_hook)( /* FRAME_PTR *FRAME */ ); | ||
| 105 | |||
| 106 | |||
| 107 | |||
| 65 | /* If nonzero, send all terminal output characters to this stream also. */ | 108 | /* If nonzero, send all terminal output characters to this stream also. */ |
| 66 | extern FILE *termscript; | 109 | extern FILE *termscript; |
| 67 | 110 | ||
| @@ -112,31 +155,32 @@ struct input_event { | |||
| 112 | click occurred in. | 155 | click occurred in. |
| 113 | .timestamp gives a timestamp (in | 156 | .timestamp gives a timestamp (in |
| 114 | milliseconds) for the click. */ | 157 | milliseconds) for the click. */ |
| 115 | scrollbar_click, /* .code gives the number of the mouse | 158 | |
| 116 | button that was clicked. | 159 | scrollbar_click, /* .code gives the number of the mouse button |
| 160 | that was clicked. | ||
| 161 | .modifiers holds the state of the modifier | ||
| 162 | keys. | ||
| 117 | .part is a lisp symbol indicating which | 163 | .part is a lisp symbol indicating which |
| 118 | part of the scrollbar got clicked. This | 164 | part of the scrollbar got clicked. |
| 119 | indicates whether the scroll bar was | 165 | .scrollbar is a pointer to the scrollbar |
| 120 | horizontal or vertical. | 166 | clicked on. Since redisplay may delete |
| 121 | .modifiers gives the state of the | 167 | scrollbars at any time, you may not assume |
| 122 | modifier keys. | 168 | that this scrollbar still exists when you |
| 123 | .x gives the distance from the start | 169 | dequeue this event. You have to traverse |
| 124 | of the scroll bar of the click; .y gives | 170 | the window tree to make it's in a valid |
| 125 | the total length of the scroll bar. | 171 | window. |
| 126 | .frame gives the frame the click | 172 | .x gives the distance from the start of the |
| 127 | should apply to. | 173 | scroll bar of the click; .y gives the total |
| 174 | length of the scroll bar. | ||
| 175 | .frame gives the frame the click should | ||
| 176 | apply to. | ||
| 128 | .timestamp gives a timestamp (in | 177 | .timestamp gives a timestamp (in |
| 129 | milliseconds) for the click. */ | 178 | milliseconds) for the click. */ |
| 130 | #if 0 | ||
| 131 | frame_selected, /* The user has moved the focus to another | ||
| 132 | frame. | ||
| 133 | .frame is the frame that should become | ||
| 134 | selected at the next convenient time. */ | ||
| 135 | #endif | ||
| 136 | } kind; | 179 | } kind; |
| 137 | 180 | ||
| 138 | Lisp_Object code; | 181 | Lisp_Object code; |
| 139 | Lisp_Object part; | 182 | enum scrollbar_part part; |
| 183 | struct scrollbar *scrollbar; | ||
| 140 | 184 | ||
| 141 | /* This is obviously wrong, but I'm not sure what else I should do. | 185 | /* This is obviously wrong, but I'm not sure what else I should do. |
| 142 | Obviously, this should be a FRAME_PTR. But that would require that | 186 | Obviously, this should be a FRAME_PTR. But that would require that |
diff --git a/src/window.h b/src/window.h index 5bc3e73a912..b05386d978d 100644 --- a/src/window.h +++ b/src/window.h | |||
| @@ -123,6 +123,12 @@ struct window | |||
| 123 | Lisp_Object last_modified; | 123 | Lisp_Object last_modified; |
| 124 | /* Value of point at that time */ | 124 | /* Value of point at that time */ |
| 125 | Lisp_Object last_point; | 125 | Lisp_Object last_point; |
| 126 | /* Pointer to this window's vertical scrollbar, tagged as an | ||
| 127 | integer. If this window is newly created and we haven't | ||
| 128 | displayed a scrollbar in it yet, or if the frame doesn't have | ||
| 129 | any scrollbars, this is nil. */ | ||
| 130 | Lisp_Object vertical_scrollbar; | ||
| 131 | |||
| 126 | /* The rest are currently not used or only half used */ | 132 | /* The rest are currently not used or only half used */ |
| 127 | /* Frame coords of point at that time */ | 133 | /* Frame coords of point at that time */ |
| 128 | Lisp_Object last_point_x; | 134 | Lisp_Object last_point_x; |