X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/358a8b34ac954ca147de9ececa4a51a21e60c97e..0e963201d03d9229bb8ac4323291d2b0119526ed:/src/xterm.h diff --git a/src/xterm.h b/src/xterm.h index e597227c81..3a78292907 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-2015 Free Software Foundation, + Copyright (C) 1989, 1993-1994, 1998-2016 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -70,10 +70,27 @@ typedef GtkWidget *xt_or_gtk_widget; #define USE_GTK_TOOLTIP #endif +#ifdef USE_CAIRO +#include +#ifdef CAIRO_HAS_PDF_SURFACE +#include +#endif +#ifdef CAIRO_HAS_PS_SURFACE +#include +#endif +#ifdef CAIRO_HAS_SVG_SURFACE +#include +#endif +#endif + #ifdef HAVE_X_I18N #include #endif +#ifdef USE_XCB +#include +#endif + #include "dispextern.h" #include "termhooks.h" @@ -115,6 +132,9 @@ struct xim_inst_t struct x_bitmap_record { +#ifdef USE_CAIRO + void *img; +#endif Pixmap pixmap; bool have_mask; Pixmap mask; @@ -123,6 +143,30 @@ struct x_bitmap_record /* Record some info about this pixmap. */ int height, width, depth; }; + +#ifdef USE_CAIRO +struct x_gc_ext_data +{ +#define MAX_CLIP_RECTS 2 + /* Number of clipping rectangles. */ + int n_clip_rects; + + /* Clipping rectangles. */ + XRectangle clip_rects[MAX_CLIP_RECTS]; +}; +#endif + + +struct color_name_cache_entry +{ + struct color_name_cache_entry *next; + XColor rgb; + char *name; +}; + +Status x_parse_color (struct frame *f, const char *color_name, + XColor *color); + /* For each X display, we have a structure that records information about it. */ @@ -356,6 +400,9 @@ struct x_display_info struct xim_inst_t *xim_callback_data; #endif + /* A cache mapping color names to RGB values. */ + struct color_name_cache_entry *color_names; + /* 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; @@ -411,6 +458,14 @@ struct x_display_info /* SM */ Atom Xatom_SM_CLIENT_ID; + +#ifdef USE_CAIRO + XExtCodes *ext_codes; +#endif + +#ifdef USE_XCB + xcb_connection_t *xcb_connection; +#endif }; #ifdef HAVE_X_I18N @@ -628,15 +683,6 @@ struct x_output They are changed only when a different background is involved. */ unsigned long relief_background; - /* 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. */ @@ -645,7 +691,6 @@ struct x_output /* The offset we need to add to compensate for type A WMs. */ int move_offset_top; int move_offset_left; -}; /* Extreme 'short' and 'long' values suitable for libX11. */ #define X_SHRT_MAX 0x7fff @@ -654,6 +699,14 @@ struct x_output #define X_LONG_MIN (-1 - X_LONG_MAX) #define X_ULONG_MAX 0xffffffffUL +#ifdef USE_CAIRO + /* Cairo drawing context. */ + cairo_t *cr_context; + /* Cairo surface for double buffering */ + cairo_surface_t *cr_surface; +#endif +}; + #define No_Cursor (None) enum @@ -759,16 +812,6 @@ enum /* This is the Colormap which frame F uses. */ #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) - 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_XIC(f) ((f)->output_data.x->xic) #define FRAME_X_XIM(f) (FRAME_DISPLAY_INFO (f)->xim) #define FRAME_X_XIM_STYLES(f) (FRAME_DISPLAY_INFO (f)->xim_styles) @@ -939,7 +982,7 @@ struct scroll_bar struct selection_input_event { - int kind; + ENUM_BF (event_kind) kind : EVENT_KIND_WIDTH; struct x_display_info *dpyinfo; /* We spell it with an "o" here because X does. */ Window requestor; @@ -949,28 +992,38 @@ struct selection_input_event /* Unlike macros below, this can't be used as an lvalue. */ INLINE Display * -SELECTION_EVENT_DISPLAY (struct input_event *ev) +SELECTION_EVENT_DISPLAY (struct selection_input_event *ev) { - return ((struct selection_input_event *) ev)->dpyinfo->display; + return ev->dpyinfo->display; } #define SELECTION_EVENT_DPYINFO(eventp) \ - (((struct selection_input_event *) (eventp))->dpyinfo) + ((eventp)->dpyinfo) /* We spell it with an "o" here because X does. */ #define SELECTION_EVENT_REQUESTOR(eventp) \ - (((struct selection_input_event *) (eventp))->requestor) + ((eventp)->requestor) #define SELECTION_EVENT_SELECTION(eventp) \ - (((struct selection_input_event *) (eventp))->selection) + ((eventp)->selection) #define SELECTION_EVENT_TARGET(eventp) \ - (((struct selection_input_event *) (eventp))->target) + ((eventp)->target) #define SELECTION_EVENT_PROPERTY(eventp) \ - (((struct selection_input_event *) (eventp))->property) + ((eventp)->property) #define SELECTION_EVENT_TIME(eventp) \ - (((struct selection_input_event *) (eventp))->time) + ((eventp)->time) /* From xfns.c. */ extern void x_free_gcs (struct frame *); extern void x_relative_mouse_position (struct frame *, int *, int *); +extern void x_real_pos_and_offsets (struct frame *f, + int *left_offset_x, + int *right_offset_x, + int *top_offset_y, + int *bottom_offset_y, + int *x_pixels_diff, + int *y_pixels_diff, + int *xptr, + int *yptr, + int *outer_border); /* From xrdb.c. */ @@ -979,12 +1032,18 @@ XrmDatabase x_load_resources (Display *, const char *, const char *, /* Defined in xterm.c */ +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_check_errors (Display *, const char *) ATTRIBUTE_FORMAT_PRINTF (2, 0); extern bool x_had_errors_p (Display *); extern void x_uncatch_errors (void); +extern void x_uncatch_errors_after_check (void); extern void x_clear_errors (Display *); extern void xembed_request_focus (struct frame *); extern void x_ewmh_activate_frame (struct frame *); @@ -1000,7 +1059,8 @@ 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_clear_area (Display *, Window, int, int, int, int); +extern void x_query_color (struct frame *f, XColor *); +extern void x_clear_area (struct frame *f, int, int, int, int); #if !defined USE_X_TOOLKIT && !defined USE_GTK extern void x_mouse_leave (struct x_display_info *); #endif @@ -1009,6 +1069,14 @@ extern void x_mouse_leave (struct x_display_info *); extern int x_dispatch_event (XEvent *, Display *); #endif extern int x_x_to_emacs_modifiers (struct x_display_info *, int); +#ifdef USE_CAIRO +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_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) @@ -1031,7 +1099,35 @@ x_display_set_last_user_time (struct x_display_info *dpyinfo, Time t) dpyinfo->last_user_time = t; } +INLINE unsigned long +x_make_truecolor_pixel (struct x_display_info *dpyinfo, int r, int g, int b) +{ + unsigned long pr, pg, pb; + + /* 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 + original RGB values are 16-bit values, as usual in X. */ + pr = (r >> (16 - dpyinfo->red_bits)) << dpyinfo->red_offset; + pg = (g >> (16 - dpyinfo->green_bits)) << dpyinfo->green_offset; + pb = (b >> (16 - dpyinfo->blue_bits)) << dpyinfo->blue_offset; + + /* Assemble the pixel color. */ + return pr | pg | pb; +} + +/* If display has an immutable color map, freeing colors is not + necessary and some servers don't allow it, so we won't do it. That + also allows us to make other optimizations relating to server-side + reference counts. */ +INLINE bool +x_mutable_colormap (Visual *visual) +{ + int class = visual->class; + return (class != StaticColor && class != StaticGray && class != TrueColor); +} + extern void x_set_sticky (struct frame *, Lisp_Object, Lisp_Object); +extern bool x_wm_supports (struct frame *, Atom); extern void x_wait_for_event (struct frame *, int); extern void x_clear_under_internal_border (struct frame *f); @@ -1039,7 +1135,7 @@ extern void x_clear_under_internal_border (struct frame *f); 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_handle_selection_event (struct selection_input_event *); extern void x_clear_frame_selections (struct frame *); extern void x_send_client_event (Lisp_Object display,