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

This file is part of GNU Emacs.

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

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

20 21 22
#ifndef XTERM_H
#define XTERM_H

Jim Blandy's avatar
Jim Blandy committed
23 24
#include <X11/Xlib.h>
#include <X11/cursorfont.h>
Kim F. Storm's avatar
Kim F. Storm committed
25 26 27 28

/* 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
29
#include <X11/keysym.h>
30
#include <X11/Xutil.h>
Kim F. Storm's avatar
Kim F. Storm committed
31

Jim Blandy's avatar
Jim Blandy committed
32 33 34
#include <X11/Xatom.h>
#include <X11/Xresource.h>

35 36 37 38
#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
39
				   window inside a widget instead of one
40
				   that Xt creates... */
Jan Djärv's avatar
Jan Djärv committed
41 42 43 44 45 46 47 48 49 50
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))
51
#undef XSync
52 53
#define XSync(d, b) do { gdk_window_process_all_updates (); \
                         XSync (d, b);  } while (0)
54 55 56 57 58 59 60 61 62 63 64 65 66 67
#endif /* USE_GTK */

/* True iff GTK's version is at least I.J.K.  */
#ifndef GTK_CHECK_VERSION
# ifdef USE_GTK
#  define GTK_CHECK_VERSION(i, j, k) \
     ((i) \
      < GTK_MAJOR_VERSION + ((j) \
			     < GTK_MINOR_VERSION + ((k) \
						    <= GTK_MICRO_VERSION)))
# else
#  define GTK_CHECK_VERSION(i, j, k) 0
# endif
#endif
68

69
/* The GtkTooltip API came in 2.12, but gtk-enable-tooltips in 2.14. */
70
#if GTK_CHECK_VERSION (2, 14, 0)
71 72
#define USE_GTK_TOOLTIP
#endif
Jan Djärv's avatar
Jan Djärv committed
73

74
#ifdef HAVE_X_I18N
75 76
#include <X11/Xlocale.h>
#endif
77 78 79 80

#include "dispextern.h"
#include "termhooks.h"

81 82 83 84 85
/* Black and white pixel values for the screen which frame F is on.  */
#define BLACK_PIX_DEFAULT(f)					\
  BlackPixel (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f))
#define WHITE_PIX_DEFAULT(f)					\
  WhitePixel (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f))
Jim Blandy's avatar
Jim Blandy committed
86 87

/* The mask of events that text windows always want to receive.  This
88 89
   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
90 91 92 93 94

#define STANDARD_EVENT_SET      \
  (KeyPressMask			\
   | ExposureMask		\
   | ButtonPressMask		\
Jim Blandy's avatar
Jim Blandy committed
95 96
   | ButtonReleaseMask		\
   | PointerMotionMask		\
Jim Blandy's avatar
Jim Blandy committed
97 98 99 100 101 102
   | StructureNotifyMask	\
   | FocusChangeMask		\
   | LeaveWindowMask		\
   | EnterWindowMask		\
   | VisibilityChangeMask)

103 104 105 106 107 108 109 110 111
#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
112 113 114 115 116 117
/* 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;
118
  int have_mask;
119
  Pixmap mask;
Richard M. Stallman's avatar
Richard M. Stallman committed
120 121 122 123 124
  char *file;
  int refcount;
  /* Record some info about this pixmap.  */
  int height, width, depth;
};
125 126 127

/* For each X display, we have a structure that records
   information about it.  */
Jim Blandy's avatar
Jim Blandy committed
128

129
struct x_display_info
130
{
Richard M. Stallman's avatar
Richard M. Stallman committed
131
  /* Chain of all x_display_info structures.  */
132
  struct x_display_info *next;
133

134 135 136
  /* The generic display parameters corresponding to this X display. */
  struct terminal *terminal;

137
  /* This says how to access this display in Xlib.  */
138
  Display *display;
139

140
  /* This is a cons cell of the form (NAME . FONT-LIST-CACHE).  */
Richard M. Stallman's avatar
Richard M. Stallman committed
141
  Lisp_Object name_list_element;
142

143 144
  /* Number of frames that are on this display.  */
  int reference_count;
145

146 147
  /* The Screen this connection is connected to.  */
  Screen *screen;
148 149 150

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

152 153
  /* The Visual being used for this display.  */
  Visual *visual;
154

Pavel Janík's avatar
Pavel Janík committed
155
  /* The colormap being used.  */
156
  Colormap cmap;
157

158
  /* Number of planes on this screen.  */
159
  int n_planes;
160

161 162
  /* Mask of things that cause the mouse to be grabbed.  */
  int grabbed;
163

164 165
  /* Emacs bitmap-id of the default icon bitmap for this frame.
     Or -1 if none has been allocated yet.  */
166
  ptrdiff_t icon_bitmap_id;
167

168 169
  /* The root window of this screen.  */
  Window root_window;
170

Kenichi Handa's avatar
Kenichi Handa committed
171 172 173
  /* Client leader window.  */
  Window client_leader_window;

Richard M. Stallman's avatar
Richard M. Stallman committed
174 175
  /* The cursor to use for vertical scroll bars.  */
  Cursor vertical_scroll_bar_cursor;
176

177 178 179
  /* The invisible cursor used for pointer blanking.  */
  Cursor invisible_cursor;

Kenichi Handa's avatar
Kenichi Handa committed
180 181 182 183 184
#ifdef USE_GTK
  /* The GDK cursor for scroll bars and popup menus.  */
  GdkCursor *xg_cursor;
#endif

185 186 187
  /* X Resource data base */
  XrmDatabase xrdb;

188 189 190 191 192 193
  /* 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
194 195 196
  /* Reusable Graphics Context for drawing a cursor in a non-default face. */
  GC scratch_cursor_gc;

197 198 199
  /* Information about the range of text currently shown in
     mouse-face.  */
  Mouse_HLInfo mouse_highlight;
200

Richard M. Stallman's avatar
Richard M. Stallman committed
201 202
  char *x_id_name;

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

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

  /* Allocated size of bitmaps field.  */
210
  ptrdiff_t bitmaps_size;
Richard M. Stallman's avatar
Richard M. Stallman committed
211 212

  /* Last used bitmap index.  */
213
  ptrdiff_t bitmaps_last;
Richard M. Stallman's avatar
Richard M. Stallman committed
214

215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
  /* 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;
241

242 243 244 245
  /* Kinds of protocol things we may receive.  */
  Atom Xatom_wm_take_focus;
  Atom Xatom_wm_save_yourself;
  Atom Xatom_wm_delete_window;
246

247 248
  /* Atom for indicating window state to the window manager.  */
  Atom Xatom_wm_change_state;
249

250 251 252
  /* 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
253
  Atom Xatom_wm_client_leader;    /* Id of client leader window.  */
254

255 256 257 258 259
  /* EditRes protocol */
  Atom Xatom_editres;

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

264
  /* More atoms for font properties.  The last three are private
265
     properties, see the comments in src/fontset.h.  */
266
  Atom Xatom_PIXEL_SIZE, Xatom_AVERAGE_WIDTH,
267 268
  Xatom_MULE_BASELINE_OFFSET, Xatom_MULE_RELATIVE_COMPOSE,
  Xatom_MULE_DEFAULT_ASCENT;
269

270 271 272 273 274 275
  /* More atoms for Ghostscript support.  */
  Atom Xatom_DONE, Xatom_PAGE;

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

276
  /* Atom used in XEmbed client messages.  */
277 278
  Atom Xatom_XEMBED, Xatom_XEMBED_INFO;

279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
  /* 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;
298 299 300

  /* The frame waiting to be auto-raised in XTread_socket.  */
  struct frame *x_pending_autoraise_frame;
301

302
  /* The frame where the mouse was last time we reported a ButtonPress event.  */
303 304
  struct frame *last_mouse_frame;

305 306 307
  /* The frame where the mouse was last time we reported a mouse position.  */
  struct frame *last_mouse_glyph_frame;

308 309 310
  /* The frame where the mouse was last time we reported a mouse motion.  */
  struct frame *last_mouse_motion_frame;

311 312 313
  /* The scroll bar in which the last X motion event occurred.  */
  struct scroll_bar *last_mouse_scroll_bar;

314 315 316
  /* Time of last user interaction as returned in X events on this display.  */
  Time last_user_time;

317 318 319 320 321
  /* Position where the mouse was last time we reported a motion.
     This is a position on last_mouse_motion_frame.  */
  int last_mouse_motion_x;
  int last_mouse_motion_y;

322 323 324 325 326 327 328 329 330 331 332 333
  /* Where the mouse was last time we reported a mouse position.
     This is a rectangle on last_mouse_glyph_frame.  */
  XRectangle last_mouse_glyph;

  /* Time of last mouse movement on this display.  This is a hack because
     we would really prefer that XTmouse_position would return the time
     associated with the position it returns, but there doesn't seem to be
     any way to wrest the time-stamp from the server along with the position
     query.  So, we just keep track of the time of the last movement we
     received, and return that in hopes that it's somewhat accurate.  */
  Time last_mouse_movement_time;

334 335 336
  /* The gray pixmap.  */
  Pixmap gray;

337 338 339 340
#ifdef HAVE_X_I18N
  /* XIM (X Input method).  */
  XIM xim;
  XIMStyles *xim_styles;
341
  struct xim_inst_t *xim_callback_data;
342
#endif
343 344 345 346 347

  /* 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
348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364

  /* 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;
365 366


367 368
  /* Atoms that are drag and drop atoms */
  Atom *x_dnd_atoms;
369 370
  ptrdiff_t x_dnd_atoms_size;
  ptrdiff_t x_dnd_atoms_length;
371

372
  /* Extended window manager hints, Atoms supported by the window manager and
Juanma Barranquero's avatar
Juanma Barranquero committed
373
     atoms for setting the window type.  */
374
  Atom Xatom_net_supported, Xatom_net_supporting_wm_check;
375 376 377
  Atom *net_supported_atoms;
  int nr_net_supported_atoms;
  Window net_supported_window;
378
  Atom Xatom_net_window_type, Xatom_net_window_type_tooltip;
379
  Atom Xatom_net_active_window;
380

381
  /* Atoms dealing with EWMH (i.e. _NET_...) */
382
  Atom Xatom_net_wm_state, Xatom_net_wm_state_fullscreen,
383
    Xatom_net_wm_state_maximized_horz, Xatom_net_wm_state_maximized_vert,
384
    Xatom_net_wm_state_sticky, Xatom_net_wm_state_hidden,
385 386
    Xatom_net_frame_extents,
    Xatom_net_current_desktop, Xatom_net_workarea;
387 388 389 390

  /* XSettings atoms and windows.  */
  Atom Xatom_xsettings_sel, Xatom_xsettings_prop, Xatom_xsettings_mgr;
  Window xsettings_window;
391 392 393

  /* Frame name and icon name */
  Atom Xatom_net_wm_name, Xatom_net_wm_icon_name;
394 395 396 397 398
  /* Frame opacity */
  Atom Xatom_net_wm_window_opacity;

  /* SM */
  Atom Xatom_SM_CLIENT_ID;
399
};
400

Dave Love's avatar
Dave Love committed
401 402 403 404 405
#ifdef HAVE_X_I18N
/* Whether or not to use XIM if we have it.  */
extern int use_xim;
#endif

406 407 408
/* This is a chain of structures for all the X displays currently in use.  */
extern struct x_display_info *x_display_list;

Jan D's avatar
Jan D committed
409
extern struct x_display_info *x_display_info_for_display (Display *);
410
extern struct frame *x_top_window_to_frame (struct x_display_info *, int);
Jan D's avatar
Jan D committed
411
extern struct x_display_info *x_term_init (Lisp_Object, char *, char *);
412
extern bool x_display_ok (const char *);
413

Jan D's avatar
Jan D committed
414
extern void select_visual (struct x_display_info *);
415

416 417
/* 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
418 419
   the information that is specific to X windows.  */

420
struct x_output
Jim Blandy's avatar
Jim Blandy committed
421
{
422 423 424 425 426 427
  /* 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;

428 429 430 431 432 433 434 435 436
  /* 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
437

438
  /* The tiled border used when the mouse is out of the frame.  */
Jim Blandy's avatar
Jim Blandy committed
439 440
  Pixmap border_tile;

441
  /* Here are the Graphics Contexts for the default font.  */
Jim Blandy's avatar
Jim Blandy committed
442 443 444 445
  GC normal_gc;				/* Normal video */
  GC reverse_gc;			/* Reverse video */
  GC cursor_gc;				/* cursor drawing */

Jim Blandy's avatar
Jim Blandy committed
446 447
  /* The X window used for this frame.
     May be zero while the frame object is being created
Jim Blandy's avatar
Jim Blandy committed
448 449 450 451 452 453 454 455
     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.
456 457 458
     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
459 460
  Window parent_desc;

461 462 463 464 465 466 467 468 469 470 471 472
#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
473 474 475 476 477 478 479 480
#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;
481 482
  /* The widget used for laying out widgets horizontally.  */
  GtkWidget *hbox_widget;
Jan Djärv's avatar
Jan Djärv committed
483 484 485 486
  /* The menubar in this frame.  */
  GtkWidget *menubar_widget;
  /* The tool bar in this frame  */
  GtkWidget *toolbar_widget;
487 488
#ifdef HAVE_GTK_HANDLE_BOX_NEW
/* The handle box that makes the tool bar detachable.  */
Jan Djärv's avatar
Jan Djärv committed
489
  GtkWidget *handlebox_widget;
490
#endif
491
  /* Non-zero if tool bar is packed into the hbox widget (i.e. vertical).  */
492 493
  bool toolbar_in_hbox;
  bool toolbar_is_packed;
494

Jan Djärv's avatar
Jan Djärv committed
495 496 497
  /* The last size hints set.  */
  GdkGeometry size_hints;
  long hint_flags;
498

499
#ifdef USE_GTK_TOOLTIP
500 501 502
  GtkTooltip *ttip_widget;
  GtkWidget *ttip_lbl;
  GtkWindow *ttip_window;
503 504 505
#endif /* USE_GTK_TOOLTIP */

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

507 508
  /* If >=0, a bitmap index.  The indicated bitmap is used for the
     icon. */
509
  ptrdiff_t icon_bitmap;
Jim Blandy's avatar
Jim Blandy committed
510

511
  /* Default ASCII font of this frame.  */
512
  struct font *font;
513

514 515
  /* The baseline offset of the default ASCII font.  */
  int baseline_offset;
516 517 518 519 520

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

521 522 523 524
  unsigned long cursor_pixel;
  unsigned long border_pixel;
  unsigned long mouse_pixel;
  unsigned long cursor_foreground_pixel;
Jim Blandy's avatar
Jim Blandy committed
525

526 527 528
  /* 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;
529

530 531 532 533 534
  /* 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;

535 536 537 538 539
  /* 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
540 541 542 543
  /* Descriptor for the cursor in use for this window.  */
  Cursor text_cursor;
  Cursor nontext_cursor;
  Cursor modeline_cursor;
544
  Cursor hand_cursor;
545
  Cursor hourglass_cursor;
546
  Cursor horizontal_drag_cursor;
547
  Cursor vertical_drag_cursor;
548
  Cursor current_cursor;
549

550 551 552
  /* Window whose cursor is hourglass_cursor.  This window is temporarily
     mapped to display an hourglass cursor.  */
  Window hourglass_window;
553

554 555
  /* Non-zero means hourglass cursor is currently displayed.  */
  unsigned hourglass_p : 1;
Jim Blandy's avatar
Jim Blandy committed
556

Jim Blandy's avatar
Jim Blandy committed
557 558 559 560 561 562 563 564 565 566 567 568
  /* 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;
569

570
  /* This is the Emacs structure for the X display this frame is on.  */
571
  struct x_display_info *display_info;
572

573
  /* This is a button event that wants to activate the menubar.
574 575
     We save it here until the command loop gets to think about it.  */
  XEvent *saved_menu_event;
576 577 578 579 580 581

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

582 583
  /* Nonzero means our parent is another application's window
     and was explicitly specified.  */
584
  unsigned explicit_parent : 1;
585 586

  /* Nonzero means tried already to make this frame visible.  */
587
  unsigned asked_for_visible : 1;
588

589
  /* Nonzero if this frame was ever previously visible.  */
590
  unsigned has_been_visible : 1;
591

592 593 594
#ifdef HAVE_X_I18N
  /* Input context (currently, this means Compose key handler setup).  */
  XIC xic;
595 596
  XIMStyle xic_style;
  XFontSet xic_xfs;
597
#endif
598

599 600 601 602 603 604 605 606 607 608 609
  /* Relief GCs, colors etc.  */
  struct relief
  {
    GC gc;
    unsigned long pixel;
  }
  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;
610 611 612 613 614 615 616

  /* 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;
617 618 619 620

  /* 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;
621

622 623 624 625
  /* 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;
626 627 628 629 630

  /* 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
631 632 633 634 635

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

636
  /* Non-zero if _NET_WM_STATE_HIDDEN is set for this frame.  */
637
  unsigned net_wm_state_hidden_seen : 1;
638 639
};

640 641
#define No_Cursor (None)

642 643 644
enum
{
  /* Values for focus_state, used as bit mask.
Jan Djärv's avatar
Jan Djärv committed
645
     EXPLICIT means we received a FocusIn for the frame and know it has
Paul Eggert's avatar
Paul Eggert committed
646
     the focus.  IMPLICIT means we received an EnterNotify and the frame
647 648 649 650 651 652 653 654
     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
};


655 656 657
/* Return the X output data for frame F.  */
#define FRAME_X_OUTPUT(f) ((f)->output_data.x)

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

661 662
/* Return the outermost X window associated with the frame F.  */
#ifdef USE_X_TOOLKIT
663 664 665
#define FRAME_OUTER_WINDOW(f) ((f)->output_data.x->widget ?             \
                               XtWindow ((f)->output_data.x->widget) :  \
                               FRAME_X_WINDOW (f))
666
#else
Jan Djärv's avatar
Jan Djärv committed
667
#ifdef USE_GTK
668 669 670 671 672 673 674 675 676 677 678 679 680
/* 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

681 682 683 684 685 686 687 688
#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) \
Juanma Barranquero's avatar
Juanma Barranquero committed
689
  gtk_widget_size_request (a, b)
690 691
#endif

Jan Djärv's avatar
Jan Djärv committed
692
#define GTK_WIDGET_TO_X_WIN(w) \
693
  ((w) && gtk_widget_get_window (w) \
694
   ? GDK_WINDOW_XID (gtk_widget_get_window (w)) : 0)
Jan Djärv's avatar
Jan Djärv committed
695 696 697 698 699 700 701 702 703

#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 */
704
#define FRAME_OUTER_WINDOW(f) (FRAME_X_WINDOW (f))
Jan Djärv's avatar
Jan Djärv committed
705
#endif /* !USE_GTK */
706 707
#endif

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

709
#define FRAME_FONT(f) ((f)->output_data.x->font)
710
#define FRAME_FONTSET(f) ((f)->output_data.x->fontset)
711
#define FRAME_MENUBAR_HEIGHT(f) ((f)->output_data.x->menubar_height)
712 713 714 715 716 717 718 719 720
#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))
721
#define FRAME_BASELINE_OFFSET(f) ((f)->output_data.x->baseline_offset)
722

723
/* This gives the x_display_info structure for the display F is on.  */
724
#define FRAME_DISPLAY_INFO(f) ((f)->output_data.x->display_info)
725 726

/* This is the `Display *' which frame F is on.  */
727
#define FRAME_X_DISPLAY(f) (FRAME_DISPLAY_INFO (f)->display)
728 729

/* This is the `Screen *' which frame F is on.  */
730
#define FRAME_X_SCREEN(f) (FRAME_DISPLAY_INFO (f)->screen)
731 732

/* This is the screen index number of screen which frame F is on.  */
733
#define FRAME_X_SCREEN_NUMBER(f) XScreenNumberOfScreen (FRAME_X_SCREEN (f))
734

735
/* This is the Visual which frame F is on.  */
736
#define FRAME_X_VISUAL(f) FRAME_DISPLAY_INFO (f)->visual
737 738

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

Jan Djärv's avatar
Jan Djärv committed
741 742 743 744 745 746 747
/* 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
748
      + FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f))
Jan Djärv's avatar
Jan Djärv committed
749 750


751
#define FRAME_XIC(f) ((f)->output_data.x->xic)
752 753
#define FRAME_X_XIM(f) (FRAME_DISPLAY_INFO (f)->xim)
#define FRAME_X_XIM_STYLES(f) (FRAME_DISPLAY_INFO (f)->xim_styles)
754 755
#define FRAME_XIC_STYLE(f) ((f)->output_data.x->xic_style)
#define FRAME_XIC_FONTSET(f) ((f)->output_data.x->xic_xfs)
756

757
/* X-specific scroll bar stuff.  */
758

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

764
   We use struct scroll_bar as a template for accessing fields of the
765 766
   vector.  */

767 768
struct scroll_bar
{
769
  /* These fields are shared by all vectors.  */
770
  struct vectorlike_header header;
771

772
  /* The window we're a scroll bar for.  */
773
  Lisp_Object window;
774

775
  /* The next and previous in the chain of scroll bars in this frame.  */
776
  Lisp_Object next, prev;
777

778 779 780 781
  /* Fields from `x_window' down will not be traced by the GC.  */

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

783
  /* The position and size of the scroll bar in pixels, relative to the
784
     frame.  */
785
  int top, left, width, height;
786

787 788
  /* The starting and ending positions of the handle, relative to the
     handle area (i.e. zero is the top position, not
789
     SCROLL_BAR_TOP_BORDER).  If they're equal, that means the handle
790
     hasn't been drawn yet.
791

792 793 794
     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
795
     drawing handle bottoms VERTICAL_SCROLL_BAR_MIN_HANDLE pixels below
796 797
     where they would be normally; the bottom and top are in a
     different co-ordinate system.  */
798
  int start, end;
799

800
  /* If the scroll bar handle is currently being dragged by the user,
801 802
     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
803 804
     being dragged, this is -1.  */
  int dragging;
805

806 807 808 809
#if defined (USE_TOOLKIT_SCROLL_BARS) && defined (USE_LUCID)
  /* Last scroll bar part seen in xaw_jump_callback and xaw_scroll_callback.  */
  enum scroll_bar_part last_seen_part;
#endif
810 811
};

812
/* Turning a lisp vector value into a pointer to a struct scroll_bar.  */
813
#define XSCROLL_BAR(vec) ((struct scroll_bar *) XVECTOR (vec))
814

815
#ifdef USE_X_TOOLKIT
816

817 818 819 820 821
/* 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) \
822
  XtWindowToWidget (dpy, ptr->x_window)
823 824

/* Store a widget id in a struct scroll_bar.  */
825 826 827 828

#define SET_SCROLL_BAR_X_WIDGET(ptr, w)		\
  do {						\
    Window window = XtWindow (w);		\
829
    ptr->x_window = window;			\
830
} while (0)
831

832
#endif /* USE_X_TOOLKIT */
833

834
/* Return the inside width of a vertical scroll bar, given the outside
835
   width.  */
836 837 838
#define VERTICAL_SCROLL_BAR_INSIDE_WIDTH(f, width) \
  ((width) \
   - VERTICAL_SCROLL_BAR_LEFT_BORDER \
839
   - VERTICAL_SCROLL_BAR_RIGHT_BORDER)
840

841 842
/* Return the length of the rectangle within which the top of the
   handle must stay.  This isn't equivalent to the inside height,
843
   because the scroll bar handle has a minimum height.
844

845 846 847
   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.  */
848 849
#define VERTICAL_SCROLL_BAR_TOP_RANGE(f, height) \
  (VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (f, height) - VERTICAL_SCROLL_BAR_MIN_HANDLE)
850

851 852
/* Return the inside height of vertical scroll bar, given the outside
   height.  See VERTICAL_SCROLL_BAR_TOP_RANGE too.  */
853
#define VERTICAL_SCROLL_BAR_INSIDE_HEIGHT(f, height) \
854
  ((height) - VERTICAL_SCROLL_BAR_TOP_BORDER - VERTICAL_SCROLL_BAR_BOTTOM_BORDER)
855 856


857
/* Border widths for scroll bars.
858

859
   Scroll bar windows don't have any X borders; their border width is
860 861 862
   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
863
   (used when sizing and drawing the scroll bar window itself).
864

865
   The handle moves up and down/back and forth in a rectangle inset
866 867 868
   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)
869
#define VERTICAL_SCROLL_BAR_RIGHT_BORDER (2)
870 871
#define VERTICAL_SCROLL_BAR_TOP_BORDER (2)
#define VERTICAL_SCROLL_BAR_BOTTOM_BORDER (2)
872

873 874
/* Minimum lengths for scroll bar handles, in pixels.  */
#define VERTICAL_SCROLL_BAR_MIN_HANDLE (5)
875

Pavel Janík's avatar
Pavel Janík committed
876 877
/* If a struct input_event has a kind which is SELECTION_REQUEST_EVENT
   or SELECTION_CLEAR_EVENT, then its contents are really described
878 879
   by this structure.  */

Pavel Janík's avatar
Pavel Janík committed
880
/* For an event of kind SELECTION_REQUEST_EVENT,
881 882
   this structure really describes the contents.  */

883 884 885 886
struct selection_input_event
{
  int kind;
  Display *display;
Richard M. Stallman's avatar
Richard M. Stallman committed
887 888
  /* We spell it with an "o" here because X does.  */
  Window requestor;
889 890 891 892 893 894
  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
895 896 897
/* We spell it with an "o" here because X does.  */
#define SELECTION_EVENT_REQUESTOR(eventp)	\
  (((struct selection_input_event *) (eventp))->requestor)
898 899 900 901 902 903 904 905
#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)
906

907 908
/* From xfns.c.  */

Jan D's avatar
Jan D committed
909
extern void x_free_gcs (struct frame *);
910 911 912

/* From xrdb.c.  */

913 914
XrmDatabase x_load_resources (Display *, const char *, const char *,
			      const char *);
915

Andreas Schwab's avatar
Andreas Schwab committed
916 917
/* Defined in xterm.c */

918
extern int x_text_icon (struct frame *, const char *);
Jan D's avatar
Jan D committed
919
extern void x_catch_errors (Display *);
920 921
extern void x_check_errors (Display *, const char *)
  ATTRIBUTE_FORMAT_PRINTF (2, 0);
922
extern bool x_had_errors_p (Display *);
Jan D's avatar
Jan D committed
923 924
extern void x_uncatch_errors (void);
extern void x_clear_errors (Display *);
925
extern void x_set_window_size (struct frame *, int, int, int, bool);
Jan D's avatar
Jan D committed
926 927
extern void x_set_mouse_position (struct frame *, int, int);
extern void x_set_mouse_pixel_position (struct frame *, int, int);
928
extern void xembed_request_focus (struct frame *);
Jan D's avatar
Jan D committed
929 930 931
extern void x_ewmh_activate_frame (struct frame *);
extern void x_delete_terminal (struct terminal *terminal);
extern unsigned long x_copy_color (struct frame *, unsigned long);
932 933
#ifdef USE_X_TOOLKIT
extern XtAppContext Xt_app_con;
934 935 936
extern void x_activate_timeout_atimer (void);
#endif
#ifdef USE_LUCID
937 938 939
extern bool x_alloc_lighter_color_for_widget (Widget, Display *, Colormap,
					      unsigned long *,
					      double, int);