X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;ds=sidebyside;f=gtk.c;h=74b48c1a21e53ffffa4807acb2e2e13e2d8ad46b;hb=3ce69e84cad15844282d691fa03e711c5353c05e;hp=d36be3d704ddcaf461323b2e5f97ea0570e9c3fd;hpb=3d0d54e3b407619fa859bf35b115d473afee63db;p=sgt-puzzles.git diff --git a/gtk.c b/gtk.c index d36be3d..74b48c1 100644 --- a/gtk.c +++ b/gtk.c @@ -39,11 +39,33 @@ #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 +#if GTK_CHECK_VERSION(3,0,0) +/* The old names are still more concise! */ +#define gtk_hbox_new(x,y) gtk_box_new(GTK_ORIENTATION_HORIZONTAL,y) +#define gtk_vbox_new(x,y) gtk_box_new(GTK_ORIENTATION_VERTICAL,y) +/* GTK 3 has retired stock button labels */ +#define LABEL_OK "_OK" +#define LABEL_CANCEL "_Cancel" +#define LABEL_NO "_No" +#define LABEL_YES "_Yes" +#define LABEL_SAVE "_Save" +#define LABEL_OPEN "_Open" +#define gtk_button_new_with_our_label gtk_button_new_with_mnemonic +#else +#define LABEL_OK GTK_STOCK_OK +#define LABEL_CANCEL GTK_STOCK_CANCEL +#define LABEL_NO GTK_STOCK_NO +#define LABEL_YES GTK_STOCK_YES +#define LABEL_SAVE GTK_STOCK_SAVE +#define LABEL_OPEN GTK_STOCK_OPEN +#define gtk_button_new_with_our_label gtk_button_new_from_stock +#endif + /* #undef USE_CAIRO */ /* #define NO_THICK_LINE */ #ifdef DEBUGGING @@ -156,13 +178,15 @@ struct frontend { #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 { @@ -184,10 +208,26 @@ void get_random_seed(void **randseed, int *randseedsize) 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) @@ -250,6 +290,15 @@ static void set_colour(frontend *fe, int colour) 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(); @@ -265,6 +314,7 @@ static void set_window_background(frontend *fe, int colour) &fe->background); gdk_window_set_background(gtk_widget_get_window(fe->window), &fe->background); +#endif } static PangoLayout *make_pango_layout(frontend *fe) @@ -1155,10 +1205,14 @@ static gint button_event(GtkWidget *widget, GdkEventButton *event, button = RIGHT_BUTTON; else if (event->button == 1) button = LEFT_BUTTON; + else if (event->button == 8 && event->type == GDK_BUTTON_PRESS) + button = 'u'; + else if (event->button == 9 && event->type == GDK_BUTTON_PRESS) + button = 'r'; else return FALSE; /* don't even know what button! */ - if (event->type == GDK_BUTTON_RELEASE) + if (event->type == GDK_BUTTON_RELEASE && button >= LEFT_BUTTON) button += LEFT_RELEASE - LEFT_BUTTON; if (!midend_process_key(fe->me, event->x - fe->ox, @@ -1198,6 +1252,21 @@ static gint motion_event(GtkWidget *widget, GdkEventMotion *event, 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) { @@ -1219,6 +1288,7 @@ static gint expose_area(GtkWidget *widget, GdkEventExpose *event, } return TRUE; } +#endif static gint map_window(GtkWidget *widget, GdkEvent *event, gpointer data) @@ -1240,22 +1310,22 @@ static gint configure_area(GtkWidget *widget, { frontend *fe = (frontend *)data; int x, y; + int oldw = fe->w, oldpw = fe->pw, oldh = fe->h, oldph = fe->ph; x = event->width; y = event->height; - - if (x != fe->w || y != fe->h || !backing_store_ok(fe)) { + fe->w = x; + fe->h = y; + midend_size(fe->me, &x, &y, TRUE); + fe->pw = x; + fe->ph = y; + fe->ox = (fe->w - fe->pw) / 2; + fe->oy = (fe->h - fe->ph) / 2; + + if (oldw != fe->w || oldpw != fe->pw || + oldh != fe->h || oldph != fe->ph || !backing_store_ok(fe)) { if (backing_store_ok(fe)) teardown_backing_store(fe); - - fe->w = x; - fe->h = y; - midend_size(fe->me, &x, &y, TRUE); - fe->pw = x; - fe->ph = y; - fe->ox = (fe->w - fe->pw) / 2; - fe->oy = (fe->h - fe->ph) / 2; - setup_backing_store(fe); } @@ -1286,7 +1356,7 @@ void deactivate_timer(frontend *fe) 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; } @@ -1295,7 +1365,7 @@ void activate_timer(frontend *fe) 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; @@ -1306,18 +1376,6 @@ static void window_destroy(GtkWidget *widget, gpointer data) gtk_main_quit(); } -static void msgbox_button_clicked(GtkButton *button, gpointer data) -{ - GtkWidget *window = GTK_WIDGET(data); - int v, *ip; - - ip = (int *)g_object_get_data(G_OBJECT(window), "user-data"); - v = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "user-data")); - *ip = v; - - gtk_widget_destroy(GTK_WIDGET(data)); -} - static int win_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { GObject *cancelbutton = G_OBJECT(data); @@ -1335,6 +1393,54 @@ static int win_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) enum { MB_OK, MB_YESNO }; +static void align_label(GtkLabel *label, double x, double y) +{ +#if GTK_CHECK_VERSION(3,16,0) + gtk_label_set_xalign(label, x); + gtk_label_set_yalign(label, y); +#elif GTK_CHECK_VERSION(3,14,0) + gtk_widget_set_halign(GTK_WIDGET(label), + x == 0 ? GTK_ALIGN_START : + x == 1 ? GTK_ALIGN_END : GTK_ALIGN_CENTER); + gtk_widget_set_valign(GTK_WIDGET(label), + y == 0 ? GTK_ALIGN_START : + y == 1 ? GTK_ALIGN_END : GTK_ALIGN_CENTER); +#else + gtk_misc_set_alignment(GTK_MISC(label), x, y); +#endif +} + +#if GTK_CHECK_VERSION(3,0,0) +int message_box(GtkWidget *parent, char *title, char *msg, int centre, + int type) +{ + GtkWidget *window; + gint ret; + + window = gtk_message_dialog_new + (GTK_WINDOW(parent), + (GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT), + (type == MB_OK ? GTK_MESSAGE_INFO : GTK_MESSAGE_QUESTION), + (type == MB_OK ? GTK_BUTTONS_OK : GTK_BUTTONS_YES_NO), + "%s", msg); + gtk_window_set_title(GTK_WINDOW(window), title); + ret = gtk_dialog_run(GTK_DIALOG(window)); + gtk_widget_destroy(window); + return (type == MB_OK ? TRUE : (ret == GTK_RESPONSE_YES)); +} +#else /* GTK_CHECK_VERSION(3,0,0) */ +static void msgbox_button_clicked(GtkButton *button, gpointer data) +{ + GtkWidget *window = GTK_WIDGET(data); + int v, *ip; + + ip = (int *)g_object_get_data(G_OBJECT(window), "user-data"); + v = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "user-data")); + *ip = v; + + gtk_widget_destroy(GTK_WIDGET(data)); +} + int message_box(GtkWidget *parent, char *title, char *msg, int centre, int type) { @@ -1344,7 +1450,7 @@ int message_box(GtkWidget *parent, char *title, char *msg, int centre, window = gtk_dialog_new(); text = gtk_label_new(msg); - gtk_misc_set_alignment(GTK_MISC(text), 0.0, 0.0); + align_label(GTK_LABEL(text), 0.0, 0.0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), text, FALSE, FALSE, 20); gtk_box_pack_start @@ -1356,18 +1462,18 @@ int message_box(GtkWidget *parent, char *title, char *msg, int centre, gtk_label_set_line_wrap(GTK_LABEL(text), TRUE); if (type == MB_OK) { - titles = GTK_STOCK_OK "\0"; + titles = LABEL_OK "\0"; def = cancel = 0; } else { assert(type == MB_YESNO); - titles = GTK_STOCK_NO "\0" GTK_STOCK_YES "\0"; + titles = LABEL_NO "\0" LABEL_YES "\0"; def = 1; cancel = 0; } i = 0; while (*titles) { - button = gtk_button_new_from_stock(titles); + button = gtk_button_new_with_our_label(titles); gtk_box_pack_end (GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(window))), button, FALSE, FALSE, 0); @@ -1398,6 +1504,7 @@ int message_box(GtkWidget *parent, char *title, char *msg, int centre, gtk_main(); return (type == MB_YESNO ? i == 1 : TRUE); } +#endif /* GTK_CHECK_VERSION(3,0,0) */ void error_box(GtkWidget *parent, char *msg) { @@ -1474,6 +1581,7 @@ static void droplist_sel(GtkComboBox *combo, gpointer data) static int get_config(frontend *fe, int which) { GtkWidget *w, *table, *cancel; + GtkBox *content_box, *button_box; char *title; config_item *i; int y; @@ -1482,38 +1590,57 @@ static int get_config(frontend *fe, int which) fe->cfg_which = which; fe->cfgret = FALSE; +#if GTK_CHECK_VERSION(3,0,0) + /* GtkDialog isn't quite flexible enough */ + fe->cfgbox = gtk_window_new(GTK_WINDOW_TOPLEVEL); + content_box = GTK_BOX(gtk_vbox_new(FALSE, 8)); + g_object_set(G_OBJECT(content_box), "margin", 8, (const char *)NULL); + gtk_widget_show(GTK_WIDGET(content_box)); + gtk_container_add(GTK_CONTAINER(fe->cfgbox), GTK_WIDGET(content_box)); + button_box = GTK_BOX(gtk_hbox_new(FALSE, 8)); + gtk_widget_show(GTK_WIDGET(button_box)); + gtk_box_pack_end(content_box, GTK_WIDGET(button_box), FALSE, FALSE, 0); + { + GtkWidget *sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL); + gtk_widget_show(sep); + gtk_box_pack_end(content_box, sep, FALSE, FALSE, 0); + } +#else fe->cfgbox = gtk_dialog_new(); + content_box = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(fe->cfgbox))); + button_box = GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(fe->cfgbox))); +#endif gtk_window_set_title(GTK_WINDOW(fe->cfgbox), title); sfree(title); - w = gtk_button_new_from_stock(GTK_STOCK_CANCEL); - gtk_box_pack_end - (GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(fe->cfgbox))), - w, FALSE, FALSE, 0); + w = gtk_button_new_with_our_label(LABEL_CANCEL); + gtk_box_pack_end(button_box, w, FALSE, FALSE, 0); gtk_widget_show(w); g_signal_connect(G_OBJECT(w), "clicked", G_CALLBACK(config_cancel_button_clicked), fe); cancel = w; - w = gtk_button_new_from_stock(GTK_STOCK_OK); - gtk_box_pack_end - (GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(fe->cfgbox))), - w, FALSE, FALSE, 0); + w = gtk_button_new_with_our_label(LABEL_OK); + gtk_box_pack_end(button_box, w, FALSE, FALSE, 0); gtk_widget_show(w); gtk_widget_set_can_default(w, TRUE); gtk_window_set_default(GTK_WINDOW(fe->cfgbox), w); 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))), - table, FALSE, FALSE, 0); + gtk_box_pack_start(content_box, table, FALSE, FALSE, 0); 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: @@ -1522,18 +1649,27 @@ static int get_config(frontend *fe, int which) */ w = gtk_label_new(i->name); - gtk_misc_set_alignment(GTK_MISC(w), 0.0, 0.5); + align_label(GTK_LABEL(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); @@ -1550,10 +1686,15 @@ static int get_config(frontend *fe, int which) 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; @@ -1564,11 +1705,15 @@ static int get_config(frontend *fe, int which) */ w = gtk_label_new(i->name); - gtk_misc_set_alignment(GTK_MISC(w), 0.0, 0.5); + align_label(GTK_LABEL(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); { @@ -1613,10 +1758,15 @@ static int get_config(frontend *fe, int which) 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; } @@ -1718,6 +1868,7 @@ static void changed_preset(frontend *fe) } } +#if !GTK_CHECK_VERSION(3,0,0) static gboolean not_size_allocated_yet(GtkWidget *w) { /* @@ -1766,18 +1917,21 @@ static void try_shrink_drawing_area(frontend *fe) 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; } @@ -1786,8 +1940,10 @@ static void resize_fe(frontend *fe) int x, y; get_size(fe, &x, &y); - fe->w = x; - fe->h = y; + +#if GTK_CHECK_VERSION(3,0,0) + gtk_window_resize_to_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); { @@ -1797,6 +1953,7 @@ static void resize_fe(frontend *fe) } fe->drawing_area_shrink_pending = TRUE; try_shrink_drawing_area(fe); +#endif } static void menu_preset_event(GtkMenuItem *menuitem, gpointer data) @@ -1942,14 +2099,15 @@ static char *file_selector(frontend *fe, char *title, int save) GTK_WINDOW(fe->window), save ? GTK_FILE_CHOOSER_ACTION_SAVE : GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - save ? GTK_STOCK_SAVE : GTK_STOCK_OPEN, + LABEL_CANCEL, GTK_RESPONSE_CANCEL, + save ? LABEL_SAVE : LABEL_OPEN, GTK_RESPONSE_ACCEPT, NULL); if (gtk_dialog_run(GTK_DIALOG(filesel)) == GTK_RESPONSE_ACCEPT) { - const char *name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filesel)); + char *name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filesel)); filesel_name = dupstr(name); + g_free(name); } gtk_widget_destroy(filesel); @@ -1999,15 +2157,14 @@ static void menu_save_event(GtkMenuItem *menuitem, gpointer data) " file \"%.*s\"?", FILENAME_MAX, name); if (!message_box(fe->window, "Question", buf, TRUE, MB_YESNO)) - return; + goto free_and_return; } fp = fopen(name, "w"); - sfree(name); if (!fp) { error_box(fe->window, "Unable to open save file"); - return; + goto free_and_return; } { @@ -2021,10 +2178,11 @@ static void menu_save_event(GtkMenuItem *menuitem, gpointer data) sprintf(boxmsg, "Error writing save file: %.400s", strerror(errno)); error_box(fe->window, boxmsg); - return; + goto free_and_return; } } - + free_and_return: + sfree(name); } } @@ -2097,6 +2255,21 @@ static void menu_config_event(GtkMenuItem *menuitem, gpointer data) static void menu_about_event(GtkMenuItem *menuitem, gpointer data) { frontend *fe = (frontend *)data; + +#if GTK_CHECK_VERSION(3,0,0) + extern char *const *const xpm_icons[]; + extern const int n_xpm_icons; + GdkPixbuf *icon = gdk_pixbuf_new_from_xpm_data + ((const gchar **)xpm_icons[n_xpm_icons-1]); + gtk_show_about_dialog + (GTK_WINDOW(fe->window), + "program-name", thegame.name, + "version", ver, + "comments", "Part of Simon Tatham's Portable Puzzle Collection", + "logo", icon, + (const gchar *)NULL); + g_object_unref(G_OBJECT(icon)); +#else char titlebuf[256]; char textbuf[1024]; @@ -2107,6 +2280,7 @@ static void menu_about_event(GtkMenuItem *menuitem, gpointer data) "%.500s", thegame.name, ver); message_box(fe->window, titlebuf, textbuf, TRUE, MB_OK); +#endif } static GtkWidget *add_menu_item_with_key(frontend *fe, GtkContainer *cont, @@ -2226,6 +2400,7 @@ static frontend *new_window(char *arg, int argtype, char **error) midend_new_game(fe->me); } +#if !GTK_CHECK_VERSION(3,0,0) { /* * try_shrink_drawing_area() will do some fiddling with the @@ -2252,6 +2427,7 @@ static frontend *new_window(char *arg, int argtype, char **error) 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); @@ -2456,24 +2632,35 @@ static frontend *new_window(char *arg, int argtype, char **error) fe->statusctx = gtk_statusbar_get_context_id (GTK_STATUSBAR(fe->statusbar), "game"); gtk_statusbar_push(GTK_STATUSBAR(fe->statusbar), fe->statusctx, - "test"); + DEFAULT_STATUSBAR_TEXT); +#if GTK_CHECK_VERSION(3,0,0) + gtk_widget_get_preferred_size(fe->statusbar, &req, NULL); +#else gtk_widget_size_request(fe->statusbar, &req); -#if 0 - /* For GTK 2.0, should we be using gtk_widget_set_size_request? */ #endif - gtk_widget_set_usize(viewport, -1, req.height); + gtk_widget_set_size_request(viewport, -1, req.height); } else fe->statusbar = NULL; fe->area = gtk_drawing_area_new(); -#if GTK_CHECK_VERSION(2,0,0) +#if GTK_CHECK_VERSION(2,0,0) && !GTK_CHECK_VERSION(3,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); + } + fe->w = -1; + fe->h = -1; 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); - fe->w = x; - fe->h = y; +#endif gtk_box_pack_end(vbox, fe->area, TRUE, TRUE, 0); @@ -2498,8 +2685,13 @@ static frontend *new_window(char *arg, int argtype, char **error) 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", @@ -2531,8 +2723,11 @@ static frontend *new_window(char *arg, int argtype, char **error) 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;