aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKaroly Lorentey2004-01-22 15:37:19 +0000
committerKaroly Lorentey2004-01-22 15:37:19 +0000
commit2a36494c42a1963846ea8c2dde48a7450d433c2a (patch)
tree59be675dcc23b117a04a5b16cc82d73bcb6abbc9 /src
parente9cda8277618ce4e2644e852539474b7b67f09e3 (diff)
parente555f8d5a4cfa2a1496ed61795ab6dc143600698 (diff)
downloademacs-2a36494c42a1963846ea8c2dde48a7450d433c2a.tar.gz
emacs-2a36494c42a1963846ea8c2dde48a7450d433c2a.zip
Merged in changes from CVS HEAD
Patches applied: * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-33 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-34 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-35 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-36 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-37 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-38 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-39 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-40 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-41 Make fringe-drawing stuff compile without a window-system * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-42 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-43 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-44 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-45 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-46 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-47 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-48 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-49 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-50 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-59
Diffstat (limited to 'src')
-rw-r--r--src/.gitignore9
-rw-r--r--src/ChangeLog220
-rw-r--r--src/alloc.c35
-rw-r--r--src/buffer.c22
-rw-r--r--src/buffer.h3
-rw-r--r--src/dired.c6
-rw-r--r--src/dispextern.h44
-rw-r--r--src/dispnew.c37
-rw-r--r--src/fontset.c3
-rw-r--r--src/keyboard.c96
-rw-r--r--src/lisp.h81
-rw-r--r--src/lread.c3
-rw-r--r--src/macterm.c40
-rw-r--r--src/process.c8
-rw-r--r--src/s/darwin.h5
-rw-r--r--src/search.c10
-rw-r--r--src/w32term.c34
-rw-r--r--src/xdisp.c644
-rw-r--r--src/xterm.c38
19 files changed, 1099 insertions, 239 deletions
diff --git a/src/.gitignore b/src/.gitignore
index f1a15019c6f..406ff7cd5e2 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -1,18 +1,19 @@
1*-spd
1*.core 2*.core
3*.pdb
4.gdb_history
2Makefile 5Makefile
3Makefile.c 6Makefile.c
4TAGS-LISP 7TAGS-LISP
8_gdbinit
5bootstrap-emacs 9bootstrap-emacs
6config.h 10config.h
7config.stamp 11config.stamp
8emacs 12emacs
9emacs-* 13emacs-*
10epaths.h 14epaths.h
15gdb.ini
11obj 16obj
12prefix-args 17prefix-args
13stamp-oldxmenu 18stamp-oldxmenu
14temacs 19temacs
15_gdbinit
16gdb.ini
17*-spd
18*.pdb
diff --git a/src/ChangeLog b/src/ChangeLog
index 9c21defd658..4fba5e166b3 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,164 @@
12004-01-21 Stefan Monnier <monnier@iro.umontreal.ca>
2
3 * lisp.h [USE_LSB_TAG && !DECL_ALIGN]: Signal an error.
4
52004-01-21 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
6
7 * lisp.h: Add undef DECL_ALIGN.
8
92004-01-21 Stefan Monnier <monnier@iro.umontreal.ca>
10
11 * process.c (wait_reading_process_input) [SYNC_INPUT]:
12 Check interrupt_input_pending explicitly.
13
14 * lisp.h (QUIT) [SYNC_INPUT]: Check interrupt_input_pending as well.
15
16 * keyboard.c (handle_async_input): New fun,
17 extracted from input_available_signal.
18 (input_available_signal, reinvoke_input_signal): Use it.
19
202004-01-20 Stefan Monnier <monnier@iro.umontreal.ca>
21
22 * buffer.c (buffer_defaults, buffer_local_symbols): Use DECL_ALIGN.
23
24 * lisp.h [USE_LSB_TAG]: Add definitions for Lisp_Object value
25 manipulation macros for when tags are in the lower bits.
26 (struct Lisp_Free) [USE_LSB_TAG]: Add padding.
27 (DECL_ALIGN): New macro.
28 (DEFUN): Use it.
29
30 * lisp.h [ENABLE_CHECKING]: Don't force union type.
31
32 * s/darwin.h (__attribute__): Remove outdated workaround.
33
34 * macterm.c (main) [USE_LSB_TAG]: Don't range check the ram.
35
36 * alloc.c (lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
37 Don't check range of malloc address.
38 (pure_alloc) [USE_LSB_TAG]: Enforce alignment.
39
40 * process.c (wait_reading_process_input): Lisp_Object/int mixup.
41
42 * dired.c (Ffile_attributes): Lisp_Object/int mixup.
43
442004-01-19 Kenichi Handa <handa@m17n.org>
45
46 * fontset.c (fontset_font_pattern): Fix previous change.
47
482004-01-16 Miles Bader <miles@gnu.ai.mit.edu>
49
50 * xdisp.c (Voverflow_newline_into_fringe)
51 (move_it_in_display_line_to, redisplay_internal)
52 (update_window_fringes, redisplay_window, display_line, window):
53 Add `#ifdef HAVE_WINDOW_SYSTEM' around fringe-drawing stuff, so
54 that it compiles without a window-system.
55 * dispnew.c (direct_output_for_insert, update_window): Likewise.
56
572004-01-16 Kim F. Storm <storm@cua.dk>
58
59 * buffer.h (struct buffer): New member indicate_buffer_boundaries.
60
61 * buffer.c (init_buffer_once): Set buffer_defaults and
62 buffer_local_flags for indicate_buffer_boundaries.
63 (syms_of_buffer): Defvar_per_buffer it, and defvar_lisp_nopro
64 default- variable for it.
65
66 * dispextern.h (struct glyph_row): New members left_fringe_bitmap,
67 right_fringe_bitmap, redraw_fringe_bitmaps_p for new fringe handling.
68 New members exact_window_width_line_p and cursor_in_fringe_p for
69 overflowing newlines into right fringe.
70 New members indicate_bob_p, indicate_top_line_p, indicate_eob_p,
71 and indicate_bottom_line_p for buffer boundaries and scrolling.
72 (enum fringe_bitmap_type): Add UP_ARROW_BITMAP, DOWN_ARROW_BITMAP,
73 FIRST_LINE_BITMAP, LAST_LINE_BITMAP, FILLED_BOX_CURSOR_BITMAP,
74 HOLLOW_BOX_CURSOR_BITMAP, BAR_CURSOR_BITMAP, HBAR_CURSOR_BITMAP,
75 and HOLLOW_SQUARE_BITMAP.
76 (draw_fringe_bitmap, draw_window_fringes, update_window_fringes):
77 Add prototypes.
78
79 * dispnew.c (row_equal_p, update_window_line): Compare fringe bitmaps
80 instead of related indicator fields.
81 Compare exact_window_width_line_p and cursor_in_mouse_face_p indicators.
82 (direct_output_for_insert): Handle exact width lines like
83 contined lines. Call update_window_fringes.
84 (update_window): Call update_window_fringes.
85 (scrolling_window): Don't skip desired rows with changed bitmaps.
86 Check if fringe bitmaps changes when assigning scrolled rows.
87
88 * xdisp.c (Voverflow_newline_into_fringe): New variable.
89 (IT_OVERFLOW_NEWLINE_INTO_FRINGE): New macro.
90 (move_it_in_display_line_to): Overflow newline into fringe for
91 rows that are exactly as wide as the window.
92 (up_arrow_bits, down_arrow_bits, first_line_bits, last_line_bits)
93 (filled_box_cursor_bits, hollow_box_cursor_bits, bar_cursor_bits)
94 (hbar_cursor_bits, hollow_square_bits): New fringe bitmaps.
95 (fringe_bitmaps): Add new bitmaps.
96 (draw_fringe_bitmap): Make extern. Remove WHICH arg.
97 Select proper bitmap for cursor in fringe when appropriate.
98 Handle alignment of bitmap to top or bottom of row.
99 (draw_row_fringe_bitmaps): Don't select bitmaps here; that is now
100 done by update_window_fringes.
101 (update_window_fringes, draw_window_fringes): New functions.
102 (redisplay_internal): Call update_window_fringes in case only
103 cursor row is updated.
104 (redisplay_window): Call update_window_fringes.
105 Explicitly call draw_window_fringes if redisplay was done using
106 the current matrix or the overlay arrow is in the window.
107 (try_window_reusing_current_matrix): Mark scrolled rows for
108 fringe update (to update buffer-boundaries / scrolling icons).
109 (find_last_unchanged_at_beg_row): Handle exact width lines line
110 continued lines.
111 (display_line): Overflow newline into fringe for rows that are
112 exactly as wide as the window. Don't append space for newline
113 in this case.
114 (notice_overwritten_cursor): Explicitly clear cursor bitmap
115 in fringe as if it had been overwritten.
116 (erase_phys_cursor): Erase cursor bitmap in fringe.
117 (syms_of_xdisp): Mark show-trailing-whitespace and
118 void-text-area-pointer as user options.
119 DEFVAR_LISP Voverflow_newline_into_fringe. Enable by default.
120
121 * xterm.c (x_update_window_end): Call draw_window_fringes.
122 (x_after_update_window_line): Just set redraw_fringe_bitmaps_p
123 in row instead of actually drawing fringe bitmaps.
124 (x_draw_fringe_bitmap): Handle bottom aligned bitmaps.
125 (x_draw_window_cursor): Draw cursor in fringe.
126
127 * w32term.c (x_update_window_end): Call draw_window_fringes.
128 (x_after_update_window_line): Just set redraw_fringe_bitmaps_p
129 in row instead of actually drawing fringe bitmaps.
130 (w32_draw_fringe_bitmap): Handle bottom aligned bitmaps.
131 (w32_draw_window_cursor): Draw cursor in fringe.
132
133 * macterm.c (x_update_window_end): Call draw_window_fringes.
134 (x_after_update_window_line): Just set redraw_fringe_bitmaps_p
135 in row instead of actually drawing fringe bitmaps.
136 (x_draw_fringe_bitmap): Handle bottom aligned bitmaps.
137 (mac_draw_window_cursor): Draw cursor in fringe.
138
1392004-01-16 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
140
141 * xterm.c (handle_one_xevent): Don't handle characters that are part
142 of an old style (XLookupString) compose sequence.
143
1442004-01-15 Kenichi Handa <handa@m17n.org>
145
146 * search.c (Freplace_match): Use make_multibyte_string or
147 make_unibyte_string according to the buffer multibyteness.
148
1492004-01-14 Stefan Monnier <monnier@iro.umontreal.ca>
150
151 * alloc.c (struct interval_block, struct string_block)
152 (struct symbol_block, struct marker_block, live_string_p)
153 (live_cons_p, live_symbol_p, live_float_p, live_misc_p):
154 Better preserve alignment for objects in blocks.
155 (FLOAT_BLOCK_SIZE): Adjust for possible alignment padding.
156
157 * lread.c (defvar_per_buffer): Remove dead declaration.
158
159 * macterm.c (do_check_ram_size): Don't hardcode the lisp address
160 space size.
161
12004-01-12 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> 1622004-01-12 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
2 163
3 * xmenu.c (popup_get_selection): Check new parameter down_on_keypress 164 * xmenu.c (popup_get_selection): Check new parameter down_on_keypress
@@ -61,7 +222,7 @@
61 * xdisp.c (note_mode_line_or_margin_highlight): Use modified 222 * xdisp.c (note_mode_line_or_margin_highlight): Use modified
62 mode_line_string and marginal_area_string functions to handle 223 mode_line_string and marginal_area_string functions to handle
63 both string object and image object properties. 224 both string object and image object properties.
64 225
652004-01-06 Andreas Schwab <schwab@suse.de> 2262004-01-06 Andreas Schwab <schwab@suse.de>
66 227
67 * syntax.c (skip_chars): Treat '-' at end of string as ordinary 228 * syntax.c (skip_chars): Treat '-' at end of string as ordinary
@@ -69,8 +230,8 @@
69 230
702004-01-02 Andreas Schwab <schwab@suse.de> 2312004-01-02 Andreas Schwab <schwab@suse.de>
71 232
72 * macterm.c (emacs_options, x_initialized, same_x_server): Remove 233 * macterm.c (emacs_options, x_initialized, same_x_server):
73 unused (and duplicated) definitions. 234 Remove unused (and duplicated) definitions.
74 235
752004-01-02 Kim F. Storm <storm@cua.dk> 2362004-01-02 Kim F. Storm <storm@cua.dk>
76 237
@@ -100,8 +261,7 @@
100 261
1012004-01-01 Jason Rumney <jasonr@gnu.org> 2622004-01-01 Jason Rumney <jasonr@gnu.org>
102 263
103 * w32term.c (w32_text_out): Use s->font, for consistency with 264 * w32term.c (w32_text_out): Use s->font, for consistency with callers.
104 callers.
105 265
1062003-12-30 Luc Teirlinck <teirllm@auburn.edu> 2662003-12-30 Luc Teirlinck <teirllm@auburn.edu>
107 267
@@ -132,15 +292,13 @@
132 292
133 * fontset.c (Voverriding_fontspec_alist): New variable. 293 * fontset.c (Voverriding_fontspec_alist): New variable.
134 (lookup_overriding_fontspec): New function. 294 (lookup_overriding_fontspec): New function.
135 (fontset_ref_via_base): Call lookup_overriding_fontspec if 295 (fontset_ref_via_base): Call lookup_overriding_fontspec if necessary.
136 necessary.
137 (fontset_font_pattern): Likewise. 296 (fontset_font_pattern): Likewise.
138 (regulalize_fontname): New function. 297 (regulalize_fontname): New function.
139 (Fset_fontset_font): Call regulalize_fontname. 298 (Fset_fontset_font): Call regulalize_fontname.
140 (Fset_overriding_fontspec_internal): New function. 299 (Fset_overriding_fontspec_internal): New function.
141 (syms_of_fontset): Initialize and staticprop 300 (syms_of_fontset): Initialize and staticpro Voverriding_fontspec_alist.
142 Voverriding_fontspec_alist. Defsubr 301 Defsubr Sset_overriding_fontspec_internal.
143 Sset_overriding_fontspec_internal.
144 302
145 * xfaces.c (face_font_available_p): New function. 303 * xfaces.c (face_font_available_p): New function.
146 304
@@ -197,7 +355,7 @@
197 (Vvoid_text_area_pointer): Replace Vshow_text_cursor_in_void. 355 (Vvoid_text_area_pointer): Replace Vshow_text_cursor_in_void.
198 (QCmap, QCpointer, Qrect, Qcircle, Qpoly): New variables for 356 (QCmap, QCpointer, Qrect, Qcircle, Qpoly): New variables for
199 image maps. 357 image maps.
200 (x_y_to_hpos_vpos): Return glyph relative coordinates through 358 (x_y_to_hpos_vpos): Return glyph relative coordinates through
201 new dx and dy args. 359 new dx and dy args.
202 Remove buffer_only_p arg (always 0). Simplify code accordingly. 360 Remove buffer_only_p arg (always 0). Simplify code accordingly.
203 (get_glyph_string_clip_rect): Draw cursor using glyph's rather 361 (get_glyph_string_clip_rect): Draw cursor using glyph's rather
@@ -207,9 +365,9 @@
207 (produce_image_glyph): Adjust it.ascent to minimum row ascent if 365 (produce_image_glyph): Adjust it.ascent to minimum row ascent if
208 image glyph is alone on the last line. 366 image glyph is alone on the last line.
209 (append_glyph, append_composite_glyph, produce_image_glyph) 367 (append_glyph, append_composite_glyph, produce_image_glyph)
210 (append_stretch_glyph): Set glyph's ascent and descent. 368 (append_stretch_glyph): Set glyph's ascent and descent.
211 (on_hot_spot_p): New function to check if position is inside an 369 (on_hot_spot_p): New function to check if position is inside an
212 rectangular, circular, or polygon-shaped image hot-spot, 370 rectangular, circular, or polygon-shaped image hot-spot,
213 (find_hot_spot): New function to search for image hot-spot. 371 (find_hot_spot): New function to search for image hot-spot.
214 (Flookup_image_map): New defun to search for image hot-spot. 372 (Flookup_image_map): New defun to search for image hot-spot.
215 (define_frame_cursor1): New aux function to determine frame pointer. 373 (define_frame_cursor1): New aux function to determine frame pointer.
@@ -277,8 +435,7 @@
277 (Fread_minibuffer, Fread_no_blanks_input): Adapt to changes in 435 (Fread_minibuffer, Fread_no_blanks_input): Adapt to changes in
278 read_minibuf. 436 read_minibuf.
279 (Fcompleting_read): Delete code moved into read_minibuf. 437 (Fcompleting_read): Delete code moved into read_minibuf.
280 (Ftest_completion): Make it handle obarrays and hash tables 438 (Ftest_completion): Make it handle obarrays and hash tables correctly.
281 correctly.
282 439
2832003-12-03 Kenichi Handa <handa@m17n.org> 4402003-12-03 Kenichi Handa <handa@m17n.org>
284 441
@@ -429,10 +586,8 @@
429 586
4302003-11-22 Lars Hansen <larsh@math.ku.dk> 5872003-11-22 Lars Hansen <larsh@math.ku.dk>
431 588
432 * w32.c (struct the_group): Added. 589 * w32.c (struct the_group, getgrgid): Add.
433 (getgrgid): Added. 590 * mac.c (struct my_group, getgrgid): Add.
434 * mac.c (struct my_group): Added.
435 (getgrgid): Added.
436 591
4372003-11-21 Luc Teirlinck <teirllm@auburn.edu> 5922003-11-21 Luc Teirlinck <teirllm@auburn.edu>
438 593
@@ -440,18 +595,19 @@
440 595
4412003-11-21 Lars Hansen <larsh@math.ku.dk> 5962003-11-21 Lars Hansen <larsh@math.ku.dk>
442 597
443 * dired.c (Ffile_attributes): Parameter ID-FORMAT added and 598 * dired.c (Ffile_attributes): Add parameter ID-FORMAT and
444 included in call to file name handler. Numeric UID and GID 599 include in call to file name handler. Optionally translate numeric
445 optionally translated to strings. Docstring updated. 600 UID and GID to strings. Update docstring.
446 (directory_files_internal): Parameter ID-FORMAT added. 601 (directory_files_internal): Add parameter ID-FORMAT.
447 (Fdirectory_files_and_attributes): Parameter ID-FORMAT added and 602 (Fdirectory_files_and_attributes): Add parameter ID-FORMAT and
448 included in call to file name handler and call to 603 include in call to file name handler and call to
449 directory_files_internal. Docstring updated. (Fdirectory_files): 604 directory_files_internal. Update Docstring.
450 Dummy parameter added in call to directory_files_internal. 605 (Fdirectory_files): Add dummy parameter in call to
451 * lisp.h (Qinteger): Added. (Qinteger_or_floatp, 606 directory_files_internal.
452 Qinteger_or_float_or_marker_p): Removed. (Ffile_attributes): 607 * lisp.h (Qinteger): Add.
453 Parameter added. 608 (Qinteger_or_floatp, Qinteger_or_float_or_marker_p): Remove.
454 * data.c (Qinteger): Exported. 609 (Ffile_attributes): Add parameter.
610 * data.c (Qinteger): Export.
455 611
4562003-11-21 Luc Teirlinck <teirllm@auburn.edu> 6122003-11-21 Luc Teirlinck <teirllm@auburn.edu>
457 613
@@ -1788,7 +1944,7 @@
1788 * gtkutil.c: Include keyboard.h, charset.h, coding.h. 1944 * gtkutil.c: Include keyboard.h, charset.h, coding.h.
1789 (xg_create_frame_widgets): Use ENCODE_UTF_8. 1945 (xg_create_frame_widgets): Use ENCODE_UTF_8.
1790 1946
1791 * xterm.c (Qutf_8): Moved to coding.c 1947 * xterm.c (Qutf_8): Move to coding.c
1792 1948
1793 * xmenu.c (ENCODE_MENU_STRING): New. 1949 * xmenu.c (ENCODE_MENU_STRING): New.
1794 (list_of_panes, list_of_items, digest_single_submenu, xmenu_show): 1950 (list_of_panes, list_of_items, digest_single_submenu, xmenu_show):
diff --git a/src/alloc.c b/src/alloc.c
index 616e264fbf1..4afcab2c20a 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -1,5 +1,5 @@
1/* Storage allocation and gc for GNU Emacs Lisp interpreter. 1/* Storage allocation and gc for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985, 86, 88, 93, 94, 95, 97, 98, 1999, 2000, 2001, 2002, 2003 2 Copyright (C) 1985,86,88,93,94,95,97,98,1999,2000,01,02,03,2004
3 Free Software Foundation, Inc. 3 Free Software Foundation, Inc.
4 4
5This file is part of GNU Emacs. 5This file is part of GNU Emacs.
@@ -599,6 +599,7 @@ lisp_malloc (nbytes, type)
599 599
600 val = (void *) malloc (nbytes); 600 val = (void *) malloc (nbytes);
601 601
602#ifndef USE_LSB_TAG
602 /* If the memory just allocated cannot be addressed thru a Lisp 603 /* If the memory just allocated cannot be addressed thru a Lisp
603 object's pointer, and it needs to be, 604 object's pointer, and it needs to be,
604 that's equivalent to running out of memory. */ 605 that's equivalent to running out of memory. */
@@ -613,6 +614,7 @@ lisp_malloc (nbytes, type)
613 val = 0; 614 val = 0;
614 } 615 }
615 } 616 }
617#endif
616 618
617#if GC_MARK_STACK && !defined GC_MALLOC_CHECK 619#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
618 if (val && type != MEM_TYPE_NON_LISP) 620 if (val && type != MEM_TYPE_NON_LISP)
@@ -773,6 +775,7 @@ lisp_align_malloc (nbytes, type)
773 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); 775 mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
774#endif 776#endif
775 777
778#ifndef USE_LSB_TAG
776 /* If the memory just allocated cannot be addressed thru a Lisp 779 /* If the memory just allocated cannot be addressed thru a Lisp
777 object's pointer, and it needs to be, that's equivalent to 780 object's pointer, and it needs to be, that's equivalent to
778 running out of memory. */ 781 running out of memory. */
@@ -789,6 +792,7 @@ lisp_align_malloc (nbytes, type)
789 memory_full (); 792 memory_full ();
790 } 793 }
791 } 794 }
795#endif
792 796
793 /* Initialize the blocks and put them on the free list. 797 /* Initialize the blocks and put them on the free list.
794 Is `base' was not properly aligned, we can't use the last block. */ 798 Is `base' was not properly aligned, we can't use the last block. */
@@ -1105,8 +1109,9 @@ uninterrupt_malloc ()
1105 1109
1106struct interval_block 1110struct interval_block
1107{ 1111{
1108 struct interval_block *next; 1112 /* Place `intervals' first, to preserve alignment. */
1109 struct interval intervals[INTERVAL_BLOCK_SIZE]; 1113 struct interval intervals[INTERVAL_BLOCK_SIZE];
1114 struct interval_block *next;
1110}; 1115};
1111 1116
1112/* Current interval block. Its `next' pointer points to older 1117/* Current interval block. Its `next' pointer points to older
@@ -1344,8 +1349,9 @@ struct sblock
1344 1349
1345struct string_block 1350struct string_block
1346{ 1351{
1347 struct string_block *next; 1352 /* Place `strings' first, to preserve alignment. */
1348 struct Lisp_String strings[STRING_BLOCK_SIZE]; 1353 struct Lisp_String strings[STRING_BLOCK_SIZE];
1354 struct string_block *next;
1349}; 1355};
1350 1356
1351/* Head and tail of the list of sblock structures holding Lisp string 1357/* Head and tail of the list of sblock structures holding Lisp string
@@ -2126,8 +2132,10 @@ make_uninit_multibyte_string (nchars, nbytes)
2126 by GC are put on a free list to be reallocated before allocating 2132 by GC are put on a free list to be reallocated before allocating
2127 any new float cells from the latest float_block. */ 2133 any new float cells from the latest float_block. */
2128 2134
2129#define FLOAT_BLOCK_SIZE \ 2135#define FLOAT_BLOCK_SIZE \
2130 (((BLOCK_BYTES - sizeof (struct float_block *)) * CHAR_BIT) \ 2136 (((BLOCK_BYTES - sizeof (struct float_block *) \
2137 /* The compiler might add padding at the end. */ \
2138 - (sizeof (struct Lisp_Float) - sizeof (int))) * CHAR_BIT) \
2131 / (sizeof (struct Lisp_Float) * CHAR_BIT + 1)) 2139 / (sizeof (struct Lisp_Float) * CHAR_BIT + 1))
2132 2140
2133#define GETMARKBIT(block,n) \ 2141#define GETMARKBIT(block,n) \
@@ -2754,8 +2762,9 @@ usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INT
2754 2762
2755struct symbol_block 2763struct symbol_block
2756{ 2764{
2757 struct symbol_block *next; 2765 /* Place `symbols' first, to preserve alignment. */
2758 struct Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE]; 2766 struct Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
2767 struct symbol_block *next;
2759}; 2768};
2760 2769
2761/* Current symbol block and index of first unused Lisp_Symbol 2770/* Current symbol block and index of first unused Lisp_Symbol
@@ -2846,8 +2855,9 @@ Its value and function definition are void, and its property list is nil. */)
2846 2855
2847struct marker_block 2856struct marker_block
2848{ 2857{
2849 struct marker_block *next; 2858 /* Place `markers' first, to preserve alignment. */
2850 union Lisp_Misc markers[MARKER_BLOCK_SIZE]; 2859 union Lisp_Misc markers[MARKER_BLOCK_SIZE];
2860 struct marker_block *next;
2851}; 2861};
2852 2862
2853struct marker_block *marker_block; 2863struct marker_block *marker_block;
@@ -3428,6 +3438,7 @@ live_string_p (m, p)
3428 must not be on the free-list. */ 3438 must not be on the free-list. */
3429 return (offset >= 0 3439 return (offset >= 0
3430 && offset % sizeof b->strings[0] == 0 3440 && offset % sizeof b->strings[0] == 0
3441 && offset < (STRING_BLOCK_SIZE * sizeof b->strings[0])
3431 && ((struct Lisp_String *) p)->data != NULL); 3442 && ((struct Lisp_String *) p)->data != NULL);
3432 } 3443 }
3433 else 3444 else
@@ -3452,8 +3463,8 @@ live_cons_p (m, p)
3452 one of the unused cells in the current cons block, 3463 one of the unused cells in the current cons block,
3453 and not be on the free-list. */ 3464 and not be on the free-list. */
3454 return (offset >= 0 3465 return (offset >= 0
3455 && offset < (CONS_BLOCK_SIZE * sizeof b->conses[0])
3456 && offset % sizeof b->conses[0] == 0 3466 && offset % sizeof b->conses[0] == 0
3467 && offset < (CONS_BLOCK_SIZE * sizeof b->conses[0])
3457 && (b != cons_block 3468 && (b != cons_block
3458 || offset / sizeof b->conses[0] < cons_block_index) 3469 || offset / sizeof b->conses[0] < cons_block_index)
3459 && !EQ (((struct Lisp_Cons *) p)->car, Vdead)); 3470 && !EQ (((struct Lisp_Cons *) p)->car, Vdead));
@@ -3481,6 +3492,7 @@ live_symbol_p (m, p)
3481 and not be on the free-list. */ 3492 and not be on the free-list. */
3482 return (offset >= 0 3493 return (offset >= 0
3483 && offset % sizeof b->symbols[0] == 0 3494 && offset % sizeof b->symbols[0] == 0
3495 && offset < (SYMBOL_BLOCK_SIZE * sizeof b->symbols[0])
3484 && (b != symbol_block 3496 && (b != symbol_block
3485 || offset / sizeof b->symbols[0] < symbol_block_index) 3497 || offset / sizeof b->symbols[0] < symbol_block_index)
3486 && !EQ (((struct Lisp_Symbol *) p)->function, Vdead)); 3498 && !EQ (((struct Lisp_Symbol *) p)->function, Vdead));
@@ -3506,8 +3518,8 @@ live_float_p (m, p)
3506 /* P must point to the start of a Lisp_Float and not be 3518 /* P must point to the start of a Lisp_Float and not be
3507 one of the unused cells in the current float block. */ 3519 one of the unused cells in the current float block. */
3508 return (offset >= 0 3520 return (offset >= 0
3509 && offset < (FLOAT_BLOCK_SIZE * sizeof b->floats[0])
3510 && offset % sizeof b->floats[0] == 0 3521 && offset % sizeof b->floats[0] == 0
3522 && offset < (FLOAT_BLOCK_SIZE * sizeof b->floats[0])
3511 && (b != float_block 3523 && (b != float_block
3512 || offset / sizeof b->floats[0] < float_block_index)); 3524 || offset / sizeof b->floats[0] < float_block_index));
3513 } 3525 }
@@ -3534,6 +3546,7 @@ live_misc_p (m, p)
3534 and not be on the free-list. */ 3546 and not be on the free-list. */
3535 return (offset >= 0 3547 return (offset >= 0
3536 && offset % sizeof b->markers[0] == 0 3548 && offset % sizeof b->markers[0] == 0
3549 && offset < (MARKER_BLOCK_SIZE * sizeof b->markers[0])
3537 && (b != marker_block 3550 && (b != marker_block
3538 || offset / sizeof b->markers[0] < marker_block_index) 3551 || offset / sizeof b->markers[0] < marker_block_index)
3539 && ((union Lisp_Misc *) p)->u_marker.type != Lisp_Misc_Free); 3552 && ((union Lisp_Misc *) p)->u_marker.type != Lisp_Misc_Free);
@@ -4068,6 +4081,9 @@ pure_alloc (size, type)
4068 int type; 4081 int type;
4069{ 4082{
4070 POINTER_TYPE *result; 4083 POINTER_TYPE *result;
4084#ifdef USE_LSB_TAG
4085 size_t alignment = (1 << GCTYPEBITS);
4086#else
4071 size_t alignment = sizeof (EMACS_INT); 4087 size_t alignment = sizeof (EMACS_INT);
4072 4088
4073 /* Give Lisp_Floats an extra alignment. */ 4089 /* Give Lisp_Floats an extra alignment. */
@@ -4079,6 +4095,7 @@ pure_alloc (size, type)
4079 alignment = sizeof (struct Lisp_Float); 4095 alignment = sizeof (struct Lisp_Float);
4080#endif 4096#endif
4081 } 4097 }
4098#endif
4082 4099
4083 again: 4100 again:
4084 result = ALIGN (purebeg + pure_bytes_used, alignment); 4101 result = ALIGN (purebeg + pure_bytes_used, alignment);
diff --git a/src/buffer.c b/src/buffer.c
index d0830c83a51..d14db61c2a9 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1,5 +1,5 @@
1/* Buffer manipulation primitives for GNU Emacs. 1/* Buffer manipulation primitives for GNU Emacs.
2 Copyright (C) 1985,86,87,88,89,93,94,95,97,98, 1999, 2000, 2001, 02, 2003 2 Copyright (C) 1985,86,87,88,89,93,94,95,97,98, 1999, 2000, 2001, 02, 03, 2004
3 Free Software Foundation, Inc. 3 Free Software Foundation, Inc.
4 4
5This file is part of GNU Emacs. 5This file is part of GNU Emacs.
@@ -67,7 +67,7 @@ struct buffer *all_buffers;
67 Setting the default value also goes through the alist of buffers 67 Setting the default value also goes through the alist of buffers
68 and stores into each buffer that does not say it has a local value. */ 68 and stores into each buffer that does not say it has a local value. */
69 69
70struct buffer buffer_defaults; 70DECL_ALIGN (struct buffer, buffer_defaults);
71 71
72/* A Lisp_Object pointer to the above, used for staticpro */ 72/* A Lisp_Object pointer to the above, used for staticpro */
73 73
@@ -97,7 +97,8 @@ struct buffer buffer_local_flags;
97/* This structure holds the names of symbols whose values may be 97/* This structure holds the names of symbols whose values may be
98 buffer-local. It is indexed and accessed in the same way as the above. */ 98 buffer-local. It is indexed and accessed in the same way as the above. */
99 99
100struct buffer buffer_local_symbols; 100DECL_ALIGN (struct buffer, buffer_local_symbols);
101
101/* A Lisp_Object pointer to the above, used for staticpro */ 102/* A Lisp_Object pointer to the above, used for staticpro */
102static Lisp_Object Vbuffer_local_symbols; 103static Lisp_Object Vbuffer_local_symbols;
103 104
@@ -4959,6 +4960,7 @@ init_buffer_once ()
4959 buffer_defaults.scroll_bar_width = Qnil; 4960 buffer_defaults.scroll_bar_width = Qnil;
4960 buffer_defaults.vertical_scroll_bar_type = Qt; 4961 buffer_defaults.vertical_scroll_bar_type = Qt;
4961 buffer_defaults.indicate_empty_lines = Qnil; 4962 buffer_defaults.indicate_empty_lines = Qnil;
4963 buffer_defaults.indicate_buffer_boundaries = Qnil;
4962 buffer_defaults.scroll_up_aggressively = Qnil; 4964 buffer_defaults.scroll_up_aggressively = Qnil;
4963 buffer_defaults.scroll_down_aggressively = Qnil; 4965 buffer_defaults.scroll_down_aggressively = Qnil;
4964 buffer_defaults.display_time = Qnil; 4966 buffer_defaults.display_time = Qnil;
@@ -5028,6 +5030,7 @@ init_buffer_once ()
5028 XSETFASTINT (buffer_local_flags.scroll_bar_width, idx); ++idx; 5030 XSETFASTINT (buffer_local_flags.scroll_bar_width, idx); ++idx;
5029 XSETFASTINT (buffer_local_flags.vertical_scroll_bar_type, idx); ++idx; 5031 XSETFASTINT (buffer_local_flags.vertical_scroll_bar_type, idx); ++idx;
5030 XSETFASTINT (buffer_local_flags.indicate_empty_lines, idx); ++idx; 5032 XSETFASTINT (buffer_local_flags.indicate_empty_lines, idx); ++idx;
5033 XSETFASTINT (buffer_local_flags.indicate_buffer_boundaries, idx); ++idx;
5031 XSETFASTINT (buffer_local_flags.scroll_up_aggressively, idx); ++idx; 5034 XSETFASTINT (buffer_local_flags.scroll_up_aggressively, idx); ++idx;
5032 XSETFASTINT (buffer_local_flags.scroll_down_aggressively, idx); ++idx; 5035 XSETFASTINT (buffer_local_flags.scroll_down_aggressively, idx); ++idx;
5033 XSETFASTINT (buffer_local_flags.header_line_format, idx); ++idx; 5036 XSETFASTINT (buffer_local_flags.header_line_format, idx); ++idx;
@@ -5316,6 +5319,11 @@ This is the same as (default-value 'vertical-scroll-bar). */);
5316 doc: /* Default value of `indicate-empty-lines' for buffers that don't override it. 5319 doc: /* Default value of `indicate-empty-lines' for buffers that don't override it.
5317This is the same as (default-value 'indicate-empty-lines). */); 5320This is the same as (default-value 'indicate-empty-lines). */);
5318 5321
5322 DEFVAR_LISP_NOPRO ("default-indicate-buffer-boundaries",
5323 &buffer_defaults.indicate_buffer_boundaries,
5324 doc: /* Default value of `indicate-buffer-boundaries' for buffers that don't override it.
5325This is the same as (default-value 'indicate-buffer-boundaries). */);
5326
5319 DEFVAR_LISP_NOPRO ("default-scroll-up-aggressively", 5327 DEFVAR_LISP_NOPRO ("default-scroll-up-aggressively",
5320 &buffer_defaults.scroll_up_aggressively, 5328 &buffer_defaults.scroll_up_aggressively,
5321 doc: /* Default value of `scroll-up-aggressively'. 5329 doc: /* Default value of `scroll-up-aggressively'.
@@ -5626,6 +5634,14 @@ A value of t means to use the vertical scroll bar type from the window's frame.
5626If non-nil, a bitmap is displayed in the left fringe of a window on 5634If non-nil, a bitmap is displayed in the left fringe of a window on
5627window-systems. */); 5635window-systems. */);
5628 5636
5637 DEFVAR_PER_BUFFER ("indicate-buffer-boundaries",
5638 &current_buffer->indicate_buffer_boundaries, Qnil,
5639 doc: /* *Visually indicate buffer boundaries and scrolling.
5640If non-nil, the first and last line of the buffer are marked in the left and
5641right fringe of a window on window-systems.
5642In addition, if value is t, the top and bottom line of the window are marked
5643with up and down arrow bitmaps in the right fringe if window can be scrolled. */);
5644
5629 DEFVAR_PER_BUFFER ("scroll-up-aggressively", 5645 DEFVAR_PER_BUFFER ("scroll-up-aggressively",
5630 &current_buffer->scroll_up_aggressively, Qnil, 5646 &current_buffer->scroll_up_aggressively, Qnil,
5631 doc: /* How far to scroll windows upward. 5647 doc: /* How far to scroll windows upward.
diff --git a/src/buffer.h b/src/buffer.h
index 930424b0b49..e2205a916e6 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -733,6 +733,9 @@ struct buffer
733 like vi). */ 733 like vi). */
734 Lisp_Object indicate_empty_lines; 734 Lisp_Object indicate_empty_lines;
735 735
736 /* Non-nil means indicate buffer boundaries and scrolling. */
737 Lisp_Object indicate_buffer_boundaries;
738
736 /* Time stamp updated each time this buffer is displayed in a window. */ 739 /* Time stamp updated each time this buffer is displayed in a window. */
737 Lisp_Object display_time; 740 Lisp_Object display_time;
738 741
diff --git a/src/dired.c b/src/dired.c
index 3bcd3051c25..f4102ff6edb 100644
--- a/src/dired.c
+++ b/src/dired.c
@@ -1,5 +1,5 @@
1/* Lisp functions for making directory listings. 1/* Lisp functions for making directory listings.
2 Copyright (C) 1985, 1986, 1993, 1994, 1999, 2000, 2001 2 Copyright (C) 1985, 1986, 1993, 1994, 1999, 2000, 2001, 2004
3 Free Software Foundation, Inc. 3 Free Software Foundation, Inc.
4 4
5This file is part of GNU Emacs. 5This file is part of GNU Emacs.
@@ -941,9 +941,9 @@ Elements of the attribute list are:
941 else 941 else
942 { 942 {
943 pw = (struct passwd *) getpwuid (s.st_uid); 943 pw = (struct passwd *) getpwuid (s.st_uid);
944 values[2] = (pw ? build_string (pw->pw_name) : s.st_uid); 944 values[2] = (pw ? build_string (pw->pw_name) : make_number (s.st_uid));
945 gr = (struct group *) getgrgid (s.st_gid); 945 gr = (struct group *) getgrgid (s.st_gid);
946 values[3] = (gr ? build_string (gr->gr_name) : s.st_gid); 946 values[3] = (gr ? build_string (gr->gr_name) : make_number (s.st_gid));
947 } 947 }
948 values[4] = make_time (s.st_atime); 948 values[4] = make_time (s.st_atime);
949 values[5] = make_time (s.st_mtime); 949 values[5] = make_time (s.st_mtime);
diff --git a/src/dispextern.h b/src/dispextern.h
index b93bbd1190d..79b949b6337 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -709,6 +709,15 @@ struct glyph_row
709 position of the next row. */ 709 position of the next row. */
710 struct display_pos end; 710 struct display_pos end;
711 711
712 /* Left fringe bitmap number (enum fringe_bitmap_type). */
713 unsigned left_fringe_bitmap : 4;
714
715 /* Right fringe bitmap number (enum fringe_bitmap_type). */
716 unsigned right_fringe_bitmap : 4;
717
718 /* 1 means that we must draw the bitmaps of this row. */
719 unsigned redraw_fringe_bitmaps_p : 1;
720
712 /* In a desired matrix, 1 means that this row must be updated. In a 721 /* In a desired matrix, 1 means that this row must be updated. In a
713 current matrix, 0 means that the row has been invalidated, i.e. 722 current matrix, 0 means that the row has been invalidated, i.e.
714 the row's contents do not agree with what is visible on the 723 the row's contents do not agree with what is visible on the
@@ -777,6 +786,29 @@ struct glyph_row
777 /* 1 means this row was ended by a newline from a string. */ 786 /* 1 means this row was ended by a newline from a string. */
778 unsigned ends_in_newline_from_string_p : 1; 787 unsigned ends_in_newline_from_string_p : 1;
779 788
789 /* 1 means this row width is exactly the width of the window, and the
790 final newline character is hidden in the right fringe. */
791 unsigned exact_window_width_line_p : 1;
792
793 /* 1 means this row currently shows the cursor in the right fringe. */
794 unsigned cursor_in_fringe_p : 1;
795
796 /* Non-zero means display a bitmap on X frames indicating that this
797 the first line of the buffer. */
798 unsigned indicate_bob_p : 1;
799
800 /* Non-zero means display a bitmap on X frames indicating that this
801 the top line of the window, but not start of the buffer. */
802 unsigned indicate_top_line_p : 1;
803
804 /* Non-zero means display a bitmap on X frames indicating that this
805 the last line of the buffer. */
806 unsigned indicate_eob_p : 1;
807
808 /* Non-zero means display a bitmap on X frames indicating that this
809 the bottom line of the window, but not end of the buffer. */
810 unsigned indicate_bottom_line_p : 1;
811
780 /* Continuation lines width at the start of the row. */ 812 /* Continuation lines width at the start of the row. */
781 int continuation_lines_width; 813 int continuation_lines_width;
782}; 814};
@@ -1582,10 +1614,19 @@ enum fringe_bitmap_type
1582 NO_FRINGE_BITMAP = 0, 1614 NO_FRINGE_BITMAP = 0,
1583 LEFT_TRUNCATION_BITMAP, 1615 LEFT_TRUNCATION_BITMAP,
1584 RIGHT_TRUNCATION_BITMAP, 1616 RIGHT_TRUNCATION_BITMAP,
1617 UP_ARROW_BITMAP,
1618 DOWN_ARROW_BITMAP,
1585 CONTINUED_LINE_BITMAP, 1619 CONTINUED_LINE_BITMAP,
1586 CONTINUATION_LINE_BITMAP, 1620 CONTINUATION_LINE_BITMAP,
1587 OVERLAY_ARROW_BITMAP, 1621 OVERLAY_ARROW_BITMAP,
1622 FIRST_LINE_BITMAP,
1623 LAST_LINE_BITMAP,
1624 FILLED_BOX_CURSOR_BITMAP,
1625 HOLLOW_BOX_CURSOR_BITMAP,
1626 BAR_CURSOR_BITMAP,
1627 HBAR_CURSOR_BITMAP,
1588 ZV_LINE_BITMAP, 1628 ZV_LINE_BITMAP,
1629 HOLLOW_SQUARE_BITMAP,
1589 MAX_FRINGE_BITMAPS 1630 MAX_FRINGE_BITMAPS
1590}; 1631};
1591 1632
@@ -2485,7 +2526,10 @@ void move_it_past_eol P_ ((struct it *));
2485int in_display_vector_p P_ ((struct it *)); 2526int in_display_vector_p P_ ((struct it *));
2486int frame_mode_line_height P_ ((struct frame *)); 2527int frame_mode_line_height P_ ((struct frame *));
2487void highlight_trailing_whitespace P_ ((struct frame *, struct glyph_row *)); 2528void highlight_trailing_whitespace P_ ((struct frame *, struct glyph_row *));
2529void draw_fringe_bitmap P_ ((struct window *, struct glyph_row *, int));
2488void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *)); 2530void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *));
2531void draw_window_fringes P_ ((struct window *));
2532int update_window_fringes P_ ((struct window *, int));
2489void compute_fringe_widths P_ ((struct frame *, int)); 2533void compute_fringe_widths P_ ((struct frame *, int));
2490extern Lisp_Object Qtool_bar; 2534extern Lisp_Object Qtool_bar;
2491extern Lisp_Object Vshow_trailing_whitespace; 2535extern Lisp_Object Vshow_trailing_whitespace;
diff --git a/src/dispnew.c b/src/dispnew.c
index 81a0f1f5c8e..b62fd8f8b8f 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -1,5 +1,5 @@
1/* Updating of data structures for redisplay. 1/* Updating of data structures for redisplay.
2 Copyright (C) 1985,86,87,88,93,94,95,97,98,1999,2000,01,02,2003 2 Copyright (C) 1985,86,87,88,93,94,95,97,98,1999,2000,01,02,03,04
3 Free Software Foundation, Inc. 3 Free Software Foundation, Inc.
4 4
5This file is part of GNU Emacs. 5This file is part of GNU Emacs.
@@ -1500,12 +1500,11 @@ row_equal_p (w, a, b, mouse_face_p)
1500 return 0; 1500 return 0;
1501 } 1501 }
1502 1502
1503 if (a->truncated_on_left_p != b->truncated_on_left_p 1503 if (a->fill_line_p != b->fill_line_p
1504 || a->fill_line_p != b->fill_line_p 1504 || a->cursor_in_fringe_p != b->cursor_in_fringe_p
1505 || a->truncated_on_right_p != b->truncated_on_right_p 1505 || a->left_fringe_bitmap != b->left_fringe_bitmap
1506 || a->overlay_arrow_p != b->overlay_arrow_p 1506 || a->right_fringe_bitmap != b->right_fringe_bitmap
1507 || a->continued_p != b->continued_p 1507 || a->exact_window_width_line_p != b->exact_window_width_line_p
1508 || a->indicate_empty_line_p != b->indicate_empty_line_p
1509 || a->overlapped_p != b->overlapped_p 1508 || a->overlapped_p != b->overlapped_p
1510 || (MATRIX_ROW_CONTINUATION_LINE_P (a) 1509 || (MATRIX_ROW_CONTINUATION_LINE_P (a)
1511 != MATRIX_ROW_CONTINUATION_LINE_P (b)) 1510 != MATRIX_ROW_CONTINUATION_LINE_P (b))
@@ -3442,6 +3441,7 @@ direct_output_for_insert (g)
3442 /* Can't do it in a continued line because continuation 3441 /* Can't do it in a continued line because continuation
3443 lines would change. */ 3442 lines would change. */
3444 (glyph_row->continued_p 3443 (glyph_row->continued_p
3444 || glyph_row->exact_window_width_line_p
3445 /* Can't use this method if the line overlaps others or is 3445 /* Can't use this method if the line overlaps others or is
3446 overlapped by others because these other lines would 3446 overlapped by others because these other lines would
3447 have to be redisplayed. */ 3447 have to be redisplayed. */
@@ -3647,6 +3647,10 @@ direct_output_for_insert (g)
3647 cursor_to (y, x); 3647 cursor_to (y, x);
3648 } 3648 }
3649 3649
3650#ifdef HAVE_WINDOW_SYSTEM
3651 update_window_fringes (w, 0);
3652#endif
3653
3650 if (FRAME_RIF (f)) 3654 if (FRAME_RIF (f))
3651 FRAME_RIF (f)->update_window_end_hook (w, 1, 0); 3655 FRAME_RIF (f)->update_window_end_hook (w, 1, 0);
3652 update_end (f); 3656 update_end (f);
@@ -4194,6 +4198,10 @@ update_window (w, force_p)
4194 strcpy (w->current_matrix->method, w->desired_matrix->method); 4198 strcpy (w->current_matrix->method, w->desired_matrix->method);
4195#endif 4199#endif
4196 4200
4201#ifdef HAVE_WINDOW_SYSTEM
4202 update_window_fringes (w, 0);
4203#endif
4204
4197 /* End the update of window W. Don't set the cursor if we 4205 /* End the update of window W. Don't set the cursor if we
4198 paused updating the display because in this case, 4206 paused updating the display because in this case,
4199 set_window_cursor_after_update hasn't been called, and 4207 set_window_cursor_after_update hasn't been called, and
@@ -4515,13 +4523,10 @@ update_window_line (w, vpos, mouse_face_overwritten_p)
4515 if (!current_row->enabled_p 4523 if (!current_row->enabled_p
4516 || desired_row->y != current_row->y 4524 || desired_row->y != current_row->y
4517 || desired_row->visible_height != current_row->visible_height 4525 || desired_row->visible_height != current_row->visible_height
4518 || desired_row->overlay_arrow_p != current_row->overlay_arrow_p 4526 || desired_row->cursor_in_fringe_p != current_row->cursor_in_fringe_p
4519 || desired_row->truncated_on_left_p != current_row->truncated_on_left_p 4527 || current_row->redraw_fringe_bitmaps_p
4520 || desired_row->truncated_on_right_p != current_row->truncated_on_right_p
4521 || desired_row->continued_p != current_row->continued_p
4522 || desired_row->mode_line_p != current_row->mode_line_p 4528 || desired_row->mode_line_p != current_row->mode_line_p
4523 || (desired_row->indicate_empty_line_p 4529 || desired_row->exact_window_width_line_p != current_row->exact_window_width_line_p
4524 != current_row->indicate_empty_line_p)
4525 || (MATRIX_ROW_CONTINUATION_LINE_P (desired_row) 4530 || (MATRIX_ROW_CONTINUATION_LINE_P (desired_row)
4526 != MATRIX_ROW_CONTINUATION_LINE_P (current_row))) 4531 != MATRIX_ROW_CONTINUATION_LINE_P (current_row)))
4527 rif->after_update_window_line_hook (desired_row); 4532 rif->after_update_window_line_hook (desired_row);
@@ -4776,6 +4781,7 @@ scrolling_window (w, header_line_p)
4776 4781
4777 if (c->enabled_p 4782 if (c->enabled_p
4778 && d->enabled_p 4783 && d->enabled_p
4784 && !d->redraw_fringe_bitmaps_p
4779 && c->y == d->y 4785 && c->y == d->y
4780 && MATRIX_ROW_BOTTOM_Y (c) <= yb 4786 && MATRIX_ROW_BOTTOM_Y (c) <= yb
4781 && MATRIX_ROW_BOTTOM_Y (d) <= yb 4787 && MATRIX_ROW_BOTTOM_Y (d) <= yb
@@ -4831,6 +4837,7 @@ scrolling_window (w, header_line_p)
4831 && MATRIX_ROW (current_matrix, i - 1)->enabled_p 4837 && MATRIX_ROW (current_matrix, i - 1)->enabled_p
4832 && (MATRIX_ROW (current_matrix, i - 1)->y 4838 && (MATRIX_ROW (current_matrix, i - 1)->y
4833 == MATRIX_ROW (desired_matrix, j - 1)->y) 4839 == MATRIX_ROW (desired_matrix, j - 1)->y)
4840 && !MATRIX_ROW (desired_matrix, j - 1)->redraw_fringe_bitmaps_p
4834 && row_equal_p (w, 4841 && row_equal_p (w,
4835 MATRIX_ROW (desired_matrix, i - 1), 4842 MATRIX_ROW (desired_matrix, i - 1),
4836 MATRIX_ROW (current_matrix, j - 1), 1)) 4843 MATRIX_ROW (current_matrix, j - 1), 1))
@@ -5023,6 +5030,10 @@ scrolling_window (w, header_line_p)
5023 to = MATRIX_ROW (current_matrix, r->desired_vpos + j); 5030 to = MATRIX_ROW (current_matrix, r->desired_vpos + j);
5024 from = MATRIX_ROW (desired_matrix, r->desired_vpos + j); 5031 from = MATRIX_ROW (desired_matrix, r->desired_vpos + j);
5025 to_overlapped_p = to->overlapped_p; 5032 to_overlapped_p = to->overlapped_p;
5033 if (!from->mode_line_p && !w->pseudo_window_p
5034 && (to->left_fringe_bitmap != from->left_fringe_bitmap
5035 || to->right_fringe_bitmap != from->right_fringe_bitmap))
5036 from->redraw_fringe_bitmaps_p = 1;
5026 assign_row (to, from); 5037 assign_row (to, from);
5027 to->enabled_p = 1, from->enabled_p = 0; 5038 to->enabled_p = 1, from->enabled_p = 0;
5028 to->overlapped_p = to_overlapped_p; 5039 to->overlapped_p = to_overlapped_p;
diff --git a/src/fontset.c b/src/fontset.c
index 3cd76c3af1d..61e05b68c72 100644
--- a/src/fontset.c
+++ b/src/fontset.c
@@ -599,7 +599,8 @@ fontset_font_pattern (f, id, c)
599 fontset = FONTSET_FROM_ID (id); 599 fontset = FONTSET_FROM_ID (id);
600 xassert (!BASE_FONTSET_P (fontset)); 600 xassert (!BASE_FONTSET_P (fontset));
601 fontset = FONTSET_BASE (fontset); 601 fontset = FONTSET_BASE (fontset);
602 elt = FONTSET_REF (fontset, c); 602 if (! EQ (fontset, Vdefault_fontset))
603 elt = FONTSET_REF (fontset, c);
603 } 604 }
604 if (NILP (elt)) 605 if (NILP (elt))
605 { 606 {
diff --git a/src/keyboard.c b/src/keyboard.c
index 1897fb5c0f8..cdf28bd5e66 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -1,5 +1,5 @@
1/* Keyboard and mouse input; editor command loop. 1/* Keyboard and mouse input; editor command loop.
2 Copyright (C) 1985,86,87,88,89,93,94,95,96,97,99,2000,01,02,03 2 Copyright (C) 1985,86,87,88,89,93,94,95,96,97,99,2000,01,02,03,04
3 Free Software Foundation, Inc. 3 Free Software Foundation, Inc.
4 4
5This file is part of GNU Emacs. 5This file is part of GNU Emacs.
@@ -470,36 +470,6 @@ extern char *pending_malloc_warning;
470 470
471static struct input_event kbd_buffer[KBD_BUFFER_SIZE]; 471static struct input_event kbd_buffer[KBD_BUFFER_SIZE];
472 472
473/* Vector to GCPRO the Lisp objects referenced from kbd_buffer.
474
475 The interrupt-level event handlers will never enqueue an event on a
476 frame which is not in Vframe_list, and once an event is dequeued,
477 internal_last_event_frame or the event itself points to the frame.
478 So that's all fine.
479
480 But while the event is sitting in the queue, it's completely
481 unprotected. Suppose the user types one command which will run for
482 a while and then delete a frame, and then types another event at
483 the frame that will be deleted, before the command gets around to
484 it. Suppose there are no references to this frame elsewhere in
485 Emacs, and a GC occurs before the second event is dequeued. Now we
486 have an event referring to a freed frame, which will crash Emacs
487 when it is dequeued.
488
489 Similar things happen when an event on a scroll bar is enqueued; the
490 window may be deleted while the event is in the queue.
491
492 So, we use this vector to protect the Lisp_Objects in the event
493 queue. That way, they'll be dequeued as dead frames or windows,
494 but still valid Lisp objects.
495
496 If kbd_buffer[i].kind != NO_EVENT, then
497
498 AREF (kbd_buffer_gcpro, 2 * i) == kbd_buffer[i].frame_or_window.
499 AREF (kbd_buffer_gcpro, 2 * i + 1) == kbd_buffer[i].arg. */
500
501static Lisp_Object kbd_buffer_gcpro;
502
503/* Pointer to next available character in kbd_buffer. 473/* Pointer to next available character in kbd_buffer.
504 If kbd_fetch_ptr == kbd_store_ptr, the buffer is empty. 474 If kbd_fetch_ptr == kbd_store_ptr, the buffer is empty.
505 This may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the 475 This may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the
@@ -3630,7 +3600,6 @@ kbd_buffer_store_event (event)
3630 Discard the event if it would fill the last slot. */ 3600 Discard the event if it would fill the last slot. */
3631 if (kbd_fetch_ptr - 1 != kbd_store_ptr) 3601 if (kbd_fetch_ptr - 1 != kbd_store_ptr)
3632 { 3602 {
3633 int idx;
3634 3603
3635#if 0 /* The SELECTION_REQUEST_EVENT case looks bogus, and it's error 3604#if 0 /* The SELECTION_REQUEST_EVENT case looks bogus, and it's error
3636 prone to assign individual members for other events, in case 3605 prone to assign individual members for other events, in case
@@ -3660,9 +3629,6 @@ kbd_buffer_store_event (event)
3660 *kbd_store_ptr = *event; 3629 *kbd_store_ptr = *event;
3661#endif 3630#endif
3662 3631
3663 idx = 2 * (kbd_store_ptr - kbd_buffer);
3664 ASET (kbd_buffer_gcpro, idx, event->frame_or_window);
3665 ASET (kbd_buffer_gcpro, idx + 1, event->arg);
3666 ++kbd_store_ptr; 3632 ++kbd_store_ptr;
3667 } 3633 }
3668} 3634}
@@ -3778,9 +3744,6 @@ static INLINE void
3778clear_event (event) 3744clear_event (event)
3779 struct input_event *event; 3745 struct input_event *event;
3780{ 3746{
3781 int idx = 2 * (event - kbd_buffer);
3782 ASET (kbd_buffer_gcpro, idx, Qnil);
3783 ASET (kbd_buffer_gcpro, idx + 1, Qnil);
3784 event->kind = NO_EVENT; 3747 event->kind = NO_EVENT;
3785} 3748}
3786 3749
@@ -6805,6 +6768,30 @@ tty_read_avail_input (struct display *display,
6805 6768
6806#endif /* not VMS */ 6769#endif /* not VMS */
6807 6770
6771void
6772handle_async_input ()
6773{
6774#ifdef BSD4_1
6775 extern int select_alarmed;
6776#endif
6777 interrupt_input_pending = 0;
6778
6779 while (1)
6780 {
6781 int nread;
6782 nread = read_avail_input (1);
6783 /* -1 means it's not ok to read the input now.
6784 UNBLOCK_INPUT will read it later; now, avoid infinite loop.
6785 0 means there was no keyboard input available. */
6786 if (nread <= 0)
6787 break;
6788
6789#ifdef BSD4_1
6790 select_alarmed = 1; /* Force the select emulator back to life */
6791#endif
6792 }
6793}
6794
6808#ifdef SIGIO /* for entire page */ 6795#ifdef SIGIO /* for entire page */
6809/* Note SIGIO has been undef'd if FIONREAD is missing. */ 6796/* Note SIGIO has been undef'd if FIONREAD is missing. */
6810 6797
@@ -6814,9 +6801,6 @@ input_available_signal (signo)
6814{ 6801{
6815 /* Must preserve main program's value of errno. */ 6802 /* Must preserve main program's value of errno. */
6816 int old_errno = errno; 6803 int old_errno = errno;
6817#ifdef BSD4_1
6818 extern int select_alarmed;
6819#endif
6820 6804
6821#if defined (USG) && !defined (POSIX_SIGNALS) 6805#if defined (USG) && !defined (POSIX_SIGNALS)
6822 /* USG systems forget handlers when they are used; 6806 /* USG systems forget handlers when they are used;
@@ -6831,20 +6815,11 @@ input_available_signal (signo)
6831 if (input_available_clear_time) 6815 if (input_available_clear_time)
6832 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0); 6816 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
6833 6817
6834 while (1) 6818#ifdef SYNC_INPUT
6835 { 6819 interrupt_input_pending = 1;
6836 int nread; 6820#else
6837 nread = read_avail_input (1); 6821 handle_async_input ();
6838 /* -1 means it's not ok to read the input now.
6839 UNBLOCK_INPUT will read it later; now, avoid infinite loop.
6840 0 means there was no keyboard input available. */
6841 if (nread <= 0)
6842 break;
6843
6844#ifdef BSD4_1
6845 select_alarmed = 1; /* Force the select emulator back to life */
6846#endif 6822#endif
6847 }
6848 6823
6849#ifdef BSD4_1 6824#ifdef BSD4_1
6850 sigfree (); 6825 sigfree ();
@@ -6863,7 +6838,7 @@ void
6863reinvoke_input_signal () 6838reinvoke_input_signal ()
6864{ 6839{
6865#ifdef SIGIO 6840#ifdef SIGIO
6866 kill (getpid (), SIGIO); 6841 handle_async_input ();
6867#endif 6842#endif
6868} 6843}
6869 6844
@@ -10123,7 +10098,6 @@ Also end any kbd macro being defined. */)
10123 discard_tty_input (); 10098 discard_tty_input ();
10124 10099
10125 kbd_fetch_ptr = kbd_store_ptr; 10100 kbd_fetch_ptr = kbd_store_ptr;
10126 Ffillarray (kbd_buffer_gcpro, Qnil);
10127 input_pending = 0; 10101 input_pending = 0;
10128 10102
10129 return Qnil; 10103 return Qnil;
@@ -10217,17 +10191,13 @@ stuff_buffered_input (stuffstring)
10217 Should we ignore anything that was typed in at the "wrong" kboard? */ 10191 Should we ignore anything that was typed in at the "wrong" kboard? */
10218 for (; kbd_fetch_ptr != kbd_store_ptr; kbd_fetch_ptr++) 10192 for (; kbd_fetch_ptr != kbd_store_ptr; kbd_fetch_ptr++)
10219 { 10193 {
10220 int idx;
10221 10194
10222 if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE) 10195 if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
10223 kbd_fetch_ptr = kbd_buffer; 10196 kbd_fetch_ptr = kbd_buffer;
10224 if (kbd_fetch_ptr->kind == ASCII_KEYSTROKE_EVENT) 10197 if (kbd_fetch_ptr->kind == ASCII_KEYSTROKE_EVENT)
10225 stuff_char (kbd_fetch_ptr->code); 10198 stuff_char (kbd_fetch_ptr->code);
10226 10199
10227 kbd_fetch_ptr->kind = NO_EVENT; 10200 clear_event (kbd_fetch_ptr);
10228 idx = 2 * (kbd_fetch_ptr - kbd_buffer);
10229 ASET (kbd_buffer_gcpro, idx, Qnil);
10230 ASET (kbd_buffer_gcpro, idx + 1, Qnil);
10231 } 10201 }
10232 10202
10233 input_pending = 0; 10203 input_pending = 0;
@@ -10679,7 +10649,6 @@ init_keyboard ()
10679 recent_keys_index = 0; 10649 recent_keys_index = 0;
10680 kbd_fetch_ptr = kbd_buffer; 10650 kbd_fetch_ptr = kbd_buffer;
10681 kbd_store_ptr = kbd_buffer; 10651 kbd_store_ptr = kbd_buffer;
10682 kbd_buffer_gcpro = Fmake_vector (make_number (2 * KBD_BUFFER_SIZE), Qnil);
10683#ifdef HAVE_MOUSE 10652#ifdef HAVE_MOUSE
10684 do_mouse_tracking = Qnil; 10653 do_mouse_tracking = Qnil;
10685#endif 10654#endif
@@ -10976,9 +10945,6 @@ syms_of_keyboard ()
10976 Fset (Qextended_command_history, Qnil); 10945 Fset (Qextended_command_history, Qnil);
10977 staticpro (&Qextended_command_history); 10946 staticpro (&Qextended_command_history);
10978 10947
10979 kbd_buffer_gcpro = Fmake_vector (make_number (2 * KBD_BUFFER_SIZE), Qnil);
10980 staticpro (&kbd_buffer_gcpro);
10981
10982 accent_key_syms = Qnil; 10948 accent_key_syms = Qnil;
10983 staticpro (&accent_key_syms); 10949 staticpro (&accent_key_syms);
10984 10950
diff --git a/src/lisp.h b/src/lisp.h
index 8c6374e6004..570d5ff9757 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -1,5 +1,5 @@
1/* Fundamental definitions for GNU Emacs Lisp interpreter. 1/* Fundamental definitions for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985,86,87,93,94,95,97,98,1999,2000, 2001, 2002, 2003 2 Copyright (C) 1985,86,87,93,94,95,97,98,1999,2000,01,02,03,2004
3 Free Software Foundation, Inc. 3 Free Software Foundation, Inc.
4 4
5This file is part of GNU Emacs. 5This file is part of GNU Emacs.
@@ -67,10 +67,6 @@ extern void die P_((const char *, const char *, int));
67 ? (void) 0 \ 67 ? (void) 0 \
68 : die ((msg), __FILE__, __LINE__)), \ 68 : die ((msg), __FILE__, __LINE__)), \
69 0) 69 0)
70
71/* Let's get some compile-time checking too. */
72#undef NO_UNION_TYPE
73
74#else 70#else
75 71
76/* Produce same side effects and result, but don't complain. */ 72/* Produce same side effects and result, but don't complain. */
@@ -293,12 +289,55 @@ enum pvec_type
293/* For convenience, we also store the number of elements in these bits. */ 289/* For convenience, we also store the number of elements in these bits. */
294#define PSEUDOVECTOR_SIZE_MASK 0x1ff 290#define PSEUDOVECTOR_SIZE_MASK 0x1ff
295 291
292/***** Select the tagging scheme. *****/
293
294/* First, try and define DECL_ALIGN(type,var) which declares a static
295 variable VAR of type TYPE with the added requirement that it be
296 TYPEBITS-aligned. */
297#if defined USE_LSB_TAG && !defined DECL_ALIGN
298/* What compiler directive should we use for non-gcc compilers? -stef */
299# if defined (__GNUC__)
300# define DECL_ALIGN(type, var) \
301 type __attribute__ ((__aligned__ (1 << GCTYPEBITS))) var
302# else
303# error "USE_LSB_TAG used without defining DECL_ALIGN"
304# endif
305#endif
306
307#ifndef USE_LSB_TAG
308/* Just remove the alignment annotation if we don't use it. */
309#undef DECL_ALIGN
310#define DECL_ALIGN(type, var) type var
311#endif
312
313
296/* These macros extract various sorts of values from a Lisp_Object. 314/* These macros extract various sorts of values from a Lisp_Object.
297 For example, if tem is a Lisp_Object whose type is Lisp_Cons, 315 For example, if tem is a Lisp_Object whose type is Lisp_Cons,
298 XCONS (tem) is the struct Lisp_Cons * pointing to the memory for that cons. */ 316 XCONS (tem) is the struct Lisp_Cons * pointing to the memory for that cons. */
299 317
300#ifdef NO_UNION_TYPE 318#ifdef NO_UNION_TYPE
301 319
320#ifdef USE_LSB_TAG
321
322#define TYPEMASK ((((EMACS_INT) 1) << GCTYPEBITS) - 1)
323#define XTYPE(a) ((enum Lisp_Type) (((EMACS_UINT) (a)) & TYPEMASK))
324#define XINT(a) (((EMACS_INT) (a)) >> GCTYPEBITS)
325#define XUINT(a) (((EMACS_UINT) (a)) >> GCTYPEBITS)
326#define XSET(var, type, ptr) \
327 (eassert (XTYPE (ptr) == 0), /* Check alignment. */ \
328 (var) = ((EMACS_INT) (type)) | ((EMACS_INT) (ptr)))
329#define make_number(N) (((EMACS_INT) (N)) << GCTYPEBITS)
330
331/* XFASTINT and XSETFASTINT are for use when the integer is known to be
332 positive, in which case the implementation can sometimes be faster
333 depending on the tagging scheme. With USE_LSB_TAG, there's no benefit. */
334#define XFASTINT(a) XINT (a)
335#define XSETFASTINT(a, b) ((a) = make_number (b))
336
337#define XPNTR(a) ((EMACS_INT) ((a) & ~TYPEMASK))
338
339#else /* not USE_LSB_TAG */
340
302#define VALMASK ((((EMACS_INT) 1) << VALBITS) - 1) 341#define VALMASK ((((EMACS_INT) 1) << VALBITS) - 1)
303 342
304/* One need to override this if there must be high bits set in data space 343/* One need to override this if there must be high bits set in data space
@@ -337,6 +376,8 @@ enum pvec_type
337#define make_number(N) \ 376#define make_number(N) \
338 ((((EMACS_INT) (N)) & VALMASK) | ((EMACS_INT) Lisp_Int) << VALBITS) 377 ((((EMACS_INT) (N)) & VALMASK) | ((EMACS_INT) Lisp_Int) << VALBITS)
339 378
379#endif /* not USE_LSB_TAG */
380
340#define EQ(x, y) ((x) == (y)) 381#define EQ(x, y) ((x) == (y))
341 382
342#else /* not NO_UNION_TYPE */ 383#else /* not NO_UNION_TYPE */
@@ -1150,6 +1191,13 @@ struct Lisp_Free
1150 unsigned gcmarkbit : 1; 1191 unsigned gcmarkbit : 1;
1151 int spacer : 15; 1192 int spacer : 15;
1152 union Lisp_Misc *chain; 1193 union Lisp_Misc *chain;
1194#ifdef USE_LSB_TAG
1195 /* Try to make sure that sizeof(Lisp_Misc) preserves TYPEBITS-alignment.
1196 This assumes that Lisp_Marker is the largest of the alternatives and
1197 that Lisp_Intfwd has the same size as "Lisp_Free w/o padding". */
1198 char padding[((((sizeof (struct Lisp_Marker) - 1) >> GCTYPEBITS) + 1)
1199 << GCTYPEBITS) - sizeof (struct Lisp_Intfwd)];
1200#endif
1153 }; 1201 };
1154 1202
1155/* To get the type field of a union Lisp_Misc, use XMISCTYPE. 1203/* To get the type field of a union Lisp_Misc, use XMISCTYPE.
@@ -1517,7 +1565,7 @@ typedef unsigned char UCHAR;
1517 1565
1518#define DEFUN(lname, fnname, sname, minargs, maxargs, prompt, doc) \ 1566#define DEFUN(lname, fnname, sname, minargs, maxargs, prompt, doc) \
1519 Lisp_Object fnname (); \ 1567 Lisp_Object fnname (); \
1520 struct Lisp_Subr sname = \ 1568 DECL_ALIGN (struct Lisp_Subr, sname) = \
1521 { PVEC_SUBR | (sizeof (struct Lisp_Subr) / sizeof (EMACS_INT)), \ 1569 { PVEC_SUBR | (sizeof (struct Lisp_Subr) / sizeof (EMACS_INT)), \
1522 fnname, minargs, maxargs, lname, prompt, 0}; \ 1570 fnname, minargs, maxargs, lname, prompt, 0}; \
1523 Lisp_Object fnname 1571 Lisp_Object fnname
@@ -1528,7 +1576,7 @@ typedef unsigned char UCHAR;
1528 arguments, so we can catch errors with maxargs at compile-time. */ 1576 arguments, so we can catch errors with maxargs at compile-time. */
1529#define DEFUN(lname, fnname, sname, minargs, maxargs, prompt, doc) \ 1577#define DEFUN(lname, fnname, sname, minargs, maxargs, prompt, doc) \
1530 Lisp_Object fnname DEFUN_ARGS_ ## maxargs ; \ 1578 Lisp_Object fnname DEFUN_ARGS_ ## maxargs ; \
1531 struct Lisp_Subr sname = \ 1579 DECL_ALIGN (struct Lisp_Subr, sname) = \
1532 { PVEC_SUBR | (sizeof (struct Lisp_Subr) / sizeof (EMACS_INT)), \ 1580 { PVEC_SUBR | (sizeof (struct Lisp_Subr) / sizeof (EMACS_INT)), \
1533 fnname, minargs, maxargs, lname, prompt, 0}; \ 1581 fnname, minargs, maxargs, lname, prompt, 0}; \
1534 Lisp_Object fnname 1582 Lisp_Object fnname
@@ -1675,6 +1723,9 @@ extern char *stack_bottom;
1675 This is a good thing to do around a loop that has no side effects 1723 This is a good thing to do around a loop that has no side effects
1676 and (in particular) cannot call arbitrary Lisp code. */ 1724 and (in particular) cannot call arbitrary Lisp code. */
1677 1725
1726#ifdef SYNC_INPUT
1727extern void handle_async_input P_ ((void));
1728extern int interrupt_input_pending;
1678#define QUIT \ 1729#define QUIT \
1679 do { \ 1730 do { \
1680 if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \ 1731 if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \
@@ -1682,8 +1733,24 @@ extern char *stack_bottom;
1682 Vquit_flag = Qnil; \ 1733 Vquit_flag = Qnil; \
1683 Fsignal (Qquit, Qnil); \ 1734 Fsignal (Qquit, Qnil); \
1684 } \ 1735 } \
1736 else if (interrupt_input_pending) \
1737 handle_async_input (); \
1685 } while (0) 1738 } while (0)
1686 1739
1740#else /* not SYNC_INPUT */
1741
1742#define QUIT \
1743 do { \
1744 if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \
1745 { \
1746 Vquit_flag = Qnil; \
1747 Fsignal (Qquit, Qnil); \
1748 } \
1749 } while (0)
1750
1751#endif /* not SYNC_INPUT */
1752
1753
1687/* Nonzero if ought to quit now. */ 1754/* Nonzero if ought to quit now. */
1688 1755
1689#define QUITP (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) 1756#define QUITP (!NILP (Vquit_flag) && NILP (Vinhibit_quit))
diff --git a/src/lread.c b/src/lread.c
index fae47300bd6..ac353c798dc 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -1,5 +1,5 @@
1/* Lisp parsing and input streams. 1/* Lisp parsing and input streams.
2 Copyright (C) 1985, 86, 87, 88, 89, 93, 94, 95, 97, 98, 99, 2000, 01, 2003 2 Copyright (C) 1985,86,87,88,89,93,94,95,97,98,99,2000,01,03,2004
3 Free Software Foundation, Inc. 3 Free Software Foundation, Inc.
4 4
5This file is part of GNU Emacs. 5This file is part of GNU Emacs.
@@ -3496,7 +3496,6 @@ defvar_per_buffer (namestring, address, type, doc)
3496{ 3496{
3497 Lisp_Object sym, val; 3497 Lisp_Object sym, val;
3498 int offset; 3498 int offset;
3499 extern struct buffer buffer_local_symbols;
3500 3499
3501 sym = intern (namestring); 3500 sym = intern (namestring);
3502 val = allocate_misc (); 3501 val = allocate_misc ();
diff --git a/src/macterm.c b/src/macterm.c
index 98e9354afe2..a4124a0c7bc 100644
--- a/src/macterm.c
+++ b/src/macterm.c
@@ -1143,6 +1143,9 @@ x_update_window_end (w, cursor_on_p, mouse_face_overwritten_p)
1143 output_cursor.x, output_cursor.y); 1143 output_cursor.x, output_cursor.y);
1144 1144
1145 x_draw_vertical_border (w); 1145 x_draw_vertical_border (w);
1146
1147 draw_window_fringes (w);
1148
1146 UNBLOCK_INPUT; 1149 UNBLOCK_INPUT;
1147 } 1150 }
1148 1151
@@ -1239,11 +1242,7 @@ x_after_update_window_line (desired_row)
1239 xassert (w); 1242 xassert (w);
1240 1243
1241 if (!desired_row->mode_line_p && !w->pseudo_window_p) 1244 if (!desired_row->mode_line_p && !w->pseudo_window_p)
1242 { 1245 desired_row->redraw_fringe_bitmaps_p = 1;
1243 BLOCK_INPUT;
1244 draw_row_fringe_bitmaps (w, desired_row);
1245 UNBLOCK_INPUT;
1246 }
1247 1246
1248 /* When a window has disappeared, make sure that no rest of 1247 /* When a window has disappeared, make sure that no rest of
1249 full-width rows stays visible in the internal border. Could 1248 full-width rows stays visible in the internal border. Could
@@ -1295,9 +1294,24 @@ x_draw_fringe_bitmap (w, row, p)
1295 XGCValues gcv; 1294 XGCValues gcv;
1296 GC gc = f->output_data.mac->normal_gc; 1295 GC gc = f->output_data.mac->normal_gc;
1297 struct face *face = p->face; 1296 struct face *face = p->face;
1297 int rowY;
1298 1298
1299 /* Must clip because of partially visible lines. */ 1299 /* Must clip because of partially visible lines. */
1300 x_clip_to_row (w, row, gc); 1300 rowY = WINDOW_TO_FRAME_PIXEL_Y (w, row->y);
1301 if (p->y < rowY)
1302 {
1303 /* Adjust position of "bottom aligned" bitmap on partially
1304 visible last row. */
1305 int oldY = row->y;
1306 int oldVH = row->visible_height;
1307 row->visible_height = p->h;
1308 row->y -= rowY - p->y;
1309 x_clip_to_row (w, row, gc);
1310 row->y = oldY;
1311 row->visible_height = oldVH;
1312 }
1313 else
1314 x_clip_to_row (w, row, gc);
1301 1315
1302 if (p->bx >= 0) 1316 if (p->bx >= 0)
1303 { 1317 {
@@ -4546,6 +4560,14 @@ mac_draw_window_cursor (w, glyph_row, x, y, cursor_type, cursor_width, on_p, act
4546 w->phys_cursor_width = cursor_width; 4560 w->phys_cursor_width = cursor_width;
4547 w->phys_cursor_on_p = 1; 4561 w->phys_cursor_on_p = 1;
4548 4562
4563 if (glyph_row->exact_window_width_line_p
4564 && w->phys_cursor.hpos >= glyph_row->used[TEXT_AREA])
4565 {
4566 glyph_row->cursor_in_fringe_p = 1;
4567 draw_fringe_bitmap (w, glyph_row, 0);
4568 return;
4569 }
4570
4549 switch (cursor_type) 4571 switch (cursor_type)
4550 { 4572 {
4551 case HOLLOW_BOX_CURSOR: 4573 case HOLLOW_BOX_CURSOR:
@@ -6643,8 +6665,8 @@ do_check_ram_size (void)
6643 6665
6644 if (Gestalt (gestaltPhysicalRAMSize, &physical_ram_size) != noErr 6666 if (Gestalt (gestaltPhysicalRAMSize, &physical_ram_size) != noErr
6645 || Gestalt (gestaltLogicalRAMSize, &logical_ram_size) != noErr 6667 || Gestalt (gestaltLogicalRAMSize, &logical_ram_size) != noErr
6646 || physical_ram_size > 256 * 1024 * 1024 6668 || physical_ram_size > (1 << VALBITS)
6647 || logical_ram_size > 256 * 1024 * 1024) 6669 || logical_ram_size > (1 << VALBITS))
6648 { 6670 {
6649 StopAlert (RAM_TOO_LARGE_ALERT_ID, NULL); 6671 StopAlert (RAM_TOO_LARGE_ALERT_ID, NULL);
6650 exit (1); 6672 exit (1);
@@ -7443,7 +7465,9 @@ main (void)
7443 7465
7444 do_get_menus (); 7466 do_get_menus ();
7445 7467
7468#ifndef USE_LSB_TAG
7446 do_check_ram_size (); 7469 do_check_ram_size ();
7470#endif
7447 7471
7448 init_emacs_passwd_dir (); 7472 init_emacs_passwd_dir ();
7449 7473
diff --git a/src/process.c b/src/process.c
index 8181727bb79..22f482476cb 100644
--- a/src/process.c
+++ b/src/process.c
@@ -1,6 +1,6 @@
1/* Asynchronous subprocess control for GNU Emacs. 1/* Asynchronous subprocess control for GNU Emacs.
2 Copyright (C) 1985, 86, 87, 88, 93, 94, 95, 96, 98, 1999, 2 Copyright (C) 1985, 86, 87, 88, 93, 94, 95, 96, 98, 1999,
3 2001, 2002, 2003 Free Software Foundation, Inc. 3 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4 4
5This file is part of GNU Emacs. 5This file is part of GNU Emacs.
6 6
@@ -4080,6 +4080,10 @@ wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)
4080 Otherwise, do pending quit if requested. */ 4080 Otherwise, do pending quit if requested. */
4081 if (XINT (read_kbd) >= 0) 4081 if (XINT (read_kbd) >= 0)
4082 QUIT; 4082 QUIT;
4083#ifdef SYNC_INPUT
4084 else if (interrupt_input_pending)
4085 handle_async_input ();
4086#endif
4083 4087
4084 /* Exit now if the cell we're waiting for became non-nil. */ 4088 /* Exit now if the cell we're waiting for became non-nil. */
4085 if (! NILP (wait_for_cell) && ! NILP (XCAR (wait_for_cell))) 4089 if (! NILP (wait_for_cell) && ! NILP (XCAR (wait_for_cell)))
@@ -4296,7 +4300,7 @@ wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)
4296 proc = chan_process[channel]; 4300 proc = chan_process[channel];
4297 if (NILP (proc)) 4301 if (NILP (proc))
4298 continue; 4302 continue;
4299 if (XPROCESS (proc)->read_output_delay > 0) 4303 if (XINT (XPROCESS (proc)->read_output_delay) > 0)
4300 { 4304 {
4301 check_delay--; 4305 check_delay--;
4302 if (NILP (XPROCESS (proc)->read_output_skip)) 4306 if (NILP (XPROCESS (proc)->read_output_skip))
diff --git a/src/s/darwin.h b/src/s/darwin.h
index 32db3e3364b..abc56901e17 100644
--- a/src/s/darwin.h
+++ b/src/s/darwin.h
@@ -1,5 +1,5 @@
1/* System description header file for Darwin (Mac OS X). 1/* System description header file for Darwin (Mac OS X).
2 Copyright (C) 2001, 2002 Free Software Foundation, Inc. 2 Copyright (C) 2001, 02, 2004 Free Software Foundation, Inc.
3 3
4This file is part of GNU Emacs. 4This file is part of GNU Emacs.
5 5
@@ -203,9 +203,6 @@ Boston, MA 02111-1307, USA. */
203/* Fix compilation problem for regex.c. */ 203/* Fix compilation problem for regex.c. */
204#define __restrict 204#define __restrict
205 205
206/* Fix compilation problem for md5.c. */
207#define __attribute__(x)
208
209/* Used in dispnew.c. Copied from freebsd.h. */ 206/* Used in dispnew.c. Copied from freebsd.h. */
210#define PENDING_OUTPUT_COUNT(FILE) ((FILE)->_p - (FILE)->_bf._base) 207#define PENDING_OUTPUT_COUNT(FILE) ((FILE)->_p - (FILE)->_bf._base)
211 208
diff --git a/src/search.c b/src/search.c
index 538cb8dfa64..020573b75a1 100644
--- a/src/search.c
+++ b/src/search.c
@@ -2553,8 +2553,16 @@ since only regular expressions have distinguished subexpressions. */)
2553 } 2553 }
2554 2554
2555 if (really_changed) 2555 if (really_changed)
2556 newtext = make_string (substed, substed_len); 2556 {
2557 if (buf_multibyte)
2558 {
2559 int nchars = multibyte_chars_in_text (substed, substed_len);
2557 2560
2561 newtext = make_multibyte_string (substed, nchars, substed_len);
2562 }
2563 else
2564 newtext = make_unibyte_string (substed, substed_len);
2565 }
2558 xfree (substed); 2566 xfree (substed);
2559 } 2567 }
2560 2568
diff --git a/src/w32term.c b/src/w32term.c
index bee1a1913ff..834df6ef88f 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -540,6 +540,9 @@ x_update_window_end (w, cursor_on_p, mouse_face_overwritten_p)
540 output_cursor.x, output_cursor.y); 540 output_cursor.x, output_cursor.y);
541 541
542 x_draw_vertical_border (w); 542 x_draw_vertical_border (w);
543
544 draw_window_fringes (w);
545
543 UNBLOCK_INPUT; 546 UNBLOCK_INPUT;
544 } 547 }
545 548
@@ -624,11 +627,7 @@ x_after_update_window_line (desired_row)
624 xassert (w); 627 xassert (w);
625 628
626 if (!desired_row->mode_line_p && !w->pseudo_window_p) 629 if (!desired_row->mode_line_p && !w->pseudo_window_p)
627 { 630 desired_row->redraw_fringe_bitmaps_p = 1;
628 BLOCK_INPUT;
629 draw_row_fringe_bitmaps (w, desired_row);
630 UNBLOCK_INPUT;
631 }
632 631
633 /* When a window has disappeared, make sure that no rest of 632 /* When a window has disappeared, make sure that no rest of
634 full-width rows stays visible in the internal border. Could 633 full-width rows stays visible in the internal border. Could
@@ -678,11 +677,26 @@ w32_draw_fringe_bitmap (w, row, p)
678 struct frame *f = XFRAME (WINDOW_FRAME (w)); 677 struct frame *f = XFRAME (WINDOW_FRAME (w));
679 HDC hdc; 678 HDC hdc;
680 struct face *face = p->face; 679 struct face *face = p->face;
680 int rowY;
681 681
682 hdc = get_frame_dc (f); 682 hdc = get_frame_dc (f);
683 683
684 /* Must clip because of partially visible lines. */ 684 /* Must clip because of partially visible lines. */
685 w32_clip_to_row (w, row, hdc); 685 rowY = WINDOW_TO_FRAME_PIXEL_Y (w, row->y);
686 if (p->y < rowY)
687 {
688 /* Adjust position of "bottom aligned" bitmap on partially
689 visible last row. */
690 int oldY = row->y;
691 int oldVH = row->visible_height;
692 row->visible_height = p->h;
693 row->y -= rowY - p->y;
694 w32_clip_to_row (w, row, hdc);
695 row->y = oldY;
696 row->visible_height = oldVH;
697 }
698 else
699 w32_clip_to_row (w, row, hdc);
686 700
687 if (p->bx >= 0) 701 if (p->bx >= 0)
688 { 702 {
@@ -5120,6 +5134,14 @@ w32_draw_window_cursor (w, glyph_row, x, y, cursor_type, cursor_width, on_p, act
5120 PostMessage (hwnd, WM_EMACS_TRACK_CARET, 0, 0); 5134 PostMessage (hwnd, WM_EMACS_TRACK_CARET, 0, 0);
5121 } 5135 }
5122 5136
5137 if (glyph_row->exact_window_width_line_p
5138 && w->phys_cursor.hpos >= glyph_row->used[TEXT_AREA])
5139 {
5140 glyph_row->cursor_in_fringe_p = 1;
5141 draw_fringe_bitmap (w, glyph_row, 0);
5142 return;
5143 }
5144
5123 switch (cursor_type) 5145 switch (cursor_type)
5124 { 5146 {
5125 case HOLLOW_BOX_CURSOR: 5147 case HOLLOW_BOX_CURSOR:
diff --git a/src/xdisp.c b/src/xdisp.c
index 675aa696a59..fc09df3b49a 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -1,5 +1,5 @@
1/* Display generation from window structure and buffer text. 1/* Display generation from window structure and buffer text.
2 Copyright (C) 1985,86,87,88,93,94,95,97,98,99,2000,01,02,03 2 Copyright (C) 1985,86,87,88,93,94,95,97,98,99,2000,01,02,03,04
3 Free Software Foundation, Inc. 3 Free Software Foundation, Inc.
4 4
5This file is part of GNU Emacs. 5This file is part of GNU Emacs.
@@ -310,6 +310,21 @@ extern Lisp_Object Qscroll_bar;
310 310
311Lisp_Object Vshow_trailing_whitespace; 311Lisp_Object Vshow_trailing_whitespace;
312 312
313#ifdef HAVE_WINDOW_SYSTEM
314/* Non-nil means that newline may flow into the right fringe. */
315
316Lisp_Object Voverflow_newline_into_fringe;
317#endif /* HAVE_WINDOW_SYSTEM */
318
319/* Test if overflow newline into fringe. Called with iterator IT
320 at or past right window margin, and with IT->current_x set. */
321
322#define IT_OVERFLOW_NEWLINE_INTO_FRINGE(it) \
323 (!NILP (Voverflow_newline_into_fringe) \
324 && FRAME_WINDOW_P (it->f) \
325 && WINDOW_RIGHT_FRINGE_WIDTH (it->w) > 0 \
326 && it->current_x == it->last_visible_x)
327
313/* Non-nil means show the text cursor in void text areas 328/* Non-nil means show the text cursor in void text areas
314 i.e. in blank areas after eol and eob. This used to be 329 i.e. in blank areas after eol and eob. This used to be
315 the default in 21.3. */ 330 the default in 21.3. */
@@ -5590,7 +5605,20 @@ move_it_in_display_line_to (it, to_charpos, to_x, op)
5590 ++it->hpos; 5605 ++it->hpos;
5591 it->current_x = new_x; 5606 it->current_x = new_x;
5592 if (i == it->nglyphs - 1) 5607 if (i == it->nglyphs - 1)
5593 set_iterator_to_next (it, 1); 5608 {
5609 set_iterator_to_next (it, 1);
5610#ifdef HAVE_WINDOW_SYSTEM
5611 if (IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
5612 {
5613 get_next_display_element (it);
5614 if (ITERATOR_AT_END_OF_LINE_P (it))
5615 {
5616 result = MOVE_NEWLINE_OR_CR;
5617 break;
5618 }
5619 }
5620#endif /* HAVE_WINDOW_SYSTEM */
5621 }
5594 } 5622 }
5595 else 5623 else
5596 { 5624 {
@@ -5647,6 +5675,17 @@ move_it_in_display_line_to (it, to_charpos, to_x, op)
5647 if (it->truncate_lines_p 5675 if (it->truncate_lines_p
5648 && it->current_x >= it->last_visible_x) 5676 && it->current_x >= it->last_visible_x)
5649 { 5677 {
5678#ifdef HAVE_WINDOW_SYSTEM
5679 if (IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
5680 {
5681 get_next_display_element (it);
5682 if (ITERATOR_AT_END_OF_LINE_P (it))
5683 {
5684 result = MOVE_NEWLINE_OR_CR;
5685 break;
5686 }
5687 }
5688#endif /* HAVE_WINDOW_SYSTEM */
5650 result = MOVE_LINE_TRUNCATED; 5689 result = MOVE_LINE_TRUNCATED;
5651 break; 5690 break;
5652 } 5691 }
@@ -8895,26 +8934,205 @@ note_tool_bar_highlight (f, x, y)
8895 8934
8896#ifdef HAVE_WINDOW_SYSTEM 8935#ifdef HAVE_WINDOW_SYSTEM
8897 8936
8937/* Notice that all bitmaps bits are "mirrored". */
8938
8898/* An arrow like this: `<-'. */ 8939/* An arrow like this: `<-'. */
8940/*
8941 ...xx...
8942 ....xx..
8943 .....xx.
8944 ..xxxxxx
8945 ..xxxxxx
8946 .....xx.
8947 ....xx..
8948 ...xx...
8949*/
8899static unsigned char left_bits[] = { 8950static unsigned char left_bits[] = {
8900 0x18, 0x0c, 0x06, 0x3f, 0x3f, 0x06, 0x0c, 0x18}; 8951 0x18, 0x0c, 0x06, 0x3f, 0x3f, 0x06, 0x0c, 0x18};
8901 8952
8953
8902/* Right truncation arrow bitmap `->'. */ 8954/* Right truncation arrow bitmap `->'. */
8955/*
8956 ...xx...
8957 ..xx....
8958 .xx.....
8959 xxxxxx..
8960 xxxxxx..
8961 .xx.....
8962 ..xx....
8963 ...xx...
8964*/
8903static unsigned char right_bits[] = { 8965static unsigned char right_bits[] = {
8904 0x18, 0x30, 0x60, 0xfc, 0xfc, 0x60, 0x30, 0x18}; 8966 0x18, 0x30, 0x60, 0xfc, 0xfc, 0x60, 0x30, 0x18};
8905 8967
8968
8969/* Up arrow bitmap. */
8970/*
8971 ...xx...
8972 ..xxxx..
8973 .xxxxxx.
8974 xxxxxxxx
8975 ...xx...
8976 ...xx...
8977 ...xx...
8978 ...xx...
8979*/
8980static unsigned char up_arrow_bits[] = {
8981 0x18, 0x3c, 0x7e, 0xff, 0x18, 0x18, 0x18, 0x18};
8982
8983
8984/* Down arrow bitmap. */
8985/*
8986 ...xx...
8987 ...xx...
8988 ...xx...
8989 ...xx...
8990 xxxxxxxx
8991 .xxxxxx.
8992 ..xxxx..
8993 ...xx...
8994*/
8995static unsigned char down_arrow_bits[] = {
8996 0x18, 0x18, 0x18, 0x18, 0xff, 0x7e, 0x3c, 0x18};
8997
8906/* Marker for continued lines. */ 8998/* Marker for continued lines. */
8999/*
9000 ..xxxx..
9001 .xxxxx..
9002 xx......
9003 xxx..x..
9004 xxxxxx..
9005 .xxxxx..
9006 ..xxxx..
9007 .xxxxx..
9008*/
8907static unsigned char continued_bits[] = { 9009static unsigned char continued_bits[] = {
8908 0x3c, 0x7c, 0xc0, 0xe4, 0xfc, 0x7c, 0x3c, 0x7c}; 9010 0x3c, 0x7c, 0xc0, 0xe4, 0xfc, 0x7c, 0x3c, 0x7c};
8909 9011
8910/* Marker for continuation lines. */ 9012/* Marker for continuation lines. */
9013/*
9014 ..xxxx..
9015 ..xxxxx.
9016 ......xx
9017 ..x..xxx
9018 ..xxxxxx
9019 ..xxxxx.
9020 ..xxxx..
9021 ..xxxxx.
9022*/
8911static unsigned char continuation_bits[] = { 9023static unsigned char continuation_bits[] = {
8912 0x3c, 0x3e, 0x03, 0x27, 0x3f, 0x3e, 0x3c, 0x3e}; 9024 0x3c, 0x3e, 0x03, 0x27, 0x3f, 0x3e, 0x3c, 0x3e};
8913 9025
8914/* Overlay arrow bitmap. A triangular arrow. */ 9026/* Overlay arrow bitmap. A triangular arrow. */
9027/*
9028 ......xx
9029 ....xxxx
9030 ...xxxxx
9031 ..xxxxxx
9032 ..xxxxxx
9033 ...xxxxx
9034 ....xxxx
9035 ......xx
9036*/
8915static unsigned char ov_bits[] = { 9037static unsigned char ov_bits[] = {
8916 0x03, 0x0f, 0x1f, 0x3f, 0x3f, 0x1f, 0x0f, 0x03}; 9038 0x03, 0x0f, 0x1f, 0x3f, 0x3f, 0x1f, 0x0f, 0x03};
8917 9039
9040
9041/* First line bitmap. An left-up angle. */
9042/*
9043 ..xxxxxx
9044 ..xxxxxx
9045 ......xx
9046 ......xx
9047 ......xx
9048 ......xx
9049 ......xx
9050 ........
9051*/
9052static unsigned char first_line_bits[] = {
9053 0x3f, 0x3f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00};
9054
9055
9056/* Last line bitmap. An left-down angle. */
9057/*
9058 ........
9059 xx......
9060 xx......
9061 xx......
9062 xx......
9063 xx......
9064 xxxxxx..
9065 xxxxxx..
9066*/
9067static unsigned char last_line_bits[] = {
9068 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xfc};
9069
9070/* Filled box cursor bitmap. A filled box; max 13 pixels high. */
9071/*
9072 .xxxxxxx
9073 .xxxxxxx
9074 .xxxxxxx
9075 .xxxxxxx
9076 .xxxxxxx
9077 .xxxxxxx
9078 .xxxxxxx
9079 .xxxxxxx
9080 .xxxxxxx
9081 .xxxxxxx
9082 .xxxxxxx
9083 .xxxxxxx
9084 .xxxxxxx
9085*/
9086static unsigned char filled_box_cursor_bits[] = {
9087 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f};
9088
9089/* Hollow box cursor bitmap. A hollow box; max 13 pixels high. */
9090/*
9091 .xxxxxxx
9092 .x.....x
9093 .x.....x
9094 .x.....x
9095 .x.....x
9096 .x.....x
9097 .x.....x
9098 .x.....x
9099 .x.....x
9100 .x.....x
9101 .x.....x
9102 .x.....x
9103 .xxxxxxx
9104*/
9105static unsigned char hollow_box_cursor_bits[] = {
9106 0x7f, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x7f};
9107
9108/* Bar cursor bitmap. A vertical bar; max 13 pixels high. */
9109/*
9110 ......xx
9111 ......xx
9112 ......xx
9113 ......xx
9114 ......xx
9115 ......xx
9116 ......xx
9117 ......xx
9118 ......xx
9119 ......xx
9120 ......xx
9121 ......xx
9122 ......xx
9123*/
9124static unsigned char bar_cursor_bits[] = {
9125 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03};
9126
9127/* HBar cursor bitmap. A horisontal bar; 2 pixels high. */
9128/*
9129 .xxxxxxx
9130 .xxxxxxx
9131*/
9132static unsigned char hbar_cursor_bits[] = {
9133 0x7f, 0x7f};
9134
9135
8918/* Bitmap drawn to indicate lines not displaying text if 9136/* Bitmap drawn to indicate lines not displaying text if
8919 `indicate-empty-lines' is non-nil. */ 9137 `indicate-empty-lines' is non-nil. */
8920static unsigned char zv_bits[] = { 9138static unsigned char zv_bits[] = {
@@ -8927,32 +9145,89 @@ static unsigned char zv_bits[] = {
8927 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 9145 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00,
8928 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00}; 9146 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00};
8929 9147
9148/* Hollow square bitmap. */
9149/*
9150 .xxxxxx.
9151 .x....x.
9152 .x....x.
9153 .x....x.
9154 .x....x.
9155 .xxxxxx.
9156*/
9157static unsigned char hollow_square_bits[] = {
9158 0x7e, 0x42, 0x42, 0x42, 0x42, 0x7e};
9159
9160
8930struct fringe_bitmap fringe_bitmaps[MAX_FRINGE_BITMAPS] = 9161struct fringe_bitmap fringe_bitmaps[MAX_FRINGE_BITMAPS] =
8931{ 9162{
8932 { 0, 0, 0, NULL /* NO_FRINGE_BITMAP */ }, 9163 { 0, 0, 0, NULL /* NO_FRINGE_BITMAP */ },
8933 { 8, sizeof (left_bits), 0, left_bits }, 9164 { 8, sizeof (left_bits), 0, left_bits },
8934 { 8, sizeof (right_bits), 0, right_bits }, 9165 { 8, sizeof (right_bits), 0, right_bits },
9166 { 8, sizeof (up_arrow_bits), -1, up_arrow_bits },
9167 { 8, sizeof (down_arrow_bits), -2, down_arrow_bits },
8935 { 8, sizeof (continued_bits), 0, continued_bits }, 9168 { 8, sizeof (continued_bits), 0, continued_bits },
8936 { 8, sizeof (continuation_bits), 0, continuation_bits }, 9169 { 8, sizeof (continuation_bits), 0, continuation_bits },
8937 { 8, sizeof (ov_bits), 0, ov_bits }, 9170 { 8, sizeof (ov_bits), 0, ov_bits },
8938 { 8, sizeof (zv_bits), 3, zv_bits } 9171 { 8, sizeof (first_line_bits), -1, first_line_bits },
9172 { 8, sizeof (last_line_bits), -2, last_line_bits },
9173 { 8, sizeof (filled_box_cursor_bits), 0, filled_box_cursor_bits },
9174 { 8, sizeof (hollow_box_cursor_bits), 0, hollow_box_cursor_bits },
9175 { 8, sizeof (bar_cursor_bits), 0, bar_cursor_bits },
9176 { 8, sizeof (hbar_cursor_bits), -2, hbar_cursor_bits },
9177 { 8, sizeof (zv_bits), 3, zv_bits },
9178 { 8, sizeof (hollow_square_bits), 0, hollow_square_bits },
8939}; 9179};
8940 9180
8941 9181
8942/* Draw the bitmap WHICH in one of the left or right fringes of 9182/* Draw the bitmap WHICH in one of the left or right fringes of
8943 window W. ROW is the glyph row for which to display the bitmap; it 9183 window W. ROW is the glyph row for which to display the bitmap; it
8944 determines the vertical position at which the bitmap has to be 9184 determines the vertical position at which the bitmap has to be
8945 drawn. */ 9185 drawn.
9186 LEFT_P is 1 for left fringe, 0 for right fringe.
9187*/
8946 9188
8947static void 9189void
8948draw_fringe_bitmap (w, row, which, left_p) 9190draw_fringe_bitmap (w, row, left_p)
8949 struct window *w; 9191 struct window *w;
8950 struct glyph_row *row; 9192 struct glyph_row *row;
8951 enum fringe_bitmap_type which;
8952 int left_p; 9193 int left_p;
8953{ 9194{
8954 struct frame *f = XFRAME (WINDOW_FRAME (w)); 9195 struct frame *f = XFRAME (WINDOW_FRAME (w));
8955 struct draw_fringe_bitmap_params p; 9196 struct draw_fringe_bitmap_params p;
9197 enum fringe_bitmap_type which;
9198 int period;
9199
9200 if (left_p)
9201 which = row->left_fringe_bitmap;
9202 else if (!row->cursor_in_fringe_p)
9203 which = row->right_fringe_bitmap;
9204 else
9205 switch (w->phys_cursor_type)
9206 {
9207 case HOLLOW_BOX_CURSOR:
9208 if (row->visible_height >= sizeof(hollow_box_cursor_bits))
9209 which = HOLLOW_BOX_CURSOR_BITMAP;
9210 else
9211 which = HOLLOW_SQUARE_BITMAP;
9212 break;
9213 case FILLED_BOX_CURSOR:
9214 which = FILLED_BOX_CURSOR_BITMAP;
9215 break;
9216 case BAR_CURSOR:
9217 which = BAR_CURSOR_BITMAP;
9218 break;
9219 case HBAR_CURSOR:
9220 which = HBAR_CURSOR_BITMAP;
9221 break;
9222 case NO_CURSOR:
9223 default:
9224 w->phys_cursor_on_p = 0;
9225 row->cursor_in_fringe_p = 0;
9226 which = row->right_fringe_bitmap;
9227 break;
9228 }
9229
9230 period = fringe_bitmaps[which].period;
8956 9231
8957 /* Convert row to frame coordinates. */ 9232 /* Convert row to frame coordinates. */
8958 p.y = WINDOW_TO_FRAME_PIXEL_Y (w, row->y); 9233 p.y = WINDOW_TO_FRAME_PIXEL_Y (w, row->y);
@@ -8961,9 +9236,7 @@ draw_fringe_bitmap (w, row, which, left_p)
8961 p.wd = fringe_bitmaps[which].width; 9236 p.wd = fringe_bitmaps[which].width;
8962 9237
8963 p.h = fringe_bitmaps[which].height; 9238 p.h = fringe_bitmaps[which].height;
8964 p.dh = (fringe_bitmaps[which].period 9239 p.dh = (period > 0 ? (p.y % period) : 0);
8965 ? (p.y % fringe_bitmaps[which].period)
8966 : 0);
8967 p.h -= p.dh; 9240 p.h -= p.dh;
8968 /* Clip bitmap if too high. */ 9241 /* Clip bitmap if too high. */
8969 if (p.h > row->height) 9242 if (p.h > row->height)
@@ -9023,7 +9296,13 @@ draw_fringe_bitmap (w, row, which, left_p)
9023 } 9296 }
9024 9297
9025 /* Adjust y to the offset in the row to start drawing the bitmap. */ 9298 /* Adjust y to the offset in the row to start drawing the bitmap. */
9026 p.y += (row->height - p.h) / 2; 9299 if (period == 0)
9300 p.y += (row->height - p.h) / 2;
9301 else if (period == -2)
9302 {
9303 p.h = fringe_bitmaps[which].height;
9304 p.y += (row->visible_height - p.h);
9305 }
9027 9306
9028 FRAME_RIF (f)->draw_fringe_bitmap (w, row, &p); 9307 FRAME_RIF (f)->draw_fringe_bitmap (w, row, &p);
9029} 9308}
@@ -9036,8 +9315,6 @@ draw_row_fringe_bitmaps (w, row)
9036 struct window *w; 9315 struct window *w;
9037 struct glyph_row *row; 9316 struct glyph_row *row;
9038{ 9317{
9039 enum fringe_bitmap_type bitmap;
9040
9041 xassert (interrupt_input_blocked); 9318 xassert (interrupt_input_blocked);
9042 9319
9043 /* If row is completely invisible, because of vscrolling, we 9320 /* If row is completely invisible, because of vscrolling, we
@@ -9046,35 +9323,35 @@ draw_row_fringe_bitmaps (w, row)
9046 return; 9323 return;
9047 9324
9048 if (WINDOW_LEFT_FRINGE_WIDTH (w) != 0) 9325 if (WINDOW_LEFT_FRINGE_WIDTH (w) != 0)
9049 { 9326 draw_fringe_bitmap (w, row, 1);
9050 /* Decide which bitmap to draw in the left fringe. */
9051 if (row->overlay_arrow_p)
9052 bitmap = OVERLAY_ARROW_BITMAP;
9053 else if (row->truncated_on_left_p)
9054 bitmap = LEFT_TRUNCATION_BITMAP;
9055 else if (MATRIX_ROW_CONTINUATION_LINE_P (row))
9056 bitmap = CONTINUATION_LINE_BITMAP;
9057 else if (row->indicate_empty_line_p)
9058 bitmap = ZV_LINE_BITMAP;
9059 else
9060 bitmap = NO_FRINGE_BITMAP;
9061
9062 draw_fringe_bitmap (w, row, bitmap, 1);
9063 }
9064 9327
9065 if (WINDOW_RIGHT_FRINGE_WIDTH (w) != 0) 9328 if (WINDOW_RIGHT_FRINGE_WIDTH (w) != 0)
9066 { 9329 draw_fringe_bitmap (w, row, 0);
9067 /* Decide which bitmap to draw in the right fringe. */ 9330}
9068 if (row->truncated_on_right_p) 9331
9069 bitmap = RIGHT_TRUNCATION_BITMAP; 9332/* Draw the fringes of window W. Only fringes for rows marked for
9070 else if (row->continued_p) 9333 update in redraw_fringe_bitmaps_p are drawn. */
9071 bitmap = CONTINUED_LINE_BITMAP; 9334
9072 else if (row->indicate_empty_line_p && WINDOW_LEFT_FRINGE_WIDTH (w) == 0) 9335void
9073 bitmap = ZV_LINE_BITMAP; 9336draw_window_fringes (w)
9074 else 9337 struct window *w;
9075 bitmap = NO_FRINGE_BITMAP; 9338{
9339 struct glyph_row *row;
9340 int yb = window_text_bottom_y (w);
9341 int nrows = w->current_matrix->nrows;
9342 int y = 0, rn;
9076 9343
9077 draw_fringe_bitmap (w, row, bitmap, 0); 9344 if (w->pseudo_window_p)
9345 return;
9346
9347 for (y = 0, rn = 0, row = w->current_matrix->rows;
9348 y < yb && rn < nrows;
9349 y += row->height, ++row, ++rn)
9350 {
9351 if (!row->redraw_fringe_bitmaps_p)
9352 continue;
9353 draw_row_fringe_bitmaps (w, row);
9354 row->redraw_fringe_bitmaps_p = 0;
9078 } 9355 }
9079} 9356}
9080 9357
@@ -9982,6 +10259,9 @@ redisplay_internal (preserve_echo_area)
9982 *w->desired_matrix->method = 0; 10259 *w->desired_matrix->method = 0;
9983 debug_method_add (w, "optimization 1"); 10260 debug_method_add (w, "optimization 1");
9984#endif 10261#endif
10262#ifdef HAVE_WINDOW_SYSTEM
10263 update_window_fringes (w, 0);
10264#endif
9985 goto update; 10265 goto update;
9986 } 10266 }
9987 else 10267 else
@@ -11394,6 +11674,137 @@ set_vertical_scroll_bar (w)
11394 (w, end - start, whole, start); 11674 (w, end - start, whole, start);
11395} 11675}
11396 11676
11677#ifdef HAVE_WINDOW_SYSTEM
11678
11679/* Recalculate the bitmaps to show in the fringes of window W.
11680 If FORCE_P is 0, only mark rows with modified bitmaps for update in
11681 redraw_fringe_bitmaps_p; else mark all rows for update. */
11682
11683int
11684update_window_fringes (w, force_p)
11685 struct window *w;
11686 int force_p;
11687{
11688 struct glyph_row *row, *cur = 0;
11689 int yb = window_text_bottom_y (w);
11690 int rn, nrows = w->current_matrix->nrows;
11691 int y;
11692 int redraw_p = 0;
11693 Lisp_Object ind;
11694
11695 if (w->pseudo_window_p)
11696 return 0;
11697
11698 if (!MINI_WINDOW_P (w)
11699 && (ind = XBUFFER (w->buffer)->indicate_buffer_boundaries, !NILP (ind)))
11700 {
11701 int do_eob = 1, do_bob = 1;
11702
11703 for (y = 0, rn = 0;
11704 y < yb && rn < nrows;
11705 y += row->height, ++rn)
11706 {
11707 unsigned indicate_bob_p, indicate_top_line_p;
11708 unsigned indicate_eob_p, indicate_bottom_line_p;
11709
11710 row = w->desired_matrix->rows + rn;
11711 if (!row->enabled_p)
11712 row = w->current_matrix->rows + rn;
11713
11714 indicate_bob_p = row->indicate_bob_p;
11715 indicate_top_line_p = row->indicate_top_line_p;
11716 indicate_eob_p = row->indicate_eob_p;
11717 indicate_bottom_line_p = row->indicate_bottom_line_p;
11718
11719 row->indicate_bob_p = row->indicate_top_line_p = 0;
11720 row->indicate_eob_p = row->indicate_bottom_line_p = 0;
11721
11722 if (MATRIX_ROW_START_CHARPOS (row) <= BUF_BEGV (XBUFFER (w->buffer)))
11723 row->indicate_bob_p = do_bob, do_bob = 0;
11724 else if (EQ (ind, Qt)
11725 && (WINDOW_WANTS_HEADER_LINE_P (w) ? 1 : 0) == rn)
11726 row->indicate_top_line_p = 1;
11727
11728 if (MATRIX_ROW_END_CHARPOS (row) >= BUF_ZV (XBUFFER (w->buffer)))
11729 row->indicate_eob_p = do_eob, do_eob = 0;
11730 else if (EQ (ind, Qt)
11731 && y + row->height >= yb)
11732 row->indicate_bottom_line_p = 1;
11733
11734 if (indicate_bob_p != row->indicate_bob_p
11735 || indicate_top_line_p != row->indicate_top_line_p
11736 || indicate_eob_p != row->indicate_eob_p
11737 || indicate_bottom_line_p != row->indicate_bottom_line_p)
11738 row->redraw_fringe_bitmaps_p = 1;
11739 }
11740 }
11741
11742 for (y = 0, rn = 0;
11743 y < yb && rn < nrows;
11744 y += row->height, rn++)
11745 {
11746 enum fringe_bitmap_type left, right;
11747
11748 row = w->desired_matrix->rows + rn;
11749 cur = w->current_matrix->rows + rn;
11750 if (!row->enabled_p)
11751 row = cur;
11752
11753 /* Decide which bitmap to draw in the left fringe. */
11754 if (WINDOW_LEFT_FRINGE_WIDTH (w) == 0)
11755 left = NO_FRINGE_BITMAP;
11756 else if (row->overlay_arrow_p)
11757 left = OVERLAY_ARROW_BITMAP;
11758 else if (row->truncated_on_left_p)
11759 left = LEFT_TRUNCATION_BITMAP;
11760 else if (MATRIX_ROW_CONTINUATION_LINE_P (row))
11761 left = CONTINUATION_LINE_BITMAP;
11762 else if (row->indicate_empty_line_p)
11763 left = ZV_LINE_BITMAP;
11764 else if (row->indicate_bob_p)
11765 left = FIRST_LINE_BITMAP;
11766 else
11767 left = NO_FRINGE_BITMAP;
11768
11769 /* Decide which bitmap to draw in the right fringe. */
11770 if (WINDOW_RIGHT_FRINGE_WIDTH (w) == 0)
11771 right = NO_FRINGE_BITMAP;
11772 else if (row->truncated_on_right_p)
11773 right = RIGHT_TRUNCATION_BITMAP;
11774 else if (row->continued_p)
11775 right = CONTINUED_LINE_BITMAP;
11776 else if (row->indicate_eob_p)
11777 right = LAST_LINE_BITMAP;
11778 else if (row->indicate_top_line_p)
11779 right = UP_ARROW_BITMAP;
11780 else if (row->indicate_bottom_line_p)
11781 right = DOWN_ARROW_BITMAP;
11782 else if (row->indicate_empty_line_p && WINDOW_LEFT_FRINGE_WIDTH (w) == 0)
11783 right = ZV_LINE_BITMAP;
11784 else
11785 right = NO_FRINGE_BITMAP;
11786
11787 if (force_p
11788 || row->y != cur->y
11789 || row->visible_height != cur->visible_height
11790 || left != cur->left_fringe_bitmap
11791 || right != cur->right_fringe_bitmap
11792 || cur->redraw_fringe_bitmaps_p)
11793 {
11794 redraw_p = row->redraw_fringe_bitmaps_p = cur->redraw_fringe_bitmaps_p = 1;
11795 cur->left_fringe_bitmap = left;
11796 cur->right_fringe_bitmap = right;
11797 }
11798
11799 row->left_fringe_bitmap = left;
11800 row->right_fringe_bitmap = right;
11801 }
11802
11803 return redraw_p;
11804}
11805
11806#endif /* HAVE_WINDOW_SYSTEM */
11807
11397/* Redisplay leaf window WINDOW. JUST_THIS_ONE_P non-zero means only 11808/* Redisplay leaf window WINDOW. JUST_THIS_ONE_P non-zero means only
11398 selected_window is redisplayed. 11809 selected_window is redisplayed.
11399 11810
@@ -11416,6 +11827,7 @@ redisplay_window (window, just_this_one_p)
11416 struct it it; 11827 struct it it;
11417 /* Record it now because it's overwritten. */ 11828 /* Record it now because it's overwritten. */
11418 int current_matrix_up_to_date_p = 0; 11829 int current_matrix_up_to_date_p = 0;
11830 int used_current_matrix_p = 0;
11419 /* This is less strict than current_matrix_up_to_date_p. 11831 /* This is less strict than current_matrix_up_to_date_p.
11420 It indictes that the buffer contents and narrowing are unchanged. */ 11832 It indictes that the buffer contents and narrowing are unchanged. */
11421 int buffer_unchanged_p = 0; 11833 int buffer_unchanged_p = 0;
@@ -11722,6 +12134,7 @@ redisplay_window (window, just_this_one_p)
11722 switch (rc) 12134 switch (rc)
11723 { 12135 {
11724 case CURSOR_MOVEMENT_SUCCESS: 12136 case CURSOR_MOVEMENT_SUCCESS:
12137 used_current_matrix_p = 1;
11725 goto done; 12138 goto done;
11726 12139
11727#if 0 /* try_cursor_movement never returns this value. */ 12140#if 0 /* try_cursor_movement never returns this value. */
@@ -11786,7 +12199,8 @@ redisplay_window (window, just_this_one_p)
11786 buffer. */ 12199 buffer. */
11787 || !NILP (Vwindow_scroll_functions) 12200 || !NILP (Vwindow_scroll_functions)
11788 || MINI_WINDOW_P (w) 12201 || MINI_WINDOW_P (w)
11789 || !try_window_reusing_current_matrix (w)) 12202 || !(used_current_matrix_p =
12203 try_window_reusing_current_matrix (w)))
11790 { 12204 {
11791 IF_DEBUG (debug_method_add (w, "1")); 12205 IF_DEBUG (debug_method_add (w, "1"));
11792 try_window (window, startp); 12206 try_window (window, startp);
@@ -11915,7 +12329,8 @@ redisplay_window (window, just_this_one_p)
11915 || !NILP (Vwindow_scroll_functions) 12329 || !NILP (Vwindow_scroll_functions)
11916 || !just_this_one_p 12330 || !just_this_one_p
11917 || MINI_WINDOW_P (w) 12331 || MINI_WINDOW_P (w)
11918 || !try_window_reusing_current_matrix (w)) 12332 || !(used_current_matrix_p =
12333 try_window_reusing_current_matrix (w)))
11919 try_window (window, startp); 12334 try_window (window, startp);
11920 12335
11921 /* If new fonts have been loaded (due to fontsets), give up. We 12336 /* If new fonts have been loaded (due to fontsets), give up. We
@@ -12077,6 +12492,19 @@ redisplay_window (window, just_this_one_p)
12077#endif 12492#endif
12078 } 12493 }
12079 12494
12495#ifdef HAVE_WINDOW_SYSTEM
12496 if (update_window_fringes (w, 0)
12497 && (used_current_matrix_p || overlay_arrow_seen)
12498 && !w->pseudo_window_p)
12499 {
12500 update_begin (f);
12501 BLOCK_INPUT;
12502 draw_window_fringes (w);
12503 UNBLOCK_INPUT;
12504 update_end (f);
12505 }
12506#endif /* HAVE_WINDOW_SYSTEM */
12507
12080 /* We go to this label, with fonts_changed_p nonzero, 12508 /* We go to this label, with fonts_changed_p nonzero,
12081 if it is necessary to try again using larger glyph matrices. 12509 if it is necessary to try again using larger glyph matrices.
12082 We have to redeem the scroll bar even in this case, 12510 We have to redeem the scroll bar even in this case,
@@ -12334,6 +12762,7 @@ try_window_reusing_current_matrix (w)
12334 row->visible_height -= min_y - row->y; 12762 row->visible_height -= min_y - row->y;
12335 if (row->y + row->height > max_y) 12763 if (row->y + row->height > max_y)
12336 row->visible_height -= row->y + row->height - max_y; 12764 row->visible_height -= row->y + row->height - max_y;
12765 row->redraw_fringe_bitmaps_p = 1;
12337 12766
12338 it.current_y += row->height; 12767 it.current_y += row->height;
12339 12768
@@ -12473,7 +12902,6 @@ try_window_reusing_current_matrix (w)
12473 12902
12474 if (run.height) 12903 if (run.height)
12475 { 12904 {
12476 struct frame *f = XFRAME (WINDOW_FRAME (w));
12477 update_begin (f); 12905 update_begin (f);
12478 FRAME_RIF (f)->update_window_begin_hook (w); 12906 FRAME_RIF (f)->update_window_begin_hook (w);
12479 FRAME_RIF (f)->clear_window_mouse_face (w); 12907 FRAME_RIF (f)->clear_window_mouse_face (w);
@@ -12494,6 +12922,7 @@ try_window_reusing_current_matrix (w)
12494 row->visible_height -= min_y - row->y; 12922 row->visible_height -= min_y - row->y;
12495 if (row->y + row->height > max_y) 12923 if (row->y + row->height > max_y)
12496 row->visible_height -= row->y + row->height - max_y; 12924 row->visible_height -= row->y + row->height - max_y;
12925 row->redraw_fringe_bitmaps_p = 1;
12497 } 12926 }
12498 12927
12499 /* Scroll the current matrix. */ 12928 /* Scroll the current matrix. */
@@ -12616,7 +13045,8 @@ find_last_unchanged_at_beg_row (w)
12616 row is not unchanged because it may be no longer 13045 row is not unchanged because it may be no longer
12617 continued. */ 13046 continued. */
12618 && !(MATRIX_ROW_END_CHARPOS (row) == first_changed_pos 13047 && !(MATRIX_ROW_END_CHARPOS (row) == first_changed_pos
12619 && row->continued_p)) 13048 && (row->continued_p
13049 || row->exact_window_width_line_p)))
12620 row_found = row; 13050 row_found = row;
12621 13051
12622 /* Stop if last visible row. */ 13052 /* Stop if last visible row. */
@@ -14512,7 +14942,20 @@ display_line (it)
14512 it->continuation_lines_width += new_x; 14942 it->continuation_lines_width += new_x;
14513 ++it->hpos; 14943 ++it->hpos;
14514 if (i == nglyphs - 1) 14944 if (i == nglyphs - 1)
14515 set_iterator_to_next (it, 1); 14945 {
14946 set_iterator_to_next (it, 1);
14947#ifdef HAVE_WINDOW_SYSTEM
14948 if (IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
14949 {
14950 get_next_display_element (it);
14951 if (ITERATOR_AT_END_OF_LINE_P (it))
14952 {
14953 row->continued_p = 0;
14954 row->exact_window_width_line_p = 1;
14955 }
14956 }
14957#endif /* HAVE_WINDOW_SYSTEM */
14958 }
14516 } 14959 }
14517 else if (CHAR_GLYPH_PADDING_P (*glyph) 14960 else if (CHAR_GLYPH_PADDING_P (*glyph)
14518 && !FRAME_WINDOW_P (it->f)) 14961 && !FRAME_WINDOW_P (it->f))
@@ -14614,6 +15057,7 @@ display_line (it)
14614 break; 15057 break;
14615 } 15058 }
14616 15059
15060 at_end_of_line:
14617 /* Is this a line end? If yes, we're also done, after making 15061 /* Is this a line end? If yes, we're also done, after making
14618 sure that a non-default face is extended up to the right 15062 sure that a non-default face is extended up to the right
14619 margin of the window. */ 15063 margin of the window. */
@@ -14623,9 +15067,12 @@ display_line (it)
14623 15067
14624 row->ends_in_newline_from_string_p = STRINGP (it->object); 15068 row->ends_in_newline_from_string_p = STRINGP (it->object);
14625 15069
15070#ifdef HAVE_WINDOW_SYSTEM
14626 /* Add a space at the end of the line that is used to 15071 /* Add a space at the end of the line that is used to
14627 display the cursor there. */ 15072 display the cursor there. */
14628 append_space (it, 0); 15073 if (!IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
15074 append_space (it, 0);
15075#endif /* HAVE_WINDOW_SYSTEM */
14629 15076
14630 /* Extend the face to the end of the line. */ 15077 /* Extend the face to the end of the line. */
14631 extend_face_to_end_of_line (it); 15078 extend_face_to_end_of_line (it);
@@ -14666,6 +15113,21 @@ display_line (it)
14666 produce_special_glyphs (it, IT_TRUNCATION); 15113 produce_special_glyphs (it, IT_TRUNCATION);
14667 } 15114 }
14668 } 15115 }
15116#ifdef HAVE_WINDOW_SYSTEM
15117 else
15118 {
15119 /* Don't truncate if we can overflow newline into fringe. */
15120 if (IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
15121 {
15122 get_next_display_element (it);
15123 if (ITERATOR_AT_END_OF_LINE_P (it))
15124 {
15125 row->exact_window_width_line_p = 1;
15126 goto at_end_of_line;
15127 }
15128 }
15129 }
15130#endif /* HAVE_WINDOW_SYSTEM */
14669 15131
14670 row->truncated_on_right_p = 1; 15132 row->truncated_on_right_p = 1;
14671 it->continuation_lines_width = 0; 15133 it->continuation_lines_width = 0;
@@ -19213,36 +19675,53 @@ notice_overwritten_cursor (w, area, x0, x1, y0, y1)
19213 enum glyph_row_area area; 19675 enum glyph_row_area area;
19214 int x0, y0, x1, y1; 19676 int x0, y0, x1, y1;
19215{ 19677{
19216 if (area == TEXT_AREA && w->phys_cursor_on_p) 19678 int cx0, cx1, cy0, cy1;
19217 { 19679 struct glyph_row *row;
19218 int cx0 = w->phys_cursor.x;
19219 int cx1 = cx0 + w->phys_cursor_width;
19220 int cy0 = w->phys_cursor.y;
19221 int cy1 = cy0 + w->phys_cursor_height;
19222 19680
19223 if (x0 <= cx0 && (x1 < 0 || x1 >= cx1)) 19681 if (!w->phys_cursor_on_p)
19224 { 19682 return;
19225 /* The cursor image will be completely removed from the 19683 if (area != TEXT_AREA)
19226 screen if the output area intersects the cursor area in 19684 return;
19227 y-direction. When we draw in [y0 y1[, and some part of
19228 the cursor is at y < y0, that part must have been drawn
19229 before. When scrolling, the cursor is erased before
19230 actually scrolling, so we don't come here. When not
19231 scrolling, the rows above the old cursor row must have
19232 changed, and in this case these rows must have written
19233 over the cursor image.
19234 19685
19235 Likewise if part of the cursor is below y1, with the 19686 row = w->current_matrix->rows + w->phys_cursor.vpos;
19236 exception of the cursor being in the first blank row at 19687 if (!row->displays_text_p)
19237 the buffer and window end because update_text_area 19688 return;
19238 doesn't draw that row. (Except when it does, but
19239 that's handled in update_text_area.) */
19240 19689
19241 if (((y0 >= cy0 && y0 < cy1) || (y1 > cy0 && y1 < cy1)) 19690 if (row->cursor_in_fringe_p)
19242 && w->current_matrix->rows[w->phys_cursor.vpos].displays_text_p) 19691 {
19243 w->phys_cursor_on_p = 0; 19692 row->cursor_in_fringe_p = 0;
19244 } 19693 draw_fringe_bitmap (w, row, 0);
19694 w->phys_cursor_on_p = 0;
19695 return;
19245 } 19696 }
19697
19698 cx0 = w->phys_cursor.x;
19699 cx1 = cx0 + w->phys_cursor_width;
19700 if (x0 > cx0 || (x1 >= 0 && x1 < cx1))
19701 return;
19702
19703 /* The cursor image will be completely removed from the
19704 screen if the output area intersects the cursor area in
19705 y-direction. When we draw in [y0 y1[, and some part of
19706 the cursor is at y < y0, that part must have been drawn
19707 before. When scrolling, the cursor is erased before
19708 actually scrolling, so we don't come here. When not
19709 scrolling, the rows above the old cursor row must have
19710 changed, and in this case these rows must have written
19711 over the cursor image.
19712
19713 Likewise if part of the cursor is below y1, with the
19714 exception of the cursor being in the first blank row at
19715 the buffer and window end because update_text_area
19716 doesn't draw that row. (Except when it does, but
19717 that's handled in update_text_area.) */
19718
19719 cy0 = w->phys_cursor.y;
19720 cy1 = cy0 + w->phys_cursor_height;
19721 if ((y0 < cy0 || y0 >= cy1) && (y1 <= cy0 || y1 >= cy1))
19722 return;
19723
19724 w->phys_cursor_on_p = 0;
19246} 19725}
19247 19726
19248#endif /* HAVE_WINDOW_SYSTEM */ 19727#endif /* HAVE_WINDOW_SYSTEM */
@@ -19377,6 +19856,14 @@ erase_phys_cursor (w)
19377 if (cursor_row->visible_height <= 0) 19856 if (cursor_row->visible_height <= 0)
19378 goto mark_cursor_off; 19857 goto mark_cursor_off;
19379 19858
19859 /* If cursor is in the fringe, erase by drawing actual bitmap there. */
19860 if (cursor_row->cursor_in_fringe_p)
19861 {
19862 cursor_row->cursor_in_fringe_p = 0;
19863 draw_fringe_bitmap (w, cursor_row, 0);
19864 goto mark_cursor_off;
19865 }
19866
19380 /* This can happen when the new row is shorter than the old one. 19867 /* This can happen when the new row is shorter than the old one.
19381 In this case, either draw_glyphs or clear_end_of_line 19868 In this case, either draw_glyphs or clear_end_of_line
19382 should have cleared the cursor. Note that we wouldn't be 19869 should have cleared the cursor. Note that we wouldn't be
@@ -21533,12 +22020,23 @@ wide as that tab on the display. */);
21533#endif 22020#endif
21534 22021
21535 DEFVAR_LISP ("show-trailing-whitespace", &Vshow_trailing_whitespace, 22022 DEFVAR_LISP ("show-trailing-whitespace", &Vshow_trailing_whitespace,
21536 doc: /* Non-nil means highlight trailing whitespace. 22023 doc: /* *Non-nil means highlight trailing whitespace.
21537The face used for trailing whitespace is `trailing-whitespace'. */); 22024The face used for trailing whitespace is `trailing-whitespace'. */);
21538 Vshow_trailing_whitespace = Qnil; 22025 Vshow_trailing_whitespace = Qnil;
21539 22026
22027#ifdef HAVE_WINDOW_SYSTEM
22028 DEFVAR_LISP ("overflow-newline-into-fringe", &Voverflow_newline_into_fringe,
22029 doc: /* *Non-nil means that newline may flow into the right fringe.
22030This means that display lines which are exactly as wide as the window
22031(not counting the final newline) will only occupy one screen line, by
22032showing (or hiding) the final newline in the right fringe; when point
22033is at the final newline, the cursor is shown in the right fringe.
22034If nil, also continue lines which are exactly as wide as the window. */);
22035 Voverflow_newline_into_fringe = Qt;
22036#endif
22037
21540 DEFVAR_LISP ("void-text-area-pointer", &Vvoid_text_area_pointer, 22038 DEFVAR_LISP ("void-text-area-pointer", &Vvoid_text_area_pointer,
21541 doc: /* The pointer shape to show in void text areas. 22039 doc: /* *The pointer shape to show in void text areas.
21542Nil means to show the text pointer. Other options are `arrow', `text', 22040Nil means to show the text pointer. Other options are `arrow', `text',
21543`hand', `vdrag', `hdrag', `modeline', and `hourglass'. */); 22041`hand', `vdrag', `hdrag', `modeline', and `hourglass'. */);
21544 Vvoid_text_area_pointer = Qarrow; 22042 Vvoid_text_area_pointer = Qarrow;
diff --git a/src/xterm.c b/src/xterm.c
index f03f99d0246..8832991156d 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -571,6 +571,9 @@ x_update_window_end (w, cursor_on_p, mouse_face_overwritten_p)
571 output_cursor.x, output_cursor.y); 571 output_cursor.x, output_cursor.y);
572 572
573 x_draw_vertical_border (w); 573 x_draw_vertical_border (w);
574
575 draw_window_fringes (w);
576
574 UNBLOCK_INPUT; 577 UNBLOCK_INPUT;
575 } 578 }
576 579
@@ -650,11 +653,7 @@ x_after_update_window_line (desired_row)
650 xassert (w); 653 xassert (w);
651 654
652 if (!desired_row->mode_line_p && !w->pseudo_window_p) 655 if (!desired_row->mode_line_p && !w->pseudo_window_p)
653 { 656 desired_row->redraw_fringe_bitmaps_p = 1;
654 BLOCK_INPUT;
655 draw_row_fringe_bitmaps (w, desired_row);
656 UNBLOCK_INPUT;
657 }
658 657
659 /* When a window has disappeared, make sure that no rest of 658 /* When a window has disappeared, make sure that no rest of
660 full-width rows stays visible in the internal border. Could 659 full-width rows stays visible in the internal border. Could
@@ -698,9 +697,24 @@ x_draw_fringe_bitmap (w, row, p)
698 Window window = FRAME_X_WINDOW (f); 697 Window window = FRAME_X_WINDOW (f);
699 GC gc = f->output_data.x->normal_gc; 698 GC gc = f->output_data.x->normal_gc;
700 struct face *face = p->face; 699 struct face *face = p->face;
700 int rowY;
701 701
702 /* Must clip because of partially visible lines. */ 702 /* Must clip because of partially visible lines. */
703 x_clip_to_row (w, row, gc); 703 rowY = WINDOW_TO_FRAME_PIXEL_Y (w, row->y);
704 if (p->y < rowY)
705 {
706 /* Adjust position of "bottom aligned" bitmap on partially
707 visible last row. */
708 int oldY = row->y;
709 int oldVH = row->visible_height;
710 row->visible_height = p->h;
711 row->y -= rowY - p->y;
712 x_clip_to_row (w, row, gc);
713 row->y = oldY;
714 row->visible_height = oldVH;
715 }
716 else
717 x_clip_to_row (w, row, gc);
704 718
705 if (p->bx >= 0) 719 if (p->bx >= 0)
706 { 720 {
@@ -6314,6 +6328,11 @@ handle_one_xevent (dpyinfo, eventp, bufp_r, numcharsp, finish)
6314 &compose_status); 6328 &compose_status);
6315#endif 6329#endif
6316 6330
6331 /* If not using XIM/XIC, and a compose sequence is in progress,
6332 we break here. Otherwise, chars_matched is always 0. */
6333 if (compose_status.chars_matched > 0 && nbytes == 0)
6334 break;
6335
6317 orig_keysym = keysym; 6336 orig_keysym = keysym;
6318 6337
6319 if (numchars > 1) 6338 if (numchars > 1)
@@ -7452,6 +7471,13 @@ x_draw_window_cursor (w, glyph_row, x, y, cursor_type, cursor_width, on_p, activ
7452 w->phys_cursor_type = cursor_type; 7471 w->phys_cursor_type = cursor_type;
7453 w->phys_cursor_on_p = 1; 7472 w->phys_cursor_on_p = 1;
7454 7473
7474 if (glyph_row->exact_window_width_line_p
7475 && w->phys_cursor.hpos >= glyph_row->used[TEXT_AREA])
7476 {
7477 glyph_row->cursor_in_fringe_p = 1;
7478 draw_fringe_bitmap (w, glyph_row, 0);
7479 }
7480 else
7455 switch (cursor_type) 7481 switch (cursor_type)
7456 { 7482 {
7457 case HOLLOW_BOX_CURSOR: 7483 case HOLLOW_BOX_CURSOR: