diff options
author | Dominic Lachowicz <domlachowicz@gmail.com> | 2008-09-18 15:28:19 +0000 |
---|---|---|
committer | Dom Lachowicz <doml@src.gnome.org> | 2008-09-18 15:28:19 +0000 |
commit | 8bfc826f27d18ba7f1ca08895bab526f5b238b3a (patch) | |
tree | a6543c8fa18857bd40e856402f5c1c55c7684bc2 /modules/engines | |
parent | 9194e5ac44d087e19f2be7da83b93e3a5c74ffed (diff) | |
download | gtk+-8bfc826f27d18ba7f1ca08895bab526f5b238b3a.tar.gz |
Revert most of previous patch, as it didn't work as expected; Some work
2008-09-18 Dominic Lachowicz <domlachowicz@gmail.com>
* modules/engines/ms-windows/*: Revert most of previous patch, as it didn't work as expected;
Some work toward #531086 - the new GtkTooltip widget doesn't theme properly on win32. Now, at least
the background color seems okay
w
svn path=/trunk/; revision=21430
Diffstat (limited to 'modules/engines')
-rwxr-xr-x | modules/engines/ms-windows/Makefile.msc | 4 | ||||
-rwxr-xr-x | modules/engines/ms-windows/msw_style.c | 369 |
2 files changed, 333 insertions, 40 deletions
diff --git a/modules/engines/ms-windows/Makefile.msc b/modules/engines/ms-windows/Makefile.msc index 0fc64201e4..965faf14ea 100755 --- a/modules/engines/ms-windows/Makefile.msc +++ b/modules/engines/ms-windows/Makefile.msc @@ -38,9 +38,7 @@ GTK_LIBS= \ pango-1.0.lib \ gobject-2.0.lib \ gmodule-2.0.lib \ - glib-2.0.lib \ - intl.lib \ - iconv.lib + glib-2.0.lib ## # WIN32 diff --git a/modules/engines/ms-windows/msw_style.c b/modules/engines/ms-windows/msw_style.c index 589633f571..f1e3c99662 100755 --- a/modules/engines/ms-windows/msw_style.c +++ b/modules/engines/ms-windows/msw_style.c @@ -39,8 +39,7 @@ #include <stdio.h> #include "gtk/gtk.h" - -#include <pango/pangowin32.h> +#include "gtk/gtk.h" #ifdef BUILDING_STANDALONE #include "gdk/gdkwin32.h" @@ -179,55 +178,349 @@ static struct }; static gboolean -get_system_font (XpThemeClass klazz, XpThemeFont type, LOGFONTA *out_lf) -{ - NONCLIENTMETRICS ncm; - - ncm.cbSize = sizeof (NONCLIENTMETRICS); - - if (SystemParametersInfo (SPI_GETNONCLIENTMETRICS, - sizeof (NONCLIENTMETRICS), &ncm, 0)) - { - if (type == XP_THEME_FONT_CAPTION) - *out_lf = ncm.lfCaptionFont; - else if (type == XP_THEME_FONT_MENU) - *out_lf = ncm.lfMenuFont; - else if (type == XP_THEME_FONT_STATUS) - *out_lf = ncm.lfStatusFont; - else - *out_lf = ncm.lfMessageFont; - +get_system_font (XpThemeClass klazz, XpThemeFont type, LOGFONT *out_lf) +{ +#if 0 + /* TODO: this causes crashes later because the font name is in UCS2, and + the pango fns don't deal with that gracefully */ + if (xp_theme_get_system_font (klazz, type, out_lf)) + { return TRUE; } + else +#endif + { + NONCLIENTMETRICS ncm; + + ncm.cbSize = sizeof (NONCLIENTMETRICS); + + if (SystemParametersInfo (SPI_GETNONCLIENTMETRICS, + sizeof (NONCLIENTMETRICS), &ncm, 0)) + { + if (type == XP_THEME_FONT_CAPTION) + *out_lf = ncm.lfCaptionFont; + else if (type == XP_THEME_FONT_MENU) + *out_lf = ncm.lfMenuFont; + else if (type == XP_THEME_FONT_STATUS) + *out_lf = ncm.lfStatusFont; + else + *out_lf = ncm.lfMessageFont; + + return TRUE; + } + } return FALSE; } -static char * -sys_font_to_pango_font (XpThemeClass klazz, XpThemeFont type, char *buf, - size_t bufsiz) +/***************************** BEGIN STOLEN FROM PANGO *****************************/ + +/* + This code is stolen from Pango 1.4. It attempts to address the following problems: + + http://bugzilla.gnome.org/show_bug.cgi?id=135098 + http://sourceforge.net/tracker/index.php?func=detail&aid=895762&group_id=76416&atid=547655 + + As Owen suggested in bug 135098, once Pango 1.6 is released, we need to get rid of this code. +*/ + +#define PING(printlist) + +/* TrueType defines: */ + +#define MAKE_TT_TABLE_NAME(c1, c2, c3, c4) \ + (((guint32)c4) << 24 | ((guint32)c3) << 16 | ((guint32)c2) << 8 | ((guint32)c1)) + +#define CMAP (MAKE_TT_TABLE_NAME('c','m','a','p')) +#define CMAP_HEADER_SIZE 4 + +#define NAME (MAKE_TT_TABLE_NAME('n','a','m','e')) +#define NAME_HEADER_SIZE 6 + +#define ENCODING_TABLE_SIZE 8 + +#define APPLE_UNICODE_PLATFORM_ID 0 +#define MACINTOSH_PLATFORM_ID 1 +#define ISO_PLATFORM_ID 2 +#define MICROSOFT_PLATFORM_ID 3 + +#define SYMBOL_ENCODING_ID 0 +#define UNICODE_ENCODING_ID 1 +#define UCS4_ENCODING_ID 10 + +struct name_header { - LOGFONTW lfw; - LOGFONTA lfa; - PangoFontDescription* pfd = NULL; + guint16 format_selector; + guint16 num_records; + guint16 string_storage_offset; +}; - if (xp_theme_get_system_font (klazz, type, &lfw)) +struct name_record +{ + guint16 platform_id; + guint16 encoding_id; + guint16 language_id; + guint16 name_id; + guint16 string_length; + guint16 string_offset; +}; + +static gboolean +pango_win32_get_name_header (HDC hdc, struct name_header *header) +{ + if (GetFontData (hdc, NAME, 0, header, sizeof (*header)) != sizeof (*header)) + return FALSE; + + header->num_records = GUINT16_FROM_BE (header->num_records); + header->string_storage_offset = GUINT16_FROM_BE (header->string_storage_offset); + + return TRUE; +} + +static gboolean +pango_win32_get_name_record (HDC hdc, gint i, struct name_record *record) +{ + if (GetFontData (hdc, NAME, 6 + i * sizeof (*record), + record, sizeof (*record)) != sizeof (*record)) { - pfd = pango_win32_font_description_from_logfontw(&lfw); + return FALSE; } - else if (get_system_font (klazz, type, &lfa)) + + record->platform_id = GUINT16_FROM_BE (record->platform_id); + record->encoding_id = GUINT16_FROM_BE (record->encoding_id); + record->language_id = GUINT16_FROM_BE (record->language_id); + record->name_id = GUINT16_FROM_BE (record->name_id); + record->string_length = GUINT16_FROM_BE (record->string_length); + record->string_offset = GUINT16_FROM_BE (record->string_offset); + + return TRUE; +} + +static gchar * +get_family_name (LOGFONT *lfp, HDC pango_win32_hdc) +{ + HFONT hfont; + HFONT oldhfont; + + struct name_header header; + struct name_record record; + + gint unicode_ix = -1, mac_ix = -1, microsoft_ix = -1; + gint name_ix; + gchar *codeset; + + gchar *string = NULL; + gchar *name; + + size_t i, l, nbytes; + + /* If lfFaceName is ASCII, assume it is the common (English) name for the + font. Is this valid? Do some TrueType fonts have different names in + French, German, etc, and does the system return these if the locale is + set to use French, German, etc? */ + l = strlen (lfp->lfFaceName); + for (i = 0; i < l; i++) { - pfd = pango_win32_font_description_from_logfont(&lfa); + if (lfp->lfFaceName[i] < ' ' || lfp->lfFaceName[i] > '~') + { + break; + } } - if (pfd) + if (i == l) + return g_strdup (lfp->lfFaceName); + + if ((hfont = CreateFontIndirect (lfp)) == NULL) + goto fail0; + + if ((oldhfont = (HFONT) SelectObject (pango_win32_hdc, hfont)) == NULL) + goto fail1; + + if (!pango_win32_get_name_header (pango_win32_hdc, &header)) + goto fail2; + + PING (("%d name records", header.num_records)); + + for (i = 0; i < header.num_records; i++) { - char *s; + if (!pango_win32_get_name_record (pango_win32_hdc, i, &record)) + goto fail2; + + if ((record.name_id != 1 && record.name_id != 16) || record.string_length <= 0) + continue; + + PING (("platform:%d encoding:%d language:%04x name_id:%d", + record.platform_id, record.encoding_id, record.language_id, + record.name_id)); + + if (record.platform_id == APPLE_UNICODE_PLATFORM_ID || + record.platform_id == ISO_PLATFORM_ID) + { + unicode_ix = i; + } + else if (record.platform_id == MACINTOSH_PLATFORM_ID && record.encoding_id == 0 && /* Roman + */ + record.language_id == 0) /* English */ + { + mac_ix = i; + } + else if (record.platform_id == MICROSOFT_PLATFORM_ID) + { + if ((microsoft_ix == -1 || + PRIMARYLANGID (record.language_id) == LANG_ENGLISH) && + (record.encoding_id == SYMBOL_ENCODING_ID || + record.encoding_id == UNICODE_ENCODING_ID || + record.encoding_id == UCS4_ENCODING_ID)) + { + microsoft_ix = i; + } + } + } + + if (microsoft_ix >= 0) + name_ix = microsoft_ix; + else if (mac_ix >= 0) + name_ix = mac_ix; + else if (unicode_ix >= 0) + name_ix = unicode_ix; + else + goto fail2; + + if (!pango_win32_get_name_record (pango_win32_hdc, name_ix, &record)) + goto fail2; + + string = g_malloc (record.string_length + 1); + if (GetFontData (pango_win32_hdc, NAME, + header.string_storage_offset + record.string_offset, + string, record.string_length) != record.string_length) + goto fail2; + + string[record.string_length] = '\0'; + + if (name_ix == microsoft_ix) + { + if (record.encoding_id == SYMBOL_ENCODING_ID || + record.encoding_id == UNICODE_ENCODING_ID) + { + codeset = "UTF-16BE"; + } + else + { + codeset = "UCS-4BE"; + } + } + else if (name_ix == mac_ix) + { + codeset = "MacRoman"; + } + else /* name_ix == unicode_ix */ + { + codeset = "UCS-4BE"; + } + + + name = g_convert (string, record.string_length, "UTF-8", codeset, NULL, + &nbytes, NULL); + if (name == NULL) + goto fail2; + + g_free (string); + + PING (("%s", name)); + + SelectObject (pango_win32_hdc, oldhfont); + DeleteObject (hfont); + + return name; + +fail2: + g_free (string); + SelectObject (pango_win32_hdc, oldhfont); + +fail1: + DeleteObject (hfont); + +fail0: + return g_locale_to_utf8 (lfp->lfFaceName, -1, NULL, NULL, NULL); +} + +/***************************** END STOLEN FROM PANGO *****************************/ + +static char * +sys_font_to_pango_font (XpThemeClass klazz, XpThemeFont type, char *buf, + size_t bufsiz) +{ + HDC hDC; + HWND hwnd; + LOGFONT lf; + int pt_size; + const char *weight; + const char *style; + char *font; + + if (get_system_font (klazz, type, &lf)) + { + switch (lf.lfWeight) + { + case FW_THIN: + case FW_EXTRALIGHT: + weight = "Ultra-Light"; + break; + + case FW_LIGHT: + weight = "Light"; + break; + + case FW_BOLD: + weight = "Bold"; + break; + + case FW_SEMIBOLD: + weight = "Semi-Bold"; + break; + + case FW_ULTRABOLD: + weight = "Ultra-Bold"; + break; + + case FW_HEAVY: + weight = "Heavy"; + break; + + default: + weight = ""; + break; + } + + if (lf.lfItalic) + style = "Italic"; + else + style = ""; + + hwnd = GetDesktopWindow (); + hDC = GetDC (hwnd); + if (hDC) + { + pt_size = -MulDiv (lf.lfHeight, 72, + GetDeviceCaps (hDC, LOGPIXELSY)); + } + else + { + pt_size = 10; + } + + font = get_family_name (&lf, hDC); + + if (hDC) + ReleaseDC (hwnd, hDC); + + if (!(font && *font)) + return NULL; - s = pango_font_description_to_string(pfd); - pango_font_description_free(pfd); + g_snprintf (buf, bufsiz, "%s %s %s %d", font, style, weight, pt_size); + g_free (font); - return s; + return buf; } return NULL; @@ -488,7 +781,8 @@ setup_msw_rc_style (void) g_snprintf (buf, sizeof (buf), "style \"msw-tooltips-caption\" = \"msw-default\"\n" "{fg[NORMAL] = { %d, %d, %d }\n" "%s = \"%s\"\n" - "}widget \"gtk-tooltips.GtkLabel\" style \"msw-tooltips-caption\"\n", + "}widget \"gtk-tooltips.GtkLabel\" style \"msw-tooltips-caption\"\n" + "widget \"gtk-tooltip.GtkLabel\" style \"msw-tooltips-caption\"\n", tooltip_fore.red, tooltip_fore.green, tooltip_fore.blue, (font_ptr ? "font_name" : "#"), (font_ptr ? font_ptr : " font name should go here")); @@ -497,7 +791,8 @@ setup_msw_rc_style (void) g_snprintf (buf, sizeof (buf), "style \"msw-tooltips\" = \"msw-default\"\n" "{bg[NORMAL] = { %d, %d, %d }\n" - "}widget \"gtk-tooltips*\" style \"msw-tooltips\"\n", + "}widget \"gtk-tooltips*\" style \"msw-tooltips\"\n" + "widget \"gtk-tooltip*\" style \"msw-tooltips\"\n", tooltip_back.red, tooltip_back.green, tooltip_back.blue); gtk_rc_parse_string (buf); |