Mercurial > emacs
comparison src/frame.h @ 1710:26054080a152
* 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.
Change the meaning of focus redirection to make switching windows
work properly. Fredirect_frame_focus has the details.
* frame.h (focus_frame): Doc fix.
[not MULTI_FRAME] (FRAME_FOCUS_FRAME): Make this Qnil, which
indicates no focus redirection, instead of zero, which is
selected_frame.
* frame.c (make_frame): Initialize f->focus_frame to Qnil, rather
than making it point to frame itself.
(Fselect_frame): If changing the selected frame from FOO to BAR,
make all redirections to FOO shift to BAR as well. Doc fix.
(Fredirect_frame_focus): Doc fix. Accept nil as a valid
redirection, not just as a default for FRAME.
(Fframe_focus): Doc fix.
* keyboard.c (kbd_buffer_store_event, kbd_buffer_get_event): Deal
with focus redirections being nil.
* xterm.c (XTframe_rehighlight): Doc fix. Deal with focus
redirections being nil.
It's a pain to remember that you can't assign to FRAME->visible.
Let's change all references to the `visible' member of struct
frame to use the accessor macros, and then write a setter for the
`visible' field that does the right thing.
* frame.h (FRAME_VISIBLE_P): Make this not an l-value.
(FRAME_SET_VISIBLE): New macro.
* frame.c (make_terminal_frame, Fdelete_frame): Use FRAME_SET_VISIBLE.
(Fframe_visible_p, Fvisible_frame_list): Use FRAME_VISIBLE_P and
FRAME_ICONIFIED_P.
* dispnew.c (Fredraw_display): Use the FRAME_VISIBLE_P and
FRAME_GARBAGED_P accessors.
* xdisp.c (redisplay): Use the FRAME_VISIBLE_P accessor.
* xfns.c (x_set_foreground_color, x_set_background_color,
x_set_cursor_color, x_set_border_pixel, x_set_icon_type): Use the
FRAME_VISIBLE_P accessor.
(Fx_create_frame): Use FRAME_SET_VISIBILITY.
* xterm.c (clear_cursor, x_display_bar_cursor,
x_display_box_cursor): Use FRAME_SET_VISIBILITY.
author | Jim Blandy <jimb@redhat.com> |
---|---|
date | Thu, 24 Dec 1992 06:07:02 +0000 |
parents | fd573317f468 |
children | 20c6f4aa5843 |
comparison
equal
deleted
inserted
replaced
1709:b86b3237e017 | 1710:26054080a152 |
---|---|
75 | 75 |
76 /* Name of this frame: a Lisp string. See also `explicit_name'. */ | 76 /* Name of this frame: a Lisp string. See also `explicit_name'. */ |
77 Lisp_Object name; | 77 Lisp_Object name; |
78 | 78 |
79 /* The frame which should recieve keystrokes that occur in this | 79 /* The frame which should recieve keystrokes that occur in this |
80 frame. This is usually the frame itself, but if the frame is | 80 frame, or nil if they should go to the frame itself. This is |
81 minibufferless, this points to the minibuffer frame when it is | 81 usually nil, but if the frame is minibufferless, we can use this |
82 active. */ | 82 to redirect keystrokes to a surrogate minibuffer frame when |
83 needed. | |
84 | |
85 Note that a value of nil is different than having the field point | |
86 to the frame itself. Whenever the Fselect_frame function is used | |
87 to shift from one frame to the other, any redirections to the | |
88 original frame are shifted to the newly selected frame; if | |
89 focus_frame is nil, Fselect_frame will leave it alone. */ | |
83 Lisp_Object focus_frame; | 90 Lisp_Object focus_frame; |
84 | 91 |
85 /* This frame's root window. Every frame has one. | 92 /* This frame's root window. Every frame has one. |
86 If the frame has only a minibuffer window, this is it. | 93 If the frame has only a minibuffer window, this is it. |
87 Otherwise, if the frame has a minibuffer window, this is its sibling. */ | 94 Otherwise, if the frame has a minibuffer window, this is its sibling. */ |
116 /* Nonzero if last attempt at redisplay on this frame was preempted. */ | 123 /* Nonzero if last attempt at redisplay on this frame was preempted. */ |
117 char display_preempted; | 124 char display_preempted; |
118 | 125 |
119 /* visible is nonzero if the frame is currently displayed; we check | 126 /* visible is nonzero if the frame is currently displayed; we check |
120 it to see if we should bother updating the frame's contents. | 127 it to see if we should bother updating the frame's contents. |
128 DON'T SET IT DIRECTLY; instead, use FRAME_SET_VISIBLE. | |
121 | 129 |
122 iconified is nonzero if the frame is currently iconified. | 130 iconified is nonzero if the frame is currently iconified. |
123 | 131 |
124 Asynchronous input handlers should NOT change these directly; | 132 Asynchronous input handlers should NOT change these directly; |
125 instead, they should change async_visible or async_iconified, and | 133 instead, they should change async_visible or async_iconified, and |
152 char has_minibuffer; | 160 char has_minibuffer; |
153 | 161 |
154 /* 0 means, if this frame has just one window, | 162 /* 0 means, if this frame has just one window, |
155 show no modeline for that window. */ | 163 show no modeline for that window. */ |
156 char wants_modeline; | 164 char wants_modeline; |
165 | |
166 /* Non-zero if the hardware device this frame is displaying on can | |
167 support scrollbars. */ | |
168 char can_have_scrollbars; | |
169 | |
170 /* If can_have_scrollbars is non-zero, this is non-zero if we should | |
171 actually display them on this frame. */ | |
172 char has_vertical_scrollbars; | |
157 | 173 |
158 /* Non-0 means raise this frame to the top of the heap when selected. */ | 174 /* Non-0 means raise this frame to the top of the heap when selected. */ |
159 char auto_raise; | 175 char auto_raise; |
160 | 176 |
161 /* Non-0 means lower this frame to the bottom of the stack when left. */ | 177 /* Non-0 means lower this frame to the bottom of the stack when left. */ |
201 #define FRAME_WIDTH(f) (f)->width | 217 #define FRAME_WIDTH(f) (f)->width |
202 #define FRAME_NEW_HEIGHT(f) (f)->new_height | 218 #define FRAME_NEW_HEIGHT(f) (f)->new_height |
203 #define FRAME_NEW_WIDTH(f) (f)->new_width | 219 #define FRAME_NEW_WIDTH(f) (f)->new_width |
204 #define FRAME_CURSOR_X(f) (f)->cursor_x | 220 #define FRAME_CURSOR_X(f) (f)->cursor_x |
205 #define FRAME_CURSOR_Y(f) (f)->cursor_y | 221 #define FRAME_CURSOR_Y(f) (f)->cursor_y |
206 #define FRAME_VISIBLE_P(f) (f)->visible | 222 #define FRAME_VISIBLE_P(f) ((f)->visible != 0) |
223 #define FRAME_SET_VISIBLE(f,p) \ | |
224 ((f)->async_visible = (p), FRAME_SAMPLE_VISIBILITY (f)) | |
207 #define SET_FRAME_GARBAGED(f) (frame_garbaged = 1, f->garbaged = 1) | 225 #define SET_FRAME_GARBAGED(f) (frame_garbaged = 1, f->garbaged = 1) |
208 #define FRAME_GARBAGED_P(f) (f)->garbaged | 226 #define FRAME_GARBAGED_P(f) (f)->garbaged |
209 #define FRAME_NO_SPLIT_P(f) (f)->no_split | 227 #define FRAME_NO_SPLIT_P(f) (f)->no_split |
210 #define FRAME_WANTS_MODELINE_P(f) (f)->wants_modeline | 228 #define FRAME_WANTS_MODELINE_P(f) (f)->wants_modeline |
211 #define FRAME_ICONIFIED_P(f) (f)->iconified | 229 #define FRAME_ICONIFIED_P(f) (f)->iconified |
218 #define FRAME_INSERTN_COST(f) (f)->insert_n_lines_cost | 236 #define FRAME_INSERTN_COST(f) (f)->insert_n_lines_cost |
219 #define FRAME_DELETEN_COST(f) (f)->delete_n_lines_cost | 237 #define FRAME_DELETEN_COST(f) (f)->delete_n_lines_cost |
220 #define FRAME_MESSAGE_BUF(f) (f)->message_buf | 238 #define FRAME_MESSAGE_BUF(f) (f)->message_buf |
221 #define FRAME_SCROLL_BOTTOM_VPOS(f) (f)->scroll_bottom_vpos | 239 #define FRAME_SCROLL_BOTTOM_VPOS(f) (f)->scroll_bottom_vpos |
222 #define FRAME_FOCUS_FRAME(f) (f)->focus_frame | 240 #define FRAME_FOCUS_FRAME(f) (f)->focus_frame |
241 #define FRAME_CAN_HAVE_SCROLLBARS(f) ((f)->can_have_scrollbars) | |
242 #define FRAME_HAS_VERTICAL_SCROLLBARS(f) ((f)->has_vertical_scrollbars) | |
223 | 243 |
224 /* Emacs's redisplay code could become confused if a frame's | 244 /* Emacs's redisplay code could become confused if a frame's |
225 visibility changes at arbitrary times. For example, if a frame is | 245 visibility changes at arbitrary times. For example, if a frame is |
226 visible while the desired glyphs are being built, but becomes | 246 visible while the desired glyphs are being built, but becomes |
227 invisible before they are updated, then some rows of the | 247 invisible before they are updated, then some rows of the |
235 So instead of having asynchronous input handlers directly set and | 255 So instead of having asynchronous input handlers directly set and |
236 clear the frame's visibility and iconification flags, they just set | 256 clear the frame's visibility and iconification flags, they just set |
237 the async_visible and async_iconified flags; the redisplay code | 257 the async_visible and async_iconified flags; the redisplay code |
238 calls the FRAME_SAMPLE_VISIBILITY macro before doing any redisplay, | 258 calls the FRAME_SAMPLE_VISIBILITY macro before doing any redisplay, |
239 which sets visible and iconified from their asynchronous | 259 which sets visible and iconified from their asynchronous |
240 counterparts. */ | 260 counterparts. |
261 | |
262 Synchronous code must use the FRAME_SET_VISIBLE macro. */ | |
241 #define FRAME_SAMPLE_VISIBILITY(f) \ | 263 #define FRAME_SAMPLE_VISIBILITY(f) \ |
242 ((f)->visible = (f)->async_visible, \ | 264 ((f)->visible = (f)->async_visible, \ |
243 (f)->iconified = (f)->async_iconified) | 265 (f)->iconified = (f)->async_iconified) |
244 | 266 |
245 #define CHECK_FRAME(x, i) \ | 267 #define CHECK_FRAME(x, i) \ |
325 #define FRAME_WIDTH(f) (the_only_frame.width) | 347 #define FRAME_WIDTH(f) (the_only_frame.width) |
326 #define FRAME_NEW_HEIGHT(f) (the_only_frame.new_height) | 348 #define FRAME_NEW_HEIGHT(f) (the_only_frame.new_height) |
327 #define FRAME_NEW_WIDTH(f) (the_only_frame.new_width) | 349 #define FRAME_NEW_WIDTH(f) (the_only_frame.new_width) |
328 #define FRAME_CURSOR_X(f) (the_only_frame.cursor_x) | 350 #define FRAME_CURSOR_X(f) (the_only_frame.cursor_x) |
329 #define FRAME_CURSOR_Y(f) (the_only_frame.cursor_y) | 351 #define FRAME_CURSOR_Y(f) (the_only_frame.cursor_y) |
352 #define FRAME_SET_VISIBLE(f,p) (p) | |
330 #define FRAME_VISIBLE_P(f) 1 | 353 #define FRAME_VISIBLE_P(f) 1 |
331 #define SET_FRAME_GARBAGED(f) (frame_garbaged = 1) | 354 #define SET_FRAME_GARBAGED(f) (frame_garbaged = 1) |
332 #define FRAME_GARBAGED_P(f) (frame_garbaged) | 355 #define FRAME_GARBAGED_P(f) (frame_garbaged) |
333 #define FRAME_NO_SPLIT_P(f) 0 | 356 #define FRAME_NO_SPLIT_P(f) 0 |
334 #define FRAME_WANTS_MODELINE_P(f) 1 | 357 #define FRAME_WANTS_MODELINE_P(f) 1 |
341 #define FRAME_DELETE_COST(frame) (the_only_frame.delete_line_cost) | 364 #define FRAME_DELETE_COST(frame) (the_only_frame.delete_line_cost) |
342 #define FRAME_INSERTN_COST(frame) (the_only_frame.insert_n_lines_cost) | 365 #define FRAME_INSERTN_COST(frame) (the_only_frame.insert_n_lines_cost) |
343 #define FRAME_DELETEN_COST(frame) (the_only_frame.delete_n_lines_cost) | 366 #define FRAME_DELETEN_COST(frame) (the_only_frame.delete_n_lines_cost) |
344 #define FRAME_MESSAGE_BUF(f) (the_only_frame.message_buf) | 367 #define FRAME_MESSAGE_BUF(f) (the_only_frame.message_buf) |
345 #define FRAME_SCROLL_BOTTOM_VPOS(f) (the_only_frame.scroll_bottom_vpos) | 368 #define FRAME_SCROLL_BOTTOM_VPOS(f) (the_only_frame.scroll_bottom_vpos) |
346 #define FRAME_FOCUS_FRAME(f) (0) | 369 #define FRAME_FOCUS_FRAME(f) (Qnil) |
370 #define FRAME_CAN_HAVE_SCROLLBARS(f) (the_only_frame.can_have_scrollbars) | |
371 #define FRAME_HAS_VERTICAL_SCROLLBARS(f) \ | |
372 (the_only_frame.has_vertical_scrollbars) | |
347 | 373 |
348 /* See comments in definition above. */ | 374 /* See comments in definition above. */ |
349 #define FRAME_SAMPLE_VISIBILITY(f) (0) | 375 #define FRAME_SAMPLE_VISIBILITY(f) (0) |
350 | 376 |
351 #define CHECK_FRAME(x, i) do; while (0) | 377 #define CHECK_FRAME(x, i) do; while (0) |
363 FRAME_VAR. */ | 389 FRAME_VAR. */ |
364 #define FOR_EACH_FRAME(list_var, frame_var) \ | 390 #define FOR_EACH_FRAME(list_var, frame_var) \ |
365 for (frame_var = (FRAME_PTR) 1; frame_var; frame_var = (FRAME_PTR) 0) | 391 for (frame_var = (FRAME_PTR) 1; frame_var; frame_var = (FRAME_PTR) 0) |
366 | 392 |
367 #endif /* not MULTI_FRAME */ | 393 #endif /* not MULTI_FRAME */ |
394 | |
395 | |
396 /* Device- and MULTI_FRAME-independent scrollbar stuff. */ | |
397 | |
398 /* The number of columns a vertical scrollbar occupies. */ | |
399 #define VERTICAL_SCROLLBAR_WIDTH (2) | |
400 | |
401 /* Turn a window's scrollbar member into a `struct scrollbar *'; | |
402 return NULL if the window doesn't have a scrollbar. */ | |
403 #define WINDOW_VERTICAL_SCROLLBAR(w) \ | |
404 (XTYPE ((w)->vertical_scrollbar) == Lisp_Int \ | |
405 ? (struct scrollbar *) XPNTR ((w)->vertical_scrollbar) \ | |
406 : (struct scrollbar *) 0) | |
407 | |
408 | |
409 /* Return the starting column (zero-based) of the vertical scrollbar | |
410 for window W. The column before this one is the last column we can | |
411 use for text. If the window touches the right edge of the frame, | |
412 we have extra space allocated for it. Otherwise, the scrollbar | |
413 takes over the window's rightmost columns. */ | |
414 #define WINDOW_VERTICAL_SCROLLBAR_COLUMN(w) \ | |
415 (((XINT ((w)->left) + XINT ((w)->width)) \ | |
416 < FRAME_WIDTH (XFRAME (WINDOW_FRAME (w)))) \ | |
417 ? XINT ((w)->left) + XINT ((w)->width) - VERTICAL_SCROLLBAR_WIDTH \ | |
418 : FRAME_WIDTH (XFRAME (WINDOW_FRAME (w)))) | |
419 | |
420 /* Return the height in lines of the vertical scrollbar in w. If the | |
421 window has a mode line, don't make the scrollbar extend that far. */ | |
422 #define WINDOW_VERTICAL_SCROLLBAR_HEIGHT(w) (window_internal_height (w)) |