#include "gdk/gdk.h"
/* Protect against the CHARSET struct in Win32 */
-#if GDK_WINDOWING == GDK_WINDOWING_WIN32
+#ifdef GDK_WINDOWING_WIN32
# define CHARSET CHARSETstruct
#endif
#include "gdkx.h"
-#if GDK_WINDOWING == GDK_WINDOWING_WIN32
+#ifdef GDK_WINDOWING_WIN32
# undef CHARSET
#endif
#include "gdk/gdkkeysyms.h"
GdkEventConfigure *event,
GtkFontSelectionDialog *fsd);
-#if GDK_WINDOWING == GDK_WINDOWING_WIN32
+#ifdef GDK_WINDOWING_WIN32
static char *logfont_to_xlfd (const LOGFONT *lfp,
int size,
int res,
can_match = TRUE;
if (nbitmapped_sizes)
- if (fontsel->metric == GTK_FONT_METRIC_POINTS)
- {
- if (*bitmapped_sizes % 10 != 0)
- can_match = FALSE;
- bitmap_size = *bitmapped_sizes / 10;
- bitmap_size_float = *bitmapped_sizes / 10;
- }
- else
- {
- bitmap_size = *bitmapped_sizes;
- bitmap_size_float = *bitmapped_sizes;
- }
+ {
+ if (fontsel->metric == GTK_FONT_METRIC_POINTS)
+ {
+ if (*bitmapped_sizes % 10 != 0)
+ can_match = FALSE;
+ bitmap_size = *bitmapped_sizes / 10;
+ bitmap_size_float = *bitmapped_sizes / 10;
+ }
+ else
+ {
+ bitmap_size = *bitmapped_sizes;
+ bitmap_size_float = *bitmapped_sizes;
+ }
+ }
if (can_match && nstandard_sizes && nbitmapped_sizes
&& *standard_sizes == bitmap_size)
{
GdkFont *font;
gchar *fontname, *label_text;
+ XFontStruct *xfs;
if (fontsel->font)
gdk_font_unref (fontsel->font);
#ifdef FONTSEL_DEBUG
g_message("Loading: %s\n", fontname);
#endif
+#ifndef GDK_WINDOWING_WIN32
font = gdk_font_load (fontname);
+ xfs = GDK_FONT_XFONT(font);
+ if (xfs->min_byte1 != 0 || xfs->max_byte1 != 0)
+ {
+ gchar *tmp_name;
+
+ gdk_font_unref (font);
+ tmp_name = g_strconcat (fontname, ",*", NULL);
+ font = gdk_fontset_load (tmp_name);
+ g_free(tmp_name);
+ }
+#else
+ /* Load as a fontset so that gtkentry uses wide chars for it */
+ font = gdk_fontset_load (fontname);
+#endif
g_free(fontname);
if (font)
GtkStyle *style;
gint text_height, new_height;
gchar *text;
-#if GDK_WINDOWING == GDK_WINDOWING_X11
+#ifdef GDK_WINDOWING_X11
XFontStruct *xfs;
#endif
gtk_entry_set_text(GTK_ENTRY(fontsel->preview_entry), PREVIEW_TEXT);
gtk_entry_set_position(GTK_ENTRY(fontsel->preview_entry), 0);
-#if GDK_WINDOWING == GDK_WINDOWING_X11
+#ifdef GDK_WINDOWING_X11
/* If this is a 2-byte font display a message to say it may not be
displayed properly. */
xfs = GDK_FONT_XFONT(fontsel->font);
static void
gtk_font_selection_show_font_info (GtkFontSelection *fontsel)
{
-#if GDK_WINDOWING == GDK_WINDOWING_X11
+#ifdef GDK_WINDOWING_X11
Atom font_atom, atom;
Bool status;
#endif
gtk_clist_set_text(GTK_CLIST(fontsel->info_clist), i, 1,
field ? field : "");
}
-#if GDK_WINDOWING == GDK_WINDOWING_X11
+#ifdef GDK_WINDOWING_X11
if (fontsel->font)
{
- font_atom = XInternAtom(GDK_DISPLAY(), "FONT", True);
- if (font_atom != None)
+ font_atom = gdk_atom_intern ("FONT", FALSE);
+
+ if (fontsel->font->type == GDK_FONT_FONTSET)
+ {
+ XFontStruct **font_structs;
+ gint num_fonts;
+ gchar **font_names;
+
+ num_fonts = XFontsOfFontSet (GDK_FONT_XFONT(fontsel->font),
+ &font_structs, &font_names);
+ status = XGetFontProperty(font_structs[0], font_atom, &atom);
+ }
+ else
{
status = XGetFontProperty(GDK_FONT_XFONT(fontsel->font), font_atom,
&atom);
- if (status == True)
+ }
+
+ if (status == True)
+ {
+ name = gdk_atom_name (atom);
+ gtk_entry_set_text (GTK_ENTRY (fontsel->actual_font_name), name);
+
+ for (i = 0; i < GTK_XLFD_NUM_FIELDS; i++)
{
- name = XGetAtomName(GDK_DISPLAY(), atom);
- gtk_entry_set_text(GTK_ENTRY(fontsel->actual_font_name), name);
-
- for (i = 0; i < GTK_XLFD_NUM_FIELDS; i++)
- {
- field = gtk_font_selection_get_xlfd_field (name, i,
- field_buffer);
- if (i == XLFD_SLANT)
- field = gtk_font_selection_expand_slant_code(field);
- else if (i == XLFD_SPACING)
- field = gtk_font_selection_expand_spacing_code(field);
- gtk_clist_set_text(GTK_CLIST(fontsel->info_clist), i, 2,
- field ? field : "");
- }
- shown_actual_fields = TRUE;
- XFree(name);
+ field = gtk_font_selection_get_xlfd_field (name, i, field_buffer);
+ if (i == XLFD_SLANT)
+ field = gtk_font_selection_expand_slant_code(field);
+ else if (i == XLFD_SPACING)
+ field = gtk_font_selection_expand_spacing_code(field);
+ gtk_clist_set_text(GTK_CLIST(fontsel->info_clist), i, 2,
+ field ? field : "");
}
+ shown_actual_fields = TRUE;
+ g_free (name);
}
}
-#elif GDK_WINDOWING == GDK_WINDOWING_WIN32
+#elif defined (GDK_WINDOWING_WIN32)
if (fontsel->font)
{
LOGFONT logfont;
}
-#if GDK_WINDOWING == GDK_WINDOWING_WIN32
+#ifdef GDK_WINDOWING_WIN32
static gint num_fonts;
static gint font_names_size;
int point_size;
static int logpixelsy = 0;
gchar facename[LF_FACESIZE*3];
- gchar *p, *q;
+ gchar *p;
+ const gchar *q;
if (logpixelsy == 0)
{
static void
gtk_font_selection_get_fonts (void)
{
-#if GDK_WINDOWING == GDK_WINDOWING_X11
+#ifdef GDK_WINDOWING_X11
gchar **xfontnames;
gint num_fonts;
-#elif GDK_WINDOWING == GDK_WINDOWING_WIN32
+#elif defined (GDK_WINDOWING_WIN32)
LOGFONT logfont;
#else
gint num_fonts = 0;
fontsel_info = g_new (GtkFontSelInfo, 1);
-#if GDK_WINDOWING == GDK_WINDOWING_X11
+#ifdef GDK_WINDOWING_X11
/* Get a maximum of MAX_FONTS fontnames from the X server.
Use "-*" as the pattern rather than "-*-*-*-*-*-*-*-*-*-*-*-*-*-*" since
the latter may result in fonts being returned which don't actually exist.
if (num_fonts == MAX_FONTS)
g_warning(_("MAX_FONTS exceeded. Some fonts may be missing."));
-#elif GDK_WINDOWING == GDK_WINDOWING_WIN32
+#elif defined (GDK_WINDOWING_WIN32)
num_fonts = 0;
hdc = GetDC (NULL);
font_names_size = 100;
fontsel_info->nfonts = 0;
for (i = 0; i < num_fonts; i++)
{
-#ifdef FONTSEL_DEBUG
- g_message("%s\n", xfontnames[i]);
-#endif
if (gtk_font_selection_is_xlfd_font_name (xfontnames[i]))
gtk_font_selection_insert_font (fontnames, &fontsel_info->nfonts, xfontnames[i]);
- else
- {
-#ifdef FONTSEL_DEBUG
- g_warning("Skipping invalid font: %s", xfontnames[i]);
-#endif
- }
}
sizeof(guint16) * npoint_sizes);
g_free(fontnames);
-#if GDK_WINDOWING == GDK_WINDOWING_X11
+#ifdef GDK_WINDOWING_X11
XFreeFontNames (xfontnames);
-#elif GDK_WINDOWING == GDK_WINDOWING_WIN32
+#elif defined (GDK_WINDOWING_WIN32)
for (i = 0; i < num_fonts; i++)
g_free (xfontnames[i]);
g_free (xfontnames);
{
const gchar *t1, *t2;
gint countdown, len, num_dashes;
+#ifdef GDK_WINDOWING_WIN32
+ gchar *p;
+#endif
if (!fontname)
return NULL;
return NULL;
strncpy (buffer, t1, len);
buffer[len] = 0;
-
+#ifdef GDK_WINDOWING_X11
/* Convert to lower case. */
g_strdown (buffer);
+#elif defined (GDK_WINDOWING_WIN32)
+ /* Check for hex escapes in font family */
+ if (field_num == XLFD_FAMILY)
+ {
+ p = buffer;
+ while (*p)
+ {
+ if (*p == '%' && isxdigit (p[1]) && isxdigit (p[2]))
+ {
+ guint c;
+ sscanf (p+1, "%2x", &c);
+ *p = c;
+ strcpy (p+1, p+3);
+ }
+ p++;
+ }
+ }
+#endif
}
else
strcpy(buffer, "(nil)");
{
gchar buffer[16];
gchar *pixel_size = "*", *point_size = "*", *fontname;
-
+ gchar *fam = family;
+#ifdef GDK_WINDOWING_WIN32
+ gchar *p, *q;
+#endif
+
if (size <= 0)
return NULL;
else
point_size = buffer;
+#ifdef GDK_WINDOWING_WIN32
+ fam = g_malloc (strlen (family) * 3 + 1);
+ p = fam;
+ q = family;
+ while (*q)
+ {
+ if (*q == '-' || *q == '*' || *q == '?' || *q == '%')
+ p += sprintf (p, "%%%.02x", *q);
+ else
+ *p++ = *q;
+ q++;
+ }
+ *p = '\0';
+#endif
fontname = g_strdup_printf ("-%s-%s-%s-%s-%s-*-%s-%s-*-*-%s-*-%s",
- foundry, family, weight, slant,
+ foundry, fam, weight, slant,
set_width, pixel_size, point_size,
spacing, charset);
+#ifdef GDK_WINDOWING_WIN32
+ g_free (fam);
+#endif
return fontname;
}
* GtkFontSelectionDialog
*****************************************************************************/
-guint
+GtkType
gtk_font_selection_dialog_get_type (void)
{
static guint font_selection_dialog_type = 0;