xterm.h 37.8 KB
Newer Older
Jim Blandy's avatar
Jim Blandy committed
1
/* Definitions and headers for communication with X protocol.
2
   Copyright (C) 1989, 1993-1994, 1998-2011 Free Software Foundation, Inc.
Jim Blandy's avatar
Jim Blandy committed
3 4 5

This file is part of GNU Emacs.

6
GNU Emacs is free software: you can redistribute it and/or modify
Jim Blandy's avatar
Jim Blandy committed
7
it under the terms of the GNU General Public License as published by
8 9
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Jim Blandy's avatar
Jim Blandy committed
10 11 12 13 14 15 16

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
17
along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
Jim Blandy's avatar
Jim Blandy committed
18 19 20

#include <X11/Xlib.h>
#include <X11/cursorfont.h>
Kim F. Storm's avatar
Kim F. Storm committed
21 22 23 24

/* Include Xutil.h after keysym.h to work around a bug that prevents
   correct recognition of AltGr key in some X versions.  */

Jim Blandy's avatar
Jim Blandy committed
25
#include <X11/keysym.h>
26
#include <X11/Xutil.h>
Kim F. Storm's avatar
Kim F. Storm committed
27

Jim Blandy's avatar
Jim Blandy committed
28 29 30
#include <X11/Xatom.h>
#include <X11/Xresource.h>

31 32 33 34
#ifdef USE_X_TOOLKIT
#include <X11/StringDefs.h>
#include <X11/IntrinsicP.h>	/* CoreP.h needs this */
#include <X11/CoreP.h>		/* foul, but we need this to use our own
35
				   window inside a widget instead of one
36 37
				   that Xt creates... */
#include <X11/StringDefs.h>
Jan Djärv's avatar
Jan Djärv committed
38 39 40 41 42 43 44 45 46 47 48

typedef Widget xt_or_gtk_widget;
#endif

#ifdef USE_GTK
#include <gtk/gtk.h>
#include <gdk/gdkx.h>

/* Some definitions to reduce conditionals.  */
typedef GtkWidget *xt_or_gtk_widget;
#define XtParent(x) (gtk_widget_get_parent (x))
49
#undef XSync
50 51
#define XSync(d, b) do { gdk_window_process_all_updates (); \
                         XSync (d, b);  } while (0)
52

53 54 55 56
/* The GtkTooltip API came in 2.12, but gtk-enable-tooltips in 2.14. */
#if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 13
#define USE_GTK_TOOLTIP
#endif
Jan Djärv's avatar
Jan Djärv committed
57

58
#endif /* USE_GTK */
59

60 61

/* Bookkeeping to distinguish X versions.  */
Jim Blandy's avatar
Jim Blandy committed
62

63

64
#ifdef HAVE_X_I18N
65 66
#include <X11/Xlocale.h>
#endif
67 68 69 70 71

#define BLACK_PIX_DEFAULT(f) BlackPixel (FRAME_X_DISPLAY (f), \
					 XScreenNumberOfScreen (FRAME_X_SCREEN (f)))
#define WHITE_PIX_DEFAULT(f) WhitePixel (FRAME_X_DISPLAY (f), \
					 XScreenNumberOfScreen (FRAME_X_SCREEN (f)))
Jim Blandy's avatar
Jim Blandy committed
72

73
#define FONT_WIDTH(f)	((f)->max_width)
Jim Blandy's avatar
Jim Blandy committed
74 75
#define FONT_HEIGHT(f)	((f)->ascent + (f)->descent)
#define FONT_BASE(f)    ((f)->ascent)
76
#define FONT_DESCENT(f) ((f)->descent)
Jim Blandy's avatar
Jim Blandy committed
77 78

/* The mask of events that text windows always want to receive.  This
79 80
   includes mouse movement events, since handling the mouse-font text property
   means that we must track mouse motion all the time.  */
Jim Blandy's avatar
Jim Blandy committed
81 82 83 84 85

#define STANDARD_EVENT_SET      \
  (KeyPressMask			\
   | ExposureMask		\
   | ButtonPressMask		\
Jim Blandy's avatar
Jim Blandy committed
86 87
   | ButtonReleaseMask		\
   | PointerMotionMask		\
Jim Blandy's avatar
Jim Blandy committed
88 89 90 91 92 93
   | StructureNotifyMask	\
   | FocusChangeMask		\
   | LeaveWindowMask		\
   | EnterWindowMask		\
   | VisibilityChangeMask)

94 95 96 97 98 99 100 101 102
#ifdef HAVE_X11R6_XIM
/* Data structure passed to xim_instantiate_callback.  */
struct xim_inst_t
{
  struct x_display_info *dpyinfo;
  char *resource_name;
};
#endif /* HAVE_X11R6_XIM */

Richard M. Stallman's avatar
Richard M. Stallman committed
103 104 105 106 107 108
/* Structure recording X pixmap and reference count.
   If REFCOUNT is 0 then this record is free to be reused.  */

struct x_bitmap_record
{
  Pixmap pixmap;
109
  int have_mask;
110
  Pixmap mask;
Richard M. Stallman's avatar
Richard M. Stallman committed
111 112 113 114 115
  char *file;
  int refcount;
  /* Record some info about this pixmap.  */
  int height, width, depth;
};
116 117 118

/* For each X display, we have a structure that records
   information about it.  */
Jim Blandy's avatar
Jim Blandy committed
119

120
struct x_display_info
121
{
Richard M. Stallman's avatar
Richard M. Stallman committed
122
  /* Chain of all x_display_info structures.  */
123
  struct x_display_info *next;
124

125 126 127
  /* The generic display parameters corresponding to this X display. */
  struct terminal *terminal;

128 129
  /* Connection number (normally a file descriptor number).  */
  int connection;
130

131
  /* This says how to access this display in Xlib.  */
132
  Display *display;
133

Richard M. Stallman's avatar
Richard M. Stallman committed
134 135 136
  /* This is a cons cell of the form (NAME . FONT-LIST-CACHE).
     The same cons cell also appears in x_display_name_list.  */
  Lisp_Object name_list_element;
137

138 139
  /* Number of frames that are on this display.  */
  int reference_count;
140

141 142
  /* The Screen this connection is connected to.  */
  Screen *screen;
143 144 145

  /* Dots per inch of the screen.  */
  double resx, resy;
146

147 148
  /* The Visual being used for this display.  */
  Visual *visual;
149

Pavel Janík's avatar
Pavel Janík committed
150
  /* The colormap being used.  */
151
  Colormap cmap;
152

153
  /* Number of planes on this screen.  */
154
  int n_planes;
155

156 157
  /* Mask of things that cause the mouse to be grabbed.  */
  int grabbed;
158

159 160 161
  /* Emacs bitmap-id of the default icon bitmap for this frame.
     Or -1 if none has been allocated yet.  */
  int icon_bitmap_id;
162

163 164
  /* The root window of this screen.  */
  Window root_window;
165

Kenichi Handa's avatar
Kenichi Handa committed
166 167 168
  /* Client leader window.  */
  Window client_leader_window;

Richard M. Stallman's avatar
Richard M. Stallman committed
169 170
  /* The cursor to use for vertical scroll bars.  */
  Cursor vertical_scroll_bar_cursor;
171

172 173 174
  /* The invisible cursor used for pointer blanking.  */
  Cursor invisible_cursor;

Kenichi Handa's avatar
Kenichi Handa committed
175 176 177 178 179
#ifdef USE_GTK
  /* The GDK cursor for scroll bars and popup menus.  */
  GdkCursor *xg_cursor;
#endif

180 181 182
  /* X Resource data base */
  XrmDatabase xrdb;

183 184 185 186 187 188
  /* Minimum width over all characters in all fonts in font_table.  */
  int smallest_char_width;

  /* Minimum font height over all fonts in font_table.  */
  int smallest_font_height;

Richard M. Stallman's avatar
Richard M. Stallman committed
189 190 191
  /* Reusable Graphics Context for drawing a cursor in a non-default face. */
  GC scratch_cursor_gc;

192 193 194
  /* Information about the range of text currently shown in
     mouse-face.  */
  Mouse_HLInfo mouse_highlight;
195

Richard M. Stallman's avatar
Richard M. Stallman committed
196 197
  char *x_id_name;

198
  /* The number of fonts opened for this display.  */
Richard M. Stallman's avatar
Richard M. Stallman committed
199 200 201 202 203 204 205 206 207 208 209
  int n_fonts;

  /* Pointer to bitmap records.  */
  struct x_bitmap_record *bitmaps;

  /* Allocated size of bitmaps field.  */
  int bitmaps_size;

  /* Last used bitmap index.  */
  int bitmaps_last;

210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
  /* Which modifier keys are on which modifier bits?

     With each keystroke, X returns eight bits indicating which modifier
     keys were held down when the key was pressed.  The interpretation
     of the top five modifier bits depends on what keys are attached
     to them.  If the Meta_L and Meta_R keysyms are on mod5, then mod5
     is the meta bit.

     meta_mod_mask is a mask containing the bits used for the meta key.
     It may have more than one bit set, if more than one modifier bit
     has meta keys on it.  Basically, if EVENT is a KeyPress event,
     the meta key is pressed if (EVENT.state & meta_mod_mask) != 0.

     shift_lock_mask is LockMask if the XK_Shift_Lock keysym is on the
     lock modifier bit, or zero otherwise.  Non-alphabetic keys should
     only be affected by the lock modifier bit if XK_Shift_Lock is in
     use; XK_Caps_Lock should only affect alphabetic keys.  With this
     arrangement, the lock modifier should shift the character if
     (EVENT.state & shift_lock_mask) != 0.  */
  int meta_mod_mask, shift_lock_mask;

  /* These are like meta_mod_mask, but for different modifiers.  */
  int alt_mod_mask, super_mod_mask, hyper_mod_mask;

  /* Communication with window managers.  */
  Atom Xatom_wm_protocols;
236

237 238 239 240
  /* Kinds of protocol things we may receive.  */
  Atom Xatom_wm_take_focus;
  Atom Xatom_wm_save_yourself;
  Atom Xatom_wm_delete_window;
241

242 243
  /* Atom for indicating window state to the window manager.  */
  Atom Xatom_wm_change_state;
244

245 246 247
  /* Other WM communication */
  Atom Xatom_wm_configure_denied; /* When our config request is denied */
  Atom Xatom_wm_window_moved;     /* When the WM moves us.  */
Kenichi Handa's avatar
Kenichi Handa committed
248
  Atom Xatom_wm_client_leader;    /* Id of client leader window.  */
249

250 251 252 253 254
  /* EditRes protocol */
  Atom Xatom_editres;

  /* More atoms, which are selection types.  */
  Atom Xatom_CLIPBOARD, Xatom_TIMESTAMP, Xatom_TEXT, Xatom_DELETE,
255
  Xatom_COMPOUND_TEXT, Xatom_UTF8_STRING,
256
  Xatom_MULTIPLE, Xatom_INCR, Xatom_EMACS_TMP, Xatom_TARGETS, Xatom_NULL,
Chong Yidong's avatar
Chong Yidong committed
257
  Xatom_ATOM, Xatom_ATOM_PAIR, Xatom_CLIPBOARD_MANAGER;
258

259
  /* More atoms for font properties.  The last three are private
260
     properties, see the comments in src/fontset.h.  */
261
  Atom Xatom_PIXEL_SIZE, Xatom_AVERAGE_WIDTH,
262 263
  Xatom_MULE_BASELINE_OFFSET, Xatom_MULE_RELATIVE_COMPOSE,
  Xatom_MULE_DEFAULT_ASCENT;
264

265 266 267 268 269 270
  /* More atoms for Ghostscript support.  */
  Atom Xatom_DONE, Xatom_PAGE;

  /* Atom used in toolkit scroll bar client messages.  */
  Atom Xatom_Scrollbar;

271
  /* Atom used in XEmbed client messages.  */
272 273
  Atom Xatom_XEMBED, Xatom_XEMBED_INFO;

274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292
  /* The frame (if any) which has the X window that has keyboard focus.
     Zero if none.  This is examined by Ffocus_frame in xfns.c.  Note
     that a mere EnterNotify event can set this; if you need to know the
     last frame specified in a FocusIn or FocusOut event, use
     x_focus_event_frame.  */
  struct frame *x_focus_frame;

  /* The last frame mentioned in a FocusIn or FocusOut event.  This is
     separate from x_focus_frame, because whether or not LeaveNotify
     events cause us to lose focus depends on whether or not we have
     received a FocusIn event for it.  */
  struct frame *x_focus_event_frame;

  /* The frame which currently has the visual highlight, and should get
     keyboard input (other sorts of input have the frame encoded in the
     event).  It points to the X focus frame's selected window's
     frame.  It differs from x_focus_frame when we're using a global
     minibuffer.  */
  struct frame *x_highlight_frame;
293

294 295 296
  /* The gray pixmap.  */
  Pixmap gray;

297 298 299 300
#ifdef HAVE_X_I18N
  /* XIM (X Input method).  */
  XIM xim;
  XIMStyles *xim_styles;
301
  struct xim_inst_t *xim_callback_data;
302
#endif
303 304 305 306 307

  /* If non-null, a cache of the colors in the color map.  Don't
     use this directly, call x_color_cells instead.  */
  XColor *color_cells;
  int ncolor_cells;
Kenichi Handa's avatar
Kenichi Handa committed
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324

  /* Bits and shifts to use to compose pixel values on TrueColor visuals.  */
  int red_bits, blue_bits, green_bits;
  int red_offset, blue_offset, green_offset;

  /* The type of window manager we have.  If we move FRAME_OUTER_WINDOW
     to x/y 0/0, some window managers (type A) puts the window manager
     decorations outside the screen and FRAME_OUTER_WINDOW exactly at 0/0.
     Other window managers (type B) puts the window including decorations
     at 0/0, so FRAME_OUTER_WINDOW is a bit below 0/0.
     Record the type of WM in use so we can compensate for type A WMs.  */
  enum
    {
      X_WMTYPE_UNKNOWN,
      X_WMTYPE_A,
      X_WMTYPE_B
    } wm_type;
325 326


327 328 329 330 331
  /* Atoms that are drag and drop atoms */
  Atom *x_dnd_atoms;
  size_t x_dnd_atoms_size;
  size_t x_dnd_atoms_length;

332 333
  /* Extended window manager hints, Atoms supported by the window manager and
     atoms for settig the window type.  */
334
  Atom Xatom_net_supported, Xatom_net_supporting_wm_check;
335 336 337
  Atom *net_supported_atoms;
  int nr_net_supported_atoms;
  Window net_supported_window;
338
  Atom Xatom_net_window_type, Xatom_net_window_type_tooltip;
339
  Atom Xatom_net_active_window;
340

341
  /* Atoms dealing with EWMH (i.e. _NET_...) */
342
  Atom Xatom_net_wm_state, Xatom_net_wm_state_fullscreen,
343
    Xatom_net_wm_state_maximized_horz, Xatom_net_wm_state_maximized_vert,
344
    Xatom_net_wm_state_sticky, Xatom_net_frame_extents;
345 346 347 348

  /* XSettings atoms and windows.  */
  Atom Xatom_xsettings_sel, Xatom_xsettings_prop, Xatom_xsettings_mgr;
  Window xsettings_window;
349 350 351

  /* Frame name and icon name */
  Atom Xatom_net_wm_name, Xatom_net_wm_icon_name;
352 353 354 355 356
  /* Frame opacity */
  Atom Xatom_net_wm_window_opacity;

  /* SM */
  Atom Xatom_SM_CLIENT_ID;
357
};
358

Dave Love's avatar
Dave Love committed
359 360 361 362 363
#ifdef HAVE_X_I18N
/* Whether or not to use XIM if we have it.  */
extern int use_xim;
#endif

Gerd Moellmann's avatar
Gerd Moellmann committed
364 365
/* This checks to make sure we have a display.  */

Jan D's avatar
Jan D committed
366
extern void check_x (void);
Gerd Moellmann's avatar
Gerd Moellmann committed
367

Jan D's avatar
Jan D committed
368
extern struct frame *x_window_to_frame (struct x_display_info *, int);
Gerd Moellmann's avatar
Gerd Moellmann committed
369

Jan D's avatar
Jan D committed
370
extern struct frame *x_any_window_to_frame (struct x_display_info *, int);
371 372 373
extern struct frame *x_menubar_window_to_frame (struct x_display_info *,
						XEvent *);

Jan D's avatar
Jan D committed
374
extern struct frame *x_top_window_to_frame (struct x_display_info *, int);
Gerd Moellmann's avatar
Gerd Moellmann committed
375

376 377 378 379 380
#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
#define x_any_window_to_frame x_window_to_frame
#define x_top_window_to_frame x_window_to_frame
#endif

381 382 383
/* This is a chain of structures for all the X displays currently in use.  */
extern struct x_display_info *x_display_list;

Richard M. Stallman's avatar
Richard M. Stallman committed
384 385 386 387 388 389
/* This is a list of cons cells, each of the form (NAME . FONT-LIST-CACHE),
   one for each element of x_display_list and in the same order.
   NAME is the name of the frame.
   FONT-LIST-CACHE records previous values returned by x-list-fonts.  */
extern Lisp_Object x_display_name_list;

Jan D's avatar
Jan D committed
390 391
extern struct x_display_info *x_display_info_for_display (Display *);
extern void x_set_frame_alpha (struct frame *);
392

Jan D's avatar
Jan D committed
393 394
extern struct x_display_info *x_term_init (Lisp_Object, char *, char *);
extern int x_display_ok  (const char *);
395

Jan D's avatar
Jan D committed
396
extern void select_visual (struct x_display_info *);
397

398

399 400
struct font;

401 402
/* Each X frame object points to its own struct x_output object
   in the output_data.x field.  The x_output structure contains
Jim Blandy's avatar
Jim Blandy committed
403 404
   the information that is specific to X windows.  */

405
struct x_output
Jim Blandy's avatar
Jim Blandy committed
406
{
407 408 409 410 411 412
  /* Height of menu bar widget, in pixels.
     Zero if not using the X toolkit.
     When using the toolkit, this value is not meaningful
     if the menubar is turned off.  */
  int menubar_height;

413 414 415 416 417 418 419 420 421
  /* Height of tool bar widget, in pixels.  top_height is used if tool bar
     at top, bottom_height if tool bar is at the bottom.
     Zero if not using an external tool bar or if tool bar is vertical.  */
  int toolbar_top_height, toolbar_bottom_height;

  /* Width of tool bar widget, in pixels.  left_width is used if tool bar
     at left, right_width if tool bar is at the right.
     Zero if not using an external tool bar or if tool bar is horizontal.  */
  int toolbar_left_width, toolbar_right_width;
Jan Djärv's avatar
Jan Djärv committed
422

423
  /* The tiled border used when the mouse is out of the frame.  */
Jim Blandy's avatar
Jim Blandy committed
424 425
  Pixmap border_tile;

426
  /* Here are the Graphics Contexts for the default font.  */
Jim Blandy's avatar
Jim Blandy committed
427 428 429 430
  GC normal_gc;				/* Normal video */
  GC reverse_gc;			/* Reverse video */
  GC cursor_gc;				/* cursor drawing */

Jim Blandy's avatar
Jim Blandy committed
431 432
  /* The X window used for this frame.
     May be zero while the frame object is being created
Jim Blandy's avatar
Jim Blandy committed
433 434 435 436 437 438 439 440
     and the X window has not yet been created.  */
  Window window_desc;

  /* The X window used for the bitmap icon;
     or 0 if we don't have a bitmap icon.  */
  Window icon_desc;

  /* The X window that is the parent of this X window.
441 442 443
     Usually this is a window that was made by the window manager,
     but it can be the root window, and it can be explicitly specified
     (see the explicit_parent field, below).  */
Jim Blandy's avatar
Jim Blandy committed
444 445
  Window parent_desc;

446 447 448 449 450 451 452 453 454 455 456 457
#ifdef USE_X_TOOLKIT
  /* The widget of this screen.  This is the window of a "shell" widget.  */
  Widget widget;
  /* The XmPanedWindows...  */
  Widget column_widget;
  /* The widget of the edit portion of this screen; the window in
     "window_desc" is inside of this.  */
  Widget edit_widget;

  Widget menubar_widget;
#endif

Jan Djärv's avatar
Jan Djärv committed
458 459 460 461 462 463 464 465
#ifdef USE_GTK
  /* The widget of this screen.  This is the window of a top widget.  */
  GtkWidget *widget;
  /* The widget of the edit portion of this screen; the window in
     "window_desc" is inside of this.  */
  GtkWidget *edit_widget;
  /* The widget used for laying out widgets vertically.  */
  GtkWidget *vbox_widget;
466 467
  /* The widget used for laying out widgets horizontally.  */
  GtkWidget *hbox_widget;
Jan Djärv's avatar
Jan Djärv committed
468 469 470 471 472 473
  /* The menubar in this frame.  */
  GtkWidget *menubar_widget;
  /* The tool bar in this frame  */
  GtkWidget *toolbar_widget;
  /* The handle box that makes the tool bar detachable.  */
  GtkWidget *handlebox_widget;
474 475
  /* Non-zero if the tool bar is detached.  */
  int toolbar_detached;
476 477
  /* Non-zero if tool bar is packed into the hbox widget (i.e. vertical).  */
  int toolbar_in_hbox;
478

Jan Djärv's avatar
Jan Djärv committed
479 480 481
  /* The last size hints set.  */
  GdkGeometry size_hints;
  long hint_flags;
482

483
#ifdef USE_GTK_TOOLTIP
484 485 486
  GtkTooltip *ttip_widget;
  GtkWidget *ttip_lbl;
  GtkWindow *ttip_window;
487 488 489
#endif /* USE_GTK_TOOLTIP */

#endif /* USE_GTK */
Jan Djärv's avatar
Jan Djärv committed
490

491 492 493
  /* If >=0, a bitmap index.  The indicated bitmap is used for the
     icon. */
  int icon_bitmap;
Jim Blandy's avatar
Jim Blandy committed
494

495
  /* Default ASCII font of this frame.  */
496
  struct font *font;
497

498 499
  /* The baseline offset of the default ASCII font.  */
  int baseline_offset;
500 501 502 503 504

  /* If a fontset is specified for this frame instead of font, this
     value contains an ID of the fontset, else -1.  */
  int fontset;

Jim Blandy's avatar
Jim Blandy committed
505 506
  /* Pixel values used for various purposes.
     border_pixel may be -1 meaning use a gray tile.  */
Karoly Lorentey's avatar
Karoly Lorentey committed
507
#if 0 /* These are also defined in struct frame.  Use that instead.  */
508 509
  unsigned long background_pixel;
  unsigned long foreground_pixel;
Karoly Lorentey's avatar
Karoly Lorentey committed
510
#endif
511 512 513 514
  unsigned long cursor_pixel;
  unsigned long border_pixel;
  unsigned long mouse_pixel;
  unsigned long cursor_foreground_pixel;
Jim Blandy's avatar
Jim Blandy committed
515

516 517 518
  /* Foreground color for scroll bars.  A value of -1 means use the
     default (black for non-toolkit scroll bars).  */
  unsigned long scroll_bar_foreground_pixel;
519

520 521 522 523 524
  /* Background color for scroll bars.  A value of -1 means use the
     default (background color of the frame for non-toolkit scroll
     bars).  */
  unsigned long scroll_bar_background_pixel;

525 526 527 528 529
  /* Top and bottom shadow colors for 3d toolkit scrollbars.  -1 means
     let the scroll compute them itself.  */
  unsigned long scroll_bar_top_shadow_pixel;
  unsigned long scroll_bar_bottom_shadow_pixel;

Jim Blandy's avatar
Jim Blandy committed
530 531 532 533
  /* Descriptor for the cursor in use for this window.  */
  Cursor text_cursor;
  Cursor nontext_cursor;
  Cursor modeline_cursor;
534
  Cursor hand_cursor;
535
  Cursor hourglass_cursor;
536
  Cursor horizontal_drag_cursor;
537
  Cursor current_cursor;
538

539 540 541
  /* Window whose cursor is hourglass_cursor.  This window is temporarily
     mapped to display an hourglass cursor.  */
  Window hourglass_window;
542

543 544
  /* Non-zero means hourglass cursor is currently displayed.  */
  unsigned hourglass_p : 1;
Jim Blandy's avatar
Jim Blandy committed
545

546
  /* Flag to set when the X window needs to be completely repainted.  */
Jim Blandy's avatar
Jim Blandy committed
547 548
  int needs_exposure;

Jim Blandy's avatar
Jim Blandy committed
549 550 551 552 553 554 555 556 557 558 559 560
  /* These are the current window manager hints.  It seems that
     XSetWMHints, when presented with an unset bit in the `flags'
     member of the hints structure, does not leave the corresponding
     attribute unchanged; rather, it resets that attribute to its
     default value.  For example, unless you set the `icon_pixmap'
     field and the `IconPixmapHint' bit, XSetWMHints will forget what
     your icon pixmap was.  This is rather troublesome, since some of
     the members (for example, `input' and `icon_pixmap') want to stay
     the same throughout the execution of Emacs.  So, we keep this
     structure around, just leaving values in it and adding new bits
     to the mask as we go.  */
  XWMHints wm_hints;
561

562
  /* This is the Emacs structure for the X display this frame is on.  */
563
  struct x_display_info *display_info;
564

565
  /* This is a button event that wants to activate the menubar.
566 567
     We save it here until the command loop gets to think about it.  */
  XEvent *saved_menu_event;
568 569 570 571 572 573

  /* This is the widget id used for this frame's menubar in lwlib.  */
#ifdef USE_X_TOOLKIT
  int id;
#endif

574 575 576
  /* Nonzero means our parent is another application's window
     and was explicitly specified.  */
  char explicit_parent;
577 578 579

  /* Nonzero means tried already to make this frame visible.  */
  char asked_for_visible;
580

581 582 583
  /* Nonzero if this frame was ever previously visible.  */
  char has_been_visible;

584 585 586
#ifdef HAVE_X_I18N
  /* Input context (currently, this means Compose key handler setup).  */
  XIC xic;
587 588
  XIMStyle xic_style;
  XFontSet xic_xfs;
589
  char *xic_base_fontname;
590
#endif
591

592 593 594 595 596 597 598 599 600 601 602 603
  /* Relief GCs, colors etc.  */
  struct relief
  {
    GC gc;
    unsigned long pixel;
    int allocated_p;
  }
  black_relief, white_relief;

  /* The background for which the above relief GCs were set up.
     They are changed only when a different background is involved.  */
  unsigned long relief_background;
604 605 606 607 608 609 610

  /* Xt waits for a ConfigureNotify event from the window manager in
     EmacsFrameSetCharSize when the shell widget is resized.  For some
     window managers like fvwm2 2.2.5 and KDE 2.1 this event doesn't
     arrive for an unknown reason and Emacs hangs in Xt.  If this is
     zero, tell Xt not to wait.  */
  int wait_for_wm;
611 612 613 614

  /* As x_pixels_diff, but to FRAME_OUTER_WINDOW.  For some reason the
     two might differ by a pixel, depending on WM */
  int x_pixels_outer_diff;
615

616 617 618 619
  /* As y_pixels_diff, but to FRAME_OUTER_WINDOW.  In the toolkit version,
     these may differ because this does not take into account possible
     menubar.  y_pixels_diff is with menubar height included */
  int y_pixels_outer_diff;
620 621 622 623 624

  /* Keep track of focus.  May be EXPLICIT if we received a FocusIn for this
     frame, or IMPLICIT if we received an EnterNotify.
     FocusOut and LeaveNotify clears EXPLICIT/IMPLICIT. */
  int focus_state;
Kenichi Handa's avatar
Kenichi Handa committed
625 626 627 628 629

  /* The offset we need to add to compensate for type A WMs.  */
  int move_offset_top;
  int move_offset_left;

630 631 632 633
  /* The frame's left/top offsets before we call XMoveWindow.  See
     x_check_expected_move.  */
  int left_before_move;
  int top_before_move;
634 635
};

636 637
#define No_Cursor (None)

638 639 640
enum
{
  /* Values for focus_state, used as bit mask.
Jan Djärv's avatar
Jan Djärv committed
641
     EXPLICIT means we received a FocusIn for the frame and know it has
642 643 644 645 646 647 648 649 650
     the focus.  IMPLICIT means we recevied an EnterNotify and the frame
     may have the focus if no window manager is running.
     FocusOut and LeaveNotify clears EXPLICIT/IMPLICIT. */
  FOCUS_NONE     = 0,
  FOCUS_IMPLICIT = 1,
  FOCUS_EXPLICIT = 2
};


651 652 653
/* Return the X output data for frame F.  */
#define FRAME_X_OUTPUT(f) ((f)->output_data.x)

654
/* Return the X window used for displaying data in frame F.  */
655
#define FRAME_X_WINDOW(f) ((f)->output_data.x->window_desc)
Jim Blandy's avatar
Jim Blandy committed
656

657 658
/* Return the outermost X window associated with the frame F.  */
#ifdef USE_X_TOOLKIT
659 660 661
#define FRAME_OUTER_WINDOW(f) ((f)->output_data.x->widget ?             \
                               XtWindow ((f)->output_data.x->widget) :  \
                               FRAME_X_WINDOW (f))
662
#else
Jan Djärv's avatar
Jan Djärv committed
663
#ifdef USE_GTK
664 665 666 667 668 669 670 671 672 673 674 675 676
/* Functions not present in older Gtk+ */

#ifndef HAVE_GTK_WIDGET_GET_WINDOW
#define gtk_widget_get_window(w) ((w)->window)
#endif
#ifndef HAVE_GTK_WIDGET_GET_MAPPED
#define gtk_widget_get_mapped(w) (GTK_WIDGET_MAPPED (w))
#endif
#ifndef HAVE_GTK_ADJUSTMENT_GET_PAGE_SIZE
#define gtk_adjustment_get_page_size(w) ((w)->page_size)
#define gtk_adjustment_get_upper(w) ((w)->upper)
#endif

677 678 679 680 681 682 683 684 685 686 687
#ifdef HAVE_GTK3
#define DEFAULT_GDK_DISPLAY() \
  gdk_x11_display_get_xdisplay (gdk_display_get_default ())
#else
#undef GDK_WINDOW_XID
#define GDK_WINDOW_XID(w) GDK_WINDOW_XWINDOW (w)
#define DEFAULT_GDK_DISPLAY() GDK_DISPLAY ()
#define gtk_widget_get_preferred_size(a, ign, b) \
  gtk_widget_size_request(a, b)
#endif

Jan Djärv's avatar
Jan Djärv committed
688
#define GTK_WIDGET_TO_X_WIN(w) \
689
  ((w) && gtk_widget_get_window (w) \
690
   ? GDK_WINDOW_XID (gtk_widget_get_window (w)) : 0)
Jan Djärv's avatar
Jan Djärv committed
691 692 693 694 695 696 697 698 699

#define FRAME_GTK_OUTER_WIDGET(f) ((f)->output_data.x->widget)
#define FRAME_GTK_WIDGET(f) ((f)->output_data.x->edit_widget)
#define FRAME_OUTER_WINDOW(f)                                   \
       (FRAME_GTK_OUTER_WIDGET (f) ?                            \
        GTK_WIDGET_TO_X_WIN (FRAME_GTK_OUTER_WIDGET (f)) :      \
         FRAME_X_WINDOW (f))

#else /* !USE_GTK */
700
#define FRAME_OUTER_WINDOW(f) (FRAME_X_WINDOW (f))
Jan Djärv's avatar
Jan Djärv committed
701
#endif /* !USE_GTK */
702 703
#endif

Jan Djärv's avatar
Jan Djärv committed
704

705
#define FRAME_FONT(f) ((f)->output_data.x->font)
706
#define FRAME_FONTSET(f) ((f)->output_data.x->fontset)
707
#define FRAME_MENUBAR_HEIGHT(f) ((f)->output_data.x->menubar_height)
708 709 710 711 712 713 714 715 716
#define FRAME_TOOLBAR_TOP_HEIGHT(f) ((f)->output_data.x->toolbar_top_height)
#define FRAME_TOOLBAR_BOTTOM_HEIGHT(f) \
  ((f)->output_data.x->toolbar_bottom_height)
#define FRAME_TOOLBAR_HEIGHT(f) \
  (FRAME_TOOLBAR_TOP_HEIGHT (f) + FRAME_TOOLBAR_BOTTOM_HEIGHT (f))
#define FRAME_TOOLBAR_LEFT_WIDTH(f) ((f)->output_data.x->toolbar_left_width)
#define FRAME_TOOLBAR_RIGHT_WIDTH(f) ((f)->output_data.x->toolbar_right_width)
#define FRAME_TOOLBAR_WIDTH(f) \
  (FRAME_TOOLBAR_LEFT_WIDTH (f) + FRAME_TOOLBAR_RIGHT_WIDTH (f))
717
#define FRAME_BASELINE_OFFSET(f) ((f)->output_data.x->baseline_offset)
718

719
/* This gives the x_display_info structure for the display F is on.  */
720
#define FRAME_X_DISPLAY_INFO(f) ((f)->output_data.x->display_info)
721 722

/* This is the `Display *' which frame F is on.  */
723 724 725 726
#define FRAME_X_DISPLAY(f) (FRAME_X_DISPLAY_INFO (f)->display)

/* This is the `Screen *' which frame F is on.  */
#define FRAME_X_SCREEN(f) (FRAME_X_DISPLAY_INFO (f)->screen)
727
#define FRAME_X_SCREEN_NUMBER(f) XScreenNumberOfScreen (FRAME_X_SCREEN (f))
728

729 730 731 732 733 734
/* This is the Visual which frame F is on.  */
#define FRAME_X_VISUAL(f) FRAME_X_DISPLAY_INFO (f)->visual

/* This is the Colormap which frame F uses.  */
#define FRAME_X_COLORMAP(f) FRAME_X_DISPLAY_INFO (f)->cmap

735 736 737
/* This is the 'font_info *' which frame F has.  */
#define FRAME_X_FONT_TABLE(f) (FRAME_X_DISPLAY_INFO (f)->font_table)

Jan Djärv's avatar
Jan Djärv committed
738 739 740 741 742 743 744
/* The difference in pixels between the top left corner of the
   Emacs window (including possible window manager decorations)
   and FRAME_X_WINDOW (f).  */
#define FRAME_OUTER_TO_INNER_DIFF_X(f) \
     ((f)->output_data.x->x_pixels_outer_diff)
#define FRAME_OUTER_TO_INNER_DIFF_Y(f)          \
     ((f)->output_data.x->y_pixels_outer_diff   \
Jan Djärv's avatar
Jan Djärv committed
745
      + FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f))
Jan Djärv's avatar
Jan Djärv committed
746 747


748
#define FRAME_XIC(f) ((f)->output_data.x->xic)
749 750 751 752
#define FRAME_X_XIM(f) (FRAME_X_DISPLAY_INFO (f)->xim)
#define FRAME_X_XIM_STYLES(f) (FRAME_X_DISPLAY_INFO (f)->xim_styles)
#define FRAME_XIC_STYLE(f) ((f)->output_data.x->xic_style)
#define FRAME_XIC_FONTSET(f) ((f)->output_data.x->xic_xfs)
753
#define FRAME_XIC_BASE_FONTNAME(f) ((f)->output_data.x->xic_base_fontname)
754 755 756 757 758 759 760 761 762 763

/* Value is the smallest width of any character in any font on frame F.  */

#define FRAME_SMALLEST_CHAR_WIDTH(F) \
     FRAME_X_DISPLAY_INFO(F)->smallest_char_width

/* Value is the smallest height of any font on frame F.  */

#define FRAME_SMALLEST_FONT_HEIGHT(F) \
     FRAME_X_DISPLAY_INFO(F)->smallest_font_height
764

765
/* X-specific scroll bar stuff.  */
766

767
/* We represent scroll bars as lisp vectors.  This allows us to place
768
   references to them in windows without worrying about whether we'll
769
   end up with windows referring to dead scroll bars; the garbage
770 771
   collector will free it when its time comes.

772
   We use struct scroll_bar as a template for accessing fields of the
773 774
   vector.  */

775 776
struct scroll_bar
{
777
  /* These fields are shared by all vectors.  */
778
  EMACS_INT size_from_Lisp_Vector_struct;
779 780
  struct Lisp_Vector *next_from_Lisp_Vector_struct;

781
  /* The window we're a scroll bar for.  */
782
  Lisp_Object window;
783

784
  /* The next and previous in the chain of scroll bars in this frame.  */
785
  Lisp_Object next, prev;
786

787 788 789 790
  /* Fields from `x_window' down will not be traced by the GC.  */

  /* The X window representing this scroll bar.  */
  Window x_window;
791

792
  /* The position and size of the scroll bar in pixels, relative to the
793
     frame.  */
794
  int top, left, width, height;
795

796 797
  /* The starting and ending positions of the handle, relative to the
     handle area (i.e. zero is the top position, not
798
     SCROLL_BAR_TOP_BORDER).  If they're equal, that means the handle
799
     hasn't been drawn yet.
800

801 802 803
     These are not actually the locations where the beginning and end
     are drawn; in order to keep handles from becoming invisible when
     editing large files, we establish a minimum height by always
804
     drawing handle bottoms VERTICAL_SCROLL_BAR_MIN_HANDLE pixels below
805 806
     where they would be normally; the bottom and top are in a
     different co-ordinate system.  */
807
  int start, end;
808

809
  /* If the scroll bar handle is currently being dragged by the user,
810 811
     this is the number of pixels from the top of the handle to the
     place where the user grabbed it.  If the handle isn't currently
812 813
     being dragged, this is Qnil.  */
  Lisp_Object dragging;
814

815
  /* 1 if the background of the fringe that is adjacent to a scroll
816
     bar is extended to the gap between the fringe and the bar.  */
817
  unsigned int fringe_extended_p : 1;
818 819
};

820
/* The number of elements a vector holding a struct scroll_bar needs.  */
821 822 823
#define SCROLL_BAR_VEC_SIZE					\
  ((sizeof (struct scroll_bar)					\
    - sizeof (EMACS_INT) - sizeof (struct Lisp_Vector *))	\
824 825
   / sizeof (Lisp_Object))

826
/* Turning a lisp vector value into a pointer to a struct scroll_bar.  */
827
#define XSCROLL_BAR(vec) ((struct scroll_bar *) XVECTOR (vec))
828 829


830 831 832 833 834
/* Extract the X widget of the scroll bar from a struct scroll_bar.
   XtWindowToWidget should be fast enough since Xt uses a hash table
   to map windows to widgets.  */

#define SCROLL_BAR_X_WIDGET(dpy, ptr) \
835
  XtWindowToWidget (dpy, ptr->x_window)
836 837

/* Store a widget id in a struct scroll_bar.  */
838 839 840 841

#define SET_SCROLL_BAR_X_WIDGET(ptr, w)		\
  do {						\
    Window window = XtWindow (w);		\
842
    ptr->x_window = window;			\
843
} while (0)
844

845

846
/* Return the inside width of a vertical scroll bar, given the outside
847
   width.  */
848 849 850 851
#define VERTICAL_SCROLL_BAR_INSIDE_WIDTH(f, width) \
  ((width) \
   - VERTICAL_SCROLL_BAR_LEFT_BORDER \
   - VERTICAL_SCROLL_BAR_RIGHT_BORDER \
852
   - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2)
853

854 855
/* Return the length of the rectangle within which the top of the
   handle must stay.  This isn't equivalent to the inside height,
856
   because the scroll bar handle has a minimum height.
857

858 859 860
   This is the real range of motion for the scroll bar, so when we're
   scaling buffer positions to scroll bar positions, we use this, not
   VERTICAL_SCROLL_BAR_INSIDE_HEIGHT.  */
861 862
#define VERTICAL_SCROLL_BAR_TOP_RANGE(f, height) \
  (VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (f, height) - VERTICAL_SCROLL_BAR_MIN_HANDLE)
863

864 865
/* Return the inside height of vertical scroll bar, given the outside
   height.  See VERTICAL_SCROLL_BAR_TOP_RANGE too.  */
866
#define VERTICAL_SCROLL_BAR_INSIDE_HEIGHT(f, height) \
867
  ((height) - VERTICAL_SCROLL_BAR_TOP_BORDER - VERTICAL_SCROLL_BAR_BOTTOM_BORDER)
868 869


870
/* Border widths for scroll bars.
871

872
   Scroll bar windows don't have any X borders; their border width is
873 874 875
   set to zero, and we redraw borders ourselves.  This makes the code
   a bit cleaner, since we don't have to convert between outside width
   (used when relating to the rest of the screen) and inside width
876
   (used when sizing and drawing the scroll bar window itself).
877

878
   The handle moves up and down/back and forth in a rectangle inset
879 880 881
   from the edges of the scroll bar.  These are widths by which we
   inset the handle boundaries from the scroll bar edges.  */
#define VERTICAL_SCROLL_BAR_LEFT_BORDER (2)
882
#define VERTICAL_SCROLL_BAR_RIGHT_BORDER (2)
883 884
#define VERTICAL_SCROLL_BAR_TOP_BORDER (2)
#define VERTICAL_SCROLL_BAR_BOTTOM_BORDER (2)
885

886 887
/* Minimum lengths for scroll bar handles, in pixels.  */
#define VERTICAL_SCROLL_BAR_MIN_HANDLE (5)
888

889
/* Trimming off a few pixels from each side prevents
890
   text from glomming up against the scroll bar */
891
#define VERTICAL_SCROLL_BAR_WIDTH_TRIM (0)
892

893

Pavel Janík's avatar
Pavel Janík committed
894 895
/* If a struct input_event has a kind which is SELECTION_REQUEST_EVENT
   or SELECTION_CLEAR_EVENT, then its contents are really described
896 897
   by this structure.  */

Pavel Janík's avatar
Pavel Janík committed
898
/* For an event of kind SELECTION_REQUEST_EVENT,
Richard M. Stallman's avatar
Richard M. Stallman committed
899 900 901 902
   this structure really describes the contents.
   **Don't make this struct longer!**
   If it overlaps the frame_or_window field of struct input_event,
   that will cause GC to crash.  */
903 904 905 906
struct selection_input_event
{
  int kind;
  Display *display;
Richard M. Stallman's avatar
Richard M. Stallman committed
907 908
  /* We spell it with an "o" here because X does.  */
  Window requestor;
909 910 911 912 913 914
  Atom selection, target, property;
  Time time;
};

#define SELECTION_EVENT_DISPLAY(eventp)	\
  (((struct selection_input_event *) (eventp))->display)
Richard M. Stallman's avatar
Richard M. Stallman committed
915 916 917
/* We spell it with an "o" here because X does.  */
#define SELECTION_EVENT_REQUESTOR(eventp)	\
  (((struct selection_input_event *) (eventp))->requestor)
918 919 920 921 922 923 924 925
#define SELECTION_EVENT_SELECTION(eventp)	\
  (((struct selection_input_event *) (eventp))->selection)
#define SELECTION_EVENT_TARGET(eventp)	\
  (((struct selection_input_event *) (eventp))->target)
#define SELECTION_EVENT_PROPERTY(eventp)	\
  (((struct selection_input_event *) (eventp))->property)
#define SELECTION_EVENT_TIME(eventp)	\
  (((struct selection_input_event *) (eventp))->time)
926 927


Andreas Schwab's avatar
Andreas Schwab committed
928
struct window;
929 930
struct glyph_matrix;
struct frame;
Andreas Schwab's avatar
Andreas Schwab committed
931
struct input_event;
932 933
struct face;
struct image;
Andreas Schwab's avatar
Andreas Schwab committed
934

935 936
/* From xselect.c.  */

Jan D's avatar
Jan D committed
937 938
void x_handle_selection_notify (XSelectionEvent *);
void x_handle_property_notify (XPropertyEvent *);
939 940 941

/* From xfns.c.  */

Jan D's avatar
Jan D committed
942
struct frame *check_x_frame (Lisp_Object);
943
EXFUN (Fx_display_grayscale_p, 1);
Jan D's avatar
Jan D committed
944
extern void x_free_gcs (struct frame *);
945 946
extern int gray_bitmap_width, gray_bitmap_height;
extern char *gray_bitmap_bits;
947 948 949

/* From xrdb.c.  */

950 951
XrmDatabase x_load_resources (Display *, const char *, const char *,
			      const char *);
952

Andreas Schwab's avatar
Andreas Schwab committed
953 954
/* Defined in xterm.c */

955
extern int x_text_icon (struct frame *, const char *);
Jan D's avatar
Jan D committed
956 957
extern int x_bitmap_icon (struct frame *, Lisp_Object);
extern void x_catch_errors (Display *);
958
extern void x_check_errors (Display *, const char *);
Jan D's avatar
Jan D committed
959 960 961 962 963 964 965 966 967 968 969 970 971 972 973
extern int x_had_errors_p (Display *);
extern int x_catching_errors (void);
extern void x_uncatch_errors (void);
extern void x_clear_errors (Display *);
extern void x_set_window_size (struct frame *, int, int, int);
extern void x_set_mouse_position (struct frame *, int, int);
extern void x_set_mouse_pixel_position (struct frame *, int, int);
extern void x_ewmh_activate_frame (struct frame *);
extern void x_make_frame_visible (struct frame *);
extern void x_make_frame_invisible (struct frame *);
extern void x_iconify_frame (struct frame *);
extern void x_free_frame_resources (struct frame *);
extern void x_wm_set_size_hint (struct frame *, long, int);
extern void x_delete_terminal (struct terminal *terminal);
extern unsigned long x_copy_color (struct frame *, unsigned long);
974 975
#ifdef USE_X_TOOLKIT
extern XtAppContext Xt_app_con;
976 977 978
extern int x_alloc_lighter_color_for_widget (Widget, Display *, Colormap,
                                             unsigned long *,
                                             double, int);
Jan D's avatar
Jan D committed
979
extern void x_activate_timeout_atimer (void);
980
#endif
Andreas Schwab's avatar
Andreas Schwab committed
981
extern int x_alloc_nearest_color (struct frame *, Colormap, XColor *);
Jan D's avatar
Jan D committed
982 983 984
extern void x_query_colors (struct frame *f, XColor *, int);
extern void x_query_color (struct frame *f, XColor *);
extern void x_clear_area (Display *, Window, int, int, int, int, int);
985
#if defined HAVE_MENUS && !defined USE_X_TOOLKIT && !defined USE_GTK
986
extern void x_mouse_leave (struct x_display_info *);
987
#endif
Andreas Schwab's avatar
Andreas Schwab committed
988

989
#ifdef USE_X_TOOLKIT
Jan D's avatar
Jan D committed
990
extern int x_dispatch_event (XEvent *, Display *);
991
#endif
992
extern EMACS_INT x_x_to_emacs_modifiers (struct x_display_info *, int);
Jan D's avatar
Jan D committed
993 994
extern int x_display_pixel_height (struct x_display_info *);
extern int x_display_pixel_width (struct x_display_info *);
995

Jan D's avatar
Jan D committed
996 997
extern void x_set_sticky (struct frame *, Lisp_Object, Lisp_Object);
extern void x_wait_for_event (struct frame *, int);
998

Andreas Schwab's avatar
Andreas Schwab committed
999 1000
/* Defined in xselect.c */

Jan D's avatar
Jan D committed
1001 1002 1003 1004 1005
extern void x_handle_property_notify (XPropertyEvent *);
extern void x_handle_selection_notify (XSelectionEvent *);
extern void x_handle_selection_event (struct input_event *);
extern void x_clear_frame_selections (struct frame *);

1006 1007 1008 1009 1010 1011 1012
extern void x_send_client_event (Lisp_Object display,
                                 Lisp_Object dest,
                                 Lisp_Object from,
                                 Atom message_type,
                                 Lisp_Object format,
                                 Lisp_Object values);

Jan D's avatar
Jan D committed
1013 1014 1015 1016 1017 1018 1019 1020 1021 1022
extern int x_handle_dnd_message (struct frame *,
                                 XClientMessageEvent *,
                                 struct x_display_info *,
                                 struct input_event *bufp);
extern int x_check_property_data (Lisp_Object);
extern void x_fill_property_data (Display *,
                                  Lisp_Object,
                                  void *,
                                  int);
extern Lisp_Object x_property_data_to_lisp (struct frame *,
1023
                                            const unsigned char *,
Jan D's avatar
Jan D committed
1024 1025 1026
                                            Atom,
                                            int,
                                            unsigned long);
1027
extern void x_clipboard_manager_save_frame (Lisp_Object);
1028
extern void x_clipboard_manager_save_all (void);
Kenichi Handa's avatar
Kenichi Handa committed
1029

Andreas Schwab's avatar
Andreas Schwab committed
1030 1031
/* Defined in xfns.c */

Chong Yidong's avatar
Chong Yidong committed
1032
extern struct x_display_info * check_x_display_info (Lisp_Object);