summaryrefslogtreecommitdiff
path: root/src/xterm.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/xterm.h')
-rw-r--r--src/xterm.h764
1 files changed, 656 insertions, 108 deletions
diff --git a/src/xterm.h b/src/xterm.h
index 6274630706f..d6ff15e40f7 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -1,5 +1,5 @@
/* Definitions and headers for communication with X protocol.
- Copyright (C) 1989, 1993-1994, 1998-2017 Free Software Foundation,
+ Copyright (C) 1989, 1993-1994, 1998-2022 Free Software Foundation,
Inc.
This file is part of GNU Emacs.
@@ -32,6 +32,10 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include <X11/Xatom.h>
#include <X11/Xresource.h>
+#ifdef HAVE_XINPUT2
+#include <X11/extensions/XInput2.h>
+#endif
+
#ifdef USE_X_TOOLKIT
#include <X11/StringDefs.h>
#include <X11/IntrinsicP.h> /* CoreP.h needs this */
@@ -50,17 +54,12 @@ typedef Widget xt_or_gtk_widget;
#include <gdk/gdkx.h>
#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) false
-# endif
+#ifndef USE_GTK
+#define GTK_CHECK_VERSION(i, j, k) false
+#endif
+
+#ifdef HAVE_XRENDER
+#include <X11/extensions/Xrender.h>
#endif
#ifdef USE_GTK
@@ -76,10 +75,8 @@ typedef GtkWidget *xt_or_gtk_widget;
#endif
#endif /* USE_GTK */
-/* The GtkTooltip API came in 2.12, but gtk-enable-tooltips in 2.14. */
-#if GTK_CHECK_VERSION (2, 14, 0)
-#define USE_GTK_TOOLTIP
-#endif
+/* Number of "failable requests" to store. */
+#define N_FAILABLE_REQUESTS 128
#ifdef USE_CAIRO
#include <cairo-xlib.h>
@@ -92,6 +89,9 @@ typedef GtkWidget *xt_or_gtk_widget;
#ifdef CAIRO_HAS_SVG_SURFACE
#include <cairo-svg.h>
#endif
+#ifdef USE_CAIRO_XCB
+#include <cairo-xcb.h>
+#endif
#endif
#ifdef HAVE_X_I18N
@@ -102,6 +102,14 @@ typedef GtkWidget *xt_or_gtk_widget;
#include <X11/Xlib-xcb.h>
#endif
+#ifdef HAVE_XKB
+#include <X11/XKBlib.h>
+#endif
+
+#ifdef HAVE_XSYNC
+#include <X11/extensions/sync.h>
+#endif
+
#include "dispextern.h"
#include "termhooks.h"
@@ -127,6 +135,7 @@ INLINE_HEADER_BEGIN
| FocusChangeMask \
| LeaveWindowMask \
| EnterWindowMask \
+ | PropertyChangeMask \
| VisibilityChangeMask)
#ifdef HAVE_X11R6_XIM
@@ -138,13 +147,28 @@ struct xim_inst_t
};
#endif /* HAVE_X11R6_XIM */
+#ifdef HAVE_XINPUT2
+#if HAVE_XISCROLLCLASSINFO_TYPE && defined XIScrollClass
+#define HAVE_XINPUT2_1
+#endif
+#if HAVE_XITOUCHCLASSINFO_TYPE && defined XITouchClass
+#define HAVE_XINPUT2_2
+#endif
+#if HAVE_XIBARRIERRELEASEPOINTERINFO_DEVICEID && defined XIBarrierPointerReleased
+#define HAVE_XINPUT2_3
+#endif
+#if HAVE_XIGESTURECLASSINFO_TYPE && defined XIGestureClass
+#define HAVE_XINPUT2_4
+#endif
+#endif
+
/* Structure recording X pixmap and reference count.
If REFCOUNT is 0 then this record is free to be reused. */
struct x_bitmap_record
{
#ifdef USE_CAIRO
- void *img;
+ cairo_pattern_t *stipple;
#endif
Pixmap pixmap;
bool have_mask;
@@ -155,7 +179,7 @@ struct x_bitmap_record
int height, width, depth;
};
-#ifdef USE_CAIRO
+#if defined USE_CAIRO || defined HAVE_XRENDER
struct x_gc_ext_data
{
#define MAX_CLIP_RECTS 2
@@ -167,17 +191,123 @@ struct x_gc_ext_data
};
#endif
+#ifdef USE_CAIRO
+extern cairo_pattern_t *x_bitmap_stipple (struct frame *, Pixmap);
+#endif
+
struct color_name_cache_entry
{
struct color_name_cache_entry *next;
+
+ /* The color values of the cached color entry. */
XColor rgb;
+
+ /* The name of the cached color. */
char *name;
+
+ /* Whether or not RGB is valid (i.e. the color actually exists). */
+ bool_bf valid : 1;
};
+#ifdef HAVE_XINPUT2
+
+#ifdef HAVE_XINPUT2_1
+struct xi_scroll_valuator_t
+{
+ bool invalid_p;
+ bool pending_enter_reset;
+ double current_value;
+ double emacs_value;
+ double increment;
+
+ int number;
+ int horizontal;
+};
+#endif
+
+#ifdef HAVE_XINPUT2_2
+struct xi_touch_point_t
+{
+ struct xi_touch_point_t *next;
+
+ int number;
+ double x, y;
+};
+#endif
+
+struct xi_device_t
+{
+ /* The numerical ID of this device. */
+ int device_id;
+
+#ifdef HAVE_XINPUT2_1
+ /* The number of scroll valuators in `valuators'. */
+ int scroll_valuator_count;
+#endif
+
+ /* Whether or not the device is grabbed and its use. */
+ int grab, use;
+
+ /* The attached device. Only valid if USE is some kind of master
+ device. */
+ int attachment;
+
+#ifdef HAVE_XINPUT2_2
+ /* Whether or not this device is a direct touch device. */
+ bool direct_p;
+#endif
+
+#ifdef HAVE_XINPUT2_1
+ /* An array of scroll valuators Emacs knows about. */
+ struct xi_scroll_valuator_t *valuators;
+#endif
+
+#ifdef HAVE_XINPUT2_2
+ /* An array of in-progress touchscreen events. */
+ struct xi_touch_point_t *touchpoints;
+#endif
+
+ /* The name of this device. */
+ Lisp_Object name;
+
+ /* The time at which `focus_frame' became the keyboard focus (only
+ applies to master devices). */
+ Time focus_frame_time;
+
+ /* The frame that is currently this device's keyboard focus, or
+ NULL. */
+ struct frame *focus_frame;
+
+ /* The time at which `focus_frame' became the implicit keyboard
+ focus. */
+ Time focus_implicit_time;
+
+ /* The frame that is currently this device's implicit keyboard
+ focus, or NULL. */
+ struct frame *focus_implicit_frame;
+
+ /* The window on which the last motion event happened. */
+ Window last_motion_window;
+
+ /* The rounded integer coordinates of the last motion event. */
+ int last_motion_x, last_motion_y;
+};
+#endif
+
Status x_parse_color (struct frame *f, const char *color_name,
XColor *color);
+struct x_failable_request
+{
+ /* The first request making up this sequence. */
+ unsigned long start;
+
+ /* If this is zero, then the request has not yet been made.
+ Otherwise, this is the request that ends this sequence. */
+ unsigned long end;
+};
+
/* For each X display, we have a structure that records
information about it. */
@@ -211,6 +341,14 @@ struct x_display_info
/* The Visual being used for this display. */
Visual *visual;
+ /* The visual information corresponding to VISUAL. */
+ XVisualInfo visual_info;
+
+#ifdef HAVE_XRENDER
+ /* The picture format for this display. */
+ XRenderPictFormat *pict_format;
+#endif
+
/* The colormap being used. */
Colormap cmap;
@@ -240,8 +378,10 @@ struct x_display_info
Unused if this display supports Xfixes extension. */
Cursor invisible_cursor;
- /* Function used to toggle pointer visibility on this display. */
- void (*toggle_visible_pointer) (struct frame *, bool);
+#ifdef HAVE_XFIXES
+ /* Whether or not to use Xfixes for pointer blanking. */
+ bool fixes_pointer_blanking;
+#endif
#ifdef USE_GTK
/* The GDK cursor for scroll bars and popup menus. */
@@ -249,7 +389,7 @@ struct x_display_info
#endif
/* X Resource data base */
- XrmDatabase xrdb;
+ XrmDatabase rdb;
/* Minimum width over all characters in all fonts in font_table. */
int smallest_char_width;
@@ -301,10 +441,10 @@ struct x_display_info
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;
+ unsigned 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;
+ unsigned alt_mod_mask, super_mod_mask, hyper_mod_mask;
/* Communication with window managers. */
Atom Xatom_wm_protocols;
@@ -316,26 +456,30 @@ struct x_display_info
/* Atom for indicating window state to the window manager. */
Atom Xatom_wm_change_state;
+ Atom Xatom_wm_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. */
Atom Xatom_wm_client_leader; /* Id of client leader window. */
+ Atom Xatom_wm_transient_for; /* Id of whatever window we are
+ transient for. */
/* EditRes protocol */
Atom Xatom_editres;
/* More atoms, which are selection types. */
Atom Xatom_CLIPBOARD, Xatom_TIMESTAMP, Xatom_TEXT, Xatom_DELETE,
- Xatom_COMPOUND_TEXT, Xatom_UTF8_STRING,
- Xatom_MULTIPLE, Xatom_INCR, Xatom_EMACS_TMP, Xatom_TARGETS, Xatom_NULL,
- Xatom_ATOM, Xatom_ATOM_PAIR, Xatom_CLIPBOARD_MANAGER;
+ Xatom_COMPOUND_TEXT, Xatom_UTF8_STRING,
+ Xatom_MULTIPLE, Xatom_INCR, Xatom_EMACS_TMP, Xatom_TARGETS, Xatom_NULL,
+ Xatom_ATOM, Xatom_ATOM_PAIR, Xatom_CLIPBOARD_MANAGER,
+ Xatom_EMACS_SERVER_TIME_PROP;
/* More atoms for font properties. The last three are private
properties, see the comments in src/fontset.h. */
Atom Xatom_PIXEL_SIZE, Xatom_AVERAGE_WIDTH,
- Xatom_MULE_BASELINE_OFFSET, Xatom_MULE_RELATIVE_COMPOSE,
- Xatom_MULE_DEFAULT_ASCENT;
+ Xatom_MULE_BASELINE_OFFSET, Xatom_MULE_RELATIVE_COMPOSE,
+ Xatom_MULE_DEFAULT_ASCENT;
/* More atoms for Ghostscript support. */
Atom Xatom_DONE, Xatom_PAGE;
@@ -346,6 +490,25 @@ struct x_display_info
/* Atom used in XEmbed client messages. */
Atom Xatom_XEMBED, Xatom_XEMBED_INFO;
+ /* Atom used to determine whether or not the screen is composited. */
+ Atom Xatom_NET_WM_CM_Sn;
+
+ /* Atoms used by the Motif drag and drop protocols. */
+ Atom Xatom_MOTIF_WM_HINTS, Xatom_MOTIF_DRAG_WINDOW,
+ Xatom_MOTIF_DRAG_TARGETS, Xatom_MOTIF_DRAG_AND_DROP_MESSAGE,
+ Xatom_MOTIF_DRAG_INITIATOR_INFO, Xatom_MOTIF_DRAG_RECEIVER_INFO;
+
+ /* Atoms used by Emacs internally. */
+ Atom Xatom_EMACS_DRAG_ATOM;
+
+ /* Special selections used by the Motif drop protocol to indicate
+ success or failure. */
+ Atom Xatom_XmTRANSFER_SUCCESS, Xatom_XmTRANSFER_FAILURE;
+
+ /* Atoms used by both versions of the OffiX DND protocol (the "old
+ KDE" protocol in x-dnd.el). */
+ Atom Xatom_DndProtocol, Xatom_DND_PROTOCOL;
+
/* 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
@@ -356,7 +519,10 @@ struct x_display_info
/* 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. */
+ received a FocusIn event for it.
+
+ This field is not used when the input extension is being
+ utilized. */
struct frame *x_focus_event_frame;
/* The frame which currently has the visual highlight, and should get
@@ -364,7 +530,7 @@ struct x_display_info
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;
+ struct frame *highlight_frame;
/* The frame waiting to be auto-raised in XTread_socket. */
struct frame *x_pending_autoraise_frame;
@@ -381,7 +547,8 @@ struct x_display_info
/* The scroll bar in which the last X motion event occurred. */
struct scroll_bar *last_mouse_scroll_bar;
- /* Time of last user interaction as returned in X events on this display. */
+ /* Time of last user interaction as returned in X events on this
+ display. */
Time last_user_time;
/* Position where the mouse was last time we reported a motion.
@@ -401,6 +568,9 @@ struct x_display_info
received, and return that in hopes that it's somewhat accurate. */
Time last_mouse_movement_time;
+ /* Whether or not the last mouse motion was synthetic. */
+ bool last_mouse_movement_time_send_event;
+
/* The gray pixmap. */
Pixmap gray;
@@ -409,10 +579,17 @@ struct x_display_info
XIM xim;
XIMStyles *xim_styles;
struct xim_inst_t *xim_callback_data;
+ XIMStyle preferred_xim_style;
#endif
/* A cache mapping color names to RGB values. */
- struct color_name_cache_entry *color_names;
+ struct color_name_cache_entry **color_names;
+
+ /* The number of buckets for each hash in that hash table. */
+ ptrdiff_t *color_names_length;
+
+ /* The size of that hash table. */
+ int color_names_size;
/* If non-null, a cache of the colors in the color map. Don't
use this directly, call x_color_cells instead. */
@@ -420,8 +597,9 @@ struct x_display_info
int ncolor_cells;
/* 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;
+ int red_bits, blue_bits, green_bits, alpha_bits;
+ int red_offset, blue_offset, green_offset, alpha_offset;
+ unsigned long alpha_mask;
/* 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
@@ -442,6 +620,23 @@ struct x_display_info
ptrdiff_t x_dnd_atoms_size;
ptrdiff_t x_dnd_atoms_length;
+ /* The unique drag and drop atom used on Motif. None if it was not
+ already computed. */
+ Atom motif_drag_atom;
+
+ /* Its name. */
+ char motif_drag_atom_name[sizeof "_EMACS_ATOM_%lu" - 3
+ + INT_STRLEN_BOUND (unsigned long)];
+
+ /* When it was owned. */
+ Time motif_drag_atom_time;
+
+ /* The frame that currently owns `motif_drag_atom'. */
+ struct frame *motif_drag_atom_owner;
+
+ /* The drag window for this display. */
+ Window motif_drag_window;
+
/* Extended window manager hints, Atoms supported by the window manager and
atoms for setting the window type. */
Atom Xatom_net_supported, Xatom_net_supporting_wm_check;
@@ -456,7 +651,13 @@ struct x_display_info
Xatom_net_wm_state_maximized_horz, Xatom_net_wm_state_maximized_vert,
Xatom_net_wm_state_sticky, Xatom_net_wm_state_above, Xatom_net_wm_state_below,
Xatom_net_wm_state_hidden, Xatom_net_wm_state_skip_taskbar,
- Xatom_net_frame_extents, Xatom_net_current_desktop, Xatom_net_workarea;
+ Xatom_net_wm_state_shaded, Xatom_net_frame_extents, Xatom_net_current_desktop,
+ Xatom_net_workarea, Xatom_net_wm_opaque_region, Xatom_net_wm_ping,
+ Xatom_net_wm_sync_request, Xatom_net_wm_sync_request_counter,
+ Xatom_net_wm_sync_fences, Xatom_net_wm_frame_drawn, Xatom_net_wm_frame_timings,
+ Xatom_net_wm_user_time, Xatom_net_wm_user_time_window,
+ Xatom_net_client_list_stacking, Xatom_net_wm_pid,
+ Xatom_net_wm_bypass_compositor;
/* XSettings atoms and windows. */
Atom Xatom_xsettings_sel, Xatom_xsettings_prop, Xatom_xsettings_mgr;
@@ -470,22 +671,174 @@ struct x_display_info
/* SM */
Atom Xatom_SM_CLIENT_ID;
+ /* DND source. */
+ Atom Xatom_XdndAware, Xatom_XdndSelection, Xatom_XdndTypeList,
+ Xatom_XdndActionCopy, Xatom_XdndActionMove, Xatom_XdndActionLink,
+ Xatom_XdndActionAsk, Xatom_XdndActionPrivate, Xatom_XdndActionList,
+ Xatom_XdndActionDescription, Xatom_XdndProxy, Xatom_XdndEnter,
+ Xatom_XdndPosition, Xatom_XdndStatus, Xatom_XdndLeave, Xatom_XdndDrop,
+ Xatom_XdndFinished;
+
+ /* XDS source and target. */
+ Atom Xatom_XdndDirectSave0, Xatom_XdndActionDirectSave, Xatom_text_plain;
+
+#ifdef HAVE_XKB
+ /* Virtual modifiers */
+ Atom Xatom_Meta, Xatom_Super, Xatom_Hyper, Xatom_ShiftLock, Xatom_Alt;
+#endif
+
+ /* Core modifier map when XKB is not present. */
+ XModifierKeymap *modmap;
+
#ifdef HAVE_XRANDR
+ bool xrandr_supported_p;
+ int xrandr_event_base;
+ int xrandr_error_base;
int xrandr_major_version;
int xrandr_minor_version;
#endif
-#ifdef USE_CAIRO
+#if defined HAVE_XRANDR || defined USE_GTK
+ /* This is used to determine if the monitor configuration really
+ changed upon receiving a monitor change event. */
+ Lisp_Object last_monitor_attributes_list;
+#endif
+
+#if defined USE_CAIRO || defined HAVE_XRENDER
XExtCodes *ext_codes;
#endif
#ifdef USE_XCB
xcb_connection_t *xcb_connection;
+ xcb_visualtype_t *xcb_visual;
#endif
#ifdef HAVE_XDBE
bool supports_xdbe;
#endif
+
+#ifdef HAVE_XINPUT2
+ bool supports_xi2;
+
+ /* The minor version of the input extension. (Major is always
+ 2.x.) */
+ int xi2_version;
+
+ /* The generic event opcode of XI2 events. */
+ int xi2_opcode;
+
+ /* The number of devices on this display known to Emacs. */
+ int num_devices;
+
+ /* Array of all input extension devices on this display known to
+ Emacs. */
+ struct xi_device_t *devices;
+
+ /* Pending keystroke time. */
+ Time pending_keystroke_time;
+
+ /* Pending keystroke source. If a core KeyPress event arrives with
+ the same timestamp as pending_keystroke_time, it will be treated
+ as originating from this device. */
+ int pending_keystroke_source;
+
+#if defined USE_GTK && !defined HAVE_GTK3
+ /* This means the two variables above shouldn't be reset the first
+ time a KeyPress event arrives, since they were set from a raw key
+ press event that was sent before the first (real, not sent by an
+ input method) core key event. */
+ bool pending_keystroke_time_special_p;
+#endif
+
+ /* The client pointer. We keep a record client-side to avoid
+ calling XISetClientPointer all the time. */
+ int client_pointer_device;
+#endif
+
+#ifdef HAVE_XKB
+ bool supports_xkb;
+ int xkb_event_type;
+ XkbDescPtr xkb_desc;
+#endif
+
+#ifdef USE_GTK
+ bool prefer_native_input;
+#endif
+
+#ifdef HAVE_XRENDER
+ bool xrender_supported_p;
+ int xrender_major;
+ int xrender_minor;
+#endif
+
+#ifdef HAVE_XFIXES
+ bool xfixes_supported_p;
+ int xfixes_major;
+ int xfixes_minor;
+#endif
+
+#ifdef HAVE_XSYNC
+ bool xsync_supported_p;
+ int xsync_major;
+ int xsync_minor;
+#endif
+
+#ifdef HAVE_XINERAMA
+ bool xinerama_supported_p;
+#endif
+
+#ifdef HAVE_XCOMPOSITE
+ bool composite_supported_p;
+ int composite_major;
+ int composite_minor;
+#endif
+
+#ifdef HAVE_XSHAPE
+ bool xshape_supported_p;
+ int xshape_major;
+ int xshape_minor;
+ int xshape_event_base;
+ int xshape_error_base;
+#endif
+
+#ifdef USE_TOOLKIT_SCROLL_BARS
+ Lisp_Object *protected_windows;
+ int n_protected_windows;
+ int protected_windows_max;
+#endif
+
+ /* The current dimensions of the screen. This is updated when a
+ ConfigureNotify is received for the root window, and is zero if
+ that didn't happen. */
+ int screen_width;
+ int screen_height;
+
+ /* The mm width and height of the screen. Updated on
+ RRScreenChangeNotify. */
+ int screen_mm_width;
+ int screen_mm_height;
+
+ /* Circular buffer of request serial ranges to ignore inside an
+ error handler in increasing order. */
+ struct x_failable_request failable_requests[N_FAILABLE_REQUESTS];
+
+ /* Pointer to the next request in `failable_requests'. */
+ struct x_failable_request *next_failable_request;
+
+ /* The pending drag-and-drop time for middle-click based
+ drag-and-drop emulation. */
+ Time pending_dnd_time;
+
+#if defined HAVE_XSYNC && !defined USE_GTK && defined HAVE_CLOCK_GETTIME
+ /* Whether or not the server time is probably the same as
+ "clock_gettime (CLOCK_MONOTONIC, ...)". */
+ bool server_time_monotonic_p;
+
+ /* The time difference between the X server clock and the monotonic
+ clock, or 0 if unknown (if the difference is legitimately 0,
+ server_time_monotonic_p will be true). */
+ int_fast64_t server_time_offset;
+#endif
};
#ifdef HAVE_X_I18N
@@ -493,6 +846,11 @@ struct x_display_info
extern bool use_xim;
#endif
+#ifdef HAVE_XINPUT2
+/* Defined in xmenu.c. */
+extern int popup_activated_flag;
+#endif
+
/* This is a chain of structures for all the X displays currently in use. */
extern struct x_display_info *x_display_list;
@@ -503,6 +861,11 @@ extern bool x_display_ok (const char *);
extern void select_visual (struct x_display_info *);
+extern Window tip_window;
+extern Lisp_Object tip_dx;
+extern Lisp_Object tip_dy;
+extern Lisp_Object tip_frame;
+
/* Each X frame object points to its own struct x_output object
in the output_data.x field. The x_output structure contains
the information that is specific to X windows. */
@@ -543,6 +906,13 @@ struct x_output
window's back buffer. */
Drawable draw_desc;
+#ifdef HAVE_XRENDER
+ /* The Xrender picture that corresponds to this drawable. None
+ means no picture format was found, or the Xrender extension is
+ not present. */
+ Picture picture;
+#endif
+
/* Flag that indicates whether we've modified the back buffer and
need to publish our modifications to the front buffer at a
convenient time. */
@@ -570,6 +940,12 @@ struct x_output
Widget menubar_widget;
#endif
+#ifndef USE_GTK
+ /* A window used to store the user time property. May be None or
+ the frame's outer window. */
+ Window user_time_window;
+#endif
+
#ifdef USE_GTK
/* The widget of this screen. This is the window of a top widget. */
GtkWidget *widget;
@@ -592,12 +968,18 @@ struct x_output
GdkGeometry size_hints;
long hint_flags;
-#ifdef USE_GTK_TOOLTIP
GtkTooltip *ttip_widget;
GtkWidget *ttip_lbl;
GtkWindow *ttip_window;
-#endif /* USE_GTK_TOOLTIP */
+ GtkIMContext *im_context;
+
+#ifdef HAVE_GTK3
+ /* The CSS providers used for scroll bar foreground and background
+ colors. */
+ GtkCssProvider *scrollbar_foreground_css_provider;
+ GtkCssProvider *scrollbar_background_css_provider;
+#endif
#endif /* USE_GTK */
/* If >=0, a bitmap index. The indicated bitmap is used for the
@@ -702,6 +1084,10 @@ struct x_output
false, tell Xt not to wait. */
bool_bf wait_for_wm : 1;
+ /* True if this frame's alpha value is the same for both the active
+ and inactive states. */
+ bool_bf alpha_identical_p : 1;
+
#ifdef HAVE_X_I18N
/* Input context (currently, this means Compose key handler setup). */
XIC xic;
@@ -709,6 +1095,58 @@ struct x_output
XFontSet xic_xfs;
#endif
+#ifdef HAVE_XSYNC
+ /* The "basic frame counter" used for resize synchronization. */
+ XSyncCounter basic_frame_counter;
+
+ /* The "extended frame counter" used for frame synchronization. */
+ XSyncCounter extended_frame_counter;
+
+ /* The pending value of the basic counter. */
+ XSyncValue pending_basic_counter_value;
+
+ /* The current value of the extended counter. */
+ XSyncValue current_extended_counter_value;
+
+ /* The configure event value of the extended counter. */
+ XSyncValue resize_counter_value;
+
+ /* Whether or not basic resize synchronization is in progress. */
+ bool_bf sync_end_pending_p : 1;
+
+ /* Whether or not extended resize synchronization is in
+ progress. */
+ bool_bf ext_sync_end_pending_p : 1;
+
+#ifdef HAVE_GTK3
+ /* Whether or not GDK resize synchronization is in progress. */
+ bool_bf xg_sync_end_pending_p : 1;
+#endif
+
+ /* Whether or Emacs is waiting for the compositing manager to draw a
+ frame. */
+ bool_bf waiting_for_frame_p : 1;
+
+#if !defined USE_GTK && defined HAVE_CLOCK_GETTIME
+ /* Whether or not Emacs should wait for the compositing manager to
+ draw frames before starting a new frame. */
+ bool_bf use_vsync_p : 1;
+
+ /* The time (in microseconds) it took to draw the last frame. */
+ uint_fast64_t last_frame_time;
+
+ /* A temporary time used to calculate that value. */
+ uint_fast64_t temp_frame_time;
+
+#ifdef HAVE_XSYNCTRIGGERFENCE
+ /* An array of two sync fences that are triggered in order after a
+ frame completes. Not initialized if the XSync extension is too
+ old to support sync fences. */
+ XSyncFence sync_fences[2];
+#endif
+#endif
+#endif
+
/* Relief GCs, colors etc. */
struct relief
{
@@ -723,7 +1161,9 @@ struct x_output
/* 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. */
+ FocusOut and LeaveNotify clears EXPLICIT/IMPLICIT.
+
+ Not used when the input extension is being utilized. */
int focus_state;
/* The offset we need to add to compensate for type A WMs. */
@@ -740,12 +1180,23 @@ struct x_output
#ifdef USE_CAIRO
/* Cairo drawing context. */
cairo_t *cr_context;
- /* Cairo surface for double buffering */
- cairo_surface_t *cr_surface;
+ /* Width and height reported by the last ConfigureNotify event.
+ They are used when creating the cairo surface next time. */
+ int cr_surface_desired_width, cr_surface_desired_height;
+#endif
+
+#ifdef HAVE_X_I18N
+ ptrdiff_t preedit_size;
+ char *preedit_chars;
+ bool preedit_active;
+ int preedit_caret;
#endif
-};
-#define No_Cursor (None)
+#ifdef HAVE_XINPUT2
+ XIEventMask *xi_masks;
+ int num_xi_masks;
+#endif
+};
enum
{
@@ -759,12 +1210,13 @@ enum
FOCUS_EXPLICIT = 2
};
-
/* Return the X output data for frame F. */
#define FRAME_X_OUTPUT(f) ((f)->output_data.x)
+#define FRAME_OUTPUT_DATA(f) FRAME_X_OUTPUT (f)
/* Return the X window used for displaying data in frame F. */
#define FRAME_X_WINDOW(f) ((f)->output_data.x->window_desc)
+#define FRAME_NATIVE_WINDOW(f) FRAME_X_WINDOW (f)
/* Return the drawable used for rendering to frame F. */
#define FRAME_X_RAW_DRAWABLE(f) ((f)->output_data.x->draw_desc)
@@ -776,13 +1228,15 @@ extern void x_mark_frame_dirty (struct frame *f);
code after any drawing command, but we can run code whenever
someone asks for the handle necessary to draw. */
#define FRAME_X_DRAWABLE(f) \
- (x_mark_frame_dirty((f)), FRAME_X_RAW_DRAWABLE ((f)))
+ (x_mark_frame_dirty ((f)), FRAME_X_RAW_DRAWABLE ((f)))
+#ifdef HAVE_XDBE
#define FRAME_X_DOUBLE_BUFFERED_P(f) \
(FRAME_X_WINDOW (f) != FRAME_X_RAW_DRAWABLE (f))
/* Return the need-buffer-flip flag for frame F. */
#define FRAME_X_NEED_BUFFER_FLIP(f) ((f)->output_data.x->need_buffer_flip)
+#endif
/* Return the outermost X window associated with the frame F. */
#ifdef USE_X_TOOLKIT
@@ -791,18 +1245,6 @@ extern void x_mark_frame_dirty (struct frame *f);
FRAME_X_WINDOW (f))
#else
#ifdef USE_GTK
-/* 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
#ifdef HAVE_GTK3
#define DEFAULT_GDK_DISPLAY() \
@@ -865,6 +1307,30 @@ extern void x_mark_frame_dirty (struct frame *f);
/* This is the Visual which frame F is on. */
#define FRAME_X_VISUAL(f) FRAME_DISPLAY_INFO (f)->visual
+/* And its corresponding visual info. */
+#define FRAME_X_VISUAL_INFO(f) (&FRAME_DISPLAY_INFO (f)->visual_info)
+
+#ifdef HAVE_XRENDER
+#define FRAME_X_PICTURE_FORMAT(f) FRAME_DISPLAY_INFO (f)->pict_format
+#define FRAME_X_PICTURE(f) ((f)->output_data.x->picture)
+#define FRAME_CHECK_XR_VERSION(f, major, minor) \
+ (FRAME_DISPLAY_INFO (f)->xrender_supported_p \
+ && ((FRAME_DISPLAY_INFO (f)->xrender_major == (major) \
+ && FRAME_DISPLAY_INFO (f)->xrender_minor >= (minor)) \
+ || (FRAME_DISPLAY_INFO (f)->xrender_major > (major))))
+#endif
+
+#ifdef HAVE_XSYNC
+#define FRAME_X_BASIC_COUNTER(f) \
+ FRAME_X_OUTPUT (f)->basic_frame_counter
+#define FRAME_X_EXTENDED_COUNTER(f) \
+ FRAME_X_OUTPUT (f)->extended_frame_counter
+#define FRAME_X_WAITING_FOR_DRAW(f) \
+ FRAME_X_OUTPUT (f)->waiting_for_frame_p
+#define FRAME_X_COUNTER_VALUE(f) \
+ FRAME_X_OUTPUT (f)->current_extended_counter_value
+#endif
+
/* This is the Colormap which frame F uses. */
#define FRAME_X_COLORMAP(f) FRAME_DISPLAY_INFO (f)->cmap
@@ -887,7 +1353,7 @@ extern void x_mark_frame_dirty (struct frame *f);
struct scroll_bar
{
/* These fields are shared by all vectors. */
- struct vectorlike_header header;
+ union vectorlike_header header;
/* The window we're a scroll bar for. */
Lisp_Object window;
@@ -895,7 +1361,7 @@ struct scroll_bar
/* The next and previous in the chain of scroll bars in this frame. */
Lisp_Object next, prev;
- /* Fields from `x_window' down will not be traced by the GC. */
+ /* Fields after 'prev' are not traced by the GC. */
/* The X window representing this scroll bar. */
Window x_window;
@@ -914,7 +1380,7 @@ struct scroll_bar
editing large files, we establish a minimum height by always
drawing handle bottoms VERTICAL_SCROLL_BAR_MIN_HANDLE pixels below
where they would be normally; the bottom and top are in a
- different co-ordinate system. */
+ different coordinate system. */
int start, end;
/* If the scroll bar handle is currently being dragged by the user,
@@ -935,7 +1401,7 @@ struct scroll_bar
/* True if the scroll bar is horizontal. */
bool horizontal;
-};
+} GCALIGNED_STRUCT;
/* Turning a lisp vector value into a pointer to a struct scroll_bar. */
#define XSCROLL_BAR(vec) ((struct scroll_bar *) XVECTOR (vec))
@@ -1080,30 +1546,52 @@ extern void x_real_pos_and_offsets (struct frame *f,
int *xptr,
int *yptr,
int *outer_border);
+extern void x_default_font_parameter (struct frame* f, Lisp_Object parms);
/* From xrdb.c. */
XrmDatabase x_load_resources (Display *, const char *, const char *,
const char *);
+extern const char *x_get_string_resource (void *, const char *, const char *);
/* Defined in xterm.c */
-typedef void (*x_special_error_handler)(Display *, XErrorEvent *, char *,
- void *);
+typedef void (*x_special_error_handler) (Display *, XErrorEvent *, char *,
+ void *);
extern bool x_text_icon (struct frame *, const char *);
extern void x_catch_errors (Display *);
extern void x_catch_errors_with_handler (Display *, x_special_error_handler,
void *);
+extern void x_catch_errors_for_lisp (struct x_display_info *);
+extern void x_uncatch_errors_for_lisp (struct x_display_info *);
+extern void x_check_errors_for_lisp (struct x_display_info *,
+ const char *)
+ ATTRIBUTE_FORMAT_PRINTF (2, 0);
extern void x_check_errors (Display *, const char *)
ATTRIBUTE_FORMAT_PRINTF (2, 0);
extern bool x_had_errors_p (Display *);
+extern void x_unwind_errors_to (int);
extern void x_uncatch_errors (void);
extern void x_uncatch_errors_after_check (void);
+extern void x_ignore_errors_for_next_request (struct x_display_info *);
+extern void x_stop_ignoring_errors (struct x_display_info *);
extern void x_clear_errors (Display *);
-extern void xembed_request_focus (struct frame *);
-extern void x_ewmh_activate_frame (struct frame *);
-extern void x_delete_terminal (struct terminal *terminal);
+extern void x_set_window_size (struct frame *, bool, int, int);
+extern void x_set_last_user_time_from_lisp (struct x_display_info *, Time);
+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, bool);
+#if defined HAVE_XSYNCTRIGGERFENCE && !defined USE_GTK \
+ && defined HAVE_CLOCK_GETTIME
+extern void x_sync_init_fences (struct frame *);
+#endif
+extern bool x_embed_frame (struct x_display_info *, struct frame *);
+
+extern void x_delete_terminal (struct terminal *);
+extern Cursor x_create_font_cursor (struct x_display_info *, int);
extern unsigned long x_copy_color (struct frame *, unsigned long);
#ifdef USE_X_TOOLKIT
extern XtAppContext Xt_app_con;
@@ -1115,50 +1603,68 @@ extern bool x_alloc_lighter_color_for_widget (Widget, Display *, Colormap,
double, int);
#endif
extern bool x_alloc_nearest_color (struct frame *, Colormap, XColor *);
-extern void x_query_color (struct frame *f, XColor *);
+extern void x_query_colors (struct frame *f, XColor *, int);
extern void x_clear_area (struct frame *f, int, int, int, int);
-#if !defined USE_X_TOOLKIT && !defined USE_GTK
+#if (defined USE_LUCID && defined HAVE_XINPUT2) \
+ || (!defined USE_X_TOOLKIT && !defined USE_GTK)
extern void x_mouse_leave (struct x_display_info *);
#endif
+extern void x_wait_for_cell_change (Lisp_Object, struct timespec);
-#if defined USE_X_TOOLKIT || defined USE_MOTIF
+#ifndef USE_GTK
extern int x_dispatch_event (XEvent *, Display *);
#endif
extern int x_x_to_emacs_modifiers (struct x_display_info *, int);
+extern int x_emacs_to_x_modifiers (struct x_display_info *, intmax_t);
#ifdef USE_CAIRO
+extern void x_cr_destroy_frame_context (struct frame *);
+extern void x_cr_update_surface_desired_size (struct frame *, int, int);
extern cairo_t *x_begin_cr_clip (struct frame *, GC);
extern void x_end_cr_clip (struct frame *);
-extern void x_set_cr_source_with_gc_foreground (struct frame *, GC);
-extern void x_set_cr_source_with_gc_background (struct frame *, GC);
+extern void x_set_cr_source_with_gc_foreground (struct frame *, GC, bool);
+extern void x_set_cr_source_with_gc_background (struct frame *, GC, bool);
extern void x_cr_draw_frame (cairo_t *, struct frame *);
extern Lisp_Object x_cr_export_frames (Lisp_Object, cairo_surface_type_t);
#endif
-INLINE int
-x_display_pixel_height (struct x_display_info *dpyinfo)
-{
- return HeightOfScreen (dpyinfo->screen);
-}
+#ifdef HAVE_XRENDER
+extern void x_xrender_color_from_gc_background (struct frame *, GC,
+ XRenderColor *, bool);
+extern void x_xr_ensure_picture (struct frame *);
+extern void x_xr_apply_ext_clip (struct frame *, GC);
+extern void x_xr_reset_ext_clip (struct frame *);
+#endif
-INLINE int
-x_display_pixel_width (struct x_display_info *dpyinfo)
-{
- return WidthOfScreen (dpyinfo->screen);
-}
+extern Bool x_query_pointer (Display *, Window, Window *, Window *, int *,
+ int *, int *, int *, unsigned int *);
-INLINE void
-x_display_set_last_user_time (struct x_display_info *dpyinfo, Time t)
-{
-#ifdef ENABLE_CHECKING
- eassert (t <= X_ULONG_MAX);
+#ifdef HAVE_GTK3
+extern void x_scroll_bar_configure (GdkEvent *);
#endif
- dpyinfo->last_user_time = t;
-}
+
+#define DEFER_SELECTIONS \
+ x_defer_selection_requests (); \
+ record_unwind_protect_void (x_release_selection_requests_and_flush)
+
+extern void x_defer_selection_requests (void);
+extern void x_release_selection_requests_and_flush (void);
+extern void x_handle_pending_selection_requests (void);
+extern bool x_detect_pending_selection_requests (void);
+extern Lisp_Object x_dnd_begin_drag_and_drop (struct frame *, Time, Atom,
+ Lisp_Object, Atom *, const char **,
+ size_t, bool, Atom *, int,
+ Lisp_Object, bool);
+extern void x_dnd_do_unsupported_drop (struct x_display_info *, Lisp_Object,
+ Lisp_Object, Lisp_Object, Window, int,
+ int, Time);
+
+extern int x_display_pixel_height (struct x_display_info *);
+extern int x_display_pixel_width (struct x_display_info *);
INLINE unsigned long
x_make_truecolor_pixel (struct x_display_info *dpyinfo, int r, int g, int b)
{
- unsigned long pr, pg, pb;
+ unsigned long pr, pg, pb, pa = dpyinfo->alpha_mask;
/* Scale down RGB values to the visual's bits per RGB, and shift
them to the right position in the pixel color. Note that the
@@ -1168,7 +1674,7 @@ x_make_truecolor_pixel (struct x_display_info *dpyinfo, int r, int g, int b)
pb = (b >> (16 - dpyinfo->blue_bits)) << dpyinfo->blue_offset;
/* Assemble the pixel color. */
- return pr | pg | pb;
+ return pr | pg | pb | pa;
}
/* If display has an immutable color map, freeing colors is not
@@ -1176,44 +1682,55 @@ x_make_truecolor_pixel (struct x_display_info *dpyinfo, int r, int g, int b)
also allows us to make other optimizations relating to server-side
reference counts. */
INLINE bool
-x_mutable_colormap (Visual *visual)
+x_mutable_colormap (XVisualInfo *visual)
{
int class = visual->class;
return (class != StaticColor && class != StaticGray && class != TrueColor);
}
extern void x_set_sticky (struct frame *, Lisp_Object, Lisp_Object);
+extern void x_set_shaded (struct frame *, Lisp_Object, Lisp_Object);
extern void x_set_skip_taskbar (struct frame *, Lisp_Object, Lisp_Object);
extern void x_set_z_group (struct frame *, Lisp_Object, Lisp_Object);
extern bool x_wm_supports (struct frame *, Atom);
+extern bool x_wm_supports_1 (struct x_display_info *, Atom);
extern void x_wait_for_event (struct frame *, int);
extern void x_clear_under_internal_border (struct frame *f);
extern void tear_down_x_back_buffer (struct frame *f);
extern void initial_set_up_x_back_buffer (struct frame *f);
+/* Defined in xfns.c. */
+extern void x_real_positions (struct frame *, int *, int *);
+extern void x_change_tab_bar_height (struct frame *, int);
+extern void x_change_tool_bar_height (struct frame *, int);
+extern void x_implicitly_set_name (struct frame *, Lisp_Object, Lisp_Object);
+extern void x_set_scroll_bar_default_width (struct frame *);
+extern void x_set_scroll_bar_default_height (struct frame *);
+#ifdef USE_LUCID
+extern void xlw_monitor_dimensions_at_pos (Display *, Screen *, int, int,
+ int *, int *, int *, int *);
+#endif
+
/* Defined in xselect.c. */
extern void x_handle_property_notify (const XPropertyEvent *);
extern void x_handle_selection_notify (const XSelectionEvent *);
extern void x_handle_selection_event (struct selection_input_event *);
extern void x_clear_frame_selections (struct frame *);
-
-extern void x_send_client_event (Lisp_Object display,
- Lisp_Object dest,
- Lisp_Object from,
- Atom message_type,
- Lisp_Object format,
- Lisp_Object values);
+extern Lisp_Object x_atom_to_symbol (struct x_display_info *, Atom);
+extern Atom symbol_to_x_atom (struct x_display_info *, Lisp_Object);
extern bool x_handle_dnd_message (struct frame *,
const XClientMessageEvent *,
struct x_display_info *,
- struct input_event *);
+ struct input_event *,
+ bool, int, int);
extern int x_check_property_data (Lisp_Object);
extern void x_fill_property_data (Display *,
Lisp_Object,
void *,
+ int,
int);
extern Lisp_Object x_property_data_to_lisp (struct frame *,
const unsigned char *,
@@ -1223,6 +1740,15 @@ extern Lisp_Object x_property_data_to_lisp (struct frame *,
extern void x_clipboard_manager_save_frame (Lisp_Object);
extern void x_clipboard_manager_save_all (void);
+extern Lisp_Object x_timestamp_for_selection (struct x_display_info *,
+ Lisp_Object);
+extern void x_own_selection (Lisp_Object, Lisp_Object, Lisp_Object,
+ Lisp_Object, Time);
+extern Atom x_intern_cached_atom (struct x_display_info *, const char *,
+ bool);
+extern char *x_get_atom_name (struct x_display_info *, Atom, bool *)
+ ATTRIBUTE_MALLOC ATTRIBUTE_DEALLOC_FREE;
+
#ifdef USE_GTK
extern bool xg_set_icon (struct frame *, Lisp_Object);
extern bool xg_set_icon_from_xpm_data (struct frame *, const char **);
@@ -1234,7 +1760,11 @@ extern void destroy_frame_xic (struct frame *);
extern void xic_set_preeditarea (struct window *, int, int);
extern void xic_set_statusarea (struct frame *);
extern void xic_set_xfontset (struct frame *, const char *);
-extern bool x_defined_color (struct frame *, const char *, XColor *, bool);
+extern bool x_defined_color (struct frame *, const char *, Emacs_Color *,
+ bool, bool);
+extern void x_preserve_selections (struct x_display_info *, Lisp_Object,
+ Lisp_Object);
+extern Lisp_Object x_get_keyboard_modifiers (struct x_display_info *);
#ifdef HAVE_X_I18N
extern void free_frame_xic (struct frame *);
# if defined HAVE_X_WINDOWS && defined USE_X_TOOLKIT
@@ -1268,19 +1798,37 @@ extern bool x_session_have_connection (void);
extern void x_session_close (void);
#endif
+#ifdef HAVE_X_I18N
+#define STYLE_OFFTHESPOT (XIMPreeditArea | XIMStatusArea)
+#define STYLE_OVERTHESPOT (XIMPreeditPosition | XIMStatusNothing)
+#define STYLE_ROOT (XIMPreeditNothing | XIMStatusNothing)
+#define STYLE_CALLBACK (XIMPreeditCallbacks | XIMStatusNothing)
+#define STYLE_NONE (XIMPreeditNothing | XIMStatusNothing)
+#endif
-/* Is the frame embedded into another application? */
+#ifdef USE_GTK
+extern struct input_event xg_pending_quit_event;
+#endif
-#define FRAME_X_EMBEDDED_P(f) (FRAME_X_OUTPUT(f)->explicit_parent != 0)
+extern bool x_dnd_in_progress;
+extern bool x_dnd_waiting_for_finish;
+extern struct frame *x_dnd_frame;
+extern struct frame *x_dnd_finish_frame;
+extern int x_error_message_count;
+
+#ifdef HAVE_XINPUT2
+extern struct xi_device_t *xi_device_from_id (struct x_display_info *, int);
+extern bool xi_frame_selected_for (struct frame *, unsigned long);
+#ifndef USE_GTK
+extern unsigned int xi_convert_event_state (XIDeviceEvent *);
+#endif
+#endif
-#define STORE_XCHAR2B(chp, b1, b2) \
- ((chp)->byte1 = (b1), (chp)->byte2 = (b2))
+extern void mark_xterm (void);
-#define XCHAR2B_BYTE1(chp) \
- ((chp)->byte1)
+/* Is the frame embedded into another application? */
-#define XCHAR2B_BYTE2(chp) \
- ((chp)->byte2)
+#define FRAME_X_EMBEDDED_P(f) (FRAME_X_OUTPUT (f)->explicit_parent != 0)
#define STORE_NATIVE_RECT(nr,rx,ry,rwidth,rheight) \
((nr).x = (rx), \