diff options
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; |