aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJim Blandy1992-12-24 06:17:18 +0000
committerJim Blandy1992-12-24 06:17:18 +0000
commit20a558dc142b78198cacc5723ee7426e143a7929 (patch)
tree8db82a4ac64843a5734304e5cecda54bd82cf382 /src
parentdb269683bcb041c85735cba624575a643bb9c807 (diff)
downloademacs-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.c49
-rw-r--r--src/termhooks.h86
-rw-r--r--src/window.h6
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
94int (*read_socket_hook) (); 94int (*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. */
98void (*mouse_position_hook) ( /* FRAME_PTR *f, 100void (*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. */
108void (*frame_rehighlight_hook) ( /* FRAME_PTR f */ ); 112void (*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. */
119struct 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. */
135void (*condemn_scrollbars_hook)( /* FRAME_PTR *FRAME */ );
136
137/* Unmark BAR for deletion in this judgement cycle. */
138void (*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'. */
142void (*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
112char *TS_ins_line; /* termcap "al" */ 148char *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
46extern int (*read_socket_hook) (); 46extern int (*read_socket_hook) ();
47 47
48/* Return the current position of the mouse. This should clear 48enum 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. */
50extern void (*mouse_position_hook) ( /* FRAME_PTR *f, 58extern 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. */
63extern void (*frame_rehighlight_hook) ( /* void */ ); 73extern 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. */
80extern 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. */
97extern void (*condemn_scrollbars_hook)( /* FRAME_PTR *FRAME */ );
98
99/* Unmark BAR for deletion in this judgement cycle. */
100extern 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'. */
104extern 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. */
66extern FILE *termscript; 109extern 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;