X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/8b7e837d9c3266e775142a4865845b3d2a8b60aa..40fb2103c2986cbb91add4afed635886c4f87ae5:/src/fringe.c diff --git a/src/fringe.c b/src/fringe.c index 3de55b405c..771e7d4787 100644 --- a/src/fringe.c +++ b/src/fringe.c @@ -446,7 +446,7 @@ struct fringe_bitmap standard_bitmaps[MAX_STANDARD_FRINGE_BITMAPS] = }; static struct fringe_bitmap **fringe_bitmaps; -static unsigned *fringe_faces; +static Lisp_Object *fringe_faces; static int max_fringe_bitmaps; static int max_used_fringe_bitmap = MAX_STANDARD_FRINGE_BITMAPS; @@ -547,7 +547,13 @@ draw_fringe_bitmap_1 (w, row, left_p, overlay, which) } if (face_id == DEFAULT_FACE_ID) - face_id = fringe_faces[which]; + { + Lisp_Object face; + + if ((face = fringe_faces[which], NILP (face)) + || (face_id = lookup_named_face (f, face, 1), face_id < 0)) + face_id = FRINGE_FACE_ID; + } fb = fringe_bitmaps[which]; if (fb == NULL) @@ -574,7 +580,8 @@ draw_fringe_bitmap_1 (w, row, left_p, overlay, which) if (p.face == NULL) { - /* Why does this happen? ++kfs */ + /* This could happen after clearing face cache. + But it shouldn't happen anymore. ++kfs */ return; } @@ -809,12 +816,13 @@ update_window_fringes (w, force_p) arrow_bot = XCDR (pos); } else - ind = Qnil; + /* Anything else means boundary on left and no arrows. */ + boundary_top = boundary_bot = Qleft; } if (!NILP (ind)) { - int do_eob = 1, do_bob = 1; + int done_top = 0, done_bot = 0; for (y = 0, rn = 0; y < yb && rn < nrows; @@ -835,19 +843,25 @@ update_window_fringes (w, force_p) row->indicate_bob_p = row->indicate_top_line_p = 0; row->indicate_eob_p = row->indicate_bottom_line_p = 0; - if (!NILP (boundary_top) - && MATRIX_ROW_START_CHARPOS (row) <= BUF_BEGV (XBUFFER (w->buffer))) - row->indicate_bob_p = do_bob, do_bob = 0; - else if (!NILP (arrow_top) - && (WINDOW_WANTS_HEADER_LINE_P (w) ? 1 : 0) == rn) - row->indicate_top_line_p = 1; + if (!row->mode_line_p) + { + if (!done_top) + { + if (MATRIX_ROW_START_CHARPOS (row) <= BUF_BEGV (XBUFFER (w->buffer))) + row->indicate_bob_p = !NILP (boundary_top); + else + row->indicate_top_line_p = !NILP (arrow_top); + done_top = 1; + } - if (!NILP (boundary_bot) - && MATRIX_ROW_END_CHARPOS (row) >= BUF_ZV (XBUFFER (w->buffer))) - row->indicate_eob_p = do_eob, do_eob = 0; - else if (!NILP (arrow_bot) - && y + row->height >= yb) - row->indicate_bottom_line_p = 1; + if (!done_bot) + { + if (MATRIX_ROW_END_CHARPOS (row) >= BUF_ZV (XBUFFER (w->buffer))) + row->indicate_eob_p = !NILP (boundary_bot), done_bot = 1; + else if (y + row->height >= yb) + row->indicate_bottom_line_p = !NILP (arrow_bot), done_bot = 1; + } + } if (indicate_bob_p != row->indicate_bob_p || indicate_top_line_p != row->indicate_top_line_p @@ -883,13 +897,13 @@ update_window_fringes (w, force_p) left = row->left_user_fringe_bitmap; left_face_id = row->left_user_fringe_face_id; } + else if (row->truncated_on_left_p) + left = LEFT_TRUNCATION_BITMAP; else if (row->indicate_bob_p && EQ (boundary_top, Qleft)) left = ((row->indicate_eob_p && EQ (boundary_bot, Qleft)) ? LEFT_BRACKET_BITMAP : TOP_LEFT_ANGLE_BITMAP); else if (row->indicate_eob_p && EQ (boundary_bot, Qleft)) left = BOTTOM_LEFT_ANGLE_BITMAP; - else if (row->truncated_on_left_p) - left = LEFT_TRUNCATION_BITMAP; else if (MATRIX_ROW_CONTINUATION_LINE_P (row)) left = CONTINUATION_LINE_BITMAP; else if (row->indicate_empty_line_p && EQ (empty_pos, Qleft)) @@ -909,13 +923,13 @@ update_window_fringes (w, force_p) right = row->right_user_fringe_bitmap; right_face_id = row->right_user_fringe_face_id; } + else if (row->truncated_on_right_p) + right = RIGHT_TRUNCATION_BITMAP; else if (row->indicate_bob_p && EQ (boundary_top, Qright)) right = ((row->indicate_eob_p && EQ (boundary_bot, Qright)) ? RIGHT_BRACKET_BITMAP : TOP_RIGHT_ANGLE_BITMAP); else if (row->indicate_eob_p && EQ (boundary_bot, Qright)) right = BOTTOM_RIGHT_ANGLE_BITMAP; - else if (row->truncated_on_right_p) - right = RIGHT_TRUNCATION_BITMAP; else if (row->continued_p) right = CONTINUED_LINE_BITMAP; else if (row->indicate_top_line_p && EQ (arrow_top, Qright)) @@ -1066,7 +1080,7 @@ destroy_fringe_bitmap (n) { struct fringe_bitmap **fbp; - fringe_faces[n] = FRINGE_FACE_ID; + fringe_faces[n] = Qnil; fbp = &fringe_bitmaps[n]; if (*fbp && (*fbp)->dynamic) @@ -1204,7 +1218,6 @@ If BITMAP already exists, the existing definition is replaced. */) (bitmap, bits, height, width, align) Lisp_Object bitmap, bits, height, width, align; { - Lisp_Object len; int n, h, i, j; unsigned short *b; struct fringe_bitmap fb, *xfb; @@ -1212,20 +1225,21 @@ If BITMAP already exists, the existing definition is replaced. */) CHECK_SYMBOL (bitmap); - if (!STRINGP (bits) && !VECTORP (bits)) - bits = wrong_type_argument (Qstringp, bits); - - len = Flength (bits); + if (STRINGP (bits)) + h = SCHARS (bits); + else if (VECTORP (bits)) + h = XVECTOR (bits)->size; + else + bits = wrong_type_argument (Qsequencep, bits); if (NILP (height)) - h = fb.height = XINT (len); + fb.height = h; else { CHECK_NUMBER (height); fb.height = min (XINT (height), 255); - if (fb.height > XINT (len)) + if (fb.height > h) { - h = XINT (len); fill1 = (fb.height - h) / 2; fill2 = fb.height - h - fill1; } @@ -1287,12 +1301,12 @@ If BITMAP already exists, the existing definition is replaced. */) = ((struct fringe_bitmap **) xrealloc (fringe_bitmaps, max_fringe_bitmaps * sizeof (struct fringe_bitmap *))); fringe_faces - = (unsigned *) xrealloc (fringe_faces, max_fringe_bitmaps * sizeof (unsigned)); + = (Lisp_Object *) xrealloc (fringe_faces, max_fringe_bitmaps * sizeof (Lisp_Object)); for (; i < max_fringe_bitmaps; i++) { fringe_bitmaps[i] = NULL; - fringe_faces[i] = FRINGE_FACE_ID; + fringe_faces[i] = Qnil; } } } @@ -1346,14 +1360,12 @@ If FACE is nil, reset face to default fringe face. */) if (!NILP (face)) { - face_id = lookup_named_face (SELECTED_FRAME (), face); + face_id = lookup_named_face (SELECTED_FRAME (), face, 1); if (face_id < 0) error ("No such face"); } - else - face_id = FRINGE_FACE_ID; - fringe_faces[n] = face_id; + fringe_faces[n] = face; return Qnil; } @@ -1427,6 +1439,18 @@ You must (require 'fringe) to use fringe bitmap symbols in your programs." */); Vfringe_bitmaps = Qnil; } +/* Garbage collection hook */ + +void +mark_fringe_data () +{ + int i; + + for (i = 0; i < max_fringe_bitmaps; i++) + if (!NILP (fringe_faces[i])) + mark_object (fringe_faces[i]); +} + /* Initialize this module when Emacs starts. */ void @@ -1448,12 +1472,12 @@ init_fringe () fringe_bitmaps = (struct fringe_bitmap **) xmalloc (max_fringe_bitmaps * sizeof (struct fringe_bitmap *)); fringe_faces - = (unsigned *) xmalloc (max_fringe_bitmaps * sizeof (unsigned)); + = (Lisp_Object *) xmalloc (max_fringe_bitmaps * sizeof (Lisp_Object)); for (i = 0; i < max_fringe_bitmaps; i++) { fringe_bitmaps[i] = NULL; - fringe_faces[i] = FRINGE_FACE_ID; + fringe_faces[i] = Qnil; } }