comparison src/ChangeLog @ 107648:babfb0a156a1

Initial support for bidirectional editing. 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.
author Eli Zaretskii <eliz@gnu.org>
date Tue, 30 Mar 2010 05:13:07 -0400
parents dbd787c249c5
children c7340d934f35
comparison
equal deleted inserted replaced
107582:97afa1904e05 107648:babfb0a156a1
1 2010-03-30 Eli Zaretskii <eliz@gnu.org>
2
3 Initial support for bidirectional editing.
4
5 * Makefile.in (obj): Include bidi.o.
6 (bidi.o): New target.
7
8 * makefile.w32-in (OBJ1): Add $(BLD)/bidi.$(O).
9 ($(BLD)/bidi.$(O)): New target.
10
11 * bidi.c: New file.
12
13 * buffer.h (struct buffer): New members bidi_display_reordering
14 and bidi_paragraph_direction.
15
16 * buffer.c (init_buffer_once): Initialize bidi_display_reordering
17 and bidi_paragraph_direction.
18 (syms_of_buffer): Declare Lisp variables bidi-display-reordering
19 and bidi-paragraph-direction.
20 (Fbuffer_swap_text): Swap the values of
21 bidi_display_reordering and bidi_paragraph_direction.
22
23 * dispextern.h (BIDI_MAXLEVEL, BIDI_AT_BASE_LEVEL): New macros.
24 (bidi_type_t, bidi_dir_t): New types.
25 (bidi_saved_info, bidi_stack, bidi_it): New structures.
26 (struct it): New members bidi_p, bidi_it, paragraph_embedding,
27 prev_stop, base_level_stop, and eol_pos.
28 (bidi_init_it, bidi_get_next_char_visually): New prototypes.
29 (IT_STACK_SIZE): Enlarge to 5.
30 (struct glyph_row): New member reversed_p.
31 <string_buffer_position>: Update prototype.
32 (PRODUCE_GLYPHS): Set the reversed_p flag in the iterator's
33 glyph_row if bidi_it.paragraph_dir == R2L.
34 (struct glyph): New members resolved_level and bidi_type.
35
36 * dispnew.c (direct_output_forward_char): Give up if we need bidi
37 processing or buffer's direction is right-to-left.
38 (prepare_desired_row): Preserve the reversed_p flag.
39 (row_equal_p): Compare the reversed_p attributes as well.
40
41 * xdisp.c (init_iterator): Initialize it->bidi_p. Call
42 bidi_init_it and set it->paragraph_embedding from the current
43 buffer's value of bidi_paragraph_direction.
44 (reseat_1): Initialize bidi_it.first_elt.
45 (set_iterator_to_next, next_element_from_buffer): Use the value of
46 paragraph_embedding to determine the paragraph direction.
47 (set_iterator_to_next): Under bidi reordering, call
48 bidi_get_next_char_visually. Call bidi_paragraph_init if the
49 new_paragraph flag is set in the bidi iterator.
50 (next_element_from_buffer): If bidi_it.first_elt is set,
51 initialize paragraph direction and find the first character to
52 display in the visual order. If reseated to a middle of a line,
53 prime the bidi iterator starting at the line's beginning. Handle
54 the situation where we overstepped stop_charpos due to
55 non-linearity of the bidi iteration. Likewise for when we back up
56 beyond the previous stop_charpos. When moving across stop_charpos,
57 record it in prev_stop.
58 (display_line): Set row->end and it->start for the next row to the
59 next character in logical order. Always extend reversed_p rows to
60 the end of line, even if they end at ZV. Copy the reversed_p flag
61 to the next glyph row. Keep calling set_cursor_from_row for
62 bidi-reordered rows even if we already have a possible candidate
63 for cursor position. Set row_end after all the row's glyphs have
64 been produced, by looping over the glyphs. Record the position
65 after EOL in it->eol_pos, and use it to set end_pos of the last
66 row produced for a continued line.
67 <Qright_to_left, Qleft_to_right>: New variables.
68 (syms_of_xdisp): Initialize and staticpro them.
69 (string_buffer_position_lim): New function.
70 (string_buffer_position): Most of code moved to
71 string_buffer_position_lim. Last argument and return value are
72 now EMACS_INT; all callers changed.
73 (set_cursor_from_row): Rewritten to support bidirectional text and
74 reversed glyph rows.
75 (text_outside_line_unchanged_p, try_window_id): Disable
76 optimizations if we are reordering bidirectional text and the
77 paragraph direction can be affected by the change.
78 (append_glyph, append_composite_glyph)
79 (produce_image_glyph, append_stretch_glyph): Set the
80 resolved_level and bidi_type members of each glyph.
81 (append_glyph): If the glyph row is reversed, prepend the glyph
82 rather than appending it.
83 (handle_stop_backwards): New function.
84 (reseat_1, pop_it, push_it): Set prev_stop and base_level_stop.
85 (reseat): call handle_stop_backwards to recompute prev_stop and
86 base_level_stop for the new position.
87 (handle_invisible_prop): Under bidi iteration, skip invisible text
88 using bidi_get_next_char_visually. If we are `reseat'ed, init the
89 paragraph direction. Update IT->prev_stop after skipping
90 invisible text.
91 (move_it_in_display_line_to): New variables prev_method
92 and prev_pos. Compare for strict equality in
93 BUFFER_POS_REACHED_P.
94 (try_cursor_movement): Examine all the candidate rows that occlude
95 point, to return the best match. If rows are bidi-reordered
96 and point moved backwards, back up to the row that is not a
97 continuation line, and start looking for a suitable row from
98 there.
99
100 * term.c (append_glyph): Reverse glyphs by pre-pending them,
101 rather than appending, if the glyph_row's reversed_p flag is set.
102 Set the resolved_level and bidi_type members of each glyph.
103
104 * .gdbinit (pbiditype): New command.
105 (pgx): Use it to display bidi level and type of the glyph.
106 (pitx): Display some bidi information about the iterator.
107 (prowlims, pmtxrows): New commands.
108
1 2010-03-30 Dan Nicolaescu <dann@ics.uci.edu> 109 2010-03-30 Dan Nicolaescu <dann@ics.uci.edu>
2 110
3 Remove all uses of C_DEBUG_SWITCH and LIBS_DEBUG. 111 Remove all uses of C_DEBUG_SWITCH and LIBS_DEBUG.
4 * s/usg5-4.h (LIBS_DEBUG): 112 * s/usg5-4.h (LIBS_DEBUG):
5 * s/irix6-5.h (C_DEBUG_SWITCH): 113 * s/irix6-5.h (C_DEBUG_SWITCH):