]> git.eshelyaron.com Git - emacs.git/commitdiff
* w32font.c (intern_font_name): New function.
authorJason Rumney <jasonr@gnu.org>
Sat, 13 Dec 2008 17:56:27 +0000 (17:56 +0000)
committerJason Rumney <jasonr@gnu.org>
Sat, 13 Dec 2008 17:56:27 +0000 (17:56 +0000)
(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.

src/ChangeLog
src/w32font.c
src/w32font.h
src/w32uniscribe.c

index f73e6d3f72a369394b4a48e7310a8db31382699c..47922061be23685f7bfedf9fa1a076654f57cbeb 100644 (file)
@@ -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.
 
        * 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
index 4cfa8a242c68bbeba11844618b1c6a73297205b5..f892adeb6365b777c1c69eb8e797e7b7e10d1b56 100644 (file)
@@ -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 =
index 748b329f8da6b6bd538ca613ddda3612612084f8..180a5b873ba6532ce6adb2b2dc426f8352173eae 100644 (file)
@@ -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
index 128701297767a7e52d8f5e64cfe787877bcfbbc0..14ce7449a09fa0f380714de77139ba0d2f1b668c 100644 (file)
@@ -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);