changeset 104235:b729d024f6dc

* cmds.c (nonundocount): New global variable. (keys_of_cmds): Initialize it. (Fself_insert_command): Use it to combine upto 20 sequential chars into a single undo entry, just like the Qself_insert_command code in keyboard.c does. Call frame_make_pointer_invisible, also like the Qself_insert_command code in keyboard.c does. * keyboard.c (command_loop_1): Use the new global nonundocount rather than its own local replacement for it.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Wed, 12 Aug 2009 05:07:48 +0000
parents e2940cb3d84e
children 22de0794e0bd
files src/ChangeLog src/cmds.c src/keyboard.c
diffstat 3 files changed, 110 insertions(+), 83 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Tue Aug 11 23:26:04 2009 +0000
+++ b/src/ChangeLog	Wed Aug 12 05:07:48 2009 +0000
@@ -1,12 +1,23 @@
+2009-08-12  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* cmds.c (nonundocount): New global variable.
+	(keys_of_cmds): Initialize it.
+	(Fself_insert_command): Use it to combine upto 20 sequential chars
+	into a single undo entry, just like the Qself_insert_command code in
+	keyboard.c does.
+	Call frame_make_pointer_invisible, also like the Qself_insert_command
+	code in keyboard.c does.
+	* keyboard.c (command_loop_1): Use the new global nonundocount rather
+	than its own local replacement for it.
+
 2009-08-10  Ken Raeburn  <raeburn@raeburn.org>
 
-	* fns.c (concat): Don't re-set string length to its current
-	value.
-
-	* coding.h (decode_coding_string, encode_coding_string): Use
-	SBYTES macro.
-
-	* doprnt.c (doprnt_lisp): Unused function deleted.
+	* fns.c (concat): Don't re-set string length to its current value.
+
+	* coding.h (decode_coding_string, encode_coding_string):
+	Use SBYTES macro.
+
+	* doprnt.c (doprnt_lisp): Delete unused function.
 	(doprnt): Merge with doprnt1, discarding lispstrings code.
 	* lisp.h (doprnt_lisp): Don't declare.
 
@@ -62,23 +73,21 @@
 
 	* nsfont.m (nsfont_draw): Revert 2009-07-15 change.
 
-	* nsterm.m (ns_maybe_dumpglyphs_background): Revert 2009-07-15
-	change.
+	* nsterm.m (ns_maybe_dumpglyphs_background): Revert 2009-07-15 change.
 	(ns_get_color): Revert 2009-07-16 change.
 
 2009-07-25  Eli Zaretskii  <eliz@gnu.org>
 
 	* lread.c (syms_of_lread) <force_load_messages>: New variable.
-	(Fload): Use it to force load messages, even if NOMESSAGES is
-	non-nil.
+	(Fload): Use it to force load messages, even if NOMESSAGES is non-nil.
 
 2009-07-25  Ken Raeburn  <raeburn@raeburn.org>
 
-	* coding.h (decode_coding_string, encode_coding_string): Use
-	SCHARS macro.
+	* coding.h (decode_coding_string, encode_coding_string):
+	Use SCHARS macro.
 
 	* lread.c: Rewrite 2009-07-21 changes.
-	(load_depth): Deleted.
+	(load_depth): Delete.
 	(Qload_in_progress): New variable.
 	(load_unwind): Don't reference load_depth or load_in_progress.
 	(Fload): Likewise; specbind Qload_in_progress instead.
@@ -104,8 +113,8 @@
 
 2009-07-22  Jason Rumney  <jasonr@gnu.org>
 
-	* w32fns.c (w32_wnd_proc) [WM_IME_STARTCOMPOSITION]: Position
-	IME window at cursor (Bug#2570).
+	* w32fns.c (w32_wnd_proc) [WM_IME_STARTCOMPOSITION]:
+	Position IME window at cursor (Bug#2570).
 	(w32_wnd_proc) [WM_IME_CHAR]: Release context when finished.
 	(globals_of_w32fns): Dynamically load functions required above.
 
@@ -181,16 +190,15 @@
 	(font_delete_unmatched): Likewise.
 	(font_list_entities): The return type changed.
 	(font_select_entity): The format of the second argument changed.
-	(font_find_for_lface): Adjusted for the above changes.  Don't
-	suppress the checking of C even if the repertory supports it.
-	(Flist_fonts): Adjusted for the above changes.
-
-	* ftfont.c (ftfont_spec_pattern): New arg langname.  Caller
-	changed.
-	(ftfont_list): Adjusted for the change of ftfont_spec_pattern.
+	(font_find_for_lface): Adjuste for the above changes.
+	Don't suppress the checking of C even if the repertory supports it.
+	(Flist_fonts): Adjust for the above changes.
+
+	* ftfont.c (ftfont_spec_pattern): New arg langname.  Change caller.
+	(ftfont_list): Adjust for the change of ftfont_spec_pattern.
 	Reject a font who has adstyle property that is different from a
 	langname derived from registry property.
-	(ftfont_match): Adjusted for the change of ftfont_spec_pattern.
+	(ftfont_match): Adjust for the change of ftfont_spec_pattern.
 
 2009-07-13  Eli Zaretskii  <eliz@gnu.org>
 
@@ -207,10 +215,10 @@
 
 2009-07-11  Eli Zaretskii  <eliz@gnu.org>
 
-	* dired.c (directory_files_internal_w32_unwind) [WINDOWSNT]: New
-	function.
-	(directory_files_internal) [WINDOWSNT]: Bind
-	w32-get-true-file-attributes to either t or nil, depending whether
+	* dired.c (directory_files_internal_w32_unwind) [WINDOWSNT]:
+	New function.
+	(directory_files_internal) [WINDOWSNT]:
+	Bind w32-get-true-file-attributes to either t or nil, depending whether
 	the filesystem of the directory is fast or slow.
 
 	* w32.c (logon_network_drive): Don't assume PATH is an absolute
@@ -232,8 +240,7 @@
 
 2009-07-09  Eli Zaretskii  <eliz@gnu.org>
 
-	* w32proc.c (syms_of_ntproc) <w32-get-true-file-attributes>: Doc
-	fix.
+	* w32proc.c (syms_of_ntproc) <w32-get-true-file-attributes>: Doc fix.
 
 	* w32.c (stat): Treat UNC file names as residing on remote
 	drives.  (Bug#3542)
@@ -284,8 +291,7 @@
 	(multibyte_char_to_unibyte_safe): Likewise.
 	(Funibyte_char_to_multibyte): Don't check charset_unibyte.
 
-	* xdisp.c (get_next_display_element): Decode it->c by
-	charset_unibyte.
+	* xdisp.c (get_next_display_element): Decode it->c by charset_unibyte.
 	(x_produce_glyphs): Likewise.
 
 	* .gdbinit (xcharset): Fix the treating $arg0.
@@ -345,8 +351,8 @@
 	(read_avail_input): Call frame_make_pointer_visible.
 
 	* frame.c (Vmake_pointer_invisible): New variable.
-	(frame_make_pointer_invisible, frame_make_pointer_visible): New
-	functions.
+	(frame_make_pointer_invisible, frame_make_pointer_visible):
+	New functions.
 	(syms_of_frame): DEFVAR make-pointer-invisible, initialize to Qt.
 
 	* frame.h: Declare frame_make_pointer_invisible and
@@ -365,7 +371,7 @@
 
 	* gtkutil.c (xg_frame_set_char_size): Do not set pixel width/height
 	here or	call change_frame_size. Just call flush_and_sync.
-	(flush_and_sync): Reintroduced.
+	(flush_and_sync): Reintroduce.
 
 2009-07-01  Jan Djärv  <jan.h.d@swipnet.se>
 
@@ -402,8 +408,8 @@
 	(x_set_font, x_figure_window_size): Do not handle fullscreen specially.
 	(syms_of_frame): Initialize Qmaximized.
 
-	* frame.h (fullscreen_type): Add FULLSCREEN_MAXIMIZED.  Declare
-	Qfullwidth, Qfullheight, Qfullboth, Qmaximized.
+	* frame.h (fullscreen_type): Add FULLSCREEN_MAXIMIZED.
+	Declare Qfullwidth, Qfullheight, Qfullboth, Qmaximized.
 
 	* xterm.c (handle_one_xevent): Remove call to x_check_fullscreen
 	for Expose event. Add call to x_check_fullscreen for MapNotify event.
@@ -421,8 +427,8 @@
 	flush_and_sync.
 	(xg_height_changed): New function.
 	(xg_create_frame_widgets): Remove call to gtk_widget_set_size_request
-	and gtk_window_set_policy.  Set frame gravity after parsing the geometry
-	string.
+	and gtk_window_set_policy.  Set frame gravity after parsing the
+	geometry string.
 	(xg_update_frame_menubar, free_frame_menubar)
 	(xg_tool_bar_detach_callback, xg_tool_bar_attach_callback)
 	(update_frame_tool_bar, free_frame_tool_bar): Call xg_height_changed.
@@ -433,8 +439,8 @@
 	* keyboard.c (decode_keyboard_code): New function.
 	(tty_read_avail_input): Decode the input bytes if necessary.
 
-	* coding.c (setup_coding_system): Initialize
-	coding->carryover_bytes to 0.
+	* coding.c (setup_coding_system):
+	Initialize coding->carryover_bytes to 0.
 	(Fset_keyboard_coding_system_internal): If CODING-SYSTEM is nil,
 	use Qno_conversion.
 
@@ -444,8 +450,7 @@
 
 2009-06-30  Chong Yidong  <cyd@stupidchicken.com>
 
-	* xftfont.c (xftfont_open): Avoid passing NULL argument to
-	XftLockFace.
+	* xftfont.c (xftfont_open): Avoid passing NULL argument to XftLockFace.
 
 2009-06-30  Jason Rumney  <jasonr@gnu.org>
 
@@ -477,8 +482,8 @@
 
 	* xdisp.c (start_display, handle_face_prop)
 	(move_it_vertically_backward, cursor_row_fully_visible_p)
-	(redisplay_window, try_window_id, produce_image_glyph): Delete
-	some #ifdef-ed out code chunks that are now obsolete.
+	(redisplay_window, try_window_id, produce_image_glyph):
+	Delete some #ifdef-ed out code chunks that are now obsolete.
 
 	* xterm.c (x_update_window_begin, x_new_focus_frame)
 	(x_scroll_bar_handle_click, handle_one_xevent)
@@ -550,8 +555,8 @@
 
 2009-06-23  Jim Meyering  <meyering@redhat.com>
 
-	* src/ftfont.c (setup_otf_gstring, ftfont_shape_by_flt): Use
-	xmalloc and xrealloc (not malloc and realloc), so subsequent heap
+	* src/ftfont.c (setup_otf_gstring, ftfont_shape_by_flt):
+	Use xmalloc and xrealloc (not malloc and realloc), so subsequent heap
 	pointer dereferences are guaranteed to be valid.
 
 2009-06-23  Kenichi Handa  <handa@m17n.org>
@@ -605,8 +610,7 @@
 
 2009-06-21  Chong Yidong  <cyd@stupidchicken.com>
 
-	* xdisp.c (IT_DISPLAYING_WHITESPACE): Define for
-	!HAVE_WINDOW_SYSTEM.
+	* xdisp.c (IT_DISPLAYING_WHITESPACE): Define for !HAVE_WINDOW_SYSTEM.
 	(move_it_in_display_line_to, move_it_in_display_line_to)
 	(display_line): Remove #ifdef HAVE_WINDOW_SYSTEM.
 
@@ -635,8 +639,7 @@
 
 2009-06-18  Kenichi Handa  <handa@m17n.org>
 
-	* coding.c (decode_coding_iso_2022): Check MSB of bytes more
-	rigidly.
+	* coding.c (decode_coding_iso_2022): Check MSB of bytes more rigidly.
 
 2009-06-18  Andreas Schwab  <aschwab@redhat.com>
 
@@ -760,8 +763,7 @@
 
 2009-06-08 Felix Mueller  <felix@enqueue.eu>  (tiny change)
 
-	* nsterm.m (ns_init_paths): Append path separator to INFOPATH
-	variable.
+	* nsterm.m (ns_init_paths): Append path separator to INFOPATH variable.
 
 2009-06-08  Wolfgang Lux  <wolfgang.lux@gmail.com>  (tiny change)
 
@@ -786,8 +788,8 @@
 
 2009-05-29  Kenichi Handa  <handa@m17n.org>
 
-	* coding.c (get_translation_table): Check
-	Venable_character_translation.
+	* coding.c (get_translation_table):
+	Check Venable_character_translation.
 
 2009-05-26  David Reitter  <david.reitter@gmail.com>
 
@@ -1044,8 +1046,7 @@
 
 	* dispnew.c (Fsend_string_to_terminal): Doc fix.
 
-	* data.c (Fterminal_local_value, Fset_terminal_local_value): Doc
-	fixes.
+	* data.c (Fterminal_local_value, Fset_terminal_local_value): Doc fixes.
 
 	* coding.c (Fterminal_coding_system): Doc fix.
 
@@ -1055,15 +1056,15 @@
 	(Fx_server_vendor, Fx_server_version, Fx_display_screens)
 	(Fx_display_mm_height, Fx_display_mm_width)
 	(Fx_display_backing_store, Fx_display_visual_class)
-	(Fx_display_save_under, Fx_close_connection, Fx_synchronize): Doc
-	fixes, replacing "terminal id" with "terminal object".
+	(Fx_display_save_under, Fx_close_connection, Fx_synchronize):
+	Doc fixes, replacing "terminal id" with "terminal object".
 	(check_x_display_info): Handle terminal objects instead of
 	terminal ids.
 
 	* term.c (Ftty_display_color_p, Ftty_display_color_cells)
 	(Ftty_type, Fcontrolling_tty_p, Ftty_no_underline, Fsuspend_tty)
-	(Fresume_tty, Vsuspend_tty_functions, Vresume_tty_functions): Doc
-	fixes, replacing "terminal id" with "terminal object".
+	(Fresume_tty, Vsuspend_tty_functions, Vresume_tty_functions):
+	Doc fixes, replacing "terminal id" with "terminal object".
 
 2009-04-21  Kenichi Handa  <handa@m17n.org>
 
@@ -1072,9 +1073,8 @@
 
 	* coding.c (decode_coding_utf_16): Reduce charbuf_end for the
 	worst case.
-	(decode_coding_emacs_mule, decode_coding_iso_2022)
-	(decode_coding_sjis, decode_coding_big5, decode_coding_charset):
-	Likewise.
+	(decode_coding_sjis, decode_coding_big5, decode_coding_charset)
+	(decode_coding_emacs_mule, decode_coding_iso_2022): Likewise.
 
 2009-04-19  Jason Rumney  <jasonr@gnu.org>
 
@@ -1094,8 +1094,8 @@
 
 2009-04-19  Jan Djärv  <jan.h.d@swipnet.se>
 
-	* gtkutil.c (xg_tool_bar_menu_proxy, update_frame_tool_bar): Use
-	G_CALLBACK instead of GTK_SIGNAL_FUNC which is deprecated.
+	* gtkutil.c (xg_tool_bar_menu_proxy, update_frame_tool_bar):
+	Use G_CALLBACK instead of GTK_SIGNAL_FUNC which is deprecated.
 	(xg_initialize): Use g_type_class_ref instead of gtk_type_class which
 	is deprecated.
 
@@ -1141,8 +1141,7 @@
 
 2009-04-16  Kenichi Handa  <handa@m17n.org>
 
-	* xfont.c (xfont_has_char): Special handling of `ja' and `ko'
-	adstyle.
+	* xfont.c (xfont_has_char): Special handling of `ja' and `ko' adstyle.
 
 	* xftfont.c (xftfont_has_char): Special handling of `ja' and `ko'
 	adstyle.
@@ -1151,8 +1150,8 @@
 	(enum ftfont_cache_for): New enum.
 	(fc_charset_table): Undo the previous change.
 	(ftfont_get_latin1_charset): Delete it.
-	(ftfont_pattern_entity): Check cache by ftfont_lookup_cache.  Set
-	FONT_SIZE_INDEX of the entity to 0 for a scalable font.  For a
+	(ftfont_pattern_entity): Check cache by ftfont_lookup_cache.
+	Set FONT_SIZE_INDEX of the entity to 0 for a scalable font.  For a
 	non-scarable font, try to get AVERAGE_WIDTH.
 	(ftfont_lookup_cache): Argument FOR-FACE is changed to CACHE_FOR.
 	Change ft_face_cache from a list of a hash-table.  Don't check
@@ -1160,8 +1159,7 @@
 	(ftfont_get_fc_charset): Call ftfont_lookup_cache with
 	FTFONT_CACHE_FOR_CHARET.
 	(ftfont_get_charset): Undo the previous change.
-	(ftfont_open): Call ftfont_lookup_cache with
-	FTFONT_CACHE_FOR_FACE.
+	(ftfont_open): Call ftfont_lookup_cache with FTFONT_CACHE_FOR_FACE.
 	(ftfont_close): Likewise.
 	(ftfont_has_char): Special handling of `ja' and `ko' adstyle.
 
@@ -1220,8 +1218,7 @@
 
 2009-04-13  Kenichi Handa  <handa@m17n.org>
 
-	* font.c (font_delete_unmatched): Preserve the order of list
-	elements.
+	* font.c (font_delete_unmatched): Preserve the order of list elements.
 	(font_select_entity): Suppress the code to optimize for the same
 	kind of fonts.
 	(font_load_for_lface): Get a font that supports at least ASCII
@@ -1237,8 +1234,7 @@
 	Delete iso-8859-1 range from the charset of fonts whose adstyle is
 	`ko' or `ja'.
 	(ftfont_get_fc_charset): Call ftfont_lookup_cache with ENTITY.
-	(ftfont_get_charset): For iso8859-1, call
-	ftfont_get_latin1_charset.
+	(ftfont_get_charset): For iso8859-1, call ftfont_get_latin1_charset.
 	(ftfont_list): Don't refuse a font spec with non-nil `adstyle'
 	property.
 	(ftfont_open): Call ftfont_lookup_cache with ENTITY.
@@ -1258,8 +1254,7 @@
 	* dispnew.c (redraw_overlapping_rows): Fix detection of
 	overlapping for topmost and bottommost rows.
 
-	* ftfont.c (ftfont_text_extents): Fix calculation of
-	metrics->descent.
+	* ftfont.c (ftfont_text_extents): Fix calculation of metrics->descent.
 
 2009-04-06  Jason Rumney  <jasonr@gnu.org>
 
--- a/src/cmds.c	Tue Aug 11 23:26:04 2009 +0000
+++ b/src/cmds.c	Wed Aug 12 05:07:48 2009 +0000
@@ -315,15 +315,42 @@
   return value;
 }
 
+int nonundocount;
+
 /* Note that there's code in command_loop_1 which typically avoids
    calling this.  */
 DEFUN ("self-insert-command", Fself_insert_command, Sself_insert_command, 1, 1, "p",
        doc: /* Insert the character you type.
-Whichever character you type to run this command is inserted.  */)
+Whichever character you type to run this command is inserted.
+Before insertion, `expand-abbrev' is executed if the inserted character does
+not have word syntax and the previous character in the buffer does.
+After insertion, the value of `auto-fill-function' is called if the
+`auto-fill-chars' table has a non-nil value for the inserted character.  */)
      (n)
      Lisp_Object n;
 {
   CHECK_NUMBER (n);
+  int remove_boundary = 1;
+
+  if (!EQ (Vthis_command, current_kboard->Vlast_command))
+    nonundocount = 0;
+
+  if (NILP (Vexecuting_kbd_macro)
+      && !EQ (minibuf_window, selected_window))
+    {
+      if (nonundocount <= 0 || nonundocount >= 20)
+	{
+	  remove_boundary = 0;
+	  nonundocount = 0;
+	}
+      nonundocount++;
+    }
+
+  if (remove_boundary
+      && CONSP (current_buffer->undo_list)
+      && NILP (XCAR (current_buffer->undo_list)))
+    /* Remove the undo_boundary that was just pushed.  */
+    current_buffer->undo_list = XCDR (current_buffer->undo_list);
 
   /* Barf if the key that invoked this was not a character.  */
   if (!CHARACTERP (last_command_event))
@@ -353,9 +380,13 @@
     else
       while (XINT (n) > 0)
 	{
+	  int val;
 	  /* Ok since old and new vals both nonneg */
 	  XSETFASTINT (n, XFASTINT (n) - 1);
-	  internal_self_insert (character, XFASTINT (n) != 0);
+	  val = internal_self_insert (character, XFASTINT (n) != 0);
+	  if (val == 2)
+	    nonundocount = 0;
+	  frame_make_pointer_invisible ();
 	}
   }
 
@@ -611,6 +642,7 @@
 {
   int n;
 
+  nonundocount = 0;
   initial_define_key (global_map, Ctl ('I'), "self-insert-command");
   for (n = 040; n < 0177; n++)
     initial_define_key (global_map, n, "self-insert-command");
--- a/src/keyboard.c	Tue Aug 11 23:26:04 2009 +0000
+++ b/src/keyboard.c	Wed Aug 12 05:07:48 2009 +0000
@@ -1519,12 +1519,13 @@
 }
 #endif
 
+extern int nonundocount;	/* Declared in cmds.c.  */
+
 Lisp_Object
 command_loop_1 ()
 {
   Lisp_Object cmd;
   int lose;
-  int nonundocount;
   Lisp_Object keybuf[30];
   int i;
   int prev_modiff = 0;
@@ -1540,7 +1541,6 @@
   waiting_for_input = 0;
   cancel_echoing ();
 
-  nonundocount = 0;
   this_command_key_count = 0;
   this_command_key_count_reset = 0;
   this_single_command_key_start = 0;
@@ -1898,7 +1898,7 @@
 #endif
 
             nonundocount = 0;
-            if (NILP (current_kboard->Vprefix_arg))
+            if (NILP (current_kboard->Vprefix_arg)) /* FIXME: Why?  --Stef  */
               Fundo_boundary ();
             Fcommand_execute (Vthis_command, Qnil, Qnil, Qnil);