From: Eli Zaretskii Date: Sat, 4 Jun 2011 07:41:44 +0000 (+0300) Subject: Support bidi reordering of text covered by display properties. X-Git-Tag: emacs-pretest-24.0.90~104^2~618^2~43 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=fec2107c58835163dc3b08c0a833a5072aa1fca9;p=emacs.git 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. --- fec2107c58835163dc3b08c0a833a5072aa1fca9 diff --cc src/ChangeLog index 45d8e38738a,066a1564431..4c33bcc4e67 --- a/src/ChangeLog +++ b/src/ChangeLog @@@ -1,569 -1,107 +1,643 @@@ + 2011-06-03 Eli Zaretskii + - * bidi.c (bidi_fetch_char_advance): Remove unused and - unimplemented function. ++ Support bidi reordering of text covered by display properties. + -2011-05-28 Eli Zaretskii ++ * 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. + + * 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. - - * keyboard.c (adjust_point_for_property): Adjust the call to - display_prop_intangible_p to its new signature. - - * dispextern.h (display_prop_intangible_p): Adjust prototype. - -2011-05-21 Eli Zaretskii - - * xdisp.c (handle_display_spec): New function, refactored from the ++ (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. + - * bidi.c (bidi_fetch_char): Accept additional argument - FRAME_WINDOW_P and pass it to compute_display_string_pos. All - callers changed. - (bidi_init_it): Accept additional argument FRAME_WINDOW_P and use - it to initialize the frame_window_p member of struct bidi_it. ++ * keyboard.c (adjust_point_for_property): Adjust the call to ++ display_prop_intangible_p to its new signature. + + * dispextern.h (struct bidi_it): New member frame_window_p. - (bidi_init_it, compute_display_string_pos): Update prototypes. ++ (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. + -2011-05-14 Eli Zaretskii +2011-06-02 Paul Eggert + + Malloc failure behavior now depends on size of allocation. + * alloc.c (buffer_memory_full, memory_full): New arg NBYTES. + * lisp.h: Change signatures accordingly. + * alloc.c, buffer.c, editfns.c, menu.c, minibuf.c, xterm.c: + All callers changed. (Bug#8762) + + * gnutls.c: Use Emacs's memory allocators. + Without this change, the gnutls library would invoke malloc etc. + directly, which causes problems on non-SYNC_INPUT hosts, and which + runs afoul of improving memory_full behavior. (Bug#8761) + (fn_gnutls_global_set_mem_functions): New macro or function pointer. + (emacs_gnutls_global_init): Use it to specify xmalloc, xrealloc, + xfree instead of the default malloc, realloc, free. + (Fgnutls_boot): No need to check for memory allocation failure, + since xmalloc does that for us. + + Remove arbitrary limit of 2**31 entries in hash tables. (Bug#8771) + * category.c (hash_get_category_set): + * ccl.c (ccl_driver): + * charset.c (Fdefine_charset_internal): + * charset.h (struct charset.hash_index): + * composite.c (get_composition_id, gstring_lookup_cache) + (composition_gstring_put_cache): + * composite.h (struct composition.hash_index): + * dispextern.h (struct image.hash): + * fns.c (next_almost_prime, larger_vector, cmpfn_eql) + (cmpfn_equal, cmpfn_user_defined, hashfn_eq, hashfn_eql) + (hashfn_equal, hashfn_user_defined, make_hash_table) + (maybe_resize_hash_table, hash_lookup, hash_put) + (hash_remove_from_table, hash_clear, sweep_weak_table, SXHASH_COMBINE) + (sxhash_string, sxhash_list, sxhash_vector, sxhash_bool_vector) + (Fsxhash, Fgethash, Fputhash, Fmaphash): + * image.c (make_image, search_image_cache, lookup_image) + (xpm_put_color_table_h): + * lisp.h (struct Lisp_Hash_Table): + * minibuf.c (Ftry_completion, Fall_completions, Ftest_completion): + * print.c (print): Use 'EMACS_UINT' and 'EMACS_INT' + for hashes and hash indexes, instead of 'unsigned' and 'int'. + * alloc.c (allocate_vectorlike): + Check for overflow in vector size calculations. + * ccl.c (ccl_driver): + Check for overflow when converting EMACS_INT to int. + * fns.c, image.c: Remove unnecessary static decls that would otherwise + need to be updated by these changes. + * fns.c (make_hash_table, maybe_resize_hash_table): + Check for integer overflow with large hash tables. + (make_hash_table, maybe_resize_hash_table, Fmake_hash_table): + Prefer the faster XFLOAT_DATA to XFLOATINT where either will do. + (SXHASH_REDUCE): New macro. + (sxhash_string, sxhash_list, sxhash_vector, sxhash_bool_vector): + Use it instead of discarding useful hash info with large hash values. + (sxhash_float): New function. + (sxhash): Use it. No more need for "& INTMASK" due to above changes. + * lisp.h (FIXNUM_BITS): New macro, useful for SXHASH_REDUCE etc. + (MOST_NEGATIVE_FIXNUM, MOST_POSITIVE_FIXNUM, INTMASK): + Rewrite to use FIXNUM_BITS, as this simplifies things. + (next_almost_prime, larger_vector, sxhash, hash_lookup, hash_put): + Adjust signatures to match updated version of code. + (consing_since_gc): Now EMACS_INT, since a single hash table can + use more than INT_MAX bytes. + +2011-06-01 Dan Nicolaescu + + Make it possible to build with GCC-4.6+ -O2 -flto. + + * emacs.c (__malloc_initialize_hook): Mark as EXTERNALLY_VISIBLE. + +2011-06-01 Stefan Monnier + + * minibuf.c (get_minibuffer, read_minibuf_unwind): + Call minibuffer-inactive-mode. + +2011-05-31 Juanma Barranquero + + * makefile.w32-in ($(BLD)/data.$(O), $(BLD)/editfns.$(O)): + Update dependencies. - * xdisp.c (compute_display_string_pos): Non-trivial implementation. - (compute_display_string_end): New function. - (push_it): Accept second argument POSITION, where pop_it should - jump to continue iteration. +2011-05-31 Dan Nicolaescu - * dispextern.h (compute_display_string_end): Declare prototype. + * data.c (init_data): Remove code for UTS, this system is not + supported anymore. - * bidi.c (bidi_resolve_explicit_1): Use ZV for disp_pos. - (bidi_fetch_char): Implement support for runs of characters - covered by display strings. +2011-05-31 Dan Nicolaescu - * bidi.c (bidi_fetch_char): Accept also character position - corresponding to BYTEPOS. DISP_POS is now a character position, - not a byte position. All callers changed. - (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. - (bidi_paragraph_init, bidi_resolve_explicit_1) - (bidi_level_of_next_char): Fix arguments in the calls to - bidi_fetch_char. + Don't force ./temacs to start in terminal mode. -2011-05-10 Eli Zaretskii + * frame.c (make_initial_frame): Initialize faces in all cases, not + only when CANNOT_DUMP is defined. + * dispnew.c (init_display): Remove CANNOT_DUMP condition. - * xdisp.c (compute_display_string_pos): New function. - (reseat_1): Initialize bidi_it.disp_pos. +2011-05-31 Dan Nicolaescu - * bidi.c (bidi_copy_it): Use offsetof. - (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. + * dispnew.c (add_window_display_history): Use const for the string + pointer. Remove declaration, not needed. - * dispextern.h (struct bidi_it): New members nchars and disp_pos. - ch_len is now EMACS_INT. - (compute_display_string_pos): Declare prototype. +2011-05-31 Paul Eggert + + Use 'inline', not 'INLINE'. + + * alloc.c, fontset.c (INLINE): Remove. + * alloc.c, bidi.c, charset.c, coding.c, dispnew.c, fns.c, image.c: + * intervals.c, keyboard.c, process.c, syntax.c, textprop.c, w32term.c: + * xdisp.c, xfaces.c, xterm.c: Replace all uses of INLINE with inline. + * gmalloc.c (register_heapinfo): Use inline unconditionally. + * lisp.h (LISP_MAKE_RVALUE): Use inline, not __inline__. + +2011-05-31 Dan Nicolaescu + + Make it possible to run ./temacs. + + * callproc.c (set_initial_environment): Remove CANNOT_DUMP code, + syms_of_callproc does the same thing. Remove test for + "initialized", do it in the caller. + * emacs.c (main): Avoid calling set_initial_environment when dumping. + +2011-05-31 Stefan Monnier + + * minibuf.c (Finternal_complete_buffer): Return `category' metadata. + (read_minibuf): Use get_minibuffer. + (syms_of_minibuf): Use DEFSYM. + (Qmetadata): New var. + * data.c (Qbuffer): Don't make it static. + (syms_of_data): Use DEFSYM. + +2011-05-31 Paul Eggert + + * ccl.c (CCL_CODE_RANGE): Allow negative numbers. (Bug#8751) + (CCL_CODE_MIN): New macro. + +2011-05-30 Paul Eggert + + * alloc.c (lisp_align_malloc): Omit unnecessary val==NULL tests. + + * eval.c (Qdebug): Now static. + * lisp.h (Qdebug): Remove decl. This reverts a part of the + 2011-04-26T11:26:05Z!dan.colascione@gmail.com that inadvertently undid part of + 2011-04-14T06:48:41Z!eggert@cs.ucla.edu. + +2011-05-29 Chong Yidong + + * image.c: Various fixes to ImageMagick code comments. + (Fimagemagick_types): Doc fix. + +2011-05-29 Paul Eggert + + Minor fixes prompted by GCC 4.6.0 warnings. + + * xselect.c (converted_selections, conversion_fail_tag): Now static. + + * emacs.c [HAVE_X_WINDOWS]: Include "xterm.h". + (x_clipboard_manager_save_all): Move extern decl to ... + * xterm.h: ... here, so that it can be checked for consistency. + +2011-05-29 Chong Yidong + + * xselect.c (x_clipboard_manager_save_frame) + (x_clipboard_manager_save_all): New functions. + (Fx_clipboard_manager_save): Lisp function deleted. + + * emacs.c (Fkill_emacs): Call x_clipboard_manager_save_all. + * frame.c (delete_frame): Call x_clipboard_manager_save_frame. + + * xterm.h: Update prototype. + +2011-05-28 William Xu + + * nsterm.m (ns_term_shutdown): Synchronize user defaults before + exiting (Bug#8239). + +2011-05-28 Jim Meyering + + Avoid a sign-extension bug in crypto_hash_function. + * fns.c (to_uchar): Define. + (crypto_hash_function): Use it to convert some newly-signed + variables to unsigned, to avoid sign-extension bugs. For example, + without this change, (md5 "truc") would evaluate to + 45723a2aff78ff4fff7fff1114760e62 rather than the expected + 45723a2af3788c4ff17f8d1114760e62. Reported by Antoine Levitt in + https://lists.gnu.org/archive/html/emacs-devel/2011-05/msg00883.html. + +2011-05-27 Paul Eggert + + Integer overflow fixes. + + * dbusbind.c: Serial number integer overflow fixes. + (CHECK_DBUS_SERIAL_GET_SERIAL): New macro. + (Fdbus_call_method_asynchronously, xd_read_message_1): Use a float + to hold a serial number that is too large for a fixnum. + (Fdbus_method_return_internal, Fdbus_method_error_internal): + Check for serial numbers out of range. Decode any serial number + that was so large that it became a float. (Bug#8722) + + * dbusbind.c: Use XFASTINT rather than XUINT, and check for nonneg. + (Fdbus_call_method, Fdbus_call_method_asynchronously): + Use XFASTINT rather than XUINT when numbers are nonnegative. + (xd_append_arg, Fdbus_method_return_internal): + (Fdbus_method_error_internal): Likewise. Also, for unsigned + arguments, check that Lisp number is nonnegative, rather than + silently wrapping negative numbers around. (Bug#8722) + (xd_read_message_1): Don't assume dbus_uint32_t can fit in int. + (Bug#8722) + + * data.c (arith_driver, Flsh): Avoid unnecessary casts to EMACS_UINT. + + * ccl.c (ccl_driver): Redo slightly to avoid the need for 'unsigned'. + + ccl: add integer overflow checks + * ccl.c (CCL_CODE_MAX, GET_CCL_RANGE, GET_CCL_CODE, GET_CCL_INT): + (IN_INT_RANGE): New macros. + (ccl_driver): Use them to check for integer overflow when + decoding a CCL program. Many of the new checks are whether XINT (x) + fits in int; it doesn't always, on 64-bit hosts. The new version + doesn't catch all possible integer overflows, but it's an + improvement. (Bug#8719) + + * alloc.c (make_event_array): Use XINT, not XUINT. + There's no need for unsigned here. + + * mem-limits.h (EXCEEDS_LISP_PTR) [!USE_LSB_TAG]: EMACS_UINT -> uintptr_t + This follows up to the 2011-05-06 change that substituted uintptr_t + for EMACS_INT. This case wasn't caught back then. + + Rework Fformat to avoid integer overflow issues. + * editfns.c: Include unconditionally, as it's everywhere + now (part of C89). Include . + (MAX_10_EXP, CONVERTED_BYTE_SIZE): Remove; no longer needed. + (pWIDE, pWIDElen, signed_wide, unsigned_wide): New defns. + (Fformat): Avoid the prepass trying to compute sizes; it was only + approximate and thus did not catch overflow reliably. Instead, walk + through the format just once, formatting and computing sizes as we go, + checking for integer overflow at every step, and allocating a larger + buffer as needed. Keep track separately whether the format is + multibyte. Keep only the most-recently calculated precision, rather + than them all. Record whether each argument has been converted to + string. Use EMACS_INT, not int, for byte and char and arg counts. + Support field widths and precisions larger than INT_MAX. Avoid + sprintf's undefined behavior with conversion specifications such as %#d + and %.0c. Fix bug with strchr succeeding on '\0' when looking for + flags. Fix bug with (format "%c" 256.0). Avoid integer overflow when + formatting out-of-range floating point numbers with int + formats. (Bug#8668) + + * lisp.h (FIXNUM_OVERFLOW_P): Work even if arg is a NaN. + + * data.c: Avoid integer truncation in expressions involving floats. + * data.c: Include . + (arith_driver): When there's an integer overflow in an expression + involving floating point, convert the integers to floating point + so that the resulting value does not suffer from catastrophic + integer truncation. For example, on a 64-bit host (* 4 + most-negative-fixnum 0.5) should yield about -4.6e+18, not zero. + Do not rely on undefined behavior after integer overflow. + + merge count_size_as_multibyte, parse_str_to_multibyte + * character.c, character.h (count_size_as_multibyte): + Rename from parse_str_to_multibyte; all uses changed. + Check for integer overflow. + * insdel.c, lisp.h (count_size_as_multibyte): Remove, + since it's now a duplicate of the other. This is more of + a character than a buffer op, so better that it's in character.c. + * fns.c, print.c: Adjust to above changes. + +2011-05-27 Stefan Monnier + + * xselect.c (x_convert_selection): Yet another int/Lisp_Object mixup. + +2011-05-27 Paul Eggert + + * xselect.c: Fix minor problems prompted by GCC 4.6.0 warnings. + (x_handle_selection_request, frame_for_x_selection): Remove unused vars. + (x_clipboard_manager_save): Now static. + (Fx_clipboard_manager_save): Rename local to avoid shadowing. + + * fns.c: Fix minor problems prompted by GCC 4.6.0 warnings. + (crypto_hash_function): Now static. + Fix pointer signedness problems. Avoid unnecessary initializations. + +2011-05-27 Chong Yidong + + * termhooks.h (Vselection_alist): Make it terminal-local. + + * terminal.c (create_terminal): Initialize it. + + * xselect.c: Support for clipboard managers. + (Vselection_alist): Move to termhooks.h as terminal-local var. + (LOCAL_SELECTION): New macro. + (x_atom_to_symbol): Handle x_display_info_for_display fail case. + (symbol_to_x_atom): Remove gratuitous arg. + (x_handle_selection_request, lisp_data_to_selection_data) + (x_get_foreign_selection, Fx_register_dnd_atom): Callers changed. + (x_own_selection, x_get_local_selection, x_convert_selection): + New arg, specifying work frame. Use terminal-local Vselection_alist. + (some_frame_on_display): Delete unused function. + (Fx_own_selection_internal, Fx_get_selection_internal) + (Fx_disown_selection_internal, Fx_selection_owner_p) + (Fx_selection_exists_p): New optional frame arg. + (frame_for_x_selection, Fx_clipboard_manager_save): New functions. + (x_handle_selection_clear): Don't treat other terminals with the + same keyboard specially. Use the terminal-local Vselection_alist. + (x_clear_frame_selections): Use Frun_hook_with_args. + + * xterm.c (x_term_init): Intern ATOM and CLIPBOARD_MANAGER atoms. + + * xterm.h: Add support for those atoms. + +2011-05-26 Chong Yidong + + * xselect.c: ICCCM-compliant handling of MULTIPLE targets. + (converted_selections, conversion_fail_tag): New global variables. + (x_selection_request_lisp_error): Free the above. + (x_get_local_selection): Remove unnecessary code. + (x_reply_selection_request): Args changed; handle arbitrary array + of converted selections stored in converted_selections. + Separate the XChangeProperty and SelectionNotify steps. + (x_handle_selection_request): Rewrite to handle MULTIPLE target. + (x_convert_selection): New function. + (x_handle_selection_event): Simplify. + (x_get_foreign_selection): Don't ignore incoming requests while + waiting for an answer; this will fail when we implement + SAVE_TARGETS, and seems unnecessary anyway. + (selection_data_to_lisp_data): Recognize ATOM_PAIR type. + (Vx_sent_selection_functions): Doc fix. + +2011-05-26 Leo Liu + + * editfns.c (Ftranspose_regions): Allow empty regions. (Bug#8699) + +2011-05-25 YAMAMOTO Mitsuharu + + * dispextern.h (struct glyph_row): New member fringe_bitmap_periodic_p. + + * dispnew.c (shift_glyph_matrix, scrolling_window): Mark scrolled row + for fringe update if it has periodic bitmap. + (row_equal_p): Also compare left_fringe_offset, right_fringe_offset, + and fringe_bitmap_periodic_p. + + * fringe.c (get_fringe_bitmap_data): New function. + (draw_fringe_bitmap_1, update_window_fringes): Use it. + (update_window_fringes): Record periodicity of fringe bitmap in glyph + row. Mark glyph row for fringe update if periodicity changed. + + * xdisp.c (try_window_reusing_current_matrix): Don't mark scrolled row + for fringe update unless it has periodic bitmap. + +2011-05-25 Kenichi Handa + + * xdisp.c (get_next_display_element): Set correct it->face_id for + a static composition. + +2011-05-24 Leo Liu + + * deps.mk (fns.o): + * makefile.w32-in ($(BLD)/fns.$(O)): Include sha1.h. + + * fns.c (crypto_hash_function, Fsha1): New function. + (Fmd5): Use crypto_hash_function. + (syms_of_fns): Add Ssha1. + +2011-05-22 Paul Eggert + + * gnutls.c: Remove unused macros. + (fn_gnutls_transport_set_lowat, fn_gnutls_transport_set_pull_function): + (fn_gnutls_transport_set_push_function) [!WINDOWSNT]: + Remove macros that are defined and never used. + Caught by gcc -Wunused-macros (GCC 4.6.0, Fedora 14). + +2011-05-22 Chong Yidong + + * xselect.c (syms_of_xselect): Remove unused symbol SAVE_TARGETS. + (Fx_get_selection_internal): Minor cleanup. + (Fx_own_selection_internal): Rename arguments for consistency with + select.el. + +2011-05-22 Paul Eggert + + * xselect.c (QSAVE_TARGETS): New static var, to fix build failure. + +2011-05-22 Chong Yidong + + * xselect.c (syms_of_xselect): Include character.h; use DEFSYM. + +2011-05-21 YAMAMOTO Mitsuharu + + * dispnew.c (scrolling_window): Don't exclude the case that the + last enabled row in the desired matrix touches the bottom boundary. + +2011-05-21 Glenn Morris + + * Makefile.in ($(etc)/DOC): Make second command line even shorter. + (SOME_MACHINE_OBJECTS): Replace FONT_OBJ by its maximal expansion, + and add some more files. + +2011-05-20 Eli Zaretskii + + * callproc.c (Fcall_process) [MSDOS]: Fix arguments to + report_file_error introduced by the change from 2011-05-07. + +2011-05-20 Paul Eggert + + * systime.h (Time): Define only if emacs is defined. + This is to allow ../lib-src/profile.c to be compiled on FreeBSD, + where the include path doesn't have X11/X.h by default. See + . + +2011-05-20 Kenichi Handa + + * composite.c (find_automatic_composition): Fix previous change. + +2011-05-20 Glenn Morris + + * lisp.mk: New file, split from Makefile.in. + * Makefile.in (lisp): Move to separate file, inserted by @lisp_frag@. + (shortlisp): Remove. + ($(etc)/DOC): Edit lisp.mk rather than using $shortlisp. + +2011-05-19 Glenn Morris + + * Makefile.in (MSDOS_SUPPORT_REAL, MSDOS_SUPPORT, NS_SUPPORT) + (REAL_MOUSE_SUPPORT, GPM_MOUSE_SUPPORT, MOUSE_SUPPORT, TOOLTIP_SUPPORT) + (BASE_WINDOW_SUPPORT, X_WINDOW_SUPPORT, WINDOW_SUPPORT): Remove. + (lisp): Set the order to that of loadup.el. + (shortlisp): Make it a copy of $lisp. + (SOME_MACHINE_LISP): Remove. + ($(etc)/DOC): Depend just on $lisp, not $SOME_MACHINE_LISP too. + Use just $shortlisp, not $SOME_MACHINE_LISP too. + +2011-05-18 Kenichi Handa + + * composite.c (CHAR_COMPOSABLE_P): Add more check for efficiency. + (BACKWARD_CHAR): Wrap the arg STOP by parenthesis. + (find_automatic_composition): Mostly rewrite for efficiency. + +2011-05-18 Juanma Barranquero + + * makefile.w32-in: Update dependencies. + +2011-05-18 Christoph Scholtes + + * menu.c: Include limits.h (fixes the MS-Windows build broken by + revision 104625). + +2011-05-18 Paul Eggert + + Fix some integer overflow issues, such as string length overflow. + + * insdel.c (count_size_as_multibyte): Check for string overflow. + + * character.c (lisp_string_width): Check for string overflow. + Use EMACS_INT, not int, for string indexes and lengths; in + particular, 2nd arg is now EMACS_INT, not int. Do not crash if + the resulting string length overflows an EMACS_INT; instead, + report a string overflow if no precision given. When checking for + precision exhaustion, use a check that cannot possibly have + integer overflow. (Bug#8675) + * character.h (lisp_string_width): Adjust to new signature. + + * alloc.c (string_overflow): New function. + (Fmake_string): Use it. This doesn't change behavior, but saves + a few bytes and will simplify future changes. + * character.c (string_escape_byte8): Likewise. + * lisp.h (string_overflow): New decl. + + Fixups, following up to the user-interface timestamp change. + * nsterm.m (last_mouse_movement_time, ns_mouse_position): Use Time + for UI timestamps, instead of unsigned long. + * msdos.c (mouse_get_pos): Likewise. + * w32inevt.c (movement_time, w32_console_mouse_position): Likewise. + * w32gui.h (Time): Define by including "systime.h" rather than by + declaring it ourselves. (Bug#8664) + + * dispextern.h (struct image): Don't assume time_t <= unsigned long. + * image.c (clear_image_cache): Likewise. + + * term.c (term_mouse_position): Don't assume time_t wraparound. + + Be more systematic about user-interface timestamps. + Before, the code sometimes used 'Time', sometimes 'unsigned long', + and sometimes 'EMACS_UINT', to represent these timestamps. + This change causes it to use 'Time' uniformly, as that's what X uses. + This makes the code easier to follow, and makes it easier to catch + integer overflow bugs such as Bug#8664. + * frame.c (Fmouse_position, Fmouse_pixel_position): + Use Time, not unsigned long, for user-interface timestamps. + * keyboard.c (last_event_timestamp, kbd_buffer_get_event): Likewise. + (button_down_time, make_lispy_position, make_lispy_movement): Likewise. + * keyboard.h (last_event_timestamp): Likewise. + * menu.c (Fx_popup_menu) [!HAVE_X_WINDOWS]: Likewise. + * menu.h (xmenu_show): Likewise. + * term.c (term_mouse_position): Likewise. + * termhooks.h (struct input_event.timestamp): Likewise. + (struct terminal.mouse_position_hook): Likewise. + * xmenu.c (create_and_show_popup_menu, xmenu_show): Likewise. + * xterm.c (XTmouse_position, x_scroll_bar_report_motion): Likewise. + * systime.h (Time): New decl. Pull it in from if + HAVE_X_WINDOWS, otherwise define it as unsigned long, which is + what it was before. + * menu.h, termhooks.h: Include "systime.h", for Time. + + * keyboard.c (make_lispy_event): Fix problem in integer overflow. + Don't assume that the difference between two unsigned long values + can fit into an integer. At this point, we know button_down_time + <= event->timestamp, so the difference must be nonnegative, so + there's no need to cast the result if double-click-time is + nonnegative, as it should be; check that it's nonnegative, just in + case. This bug is triggered when events are more than 2**31 ms + apart (about 25 days). (Bug#8664) + + * xselect.c (last_event_timestamp): Remove duplicate decl. + (x_own_selection): Remove needless cast to unsigned long. + + * xmenu.c (set_frame_menubar): Use int, not EMACS_UINT, for indexes + that always fit in int. Use a sentinel instead of a counter, to + avoid a temp and to allay GCC's concerns about possible int overflow. + * frame.h (struct frame): Use int for menu_bar_items_used + instead of EMACS_INT, since it always fits in int. + + * menu.c (grow_menu_items): Check for int overflow. + + * xmenu.c (set_frame_menubar): Don't mishandle vectors with no nils. + + * xterm.c: Use EMACS_INT for Emacs modifiers, and int for X modifiers. + Before, the code was not consistent. These values cannot exceed + 2**31 - 1 so there's no need to make them unsigned. + (x_x_to_emacs_modifiers): Accept int and return EMACS_INT. + (x_emacs_to_x_modifiers): Accept EMACS_INT and return int. + (x_x_to_emacs_modifiers, x_emacs_to_x_modifiers): Reject non-integers + as modifiers. + * xterm.h (x_x_to_emacs_modifiers): Adjust to signature change. + + * lisp.h (XINT) [USE_LISP_UNION_TYPE]: Cast to EMACS_INT. + (XUINT) [USE_LISP_UNION_TYPE]: Cast to EMACS_UINT. + Otherwise, GCC 4.6.0 warns about printf (pI, XINT (...)), + presumably because the widths might not match. + + * window.c (size_window): Avoid needless test at loop start. + +2011-05-18 Courtney Bane (tiny change) + + * term.c (Fresume_tty): Restore hooks before reinitializing (bug#8687). + +2011-05-12 Drew Adams + + * textprop.c (Fprevious_single_char_property_change): Doc fix (bug#8655). + +2011-05-12 YAMAMOTO Mitsuharu + + * w32term.c (w32_draw_fringe_bitmap): Rename local vars `left' and + `width' to `bar_area_x' and `bar_area_width', respectively. + (x_scroll_run): Take account of fringe background extension. + + * xterm.c (x_draw_fringe_bitmap) [USE_TOOLKIT_SCROLL_BARS]: + Rename local vars `left' and `width' to `bar_area_x' and + `bar_area_width', respectively. + (x_scroll_run) [USE_TOOLKIT_SCROLL_BARS]: Take account of fringe + background extension. + +2011-05-10 Jim Meyering + + * xdisp.c (x_intersect_rectangles): Fix typo "the the -> the". + +2011-05-10 Juanma Barranquero + + * image.c (Finit_image_library): Return t for built-in image types, + like pbm and xbm. (Bug#8640) 2011-05-09 Andreas Schwab diff --cc src/bidi.c index b05fd21e5b6,de189f0cb13..a41f50d9ca5 --- a/src/bidi.c +++ b/src/bidi.c @@@ -565,6 -571,65 +571,65 @@@ bidi_line_init (struct bidi_it *bidi_it bidi_cache_reset (); } + /* Fetch and return the character at BYTEPOS/CHARPOS. If that + character is covered by a display string, treat the entire run of + covered characters as a single character u+FFFC, and return their + combined length in CH_LEN and NCHARS. DISP_POS specifies the + character position of the next display string, or -1 if not yet + computed. When the next character is at or beyond that position, + the function updates DISP_POS with the position of the next display + string. */ -static INLINE int ++static inline int + bidi_fetch_char (EMACS_INT bytepos, EMACS_INT charpos, EMACS_INT *disp_pos, + int frame_window_p, EMACS_INT *ch_len, EMACS_INT *nchars) + { + int ch; + + /* FIXME: Support strings in addition to buffers. */ + /* If we got past the last known position of display string, compute + the position of the next one. That position could be at BYTEPOS. */ + if (charpos < ZV && charpos > *disp_pos) + *disp_pos = compute_display_string_pos (charpos, frame_window_p); + + /* Fetch the character at BYTEPOS. */ + if (bytepos >= ZV_BYTE) + { + ch = BIDI_EOB; + *ch_len = 1; + *nchars = 1; + *disp_pos = ZV; + } + else if (charpos >= *disp_pos) + { + EMACS_INT disp_end_pos; + + /* We don't expect to find ourselves in the middle of a display + property. Hopefully, it will never be needed. */ + if (charpos > *disp_pos) + abort (); + /* Return the Unicode Object Replacement Character to represent + the entire run of characters covered by the display + string. */ + ch = 0xFFFC; + disp_end_pos = compute_display_string_end (*disp_pos); + *nchars = disp_end_pos - *disp_pos; + *ch_len = CHAR_TO_BYTE (disp_end_pos) - bytepos; + } + else + { + ch = FETCH_MULTIBYTE_CHAR (bytepos); + *nchars = 1; + *ch_len = CHAR_BYTES (ch); + } + + /* If we just entered a run of characters covered by a display + string, compute the position of the next display string. */ + if (charpos + *nchars <= ZV && charpos + *nchars > *disp_pos) + *disp_pos = compute_display_string_pos (charpos + *nchars, frame_window_p); + + return ch; + } + /* Find the beginning of this paragraph by looking back in the buffer. Value is the byte position of the paragraph's beginning. */ static EMACS_INT @@@ -828,13 -909,17 +909,17 @@@ bidi_resolve_neutral_1 (bidi_type_t pre return STRONG_R; } -static INLINE int +static inline int - bidi_explicit_dir_char (int c) + bidi_explicit_dir_char (int ch) { - /* FIXME: this should be replaced with a lookup table with suitable - bits set, like standard C ctype macros do. */ - return (c == LRE_CHAR || c == LRO_CHAR - || c == RLE_CHAR || c == RLO_CHAR || c == PDF_CHAR); + bidi_type_t ch_type; + + if (!bidi_initialized) + abort (); + ch_type = (bidi_type_t) XINT (CHAR_TABLE_REF (bidi_type_table, ch)); + return (ch_type == LRE || ch_type == LRO + || ch_type == RLE || ch_type == RLO + || ch_type == PDF); } /* A helper function for bidi_resolve_explicit. It advances to the