Freeciv-3.4
Loading...
Searching...
No Matches
diplodlg.c
Go to the documentation of this file.
1/***********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
6 any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12***********************************************************************/
13
14#ifdef HAVE_CONFIG_H
15#include <fc_config.h>
16#endif
17
18#include <stdio.h>
19#include <stdlib.h>
20
21#include <gtk/gtk.h>
22
23/* utility */
24#include "log.h"
25#include "mem.h"
26#include "shared.h"
27#include "support.h"
28
29/* common */
30#include "diptreaty.h"
31#include "fcintl.h"
32#include "game.h"
33#include "government.h"
34#include "map.h"
35#include "nation.h"
36#include "packets.h"
37#include "player.h"
38#include "research.h"
39
40/* client */
41#include "chatline.h"
42#include "client_main.h"
43#include "climisc.h"
44#include "options.h"
45
46/* client/gui-gtk-5.0 */
47#include "diplodlg.h"
48#include "gui_main.h"
49#include "gui_stuff.h"
50#include "mapview.h"
51#include "plrdlg.h"
52
53struct Diplomacy_dialog {
54 struct treaty *treaty;
55 struct gui_dialog *dialog;
56
59
61};
62
63struct Diplomacy_notebook {
64 struct gui_dialog *dialog;
66};
67
68struct city_deal {
69 int giver;
70 int receiver;
71 int id;
72};
73
74#define SPECLIST_TAG dialog
75#define SPECLIST_TYPE struct Diplomacy_dialog
76#include "speclist.h"
77
78#define dialog_list_iterate(dialoglist, pdialog) \
79 TYPED_LIST_ITERATE(struct Diplomacy_dialog, dialoglist, pdialog)
80#define dialog_list_iterate_end LIST_ITERATE_END
81
82static struct dialog_list *dialog_list;
84
86 struct player *plr0,
87 struct player *plr1);
88
90static void popup_diplomacy_dialog(struct treaty *ptreaty, struct player *they,
91 struct player *initiator);
93 GVariant *parameter,
94 gpointer data);
96 GVariant *parameter,
97 gpointer data);
98
100 GVariant *parameter,
101 gpointer data);
103 GVariant *parameter,
104 gpointer data);
106 GVariant *parameter,
107 gpointer data);
109 GVariant *parameter,
110 gpointer data);
112 GVariant *parameter,
113 gpointer data);
115 GVariant *parameter,
116 gpointer data);
118 GVariant *parameter,
119 gpointer data);
121 GVariant *parameter,
122 gpointer data);
123
124static void close_diplomacy_dialog(struct Diplomacy_dialog *pdialog);
125static void update_diplomacy_dialog(struct Diplomacy_dialog *pdialog);
126static void diplo_dialog_returnkey(GtkWidget *w, gpointer data);
127
128static struct Diplomacy_notebook *diplomacy_main_create(void);
129static void diplomacy_main_destroy(void);
130static void diplomacy_main_response(struct gui_dialog *dlg, int response,
131 gpointer data);
132
133#define RESPONSE_CANCEL_MEETING 100
134#define RESPONSE_CANCEL_MEETING_ALL 101
135
136
137#define FC_TYPE_CLAUSE_ROW (fc_clause_row_get_type())
138
140
147
152
154
155/**********************************************************************/
158static void
162
163/**********************************************************************/
166static void
170
171/**********************************************************************/
174#if 0
175static FcClauseRow *fc_clause_row_new(void)
176{
177 FcClauseRow *result;
178
179 result = g_object_new(FC_TYPE_CLAUSE_ROW, nullptr);
180
181 return result;
182}
183#endif
184
185/************************************************************************/
189{
191
192 if (!pdialog) {
193 return;
194 }
195
196 fc_assert(pdialog->treaty == ptreaty);
197
199 gui_dialog_alert(pdialog->dialog);
200}
201
202/************************************************************************/
210
211/************************************************************************/
215 struct player *initiator)
216{
218
219 if (!pdialog) {
220 return;
221 }
222
223 fc_assert(pdialog->treaty == ptreaty);
224
225 close_diplomacy_dialog(pdialog);
226}
227
228/**********************************************************************/
232{
233 /* Not needed */
234}
235
236/************************************************************************/
240{
242
243 if (!pdialog) {
244 return;
245 }
246
247 fc_assert(pdialog->treaty == ptreaty);
248
250 gui_dialog_alert(pdialog->dialog);
251}
252
253/************************************************************************/
257{
259
260 if (!pdialog) {
261 return;
262 }
263
264 fc_assert(pdialog->treaty == ptreaty);
265
267 gui_dialog_alert(pdialog->dialog);
268}
269
270/************************************************************************/
273static void popup_diplomacy_dialog(struct treaty *ptreaty, struct player *they,
274 struct player *initiator)
275{
277
278 if (!is_human(client_player())) {
279 return; /* Don't show if we are not human controlled. */
280 }
281
282 if (!pdialog) {
284 }
285
286 gui_dialog_present(pdialog->dialog);
287 /* We initiated the meeting - Make the tab active */
288 if (initiator == client_player()) {
289 /* We have to raise the diplomacy meeting tab as well as the selected
290 * meeting. */
292
294 gui_dialog_raise(pdialog->dialog);
295
296 if (players_dialog_shell != NULL) {
298 }
299 }
300}
301
302/************************************************************************/
306{
307 const struct advance *padvance1 = (const struct advance *) a;
308 const struct advance *padvance2 = (const struct advance *) b;
309
312}
313
314/************************************************************************/
318 struct Diplomacy_dialog *pdialog,
319 struct player *partner, bool them)
320{
322 GSimpleAction *act;
323 bool any_map = FALSE;
324 char act_plr_part[20];
325 char act_name[60];
326 struct player *pgiver, *pother;
327
328 if (them) {
329 fc_strlcpy(act_plr_part, "_them", sizeof(act_plr_part));
330 pgiver = partner;
332 } else {
333 fc_strlcpy(act_plr_part, "_us", sizeof(act_plr_part));
335 pother = partner;
336 }
337
339
340 /* Maps. */
343
344 fc_snprintf(act_name, sizeof(act_name), "worldmap%s", act_plr_part);
346 g_object_set_data(G_OBJECT(act), "plr", pgiver);
349 pdialog);
350
351 fc_snprintf(act_name, sizeof(act_name), "win.worldmap%s", act_plr_part);
353
354 any_map = TRUE;
355 }
356
358 if (!any_map) {
360 }
361
362 fc_snprintf(act_name, sizeof(act_name), "seamap%s", act_plr_part);
364 g_object_set_data(G_OBJECT(act), "plr", pgiver);
367 pdialog);
368
369 fc_snprintf(act_name, sizeof(act_name), "win.seamap%s", act_plr_part);
371
372 any_map = TRUE;
373 }
374
375 if (any_map) {
377 }
378
379 /* Trading: advances */
381 const struct research *gresearch = research_get(pgiver);
382 const struct research *oresearch = research_get(pother);
385 int i;
386
388
391
393 && (!team_embassy /* We don't know what the other could actually receive */
398 == TECH_PREREQS_KNOWN)) {
400 }
402
403 if (NULL != sorting_list) {
405 const struct advance *padvance;
406
408
409 /* TRANS: All technologies menu item in the diplomatic dialog. */
410 fc_snprintf(act_name, sizeof(act_name), "advance%sall", act_plr_part);
412
413 g_object_set_data(G_OBJECT(act), "player_from",
415 g_object_set_data(G_OBJECT(act), "player_to",
418 g_signal_connect(act, "activate",
421
422 fc_snprintf(act_name, sizeof(act_name), "win.advance%sall", act_plr_part);
424
425 for (list_item = sorting_list, i = 0; NULL != list_item;
427
428 fc_snprintf(act_name, sizeof(act_name), "advance%s%d",
429 act_plr_part, i);
431
432 padvance = (const struct advance *) list_item->data;
433 g_object_set_data(G_OBJECT(act), "player_from",
435 g_object_set_data(G_OBJECT(act), "player_to",
438 g_signal_connect(act, "activate",
441
442 fc_snprintf(act_name, sizeof(act_name), "win.advance%s%d",
443 act_plr_part, i);
446 act_name));
447 }
448
450 }
451
453 }
454
455 /* Trading: cities. */
456
457 /****************************************************************
458 Creates a sorted list of plr0's cities, excluding the capital and
459 any cities not visible to plr1. This means that you can only trade
460 cities visible to requesting player.
461
462 - Kris Bubendorfer
463 *****************************************************************/
465 int i = 0;
466 int n = city_list_size(pgiver->cities);
467
469
470 if (n > 0) {
471 struct city **city_list_ptrs;
472
473 city_list_ptrs = fc_malloc(sizeof(struct city *) * n);
474
475 city_list_iterate(pgiver->cities, pcity) {
476 if (!is_capital(pcity)) {
478 i++;
479 }
481
482 if (i > 0) { /* Cities other than capitals */
483 int j;
484
485 qsort(city_list_ptrs, i, sizeof(struct city *), city_name_compare);
486
487 for (j = 0; j < i; j++) {
488 struct city_deal *deal = fc_malloc(sizeof(struct city_deal));
489
490 fc_snprintf(act_name, sizeof(act_name), "city%s%d", act_plr_part, j);
492
493 deal->giver = player_number(pgiver);
494 deal->receiver = player_number(pother);
495 deal->id = city_list_ptrs[j]->id;
496
498 g_signal_connect(act, "activate",
500 (gpointer)deal);
501
502 fc_snprintf(act_name, sizeof(act_name), "win.city%s%d",
503 act_plr_part, j);
506 act_name));
507 }
508 }
509
511 }
512
514 }
515
516 /* Give shared vision. */
518 fc_snprintf(act_name, sizeof(act_name), "vision%s", act_plr_part);
520 g_object_set_data(G_OBJECT(act), "plr", pgiver);
523 pdialog);
524
525 fc_snprintf(act_name, sizeof(act_name), "win.vision%s", act_plr_part);
526 menu_item_append_unref(topmenu, g_menu_item_new(_("_Give shared vision"), act_name));
527
530 }
531
532 /* Give embassy. */
534 fc_snprintf(act_name, sizeof(act_name), "embassy%s", act_plr_part);
536 g_object_set_data(G_OBJECT(act), "plr", pgiver);
539 pdialog);
540
541 fc_snprintf(act_name, sizeof(act_name), "win.embassy%s", act_plr_part);
543
544 /* Don't take in account the embassy effects. */
547 }
548
549 /* Shared tiles */
551 fc_snprintf(act_name, sizeof(act_name), "tiles%s", act_plr_part);
553 g_object_set_data(G_OBJECT(act), "plr", pgiver);
556 pdialog);
557
558 fc_snprintf(act_name, sizeof(act_name), "win.tiles%s", act_plr_part);
560 }
561
562 /* Pacts. */
563 if (pgiver == pdialog->treaty->plr0) {
564 enum diplstate_type ds;
565 int pact_clauses = 0;
566
568
570
572 fc_snprintf(act_name, sizeof(act_name), "ceasefire%s", act_plr_part);
575 g_signal_connect(act, "activate",
577
578 fc_snprintf(act_name, sizeof(act_name), "win.ceasefire%s", act_plr_part);
580 g_menu_item_new(Q_("?diplomatic_state:Cease-fire"),
581 act_name));
582
584 ds != DS_CEASEFIRE && ds != DS_TEAM);
585 pact_clauses++;
586 }
587
589 fc_snprintf(act_name, sizeof(act_name), "peace%s", act_plr_part);
592 g_signal_connect(act, "activate",
594
595 fc_snprintf(act_name, sizeof(act_name), "win.peace%s", act_plr_part);
596 menu_item_append_unref(submenu, g_menu_item_new(Q_("?diplomatic_state:Peace"),
597 act_name));
598
600 ds != DS_PEACE && ds != DS_TEAM);
601 pact_clauses++;
602 }
603
605 fc_snprintf(act_name, sizeof(act_name), "alliance%s", act_plr_part);
608 g_signal_connect(act, "activate",
610
611 fc_snprintf(act_name, sizeof(act_name), "win.alliance%s", act_plr_part);
613 g_menu_item_new(Q_("?diplomatic_state:Alliance"),
614 act_name));
615
617 ds != DS_ALLIANCE && ds != DS_TEAM);
618 pact_clauses++;
619 }
620
621 if (pact_clauses > 0) {
623 } else {
625 }
626 }
627
628 return topmenu;
629}
630
631/************************************************************************/
636{
637 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *)data;
638 gint i;
639 gint *index;
640
641 index = gtk_tree_path_get_indices(path);
642
643 i = 0;
645 if (i == index[0]) {
647 player_number(pdialog->treaty->plr1),
648 player_number(pclause->from),
649 pclause->type,
650 pclause->value);
651 return;
652 }
653 i++;
655}
656
657/************************************************************************/
702
703/************************************************************************/
706static void diplomacy_main_destroy(void)
707{
708 if (dipl_main->dialog) {
710 }
712 dipl_main = NULL;
713}
714
715/************************************************************************/
718static void diplomacy_main_response(struct gui_dialog *dlg, int response,
719 gpointer data)
720{
721 if (!dipl_main) {
722 return;
723 }
724
725 switch (response) {
726 default:
727 log_error("unhandled response in %s: %d", __FUNCTION__, response);
728 fc__fallthrough; /* No break. */
729 case GTK_RESPONSE_DELETE_EVENT: /* GTK: delete the widget. */
730 case RESPONSE_CANCEL_MEETING_ALL: /* Cancel all meetings. */
732 /* This will do a round trip to the server and close the dialog in the
733 * client. Closing the last dialog will also close the main tab.*/
736 adialog->treaty->plr1));
738 break;
739 }
740}
741
742/************************************************************************/
745static void diplomacy_destroy(struct Diplomacy_dialog *pdialog)
746{
747 if (NULL != pdialog->dialog) {
748 /* pdialog->dialog may be NULL if the tab has been destroyed
749 * by an other way. */
750 gui_dialog_destroy(pdialog->dialog);
751 pdialog->dialog = NULL;
752 }
754
755 if (dialog_list) {
756 /* Diplomatic meetings in one main tab. */
757 if (dialog_list_size(dialog_list) > 0) {
758 if (dipl_main && dipl_main->dialog) {
759 gchar *buf;
760
761 buf = g_strdup_printf(_("Diplomacy [%d]"), dialog_list_size(dialog_list));
763 g_free(buf);
764 }
765 } else if (dipl_main) {
766 /* No meeting left - destroy main tab. */
768 }
769 }
770
771 /* Last sub-tab must not be freed before diplomacy_main_destroy() call. */
772 free(pdialog);
773}
774
775/************************************************************************/
778static void diplomacy_response(struct gui_dialog *dlg, int response,
779 gpointer data)
780{
781 struct Diplomacy_dialog *pdialog = NULL;
782
783 fc_assert_ret(data);
784
785 pdialog = (struct Diplomacy_dialog *)data;
786
787 switch (response) {
788 case GTK_RESPONSE_ACCEPT: /* Accept treaty. */
791 pdialog->treaty->plr1));
792 break;
793
794 default:
795 log_error("unhandled response in %s: %d", __FUNCTION__, response);
796 fc__fallthrough; /* No break. */
797 case GTK_RESPONSE_DELETE_EVENT: /* GTK: delete the widget. */
798 case GTK_RESPONSE_CANCEL: /* GTK: cancel button. */
799 case RESPONSE_CANCEL_MEETING: /* Cancel meetings. */
802 pdialog->treaty->plr1));
803 break;
804 }
805}
806
807/************************************************************************/
811 struct player *plr0,
812 struct player *plr1)
813{
815 GtkWidget *vbox, *hgrid, *table, *mainbox;
816 GtkWidget *label, *sw, *view, *pic, *spin;
818 struct sprite *flag_spr;
819 GtkListStore *store;
821 int i;
822 struct Diplomacy_dialog *pdialog;
823 char plr_buf[4 * MAX_LEN_NAME];
824 gchar *buf;
825 int grid_col = 0;
826 int main_row = 0;
827 GActionGroup *group;
828 GMenu *menu;
829
830 pdialog = fc_malloc(sizeof(*pdialog));
831
833 pdialog->treaty = ptreaty;
834
835 /* Get main diplomacy tab. */
837
838 buf = g_strdup_printf(_("Diplomacy [%d]"), dialog_list_size(dialog_list));
840 g_free(buf);
841
842 notebook = dipl_dialog->notebook;
843
844 gui_dialog_new(&(pdialog->dialog), GTK_NOTEBOOK(notebook), pdialog, FALSE);
845
846 /* Buttons */
848 _("Accept treaty"), GTK_RESPONSE_ACCEPT);
850 _("Cancel meeting"), RESPONSE_CANCEL_MEETING);
851
852 /* Responses for one meeting. */
854
855 /* Label for the new meeting. */
858
859 /* Sort meeting tabs alphabetically by the tab label. */
860 for (i = 0; i < gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)); i++) {
863 struct gui_dialog *prev_dialog
864 = g_object_get_data(G_OBJECT(prev_page), "gui-dialog-data");
865 const char *prev_label
867
868 if (fc_strcasecmp(buf, prev_label) < 0) {
870 pdialog->dialog->grid, i);
871 break;
872 }
873 }
874 g_free(buf);
875
876 /* Us. */
883
884 /* Our nation. */
888 buf = g_strdup_printf("<span size=\"large\"><u>%s</u></span>",
891 g_free(buf);
893
897
898 /* Our flag */
900
904
905 /* Our name. */
910 buf = g_strdup_printf("<span size=\"large\" weight=\"bold\">%s</span>",
911 ruler_title_for_player(plr0, plr_buf, sizeof(plr_buf)));
913 g_free(buf);
915
916 pdialog->pic0 = gtk_picture_new();
917 gtk_grid_attach(GTK_GRID(hgrid), pdialog->pic0, grid_col++, 0, 1, 1);
918
919 /* Menu for clauses: we. */
922
923 menu = create_clause_menu(group, pdialog, plr1, FALSE);
925
926 /* Main table for clauses and (if activated) gold trading: we. */
932
935 1.0);
938 gtk_grid_attach(GTK_GRID(table), spin, 1, 0, 1, 1);
939 g_object_set_data(G_OBJECT(spin), "plr", plr0);
940 g_signal_connect_after(spin, "value-changed",
942
943 label = g_object_new(GTK_TYPE_LABEL, "use-underline", TRUE,
944 "mnemonic-widget", spin, "label", _("Gold:"),
945 "xalign", 0.0, "yalign", 0.5, NULL);
946 gtk_grid_attach(GTK_GRID(table), label, 0, 0, 1, 1);
947
948 gtk_grid_attach(GTK_GRID(table), aux_menu, 2, 0, 1, 1);
949 } else {
950 gtk_grid_attach(GTK_GRID(table), aux_menu, 0, 0, 1, 1);
951 }
953
954 /* Them. */
961
962 /* Their nation. */
966 buf = g_strdup_printf("<span size=\"large\"><u>%s</u></span>",
969 g_free(buf);
971
973 grid_col = 0;
976
977 /* Their flag */
979
983
984 /* Their name. */
989 buf = g_strdup_printf("<span size=\"large\" weight=\"bold\">%s</span>",
990 title_for_player(plr1, plr_buf, sizeof(plr_buf)));
992 g_free(buf);
994
995 pdialog->pic1 = gtk_picture_new();
996 gtk_grid_attach(GTK_GRID(hgrid), pdialog->pic1, grid_col++, 0, 1, 1);
997
998 /* Menu for clauses: they. */
1001
1002 menu = create_clause_menu(group, pdialog, plr1, TRUE);
1004
1005 /* Main table for clauses and (if activated) gold trading: they. */
1006 table = gtk_grid_new();
1011
1014 1.0);
1017 gtk_grid_attach(GTK_GRID(table), spin, 1, 0, 1, 1);
1018 g_object_set_data(G_OBJECT(spin), "plr", plr1);
1019 g_signal_connect_after(spin, "value-changed",
1021
1022 label = g_object_new(GTK_TYPE_LABEL, "use-underline", TRUE,
1023 "mnemonic-widget", spin, "label", _("Gold:"),
1024 "xalign", 0.0, "yalign", 0.5, NULL);
1025 gtk_grid_attach(GTK_GRID(table), label, 0, 0, 1, 1);
1026
1027 gtk_grid_attach(GTK_GRID(table), aux_menu, 2, 0, 1, 1);
1028 } else {
1029 gtk_grid_attach(GTK_GRID(table), aux_menu, 0, 0, 1, 1);
1030 }
1032
1033 /* Clauses. */
1038
1040 pdialog->store = store;
1041
1046 g_object_unref(store);
1048
1051 rend, "text", 0, NULL);
1052
1062
1064 "use-underline", TRUE,
1065 "mnemonic-widget", view,
1066 "label", _("C_lauses:"),
1067 "xalign", 0.0,
1068 "yalign", 0.5,
1069 NULL);
1070
1072
1076
1078
1079 g_signal_connect(view, "row_activated", G_CALLBACK(row_callback), pdialog);
1080
1081 update_diplomacy_dialog(pdialog);
1082 gui_dialog_show_all(pdialog->dialog);
1083
1084 return pdialog;
1085}
1086
1087/************************************************************************/
1090static void update_diplomacy_dialog(struct Diplomacy_dialog *pdialog)
1091{
1092 GtkListStore *store;
1093 GtkTreeIter it;
1094 bool blank = TRUE;
1096
1097 store = pdialog->store;
1098
1099 gtk_list_store_clear(store);
1101 char buf[128];
1102
1104
1105 gtk_list_store_append(store, &it);
1106 gtk_list_store_set(store, &it, 0, buf, -1);
1107 blank = FALSE;
1109
1110 if (blank) {
1111 gtk_list_store_append(store, &it);
1112 gtk_list_store_set(store, &it, 0,
1113 _("--- This treaty is blank. "
1114 "Please add some clauses. ---"), -1);
1115 }
1116
1123}
1124
1125/************************************************************************/
1129 GVariant *parameter,
1130 gpointer data)
1131{
1132 int giver, dest, other, tech;
1133
1134 giver = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action), "player_from"));
1135 dest = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action), "player_to"));
1136 tech = GPOINTER_TO_INT(data);
1137 if (player_by_number(giver) == client_player()) {
1138 other = dest;
1139 } else {
1140 other = giver;
1141 }
1142
1143 if (A_LAST == tech) {
1144 /* All techs. */
1145 struct player *pgiver = player_by_number(giver);
1146 struct player *pdest = player_by_number(dest);
1147 const struct research *dresearch, *gresearch;
1148
1151
1156
1162 == TECH_PREREQS_KNOWN)) {
1164 CLAUSE_ADVANCE, i);
1165 }
1167 } else {
1168 /* Only one tech. */
1170 CLAUSE_ADVANCE, tech);
1171 }
1172}
1173
1174/************************************************************************/
1179 GVariant *parameter,
1180 gpointer data)
1181{
1182 struct city_deal *deal_data = (struct city_deal *)data;
1183 int other;
1184
1185 if (player_by_number(deal_data->giver) == client.conn.playing) {
1187 } else {
1188 other = deal_data->giver;
1189 }
1190
1193
1194 free(deal_data);
1195}
1196
1197/************************************************************************/
1201 gpointer data)
1202{
1203 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *)data;
1204 struct player *pgiver;
1205
1206 pgiver = (struct player *)g_object_get_data(G_OBJECT(action), "plr");
1207
1209 player_number(pdialog->treaty->plr1),
1211}
1212
1213/************************************************************************/
1217 gpointer data)
1218{
1219 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *)data;
1220 struct player *pgiver;
1221
1222 pgiver = (struct player *)g_object_get_data(G_OBJECT(action), "plr");
1223
1225 player_number(pdialog->treaty->plr1),
1227 0);
1228}
1229
1230/************************************************************************/
1234{
1235 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *)data;
1236
1238 player_number(pdialog->treaty->plr1),
1239 player_number(pdialog->treaty->plr0),
1240 type, 0);
1241}
1242
1243/************************************************************************/
1252
1253/************************************************************************/
1262
1263/************************************************************************/
1272
1273/************************************************************************/
1277 GVariant *parameter,
1278 gpointer data)
1279{
1280 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *) data;
1281 struct player *pgiver;
1282
1283 pgiver = (struct player *)g_object_get_data(G_OBJECT(action), "plr");
1284
1286 player_number(pdialog->treaty->plr1),
1288 0);
1289}
1290
1291/************************************************************************/
1295 GVariant *parameter,
1296 gpointer data)
1297{
1298 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *) data;
1299 struct player *pgiver;
1300
1301 pgiver = (struct player *)g_object_get_data(G_OBJECT(action), "plr");
1302
1304 player_number(pdialog->treaty->plr1),
1306 0);
1307}
1308
1309/************************************************************************/
1313 GVariant *parameter,
1314 gpointer data)
1315{
1316 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *) data;
1317 struct player *pgiver;
1318
1319 pgiver = (struct player *)g_object_get_data(G_OBJECT(action), "plr");
1320
1322 player_number(pdialog->treaty->plr1),
1325 0);
1326}
1327
1328/************************************************************************/
1332{
1333 diplomacy_destroy(pdialog);
1334}
1335
1336/************************************************************************/
1340{
1342 dipl_main = NULL;
1343}
1344
1345/************************************************************************/
1352
1353/************************************************************************/
1357{
1358 struct player *plr0 = client.conn.playing;
1359
1361 if ((pdialog->treaty->plr0 == plr0 && pdialog->treaty->plr1 == they)
1362 || (pdialog->treaty->plr0 == they && pdialog->treaty->plr1 == plr0)) {
1363 return pdialog;
1364 }
1366
1367 return NULL;
1368}
1369
1370/************************************************************************/
1374{
1375 struct Diplomacy_dialog *pdialog = (struct Diplomacy_dialog *) data;
1376 struct player *pgiver =
1377 (struct player *) g_object_get_data(G_OBJECT(w), "plr");
1379
1382 player_number(pdialog->treaty->plr1),
1385 } else {
1386 output_window_append(ftc_client, _("Invalid amount of gold specified."));
1387 }
1388}
1389
1390/************************************************************************/
#define n
Definition astring.c:77
void output_window_append(const struct ft_color color, const char *featured_text)
bool is_capital(const struct city *pcity)
Definition city.c:1632
const char * city_name_get(const struct city *pcity)
Definition city.c:1157
int city_name_compare(const void *p1, const void *p2)
Definition city.c:1764
#define city_list_iterate(citylist, pcity)
Definition city.h:508
#define city_list_iterate_end
Definition city.h:510
static struct ai_type * self
Definition classicai.c:47
struct civclient client
const char * title_for_player(const struct player *pplayer, char *buf, size_t buf_len)
#define client_player()
void client_diplomacy_clause_string(char *buf, int bufsiz, struct Clause *pclause)
Definition climisc.c:241
char * incite_cost
Definition comments.c:77
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit int const struct action *paction struct unit struct city * pcity
Definition dialogs_g.h:77
struct treaty * ptreaty
Definition diplodlg_g.h:28
struct treaty struct player struct player *initiator gui_recv_create_clause
Definition diplodlg_g.h:32
gui_recv_cancel_meeting
Definition diplodlg_g.h:27
struct treaty struct player * they
Definition diplodlg_g.h:28
struct treaty struct player struct player *initiator struct treaty struct player *they gui_recv_accept_treaty
Definition diplodlg_g.h:36
bool clause_enabled(enum clause_type type)
Definition diptreaty.c:305
#define clause_list_iterate_end
Definition diptreaty.h:73
#define clause_list_iterate(clauselist, pclause)
Definition diptreaty.h:71
int Tech_type_id
Definition fc_types.h:238
#define MAX_LEN_NAME
Definition fc_types.h:68
#define Q_(String)
Definition fcintl.h:70
#define _(String)
Definition fcintl.h:67
const struct ft_color ftc_client
struct civ_game game
Definition game.c:62
const char * ruler_title_for_player(const struct player *pplayer, char *buf, size_t buf_len)
Definition government.c:398
static void diplomacy_dialog_add_pact_clause(GtkWidget *w, gpointer data, int type)
Definition diplodlg.c:1113
#define RESPONSE_CANCEL_MEETING
Definition diplodlg.c:114
void gui_init_meeting(struct treaty *ptreaty, struct player *they, struct player *initiator)
Definition diplodlg.c:137
static gint sort_advance_names(gconstpointer a, gconstpointer b)
Definition diplodlg.c:236
static void close_diplomacy_dialog(struct Diplomacy_dialog *pdialog)
Definition diplodlg.c:1198
static void diplomacy_dialog_tech_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1014
static void row_callback(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data)
Definition diplodlg.c:515
static void diplomacy_dialog_ceasefire_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1127
static void update_diplomacy_dialog(struct Diplomacy_dialog *pdialog)
Definition diplodlg.c:976
static void diplomacy_dialog_seamap_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1097
static void diplomacy_dialog_city_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1062
static void diplomacy_dialog_map_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1082
void diplomacy_dialog_init(void)
Definition diplodlg.c:1206
static void diplomacy_destroy(struct Diplomacy_dialog *pdialog)
Definition diplodlg.c:625
static struct Diplomacy_dialog * create_diplomacy_dialog(struct treaty *ptreaty, struct player *plr0, struct player *plr1)
Definition diplodlg.c:689
#define dialog_list_iterate_end
Definition diplodlg.c:83
void gui_recv_remove_clause(struct treaty *ptreaty, struct player *they)
Definition diplodlg.c:188
static struct Diplomacy_notebook * diplomacy_main_create(void)
Definition diplodlg.c:541
static struct Diplomacy_dialog * find_diplomacy_dialog(struct player *they)
Definition diplodlg.c:1223
static void diplomacy_dialog_vision_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1151
void close_all_diplomacy_dialogs(void)
Definition diplodlg.c:1260
#define RESPONSE_CANCEL_MEETING_ALL
Definition diplodlg.c:115
static void diplomacy_dialog_embassy_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1166
static void diplomacy_dialog_shared_tiles_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1181
static void diplomacy_response(struct gui_dialog *dlg, int response, gpointer data)
Definition diplodlg.c:658
#define dialog_list_iterate(dialoglist, pdialog)
Definition diplodlg.c:81
static struct dialog_list * dialog_list
Definition diplodlg.c:85
static void diplomacy_main_response(struct gui_dialog *dlg, int response, gpointer data)
Definition diplodlg.c:598
void gui_prepare_clause_updt(struct treaty *ptreaty, struct player *they)
Definition diplodlg.c:163
static void diplomacy_dialog_peace_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1135
void diplomacy_dialog_done(void)
Definition diplodlg.c:1215
static void diplo_dialog_returnkey(GtkWidget *w, gpointer data)
Definition diplodlg.c:1240
static void popup_diplomacy_dialog(struct treaty *ptreaty, struct player *they, struct player *initiator)
Definition diplodlg.c:205
static void diplomacy_main_destroy(void)
Definition diplodlg.c:586
static void diplomacy_dialog_alliance_callback(GtkWidget *w, gpointer data)
Definition diplodlg.c:1143
static struct Diplomacy_notebook * dipl_main
Definition diplodlg.c:86
GtkWidget * top_notebook
Definition gui_main.c:130
void gui_dialog_destroy(struct gui_dialog *dlg)
Definition gui_stuff.c:954
void gui_dialog_present(struct gui_dialog *dlg)
Definition gui_stuff.c:835
void gui_dialog_raise(struct gui_dialog *dlg)
Definition gui_stuff.c:865
void gui_dialog_new(struct gui_dialog **pdlg, GtkNotebook *notebook, gpointer user_data, bool check_top)
Definition gui_stuff.c:517
void gui_dialog_set_return_dialog(struct gui_dialog *dlg, struct gui_dialog *return_dialog)
Definition gui_stuff.c:997
void gui_dialog_response_set_callback(struct gui_dialog *dlg, GUI_DIALOG_RESPONSE_FUN fun)
Definition gui_stuff.c:988
void gui_dialog_show_all(struct gui_dialog *dlg)
Definition gui_stuff.c:795
void gui_dialog_set_title(struct gui_dialog *dlg, const char *title)
Definition gui_stuff.c:935
void gui_dialog_alert(struct gui_dialog *dlg)
Definition gui_stuff.c:888
GtkWidget * gui_dialog_add_button(struct gui_dialog *dlg, const char *icon_name, const char *text, int response)
Definition gui_stuff.c:706
GdkPixbuf * get_thumb_pixbuf(int onoff)
Definition mapview.c:292
struct gui_dialog * players_dialog_shell
Definition plrdlg.c:58
GType type
Definition repodlgs.c:1313
static GMenu * create_clause_menu(GActionGroup *group, struct Diplomacy_dialog *pdialog, struct player *partner, bool them)
Definition diplodlg.c:268
GtkWidget * aux_menu_new(void)
Definition gui_stuff.c:244
void gui_dialog_add_content_widget(struct gui_dialog *dlg, GtkWidget *wdg)
Definition gui_stuff.c:1103
#define submenu_append_unref(menu, name, submenu)
Definition gui_stuff.h:165
#define menu_item_append_unref(menu, item)
Definition gui_stuff.h:149
void picture_set_from_surface(GtkPicture *pic, cairo_surface_t *surf)
Definition sprite.c:544
static void fc_clause_row_init(FcClauseRow *self)
Definition diplodlg.c:167
static void fc_clause_row_class_init(FcClauseRowClass *klass)
Definition diplodlg.c:159
#define FC_TYPE_CLAUSE_ROW
Definition diplodlg.c:137
#define fc_assert_ret(condition)
Definition log.h:192
#define fc_assert(condition)
Definition log.h:177
#define log_error(message,...)
Definition log.h:104
int dsend_packet_diplomacy_create_clause_req(struct connection *pc, int counterpart, int giver, enum clause_type type, int value)
int dsend_packet_diplomacy_cancel_meeting_req(struct connection *pc, int counterpart)
int dsend_packet_diplomacy_remove_clause_req(struct connection *pc, int counterpart, int giver, enum clause_type type, int value)
int dsend_packet_diplomacy_accept_treaty_req(struct connection *pc, int counterpart)
#define fc_malloc(sz)
Definition mem.h:34
struct nation_type * nation_of_player(const struct player *pplayer)
Definition nation.c:443
const char * nation_plural_for_player(const struct player *pplayer)
Definition nation.c:178
struct player * player_by_number(const int player_id)
Definition player.c:837
int player_number(const struct player *pplayer)
Definition player.c:826
bool player_has_real_embassy(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:245
bool team_has_embassy(const struct team *pteam, const struct player *tgt_player)
Definition player.c:225
struct player_diplstate * player_diplstate_get(const struct player *plr1, const struct player *plr2)
Definition player.c:325
bool gives_shared_vision(const struct player *me, const struct player *them)
Definition player.c:1477
#define is_human(plr)
Definition player.h:231
struct research * research_get(const struct player *pplayer)
Definition research.c:130
enum tech_state research_invention_state(const struct research *presearch, Tech_type_id tech)
Definition research.c:622
bool research_invention_gettable(const struct research *presearch, const Tech_type_id tech, bool allow_holes)
Definition research.c:696
struct treaty * treaty
Definition diplodlg.c:54
GtkWidget * pic1
Definition diplodlg.c:58
GtkWidget * pic0
Definition diplodlg.c:57
struct gui_dialog * dialog
Definition diplodlg.c:55
GtkListStore * store
Definition diplodlg.c:63
struct gui_dialog * dialog
Definition diplodlg.c:67
GtkWidget * notebook
Definition diplodlg.c:68
GObjectClass parent_class
Definition diplodlg.c:150
char * clause
Definition diplodlg.c:145
GObject parent_instance
Definition diplodlg.c:143
int giver
Definition diplodlg.c:72
int receiver
Definition diplodlg.c:73
Definition city.h:318
struct packet_game_info info
Definition game.h:89
struct connection conn
Definition client_main.h:96
struct player * playing
Definition connection.h:151
GtkWidget * vbox
Definition gui_stuff.h:72
GtkWidget * grid
Definition gui_stuff.h:71
GtkWidget * label
Definition gui_stuff.h:87
GtkWidget * notebook
Definition gui_stuff.h:88
bool tech_trade_allow_holes
enum diplstate_type type
Definition player.h:199
struct player_economic economic
Definition player.h:284
struct player * plr1
Definition diptreaty.h:82
struct clause_list * clauses
Definition diptreaty.h:84
bool accept1
Definition diptreaty.h:83
struct player * plr0
Definition diptreaty.h:82
bool accept0
Definition diptreaty.h:83
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:925
size_t fc_strlcpy(char *dest, const char *src, size_t n)
Definition support.c:742
int fc_strcasecmp(const char *str0, const char *str1)
Definition support.c:186
int fc_strcoll(const char *str0, const char *str1)
Definition support.c:436
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
#define fc__fallthrough
Definition support.h:119
const char * advance_name_translation(const struct advance *padvance)
Definition tech.c:305
Tech_type_id advance_number(const struct advance *padvance)
Definition tech.c:100
#define advance_iterate(_p)
Definition tech.h:273
#define advance_iterate_end
Definition tech.h:274
#define A_LAST
Definition tech.h:45
struct sprite * get_nation_flag_sprite(const struct tileset *t, const struct nation_type *pnation)
Definition tilespec.c:7023