};
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;
}
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)
if (p.face == NULL)
{
- /* Why does this happen? ++kfs */
+ /* This could happen after clearing face cache.
+ But it shouldn't happen anymore. ++kfs */
return;
}
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;
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
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))
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))
{
struct fringe_bitmap **fbp;
- fringe_faces[n] = FRINGE_FACE_ID;
+ fringe_faces[n] = Qnil;
fbp = &fringe_bitmaps[n];
if (*fbp && (*fbp)->dynamic)
(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;
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;
}
= ((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;
}
}
}
if (!NILP (face))
{
- face_id = lookup_named_face (SELECTED_FRAME (), face, 'A');
+ 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;
}
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
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;
}
}