<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

Reply via email to