chiark / gitweb /
GTK 3 prep: use gtk_radio_menu_item_get_group().
[sgt-puzzles.git] / gtk.c
diff --git a/gtk.c b/gtk.c
index 087defaa65984f4066304c26637a77f3ccb36875..d89914fe2d28776be88d49ff55cbada96e5248d5 100644 (file)
--- a/gtk.c
+++ b/gtk.c
@@ -179,7 +179,7 @@ void get_random_seed(void **randseed, int *randseedsize)
 
 void frontend_default_colour(frontend *fe, float *output)
 {
-    GdkColor col = fe->window->style->bg[GTK_STATE_NORMAL];
+    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;
@@ -254,8 +254,10 @@ static void set_window_background(frontend *fe, int colour)
                fe->background.red >> 8, fe->background.green >> 8,
                fe->background.blue >> 8);
     }
-    gdk_window_set_background(fe->area->window, &fe->background);
-    gdk_window_set_background(fe->window->window, &fe->background);
+    gdk_window_set_background(gtk_widget_get_window(fe->area),
+                              &fe->background);
+    gdk_window_set_background(gtk_widget_get_window(fe->window),
+                              &fe->background);
 }
 
 static PangoLayout *make_pango_layout(frontend *fe)
@@ -385,7 +387,8 @@ static void setup_backing_store(frontend *fe)
     cairo_t *cr;
     int i;
 
-    fe->pixmap = gdk_pixmap_new(fe->area->window, fe->pw, fe->ph, -1);
+    fe->pixmap = gdk_pixmap_new(gtk_widget_get_window(fe->area),
+                                fe->pw, fe->ph, -1);
     fe->image = cairo_image_surface_create(CAIRO_FORMAT_RGB24,
                                           fe->pw, fe->ph);
 
@@ -393,7 +396,8 @@ static void setup_backing_store(frontend *fe)
        switch (i) {
            case 0: cr = cairo_create(fe->image); break;
            case 1: cr = gdk_cairo_create(fe->pixmap); break;
-           case 2: cr = gdk_cairo_create(fe->area->window); break;
+           case 2: cr = gdk_cairo_create(gtk_widget_get_window(fe->area));
+              break;
        }
        cairo_set_source_rgb(cr,
                             fe->colours[0], fe->colours[1], fe->colours[2]);
@@ -667,35 +671,35 @@ static void teardown_backing_store(frontend *fe)
 static void repaint_rectangle(frontend *fe, GtkWidget *widget,
                              int x, int y, int w, int h)
 {
-    GdkGC *gc = gdk_gc_new(widget->window);
+    GdkGC *gc = gdk_gc_new(gtk_widget_get_window(widget));
 #ifdef USE_CAIRO
     gdk_gc_set_foreground(gc, &fe->background);
 #else
     gdk_gc_set_foreground(gc, &fe->colours[fe->backgroundindex]);
 #endif
     if (x < fe->ox) {
-       gdk_draw_rectangle(widget->window, gc,
+       gdk_draw_rectangle(gtk_widget_get_window(widget), gc,
                           TRUE, x, y, fe->ox - x, h);
        w -= (fe->ox - x);
        x = fe->ox;
     }
     if (y < fe->oy) {
-       gdk_draw_rectangle(widget->window, gc,
+       gdk_draw_rectangle(gtk_widget_get_window(widget), gc,
                           TRUE, x, y, w, fe->oy - y);
        h -= (fe->oy - y);
        y = fe->oy;
     }
     if (w > fe->pw) {
-       gdk_draw_rectangle(widget->window, gc,
+       gdk_draw_rectangle(gtk_widget_get_window(widget), gc,
                           TRUE, x + fe->pw, y, w - fe->pw, h);
        w = fe->pw;
     }
     if (h > fe->ph) {
-       gdk_draw_rectangle(widget->window, gc,
+       gdk_draw_rectangle(gtk_widget_get_window(widget), gc,
                           TRUE, x, y + fe->ph, w, h - fe->ph);
        h = fe->ph;
     }
-    gdk_draw_pixmap(widget->window, gc, fe->pixmap,
+    gdk_draw_pixmap(gtk_widget_get_window(widget), gc, fe->pixmap,
                    x - fe->ox, y - fe->oy, x, y, w, h);
     gdk_gc_unref(gc);
 }
@@ -1060,37 +1064,47 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
     if (gtk_window_activate_key(GTK_WINDOW(fe->window), event))
         return TRUE;
 
-    if (event->keyval == GDK_Up)
+    if (event->keyval == GDK_KEY_Up)
         keyval = shift | ctrl | CURSOR_UP;
-    else if (event->keyval == GDK_KP_Up || event->keyval == GDK_KP_8)
+    else if (event->keyval == GDK_KEY_KP_Up ||
+             event->keyval == GDK_KEY_KP_8)
        keyval = MOD_NUM_KEYPAD | '8';
-    else if (event->keyval == GDK_Down)
+    else if (event->keyval == GDK_KEY_Down)
         keyval = shift | ctrl | CURSOR_DOWN;
-    else if (event->keyval == GDK_KP_Down || event->keyval == GDK_KP_2)
+    else if (event->keyval == GDK_KEY_KP_Down ||
+             event->keyval == GDK_KEY_KP_2)
        keyval = MOD_NUM_KEYPAD | '2';
-    else if (event->keyval == GDK_Left)
+    else if (event->keyval == GDK_KEY_Left)
         keyval = shift | ctrl | CURSOR_LEFT;
-    else if (event->keyval == GDK_KP_Left || event->keyval == GDK_KP_4)
+    else if (event->keyval == GDK_KEY_KP_Left ||
+             event->keyval == GDK_KEY_KP_4)
        keyval = MOD_NUM_KEYPAD | '4';
-    else if (event->keyval == GDK_Right)
+    else if (event->keyval == GDK_KEY_Right)
         keyval = shift | ctrl | CURSOR_RIGHT;
-    else if (event->keyval == GDK_KP_Right || event->keyval == GDK_KP_6)
+    else if (event->keyval == GDK_KEY_KP_Right ||
+             event->keyval == GDK_KEY_KP_6)
        keyval = MOD_NUM_KEYPAD | '6';
-    else if (event->keyval == GDK_KP_Home || event->keyval == GDK_KP_7)
+    else if (event->keyval == GDK_KEY_KP_Home ||
+             event->keyval == GDK_KEY_KP_7)
         keyval = MOD_NUM_KEYPAD | '7';
-    else if (event->keyval == GDK_KP_End || event->keyval == GDK_KP_1)
+    else if (event->keyval == GDK_KEY_KP_End ||
+             event->keyval == GDK_KEY_KP_1)
         keyval = MOD_NUM_KEYPAD | '1';
-    else if (event->keyval == GDK_KP_Page_Up || event->keyval == GDK_KP_9)
+    else if (event->keyval == GDK_KEY_KP_Page_Up ||
+             event->keyval == GDK_KEY_KP_9)
         keyval = MOD_NUM_KEYPAD | '9';
-    else if (event->keyval == GDK_KP_Page_Down || event->keyval == GDK_KP_3)
+    else if (event->keyval == GDK_KEY_KP_Page_Down ||
+             event->keyval == GDK_KEY_KP_3)
         keyval = MOD_NUM_KEYPAD | '3';
-    else if (event->keyval == GDK_KP_Insert || event->keyval == GDK_KP_0)
+    else if (event->keyval == GDK_KEY_KP_Insert ||
+             event->keyval == GDK_KEY_KP_0)
         keyval = MOD_NUM_KEYPAD | '0';
-    else if (event->keyval == GDK_KP_Begin || event->keyval == GDK_KP_5)
+    else if (event->keyval == GDK_KEY_KP_Begin ||
+             event->keyval == GDK_KEY_KP_5)
         keyval = MOD_NUM_KEYPAD | '5';
-    else if (event->keyval == GDK_BackSpace ||
-            event->keyval == GDK_Delete ||
-            event->keyval == GDK_KP_Delete)
+    else if (event->keyval == GDK_KEY_BackSpace ||
+            event->keyval == GDK_KEY_Delete ||
+            event->keyval == GDK_KEY_KP_Delete)
         keyval = '\177';
     else if (event->string[0] && !event->string[1])
         keyval = (unsigned char)event->string[0];
@@ -1159,7 +1173,7 @@ static gint motion_event(GtkWidget *widget, GdkEventMotion *event,
 #if GTK_CHECK_VERSION(2,12,0)
     gdk_event_request_motions(event);
 #else
-    gdk_window_get_pointer(widget->window, NULL, NULL, NULL);
+    gdk_window_get_pointer(gtk_widget_get_window(widget), NULL, NULL, NULL);
 #endif
 
     return TRUE;
@@ -1269,8 +1283,8 @@ static void msgbox_button_clicked(GtkButton *button, gpointer data)
     GtkWidget *window = GTK_WIDGET(data);
     int v, *ip;
 
-    ip = (int *)gtk_object_get_data(GTK_OBJECT(window), "user-data");
-    v = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(button), "user-data"));
+    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));
@@ -1278,13 +1292,13 @@ static void msgbox_button_clicked(GtkButton *button, gpointer data)
 
 static int win_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
-    GtkObject *cancelbutton = GTK_OBJECT(data);
+    GObject *cancelbutton = G_OBJECT(data);
 
     /*
      * `Escape' effectively clicks the cancel button
      */
-    if (event->keyval == GDK_Escape) {
-       gtk_signal_emit_by_name(GTK_OBJECT(cancelbutton), "clicked");
+    if (event->keyval == GDK_KEY_Escape) {
+       g_signal_emit_by_name(cancelbutton, "clicked");
        return TRUE;
     }
 
@@ -1305,8 +1319,9 @@ int message_box(GtkWidget *parent, char *title, char *msg, int centre,
     gtk_misc_set_alignment(GTK_MISC(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(GTK_BOX(GTK_DIALOG(window)->vbox),
-                       hbox, FALSE, FALSE, 20);
+    gtk_box_pack_start
+        (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(window))),
+         hbox, FALSE, FALSE, 20);
     gtk_widget_show(text);
     gtk_widget_show(hbox);
     gtk_window_set_title(GTK_WINDOW(window), title);
@@ -1325,27 +1340,28 @@ int message_box(GtkWidget *parent, char *title, char *msg, int centre,
     
     while (*titles) {
        button = gtk_button_new_from_stock(titles);
-       gtk_box_pack_end(GTK_BOX(GTK_DIALOG(window)->action_area),
-                        button, FALSE, FALSE, 0);
+       gtk_box_pack_end
+            (GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(window))),
+             button, FALSE, FALSE, 0);
        gtk_widget_show(button);
        if (i == def) {
-           GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+           gtk_widget_set_can_default(button, TRUE);
            gtk_window_set_default(GTK_WINDOW(window), button);
        }
        if (i == cancel) {
-           gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
-                              GTK_SIGNAL_FUNC(win_key_press), button);
+           g_signal_connect(G_OBJECT(window), "key_press_event",
+                             G_CALLBACK(win_key_press), button);
        }
-       gtk_signal_connect(GTK_OBJECT(button), "clicked",
-                          GTK_SIGNAL_FUNC(msgbox_button_clicked), window);
-       gtk_object_set_data(GTK_OBJECT(button), "user-data",
-                           GINT_TO_POINTER(i));
+       g_signal_connect(G_OBJECT(button), "clicked",
+                         G_CALLBACK(msgbox_button_clicked), window);
+       g_object_set_data(G_OBJECT(button), "user-data",
+                          GINT_TO_POINTER(i));
        titles += strlen(titles)+1;
        i++;
     }
-    gtk_object_set_data(GTK_OBJECT(window), "user-data", &i);
-    gtk_signal_connect(GTK_OBJECT(window), "destroy",
-                       GTK_SIGNAL_FUNC(window_destroy), NULL);
+    g_object_set_data(G_OBJECT(window), "user-data", &i);
+    g_signal_connect(G_OBJECT(window), "destroy",
+                     G_CALLBACK(window_destroy), NULL);
     gtk_window_set_modal(GTK_WINDOW(window), TRUE);
     gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(parent));
     /* set_transient_window_pos(parent, window); */
@@ -1394,11 +1410,12 @@ static int editbox_key(GtkWidget *widget, GdkEventKey *event, gpointer data)
      * Return in an edit box will now activate the default button
      * in the dialog just like it will everywhere else.
      */
-    if (event->keyval == GDK_Return && widget->parent != NULL) {
+    if (event->keyval == GDK_KEY_Return &&
+        gtk_widget_get_parent(widget) != NULL) {
        gint return_val;
-       gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event");
-       gtk_signal_emit_by_name(GTK_OBJECT(widget->parent), "key_press_event",
-                               event, &return_val);
+       g_signal_stop_emission_by_name(G_OBJECT(widget), "key_press_event");
+       g_signal_emit_by_name(G_OBJECT(gtk_widget_get_parent(widget)),
+                              "key_press_event", event, &return_val);
        return return_val;
     }
     return FALSE;
@@ -1419,12 +1436,11 @@ static void button_toggled(GtkToggleButton *tb, gpointer data)
     i->ival = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tb));
 }
 
-static void droplist_sel(GtkMenuItem *item, gpointer data)
+static void droplist_sel(GtkComboBox *combo, gpointer data)
 {
     config_item *i = (config_item *)data;
 
-    i->ival = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(item),
-                                                 "user-data"));
+    i->ival = gtk_combo_box_get_active(combo);
 }
 
 static int get_config(frontend *fe, int which)
@@ -1443,26 +1459,29 @@ static int get_config(frontend *fe, int which)
     sfree(title);
 
     w = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
-    gtk_box_pack_end(GTK_BOX(GTK_DIALOG(fe->cfgbox)->action_area),
-                     w, FALSE, FALSE, 0);
+    gtk_box_pack_end
+        (GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(fe->cfgbox))),
+         w, FALSE, FALSE, 0);
     gtk_widget_show(w);
-    gtk_signal_connect(GTK_OBJECT(w), "clicked",
-                       GTK_SIGNAL_FUNC(config_cancel_button_clicked), fe);
+    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(fe->cfgbox)->action_area),
-                     w, FALSE, FALSE, 0);
+    gtk_box_pack_end
+        (GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(fe->cfgbox))),
+         w, FALSE, FALSE, 0);
     gtk_widget_show(w);
-    GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT);
+    gtk_widget_set_can_default(w, TRUE);
     gtk_window_set_default(GTK_WINDOW(fe->cfgbox), w);
-    gtk_signal_connect(GTK_OBJECT(w), "clicked",
-                       GTK_SIGNAL_FUNC(config_ok_button_clicked), fe);
+    g_signal_connect(G_OBJECT(w), "clicked",
+                     G_CALLBACK(config_ok_button_clicked), fe);
 
     table = gtk_table_new(1, 2, FALSE);
     y = 0;
-    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(fe->cfgbox)->vbox),
-                     table, FALSE, FALSE, 0);
+    gtk_box_pack_start
+        (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(fe->cfgbox))),
+         table, FALSE, FALSE, 0);
     gtk_widget_show(table);
 
     for (i = fe->cfg; i->type != C_END; i++) {
@@ -1488,10 +1507,10 @@ static int get_config(frontend *fe, int which)
                             GTK_EXPAND | GTK_SHRINK | GTK_FILL,
                             3, 3);
            gtk_entry_set_text(GTK_ENTRY(w), i->sval);
-           gtk_signal_connect(GTK_OBJECT(w), "changed",
-                              GTK_SIGNAL_FUNC(editbox_changed), i);
-           gtk_signal_connect(GTK_OBJECT(w), "key_press_event",
-                              GTK_SIGNAL_FUNC(editbox_key), NULL);
+           g_signal_connect(G_OBJECT(w), "changed",
+                             G_CALLBACK(editbox_changed), i);
+           g_signal_connect(G_OBJECT(w), "key_press_event",
+                             G_CALLBACK(editbox_key), NULL);
            gtk_widget_show(w);
 
            break;
@@ -1501,8 +1520,8 @@ static int get_config(frontend *fe, int which)
             * Simple checkbox.
             */
             w = gtk_check_button_new_with_label(i->name);
-           gtk_signal_connect(GTK_OBJECT(w), "toggled",
-                              GTK_SIGNAL_FUNC(button_toggled), i);
+           g_signal_connect(G_OBJECT(w), "toggled",
+                             G_CALLBACK(button_toggled), i);
            gtk_table_attach(GTK_TABLE(table), w, 0, 2, y, y+1,
                             GTK_EXPAND | GTK_SHRINK | GTK_FILL,
                             GTK_EXPAND | GTK_SHRINK | GTK_FILL,
@@ -1513,7 +1532,7 @@ static int get_config(frontend *fe, int which)
 
          case C_CHOICES:
            /*
-            * Drop-down list (GtkOptionMenu).
+            * Drop-down list (GtkComboBox).
             */
 
            w = gtk_label_new(i->name);
@@ -1524,24 +1543,17 @@ static int get_config(frontend *fe, int which)
                             3, 3);
            gtk_widget_show(w);
 
-           w = gtk_option_menu_new();
-           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);
-           gtk_widget_show(w);
-
-           {
-               int c, val;
+            {
+               int c;
                char *p, *q, *name;
-               GtkWidget *menuitem;
-               GtkWidget *menu = gtk_menu_new();
+                GtkListStore *model;
+               GtkCellRenderer *cr;
+                GtkTreeIter iter;
 
-               gtk_option_menu_set_menu(GTK_OPTION_MENU(w), menu);
+                model = gtk_list_store_new(1, G_TYPE_STRING);
 
                c = *i->sval;
                p = i->sval+1;
-               val = 0;
 
                while (*p) {
                    q = p;
@@ -1554,32 +1566,40 @@ static int get_config(frontend *fe, int which)
 
                    if (*q) q++;       /* eat delimiter */
 
-                   menuitem = gtk_menu_item_new_with_label(name);
-                   gtk_container_add(GTK_CONTAINER(menu), menuitem);
-                   gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
-                                       GINT_TO_POINTER(val));
-                   gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                                      GTK_SIGNAL_FUNC(droplist_sel), i);
-                   gtk_widget_show(menuitem);
-
-                   val++;
+                    gtk_list_store_append(model, &iter);
+                    gtk_list_store_set(model, &iter, 0, name, -1);
 
                    p = q;
                }
 
-               gtk_option_menu_set_history(GTK_OPTION_MENU(w), i->ival);
-           }
+                w = gtk_combo_box_new_with_model(GTK_TREE_MODEL(model));
+
+               gtk_combo_box_set_active(GTK_COMBO_BOX(w), i->ival);
 
+               cr = gtk_cell_renderer_text_new();
+               gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(w), cr, TRUE);
+               gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(w), cr,
+                                              "text", 0, NULL);
+
+               g_signal_connect(G_OBJECT(w), "changed",
+                                G_CALLBACK(droplist_sel), i);
+            }
+
+           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);
+           gtk_widget_show(w);
            break;
        }
 
        y++;
     }
 
-    gtk_signal_connect(GTK_OBJECT(fe->cfgbox), "destroy",
-                       GTK_SIGNAL_FUNC(window_destroy), NULL);
-    gtk_signal_connect(GTK_OBJECT(fe->cfgbox), "key_press_event",
-                      GTK_SIGNAL_FUNC(win_key_press), cancel);
+    g_signal_connect(G_OBJECT(fe->cfgbox), "destroy",
+                     G_CALLBACK(window_destroy), NULL);
+    g_signal_connect(G_OBJECT(fe->cfgbox), "key_press_event",
+                     G_CALLBACK(win_key_press), cancel);
     gtk_window_set_modal(GTK_WINDOW(fe->cfgbox), TRUE);
     gtk_window_set_transient_for(GTK_WINDOW(fe->cfgbox),
                                 GTK_WINDOW(fe->window));
@@ -1595,8 +1615,8 @@ static int get_config(frontend *fe, int which)
 static void menu_key_event(GtkMenuItem *menuitem, gpointer data)
 {
     frontend *fe = (frontend *)data;
-    int key = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(menuitem),
-                                                  "user-data"));
+    int key = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem),
+                                                "user-data"));
     if (!midend_process_key(fe->me, 0, 0, key))
        gtk_widget_destroy(fe->window);
 }
@@ -1755,7 +1775,7 @@ static void menu_preset_event(GtkMenuItem *menuitem, gpointer data)
 {
     frontend *fe = (frontend *)data;
     game_params *params =
-        (game_params *)gtk_object_get_data(GTK_OBJECT(menuitem), "user-data");
+        (game_params *)g_object_get_data(G_OBJECT(menuitem), "user-data");
 
     if (fe->preset_threaded ||
        (GTK_IS_CHECK_MENU_ITEM(menuitem) &&
@@ -1810,7 +1830,7 @@ void selection_get(GtkWidget *widget, GtkSelectionData *seldata,
                   guint info, guint time_stamp, gpointer data)
 {
     frontend *fe = (frontend *)data;
-    gtk_selection_data_set(seldata, seldata->target, 8,
+    gtk_selection_data_set(seldata, gtk_selection_data_get_target(seldata), 8,
                           fe->paste_data, fe->paste_data_len);
 }
 
@@ -1846,7 +1866,7 @@ static void filesel_ok(GtkButton *button, gpointer data)
 {
     frontend *fe = (frontend *)data;
 
-    gpointer filesel = gtk_object_get_data(GTK_OBJECT(button), "user-data");
+    gpointer filesel = g_object_get_data(G_OBJECT(button), "user-data");
 
     const char *name =
         gtk_file_selection_get_filename(GTK_FILE_SELECTION(filesel));
@@ -1862,20 +1882,20 @@ static char *file_selector(frontend *fe, char *title, int save)
     fe->filesel_name = NULL;
 
     gtk_window_set_modal(GTK_WINDOW(filesel), TRUE);
-    gtk_object_set_data
-        (GTK_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "user-data",
+    g_object_set_data
+        (G_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "user-data",
          (gpointer)filesel);
-    gtk_signal_connect
-        (GTK_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked",
-         GTK_SIGNAL_FUNC(filesel_ok), fe);
-    gtk_signal_connect_object
-        (GTK_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked",
-         GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)filesel);
-    gtk_signal_connect_object
-        (GTK_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button), "clicked",
-         GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)filesel);
-    gtk_signal_connect(GTK_OBJECT(filesel), "destroy",
-                       GTK_SIGNAL_FUNC(window_destroy), NULL);
+    g_signal_connect
+        (G_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked",
+         G_CALLBACK(filesel_ok), fe);
+    g_signal_connect_swapped
+        (G_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked",
+         G_CALLBACK(gtk_widget_destroy), (gpointer)filesel);
+    g_signal_connect_object
+        (G_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button), "clicked",
+         G_CALLBACK(gtk_widget_destroy), (gpointer)filesel);
+    g_signal_connect(G_OBJECT(filesel), "destroy",
+                     G_CALLBACK(window_destroy), NULL);
     gtk_widget_show(filesel);
     gtk_window_set_transient_for(GTK_WINDOW(filesel), GTK_WINDOW(fe->window));
     gtk_main();
@@ -2031,8 +2051,8 @@ static void menu_restart_event(GtkMenuItem *menuitem, gpointer data)
 static void menu_config_event(GtkMenuItem *menuitem, gpointer data)
 {
     frontend *fe = (frontend *)data;
-    int which = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(menuitem),
-                                                   "user-data"));
+    int which = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem),
+                                                  "user-data"));
 
     if (fe->preset_threaded ||
        (GTK_IS_CHECK_MENU_ITEM(menuitem) &&
@@ -2067,10 +2087,9 @@ static GtkWidget *add_menu_item_with_key(frontend *fe, GtkContainer *cont,
     GtkWidget *menuitem = gtk_menu_item_new_with_label(text);
     int keyqual;
     gtk_container_add(cont, menuitem);
-    gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
-                        GINT_TO_POINTER(key));
-    gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                      GTK_SIGNAL_FUNC(menu_key_event), fe);
+    g_object_set_data(G_OBJECT(menuitem), "user-data", GINT_TO_POINTER(key));
+    g_signal_connect(G_OBJECT(menuitem), "activate",
+                     G_CALLBACK(menu_key_event), fe);
     switch (key & ~0x1F) {
       case 0x00:
        key += 0x60;
@@ -2236,24 +2255,24 @@ static frontend *new_window(char *arg, int argtype, char **error)
 
     menuitem = gtk_menu_item_new_with_label("Restart");
     gtk_container_add(GTK_CONTAINER(menu), menuitem);
-    gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                      GTK_SIGNAL_FUNC(menu_restart_event), fe);
+    g_signal_connect(G_OBJECT(menuitem), "activate",
+                     G_CALLBACK(menu_restart_event), fe);
     gtk_widget_show(menuitem);
 
     menuitem = gtk_menu_item_new_with_label("Specific...");
-    gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
-                       GINT_TO_POINTER(CFG_DESC));
+    g_object_set_data(G_OBJECT(menuitem), "user-data",
+                      GINT_TO_POINTER(CFG_DESC));
     gtk_container_add(GTK_CONTAINER(menu), menuitem);
-    gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                      GTK_SIGNAL_FUNC(menu_config_event), fe);
+    g_signal_connect(G_OBJECT(menuitem), "activate",
+                     G_CALLBACK(menu_config_event), fe);
     gtk_widget_show(menuitem);
 
     menuitem = gtk_menu_item_new_with_label("Random Seed...");
-    gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
-                       GINT_TO_POINTER(CFG_SEED));
+    g_object_set_data(G_OBJECT(menuitem), "user-data",
+                      GINT_TO_POINTER(CFG_SEED));
     gtk_container_add(GTK_CONTAINER(menu), menuitem);
-    gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                      GTK_SIGNAL_FUNC(menu_config_event), fe);
+    g_signal_connect(G_OBJECT(menuitem), "activate",
+                     G_CALLBACK(menu_config_event), fe);
     gtk_widget_show(menuitem);
 
     fe->preset_radio = NULL;
@@ -2280,12 +2299,12 @@ static frontend *new_window(char *arg, int argtype, char **error)
            menuitem =
                gtk_radio_menu_item_new_with_label(fe->preset_radio, name);
            fe->preset_radio =
-               gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(menuitem));
+               gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem));
            fe->n_preset_menu_items++;
             gtk_container_add(GTK_CONTAINER(submenu), menuitem);
-            gtk_object_set_data(GTK_OBJECT(menuitem), "user-data", params);
-            gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                               GTK_SIGNAL_FUNC(menu_preset_event), fe);
+            g_object_set_data(G_OBJECT(menuitem), "user-data", params);
+            g_signal_connect(G_OBJECT(menuitem), "activate",
+                             G_CALLBACK(menu_preset_event), fe);
             gtk_widget_show(menuitem);
         }
 
@@ -2294,12 +2313,12 @@ static frontend *new_window(char *arg, int argtype, char **error)
                gtk_radio_menu_item_new_with_label(fe->preset_radio,
                                                   "Custom...");
            fe->preset_radio =
-               gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(menuitem));
+               gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem));
             gtk_container_add(GTK_CONTAINER(submenu), menuitem);
-            gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
-                               GINT_TO_POINTER(CFG_SETTINGS));
-            gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                               GTK_SIGNAL_FUNC(menu_config_event), fe);
+            g_object_set_data(G_OBJECT(menuitem), "user-data",
+                              GINT_TO_POINTER(CFG_SETTINGS));
+            g_signal_connect(G_OBJECT(menuitem), "activate",
+                             G_CALLBACK(menu_config_event), fe);
             gtk_widget_show(menuitem);
        }
 
@@ -2308,13 +2327,13 @@ static frontend *new_window(char *arg, int argtype, char **error)
     add_menu_separator(GTK_CONTAINER(menu));
     menuitem = gtk_menu_item_new_with_label("Load...");
     gtk_container_add(GTK_CONTAINER(menu), menuitem);
-    gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                      GTK_SIGNAL_FUNC(menu_load_event), fe);
+    g_signal_connect(G_OBJECT(menuitem), "activate",
+                     G_CALLBACK(menu_load_event), fe);
     gtk_widget_show(menuitem);
     menuitem = gtk_menu_item_new_with_label("Save...");
     gtk_container_add(GTK_CONTAINER(menu), menuitem);
-    gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                      GTK_SIGNAL_FUNC(menu_save_event), fe);
+    g_signal_connect(G_OBJECT(menuitem), "activate",
+                     G_CALLBACK(menu_save_event), fe);
     gtk_widget_show(menuitem);
 #ifndef STYLUS_BASED
     add_menu_separator(GTK_CONTAINER(menu));
@@ -2325,8 +2344,8 @@ static frontend *new_window(char *arg, int argtype, char **error)
        add_menu_separator(GTK_CONTAINER(menu));
        menuitem = gtk_menu_item_new_with_label("Copy");
        gtk_container_add(GTK_CONTAINER(menu), menuitem);
-       gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                          GTK_SIGNAL_FUNC(menu_copy_event), fe);
+       g_signal_connect(G_OBJECT(menuitem), "activate",
+                         G_CALLBACK(menu_copy_event), fe);
        gtk_widget_show(menuitem);
        fe->copy_menu_item = menuitem;
     } else {
@@ -2336,8 +2355,8 @@ static frontend *new_window(char *arg, int argtype, char **error)
        add_menu_separator(GTK_CONTAINER(menu));
        menuitem = gtk_menu_item_new_with_label("Solve");
        gtk_container_add(GTK_CONTAINER(menu), menuitem);
-       gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                          GTK_SIGNAL_FUNC(menu_solve_event), fe);
+       g_signal_connect(G_OBJECT(menuitem), "activate",
+                         G_CALLBACK(menu_solve_event), fe);
        gtk_widget_show(menuitem);
     }
     add_menu_separator(GTK_CONTAINER(menu));
@@ -2352,24 +2371,24 @@ static frontend *new_window(char *arg, int argtype, char **error)
 
     menuitem = gtk_menu_item_new_with_label("About");
     gtk_container_add(GTK_CONTAINER(menu), menuitem);
-    gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                      GTK_SIGNAL_FUNC(menu_about_event), fe);
+    g_signal_connect(G_OBJECT(menuitem), "activate",
+                     G_CALLBACK(menu_about_event), fe);
     gtk_widget_show(menuitem);
 
 #ifdef STYLUS_BASED
     menuitem=gtk_button_new_with_mnemonic("_Redo");
-    gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
-                       GINT_TO_POINTER((int)('r')));
-    gtk_signal_connect(GTK_OBJECT(menuitem), "clicked",
-                      GTK_SIGNAL_FUNC(menu_key_event), fe);
+    g_object_set_data(G_OBJECT(menuitem), "user-data",
+                      GINT_TO_POINTER((int)('r')));
+    g_signal_connect(G_OBJECT(menuitem), "clicked",
+                     G_CALLBACK(menu_key_event), fe);
     gtk_box_pack_end(hbox, menuitem, FALSE, FALSE, 0);
     gtk_widget_show(menuitem);
 
     menuitem=gtk_button_new_with_mnemonic("_Undo");
-    gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
-                       GINT_TO_POINTER((int)('u')));
-    gtk_signal_connect(GTK_OBJECT(menuitem), "clicked",
-                      GTK_SIGNAL_FUNC(menu_key_event), fe);
+    g_object_set_data(G_OBJECT(menuitem), "user-data",
+                      GINT_TO_POINTER((int)('u')));
+    g_signal_connect(G_OBJECT(menuitem), "clicked",
+                     G_CALLBACK(menu_key_event), fe);
     gtk_box_pack_end(hbox, menuitem, FALSE, FALSE, 0);
     gtk_widget_show(menuitem);
 
@@ -2382,10 +2401,10 @@ static frontend *new_window(char *arg, int argtype, char **error)
        errbuf[1]='\0';
        for(errbuf[0]='0';errbuf[0]<='9';errbuf[0]++) {
            menuitem=gtk_button_new_with_label(errbuf);
-           gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
-                               GINT_TO_POINTER((int)(errbuf[0])));
-           gtk_signal_connect(GTK_OBJECT(menuitem), "clicked",
-                              GTK_SIGNAL_FUNC(menu_key_event), fe);
+           g_object_set_data(G_OBJECT(menuitem), "user-data",
+                              GINT_TO_POINTER((int)(errbuf[0])));
+           g_signal_connect(G_OBJECT(menuitem), "clicked",
+                             G_CALLBACK(menu_key_event), fe);
            gtk_box_pack_start(hbox, menuitem, TRUE, TRUE, 0);
            gtk_widget_show(menuitem);
        }
@@ -2421,7 +2440,7 @@ static frontend *new_window(char *arg, int argtype, char **error)
 
     fe->area = gtk_drawing_area_new();
 #if GTK_CHECK_VERSION(2,0,0)
-    GTK_WIDGET_UNSET_FLAGS(fe->area, GTK_DOUBLE_BUFFERED);
+    gtk_widget_set_double_buffered(fe->area, FALSE);
 #endif
     get_size(fe, &x, &y);
     fe->drawing_area_shrink_pending = FALSE;
@@ -2438,28 +2457,28 @@ static frontend *new_window(char *arg, int argtype, char **error)
     fe->paste_data = NULL;
     fe->paste_data_len = 0;
 
-    gtk_signal_connect(GTK_OBJECT(fe->window), "destroy",
-                      GTK_SIGNAL_FUNC(destroy), fe);
-    gtk_signal_connect(GTK_OBJECT(fe->window), "key_press_event",
-                      GTK_SIGNAL_FUNC(key_event), fe);
-    gtk_signal_connect(GTK_OBJECT(fe->area), "button_press_event",
-                      GTK_SIGNAL_FUNC(button_event), fe);
-    gtk_signal_connect(GTK_OBJECT(fe->area), "button_release_event",
-                      GTK_SIGNAL_FUNC(button_event), fe);
-    gtk_signal_connect(GTK_OBJECT(fe->area), "motion_notify_event",
-                      GTK_SIGNAL_FUNC(motion_event), fe);
-    gtk_signal_connect(GTK_OBJECT(fe->area), "selection_get",
-                      GTK_SIGNAL_FUNC(selection_get), fe);
-    gtk_signal_connect(GTK_OBJECT(fe->area), "selection_clear_event",
-                      GTK_SIGNAL_FUNC(selection_clear), fe);
-    gtk_signal_connect(GTK_OBJECT(fe->area), "expose_event",
-                      GTK_SIGNAL_FUNC(expose_area), fe);
-    gtk_signal_connect(GTK_OBJECT(fe->window), "map_event",
-                      GTK_SIGNAL_FUNC(map_window), fe);
-    gtk_signal_connect(GTK_OBJECT(fe->area), "configure_event",
-                      GTK_SIGNAL_FUNC(configure_area), fe);
-    gtk_signal_connect(GTK_OBJECT(fe->window), "configure_event",
-                      GTK_SIGNAL_FUNC(configure_window), fe);
+    g_signal_connect(G_OBJECT(fe->window), "destroy",
+                     G_CALLBACK(destroy), fe);
+    g_signal_connect(G_OBJECT(fe->window), "key_press_event",
+                     G_CALLBACK(key_event), fe);
+    g_signal_connect(G_OBJECT(fe->area), "button_press_event",
+                     G_CALLBACK(button_event), fe);
+    g_signal_connect(G_OBJECT(fe->area), "button_release_event",
+                     G_CALLBACK(button_event), fe);
+    g_signal_connect(G_OBJECT(fe->area), "motion_notify_event",
+                     G_CALLBACK(motion_event), fe);
+    g_signal_connect(G_OBJECT(fe->area), "selection_get",
+                     G_CALLBACK(selection_get), fe);
+    g_signal_connect(G_OBJECT(fe->area), "selection_clear_event",
+                     G_CALLBACK(selection_clear), fe);
+    g_signal_connect(G_OBJECT(fe->area), "expose_event",
+                     G_CALLBACK(expose_area), fe);
+    g_signal_connect(G_OBJECT(fe->window), "map_event",
+                     G_CALLBACK(map_window), fe);
+    g_signal_connect(G_OBJECT(fe->area), "configure_event",
+                     G_CALLBACK(configure_area), fe);
+    g_signal_connect(G_OBJECT(fe->window), "configure_event",
+                     G_CALLBACK(configure_window), fe);
 
     gtk_widget_add_events(GTK_WIDGET(fe->area),
                           GDK_BUTTON_PRESS_MASK |
@@ -2469,9 +2488,11 @@ static frontend *new_window(char *arg, int argtype, char **error)
 
     if (n_xpm_icons) {
        gtk_widget_realize(fe->window);
-       iconpm = gdk_pixmap_create_from_xpm_d(fe->window->window, NULL,
-                                             NULL, (gchar **)xpm_icons[0]);
-       gdk_window_set_icon(fe->window->window, NULL, iconpm, NULL);
+       iconpm = gdk_pixmap_create_from_xpm_d
+            (gtk_widget_get_window(fe->window), NULL, NULL,
+             (gchar **)xpm_icons[0]);
+       gdk_window_set_icon(gtk_widget_get_window(fe->window),
+                            NULL, iconpm, NULL);
        iconlist = NULL;
        for (n = 0; n < n_xpm_icons; n++) {
            iconlist =
@@ -2479,7 +2500,7 @@ static frontend *new_window(char *arg, int argtype, char **error)
                              gdk_pixbuf_new_from_xpm_data((const gchar **)
                                                           xpm_icons[n]));
        }
-       gdk_window_set_icon_list(fe->window->window, iconlist);
+       gdk_window_set_icon_list(gtk_widget_get_window(fe->window), iconlist);
     }
 
     gtk_widget_show(fe->area);