Commit e6df5336 authored by Jason Rumney's avatar Jason Rumney

* w32font.c (intern_font_name): New function.

(add_font_name_to_list, w32_enumfont_pattern_entity): Use it.
(w32font_open_internal, Fx_select_font): Decode font name.
(fill_in_logfont, list_all_matching_fonts): Encode font name.

* w32font.h (intern_font_name): Declare new function.

* w32uniscribe.c (add_opentype_font_name_to_list):
Use intern_font_name.
parent ebbbc028
2008-12-13 Jason Rumney <jasonr@gnu.org>
* w32font.c (intern_font_name): New function.
(add_font_name_to_list, w32_enumfont_pattern_entity): Use it.
(w32font_open_internal, Fx_select_font): Decode font name.
(fill_in_logfont, list_all_matching_fonts): Encode font name.
* w32font.h (intern_font_name): Declare new function.
* w32uniscribe.c (add_opentype_font_name_to_list):
Use intern_font_name.
2008-12-13 Chong Yidong <cyd@stupidchicken.com>
* frame.c (Fdelete_frame): Call free_font_driver_list.
......@@ -32,6 +44,11 @@
* xfns.c (Fx_wm_set_size_hint): Check if the frame is an X frame.
2008-12-12 Jason Rumney <jasonr@gnu.org>
* w32fns.c (x_display_info_for_name, Fx_open_connection): Set
Vwindow_system_version to the real w32 major version.
2008-12-12 Dan Nicolaescu <dann@ics.uci.edu>
* term.c (init_tty): Move setting the terminal name before the
......
......@@ -28,6 +28,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include "dispextern.h"
#include "character.h"
#include "charset.h"
#include "coding.h"
#include "fontset.h"
#include "font.h"
#include "w32font.h"
......@@ -160,6 +161,26 @@ memq_no_quit (elt, list)
return (CONSP (list));
}
Lisp_Object
intern_font_name (string)
char * string;
{
Lisp_Object obarray, tem, str;
int len;
str = DECODE_SYSTEM (build_string (string));
len = SCHARS (str);
/* The following code is copied from the function intern (in lread.c). */
obarray = Vobarray;
if (!VECTORP (obarray) || XVECTOR (obarray)->size == 0)
obarray = check_obarray (obarray);
tem = oblookup (obarray, SDATA (str), len, len);
if (SYMBOLP (tem))
return tem;
return Fintern (str, obarray);
}
/* w32 implementation of get_cache for font backend.
Return a cache of font-entities on FRAME. The cache must be a
cons whose cdr part is the actual cache area. */
......@@ -840,10 +861,10 @@ w32font_open_internal (f, font_entity, pixel_size, font_object)
}
if (name)
font->props[FONT_FULLNAME_INDEX]
= make_unibyte_string (name, strlen (name));
= DECODE_SYSTEM (build_string (name));
else
font->props[FONT_FULLNAME_INDEX] =
make_unibyte_string (logfont.lfFaceName, len);
font->props[FONT_FULLNAME_INDEX]
= DECODE_SYSTEM (build_string (logfont.lfFaceName));
}
font->max_width = w32_font->metrics.tmMaxCharWidth;
......@@ -922,8 +943,7 @@ add_font_name_to_list (logical_font, physical_font, font_type, list_object)
if (logical_font->elfLogFont.lfFaceName[0] == '@')
return 1;
family = font_intern_prop (logical_font->elfLogFont.lfFaceName,
strlen (logical_font->elfLogFont.lfFaceName), 1);
family = intern_font_name (logical_font->elfLogFont.lfFaceName);
if (! memq_no_quit (family, *list))
*list = Fcons (family, *list);
......@@ -996,7 +1016,7 @@ w32_enumfont_pattern_entity (frame, logical_font, physical_font,
lispy_antialias_type (requested_font->lfQuality));
}
ASET (entity, FONT_FAMILY_INDEX,
font_intern_prop (lf->lfFaceName, strlen (lf->lfFaceName), 1));
intern_font_name (lf->lfFaceName));
FONT_SET_STYLE (entity, FONT_WEIGHT_INDEX,
make_number (w32_decode_weight (lf->lfWeight)));
......@@ -1891,7 +1911,8 @@ fill_in_logfont (f, logfont, font_spec)
/* Font families are interned, but allow for strings also in case of
user input. */
else if (SYMBOLP (tmp))
strncpy (logfont->lfFaceName, SDATA (SYMBOL_NAME (tmp)), LF_FACESIZE);
strncpy (logfont->lfFaceName,
SDATA (ENCODE_SYSTEM (SYMBOL_NAME (tmp))), LF_FACESIZE);
}
tmp = AREF (font_spec, FONT_ADSTYLE_INDEX);
......@@ -1977,15 +1998,17 @@ list_all_matching_fonts (match_data)
while (!NILP (families))
{
/* TODO: Use the Unicode versions of the W32 APIs, so we can
handle non-ASCII font names. */
/* Only fonts from the current locale are given localized names
on Windows, so we can keep backwards compatibility with
Windows 9x/ME by using non-Unicode font enumeration without
sacrificing internationalization here. */
char *name;
Lisp_Object family = CAR (families);
families = CDR (families);
if (NILP (family))
continue;
else if (SYMBOLP (family))
name = SDATA (SYMBOL_NAME (family));
name = SDATA (ENCODE_SYSTEM (SYMBOL_NAME (family)));
else
continue;
......@@ -2391,7 +2414,7 @@ in the font selection dialog. */)
|| logfont_to_fcname (&lf, cf.iPointSize, buf, 100) < 0)
return Qnil;
return build_string (buf);
return DECODE_SYSTEM (build_string (buf));
}
struct font_driver w32font_driver =
......
......@@ -81,6 +81,8 @@ int w32font_draw P_ ((struct glyph_string *s, int from, int to,
int uniscribe_check_otf P_ ((LOGFONT *font, Lisp_Object otf_spec));
Lisp_Object intern_font_name P_ ((char *));
#endif
/* arch-tag: ef9d9675-a2a5-4d01-9526-815e9a3da7cb
......
......@@ -601,8 +601,7 @@ add_opentype_font_name_to_list (logical_font, physical_font, font_type,
&& !(physical_font->ntmFontSig.fsUsb[0] & 0x3fffffff))
return 1;
family = font_intern_prop (logical_font->elfLogFont.lfFaceName,
strlen (logical_font->elfLogFont.lfFaceName), 1);
family = intern_font_name (logical_font->elfLogFont.lfFaceName);
if (! memq_no_quit (family, *list))
*list = Fcons (family, *list);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment