diff options
| author | Jan Djärv | 2010-01-06 20:38:39 +0100 |
|---|---|---|
| committer | Jan Djärv | 2010-01-06 20:38:39 +0100 |
| commit | d0cf45b70247fc1f4cfc6d74c1b5f6d4ca75f0fc (patch) | |
| tree | ddbd3b141e6e402e77d48f601a9befdbccad8536 /src/font.c | |
| parent | ea2b370da2766fed12db4e7c0f33ddce12f9d0b4 (diff) | |
| download | emacs-d0cf45b70247fc1f4cfc6d74c1b5f6d4ca75f0fc.tar.gz emacs-d0cf45b70247fc1f4cfc6d74c1b5f6d4ca75f0fc.zip | |
Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
* font.c (font_open_entity): Enable chache and call cached_font_ok
for the driver if defined.
(QCuser_spec): New symbol.
(font_spec_from_name): Save name as user-spec.
(font_load_for_lface): Keep user-spec instead of name.
(font_open_by_name): Save name as user-spec.
(syms_of_font): Initialize QCuser_spec.
* xftfont.c (xftfont_open): Call xftfont_add_rendering_parameters.
(xftfont_add_rendering_parameters, xftfont_cached_font_ok): New.
(syms_of_xftfont): Initialize xftfont_driver.cached_font_ok.
* font.h (struct font_driver): Add cached_font_ok.
* font-setting.el (font-setting-change-default-font): Use user-spec
instead of name.
Diffstat (limited to 'src/font.c')
| -rw-r--r-- | src/font.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/font.c b/src/font.c index ec4cb874b52..2141fe651c3 100644 --- a/src/font.c +++ b/src/font.c | |||
| @@ -2991,16 +2991,6 @@ font_open_entity (f, entity, pixel_size) | |||
| 2991 | else if (CONSP (Vface_font_rescale_alist)) | 2991 | else if (CONSP (Vface_font_rescale_alist)) |
| 2992 | scaled_pixel_size = pixel_size * font_rescale_ratio (entity); | 2992 | scaled_pixel_size = pixel_size * font_rescale_ratio (entity); |
| 2993 | 2993 | ||
| 2994 | #if 0 | ||
| 2995 | /* This doesn't work if you have changed hinting or any other parameter. | ||
| 2996 | We need to make a new object in every case to be sure. */ | ||
| 2997 | for (objlist = AREF (entity, FONT_OBJLIST_INDEX); CONSP (objlist); | ||
| 2998 | objlist = XCDR (objlist)) | ||
| 2999 | if (! NILP (AREF (XCAR (objlist), FONT_TYPE_INDEX)) | ||
| 3000 | && XFONT_OBJECT (XCAR (objlist))->pixel_size == pixel_size) | ||
| 3001 | return XCAR (objlist); | ||
| 3002 | #endif | ||
| 3003 | |||
| 3004 | val = AREF (entity, FONT_TYPE_INDEX); | 2994 | val = AREF (entity, FONT_TYPE_INDEX); |
| 3005 | for (driver_list = f->font_driver_list; | 2995 | for (driver_list = f->font_driver_list; |
| 3006 | driver_list && ! EQ (driver_list->driver->type, val); | 2996 | driver_list && ! EQ (driver_list->driver->type, val); |
| @@ -3008,6 +2998,19 @@ font_open_entity (f, entity, pixel_size) | |||
| 3008 | if (! driver_list) | 2998 | if (! driver_list) |
| 3009 | return Qnil; | 2999 | return Qnil; |
| 3010 | 3000 | ||
| 3001 | for (objlist = AREF (entity, FONT_OBJLIST_INDEX); CONSP (objlist); | ||
| 3002 | objlist = XCDR (objlist)) | ||
| 3003 | { | ||
| 3004 | Lisp_Object fn = XCAR (objlist); | ||
| 3005 | if (! NILP (AREF (fn, FONT_TYPE_INDEX)) | ||
| 3006 | && XFONT_OBJECT (fn)->pixel_size == pixel_size) | ||
| 3007 | { | ||
| 3008 | if (driver_list->driver->cached_font_ok == NULL | ||
| 3009 | || driver_list->driver->cached_font_ok (f, fn, entity)) | ||
| 3010 | return fn; | ||
| 3011 | } | ||
| 3012 | } | ||
| 3013 | |||
| 3011 | font_object = driver_list->driver->open (f, entity, scaled_pixel_size); | 3014 | font_object = driver_list->driver->open (f, entity, scaled_pixel_size); |
| 3012 | if (!NILP (font_object)) | 3015 | if (!NILP (font_object)) |
| 3013 | ASET (font_object, FONT_SIZE_INDEX, make_number (pixel_size)); | 3016 | ASET (font_object, FONT_SIZE_INDEX, make_number (pixel_size)); |