Patches for GTK 2. Puzzles already _built_ under GTK 2, but now it
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 27 Apr 2005 19:39:20 +0000 (19:39 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 27 Apr 2005 19:39:20 +0000 (19:39 +0000)
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.

git-svn-id: svn://svn.tartarus.org/sgt/puzzles@5693 cda61777-01e9-0310-a592-d414129be87e

gtk.c
mkfiles.pl

diff --git a/gtk.c b/gtk.c
index 3c777af..1a74d87 100644 (file)
--- a/gtk.c
+++ b/gtk.c
 #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 @@ void draw_text(frontend *fe, int x, int y, int fonttype, int fontsize,
         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");
     }
 
     /*
index 78a8b8e..afacbba 100755 (executable)
@@ -874,11 +874,12 @@ if (defined $makefiles{'gtk'}) {
     "# 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",