changeset 100409:4be3711ceff9

* 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.
author Jason Rumney <jasonr@gnu.org>
date Sat, 13 Dec 2008 17:56:27 +0000
parents ff982ba457d9
children 98a6323ace20
files src/ChangeLog src/w32font.c src/w32font.h src/w32uniscribe.c
diffstat 4 files changed, 54 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Sat Dec 13 15:40:34 2008 +0000
+++ b/src/ChangeLog	Sat Dec 13 17:56:27 2008 +0000
@@ -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
--- a/src/w32font.c	Sat Dec 13 15:40:34 2008 +0000
+++ b/src/w32font.c	Sat Dec 13 17:56:27 2008 +0000
@@ -28,6 +28,7 @@
 #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 @@
   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 @@
       }
     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 @@
   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 @@
                       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 @@
         /* 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 @@
 
   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 @@
       || 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 =
--- a/src/w32font.h	Sat Dec 13 15:40:34 2008 +0000
+++ b/src/w32font.h	Sat Dec 13 17:56:27 2008 +0000
@@ -81,6 +81,8 @@
 
 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
--- a/src/w32uniscribe.c	Sat Dec 13 15:40:34 2008 +0000
+++ b/src/w32uniscribe.c	Sat Dec 13 17:56:27 2008 +0000
@@ -601,8 +601,7 @@
       && !(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);