/* Definitions and headers for communication with X protocol.
- Copyright (C) 1989, 1993-1994, 1998-2013 Free Software Foundation,
+ Copyright (C) 1989, 1993-1994, 1998-2014 Free Software Foundation,
Inc.
This file is part of GNU Emacs.
#define XtParent(x) (gtk_widget_get_parent (x))
#undef XSync
#define XSync(d, b) do { gdk_window_process_all_updates (); \
- XSync (d, b); } while (0)
+ XSync (d, b); } while (false)
#endif /* USE_GTK */
/* True iff GTK's version is at least I.J.K. */
< GTK_MINOR_VERSION + ((k) \
<= GTK_MICRO_VERSION)))
# else
-# define GTK_CHECK_VERSION(i, j, k) 0
+# define GTK_CHECK_VERSION(i, j, k) false
# endif
#endif
#include "dispextern.h"
#include "termhooks.h"
-#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)))
-
-#define FONT_WIDTH(f) ((f)->max_width)
-#define FONT_HEIGHT(f) ((f)->ascent + (f)->descent)
-#define FONT_BASE(f) ((f)->ascent)
-#define FONT_DESCENT(f) ((f)->descent)
+/* 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))
/* The mask of events that text windows always want to receive. This
includes mouse movement events, since handling the mouse-font text property
struct x_bitmap_record
{
Pixmap pixmap;
- int have_mask;
+ bool have_mask;
Pixmap mask;
char *file;
int refcount;
/* 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. */
+ /* This is a cons cell of the form (NAME . FONT-LIST-CACHE). */
Lisp_Object name_list_element;
/* Number of frames that are on this display. */
mouse-face. */
Mouse_HLInfo mouse_highlight;
+ /* Logical identifier of this display. */
+ unsigned x_id;
+
+ /* Default name for all frames on this display. */
char *x_id_name;
/* The number of fonts opened for this display. */
minibuffer. */
struct frame *x_highlight_frame;
+ /* The frame waiting to be auto-raised in XTread_socket. */
+ struct frame *x_pending_autoraise_frame;
+
+ /* The frame where the mouse was last time we reported a ButtonPress event. */
+ struct frame *last_mouse_frame;
+
+ /* The frame where the mouse was last time we reported a mouse position. */
+ struct frame *last_mouse_glyph_frame;
+
+ /* The frame where the mouse was last time we reported a mouse motion. */
+ struct frame *last_mouse_motion_frame;
+
+ /* 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 last_user_time;
+
+ /* 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;
+
+ /* 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;
+
/* The gray pixmap. */
Pixmap gray;
#ifdef HAVE_X_I18N
/* Whether or not to use XIM if we have it. */
-extern int use_xim;
-#endif
-
-extern struct frame *x_window_to_frame (struct x_display_info *, int);
-extern struct frame *x_any_window_to_frame (struct x_display_info *, int);
-extern struct frame *x_menubar_window_to_frame (struct x_display_info *,
- XEvent *);
-extern struct frame *x_top_window_to_frame (struct x_display_info *, int);
-
-extern struct frame *x_menubar_window_to_frame (struct x_display_info *,
- XEvent *);
-
-#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
+extern bool use_xim;
#endif
/* This is a chain of structures for all the X displays currently in use. */
extern struct x_display_info *x_display_list;
-/* 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;
-
extern struct x_display_info *x_display_info_for_display (Display *);
-
+extern struct frame *x_top_window_to_frame (struct x_display_info *, int);
extern struct x_display_info *x_term_init (Lisp_Object, char *, char *);
extern bool x_display_ok (const char *);
/* The handle box that makes the tool bar detachable. */
GtkWidget *handlebox_widget;
#endif
- /* Non-zero if tool bar is packed into the hbox widget (i.e. vertical). */
- bool toolbar_in_hbox;
- bool toolbar_is_packed;
+ /* True if tool bar is packed into the hbox widget (i.e. vertical). */
+ bool_bf toolbar_in_hbox : 1;
+ bool_bf toolbar_is_packed : 1;
/* The last size hints set. */
GdkGeometry size_hints;
Cursor hand_cursor;
Cursor hourglass_cursor;
Cursor horizontal_drag_cursor;
+ Cursor vertical_drag_cursor;
Cursor current_cursor;
/* Window whose cursor is hourglass_cursor. This window is temporarily
mapped to display an hourglass cursor. */
Window hourglass_window;
- /* Non-zero means hourglass cursor is currently displayed. */
- unsigned hourglass_p : 1;
-
/* 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
int id;
#endif
- /* Nonzero means our parent is another application's window
+ /* True means hourglass cursor is currently displayed. */
+ bool_bf hourglass_p : 1;
+
+ /* True means our parent is another application's window
and was explicitly specified. */
- unsigned explicit_parent : 1;
+ bool_bf explicit_parent : 1;
+
+ /* True means tried already to make this frame visible. */
+ bool_bf asked_for_visible : 1;
- /* Nonzero means tried already to make this frame visible. */
- unsigned asked_for_visible : 1;
+ /* True if this frame was ever previously visible. */
+ bool_bf has_been_visible : 1;
+
+ /* 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
+ false, tell Xt not to wait. */
+ bool_bf wait_for_wm : 1;
- /* Nonzero if this frame was ever previously visible. */
- unsigned has_been_visible : 1;
+ /* True if _NET_WM_STATE_HIDDEN is set for this frame. */
+ bool_bf net_wm_state_hidden_seen : 1;
#ifdef HAVE_X_I18N
/* Input context (currently, this means Compose key handler setup). */
{
GC gc;
unsigned long pixel;
- int allocated_p;
}
black_relief, white_relief;
They are changed only when a different background is involved. */
unsigned long relief_background;
- /* 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;
-
/* 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;
/* The offset we need to add to compensate for type A WMs. */
int move_offset_top;
int move_offset_left;
-
- /* Non-zero if _NET_WM_STATE_HIDDEN is set for this frame. */
- unsigned net_wm_state_hidden_seen : 1;
};
#define No_Cursor (None)
#define FRAME_BASELINE_OFFSET(f) ((f)->output_data.x->baseline_offset)
/* This gives the x_display_info structure for the display F is on. */
-#define FRAME_X_DISPLAY_INFO(f) ((f)->output_data.x->display_info)
+#define FRAME_DISPLAY_INFO(f) ((f)->output_data.x->display_info)
/* This is the `Display *' which frame F is on. */
-#define FRAME_X_DISPLAY(f) (FRAME_X_DISPLAY_INFO (f)->display)
+#define FRAME_X_DISPLAY(f) (FRAME_DISPLAY_INFO (f)->display)
/* This is the `Screen *' which frame F is on. */
-#define FRAME_X_SCREEN(f) (FRAME_X_DISPLAY_INFO (f)->screen)
+#define FRAME_X_SCREEN(f) (FRAME_DISPLAY_INFO (f)->screen)
+
+/* This is the screen index number of screen which frame F is on. */
#define FRAME_X_SCREEN_NUMBER(f) XScreenNumberOfScreen (FRAME_X_SCREEN (f))
/* This is the Visual which frame F is on. */
-#define FRAME_X_VISUAL(f) FRAME_X_DISPLAY_INFO (f)->visual
+#define FRAME_X_VISUAL(f) FRAME_DISPLAY_INFO (f)->visual
/* This is the Colormap which frame F uses. */
-#define FRAME_X_COLORMAP(f) FRAME_X_DISPLAY_INFO (f)->cmap
+#define FRAME_X_COLORMAP(f) FRAME_DISPLAY_INFO (f)->cmap
/* The difference in pixels between the top left corner of the
Emacs window (including possible window manager decorations)
#define FRAME_XIC(f) ((f)->output_data.x->xic)
-#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_X_XIM(f) (FRAME_DISPLAY_INFO (f)->xim)
+#define FRAME_X_XIM_STYLES(f) (FRAME_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)
-/* 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
-\f
/* X-specific scroll bar stuff. */
/* We represent scroll bars as lisp vectors. This allows us to place
being dragged, this is -1. */
int dragging;
- /* 1 if the background of the fringe that is adjacent to a scroll
- bar is extended to the gap between the fringe and the bar. */
- unsigned fringe_extended_p : 1;
+#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
};
/* Turning a lisp vector value into a pointer to a struct scroll_bar. */
#define XSCROLL_BAR(vec) ((struct scroll_bar *) XVECTOR (vec))
+#ifdef USE_X_TOOLKIT
/* Extract the X widget of the scroll bar from a struct scroll_bar.
XtWindowToWidget should be fast enough since Xt uses a hash table
do { \
Window window = XtWindow (w); \
ptr->x_window = window; \
-} while (0)
+ } while (false)
+#endif /* USE_X_TOOLKIT */
/* Return the inside width of a vertical scroll bar, given the outside
width. */
#define VERTICAL_SCROLL_BAR_INSIDE_WIDTH(f, width) \
((width) \
- VERTICAL_SCROLL_BAR_LEFT_BORDER \
- - VERTICAL_SCROLL_BAR_RIGHT_BORDER \
- - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2)
+ - VERTICAL_SCROLL_BAR_RIGHT_BORDER)
/* Return the length of the rectangle within which the top of the
handle must stay. This isn't equivalent to the inside height,
/* Minimum lengths for scroll bar handles, in pixels. */
#define VERTICAL_SCROLL_BAR_MIN_HANDLE (5)
-/* Trimming off a few pixels from each side prevents
- text from glomming up against the scroll bar */
-#define VERTICAL_SCROLL_BAR_WIDTH_TRIM (0)
-
-\f
/* If a struct input_event has a kind which is SELECTION_REQUEST_EVENT
or SELECTION_CLEAR_EVENT, then its contents are really described
by this structure. */
#define SELECTION_EVENT_TIME(eventp) \
(((struct selection_input_event *) (eventp))->time)
-/* From xselect.c. */
-
-void x_handle_selection_notify (XSelectionEvent *);
-void x_handle_property_notify (XPropertyEvent *);
-
/* From xfns.c. */
extern void x_free_gcs (struct frame *);
extern bool x_had_errors_p (Display *);
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_window_size (struct frame *, int, int, int, bool);
extern void x_set_mouse_position (struct frame *, int, int);
extern void x_set_mouse_pixel_position (struct frame *, int, int);
extern void xembed_request_focus (struct frame *);
extern bool x_alloc_nearest_color (struct frame *, Colormap, XColor *);
extern void x_query_color (struct frame *f, XColor *);
extern void x_clear_area (Display *, Window, int, int, int, int);
-#if defined HAVE_MENUS && !defined USE_X_TOOLKIT && !defined USE_GTK
+#if !defined USE_X_TOOLKIT && !defined USE_GTK
extern void x_mouse_leave (struct x_display_info *);
#endif
-#ifdef USE_X_TOOLKIT
+#if defined USE_X_TOOLKIT || defined USE_MOTIF
extern int x_dispatch_event (XEvent *, Display *);
#endif
extern int x_x_to_emacs_modifiers (struct x_display_info *, int);
extern void x_set_sticky (struct frame *, Lisp_Object, Lisp_Object);
extern void x_wait_for_event (struct frame *, int);
-/* Defined in xselect.c */
+/* Defined in xselect.c. */
-extern void x_handle_property_notify (XPropertyEvent *);
-extern void x_handle_selection_notify (XSelectionEvent *);
+extern void x_handle_property_notify (const XPropertyEvent *);
+extern void x_handle_selection_notify (const XSelectionEvent *);
extern void x_handle_selection_event (struct input_event *);
extern void x_clear_frame_selections (struct frame *);
Lisp_Object values);
extern int x_handle_dnd_message (struct frame *,
- XClientMessageEvent *,
+ const XClientMessageEvent *,
struct x_display_info *,
- struct input_event *bufp);
+ struct input_event *);
extern int x_check_property_data (Lisp_Object);
extern void x_fill_property_data (Display *,
Lisp_Object,
/* Defined in xfns.c */
-extern struct x_display_info * check_x_display_info (Lisp_Object);
extern Lisp_Object x_get_focus_frame (struct frame *);
#ifdef USE_GTK
extern int xg_set_icon (struct frame *, Lisp_Object);
-extern int xg_set_icon_from_xpm_data (struct frame *, const char**);
+extern int xg_set_icon_from_xpm_data (struct frame *, const char **);
#endif /* USE_GTK */
extern void x_implicitly_set_name (struct frame *, Lisp_Object, Lisp_Object);
/* Defined in xmenu.c */
+#if defined USE_X_TOOLKIT || defined USE_GTK
+extern Lisp_Object xw_popup_dialog (struct frame *, Lisp_Object, Lisp_Object);
+#endif
+
#if defined USE_GTK || defined USE_MOTIF
extern void x_menu_set_in_use (int);
#endif
extern Lisp_Object Qx_gtk_map_stock;
+#if !defined USE_X_TOOLKIT && !defined USE_GTK
+extern void x_clear_under_internal_border (struct frame *f);
+#endif
+
/* Is the frame embedded into another application? */
#define FRAME_X_EMBEDDED_P(f) (FRAME_X_OUTPUT(f)->explicit_parent != 0)