summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Antipov <dmantipov@yandex.ru>2013-12-13 19:55:23 +0400
committerDmitry Antipov <dmantipov@yandex.ru>2013-12-13 19:55:23 +0400
commit5035fbc19e2f569674237c61e6ffdd4719e092d5 (patch)
tree86e7b51ececff332f6bd3bebd92f389cc4024ce8
parentb6c888cc7afed65f24c023b8e90b73649f438e14 (diff)
downloademacs-5035fbc19e2f569674237c61e6ffdd4719e092d5.tar.gz
* alloc.c, font.c, font.h, ftfont.c, ftxfont.c, macfont.m,
* nsfont.m, w32font.c, xfont.c, xftfont.c: Revert last and 2013-12-12 font-related change to avoid Bug#16128, which is quite hard to fix without even more substantial changes.
-rw-r--r--src/ChangeLog7
-rw-r--r--src/alloc.c20
-rw-r--r--src/font.c24
-rw-r--r--src/font.h7
-rw-r--r--src/ftfont.c1
-rw-r--r--src/ftxfont.c1
-rw-r--r--src/macfont.m2
-rw-r--r--src/nsfont.m1
-rw-r--r--src/w32font.c1
-rw-r--r--src/xfont.c1
-rw-r--r--src/xftfont.c1
11 files changed, 19 insertions, 47 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 2ae2f99b49a..4e8285e9530 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,12 @@
2013-12-13 Dmitry Antipov <dmantipov@yandex.ru>
+ * alloc.c, font.c, font.h, ftfont.c, ftxfont.c, macfont.m,
+ * nsfont.m, w32font.c, xfont.c, xftfont.c: Revert last and
+ 2013-12-12 font-related change to avoid Bug#16128, which
+ is quite hard to fix without even more substantial changes.
+
+2013-12-13 Dmitry Antipov <dmantipov@yandex.ru>
+
* font.c (font_close_object): Check for live frame (Bug#16128).
2013-12-13 Paul Eggert <eggert@cs.ucla.edu>
diff --git a/src/alloc.c b/src/alloc.c
index 022d1e5dcbb..aeda42637cd 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -2874,22 +2874,10 @@ vector_nbytes (struct Lisp_Vector *v)
static void
cleanup_vector (struct Lisp_Vector *vector)
{
- if (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_FONT))
- {
- ptrdiff_t size = vector->header.size & PSEUDOVECTOR_SIZE_MASK;
- Lisp_Object obj = make_lisp_ptr (vector, Lisp_Vectorlike);
-
- if (size == FONT_OBJECT_MAX)
- font_close_object (obj);
-#ifdef HAVE_NS
- else if (size == FONT_ENTITY_MAX)
- {
- struct font_entity *entity = (struct font_entity *) vector;
- if (entity->driver && entity->driver->free_entity)
- entity->driver->free_entity (obj);
- }
-#endif /* HAVE_NS */
- }
+ if (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_FONT)
+ && ((vector->header.size & PSEUDOVECTOR_SIZE_MASK)
+ == FONT_OBJECT_MAX))
+ ((struct font *) vector)->driver->close ((struct font *) vector);
}
/* Reclaim space used by unmarked vectors. */
diff --git a/src/font.c b/src/font.c
index 9f284440143..fb56b3d3fb3 100644
--- a/src/font.c
+++ b/src/font.c
@@ -173,9 +173,6 @@ font_make_entity (void)
allocate_pseudovector (VECSIZE (struct font_entity),
FONT_ENTITY_MAX, PVEC_FONT));
XSETFONT (font_entity, entity);
-#ifdef HAVE_NS
- entity->driver = NULL;
-#endif
return font_entity;
}
@@ -2884,10 +2881,10 @@ font_open_entity (struct frame *f, Lisp_Object entity, int pixel_size)
}
-/* Close FONT_OBJECT. */
+/* Close FONT_OBJECT that is opened on frame F. */
-void
-font_close_object (Lisp_Object font_object)
+static void
+font_close_object (struct frame *f, Lisp_Object font_object)
{
struct font *font = XFONT_OBJECT (font_object);
@@ -2897,13 +2894,8 @@ font_close_object (Lisp_Object font_object)
FONT_ADD_LOG ("close", font_object, Qnil);
font->driver->close (font);
#ifdef HAVE_WINDOW_SYSTEM
- eassert (font->frame);
- /* If the frame is gone, we can't do anything (Bug#16128). */
- if (FRAME_LIVE_P (font->frame))
- {
- eassert (FRAME_DISPLAY_INFO (font->frame)->n_fonts);
- FRAME_DISPLAY_INFO (font->frame)->n_fonts--;
- }
+ eassert (FRAME_DISPLAY_INFO (f)->n_fonts);
+ FRAME_DISPLAY_INFO (f)->n_fonts--;
#endif
}
@@ -4556,11 +4548,11 @@ DEFUN ("open-font", Fopen_font, Sopen_font, 1, 3, 0,
}
DEFUN ("close-font", Fclose_font, Sclose_font, 1, 2, 0,
- doc: /* Close FONT-OBJECT. Optional FRAME is unused. */)
+ doc: /* Close FONT-OBJECT. */)
(Lisp_Object font_object, Lisp_Object frame)
{
CHECK_FONT_OBJECT (font_object);
- font_close_object (font_object);
+ font_close_object (decode_live_frame (frame), font_object);
return Qnil;
}
@@ -4895,7 +4887,7 @@ If the named font is not yet loaded, return nil. */)
/* As font_object is still in FONT_OBJLIST of the entity, we can't
close it now. Perhaps, we should manage font-objects
by `reference-count'. */
- font_close_object (font_object);
+ font_close_object (f, font_object);
#endif
return info;
}
diff --git a/src/font.h b/src/font.h
index 7781816860a..539ebeba52a 100644
--- a/src/font.h
+++ b/src/font.h
@@ -265,9 +265,6 @@ struct font_entity
{
struct vectorlike_header header;
Lisp_Object props[FONT_ENTITY_MAX];
-#ifdef HAVE_NS
- struct font_driver *driver;
-#endif
};
/* A value which may appear in the member `encoding' of struct font
@@ -319,9 +316,6 @@ struct font
#if defined (HAVE_WINDOW_SYSTEM)
- /* The frame where the font was opened. */
- struct frame *frame;
-
/* Vertical pixel width of the underline. If is zero if that
information is not in the font. */
int underline_thickness;
@@ -741,7 +735,6 @@ extern Lisp_Object merge_font_spec (Lisp_Object, Lisp_Object);
extern Lisp_Object font_make_entity (void);
extern Lisp_Object font_make_object (int, Lisp_Object, int);
-extern void font_close_object (Lisp_Object);
extern Lisp_Object find_font_encoding (Lisp_Object);
extern int font_registry_charsets (Lisp_Object, struct charset **,
diff --git a/src/ftfont.c b/src/ftfont.c
index 36780454257..6a2303ab4a7 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -1236,7 +1236,6 @@ ftfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
ASET (font_object, FONT_FILE_INDEX, filename);
ASET (font_object, FONT_FORMAT_INDEX, ftfont_font_format (NULL, filename));
font = XFONT_OBJECT (font_object);
- font->frame = f;
ftfont_info = (struct ftfont_info *) font;
ftfont_info->ft_size = ft_face->size;
ftfont_info->index = XINT (idx);
diff --git a/src/ftxfont.c b/src/ftxfont.c
index b44905d88cd..d1aa3e40403 100644
--- a/src/ftxfont.c
+++ b/src/ftxfont.c
@@ -255,7 +255,6 @@ ftxfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
if (NILP (font_object))
return Qnil;
font = XFONT_OBJECT (font_object);
- eassert (font->frame == f);
font->driver = &ftxfont_driver;
return font_object;
}
diff --git a/src/macfont.m b/src/macfont.m
index 66833cd1b80..10623eb12fe 100644
--- a/src/macfont.m
+++ b/src/macfont.m
@@ -882,7 +882,6 @@ macfont_descriptor_entity (FontDescriptorRef desc, Lisp_Object extra,
CFStringRef name;
entity = font_make_entity ();
- XFONT_ENTITY (entity)->driver = &macfont_driver;
ASET (entity, FONT_TYPE_INDEX, macfont_driver.type);
ASET (entity, FONT_REGISTRY_INDEX, Qiso10646_1);
@@ -2492,7 +2491,6 @@ macfont_open (struct frame * f, Lisp_Object entity, int pixel_size)
ASET (font_object, FONT_FULLNAME_INDEX,
AREF (font_object, FONT_NAME_INDEX));
font = XFONT_OBJECT (font_object);
- font->frame = f;
font->pixel_size = size;
font->driver = &macfont_driver;
font->encoding_charset = font->repertory_charset = -1;
diff --git a/src/nsfont.m b/src/nsfont.m
index a794c9eed41..0f546408316 100644
--- a/src/nsfont.m
+++ b/src/nsfont.m
@@ -805,7 +805,6 @@ nsfont_open (struct frame *f, Lisp_Object font_entity, int pixel_size)
return Qnil; /* FIXME: other terms do, but return Qnil causes segfault */
}
- font->frame = f;
font_info->glyphs = xzalloc (0x100 * sizeof *font_info->glyphs);
font_info->metrics = xzalloc (0x100 * sizeof *font_info->metrics);
diff --git a/src/w32font.c b/src/w32font.c
index 20469274969..654e0d9cae4 100644
--- a/src/w32font.c
+++ b/src/w32font.c
@@ -999,7 +999,6 @@ w32font_open_internal (struct frame *f, Lisp_Object font_entity,
= DECODE_SYSTEM (build_string (logfont.lfFaceName));
}
- font->frame = f;
font->max_width = w32_font->metrics.tmMaxCharWidth;
/* Parts of Emacs display assume that height = ascent + descent...
so height is defined later, after ascent and descent.
diff --git a/src/xfont.c b/src/xfont.c
index 83ef604d5cd..d4d6ee7c10f 100644
--- a/src/xfont.c
+++ b/src/xfont.c
@@ -806,7 +806,6 @@ xfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
ASET (font_object, FONT_FILE_INDEX, Qnil);
ASET (font_object, FONT_FORMAT_INDEX, Qx);
font = XFONT_OBJECT (font_object);
- font->frame = f;
((struct xfont_info *) font)->xfont = xfont;
((struct xfont_info *) font)->display = FRAME_X_DISPLAY (f);
font->pixel_size = pixel_size;
diff --git a/src/xftfont.c b/src/xftfont.c
index 6423f8e19b3..37b33b3ead8 100644
--- a/src/xftfont.c
+++ b/src/xftfont.c
@@ -365,7 +365,6 @@ xftfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
ASET (font_object, FONT_FORMAT_INDEX,
ftfont_font_format (xftfont->pattern, filename));
font = XFONT_OBJECT (font_object);
- font->frame = f;
font->pixel_size = size;
font->driver = &xftfont_driver;
font->encoding_charset = font->repertory_charset = -1;