summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJason Rumney <jasonr@gnu.org>2008-12-13 17:56:27 +0000
committerJason Rumney <jasonr@gnu.org>2008-12-13 17:56:27 +0000
commite6df5336489bdb73c6e9b1c72b27d190ce8aa224 (patch)
tree8e0833deeeab72dccc9110ea833cab6f5f23634f /src
parentebbbc028abed83c5199092327c735aa38bf6250e (diff)
downloademacs-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/ChangeLog17
-rw-r--r--src/w32font.c45
-rw-r--r--src/w32font.h2
-rw-r--r--src/w32uniscribe.c3
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);