ref: 37a0c1af6a8b6d4f9ab2ab2adb3218b44bc64a04
parent: 8b31b4606c1e2fc927b4dc6e5c3e2df3adf1cf8b
author: Simon Tatham <anakin@pobox.com>
date: Wed Apr 27 15:39:20 EDT 2005
Patches for GTK 2. Puzzles already _built_ under GTK 2, but now it builds better: - the GTK makefile now defines $(GTK_CONFIG) which you can override, so you can build for GTK 2 with no makefile-editing simply by running `make GTK_CONFIG="pkg_config gtk+-2.0"' - we use Pango to find appropriate fonts, which means the text in the puzzles actually (gasp!) adapts its size to the circumstances. Unfortunately, I've been unable to do this portably without depending on _either_ a Pango function that isn't present in older versions _or_ the underlying window system being X11; I'd appreciate someone doing better. [originally from svn r5693]
--- a/gtk.c
+++ b/gtk.c
@@ -14,6 +14,11 @@
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
+#if GTK_CHECK_VERSION(2,0,0) && !defined HAVE_SENSIBLE_ABSOLUTE_SIZE_FUNCTION
+#include <gdk/gdkx.h>
+#include <X11/Xlib.h>
+#endif
+
#include "puzzles.h"
/* ----------------------------------------------------------------------
@@ -153,11 +158,59 @@
fe->fonts[i].type = fonttype;
fe->fonts[i].size = fontsize;
+#if GTK_CHECK_VERSION(2,0,0)
/*
- * FIXME: Really I should make at least _some_ effort to
- * pick the correct font.
+ * Use Pango to find the closest match to the requested
+ * font.
*/
- fe->fonts[i].font = gdk_font_load("variable");
+ {
+ PangoFontDescription *fd;
+
+ fd = pango_font_description_new();
+ /* `Monospace' and `Sans' are meta-families guaranteed to exist */
+ pango_font_description_set_family(fd, fonttype == FONT_FIXED ?
+ "Monospace" : "Sans");
+ /*
+ * I found some online Pango documentation which
+ * described a function called
+ * pango_font_description_set_absolute_size(), which is
+ * _exactly_ what I want here. Unfortunately, none of
+ * my local Pango installations have it (presumably
+ * they're too old), so I'm going to have to hack round
+ * it by figuring out the point size myself. This
+ * limits me to X and probably also breaks in later
+ * Pango installations, so ideally I should add another
+ * CHECK_VERSION type ifdef and use set_absolute_size
+ * where available. All very annoying.
+ */
+#ifdef HAVE_SENSIBLE_ABSOLUTE_SIZE_FUNCTION
+ pango_font_description_set_absolute_size(fd, PANGO_SCALE*fontsize);
+#else
+ {
+ Display *d = GDK_DISPLAY();
+ int s = DefaultScreen(d);
+ double resolution =
+ (PANGO_SCALE * 72.27 / 25.4) *
+ ((double) DisplayWidthMM(d, s) / DisplayWidth (d, s));
+ pango_font_description_set_size(fd, resolution * fontsize);
+ }
+#endif
+ fe->fonts[i].font = gdk_font_from_description(fd);
+ pango_font_description_free(fd);
+ }
+
+ if (!fe->fonts[i].font)
+#endif
+ /*
+ * In GTK 1.2, I don't know of any plausible way to
+ * pick a suitable font, so I'm just going to be
+ * tedious.
+ *
+ * This is also fallback code called if the Pango
+ * approach fails to find an appropriate font.
+ */
+ fe->fonts[i].font = gdk_font_load(fonttype == FONT_FIXED ?
+ "fixed" : "variable");
}
/*
--- a/mkfiles.pl
+++ b/mkfiles.pl
@@ -874,11 +874,12 @@
"# You can define this path to point at your tools if you need to\n".
"# TOOLPATH = /opt/gcc/bin\n".
"CC = \$(TOOLPATH)cc\n".
+ "GTK_CONFIG = gtk-config\n".
"\n".
&splitline("CFLAGS = -O2 -Wall -Werror -g " .
(join " ", map {"-I$dirpfx$_"} @srcdirs) .
- " `gtk-config --cflags`")."\n".
- "XLDFLAGS = `gtk-config --libs`\n".
+ " `\$(GTK_CONFIG) --cflags`")."\n".
+ "XLDFLAGS = `\$(GTK_CONFIG) --libs`\n".
"ULDFLAGS =#\n".
"INSTALL=install\n",
"INSTALL_PROGRAM=\$(INSTALL)\n",