+struct x_display_info
+{
+ /* Chain of all x_display_info structures. */
+ struct x_display_info *next;
+ /* Connection number (normally a file descriptor number). */
+ int connection;
+ /* This says how to access this display in Xlib. */
+ Display *display;
+ /* 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;
+ /* Number of frames that are on this display. */
+ int reference_count;
+ /* The Screen this connection is connected to. */
+ Screen *screen;
+ /* The Visual being used for this display. */
+ Visual *visual;
+ /* Number of panes on this screen. */
+ int n_planes;
+ /* Dimensions of this screen. */
+ int height, width;
+ /* Mask of things that cause the mouse to be grabbed. */
+ int grabbed;
+ /* Emacs bitmap-id of the default icon bitmap for this frame.
+ Or -1 if none has been allocated yet. */
+ int icon_bitmap_id;
+ /* The root window of this screen. */
+ Window root_window;
+ /* The cursor to use for vertical scroll bars. */
+ Cursor vertical_scroll_bar_cursor;
+ /* X Resource data base */
+ XrmDatabase xrdb;
+
+ /* A table of all the fonts we have already loaded. */
+ struct font_info *font_table;
+
+ /* The current capacity of x_font_table. */
+ int font_table_size;
+
+ /* Reusable Graphics Context for drawing a cursor in a non-default face. */
+ GC scratch_cursor_gc;
+
+ /* These variables describe the range of text currently shown
+ in its mouse-face, together with the window they apply to.
+ As long as the mouse stays within this range, we need not
+ redraw anything on its account. */
+ int mouse_face_beg_row, mouse_face_beg_col;
+ int mouse_face_end_row, mouse_face_end_col;
+ int mouse_face_past_end;
+ Lisp_Object mouse_face_window;
+ int mouse_face_face_id;
+
+ /* 1 if a mouse motion event came and we didn't handle it right away because
+ gc was in progress. */
+ int mouse_face_deferred_gc;
+
+ /* FRAME and X, Y position of mouse when last checked for
+ highlighting. X and Y can be negative or out of range for the frame. */
+ struct frame *mouse_face_mouse_frame;
+ int mouse_face_mouse_x, mouse_face_mouse_y;
+
+ /* Nonzero means defer mouse-motion highlighting. */
+ int mouse_face_defer;
+
+ char *x_id_name;
+
+ /* The number of fonts actually stored in x_font_table.
+ font_table[n] is used and valid iff 0 <= n < n_fonts.
+ 0 <= n_fonts <= font_table_size. */
+ 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;
+
+ /* 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;
+ /* Kinds of protocol things we may receive. */
+ Atom Xatom_wm_take_focus;
+ Atom Xatom_wm_save_yourself;
+ Atom Xatom_wm_delete_window;
+ /* Atom for indicating window state to the window manager. */
+ Atom Xatom_wm_change_state;
+ /* Other WM communication */
+ Atom Xatom_wm_configure_denied; /* When our config request is denied */
+ Atom Xatom_wm_window_moved; /* When the WM moves us. */
+ /* EditRes protocol */
+ Atom Xatom_editres;
+
+ /* More atoms, which are selection types. */
+ Atom Xatom_CLIPBOARD, Xatom_TIMESTAMP, Xatom_TEXT, Xatom_DELETE,
+ Xatom_COMPOUND_TEXT,
+ Xatom_MULTIPLE, Xatom_INCR, Xatom_EMACS_TMP, Xatom_TARGETS, Xatom_NULL,
+ Xatom_ATOM_PAIR;
+
+ /* More atoms for font properties. The last three are private
+ properties, see the comments in src/fontset.h. */
+ Atom Xatom_PIXEL_SIZE,
+ Xatom_MULE_BASELINE_OFFSET, Xatom_MULE_RELATIVE_COMPOSE,
+ Xatom_MULE_DEFAULT_ASCENT;
+
+#ifdef MULTI_KBOARD
+ struct kboard *kboard;
+#endif
+ int cut_buffers_initialized; /* Whether we're sure they all exist */
+
+ /* 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;
+
+ /* The null pixel used for filling a character background with
+ background color of a gc. */
+ Pixmap null_pixel;
+};