Mercurial > hg > xemacs-beta
annotate src/frame-impl.h @ 5120:d1247f3cc363 ben-lisp-object
latest work on lisp-object workspace;
more changes eliminating LCRECORD in place of LISP_OBJECT;
now compiles and runs.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Mon, 28 Dec 2009 01:15:52 -0600 |
parents | 1e7cc382eb16 |
children | 2a462149bd6a |
rev | line source |
---|---|
872 | 1 /* Define frame-object for XEmacs. |
2 Copyright (C) 1988, 1992, 1993, 1994 Free Software Foundation, Inc. | |
3 Copyright (C) 1995 Ben Wing. | |
4 | |
5 This file is part of XEmacs. | |
6 | |
7 XEmacs is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
9 Free Software Foundation; either version 2, or (at your option) any | |
10 later version. | |
11 | |
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with XEmacs; see the file COPYING. If not, write to | |
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
20 Boston, MA 02111-1307, USA. */ | |
21 | |
22 /* Synched up with: FSF 19.30. */ | |
23 | |
24 #ifndef INCLUDED_frame_impl_h_ | |
25 #define INCLUDED_frame_impl_h_ | |
26 | |
27 #include "console-impl.h" /* for error_check_frame_type */ | |
28 #include "frame.h" | |
29 | |
30 #define FRAME_TYPE_NAME(f) ((f)->framemeths->name) | |
31 #define FRAME_TYPE(f) ((f)->framemeths->symbol) | |
32 | |
33 /******** Accessing / calling a frame method *********/ | |
34 | |
35 #define HAS_FRAMEMETH_P(f, m) HAS_CONTYPE_METH_P ((f)->framemeths, m) | |
36 #define FRAMEMETH(f, m, args) CONTYPE_METH ((f)->framemeths, m, args) | |
37 #define MAYBE_FRAMEMETH(f, m, args) \ | |
38 MAYBE_CONTYPE_METH ((f)->framemeths, m, args) | |
39 #define FRAMEMETH_OR_GIVEN(f, m, args, given) \ | |
40 CONTYPE_METH_OR_GIVEN((f)->framemeths, m, args, given) | |
41 | |
42 struct frame | |
43 { | |
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
3017
diff
changeset
|
44 LISP_OBJECT_HEADER header; |
872 | 45 |
46 /* Methods for this frame's console. This can also be retrieved | |
47 through frame->device->console, but it's faster this way. */ | |
48 struct console_methods *framemeths; | |
49 | |
1204 | 50 /* Duplicates framemeths->symbol. See comment in struct console. */ |
51 enum console_variant frametype; | |
52 | |
872 | 53 /* Size of text only area of this frame, excluding scrollbars, |
54 toolbars and end of line glyphs. The size can be in characters | |
55 or pixels, depending on units in which window system resizes | |
56 its windows */ | |
57 int height, width; | |
58 | |
59 /* New height and width for pending size change, in the same units | |
60 as above. 0 if no change pending. */ | |
61 int new_height, new_width; | |
62 | |
63 /* Size of text-only are of the frame, in default font characters. | |
64 This may be inaccurate due to rounding error */ | |
65 int char_height, char_width; | |
66 | |
67 /* Size of the whole frame, including scrollbars, toolbars and end | |
68 of line glyphs, in pixels */ | |
69 int pixheight, pixwidth; | |
70 | |
71 #ifdef HAVE_TTY | |
72 /* The count of frame number. This applies to TTY frames only. */ | |
73 int order_count; | |
74 #endif | |
75 | |
76 /* Current page number for a printer frame. */ | |
77 int page_number; | |
78 | |
79 /* Width of the internal border. This is a line of background color | |
80 just inside the window's border. It is normally only non-zero on | |
81 X frames, but we put it here to avoid introducing window system | |
82 dependencies. */ | |
83 int internal_border_width; | |
84 | |
85 int modiff; | |
86 | |
87 struct expose_ignore *subwindow_exposures; | |
88 struct expose_ignore *subwindow_exposures_tail; | |
89 | |
90 #ifdef HAVE_SCROLLBARS | |
91 /* frame-local scrollbar information. See scrollbar.c. */ | |
92 int scrollbar_y_offset; | |
93 | |
94 /* cache of created scrollbars */ | |
95 struct scrollbar_instance *sb_vcache; | |
96 struct scrollbar_instance *sb_hcache; | |
97 #endif | |
98 | |
99 #ifdef HAVE_TOOLBARS | |
100 /* Size of toolbars as seen by redisplay. This is used to determine | |
101 whether to re-layout windows by a call to change_frame_size early | |
102 in redisplay_frame. */ | |
103 int current_toolbar_size[4]; | |
104 #endif | |
105 | |
106 /* Size of gutters as seen by redisplay. This is used to determine | |
107 whether to re-layout windows by a call to change_frame_size early | |
108 in redisplay_frame. */ | |
109 int current_gutter_bounds[4]; | |
110 | |
111 /* Dynamic arrays of display lines for gutters */ | |
112 display_line_dynarr *current_display_lines[4]; | |
113 display_line_dynarr *desired_display_lines[4]; | |
114 | |
1204 | 115 /* A structure of auxiliary data specific to the device type. For |
116 example, struct x_frame is for X window frames; defined in | |
117 console-x-impl.h. */ | |
872 | 118 void *frame_data; |
119 | |
120 #define FRAME_SLOT_DECLARATION | |
1204 | 121 #define MARKED_SLOT(x) Lisp_Object x; |
872 | 122 #include "frameslots.h" |
123 | |
124 /* Nonzero if frame is currently displayed. | |
125 Mutually exclusive with iconified | |
126 JV: This now a tristate flag: | |
127 Value : Emacs meaning :f-v-p : X meaning | |
128 0 : not displayed : nil : unmapped | |
129 >0 : user can access it,needs repainting : t : mapped and visible | |
130 <0 : user can access it,needs no repainting : hidden :mapped and invisible | |
131 where f-v-p is the return value of frame-visible-p */ | |
132 int visible; | |
133 | |
134 /* one-bit flags: */ | |
135 | |
136 /* Is focusing onto this frame disabled? (Modal dialog boxes) */ | |
137 unsigned int disabled :1; | |
138 | |
139 /* Are we finished initializing? */ | |
140 unsigned int init_finished :1; | |
141 | |
142 /* Is frame marked for deletion? This is used in XSetErrorHandler(). */ | |
143 unsigned int being_deleted :1; | |
144 | |
145 /* Nonzero if last attempt at redisplay on this frame was preempted. */ | |
146 unsigned int display_preempted :1; | |
147 | |
148 /* Nonzero if window is currently iconified. | |
149 This and visible are mutually exclusive. */ | |
150 unsigned int iconified :1; | |
151 | |
152 /* Nonzero if this frame should be cleared and then redrawn. | |
153 Setting this will also effectively set frame_changed. */ | |
154 unsigned int clear :1; | |
155 | |
156 /* True if frame actually has a minibuffer window on it. | |
157 0 if using a minibuffer window that isn't on this frame. */ | |
158 unsigned int has_minibuffer :1; | |
159 | |
160 /* True if frame's root window can't be split. */ | |
161 unsigned int no_split :1; | |
162 | |
163 unsigned int top_toolbar_was_visible :1; | |
164 unsigned int bottom_toolbar_was_visible :1; | |
165 unsigned int left_toolbar_was_visible :1; | |
166 unsigned int right_toolbar_was_visible :1; | |
167 /* gutter visibility */ | |
168 unsigned int top_gutter_was_visible :1; | |
169 unsigned int bottom_gutter_was_visible :1; | |
170 unsigned int left_gutter_was_visible :1; | |
171 unsigned int right_gutter_was_visible :1; | |
172 | |
173 /* redisplay flags */ | |
174 unsigned int buffers_changed :1; | |
175 unsigned int clip_changed :1; | |
176 unsigned int extents_changed :1; | |
177 unsigned int faces_changed :1; | |
178 unsigned int frame_changed :1; | |
905 | 179 unsigned int frame_layout_changed :1; /* The layout of frame |
180 elements has changed. */ | |
872 | 181 unsigned int subwindows_changed :1; |
182 unsigned int subwindows_state_changed :1; | |
183 unsigned int glyphs_changed :1; | |
184 unsigned int icon_changed :1; | |
185 unsigned int menubar_changed :1; | |
186 unsigned int modeline_changed :1; | |
187 unsigned int point_changed :1; | |
188 unsigned int size_changed :1; | |
189 unsigned int toolbar_changed :1; | |
190 unsigned int gutter_changed :1; | |
191 unsigned int windows_changed :1; | |
192 unsigned int windows_structure_changed :1; | |
193 unsigned int window_face_cache_reset :1; /* used by expose handler */ | |
194 unsigned int echo_area_garbaged :1; /* used by Fredisplay_echo_area */ | |
195 unsigned int size_slipped :1; | |
196 | |
197 unsigned int size_change_pending :1; | |
198 unsigned int mirror_dirty :1; | |
199 | |
200 /* flag indicating if any window on this frame is displaying a subwindow */ | |
201 unsigned int subwindows_being_displayed :1; | |
202 }; | |
203 | |
204 /* Redefine basic properties more efficiently */ | |
205 | |
206 #undef FRAME_LIVE_P | |
207 #define FRAME_LIVE_P(f) (!EQ (FRAME_TYPE (f), Qdead)) | |
208 #undef FRAME_DEVICE | |
209 #define FRAME_DEVICE(f) ((f)->device) | |
210 | |
211 #define FRAME_TYPE_P(f, type) EQ (FRAME_TYPE (f), Q##type) | |
212 | |
213 #ifdef ERROR_CHECK_TYPES | |
214 DECLARE_INLINE_HEADER ( | |
215 struct frame * | |
216 error_check_frame_type (struct frame * f, Lisp_Object sym) | |
217 ) | |
218 { | |
219 assert (EQ (FRAME_TYPE (f), sym)); | |
220 return f; | |
221 } | |
222 # define FRAME_TYPE_DATA(f, type) \ | |
223 ((struct type##_frame *) error_check_frame_type (f, Q##type)->frame_data) | |
224 #else | |
225 # define FRAME_TYPE_DATA(f, type) \ | |
226 ((struct type##_frame *) (f)->frame_data) | |
227 #endif | |
228 | |
229 #define CHECK_FRAME_TYPE(x, type) \ | |
230 do { \ | |
231 CHECK_FRAME (x); \ | |
232 if (!FRAME_TYPE_P (XFRAME (x), type)) \ | |
233 dead_wrong_type_argument \ | |
234 (type##_console_methods->predicate_symbol, x); \ | |
235 } while (0) | |
236 #define CONCHECK_FRAME_TYPE(x, type) \ | |
237 do { \ | |
238 CONCHECK_FRAME (x); \ | |
239 if (!FRAME_TYPE_P (XFRAME (x), type)) \ | |
240 x = wrong_type_argument \ | |
241 (type##_console_methods->predicate_symbol, x); \ | |
242 } while (0) | |
243 | |
244 #define FRAME_DISPLAY_P(frm) \ | |
245 (DEVICE_DISPLAY_P (XDEVICE (FRAME_DEVICE (frm)))) | |
246 | |
247 #define CHECK_DISPLAY_FRAME(frm) \ | |
248 do { \ | |
249 CHECK_FRAME (frm); \ | |
250 CHECK_LIVE_FRAME (frm); \ | |
251 CHECK_DISPLAY_DEVICE (FRAME_DEVICE (XFRAME (frm))); \ | |
252 } while (0) | |
253 | |
254 #define CONCHECK_DISPLAY_FRAME(frm) \ | |
255 do { \ | |
256 CONCHECK_FRAME (frm); \ | |
257 CONCHECK_LIVE_FRAME (frm); \ | |
258 CONCHECK_DISPLAY_DEVICE (FRAME_DEVICE (XFRAME (frm))); \ | |
259 } while (0) | |
260 | |
261 #define FRAME_PRINTER_P(frm) \ | |
262 (DEVICE_PRINTER_P (XDEVICE (FRAME_DEVICE (frm)))) | |
263 | |
264 #define CHECK_PRINTER_FRAME(frm) \ | |
265 do { \ | |
266 CHECK_FRAME (frm); \ | |
267 CHECK_LIVE_FRAME (frm); \ | |
268 CHECK_PRINTER_DEVICE (FRAME_DEVICE (XFRAME (frm))); \ | |
269 } while (0) | |
270 | |
271 #define CONCHECK_PRINTER_FRAME(frm) \ | |
272 do { \ | |
273 CONCHECK_FRAME (frm); \ | |
274 CONCHECK_LIVE_FRAME (frm); \ | |
275 CONCHECK_PRINTER_DEVICE (FRAME_DEVICE (XFRAME (frm))); \ | |
276 } while (0) | |
277 | |
278 /* #### These should be in the frame-*.h files but there are | |
279 too many places where the abstraction is broken. Need to | |
280 fix. */ | |
281 | |
282 #define FRAME_X_P(frm) CONSOLE_TYPESYM_X_P (FRAME_TYPE (frm)) | |
283 #define CHECK_X_FRAME(z) CHECK_FRAME_TYPE (z, x) | |
284 #define CONCHECK_X_FRAME(z) CONCHECK_FRAME_TYPE (z, x) | |
285 | |
286 #define FRAME_GTK_P(frm) CONSOLE_TYPESYM_GTK_P (FRAME_TYPE (frm)) | |
287 #define CHECK_GTK_FRAME(z) CHECK_FRAME_TYPE (z, gtk) | |
288 #define CONCHECK_GTK_FRAME(z) CONCHECK_FRAME_TYPE (z, gtk) | |
289 | |
290 #define FRAME_TTY_P(frm) CONSOLE_TYPESYM_TTY_P (FRAME_TYPE (frm)) | |
291 #define CHECK_TTY_FRAME(z) CHECK_FRAME_TYPE (z, tty) | |
292 #define CONCHECK_TTY_FRAME(z) CONCHECK_FRAME_TYPE (z, tty) | |
293 | |
294 #define FRAME_STREAM_P(frm) CONSOLE_TYPESYM_STREAM_P (FRAME_TYPE (frm)) | |
295 #define CHECK_STREAM_FRAME(z) CHECK_FRAME_TYPE (z, stream) | |
296 #define CONCHECK_STREAM_FRAME(z) CONCHECK_FRAME_TYPE (z, stream) | |
297 | |
298 #define FRAME_WIN_P(frm) CONSOLE_TYPESYM_WIN_P (FRAME_TYPE (frm)) | |
299 | |
300 extern int frame_changed; | |
301 | |
302 #define MARK_FRAME_FACES_CHANGED(f) do { \ | |
303 struct frame *mffc_f = (f); \ | |
304 mffc_f->faces_changed = 1; \ | |
305 mffc_f->modiff++; \ | |
306 if (!NILP (mffc_f->device)) \ | |
307 { \ | |
308 struct device *mffc_d = XDEVICE (mffc_f->device); \ | |
309 MARK_DEVICE_FACES_CHANGED (mffc_d); \ | |
310 } \ | |
311 else \ | |
312 faces_changed = 1; \ | |
313 } while (0) | |
314 | |
315 #define MARK_FRAME_GLYPHS_CHANGED(f) do { \ | |
316 struct frame *mfgc_f = (f); \ | |
317 mfgc_f->glyphs_changed = 1; \ | |
318 mfgc_f->modiff++; \ | |
319 if (!NILP (mfgc_f->device)) \ | |
320 { \ | |
321 struct device *mfgc_d = XDEVICE (mfgc_f->device); \ | |
322 MARK_DEVICE_GLYPHS_CHANGED (mfgc_d); \ | |
323 } \ | |
324 else \ | |
325 glyphs_changed = 1; \ | |
326 } while (0) | |
327 | |
328 #define MARK_FRAME_SUBWINDOWS_CHANGED(f) do { \ | |
329 struct frame *mfgc_f = (f); \ | |
330 mfgc_f->subwindows_changed = 1; \ | |
331 mfgc_f->modiff++; \ | |
332 if (!NILP (mfgc_f->device)) \ | |
333 { \ | |
334 struct device *mfgc_d = XDEVICE (mfgc_f->device); \ | |
335 MARK_DEVICE_SUBWINDOWS_CHANGED (mfgc_d); \ | |
336 } \ | |
337 else \ | |
338 subwindows_changed = 1; \ | |
339 } while (0) | |
340 | |
341 #define MARK_FRAME_SUBWINDOWS_STATE_CHANGED(f) do { \ | |
342 struct frame *mfgc_f = (f); \ | |
343 mfgc_f->subwindows_state_changed = 1; \ | |
344 mfgc_f->modiff++; \ | |
345 if (!NILP (mfgc_f->device)) \ | |
346 { \ | |
347 struct device *mfgc_d = XDEVICE (mfgc_f->device); \ | |
348 MARK_DEVICE_SUBWINDOWS_STATE_CHANGED (mfgc_d); \ | |
349 } \ | |
350 else \ | |
351 subwindows_state_changed = 1; \ | |
352 } while (0) | |
353 | |
354 #define MARK_FRAME_TOOLBARS_CHANGED(f) do { \ | |
355 struct frame *mftc_f = (f); \ | |
356 mftc_f->toolbar_changed = 1; \ | |
357 mftc_f->modiff++; \ | |
358 if (!NILP (mftc_f->device)) \ | |
359 { \ | |
360 struct device *mftc_d = XDEVICE (mftc_f->device); \ | |
361 MARK_DEVICE_TOOLBARS_CHANGED (mftc_d); \ | |
362 } \ | |
363 else \ | |
364 toolbar_changed = 1; \ | |
365 } while (0) | |
366 | |
367 #define MARK_FRAME_GUTTERS_CHANGED(f) do { \ | |
368 struct frame *mftc_f = (f); \ | |
369 mftc_f->gutter_changed = 1; \ | |
370 mftc_f->modiff++; \ | |
371 if (!NILP (mftc_f->device)) \ | |
372 { \ | |
373 struct device *mftc_d = XDEVICE (mftc_f->device); \ | |
374 MARK_DEVICE_GUTTERS_CHANGED (mftc_d); \ | |
375 } \ | |
376 else \ | |
377 gutter_changed = 1; \ | |
378 } while (0) | |
379 | |
380 #define MARK_FRAME_SIZE_CHANGED(f) do { \ | |
381 struct frame *mfsc_f = (f); \ | |
382 mfsc_f->size_changed = 1; \ | |
383 mfsc_f->size_change_pending = 1; \ | |
384 mfsc_f->modiff++; \ | |
385 if (!NILP (mfsc_f->device)) \ | |
386 { \ | |
387 struct device *mfsc_d = XDEVICE (mfsc_f->device); \ | |
388 MARK_DEVICE_SIZE_CHANGED (mfsc_d); \ | |
389 } \ | |
390 else \ | |
391 size_changed = 1; \ | |
392 } while (0) | |
393 | |
394 #define MARK_FRAME_CHANGED(f) do { \ | |
395 struct frame *mfc_f = (f); \ | |
396 mfc_f->frame_changed = 1; \ | |
397 mfc_f->modiff++; \ | |
398 if (!NILP (mfc_f->device)) \ | |
399 { \ | |
400 struct device *mfc_d = XDEVICE (mfc_f->device); \ | |
401 MARK_DEVICE_FRAME_CHANGED (mfc_d); \ | |
402 } \ | |
403 else \ | |
404 frame_changed = 1; \ | |
405 } while (0) | |
406 | |
905 | 407 #define MARK_FRAME_LAYOUT_CHANGED(f) do { \ |
408 struct frame *mfc_f = (f); \ | |
409 mfc_f->frame_layout_changed = 1; \ | |
410 mfc_f->modiff++; \ | |
411 if (!NILP (mfc_f->device)) \ | |
412 { \ | |
413 struct device *mfc_d = XDEVICE (mfc_f->device); \ | |
414 MARK_DEVICE_FRAME_LAYOUT_CHANGED (mfc_d); \ | |
415 } \ | |
416 else \ | |
417 frame_layout_changed = 1; \ | |
418 } while (0) | |
419 | |
872 | 420 #define MARK_FRAME_WINDOWS_CHANGED(f) do { \ |
421 struct frame *mfwc_f = (f); \ | |
422 mfwc_f->windows_changed = 1; \ | |
423 mfwc_f->modiff++; \ | |
424 if (!NILP (mfwc_f->device)) \ | |
425 { \ | |
426 struct device *mfwc_d = XDEVICE (mfwc_f->device); \ | |
427 MARK_DEVICE_WINDOWS_CHANGED (mfwc_d); \ | |
428 } \ | |
429 else \ | |
430 windows_changed = 1; \ | |
431 } while (0) | |
432 | |
433 #define MARK_FRAME_WINDOWS_STRUCTURE_CHANGED(f) do { \ | |
434 struct frame *fwsc_f = (f); \ | |
435 fwsc_f->windows_structure_changed = 1; \ | |
436 fwsc_f->modiff++; \ | |
437 if (!NILP (fwsc_f->device)) \ | |
438 { \ | |
439 struct device *fwsc_d = XDEVICE (fwsc_f->device); \ | |
440 MARK_DEVICE_WINDOWS_STRUCTURE_CHANGED (fwsc_d); \ | |
441 } \ | |
442 else \ | |
443 windows_structure_changed = 1; \ | |
444 invalidate_vertical_divider_cache_in_frame (fwsc_f); \ | |
445 } while (0) | |
446 | |
447 #define MARK_FRAME_SIZE_SLIPPED(f) do { \ | |
448 struct frame *fwsc_f = (f); \ | |
449 fwsc_f->size_slipped = 1; \ | |
450 fwsc_f->modiff++; \ | |
451 if (!NILP (fwsc_f->device)) \ | |
452 { \ | |
453 struct device *fwsc_d = XDEVICE (fwsc_f->device); \ | |
454 MARK_DEVICE_FRAME_CHANGED (fwsc_d); \ | |
455 } \ | |
456 else \ | |
457 frame_changed = 1; \ | |
458 } while (0) | |
459 | |
460 #define CLEAR_FRAME_SIZE_SLIPPED(f) do { \ | |
461 struct frame *fwsc_f = (f); \ | |
462 fwsc_f->size_slipped = 0; \ | |
463 } while (0) | |
464 | |
465 #define SET_FRAME_CLEAR(f) MARK_FRAME_CHANGED (f); (f)->clear = 1 | |
466 | |
467 #define FRAME_MINIBUF_ONLY_P(f) \ | |
468 EQ (FRAME_ROOT_WINDOW (f), FRAME_MINIBUF_WINDOW (f)) | |
469 #define FRAME_HAS_MINIBUF_P(f) ((f)->has_minibuffer) | |
470 #define FRAME_HEIGHT(f) ((f)->height) | |
471 #define FRAME_WIDTH(f) ((f)->width) | |
472 #define FRAME_CHARHEIGHT(f) ((f)->char_height) | |
473 #define FRAME_CHARWIDTH(f) ((f)->char_width) | |
474 #define FRAME_PIXHEIGHT(f) ((f)->pixheight) | |
475 #define FRAME_PIXWIDTH(f) ((f)->pixwidth) | |
476 #define FRAME_PAGENUMBER(f) ((f)->page_number + 0) | |
477 #define FRAME_SET_PAGENUMBER(f,x) (f)->page_number = (x); | |
478 #ifdef HAVE_SCROLLBARS | |
479 #define FRAME_SCROLLBAR_WIDTH(f) \ | |
480 (NILP ((f)->vertical_scrollbar_visible_p) ? \ | |
481 0 : XINT ((f)->scrollbar_width)) | |
482 #define FRAME_SCROLLBAR_HEIGHT(f) \ | |
483 (NILP ((f)->horizontal_scrollbar_visible_p) ? \ | |
484 0 : XINT ((f)->scrollbar_height)) | |
485 #else | |
486 #define FRAME_SCROLLBAR_WIDTH(f) 0 | |
487 #define FRAME_SCROLLBAR_HEIGHT(f) 0 | |
488 #endif | |
489 | |
490 #define FRAME_NEW_HEIGHT(f) ((f)->new_height) | |
491 #define FRAME_NEW_WIDTH(f) ((f)->new_width) | |
492 #define FRAME_CURSOR_X(f) ((f)->cursor_x) | |
493 #define FRAME_CURSOR_Y(f) ((f)->cursor_y) | |
494 #define FRAME_VISIBLE_P(f) ((f)->visible) | |
495 #define FRAME_REPAINT_P(f) ((f)->visible>0) | |
496 #define FRAME_NO_SPLIT_P(f) ((f)->no_split) | |
497 #define FRAME_ICONIFIED_P(f) ((f)->iconified) | |
498 #define FRAME_FOCUS_FRAME(f) ((f)->focus_frame) | |
499 #define FRAME_MINIBUF_WINDOW(f) ((f)->minibuffer_window) | |
500 #define FRAME_ROOT_WINDOW(f) ((f)->root_window) | |
501 /* Catch people attempting to set this. */ | |
502 #define FRAME_SELECTED_WINDOW(f) NON_LVALUE ((f)->selected_window) | |
503 #define FRAME_SELECTED_XWINDOW(f) XWINDOW (FRAME_SELECTED_WINDOW (f)) | |
504 #define FRAME_LAST_NONMINIBUF_WINDOW(f) \ | |
505 NON_LVALUE ((f)->last_nonminibuf_window) | |
506 #define FRAME_SB_VCACHE(f) ((f)->sb_vcache) | |
507 #define FRAME_SB_HCACHE(f) ((f)->sb_hcache) | |
508 #define FRAME_SUBWINDOW_CACHE(f) ((f)->subwindow_instance_cache) | |
509 | |
510 #if 0 /* FSFmacs */ | |
511 | |
512 #define FRAME_VISIBLE_P(f) ((f)->visible != 0) | |
513 #define FRAME_SET_VISIBLE(f,p) \ | |
514 ((f)->async_visible = (p), FRAME_SAMPLE_VISIBILITY (f)) | |
515 | |
516 /* Emacs's redisplay code could become confused if a frame's | |
517 visibility changes at arbitrary times. For example, if a frame is | |
518 visible while the desired glyphs are being built, but becomes | |
519 invisible before they are updated, then some rows of the | |
520 desired_glyphs will be left marked as enabled after redisplay is | |
521 complete, which should never happen. The next time the frame | |
522 becomes visible, redisplay will probably barf. | |
523 | |
524 Currently, there are no similar situations involving iconified, but | |
525 the principle is the same. | |
526 | |
527 So instead of having asynchronous input handlers directly set and | |
528 clear the frame's visibility and iconification flags, they just set | |
529 the async_visible and async_iconified flags; the redisplay code | |
530 calls the FRAME_SAMPLE_VISIBILITY macro before doing any redisplay, | |
531 which sets visible and iconified from their asynchronous | |
532 counterparts. | |
533 | |
534 Synchronous code must use the FRAME_SET_VISIBLE macro. | |
535 | |
536 Also, if a frame used to be invisible, but has just become visible, | |
537 it must be marked as garbaged, since redisplay hasn't been keeping | |
538 up its contents. */ | |
539 #define FRAME_SAMPLE_VISIBILITY(f) \ | |
540 (((f)->async_visible && ! (f)->visible) ? SET_FRAME_GARBAGED (f) : 0, \ | |
541 (f)->visible = (f)->async_visible, \ | |
542 (f)->iconified = (f)->async_iconified) | |
543 | |
544 #endif /* FSFmacs */ | |
545 | |
546 #define FRAME_BORDER_WIDTH(f) ((f)->internal_border_width) | |
547 #define FRAME_BORDER_HEIGHT(f) ((f)->internal_border_width) | |
548 | |
549 /* This returns the frame-local value; that tells you what you should | |
550 use when computing the frame size. It is *not* the actual toolbar | |
551 size because that depends on the selected window. Use the macros | |
552 below for that. | |
553 */ | |
554 | |
555 #ifdef HAVE_TOOLBARS | |
556 #define FRAME_RAW_THEORETICAL_TOOLBAR_VISIBLE(f, pos) \ | |
557 (!NILP((f)->toolbar_buttons[pos]) && !NILP ((f)->toolbar_visible_p[pos])) | |
558 #define FRAME_RAW_THEORETICAL_TOOLBAR_SIZE(f, pos) \ | |
559 (!NILP ((f)->toolbar_buttons[pos]) && INTP((f)->toolbar_size[pos]) ? \ | |
560 (XINT ((f)->toolbar_size[pos])) : 0) | |
561 #define FRAME_RAW_THEORETICAL_TOOLBAR_BORDER_WIDTH(f, pos) \ | |
562 (!NILP ((f)->toolbar_buttons[pos]) && INTP((f)->toolbar_border_width[pos]) ? \ | |
563 (XINT ((f)->toolbar_border_width[pos])) : 0) | |
564 #else | |
565 #define FRAME_RAW_THEORETICAL_TOOLBAR_VISIBLE(f, pos) 0 | |
566 #define FRAME_RAW_THEORETICAL_TOOLBAR_SIZE(f, pos) 0 | |
567 #define FRAME_RAW_THEORETICAL_TOOLBAR_BORDER_WIDTH(f, pos) 0 | |
568 #endif | |
569 | |
570 #define FRAME_THEORETICAL_TOOLBAR_SIZE(f, pos) \ | |
571 (FRAME_RAW_THEORETICAL_TOOLBAR_VISIBLE (f, pos) \ | |
572 ? FRAME_RAW_THEORETICAL_TOOLBAR_SIZE (f, pos) \ | |
573 : 0) | |
574 | |
575 #define FRAME_THEORETICAL_TOP_TOOLBAR_HEIGHT(f) \ | |
576 FRAME_THEORETICAL_TOOLBAR_SIZE (f, TOP_TOOLBAR) | |
577 #define FRAME_THEORETICAL_BOTTOM_TOOLBAR_HEIGHT(f) \ | |
578 FRAME_THEORETICAL_TOOLBAR_SIZE (f, BOTTOM_TOOLBAR) | |
579 #define FRAME_THEORETICAL_LEFT_TOOLBAR_WIDTH(f) \ | |
580 FRAME_THEORETICAL_TOOLBAR_SIZE (f, LEFT_TOOLBAR) | |
581 #define FRAME_THEORETICAL_RIGHT_TOOLBAR_WIDTH(f) \ | |
582 FRAME_THEORETICAL_TOOLBAR_SIZE (f, RIGHT_TOOLBAR) | |
583 | |
584 #define FRAME_THEORETICAL_TOOLBAR_BORDER_WIDTH(f, pos) \ | |
585 (FRAME_RAW_THEORETICAL_TOOLBAR_VISIBLE (f, pos) \ | |
586 ? FRAME_RAW_THEORETICAL_TOOLBAR_BORDER_WIDTH (f, pos) \ | |
587 : 0) | |
588 | |
589 #define FRAME_THEORETICAL_TOP_TOOLBAR_BORDER_WIDTH(f) \ | |
590 FRAME_THEORETICAL_TOOLBAR_BORDER_WIDTH (f, TOP_TOOLBAR) | |
591 #define FRAME_THEORETICAL_BOTTOM_TOOLBAR_BORDER_WIDTH(f) \ | |
592 FRAME_THEORETICAL_TOOLBAR_BORDER_WIDTH (f, BOTTOM_TOOLBAR) | |
593 #define FRAME_THEORETICAL_LEFT_TOOLBAR_BORDER_WIDTH(f) \ | |
594 FRAME_THEORETICAL_TOOLBAR_BORDER_WIDTH (f, LEFT_TOOLBAR) | |
595 #define FRAME_THEORETICAL_RIGHT_TOOLBAR_BORDER_WIDTH(f) \ | |
596 FRAME_THEORETICAL_TOOLBAR_BORDER_WIDTH (f, RIGHT_TOOLBAR) | |
597 | |
598 /* This returns the window-local value rather than the frame-local value; | |
599 that tells you about what's actually visible rather than what should | |
600 be used when computing the frame size. */ | |
601 | |
602 #ifdef HAVE_TOOLBARS | |
603 #define FRAME_RAW_REAL_TOOLBAR_VISIBLE(f, pos) \ | |
604 (HAS_FRAMEMETH_P (f, initialize_frame_toolbars) \ | |
605 && !NILP (XWINDOW (FRAME_LAST_NONMINIBUF_WINDOW (f))->toolbar_visible_p[pos])) | |
606 #define FRAME_RAW_REAL_TOOLBAR_BORDER_WIDTH(f, pos) \ | |
607 ((INTP (XWINDOW \ | |
608 (FRAME_LAST_NONMINIBUF_WINDOW (f))->toolbar_border_width[pos])) ? \ | |
609 (XINT (XWINDOW \ | |
610 (FRAME_LAST_NONMINIBUF_WINDOW (f))->toolbar_border_width[pos])) \ | |
611 : 0) | |
612 #define FRAME_RAW_REAL_TOOLBAR_SIZE(f, pos) \ | |
613 ((INTP (XWINDOW \ | |
614 (FRAME_LAST_NONMINIBUF_WINDOW (f))->toolbar_size[pos])) ? \ | |
615 (XINT (XWINDOW \ | |
616 (FRAME_LAST_NONMINIBUF_WINDOW (f))->toolbar_size[pos])) : 0) | |
617 #define FRAME_REAL_TOOLBAR(f, pos) \ | |
618 (XWINDOW (FRAME_LAST_NONMINIBUF_WINDOW (f))->toolbar[pos]) | |
619 #else | |
620 #define FRAME_RAW_REAL_TOOLBAR_VISIBLE(f, pos) 0 | |
621 #define FRAME_RAW_REAL_TOOLBAR_BORDER_WIDTH(f, pos) 0 | |
622 #define FRAME_RAW_REAL_TOOLBAR_SIZE(f, pos) 0 | |
623 #define FRAME_REAL_TOOLBAR(f, pos) Qnil | |
624 #endif | |
625 | |
626 /* Note to Chuck | |
627 Note to Chuck | |
628 Note to Chuck: | |
629 | |
630 The former definitions of FRAME_REAL_FOO_TOOLBAR_VISIBLE | |
631 looked at the toolbar data to see what was there. The | |
632 current ones look at the current values of the specifiers. | |
633 This is a semantic change; the former definition returned | |
634 what was *actually* there right at the moment, while the | |
635 current one returns what *ought* to be there once redisplay | |
636 has run to completion. I think this new definition is more | |
637 correct in almost all circumstances and is much less likely | |
638 to lead to strange race conditions. I'm not completely | |
639 sure that there aren't some places in the redisplay code | |
640 that use these macros and expect the former semantics, so | |
641 if you encounter some odd toolbar behavior, you might want | |
642 to look into this. --ben */ | |
643 | |
644 #define FRAME_REAL_TOOLBAR_VISIBLE(f, pos) \ | |
645 ((!NILP (FRAME_REAL_TOOLBAR (f, pos)) \ | |
646 && FRAME_RAW_REAL_TOOLBAR_SIZE (f, pos) > 0) \ | |
647 ? FRAME_RAW_REAL_TOOLBAR_VISIBLE (f, pos) \ | |
648 : 0) | |
649 #define FRAME_REAL_TOOLBAR_SIZE(f, pos) \ | |
650 ((!NILP (FRAME_REAL_TOOLBAR (f, pos)) \ | |
651 && FRAME_RAW_REAL_TOOLBAR_VISIBLE (f, pos)) \ | |
652 ? FRAME_RAW_REAL_TOOLBAR_SIZE (f, pos) \ | |
653 : 0) | |
654 #define FRAME_REAL_TOOLBAR_BORDER_WIDTH(f, pos) \ | |
655 ((!NILP (FRAME_REAL_TOOLBAR (f, pos)) \ | |
656 && FRAME_RAW_REAL_TOOLBAR_VISIBLE (f, pos)) \ | |
657 ? FRAME_RAW_REAL_TOOLBAR_BORDER_WIDTH (f, pos) \ | |
658 : 0) | |
659 | |
660 #define FRAME_REAL_TOP_TOOLBAR_HEIGHT(f) \ | |
661 FRAME_REAL_TOOLBAR_SIZE (f, TOP_TOOLBAR) | |
662 #define FRAME_REAL_BOTTOM_TOOLBAR_HEIGHT(f) \ | |
663 FRAME_REAL_TOOLBAR_SIZE (f, BOTTOM_TOOLBAR) | |
664 #define FRAME_REAL_LEFT_TOOLBAR_WIDTH(f) \ | |
665 FRAME_REAL_TOOLBAR_SIZE (f, LEFT_TOOLBAR) | |
666 #define FRAME_REAL_RIGHT_TOOLBAR_WIDTH(f) \ | |
667 FRAME_REAL_TOOLBAR_SIZE (f, RIGHT_TOOLBAR) | |
668 | |
669 #define FRAME_REAL_TOP_TOOLBAR_BORDER_WIDTH(f) \ | |
670 FRAME_REAL_TOOLBAR_BORDER_WIDTH (f, TOP_TOOLBAR) | |
671 #define FRAME_REAL_BOTTOM_TOOLBAR_BORDER_WIDTH(f) \ | |
672 FRAME_REAL_TOOLBAR_BORDER_WIDTH (f, BOTTOM_TOOLBAR) | |
673 #define FRAME_REAL_LEFT_TOOLBAR_BORDER_WIDTH(f) \ | |
674 FRAME_REAL_TOOLBAR_BORDER_WIDTH (f, LEFT_TOOLBAR) | |
675 #define FRAME_REAL_RIGHT_TOOLBAR_BORDER_WIDTH(f) \ | |
676 FRAME_REAL_TOOLBAR_BORDER_WIDTH (f, RIGHT_TOOLBAR) | |
677 | |
678 #define FRAME_REAL_TOP_TOOLBAR_VISIBLE(f) \ | |
679 FRAME_REAL_TOOLBAR_VISIBLE (f, TOP_TOOLBAR) | |
680 #define FRAME_REAL_BOTTOM_TOOLBAR_VISIBLE(f) \ | |
681 FRAME_REAL_TOOLBAR_VISIBLE (f, BOTTOM_TOOLBAR) | |
682 #define FRAME_REAL_LEFT_TOOLBAR_VISIBLE(f) \ | |
683 FRAME_REAL_TOOLBAR_VISIBLE (f, LEFT_TOOLBAR) | |
684 #define FRAME_REAL_RIGHT_TOOLBAR_VISIBLE(f) \ | |
685 FRAME_REAL_TOOLBAR_VISIBLE (f, RIGHT_TOOLBAR) | |
686 | |
687 #define FRAME_TOP_BORDER_START(f) \ | |
688 (FRAME_REAL_TOP_TOOLBAR_HEIGHT (f) + \ | |
689 2 * FRAME_REAL_TOP_TOOLBAR_BORDER_WIDTH (f)) | |
690 #define FRAME_TOP_BORDER_END(f) \ | |
691 (FRAME_TOP_BORDER_START (f) + FRAME_BORDER_HEIGHT (f)) | |
692 | |
693 #define FRAME_BOTTOM_BORDER_START(f) \ | |
694 (FRAME_PIXHEIGHT (f) - FRAME_BORDER_HEIGHT (f) - \ | |
695 FRAME_REAL_BOTTOM_TOOLBAR_HEIGHT (f) - \ | |
696 2 * FRAME_REAL_BOTTOM_TOOLBAR_BORDER_WIDTH (f)) | |
697 #define FRAME_BOTTOM_BORDER_END(f) \ | |
698 (FRAME_PIXHEIGHT (f) - FRAME_REAL_BOTTOM_TOOLBAR_HEIGHT (f) - \ | |
699 2 * FRAME_REAL_BOTTOM_TOOLBAR_BORDER_WIDTH (f)) | |
700 | |
701 #define FRAME_LEFT_BORDER_START(f) \ | |
702 (FRAME_REAL_LEFT_TOOLBAR_WIDTH (f) + \ | |
703 2 * FRAME_REAL_LEFT_TOOLBAR_BORDER_WIDTH (f)) | |
704 #define FRAME_LEFT_BORDER_END(f) \ | |
705 (FRAME_LEFT_BORDER_START (f) + FRAME_BORDER_WIDTH (f)) | |
706 | |
707 #define FRAME_RIGHT_BORDER_START(f) \ | |
708 (FRAME_PIXWIDTH (f) - FRAME_BORDER_WIDTH (f) - \ | |
709 FRAME_REAL_RIGHT_TOOLBAR_WIDTH(f) - \ | |
710 2 * FRAME_REAL_RIGHT_TOOLBAR_BORDER_WIDTH (f)) | |
711 #define FRAME_RIGHT_BORDER_END(f) \ | |
712 (FRAME_PIXWIDTH (f) - FRAME_REAL_RIGHT_TOOLBAR_WIDTH (f) - \ | |
713 2 * FRAME_REAL_RIGHT_TOOLBAR_BORDER_WIDTH(f)) | |
714 | |
715 #endif /* INCLUDED_frame_impl_h_ */ |