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