frame.h 27.2 KB
Newer Older
1 2 3 4 5
/* Don't multiply include: dispextern.h includes macterm.h which includes frame.h 
   some emacs source includes both dispextern.h and frame.h */
#ifndef _XFRAME_H_
#define _XFRAME_H_

Jim Blandy's avatar
Jim Blandy committed
6
/* Define frame-object for GNU Emacs.
Karl Heuer's avatar
Karl Heuer committed
7
   Copyright (C) 1993, 1994 Free Software Foundation, Inc.
Jim Blandy's avatar
Jim Blandy committed
8 9 10 11 12

This file is part of GNU Emacs.

GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Jim Blandy's avatar
Jim Blandy committed
13
the Free Software Foundation; either version 2, or (at your option)
Jim Blandy's avatar
Jim Blandy committed
14 15 16 17 18 19 20 21 22
any later version.

GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING.  If not, write to
23 24
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */
Jim Blandy's avatar
Jim Blandy committed
25

26 27 28

/* Miscellanea.  */

Gerd Moellmann's avatar
Gerd Moellmann committed
29 30 31
/* Nonzero means don't assume anything about current contents of
   actual terminal frame */

32 33 34 35
extern int frame_garbaged;

/* Nonzero means FRAME_MESSAGE_BUF (selected_frame) is being used by
   print.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
36

37
extern int message_buf_print;
Jim Blandy's avatar
Jim Blandy committed
38

39

Karl Heuer's avatar
Karl Heuer committed
40
/* The structure representing a frame.  */
Jim Blandy's avatar
Jim Blandy committed
41 42

enum output_method
Gerd Moellmann's avatar
Gerd Moellmann committed
43 44 45 46
{
  output_termcap,
  output_x_window,
  output_msdos_raw,
47 48
  output_w32,
  output_mac
Gerd Moellmann's avatar
Gerd Moellmann committed
49
};
Jim Blandy's avatar
Jim Blandy committed
50

51
enum vertical_scroll_bar_type
Gerd Moellmann's avatar
Gerd Moellmann committed
52 53 54 55 56
{
  vertical_scroll_bar_none,
  vertical_scroll_bar_left,
  vertical_scroll_bar_right
};
57

58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
#if !defined(MSDOS) && !defined(WINDOWSNT) && !defined(macintosh)

#if !defined(HAVE_X_WINDOWS)

/* A (mostly empty) x_output structure definition for building Emacs
   on Unix and GNU/Linux without X support.  */
struct x_output
{
  PIX_TYPE background_pixel;
  PIX_TYPE foreground_pixel;
};

#endif /* ! HAVE_X_WINDOWS */

/* A structure describing a termcap frame display.  */
extern struct x_output tty_display;

#endif /* ! MSDOS && ! WINDOWSNT && ! macintosh */

Jim Blandy's avatar
Jim Blandy committed
77
struct frame
Jim Blandy's avatar
Jim Blandy committed
78
{
79
  EMACS_INT size;
Jim Blandy's avatar
Jim Blandy committed
80 81
  struct Lisp_Vector *next;

82 83 84
  /* All Lisp_Object components must come first.
     Only EMACS_INT values can be intermixed with them.
     That ensures they are all aligned normally.  */
Jim Blandy's avatar
Jim Blandy committed
85

86 87
  /* Name of this frame: a Lisp string.  It is used for looking up resources,
     as well as for the title in some cases.  */
Jim Blandy's avatar
Jim Blandy committed
88 89
  Lisp_Object name;

90 91 92 93
  /* The name to use for the icon, the last time
     it was refreshed.  nil means not explicitly specified.  */
  Lisp_Object icon_name;

94 95 96 97
  /* This is the frame title specified explicitly, if any.
     Usually it is nil.  */
  Lisp_Object title;

98
  /* The frame which should receive keystrokes that occur in this
99 100 101 102 103 104 105 106 107 108
     frame, or nil if they should go to the frame itself.  This is
     usually nil, but if the frame is minibufferless, we can use this
     to redirect keystrokes to a surrogate minibuffer frame when
     needed.

     Note that a value of nil is different than having the field point
     to the frame itself.  Whenever the Fselect_frame function is used
     to shift from one frame to the other, any redirections to the
     original frame are shifted to the newly selected frame; if
     focus_frame is nil, Fselect_frame will leave it alone.  */
Jim Blandy's avatar
Jim Blandy committed
109
  Lisp_Object focus_frame;
Jim Blandy's avatar
Jim Blandy committed
110

Jim Blandy's avatar
Jim Blandy committed
111 112 113
  /* This frame's root window.  Every frame has one.
     If the frame has only a minibuffer window, this is it.
     Otherwise, if the frame has a minibuffer window, this is its sibling.  */
Jim Blandy's avatar
Jim Blandy committed
114 115
  Lisp_Object root_window;

Jim Blandy's avatar
Jim Blandy committed
116 117 118 119
  /* This frame's selected window.
     Each frame has its own window hierarchy
     and one of the windows in it is selected within the frame.
     The selected window of the selected frame is Emacs's selected window.  */
Jim Blandy's avatar
Jim Blandy committed
120 121
  Lisp_Object selected_window;

Jim Blandy's avatar
Jim Blandy committed
122 123 124
  /* This frame's minibuffer window.
     Most frames have their own minibuffer windows,
     but only the selected frame's minibuffer window
Jim Blandy's avatar
Jim Blandy committed
125 126 127
     can actually appear to exist.  */
  Lisp_Object minibuffer_window;

Jim Blandy's avatar
Jim Blandy committed
128 129 130
  /* Parameter alist of this frame.
     These are the parameters specified when creating the frame
     or modified with modify-frame-parameters.  */
Jim Blandy's avatar
Jim Blandy committed
131 132
  Lisp_Object param_alist;

133
  /* List of scroll bars on this frame.  
134
     Actually, we don't specify exactly what is stored here at all; the
135
     scroll bar implementation code can use it to store anything it likes.
136 137 138 139
     This field is marked by the garbage collector.  It is here
     instead of in the `display' structure so that the garbage
     collector doesn't need to look inside the window-system-dependent
     structure.  */
140 141
  Lisp_Object scroll_bars;
  Lisp_Object condemned_scroll_bars;
142

Richard M. Stallman's avatar
Richard M. Stallman committed
143 144 145 146 147
  /* Vector describing the items to display in the menu bar.
     Each item has four elements in this vector.
     They are KEY, STRING, SUBMAP, and HPOS.
     (HPOS is not used in when the X toolkit is in use.)
     There are four additional elements of nil at the end, to terminate.  */
148 149
  Lisp_Object menu_bar_items;

150 151 152
  /* Alist of elements (FACE-NAME . FACE-VECTOR-DATA).  */
  Lisp_Object face_alist;

153 154 155 156 157 158 159 160 161 162
  /* A vector that records the entire structure of this frame's menu bar.
     For the format of the data, see extensive comments in xmenu.c.
     Only the X toolkit version uses this.  */
  Lisp_Object menu_bar_vector;
  /* Number of elements in the vector that have meaningful data.  */
  EMACS_INT menu_bar_items_used;

  /* Predicate for selecting buffers for other-buffer.  */
  Lisp_Object buffer_predicate;

163 164 165
  /* List of buffers viewed in this frame, for other-buffer.  */
  Lisp_Object buffer_list;

Gerd Moellmann's avatar
Gerd Moellmann committed
166 167 168 169
  /* A dummy window used to display menu bars under X when no X
     toolkit support is available.  */
  Lisp_Object menu_bar_window;

170 171
  /* A window used to display the tool-bar of a frame.  */
  Lisp_Object tool_bar_window;
Gerd Moellmann's avatar
Gerd Moellmann committed
172

173 174
  /* Desired and current tool-bar items.  */
  Lisp_Object desired_tool_bar_items, current_tool_bar_items;
Gerd Moellmann's avatar
Gerd Moellmann committed
175

176 177
  /* Desired and current contents displayed in tool_bar_window.  */
  Lisp_Object desired_tool_bar_string, current_tool_bar_string;
Gerd Moellmann's avatar
Gerd Moellmann committed
178

179
  /* beyond here, there should be no more Lisp_Object components.  */
180

Gerd Moellmann's avatar
Gerd Moellmann committed
181 182
  /* Cache of realized faces.  */
  struct face_cache *face_cache;
183

Gerd Moellmann's avatar
Gerd Moellmann committed
184 185
  /* A buffer to hold the frame's name.  We can't use the Lisp
     string's pointer (`name', above) because it might get relocated.  */
186 187
  char *namebuf;

Gerd Moellmann's avatar
Gerd Moellmann committed
188 189 190 191 192 193 194 195 196
  /* Glyph pool and matrix. */
  struct glyph_pool *current_pool;
  struct glyph_pool *desired_pool;
  struct glyph_matrix *desired_matrix;
  struct glyph_matrix *current_matrix;

  /* 1 means that glyphs on this frame have been initialized so it can
     be used for output.  */
  unsigned glyphs_initialized_p : 1;
197

198 199
  /* Margin at the top of the frame.  Used to display the tool-bar.  */
  int tool_bar_lines;
Gerd Moellmann's avatar
Gerd Moellmann committed
200

201 202
  int n_desired_tool_bar_items;
  int n_current_tool_bar_items;
Gerd Moellmann's avatar
Gerd Moellmann committed
203 204 205
  
  /* A buffer for decode_mode_line. */
  char *decode_mode_spec_buffer;
206 207 208 209 210 211 212 213 214 215 216 217 218 219

  /* See do_line_insertion_deletion_costs for info on these arrays. */
  /* Cost of inserting 1 line on this frame */
  int *insert_line_cost;
  /* Cost of deleting 1 line on this frame */
  int *delete_line_cost;
  /* Cost of inserting n lines on this frame */
  int *insert_n_lines_cost;
  /* Cost of deleting n lines on this frame */
  int *delete_n_lines_cost;

  /* Size of this frame, in units of characters.  */
  EMACS_INT height;
  EMACS_INT width;
220
  EMACS_INT window_width;
Gerd Moellmann's avatar
Gerd Moellmann committed
221
  EMACS_INT window_height;
222 223 224 225

  /* New height and width for pending size change.  0 if no change pending.  */
  int new_height, new_width;

Jim Blandy's avatar
Jim Blandy committed
226
  /* The output method says how the contents of this frame
Jim Blandy's avatar
Jim Blandy committed
227 228 229 230
     are displayed.  It could be using termcap, or using an X window.  */
  enum output_method output_method;

  /* A structure of auxiliary data used for displaying the contents.
231
     struct x_output is used for X window frames;
232
     it is defined in xterm.h.  
233
     struct w32_output is used for W32 window frames;
234
     it is defined in w32term.h.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
235 236 237 238
  union output_data
  {
    struct x_output *x;
    struct w32_output *w32;
239
    struct mac_output *mac;
Gerd Moellmann's avatar
Gerd Moellmann committed
240 241 242
    int nothing;
  }
  output_data;
Jim Blandy's avatar
Jim Blandy committed
243

244 245 246 247
#ifdef MULTI_KBOARD
  /* A pointer to the kboard structure associated with this frame.
     For termcap frames, this points to initial_kboard.  For X frames,
     it will be the same as display.x->display_info->kboard.  */
248
  struct kboard *kboard;
249 250
#endif

251 252 253
  /* Number of lines of menu bar.  */
  int menu_bar_lines;

254
#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI)
255 256 257 258
  /* Nonzero means using a menu bar that comes from the X toolkit.  */
  int external_menu_bar;
#endif

Jim Blandy's avatar
Jim Blandy committed
259
  /* Nonzero if last attempt at redisplay on this frame was preempted.  */
Jim Blandy's avatar
Jim Blandy committed
260 261
  char display_preempted;

262 263
  /* visible is nonzero if the frame is currently displayed; we check
     it to see if we should bother updating the frame's contents.
264
     DON'T SET IT DIRECTLY; instead, use FRAME_SET_VISIBLE.
Jim Blandy's avatar
Jim Blandy committed
265

266 267 268 269
     Note that, since invisible frames aren't updated, whenever a
     frame becomes visible again, it must be marked as garbaged.  The
     FRAME_SAMPLE_VISIBILITY macro takes care of this.

Geoff Voelker's avatar
Geoff Voelker committed
270 271 272 273 274 275 276 277
     On Windows NT/9X, to avoid wasting effort updating visible frames
     that are actually completely obscured by other windows on the
     display, we bend the meaning of visible slightly: if greater than
     1, then the frame is obscured - we still consider it to be
     "visible" as seen from lisp, but we don't bother updating it.  We
     must take care to garbage the frame when it ceaces to be obscured
     though.  Note that these semantics are only used on NT/9X.

278 279 280 281 282 283 284 285 286 287
     iconified is nonzero if the frame is currently iconified.

     Asynchronous input handlers should NOT change these directly;
     instead, they should change async_visible or async_iconified, and
     let the FRAME_SAMPLE_VISIBILITY macro set visible and iconified
     at the next redisplay.

     These should probably be considered read-only by everyone except
     FRAME_SAMPLE_VISIBILITY.

Karl Heuer's avatar
Karl Heuer committed
288
     These two are mutually exclusive.  They might both be zero, if the
289 290 291 292 293 294 295 296 297 298
     frame has been made invisible without an icon.  */
  char visible, iconified;

  /* Asynchronous input handlers change these, and
     FRAME_SAMPLE_VISIBILITY copies them into visible and iconified.
     See FRAME_SAMPLE_VISIBILITY, below.  */
#ifdef __STDC__
  volatile
#endif
  char async_visible, async_iconified;
Jim Blandy's avatar
Jim Blandy committed
299

Jim Blandy's avatar
Jim Blandy committed
300
  /* Nonzero if this frame should be redrawn.  */
301 302 303
#ifdef __STDC__
  volatile
#endif
Jim Blandy's avatar
Jim Blandy committed
304 305
  char garbaged;

Jim Blandy's avatar
Jim Blandy committed
306 307
  /* True if frame actually has a minibuffer window on it.
     0 if using a minibuffer window that isn't on this frame.  */
Jim Blandy's avatar
Jim Blandy committed
308 309
  char has_minibuffer;
     
Jim Blandy's avatar
Jim Blandy committed
310
  /* 0 means, if this frame has just one window,
Jim Blandy's avatar
Jim Blandy committed
311 312 313
     show no modeline for that window.  */
  char wants_modeline;

314
  /* Non-zero if the hardware device this frame is displaying on can
315 316
     support scroll bars.  */
  char can_have_scroll_bars;
317

318
  /* If can_have_scroll_bars is non-zero, this is non-zero if we should
319
     actually display them on this frame.  */
320
  enum vertical_scroll_bar_type vertical_scroll_bar_type;
321

Jim Blandy's avatar
Jim Blandy committed
322
  /* Non-0 means raise this frame to the top of the heap when selected.  */
Jim Blandy's avatar
Jim Blandy committed
323 324
  char auto_raise;

Jim Blandy's avatar
Jim Blandy committed
325
  /* Non-0 means lower this frame to the bottom of the stack when left.  */
Jim Blandy's avatar
Jim Blandy committed
326 327
  char auto_lower;

Jim Blandy's avatar
Jim Blandy committed
328
  /* True if frame's root window can't be split.  */
Jim Blandy's avatar
Jim Blandy committed
329 330
  char no_split;

Jim Blandy's avatar
Jim Blandy committed
331 332 333 334 335 336
  /* If this is set, then Emacs won't change the frame name to indicate
     the current buffer, etcetera.  If the user explicitly sets the frame
     name, this gets set.  If the user sets the name to Qnil, this is
     cleared.  */
  char explicit_name;

337 338 339
  /* Nonzero if size of some window on this frame has changed.  */
  char window_sizes_changed;

Jim Blandy's avatar
Jim Blandy committed
340
  /* Storage for messages to this frame. */
Jim Blandy's avatar
Jim Blandy committed
341 342 343 344 345
  char *message_buf;

  /* Nonnegative if current redisplay should not do scroll computation
     for lines beyond a certain vpos.  This is the vpos.  */
  int scroll_bottom_vpos;
346

347 348 349 350
  /* Width of the scroll bar, in pixels and in characters.
     scroll_bar_cols tracks scroll_bar_pixel_width if the latter is positive;
     a zero value in scroll_bar_pixel_width means to compute the actual width
     on the fly, using scroll_bar_cols and the current font width.  */
351 352
  int scroll_bar_pixel_width;
  int scroll_bar_cols;
353

Gerd Moellmann's avatar
Gerd Moellmann committed
354 355 356
  /* Width of area for drawing truncation marks and overlay arrow.  */
  int trunc_area_pixel_width, trunc_area_cols;

357 358
  /* The baud rate that was used to calculate costs for this frame.  */
  int cost_calculation_baud_rate;
359

360 361 362 363 364
  /* A pointer to the data structure containing all information of
     fontsets associated with this frame.  See the comments in
     fontset.h for more detail.  */
  struct fontset_data *fontset_data;

365 366 367
  /* Nonzero if the mouse has moved on this display
     since the last time we checked.  */
  char mouse_moved;
368 369 370 371 372

  /* Exponent for gamma correction of colors.  1/(VIEWING_GAMMA *
     SCREEN_GAMMA) where viewing_gamma is 0.4545 and SCREEN_GAMMA is a
     frame parameter.  0 means don't do gamma correction.  */
  double gamma;
Jim Blandy's avatar
Jim Blandy committed
373 374
};

Karl Heuer's avatar
Karl Heuer committed
375
#ifdef MULTI_KBOARD
376 377 378 379 380
#define FRAME_KBOARD(f) ((f)->kboard)
#else
#define FRAME_KBOARD(f) (&the_only_kboard)
#endif

Jim Blandy's avatar
Jim Blandy committed
381 382 383
typedef struct frame *FRAME_PTR;

#define XFRAME(p) ((struct frame *) XPNTR (p))
384
#define XSETFRAME(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_FRAME))
Jim Blandy's avatar
Jim Blandy committed
385

Richard M. Stallman's avatar
Richard M. Stallman committed
386
/* Given a window, return its frame as a Lisp_Object.  */
Jim Blandy's avatar
Jim Blandy committed
387 388
#define WINDOW_FRAME(w) (w)->frame

Richard M. Stallman's avatar
Richard M. Stallman committed
389 390
/* Test a frame for particular kinds of display methods.  */
#define FRAME_TERMCAP_P(f) ((f)->output_method == output_termcap)
391
#define FRAME_X_P(f) ((f)->output_method == output_x_window)
392
#define FRAME_W32_P(f) ((f)->output_method == output_w32)
393
#define FRAME_MSDOS_P(f) ((f)->output_method == output_msdos_raw)
394
#define FRAME_MAC_P(f) ((f)->output_method == output_mac)
395 396 397

/* FRAME_WINDOW_P tests whether the frame is a window, and is
   defined to be the predicate for the window system being used.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
398

399 400 401 402
#ifdef HAVE_X_WINDOWS
#define FRAME_WINDOW_P(f) FRAME_X_P (f)
#endif
#ifdef HAVE_NTGUI
403
#define FRAME_WINDOW_P(f) FRAME_W32_P (f)
404
#endif
405 406 407
#ifdef macintosh
#define FRAME_WINDOW_P(f) FRAME_MAC_P (f)
#endif
408 409 410
#ifndef FRAME_WINDOW_P
#define FRAME_WINDOW_P(f) (0)
#endif
411

Richard M. Stallman's avatar
Richard M. Stallman committed
412
/* Nonzero if frame F is still alive (not deleted).  */
413
#define FRAME_LIVE_P(f) ((f)->output_data.nothing != 0)
Richard M. Stallman's avatar
Richard M. Stallman committed
414 415

/* Nonzero if frame F is a minibuffer-only frame.  */
Jim Blandy's avatar
Jim Blandy committed
416 417
#define FRAME_MINIBUF_ONLY_P(f) \
  EQ (FRAME_ROOT_WINDOW (f), FRAME_MINIBUF_WINDOW (f))
Richard M. Stallman's avatar
Richard M. Stallman committed
418 419 420

/* Nonzero if frame F contains a minibuffer window.
   (If this is 0, F must use some other minibuffer window.)  */
Jim Blandy's avatar
Jim Blandy committed
421
#define FRAME_HAS_MINIBUF_P(f) ((f)->has_minibuffer)
Jim Blandy's avatar
Jim Blandy committed
422
#define FRAME_HEIGHT(f) (f)->height
Richard M. Stallman's avatar
Richard M. Stallman committed
423 424 425

/* Width of frame F, measured in character columns,
   not including scroll bars if any.  */
Jim Blandy's avatar
Jim Blandy committed
426
#define FRAME_WIDTH(f) (f)->width
Richard M. Stallman's avatar
Richard M. Stallman committed
427 428 429 430 431

/* Number of lines of frame F used for menu bar.
   This is relevant on terminal frames and on
   X Windows when not using the X toolkit.
   These lines are counted in FRAME_HEIGHT.  */
432
#define FRAME_MENU_BAR_LINES(f) (f)->menu_bar_lines
Richard M. Stallman's avatar
Richard M. Stallman committed
433

434
/* Number of lines of frame F used for the tool-bar.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
435

436
#define FRAME_TOOL_BAR_LINES(f) (f)->tool_bar_lines
Gerd Moellmann's avatar
Gerd Moellmann committed
437 438 439 440

/* Lines above the top-most window in frame F.  */

#define FRAME_TOP_MARGIN(F) \
441
     (FRAME_MENU_BAR_LINES (F) + FRAME_TOOL_BAR_LINES (F))
Gerd Moellmann's avatar
Gerd Moellmann committed
442

Richard M. Stallman's avatar
Richard M. Stallman committed
443 444
/* Nonzero if this frame should display a menu bar
   in a way that does not use any text lines.  */
445
#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI)
446
#define FRAME_EXTERNAL_MENU_BAR(f) (f)->external_menu_bar
447 448 449
#else
#define FRAME_EXTERNAL_MENU_BAR(f) 0
#endif
450
#define FRAME_VISIBLE_P(f) ((f)->visible != 0)
Richard M. Stallman's avatar
Richard M. Stallman committed
451 452

/* Nonzero if frame F is currently visible but hidden.  */
Geoff Voelker's avatar
Geoff Voelker committed
453
#define FRAME_OBSCURED_P(f) ((f)->visible > 1)
Richard M. Stallman's avatar
Richard M. Stallman committed
454 455 456 457

/* Nonzero if frame F is currently iconified.  */
#define FRAME_ICONIFIED_P(f) (f)->iconified

458 459
#define FRAME_SET_VISIBLE(f,p) \
  ((f)->async_visible = (p), FRAME_SAMPLE_VISIBILITY (f))
Jim Blandy's avatar
Jim Blandy committed
460 461
#define SET_FRAME_GARBAGED(f) (frame_garbaged = 1, f->garbaged = 1)
#define FRAME_GARBAGED_P(f) (f)->garbaged
Richard M. Stallman's avatar
Richard M. Stallman committed
462 463

/* Nonzero means do not allow splitting this frame's window.  */
Jim Blandy's avatar
Jim Blandy committed
464
#define FRAME_NO_SPLIT_P(f) (f)->no_split
Richard M. Stallman's avatar
Richard M. Stallman committed
465 466

/* Not really implemented.  */
Jim Blandy's avatar
Jim Blandy committed
467
#define FRAME_WANTS_MODELINE_P(f) (f)->wants_modeline
Richard M. Stallman's avatar
Richard M. Stallman committed
468 469 470 471

/* Nonzero if a size change has been requested for frame F
   but not yet really put into effect.  This can be true temporarily
   when an X event comes in at a bad time.  */
472
#define FRAME_WINDOW_SIZES_CHANGED(f) (f)->window_sizes_changed
Richard M. Stallman's avatar
Richard M. Stallman committed
473 474 475 476 477
/* When a size change is pending, these are the requested new sizes.  */
#define FRAME_NEW_HEIGHT(f) (f)->new_height
#define FRAME_NEW_WIDTH(f) (f)->new_width

/* The minibuffer window of frame F, if it has one; otherwise nil.  */
Jim Blandy's avatar
Jim Blandy committed
478
#define FRAME_MINIBUF_WINDOW(f) (f)->minibuffer_window
Richard M. Stallman's avatar
Richard M. Stallman committed
479 480

/* The root window of the window tree of frame F.  */
Jim Blandy's avatar
Jim Blandy committed
481
#define FRAME_ROOT_WINDOW(f) (f)->root_window
Richard M. Stallman's avatar
Richard M. Stallman committed
482 483

/* The currently selected window of the window tree of frame F.  */
Jim Blandy's avatar
Jim Blandy committed
484
#define FRAME_SELECTED_WINDOW(f) (f)->selected_window
Richard M. Stallman's avatar
Richard M. Stallman committed
485

Jim Blandy's avatar
Jim Blandy committed
486 487 488 489 490 491 492
#define FRAME_INSERT_COST(f) (f)->insert_line_cost    
#define FRAME_DELETE_COST(f) (f)->delete_line_cost    
#define FRAME_INSERTN_COST(f) (f)->insert_n_lines_cost
#define FRAME_DELETEN_COST(f) (f)->delete_n_lines_cost
#define FRAME_MESSAGE_BUF(f) (f)->message_buf
#define FRAME_SCROLL_BOTTOM_VPOS(f) (f)->scroll_bottom_vpos
#define FRAME_FOCUS_FRAME(f) (f)->focus_frame
Richard M. Stallman's avatar
Richard M. Stallman committed
493 494 495 496

/* Nonzero if frame F supports scroll bars.
   If this is zero, then it is impossible to enable scroll bars
   on frame F.  */
497
#define FRAME_CAN_HAVE_SCROLL_BARS(f) ((f)->can_have_scroll_bars)
Richard M. Stallman's avatar
Richard M. Stallman committed
498 499 500

/* This frame slot says whether scroll bars are currently enabled for frame F,
   and which side they are on.  */
501 502 503 504 505 506 507
#define FRAME_VERTICAL_SCROLL_BAR_TYPE(f) ((f)->vertical_scroll_bar_type)
#define FRAME_HAS_VERTICAL_SCROLL_BARS(f) \
     ((f)->vertical_scroll_bar_type != vertical_scroll_bar_none)
#define FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT(f) \
     ((f)->vertical_scroll_bar_type == vertical_scroll_bar_left)
#define FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT(f) \
     ((f)->vertical_scroll_bar_type == vertical_scroll_bar_right)
Richard M. Stallman's avatar
Richard M. Stallman committed
508 509 510 511

/* Width that a scroll bar in frame F should have, if there is one.
   Measured in pixels.
   If scroll bars are turned off, this is still nonzero.  */
512
#define FRAME_SCROLL_BAR_PIXEL_WIDTH(f) ((f)->scroll_bar_pixel_width)
Richard M. Stallman's avatar
Richard M. Stallman committed
513 514 515 516

/* Width that a scroll bar in frame F should have, if there is one.
   Measured in columns (characters).
   If scroll bars are turned off, this is still nonzero.  */
517
#define FRAME_SCROLL_BAR_COLS(f) ((f)->scroll_bar_cols)
Richard M. Stallman's avatar
Richard M. Stallman committed
518 519 520 521

/* Width of a scroll bar in frame F, measured in columns (characters),
   but only if scroll bars are on the left.
   If scroll bars are on the right in this frame, it is 0.  */
522 523 524 525
#define FRAME_LEFT_SCROLL_BAR_WIDTH(f) \
     (FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT (f) \
      ? FRAME_SCROLL_BAR_COLS (f) \
      : 0)
Richard M. Stallman's avatar
Richard M. Stallman committed
526 527

/* Width of a scroll bar in frame F, measured in columns (characters).  */
528 529 530 531
#define FRAME_SCROLL_BAR_WIDTH(f) \
     (FRAME_HAS_VERTICAL_SCROLL_BARS (f) \
      ? FRAME_SCROLL_BAR_COLS (f) \
      : 0)
Richard M. Stallman's avatar
Richard M. Stallman committed
532 533 534 535 536 537 538 539 540 541 542 543 544 545

/* Total width of frame F, in columns (characters),
   including the width used by scroll bars if any.  */
#define FRAME_WINDOW_WIDTH(f) ((f)->window_width)

/* Set the width of frame F to VAL.
   VAL is the width of a full-frame window,
   not including scroll bars.  */
#define SET_FRAME_WIDTH(f, val)						\
     ((f)->width = (val),						\
      (f)->window_width = FRAME_WINDOW_WIDTH_ARG (f, (f)->width))

/* Given a value WIDTH for frame F's nominal width,
   return the value that FRAME_WINDOW_WIDTH should have.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
546 547 548
#define FRAME_WINDOW_WIDTH_ARG(f, width)	\
     ((width)					\
      + FRAME_SCROLL_BAR_WIDTH (f)		\
549
      + FRAME_FLAGS_AREA_COLS (f))
Richard M. Stallman's avatar
Richard M. Stallman committed
550

551 552 553
/* Maximum + 1 legitimate value for FRAME_CURSOR_X.  */
#define FRAME_CURSOR_X_LIMIT(f) \
     (FRAME_WIDTH (f) + FRAME_LEFT_SCROLL_BAR_WIDTH (f))
Richard M. Stallman's avatar
Richard M. Stallman committed
554 555

/* Nonzero if frame F has scroll bars.  */
556
#define FRAME_SCROLL_BARS(f) ((f)->scroll_bars)
Richard M. Stallman's avatar
Richard M. Stallman committed
557

558
#define FRAME_CONDEMNED_SCROLL_BARS(f) ((f)->condemned_scroll_bars)
559
#define FRAME_MENU_BAR_ITEMS(f) ((f)->menu_bar_items)
560
#define FRAME_COST_BAUD_RATE(f) ((f)->cost_calculation_baud_rate)
561 562
#define FRAME_FONTSET_DATA(f) ((f)->fontset_data)

Gerd Moellmann's avatar
Gerd Moellmann committed
563 564 565 566
/* Return a pointer to the face cache of frame F.  */

#define FRAME_FACE_CACHE(F)	(F)->face_cache

567 568 569
/* Return the size of message_buf of the frame F.  We multiply the
   width of the frame by 4 because multi-byte form may require at most
   4-byte for a character.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
570
     
571
#define FRAME_MESSAGE_BUF_SIZE(f) (((int) (f)->width) * 4)
Jim Blandy's avatar
Jim Blandy committed
572

573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588
/* Emacs's redisplay code could become confused if a frame's
   visibility changes at arbitrary times.  For example, if a frame is
   visible while the desired glyphs are being built, but becomes
   invisible before they are updated, then some rows of the
   desired_glyphs will be left marked as enabled after redisplay is
   complete, which should never happen.  The next time the frame
   becomes visible, redisplay will probably barf.

   Currently, there are no similar situations involving iconified, but
   the principle is the same.

   So instead of having asynchronous input handlers directly set and
   clear the frame's visibility and iconification flags, they just set
   the async_visible and async_iconified flags; the redisplay code
   calls the FRAME_SAMPLE_VISIBILITY macro before doing any redisplay,
   which sets visible and iconified from their asynchronous
589 590
   counterparts.

591 592 593 594 595
   Synchronous code must use the FRAME_SET_VISIBLE macro.

   Also, if a frame used to be invisible, but has just become visible,
   it must be marked as garbaged, since redisplay hasn't been keeping
   up its contents.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
596
     
597
#define FRAME_SAMPLE_VISIBILITY(f) \
Geoff Voelker's avatar
Geoff Voelker committed
598 599
  (((f)->async_visible && (f)->visible != (f)->async_visible) ? \
   SET_FRAME_GARBAGED (f) : 0, \
600
   (f)->visible = (f)->async_visible, \
601 602
   (f)->iconified = (f)->async_iconified)

603 604 605 606 607
#define CHECK_FRAME(x, i)				\
     do {						\
       if (! FRAMEP (x))				\
         x = wrong_type_argument (Qframep, (x));	\
     } while (0)
Jim Blandy's avatar
Jim Blandy committed
608

Jim Blandy's avatar
Jim Blandy committed
609
#define CHECK_LIVE_FRAME(x, i)				\
610 611 612 613 614
     do {						\
       if (! FRAMEP (x)					\
	   || ! FRAME_LIVE_P (XFRAME (x)))		\
         x = wrong_type_argument (Qframe_live_p, (x));	\
     } while (0)
Jim Blandy's avatar
Jim Blandy committed
615

Jim Blandy's avatar
Jim Blandy committed
616 617
/* FOR_EACH_FRAME (LIST_VAR, FRAME_VAR) followed by a statement is a
   `for' loop which iterates over the elements of Vframe_list.  The
618
   loop will set FRAME_VAR, a Lisp_Object, to each frame in
Jim Blandy's avatar
Jim Blandy committed
619
   Vframe_list in succession and execute the statement.  LIST_VAR
620
   should be a Lisp_Object too; it is used to iterate through the
Jim Blandy's avatar
Jim Blandy committed
621
   Vframe_list.  
Jim Blandy's avatar
Jim Blandy committed
622

Karl Heuer's avatar
Karl Heuer committed
623 624 625
   This macro is a holdover from a time when multiple frames weren't always
   supported.  An alternate definition of the macro would expand to
   something which executes the statement once.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
626

Jim Blandy's avatar
Jim Blandy committed
627 628
#define FOR_EACH_FRAME(list_var, frame_var)			\
  for ((list_var) = Vframe_list;				\
Jim Blandy's avatar
Jim Blandy committed
629
       (CONSP (list_var)					\
630 631
	&& (frame_var = XCAR (list_var), 1));		\
       list_var = XCDR (list_var))
Jim Blandy's avatar
Jim Blandy committed
632 633


Richard M. Stallman's avatar
Richard M. Stallman committed
634
extern Lisp_Object Qframep, Qframe_live_p, Qicon;
Jim Blandy's avatar
Jim Blandy committed
635

Jim Blandy's avatar
Jim Blandy committed
636
extern struct frame *last_nonminibuf_frame;
Jim Blandy's avatar
Jim Blandy committed
637

638 639
extern struct frame *make_terminal_frame P_ ((void));
extern struct frame *make_frame P_ ((int));
640
#ifdef HAVE_WINDOW_SYSTEM
641 642 643 644
extern struct frame *make_minibuffer_frame P_ ((void));
extern struct frame *make_frame_without_minibuffer P_ ((Lisp_Object,
							struct kboard *,
							Lisp_Object));
645
#endif /* HAVE_WINDOW_SYSTEM */
646
extern int other_visible_frames P_ ((struct frame *));
Jim Blandy's avatar
Jim Blandy committed
647

Jim Blandy's avatar
Jim Blandy committed
648 649
extern Lisp_Object Vframe_list;
extern Lisp_Object Vdefault_frame_alist;
Jim Blandy's avatar
Jim Blandy committed
650

Jim Blandy's avatar
Jim Blandy committed
651
extern Lisp_Object Vterminal_frame;
Jim Blandy's avatar
Jim Blandy committed
652

Karl Heuer's avatar
Karl Heuer committed
653
/* Device-independent scroll bar stuff.  */
654

655
/* Return the starting column (zero-based) of the vertical scroll bar
656 657
   for window W.  The column before this one is the last column we can
   use for text.  If the window touches the right edge of the frame,
658
   we have extra space allocated for it.  Otherwise, the scroll bar
659
   takes over the window's rightmost columns.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
660

661
#define WINDOW_VERTICAL_SCROLL_BAR_COLUMN(w) \
662 663 664 665 666 667 668
  (FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT (XFRAME (WINDOW_FRAME (w))) ? \
    (((XINT ((w)->left) + XINT ((w)->width)) \
      < FRAME_WIDTH (XFRAME (WINDOW_FRAME (w)))) \
     ? (XINT ((w)->left) + XINT ((w)->width) \
       - FRAME_SCROLL_BAR_COLS (XFRAME (WINDOW_FRAME (w)))) \
     : FRAME_WIDTH (XFRAME (WINDOW_FRAME (w)))) \
  : XINT ((w)->left))
669

670 671
/* Return the height in lines of the vertical scroll bar in w.  If the
   window has a mode line, don't make the scroll bar extend that far.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
672
     
673
#define WINDOW_VERTICAL_SCROLL_BAR_HEIGHT(w) (window_internal_height (w))
Gerd Moellmann's avatar
Gerd Moellmann committed
674

Gerd Moellmann's avatar
Gerd Moellmann committed
675 676 677 678 679 680 681 682 683 684 685 686
/* The currently selected frame.  */

extern Lisp_Object selected_frame;

/* Value is a pointer to the selected frame.  If the selected frame
   isn't life, abort.  */

#define SELECTED_FRAME()				\
     ((FRAMEP (selected_frame)				\
       && FRAME_LIVE_P (XFRAME (selected_frame)))	\
      ? XFRAME (selected_frame)				\
      : (struct frame *) (abort (), 0))
Gerd Moellmann's avatar
Gerd Moellmann committed
687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707


/***********************************************************************
			Display-related Macros
 ***********************************************************************/

/* Canonical y-unit on frame F.  This value currently equals the line
   height of the frame.  Terminal specific header files are expected
   to define the macro FRAME_LINE_HEIGHT.  */

#define CANON_Y_UNIT(F) \
     (FRAME_WINDOW_P (F) ? FRAME_LINE_HEIGHT (F) : 1)

/* Canonical x-unit on frame F.  This is currently equal to the width
   of the default font of F.  Terminal specific headers are expected
   to define the macro FRAME_DEFAULT_FONT_WIDTH.  */

#define CANON_X_UNIT(F) \
     (FRAME_WINDOW_P (F) ? FRAME_DEFAULT_FONT_WIDTH (F) : 1)

/* Pixel width of areas used to display truncation marks, continuation
708
   marks, overlay arrows.  This is 0 for terminal frames.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
709 710 711 712

#ifdef HAVE_WINDOW_SYSTEM
#define FRAME_FLAGS_AREA_COLS(F) \
     (FRAME_WINDOW_P ((F)) ? FRAME_X_FLAGS_AREA_COLS ((F)) : 0)
713 714 715
#define FRAME_FLAGS_AREA_WIDTH(F) FRAME_X_FLAGS_AREA_WIDTH (F)
#define FRAME_LEFT_FLAGS_AREA_WIDTH(F) FRAME_X_LEFT_FLAGS_AREA_WIDTH (F)
     
Gerd Moellmann's avatar
Gerd Moellmann committed
716 717 718
#else
#define FRAME_FLAGS_AREA_WIDTH(F)	0
#define FRAME_FLAGS_AREA_COLS(F)	0
719
#define FRAME_LEFT_FLAGS_AREA_WIDTH(F)  0
Gerd Moellmann's avatar
Gerd Moellmann committed
720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739
#endif
     



/***********************************************************************
	    Conversion between canonical units and pixels
 ***********************************************************************/

/* Canonical x-values are fractions of CANON_X_UNIT, canonical y-unit
   are fractions of CANON_Y_UNIT of a frame.  Both are represented as
   Lisp numbers, i.e. integers or floats.  */

/* Convert canonical value X to pixels.  F is the frame whose
   canonical char width is to be used.  X must be a Lisp integer or
   float.  Value is a C integer.  */
     
#define PIXEL_X_FROM_CANON_X(F, X)			\
     (INTEGERP (X)					\
      ? XINT (X) * CANON_X_UNIT (F)			\
740
      : (int) (XFLOAT_DATA (X) * CANON_X_UNIT (F)))
Gerd Moellmann's avatar
Gerd Moellmann committed
741 742 743 744 745 746 747 748
      
/* Convert canonical value Y to pixels.  F is the frame whose
   canonical character height is to be used.  X must be a Lisp integer
   or float.  Value is a C integer.  */
     
#define PIXEL_Y_FROM_CANON_Y(F, Y)			\
     (INTEGERP (Y)					\
      ? XINT (Y) * CANON_Y_UNIT (F)			\
749
      : (int) (XFLOAT_DATA (Y) * CANON_Y_UNIT (F)))
Gerd Moellmann's avatar
Gerd Moellmann committed
750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770

/* Convert pixel-value X to canonical units.  F is the frame whose
   canonical character width is to be used.  X is a C integer.  Result
   is a Lisp float if X is not a multiple of the canon width,
   otherwise it's a Lisp integer.  */

#define CANON_X_FROM_PIXEL_X(F, X)			\
     ((X) % CANON_X_UNIT (F) != 0			\
      ? make_float ((double) (X) / CANON_X_UNIT (F))	\
      : make_number ((X) / CANON_X_UNIT (F)))

/* Convert pixel-value Y to canonical units.  F is the frame whose
   canonical character height is to be used.  Y is a C integer.
   Result is a Lisp float if Y is not a multiple of the canon width,
   otherwise it's a Lisp integer.  */

#define CANON_Y_FROM_PIXEL_Y(F, Y)			\
     ((Y) % CANON_Y_UNIT (F) 				\
      ? make_float ((double) (Y) / CANON_Y_UNIT (F))	\
      : make_number ((Y) / CANON_Y_UNIT (F)))	
			     
771
#endif /* not defined _FRAME_H_ */