Freeciv-3.3
Loading...
Searching...
No Matches
gui_main.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#ifdef AUDIO_SDL2
19/* Though it would happily compile without this include,
20 * it is needed for sound to work.
21 * It defines "main" macro to rename our main() so that
22 * it can install SDL's own. */
23#ifdef SDL2_PLAIN_INCLUDE
24#include <SDL.h>
25#else /* PLAIN_INCLUDE */
26#include <SDL2/SDL.h>
27#endif /* PLAIN_INCLUDE */
28#endif /* AUDIO_SDL2 */
29
30#ifdef HAVE_LOCALE_H
31#include <locale.h>
32#endif
33#include <stdarg.h>
34#include <stdio.h>
35#include <stdlib.h>
36#include <string.h>
37#include <time.h>
38
39#ifdef HAVE_UNISTD_H
40#include <unistd.h>
41#endif
42
43#include <gtk/gtk.h>
44#include <gdk/gdkkeysyms.h>
45
46/* utility */
47#include "fc_cmdline.h"
48#include "fciconv.h"
49#include "fcintl.h"
50#include "log.h"
51#include "mem.h"
52#include "support.h"
53
54/* common */
55#include "dataio.h"
56#include "featured_text.h"
57#include "game.h"
58#include "government.h"
59#include "map.h"
60#include "unitlist.h"
61#include "version.h"
62
63/* client */
64#include "audio.h"
65#include "client_main.h"
66#include "climisc.h"
67#include "clinet.h"
68#include "colors.h"
69#include "connectdlg_common.h"
70#include "control.h"
71#include "editor.h"
72#include "gui_properties.h"
73#include "options.h"
74#include "text.h"
75#include "tilespec.h"
76#include "zoom.h"
77
78/* client/gui-gtk-3.22 */
79#include "chatline.h"
80#include "citizensinfo.h"
81#include "connectdlg.h"
82#include "cma_fe.h"
83#include "dialogs.h"
84#include "diplodlg.h"
85#include "editgui.h"
86#include "gotodlg.h"
87#include "graphics.h"
88#include "gui_stuff.h"
89#include "happiness.h"
90#include "helpdlg.h"
91#include "inteldlg.h"
92#include "mapctrl.h"
93#include "mapview.h"
94#include "menu.h"
95#include "messagewin.h"
96#include "optiondlg.h"
97#include "pages.h"
98#include "plrdlg.h"
99#include "luaconsole.h"
100#include "spaceshipdlg.h"
101#include "repodlgs.h"
102#include "voteinfo_bar.h"
103
104#include "gui_main.h"
105
107
108GtkWidget *map_canvas; /* GtkDrawingArea */
111
112GtkWidget *overview_canvas; /* GtkDrawingArea */
113GtkWidget *overview_scrolled_window; /* GtkScrolledWindow */
114/* The two values below define the width and height of the map overview. The
115 * first set of values (2*62, 2*46) define the size for a netbook display. For
116 * bigger displays the values are doubled (default). */
117#define OVERVIEW_CANVAS_STORE_WIDTH_NETBOOK (2 * 64)
118#define OVERVIEW_CANVAS_STORE_HEIGHT_NETBOOK (2 * 46)
119#define OVERVIEW_CANVAS_STORE_WIDTH \
120 (2 * OVERVIEW_CANVAS_STORE_WIDTH_NETBOOK)
121#define OVERVIEW_CANVAS_STORE_HEIGHT \
122 (2 * OVERVIEW_CANVAS_STORE_HEIGHT_NETBOOK)
125
132
136
139
142
150
154
160
161const char *const gui_character_encoding = "UTF-8";
163
173
174static int unit_id_top;
175static int unit_ids[MAX_NUM_UNITS_BELOW]; /* ids of the units icons in
176 * information display: (or 0) */
180
184
185static bool gui_up = FALSE;
186
187static bool audio_paused = FALSE;
188static bool client_focus = TRUE;
189
190static struct video_mode vmode = { -1, -1 };
191
192static void set_g_log_callbacks(void);
193
196
197static void end_turn_callback(GtkWidget *w, gpointer data);
199 gpointer data);
200static void set_wait_for_writable_socket(struct connection *pc,
201 bool socket_writable);
202
203static void print_usage(void);
204static bool parse_options(int argc, char **argv);
208
209static void tearoff_callback(GtkWidget *b, gpointer data);
210static GtkWidget *detached_widget_new(void);
212
214 gpointer data);
216 gpointer data);
217static gboolean quit_dialog_callback(void);
218
220 gpointer user_data);
221
222static void free_unit_table(void);
223
224static void adjust_default_options(void);
225
226/**********************************************************************/
229static void log_callback_utf8(enum log_level level, const char *message,
230 bool file_too)
231{
232 if (!file_too || level <= LOG_FATAL) {
233 fc_fprintf(stderr, "%d: %s\n", level, message);
234 }
235}
236
237/**********************************************************************/
242{
243 double seconds = real_timer_callback();
244
246 if (!audio_paused && !client_focus) {
247 audio_pause();
249 } else if (audio_paused && client_focus) {
250 audio_resume();
252 }
253 }
254
256
257 return FALSE;
258}
259
260/**********************************************************************/
264static void print_usage(void)
265{
266 /* add client-specific usage information here */
268 _("This client accepts the standard Gtk command-line options\n"
269 "after '--'. See the Gtk documentation.\n\n"));
270
272 _("Other gui-specific options are:\n"));
273
275 _("-r, --resolution WIDTHxHEIGHT\tAssume given resolution "
276 "screen\n\n"));
277
278 /* TRANS: No full stop after the URL, could cause confusion. */
279 fc_fprintf(stderr, _("Report bugs at %s\n"), BUG_URL);
280}
281
282/**********************************************************************/
285static bool parse_options(int argc, char **argv)
286{
287 int i = 1;
288
289 while (i < argc) {
290 char *option = NULL;
291
292 if (is_option("--help", argv[i])) {
293 print_usage();
294
295 return FALSE;
296 } else if ((option = get_option_malloc("--resolution", argv, &i, argc, FALSE))) {
298 fc_fprintf(stderr, _("Illegal video mode '%s'\n"), option);
300 }
301 free(option);
302 }
303 /* Can't check against unknown options, as those might be gtk options */
304
305 i++;
306 }
307
308 return TRUE;
309}
310
311/**********************************************************************/
315{
316 switch (arg) {
319
320 if (!gtk_widget_get_can_focus(w)) {
321 return FALSE;
322 }
323
324 if (!gtk_widget_is_focus(w)) {
326 return TRUE;
327 }
328 break;
329
330 default:
331 break;
332 }
333 return FALSE;
334}
335
336/**********************************************************************/
343 gpointer data)
344{
345 static int old_width = 0, old_height = 0;
346
347 if (allocation->width != old_width
348 || allocation->height != old_height) {
350 old_width = allocation->width;
351 old_height = allocation->height;
352 }
353}
354
355/**********************************************************************/
365
366/**********************************************************************/
376{
377 GtkWidget *focus;
378
380 if (focus) {
381 if (GTK_IS_ENTRY(focus)
382 || (GTK_IS_TEXT_VIEW(focus)
384 /* Propagate event to currently focused entry widget. */
385 if (gtk_widget_event(focus, ev)) {
386 /* Do not propagate event to our children. */
387 return TRUE;
388 }
389 }
390 }
391
392 /* Continue propagating event to our children. */
393 return FALSE;
394}
395
396/**********************************************************************/
400 gpointer data)
401{
402 if ((ev->state & GDK_SHIFT_MASK)) {
403 switch (ev->keyval) {
404
405 case GDK_KEY_Left:
407 return TRUE;
408
409 case GDK_KEY_Right:
411 return TRUE;
412
413 case GDK_KEY_Up:
415 return TRUE;
416
417 case GDK_KEY_Down:
419 return TRUE;
420
421 case GDK_KEY_Home:
423 return TRUE;
424
425 case GDK_KEY_Page_Up:
428 return TRUE;
429
433 return TRUE;
434
435 default:
436 break;
437 }
438 } else if (!(ev->state & ACCL_MOD_KEY)) {
439 switch (ev->keyval) {
440 default:
441 break;
442 }
443 }
444
445 if (!(ev->state & ACCL_MOD_KEY)) {
446 switch (ev->keyval) {
447 case GDK_KEY_KP_Add:
448 zoom_step_up();
449 return TRUE;
450
453 return TRUE;
454
455 default:
456 break;
457 }
458 }
459
460 /* Return here if observer */
461 if (client_is_observer()) {
462 return FALSE;
463 }
464
465 switch (ev->keyval) {
466
467 case GDK_KEY_KP_Up:
468 case GDK_KEY_KP_8:
469 case GDK_KEY_Up:
470 case GDK_KEY_8:
472 return TRUE;
473
475 case GDK_KEY_KP_9:
476 case GDK_KEY_Page_Up:
477 case GDK_KEY_9:
479 return TRUE;
480
481 case GDK_KEY_KP_Right:
482 case GDK_KEY_KP_6:
483 case GDK_KEY_Right:
484 case GDK_KEY_6:
486 return TRUE;
487
489 case GDK_KEY_KP_3:
491 case GDK_KEY_3:
493 return TRUE;
494
495 case GDK_KEY_KP_Down:
496 case GDK_KEY_KP_2:
497 case GDK_KEY_Down:
498 case GDK_KEY_2:
500 return TRUE;
501
502 case GDK_KEY_KP_End:
503 case GDK_KEY_KP_1:
504 case GDK_KEY_End:
505 case GDK_KEY_1:
507 return TRUE;
508
509 case GDK_KEY_KP_Left:
510 case GDK_KEY_KP_4:
511 case GDK_KEY_Left:
512 case GDK_KEY_4:
514 return TRUE;
515
516 case GDK_KEY_KP_Home:
517 case GDK_KEY_KP_7:
518 case GDK_KEY_Home:
519 case GDK_KEY_7:
521 return TRUE;
522
523 case GDK_KEY_KP_Begin:
524 case GDK_KEY_KP_5:
525 case GDK_KEY_5:
527 return TRUE;
528
529 case GDK_KEY_Escape:
531 return TRUE;
532
533 case GDK_KEY_b:
536 return TRUE;
537 }
538 break;
539
540 default:
541 break;
542 };
543
544 return FALSE;
545}
546
547/**********************************************************************/
551 gpointer data)
552{
553 /* inputline history code */
555 return FALSE;
556 }
557
558 if (editor_is_active()) {
560 }
561
562 return FALSE;
563}
564
565/**********************************************************************/
569 gpointer data)
570{
571 if (inputline_has_focus()) {
572 return FALSE;
573 }
574
575 if (ev->keyval == GDK_KEY_apostrophe) {
576 /* Allow this even if not in main map view; chatline is present on
577 * some other pages too */
578
579 /* Make the chatline visible if it's not currently.
580 * FIXME: should find the correct window, even when detached, from any
581 * other window; should scroll to the bottom automatically showing the
582 * latest text from other players; MUST NOT make spurious text windows
583 * at the bottom of other dialogs. */
585 /* The main game view is visible. May need to switch notebook. */
588 } else {
590 }
591 }
592
593 /* If the chatline is (now) visible, focus it. */
594 if (inputline_is_visible()) {
596 return TRUE;
597 }
598 }
599
602 return FALSE;
603 }
604
605 if (editor_is_active()) {
607 return TRUE;
608 }
609 }
610
611 if (ev->state & GDK_SHIFT_MASK) {
612 switch (ev->keyval) {
613
614 case GDK_KEY_Return:
615 case GDK_KEY_KP_Enter:
616 key_end_turn();
617 return TRUE;
618
619 default:
620 break;
621 }
622 }
623
625 /* 0 means the map view is focused. */
626 return key_press_map_canvas(w, ev, data);
627 }
628
629#if 0
630 /* We are focused some other dialog, tab, or widget. */
631 if ((ev->state & GDK_CONTROL_MASK)) {
632 } else if ((ev->state & GDK_SHIFT_MASK)) {
633 } else {
634 switch (ev->keyval) {
635
636 case GDK_KEY_F4:
638 return TRUE;
639
640 default:
641 break;
642 };
643 }
644#endif /* 0 */
645
646 return FALSE;
647}
648
649/**********************************************************************/
653{
655
656 if (!can_client_change_view()) {
657 return FALSE;
658 }
659
662
663 switch (ev->direction) {
664 case GDK_SCROLL_UP:
665 scroll_y -= ystep*2;
666 break;
667 case GDK_SCROLL_DOWN:
668 scroll_y += ystep*2;
669 break;
670 case GDK_SCROLL_RIGHT:
671 scroll_x += xstep*2;
672 break;
673 case GDK_SCROLL_LEFT:
674 scroll_x -= xstep*2;
675 break;
676 default:
677 return FALSE;
678 };
679
681
682 /* Emulating mouse move now */
685 }
686
687 update_line(ev->x, ev->y);
688 if (rbutton_down && (ev->state & GDK_BUTTON3_MASK)) {
690 }
691
694 }
695
697
698 return TRUE;
699}
700
701/**********************************************************************/
705{
707
708 return FALSE;
709}
710
711/**********************************************************************/
715{
717
718 return FALSE;
719}
720
721/**********************************************************************/
724static void tearoff_destroy(GtkWidget *w, gpointer data)
725{
726 GtkWidget *p, *b, *box;
728
729 box = GTK_WIDGET(data);
731 p = g_object_get_data(G_OBJECT(w), "parent");
732 b = g_object_get_data(G_OBJECT(w), "toggle");
734
736
737 g_object_ref(box); /* Make sure reference count stays above 0
738 * during the transition to new parent. */
741 g_object_unref(box);
742}
743
744/**********************************************************************/
748{
750
751 return FALSE;
752}
753
754/**********************************************************************/
759{
760 GtkWidget *box = GTK_WIDGET(data);
761
764 GtkWidget *w;
766
770 gtk_widget_set_name(w, "Freeciv");
771 gtk_window_set_title(GTK_WINDOW(w), _("Freeciv"));
773 g_signal_connect(w, "destroy", G_CALLBACK(tearoff_destroy), box);
774 g_signal_connect(w, "key_press_event",
776
778 g_object_set_data(G_OBJECT(w), "toggle", b);
779
780 temp_hide = g_object_get_data(G_OBJECT(box), "hide-over-reparent");
781 if (temp_hide != NULL) {
783 }
784
785 g_object_ref(box); /* Make sure reference count stays above 0
786 * during the transition to new parent. */
789 g_object_unref(box);
791
792 if (temp_hide != NULL) {
794 }
795 } else {
797 }
798}
799
800/**********************************************************************/
809
810/**********************************************************************/
815{
816 GtkWidget *b, *fillbox;
818
821
822 /* These toggle buttons run vertically down the side of many UI
823 * elements, so they need to be thin horizontally. */
825 ".detach_button {\n"
826 " padding: 0px 0px 0px 0px;\n"
827 " min-width: 6px;\n"
828 "}",
829 -1, NULL);
830 }
831
837 "detach_button");
838 gtk_widget_set_tooltip_text(b, _("Detach/Attach the pane."));
839
842
846
848
849 return fillbox;
850}
851
852/**********************************************************************/
860{
861 int i, width;
863 GdkPixbuf *pix;
864 int ttw;
865
866 /* Get width of the overview window */
870
872
874 /* We want arrow to appear if there is other units in addition
875 to active one in tile. Active unit is not counted, so there
876 can be 0 other units to not to display arrow. */
877 num_units_below = 1 - 1;
878 } else {
881 }
882
883 /* Top row: the active unit. */
884 /* Note, we ref this and other widgets here so that we can unref them
885 * in reset_unit_table. */
895 g_signal_connect(unit_image_button, "button_press_event",
897 GINT_TO_POINTER(-1));
898
900 /* Bottom row: other units in the same tile. */
901 for (i = 0; i < num_units_below; i++) {
909 FALSE);
913 "button_press_event",
916
918 i, 1, 1, 1);
919 }
920 }
921
922 /* Create arrow (popup for all units on the selected tile) */
929 FALSE);
933 "button_press_event",
935 /* An extra layer so that we can hide the clickable button but keep
936 * an explicit size request to avoid the layout jumping around */
945 gdk_pixbuf_get_width(pix), -1);
947
949 /* Display on bottom row. */
951 num_units_below, 1, 1, 1);
952 } else {
953 /* Display on top row (there is no bottom row). */
955 1, 0, 1, 1);
956 }
957
959}
960
961/**********************************************************************/
988
989/**********************************************************************/
993{
994 /* Unreference all of the widgets that we're about to reallocate, thus
995 * avoiding a memory leak. Remove them from the container first, just
996 * to be safe. Note, the widgets are ref'd in
997 * populate_unit_image_table. */
999
1001
1002 /* We have to force a redraw of the units. And we explicitly have
1003 * to force a redraw of the focus unit, which is normally only
1004 * redrawn when the focus changes. We also have to force the 'more'
1005 * arrow to go away, both by explicitly hiding it and telling it to
1006 * do so (this will be reset immediately afterwards if necessary,
1007 * but we have to make the *internal* state consistent). */
1010 if (get_num_units_in_focus() == 1) {
1012 } else {
1013 set_unit_icon(-1, NULL);
1014 }
1016}
1017
1018/**********************************************************************/
1022{
1023 if (enable) {
1025 /* Ensure the menus are really created before performing any operations
1026 * on them. */
1027 while (gtk_events_pending()) {
1029 }
1031 menus_init();
1033 } else {
1035 }
1036}
1037
1038/**********************************************************************/
1046{
1047 if (event->type != GDK_BUTTON_RELEASE) {
1048 return FALSE;
1049 }
1050
1053 /* Make sure the default gtk handler
1054 * does NOT get called in this case. */
1055 return TRUE;
1056 }
1057
1058 return FALSE;
1059}
1060
1061/**********************************************************************/
1064#if 0
1066{
1071}
1072#endif
1073
1074/**********************************************************************/
1078{
1079 struct option *opt = optset_option_by_name(server_optset, "fixedlength");
1080
1081 if (opt != NULL && option_bool_get(opt)) {
1083 _("Fixed length turns"));
1084 } else {
1085 char buf[256];
1086
1087 fc_snprintf(buf, sizeof(buf), "%s:\n%s",
1088 _("Turn Done"), _("Shift+Return"));
1090 }
1091}
1092
1093/**********************************************************************/
1096static void setup_widgets(void)
1097{
1098 GtkWidget *page, *ebox, *hgrid, *hgrid2, *label;
1099 GtkWidget *frame, *table, *table2, *paned, *sw, *text;
1100 GtkWidget *button, *view, *vgrid, *right_vbox = NULL;
1101 int i;
1102 GtkWidget *notebook, *statusbar;
1104 struct sprite *spr;
1105
1107
1108 notebook = gtk_notebook_new();
1109
1110 /* Stop mouse wheel notebook page switching. */
1111 g_signal_connect(notebook, "scroll_event",
1113
1114 toplevel_tabs = notebook;
1117 vgrid = gtk_grid_new();
1125
1136
1138
1140 g_object_set(ingame_votebar, "margin", 2, NULL);
1141
1142 /* *** everything in the top *** */
1143
1149 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, NULL);
1150
1155 hgrid = gtk_grid_new();
1156
1158 /* The window is divided into two horizontal panels: overview +
1159 * civinfo + unitinfo, main view + message window. */
1164
1170
1171 /* Overview size designed for small displays (netbooks). */
1174 } else {
1175 /* The window is divided into two vertical panes: overview +
1176 * + civinfo + unitinfo + main view, message window. */
1181
1182 /* Overview size designed for big displays (desktops). */
1185 }
1186
1187 /* this holds the overview canvas, production info, etc. */
1188 vgrid = gtk_grid_new();
1192 /* Put vgrid to the left of anything else in hgrid -- right_vbox is either
1193 * the chat/messages pane, or NULL which is OK */
1195 GTK_POS_LEFT, 1, 1);
1196
1197 /* Overview canvas */
1203
1208
1218
1223
1226
1229
1230 g_signal_connect(overview_canvas, "motion_notify_event",
1232
1233 g_signal_connect(overview_canvas, "button_press_event",
1235
1236 /* The rest */
1237
1244
1245 /* Info on player's civilization, when game is running. */
1246 frame = gtk_frame_new("");
1248
1249 main_frame_civ_name = frame;
1250
1251 vgrid = gtk_grid_new();
1256
1257 ebox = gtk_event_box_new();
1260 g_signal_connect(ebox, "button_press_event",
1263
1264 label = gtk_label_new(NULL);
1268 gtk_widget_set_margin_end(label, 2);
1269 gtk_widget_set_margin_top(label, 2);
1271 gtk_container_add(GTK_CONTAINER(ebox), label);
1272 main_label_info = label;
1273
1274 /* Production status */
1275 table = gtk_grid_new();
1279
1280 /* Citizens for taxrates */
1281 ebox = gtk_event_box_new();
1283 gtk_grid_attach(GTK_GRID(table), ebox, 0, 0, 10, 1);
1284 econ_ebox = ebox;
1285
1286 table2 = gtk_grid_new();
1288
1289 for (i = 0; i < 10; i++) {
1290 ebox = gtk_event_box_new();
1293
1294 gtk_grid_attach(GTK_GRID(table2), ebox, i, 0, 1, 1);
1295
1296 g_signal_connect(ebox, "button_press_event",
1298
1302 }
1303
1304 /* Science, environmental, govt, timeout */
1306 if (spr != NULL) {
1308 } else {
1310 }
1311
1313 if (spr != NULL) {
1315 } else {
1317 }
1318
1320 if (spr != NULL) {
1322 } else {
1324 }
1325
1327 if (spr != NULL) {
1329 } else {
1331 }
1332
1333 for (i = 0; i < 4; i++) {
1334 GtkWidget *w;
1335
1336 ebox = gtk_event_box_new();
1338
1339 switch (i) {
1340 case 0:
1341 w = bulb_label;
1342 bulb_ebox = ebox;
1343 break;
1344 case 1:
1345 w = sun_label;
1346 sun_ebox = ebox;
1347 break;
1348 case 2:
1349 w = flake_label;
1350 flake_ebox = ebox;
1351 break;
1352 default:
1353 case 3:
1354 w = government_label;
1355 government_ebox = ebox;
1356 break;
1357 }
1358
1366 gtk_grid_attach(GTK_GRID(table), ebox, i, 1, 1, 1);
1367 }
1368
1370
1371 frame = gtk_frame_new(NULL);
1372 gtk_grid_attach(GTK_GRID(table), frame, 4, 1, 6, 1);
1374
1375
1376 /* Turn done */
1378
1380
1384
1385 /* Selected unit status */
1386
1392
1393 /* In edit mode the unit_info_box widget is replaced by the
1394 * editinfobox, so we need to add a ref here so that it is
1395 * not destroyed when removed from its container.
1396 * See editinfobox_refresh(). */
1398
1401
1408
1409 label = gtk_label_new(NULL);
1414 gtk_widget_set_margin_end(label, 2);
1415 gtk_widget_set_margin_top(label, 2);
1417 gtk_container_add(GTK_CONTAINER(sw), label);
1418 unit_info_label = label;
1419
1420 hgrid2 = gtk_grid_new();
1422
1423 table = gtk_grid_new();
1424 g_object_set(table, "margin", 5, NULL);
1426
1429
1431
1432 /* Map canvas, editor toolbar, and scrollbars */
1433
1434 /* The top notebook containing the map view and dialogs. */
1435
1439
1440
1447
1451 } else {
1453 }
1454
1456
1457 vgrid = gtk_grid_new();
1461
1463 g_object_set(editgui_get_editbar()->widget, "margin", 4, NULL);
1464
1465 label = gtk_label_new(Q_("?noun:View"));
1467
1468 frame = gtk_frame_new(NULL);
1469 gtk_grid_attach(GTK_GRID(map_widget), frame, 0, 0, 1, 1);
1470
1476
1477#if 0
1486#endif /* 0 */
1487
1494
1496
1500
1504
1507
1508 g_signal_connect(map_canvas, "configure_event",
1510
1511 g_signal_connect(map_canvas, "motion_notify_event",
1513
1514 g_signal_connect(toplevel, "enter_notify_event",
1516
1517 g_signal_connect(map_canvas, "button_press_event",
1519
1520 g_signal_connect(map_canvas, "button_release_event",
1522
1523 g_signal_connect(map_canvas, "scroll_event",
1525
1526 g_signal_connect(toplevel, "key_press_event",
1528
1529 g_signal_connect(toplevel, "key_release_event",
1531
1532 /* *** The message window -- this is a detachable widget *** */
1533
1536 } else {
1538
1542
1543 vgrid = gtk_grid_new();
1548 }
1550
1553 } else {
1555 }
1557 g_object_set(hpaned, "margin", 4, NULL);
1558
1563
1568 g_signal_connect(right_notebook, "button-release-event",
1572 }
1573 }
1574
1575 vgrid = gtk_grid_new();
1578
1585
1586 label = gtk_label_new(_("Chat"));
1588
1595 g_signal_connect(text, "size-allocate",
1597
1598 gtk_widget_set_name(text, "chatline");
1599
1601 gtk_widget_realize(text);
1603
1605 if (dtach_lowbox != NULL) {
1607 }
1608
1610
1611 /* the chat line */
1614 g_object_set(view, "margin", 3, NULL);
1615
1616 button = gtk_check_button_new_with_label(_("Allies Only"));
1620 g_signal_connect(button, "toggled",
1624
1625 button = gtk_button_new_with_label(_("Clear links"));
1626 g_signal_connect(button, "clicked",
1629
1630 /* Other things to take care of */
1631
1633
1636 }
1637
1640
1644 }
1645}
1646
1647/**********************************************************************/
1652 const gchar *message,
1653 gpointer user_data)
1654{
1655 enum log_level fllvl = LOG_ERROR;
1656
1657 switch (log_level) {
1658 case G_LOG_LEVEL_DEBUG:
1659 fllvl = LOG_DEBUG;
1660 break;
1662 fllvl = LOG_WARN;
1663 break;
1664 default:
1665 break;
1666 }
1667
1668 if (log_domain != NULL) {
1669 log_base(fllvl, "%s: %s", log_domain, message);
1670 } else {
1671 log_base(fllvl, "%s", message);
1672 }
1673}
1674
1675/**********************************************************************/
1679 const GLogField *fields,
1681 gpointer user_data)
1682{
1683 /* No need to have formatter of our own - let's use glib's default one. */
1685
1687
1688 return G_LOG_WRITER_HANDLED;
1689}
1690
1691/**********************************************************************/
1702
1703/**********************************************************************/
1706static void set_g_log_callbacks(void)
1707{
1708 /* Old API, still used by many log producers */
1710
1714
1715 /* glib >= 2.50 API */
1717}
1718
1719/**********************************************************************/
1728
1729/**********************************************************************/
1732int main(int argc, char **argv)
1733{
1734 return client_main(argc, argv, FALSE);
1735}
1736
1737/**********************************************************************/
1741{
1742 log_normal(_("Migrating options from gtk2 to gtk3 client"));
1743
1744#define MIGRATE_OPTION(opt) gui_options.gui_gtk3_##opt = gui_options.gui_gtk2_##opt;
1745#define MIGRATE_STR_OPTION(opt) \
1746 strncpy(gui_options.gui_gtk3_##opt, gui_options.gui_gtk2_##opt, \
1747 sizeof(gui_options.gui_gtk3_##opt));
1748
1749 /* Default theme name is never migrated */
1750 /* 'fullscreen', 'small_display_layout', and 'message_chat_location'
1751 * not migrated, as (unlike Gtk2), Gtk3-client tries to pick better
1752 * defaults for these in fresh installations based on screen size (see
1753 * adjust_default_options()); so user is probably better served by
1754 * getting these adaptive defaults than whatever they had for Gtk2.
1755 * Since 'fullscreen' isn't migrated, we don't need to worry about
1756 * preserving gui_gtk2_migrated_from_2_5 either. */
1770 MIGRATE_OPTION(popup_tech_help);
1771
1785
1786#undef MIGRATE_OPTION
1787#undef MIGRATE_STR_OPTION
1788
1790}
1791
1792/**********************************************************************/
1796{
1797 log_normal(_("Migrating options from gtk3 to gtk3.22 client"));
1798
1799#define MIGRATE_OPTION(opt) GUI_GTK_OPTION(opt) = gui_options.gui_gtk3_##opt;
1800#define MIGRATE_STR_OPTION(opt) \
1801 strncpy(GUI_GTK_OPTION(opt), gui_options.gui_gtk3_##opt, \
1802 sizeof(GUI_GTK_OPTION(opt)));
1803
1804 /* Default theme name is never migrated */
1805
1806 /* Simulate gui-gtk3's migrate_options_from_2_5() */
1808 log_normal(_("Migrating gtk3-client options from freeciv-2.5 options."));
1811 }
1812
1829 MIGRATE_OPTION(popup_tech_help);
1830
1844
1845#undef MIGRATE_OPTION
1846#undef MIGRATE_STR_OPTION
1847
1849}
1850
1851/**********************************************************************/
1854int ui_main(int argc, char **argv)
1855{
1857 guint sig;
1858
1859 if (parse_options(argc, argv)) {
1860 char window_name[1024];
1861
1862 /* The locale has already been set in init_nls() and the windows-specific
1863 * locale logic in gtk_init() causes problems with zh_CN (see PR#39475) */
1865
1866 /* GTK withdraw gtk options. Process GTK arguments */
1867 if (!gtk_init_check(&argc, &argv)) {
1868 log_fatal(_("Failed to open graphical mode."));
1869 return EXIT_FAILURE;
1870 }
1871
1872 g_set_prgname("org.freeciv.gtk322");
1873
1875
1877
1880 if (vmode.width > 0 && vmode.height > 0) {
1882 }
1883 g_signal_connect(toplevel, "key_press_event",
1885
1886 g_signal_connect(toplevel, "focus_out_event",
1888 g_signal_connect(toplevel, "focus_in_event",
1890
1893 gtk_widget_set_name(toplevel, "Freeciv");
1895
1896 if (gui_options.first_boot) {
1898 /* We're using fresh defaults for this version of this client,
1899 * so prevent any future migrations from other clients / versions */
1901 /* Avoid also marking gtk3 as migrated, so that it can have its own
1902 * run of its adjust_default_options() if it is ever run (as a
1903 * side effect of Gtk2->Gtk3 migration). */
1904 } else {
1908 /* We want a fresh look at screen-size-related options after Gtk2 */
1910 /* We don't ever want to consider pre-2.6 fullscreen option again
1911 * (even for gui-gtk3) */
1913 }
1915 }
1916 }
1917
1920 }
1921
1922 fc_snprintf(window_name, sizeof(window_name), _("Freeciv (%s)"), GUI_NAME_SHORT);
1924
1925 g_signal_connect(toplevel, "delete_event",
1927
1928 /* Disable GTK+ cursor key focus movement */
1931 0, 0, 0, 0);
1933
1935 if (OT_FONT == option_type(poption)) {
1936 /* Force to call the appropriate callback. */
1938 }
1940
1943
1944 if (NULL == city_names_style) {
1946 log_error("city_names_style should have been set by options.");
1947 }
1950 log_error("city_productions_style should have been set by options.");
1951 }
1952 if (NULL == reqtree_text_style) {
1954 log_error("reqtree_text_style should have been set by options.");
1955 }
1956
1959
1960 /* Keep the icon of the executable on Windows (see PR#36491) */
1961#ifndef FREECIV_MSWINDOWS
1962 {
1964
1965 /* Only call this after tileset_load_tiles is called. */
1968 }
1969#endif /* FREECIV_MSWINDOWS */
1970
1971 setup_widgets();
1972 load_cursors();
1973 cma_fe_init();
1980 chatline_init();
1982
1984
1986
1987 /* Assumes toplevel showing */
1989
1990 /* Assumes client_state is set */
1992
1993 gui_up = TRUE;
1994 gtk_main();
1995 gui_up = FALSE;
1996
2005 cma_fe_done();
2007
2008 /* We have extra ref for unit_info_box that has protected
2009 * it from getting destroyed when editinfobox_refresh()
2010 * moves widgets around. Free that extra ref here. */
2012
2013 editgui_free();
2016 menus_free();
2017 message_buffer = NULL; /* Result of destruction of everything */
2019 }
2020
2021 return EXIT_SUCCESS;
2022}
2023
2024/**********************************************************************/
2027bool is_gui_up(void)
2028{
2029 return gui_up;
2030}
2031
2032/**********************************************************************/
2035void ui_exit(void)
2036{
2037 if (message_buffer != NULL) {
2040 }
2041}
2042
2043/**********************************************************************/
2046enum gui_type get_gui_type(void)
2047{
2048 return GUI_GTK3_22;
2049}
2050
2051/**********************************************************************/
2058
2059/**********************************************************************/
2065void set_unit_icon(int idx, struct unit *punit)
2066{
2067 GtkWidget *w;
2068
2069 fc_assert_ret(idx >= -1 && idx < num_units_below);
2070
2071 if (idx == -1) {
2072 w = unit_image;
2073 unit_id_top = punit ? punit->id : 0;
2074 } else {
2075 w = unit_below_image[idx];
2076 unit_ids[idx] = punit ? punit->id : 0;
2077 }
2078
2079 if (!w) {
2080 return;
2081 }
2082
2083 if (punit) {
2085 } else {
2087 }
2088}
2089
2090/**********************************************************************/
2096{
2097 static bool showing = FALSE;
2098
2100 return;
2101 }
2102
2103 if (onoff && !showing) {
2105 showing = TRUE;
2106 } else if (!onoff && showing) {
2108 showing = FALSE;
2109 }
2110}
2111
2112/**********************************************************************/
2122
2123/**********************************************************************/
2128 gpointer data)
2129{
2130 int i = GPOINTER_TO_INT(data);
2131 struct unit *punit;
2132
2133 if (i == -1) {
2135 if (punit && unit_is_in_focus(punit)) {
2136 /* Clicking on the currently selected unit will center it. */
2138 }
2139 return TRUE;
2140 }
2141
2142 if (unit_ids[i] == 0) /* no unit displayed at this place */
2143 return TRUE;
2144
2146 if (NULL != punit && unit_owner(punit) == client.conn.playing) {
2147 /* Unit shouldn't be NULL but may be owned by an ally. */
2149 }
2150
2151 return TRUE;
2152}
2153
2154/**********************************************************************/
2159 gpointer data)
2160{
2162
2163 if (punit) {
2165 }
2166
2167 return TRUE;
2168}
2169
2170/**********************************************************************/
2174 gpointer data)
2175{
2176 gtk_grab_remove(w);
2179
2180 return FALSE;
2181}
2182
2183/**********************************************************************/
2187{
2188 if (ev->button == 1) {
2189 GtkWidget *p;
2190
2195
2196 gtk_widget_new(GTK_TYPE_LABEL, "GtkWidget::parent", p,
2197 "GtkLabel::label", get_info_label_text_popup(),
2198 "GtkWidget::visible", TRUE,
2199 NULL);
2200 gtk_widget_show(p);
2201
2204 TRUE, NULL, (GdkEvent *)ev, NULL, NULL);
2205 gtk_grab_add(p);
2206
2207 g_signal_connect_after(p, "button_release_event",
2209 }
2210
2211 return TRUE;
2212}
2213
2214/**********************************************************************/
2222
2223/**********************************************************************/
2227 gpointer data)
2228{
2230
2231 return TRUE;
2232}
2233
2234/**********************************************************************/
2238 bool socket_writable)
2239{
2240 static bool previous_state = FALSE;
2241
2243
2245 return;
2246
2247 log_debug("set_wait_for_writable_socket(%d)", socket_writable);
2248
2253 NULL);
2254
2256}
2257
2258/**********************************************************************/
2262void add_net_input(int sock)
2263{
2264#ifdef FREECIV_MSWINDOWS
2266#else
2268#endif
2270 G_IO_IN | G_IO_ERR,
2272 NULL);
2274}
2275
2276/**********************************************************************/
2286
2287/**********************************************************************/
2291static void quit_dialog_response(GtkWidget *dialog, gint response)
2292{
2293 gtk_widget_destroy(dialog);
2294 if (response == GTK_RESPONSE_YES) {
2296 if (client.conn.used) {
2298 }
2299 quit_gtk_main();
2300 }
2301}
2302
2303/**********************************************************************/
2307{
2308 /* Quit gtk main loop. After this it will return to finish
2309 * ui_main() */
2310
2311 gtk_main_quit();
2312}
2313
2314/**********************************************************************/
2319{
2320 static GtkWidget *dialog;
2321
2322 if (!dialog) {
2324 0,
2327 _("Are you sure you want to quit?"));
2328 setup_dialog(dialog, toplevel);
2329
2331
2332 g_signal_connect(dialog, "response",
2334 g_signal_connect(dialog, "destroy",
2336 }
2337
2339}
2340
2341/**********************************************************************/
2345{
2347 /* Stop emission of event. */
2348 return TRUE;
2349}
2350
2351struct callback {
2352 void (*callback)(void *data);
2353 void *data;
2354};
2355
2356/**********************************************************************/
2360{
2361 struct callback *cb = data;
2362
2363 (cb->callback)(cb->data);
2364 free(cb);
2365
2366 return FALSE;
2367}
2368
2369/**********************************************************************/
2374void add_idle_callback(void (callback)(void *), void *data)
2375{
2376 struct callback *cb = fc_malloc(sizeof(*cb));
2377
2378 cb->callback = callback;
2379 cb->data = data;
2381}
2382
2383/**********************************************************************/
2388{
2389 GtkWidget *button;
2390
2392 fc_assert_ret(button != NULL);
2394
2397}
2398
2399/**********************************************************************/
2410
2411/**********************************************************************/
2421
2422/**********************************************************************/
2432
2433/**********************************************************************/
2443
2444/**********************************************************************/
2449{
2450 struct option *poption;
2451
2452#define option_var_set_callback(var, callback) \
2453 if ((poption = optset_option_by_name(client_optset, \
2454 GUI_GTK_OPTION_STR(var)))) { \
2455 option_set_changed_callback(poption, callback); \
2456 } else { \
2457 log_error("Didn't find option %s!", GUI_GTK_OPTION_STR(var)); \
2458 }
2459
2464
2471#undef option_var_set_callback
2472}
2473
2474/**********************************************************************/
2479{
2480 GtkWidget *button;
2481
2483 fc_assert_ret(button != NULL);
2485
2486 /* Hide the "Allies Only" button for local games. */
2487 if (is_server_running()) {
2488 gtk_widget_hide(button);
2489 } else {
2490 gtk_widget_show(button);
2493 }
2494}
2495
2496/**********************************************************************/
2504
2505/**********************************************************************/
2509{
2510 cat_snprintf(outbuf, outlen, _("\nBuilt against gtk+ %d.%d.%d, using %d.%d.%d"
2511 "\nBuilt against glib %d.%d.%d, using %d.%d.%d"),
2516}
2517
2518/**********************************************************************/
2523{
2526
2528 if (!display) {
2529 return FALSE;
2530 }
2531
2533 if (!monitor) {
2534 return FALSE;
2535 }
2536
2538 return TRUE;
2539}
2540
2541/**********************************************************************/
2545{
2546 GdkRectangle rect;
2547
2548 if (vmode.width > 0) {
2549 return vmode.width;
2550 }
2551
2552 if (monitor_size(&rect)) {
2553 return rect.width;
2554 } else {
2555 return 0;
2556 }
2557}
2558
2559/**********************************************************************/
2563{
2564 GdkRectangle rect;
2565
2566 if (vmode.height > 0) {
2567 return vmode.height;
2568 }
2569
2570 if (monitor_size(&rect)) {
2571 return rect.height;
2572 } else {
2573 return 0;
2574 }
2575}
2576
2577/**********************************************************************/
2581{
2582 if (vmode.width > 0 && vmode.height > 0) {
2583 return &vmode;
2584 }
2585
2586 return NULL;
2587}
2588
2589/**********************************************************************/
2592static void adjust_default_options(void)
2593{
2594 int scr_height = screen_height();
2595
2596 if (scr_height > 0) {
2597 /* Adjust these options only if we do know the screen height. */
2598
2599 if (scr_height <= 480) {
2600 /* Freeciv is practically unusable outside fullscreen mode in so
2601 * small display */
2602 log_verbose("Changing default to fullscreen due to very small screen");
2604 }
2605 if (scr_height < 1024) {
2606 /* This is a small display */
2607 log_verbose("Defaulting to small widget layout due to small screen");
2609 log_verbose("Defaulting to merged messages/chat due to small screen");
2611 }
2612 }
2613}
2614
2615/**********************************************************************/
void audio_pause(void)
Definition audio.c:607
void audio_resume(void)
Definition audio.c:615
struct canvas int int struct sprite int int int width
Definition canvas_g.h:44
void chat_welcome_message(bool gui_has_copying_mitem)
bool client_is_observer(void)
double real_timer_callback(void)
int client_main(int argc, char *argv[], bool postpone_tileset)
void user_ended_turn(void)
struct civclient client
void start_quitting(void)
void set_client_state(enum client_states newstate)
bool can_client_change_view(void)
#define TIMER_INTERVAL
Definition client_main.h:30
@ C_S_DISCONNECTED
Definition client_main.h:45
void buy_production_in_selected_cities(void)
Definition climisc.c:1317
struct sprite * client_warming_sprite(void)
Definition climisc.c:377
struct sprite * client_cooling_sprite(void)
Definition climisc.c:394
struct sprite * client_research_sprite(void)
Definition climisc.c:354
struct sprite * client_government_sprite(void)
Definition climisc.c:412
void disconnect_from_server(bool leaving_sound)
Definition clinet.c:306
void input_from_server(int fd)
Definition clinet.c:411
struct color * get_color(const struct tileset *t, enum color_std stdcolor)
char * incite_cost
Definition comments.c:76
bool is_server_running(void)
void key_recall_previous_focus_unit(void)
Definition control.c:3332
bool unit_is_in_focus(const struct unit *punit)
Definition control.c:388
void key_cancel_action(void)
Definition control.c:3270
int num_units_below
Definition control.c:76
void unit_focus_set(struct unit *punit)
Definition control.c:518
struct unit_list * get_units_in_focus(void)
Definition control.c:177
void key_end_turn(void)
Definition control.c:3324
void update_unit_pix_label(struct unit_list *punitlist)
Definition control.c:997
void key_unit_move(enum direction8 gui_dir)
Definition control.c:3353
enum cursor_hover_state hover_state
Definition control.c:89
struct unit * head_of_units_in_focus(void)
Definition control.c:410
int get_num_units_in_focus(void)
Definition control.c:185
void control_mouse_cursor(struct tile *ptile)
Definition control.c:1227
void key_center_capital(void)
Definition control.c:3307
#define MAX_NUM_UNITS_BELOW
Definition control.h:296
@ HOVER_NONE
Definition control.h:26
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 * punit
Definition dialogs_g.h:73
bool editor_is_active(void)
Definition editor.c:346
enum event_type event
Definition events.c:81
bool is_option(const char *option_name, char *option)
Definition fc_cmdline.c:112
char * get_option_malloc(const char *option_name, char **argv, int *i, int argc, bool gc)
Definition fc_cmdline.c:50
@ O_SCIENCE
Definition fc_types.h:102
@ O_GOLD
Definition fc_types.h:102
void fc_fprintf(FILE *stream, const char *format,...) fc__attribute((__format__(__printf__
#define Q_(String)
Definition fcintl.h:70
#define _(String)
Definition fcintl.h:67
struct unit * game_unit_by_number(int id)
Definition game.c:115
bool inputline_has_focus(void)
Definition chatline.c:72
void inputline_toolkit_view_append_button(GtkWidget *toolkit_view, GtkWidget *button)
Definition chatline.c:1293
GtkWidget * inputline_toolkit_view_new(void)
Definition chatline.c:1271
void set_message_buffer_view_link_handlers(GtkWidget *view)
Definition chatline.c:745
bool inputline_is_visible(void)
Definition chatline.c:88
void chatline_init(void)
Definition chatline.c:1303
void inputline_grab_focus(void)
Definition chatline.c:80
void chatline_scroll_to_bottom(bool delayed)
Definition chatline.c:1007
void citizens_dialog_init(void)
void citizens_dialog_done(void)
void cma_fe_init(void)
Definition cma_fe.c:88
void cma_fe_done(void)
Definition cma_fe.c:96
void unit_select_dialog_popup(struct tile *ptile)
Definition dialogs.c:377
gboolean taxrates_callback(GtkWidget *w, GdkEventButton *ev, gpointer data)
Definition dialogs.c:1425
void diplomacy_dialog_init(void)
Definition diplodlg.c:1206
void diplomacy_dialog_done(void)
Definition diplodlg.c:1215
gboolean handle_edit_key_release(GdkEventKey *ev)
Definition editgui.c:1782
gboolean handle_edit_key_press(GdkEventKey *ev)
Definition editgui.c:1663
void editgui_create_widgets(void)
Definition editgui.c:1824
struct editbar * editgui_get_editbar(void)
Definition editgui.c:1790
void editgui_free(void)
Definition editgui.c:1837
void goto_dialog_focus_units_changed(void)
Definition gotodlg.c:541
static GtkWidget * source
Definition gotodlg.c:58
void load_cursors(void)
Definition graphics.c:64
GtkWidget * map_vertical_scrollbar
Definition gui_main.c:110
int ui_main(int argc, char **argv)
Definition gui_main.c:1854
const char * client_string
Definition gui_main.c:106
GtkTextBuffer * message_buffer
Definition gui_main.c:178
static void quit_dialog_response(GtkWidget *dialog, gint response)
Definition gui_main.c:2291
void real_focus_units_changed(void)
Definition gui_main.c:2118
void set_unit_icons_more_arrow(bool onoff)
Definition gui_main.c:2095
static void print_usage(void)
Definition gui_main.c:264
#define OVERVIEW_CANVAS_STORE_WIDTH_NETBOOK
Definition gui_main.c:117
#define option_var_set_callback(var, callback)
static gboolean select_unit_image_callback(GtkWidget *w, GdkEvent *ev, gpointer data)
Definition gui_main.c:2127
static gboolean quit_dialog_callback(void)
Definition gui_main.c:2344
static GIOChannel * srv_channel
Definition gui_main.c:181
GtkWidget * main_label_info
Definition gui_main.c:138
static bool monitor_size(GdkRectangle *rect_p)
Definition gui_main.c:2522
GtkWidget * bottom_notebook
Definition gui_main.c:130
GtkWidget * unit_info_label
Definition gui_main.c:151
static gboolean timer_callback(gpointer data)
Definition gui_main.c:241
struct video_mode * resolution_request_get(void)
Definition gui_main.c:2580
void set_unit_icon(int idx, struct unit *punit)
Definition gui_main.c:2065
static int unit_ids[MAX_NUM_UNITS_BELOW]
Definition gui_main.c:175
GtkWidget * timeout_label
Definition gui_main.c:148
static bool gui_up
Definition gui_main.c:185
static guint srv_id
Definition gui_main.c:182
static gboolean mouse_scroll_mapcanvas(GtkWidget *w, GdkEventScroll *ev)
Definition gui_main.c:652
PangoFontDescription * city_productions_style
Definition gui_main.c:134
GtkWidget * overview_scrolled_window
Definition gui_main.c:113
static GtkWidget * more_arrow_pixmap
Definition gui_main.c:170
static GtkWidget * detached_widget_fill(GtkWidget *tearbox)
Definition gui_main.c:814
void enable_menus(bool enable)
Definition gui_main.c:1021
static gboolean select_more_arrow_pixmap_callback(GtkWidget *w, GdkEvent *ev, gpointer data)
Definition gui_main.c:2158
GtkWidget * top_notebook
Definition gui_main.c:130
static gboolean propagate_keypress(GtkWidget *w, GdkEvent *ev)
Definition gui_main.c:747
#define MIGRATE_STR_OPTION(opt)
GtkWidget * econ_ebox
Definition gui_main.c:155
GtkWidget * unit_info_box
Definition gui_main.c:152
gboolean fc_lost_focus(GtkWidget *w, GdkEventKey *ev, gpointer data)
Definition gui_main.c:704
void ui_exit(void)
Definition gui_main.c:2035
enum gui_type get_gui_type(void)
Definition gui_main.c:2046
static GtkWidget * detached_widget_new(void)
Definition gui_main.c:803
gint cur_y
Definition gui_main.c:183
int main(int argc, char **argv)
Definition gui_main.c:1732
void fullscreen_opt_refresh(struct option *poption)
Definition gui_main.c:2402
static void main_message_area_size_allocate(GtkWidget *widget, GtkAllocation *allocation, gpointer data)
Definition gui_main.c:341
static gboolean toplevel_handler(GtkWidget *w, GdkEvent *ev, gpointer data)
Definition gui_main.c:375
void ui_init(void)
Definition gui_main.c:1722
static GtkWidget * unit_below_image_button[MAX_NUM_UNITS_BELOW]
Definition gui_main.c:169
static void free_unit_table(void)
Definition gui_main.c:964
static gboolean idle_callback_wrapper(gpointer data)
Definition gui_main.c:2359
static void apply_city_names_font(struct option *poption)
Definition gui_main.c:2414
static void apply_city_productions_font(struct option *poption)
Definition gui_main.c:2425
gboolean fc_gained_focus(GtkWidget *w, GdkEventKey *ev, gpointer data)
Definition gui_main.c:714
static GtkWidget * unit_below_image[MAX_NUM_UNITS_BELOW]
Definition gui_main.c:168
static void tearoff_destroy(GtkWidget *w, gpointer data)
Definition gui_main.c:724
GtkWidget * government_label
Definition gui_main.c:147
GtkWidget * sun_label
Definition gui_main.c:145
PangoFontDescription * city_names_style
Definition gui_main.c:133
void refresh_chat_buttons(void)
Definition gui_main.c:2478
gboolean map_canvas_focus(void)
Definition gui_main.c:358
GtkWidget * turn_done_button
Definition gui_main.c:149
static GtkWidget * main_menubar
Definition gui_main.c:164
int screen_width(void)
Definition gui_main.c:2544
GtkWidget * scroll_panel
Definition gui_main.c:141
static void end_turn_callback(GtkWidget *w, gpointer data)
Definition gui_main.c:2217
#define OVERVIEW_CANVAS_STORE_HEIGHT_NETBOOK
Definition gui_main.c:118
static void log_callback_utf8(enum log_level level, const char *message, bool file_too)
Definition gui_main.c:229
void add_idle_callback(void(callback)(void *), void *data)
Definition gui_main.c:2374
static gboolean show_info_popup(GtkWidget *w, GdkEventButton *ev, gpointer data)
Definition gui_main.c:2186
static void set_g_log_callbacks(void)
Definition gui_main.c:1706
void reset_unit_table(void)
Definition gui_main.c:992
static gboolean key_press_map_canvas(GtkWidget *w, GdkEventKey *ev, gpointer data)
Definition gui_main.c:399
GtkWidget * unit_info_frame
Definition gui_main.c:153
void options_extra_init(void)
Definition gui_main.c:2448
GtkWidget * top_vbox
Definition gui_main.c:129
static void allied_chat_only_callback(struct option *poption)
Definition gui_main.c:2387
GdkWindow * root_window
Definition gui_main.c:127
static void adjust_default_options(void)
Definition gui_main.c:2592
static void set_wait_for_writable_socket(struct connection *pc, bool socket_writable)
Definition gui_main.c:2237
static GtkWidget * more_arrow_pixmap_button
Definition gui_main.c:171
GtkWidget * ahbox
Definition gui_main.c:140
static void apply_reqtree_text_font(struct option *poption)
Definition gui_main.c:2436
static gboolean show_info_button_release(GtkWidget *w, GdkEventButton *ev, gpointer data)
Definition gui_main.c:2173
bool is_gui_up(void)
Definition gui_main.c:2027
static gboolean toplevel_focus(GtkWidget *w, GtkDirectionType arg)
Definition gui_main.c:314
PangoFontDescription * reqtree_text_style
Definition gui_main.c:135
GtkWidget * sun_ebox
Definition gui_main.c:157
GtkWidget * bulb_ebox
Definition gui_main.c:156
GtkWidget * flake_label
Definition gui_main.c:146
static void g_log_to_freelog_cb(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)
Definition gui_main.c:1650
GtkWidget * avbox
Definition gui_main.c:140
gint cur_x
Definition gui_main.c:183
void setup_gui_properties(void)
Definition gui_main.c:2618
void insert_client_build_info(char *outbuf, size_t outlen)
Definition gui_main.c:2508
static GtkWidget * unit_image_button
Definition gui_main.c:167
static GtkWidget * unit_image_table
Definition gui_main.c:165
static gboolean right_notebook_button_release(GtkWidget *widget, GdkEventButton *event)
Definition gui_main.c:1044
static void set_g_log_callback_domain(const char *domain)
Definition gui_main.c:1694
GtkWidget * bulb_label
Definition gui_main.c:144
GtkWidget * overview_canvas
Definition gui_main.c:112
GtkWidget * toplevel
Definition gui_main.c:126
static void setup_widgets(void)
Definition gui_main.c:1096
#define OVERVIEW_CANVAS_STORE_WIDTH
Definition gui_main.c:119
static gboolean toplevel_key_release_handler(GtkWidget *w, GdkEventKey *ev, gpointer data)
Definition gui_main.c:550
void remove_net_input(void)
Definition gui_main.c:2280
GtkWidget * map_horizontal_scrollbar
Definition gui_main.c:109
GtkWidget * map_canvas
Definition gui_main.c:108
static gboolean toplevel_key_press_handler(GtkWidget *w, GdkEventKey *ev, gpointer data)
Definition gui_main.c:568
void sound_bell(void)
Definition gui_main.c:2054
static void migrate_options_from_gtk2(void)
Definition gui_main.c:1740
GtkWidget * econ_label[10]
Definition gui_main.c:143
GtkWidget * government_ebox
Definition gui_main.c:159
void popup_quit_dialog(void)
Definition gui_main.c:2318
static void migrate_options_from_gtk3(void)
Definition gui_main.c:1795
const char *const gui_character_encoding
Definition gui_main.c:161
static int unit_id_top
Definition gui_main.c:174
static gboolean get_net_input(GIOChannel *source, GIOCondition condition, gpointer data)
Definition gui_main.c:2226
static bool audio_paused
Definition gui_main.c:187
static GtkWidget * more_arrow_pixmap_container
Definition gui_main.c:172
GtkWidget * map_widget
Definition gui_main.c:131
static bool client_focus
Definition gui_main.c:188
GtkWidget * right_notebook
Definition gui_main.c:130
void quit_gtk_main(void)
Definition gui_main.c:2306
static void allied_chat_button_toggled(GtkToggleButton *button, gpointer user_data)
Definition gui_main.c:2499
static struct video_mode vmode
Definition gui_main.c:190
void add_net_input(int sock)
Definition gui_main.c:2262
static GLogWriterOutput g_log_writer_to_freelog_cb(GLogLevelFlags log_level, const GLogField *fields, gsize n_fields, gpointer user_data)
Definition gui_main.c:1678
GtkWidget * toplevel_tabs
Definition gui_main.c:128
static GtkWidget * allied_chat_toggle_button
Definition gui_main.c:179
GtkWidget * flake_ebox
Definition gui_main.c:158
int overview_canvas_store_width
Definition gui_main.c:123
void update_turn_done_tooltip(void)
Definition gui_main.c:1077
static void tearoff_callback(GtkWidget *b, gpointer data)
Definition gui_main.c:758
static GtkWidget * unit_image
Definition gui_main.c:166
GtkTextView * main_message_area
Definition gui_main.c:177
int overview_canvas_store_height
Definition gui_main.c:124
int screen_height(void)
Definition gui_main.c:2562
static bool parse_options(int argc, char **argv)
Definition gui_main.c:285
GtkWidget * conn_box
Definition gui_main.c:140
#define OVERVIEW_CANVAS_STORE_HEIGHT
Definition gui_main.c:121
GtkWidget * main_frame_civ_name
Definition gui_main.c:137
#define MIGRATE_OPTION(opt)
const bool gui_use_transliteration
Definition gui_main.c:162
static void populate_unit_image_table(void)
Definition gui_main.c:859
#define GUI_NAME_FULL
Definition gui_main.h:29
#define ACCL_MOD_KEY
Definition gui_main.h:26
#define GUI_NAME_SHORT
Definition gui_main.h:30
#define GUI_GTK_OPTION(optname)
Definition gui_main.h:32
void dlg_tab_provider_prepare(void)
Definition gui_stuff.c:1155
void setup_dialog(GtkWidget *shell, GtkWidget *parent)
Definition gui_stuff.c:287
void gui_update_font_full(const char *font_name, const char *font_value, PangoFontDescription **font_desc)
Definition gui_stuff.c:1073
void happiness_dialog_init(void)
Definition happiness.c:86
void happiness_dialog_done(void)
Definition happiness.c:94
void help_system_init(void)
Definition helpdlg.c:157
void intel_dialog_done(void)
Definition inteldlg.c:128
void intel_dialog_init(void)
Definition inteldlg.c:119
void luaconsole_dialog_init(void)
Definition luaconsole.c:83
void luaconsole_dialog_done(void)
Definition luaconsole.c:101
gboolean butt_release_mapcanvas(GtkWidget *w, GdkEventButton *ev, gpointer data)
Definition mapctrl.c:221
gboolean move_overviewcanvas(GtkWidget *w, GdkEventMotion *ev, gpointer data)
Definition mapctrl.c:463
gboolean butt_down_overviewcanvas(GtkWidget *w, GdkEventButton *ev, gpointer data)
Definition mapctrl.c:473
gboolean butt_down_mapcanvas(GtkWidget *w, GdkEventButton *ev, gpointer data)
Definition mapctrl.c:242
gboolean move_mapcanvas(GtkWidget *w, GdkEventMotion *ev, gpointer data)
Definition mapctrl.c:406
gboolean leave_mapcanvas(GtkWidget *widget, GdkEventCrossing *event)
Definition mapctrl.c:435
void update_city_descriptions(void)
Definition mapview.c:488
gboolean map_canvas_draw(GtkWidget *w, cairo_t *cr, gpointer data)
Definition mapview.c:424
gboolean map_canvas_configure(GtkWidget *w, GdkEventConfigure *ev, gpointer data)
Definition mapview.c:403
void put_unit_image(struct unit *punit, GtkImage *p, int height)
Definition mapview.c:496
gboolean overview_canvas_draw(GtkWidget *w, cairo_t *cr, gpointer data)
Definition mapview.c:356
GtkWidget * setup_menus(GtkWidget *window)
Definition menu.c:2219
void menus_free(void)
Definition menu.c:3295
void meswin_dialog_popup(bool raise)
Definition messagewin.c:417
GtkWidget * create_start_page(void)
Definition pages.c:2623
GtkWidget * create_network_page(void)
Definition pages.c:1201
GtkWidget * create_scenario_page(void)
Definition pages.c:3185
static GtkWidget * statusbar
Definition pages.c:89
void destroy_server_scans(void)
Definition pages.c:768
GtkWidget * create_load_page(void)
Definition pages.c:2904
GtkWidget * create_statusbar(void)
Definition pages.c:909
GtkWidget * create_main_page(void)
Definition pages.c:231
void science_report_dialog_redraw(void)
Definition repodlgs.c:761
void spaceship_dialog_init(void)
void spaceship_dialog_done(void)
GdkPixbuf * sprite_get_pixbuf(struct sprite *sprite)
Definition sprite.c:402
GtkWidget * ingame_votebar
GtkWidget * voteinfo_bar_new(bool split_bar)
#define enable(id)
Definition widget.h:223
struct client_properties gui_properties
log_callback_fn log_set_callback(log_callback_fn callback)
Definition log.c:298
#define fc_assert_ret(condition)
Definition log.h:192
#define log_verbose(message,...)
Definition log.h:110
#define log_fatal(message,...)
Definition log.h:101
#define log_debug(message,...)
Definition log.h:116
#define log_normal(message,...)
Definition log.h:108
#define log_base(level, message,...)
Definition log.h:95
log_level
Definition log.h:29
@ LOG_ERROR
Definition log.h:31
@ LOG_DEBUG
Definition log.h:35
@ LOG_FATAL
Definition log.h:30
@ LOG_WARN
Definition log.h:32
#define log_error(message,...)
Definition log.h:104
void update_line(int canvas_x, int canvas_y)
void maybe_activate_keyboardless_goto(int canvas_x, int canvas_y)
bool rbutton_down
bool tiles_hilited_cities
void scroll_mapview(enum direction8 gui_dir)
bool keyboardless_goto_button_down
void update_selection_rectangle(float canvas_x, float canvas_y)
void init_mapcanvas_and_overview(void)
struct tile * canvas_pos_to_tile(float canvas_x, float canvas_y, float zoom)
void free_mapcanvas_and_overview(void)
void get_mapview_scroll_pos(int *scroll_x, int *scroll_y)
void get_mapview_scroll_step(int *xstep, int *ystep)
void set_mapview_scroll_pos(int scroll_x, int scroll_y, float zoom)
void center_tile_mapcanvas(const struct tile *ptile)
void set_frame_by_frame_animation(void)
void link_marks_clear_all(void)
#define fc_malloc(sz)
Definition mem.h:34
void menus_init(void)
void option_changed(struct option *poption)
Definition options.c:759
const struct option_set * server_optset
Definition options.c:4077
const struct option_set * client_optset
Definition options.c:1291
bool option_bool_get(const struct option *poption)
Definition options.c:808
enum option_type option_type(const struct option *poption)
Definition options.c:669
const char * option_font_target(const struct option *poption)
Definition options.c:1174
bool string_to_video_mode(const char *buf, struct video_mode *mode)
Definition options.c:6597
struct client_options gui_options
Definition options.c:71
const char * option_font_get(const struct option *poption)
Definition options.c:1152
struct option * optset_option_by_name(const struct option_set *poptset, const char *name)
Definition options.c:442
@ GUI_GTK_MSGCHAT_MERGED
Definition options.h:69
@ GUI_GTK_MSGCHAT_SPLIT
Definition options.h:67
#define GUI_GTK_OVERVIEW_MIN_XSIZE
Definition options.h:608
#define options_iterate(poptset, poption)
Definition options.h:561
#define options_iterate_end
Definition options.h:566
const char * get_info_label_text_popup(void)
Definition text.c:1022
struct setting_list * level[OLEVELS_NUM]
Definition settings.c:190
#define CLIP(lower, current, upper)
Definition shared.h:57
void * data
Definition gui_main.c:2353
void(* callback)(void *data)
Definition gui_main.c:2352
struct connection conn
Definition client_main.h:96
bool silent_when_not_in_focus
Definition options.h:191
bool gui_gtk3_migrated_from_2_5
Definition options.h:139
bool first_boot
Definition options.h:128
bool gui_gtk3_fullscreen
Definition options.h:266
bool migrate_fullscreen
Definition options.h:145
bool gui_gtk3_migrated_from_gtk2
Definition options.h:133
struct client_properties::@203 views
Definition colors.h:21
struct player * playing
Definition connection.h:151
void(* notify_of_writable_data)(struct connection *pc, bool data_available_and_socket_full)
Definition connection.h:181
Definition unit.h:139
int id
Definition unit.h:146
int height
Definition options.h:48
int width
Definition options.h:47
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:960
int cat_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:986
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
void tileset_load_tiles(struct tileset *t)
Definition tilespec.c:3822
void tileset_free_tiles(struct tileset *t)
Definition tilespec.c:6842
void tileset_use_preferred_theme(const struct tileset *t)
Definition tilespec.c:7324
struct sprite * get_icon_sprite(const struct tileset *t, enum icon_type icon)
Definition tilespec.c:7234
void tileset_init(struct tileset *t)
Definition tilespec.c:7381
struct sprite * get_arrow_sprite(const struct tileset *t, enum arrow_type arrow)
Definition tilespec.c:7123
struct sprite * get_tax_sprite(const struct tileset *t, Output_type_id otype)
Definition tilespec.c:7134
int tileset_tile_width(const struct tileset *t)
Definition tilespec.c:779
@ ARROW_RIGHT
Definition tilespec.h:201
@ ICON_FREECIV
Definition tilespec.h:314
#define unit_tile(_pu)
Definition unit.h:406
#define unit_owner(_pu)
Definition unit.h:405
float mouse_zoom
Definition zoom.c:28
void zoom_step_down(void)
Definition zoom.c:130
void zoom_step_up(void)
Definition zoom.c:106