#include <X11/Xlib.h>
#include <X11/cursorfont.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>
#include <X11/Xresource.h>
#ifdef USE_X_TOOLKIT
#include <X11/StringDefs.h>
#include <X11/IntrinsicP.h>
#include <X11/CoreP.h>
#include <X11/StringDefs.h>
#endif
#define EMACS_CLASS "Emacs"
#ifdef PBaseSize
#if (!defined AIX) || (defined AIX3_2)
#define HAVE_X11R4
#endif
#endif
#ifdef HAVE_X11R5
#define HAVE_X11R4
#endif
#ifdef HAVE_X_I18N
#include <X11/Xlocale.h>
#endif
#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_bounds.width)
#define FONT_HEIGHT(f) ((f)->ascent + (f)->descent)
#define FONT_BASE(f) ((f)->ascent)
#define STANDARD_EVENT_SET \
(KeyPressMask \
| ExposureMask \
| ButtonPressMask \
| ButtonReleaseMask \
| PointerMotionMask \
| StructureNotifyMask \
| FocusChangeMask \
| LeaveWindowMask \
| EnterWindowMask \
| VisibilityChangeMask)
enum text_cursor_kinds
{
NO_CURSOR = -1,
FILLED_BOX_CURSOR,
HOLLOW_BOX_CURSOR,
BAR_CURSOR
};
struct x_bitmap_record
{
Pixmap pixmap;
char *file;
int refcount;
int height, width, depth;
};
struct x_display_info
{
struct x_display_info *next;
int connection;
Display *display;
Lisp_Object name_list_element;
int reference_count;
Screen *screen;
double resx, resy;
Visual *visual;
Colormap cmap;
int n_planes;
int height, width;
int grabbed;
int icon_bitmap_id;
Window root_window;
Cursor vertical_scroll_bar_cursor;
XrmDatabase xrdb;
struct font_info *font_table;
int font_table_size;
int smallest_char_width;
int smallest_font_height;
GC scratch_cursor_gc;
int mouse_face_beg_row, mouse_face_beg_col;
int mouse_face_beg_x, mouse_face_beg_y;
int mouse_face_end_row, mouse_face_end_col;
int mouse_face_end_x, mouse_face_end_y;
int mouse_face_past_end;
Lisp_Object mouse_face_window;
int mouse_face_face_id;
Lisp_Object mouse_face_overlay;
int mouse_face_deferred_gc;
struct frame *mouse_face_mouse_frame;
int mouse_face_mouse_x, mouse_face_mouse_y;
int mouse_face_defer;
int mouse_face_image_state;
char *x_id_name;
int n_fonts;
struct x_bitmap_record *bitmaps;
int bitmaps_size;
int bitmaps_last;
int meta_mod_mask, shift_lock_mask;
int alt_mod_mask, super_mod_mask, hyper_mod_mask;
Atom Xatom_wm_protocols;
Atom Xatom_wm_take_focus;
Atom Xatom_wm_save_yourself;
Atom Xatom_wm_delete_window;
Atom Xatom_wm_change_state;
Atom Xatom_wm_configure_denied;
Atom Xatom_wm_window_moved;
Atom Xatom_editres;
Atom Xatom_CLIPBOARD, Xatom_TIMESTAMP, Xatom_TEXT, Xatom_DELETE,
Xatom_COMPOUND_TEXT,
Xatom_MULTIPLE, Xatom_INCR, Xatom_EMACS_TMP, Xatom_TARGETS, Xatom_NULL,
Xatom_ATOM_PAIR;
Atom Xatom_PIXEL_SIZE,
Xatom_MULE_BASELINE_OFFSET, Xatom_MULE_RELATIVE_COMPOSE,
Xatom_MULE_DEFAULT_ASCENT;
Atom Xatom_DONE, Xatom_PAGE;
Atom Xatom_Scrollbar;
#ifdef MULTI_KBOARD
struct kboard *kboard;
#endif
int cut_buffers_initialized;
struct frame *x_focus_frame;
struct frame *x_focus_event_frame;
struct frame *x_highlight_frame;
Pixmap null_pixel;
Pixmap gray;
struct image_cache *image_cache;
#ifdef HAVE_X_I18N
XIM xim;
XIMStyles *xim_styles;
#endif
XColor *color_cells;
int ncolor_cells;
};
extern void check_x P_ ((void));
extern struct frame *x_window_to_frame P_ ((struct x_display_info *, int));
#ifdef USE_X_TOOLKIT
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
extern struct x_display_info *x_display_list;
extern Lisp_Object x_display_name_list;
extern Lisp_Object Vx_pixel_size_width_font_regexp;
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));
extern struct x_display_info *x_term_init P_ ((Lisp_Object, char *, char *));
extern Lisp_Object x_list_fonts P_ ((struct frame *, Lisp_Object, int, int));
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 *));
struct x_output
{
int left_pos;
int top_pos;
int border_width;
int pixel_height, pixel_width;
int menubar_height;
int line_height;
Pixmap border_tile;
GC normal_gc;
GC reverse_gc;
GC cursor_gc;
int internal_border_width;
Window window_desc;
Window icon_desc;
Window parent_desc;
#ifdef USE_X_TOOLKIT
Widget widget;
Widget column_widget;
Widget edit_widget;
Widget menubar_widget;
#endif
int icon_bitmap;
XFontStruct *font;
int baseline_offset;
int fontset;
unsigned long background_pixel;
unsigned long foreground_pixel;
unsigned long cursor_pixel;
unsigned long border_pixel;
unsigned long mouse_pixel;
unsigned long cursor_foreground_pixel;
unsigned long scroll_bar_foreground_pixel;
unsigned long scroll_bar_background_pixel;
Cursor text_cursor;
Cursor nontext_cursor;
Cursor modeline_cursor;
Cursor cross_cursor;
Cursor hourglass_cursor;
Cursor horizontal_drag_cursor;
Window hourglass_window;
unsigned hourglass_p : 1;
int needs_exposure;
enum text_cursor_kinds current_cursor;
enum text_cursor_kinds desired_cursor;
int cursor_width;
XWMHints wm_hints;
int vertical_scroll_bar_extra;
int flags_areas_extra;
int win_gravity;
int size_hint_flags;
struct x_display_info *display_info;
XEvent *saved_menu_event;
#ifdef USE_X_TOOLKIT
int id;
#endif
char explicit_parent;
char asked_for_visible;
char has_been_visible;
#ifdef HAVE_X_I18N
XIC xic;
XIMStyle xic_style;
XFontSet xic_xfs;
#endif
struct relief
{
GC gc;
unsigned long pixel;
int allocated_p;
}
black_relief, white_relief;
unsigned long relief_background;
int wait_for_wm;
};
#define FRAME_X_WINDOW(f) ((f)->output_data.x->window_desc)
#ifdef USE_X_TOOLKIT
#define FRAME_OUTER_WINDOW(f) (XtWindow ((f)->output_data.x->widget))
#else
#define FRAME_OUTER_WINDOW(f) (FRAME_X_WINDOW (f))
#endif
#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_MENUBAR_HEIGHT(f) ((f)->output_data.x->menubar_height)
#define FRAME_LINE_HEIGHT(f) ((f)->output_data.x->line_height)
#define FRAME_DEFAULT_FONT_WIDTH(F) FONT_WIDTH (FRAME_FONT (F))
#define FRAME_X_DISPLAY_INFO(f) ((f)->output_data.x->display_info)
#define FRAME_X_DISPLAY(f) (FRAME_X_DISPLAY_INFO (f)->display)
#define FRAME_X_SCREEN(f) (FRAME_X_DISPLAY_INFO (f)->screen)
#define FRAME_X_SCREEN_NUMBER(f) XScreenNumberOfScreen (FRAME_X_SCREEN (f))
#define FRAME_X_VISUAL(f) FRAME_X_DISPLAY_INFO (f)->visual
#define FRAME_X_COLORMAP(f) FRAME_X_DISPLAY_INFO (f)->cmap
#define FRAME_X_FONT_TABLE(f) (FRAME_X_DISPLAY_INFO (f)->font_table)
#define PIXEL_WIDTH(f) ((f)->output_data.x->pixel_width)
#define PIXEL_HEIGHT(f) ((f)->output_data.x->pixel_height)
#define FRAME_DESIRED_CURSOR(f) ((f)->output_data.x->desired_cursor)
#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_SMALLEST_CHAR_WIDTH(F) \
FRAME_X_DISPLAY_INFO(F)->smallest_char_width
#define FRAME_SMALLEST_FONT_HEIGHT(F) \
FRAME_X_DISPLAY_INFO(F)->smallest_font_height
#define FRAME_X_IMAGE_CACHE(F) FRAME_X_DISPLAY_INFO ((F))->image_cache
#define FRAME_FLAGS_BITMAP_WIDTH(f) 8
#define FRAME_FLAGS_BITMAP_HEIGHT(f) 8
#define FRAME_X_FLAGS_AREA_COLS(F) \
((2 * 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)))
#define FRAME_X_LEFT_FLAGS_AREA_WIDTH(F) \
(FRAME_X_FLAGS_AREA_WIDTH (F) / 2)
#define FRAME_X_RIGHT_FLAGS_AREA_WIDTH(F) \
(FRAME_X_FLAGS_AREA_WIDTH (F) - FRAME_X_FLAGS_AREA_WIDTH (F) / 2)
struct scroll_bar
{
EMACS_INT size_from_Lisp_Vector_struct;
struct Lisp_Vector *next_from_Lisp_Vector_struct;
Lisp_Object window;
Lisp_Object next, prev;
Lisp_Object x_window_low, x_window_high;
Lisp_Object top, left, width, height;
Lisp_Object start, end;
Lisp_Object dragging;
};
#define SCROLL_BAR_VEC_SIZE \
((sizeof (struct scroll_bar) \
- sizeof (EMACS_INT) - sizeof (struct Lisp_Vector *)) \
/ sizeof (Lisp_Object))
#define XSCROLL_BAR(vec) ((struct scroll_bar *) XVECTOR (vec))
#define SCROLL_BAR_PACK(low, high) (XINT (high) << 16 | XINT (low))
#define SCROLL_BAR_UNPACK(low, high, int32) \
(XSETINT ((low), (int32) & 0xffff), \
XSETINT ((high), ((int32) >> 16) & 0xffff))
#define SCROLL_BAR_X_WINDOW(ptr) \
((Window) SCROLL_BAR_PACK ((ptr)->x_window_low, (ptr)->x_window_high))
#define SET_SCROLL_BAR_X_WINDOW(ptr, id) \
(SCROLL_BAR_UNPACK ((ptr)->x_window_low, (ptr)->x_window_high, (int) id))
#define SCROLL_BAR_X_WIDGET(dpy, ptr) \
XtWindowToWidget (dpy, SCROLL_BAR_X_WINDOW (ptr))
#define SET_SCROLL_BAR_X_WIDGET(ptr, w) \
do { \
Window window = XtWindow (w); \
SET_SCROLL_BAR_X_WINDOW (ptr, window); \
} while (0)
#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)
#define VERTICAL_SCROLL_BAR_TOP_RANGE(f, height) \
(VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (f, height) - VERTICAL_SCROLL_BAR_MIN_HANDLE)
#define VERTICAL_SCROLL_BAR_INSIDE_HEIGHT(f, height) \
((height) - VERTICAL_SCROLL_BAR_TOP_BORDER - VERTICAL_SCROLL_BAR_BOTTOM_BORDER)
#define VERTICAL_SCROLL_BAR_LEFT_BORDER (2)
#define VERTICAL_SCROLL_BAR_RIGHT_BORDER (2)
#define VERTICAL_SCROLL_BAR_TOP_BORDER (2)
#define VERTICAL_SCROLL_BAR_BOTTOM_BORDER (2)
#define VERTICAL_SCROLL_BAR_MIN_HANDLE (5)
#define VERTICAL_SCROLL_BAR_WIDTH_TRIM (0)
#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))
#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)
#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))
#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)))
struct selection_input_event
{
int kind;
Display *display;
Window requestor;
Atom selection, target, property;
Time time;
};
#define SELECTION_EVENT_DISPLAY(eventp) \
(((struct selection_input_event *) (eventp))->display)
#define SELECTION_EVENT_REQUESTOR(eventp) \
(((struct selection_input_event *) (eventp))->requestor)
#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)
struct window;
struct glyph_matrix;
struct frame;
struct input_event;
struct face;
struct image;
void x_handle_selection_notify P_ ((XSelectionEvent *));
void x_handle_property_notify P_ ((XPropertyEvent *));
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);
int image_ascent P_ ((struct image *, struct face *));
extern void x_free_gcs P_ ((struct frame *));
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 *,
XrmRepresentation, XrmValue *));
void x_delete_display P_ ((struct x_display_info *));
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_ ((struct frame *, Colormap, XColor *));
extern void pixel_to_glyph_coords P_ ((struct frame *, int, int,
int *, int *, XRectangle *, int));
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_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 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_raise_frame P_ ((struct frame *));
extern void x_lower_frame P_ ((struct frame *));
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));
extern void x_display_cursor P_ ((struct window *, int, int, int, int, int));
extern 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;
#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 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_clear_frame_selections P_ ((struct 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));
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 unsigned char * x_encode_text P_ ((Lisp_Object, Lisp_Object,
int *, int *));
extern void x_implicitly_set_name P_ ((struct frame *, Lisp_Object, Lisp_Object));
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 enum text_cursor_kinds x_specified_cursor_type P_ ((Lisp_Object, int *));
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));
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));
extern void x_activate_menubar P_ ((struct frame *));
extern int popup_activated P_ ((void));
extern void initialize_frame_menubar P_ ((struct frame *));
#ifdef USE_X_TOOLKIT
extern void widget_store_internal_border P_ ((Widget));
#endif