aboutsummaryrefslogtreecommitdiffstats
path: root/src/fringe.c
diff options
context:
space:
mode:
authorKaroly Lorentey <[email protected]>2004-10-03 13:08:55 +0000
committerKaroly Lorentey <[email protected]>2004-10-03 13:08:55 +0000
commit04ccca970d4a21222cd1f58c7c41983461f009fc (patch)
treeae6c3a37beb6a32881b80c42981b891138dd194f /src/fringe.c
parent181bb49001b52ee593c852377951f8f7b3cf4f38 (diff)
parent972a542d5b1101a143ef930f62090fa3feab49f1 (diff)
Merged in changes from CVS trunk.
Patches applied: * [email protected]/emacs--cvs-trunk--0--patch-581 Fix exec-shield autoconf test * [email protected]/emacs--cvs-trunk--0--patch-582 Update from CVS * [email protected]/emacs--cvs-trunk--0--patch-583 Update from CVS * [email protected]/emacs--cvs-trunk--0--patch-584 Update from CVS * [email protected]/emacs--cvs-trunk--0--patch-585 Merge from gnus--rel--5.10 * [email protected]/emacs--cvs-trunk--0--patch-586 Update from CVS * [email protected]/emacs--cvs-trunk--0--patch-587 Update from CVS * [email protected]/emacs--cvs-trunk--0--patch-588 Update from CVS * [email protected]/emacs--cvs-trunk--0--patch-589 Merge from gnus--rel--5.10 * [email protected]/emacs--cvs-trunk--0--patch-590 Update from CVS * [email protected]/emacs--cvs-trunk--0--patch-591 Update from CVS * [email protected]/emacs--cvs-trunk--0--patch-592 Update from CVS * [email protected]/gnus--rel--5.10--patch-38 Update from CVS * [email protected]/gnus--rel--5.10--patch-39 Merge from emacs--cvs-trunk--0 * [email protected]/gnus--rel--5.10--patch-40 Update from CVS * [email protected]/gnus--rel--5.10--patch-41 Update from CVS git-archimport-id: [email protected]/emacs--multi-tty--0--patch-252
Diffstat (limited to 'src/fringe.c')
-rw-r--r--src/fringe.c157
1 files changed, 82 insertions, 75 deletions
diff --git a/src/fringe.c b/src/fringe.c
index 24a7bcb083..529004c7ed 100644
--- a/src/fringe.c
+++ b/src/fringe.c
@@ -446,27 +446,34 @@ struct fringe_bitmap standard_bitmaps[MAX_STANDARD_FRINGE_BITMAPS] =
{ FRBITS (zv_bits), 8, 3, ALIGN_BITMAP_TOP, 0 },
};
-static struct fringe_bitmap *fringe_bitmaps[MAX_FRINGE_BITMAPS];
-static unsigned fringe_faces[MAX_FRINGE_BITMAPS];
+static struct fringe_bitmap **fringe_bitmaps;
+static unsigned *fringe_faces;
+static int max_fringe_bitmaps;
static int max_used_fringe_bitmap = MAX_STANDARD_FRINGE_BITMAPS;
-/* Return 1 if FRINGE_ID is a valid fringe bitmap id. */
+
+/* Lookup bitmap number for symbol BITMAP.
+ Return 0 if not a bitmap. */
int
-valid_fringe_bitmap_p (bitmap)
+lookup_fringe_bitmap (bitmap)
Lisp_Object bitmap;
{
int bn;
+ bitmap = Fget (bitmap, Qfringe);
if (!INTEGERP (bitmap))
return 0;
bn = XINT (bitmap);
- return (bn >= NO_FRINGE_BITMAP
- && bn < max_used_fringe_bitmap
- && (bn < MAX_STANDARD_FRINGE_BITMAPS
- || fringe_bitmaps[bn] != NULL));
+ if (bn > NO_FRINGE_BITMAP
+ && bn < max_used_fringe_bitmap
+ && (bn < MAX_STANDARD_FRINGE_BITMAPS
+ || fringe_bitmaps[bn] != NULL))
+ return bn;
+
+ return 0;
}
/* Get fringe bitmap name for bitmap number BN.
@@ -502,42 +509,6 @@ get_fringe_bitmap_name (bn)
}
-/* Resolve a BITMAP parameter.
-
- An INTEGER, corresponding to a bitmap number.
- A STRING which is interned to a symbol.
- A SYMBOL which has a fringe property which is a bitmap number.
-*/
-
-static int
-resolve_fringe_bitmap (bitmap, namep)
- Lisp_Object bitmap;
- Lisp_Object *namep;
-{
- if (namep)
- *namep = Qnil;
-
- if (STRINGP (bitmap))
- bitmap = intern (SDATA (bitmap));
-
- if (SYMBOLP (bitmap))
- {
- if (namep)
- *namep = bitmap;
- bitmap = Fget (bitmap, Qfringe);
- }
-
- if (valid_fringe_bitmap_p (bitmap))
- {
- if (namep && NILP (*namep))
- *namep = get_fringe_bitmap_name (XINT (bitmap));
- return XINT (bitmap);
- }
-
- return -1;
-}
-
-
/* Draw the bitmap WHICH in one of the left or right fringes of
window W. ROW is the glyph row for which to display the bitmap; it
determines the vertical position at which the bitmap has to be
@@ -1069,7 +1040,9 @@ compute_fringe_widths (f, redraw)
}
-void
+/* Free resources used by a user-defined bitmap. */
+
+int
destroy_fringe_bitmap (n)
int n;
{
@@ -1081,8 +1054,9 @@ destroy_fringe_bitmap (n)
if (*fbp && (*fbp)->dynamic)
{
/* XXX Is SELECTED_FRAME OK here? */
- if (FRAME_RIF (SELECTED_FRAME ())->destroy_fringe_bitmap)
- FRAME_RIF (SELECTED_FRAME ())->destroy_fringe_bitmap (n);
+ struct redisplay_interface *rif = FRAME_RIF (SELECTED_FRAME ());
+ if (rif && rif->destroy_fringe_bitmap)
+ rif->destroy_fringe_bitmap (n);
xfree (*fbp);
*fbp = NULL;
}
@@ -1101,20 +1075,21 @@ If BITMAP overrides a standard fringe bitmap, the original bitmap is restored.
Lisp_Object bitmap;
{
int n;
- Lisp_Object sym;
- n = resolve_fringe_bitmap (bitmap, &sym);
- if (n < 0)
+ CHECK_SYMBOL (bitmap);
+ n = lookup_fringe_bitmap (bitmap);
+ if (!n)
return Qnil;
destroy_fringe_bitmap (n);
- if (SYMBOLP (sym))
+ if (n >= MAX_STANDARD_FRINGE_BITMAPS)
{
- Vfringe_bitmaps = Fdelq (sym, Vfringe_bitmaps);
+ Vfringe_bitmaps = Fdelq (bitmap, Vfringe_bitmaps);
/* It would be better to remove the fringe property. */
- Fput (sym, Qfringe, Qnil);
+ Fput (bitmap, Qfringe, Qnil);
}
+
return Qnil;
}
@@ -1188,8 +1163,9 @@ init_fringe_bitmap (which, fb, once_p)
destroy_fringe_bitmap (which);
/* XXX Is SELECTED_FRAME OK here? */
- if (FRAME_RIF (SELECTED_FRAME ())->define_fringe_bitmap)
- FRAME_RIF (SELECTED_FRAME ())->define_fringe_bitmap (which, fb->bits, fb->height, fb->width);
+ struct redisplay_interface *rif = FRAME_RIF (SELECTED_FRAME ());
+ if (rif && rif->define_fringe_bitmap)
+ rif->define_fringe_bitmap (which, fb->bits, fb->height, fb->width);
fringe_bitmaps[which] = fb;
if (which >= max_used_fringe_bitmap)
@@ -1219,12 +1195,8 @@ If BITMAP already exists, the existing definition is replaced. */)
unsigned short *b;
struct fringe_bitmap fb, *xfb;
int fill1 = 0, fill2 = 0;
- Lisp_Object sym;
-
- n = resolve_fringe_bitmap (bitmap, &sym);
- if (NILP (sym) || INTEGERP (sym))
- sym = wrong_type_argument (Qsymbolp, bitmap);
+ CHECK_SYMBOL (bitmap);
if (!STRINGP (bits) && !VECTORP (bits))
bits = wrong_type_argument (Qstringp, bits);
@@ -1277,23 +1249,42 @@ If BITMAP already exists, the existing definition is replaced. */)
else if (!NILP (align) && !EQ (align, Qcenter))
error ("Bad align argument");
- if (n < 0)
+ n = lookup_fringe_bitmap (bitmap);
+ if (!n)
{
- if (max_used_fringe_bitmap < MAX_FRINGE_BITMAPS)
+ if (max_used_fringe_bitmap < max_fringe_bitmaps)
n = max_used_fringe_bitmap++;
else
{
for (n = MAX_STANDARD_FRINGE_BITMAPS;
- n < MAX_FRINGE_BITMAPS;
+ n < max_fringe_bitmaps;
n++)
if (fringe_bitmaps[n] == NULL)
break;
- if (n == MAX_FRINGE_BITMAPS)
- error ("Cannot define more fringe bitmaps");
+
+ if (n == max_fringe_bitmaps)
+ {
+ if ((max_fringe_bitmaps + 20) > MAX_FRINGE_BITMAPS)
+ error ("No free fringe bitmap slots");
+
+ i = max_fringe_bitmaps;
+ max_fringe_bitmaps += 20;
+ fringe_bitmaps
+ = ((struct fringe_bitmap **)
+ xrealloc (fringe_bitmaps, max_fringe_bitmaps * sizeof (struct fringe_bitmap *)));
+ fringe_faces
+ = (unsigned *) xrealloc (fringe_faces, max_fringe_bitmaps * sizeof (unsigned));
+
+ for (; i < max_fringe_bitmaps; i++)
+ {
+ fringe_bitmaps[i] = NULL;
+ fringe_faces[i] = FRINGE_FACE_ID;
+ }
+ }
}
- Vfringe_bitmaps = Fcons (sym, Vfringe_bitmaps);
- Fput (sym, Qfringe, make_number (n));
+ Vfringe_bitmaps = Fcons (bitmap, Vfringe_bitmaps);
+ Fput (bitmap, Qfringe, make_number (n));
}
fb.dynamic = 1;
@@ -1321,7 +1312,7 @@ If BITMAP already exists, the existing definition is replaced. */)
init_fringe_bitmap (n, xfb, 0);
- return sym;
+ return bitmap;
}
DEFUN ("set-fringe-bitmap-face", Fset_fringe_bitmap_face, Sset_fringe_bitmap_face,
@@ -1331,11 +1322,12 @@ If FACE is nil, reset face to default fringe face. */)
(bitmap, face)
Lisp_Object bitmap, face;
{
- int bn;
+ int n;
int face_id;
- bn = resolve_fringe_bitmap (bitmap, 0);
- if (bn < 0)
+ CHECK_SYMBOL (bitmap);
+ n = lookup_fringe_bitmap (bitmap);
+ if (!n)
error ("Undefined fringe bitmap");
if (!NILP (face))
@@ -1347,7 +1339,7 @@ If FACE is nil, reset face to default fringe face. */)
else
face_id = FRINGE_FACE_ID;
- fringe_faces [bn] = face_id;
+ fringe_faces[n] = face_id;
return Qnil;
}
@@ -1435,9 +1427,18 @@ init_fringe ()
{
int i;
- bzero (fringe_bitmaps, sizeof fringe_bitmaps);
- for (i = 0; i < MAX_FRINGE_BITMAPS; i++)
- fringe_faces[i] = FRINGE_FACE_ID;
+ max_fringe_bitmaps = MAX_STANDARD_FRINGE_BITMAPS + 20;
+
+ fringe_bitmaps
+ = (struct fringe_bitmap **) xmalloc (max_fringe_bitmaps * sizeof (struct fringe_bitmap *));
+ fringe_faces
+ = (unsigned *) xmalloc (max_fringe_bitmaps * sizeof (unsigned));
+
+ for (i = 0; i < max_fringe_bitmaps; i++)
+ {
+ fringe_bitmaps[i] = NULL;
+ fringe_faces[i] = FRINGE_FACE_ID;
+ }
}
#ifdef HAVE_NTGUI
@@ -1447,6 +1448,9 @@ w32_init_fringe ()
{
enum fringe_bitmap_type bt;
+ if (!rif)
+ return;
+
for (bt = NO_FRINGE_BITMAP + 1; bt < MAX_STANDARD_FRINGE_BITMAPS; bt++)
{
struct fringe_bitmap *fb = &standard_bitmaps[bt];
@@ -1460,6 +1464,9 @@ w32_reset_fringes ()
/* Destroy row bitmaps. */
int bt;
+ if (!rif)
+ return;
+
for (bt = NO_FRINGE_BITMAP + 1; bt < max_used_fringe_bitmap; bt++)
rif->destroy_fringe_bitmap (bt);
}