<URL: http://bugs.freeciv.org/Ticket/Display.html?id=40241 >
Fixed ACTIVITY_FORTRESS & ACTIVITY_AIRBASE related crash in updating gui-win actions menu. It was easier to update whole menu to gui-gtk level of functionality (mainly: handle sensitivity better in respect to multiple focus units) than to make simple fix. For S2_2 and TRUNK - ML
diff -Nurd -X.diff_ignore freeciv/client/gui-win32/menu.c freeciv/client/gui-win32/menu.c --- freeciv/client/gui-win32/menu.c 2008-03-08 16:33:02.000000000 +0200 +++ freeciv/client/gui-win32/menu.c 2008-05-13 03:53:52.000000000 +0300 @@ -37,6 +37,7 @@ #include "chatline.h" #include "cityrep.h" #include "civclient.h" +#include "climisc.h" #include "clinet.h" #include "connectdlg_common.h" #include "control.h" @@ -725,7 +726,9 @@ unit_list_iterate(get_units_in_focus(), punit) { /* FIXME: this can provide different actions for different units... * not good! */ - if (can_unit_do_activity(punit, ACTIVITY_FORTRESS)) { + struct base_type *pbase = get_base_by_gui_type(BASE_GUI_FORTRESS, + punit, punit->tile); + if (pbase) { key_unit_fortress(); } else { key_unit_fortify(); @@ -1031,7 +1034,6 @@ } } else { - struct unit *punit; HMENU govts; /* remove previous government entries. */ @@ -1106,13 +1108,14 @@ return; } - if (NULL != (punit = head_of_units_in_focus())) { + if (get_num_units_in_focus() > 0) { const char *irrfmt = _("Change to %s"); const char *minfmt = _("Change to %s"); const char *transfmt = _("Transform to %s"); char irrtext[128], mintext[128], transtext[128]; char *roadtext; struct terrain *pterrain; + struct unit_list *punits = get_units_in_focus(); sz_strlcpy(irrtext, N_("Build Irrigation") "\tI"); sz_strlcpy(mintext, N_("Build Mine") "\tM"); @@ -1129,137 +1132,160 @@ /* Enable the button for adding to a city in all cases, so we get an eventual error message from the server if we try. */ my_enable_menu(menu, IDM_ORDERS_BUILD_CITY, - can_unit_add_or_build_city(punit) - || unit_can_help_build_wonder_here(punit)); + (can_units_do(punits, can_unit_add_or_build_city) + || can_units_do(punits, unit_can_help_build_wonder_here))); my_enable_menu(menu, IDM_ORDERS_ROAD, - can_unit_do_activity(punit, ACTIVITY_ROAD) - || can_unit_do_activity(punit, ACTIVITY_RAILROAD) - || unit_can_est_traderoute_here(punit)); + (can_units_do_activity(punits, ACTIVITY_ROAD) + || can_units_do_activity(punits, ACTIVITY_RAILROAD) + || can_units_do(punits, + unit_can_est_traderoute_here))); my_enable_menu(menu, IDM_ORDERS_IRRIGATE, - can_unit_do_activity(punit, ACTIVITY_IRRIGATE)); + can_units_do_activity(punits, ACTIVITY_IRRIGATE)); my_enable_menu(menu, IDM_ORDERS_MINE, - can_unit_do_activity(punit, ACTIVITY_MINE)); + can_units_do_activity(punits, ACTIVITY_MINE)); my_enable_menu(menu, IDM_ORDERS_TRANSFORM, - can_unit_do_activity(punit, ACTIVITY_TRANSFORM)); + can_units_do_activity(punits, ACTIVITY_TRANSFORM)); my_enable_menu(menu, IDM_ORDERS_FORTRESS, - can_unit_do_activity(punit, ACTIVITY_FORTRESS) - || can_unit_do_activity(punit, ACTIVITY_FORTIFYING)); + can_units_do_base_gui(punits, BASE_GUI_FORTRESS) + || can_units_do_activity(punits, ACTIVITY_FORTIFYING)); my_enable_menu(menu, IDM_ORDERS_AIRBASE, - can_unit_do_activity(punit, ACTIVITY_AIRBASE)); + can_units_do_base_gui(punits, BASE_GUI_AIRBASE)); my_enable_menu(menu, IDM_ORDERS_POLLUTION, - can_unit_do_activity(punit, ACTIVITY_POLLUTION) - || can_unit_paradrop(punit)); + (can_units_do_activity(punits, ACTIVITY_POLLUTION) + || can_units_do(punits, can_unit_paradrop))); my_enable_menu(menu, IDM_ORDERS_FALLOUT, - can_unit_do_activity(punit, ACTIVITY_FALLOUT)); + can_units_do_activity(punits, ACTIVITY_FALLOUT)); my_enable_menu(menu, IDM_ORDERS_SENTRY, - can_unit_do_activity(punit, ACTIVITY_SENTRY)); + can_units_do_activity(punits, ACTIVITY_SENTRY)); my_enable_menu(menu, IDM_ORDERS_PILLAGE, - can_unit_do_activity(punit, ACTIVITY_PILLAGE)); + can_units_do_activity(punits, ACTIVITY_PILLAGE)); my_enable_menu(menu, IDM_ORDERS_DISBAND, - !unit_has_type_flag(punit, F_UNDISBANDABLE)); + units_have_flag(punits, F_UNDISBANDABLE, FALSE)); + /* FIXME: Upgrade item missing */ my_enable_menu(menu, IDM_ORDERS_HOMECITY, - can_unit_change_homecity(punit)); + can_units_do(punits, can_unit_change_homecity)); my_enable_menu(menu, IDM_ORDERS_LOAD, - find_transporter_for_unit(punit)->id); + units_can_load(punits)); my_enable_menu(menu, IDM_ORDERS_UNLOAD, - (can_unit_unload(punit, game_find_unit_by_number(punit->transported_by)) - && can_unit_exist_at_tile(punit, punit->tile)) - || get_transporter_occupancy(punit) > 0); + units_are_occupied(punits)); my_enable_menu(menu, IDM_ORDERS_WAKEUP_OTHERS, - is_unit_activity_on_tile(ACTIVITY_SENTRY, - punit->tile)); + units_have_activity_on_tile(punits, + ACTIVITY_SENTRY)); my_enable_menu(menu, IDM_ORDERS_AUTO_SETTLER, - can_unit_do_autosettlers(punit)); + can_units_do(punits, can_unit_do_autosettlers)); my_enable_menu(menu, IDM_ORDERS_AUTO_EXPLORE, - can_unit_do_activity(punit, ACTIVITY_EXPLORE)); + can_units_do_activity(punits, ACTIVITY_EXPLORE)); my_enable_menu(menu, IDM_ORDERS_CONNECT_ROAD, - can_unit_do_connect(punit, ACTIVITY_ROAD)); + can_units_do_connect(punits, ACTIVITY_ROAD)); my_enable_menu(menu, IDM_ORDERS_CONNECT_RAIL, - can_unit_do_connect(punit, ACTIVITY_RAILROAD)); + can_units_do_connect(punits, ACTIVITY_RAILROAD)); my_enable_menu(menu, IDM_ORDERS_CONNECT_IRRIGATE, - can_unit_do_connect(punit, ACTIVITY_IRRIGATE)); + can_units_do_connect(punits, ACTIVITY_IRRIGATE)); my_enable_menu(menu, IDM_ORDERS_RETURN, TRUE); my_enable_menu(menu, IDM_ORDERS_DIPLOMAT_DLG, - is_diplomat_unit(punit) - && diplomat_can_do_action(punit, DIPLOMAT_ANY_ACTION, - punit->tile)); + can_units_do_diplomat_action(punits, DIPLOMAT_ANY_ACTION)); my_enable_menu(menu, IDM_ORDERS_NUKE, - unit_has_type_flag(punit, F_NUCLEAR)); - if (unit_has_type_flag(punit, F_HELP_WONDER)) { + units_have_flag(punits, F_NUCLEAR, TRUE)); + if (units_have_flag(punits, F_HELP_WONDER, TRUE)) { my_rename_menu(menu, IDM_ORDERS_BUILD_CITY, N_("Help Build Wonder") "\tB"); - } else if (unit_has_type_flag(punit, F_CITIES)) { - if (tile_city(punit->tile)) { - my_rename_menu(menu, IDM_ORDERS_BUILD_CITY, N_("Add to City") - "\tB"); - } else { + } else { + bool city_on_tile = FALSE; + + /* FIXME: this overloading doesn't work well with multiple focus + * units. */ + unit_list_iterate(punits, punit) { + if (tile_city(punit->tile)) { + city_on_tile = TRUE; + break; + } + } unit_list_iterate_end; + + if (city_on_tile && units_have_flag(punits, F_ADD_TO_CITY, TRUE)) { + my_rename_menu(menu, IDM_ORDERS_BUILD_CITY, N_("Add to City") + "\tB"); + } else { my_rename_menu(menu, IDM_ORDERS_BUILD_CITY, N_("Build City") "\tB"); - } - } else { - my_rename_menu(menu, IDM_ORDERS_BUILD_CITY, N_("Build City") "\tB"); + } } - if (unit_has_type_flag(punit, F_TRADE_ROUTE)) { - my_rename_menu(menu, IDM_ORDERS_ROAD, N_("Make Trade Route") "\tR"); - } else if (unit_has_type_flag(punit, F_SETTLERS)) { - if (tile_has_special(punit->tile, S_ROAD)) { - roadtext = N_("Build Railroad") "\tR"; - road_activity = ACTIVITY_RAILROAD; + if (units_have_flag(punits, F_TRADE_ROUTE, TRUE)) { + my_rename_menu(menu, IDM_ORDERS_ROAD, N_("Make Trade Route") "\tR"); + } else if (units_have_flag(punits, F_SETTLERS, TRUE)) { + bool has_road = FALSE; + + /* FIXME: this overloading doesn't work well with multiple focus + * units. */ + unit_list_iterate(punits, punit) { + if (tile_has_special(punit->tile, S_ROAD)) { + has_road = TRUE; + break; + } + } unit_list_iterate_end; + + if (has_road) { + roadtext = N_("Build Railroad") "\tR"; + road_activity=ACTIVITY_RAILROAD; } else { - roadtext = N_("Build Road") "\tR"; - road_activity = ACTIVITY_ROAD; + roadtext = N_("Build Road") "\tR"; + road_activity=ACTIVITY_ROAD; } + my_rename_menu(menu, IDM_ORDERS_ROAD, roadtext); } else { my_rename_menu(menu, IDM_ORDERS_ROAD, N_("Build Road") "\tR"); } - pterrain = tile_terrain(punit->tile); - if (pterrain->irrigation_result != T_NONE - && pterrain->irrigation_result != pterrain) { - my_snprintf(irrtext, sizeof(irrtext), irrfmt, - get_tile_change_menu_text(punit->tile, - ACTIVITY_IRRIGATE)); - sz_strlcat(irrtext, "\tI"); - } else if (tile_has_special(punit->tile, S_IRRIGATION) - && player_knows_techs_with_flag(client.conn.playing, - TF_FARMLAND)) { - sz_strlcpy(irrtext, N_("Build Farmland") "\tI"); - } - if (pterrain->mining_result != T_NONE - && pterrain->mining_result != pterrain) { - my_snprintf(mintext, sizeof(mintext), minfmt, - get_tile_change_menu_text(punit->tile, ACTIVITY_MINE)); - sz_strlcat(mintext, "\tM"); - } - if (pterrain->transform_result != T_NONE - && pterrain->transform_result != pterrain) { - my_snprintf(transtext, sizeof(transtext), transfmt, - get_tile_change_menu_text(punit->tile, - ACTIVITY_TRANSFORM)); - sz_strlcat(transtext, "\tO"); + if (unit_list_size(punits) == 1) { + struct unit *punit = unit_list_get(punits, 0); + + pterrain = tile_terrain(punit->tile); + if (pterrain->irrigation_result != T_NONE + && pterrain->irrigation_result != pterrain) { + my_snprintf(irrtext, sizeof(irrtext), irrfmt, + get_tile_change_menu_text(punit->tile, + ACTIVITY_IRRIGATE)); + sz_strlcat(irrtext, "\tI"); + } else if (tile_has_special(punit->tile, S_IRRIGATION) + && player_knows_techs_with_flag(client.conn.playing, + TF_FARMLAND)) { + sz_strlcpy(irrtext, N_("Build Farmland") "\tI"); + } + if (pterrain->mining_result != T_NONE + && pterrain->mining_result != pterrain) { + my_snprintf(mintext, sizeof(mintext), minfmt, + get_tile_change_menu_text(punit->tile, ACTIVITY_MINE)); + sz_strlcat(mintext, "\tM"); + } + if (pterrain->transform_result != T_NONE + && pterrain->transform_result != pterrain) { + my_snprintf(transtext, sizeof(transtext), transfmt, + get_tile_change_menu_text(punit->tile, + ACTIVITY_TRANSFORM)); + sz_strlcat(transtext, "\tO"); + } } my_rename_menu(menu, IDM_ORDERS_IRRIGATE, irrtext); my_rename_menu(menu, IDM_ORDERS_MINE, mintext); my_rename_menu(menu, IDM_ORDERS_TRANSFORM, transtext); - if (can_unit_do_activity(punit, ACTIVITY_FORTIFYING)) { + if (can_units_do_activity(punits, ACTIVITY_FORTIFYING)) { my_rename_menu(menu, IDM_ORDERS_FORTRESS, N_("Fortify") "\tF"); } else { my_rename_menu(menu, IDM_ORDERS_FORTRESS, N_("Build Fortress") "\tF"); } - if (unit_has_type_flag(punit, F_PARATROOPERS)) { + if (units_have_flag(punits, F_PARATROOPERS, TRUE)) { my_rename_menu(menu, IDM_ORDERS_POLLUTION, N_("Paradrop") "\tP"); } else { my_rename_menu(menu, IDM_ORDERS_POLLUTION, N_("Clean Pollution") "\tP"); } - if (!unit_has_type_flag(punit, F_SETTLERS)) { + if (units_have_flag(punits, F_SETTLERS, FALSE)) { my_rename_menu(menu, IDM_ORDERS_AUTO_SETTLER, N_("Auto Attack") "\tA"); } else {
_______________________________________________ Freeciv-dev mailing list Freeciv-dev@gna.org https://mail.gna.org/listinfo/freeciv-dev