diff options
author | Jason Rumney <jasonr@gnu.org> | 2008-12-13 17:56:27 +0000 |
---|---|---|
committer | Jason Rumney <jasonr@gnu.org> | 2008-12-13 17:56:27 +0000 |
commit | e6df5336489bdb73c6e9b1c72b27d190ce8aa224 (patch) | |
tree | 8e0833deeeab72dccc9110ea833cab6f5f23634f /src | |
parent | ebbbc028abed83c5199092327c735aa38bf6250e (diff) | |
download | emacs-e6df5336489bdb73c6e9b1c72b27d190ce8aa224.tar.gz |
* 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.
Diffstat (limited to 'src')
-rw-r--r-- | src/ChangeLog | 17 | ||||
-rw-r--r-- | src/w32font.c | 45 | ||||
-rw-r--r-- | src/w32font.h | 2 | ||||
-rw-r--r-- | src/w32uniscribe.c | 3 |
4 files changed, 54 insertions, 13 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index f73e6d3f72a..47922061be2 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,15 @@ +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 diff --git a/src/w32font.c b/src/w32font.c index 4cfa8a242c6..f892adeb636 100644 --- a/src/w32font.c +++ b/src/w32font.c @@ -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 = diff --git a/src/w32font.h b/src/w32font.h index 748b329f8da..180a5b873ba 100644 --- a/src/w32font.h +++ b/src/w32font.h @@ -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 diff --git a/src/w32uniscribe.c b/src/w32uniscribe.c index 12870129776..14ce7449a09 100644 --- a/src/w32uniscribe.c +++ b/src/w32uniscribe.c @@ -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); |