tSwitch from GtkCList to GtkTreeView for metaserver - 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 53ae389a1e9322660ba0a9a06e3921e80db96731
 (DIR) parent f19f8aaba7004c96d82945b3401c6d22cd1a014b
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Mon, 16 Nov 2020 21:57:52 -0800
       
       Switch from GtkCList to GtkTreeView for metaserver
       
       Use a GtkTreeView widget to show the metaserver
       information rather than a GtkCList. The latter is
       deprecated in GTK+2 and removed entirely in GTK+3.
       
       Diffstat:
         M src/gui_client/newgamedia.c         |     151 +++++++++++++++++++------------
       
       1 file changed, 93 insertions(+), 58 deletions(-)
       ---
 (DIR) diff --git a/src/gui_client/newgamedia.c b/src/gui_client/newgamedia.c
       t@@ -223,20 +223,31 @@ static void ConnectToServer(GtkWidget *widget, gpointer data)
          }
        }
        
       +/* Columns in metaserver list */
       +enum {
       +  META_COL_SERVER = 0,
       +  META_COL_PORT,
       +  META_COL_VERSION,
       +  META_COL_PLAYERS,
       +  META_COL_COMMENT,
       +  META_NUM_COLS
       +};
       +
        static void FillMetaServerList(gboolean UseNewList)
        {
          GtkWidget *metaserv;
       +  GtkListStore *store;
          ServerData *ThisServer;
       -  gchar *titles[5];
       +  GtkTreeIter iter;
          GSList *ListPt;
       -  gint row, width;
        
          if (UseNewList && !stgam.NewMetaList)
            return;
        
          metaserv = stgam.metaserv;
       -  gtk_clist_freeze(GTK_CLIST(metaserv));
       -  gtk_clist_clear(GTK_CLIST(metaserv));
       +  store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(metaserv)));
       +
       +  gtk_list_store_clear(store);
        
          if (UseNewList) {
            ClearServerList(&MetaList);
       t@@ -245,36 +256,27 @@ static void FillMetaServerList(gboolean UseNewList)
          }
        
          for (ListPt = MetaList; ListPt; ListPt = g_slist_next(ListPt)) {
       +    char *players;
            ThisServer = (ServerData *)(ListPt->data);
       -    titles[0] = ThisServer->Name;
       -    titles[1] = g_strdup_printf("%d", ThisServer->Port);
       -    titles[2] = ThisServer->Version;
            if (ThisServer->CurPlayers == -1) {
              /* Displayed if we don't know how many players are logged on to a
                 server */
       -      titles[3] = _("Unknown");
       +      players = _("Unknown");
            } else {
              /* e.g. "5 of 20" means 5 players are logged on to a server, out of
                 a maximum of 20 */
       -      titles[3] = g_strdup_printf(_("%d of %d"), ThisServer->CurPlayers,
       +      players = g_strdup_printf(_("%d of %d"), ThisServer->CurPlayers,
                                          ThisServer->MaxPlayers);
            }
       -    titles[4] = ThisServer->Comment;
       -    row = gtk_clist_append(GTK_CLIST(metaserv), titles);
       -    gtk_clist_set_row_data(GTK_CLIST(metaserv), row, (gpointer)ThisServer);
       -    g_free(titles[1]);
       +    gtk_list_store_append(store, &iter);
       +    gtk_list_store_set(store, &iter, META_COL_SERVER, ThisServer->Name,
       +                       META_COL_PORT, ThisServer->Port,
       +                       META_COL_VERSION, ThisServer->Version,
       +                       META_COL_PLAYERS, players,
       +                       META_COL_COMMENT, ThisServer->Comment, -1);
            if (ThisServer->CurPlayers != -1)
       -      g_free(titles[3]);
       +      g_free(players);
          }
       -  if (MetaList) {
       -    width = gtk_clist_optimal_column_width(GTK_CLIST(metaserv), 4);
       -    gtk_clist_set_column_width(GTK_CLIST(metaserv), 4, width);
       -    width = gtk_clist_optimal_column_width(GTK_CLIST(metaserv), 3);
       -    gtk_clist_set_column_width(GTK_CLIST(metaserv), 3, width);
       -    width = gtk_clist_optimal_column_width(GTK_CLIST(metaserv), 0);
       -    gtk_clist_set_column_width(GTK_CLIST(metaserv), 0, width);
       -  }
       -  gtk_clist_thaw(GTK_CLIST(metaserv));
        }
        
        void DisplayConnectStatus(NBStatus oldstatus, NBSocksStatus oldsocks)
       t@@ -352,18 +354,18 @@ static void UpdateMetaServerList(GtkWidget *widget)
        
        static void MetaServerConnect(GtkWidget *widget, gpointer data)
        {
       -  GList *selection;
       -  gint row;
       -  GtkWidget *clist;
       -  ServerData *ThisServer;
       +  GtkTreeSelection *treesel;
       +  GtkTreeModel *model;
       +  GtkTreeIter iter;
        
       -  clist = stgam.metaserv;
       -  selection = GTK_CLIST(clist)->selection;
       -  if (selection) {
       -    row = GPOINTER_TO_INT(selection->data);
       -    ThisServer = (ServerData *)gtk_clist_get_row_data(GTK_CLIST(clist), row);
       -    AssignName(&ServerName, ThisServer->Name);
       -    Port = ThisServer->Port;
       +  treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(stgam.metaserv));
       +
       +  if (gtk_tree_selection_get_selected(treesel, &model, &iter)) {
       +    gchar *name;
       +    gtk_tree_model_get(model, &iter, META_COL_SERVER, &name,
       +                       META_COL_PORT, &Port, -1);
       +    AssignName(&ServerName, name);
       +    g_free(name);
        
            if (GetStartGamePlayerName(&stgam.play->Name)) {
              DoConnect();
       t@@ -401,16 +403,54 @@ static void CloseNewGameDia(GtkWidget *widget, gpointer data)
        }
        
        #ifdef NETWORKING
       -static void metalist_row_select(GtkWidget *clist, gint row, gint column,
       -                                GdkEvent *event, GtkWidget *conn_button)
       +static void metalist_changed(GtkTreeSelection *sel, GtkWidget *conn_button)
        {
       -  gtk_widget_set_sensitive(conn_button, TRUE);
       +  gtk_widget_set_sensitive(conn_button,
       +                           gtk_tree_selection_count_selected_rows(sel) > 0);
        }
       +#endif
        
       -static void metalist_row_unselect(GtkWidget *clist, gint row, gint column,
       -                                  GdkEvent *event, GtkWidget *conn_button)
       +#ifdef NETWORKING
       +static GtkTreeModel *create_metaserver_model(void)
        {
       -  gtk_widget_set_sensitive(conn_button, FALSE);
       +  GtkListStore *store;
       +
       +  store = gtk_list_store_new(META_NUM_COLS, G_TYPE_STRING, G_TYPE_UINT,
       +                             G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
       +  return GTK_TREE_MODEL(store);
       +}
       +
       +static GtkWidget *create_metaserver_view(void)
       +{
       +  int i;
       +  GtkWidget *view;
       +  GtkTreeModel *model;
       +  GtkCellRenderer *renderer;
       +  GtkTreeViewColumn *col;
       +  gchar *server_titles[META_NUM_COLS];
       +  gboolean expand[META_NUM_COLS];
       +
       +  /* Column titles of metaserver information */
       +  server_titles[0] = _("Server");  expand[0] = TRUE;
       +  server_titles[1] = _("Port");    expand[1] = FALSE;
       +  server_titles[2] = _("Version"); expand[2] = FALSE;
       +  server_titles[3] = _("Players"); expand[3] = FALSE;
       +  server_titles[4] = _("Comment"); expand[4] = TRUE;
       +
       +  view = gtk_tree_view_new();
       +  renderer = gtk_cell_renderer_text_new();
       +  for (i = 0; i < META_NUM_COLS; ++i) {
       +    col = gtk_tree_view_column_new_with_attributes(
       +              server_titles[i], renderer, "text", i, NULL);
       +    gtk_tree_view_column_set_resizable(col, TRUE);
       +    gtk_tree_view_column_set_expand(col, expand[i]);
       +    gtk_tree_view_insert_column(GTK_TREE_VIEW(view), col, -1);
       +  }
       +  model = create_metaserver_model();
       +  gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);
       +  /* Tree view keeps a reference, so we can drop ours */
       +  g_object_unref(model);
       +  return view;
        }
        #endif
        
       t@@ -427,17 +467,11 @@ void NewGameDialog(Player *play)
        
        #ifdef NETWORKING
          GtkWidget *clist, *scrollwin, *table, *hbbox, *defbutton;
       -  gchar *server_titles[5], *ServerEntry, *text;
       +  GtkTreeSelection *treesel;
       +  gchar *ServerEntry, *text;
          gboolean UpdateMeta = FALSE;
          SetCurlCallback(MetaConn, glib_timeout, glib_socket);
        
       -  /* Column titles of metaserver information */
       -  server_titles[0] = _("Server");
       -  server_titles[1] = _("Port");
       -  server_titles[2] = _("Version");
       -  server_titles[3] = _("Players");
       -  server_titles[4] = _("Comment");
       -
          stgam.MetaConn = MetaConn;
          stgam.NewMetaList = NULL;
          stgam.sockstat = sockstat;
       t@@ -571,12 +605,15 @@ void NewGameDialog(Player *play)
          vbox2 = gtk_vbox_new(FALSE, 7);
          gtk_container_set_border_width(GTK_CONTAINER(vbox2), 4);
        
       -  clist = stgam.metaserv =
       -      gtk_scrolled_clist_new_with_titles(5, server_titles, &scrollwin);
       -  gtk_clist_column_titles_passive(GTK_CLIST(clist));
       -  gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_SINGLE);
       -  gtk_clist_set_column_width(GTK_CLIST(clist), 0, 130);
       -  gtk_clist_set_column_width(GTK_CLIST(clist), 1, 35);
       +  clist = stgam.metaserv = create_metaserver_view();
       +  gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(clist), FALSE);
       +  gtk_tree_selection_set_mode(
       +       gtk_tree_view_get_selection(GTK_TREE_VIEW(clist)), GTK_SELECTION_SINGLE);
       +  scrollwin = gtk_scrolled_window_new(NULL, NULL);
       +  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
       +                                 GTK_POLICY_AUTOMATIC,
       +                                 GTK_POLICY_AUTOMATIC);
       +  gtk_container_add (GTK_CONTAINER(scrollwin), clist);
        
          gtk_box_pack_start(GTK_BOX(vbox2), scrollwin, TRUE, TRUE, 0);
        
       t@@ -593,10 +630,8 @@ void NewGameDialog(Player *play)
          gtk_signal_connect(GTK_OBJECT(button), "clicked",
                             GTK_SIGNAL_FUNC(MetaServerConnect), NULL);
          gtk_widget_set_sensitive(button, FALSE);
       -  gtk_signal_connect(GTK_OBJECT(clist), "select_row",
       -                     GTK_SIGNAL_FUNC(metalist_row_select), button);
       -  gtk_signal_connect(GTK_OBJECT(clist), "unselect_row",
       -                     GTK_SIGNAL_FUNC(metalist_row_unselect), button);
       +  treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(clist));
       +  g_signal_connect(treesel, "changed", G_CALLBACK(metalist_changed), button);
          gtk_box_pack_start_defaults(GTK_BOX(hbbox), button);
        
          gtk_box_pack_start(GTK_BOX(vbox2), hbbox, FALSE, FALSE, 0);