tReplace GtkTable with GtkGrid - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit ea743d77cfc8d4823eceb70266a7e6fbb6ab583b
 (DIR) parent fe3bdabeb6b584fc226aa242eb58aace0875323c
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Wed, 30 Dec 2020 23:26:28 -0800
       
       Replace GtkTable with GtkGrid
       
       Replace all usage of GtkTable with GtkGrid.
       GtkTable is deprecated in later versions of
       GTK3 and removed entirely in GTK4. We'll still
       need to implement GtkTable for Windows and GTK2.
       
       Diffstat:
         M src/gui_client/gtk_client.c         |     191 +++++++++++++++++--------------
         M src/gui_client/newgamedia.c         |      42 ++++++++++++++++---------------
         M src/gui_client/optdialog.c          |     148 +++++++++++++++----------------
       
       3 files changed, 199 insertions(+), 182 deletions(-)
       ---
 (DIR) diff --git a/src/gui_client/gtk_client.c b/src/gui_client/gtk_client.c
       t@@ -605,7 +605,7 @@ void HandleClientMessage(char *pt, Player *Play)
        }
        
        struct HiScoreDiaStruct {
       -  GtkWidget *dialog, *table, *vbox;
       +  GtkWidget *dialog, *grid, *vbox;
          GtkAccelGroup *accel_group;
        };
        static struct HiScoreDiaStruct HiScoreDialog = { NULL, NULL, NULL, NULL };
       t@@ -615,7 +615,7 @@ static struct HiScoreDiaStruct HiScoreDialog = { NULL, NULL, NULL, NULL };
         */
        void PrepareHighScoreDialog(void)
        {
       -  GtkWidget *dialog, *vbox, *hsep, *table;
       +  GtkWidget *dialog, *vbox, *hsep, *grid;
        
          /* Make sure the server doesn't fool us into creating multiple dialogs */
          if (HiScoreDialog.dialog)
       t@@ -635,11 +635,11 @@ void PrepareHighScoreDialog(void)
                                       GTK_WINDOW(ClientData.window));
        
          HiScoreDialog.vbox = vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 7);
       -  HiScoreDialog.table = table = gtk_table_new(NUMHISCORE, 4, FALSE);
       -  gtk_table_set_row_spacings(GTK_TABLE(table), 5);
       -  gtk_table_set_col_spacings(GTK_TABLE(table), 30);
       +  HiScoreDialog.grid = grid = gtk_grid_new();
       +  gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
       +  gtk_grid_set_column_spacing(GTK_GRID(grid), 30);
        
       -  gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
       +  gtk_box_pack_start(GTK_BOX(vbox), grid, TRUE, TRUE, 0);
          hsep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
          gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0);
          gtk_container_add(GTK_CONTAINER(dialog), vbox);
       t@@ -685,8 +685,8 @@ void AddScoreToDialog(char *Data)
          }
          label = gtk_label_new(spl1[0]);
          gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
       -  gtk_table_attach_defaults(GTK_TABLE(HiScoreDialog.table), label,
       -                            0, 1, index, index + 1);
       +  gtk_grid_attach(GTK_GRID(HiScoreDialog.grid), label, 0, index, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
          if (bold) {
            GdkColor color;
        
       t@@ -713,8 +713,8 @@ void AddScoreToDialog(char *Data)
          }
          label = gtk_label_new(spl2[0]);
          gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
       -  gtk_table_attach_defaults(GTK_TABLE(HiScoreDialog.table), label,
       -                            1, 2, index, index + 1);
       +  gtk_grid_attach(GTK_GRID(HiScoreDialog.grid), label, 1, index, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
          if (bold) {
            gtk_widget_set_style(label, style);
          }
       t@@ -735,8 +735,8 @@ void AddScoreToDialog(char *Data)
          if (slen > 8 && spl2[1][slen - 1] == ')' && spl2[1][slen - 8] == '(') {
            label = gtk_label_new(&spl2[1][slen - 8]);
            gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
       -    gtk_table_attach_defaults(GTK_TABLE(HiScoreDialog.table), label,
       -                              3, 4, index, index + 1);
       +    gtk_grid_attach(GTK_GRID(HiScoreDialog.grid), label, 3, index, 1, 1);
       +    gtk_widget_set_hexpand(label, TRUE);
            if (bold) {
              gtk_widget_set_style(label, style);
            }
       t@@ -748,8 +748,8 @@ void AddScoreToDialog(char *Data)
          g_strchomp(spl2[1]);
          label = gtk_label_new(spl2[1]);
          gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
       -  gtk_table_attach_defaults(GTK_TABLE(HiScoreDialog.table), label,
       -                            2, 3, index, index + 1);
       +  gtk_grid_attach(GTK_GRID(HiScoreDialog.grid), label, 2, index, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
          if (bold) {
            gtk_widget_set_style(label, style);
          }
       t@@ -902,7 +902,7 @@ struct combatant {
         */
        static void CreateFightDialog(void)
        {
       -  GtkWidget *dialog, *vbox, *button, *hbox, *hbbox, *hsep, *text, *table;
       +  GtkWidget *dialog, *vbox, *button, *hbox, *hbbox, *hsep, *text, *grid;
          GtkAccelGroup *accel_group;
          GArray *combatants;
          gchar *buf;
       t@@ -923,15 +923,16 @@ static void CreateFightDialog(void)
        
          vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 7);
        
       -  table = gtk_table_new(2, 4, FALSE);
       -  gtk_table_set_row_spacings(GTK_TABLE(table), 7);
       -  gtk_table_set_col_spacings(GTK_TABLE(table), 10);
       +  grid = gtk_grid_new();
       +  gtk_grid_set_row_spacing(GTK_GRID(grid), 7);
       +  gtk_grid_set_column_spacing(GTK_GRID(grid), 10);
        
          hsep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
       -  gtk_table_attach_defaults(GTK_TABLE(table), hsep, 0, 4, 1, 2);
       -  gtk_widget_show_all(table);
       -  gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
       -  g_object_set_data(G_OBJECT(dialog), "table", table);
       +  gtk_grid_attach(GTK_GRID(grid), hsep, 0, 1, 3, 1);
       +  gtk_widget_set_hexpand(hsep, TRUE);
       +  gtk_widget_show_all(grid);
       +  gtk_box_pack_start(GTK_BOX(vbox), grid, FALSE, FALSE, 0);
       +  g_object_set_data(G_OBJECT(dialog), "grid", grid);
        
          combatants = g_array_new(FALSE, TRUE, sizeof(struct combatant));
          g_array_set_size(combatants, 1);
       t@@ -993,13 +994,13 @@ static void UpdateCombatant(gchar *DefendName, int DefendBitches,
          const gchar *name;
          struct combatant *compt;
          GArray *combatants;
       -  GtkWidget *table;
       +  GtkWidget *grid;
          gchar *BitchText, *HealthText;
          gfloat ProgPercent;
        
          combatants = (GArray *)g_object_get_data(G_OBJECT(FightDialog),
                                                   "combatants");
       -  table = GTK_WIDGET(g_object_get_data(G_OBJECT(FightDialog), "table"));
       +  grid = GTK_WIDGET(g_object_get_data(G_OBJECT(FightDialog), "grid"));
          if (!combatants) {
            return;
          }
       t@@ -1024,7 +1025,6 @@ static void UpdateCombatant(gchar *DefendName, int DefendBitches,
              g_array_set_size(combatants, i + 1);
              compt = &g_array_index(combatants, struct combatant, i);
        
       -      gtk_table_resize(GTK_TABLE(table), i + 2, 4);
              RowIndex = i + 1;
            }
          } else {
       t@@ -1063,19 +1063,16 @@ static void UpdateCombatant(gchar *DefendName, int DefendBitches,
            /* Display of the current player's name during combat */
            compt->name = gtk_label_new(DefendName[0] ? DefendName : _("You"));
        
       -    gtk_table_attach(GTK_TABLE(table), compt->name, 0, 1,
       -                     RowIndex, RowIndex + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
       +    gtk_grid_attach(GTK_GRID(grid), compt->name, 0, RowIndex, 1, 1);
            compt->bitches = gtk_label_new(DefendBitches >= 0 ? BitchText : "");
       -    gtk_table_attach(GTK_TABLE(table), compt->bitches, 1, 2,
       -                     RowIndex, RowIndex + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
       +    gtk_grid_attach(GTK_GRID(grid), compt->bitches, 1, RowIndex, 1, 1);
            compt->healthprog = gtk_progress_bar_new();
            gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(compt->healthprog),
                                          ProgPercent);
       -    gtk_table_attach_defaults(GTK_TABLE(table), compt->healthprog, 2, 3,
       -                              RowIndex, RowIndex + 1);
       +    gtk_grid_attach(GTK_GRID(grid), compt->healthprog, 2, RowIndex, 1, 1);
       +    gtk_widget_set_hexpand(compt->healthprog, TRUE);
            compt->healthlabel = gtk_label_new(HealthText);
       -    gtk_table_attach(GTK_TABLE(table), compt->healthlabel, 3, 4,
       -                     RowIndex, RowIndex + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
       +    gtk_grid_attach(GTK_GRID(grid), compt->healthlabel, 3, RowIndex, 1, 1);
            gtk_widget_show(compt->name);
            gtk_widget_show(compt->bitches);
            gtk_widget_show(compt->healthprog);
       t@@ -1460,7 +1457,7 @@ void JetButtonPressed(GtkWidget *widget, gpointer data)
        
        void Jet(GtkWidget *parent)
        {
       -  GtkWidget *dialog, *table, *button, *label, *vbox;
       +  GtkWidget *dialog, *grid, *button, *label, *vbox;
          GtkAccelGroup *accel_group;
          gint boxsize, i, row, col;
          gchar *name, AccelChar;
       t@@ -1498,7 +1495,9 @@ void Jet(GtkWidget *parent)
            row++;
          }
        
       -  table = gtk_table_new(row, col, TRUE);
       +  grid = gtk_grid_new();
       +  gtk_grid_set_row_homogeneous(GTK_GRID(grid), TRUE);
       +  gtk_grid_set_column_homogeneous(GTK_GRID(grid), TRUE);
        
          for (i = 0; i < NumLocation; i++) {
            if (i < 9) {
       t@@ -1535,10 +1534,9 @@ void Jet(GtkWidget *parent)
            g_object_set_data(G_OBJECT(button), "dialog", dialog);
            g_signal_connect(G_OBJECT(button), "clicked",
                             G_CALLBACK(JetCallback), GINT_TO_POINTER(i));
       -    gtk_table_attach_defaults(GTK_TABLE(table), button, col, col + 1, row,
       -                              row + 1);
       +    gtk_grid_attach(GTK_GRID(grid), button, col, row, 1, 1);
          }
       -  gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
       +  gtk_box_pack_start(GTK_BOX(vbox), grid, TRUE, TRUE, 0);
        
          gtk_container_add(GTK_CONTAINER(dialog), vbox);
          gtk_widget_show_all(dialog);
       t@@ -2089,64 +2087,80 @@ void UpdateMenus(void)
        
        GtkWidget *CreateStatusWidgets(struct StatusWidgets *Status)
        {
       -  GtkWidget *table, *label;
       +  GtkWidget *grid, *label;
        
       -  table = gtk_table_new(3, 6, FALSE);
       -  gtk_table_set_row_spacings(GTK_TABLE(table), 3);
       -  gtk_table_set_col_spacings(GTK_TABLE(table), 3);
       -  gtk_container_set_border_width(GTK_CONTAINER(table), 3);
       +  grid = gtk_grid_new();
       +  gtk_grid_set_row_spacing(GTK_GRID(grid), 3);
       +  gtk_grid_set_column_spacing(GTK_GRID(grid), 3);
       +  gtk_container_set_border_width(GTK_CONTAINER(grid), 3);
        
          label = Status->Location = gtk_label_new(NULL);
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 2, 0, 1);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 2, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
        
          label = Status->Date = gtk_label_new(NULL);
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 4, 0, 1);
       +  gtk_grid_attach(GTK_GRID(grid), label, 2, 0, 2, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
        
          /* Available space label in GTK+ client status display */
          label = Status->SpaceName = gtk_label_new(_("Space"));
        
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 4, 5, 0, 1);
       +  gtk_grid_attach(GTK_GRID(grid), label, 4, 0, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
          label = Status->SpaceValue = gtk_label_new(NULL);
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 5, 6, 0, 1);
       +  gtk_grid_attach(GTK_GRID(grid), label, 5, 0, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
        
          /* Player's cash label in GTK+ client status display */
          label = Status->CashName = gtk_label_new(_("Cash"));
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
        
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
          label = Status->CashValue = gtk_label_new(NULL);
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 1, 2);
       +  gtk_grid_attach(GTK_GRID(grid), label, 1, 1, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
        
          /* Player's debt label in GTK+ client status display */
          label = Status->DebtName = gtk_label_new(_("Debt"));
       +  gtk_grid_attach(GTK_GRID(grid), label, 2, 1, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
        
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, 1, 2);
          label = Status->DebtValue = gtk_label_new(NULL);
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 3, 4, 1, 2);
       +  gtk_grid_attach(GTK_GRID(grid), label, 3, 1, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
        
          /* Player's bank balance label in GTK+ client status display */
          label = Status->BankName = gtk_label_new(_("Bank"));
       +  gtk_grid_attach(GTK_GRID(grid), label, 4, 1, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
        
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 4, 5, 1, 2);
          label = Status->BankValue = gtk_label_new(NULL);
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 5, 6, 1, 2);
       +  gtk_grid_attach(GTK_GRID(grid), label, 5, 1, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
        
          label = Status->GunsName = gtk_label_new(NULL);
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 2, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
          label = Status->GunsValue = gtk_label_new(NULL);
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 2, 3);
       +  gtk_grid_attach(GTK_GRID(grid), label, 1, 2, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
        
          label = Status->BitchesName = gtk_label_new(NULL);
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, 2, 3);
       +  gtk_grid_attach(GTK_GRID(grid), label, 2, 2, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
          label = Status->BitchesValue = gtk_label_new(NULL);
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 3, 4, 2, 3);
       +  gtk_grid_attach(GTK_GRID(grid), label, 3, 2, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
        
          /* Player's health label in GTK+ client status display */
          label = Status->HealthName = gtk_label_new(_("Health"));
       +  gtk_grid_attach(GTK_GRID(grid), label, 4, 2, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
        
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 4, 5, 2, 3);
          label = Status->HealthValue = gtk_label_new(NULL);
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 5, 6, 2, 3);
       -  return table;
       +  gtk_grid_attach(GTK_GRID(grid), label, 5, 2, 1, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
       +  return grid;
        }
        
        void SetJetButtonTitle(GtkAccelGroup *accel_group)
       t@@ -2205,7 +2219,7 @@ gboolean GtkLoop(int *argc, char **argv[],
                         struct CMDLINE *cmdline, gboolean ReturnOnFail)
        #endif
        {
       -  GtkWidget *window, *vbox, *vbox2, *hbox, *frame, *table, *menubar, *text,
       +  GtkWidget *window, *vbox, *vbox2, *hbox, *frame, *grid, *menubar, *text,
              *vpaned, *button, *tv, *widget;
          GtkAccelGroup *accel_group;
          GtkTreeSortable *sortable;
       t@@ -2289,9 +2303,9 @@ gboolean GtkLoop(int *argc, char **argv[],
          frame = gtk_frame_new(_("Stats"));
          gtk_container_set_border_width(GTK_CONTAINER(frame), 3);
        
       -  table = CreateStatusWidgets(&ClientData.Status);
       +  grid = CreateStatusWidgets(&ClientData.Status);
        
       -  gtk_container_add(GTK_CONTAINER(frame), table);
       +  gtk_container_add(GTK_CONTAINER(frame), grid);
        
          gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
        
       t@@ -2385,7 +2399,7 @@ static void PackCentredURL(GtkWidget *vbox, gchar *title, gchar *target,
        
        void display_intro(GtkWidget *widget, gpointer data)
        {
       -  GtkWidget *dialog, *label, *table, *OKButton, *vbox, *hsep, *hbbox;
       +  GtkWidget *dialog, *label, *grid, *OKButton, *vbox, *hsep, *hbbox;
          gchar *VersionStr, *docindex;
          const int rows = 8, cols = 3;
          int i, j;
       t@@ -2442,9 +2456,9 @@ void display_intro(GtkWidget *widget, gpointer data)
          gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
          g_free(VersionStr);
        
       -  table = gtk_table_new(rows, cols, FALSE);
       -  gtk_table_set_row_spacings(GTK_TABLE(table), 3);
       -  gtk_table_set_col_spacings(GTK_TABLE(table), 3);
       +  grid = gtk_grid_new();
       +  gtk_grid_set_row_spacing(GTK_GRID(grid), 3);
       +  gtk_grid_set_column_spacing(GTK_GRID(grid), 3);
          for (i = 0; i < rows; i++) {
            if (i > 0 || strcmp(_(table_data[i][1]), "Ben Webb") != 0) {
              for (j = 0; j < cols; j++) {
       t@@ -2454,13 +2468,13 @@ void display_intro(GtkWidget *widget, gpointer data)
                  } else {
                    label = gtk_label_new(table_data[i][j]);
                  }
       -          gtk_table_attach_defaults(GTK_TABLE(table), label, j, j + 1, i,
       -                                    i + 1);
       +          gtk_grid_attach(GTK_GRID(grid), label, j, i, 1, 1);
       +          gtk_widget_set_hexpand(label, TRUE);
                }
              }
            }
          }
       -  gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
       +  gtk_box_pack_start(GTK_BOX(vbox), grid, FALSE, FALSE, 0);
        
          /* Label at the bottom of GTK+ 'about' dialog */
          label = gtk_label_new(_("\nFor information on the command line "
       t@@ -2562,7 +2576,7 @@ static void TransferOK(GtkWidget *widget, GtkWidget *dialog)
        
        void TransferDialog(gboolean Debt)
        {
       -  GtkWidget *dialog, *button, *label, *radio, *table, *vbox;
       +  GtkWidget *dialog, *button, *label, *radio, *grid, *vbox;
          GtkWidget *hbbox, *hsep, *entry;
          GtkAccelGroup *accel_group;
          GSList *group;
       t@@ -2593,14 +2607,15 @@ void TransferDialog(gboolean Debt)
                                       GTK_WINDOW(ClientData.window));
        
          vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 7);
       -  table = gtk_table_new(4, 3, FALSE);
       -  gtk_table_set_row_spacings(GTK_TABLE(table), 4);
       -  gtk_table_set_col_spacings(GTK_TABLE(table), 4);
       +  grid = gtk_grid_new();
       +  gtk_grid_set_row_spacing(GTK_GRID(grid), 4);
       +  gtk_grid_set_column_spacing(GTK_GRID(grid), 4);
        
          /* Display of player's cash in bank or loan shark dialog */
          dpg_string_printf(text, _("Cash: %P"), ClientData.Play->Cash);
          label = gtk_label_new(text->str);
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 3, 0, 1);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 3, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
        
          if (Debt) {
            /* Display of player's debt in loan shark dialog */
       t@@ -2610,23 +2625,24 @@ void TransferDialog(gboolean Debt)
            dpg_string_printf(text, _("Bank: %P"), ClientData.Play->Bank);
          }
          label = gtk_label_new(text->str);
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 3, 1, 2);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 3, 1);
       +  gtk_widget_set_hexpand(label, TRUE);
        
          g_object_set_data(G_OBJECT(dialog), "debt", GINT_TO_POINTER(Debt));
          if (Debt) {
            /* Prompt for paying back a loan */
            label = gtk_label_new(_("Pay back:"));
       -    gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 4);
       +    gtk_grid_attach(GTK_GRID(grid), label, 0, 2, 1, 2);
          } else {
            /* Radio button selected if you want to pay money into the bank */
            radio = gtk_radio_button_new_with_label(NULL, _("Deposit"));
            g_object_set_data(G_OBJECT(dialog), "deposit", radio);
            group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio));
       -    gtk_table_attach_defaults(GTK_TABLE(table), radio, 0, 1, 2, 3);
       +    gtk_grid_attach(GTK_GRID(grid), radio, 0, 2, 1, 1);
        
            /* Radio button selected if you want to withdraw money from the bank */
            radio = gtk_radio_button_new_with_label(group, _("Withdraw"));
       -    gtk_table_attach_defaults(GTK_TABLE(table), radio, 0, 1, 3, 4);
       +    gtk_grid_attach(GTK_GRID(grid), radio, 0, 3, 1, 1);
          }
          label = gtk_label_new(Currency.Symbol);
          entry = gtk_entry_new();
       t@@ -2634,16 +2650,17 @@ void TransferDialog(gboolean Debt)
          g_object_set_data(G_OBJECT(dialog), "entry", entry);
          g_signal_connect(G_OBJECT(entry), "activate",
                           G_CALLBACK(TransferOK), dialog);
       +  gtk_widget_set_hexpand(entry, TRUE);
        
          if (Currency.Prefix) {
       -    gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 2, 4);
       -    gtk_table_attach_defaults(GTK_TABLE(table), entry, 2, 3, 2, 4);
       +    gtk_grid_attach(GTK_GRID(grid), label, 1, 2, 1, 2);
       +    gtk_grid_attach(GTK_GRID(grid), entry, 2, 2, 1, 2);
          } else {
       -    gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, 2, 4);
       -    gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 2, 4);
       +    gtk_grid_attach(GTK_GRID(grid), label, 2, 2, 1, 2);
       +    gtk_grid_attach(GTK_GRID(grid), entry, 1, 2, 1, 2);
          }
        
       -  gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
       +  gtk_box_pack_start(GTK_BOX(vbox), grid, TRUE, TRUE, 0);
        
          hsep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
          gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0);
       t@@ -3364,7 +3381,7 @@ static void CreateSpyReports(void)
        
        void DisplaySpyReports(Player *Play)
        {
       -  GtkWidget *dialog, *notebook, *vbox, *hbox, *frame, *label, *table;
       +  GtkWidget *dialog, *notebook, *vbox, *hbox, *frame, *label, *grid;
          GtkAccelGroup *accel_group;
          struct StatusWidgets Status;
          struct InventoryWidgets SpyDrugs, SpyGuns;
       t@@ -3378,8 +3395,8 @@ void DisplaySpyReports(Player *Play)
          vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
          frame = gtk_frame_new("Stats");
          gtk_container_set_border_width(GTK_CONTAINER(frame), 3);
       -  table = CreateStatusWidgets(&Status);
       -  gtk_container_add(GTK_CONTAINER(frame), table);
       +  grid = CreateStatusWidgets(&Status);
       +  gtk_container_add(GTK_CONTAINER(frame), grid);
          gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
        
          hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
 (DIR) diff --git a/src/gui_client/newgamedia.c b/src/gui_client/newgamedia.c
       t@@ -488,7 +488,7 @@ void NewGameDialog(Player *play)
        #endif
        
        #ifdef NETWORKING
       -  GtkWidget *clist, *scrollwin, *table, *hbbox, *defbutton;
       +  GtkWidget *clist, *scrollwin, *grid, *hbbox, *defbutton;
          GtkTreeSelection *treesel;
          gchar *ServerEntry, *text;
          gboolean UpdateMeta = FALSE;
       t@@ -550,15 +550,14 @@ void NewGameDialog(Player *play)
        #ifdef NETWORKING
          vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 7);
          gtk_container_set_border_width(GTK_CONTAINER(vbox2), 8);
       -  table = gtk_table_new(2, 2, FALSE);
       -  gtk_table_set_row_spacings(GTK_TABLE(table), 4);
       -  gtk_table_set_col_spacings(GTK_TABLE(table), 4);
       +  grid = gtk_grid_new();
       +  gtk_grid_set_row_spacing(GTK_GRID(grid), 4);
       +  gtk_grid_set_column_spacing(GTK_GRID(grid), 4);
        
          /* Prompt for hostname to connect to in GTK+ new game dialog */
          label = gtk_label_new(_("Host name"));
        
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
          entry = stgam.hostname = gtk_entry_new();
        
          ServerEntry = "localhost";
       t@@ -573,17 +572,18 @@ void NewGameDialog(Player *play)
            ServerEntry = ServerName;
        
          gtk_entry_set_text(GTK_ENTRY(entry), ServerEntry);
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 0, 1);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 0, 1, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
          label = gtk_label_new(_("Port"));
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 1, 1);
          entry = stgam.port = gtk_entry_new();
          text = g_strdup_printf("%d", Port);
          gtk_entry_set_text(GTK_ENTRY(entry), text);
          g_free(text);
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 1, 2);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 1, 1, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
        
       -  gtk_box_pack_start(GTK_BOX(vbox2), table, FALSE, FALSE, 0);
       +  gtk_box_pack_start(GTK_BOX(vbox2), grid, FALSE, FALSE, 0);
        
          button = gtk_button_new_with_label("");
          /* Button to connect to a named dopewars server */
       t@@ -719,7 +719,7 @@ static void DestroySocksAuth(GtkWidget *window, gpointer data)
        
        static void SocksAuthDialog(NetworkBuffer *netbuf, gpointer data)
        {
       -  GtkWidget *window, *button, *hsep, *vbox, *label, *entry, *table, *hbbox;
       +  GtkWidget *window, *button, *hsep, *vbox, *label, *entry, *grid, *hbbox;
          GtkAccelGroup *accel_group;
        
          window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
       t@@ -742,19 +742,20 @@ static void SocksAuthDialog(NetworkBuffer *netbuf, gpointer data)
        
          vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 7);
        
       -  table = gtk_table_new(2, 2, FALSE);
       -  gtk_table_set_row_spacings(GTK_TABLE(table), 10);
       -  gtk_table_set_col_spacings(GTK_TABLE(table), 5);
       +  grid = gtk_grid_new();
       +  gtk_grid_set_row_spacing(GTK_GRID(grid), 10);
       +  gtk_grid_set_column_spacing(GTK_GRID(grid), 5);
        
          label = gtk_label_new("User name:");
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
        
          entry = gtk_entry_new();
          g_object_set_data(G_OBJECT(window), "username", (gpointer)entry);
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 0, 1);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 0, 1, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
        
          label = gtk_label_new("Password:");
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 1, 1);
        
          entry = gtk_entry_new();
          g_object_set_data(G_OBJECT(window), "password", (gpointer)entry);
       t@@ -764,9 +765,10 @@ static void SocksAuthDialog(NetworkBuffer *netbuf, gpointer data)
          gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
        #endif
        
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 1, 2);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 1, 1, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
        
       -  gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
       +  gtk_box_pack_start(GTK_BOX(vbox), grid, TRUE, TRUE, 0);
        
          hsep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
          gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0);
 (DIR) diff --git a/src/gui_client/optdialog.c b/src/gui_client/optdialog.c
       t@@ -270,7 +270,7 @@ static GtkWidget *NewConfigEntry(gchar *name)
          return entry;
        }
        
       -static void AddStructConfig(GtkWidget *table, int row, gchar *structname,
       +static void AddStructConfig(GtkWidget *grid, int row, gchar *structname,
                                    struct ConfigMembers *member)
        {
          int ind;
       t@@ -284,15 +284,14 @@ static void AddStructConfig(GtkWidget *table, int row, gchar *structname,
            GtkWidget *check;
        
            check = gtk_check_button_new_with_label(_(member->label));
       -    gtk_table_attach(GTK_TABLE(table), check, 0, 2, row, row + 1,
       -                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
       +    gtk_grid_attach(GTK_GRID(grid), check, 0, row, 2, 1);
       +    gtk_widget_set_hexpand(check, TRUE);
            AddConfigWidget(check, ind);
          } else {
            GtkWidget *label, *entry;
        
            label = gtk_label_new(_(member->label));
       -    gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row + 1,
       -                     GTK_SHRINK, GTK_SHRINK, 0, 0);
       +    gtk_grid_attach(GTK_GRID(grid), label, 0, row, 1, 1);
            if (gvar->IntVal && gvar->MaxVal > gvar->MinVal) {
              GtkAdjustment *spin_adj = (GtkAdjustment *)
                  gtk_adjustment_new(gvar->MinVal, gvar->MinVal, gvar->MaxVal,
       t@@ -301,8 +300,8 @@ static void AddStructConfig(GtkWidget *table, int row, gchar *structname,
            } else {
              entry = gtk_entry_new();
            }
       -    gtk_table_attach(GTK_TABLE(table), entry, 1, 2, row, row + 1,
       -                     GTK_EXPAND | GTK_FILL, 0, 0, 0);
       +    gtk_grid_attach(GTK_GRID(grid), entry, 1, row, 1, 1);
       +    gtk_widget_set_hexpand(entry, TRUE);
            AddConfigWidget(entry, ind);
          }
        }
       t@@ -668,7 +667,7 @@ static void FinishOptDialog(GtkWidget *widget, gpointer data)
        
        static GtkWidget *CreateList(gchar *structname, struct ConfigMembers *members)
        {
       -  GtkWidget *hbox, *vbox, *hbbox, *tv, *scrollwin, *button, *table;
       +  GtkWidget *hbox, *vbox, *hbbox, *tv, *scrollwin, *button, *grid;
          GtkTreeSelection *treesel;
          GtkListStore *store;
          GtkCellRenderer *renderer;
       t@@ -763,16 +762,16 @@ static GtkWidget *CreateList(gchar *structname, struct ConfigMembers *members)
          gtk_box_pack_start(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
          gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
        
       -  table = gtk_table_new(nummembers + 1, 2, FALSE);
       -  gtk_table_set_row_spacings(GTK_TABLE(table), 5);
       -  gtk_table_set_col_spacings(GTK_TABLE(table), 5);
       +  grid = gtk_grid_new();
       +  gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
       +  gtk_grid_set_column_spacing(GTK_GRID(grid), 5);
        
       -  AddStructConfig(table, 0, structname, &namemember);
       +  AddStructConfig(grid, 0, structname, &namemember);
          for (i = 0; i < nummembers; i++) {
       -    AddStructConfig(table, i + 1, structname, &members[i]);
       +    AddStructConfig(grid, i + 1, structname, &members[i]);
          }
        
       -  gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 0);
       +  gtk_box_pack_start(GTK_BOX(hbox), grid, TRUE, TRUE, 0);
        
          return hbox;
        }
       t@@ -803,7 +802,7 @@ static void FillSoundsList(GtkTreeView *tv)
        
        void OptDialog(GtkWidget *widget, gpointer data)
        {
       -  GtkWidget *dialog, *notebook, *table, *label, *check, *entry;
       +  GtkWidget *dialog, *notebook, *label, *check, *entry, *grid;
          GtkWidget *hbox, *vbox, *vbox2, *hsep, *button, *hbbox, *tv;
          GtkWidget *scrollwin;
          GtkAccelGroup *accel_group;
       t@@ -858,67 +857,69 @@ void OptDialog(GtkWidget *widget, gpointer data)
        
          notebook = gtk_notebook_new();
        
       -  table = gtk_table_new(8, 3, FALSE);
       -  gtk_table_set_row_spacings(GTK_TABLE(table), 5);
       -  gtk_table_set_col_spacings(GTK_TABLE(table), 5);
       +  grid = gtk_grid_new();
       +  gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
       +  gtk_grid_set_column_spacing(GTK_GRID(grid), 5);
        
          check = NewConfigCheck("Sanitized", _("Remove drug references"));
       -  gtk_table_attach_defaults(GTK_TABLE(table), check, 0, 1, 0, 1);
       +  gtk_grid_attach(GTK_GRID(grid), check, 0, 0, 1, 1);
        
          check = gtk_check_button_new_with_label(_("Unicode config file"));
          gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), IsConfigFileUTF8());
       -  gtk_table_attach_defaults(GTK_TABLE(table), check, 1, 3, 0, 1);
       +  gtk_grid_attach(GTK_GRID(grid), check, 1, 0, 2, 1);
       +  gtk_widget_set_hexpand(check, TRUE);
          g_object_set_data(G_OBJECT(dialog), "unicode_check", check);
        
          label = gtk_label_new(_("Game length (turns)"));
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 1, 1);
          entry = NewConfigEntry("NumTurns");
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 3, 1, 2);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 1, 2, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
        
          label = gtk_label_new(_("Starting cash"));
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 2, 1, 1);
          entry = NewConfigEntry("StartCash");
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 3, 2, 3);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 2, 2, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
        
          label = gtk_label_new(_("Starting debt"));
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 3, 1, 1);
          entry = NewConfigEntry("StartDebt");
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 3, 3, 4);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 3, 2, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
        
          label = gtk_label_new(_("Currency symbol"));
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 4, 5,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 4, 1, 1);
          entry = NewConfigEntry("Currency.Symbol");
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 4, 5);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 4, 1, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
          check = NewConfigCheck("Currency.Prefix", _("Symbol prefixes prices"));
       -  gtk_table_attach_defaults(GTK_TABLE(table), check, 2, 3, 4, 5);
       +  gtk_grid_attach(GTK_GRID(grid), check, 2, 4, 1, 1);
       +  gtk_widget_set_hexpand(check, TRUE);
        
          label = gtk_label_new(_("Name of one bitch"));
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 5, 6,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 5, 1, 1);
          entry = NewConfigEntry("Names.Bitch");
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 3, 5, 6);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 5, 2, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
        
          label = gtk_label_new(_("Name of several bitches"));
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 6, 7,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 6, 1, 1);
          entry = NewConfigEntry("Names.Bitches");
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 3, 6, 7);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 6, 2, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
        
        #ifndef CYGWIN
          label = gtk_label_new(_("Web browser"));
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 7, 8,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 7, 1, 1);
          entry = NewConfigEntry("WebBrowser");
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 3, 7, 8);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 7, 2, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
        #endif
        
       -  gtk_container_set_border_width(GTK_CONTAINER(table), 7);
       +  gtk_container_set_border_width(GTK_CONTAINER(grid), 7);
          label = gtk_label_new(_("General"));
       -  gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, label);
       +  gtk_notebook_append_page(GTK_NOTEBOOK(notebook), grid, label);
        
          hbox = CreateList("Location", locmembers);
          gtk_container_set_border_width(GTK_CONTAINER(hbox), 7);
       t@@ -935,21 +936,21 @@ void OptDialog(GtkWidget *widget, gpointer data)
          hsep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
          gtk_box_pack_start(GTK_BOX(vbox2), hsep, FALSE, FALSE, 0);
        
       -  table = gtk_table_new(2, 2, FALSE);
       -  gtk_table_set_row_spacings(GTK_TABLE(table), 5);
       -  gtk_table_set_col_spacings(GTK_TABLE(table), 5);
       +  grid = gtk_grid_new();
       +  gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
       +  gtk_grid_set_column_spacing(GTK_GRID(grid), 5);
          label = gtk_label_new(_("Expensive string 1"));
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
          entry = NewConfigEntry("Drugs.ExpensiveStr1");
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 0, 1);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 0, 1, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
        
          label = gtk_label_new(_("Expensive string 2"));
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 1, 1);
          entry = NewConfigEntry("Drugs.ExpensiveStr2");
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 1, 2);
       -  gtk_box_pack_start(GTK_BOX(vbox2), table, FALSE, FALSE, 0);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 1, 1, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
       +  gtk_box_pack_start(GTK_BOX(vbox2), grid, FALSE, FALSE, 0);
        
          label = gtk_label_new(_("Drugs"));
          gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox2, label);
       t@@ -965,45 +966,42 @@ void OptDialog(GtkWidget *widget, gpointer data)
          gtk_notebook_append_page(GTK_NOTEBOOK(notebook), hbox, label);
        
        #ifdef NETWORKING
       -  table = gtk_table_new(6, 4, FALSE);
       -  gtk_table_set_row_spacings(GTK_TABLE(table), 5);
       -  gtk_table_set_col_spacings(GTK_TABLE(table), 5);
       +  grid = gtk_grid_new();
       +  gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
       +  gtk_grid_set_column_spacing(GTK_GRID(grid), 5);
        
          check = NewConfigCheck("MetaServer.Active",
                                 _("Server reports to metaserver"));
       -  gtk_table_attach(GTK_TABLE(table), check, 0, 2, 0, 1,
       -                   GTK_EXPAND | GTK_FILL, 0, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), check, 0, 0, 2, 1);
       +  gtk_widget_set_hexpand(check, TRUE);
        
        #ifdef CYGWIN
          check = NewConfigCheck("MinToSysTray", _("Minimize to System Tray"));
       -  gtk_table_attach(GTK_TABLE(table), check, 2, 4, 0, 1,
       -                   GTK_EXPAND | GTK_FILL, 0, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), check, 2, 0, 2, 1);
       +  gtk_widget_set_hexpand(check, TRUE);
        #endif
        
          label = gtk_label_new(_("Metaserver URL"));
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 1, 1);
          entry = NewConfigEntry("MetaServer.URL");
       -  gtk_table_attach(GTK_TABLE(table), entry, 1, 4, 1, 2,
       -                   GTK_EXPAND | GTK_FILL, 0, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 1, 3, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
        
          label = gtk_label_new(_("Comment"));
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 4, 5,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 4, 1, 1);
          entry = NewConfigEntry("MetaServer.Comment");
       -  gtk_table_attach(GTK_TABLE(table), entry, 1, 4, 4, 5,
       -                   GTK_EXPAND | GTK_FILL, 0, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 4, 3, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
        
          label = gtk_label_new(_("MOTD (welcome message)"));
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 5, 6,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), label, 0, 5, 1, 1);
          entry = NewConfigEntry("ServerMOTD");
       -  gtk_table_attach(GTK_TABLE(table), entry, 1, 4, 5, 6,
       -                   GTK_EXPAND | GTK_FILL, 0, 0, 0);
       +  gtk_grid_attach(GTK_GRID(grid), entry, 1, 5, 3, 1);
       +  gtk_widget_set_hexpand(entry, TRUE);
        
       -  gtk_container_set_border_width(GTK_CONTAINER(table), 7);
       +  gtk_container_set_border_width(GTK_CONTAINER(grid), 7);
          label = gtk_label_new(_("Server"));
       -  gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, label);
       +  gtk_notebook_append_page(GTK_NOTEBOOK(notebook), grid, label);
        #endif
        
          vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);