comparison src/redisplay.c @ 406:b8cc9ab3f761 r21-2-33

Import from CVS: tag r21-2-33
author cvs
date Mon, 13 Aug 2007 11:17:09 +0200
parents 2f8bb876ab1d
children 501cfd01ee6d
comparison
equal deleted inserted replaced
405:0e08f63c74d2 406:b8cc9ab3f761
448 448
449 Lisp_Object Vwindow_size_change_functions; 449 Lisp_Object Vwindow_size_change_functions;
450 Lisp_Object Vwindow_scroll_functions; 450 Lisp_Object Vwindow_scroll_functions;
451 Lisp_Object Qredisplay_end_trigger_functions, Vredisplay_end_trigger_functions; 451 Lisp_Object Qredisplay_end_trigger_functions, Vredisplay_end_trigger_functions;
452 452
453 Lisp_Object Qbuffer_list_changed_hook, Vbuffer_list_changed_hook;
454
455
453 #define INHIBIT_REDISPLAY_HOOKS /* #### Until we've thought about 456 #define INHIBIT_REDISPLAY_HOOKS /* #### Until we've thought about
454 this more. */ 457 this more. */
455 #ifndef INHIBIT_REDISPLAY_HOOKS 458 #ifndef INHIBIT_REDISPLAY_HOOKS
456 /* #### Chuck says: I think this needs more thought. 459 /* #### Chuck says: I think this needs more thought.
457 Think about this for 19.14. */ 460 Think about this for 19.14. */
802 805
803 gb.extent = Qnil; 806 gb.extent = Qnil;
804 gb.glyph = Vhscroll_glyph; 807 gb.glyph = Vhscroll_glyph;
805 { 808 {
806 int oldpixpos = data->pixpos; 809 int oldpixpos = data->pixpos;
807 retval = add_glyph_rune (data, &gb, BEGIN_GLYPHS, 1, 810 retval = add_glyph_rune (data, &gb, BEGIN_GLYPHS, 0,
808 GLYPH_CACHEL (XWINDOW (data->window), 811 GLYPH_CACHEL (XWINDOW (data->window),
809 HSCROLL_GLYPH_INDEX)); 812 HSCROLL_GLYPH_INDEX));
810 data->hscroll_glyph_width_adjust = 813 data->hscroll_glyph_width_adjust =
811 data->pixpos - oldpixpos - space_width (XWINDOW (data->window)); 814 data->pixpos - oldpixpos - space_width (XWINDOW (data->window));
812 } 815 }
922 bytecount_to_charcount (XSTRING_DATA (data->string), data->bi_bufpos); 925 bytecount_to_charcount (XSTRING_DATA (data->string), data->bi_bufpos);
923 } 926 }
924 else if (data->is_modeline) 927 else if (data->is_modeline)
925 crb->bufpos = data->modeline_charpos; 928 crb->bufpos = data->modeline_charpos;
926 else 929 else
927 /* fuckme if this shouldn't be an abort. */ 930 /* Text but not in buffer */
928 /* abort (); fuckme harder, this abort gets tripped quite often,
929 in propagation and whatnot. #### fixme */
930 crb->bufpos = 0; 931 crb->bufpos = 0;
931 crb->type = RUNE_CHAR; 932 crb->type = RUNE_CHAR;
932 crb->object.chr.ch = data->font_is_bogus ? '~' : data->ch; 933 crb->object.chr.ch = data->font_is_bogus ? '~' : data->ch;
933 crb->endpos = 0; 934 crb->endpos = 0;
934 935
1540 /* A nil extent indicates a special glyph (ex. truncator). */ 1541 /* A nil extent indicates a special glyph (ex. truncator). */
1541 if (NILP (gb->extent) 1542 if (NILP (gb->extent)
1542 || (pos_type == BEGIN_GLYPHS && 1543 || (pos_type == BEGIN_GLYPHS &&
1543 extent_begin_glyph_layout (XEXTENT (gb->extent)) == GL_TEXT) 1544 extent_begin_glyph_layout (XEXTENT (gb->extent)) == GL_TEXT)
1544 || (pos_type == END_GLYPHS && 1545 || (pos_type == END_GLYPHS &&
1545 extent_end_glyph_layout (XEXTENT (gb->extent)) == GL_TEXT)) 1546 extent_end_glyph_layout (XEXTENT (gb->extent)) == GL_TEXT)
1547 || pos_type == LEFT_GLYPHS || pos_type == RIGHT_GLYPHS)
1546 { 1548 {
1547 struct rune rb; 1549 struct rune rb;
1548 int width; 1550 int width;
1549 int xoffset = 0; 1551 int xoffset = 0;
1550 int ascent, descent; 1552 int ascent, descent;
1551 Lisp_Object baseline; 1553 Lisp_Object baseline;
1552 Lisp_Object face; 1554 Lisp_Object face;
1555 Lisp_Object instance;
1556 face_index findex;
1553 1557
1554 if (cachel) 1558 if (cachel)
1555 width = cachel->width; 1559 width = cachel->width;
1556 else 1560 else
1557 width = glyph_width (gb->glyph, data->window); 1561 width = glyph_width (gb->glyph, data->window);
1659 abort (); 1663 abort ();
1660 } 1664 }
1661 1665
1662 face = glyph_face (gb->glyph, data->window); 1666 face = glyph_face (gb->glyph, data->window);
1663 if (NILP (face)) 1667 if (NILP (face))
1664 rb.findex = data->findex; 1668 findex = data->findex;
1665 else 1669 else
1666 rb.findex = get_builtin_face_cache_index (w, face); 1670 findex = get_builtin_face_cache_index (w, face);
1667 1671
1672 instance = glyph_image_instance (gb->glyph, data->window,
1673 ERROR_ME_NOT, 1);
1674 if (TEXT_IMAGE_INSTANCEP (instance))
1675 {
1676 Lisp_Object string = XIMAGE_INSTANCE_TEXT_STRING (instance);
1677 face_index orig_findex = data->findex;
1678 Bytind orig_bufpos = data->bi_bufpos;
1679 Bytind orig_start_col_enabled = data->bi_start_col_enabled;
1680
1681 data->findex = findex;
1682 data->bi_start_col_enabled = 0;
1683 if (!allow_cursor)
1684 data->bi_bufpos = 0;
1685 add_bufbyte_string_runes (data, XSTRING_DATA (string),
1686 XSTRING_LENGTH (string), 0);
1687 data->findex = orig_findex;
1688 data->bi_bufpos = orig_bufpos;
1689 data->bi_start_col_enabled = orig_start_col_enabled;
1690 return NULL;
1691 }
1692
1693 rb.findex = findex;
1668 rb.xpos = data->pixpos; 1694 rb.xpos = data->pixpos;
1669 rb.width = width; 1695 rb.width = width;
1670 rb.bufpos = 0; /* glyphs are never "at" anywhere */ 1696 rb.bufpos = 0; /* glyphs are never "at" anywhere */
1671 if (data->bi_endpos) 1697 if (data->bi_endpos)
1672 /* #### is this necessary at all? */ 1698 /* #### is this necessary at all? */
1673 rb.endpos = bytind_to_bufpos (XBUFFER (WINDOW_BUFFER (w)), 1699 rb.endpos = bytind_to_bufpos (XBUFFER (WINDOW_BUFFER (w)),
1674 data->bi_endpos); 1700 data->bi_endpos);
1675 else 1701 else
1676 rb.endpos = 0; 1702 rb.endpos = 0;
1677 rb.type = RUNE_DGLYPH; 1703 rb.type = RUNE_DGLYPH;
1678 /* #### Ben sez: this is way bogus if the glyph is a string.
1679 You should not make the output routines have to cope with
1680 this. The string could contain Mule characters, or non-
1681 printable characters, or characters to be passed through
1682 the display table, or non-character objects (when this gets
1683 implemented), etc. Instead, this routine here should parse
1684 the string into a series of runes. */
1685 rb.object.dglyph.glyph = gb->glyph; 1704 rb.object.dglyph.glyph = gb->glyph;
1686 rb.object.dglyph.extent = gb->extent; 1705 rb.object.dglyph.extent = gb->extent;
1687 rb.object.dglyph.xoffset = xoffset; 1706 rb.object.dglyph.xoffset = xoffset;
1688 1707
1689 if (allow_cursor) 1708 if (allow_cursor)
1882 Lisp_Object synch_minibuffers_value = 1901 Lisp_Object synch_minibuffers_value =
1883 symbol_value_in_buffer (Qsynchronize_minibuffers, w->buffer); 1902 symbol_value_in_buffer (Qsynchronize_minibuffers, w->buffer);
1884 1903
1885 dl->used_prop_data = 0; 1904 dl->used_prop_data = 0;
1886 dl->num_chars = 0; 1905 dl->num_chars = 0;
1906 dl->line_continuation = 0;
1887 1907
1888 xzero (data); 1908 xzero (data);
1889 data.ef = extent_fragment_new (w->buffer, f); 1909 data.ef = extent_fragment_new (w->buffer, f);
1890 1910
1891 /* These values are used by all of the rune addition routines. We add 1911 /* These values are used by all of the rune addition routines. We add
2472 /* The cursor can never be on the continuation glyph. */ 2492 /* The cursor can never be on the continuation glyph. */
2473 data.cursor_type = NO_CURSOR; 2493 data.cursor_type = NO_CURSOR;
2474 2494
2475 /* data.bi_bufpos is already at the start of the next line. */ 2495 /* data.bi_bufpos is already at the start of the next line. */
2476 2496
2497 dl->line_continuation = 1;
2477 gb.glyph = Vcontinuation_glyph; 2498 gb.glyph = Vcontinuation_glyph;
2478 cachel = GLYPH_CACHEL (w, CONT_GLYPH_INDEX); 2499 cachel = GLYPH_CACHEL (w, CONT_GLYPH_INDEX);
2479 } 2500 }
2480 2501
2481 add_glyph_rune (&data, &gb, BEGIN_GLYPHS, 1, cachel); 2502 add_glyph_rune (&data, &gb, BEGIN_GLYPHS, 0, cachel);
2482 2503
2483 if (truncate_win && data.bi_bufpos == BI_BUF_ZV (b) 2504 if (truncate_win && data.bi_bufpos == BI_BUF_ZV (b)
2484 && BI_BUF_FETCH_CHAR (b, prev_bytind (b, BI_BUF_ZV (b))) != '\n') 2505 && BI_BUF_FETCH_CHAR (b, prev_bytind (b, BI_BUF_ZV (b))) != '\n')
2485 /* #### Damn this losing shit. */ 2506 /* #### Damn this losing shit. */
2486 data.bi_bufpos++; 2507 data.bi_bufpos++;
2724 { 2745 {
2725 glyph_block_dynarr *gbd = (side == LEFT_GLYPHS 2746 glyph_block_dynarr *gbd = (side == LEFT_GLYPHS
2726 ? dl->left_glyphs 2747 ? dl->left_glyphs
2727 : dl->right_glyphs); 2748 : dl->right_glyphs);
2728 int elt, end; 2749 int elt, end;
2729 int xpos = start;
2730 int reverse; 2750 int reverse;
2751 struct window *w = XWINDOW (window);
2752 struct frame *f = XFRAME (w->frame);
2753 struct device *d = XDEVICE (f->device);
2754 pos_data data;
2755
2756 xzero (data);
2757 data.d = d;
2758 data.window = window;
2759 data.db = db;
2760 data.dl = dl;
2761 data.pixpos = start;
2762 data.cursor_type = NO_CURSOR;
2763 data.cursor_x = -1;
2764 data.last_charset = Qunbound;
2765 data.last_findex = DEFAULT_INDEX;
2766 data.result_str = Qnil;
2767 data.string = Qnil;
2768 data.new_ascent = dl->ascent;
2769 data.new_descent = dl->descent;
2731 2770
2732 if ((layout == GL_WHITESPACE && side == LEFT_GLYPHS) 2771 if ((layout == GL_WHITESPACE && side == LEFT_GLYPHS)
2733 || (layout == GL_INSIDE_MARGIN && side == RIGHT_GLYPHS)) 2772 || (layout == GL_INSIDE_MARGIN && side == RIGHT_GLYPHS))
2734 { 2773 {
2735 reverse = 1; 2774 reverse = 1;
2754 ((side == LEFT_GLYPHS && 2793 ((side == LEFT_GLYPHS &&
2755 extent_begin_glyph_layout (XEXTENT (gb->extent)) == layout) 2794 extent_begin_glyph_layout (XEXTENT (gb->extent)) == layout)
2756 || (side == RIGHT_GLYPHS && 2795 || (side == RIGHT_GLYPHS &&
2757 extent_end_glyph_layout (XEXTENT (gb->extent)) == layout))) 2796 extent_end_glyph_layout (XEXTENT (gb->extent)) == layout)))
2758 { 2797 {
2759 struct rune rb; 2798 data.findex = gb->findex;
2760 2799 data.max_pixpos = data.pixpos + gb->width;
2761 rb.width = gb->width; 2800 add_glyph_rune (&data, gb, side, 0, NULL);
2762 rb.findex = gb->findex;
2763 rb.xpos = xpos;
2764 rb.bufpos = -1;
2765 rb.endpos = 0;
2766 rb.type = RUNE_DGLYPH;
2767 rb.object.dglyph.glyph = gb->glyph;
2768 rb.object.dglyph.extent = gb->extent;
2769 rb.object.dglyph.xoffset = 0;
2770 rb.cursor_type = CURSOR_OFF;
2771
2772 Dynarr_add (db->runes, rb);
2773 xpos += rb.width;
2774 count--; 2801 count--;
2775 gb->active = 0; 2802 gb->active = 0;
2776
2777 if (glyph_contrib_p (gb->glyph, window))
2778 {
2779 unsigned short ascent, descent;
2780 Lisp_Object baseline = glyph_baseline (gb->glyph, window);
2781
2782 ascent = glyph_ascent (gb->glyph, window);
2783 descent = glyph_descent (gb->glyph, window);
2784
2785 /* A pixmap that has not had a baseline explicitly set.
2786 We use the existing ascent / descent ratio of the
2787 line. */
2788 if (NILP (baseline))
2789 {
2790 int gheight = ascent + descent;
2791 int line_height = dl->ascent + dl->descent;
2792 int pix_ascent, pix_descent;
2793
2794 pix_descent = (int) (gheight * dl->descent) / line_height;
2795 pix_ascent = gheight - pix_descent;
2796
2797 dl->ascent = max ((int) dl->ascent, pix_ascent);
2798 dl->descent = max ((int) dl->descent, pix_descent);
2799 }
2800
2801 /* A string so determine contribution normally. */
2802 else if (EQ (baseline, Qt))
2803 {
2804 dl->ascent = max (dl->ascent, ascent);
2805 dl->descent = max (dl->descent, descent);
2806 }
2807
2808 /* A pixmap with an explicitly set baseline. We determine the
2809 contribution here. */
2810 else if (INTP (baseline))
2811 {
2812 int height = ascent + descent;
2813 int pix_ascent, pix_descent;
2814
2815 pix_ascent = height * XINT (baseline) / 100;
2816 pix_descent = height - pix_ascent;
2817
2818 dl->ascent = max ((int) dl->ascent, pix_ascent);
2819 dl->descent = max ((int) dl->descent, pix_descent);
2820 }
2821
2822 /* Otherwise something is screwed up. */
2823 else
2824 abort ();
2825 }
2826 } 2803 }
2827 2804
2828 (reverse ? elt-- : elt++); 2805 (reverse ? elt-- : elt++);
2829 } 2806 }
2830 2807
2831 return xpos; 2808 if (data.max_pixmap_height)
2809 {
2810 int height = data.new_ascent + data.new_descent;
2811 int pix_ascent, pix_descent;
2812
2813 pix_descent = data.max_pixmap_height * data.new_descent / height;
2814 pix_ascent = data.max_pixmap_height - pix_descent;
2815 data.new_ascent = max (data.new_ascent, pix_ascent);
2816 data.new_descent = max (data.new_descent, pix_descent);
2817 }
2818
2819 dl->ascent = data.new_ascent;
2820 dl->descent = data.new_descent;
2821
2822 return data.pixpos;
2832 } 2823 }
2833 2824
2834 /* Add a blank to a margin display block. */ 2825 /* Add a blank to a margin display block. */
2835 2826
2836 static void 2827 static void
3554 int elt; 3545 int elt;
3555 Bytecount len; 3546 Bytecount len;
3556 Bufbyte *strdata; 3547 Bufbyte *strdata;
3557 struct buffer *buf = XBUFFER (WINDOW_BUFFER (w)); 3548 struct buffer *buf = XBUFFER (WINDOW_BUFFER (w));
3558 3549
3550 in_modeline_generation = 1;
3551
3559 detach_all_extents (result_str); 3552 detach_all_extents (result_str);
3560 resize_string (XSTRING (result_str), -1, 3553 resize_string (XSTRING (result_str), -1,
3561 data.bytepos - XSTRING_LENGTH (result_str)); 3554 data.bytepos - XSTRING_LENGTH (result_str));
3562 3555
3563 strdata = XSTRING_DATA (result_str); 3556 strdata = XSTRING_DATA (result_str);
3590 (XEXTENT (child), 3583 (XEXTENT (child),
3591 Dynarr_at (formatted_string_extent_start_dynarr, elt), 3584 Dynarr_at (formatted_string_extent_start_dynarr, elt),
3592 Dynarr_at (formatted_string_extent_end_dynarr, elt), 3585 Dynarr_at (formatted_string_extent_end_dynarr, elt),
3593 result_str); 3586 result_str);
3594 } 3587 }
3588
3589 in_modeline_generation = 0;
3595 } 3590 }
3596 } 3591 }
3597 3592
3598 /* Ensure that the given display line DL accurately represents the 3593 /* Ensure that the given display line DL accurately represents the
3599 modeline for the given window. */ 3594 modeline for the given window. */
4365 displayed. */ 4360 displayed. */
4366 int no_more_frags = 0; 4361 int no_more_frags = 0;
4367 4362
4368 dl->used_prop_data = 0; 4363 dl->used_prop_data = 0;
4369 dl->num_chars = 0; 4364 dl->num_chars = 0;
4365 dl->line_continuation = 0;
4370 4366
4371 /* set up faces to use for clearing areas, used by 4367 /* set up faces to use for clearing areas, used by
4372 output_display_line */ 4368 output_display_line */
4373 dl->default_findex = default_face; 4369 dl->default_findex = default_face;
4374 if (default_face) 4370 if (default_face)
4757 /* The cursor can never be on the continuation glyph. */ 4753 /* The cursor can never be on the continuation glyph. */
4758 data.cursor_type = NO_CURSOR; 4754 data.cursor_type = NO_CURSOR;
4759 4755
4760 /* data.bi_bufpos is already at the start of the next line. */ 4756 /* data.bi_bufpos is already at the start of the next line. */
4761 4757
4758 dl->line_continuation = 1;
4762 gb.glyph = Vcontinuation_glyph; 4759 gb.glyph = Vcontinuation_glyph;
4763 cachel = GLYPH_CACHEL (w, CONT_GLYPH_INDEX); 4760 cachel = GLYPH_CACHEL (w, CONT_GLYPH_INDEX);
4764 } 4761 }
4765 4762
4766 if (end_glyph_width) 4763 if (end_glyph_width)
5595 5592
5596 assert (cdl->bufpos == ddl->bufpos); 5593 assert (cdl->bufpos == ddl->bufpos);
5597 assert (cdl->end_bufpos == ddl->end_bufpos); 5594 assert (cdl->end_bufpos == ddl->end_bufpos);
5598 assert (cdl->offset == ddl->offset); 5595 assert (cdl->offset == ddl->offset);
5599 5596
5600 /* If the last rune is already a continuation glyph, fail. 5597 /* If the line continues to next display line, fail. */
5601 #### We should be able to handle this better. */ 5598 if (ddl->line_continuation)
5602 { 5599 return 0;
5603 struct display_block *db = get_display_block_from_line (ddl, TEXT);
5604 if (Dynarr_length (db->runes))
5605 {
5606 struct rune *rb =
5607 Dynarr_atp (db->runes, Dynarr_length (db->runes) - 1);
5608
5609 if (rb->type == RUNE_DGLYPH
5610 && EQ (rb->object.dglyph.glyph, Vcontinuation_glyph))
5611 return 0;
5612 }
5613 }
5614 5600
5615 /* If the line was generated using propagation data, fail. */ 5601 /* If the line was generated using propagation data, fail. */
5616 if (ddl->used_prop_data) 5602 if (ddl->used_prop_data)
5617 return 0; 5603 return 0;
5618 5604
5626 { 5612 {
5627 Dynarr_free (prop); 5613 Dynarr_free (prop);
5628 return 0; 5614 return 0;
5629 } 5615 }
5630 5616
5631 /* If the last rune is now a continuation glyph, fail. */ 5617 /* If the line continues to next display line, fail. */
5632 { 5618 if (ddl->line_continuation)
5633 struct display_block *db = get_display_block_from_line (ddl, TEXT); 5619 return 0;
5634 if (Dynarr_length (db->runes))
5635 {
5636 struct rune *rb =
5637 Dynarr_atp (db->runes, Dynarr_length (db->runes) - 1);
5638
5639 if (rb->type == RUNE_DGLYPH
5640 && EQ (rb->object.dglyph.glyph, Vcontinuation_glyph))
5641 return 0;
5642 }
5643 }
5644 5620
5645 /* If any line position parameters have changed or a 5621 /* If any line position parameters have changed or a
5646 cursor has disappeared or disappeared, fail. */ 5622 cursor has disappeared or disappeared, fail. */
5647 if (cdl->ypos != ddl->ypos 5623 if (cdl->ypos != ddl->ypos
5648 || cdl->ascent != ddl->ascent 5624 || cdl->ascent != ddl->ascent
6306 int preempted; 6282 int preempted;
6307 6283
6308 REDISPLAY_PREEMPTION_CHECK; 6284 REDISPLAY_PREEMPTION_CHECK;
6309 if (preempted) 6285 if (preempted)
6310 return 1; 6286 return 1;
6287 }
6288
6289 if (!internal_equal (f->old_buffer_alist, f->buffer_alist, 0))
6290 {
6291 Lisp_Object frame;
6292
6293 f->old_buffer_alist = Freplace_list (f->old_buffer_alist,
6294 f->buffer_alist);
6295 XSETFRAME (frame, f);
6296 va_run_hook_with_args (Qbuffer_list_changed_hook, 1, frame);
6311 } 6297 }
6312 6298
6313 /* Before we put a hold on frame size changes, attempt to process 6299 /* Before we put a hold on frame size changes, attempt to process
6314 any which are already pending. */ 6300 any which are already pending. */
6315 if (f->size_change_pending) 6301 if (f->size_change_pending)
9270 defsymbol (&Qdisplay_warning_buffer, "display-warning-buffer"); 9256 defsymbol (&Qdisplay_warning_buffer, "display-warning-buffer");
9271 defsymbol (&Qbar_cursor, "bar-cursor"); 9257 defsymbol (&Qbar_cursor, "bar-cursor");
9272 defsymbol (&Qredisplay_end_trigger_functions, 9258 defsymbol (&Qredisplay_end_trigger_functions,
9273 "redisplay-end-trigger-functions"); 9259 "redisplay-end-trigger-functions");
9274 defsymbol (&Qtop_bottom, "top-bottom"); 9260 defsymbol (&Qtop_bottom, "top-bottom");
9261 defsymbol (&Qbuffer_list_changed_hook, "buffer-list-changed-hook");
9275 9262
9276 DEFSUBR (Fredisplay_echo_area); 9263 DEFSUBR (Fredisplay_echo_area);
9277 DEFSUBR (Fredraw_frame); 9264 DEFSUBR (Fredraw_frame);
9278 DEFSUBR (Fredisplay_frame); 9265 DEFSUBR (Fredisplay_frame);
9279 DEFSUBR (Fredraw_device); 9266 DEFSUBR (Fredraw_device);
9421 Vbar_cursor = Qnil; 9408 Vbar_cursor = Qnil;
9422 9409
9423 #ifndef INHIBIT_REDISPLAY_HOOKS 9410 #ifndef INHIBIT_REDISPLAY_HOOKS
9424 xxDEFVAR_LISP ("pre-redisplay-hook", &Vpre_redisplay_hook /* 9411 xxDEFVAR_LISP ("pre-redisplay-hook", &Vpre_redisplay_hook /*
9425 Function or functions to run before every redisplay. 9412 Function or functions to run before every redisplay.
9426 Functions on this hook must be careful to avoid signalling errors!
9427 */ ); 9413 */ );
9428 Vpre_redisplay_hook = Qnil; 9414 Vpre_redisplay_hook = Qnil;
9429 9415
9430 xxDEFVAR_LISP ("post-redisplay-hook", &Vpost_redisplay_hook /* 9416 xxDEFVAR_LISP ("post-redisplay-hook", &Vpost_redisplay_hook /*
9431 Function or functions to run after every redisplay. 9417 Function or functions to run after every redisplay.
9432 Functions on this hook must be careful to avoid signalling errors!
9433 */ ); 9418 */ );
9434 Vpost_redisplay_hook = Qnil; 9419 Vpost_redisplay_hook = Qnil;
9435 #endif /* INHIBIT_REDISPLAY_HOOKS */ 9420 #endif /* INHIBIT_REDISPLAY_HOOKS */
9421
9422 DEFVAR_LISP ("buffer-list-changed-hook", &Vbuffer_list_changed_hook /*
9423 Function or functions to call when a frame's buffer list has changed.
9424 This is called during redisplay, before redisplaying each frame.
9425 Functions on this hook are called with one argument, the frame.
9426 */ );
9427 Vbuffer_list_changed_hook = Qnil;
9436 9428
9437 DEFVAR_INT ("display-warning-tick", &display_warning_tick /* 9429 DEFVAR_INT ("display-warning-tick", &display_warning_tick /*
9438 Bump this to tell the C code to call `display-warning-buffer' 9430 Bump this to tell the C code to call `display-warning-buffer'
9439 at next redisplay. You should not normally change this; the function 9431 at next redisplay. You should not normally change this; the function
9440 `display-warning' automatically does this at appropriate times. 9432 `display-warning' automatically does this at appropriate times.