<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
[email protected]
https://mail.gna.org/listinfo/freeciv-dev