/* Definitions and headers for communication with X protocol.
- Copyright (C) 1989, 1993, 1994, 1998, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1989, 1993, 1994, 1998, 1999, 2000, 2001, 2002, 2003,
+ 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Emacs.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA. */
#include <X11/Xlib.h>
#include <X11/cursorfont.h>
-#include <X11/Xutil.h>
+
+/* Include Xutil.h after keysym.h to work around a bug that prevents
+ correct recognition of AltGr key in some X versions. */
+
#include <X11/keysym.h>
+#include <X11/Xutil.h>
+
#include <X11/Xatom.h>
#include <X11/Xresource.h>
#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
- window inside a widget instead of one
+ window inside a widget instead of one
that Xt creates... */
#include <X11/StringDefs.h>
+
+typedef Widget xt_or_gtk_widget;
#endif
-/* The class of this X application. */
-#define EMACS_CLASS "Emacs"
+#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))
+#undef XSync
+#define XSync(d, b) do { gdk_window_process_all_updates (); \
+ XSync (d, b); } while (0)
+
+
+#endif /* USE_GTK */
+
\f
/* Bookkeeping to distinguish X versions. */
#ifdef PBaseSize
/* AIX 3.1's X is somewhere between X11R3 and X11R4. It has
PBaseSize, but not XWithdrawWindow, XSetWMName, XSetWMNormalHints,
- XSetWMIconName.
+ XSetWMIconName.
AIX 3.2 is at least X11R4. */
#if (!defined AIX) || (defined AIX3_2)
#define HAVE_X11R4
#define HAVE_X11R4
#endif
-#ifdef HAVE_X11R5
-#define HAVE_X_I18N
+#ifdef HAVE_X_I18N
#include <X11/Xlocale.h>
#endif
\f
#define FONT_WIDTH(f) ((f)->max_bounds.width)
#define FONT_HEIGHT(f) ((f)->ascent + (f)->descent)
#define FONT_BASE(f) ((f)->ascent)
+#define FONT_DESCENT(f) ((f)->descent)
/* The mask of events that text windows always want to receive. This
includes mouse movement events, since handling the mouse-font text property
| EnterWindowMask \
| VisibilityChangeMask)
-/* This checks to make sure we have a display. */
-extern void check_x ();
-
-extern struct frame *x_window_to_frame ();
-
-#ifdef USE_X_TOOLKIT
-extern struct frame *x_any_window_to_frame ();
-extern struct frame *x_non_menubar_window_to_frame ();
-extern struct frame *x_top_window_to_frame ();
-#endif
-
-extern Visual *select_visual ();
-
-enum text_cursor_kinds
-{
- NO_CURSOR = -1,
- FILLED_BOX_CURSOR,
- HOLLOW_BOX_CURSOR,
- BAR_CURSOR
-};
-
/* 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;
+ int have_mask;
+ Pixmap mask;
char *file;
int refcount;
/* Record some info about this pixmap. */
{
/* Chain of all x_display_info structures. */
struct x_display_info *next;
-
+
/* Connection number (normally a file descriptor number). */
int connection;
-
+
/* This says how to access this display in Xlib. */
Display *display;
-
+
/* This is a cons cell of the form (NAME . FONT-LIST-CACHE).
The same cons cell also appears in x_display_name_list. */
Lisp_Object name_list_element;
-
+
/* Number of frames that are on this display. */
int reference_count;
-
+
/* The Screen this connection is connected to. */
Screen *screen;
/* Dots per inch of the screen. */
double resx, resy;
-
+
/* The Visual being used for this display. */
Visual *visual;
-
- /* Number of panes on this screen. */
+
+ /* The colormap being used. */
+ Colormap cmap;
+
+ /* Number of planes on this screen. */
int n_planes;
-
+
/* Dimensions of this screen. */
int height, width;
-
+
/* Mask of things that cause the mouse to be grabbed. */
int grabbed;
-
+
/* Emacs bitmap-id of the default icon bitmap for this frame.
Or -1 if none has been allocated yet. */
int icon_bitmap_id;
-
+
/* The root window of this screen. */
Window root_window;
-
+
+ /* Client leader window. */
+ Window client_leader_window;
+
/* The cursor to use for vertical scroll bars. */
Cursor vertical_scroll_bar_cursor;
-
+
+#ifdef USE_GTK
+ /* The GDK cursor for scroll bars and popup menus. */
+ GdkCursor *xg_cursor;
+#endif
+
/* X Resource data base */
XrmDatabase xrdb;
int mouse_face_past_end;
Lisp_Object mouse_face_window;
int mouse_face_face_id;
+ Lisp_Object mouse_face_overlay;
/* 1 if a mouse motion event came and we didn't handle it right away because
gc was in progress. */
/* Nonzero means defer mouse-motion highlighting. */
int mouse_face_defer;
+ /* Nonzero means that the mouse highlight should not be shown. */
+ int mouse_face_hidden;
+
int mouse_face_image_state;
char *x_id_name;
/* Communication with window managers. */
Atom Xatom_wm_protocols;
-
+
/* Kinds of protocol things we may receive. */
Atom Xatom_wm_take_focus;
Atom Xatom_wm_save_yourself;
Atom Xatom_wm_delete_window;
-
+
/* Atom for indicating window state to the window manager. */
Atom Xatom_wm_change_state;
-
+
/* Other WM communication */
Atom Xatom_wm_configure_denied; /* When our config request is denied */
Atom Xatom_wm_window_moved; /* When the WM moves us. */
-
+ Atom Xatom_wm_client_leader; /* Id of client leader window. */
+
/* EditRes protocol */
Atom Xatom_editres;
/* More atoms, which are selection types. */
Atom Xatom_CLIPBOARD, Xatom_TIMESTAMP, Xatom_TEXT, Xatom_DELETE,
- Xatom_COMPOUND_TEXT,
+ Xatom_COMPOUND_TEXT, Xatom_UTF8_STRING,
Xatom_MULTIPLE, Xatom_INCR, Xatom_EMACS_TMP, Xatom_TARGETS, Xatom_NULL,
Xatom_ATOM_PAIR;
/* More atoms for font properties. The last three are private
properties, see the comments in src/fontset.h. */
- Atom Xatom_PIXEL_SIZE,
+ Atom Xatom_PIXEL_SIZE, Xatom_AVERAGE_WIDTH,
Xatom_MULE_BASELINE_OFFSET, Xatom_MULE_RELATIVE_COMPOSE,
Xatom_MULE_DEFAULT_ASCENT;
/* Cache of images. */
struct image_cache *image_cache;
+
+#ifdef HAVE_X_I18N
+ /* XIM (X Input method). */
+ XIM xim;
+ XIMStyles *xim_styles;
+#endif
+
+ /* 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;
+
+ /* 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;
+
+
+ /* Atoms that are drag and drop atoms */
+ Atom *x_dnd_atoms;
+ size_t x_dnd_atoms_size;
+ size_t x_dnd_atoms_length;
+
+ int have_net_atoms;
};
+#ifdef HAVE_X_I18N
+/* Whether or not to use XIM if we have it. */
+extern int use_xim;
+#endif
+
+/* This checks to make sure we have a display. */
+extern void check_x P_ ((void));
+
+extern struct frame *x_window_to_frame P_ ((struct x_display_info *, int));
+
+#if defined (USE_X_TOOLKIT) || defined (USE_GTK)
+extern struct frame *x_any_window_to_frame P_ ((struct x_display_info *, int));
+extern struct frame *x_non_menubar_window_to_frame P_ ((struct x_display_info *, int));
+extern struct frame *x_top_window_to_frame P_ ((struct x_display_info *, int));
+#endif
+
/* This is a chain of structures for all the X displays currently in use. */
extern struct x_display_info *x_display_list;
/* Regexp matching a font name whose width is the same as `PIXEL_SIZE'. */
extern Lisp_Object Vx_pixel_size_width_font_regexp;
-/* A flag to control how to display unibyte 8-bit character. */
-extern int unibyte_display_via_language_environment;
+extern struct x_display_info *x_display_info_for_display P_ ((Display *));
+extern struct x_display_info *x_display_info_for_name P_ ((Lisp_Object));
-struct x_display_info *x_display_info_for_display P_ ((Display *));
-struct x_display_info *x_display_info_for_name ();
-
-extern struct x_display_info *x_term_init ();
+extern struct x_display_info *x_term_init P_ ((Lisp_Object, char *, char *));
+extern int x_display_ok P_ ((const char *));
extern Lisp_Object x_list_fonts P_ ((struct frame *, Lisp_Object, int, int));
-
-extern struct font_info *x_get_font_info(), *x_load_font (), *x_query_font ();
-extern void x_find_ccl_program();
+extern void select_visual P_ ((struct x_display_info *));
+extern struct font_info *x_get_font_info P_ ((struct frame *f, int));
+extern struct font_info *x_load_font P_ ((struct frame *, char *, int));
+extern struct font_info *x_query_font P_ ((struct frame *, char *));
+extern void x_find_ccl_program P_ ((struct font_info *));
\f
/* Each X frame object points to its own struct x_output object
in the output_data.x field. The x_output structure contains
struct x_output
{
- /* Position of the X window (x and y offsets in root window). */
- int left_pos;
- int top_pos;
-
- /* Border width of the X window as known by the X window system. */
- int border_width;
-
- /* Size of the X window in pixels. */
- int pixel_height, pixel_width;
-
/* 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;
- /* Height of a line, in pixels. */
- int line_height;
+ /* Height of tool bar widget, in pixels.
+ Zero if not using an external tool bar. */
+ int toolbar_height;
/* The tiled border used when the mouse is out of the frame. */
Pixmap border_tile;
GC reverse_gc; /* Reverse video */
GC cursor_gc; /* cursor drawing */
- /* Width of the internal border. This is a line of background color
- just inside the window's border. When the frame is selected,
- a highlighting is displayed inside the internal border. */
- int internal_border_width;
-
/* The X window used for this frame.
May be zero while the frame object is being created
and the X window has not yet been created. */
Widget menubar_widget;
#endif
+#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;
+ /* The menubar in this frame. */
+ GtkWidget *menubar_widget;
+ /* The tool bar in this frame */
+ GtkWidget *toolbar_widget;
+ /* The handle box that makes the tool bar detachable. */
+ GtkWidget *handlebox_widget;
+ /* Non-zero if the tool bar is detached. */
+ int toolbar_detached;
+
+ /* The last size hints set. */
+ GdkGeometry size_hints;
+ long hint_flags;
+#endif
+
/* If >=0, a bitmap index. The indicated bitmap is used for the
icon. */
int icon_bitmap;
/* Default ASCII font of this frame. */
XFontStruct *font;
- /* The baseline position of the default ASCII font. */
- int font_baseline;
+ /* The baseline offset of the default ASCII font. */
+ int baseline_offset;
/* If a fontset is specified for this frame instead of font, this
value contains an ID of the fontset, else -1. */
/* 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;
-
+
/* 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;
+ /* 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;
+
/* Descriptor for the cursor in use for this window. */
Cursor text_cursor;
Cursor nontext_cursor;
Cursor modeline_cursor;
- Cursor cross_cursor;
- Cursor busy_cursor;
+ Cursor hand_cursor;
+ Cursor hourglass_cursor;
+ Cursor horizontal_drag_cursor;
+
+ /* Window whose cursor is hourglass_cursor. This window is temporarily
+ mapped to display an hourglass cursor. */
+ Window hourglass_window;
- /* Window whose cursor is busy_cursor. This window is temporarily
- mapped to display a busy-cursor. */
- Window busy_window;
-
- /* Non-zero means busy cursor is currently displayed. */
- unsigned busy_p : 1;
+ /* Non-zero means hourglass cursor is currently displayed. */
+ unsigned hourglass_p : 1;
/* Flag to set when the X window needs to be completely repainted. */
int needs_exposure;
- /* What kind of text cursor is drawn in this window right now?
- (If there is no cursor (phys_cursor_x < 0), then this means nothing.) */
- enum text_cursor_kinds current_cursor;
-
- /* What kind of text cursor should we draw in the future?
- This should always be filled_box_cursor or bar_cursor. */
- enum text_cursor_kinds desired_cursor;
-
- /* Width of bar cursor (if we are using that). */
- int cursor_width;
-
/* 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
to the mask as we go. */
XWMHints wm_hints;
- /* The size of the extra width currently allotted for vertical
- scroll bars, in pixels. */
- int vertical_scroll_bar_extra;
-
- /* The extra width currently allotted for the areas in which
- truncation marks, continuation marks, and overlay arrows are
- displayed. */
- int flags_areas_extra;
-
- /* This is the gravity value for the specified window position. */
- int win_gravity;
-
- /* The geometry flags for this window. */
- int size_hint_flags;
-
/* This is the Emacs structure for the X display this frame is on. */
struct x_display_info *display_info;
char has_been_visible;
#ifdef HAVE_X_I18N
- /* Input method. */
- XIM xim;
/* Input context (currently, this means Compose key handler setup). */
XIC xic;
+ XIMStyle xic_style;
+ XFontSet xic_xfs;
+ char *xic_base_fontname;
#endif
/* Relief GCs, colors etc. */
/* 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;
+
+ /* 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;
+
+ /* 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;
+
+ /* 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;
+
+ /* The offset we need to add to compensate for type A WMs. */
+ int move_offset_top;
+ int move_offset_left;
+
+ /* The frame's left/top offsets before we call XMoveWindow. See
+ x_check_expected_move. */
+ int left_before_move;
+ int top_before_move;
+};
+
+#define No_Cursor (None)
+
+enum
+{
+ /* Values for focus_state, used as bit mask.
+ EXPLICIT means we received a FocusIn for the frame and know it has
+ the focus. IMPLICIT means we recevied an EnterNotify and the frame
+ may have the focus if no window manager is running.
+ FocusOut and LeaveNotify clears EXPLICIT/IMPLICIT. */
+ FOCUS_NONE = 0,
+ FOCUS_IMPLICIT = 1,
+ FOCUS_EXPLICIT = 2
};
+
+/* Return the X output data for frame F. */
+#define FRAME_X_OUTPUT(f) ((f)->output_data.x)
+
/* Return the X window used for displaying data in frame F. */
#define FRAME_X_WINDOW(f) ((f)->output_data.x->window_desc)
/* Return the outermost X window associated with the frame F. */
#ifdef USE_X_TOOLKIT
-#define FRAME_OUTER_WINDOW(f) (XtWindow ((f)->output_data.x->widget))
+#define FRAME_OUTER_WINDOW(f) ((f)->output_data.x->widget ? \
+ XtWindow ((f)->output_data.x->widget) : \
+ FRAME_X_WINDOW (f))
#else
+#ifdef USE_GTK
+#define GTK_WIDGET_TO_X_WIN(w) \
+ ((w) && (w)->window ? GDK_WINDOW_XWINDOW ((w)->window) : 0)
+
+#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 */
#define FRAME_OUTER_WINDOW(f) (FRAME_X_WINDOW (f))
+#endif /* !USE_GTK */
#endif
-#define FRAME_FOREGROUND_PIXEL(f) ((f)->output_data.x->foreground_pixel)
-#define FRAME_BACKGROUND_PIXEL(f) ((f)->output_data.x->background_pixel)
+
#define FRAME_FONT(f) ((f)->output_data.x->font)
#define FRAME_FONTSET(f) ((f)->output_data.x->fontset)
-#define FRAME_INTERNAL_BORDER_WIDTH(f) ((f)->output_data.x->internal_border_width)
-#define FRAME_LINE_HEIGHT(f) ((f)->output_data.x->line_height)
-
-/* Width of the default font of frame F. Must be defined by each
- terminal specific header. */
-#define FRAME_DEFAULT_FONT_WIDTH(F) FONT_WIDTH (FRAME_FONT (F))
+#define FRAME_MENUBAR_HEIGHT(f) ((f)->output_data.x->menubar_height)
+#define FRAME_TOOLBAR_HEIGHT(f) ((f)->output_data.x->toolbar_height)
+#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)
/* This is the `Screen *' which frame F is on. */
#define FRAME_X_SCREEN(f) (FRAME_X_DISPLAY_INFO (f)->screen)
+#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
+
+/* This is the Colormap which frame F uses. */
+#define FRAME_X_COLORMAP(f) FRAME_X_DISPLAY_INFO (f)->cmap
/* This is the 'font_info *' which frame F has. */
#define FRAME_X_FONT_TABLE(f) (FRAME_X_DISPLAY_INFO (f)->font_table)
-/* These two really ought to be called FRAME_PIXEL_{WIDTH,HEIGHT}. */
-#define PIXEL_WIDTH(f) ((f)->output_data.x->pixel_width)
-#define PIXEL_HEIGHT(f) ((f)->output_data.x->pixel_height)
+/* 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 \
+ + FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f))
-#define FRAME_DESIRED_CURSOR(f) ((f)->output_data.x->desired_cursor)
-#define FRAME_XIM(f) ((f)->output_data.x->xim)
#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_XIC_STYLE(f) ((f)->output_data.x->xic_style)
+#define FRAME_XIC_FONTSET(f) ((f)->output_data.x->xic_xfs)
+#define FRAME_XIC_BASE_FONTNAME(f) ((f)->output_data.x->xic_base_fontname)
/* Value is the smallest width of any character in any font on frame F. */
#define FRAME_X_IMAGE_CACHE(F) FRAME_X_DISPLAY_INFO ((F))->image_cache
-\f
-/* Pixel width of the bitmaps drawn to indicate truncation,
- continuation etc. */
-
-#define FRAME_FLAGS_BITMAP_WIDTH(f) 8
-#define FRAME_FLAGS_BITMAP_HEIGHT(f) 8
-
-/* Width of a single area reserved for drawing truncation bitmaps,
- continuation bitmaps and alike. The width is in canonical char
- units of the frame. This must currently be the case because window
- sizes aren't pixel values. If it weren't the case, we wouldn't be
- able to split windows horizontally nicely. */
-
-#define FRAME_X_FLAGS_AREA_COLS(F) \
- ((FRAME_FLAGS_BITMAP_WIDTH ((F)) + CANON_X_UNIT ((F)) - 1) \
- / CANON_X_UNIT ((F)))
-
-#define FRAME_X_FLAGS_AREA_WIDTH(F) \
- (FRAME_X_FLAGS_AREA_COLS ((F)) * CANON_X_UNIT ((F)))
-
\f
/* X-specific scroll bar stuff. */
We use struct scroll_bar as a template for accessing fields of the
vector. */
-struct scroll_bar {
-
+struct scroll_bar
+{
/* These fields are shared by all vectors. */
EMACS_INT size_from_Lisp_Vector_struct;
struct Lisp_Vector *next_from_Lisp_Vector_struct;
32-bit quantity, we store it split into two 32-bit values. */
Lisp_Object x_window_low, x_window_high;
- /* Same as above for the widget. */
- Lisp_Object x_widget_low, x_widget_high;
-
/* The position and size of the scroll bar in pixels, relative to the
frame. */
Lisp_Object top, left, width, height;
#define SET_SCROLL_BAR_X_WINDOW(ptr, id) \
(SCROLL_BAR_UNPACK ((ptr)->x_window_low, (ptr)->x_window_high, (int) id))
-/* Extract the X widget of the scroll bar from a struct scroll_bar. */
-#define SCROLL_BAR_X_WIDGET(ptr) \
- ((Widget) SCROLL_BAR_PACK ((ptr)->x_widget_low, (ptr)->x_widget_high))
+/* 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) \
+ XtWindowToWidget (dpy, SCROLL_BAR_X_WINDOW (ptr))
/* Store a widget id in a struct scroll_bar. */
-#define SET_SCROLL_BAR_X_WIDGET(ptr, w) \
- (SCROLL_BAR_UNPACK ((ptr)->x_widget_low, (ptr)->x_widget_high, (int) w))
+
+#define SET_SCROLL_BAR_X_WIDGET(ptr, w) \
+ do { \
+ Window window = XtWindow (w); \
+ SET_SCROLL_BAR_X_WINDOW (ptr, window); \
+} while (0)
/* Return the inside width of a vertical scroll bar, given the outside
/* Return the length of the rectangle within which the top of the
handle must stay. This isn't equivalent to the inside height,
- because the scroll bar handle has a minimum height.
+ because the scroll bar handle has a minimum height.
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
/* Trimming off a few pixels from each side prevents
text from glomming up against the scroll bar */
-#define VERTICAL_SCROLL_BAR_WIDTH_TRIM (2)
-
-\f
-/* Manipulating pixel sizes and character sizes.
- Knowledge of which factors affect the overall size of the window should
- be hidden in these macros, if that's possible.
-
- Return the upper/left pixel position of the character cell on frame F
- at ROW/COL. */
-#define CHAR_TO_PIXEL_ROW(f, row) \
- ((f)->output_data.x->internal_border_width \
- + (row) * (f)->output_data.x->line_height)
-#define CHAR_TO_PIXEL_COL(f, col) \
- ((f)->output_data.x->internal_border_width \
- + (col) * FONT_WIDTH ((f)->output_data.x->font))
-
-/* Return the pixel width/height of frame F if it has
- WIDTH columns/HEIGHT rows. */
-#define CHAR_TO_PIXEL_WIDTH(f, width) \
- (CHAR_TO_PIXEL_COL (f, width) \
- + (f)->output_data.x->vertical_scroll_bar_extra \
- + (f)->output_data.x->flags_areas_extra \
- + (f)->output_data.x->internal_border_width)
-#define CHAR_TO_PIXEL_HEIGHT(f, height) \
- (CHAR_TO_PIXEL_ROW (f, height) \
- + (f)->output_data.x->internal_border_width)
-
-
-/* Return the row/column (zero-based) of the character cell containing
- the pixel on FRAME at ROW/COL. */
-#define PIXEL_TO_CHAR_ROW(f, row) \
- (((row) - (f)->output_data.x->internal_border_width) \
- / (f)->output_data.x->line_height)
-#define PIXEL_TO_CHAR_COL(f, col) \
- (((col) - (f)->output_data.x->internal_border_width) \
- / FONT_WIDTH ((f)->output_data.x->font))
-
-/* How many columns/rows of text can we fit in WIDTH/HEIGHT pixels on
- frame F? */
-#define PIXEL_TO_CHAR_WIDTH(f, width) \
- (PIXEL_TO_CHAR_COL (f, ((width) \
- - (f)->output_data.x->internal_border_width \
- - (f)->output_data.x->flags_areas_extra \
- - (f)->output_data.x->vertical_scroll_bar_extra)))
-#define PIXEL_TO_CHAR_HEIGHT(f, height) \
- (PIXEL_TO_CHAR_ROW (f, ((height) \
- - (f)->output_data.x->internal_border_width)))
+#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
+/* 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. */
-/* For an event of kind selection_request_event,
+/* For an event of kind SELECTION_REQUEST_EVENT,
this structure really describes the contents.
**Don't make this struct longer!**
If it overlaps the frame_or_window field of struct input_event,
struct glyph_matrix;
struct frame;
struct input_event;
+struct face;
+struct image;
/* From xselect.c. */
/* From xfns.c. */
-void x_real_positions P_ ((struct frame *, int *, int *));
-void x_destroy_bitmap P_ ((struct frame *, int));
-int x_create_bitmap_from_file P_ ((struct frame *, Lisp_Object));
-int x_create_bitmap_from_data P_ ((struct frame *, char *, unsigned,
- unsigned));
-void x_reference_bitmap P_ ((struct frame *, int));
-void x_sync P_ ((struct frame *));
-int x_bitmap_pixmap P_ ((struct frame *, int));
-void x_set_menu_bar_lines P_ ((struct frame *, Lisp_Object, Lisp_Object));
-int x_bitmap_height P_ ((struct frame *, int));
-int x_bitmap_width P_ ((struct frame *, int));
-int defined_color P_ ((struct frame *, char *, XColor *, int));
Lisp_Object display_x_get_resource P_ ((struct x_display_info *,
Lisp_Object, Lisp_Object,
Lisp_Object, Lisp_Object));
struct frame *check_x_frame P_ ((Lisp_Object));
EXFUN (Fx_display_color_p, 1);
EXFUN (Fx_display_grayscale_p, 1);
+extern void x_free_gcs P_ ((struct frame *));
/* From xrdb.c. */
-char *x_get_string_resource P_ ((XrmDatabase, char *, char *));
char *x_get_customization_string P_ ((XrmDatabase, char *, char *));
XrmDatabase x_load_resources P_ ((Display *, char *, char *, char *));
int x_get_resource P_ ((XrmDatabase, char *, char *,
void x_make_frame_visible P_ ((struct frame *));
void x_iconify_frame P_ ((struct frame *));
void x_wm_set_size_hint P_ ((struct frame *, long, int));
-void x_set_offset P_ ((struct frame *, int, int, int));
-void x_wm_set_icon_position P_ ((struct frame *, int, int));
-int x_catch_errors P_ ((Display *));
-int x_had_errors_p P_ ((Display *));
-void x_uncatch_errors P_ ((Display *, int));
-void x_check_errors P_ ((Display *, char *));
int x_text_icon P_ ((struct frame *, char *));
int x_bitmap_icon P_ ((struct frame *, Lisp_Object));
void x_set_window_size P_ ((struct frame *, int, int, int));
void x_wm_set_window_state P_ ((struct frame *, int));
-int x_alloc_nearest_color P_ ((Display *, Screen *, Colormap, XColor *));
-
-extern void pixel_to_glyph_coords P_ ((struct frame *, int, int,
- int *, int *, XRectangle *, int));
+int x_alloc_nearest_color P_ ((struct frame *, Colormap, XColor *));
/* Defined in xterm.c */
-extern void clear_mouse_face P_ ((struct x_display_info *));
extern void cancel_mouse_face P_ ((struct frame *));
extern void x_scroll_bar_clear P_ ((struct frame *));
-extern void x_start_queuing_selection_requests P_ ((Display *));
-extern void x_stop_queuing_selection_requests P_ ((Display *));
-extern void x_update_cursor P_ ((struct frame *, int));
extern int x_text_icon P_ ((struct frame *, char *));
extern int x_bitmap_icon P_ ((struct frame *, Lisp_Object));
-extern int x_catch_errors P_ ((Display *));
+extern void x_catch_errors P_ ((Display *));
extern void x_check_errors P_ ((Display *, char *));
extern int x_had_errors_p P_ ((Display *));
-extern void x_uncatch_errors P_ ((Display *, int));
-extern Lisp_Object x_new_font P_ ((struct frame *, char *));
-extern Lisp_Object x_new_fontset P_ ((struct frame *, char *));
-extern void x_set_offset P_ ((struct frame *, int, int, int));
+extern int x_catching_errors P_ ((void));
+extern void x_uncatch_errors P_ ((void));
+extern void x_clear_errors P_ ((Display *));
+extern void x_fully_uncatch_errors P_ ((void));
extern void x_set_window_size P_ ((struct frame *, int, int, int));
extern void x_set_mouse_position P_ ((struct frame *, int, int));
extern void x_set_mouse_pixel_position P_ ((struct frame *, int, int));
extern void x_make_frame_visible P_ ((struct frame *));
extern void x_make_frame_invisible P_ ((struct frame *));
extern void x_iconify_frame P_ ((struct frame *));
+extern void x_free_frame_resources P_ ((struct frame *));
extern void x_destroy_window P_ ((struct frame *));
extern void x_wm_set_size_hint P_ ((struct frame *, long, int));
extern void x_wm_set_window_state P_ ((struct frame *, int));
extern void x_wm_set_icon_pixmap P_ ((struct frame *, int));
-extern void x_wm_set_icon_position P_ ((struct frame *, int, int));
extern void x_delete_display P_ ((struct x_display_info *));
extern void x_initialize P_ ((void));
-void x_display_cursor P_ ((struct window *, int, int, int, int, int));
-void x_update_cursor P_ ((struct frame *, int));
+extern unsigned long x_copy_color P_ ((struct frame *, unsigned long));
+#ifdef USE_X_TOOLKIT
+extern XtAppContext Xt_app_con;
+extern int x_alloc_lighter_color_for_widget __P ((Widget, Display*, Colormap,
+ unsigned long *,
+ double, int));
+extern void x_activate_timeout_atimer P_ ((void));
+#endif
+extern void x_query_colors P_ ((struct frame *f, XColor *, int));
+extern void x_query_color P_ ((struct frame *f, XColor *));
+extern void x_clear_area P_ ((Display *, Window, int, int, int, int, int));
+extern void set_vertical_scroll_bar P_ ((struct window *));
+
+extern int x_dispatch_event P_ ((XEvent *, Display *));
+extern unsigned int x_x_to_emacs_modifiers P_ ((struct x_display_info *,
+ unsigned));
/* Defined in xselect.c */
extern void x_handle_property_notify P_ ((XPropertyEvent *));
extern void x_handle_selection_notify P_ ((XSelectionEvent *));
-extern void x_handle_selection_request P_ ((struct input_event *));
-extern void x_handle_selection_clear P_ ((struct input_event *));
+extern void x_handle_selection_event P_ ((struct input_event *));
extern void x_clear_frame_selections P_ ((struct frame *));
+extern int x_handle_dnd_message P_ ((struct frame *,
+ XClientMessageEvent *,
+ struct x_display_info *,
+ struct input_event *bufp));
+extern int x_check_property_data P_ ((Lisp_Object));
+extern void x_fill_property_data P_ ((Display *,
+ Lisp_Object,
+ void *,
+ int));
+extern Lisp_Object x_property_data_to_lisp P_ ((struct frame *,
+ unsigned char *,
+ Atom,
+ int,
+ unsigned long));
+
/* Defined in xfns.c */
+extern struct x_display_info * check_x_display_info P_ ((Lisp_Object frame));
extern int have_menus_p P_ ((void));
-extern int x_bitmap_height P_ ((struct frame *, int));
-extern int x_bitmap_width P_ ((struct frame *, int));
-extern int x_bitmap_pixmap P_ ((struct frame *, int));
-extern void x_reference_bitmap P_ ((struct frame *, int));
-extern int x_create_bitmap_from_data P_ ((struct frame *, char *,
- unsigned int, unsigned int));
-extern int x_create_bitmap_from_file P_ ((struct frame *, Lisp_Object));
-extern void x_destroy_bitmap P_ ((struct frame *, int));
-extern void x_set_frame_parameters P_ ((struct frame *, Lisp_Object));
+
+#ifdef USE_GTK
+extern int xg_set_icon P_ ((struct frame *, Lisp_Object));
+extern int xg_set_icon_from_xpm_data P_ ((struct frame *, char**));
+#endif /* USE_GTK */
+
extern void x_real_positions P_ ((struct frame *, int *, int *));
-extern void x_report_frame_params P_ ((struct frame *, Lisp_Object *));
extern int defined_color P_ ((struct frame *, char *, XColor *, int));
extern void x_set_border_pixel P_ ((struct frame *, int));
extern void x_set_menu_bar_lines P_ ((struct frame *, Lisp_Object, Lisp_Object));
extern void x_implicitly_set_name P_ ((struct frame *, Lisp_Object, Lisp_Object));
+extern void xic_free_xfontset P_ ((struct frame *));
+extern void create_frame_xic P_ ((struct frame *));
+extern void destroy_frame_xic P_ ((struct frame *));
+extern void xic_set_preeditarea P_ ((struct window *, int, int));
+extern void xic_set_statusarea P_ ((struct frame *));
+extern void xic_set_xfontset P_ ((struct frame *, char *));
extern int x_pixel_width P_ ((struct frame *));
extern int x_pixel_height P_ ((struct frame *));
extern int x_char_width P_ ((struct frame *));
extern int x_char_height P_ ((struct frame *));
extern int x_screen_planes P_ ((struct frame *));
extern void x_sync P_ ((struct frame *));
+extern int x_defined_color P_ ((struct frame *, char *, XColor *, int));
+#ifdef HAVE_X_I18N
+extern void free_frame_xic P_ ((struct frame *));
+#endif
+extern void x_set_tool_bar_lines P_ ((struct frame *, Lisp_Object, Lisp_Object));
/* Defined in xfaces.c */
-extern int frame_update_line_height P_ ((struct frame *));
extern int compute_glyph_face P_ ((struct frame *, int, int));
extern int compute_glyph_face_1 P_ ((struct frame *, Lisp_Object, int));
+extern void x_free_dpy_colors P_ ((Display *, Screen *, Colormap,
+ unsigned long *, int));
/* Defined in xmenu.c */
+extern void x_menu_set_in_use P_ ((int));
+extern void x_menu_wait_for_event P_ ((void *data));
extern void x_activate_menubar P_ ((struct frame *));
extern int popup_activated P_ ((void));
extern void initialize_frame_menubar P_ ((struct frame *));
+extern void free_frame_menubar P_ ((struct frame *));
/* Defined in widget.c */
#ifdef USE_X_TOOLKIT
extern void widget_store_internal_border P_ ((Widget));
#endif
+
+/* Defined in xsmfns.c */
+#ifdef HAVE_X_SM
+extern void x_session_initialize P_ ((struct x_display_info *dpyinfo));
+extern int x_session_check_input P_ ((struct input_event *bufp));
+extern int x_session_have_connection P_ ((void));
+#endif
+
+#define FONT_TYPE_FOR_UNIBYTE(font, ch) 0
+#define FONT_TYPE_FOR_MULTIBYTE(font, ch) 0
+
+#define STORE_XCHAR2B(chp, b1, b2) \
+ ((chp)->byte1 = (b1), (chp)->byte2 = (b2))
+
+#define XCHAR2B_BYTE1(chp) \
+ ((chp)->byte1)
+
+#define XCHAR2B_BYTE2(chp) \
+ ((chp)->byte2)
+
+
+#define STORE_NATIVE_RECT(nr,rx,ry,rwidth,rheight) \
+ ((nr).x = (rx), \
+ (nr).y = (ry), \
+ (nr).width = (rwidth), \
+ (nr).height = (rheight))
+
+/* arch-tag: 78a7972a-b18f-4694-861a-0780c4b3090e
+ (do not change this comment) */