Index: client/gui-gtk/dialogs.c =================================================================== RCS file: /home/freeciv/CVS/freeciv/client/gui-gtk/dialogs.c,v retrieving revision 1.40 diff -b -u -d -r1.40 dialogs.c --- dialogs.c 2000/03/15 18:44:38 1.40 +++ dialogs.c 2000/03/18 14:59:56 @@ -33,6 +33,7 @@ #include "packets.h" #include "player.h" #include "support.h" +#include "rand.h" #include "chatline.h" #include "civclient.h" @@ -44,7 +45,6 @@ #include "dialogs.h" - extern GtkWidget *toplevel; extern GdkWindow *root_window; extern struct connection aconnection; @@ -68,6 +68,11 @@ **city_style_toggles = NULL, *races_name; /* leader name */ GList *leader_strings = NULL; +GList *sorted_races_list = NULL; /* contains a list of race + ids sorted by the race + name. Is valid as long + as the races_dialog is + poped up. */ /******************************************************************/ GtkWidget *spy_tech_shell; GtkWidget *spy_advances_list, *spy_advances_list_label; @@ -107,6 +112,7 @@ void city_style_toggles_callback ( GtkWidget *w, gpointer data ); int selected_nation; +int selected_leader; int selected_sex; int selected_city_style; int city_style_idx[64]; /* translation table basic style->city_style */ @@ -1341,7 +1347,7 @@ static void unit_connect_callback (GtkWidget *w, gpointer data) { struct unit *punit; - int activity = (int)data; + int activity = GPOINTER_TO_INT(data); if (!is_showing_unit_connect_dialog) { destroy_message_dialog(w); @@ -1715,7 +1721,8 @@ *****************************************************************/ static gint cmp_func(gconstpointer a_p, gconstpointer b_p) { - return strcmp(get_nation_name((int)a_p),get_nation_name((int)b_p)); + return strcmp(get_nation_name(GPOINTER_TO_INT(a_p)), + get_nation_name(GPOINTER_TO_INT(b_p))); } /**************************************************************** @@ -1730,7 +1737,8 @@ GSList *cgroup = NULL; GtkWidget *f, *fs, *fa; char **leaders; - GList *sorted_races_list=NULL; + /* The race which will be initially selected */ + int start_race_id = myrand(game.playable_nation_count); races_dialog_shell = gtk_dialog_new(); gtk_signal_connect( GTK_OBJECT(races_dialog_shell),"delete_event", @@ -1753,11 +1761,11 @@ races_toggles = fc_calloc( game.playable_nation_count, sizeof(GtkWidget*) ); for(i=0; ientry), leaders[0]); gtk_box_pack_start( GTK_BOX( GTK_DIALOG( races_dialog_shell )->vbox ), races_name, FALSE, FALSE, 0 ); @@ -1887,24 +1894,28 @@ /* ------- set initial selections ------- */ - selected_nation = (int)(g_list_nth_data(sorted_races_list, 0)); - gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON( races_toggles[0] ), TRUE ); - selected_sex = get_nation_leader_sex( 0, leaders[0]); + selected_nation = start_race_id; + gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON( + races_toggles[g_list_index(sorted_races_list, + GINT_TO_POINTER(start_race_id))] ), TRUE ); + + selected_leader=myrand(leader_num); + gtk_entry_set_text( GTK_ENTRY(GTK_COMBO(races_name)->entry), + leaders[selected_leader]); + + selected_sex = get_nation_leader_sex( start_race_id, + leaders[selected_leader]); gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON( races_sex_toggles[selected_sex?0:1]), TRUE); - selected_city_style = city_style_ridx[get_nation_city_style(0)]; + selected_city_style = city_style_ridx[get_nation_city_style(start_race_id)]; gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON( - city_style_toggles[selected_city_style] ), TRUE ); + city_style_toggles[selected_city_style] ), + TRUE ); gtk_widget_show_all( GTK_DIALOG(races_dialog_shell)->vbox ); gtk_widget_show_all( GTK_DIALOG(races_dialog_shell)->action_area ); - - /* ------- cleanup ------- */ - - g_list_free(sorted_races_list); - sorted_races_list = NULL; } @@ -1930,9 +1941,11 @@ for(i=0; i>=1; } @@ -1940,9 +1953,11 @@ for(i=32; i>=1; } @@ -1970,21 +1985,23 @@ **************************************************************************/ void races_toggles_callback( GtkWidget *w, gpointer race_id_p ) { - int j, leader_count,race_id=(int)race_id_p; + int j, leader_num,race_id=GPOINTER_TO_INT(race_id_p); char **leaders; g_list_free(leader_strings); leader_strings = 0; - leaders = get_nation_leader_names( race_id, &leader_count); - for( j=0; jentry), leaders[0]); + selected_leader = myrand(leader_num); + gtk_entry_set_text( GTK_ENTRY(GTK_COMBO(races_name)->entry), + leaders[selected_leader]); selected_nation = race_id; - selected_sex = get_nation_leader_sex(race_id,leaders[0]); + selected_sex = get_nation_leader_sex(race_id,leaders[selected_leader]); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON( races_sex_toggles[selected_sex?0:1]), TRUE); selected_city_style = city_style_ridx[get_nation_city_style(race_id)]; @@ -2049,6 +2066,9 @@ if(w==races_quit_command) { exit(0); } else if(w==races_disc_command) { + g_list_free(sorted_races_list); + sorted_races_list = NULL; + popdown_races_dialog(); disconnect_from_server(); return; @@ -2082,6 +2102,11 @@ return; } + /* ------- cleanup ------- */ + + g_list_free(sorted_races_list); + sorted_races_list = NULL; + packet.name[0]=toupper(packet.name[0]); send_packet_alloc_nation(&aconnection, &packet);