chiark / gitweb /
Patches for GTK 2. Puzzles already _built_ under GTK 2, but now it
[sgt-puzzles.git] / gtk.c
diff --git a/gtk.c b/gtk.c
index 72fdcdd832e1de7119c4a906a28ae7898aa1bd0e..1a74d87d83ed3c952a2411867dd3afa79bb58c9a 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"
 
 /* ----------------------------------------------------------------------
@@ -73,6 +78,14 @@ struct frontend {
     GtkWidget *cfgbox;
 };
 
+void get_random_seed(void **randseed, int *randseedsize)
+{
+    time_t *tp = snew(time_t);
+    time(tp);
+    *randseed = (void *)tp;
+    *randseedsize = sizeof(time_t);
+}
+
 void frontend_default_colour(frontend *fe, float *output)
 {
     GdkColor col = fe->window->style->bg[GTK_STATE_NORMAL];
@@ -145,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");
     }
 
     /*
@@ -772,12 +833,10 @@ static frontend *new_window(char *game_id, char **error)
     GtkBox *vbox;
     GtkWidget *menubar, *menu, *menuitem;
     int x, y, n;
-    time_t t;
 
     fe = snew(frontend);
 
-    time(&t);
-    fe->me = midend_new(fe, &t, sizeof(t));
+    fe->me = midend_new(fe, &thegame);
     if (game_id) {
         *error = midend_game_id(fe->me, game_id, FALSE);
         if (*error) {
@@ -789,7 +848,7 @@ static frontend *new_window(char *game_id, char **error)
     midend_new_game(fe->me);
 
     fe->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-    gtk_window_set_title(GTK_WINDOW(fe->window), game_name);
+    gtk_window_set_title(GTK_WINDOW(fe->window), thegame.name);
 #if 0
     gtk_window_set_resizable(GTK_WINDOW(fe->window), FALSE);
 #else
@@ -821,7 +880,7 @@ static frontend *new_window(char *game_id, char **error)
                       GTK_SIGNAL_FUNC(menu_config_event), fe);
     gtk_widget_show(menuitem);
 
-    if ((n = midend_num_presets(fe->me)) > 0 || game_can_configure) {
+    if ((n = midend_num_presets(fe->me)) > 0 || thegame.can_configure) {
         GtkWidget *submenu;
         int i;
 
@@ -846,7 +905,7 @@ static frontend *new_window(char *game_id, char **error)
             gtk_widget_show(menuitem);
         }
 
-       if (game_can_configure) {
+       if (thegame.can_configure) {
             menuitem = gtk_menu_item_new_with_label("Custom...");
             gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
                                GPOINTER_TO_INT(CFG_SETTINGS));