• Eli Zaretskii's avatar
    Initial support for bidirectional editing. · a7b02820
    Eli Zaretskii authored
     Makefile.in (obj): Include bidi.o.
     (bidi.o): New target.
     makefile.w32-in (OBJ1): Add $(BLD)/bidi.$(O).
     ($(BLD)/bidi.$(O)): New target.
     bidi.c: New file.
     buffer.h (struct buffer): New members bidi_display_reordering
     and bidi_paragraph_direction.
     buffer.c (init_buffer_once): Initialize bidi_display_reordering
     and bidi_paragraph_direction.
     (syms_of_buffer): Declare Lisp variables bidi-display-reordering
     and bidi-paragraph-direction.
     (Fbuffer_swap_text): Swap the values of
     bidi_display_reordering and bidi_paragraph_direction.
     dispextern.h (BIDI_MAXLEVEL, BIDI_AT_BASE_LEVEL): New macros.
     (bidi_type_t, bidi_dir_t): New types.
     (bidi_saved_info, bidi_stack, bidi_it): New structures.
     (struct it): New members bidi_p, bidi_it, paragraph_embedding,
     prev_stop, base_level_stop, and eol_pos.
     (bidi_init_it, bidi_get_next_char_visually): New prototypes.
     (IT_STACK_SIZE): Enlarge to 5.
     (struct glyph_row): New member reversed_p.
     <string_buffer_position>: Update prototype.
     (PRODUCE_GLYPHS): Set the reversed_p flag in the iterator's
     glyph_row if bidi_it.paragraph_dir == R2L.
     (struct glyph): New members resolved_level and bidi_type.
     dispnew.c (direct_output_forward_char): Give up if we need bidi
     processing or buffer's direction is right-to-left.
     (prepare_desired_row): Preserve the reversed_p flag.
     (row_equal_p): Compare the reversed_p attributes as well.
     xdisp.c (init_iterator): Initialize it->bidi_p.  Call
     bidi_init_it and set it->paragraph_embedding from the current
     buffer's value of bidi_paragraph_direction.
     (reseat_1): Initialize bidi_it.first_elt.
     (set_iterator_to_next, next_element_from_buffer): Use the value of
     paragraph_embedding to determine the paragraph direction.
     (set_iterator_to_next): Under bidi reordering, call
     bidi_get_next_char_visually.  Call bidi_paragraph_init if the
     new_paragraph flag is set in the bidi iterator.
     (next_element_from_buffer): If bidi_it.first_elt is set,
     initialize paragraph direction and find the first character to
     display in the visual order.  If reseated to a middle of a line,
     prime the bidi iterator starting at the line's beginning.  Handle
     the situation where we overstepped stop_charpos due to
     non-linearity of the bidi iteration.  Likewise for when we back up
     beyond the previous stop_charpos.  When moving across stop_charpos,
     record it in prev_stop.
     (display_line): Set row->end and it->start for the next row to the
     next character in logical order.  Always extend reversed_p rows to
     the end of line, even if they end at ZV.  Copy the reversed_p flag
     to the next glyph row.  Keep calling set_cursor_from_row for
     bidi-reordered rows even if we already have a possible candidate
     for cursor position.  Set row_end after all the row's glyphs have
     been produced, by looping over the glyphs.  Record the position
     after EOL in it->eol_pos, and use it to set end_pos of the last
     row produced for a continued line.
     <Qright_to_left, Qleft_to_right>: New variables.
     (syms_of_xdisp): Initialize and staticpro them.
     (string_buffer_position_lim): New function.
     (string_buffer_position): Most of code moved to
     string_buffer_position_lim.  Last argument and return value are
     now EMACS_INT; all callers changed.
     (set_cursor_from_row): Rewritten to support bidirectional text and
     reversed glyph rows.
     (text_outside_line_unchanged_p, try_window_id): Disable
     optimizations if we are reordering bidirectional text and the
     paragraph direction can be affected by the change.
     (append_glyph, append_composite_glyph)
     (produce_image_glyph, append_stretch_glyph): Set the
     resolved_level and bidi_type members of each glyph.
     (append_glyph): If the glyph row is reversed, prepend the glyph
     rather than appending it.
     (handle_stop_backwards): New function.
     (reseat_1, pop_it, push_it): Set prev_stop and base_level_stop.
     (reseat): call handle_stop_backwards to recompute prev_stop and
     base_level_stop for the new position.
     (handle_invisible_prop): Under bidi iteration, skip invisible text
     using bidi_get_next_char_visually.  If we are `reseat'ed, init the
     paragraph direction.  Update IT->prev_stop after skipping
     invisible text.
     (move_it_in_display_line_to): New variables prev_method
     and prev_pos.  Compare for strict equality in
     BUFFER_POS_REACHED_P.
     (try_cursor_movement): Examine all the candidate rows that occlude
     point, to return the best match.  If rows are bidi-reordered
     and point moved backwards, back up to the row that is not a
     continuation line, and start looking for a suitable row from
     there.
     term.c (append_glyph): Reverse glyphs by pre-pending them,
     rather than appending, if the glyph_row's reversed_p flag is set.
     Set the resolved_level and bidi_type members of each glyph.
     .gdbinit (pbiditype): New command.
     (pgx): Use it to display bidi level and type of the glyph.
     (pitx): Display some bidi information about the iterator.
     (prowlims, pmtxrows): New commands.
     files.el: Make bidi-display-reordering safe variable for boolean
     values.
     mule.texi (International): Mention support of bidirectional editing.
     (Bidirectional Editing): New section.
     HELLO: Reorder Arabic and Hebrew into logical order, and
     insert RLM before the opening paren, to make the display more
     reasonable.  Add setting for bidi-display-reordering in the local
     variables section.
     NEWS: Mention initial support for bidirectional editing.
    a7b02820
Makefile.in 48 KB