#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)
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 (!fe)
return; /* can happen due to --generate */
if (fe->timer_active)
- gtk_timeout_remove(fe->timer_id);
+ g_source_remove(fe->timer_id);
fe->timer_active = FALSE;
}
if (!fe)
return; /* can happen due to --generate */
if (!fe->timer_active) {
- fe->timer_id = gtk_timeout_add(20, timer_func, fe);
+ fe->timer_id = g_timeout_add(20, timer_func, fe);
gettimeofday(&fe->last_time, NULL);
}
fe->timer_active = TRUE;
g_signal_connect(G_OBJECT(w), "clicked",
G_CALLBACK(config_ok_button_clicked), fe);
+#if GTK_CHECK_VERSION(3,0,0)
+ table = gtk_grid_new();
+#else
table = gtk_table_new(1, 2, FALSE);
+#endif
y = 0;
gtk_box_pack_start
(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(fe->cfgbox))),
gtk_widget_show(table);
for (i = fe->cfg; i->type != C_END; i++) {
+#if !GTK_CHECK_VERSION(3,0,0)
gtk_table_resize(GTK_TABLE(table), y+1, 2);
+#endif
switch (i->type) {
case C_STRING:
w = gtk_label_new(i->name);
gtk_misc_set_alignment(GTK_MISC(w), 0.0, 0.5);
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_grid_attach(GTK_GRID(table), w, 0, y, 1, 1);
+#else
gtk_table_attach(GTK_TABLE(table), w, 0, 1, y, y+1,
GTK_SHRINK | GTK_FILL,
GTK_EXPAND | GTK_SHRINK | GTK_FILL,
3, 3);
+#endif
gtk_widget_show(w);
w = gtk_entry_new();
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_grid_attach(GTK_GRID(table), w, 1, y, 1, 1);
+ g_object_set(G_OBJECT(w), "hexpand", TRUE, (const char *)NULL);
+#else
gtk_table_attach(GTK_TABLE(table), w, 1, 2, y, y+1,
GTK_EXPAND | GTK_SHRINK | GTK_FILL,
GTK_EXPAND | GTK_SHRINK | GTK_FILL,
3, 3);
+#endif
gtk_entry_set_text(GTK_ENTRY(w), i->sval);
g_signal_connect(G_OBJECT(w), "changed",
G_CALLBACK(editbox_changed), i);
w = gtk_check_button_new_with_label(i->name);
g_signal_connect(G_OBJECT(w), "toggled",
G_CALLBACK(button_toggled), i);
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_grid_attach(GTK_GRID(table), w, 0, y, 2, 1);
+ g_object_set(G_OBJECT(w), "hexpand", TRUE, (const char *)NULL);
+#else
gtk_table_attach(GTK_TABLE(table), w, 0, 2, y, y+1,
GTK_EXPAND | GTK_SHRINK | GTK_FILL,
GTK_EXPAND | GTK_SHRINK | GTK_FILL,
3, 3);
+#endif
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), i->ival);
gtk_widget_show(w);
break;
w = gtk_label_new(i->name);
gtk_misc_set_alignment(GTK_MISC(w), 0.0, 0.5);
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_grid_attach(GTK_GRID(table), w, 0, y, 1, 1);
+#else
gtk_table_attach(GTK_TABLE(table), w, 0, 1, y, y+1,
GTK_SHRINK | GTK_FILL,
GTK_EXPAND | GTK_SHRINK | GTK_FILL ,
3, 3);
+#endif
gtk_widget_show(w);
{
G_CALLBACK(droplist_sel), i);
}
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_grid_attach(GTK_GRID(table), w, 1, y, 1, 1);
+ g_object_set(G_OBJECT(w), "hexpand", TRUE, (const char *)NULL);
+#else
gtk_table_attach(GTK_TABLE(table), w, 1, 2, y, y+1,
GTK_EXPAND | GTK_SHRINK | GTK_FILL,
GTK_EXPAND | GTK_SHRINK | GTK_FILL,
3, 3);
+#endif
gtk_widget_show(w);
break;
}
}
}
+#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;