25524
|
1 /* Don't multiply include: dispextern.h includes macterm.h which includes frame.h
|
|
2 some emacs source includes both dispextern.h and frame.h */
|
|
3 #ifndef _XFRAME_H_
|
|
4 #define _XFRAME_H_
|
|
5
|
765
|
6 /* Define frame-object for GNU Emacs.
|
33759
|
7 Copyright (C) 1993, 1994, 1999, 2000 Free Software Foundation, Inc.
|
261
|
8
|
|
9 This file is part of GNU Emacs.
|
|
10
|
|
11 GNU Emacs is free software; you can redistribute it and/or modify
|
|
12 it under the terms of the GNU General Public License as published by
|
732
|
13 the Free Software Foundation; either version 2, or (at your option)
|
261
|
14 any later version.
|
|
15
|
|
16 GNU Emacs is distributed in the hope that it will be useful,
|
|
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
19 GNU General Public License for more details.
|
|
20
|
|
21 You should have received a copy of the GNU General Public License
|
|
22 along with GNU Emacs; see the file COPYING. If not, write to
|
14186
|
23 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
24 Boston, MA 02111-1307, USA. */
|
261
|
25
|
1776
|
26
|
|
27 /* Miscellanea. */
|
261
|
28
|
25029
|
29 /* Nonzero means don't assume anything about current contents of
|
|
30 actual terminal frame */
|
|
31
|
1776
|
32 extern int frame_garbaged;
|
|
33
|
|
34 /* Nonzero means FRAME_MESSAGE_BUF (selected_frame) is being used by
|
|
35 print. */
|
25029
|
36
|
1776
|
37 extern int message_buf_print;
|
|
38
|
|
39
|
16051
|
40 /* The structure representing a frame. */
|
261
|
41
|
|
42 enum output_method
|
25029
|
43 {
|
|
44 output_termcap,
|
|
45 output_x_window,
|
|
46 output_msdos_raw,
|
25524
|
47 output_w32,
|
35002
|
48 output_w32_console,
|
25524
|
49 output_mac
|
25029
|
50 };
|
261
|
51
|
16270
|
52 enum vertical_scroll_bar_type
|
25029
|
53 {
|
|
54 vertical_scroll_bar_none,
|
|
55 vertical_scroll_bar_left,
|
|
56 vertical_scroll_bar_right
|
|
57 };
|
16270
|
58
|
26729
|
59 #if !defined(MSDOS) && !defined(WINDOWSNT) && !defined(macintosh)
|
|
60
|
|
61 #if !defined(HAVE_X_WINDOWS)
|
|
62
|
26781
|
63 #define PIX_TYPE int
|
|
64
|
26729
|
65 /* A (mostly empty) x_output structure definition for building Emacs
|
|
66 on Unix and GNU/Linux without X support. */
|
|
67 struct x_output
|
|
68 {
|
|
69 PIX_TYPE background_pixel;
|
|
70 PIX_TYPE foreground_pixel;
|
|
71 };
|
|
72
|
28003
|
73 #define FRAME_INTERNAL_BORDER_WIDTH(f) 0
|
|
74
|
26729
|
75 #endif /* ! HAVE_X_WINDOWS */
|
|
76
|
26791
|
77
|
|
78 #define FRAME_FOREGROUND_PIXEL(f) ((f)->output_data.x->foreground_pixel)
|
|
79 #define FRAME_BACKGROUND_PIXEL(f) ((f)->output_data.x->background_pixel)
|
|
80
|
26729
|
81 /* A structure describing a termcap frame display. */
|
|
82 extern struct x_output tty_display;
|
|
83
|
|
84 #endif /* ! MSDOS && ! WINDOWSNT && ! macintosh */
|
|
85
|
765
|
86 struct frame
|
261
|
87 {
|
8826
9f5965fe4f6b
(struct frame, selected_frame, last_nonminibuf_frame): Use EMACS_INT.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
88 EMACS_INT size;
|
261
|
89 struct Lisp_Vector *next;
|
|
90
|
10208
|
91 /* All Lisp_Object components must come first.
|
|
92 Only EMACS_INT values can be intermixed with them.
|
|
93 That ensures they are all aligned normally. */
|
261
|
94
|
14215
|
95 /* Name of this frame: a Lisp string. It is used for looking up resources,
|
|
96 as well as for the title in some cases. */
|
261
|
97 Lisp_Object name;
|
|
98
|
12274
|
99 /* The name to use for the icon, the last time
|
|
100 it was refreshed. nil means not explicitly specified. */
|
|
101 Lisp_Object icon_name;
|
|
102
|
14215
|
103 /* This is the frame title specified explicitly, if any.
|
|
104 Usually it is nil. */
|
|
105 Lisp_Object title;
|
|
106
|
3591
|
107 /* The frame which should receive keystrokes that occur in this
|
1710
|
108 frame, or nil if they should go to the frame itself. This is
|
|
109 usually nil, but if the frame is minibufferless, we can use this
|
|
110 to redirect keystrokes to a surrogate minibuffer frame when
|
|
111 needed.
|
|
112
|
|
113 Note that a value of nil is different than having the field point
|
|
114 to the frame itself. Whenever the Fselect_frame function is used
|
|
115 to shift from one frame to the other, any redirections to the
|
|
116 original frame are shifted to the newly selected frame; if
|
|
117 focus_frame is nil, Fselect_frame will leave it alone. */
|
765
|
118 Lisp_Object focus_frame;
|
357
|
119
|
765
|
120 /* This frame's root window. Every frame has one.
|
|
121 If the frame has only a minibuffer window, this is it.
|
|
122 Otherwise, if the frame has a minibuffer window, this is its sibling. */
|
261
|
123 Lisp_Object root_window;
|
|
124
|
765
|
125 /* This frame's selected window.
|
|
126 Each frame has its own window hierarchy
|
|
127 and one of the windows in it is selected within the frame.
|
|
128 The selected window of the selected frame is Emacs's selected window. */
|
261
|
129 Lisp_Object selected_window;
|
|
130
|
765
|
131 /* This frame's minibuffer window.
|
|
132 Most frames have their own minibuffer windows,
|
|
133 but only the selected frame's minibuffer window
|
261
|
134 can actually appear to exist. */
|
|
135 Lisp_Object minibuffer_window;
|
|
136
|
765
|
137 /* Parameter alist of this frame.
|
|
138 These are the parameters specified when creating the frame
|
|
139 or modified with modify-frame-parameters. */
|
261
|
140 Lisp_Object param_alist;
|
|
141
|
1994
|
142 /* List of scroll bars on this frame.
|
1776
|
143 Actually, we don't specify exactly what is stored here at all; the
|
1994
|
144 scroll bar implementation code can use it to store anything it likes.
|
1776
|
145 This field is marked by the garbage collector. It is here
|
|
146 instead of in the `display' structure so that the garbage
|
|
147 collector doesn't need to look inside the window-system-dependent
|
|
148 structure. */
|
1994
|
149 Lisp_Object scroll_bars;
|
|
150 Lisp_Object condemned_scroll_bars;
|
1776
|
151
|
15098
|
152 /* Vector describing the items to display in the menu bar.
|
|
153 Each item has four elements in this vector.
|
|
154 They are KEY, STRING, SUBMAP, and HPOS.
|
|
155 (HPOS is not used in when the X toolkit is in use.)
|
|
156 There are four additional elements of nil at the end, to terminate. */
|
2148
|
157 Lisp_Object menu_bar_items;
|
|
158
|
2396
|
159 /* Alist of elements (FACE-NAME . FACE-VECTOR-DATA). */
|
|
160 Lisp_Object face_alist;
|
|
161
|
10208
|
162 /* A vector that records the entire structure of this frame's menu bar.
|
|
163 For the format of the data, see extensive comments in xmenu.c.
|
|
164 Only the X toolkit version uses this. */
|
|
165 Lisp_Object menu_bar_vector;
|
|
166 /* Number of elements in the vector that have meaningful data. */
|
|
167 EMACS_INT menu_bar_items_used;
|
|
168
|
|
169 /* Predicate for selecting buffers for other-buffer. */
|
|
170 Lisp_Object buffer_predicate;
|
|
171
|
17222
|
172 /* List of buffers viewed in this frame, for other-buffer. */
|
|
173 Lisp_Object buffer_list;
|
|
174
|
25029
|
175 /* A dummy window used to display menu bars under X when no X
|
|
176 toolkit support is available. */
|
|
177 Lisp_Object menu_bar_window;
|
|
178
|
25544
|
179 /* A window used to display the tool-bar of a frame. */
|
|
180 Lisp_Object tool_bar_window;
|
25029
|
181
|
25544
|
182 /* Desired and current tool-bar items. */
|
33759
|
183 Lisp_Object tool_bar_items;
|
25029
|
184
|
25544
|
185 /* Desired and current contents displayed in tool_bar_window. */
|
|
186 Lisp_Object desired_tool_bar_string, current_tool_bar_string;
|
25029
|
187
|
17222
|
188 /* beyond here, there should be no more Lisp_Object components. */
|
10208
|
189
|
25029
|
190 /* Cache of realized faces. */
|
|
191 struct face_cache *face_cache;
|
10208
|
192
|
25029
|
193 /* A buffer to hold the frame's name. We can't use the Lisp
|
|
194 string's pointer (`name', above) because it might get relocated. */
|
11493
|
195 char *namebuf;
|
|
196
|
25029
|
197 /* Glyph pool and matrix. */
|
|
198 struct glyph_pool *current_pool;
|
|
199 struct glyph_pool *desired_pool;
|
|
200 struct glyph_matrix *desired_matrix;
|
|
201 struct glyph_matrix *current_matrix;
|
10208
|
202
|
25029
|
203 /* 1 means that glyphs on this frame have been initialized so it can
|
|
204 be used for output. */
|
|
205 unsigned glyphs_initialized_p : 1;
|
|
206
|
25544
|
207 /* Margin at the top of the frame. Used to display the tool-bar. */
|
|
208 int tool_bar_lines;
|
25029
|
209
|
33759
|
210 int n_tool_bar_items;
|
25029
|
211
|
|
212 /* A buffer for decode_mode_line. */
|
|
213 char *decode_mode_spec_buffer;
|
10208
|
214
|
|
215 /* See do_line_insertion_deletion_costs for info on these arrays. */
|
|
216 /* Cost of inserting 1 line on this frame */
|
|
217 int *insert_line_cost;
|
|
218 /* Cost of deleting 1 line on this frame */
|
|
219 int *delete_line_cost;
|
|
220 /* Cost of inserting n lines on this frame */
|
|
221 int *insert_n_lines_cost;
|
|
222 /* Cost of deleting n lines on this frame */
|
|
223 int *delete_n_lines_cost;
|
|
224
|
|
225 /* Size of this frame, in units of characters. */
|
|
226 EMACS_INT height;
|
|
227 EMACS_INT width;
|
16336
|
228 EMACS_INT window_width;
|
25029
|
229 EMACS_INT window_height;
|
10208
|
230
|
|
231 /* New height and width for pending size change. 0 if no change pending. */
|
|
232 int new_height, new_width;
|
|
233
|
765
|
234 /* The output method says how the contents of this frame
|
261
|
235 are displayed. It could be using termcap, or using an X window. */
|
|
236 enum output_method output_method;
|
|
237
|
|
238 /* A structure of auxiliary data used for displaying the contents.
|
12665
|
239 struct x_output is used for X window frames;
|
13411
|
240 it is defined in xterm.h.
|
16588
|
241 struct w32_output is used for W32 window frames;
|
13411
|
242 it is defined in w32term.h. */
|
25029
|
243 union output_data
|
|
244 {
|
|
245 struct x_output *x;
|
|
246 struct w32_output *w32;
|
25524
|
247 struct mac_output *mac;
|
31900
|
248 EMACS_INT nothing;
|
25029
|
249 }
|
|
250 output_data;
|
261
|
251
|
11005
|
252 #ifdef MULTI_KBOARD
|
|
253 /* A pointer to the kboard structure associated with this frame.
|
|
254 For termcap frames, this points to initial_kboard. For X frames,
|
|
255 it will be the same as display.x->display_info->kboard. */
|
11351
|
256 struct kboard *kboard;
|
11005
|
257 #endif
|
|
258
|
2148
|
259 /* Number of lines of menu bar. */
|
|
260 int menu_bar_lines;
|
|
261
|
32752
|
262 #if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) || defined (macintosh)
|
5657
|
263 /* Nonzero means using a menu bar that comes from the X toolkit. */
|
|
264 int external_menu_bar;
|
|
265 #endif
|
|
266
|
765
|
267 /* Nonzero if last attempt at redisplay on this frame was preempted. */
|
261
|
268 char display_preempted;
|
|
269
|
1653
|
270 /* visible is nonzero if the frame is currently displayed; we check
|
|
271 it to see if we should bother updating the frame's contents.
|
1710
|
272 DON'T SET IT DIRECTLY; instead, use FRAME_SET_VISIBLE.
|
1653
|
273
|
1776
|
274 Note that, since invisible frames aren't updated, whenever a
|
|
275 frame becomes visible again, it must be marked as garbaged. The
|
|
276 FRAME_SAMPLE_VISIBILITY macro takes care of this.
|
|
277
|
19696
|
278 On Windows NT/9X, to avoid wasting effort updating visible frames
|
|
279 that are actually completely obscured by other windows on the
|
|
280 display, we bend the meaning of visible slightly: if greater than
|
|
281 1, then the frame is obscured - we still consider it to be
|
|
282 "visible" as seen from lisp, but we don't bother updating it. We
|
|
283 must take care to garbage the frame when it ceaces to be obscured
|
|
284 though. Note that these semantics are only used on NT/9X.
|
|
285
|
1653
|
286 iconified is nonzero if the frame is currently iconified.
|
|
287
|
|
288 Asynchronous input handlers should NOT change these directly;
|
|
289 instead, they should change async_visible or async_iconified, and
|
|
290 let the FRAME_SAMPLE_VISIBILITY macro set visible and iconified
|
|
291 at the next redisplay.
|
261
|
292
|
1653
|
293 These should probably be considered read-only by everyone except
|
|
294 FRAME_SAMPLE_VISIBILITY.
|
|
295
|
6183
|
296 These two are mutually exclusive. They might both be zero, if the
|
1653
|
297 frame has been made invisible without an icon. */
|
|
298 char visible, iconified;
|
|
299
|
|
300 /* Asynchronous input handlers change these, and
|
|
301 FRAME_SAMPLE_VISIBILITY copies them into visible and iconified.
|
|
302 See FRAME_SAMPLE_VISIBILITY, below. */
|
29439
|
303 volatile char async_visible, async_iconified;
|
261
|
304
|
765
|
305 /* Nonzero if this frame should be redrawn. */
|
29439
|
306 volatile char garbaged;
|
261
|
307
|
765
|
308 /* True if frame actually has a minibuffer window on it.
|
|
309 0 if using a minibuffer window that isn't on this frame. */
|
261
|
310 char has_minibuffer;
|
|
311
|
765
|
312 /* 0 means, if this frame has just one window,
|
261
|
313 show no modeline for that window. */
|
|
314 char wants_modeline;
|
|
315
|
1710
|
316 /* Non-zero if the hardware device this frame is displaying on can
|
1994
|
317 support scroll bars. */
|
|
318 char can_have_scroll_bars;
|
1710
|
319
|
1994
|
320 /* If can_have_scroll_bars is non-zero, this is non-zero if we should
|
1710
|
321 actually display them on this frame. */
|
16270
|
322 enum vertical_scroll_bar_type vertical_scroll_bar_type;
|
1710
|
323
|
765
|
324 /* Non-0 means raise this frame to the top of the heap when selected. */
|
261
|
325 char auto_raise;
|
|
326
|
765
|
327 /* Non-0 means lower this frame to the bottom of the stack when left. */
|
261
|
328 char auto_lower;
|
|
329
|
765
|
330 /* True if frame's root window can't be split. */
|
261
|
331 char no_split;
|
|
332
|
998
|
333 /* If this is set, then Emacs won't change the frame name to indicate
|
|
334 the current buffer, etcetera. If the user explicitly sets the frame
|
|
335 name, this gets set. If the user sets the name to Qnil, this is
|
|
336 cleared. */
|
|
337 char explicit_name;
|
|
338
|
10665
|
339 /* Nonzero if size of some window on this frame has changed. */
|
|
340 char window_sizes_changed;
|
|
341
|
765
|
342 /* Storage for messages to this frame. */
|
261
|
343 char *message_buf;
|
|
344
|
|
345 /* Nonnegative if current redisplay should not do scroll computation
|
|
346 for lines beyond a certain vpos. This is the vpos. */
|
|
347 int scroll_bottom_vpos;
|
7094
b473ea5a3473
(struct frame): New fields menu_bar_vector and menu_bar_items_used.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
348
|
9164
|
349 /* Width of the scroll bar, in pixels and in characters.
|
|
350 scroll_bar_cols tracks scroll_bar_pixel_width if the latter is positive;
|
|
351 a zero value in scroll_bar_pixel_width means to compute the actual width
|
|
352 on the fly, using scroll_bar_cols and the current font width. */
|
8948
|
353 int scroll_bar_pixel_width;
|
|
354 int scroll_bar_cols;
|
10120
|
355
|
25029
|
356 /* Width of area for drawing truncation marks and overlay arrow. */
|
|
357 int trunc_area_pixel_width, trunc_area_cols;
|
|
358
|
10120
|
359 /* The baud rate that was used to calculate costs for this frame. */
|
|
360 int cost_calculation_baud_rate;
|
12543
|
361
|
|
362 /* Nonzero if the mouse has moved on this display
|
|
363 since the last time we checked. */
|
|
364 char mouse_moved;
|
25527
|
365
|
|
366 /* Exponent for gamma correction of colors. 1/(VIEWING_GAMMA *
|
|
367 SCREEN_GAMMA) where viewing_gamma is 0.4545 and SCREEN_GAMMA is a
|
|
368 frame parameter. 0 means don't do gamma correction. */
|
|
369 double gamma;
|
28691
|
370
|
|
371 /* Additional space to put between text lines on this frame. */
|
|
372 int extra_line_spacing;
|
261
|
373 };
|
|
374
|
16051
|
375 #ifdef MULTI_KBOARD
|
11005
|
376 #define FRAME_KBOARD(f) ((f)->kboard)
|
|
377 #else
|
|
378 #define FRAME_KBOARD(f) (&the_only_kboard)
|
|
379 #endif
|
|
380
|
765
|
381 typedef struct frame *FRAME_PTR;
|
261
|
382
|
28417
4b675266db04
* lisp.h (XCONS, XSTRING, XSYMBOL, XFLOAT, XPROCESS, XWINDOW, XSUBR, XBUFFER):
Ken Raeburn <raeburn@raeburn.org>
diff
changeset
|
383 #define XFRAME(p) (eassert (GC_FRAMEP(p)),(struct frame *) XPNTR (p))
|
10288
|
384 #define XSETFRAME(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_FRAME))
|
261
|
385
|
21814
|
386 /* Given a window, return its frame as a Lisp_Object. */
|
765
|
387 #define WINDOW_FRAME(w) (w)->frame
|
261
|
388
|
21814
|
389 /* Test a frame for particular kinds of display methods. */
|
|
390 #define FRAME_TERMCAP_P(f) ((f)->output_method == output_termcap)
|
13411
|
391 #define FRAME_X_P(f) ((f)->output_method == output_x_window)
|
16588
|
392 #define FRAME_W32_P(f) ((f)->output_method == output_w32)
|
35002
|
393 #define FRAME_W32_CONSOLE_P(f) ((f)->output_method == output_w32_console)
|
15390
|
394 #define FRAME_MSDOS_P(f) ((f)->output_method == output_msdos_raw)
|
25524
|
395 #define FRAME_MAC_P(f) ((f)->output_method == output_mac)
|
13411
|
396
|
|
397 /* FRAME_WINDOW_P tests whether the frame is a window, and is
|
|
398 defined to be the predicate for the window system being used. */
|
25029
|
399
|
13411
|
400 #ifdef HAVE_X_WINDOWS
|
|
401 #define FRAME_WINDOW_P(f) FRAME_X_P (f)
|
|
402 #endif
|
|
403 #ifdef HAVE_NTGUI
|
16588
|
404 #define FRAME_WINDOW_P(f) FRAME_W32_P (f)
|
13411
|
405 #endif
|
25524
|
406 #ifdef macintosh
|
|
407 #define FRAME_WINDOW_P(f) FRAME_MAC_P (f)
|
|
408 #endif
|
13568
|
409 #ifndef FRAME_WINDOW_P
|
|
410 #define FRAME_WINDOW_P(f) (0)
|
|
411 #endif
|
13411
|
412
|
21814
|
413 /* Nonzero if frame F is still alive (not deleted). */
|
12665
|
414 #define FRAME_LIVE_P(f) ((f)->output_data.nothing != 0)
|
21814
|
415
|
|
416 /* Nonzero if frame F is a minibuffer-only frame. */
|
765
|
417 #define FRAME_MINIBUF_ONLY_P(f) \
|
|
418 EQ (FRAME_ROOT_WINDOW (f), FRAME_MINIBUF_WINDOW (f))
|
21814
|
419
|
|
420 /* Nonzero if frame F contains a minibuffer window.
|
|
421 (If this is 0, F must use some other minibuffer window.) */
|
979
|
422 #define FRAME_HAS_MINIBUF_P(f) ((f)->has_minibuffer)
|
765
|
423 #define FRAME_HEIGHT(f) (f)->height
|
21814
|
424
|
|
425 /* Width of frame F, measured in character columns,
|
|
426 not including scroll bars if any. */
|
765
|
427 #define FRAME_WIDTH(f) (f)->width
|
21814
|
428
|
|
429 /* Number of lines of frame F used for menu bar.
|
|
430 This is relevant on terminal frames and on
|
|
431 X Windows when not using the X toolkit.
|
|
432 These lines are counted in FRAME_HEIGHT. */
|
2148
|
433 #define FRAME_MENU_BAR_LINES(f) (f)->menu_bar_lines
|
21814
|
434
|
25544
|
435 /* Number of lines of frame F used for the tool-bar. */
|
25029
|
436
|
25544
|
437 #define FRAME_TOOL_BAR_LINES(f) (f)->tool_bar_lines
|
25029
|
438
|
|
439 /* Lines above the top-most window in frame F. */
|
|
440
|
|
441 #define FRAME_TOP_MARGIN(F) \
|
25544
|
442 (FRAME_MENU_BAR_LINES (F) + FRAME_TOOL_BAR_LINES (F))
|
25029
|
443
|
21814
|
444 /* Nonzero if this frame should display a menu bar
|
|
445 in a way that does not use any text lines. */
|
32752
|
446 #if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) || defined (macintosh)
|
5657
|
447 #define FRAME_EXTERNAL_MENU_BAR(f) (f)->external_menu_bar
|
8233
|
448 #else
|
|
449 #define FRAME_EXTERNAL_MENU_BAR(f) 0
|
|
450 #endif
|
1710
|
451 #define FRAME_VISIBLE_P(f) ((f)->visible != 0)
|
21814
|
452
|
|
453 /* Nonzero if frame F is currently visible but hidden. */
|
19696
|
454 #define FRAME_OBSCURED_P(f) ((f)->visible > 1)
|
21814
|
455
|
|
456 /* Nonzero if frame F is currently iconified. */
|
|
457 #define FRAME_ICONIFIED_P(f) (f)->iconified
|
|
458
|
1710
|
459 #define FRAME_SET_VISIBLE(f,p) \
|
|
460 ((f)->async_visible = (p), FRAME_SAMPLE_VISIBILITY (f))
|
765
|
461 #define SET_FRAME_GARBAGED(f) (frame_garbaged = 1, f->garbaged = 1)
|
|
462 #define FRAME_GARBAGED_P(f) (f)->garbaged
|
21814
|
463
|
|
464 /* Nonzero means do not allow splitting this frame's window. */
|
765
|
465 #define FRAME_NO_SPLIT_P(f) (f)->no_split
|
21814
|
466
|
|
467 /* Not really implemented. */
|
765
|
468 #define FRAME_WANTS_MODELINE_P(f) (f)->wants_modeline
|
21814
|
469
|
|
470 /* Nonzero if a size change has been requested for frame F
|
|
471 but not yet really put into effect. This can be true temporarily
|
|
472 when an X event comes in at a bad time. */
|
10665
|
473 #define FRAME_WINDOW_SIZES_CHANGED(f) (f)->window_sizes_changed
|
21814
|
474 /* When a size change is pending, these are the requested new sizes. */
|
|
475 #define FRAME_NEW_HEIGHT(f) (f)->new_height
|
|
476 #define FRAME_NEW_WIDTH(f) (f)->new_width
|
|
477
|
|
478 /* The minibuffer window of frame F, if it has one; otherwise nil. */
|
765
|
479 #define FRAME_MINIBUF_WINDOW(f) (f)->minibuffer_window
|
21814
|
480
|
|
481 /* The root window of the window tree of frame F. */
|
765
|
482 #define FRAME_ROOT_WINDOW(f) (f)->root_window
|
21814
|
483
|
|
484 /* The currently selected window of the window tree of frame F. */
|
765
|
485 #define FRAME_SELECTED_WINDOW(f) (f)->selected_window
|
21814
|
486
|
765
|
487 #define FRAME_INSERT_COST(f) (f)->insert_line_cost
|
|
488 #define FRAME_DELETE_COST(f) (f)->delete_line_cost
|
|
489 #define FRAME_INSERTN_COST(f) (f)->insert_n_lines_cost
|
|
490 #define FRAME_DELETEN_COST(f) (f)->delete_n_lines_cost
|
|
491 #define FRAME_MESSAGE_BUF(f) (f)->message_buf
|
|
492 #define FRAME_SCROLL_BOTTOM_VPOS(f) (f)->scroll_bottom_vpos
|
|
493 #define FRAME_FOCUS_FRAME(f) (f)->focus_frame
|
21814
|
494
|
|
495 /* Nonzero if frame F supports scroll bars.
|
|
496 If this is zero, then it is impossible to enable scroll bars
|
|
497 on frame F. */
|
1994
|
498 #define FRAME_CAN_HAVE_SCROLL_BARS(f) ((f)->can_have_scroll_bars)
|
21814
|
499
|
|
500 /* This frame slot says whether scroll bars are currently enabled for frame F,
|
|
501 and which side they are on. */
|
16270
|
502 #define FRAME_VERTICAL_SCROLL_BAR_TYPE(f) ((f)->vertical_scroll_bar_type)
|
|
503 #define FRAME_HAS_VERTICAL_SCROLL_BARS(f) \
|
|
504 ((f)->vertical_scroll_bar_type != vertical_scroll_bar_none)
|
|
505 #define FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT(f) \
|
|
506 ((f)->vertical_scroll_bar_type == vertical_scroll_bar_left)
|
|
507 #define FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT(f) \
|
|
508 ((f)->vertical_scroll_bar_type == vertical_scroll_bar_right)
|
21814
|
509
|
|
510 /* Width that a scroll bar in frame F should have, if there is one.
|
|
511 Measured in pixels.
|
|
512 If scroll bars are turned off, this is still nonzero. */
|
8948
|
513 #define FRAME_SCROLL_BAR_PIXEL_WIDTH(f) ((f)->scroll_bar_pixel_width)
|
21814
|
514
|
|
515 /* Width that a scroll bar in frame F should have, if there is one.
|
|
516 Measured in columns (characters).
|
|
517 If scroll bars are turned off, this is still nonzero. */
|
8948
|
518 #define FRAME_SCROLL_BAR_COLS(f) ((f)->scroll_bar_cols)
|
21814
|
519
|
|
520 /* Width of a scroll bar in frame F, measured in columns (characters),
|
|
521 but only if scroll bars are on the left.
|
|
522 If scroll bars are on the right in this frame, it is 0. */
|
16270
|
523 #define FRAME_LEFT_SCROLL_BAR_WIDTH(f) \
|
|
524 (FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT (f) \
|
|
525 ? FRAME_SCROLL_BAR_COLS (f) \
|
|
526 : 0)
|
21814
|
527
|
|
528 /* Width of a scroll bar in frame F, measured in columns (characters). */
|
16270
|
529 #define FRAME_SCROLL_BAR_WIDTH(f) \
|
|
530 (FRAME_HAS_VERTICAL_SCROLL_BARS (f) \
|
|
531 ? FRAME_SCROLL_BAR_COLS (f) \
|
|
532 : 0)
|
21814
|
533
|
|
534 /* Total width of frame F, in columns (characters),
|
|
535 including the width used by scroll bars if any. */
|
|
536 #define FRAME_WINDOW_WIDTH(f) ((f)->window_width)
|
|
537
|
|
538 /* Set the width of frame F to VAL.
|
|
539 VAL is the width of a full-frame window,
|
|
540 not including scroll bars. */
|
|
541 #define SET_FRAME_WIDTH(f, val) \
|
|
542 ((f)->width = (val), \
|
|
543 (f)->window_width = FRAME_WINDOW_WIDTH_ARG (f, (f)->width))
|
|
544
|
|
545 /* Given a value WIDTH for frame F's nominal width,
|
|
546 return the value that FRAME_WINDOW_WIDTH should have. */
|
25029
|
547 #define FRAME_WINDOW_WIDTH_ARG(f, width) \
|
|
548 ((width) \
|
|
549 + FRAME_SCROLL_BAR_WIDTH (f) \
|
25460
|
550 + FRAME_FLAGS_AREA_COLS (f))
|
21814
|
551
|
21762
|
552 /* Maximum + 1 legitimate value for FRAME_CURSOR_X. */
|
|
553 #define FRAME_CURSOR_X_LIMIT(f) \
|
|
554 (FRAME_WIDTH (f) + FRAME_LEFT_SCROLL_BAR_WIDTH (f))
|
21814
|
555
|
|
556 /* Nonzero if frame F has scroll bars. */
|
1994
|
557 #define FRAME_SCROLL_BARS(f) ((f)->scroll_bars)
|
21814
|
558
|
1994
|
559 #define FRAME_CONDEMNED_SCROLL_BARS(f) ((f)->condemned_scroll_bars)
|
2148
|
560 #define FRAME_MENU_BAR_ITEMS(f) ((f)->menu_bar_items)
|
10120
|
561 #define FRAME_COST_BAUD_RATE(f) ((f)->cost_calculation_baud_rate)
|
17033
|
562
|
25029
|
563 /* Return a pointer to the face cache of frame F. */
|
|
564
|
|
565 #define FRAME_FACE_CACHE(F) (F)->face_cache
|
|
566
|
17033
|
567 /* Return the size of message_buf of the frame F. We multiply the
|
|
568 width of the frame by 4 because multi-byte form may require at most
|
|
569 4-byte for a character. */
|
25029
|
570
|
17033
|
571 #define FRAME_MESSAGE_BUF_SIZE(f) (((int) (f)->width) * 4)
|
261
|
572
|
1653
|
573 /* Emacs's redisplay code could become confused if a frame's
|
|
574 visibility changes at arbitrary times. For example, if a frame is
|
|
575 visible while the desired glyphs are being built, but becomes
|
|
576 invisible before they are updated, then some rows of the
|
|
577 desired_glyphs will be left marked as enabled after redisplay is
|
|
578 complete, which should never happen. The next time the frame
|
|
579 becomes visible, redisplay will probably barf.
|
|
580
|
|
581 Currently, there are no similar situations involving iconified, but
|
|
582 the principle is the same.
|
|
583
|
|
584 So instead of having asynchronous input handlers directly set and
|
|
585 clear the frame's visibility and iconification flags, they just set
|
|
586 the async_visible and async_iconified flags; the redisplay code
|
|
587 calls the FRAME_SAMPLE_VISIBILITY macro before doing any redisplay,
|
|
588 which sets visible and iconified from their asynchronous
|
1710
|
589 counterparts.
|
|
590
|
1776
|
591 Synchronous code must use the FRAME_SET_VISIBLE macro.
|
|
592
|
|
593 Also, if a frame used to be invisible, but has just become visible,
|
|
594 it must be marked as garbaged, since redisplay hasn't been keeping
|
|
595 up its contents. */
|
25029
|
596
|
1653
|
597 #define FRAME_SAMPLE_VISIBILITY(f) \
|
19696
|
598 (((f)->async_visible && (f)->visible != (f)->async_visible) ? \
|
|
599 SET_FRAME_GARBAGED (f) : 0, \
|
1776
|
600 (f)->visible = (f)->async_visible, \
|
1653
|
601 (f)->iconified = (f)->async_iconified)
|
|
602
|
25711
|
603 #define CHECK_FRAME(x, i) \
|
|
604 do { \
|
|
605 if (! FRAMEP (x)) \
|
|
606 x = wrong_type_argument (Qframep, (x)); \
|
|
607 } while (0)
|
485
|
608
|
765
|
609 #define CHECK_LIVE_FRAME(x, i) \
|
25711
|
610 do { \
|
|
611 if (! FRAMEP (x) \
|
|
612 || ! FRAME_LIVE_P (XFRAME (x))) \
|
|
613 x = wrong_type_argument (Qframe_live_p, (x)); \
|
|
614 } while (0)
|
485
|
615
|
765
|
616 /* FOR_EACH_FRAME (LIST_VAR, FRAME_VAR) followed by a statement is a
|
|
617 `for' loop which iterates over the elements of Vframe_list. The
|
2252
|
618 loop will set FRAME_VAR, a Lisp_Object, to each frame in
|
765
|
619 Vframe_list in succession and execute the statement. LIST_VAR
|
2252
|
620 should be a Lisp_Object too; it is used to iterate through the
|
765
|
621 Vframe_list.
|
732
|
622
|
16051
|
623 This macro is a holdover from a time when multiple frames weren't always
|
|
624 supported. An alternate definition of the macro would expand to
|
|
625 something which executes the statement once. */
|
25029
|
626
|
765
|
627 #define FOR_EACH_FRAME(list_var, frame_var) \
|
|
628 for ((list_var) = Vframe_list; \
|
732
|
629 (CONSP (list_var) \
|
25638
|
630 && (frame_var = XCAR (list_var), 1)); \
|
|
631 list_var = XCDR (list_var))
|
732
|
632
|
|
633
|
3649
|
634 extern Lisp_Object Qframep, Qframe_live_p, Qicon;
|
261
|
635
|
765
|
636 extern struct frame *last_nonminibuf_frame;
|
261
|
637
|
20316
|
638 extern struct frame *make_terminal_frame P_ ((void));
|
|
639 extern struct frame *make_frame P_ ((int));
|
21425
69491a9294a4
(make_frame_without_minibuffer): Conditionalize on HAVE_WINDOW_SYSTEM.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
640 #ifdef HAVE_WINDOW_SYSTEM
|
20316
|
641 extern struct frame *make_minibuffer_frame P_ ((void));
|
|
642 extern struct frame *make_frame_without_minibuffer P_ ((Lisp_Object,
|
|
643 struct kboard *,
|
|
644 Lisp_Object));
|
21425
69491a9294a4
(make_frame_without_minibuffer): Conditionalize on HAVE_WINDOW_SYSTEM.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
645 #endif /* HAVE_WINDOW_SYSTEM */
|
20316
|
646 extern int other_visible_frames P_ ((struct frame *));
|
261
|
647
|
765
|
648 extern Lisp_Object Vframe_list;
|
|
649 extern Lisp_Object Vdefault_frame_alist;
|
261
|
650
|
765
|
651 extern Lisp_Object Vterminal_frame;
|
261
|
652
|
16051
|
653 /* Device-independent scroll bar stuff. */
|
1710
|
654
|
1994
|
655 /* Return the starting column (zero-based) of the vertical scroll bar
|
1710
|
656 for window W. The column before this one is the last column we can
|
|
657 use for text. If the window touches the right edge of the frame,
|
1994
|
658 we have extra space allocated for it. Otherwise, the scroll bar
|
1710
|
659 takes over the window's rightmost columns. */
|
25029
|
660
|
1994
|
661 #define WINDOW_VERTICAL_SCROLL_BAR_COLUMN(w) \
|
16270
|
662 (FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT (XFRAME (WINDOW_FRAME (w))) ? \
|
|
663 (((XINT ((w)->left) + XINT ((w)->width)) \
|
|
664 < FRAME_WIDTH (XFRAME (WINDOW_FRAME (w)))) \
|
|
665 ? (XINT ((w)->left) + XINT ((w)->width) \
|
|
666 - FRAME_SCROLL_BAR_COLS (XFRAME (WINDOW_FRAME (w)))) \
|
|
667 : FRAME_WIDTH (XFRAME (WINDOW_FRAME (w)))) \
|
|
668 : XINT ((w)->left))
|
1710
|
669
|
1994
|
670 /* Return the height in lines of the vertical scroll bar in w. If the
|
|
671 window has a mode line, don't make the scroll bar extend that far. */
|
25029
|
672
|
1994
|
673 #define WINDOW_VERTICAL_SCROLL_BAR_HEIGHT(w) (window_internal_height (w))
|
25029
|
674
|
25670
|
675 /* The currently selected frame. */
|
|
676
|
|
677 extern Lisp_Object selected_frame;
|
|
678
|
|
679 /* Value is a pointer to the selected frame. If the selected frame
|
29439
|
680 isn't live, abort. */
|
25670
|
681
|
|
682 #define SELECTED_FRAME() \
|
|
683 ((FRAMEP (selected_frame) \
|
|
684 && FRAME_LIVE_P (XFRAME (selected_frame))) \
|
|
685 ? XFRAME (selected_frame) \
|
28651
|
686 : (abort (), (struct frame *) 0))
|
25029
|
687
|
|
688
|
|
689 /***********************************************************************
|
|
690 Display-related Macros
|
|
691 ***********************************************************************/
|
|
692
|
|
693 /* Canonical y-unit on frame F. This value currently equals the line
|
|
694 height of the frame. Terminal specific header files are expected
|
|
695 to define the macro FRAME_LINE_HEIGHT. */
|
|
696
|
|
697 #define CANON_Y_UNIT(F) \
|
|
698 (FRAME_WINDOW_P (F) ? FRAME_LINE_HEIGHT (F) : 1)
|
|
699
|
|
700 /* Canonical x-unit on frame F. This is currently equal to the width
|
|
701 of the default font of F. Terminal specific headers are expected
|
|
702 to define the macro FRAME_DEFAULT_FONT_WIDTH. */
|
|
703
|
|
704 #define CANON_X_UNIT(F) \
|
|
705 (FRAME_WINDOW_P (F) ? FRAME_DEFAULT_FONT_WIDTH (F) : 1)
|
|
706
|
|
707 /* Pixel width of areas used to display truncation marks, continuation
|
25460
|
708 marks, overlay arrows. This is 0 for terminal frames. */
|
25029
|
709
|
|
710 #ifdef HAVE_WINDOW_SYSTEM
|
31147
|
711
|
25029
|
712 #define FRAME_FLAGS_AREA_COLS(F) \
|
31147
|
713 (FRAME_WINDOW_P (F) ? FRAME_X_FLAGS_AREA_COLS (F) : 0)
|
|
714 #define FRAME_FLAGS_AREA_WIDTH(F) \
|
|
715 (FRAME_WINDOW_P (F) ? FRAME_X_FLAGS_AREA_WIDTH (F) : 0)
|
|
716 #define FRAME_LEFT_FLAGS_AREA_WIDTH(F) \
|
|
717 (FRAME_WINDOW_P (F) ? FRAME_X_LEFT_FLAGS_AREA_WIDTH (F) : 0)
|
25460
|
718
|
31147
|
719 #else /* not HAVE_WINDOW_SYSTEM */
|
|
720
|
25029
|
721 #define FRAME_FLAGS_AREA_WIDTH(F) 0
|
|
722 #define FRAME_FLAGS_AREA_COLS(F) 0
|
25460
|
723 #define FRAME_LEFT_FLAGS_AREA_WIDTH(F) 0
|
31147
|
724
|
|
725 #endif /* not HAVE_WINDOW_SYSTEM */
|
25029
|
726
|
|
727
|
|
728
|
|
729
|
|
730 /***********************************************************************
|
|
731 Conversion between canonical units and pixels
|
|
732 ***********************************************************************/
|
|
733
|
|
734 /* Canonical x-values are fractions of CANON_X_UNIT, canonical y-unit
|
|
735 are fractions of CANON_Y_UNIT of a frame. Both are represented as
|
|
736 Lisp numbers, i.e. integers or floats. */
|
|
737
|
|
738 /* Convert canonical value X to pixels. F is the frame whose
|
|
739 canonical char width is to be used. X must be a Lisp integer or
|
|
740 float. Value is a C integer. */
|
|
741
|
|
742 #define PIXEL_X_FROM_CANON_X(F, X) \
|
|
743 (INTEGERP (X) \
|
|
744 ? XINT (X) * CANON_X_UNIT (F) \
|
25638
|
745 : (int) (XFLOAT_DATA (X) * CANON_X_UNIT (F)))
|
25029
|
746
|
|
747 /* Convert canonical value Y to pixels. F is the frame whose
|
|
748 canonical character height is to be used. X must be a Lisp integer
|
|
749 or float. Value is a C integer. */
|
|
750
|
|
751 #define PIXEL_Y_FROM_CANON_Y(F, Y) \
|
|
752 (INTEGERP (Y) \
|
|
753 ? XINT (Y) * CANON_Y_UNIT (F) \
|
25638
|
754 : (int) (XFLOAT_DATA (Y) * CANON_Y_UNIT (F)))
|
25029
|
755
|
|
756 /* Convert pixel-value X to canonical units. F is the frame whose
|
|
757 canonical character width is to be used. X is a C integer. Result
|
|
758 is a Lisp float if X is not a multiple of the canon width,
|
|
759 otherwise it's a Lisp integer. */
|
|
760
|
|
761 #define CANON_X_FROM_PIXEL_X(F, X) \
|
|
762 ((X) % CANON_X_UNIT (F) != 0 \
|
|
763 ? make_float ((double) (X) / CANON_X_UNIT (F)) \
|
|
764 : make_number ((X) / CANON_X_UNIT (F)))
|
|
765
|
|
766 /* Convert pixel-value Y to canonical units. F is the frame whose
|
|
767 canonical character height is to be used. Y is a C integer.
|
|
768 Result is a Lisp float if Y is not a multiple of the canon width,
|
|
769 otherwise it's a Lisp integer. */
|
|
770
|
|
771 #define CANON_Y_FROM_PIXEL_Y(F, Y) \
|
|
772 ((Y) % CANON_Y_UNIT (F) \
|
|
773 ? make_float ((double) (Y) / CANON_Y_UNIT (F)) \
|
|
774 : make_number ((Y) / CANON_Y_UNIT (F)))
|
|
775
|
25524
|
776 #endif /* not defined _FRAME_H_ */
|