diff options
| author | Karoly Lorentey | 2004-01-22 15:37:19 +0000 |
|---|---|---|
| committer | Karoly Lorentey | 2004-01-22 15:37:19 +0000 |
| commit | 2a36494c42a1963846ea8c2dde48a7450d433c2a (patch) | |
| tree | 59be675dcc23b117a04a5b16cc82d73bcb6abbc9 /src | |
| parent | e9cda8277618ce4e2644e852539474b7b67f09e3 (diff) | |
| parent | e555f8d5a4cfa2a1496ed61795ab6dc143600698 (diff) | |
| download | emacs-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/.gitignore | 9 | ||||
| -rw-r--r-- | src/ChangeLog | 220 | ||||
| -rw-r--r-- | src/alloc.c | 35 | ||||
| -rw-r--r-- | src/buffer.c | 22 | ||||
| -rw-r--r-- | src/buffer.h | 3 | ||||
| -rw-r--r-- | src/dired.c | 6 | ||||
| -rw-r--r-- | src/dispextern.h | 44 | ||||
| -rw-r--r-- | src/dispnew.c | 37 | ||||
| -rw-r--r-- | src/fontset.c | 3 | ||||
| -rw-r--r-- | src/keyboard.c | 96 | ||||
| -rw-r--r-- | src/lisp.h | 81 | ||||
| -rw-r--r-- | src/lread.c | 3 | ||||
| -rw-r--r-- | src/macterm.c | 40 | ||||
| -rw-r--r-- | src/process.c | 8 | ||||
| -rw-r--r-- | src/s/darwin.h | 5 | ||||
| -rw-r--r-- | src/search.c | 10 | ||||
| -rw-r--r-- | src/w32term.c | 34 | ||||
| -rw-r--r-- | src/xdisp.c | 644 | ||||
| -rw-r--r-- | src/xterm.c | 38 |
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 | ||
| 2 | Makefile | 5 | Makefile |
| 3 | Makefile.c | 6 | Makefile.c |
| 4 | TAGS-LISP | 7 | TAGS-LISP |
| 8 | _gdbinit | ||
| 5 | bootstrap-emacs | 9 | bootstrap-emacs |
| 6 | config.h | 10 | config.h |
| 7 | config.stamp | 11 | config.stamp |
| 8 | emacs | 12 | emacs |
| 9 | emacs-* | 13 | emacs-* |
| 10 | epaths.h | 14 | epaths.h |
| 15 | gdb.ini | ||
| 11 | obj | 16 | obj |
| 12 | prefix-args | 17 | prefix-args |
| 13 | stamp-oldxmenu | 18 | stamp-oldxmenu |
| 14 | temacs | 19 | temacs |
| 15 | _gdbinit | ||
| 16 | gdb.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 @@ | |||
| 1 | 2004-01-21 Stefan Monnier <monnier@iro.umontreal.ca> | ||
| 2 | |||
| 3 | * lisp.h [USE_LSB_TAG && !DECL_ALIGN]: Signal an error. | ||
| 4 | |||
| 5 | 2004-01-21 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> | ||
| 6 | |||
| 7 | * lisp.h: Add undef DECL_ALIGN. | ||
| 8 | |||
| 9 | 2004-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 | |||
| 20 | 2004-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 | |||
| 44 | 2004-01-19 Kenichi Handa <handa@m17n.org> | ||
| 45 | |||
| 46 | * fontset.c (fontset_font_pattern): Fix previous change. | ||
| 47 | |||
| 48 | 2004-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 | |||
| 57 | 2004-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 | |||
| 139 | 2004-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 | |||
| 144 | 2004-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 | |||
| 149 | 2004-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 | |||
| 1 | 2004-01-12 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> | 162 | 2004-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 | ||
| 65 | 2004-01-06 Andreas Schwab <schwab@suse.de> | 226 | 2004-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 | ||
| 70 | 2004-01-02 Andreas Schwab <schwab@suse.de> | 231 | 2004-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 | ||
| 75 | 2004-01-02 Kim F. Storm <storm@cua.dk> | 236 | 2004-01-02 Kim F. Storm <storm@cua.dk> |
| 76 | 237 | ||
| @@ -100,8 +261,7 @@ | |||
| 100 | 261 | ||
| 101 | 2004-01-01 Jason Rumney <jasonr@gnu.org> | 262 | 2004-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 | ||
| 106 | 2003-12-30 Luc Teirlinck <teirllm@auburn.edu> | 266 | 2003-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 | ||
| 283 | 2003-12-03 Kenichi Handa <handa@m17n.org> | 440 | 2003-12-03 Kenichi Handa <handa@m17n.org> |
| 284 | 441 | ||
| @@ -429,10 +586,8 @@ | |||
| 429 | 586 | ||
| 430 | 2003-11-22 Lars Hansen <larsh@math.ku.dk> | 587 | 2003-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 | ||
| 437 | 2003-11-21 Luc Teirlinck <teirllm@auburn.edu> | 592 | 2003-11-21 Luc Teirlinck <teirllm@auburn.edu> |
| 438 | 593 | ||
| @@ -440,18 +595,19 @@ | |||
| 440 | 595 | ||
| 441 | 2003-11-21 Lars Hansen <larsh@math.ku.dk> | 596 | 2003-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 | ||
| 456 | 2003-11-21 Luc Teirlinck <teirllm@auburn.edu> | 612 | 2003-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 | ||
| 5 | This file is part of GNU Emacs. | 5 | This 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 | ||
| 1106 | struct interval_block | 1110 | struct 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 | ||
| 1345 | struct string_block | 1350 | struct 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 | ||
| 2755 | struct symbol_block | 2763 | struct 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 | ||
| 2847 | struct marker_block | 2856 | struct 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 | ||
| 2853 | struct marker_block *marker_block; | 2863 | struct 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 | ||
| 5 | This file is part of GNU Emacs. | 5 | This 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 | ||
| 70 | struct buffer buffer_defaults; | 70 | DECL_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 | ||
| 100 | struct buffer buffer_local_symbols; | 100 | DECL_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 */ |
| 102 | static Lisp_Object Vbuffer_local_symbols; | 103 | static 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. |
| 5317 | This is the same as (default-value 'indicate-empty-lines). */); | 5320 | This 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. | ||
| 5325 | This 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. | |||
| 5626 | If non-nil, a bitmap is displayed in the left fringe of a window on | 5634 | If non-nil, a bitmap is displayed in the left fringe of a window on |
| 5627 | window-systems. */); | 5635 | window-systems. */); |
| 5628 | 5636 | ||
| 5637 | DEFVAR_PER_BUFFER ("indicate-buffer-boundaries", | ||
| 5638 | ¤t_buffer->indicate_buffer_boundaries, Qnil, | ||
| 5639 | doc: /* *Visually indicate buffer boundaries and scrolling. | ||
| 5640 | If non-nil, the first and last line of the buffer are marked in the left and | ||
| 5641 | right fringe of a window on window-systems. | ||
| 5642 | In addition, if value is t, the top and bottom line of the window are marked | ||
| 5643 | with 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 | ¤t_buffer->scroll_up_aggressively, Qnil, | 5646 | ¤t_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 | ||
| 5 | This file is part of GNU Emacs. | 5 | This 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 *)); | |||
| 2485 | int in_display_vector_p P_ ((struct it *)); | 2526 | int in_display_vector_p P_ ((struct it *)); |
| 2486 | int frame_mode_line_height P_ ((struct frame *)); | 2527 | int frame_mode_line_height P_ ((struct frame *)); |
| 2487 | void highlight_trailing_whitespace P_ ((struct frame *, struct glyph_row *)); | 2528 | void highlight_trailing_whitespace P_ ((struct frame *, struct glyph_row *)); |
| 2529 | void draw_fringe_bitmap P_ ((struct window *, struct glyph_row *, int)); | ||
| 2488 | void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *)); | 2530 | void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *)); |
| 2531 | void draw_window_fringes P_ ((struct window *)); | ||
| 2532 | int update_window_fringes P_ ((struct window *, int)); | ||
| 2489 | void compute_fringe_widths P_ ((struct frame *, int)); | 2533 | void compute_fringe_widths P_ ((struct frame *, int)); |
| 2490 | extern Lisp_Object Qtool_bar; | 2534 | extern Lisp_Object Qtool_bar; |
| 2491 | extern Lisp_Object Vshow_trailing_whitespace; | 2535 | extern 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 | ||
| 5 | This file is part of GNU Emacs. | 5 | This 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 | ||
| 5 | This file is part of GNU Emacs. | 5 | This file is part of GNU Emacs. |
| @@ -470,36 +470,6 @@ extern char *pending_malloc_warning; | |||
| 470 | 470 | ||
| 471 | static struct input_event kbd_buffer[KBD_BUFFER_SIZE]; | 471 | static 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 | |||
| 501 | static 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 | |||
| 3778 | clear_event (event) | 3744 | clear_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 | ||
| 6771 | void | ||
| 6772 | handle_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 | |||
| 6863 | reinvoke_input_signal () | 6838 | reinvoke_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 | ||
| 5 | This file is part of GNU Emacs. | 5 | This 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 | ||
| 1727 | extern void handle_async_input P_ ((void)); | ||
| 1728 | extern 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 | ||
| 5 | This file is part of GNU Emacs. | 5 | This 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 | ||
| 5 | This file is part of GNU Emacs. | 5 | This 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 | ||
| 4 | This file is part of GNU Emacs. | 4 | This 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 | ||
| 5 | This file is part of GNU Emacs. | 5 | This file is part of GNU Emacs. |
| @@ -310,6 +310,21 @@ extern Lisp_Object Qscroll_bar; | |||
| 310 | 310 | ||
| 311 | Lisp_Object Vshow_trailing_whitespace; | 311 | Lisp_Object Vshow_trailing_whitespace; |
| 312 | 312 | ||
| 313 | #ifdef HAVE_WINDOW_SYSTEM | ||
| 314 | /* Non-nil means that newline may flow into the right fringe. */ | ||
| 315 | |||
| 316 | Lisp_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 | */ | ||
| 8899 | static unsigned char left_bits[] = { | 8950 | static 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 | */ | ||
| 8903 | static unsigned char right_bits[] = { | 8965 | static 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 | */ | ||
| 8980 | static 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 | */ | ||
| 8995 | static 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 | */ | ||
| 8907 | static unsigned char continued_bits[] = { | 9009 | static 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 | */ | ||
| 8911 | static unsigned char continuation_bits[] = { | 9023 | static 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 | */ | ||
| 8915 | static unsigned char ov_bits[] = { | 9037 | static 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 | */ | ||
| 9052 | static 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 | */ | ||
| 9067 | static 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 | */ | ||
| 9086 | static 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 | */ | ||
| 9105 | static 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 | */ | ||
| 9124 | static 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 | */ | ||
| 9132 | static 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. */ |
| 8920 | static unsigned char zv_bits[] = { | 9138 | static 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 | */ | ||
| 9157 | static unsigned char hollow_square_bits[] = { | ||
| 9158 | 0x7e, 0x42, 0x42, 0x42, 0x42, 0x7e}; | ||
| 9159 | |||
| 9160 | |||
| 8930 | struct fringe_bitmap fringe_bitmaps[MAX_FRINGE_BITMAPS] = | 9161 | struct 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 | ||
| 8947 | static void | 9189 | void |
| 8948 | draw_fringe_bitmap (w, row, which, left_p) | 9190 | draw_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) | 9335 | void |
| 9073 | bitmap = ZV_LINE_BITMAP; | 9336 | draw_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 | |||
| 11683 | int | ||
| 11684 | update_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. |
| 21537 | The face used for trailing whitespace is `trailing-whitespace'. */); | 22024 | The 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. | ||
| 22030 | This 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 | ||
| 22032 | showing (or hiding) the final newline in the right fringe; when point | ||
| 22033 | is at the final newline, the cursor is shown in the right fringe. | ||
| 22034 | If 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. |
| 21542 | Nil means to show the text pointer. Other options are `arrow', `text', | 22040 | Nil 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: |