#if GLYPH_DEBUG
-extern int trace_redisplay_p;
+extern int trace_redisplay_p EXTERNALLY_VISIBLE;
#include <stdio.h>
#define TRACE(X) \
{
/* Metrics of a partial glyph of an image (type == IMAGE_GLYPH). */
struct glyph_slice img;
- /* Start and end indices of glyphs of a graphme cluster of a
+ /* Start and end indices of glyphs of a grapheme cluster of a
composition (type == COMPOSITE_GLYPH). */
struct { int from, to; } cmp;
/* Pixel offsets for upper and lower part of the acronym. */
struct glyph *glyphs;
/* Allocated size of `glyphs'. */
- int nglyphs;
+ ptrdiff_t nglyphs;
/* Number of rows and columns in a matrix. */
int nrows, ncolumns;
struct glyph_row *rows;
/* Number of elements allocated for the vector rows above. */
- int rows_allocated;
+ ptrdiff_t rows_allocated;
/* The number of rows used by the window if all lines were displayed
with the smallest possible character height. */
/* Vertical offset of the right fringe bitmap. */
signed right_fringe_offset : FRINGE_HEIGHT_BITS;
+ /* 1 means that at least one of the left and right fringe bitmaps is
+ periodic and thus depends on the y-position of the row. */
+ unsigned fringe_bitmap_periodic_p : 1;
+
/* 1 means that we must draw the bitmaps of this row. */
unsigned redraw_fringe_bitmaps_p : 1;
struct composition *cmp;
/* If not negative, this string describes a compos. */
- int cmp_id;
+ ptrdiff_t cmp_id;
/* Start and end glyph indices in a glyph-string. */
int cmp_from, cmp_to;
unsigned padding_p : 1;
/* The GC to use for drawing this glyph string. */
-#if defined(HAVE_X_WINDOWS)
+#if defined (HAVE_X_WINDOWS)
GC gc;
#endif
-#if defined(HAVE_NTGUI)
+#if defined (HAVE_NTGUI)
XGCValues *gc;
HDC hdc;
#endif
/* Background stipple or bitmap used for this face. This is
an id as returned from load_pixmap. */
- int stipple;
+ ptrdiff_t stipple;
#else /* not HAVE_WINDOW_SYSTEM */
/* Dummy. */
- int stipple;
+ ptrdiff_t stipple;
#endif /* not HAVE_WINDOW_SYSTEM */
struct face **faces_by_id;
/* The allocated size, and number of used slots of faces_by_id. */
- int size, used;
+ ptrdiff_t size;
+ int used;
/* Flag indicating that attributes of the `menu' face have been
changed. */
face doesn't exist. */
#define FACE_FROM_ID(F, ID) \
- (((unsigned) (ID) < FRAME_FACE_CACHE (F)->used) \
+ (UNSIGNED_CMP (ID, <, FRAME_FACE_CACHE (F)->used) \
? FRAME_FACE_CACHE (F)->faces_by_id[ID] \
: NULL)
/* Data type for describing the bidirectional character types. The
first 7 must be at the beginning, because they are the only values
valid in the `bidi_type' member of `struct glyph'; we only reserve
- 3 bits for it, so we cannot use there values larger than 7. */
+ 3 bits for it, so we cannot use there values larger than 7.
+
+ The order of members must be in sync with the 8th element of the
+ member of unidata-prop-alist (in admin/unidata/unidata-gen.el) for
+ Unicode character property `bidi-class'. */
typedef enum {
UNKNOWN_BT = 0,
STRONG_L, /* strong left-to-right */
EMACS_INT bufpos; /* buffer position of lstring, or 0 if N/A */
unsigned from_disp_str : 1; /* 1 means the string comes from a
display property */
+ unsigned unibyte : 1; /* 1 means the string is unibyte */
};
/* Data type for reordering bidirectional text. */
struct bidi_saved_info next_for_neutral; /* surrounding characters for... */
struct bidi_saved_info prev_for_neutral; /* ...resolving neutrals */
struct bidi_saved_info next_for_ws; /* character after sequence of ws */
- EMACS_INT next_en_pos; /* position of next EN char for ET */
+ EMACS_INT next_en_pos; /* pos. of next char for determining ET type */
+ bidi_type_t next_en_type; /* type of char at next_en_pos */
EMACS_INT ignore_bn_limit; /* position until which to ignore BNs */
bidi_dir_t sor; /* direction of start-of-run in effect */
int scan_dir; /* direction of text scan, 1: forw, -1: back */
+ EMACS_INT disp_pos; /* position of display string after ch */
+ int disp_prop; /* if non-zero, there really is a
+ `display' property/string at disp_pos;
+ if 2, the property is a `space' spec */
int stack_idx; /* index of current data on the stack */
/* Note: Everything from here on is not copied/saved when the bidi
iterator state is saved, pushed, or popped. So only put here
struct bidi_string_data string; /* string to reorder */
bidi_dir_t paragraph_dir; /* current paragraph direction */
EMACS_INT separator_limit; /* where paragraph separator should end */
- EMACS_INT disp_pos; /* position of display string after ch */
unsigned first_elt : 1; /* if non-zero, examine current char first */
unsigned new_paragraph : 1; /* if non-zero, we expect a new paragraph */
unsigned frame_window_p : 1; /* non-zero if displaying on a GUI frame */
EMACS_INT stop_pos;
/* ID number of the composition or glyph-string. If negative, we
are not iterating over a composition now. */
- int id;
+ ptrdiff_t id;
/* If non-negative, character that triggers the automatic
composition at `stop_pos', and this is an automatic composition.
If negative, this is a static composition. This is set to -2
Don't handle some `display' properties in these strings. */
unsigned string_from_display_prop_p : 1;
+ /* 1 means we are iterating an object that came from a value of a
+ `display' property. */
+ unsigned from_disp_prop_p : 1;
+
/* When METHOD == next_element_from_display_vector,
this is 1 if we're doing an ellipsis. Otherwise meaningless. */
unsigned ellipsis_p : 1;
be set at the same time as n_overlay_strings. It is needed
because we show before-strings at the start of invisible text;
see handle_invisible_prop in xdisp.c. */
- int overlay_strings_charpos;
+ EMACS_INT overlay_strings_charpos;
/* Vector of overlays to process. Overlay strings are processed
OVERLAY_STRING_CHUNK_SIZE at a time. */
struct {
Lisp_Object object;
struct it_slice slice;
- int image_id;
+ ptrdiff_t image_id;
} image;
/* method == GET_FROM_COMPOSITION */
struct {
Lisp_Object from_overlay;
enum glyph_row_area area;
enum it_method method;
+ bidi_dir_t paragraph_embedding;
unsigned multibyte_p : 1;
unsigned string_from_display_prop_p : 1;
unsigned display_ellipsis_p : 1;
unsigned avoid_cursor_p : 1;
unsigned bidi_p:1;
+ unsigned from_disp_prop_p : 1;
enum line_wrap_method line_wrap;
/* properties from display property that are reset by another display property. */
/* -1 means selective display hides everything between a \r and the
next newline; > 0 means hide lines indented more than that value. */
- int selective;
+ EMACS_INT selective;
/* An enumeration describing what the next display element is
after a call to get_next_display_element. */
enum glyphless_display_method glyphless_method;
/* If what == IT_IMAGE, the id of the image to display. */
- int image_id;
+ ptrdiff_t image_id;
/* Values from `slice' property. */
struct it_slice slice;
Lisp_Object font_height;
/* Object and position where the current display element came from.
- Object can be a Lisp string in case the current display element
- comes from an overlay string, or it is buffer. It may also be nil
- during mode-line update. Position is a position in object. */
+ Object is normally the buffer which is being rendered, but it can
+ also be a Lisp string in case the current display element comes
+ from an overlay string or from a display string (before- or
+ after-string). It may also be nil when a C string is being
+ rendered, e.g., during mode-line or header-line update. It can
+ also be a cons cell of the form `(space ...)', when we produce a
+ stretch glyph from a `display' specification. Finally, it can be
+ a zero-valued Lisp integer, but only temporarily, when we are
+ producing special glyphs for display purposes, like truncation
+ and continuation glyphs, or blanks that extend each line to the
+ edge of the window on a TTY.
+
+ Position is the current iterator position in object. */
Lisp_Object object;
struct text_pos position;
void (*flush_display) (struct frame *f);
/* Flush the display of frame F if non-NULL. This is called
- during redisplay, and should be NULL on systems which flushes
+ during redisplay, and should be NULL on systems which flush
automatically before reading input. */
void (*flush_display_optional) (struct frame *f);
- /* Clear the mouse hightlight in window W, if there is any. */
+ /* Clear the mouse highlight in window W, if there is any. */
void (*clear_window_mouse_face) (struct window *w);
/* Set *LEFT and *RIGHT to the left and right overhang of GLYPH on
{
/* The time in seconds at which the image was last displayed. Set
in prepare_image_for_display. */
- unsigned long timestamp;
+ time_t timestamp;
/* Pixmaps of the image. */
Pixmap pixmap, mask;
/* 1 means that loading the image failed. Don't try again. */
unsigned load_failed_p;
- /* A place for image types to store additional data. The member
- data.lisp_val is marked during GC, so it's safe to store Lisp data
- there. Image types should free this data when their `free'
- function is called. */
- struct
- {
- int int_val;
- void *ptr_val;
- Lisp_Object lisp_val;
- } data;
+ /* A place for image types to store additional data. It is marked
+ during GC. */
+ Lisp_Object lisp_data;
/* Hash value of image specification to speed up comparisons. */
- unsigned hash;
+ EMACS_UINT hash;
/* Image id of this image. */
- int id;
+ ptrdiff_t id;
/* Hash collision chain. */
struct image *next, *prev;
struct image **images;
/* Allocated size of `images'. */
- unsigned size;
+ ptrdiff_t size;
/* Number of images in the cache. */
- unsigned used;
+ ptrdiff_t used;
/* Reference count (number of frames sharing this cache). */
- int refcount;
+ ptrdiff_t refcount;
};
extern int bidi_mirror_char (int);
extern void bidi_push_it (struct bidi_it *);
extern void bidi_pop_it (struct bidi_it *);
+extern void *bidi_shelve_cache (void);
+extern void bidi_unshelve_cache (void *, int);
/* Defined in xdisp.c */
extern int last_tool_bar_item;
extern void reseat_at_previous_visible_line_start (struct it *);
extern Lisp_Object lookup_glyphless_char_display (int, struct it *);
-extern int calc_pixel_width_or_height (double *, struct it *, Lisp_Object,
- struct font *, int, int *);
extern EMACS_INT compute_display_string_pos (struct text_pos *,
- struct bidi_string_data *, int);
+ struct bidi_string_data *,
+ int, int *);
extern EMACS_INT compute_display_string_end (EMACS_INT,
struct bidi_string_data *);
+extern void produce_stretch_glyph (struct it *);
+
#ifdef HAVE_WINDOW_SYSTEM
#if GLYPH_DEBUG
-extern void dump_glyph_string (struct glyph_string *);
+extern void dump_glyph_string (struct glyph_string *) EXTERNALLY_VISIBLE;
#endif
extern void x_get_glyph_overhangs (struct glyph *, struct frame *,
void w32_init_fringe (struct redisplay_interface *);
void w32_reset_fringes (void);
#endif
+
+extern unsigned row_hash (struct glyph_row *);
+
/* Defined in image.c */
#ifdef HAVE_WINDOW_SYSTEM
-extern int x_bitmap_height (struct frame *, int);
-extern int x_bitmap_width (struct frame *, int);
-extern int x_bitmap_pixmap (struct frame *, int);
-extern void x_reference_bitmap (struct frame *, int);
-extern int x_create_bitmap_from_data (struct frame *, char *,
- unsigned int, unsigned int);
-extern int x_create_bitmap_from_file (struct frame *, Lisp_Object);
+extern int x_bitmap_height (struct frame *, ptrdiff_t);
+extern int x_bitmap_width (struct frame *, ptrdiff_t);
+extern int x_bitmap_pixmap (struct frame *, ptrdiff_t);
+extern void x_reference_bitmap (struct frame *, ptrdiff_t);
+extern ptrdiff_t x_create_bitmap_from_data (struct frame *, char *,
+ unsigned int, unsigned int);
+extern ptrdiff_t x_create_bitmap_from_file (struct frame *, Lisp_Object);
#if defined HAVE_XPM && defined HAVE_X_WINDOWS && !defined USE_GTK
-extern int x_create_bitmap_from_xpm_data (struct frame *f, const char **bits);
+extern ptrdiff_t x_create_bitmap_from_xpm_data (struct frame *, const char **);
#endif
#ifndef x_destroy_bitmap
-extern void x_destroy_bitmap (struct frame *, int);
+extern void x_destroy_bitmap (struct frame *, ptrdiff_t);
#endif
extern void x_destroy_all_bitmaps (Display_Info *);
-extern int x_create_bitmap_mask (struct frame * , int);
+extern int x_create_bitmap_mask (struct frame *, ptrdiff_t);
extern Lisp_Object x_find_image_file (Lisp_Object);
void x_kill_gs_process (Pixmap, struct frame *);
void mark_image_cache (struct image_cache *);
int valid_image_p (Lisp_Object);
void prepare_image_for_display (struct frame *, struct image *);
-int lookup_image (struct frame *, Lisp_Object);
+ptrdiff_t lookup_image (struct frame *, Lisp_Object);
unsigned long image_background (struct image *, struct frame *,
XImagePtr_or_DC ximg);
EMACS_INT pos, EMACS_INT bufpos,
EMACS_INT region_beg, EMACS_INT region_end,
EMACS_INT *endptr, enum face_id, int mouse);
-int merge_faces (struct frame *, Lisp_Object, int, int);
+int merge_faces (struct frame *, Lisp_Object, EMACS_INT, int);
int compute_char_face (struct frame *, int, Lisp_Object);
void free_all_realized_faces (Lisp_Object);
extern Lisp_Object Qforeground_color, Qbackground_color;
-extern Lisp_Object Qframe_set_background_mode;
extern char unspecified_fg[], unspecified_bg[];
/* Defined in xfns.c */
extern void set_tty_color_mode (struct tty_display_info *, struct frame *);
extern struct terminal *get_named_tty (const char *);
EXFUN (Ftty_type, 1);
+EXFUN (Fcontrolling_tty_p, 1);
extern void create_tty_output (struct frame *);
extern struct terminal *init_tty (const char *, const char *, int);
+extern void tty_append_glyph (struct it *);
/* Defined in scroll.c */