frame.h 10.9 KB
Newer Older
Jim Blandy's avatar
Jim Blandy committed
1
/* Define frame-object for GNU Emacs.
Jim Blandy's avatar
Jim Blandy committed
2
   Copyright (C) 1988, 1992 Free Software Foundation, Inc.
Jim Blandy's avatar
Jim Blandy committed
3 4 5 6 7

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
8
the Free Software Foundation; either version 2, or (at your option)
Jim Blandy's avatar
Jim Blandy committed
9 10 11 12 13 14 15 16 17 18 19 20
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
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */


Jim Blandy's avatar
Jim Blandy committed
21
/* The structure representing a frame.
Jim Blandy's avatar
Jim Blandy committed
22

Jim Blandy's avatar
Jim Blandy committed
23 24 25
   We declare this even if MULTI_FRAME is not defined, because when
   we lack multi-frame support, we use one instance of this structure
   to represent the one frame we support.  This is cleaner than
Jim Blandy's avatar
Jim Blandy committed
26
   having miscellaneous random variables scattered about.  */
Jim Blandy's avatar
Jim Blandy committed
27 28 29 30

enum output_method
{ output_termcap, output_x_window };

Jim Blandy's avatar
Jim Blandy committed
31
struct frame
Jim Blandy's avatar
Jim Blandy committed
32 33 34 35
{
  int size;
  struct Lisp_Vector *next;

Jim Blandy's avatar
Jim Blandy committed
36 37
  /* glyphs as they appear on the frame */
  struct frame_glyphs *current_glyphs;
Jim Blandy's avatar
Jim Blandy committed
38

Jim Blandy's avatar
Jim Blandy committed
39 40
  /* glyphs we'd like to appear on the frame */
  struct frame_glyphs *desired_glyphs;
Jim Blandy's avatar
Jim Blandy committed
41

Jim Blandy's avatar
Jim Blandy committed
42
  /* See do_line_insertion_deletion_costs for info on these arrays. */
Jim Blandy's avatar
Jim Blandy committed
43
  /* Cost of inserting 1 line on this frame */
Jim Blandy's avatar
Jim Blandy committed
44
  int *insert_line_cost;
Jim Blandy's avatar
Jim Blandy committed
45
  /* Cost of deleting 1 line on this frame */
Jim Blandy's avatar
Jim Blandy committed
46
  int *delete_line_cost;
Jim Blandy's avatar
Jim Blandy committed
47
  /* Cost of inserting n lines on this frame */
Jim Blandy's avatar
Jim Blandy committed
48
  int *insert_n_lines_cost;
Jim Blandy's avatar
Jim Blandy committed
49
  /* Cost of deleting n lines on this frame */
Jim Blandy's avatar
Jim Blandy committed
50 51 52
  int *delete_n_lines_cost;

  /* glyphs for the mode line */
Jim Blandy's avatar
Jim Blandy committed
53
  struct frame_glyphs *temp_glyphs;
Jim Blandy's avatar
Jim Blandy committed
54

Jim Blandy's avatar
Jim Blandy committed
55
  /* Intended cursor position of this frame.
Jim Blandy's avatar
Jim Blandy committed
56
     Measured in characters, counting from upper left corner
Jim Blandy's avatar
Jim Blandy committed
57
     within the frame.  */
Jim Blandy's avatar
Jim Blandy committed
58 59 60
  int cursor_x;
  int cursor_y;

Jim Blandy's avatar
Jim Blandy committed
61 62
  /* Actual cursor position of this frame, and the character under it.
     (Not used for terminal frames.)  */
Jim Blandy's avatar
Jim Blandy committed
63 64
  int phys_cursor_x;
  int phys_cursor_y;
Jim Blandy's avatar
Jim Blandy committed
65 66 67
  /* This is handy for undrawing the cursor, because current_glyphs is
     not always accurate when in do_scrolling.  */
  GLYPH phys_cursor_glyph;
Jim Blandy's avatar
Jim Blandy committed
68

Jim Blandy's avatar
Jim Blandy committed
69
  /* Size of this frame, in units of characters.  */
Jim Blandy's avatar
Jim Blandy committed
70 71 72 73 74 75
  int height;
  int width;

  /* 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
76
  /* Name of this frame: a Lisp string.  */
Jim Blandy's avatar
Jim Blandy committed
77 78
  Lisp_Object name;

Jim Blandy's avatar
Jim Blandy committed
79 80 81
  /* The frame which should recieve keystrokes that occur in this
     frame.  This is usually the frame itself, but if the frame is
     minibufferless, this points to the minibuffer frame when it is
Jim Blandy's avatar
Jim Blandy committed
82
     active.  */
Jim Blandy's avatar
Jim Blandy committed
83
  Lisp_Object focus_frame;
Jim Blandy's avatar
Jim Blandy committed
84

Jim Blandy's avatar
Jim Blandy committed
85 86 87
  /* 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
88 89
  Lisp_Object root_window;

Jim Blandy's avatar
Jim Blandy committed
90 91 92 93
  /* 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
94 95
  Lisp_Object selected_window;

Jim Blandy's avatar
Jim Blandy committed
96 97 98
  /* 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
99 100 101
     can actually appear to exist.  */
  Lisp_Object minibuffer_window;

Jim Blandy's avatar
Jim Blandy committed
102 103 104
  /* 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
105 106
  Lisp_Object param_alist;

Jim Blandy's avatar
Jim Blandy committed
107
  /* The output method says how the contents of this frame
Jim Blandy's avatar
Jim Blandy committed
108 109 110 111
     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.
Jim Blandy's avatar
Jim Blandy committed
112
     struct x_display is used for X window frames;
Jim Blandy's avatar
Jim Blandy committed
113 114 115
     it is defined in xterm.h.  */
  union display { struct x_display *x; int nothing; } display;

Jim Blandy's avatar
Jim Blandy committed
116
  /* Nonzero if last attempt at redisplay on this frame was preempted.  */
Jim Blandy's avatar
Jim Blandy committed
117 118
  char display_preempted;

Jim Blandy's avatar
Jim Blandy committed
119
  /* Nonzero if frame is currently displayed.  */
Jim Blandy's avatar
Jim Blandy committed
120 121 122 123 124 125
  char visible;

  /* Nonzero if window is currently iconified.
     This and visible are mutually exclusive.  */
  char iconified;

Jim Blandy's avatar
Jim Blandy committed
126
  /* Nonzero if this frame should be redrawn.  */
Jim Blandy's avatar
Jim Blandy committed
127 128
  char garbaged;

Jim Blandy's avatar
Jim Blandy committed
129 130
  /* 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
131 132
  char has_minibuffer;
     
Jim Blandy's avatar
Jim Blandy committed
133
  /* 0 means, if this frame has just one window,
Jim Blandy's avatar
Jim Blandy committed
134 135 136
     show no modeline for that window.  */
  char wants_modeline;

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

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

Jim Blandy's avatar
Jim Blandy committed
143
  /* True if frame's root window can't be split.  */
Jim Blandy's avatar
Jim Blandy committed
144 145
  char no_split;

Jim Blandy's avatar
Jim Blandy committed
146
  /* Storage for messages to this frame. */
Jim Blandy's avatar
Jim Blandy committed
147 148 149 150 151 152 153
  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;
};

Jim Blandy's avatar
Jim Blandy committed
154 155 156 157 158 159 160 161 162 163 164
#ifdef MULTI_FRAME

typedef struct frame *FRAME_PTR;

#define XFRAME(p) ((struct frame *) XPNTR (p))
#define XSETFRAME(p, v) ((struct frame *) XSETPNTR (p, v))

#define WINDOW_FRAME(w) (w)->frame

#define FRAMEP(f) (XTYPE(f) == Lisp_Frame)
#define FRAME_LIVE_P(f) ((f)->display.nothing != 0)
Jim Blandy's avatar
Jim Blandy committed
165 166
#define FRAME_TERMCAP_P(f) ((f)->output_method == output_termcap)
#define FRAME_X_P(f) ((f)->output_method == output_x_window)
Jim Blandy's avatar
Jim Blandy committed
167 168
#define FRAME_MINIBUF_ONLY_P(f) \
  EQ (FRAME_ROOT_WINDOW (f), FRAME_MINIBUF_WINDOW (f))
Jim Blandy's avatar
Jim Blandy committed
169
#define FRAME_HAS_MINIBUF_P(f) ((f)->has_minibuffer)
Jim Blandy's avatar
Jim Blandy committed
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
#define FRAME_CURRENT_GLYPHS(f) (f)->current_glyphs
#define FRAME_DESIRED_GLYPHS(f) (f)->desired_glyphs
#define FRAME_TEMP_GLYPHS(f) (f)->temp_glyphs
#define FRAME_HEIGHT(f) (f)->height
#define FRAME_WIDTH(f) (f)->width
#define FRAME_NEW_HEIGHT(f) (f)->new_height
#define FRAME_NEW_WIDTH(f) (f)->new_width
#define FRAME_CURSOR_X(f) (f)->cursor_x
#define FRAME_CURSOR_Y(f) (f)->cursor_y
#define FRAME_VISIBLE_P(f) (f)->visible
#define SET_FRAME_GARBAGED(f) (frame_garbaged = 1, f->garbaged = 1)
#define FRAME_GARBAGED_P(f) (f)->garbaged
#define FRAME_NO_SPLIT_P(f) (f)->no_split
#define FRAME_WANTS_MODELINE_P(f) (f)->wants_modeline
#define FRAME_ICONIFIED_P(f) (f)->iconified
#define FRAME_MINIBUF_WINDOW(f) (f)->minibuffer_window
#define FRAME_ROOT_WINDOW(f) (f)->root_window
#define FRAME_SELECTED_WINDOW(f) (f)->selected_window
#define SET_GLYPHS_FRAME(glyphs,frame) ((glyphs)->frame = (frame))
#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

#define CHECK_FRAME(x, i)				\
Jim Blandy's avatar
Jim Blandy committed
198
  {							\
Jim Blandy's avatar
Jim Blandy committed
199 200
    if (! FRAMEP (x))					\
      x = wrong_type_argument (Qframep, (x));		\
Jim Blandy's avatar
Jim Blandy committed
201 202
  }

Jim Blandy's avatar
Jim Blandy committed
203
#define CHECK_LIVE_FRAME(x, i)				\
Jim Blandy's avatar
Jim Blandy committed
204
  {							\
Jim Blandy's avatar
Jim Blandy committed
205 206 207
    if (! FRAMEP (x)					\
	|| ! FRAME_LIVE_P (XFRAME (x)))		\
      x = wrong_type_argument (Qlive_frame_p, (x));	\
Jim Blandy's avatar
Jim Blandy committed
208 209
  }

Jim Blandy's avatar
Jim Blandy committed
210 211 212 213
/* FOR_EACH_FRAME (LIST_VAR, FRAME_VAR) followed by a statement is a
   `for' loop which iterates over the elements of Vframe_list.  The
   loop will set FRAME_VAR, a FRAME_PTR, to each frame in
   Vframe_list in succession and execute the statement.  LIST_VAR
Jim Blandy's avatar
Jim Blandy committed
214
   should be a Lisp_Object; it is used to iterate through the
Jim Blandy's avatar
Jim Blandy committed
215
   Vframe_list.  
Jim Blandy's avatar
Jim Blandy committed
216

Jim Blandy's avatar
Jim Blandy committed
217
   If MULTI_FRAME isn't defined, then this loop expands to something which 
Jim Blandy's avatar
Jim Blandy committed
218
   executes the statement once.  */
Jim Blandy's avatar
Jim Blandy committed
219 220
#define FOR_EACH_FRAME(list_var, frame_var)			\
  for ((list_var) = Vframe_list;				\
Jim Blandy's avatar
Jim Blandy committed
221
       (CONSP (list_var)					\
Jim Blandy's avatar
Jim Blandy committed
222
	&& (frame_var = XFRAME (XCONS (list_var)->car), 1));	\
Jim Blandy's avatar
Jim Blandy committed
223 224 225
       list_var = XCONS (list_var)->cdr)


Jim Blandy's avatar
Jim Blandy committed
226
extern Lisp_Object Qframep, Qlive_frame_p;
Jim Blandy's avatar
Jim Blandy committed
227

Jim Blandy's avatar
Jim Blandy committed
228 229
extern struct frame *selected_frame;
extern struct frame *last_nonminibuf_frame;
Jim Blandy's avatar
Jim Blandy committed
230

Jim Blandy's avatar
Jim Blandy committed
231 232 233 234
extern struct frame *make_terminal_frame ();
extern struct frame *make_frame ();
extern struct frame *make_minibuffer_frame ();
extern struct frame *make_frame_without_minibuffer ();
Jim Blandy's avatar
Jim Blandy committed
235

Jim Blandy's avatar
Jim Blandy committed
236
/* Nonzero means FRAME_MESSAGE_BUF (selected_frame) is being used by
Jim Blandy's avatar
Jim Blandy committed
237 238 239
   print.  */
extern int message_buf_print;

Jim Blandy's avatar
Jim Blandy committed
240 241
extern Lisp_Object Vframe_list;
extern Lisp_Object Vdefault_frame_alist;
Jim Blandy's avatar
Jim Blandy committed
242

Jim Blandy's avatar
Jim Blandy committed
243
extern Lisp_Object Vterminal_frame;
Jim Blandy's avatar
Jim Blandy committed
244

Jim Blandy's avatar
Jim Blandy committed
245
#else /* not MULTI_FRAME */
Jim Blandy's avatar
Jim Blandy committed
246

Jim Blandy's avatar
Jim Blandy committed
247
/* These definitions are used in a single-frame version of Emacs.  */
Jim Blandy's avatar
Jim Blandy committed
248

Jim Blandy's avatar
Jim Blandy committed
249
#define FRAME_PTR int
Jim Blandy's avatar
Jim Blandy committed
250

Jim Blandy's avatar
Jim Blandy committed
251
extern struct frame the_only_frame;
Jim Blandy's avatar
Jim Blandy committed
252

Jim Blandy's avatar
Jim Blandy committed
253 254
extern int selected_frame;
extern int last_nonminibuf_frame;
Jim Blandy's avatar
Jim Blandy committed
255

Jim Blandy's avatar
Jim Blandy committed
256
/* Nonzero means FRAME_MESSAGE_BUF (selected_frame) is being used by
Jim Blandy's avatar
Jim Blandy committed
257 258
   print.  */
extern int message_buf_print;
Jim Blandy's avatar
Jim Blandy committed
259

Jim Blandy's avatar
Jim Blandy committed
260 261 262 263 264
#define XFRAME(f) selected_frame
#define WINDOW_FRAME(w) selected_frame

#define FRAMEP(f) (XTYPE(f) == Lisp_Frame)
#define FRAME_LIVE_P(f) 1
Jim Blandy's avatar
Jim Blandy committed
265 266
#define FRAME_TERMCAP_P(f) 1
#define FRAME_X_P(f) 0
Jim Blandy's avatar
Jim Blandy committed
267
#define FRAME_MINIBUF_ONLY_P(f) 0
Jim Blandy's avatar
Jim Blandy committed
268
#define FRAME_HAS_MINIBUF_P(f) 1
Jim Blandy's avatar
Jim Blandy committed
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
#define FRAME_CURRENT_GLYPHS(f) the_only_frame.current_glyphs
#define FRAME_DESIRED_GLYPHS(f) the_only_frame.desired_glyphs
#define FRAME_TEMP_GLYPHS(f) the_only_frame.temp_glyphs
#define FRAME_HEIGHT(f) the_only_frame.height
#define FRAME_WIDTH(f) the_only_frame.width
#define FRAME_NEW_HEIGHT(f) the_only_frame.new_height
#define FRAME_NEW_WIDTH(f) the_only_frame.new_width
#define FRAME_CURSOR_X(f) the_only_frame.cursor_x
#define FRAME_CURSOR_Y(f) the_only_frame.cursor_y
#define FRAME_VISIBLE_P(f) 1
#define SET_FRAME_GARBAGED(f) (frame_garbaged = 1)
#define FRAME_GARBAGED_P(f) frame_garbaged
#define FRAME_NO_SPLIT_P(f) 0
#define FRAME_WANTS_MODELINE_P(f) 1
#define FRAME_ICONIFIED_P(f) 0
#define FRAME_MINIBUF_WINDOW(f) minibuf_window
#define FRAME_ROOT_WINDOW(f) the_only_frame.root_window
#define FRAME_SELECTED_WINDOW(f) selected_window
#define SET_GLYPHS_FRAME(glyphs,frame)
#define FRAME_INSERT_COST(frame)  the_only_frame.insert_line_cost    
#define FRAME_DELETE_COST(frame)  the_only_frame.delete_line_cost    
#define FRAME_INSERTN_COST(frame) the_only_frame.insert_n_lines_cost
#define FRAME_DELETEN_COST(frame) the_only_frame.delete_n_lines_cost
#define FRAME_MESSAGE_BUF(f) the_only_frame.message_buf
#define FRAME_SCROLL_BOTTOM_VPOS(f) the_only_frame.scroll_bottom_vpos
#define FRAME_FOCUS_FRAME(f) 0

Jim Blandy's avatar
Jim Blandy committed
296 297
#define CHECK_FRAME(x, i) do; while (0)
#define CHECK_LIVE_FRAME(x, y) do; while (0)
Jim Blandy's avatar
Jim Blandy committed
298 299 300 301 302

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

Jim Blandy's avatar
Jim Blandy committed
306 307 308 309 310
   If MULTI_FRAME _is_ defined, then this loop expands to a real
   `for' loop which traverses Vframe_list using LIST_VAR and
   FRAME_VAR.  */
#define FOR_EACH_FRAME(list_var, frame_var)			\
  for (frame_var = (FRAME_PTR) 1; frame_var; frame_var = (FRAME_PTR) 0)
Jim Blandy's avatar
Jim Blandy committed
311

Jim Blandy's avatar
Jim Blandy committed
312
#endif /* not MULTI_FRAME */