From: Eli Zaretskii Date: Tue, 30 Mar 2010 09:13:07 +0000 (-0400) Subject: Initial support for bidirectional editing. X-Git-Tag: emacs-pretest-24.0.90~104^2~275^2~438^2~635 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a7b028203499410a9f4bebe8220be8f3a9ce598b;p=emacs.git 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. : 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. : 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. --- a7b028203499410a9f4bebe8220be8f3a9ce598b diff --cc doc/emacs/ChangeLog index 04f30a689d8,f4742c904bc..e23f129a168 --- a/doc/emacs/ChangeLog +++ b/doc/emacs/ChangeLog @@@ -1,3 -1,3 +1,8 @@@ ++2010-03-30 Eli Zaretskii ++ ++ * mule.texi (International): Mention support of bidirectional editing. ++ (Bidirectional Editing): New section. ++ 2010-03-28 Nick Roberts * emacs.texi (Top): Update node names to those in building.texi. diff --cc etc/ChangeLog index a00cd71bb96,a00cd71bb96..c4a678c2950 --- a/etc/ChangeLog +++ b/etc/ChangeLog @@@ -1,3 -1,3 +1,11 @@@ ++2010-03-28 Eli Zaretskii ++ ++ * 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. ++ 2010-03-24 Francesc Rocher * MORE.STUFF: Remove CEDET entry, now distributed as part of diff --cc lisp/ChangeLog index ca4c43b65d6,84f038667c2..289bc012bdf --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@@ -1,27 -1,3 +1,32 @@@ ++2010-03-30 Eli Zaretskii ++ ++ * files.el: Make bidi-display-reordering safe variable for boolean ++ values. ++ +2010-03-29 Phil Hagelberg + Chong Yidong + + * subr.el: Extend progress reporters to perform "spinning". + (progress-reporter-update, progress-reporter-do-update): Handle + non-numeric value arguments. + (progress-reporter--pulse-characters): New var. + +2010-03-28 Chong Yidong + + * progmodes/compile.el (compilation-start): Fix regexp detection + of initial cd command (Bug#5771). + +2010-03-28 Stefan Guath (tiny change) + + * find-dired.el (find-dired): Use read-directory-name (Bug#5777). + +2010-03-27 Nick Roberts + + Restore GDB/MI fuctionality removed by 2009-12-29T07:15:34Z!nickrob@snap.net.nz. + * lisp/progmodes/gdb-mi.el: Restored. + * lisp/progmodes/gdb-ui.el: Removed. + * lisp/progmodes/gud.el: Re-accommodated for gdb-mi.el. + 2010-03-25 Glenn Morris * desktop.el (desktop-save-buffer-p): Don't mistakenly include diff --cc src/ChangeLog index 8fd89e9fd0c,7aae2a3754f..1e013964db6 --- a/src/ChangeLog +++ b/src/ChangeLog @@@ -1,18 -1,3 +1,126 @@@ ++2010-03-30 Eli Zaretskii ++ ++ 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. ++ : 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. ++ : 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. ++ +2010-03-30 Dan Nicolaescu + + Remove all uses of C_DEBUG_SWITCH and LIBS_DEBUG. + * s/usg5-4.h (LIBS_DEBUG): + * s/irix6-5.h (C_DEBUG_SWITCH): + * s/gnu-linux.h (LIBS_DEBUG): + * s/darwin.h (LIBS_DEBUG): + * s/bsd-common.h (LIBS_DEBUG): + * s/aix4-2.h (LIBS_DEBUG, C_DEBUG_SWITCH): + * m/iris4d.h (LIBS_DEBUG): + * m/hp800.h (LIBS_DEBUG): Remove definitions. + + * Makefile.in (LIBES): Remove reference to LIBS_DEBUG. + (LIBS_DEBUG): Remove definition. + 2010-03-27 Chong Yidong * process.c (Fmake_network_process): Don't apply Bug#5173 fix for