<URL: http://bugs.freeciv.org/Ticket/Display.html?id=40773 >
Version 2 fixes the sdl client too. ----------------------------------------------------------------------- こしょうも。
client/gui-gtk-2.0/dialogs.c | 47 ++++++++++++++++++++++++++++++++--------- client/gui-sdl/dialogs.c | 21 +++++++++++++----- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/client/gui-gtk-2.0/dialogs.c b/client/gui-gtk-2.0/dialogs.c index a4efb61..0f78848 100644 --- a/client/gui-gtk-2.0/dialogs.c +++ b/client/gui-gtk-2.0/dialogs.c @@ -60,7 +60,7 @@ /******************************************************************/ static GtkWidget *races_shell; -struct player *races_player; +static char races_player_name[MAX_LEN_NAME]; static GtkWidget *races_nation_list[MAX_NUM_NATION_GROUPS + 1]; static GtkWidget *races_leader; static GList *races_leader_list; @@ -88,6 +88,7 @@ static void races_city_style_callback(GtkTreeSelection *select, gpointer data); static gboolean races_selection_func(GtkTreeSelection *select, GtkTreeModel *model, GtkTreePath *path, gboolean selected, gpointer data); +static const struct player *get_races_player(void); static int selected_nation; static int selected_sex; @@ -625,6 +626,7 @@ static GtkWidget* create_list_of_nations_in_group(struct nation_group* group, GtkTreeSelection *select; GtkCellRenderer *render; GtkTreeViewColumn *column; + const struct player *races_player = get_races_player(); store = gtk_list_store_new(5, G_TYPE_INT, G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING); @@ -777,7 +779,11 @@ static void create_races_dialog(struct player *pplayer) GTK_RESPONSE_ACCEPT, NULL); races_shell = shell; - races_player = pplayer; + if (pplayer) { + sz_strlcpy(races_player_name, player_name(pplayer)); + } else { + races_player_name[0] = '\0'; + } setup_dialog(shell, toplevel); gtk_window_set_position(GTK_WINDOW(shell), GTK_WIN_POS_CENTER_ON_PARENT); @@ -1233,13 +1239,22 @@ static void races_city_style_callback(GtkTreeSelection *select, gpointer data) **************************************************************************/ static void races_response(GtkWidget *w, gint response, gpointer data) { + const struct player *races_player; + int plrno; + + races_player = get_races_player(); + if (!races_player) { + popdown_races_dialog(); + return; + } + plrno = player_number(races_player); + if (response == GTK_RESPONSE_ACCEPT) { const char *s; if (selected_nation == -1) { - dsend_packet_nation_select_req(&aconnection, - races_player->player_no, - -1, FALSE, "", 0); + dsend_packet_nation_select_req(&aconnection, plrno, + -1, FALSE, "", 0); popdown_races_dialog(); return; } @@ -1263,13 +1278,10 @@ static void races_response(GtkWidget *w, gint response, gpointer data) return; } - dsend_packet_nation_select_req(&aconnection, - player_number(races_player), selected_nation, - selected_sex, s, selected_city_style); + dsend_packet_nation_select_req(&aconnection, plrno, selected_nation, + selected_sex, s, selected_city_style); } else if (response == GTK_RESPONSE_NO) { - dsend_packet_nation_select_req(&aconnection, - player_number(races_player), - -1, FALSE, "", 0); + dsend_packet_nation_select_req(&aconnection, plrno, -1, FALSE, "", 0); } else if (response == GTK_RESPONSE_CANCEL) { /* Nothing - this allows the player to keep his currently selected * nation. */ @@ -1334,3 +1346,16 @@ void popdown_all_game_dialogs(void) gui_dialog_destroy_all(); } +/************************************************************************** + Helper function to work-around the fact that players may be renumbered + over the life-time of the nation selection dialog. It uses player names + ('races_player_name') to try to uniquely determine the player that the + user wants to modify. + + NB: May return NULL. +**************************************************************************/ +static const struct player *get_races_player(void) +{ + return find_player_by_name(races_player_name); +} + diff --git a/client/gui-sdl/dialogs.c b/client/gui-sdl/dialogs.c index ac9aab4..bb1164e 100644 --- a/client/gui-sdl/dialogs.c +++ b/client/gui-sdl/dialogs.c @@ -72,7 +72,7 @@ #include "dialogs.h" -struct player *races_player; +static char races_player_name[MAX_LEN_NAME]; extern bool is_unit_move_blocked; extern void popdown_diplomat_dialog(void); @@ -2197,6 +2197,7 @@ static int races_dialog_ok_callback(struct widget *pStart_Button) if (Main.event.button.button == SDL_BUTTON_LEFT) { struct NAT *pSetup = (struct NAT *)(pNationDlg->pEndWidgetList->data.ptr); char *pStr = convert_to_chars(pSetup->pName_Edit->string16->text); + const struct player *races_player; /* perform a minimum of sanity test on the name */ if (strlen(pStr) == 0) { @@ -2208,10 +2209,14 @@ static int races_dialog_ok_callback(struct widget *pStart_Button) return (-1); } - dsend_packet_nation_select_req(&aconnection, player_number(races_player), - pSetup->nation, - pSetup->leader_sex, pStr, - pSetup->nation_city_style); + races_player = find_player_by_name(races_player_name); + if (races_player) { + dsend_packet_nation_select_req(&aconnection, + player_number(races_player), + pSetup->nation, + pSetup->leader_sex, pStr, + pSetup->nation_city_style); + } FC_FREE(pStr); popdown_races_dialog(); @@ -2677,7 +2682,11 @@ void popup_races_dialog(struct player *pplayer) return; } - races_player = pplayer; + if (pplayer) { + sz_strlcpy(races_player_name, player_name(pplayer)); + } else { + races_player_name[0] = '\0'; + } pNationDlg = fc_calloc(1, sizeof(struct ADVANCED_DLG));
_______________________________________________ Freeciv-dev mailing list Freeciv-dev@gna.org https://mail.gna.org/listinfo/freeciv-dev