]> Pileus Git - ~andy/gtk/commitdiff
Revert most of previous patch, as it didn't work as expected; Some work
authorDominic Lachowicz <domlachowicz@gmail.com>
Thu, 18 Sep 2008 15:28:19 +0000 (15:28 +0000)
committerDom Lachowicz <doml@src.gnome.org>
Thu, 18 Sep 2008 15:28:19 +0000 (15:28 +0000)
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

ChangeLog
modules/engines/ms-windows/Makefile.msc
modules/engines/ms-windows/msw_style.c

index 6cbf8b751fb133c49f3689b89ba382a5fd735b74..14fb93c0bc62ad852a6c6e1ee97c34108b8a9c9e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,12 @@
 2008-09-18  Dominic Lachowicz  <domlachowicz@gmail.com>
 
-       * modules/engins/ms-windows/*: MS Windows style should use pango_win32_font_description_from_logfont;
+       * 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
+       
+2008-09-18  Dominic Lachowicz  <domlachowicz@gmail.com>
+
+       * modules/engines/ms-windows/*: MS Windows style should use pango_win32_font_description_from_logfont;
        Allows us to rip out a lot of potentially buggy code, and also get the font specification from the
        XP theme (#434987)
        
index 0fc64201e4346e8529810f8d7de0c8dababb211a..965faf14ea8731376e3ff83ec246c0176fbf38e9 100755 (executable)
@@ -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
index 589633f57169d697b160618503d6a6d45ac40129..f1e3c996621c7521bb4d257fa9cb2bd4e610d90f 100755 (executable)
@@ -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);