#endif
#if GTK_CHECK_VERSION(2,8,0)
# define USE_CAIRO
-# if defined(GDK_DISABLE_DEPRECATED)
+# if GTK_CHECK_VERSION(3,0,0) || defined(GDK_DISABLE_DEPRECATED)
# define USE_CAIRO_WITHOUT_PIXMAP
# endif
#endif
#ifdef OLD_FILESEL
char *filesel_name;
#endif
- int drawing_area_shrink_pending;
GSList *preset_radio;
int n_preset_menu_items;
int preset_threaded;
GtkWidget *preset_custom;
GtkWidget *copy_menu_item;
+#if !GTK_CHECK_VERSION(3,0,0)
+ int drawing_area_shrink_pending;
int menubar_is_local;
+#endif
};
struct blitter {
void frontend_default_colour(frontend *fe, float *output)
{
+#if !GTK_CHECK_VERSION(3,0,0)
+ /*
+ * Use the widget style's default background colour as the
+ * background for the puzzle drawing area.
+ */
GdkColor col = gtk_widget_get_style(fe->window)->bg[GTK_STATE_NORMAL];
output[0] = col.red / 65535.0;
output[1] = col.green / 65535.0;
output[2] = col.blue / 65535.0;
+#else
+ /*
+ * GTK 3 has decided that there's no such thing as a 'default
+ * background colour' any more, because widget styles might set
+ * the background to something more complicated like a background
+ * image. We don't want to get into overlaying our entire puzzle
+ * on an arbitrary background image, so we'll just make up a
+ * reasonable shade of grey.
+ */
+ output[0] = output[1] = output[2] = 0.9F;
+#endif
}
void gtk_status_bar(void *handle, char *text)
static void set_window_background(frontend *fe, int colour)
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GdkRGBA rgba;
+ rgba.red = fe->colours[3*colour + 0];
+ rgba.green = fe->colours[3*colour + 1];
+ rgba.blue = fe->colours[3*colour + 2];
+ rgba.alpha = 1.0;
+ gdk_window_set_background_rgba(gtk_widget_get_window(fe->area), &rgba);
+ gdk_window_set_background_rgba(gtk_widget_get_window(fe->window), &rgba);
+#else
GdkColormap *colmap;
colmap = gdk_colormap_get_system();
&fe->background);
gdk_window_set_background(gtk_widget_get_window(fe->window),
&fe->background);
+#endif
}
static PangoLayout *make_pango_layout(frontend *fe)
return TRUE;
}
+#if GTK_CHECK_VERSION(3,0,0)
+static gint draw_area(GtkWidget *widget, cairo_t *cr, gpointer data)
+{
+ frontend *fe = (frontend *)data;
+ GdkRectangle dirtyrect;
+
+ gdk_cairo_get_clip_rectangle(cr, &dirtyrect);
+ cairo_set_source_surface(cr, fe->image, fe->ox, fe->oy);
+ cairo_rectangle(cr, dirtyrect.x, dirtyrect.y,
+ dirtyrect.width, dirtyrect.height);
+ cairo_fill(cr);
+
+ return TRUE;
+}
+#else
static gint expose_area(GtkWidget *widget, GdkEventExpose *event,
gpointer data)
{
}
return TRUE;
}
+#endif
static gint map_window(GtkWidget *widget, GdkEvent *event,
gpointer data)
}
}
+#if !GTK_CHECK_VERSION(3,0,0)
static gboolean not_size_allocated_yet(GtkWidget *w)
{
/*
fe->drawing_area_shrink_pending = FALSE;
}
}
+#endif /* !GTK_CHECK_VERSION(3,0,0) */
static gint configure_window(GtkWidget *widget,
GdkEventConfigure *event, gpointer data)
{
- frontend *fe = (frontend *)data;
+#if !GTK_CHECK_VERSION(3,0,0)
/*
* When the main puzzle window changes size, it might be because
* the menu bar or status bar has turned up after starting off
* absent, in which case we should have another go at enacting a
* pending shrink of the drawing area.
*/
+ frontend *fe = (frontend *)data;
try_shrink_drawing_area(fe);
+#endif
return FALSE;
}
int x, y;
get_size(fe, &x, &y);
+
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_window_resize_to_geometry(GTK_WINDOW(fe->window), x, y);
+#else
fe->w = x;
fe->h = y;
fe->drawing_area_shrink_pending = FALSE;
}
fe->drawing_area_shrink_pending = TRUE;
try_shrink_drawing_area(fe);
+#endif
}
static void menu_preset_event(GtkMenuItem *menuitem, gpointer data)
midend_new_game(fe->me);
}
+#if !GTK_CHECK_VERSION(3,0,0)
{
/*
* try_shrink_drawing_area() will do some fiddling with the
fe->menubar_is_local = !unity_mode;
}
}
+#endif
fe->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(fe->window), thegame.name);
#if GTK_CHECK_VERSION(2,0,0)
gtk_widget_set_double_buffered(fe->area, FALSE);
#endif
+ {
+ GdkGeometry geom;
+ geom.base_width = geom.base_height = 0;
+ gtk_window_set_geometry_hints(GTK_WINDOW(fe->window), fe->area,
+ &geom, GDK_HINT_BASE_SIZE);
+ }
get_size(fe, &x, &y);
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_window_set_default_geometry(GTK_WINDOW(fe->window), x, y);
+#else
fe->drawing_area_shrink_pending = FALSE;
gtk_drawing_area_size(GTK_DRAWING_AREA(fe->area), x, y);
+#endif
fe->w = x;
fe->h = y;
G_CALLBACK(selection_get), fe);
g_signal_connect(G_OBJECT(fe->area), "selection_clear_event",
G_CALLBACK(selection_clear), fe);
+#if GTK_CHECK_VERSION(3,0,0)
+ g_signal_connect(G_OBJECT(fe->area), "draw",
+ G_CALLBACK(draw_area), fe);
+#else
g_signal_connect(G_OBJECT(fe->area), "expose_event",
G_CALLBACK(expose_area), fe);
+#endif
g_signal_connect(G_OBJECT(fe->window), "map_event",
G_CALLBACK(map_window), fe);
g_signal_connect(G_OBJECT(fe->area), "configure_event",
gtk_widget_show(fe->area);
gtk_widget_show(fe->window);
+#if !GTK_CHECK_VERSION(3,0,0)
fe->drawing_area_shrink_pending = TRUE;
try_shrink_drawing_area(fe);
+#endif
+
set_window_background(fe, 0);
return fe;