diff options
author | Eli Zaretskii <eliz@gnu.org> | 2011-06-04 10:41:44 +0300 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2011-06-04 10:41:44 +0300 |
commit | 7893a6bd87a2dac91686ec0c12710a34a3b63f63 (patch) | |
tree | 390ae464a5fbe4db050ce41d221d835ad92ab9a6 /src/dispextern.h | |
parent | ce41f593de11021f4375aa3c09f880586c9efed5 (diff) | |
parent | 48898852e5809718d3d1cee6f548435e493a604b (diff) | |
download | emacs-7893a6bd87a2dac91686ec0c12710a34a3b63f63.tar.gz |
Support bidi reordering of text covered by display properties.
src/bidi.c (bidi_copy_it): Use offsetof instead of emulating it.
(bidi_fetch_char, bidi_fetch_char_advance): New functions.
(bidi_cache_search, bidi_cache_iterator_state)
(bidi_paragraph_init, bidi_resolve_explicit, bidi_resolve_weak)
(bidi_level_of_next_char, bidi_move_to_visually_next): Support
character positions inside a run of characters covered by a
display string.
(bidi_paragraph_init, bidi_resolve_explicit_1)
(bidi_level_of_next_char): Call bidi_fetch_char and
bidi_fetch_char_advance instead of FETCH_CHAR and
FETCH_CHAR_ADVANCE.
(bidi_init_it): Initialize new members.
(LRE_CHAR, RLE_CHAR, PDF_CHAR, LRO_CHAR, RLO_CHAR): Remove macro
definitions.
(bidi_explicit_dir_char): Lookup character type in bidi_type_table,
instead of using explicit *_CHAR codes.
(bidi_resolve_explicit, bidi_resolve_weak): Use
FETCH_MULTIBYTE_CHAR instead of FETCH_CHAR, as reordering of
bidirectional text is supported only in multibyte buffers.
(bidi_init_it): Accept additional argument FRAME_WINDOW_P and use
it to initialize the frame_window_p member of struct bidi_it.
(bidi_cache_iterator_state, bidi_resolve_explicit_1)
(bidi_resolve_explicit, bidi_resolve_weak)
(bidi_level_of_next_char, bidi_move_to_visually_next): Abort if
bidi_it->nchars is non-positive.
(bidi_level_of_next_char): Don't try to lookup the cache for the
next/previous character if nothing is cached there yet, or if we
were just reseat()'ed to a new position.
src/xdisp.c (set_cursor_from_row): Set start and stop points
according to the row's direction when priming the loop that looks
for the glyph on which to display cursor.
(single_display_spec_intangible_p): Function deleted.
(display_prop_intangible_p): Reimplement to call
handle_display_spec instead of single_display_spec_intangible_p.
Accept 3 additional arguments needed by handle_display_spec. This
fixes incorrect cursor motion across display property with complex
values: lists, `(when COND...)' forms, etc.
(single_display_spec_string_p): Support property values that are
lists with the argument STRING its top-level element.
(display_prop_string_p): Fix the condition for processing a
property that is a list to be consistent with handle_display_spec.
(handle_display_spec): New function, refactored from the
last portion of handle_display_prop.
(compute_display_string_pos): Accept additional argument
FRAME_WINDOW_P. Call handle_display_spec to determine whether the
value of a `display' property is a "replacing spec".
(handle_single_display_spec): Accept 2 additional arguments BUFPOS
and FRAME_WINDOW_P. If IT is NULL, don't set up the iterator from
the display property, but just return a value indicating whether
the display property will replace the characters it covers.
(Fcurrent_bidi_paragraph_direction): Initialize the nchars and
frame_window_p members of struct bidi_it.
(compute_display_string_pos, compute_display_string_end): New
functions.
(push_it): Accept second argument POSITION, where pop_it should
jump to continue iteration.
(reseat_1): Initialize bidi_it.disp_pos.
src/keyboard.c (adjust_point_for_property): Adjust the call to
display_prop_intangible_p to its new signature.
src/dispextern.h (struct bidi_it): New member frame_window_p.
(bidi_init_it): Update prototypes.
(display_prop_intangible_p): Update prototype.
(compute_display_string_pos, compute_display_string_end): Declare
prototypes.
(struct bidi_it): New members nchars and disp_pos. ch_len is now
EMACS_INT.
Diffstat (limited to 'src/dispextern.h')
-rw-r--r-- | src/dispextern.h | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/dispextern.h b/src/dispextern.h index e612a8b1eba..15e44e0286e 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -1816,12 +1816,16 @@ struct bidi_stack { bidi_dir_t override; }; -/* Data type for iterating over bidi text. */ +/* Data type for reordering bidirectional text. */ struct bidi_it { EMACS_INT bytepos; /* iterator's position in buffer */ EMACS_INT charpos; - int ch; /* character itself */ - int ch_len; /* length of its multibyte sequence */ + int ch; /* character at that position, or u+FFFC + ("object replacement character") for a run + of characters covered by a display string */ + EMACS_INT nchars; /* its "length", usually 1; it's > 1 for a run + of characters covered by a display string */ + EMACS_INT ch_len; /* its length in bytes */ bidi_type_t type; /* bidi type of this character, after resolving weak and neutral types */ bidi_type_t type_after_w1; /* original type, after overrides and W1 */ @@ -1847,7 +1851,9 @@ struct bidi_it { int first_elt; /* if non-zero, examine current char first */ bidi_dir_t paragraph_dir; /* current paragraph direction */ int new_paragraph; /* if non-zero, we expect a new paragraph */ + int frame_window_p; /* non-zero if displaying on a GUI frame */ EMACS_INT separator_limit; /* where paragraph separator should end */ + EMACS_INT disp_pos; /* position of display string after ch */ }; /* Value is non-zero when the bidi iterator is at base paragraph @@ -2944,7 +2950,7 @@ enum tool_bar_item_image /* Defined in bidi.c */ -extern void bidi_init_it (EMACS_INT, EMACS_INT, struct bidi_it *); +extern void bidi_init_it (EMACS_INT, EMACS_INT, int, struct bidi_it *); extern void bidi_move_to_visually_next (struct bidi_it *); extern void bidi_paragraph_init (bidi_dir_t, struct bidi_it *, int); extern int bidi_mirror_char (int); @@ -2955,7 +2961,7 @@ struct glyph_row *row_containing_pos (struct window *, EMACS_INT, struct glyph_row *, struct glyph_row *, int); int line_bottom_y (struct it *); -int display_prop_intangible_p (Lisp_Object); +int display_prop_intangible_p (Lisp_Object, Lisp_Object, EMACS_INT, EMACS_INT); void resize_echo_area_exactly (void); int resize_mini_window (struct window *, int); #if defined USE_TOOLKIT_SCROLL_BARS && !defined USE_GTK @@ -3005,6 +3011,8 @@ 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 (EMACS_INT, int); +extern EMACS_INT compute_display_string_end (EMACS_INT); #ifdef HAVE_WINDOW_SYSTEM |