Freeciv-3.4
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/gdk.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-5.0 */
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
131
135
138
141
149
153
155
156const char *const gui_character_encoding = "UTF-8";
158
165
166static int unit_id_top;
167static int unit_ids[MAX_NUM_UNITS_BELOW]; /* ids of the units icons in
168 * information display: (or 0) */
172
176
177static bool gui_up = FALSE;
178
179static bool audio_paused = FALSE;
180static bool client_focus = TRUE;
181
184
185static struct video_mode vmode = { -1, -1 };
186
187static void set_g_log_callbacks(void);
188
190 double x, double y, gpointer data);
191
192static void end_turn_callback(GtkWidget *w, gpointer data);
194 gpointer data);
195static void set_wait_for_writable_socket(struct connection *pc,
196 bool socket_writable);
197
198static void print_usage(void);
199static void activate_gui(GtkApplication *app, gpointer data);
200static bool parse_options(int argc, char **argv);
204 GdkModifierType state,
205 gpointer data);
207 gdouble dx, gdouble dy,
208 gpointer data);
209
210static void tearoff_callback(GtkWidget *b, gpointer data);
211static GtkWidget *detached_widget_new(void);
213
215 double x, double y, gpointer data);
217 double x, double y, gpointer data);
218static gboolean quit_dialog_callback(void);
219
221 gpointer user_data);
222
223static void free_unit_table(void);
224
225static void adjust_default_options(void);
226
229 gpointer user_data);
230
231static float zoom_steps_custom[] = {
232 -1.0, 0.13, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 2.0, 2.5, 3.0, 4.0, -1.0
233};
234
235/**********************************************************************/
238static void log_callback_utf8(enum log_level level, const char *message,
239 bool file_too)
240{
241 if (!file_too || level <= LOG_FATAL) {
242 fc_fprintf(stderr, "%d: %s\n", level, message);
243 }
244}
245
246/**********************************************************************/
251{
252 double seconds = real_timer_callback();
253
255 if (!audio_paused && !client_focus) {
256 audio_pause();
258 } else if (audio_paused && client_focus) {
259 audio_resume();
261 }
262 }
263
265
266 return FALSE;
267}
268
269/**********************************************************************/
273static void print_usage(void)
274{
275 /* Add client-specific usage information here */
277 _("gtk4x-client gui-specific options are:\n"));
278
280 _("-r, --resolution WIDTHxHEIGHT\tAssume given resolution "
281 "screen\n"));
283 /* TRANS: Keep word 'default' untranslated */
284 _("-z, --zoom LEVEL\tSet zoom level; use value 'default' "
285 "to reset\n\n"));
286
287 /* TRANS: No full stop after the URL, could cause confusion. */
288 fc_fprintf(stderr, _("Report bugs at %s\n"), BUG_URL);
289}
290
291/**********************************************************************/
294static bool parse_options(int argc, char **argv)
295{
296 int i = 1;
297
298 while (i < argc) {
299 char *option = NULL;
300
301 if (is_option("--help", argv[i])) {
302 print_usage();
303
304 return FALSE;
305 } else if ((option = get_option_malloc("--zoom", argv, &i, argc, FALSE))) {
306 char *endptr;
307
308 if (strcmp("default", option)) {
311 } else {
313 }
314 free(option);
315 } else if ((option = get_option_malloc("--resolution", argv, &i, argc, FALSE))) {
317 fc_fprintf(stderr, _("Illegal video mode '%s'\n"), option);
319 }
320 free(option);
321 } else {
322 fc_fprintf(stderr, _("Unknown command-line option \"%s\".\n"),
323 argv[i]);
325 }
326
327 i++;
328 }
329
330 return TRUE;
331}
332
333/**********************************************************************/
337 gpointer data)
338{
339 switch (arg) {
342
343 if (!gtk_widget_get_can_focus(w)) {
344 return;
345 }
346
347 if (!gtk_widget_is_focus(w)) {
349 return;
350 }
351 break;
352
353 default:
354 break;
355 }
356}
357
358/**********************************************************************/
364{
366 static int old_width = -1, old_height = -1;
369
370 if (width != old_width
371 || height != old_height || height == 0) {
372 /* XXX: At starts, we have a race condition with the chatline content
373 * recovery. It might consider that the bottom line is the first one,
374 * probably because gtk_widget_get_* calls returns 0. If you scroll up
375 * you will see the past content displayed.
376 */
380 }
381 }
382}
383
384/**********************************************************************/
395
396/**********************************************************************/
400{
401 if ((state & GDK_SHIFT_MASK)) {
402 switch (keyval) {
403
404 case GDK_KEY_Left:
406 return TRUE;
407
408 case GDK_KEY_Right:
410 return TRUE;
411
412 case GDK_KEY_Up:
414 return TRUE;
415
416 case GDK_KEY_Down:
418 return TRUE;
419
420 case GDK_KEY_Home:
422 return TRUE;
423
424 case GDK_KEY_Page_Up:
427 return TRUE;
428
432 return TRUE;
433
434 default:
435 break;
436 }
437 } else if (!(state & GDK_CONTROL_MASK)) {
438 switch (keyval) {
439 default:
440 break;
441 }
442 }
443
444 if (!(state & GDK_CONTROL_MASK)) {
445 switch (keyval) {
446 case GDK_KEY_KP_Add:
447 zoom_step_up();
448 return TRUE;
449
452 return TRUE;
453
454 default:
455 break;
456 }
457 }
458
459 /* Return here if observer */
460 if (client_is_observer()) {
461 return FALSE;
462 }
463
464 switch (keyval) {
465
466 case GDK_KEY_KP_Up:
467 case GDK_KEY_KP_8:
468 case GDK_KEY_Up:
469 case GDK_KEY_8:
471 return TRUE;
472
474 case GDK_KEY_KP_9:
475 case GDK_KEY_Page_Up:
476 case GDK_KEY_9:
478 return TRUE;
479
480 case GDK_KEY_KP_Right:
481 case GDK_KEY_KP_6:
482 case GDK_KEY_Right:
483 case GDK_KEY_6:
485 return TRUE;
486
488 case GDK_KEY_KP_3:
490 case GDK_KEY_3:
492 return TRUE;
493
494 case GDK_KEY_KP_Down:
495 case GDK_KEY_KP_2:
496 case GDK_KEY_Down:
497 case GDK_KEY_2:
499 return TRUE;
500
501 case GDK_KEY_KP_End:
502 case GDK_KEY_KP_1:
503 case GDK_KEY_End:
504 case GDK_KEY_1:
506 return TRUE;
507
508 case GDK_KEY_KP_Left:
509 case GDK_KEY_KP_4:
510 case GDK_KEY_Left:
511 case GDK_KEY_4:
513 return TRUE;
514
515 case GDK_KEY_KP_Home:
516 case GDK_KEY_KP_7:
517 case GDK_KEY_Home:
518 case GDK_KEY_7:
520 return TRUE;
521
522 case GDK_KEY_KP_Begin:
523 case GDK_KEY_KP_5:
524 case GDK_KEY_5:
526 return TRUE;
527
528 case GDK_KEY_Escape:
530 return TRUE;
531
532 case GDK_KEY_b:
535 return TRUE;
536 }
537 break;
538
539 default:
540 break;
541 };
542
543 return FALSE;
544}
545
546/**********************************************************************/
552 GdkModifierType state,
553 gpointer data)
554{
555 if (inputline_has_focus()) {
556 return FALSE;
557 }
558
559 if (keyval == GDK_KEY_apostrophe) {
560 /* Allow this even if not in main map view; chatline is present on
561 * some other pages too */
562
563 /* Make the chatline visible if it's not currently.
564 * FIXME: should find the correct window, even when detached, from any
565 * other window; should scroll to the bottom automatically showing the
566 * latest text from other players; MUST NOT make spurious text windows
567 * at the bottom of other dialogs. */
569 /* The main game view is visible. May need to switch notebook. */
572 } else {
574 }
575 }
576
577 /* If the chatline is (now) visible, focus it. */
578 if (inputline_is_visible()) {
580 return TRUE;
581 }
582 }
583
586 return FALSE;
587 }
588
589 if (editor_is_active()) {
590 if (handle_edit_key_press(keyval, state)) {
591 return TRUE;
592 }
593 }
594
595 if (state & GDK_SHIFT_MASK) {
596 switch (keyval) {
597
598 case GDK_KEY_Return:
599 case GDK_KEY_KP_Enter:
600 key_end_turn();
601 return TRUE;
602
603 default:
604 break;
605 }
606 }
607
609 /* 0 means the map view is focused. */
610 return key_press_map_canvas(keyval, state);
611 }
612
613#if 0
614 /* We are focused some other dialog, tab, or widget. */
615 if ((state & GDK_CONTROL_MASK)) {
616 } else if ((state & GDK_SHIFT_MASK)) {
617 } else {
618 switch (keyval) {
619
620 case GDK_KEY_F4:
622 return TRUE;
623
624 default:
625 break;
626 };
627 }
628#endif /* 0 */
629
630 return FALSE;
631}
632
633/**********************************************************************/
679
680/**********************************************************************/
686{
687 g_object_ref(wdg); /* Make sure reference count stays above 0
688 * during the transition to new parent. */
689
690 if (GTK_IS_PANED(old_wdg)) {
692 } else if (GTK_IS_WINDOW(old_wdg)) {
694 } else {
696
698 }
699
700 if (GTK_IS_PANED(new_wdg)) {
702 } else if (GTK_IS_WINDOW(new_wdg)) {
704 } else {
706
708 }
709
711}
712
713/**********************************************************************/
723
724/**********************************************************************/
734
735/**********************************************************************/
739{
741
742 aparent = g_object_get_data(G_OBJECT(box), "aparent");
744
745 if (aparent != cparent) {
747
749 }
750}
751
752/**********************************************************************/
755static void tearoff_close(GtkWidget *w, gpointer data)
756{
758}
759
760/**********************************************************************/
765{
766 GtkWidget *box = GTK_WIDGET(data);
768
770 GtkWidget *w;
772
773 w = gtk_window_new();
775 gtk_widget_set_name(w, "Freeciv");
776 gtk_window_set_title(GTK_WINDOW(w), _("Freeciv"));
777 g_signal_connect(w, "close-request", G_CALLBACK(tearoff_close), box);
778
779 g_object_set_data(G_OBJECT(box), "aparent", gtk_widget_get_parent(box));
780
781 temp_hide = g_object_get_data(G_OBJECT(box), "hide-over-reparent");
782 if (temp_hide != nullptr) {
784 }
785
787
789
790 if (temp_hide != nullptr) {
792 }
793 } else {
794 tearoff_reattach(box);
795 }
796}
797
798/**********************************************************************/
802{
804
805 return hbox;
806}
807
808/**********************************************************************/
813{
814 GtkWidget *b, *fillbox;
816
819
820 /* These toggle buttons run vertically down the side of many UI
821 * elements, so they need to be thin horizontally. */
823 ".detach_button {\n"
824 " padding: 0px 0px 0px 0px;\n"
825 " min-width: 6px;\n"
826 "}",
827 -1);
828 }
829
835 gtk_widget_add_css_class(b, "detach_button");
836 gtk_widget_set_tooltip_text(b, _("Detach/Attach the pane."));
837
840
842
844
845 return fillbox;
846}
847
848/**********************************************************************/
855static void populate_unit_pic_table(void)
856{
857 int i, width;
859 GdkPixbuf *pix;
860 int ttw;
862
863 /* Get width of the overview window */
867
869
871 /* We want arrow to appear if there is other units in addition
872 to active one in tile. Active unit is not counted, so there
873 can be 0 other units to not to display arrow. */
874 num_units_below = 1 - 1;
875 } else {
878 }
879
880 /* Top row: the active unit. */
881 /* Note, we ref this and other widgets here so that we can unref them
882 * in reset_unit_table. */
886 gtk_grid_attach(GTK_GRID(table), unit_pic, 0, 0, 1, 1);
887
889 g_signal_connect(controller, "pressed",
891 GINT_TO_POINTER(-1));
893
895 /* Bottom row: other units in the same tile. */
896 for (i = 0; i < num_units_below; i++) {
900
902 g_signal_connect(controller, "pressed",
906
908 i, 1, 1, 1);
909 }
910 }
911
912 /* Create arrow (popup for all units on the selected tile) */
916
918 g_signal_connect(controller, "pressed",
920 NULL);
922
923 /* An extra layer so that we can hide the clickable button but keep
924 * an explicit size request to avoid the layout jumping around */
931 gdk_pixbuf_get_width(pix), -1);
933
935 /* Display on bottom row. */
937 num_units_below, 1, 1, 1);
938 } else {
939 /* Display on top row (there is no bottom row). */
941 1, 0, 1, 1);
942 }
943
945}
946
947/**********************************************************************/
970
971/**********************************************************************/
975{
976 /* Unreference all of the widgets that we're about to reallocate, thus
977 * avoiding a memory leak. Remove them from the container first, just
978 * to be safe. Note, the widgets are ref'd in
979 * populate_unit_pic_table(). */
981
983
984 /* We have to force a redraw of the units. And we explicitly have
985 * to force a redraw of the focus unit, which is normally only
986 * redrawn when the focus changes. We also have to force the 'more'
987 * arrow to go away, both by explicitly hiding it and telling it to
988 * do so (this will be reset immediately afterwards if necessary,
989 * but we have to make the *internal* state consistent). */
992 if (get_num_units_in_focus() == 1) {
994 } else {
995 set_unit_icon(-1, NULL);
996 }
998}
999
1000/**********************************************************************/
1003#if 0
1005{
1010}
1011#endif
1012
1013/**********************************************************************/
1021
1022/**********************************************************************/
1026{
1027 struct option *opt = optset_option_by_name(server_optset, "fixedlength");
1028
1029 if (opt != NULL && option_bool_get(opt)) {
1031 _("Fixed length turns"));
1032 } else {
1033 char buf[256];
1034
1035 fc_snprintf(buf, sizeof(buf), "%s:\n%s",
1036 _("Turn Done"), _("Shift+Return"));
1038 }
1039}
1040
1041/**********************************************************************/
1044static void setup_widgets(void)
1045{
1046 GtkWidget *page, *hgrid, *hgrid2, *label;
1047 GtkWidget *frame, *table, *table2, *paned, *sw, *text;
1048 GtkWidget *button, *view, *mainbox, *vbox, *right_vbox = NULL;
1049 int i;
1050 GtkWidget *notebook, *statusbar;
1052 struct sprite *spr;
1053 int right_row = 0;
1054 int top_row = 0;
1055 int grid_col = 0;
1056 int grid2_col = 0;
1059 GtkWidget *ebar;
1060
1062
1063 notebook = gtk_notebook_new();
1064
1065 toplevel_tabs = notebook;
1070 gtk_box_append(GTK_BOX(mainbox), notebook);
1073
1084
1086
1092
1093 /* *** Everything in the top *** */
1094
1095 page = gtk_scrolled_window_new();
1100 TRUE);
1101 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, NULL);
1102
1107 hgrid = gtk_grid_new();
1108
1110 /* The window is divided into two horizontal panels: overview +
1111 * civinfo + unitinfo, main view + message window. */
1113 right_row = 0;
1117
1123
1124 /* Overview size designed for small displays (netbooks). */
1127 } else {
1128 /* The window is divided into two vertical panes: overview +
1129 * + civinfo + unitinfo + main view, message window. */
1134
1135 /* Overview size designed for big displays (desktops). */
1138 }
1139
1140 /* This holds the overview canvas, production info, etc. */
1142 /* Put vbox to the left of anything else in hgrid -- right_vbox is either
1143 * the chat/messages pane, or NULL which is OK */
1145 GTK_POS_LEFT, 1, 1);
1146 grid_col++;
1147
1148 /* Overview canvas */
1154
1162
1172
1174
1177
1180
1195
1196 /* The rest */
1203
1204 /* Info on player's civilization, when game is running. */
1205 frame = gtk_frame_new("");
1206 gtk_box_append(GTK_BOX(avbox), frame);
1207
1208 main_frame_civ_name = frame;
1209
1213
1214 label = gtk_label_new(NULL);
1218 gtk_widget_set_margin_end(label, 2);
1219 gtk_widget_set_margin_top(label, 2);
1221
1224 G_CALLBACK(show_info_popup), frame);
1227 main_label_info = label;
1228
1229 /* Production status */
1230 table = gtk_grid_new();
1234
1235 /* Citizens for taxrates */
1236 table2 = gtk_grid_new();
1237 gtk_grid_attach(GTK_GRID(table), table2, 0, 0, 10, 1);
1239
1240 for (i = 0; i < 10; i++) {
1242
1245
1248 g_signal_connect(controller, "pressed",
1254 g_signal_connect(controller, "pressed",
1258 }
1259
1260 /* Science, environmental, govt, timeout */
1262 if (spr != NULL) {
1264 } else {
1266 }
1267
1269 if (spr != NULL) {
1271 } else {
1273 }
1274
1276 if (spr != NULL) {
1278 } else {
1280 }
1281
1283 if (spr != NULL) {
1285 } else {
1287 }
1288
1289 for (i = 0; i < 4; i++) {
1290 GtkWidget *w;
1291
1292 switch (i) {
1293 case 0:
1294 w = bulb_label;
1295 break;
1296 case 1:
1297 w = sun_label;
1298 break;
1299 case 2:
1300 w = flake_label;
1301 break;
1302 default:
1303 case 3:
1304 w = government_label;
1305 break;
1306 }
1307
1314 gtk_grid_attach(GTK_GRID(table), w, i, 1, 1, 1);
1315 }
1316
1318
1319 frame = gtk_frame_new(NULL);
1320 gtk_grid_attach(GTK_GRID(table), frame, 4, 1, 6, 1);
1322
1323
1324 /* Turn done */
1326
1328
1332
1333 /* Selected unit status */
1334
1335 /* If you turn this to something else than GtkBox, also adjust
1336 * editgui.c replace_widget() code that removes and adds widgets from it. */
1340
1341 /* In edit mode the unit_info_box widget is replaced by the
1342 * editinfobox, so we need to add a ref here so that it is
1343 * not destroyed when removed from its container.
1344 * See editinfobox_refresh() call to replace_widget() */
1346
1349
1355
1356 label = gtk_label_new(NULL);
1361 gtk_widget_set_margin_end(label, 2);
1362 gtk_widget_set_margin_top(label, 2);
1365 unit_info_label = label;
1366
1367 hgrid2 = gtk_grid_new();
1369
1370 table = gtk_grid_new();
1376
1379
1381
1382 /* Map canvas, editor toolbar, and scrollbars */
1383
1384 /* The top notebook containing the map view and dialogs. */
1385
1389
1390
1395 right_row = 0;
1398
1402 } else {
1404 }
1405
1407
1410
1417
1418 label = gtk_label_new(Q_("?noun:View"));
1420
1421 frame = gtk_frame_new(NULL);
1422 gtk_grid_attach(GTK_GRID(map_widget), frame, 0, 0, 1, 1);
1423
1429
1431
1432#if 0
1441#endif /* 0 */
1442
1444
1448
1452
1454 NULL, NULL);
1455
1459 g_signal_connect(mc_controller, "released",
1467 g_signal_connect(mc_controller, "released",
1486
1487 g_signal_connect(map_canvas, "resize",
1489
1490 /* Synchronize animation updates with the tick (improve performances) */
1492
1494 g_signal_connect(mc_controller, "key-pressed",
1497
1498 /* *** The message window -- this is a detachable widget *** */
1499
1502 } else {
1504
1508
1512 }
1514
1517 } else {
1519 }
1525
1530
1537 }
1538 }
1539
1541
1544 TRUE);
1549
1550 label = gtk_label_new(_("Chat"));
1552
1559
1560 gtk_widget_set_name(text, "chatline");
1561
1563 gtk_widget_realize(text);
1565
1567 if (dtach_lowbox != NULL) {
1569 }
1570
1572
1573 /* The chat line */
1580
1581 button = gtk_check_button_new_with_label(_("Allies Only"));
1585 g_signal_connect(button, "toggled",
1589
1590 button = gtk_button_new_with_label(_("Clear links"));
1591 g_signal_connect(button, "clicked",
1594
1595 /* These two signals doesn't seems to be triggered for now */
1596 g_signal_connect(main_message_area, "notify::default-width",
1598 g_signal_connect(main_message_area, "notify::default-height",
1600
1601 /* Use parent resize to triggers properly the resize */
1602 g_signal_connect(map_canvas, "resize",
1604
1605 /* Other things to take care of */
1606
1608 TRUE);
1609
1612 }
1613
1616
1620 }
1621}
1622
1623/**********************************************************************/
1628 const gchar *message,
1629 gpointer user_data)
1630{
1631 enum log_level fllvl = LOG_ERROR;
1632
1633 switch (log_level) {
1634 case G_LOG_LEVEL_DEBUG:
1635 fllvl = LOG_DEBUG;
1636 break;
1638 fllvl = LOG_WARN;
1639 break;
1640 default:
1641 break;
1642 }
1643
1644 if (log_domain != NULL) {
1645 log_base(fllvl, "%s: %s", log_domain, message);
1646 } else {
1647 log_base(fllvl, "%s", message);
1648 }
1649}
1650
1651/**********************************************************************/
1655 const GLogField *fields,
1657 gpointer user_data)
1658{
1659 /* No need to have formatter of our own - let's use glib's default one. */
1661
1663
1664 return G_LOG_WRITER_HANDLED;
1665}
1666
1667/**********************************************************************/
1678
1679/**********************************************************************/
1682static void set_g_log_callbacks(void)
1683{
1684 /* Old API, still used by many log producers */
1686
1690
1691 /* glib >= 2.50 API */
1693}
1694
1695/**********************************************************************/
1706
1707/**********************************************************************/
1710int main(int argc, char **argv)
1711{
1712 return client_main(argc, argv, FALSE);
1713}
1714
1715/**********************************************************************/
1719{
1720 log_normal(_("Migrating options from gtk2 to gtk3 client"));
1721
1722#define MIGRATE_OPTION(opt) gui_options.gui_gtk3_##opt = gui_options.gui_gtk2_##opt;
1723#define MIGRATE_STR_OPTION(opt) \
1724 strncpy(gui_options.gui_gtk3_##opt, gui_options.gui_gtk2_##opt, \
1725 sizeof(gui_options.gui_gtk3_##opt));
1726
1727 /* Default theme name is never migrated */
1728 /* 'fullscreen', 'small_display_layout', and 'message_chat_location'
1729 * not migrated, as (unlike Gtk2), Gtk3-client tries to pick better
1730 * defaults for these in fresh installations based on screen size (see
1731 * adjust_default_options()); so user is probably better served by
1732 * getting these adaptive defaults than whatever they had for Gtk2.
1733 * Since 'fullscreen' isn't migrated, we don't need to worry about
1734 * preserving gui_gtk2_migrated_from_2_5 either. */
1748 MIGRATE_OPTION(popup_tech_help);
1749
1763
1764#undef MIGRATE_OPTION
1765#undef MIGRATE_STR_OPTION
1766
1768}
1769
1770/**********************************************************************/
1774{
1775 log_normal(_("Migrating options from gtk3 to gtk3.22 client"));
1776
1777#define MIGRATE_OPTION(opt) gui_options.gui_gtk3_22_##opt = gui_options.gui_gtk3_##opt;
1778#define MIGRATE_STR_OPTION(opt) \
1779 strncpy(gui_options.gui_gtk3_22_##opt, gui_options.gui_gtk3_##opt, \
1780 sizeof(gui_options.gui_gtk3_22_##opt));
1781
1782 /* Default theme name is never migrated */
1783
1784 /* Simulate gui-gtk3's migrate_options_from_2_5() */
1786 log_normal(_("Migrating gtk3-client options from freeciv-2.5 options."));
1789 }
1790
1807 MIGRATE_OPTION(popup_tech_help);
1808
1822
1823#undef MIGRATE_OPTION
1824#undef MIGRATE_STR_OPTION
1825
1827}
1828
1829/**********************************************************************/
1833{
1834 log_normal(_("Migrating options from gtk3.22 to gtk4 client"));
1835
1836#define MIGRATE_OPTION(opt) gui_options.gui_gtk4_##opt = gui_options.gui_gtk3_22_##opt;
1837#define MIGRATE_STR_OPTION(opt) \
1838 strncpy(gui_options.gui_gtk4_##opt, gui_options.gui_gtk3_22_##opt, \
1839 sizeof(gui_options.gui_gtk4_##opt));
1840
1841 /* Default theme name is never migrated */
1862 MIGRATE_OPTION(popup_tech_help);
1863
1877
1878#undef MIGRATE_OPTION
1879#undef MIGRATE_STR_OPTION
1880
1882}
1883
1884/**********************************************************************/
1888{
1889 log_normal(_("Migrating options from gtk4 to gtk4x client"));
1890
1891#define MIGRATE_OPTION(opt) gui_options.gui_gtk5_##opt = gui_options.gui_gtk4_##opt;
1892#define MIGRATE_STR_OPTION(opt) \
1893 strncpy(gui_options.gui_gtk5_##opt, gui_options.gui_gtk4_##opt, \
1894 sizeof(gui_options.gui_gtk5_##opt));
1895
1896 /* Default theme name is never migrated */
1917 MIGRATE_OPTION(popup_tech_help);
1918
1932
1933#undef MIGRATE_OPTION
1934#undef MIGRATE_STR_OPTION
1935
1937}
1938
1939/**********************************************************************/
1942int ui_main(int argc, char **argv)
1943{
1944 if (parse_options(argc, argv)) {
1945 /* The locale has already been set in init_nls() and the windows-specific
1946 * locale logic in gtk_init() causes problems with zh_CN (see PR#39475) */
1948
1949 if (!gtk_init_check()) {
1950 log_fatal(_("Failed to open graphical mode."));
1951 return EXIT_FAILURE;
1952 }
1953
1955
1956 gui_up = TRUE;
1960 gui_up = FALSE;
1961
1970 cma_fe_done();
1972
1973 /* We have extra ref for unit_info_box that has protected
1974 * it from getting destroyed when editinfobox_refresh()
1975 * moves widgets around. Free that extra ref here. */
1977 if (empty_unit_paintable != NULL) {
1979 }
1980
1981 editgui_free();
1983 message_buffer = NULL; /* Result of destruction of everything */
1985 }
1986
1987 return EXIT_SUCCESS;
1988}
1989
1990/**********************************************************************/
1994{
1996 guint sig;
1998 char window_name[1024];
1999
2001 if (vmode.width > 0 && vmode.height > 0) {
2004 }
2005
2012
2014 gtk_widget_set_name(toplevel, "Freeciv");
2015
2017
2019
2020 if (gui_options.first_boot) {
2022 /* We're using fresh defaults for this version of this client,
2023 * so prevent any future migrations from other clients / versions */
2025 /* Avoid also marking previous Gtk clients as migrated, so that
2026 * they can have their own run of their adjust_default_options() if
2027 * they are ever run (as a side effect of Gtk3.22->Gtk4 migration). */
2028 } else {
2034 /* We want a fresh look at screen-size-related options after Gtk2 */
2036 /* We don't ever want to consider pre-2.6 fullscreen option again
2037 * (even for gui-gtk3) */
2039 }
2041 }
2043 }
2045 }
2046 }
2047
2050 }
2051
2052 fc_snprintf(window_name, sizeof(window_name), _("Freeciv (%s)"), GUI_NAME_SHORT);
2054
2055 g_signal_connect(toplevel, "close-request",
2057
2058 /* Disable GTK cursor key focus movement */
2059 sig = g_signal_lookup("move-focus", GTK_TYPE_WIDGET);
2061 0, 0, 0, 0);
2063
2065 if (OT_FONT == option_type(poption)) {
2066 /* Force to call the appropriate callback. */
2068 }
2070
2073
2074 if (NULL == city_names_style) {
2076 log_error("city_names_style should have been set by options.");
2077 }
2080 log_error("city_productions_style should have been set by options.");
2081 }
2082 if (NULL == reqtree_text_style) {
2084 log_error("reqtree_text_style should have been set by options.");
2085 }
2086
2089
2090 /* Keep the icon of the executable on Windows (see PR#36491) */
2091#ifndef FREECIV_MSWINDOWS
2092 {
2093 /* Only call this after tileset_load_tiles is called. */
2095 }
2096#endif /* FREECIV_MSWINDOWS */
2097
2098 setup_widgets();
2099 load_cursors();
2100 cma_fe_init();
2107 chatline_init();
2109
2111
2113
2114 /* Assumes toplevel showing */
2116
2117 /* Assumes client_state is set */
2119}
2120
2121/**********************************************************************/
2124bool is_gui_up(void)
2125{
2126 return gui_up;
2127}
2128
2129/**********************************************************************/
2132void ui_exit(void)
2133{
2134 if (message_buffer != NULL) {
2137 }
2138}
2139
2140/**********************************************************************/
2143enum gui_type get_gui_type(void)
2144{
2145 return GUI_GTK5;
2146}
2147
2148/**********************************************************************/
2155
2156/**********************************************************************/
2162void set_unit_icon(int idx, struct unit *punit)
2163{
2164 GtkWidget *w;
2165
2166 fc_assert_ret(idx >= -1 && idx < num_units_below);
2167
2168 if (idx == -1) {
2169 w = unit_pic;
2170 unit_id_top = punit ? punit->id : 0;
2171 } else {
2172 w = unit_below_pic[idx];
2173 unit_ids[idx] = punit ? punit->id : 0;
2174 }
2175
2176 if (!w) {
2177 return;
2178 }
2179
2180 if (punit) {
2182 } else {
2183 if (empty_unit_paintable == NULL) {
2184 /* FIXME: Use proper icon height instead of hardcoded 50 */
2186
2187 /* Add ref to avoid it getting destroyed along any single parent widget. */
2189 }
2191 }
2192}
2193
2194/**********************************************************************/
2200{
2201 static bool showing = FALSE;
2202
2203 if (more_arrow == nullptr) {
2204 return;
2205 }
2206
2207 if (onoff && !showing) {
2209 showing = TRUE;
2210 } else if (!onoff && showing) {
2212 showing = FALSE;
2213 }
2214}
2215
2216/**********************************************************************/
2226
2227/**********************************************************************/
2232 double x, double y, gpointer data)
2233{
2234 int i = GPOINTER_TO_INT(data);
2235 struct unit *punit;
2236
2237 if (i == -1) {
2239 if (punit && unit_is_in_focus(punit)) {
2240 /* Clicking on the currently selected unit will center it. */
2242 }
2243 return TRUE;
2244 }
2245
2246 if (unit_ids[i] == 0) { /* No unit displayed at this place */
2247 return TRUE;
2248 }
2249
2251 if (NULL != punit && unit_owner(punit) == client_player()) {
2252 /* Unit shouldn't be NULL but may be owned by an ally. */
2254 }
2255
2256 return TRUE;
2257}
2258
2259/**********************************************************************/
2264 double x, double y, gpointer data)
2265{
2267
2268 if (punit) {
2270 }
2271
2272 return TRUE;
2273}
2274
2275/**********************************************************************/
2279{
2281}
2282
2283/**********************************************************************/
2287 double x, double y, gpointer data)
2288{
2289 GtkWidget *p;
2290 GtkWidget *child;
2291 GtkWidget *frame = GTK_WIDGET(data);
2292
2293 p = gtk_popover_new();
2294
2295 gtk_widget_set_parent(p, frame);
2298 g_signal_connect(p, "closed",
2301
2302 return TRUE;
2303}
2304
2305/**********************************************************************/
2309{
2310 /* Button going insensitive is going to lose focus. Keep focus at least
2311 * within the window */
2313
2316}
2317
2318/**********************************************************************/
2322 gpointer data)
2323{
2325
2326 return TRUE;
2327}
2328
2329/**********************************************************************/
2333 bool socket_writable)
2334{
2335 static bool previous_state = FALSE;
2336
2338
2340 return;
2341
2342 log_debug("set_wait_for_writable_socket(%d)", socket_writable);
2343
2348 NULL);
2349
2351}
2352
2353/**********************************************************************/
2357void add_net_input(int sock)
2358{
2359#ifdef FREECIV_MSWINDOWS
2361#else
2363#endif
2365 G_IO_IN | G_IO_ERR,
2367 NULL);
2369}
2370
2371/**********************************************************************/
2381
2382/**********************************************************************/
2386static void quit_dialog_response(GObject *dialog, GAsyncResult *result,
2387 gpointer data)
2388{
2390 result, NULL);
2391
2392 if (button == 0) {
2394 if (client.conn.used) {
2396 }
2397 quit_gtk_main();
2398 }
2399
2400 quit_dialog = NULL;
2401}
2402
2403/**********************************************************************/
2407{
2408 /* Quit gtk main loop. After this it will return to finish
2409 * ui_main() */
2410
2412}
2413
2414/**********************************************************************/
2419{
2420 if (quit_dialog == NULL) {
2421 const char *buttons[] = { _("Yes"), _("No"), NULL };
2422
2423 quit_dialog = gtk_alert_dialog_new(_("Are you sure you want to quit?"));
2425
2429 }
2430}
2431
2432/**********************************************************************/
2436{
2438 /* Stop emission of event. */
2439 return TRUE;
2440}
2441
2442struct callback {
2443 void (*callback)(void *data);
2444 void *data;
2445};
2446
2447/**********************************************************************/
2451{
2452 struct callback *cb = data;
2453
2454 (cb->callback)(cb->data);
2455 free(cb);
2456
2457 return FALSE;
2458}
2459
2460/**********************************************************************/
2465void add_idle_callback(void (callback)(void *), void *data)
2466{
2467 struct callback *cb = fc_malloc(sizeof(*cb));
2468
2469 cb->callback = callback;
2470 cb->data = data;
2472}
2473
2474/**********************************************************************/
2479 gpointer user_data)
2480{
2483 }
2484 return G_SOURCE_CONTINUE; /* keep animation call back running */
2485}
2486
2487/**********************************************************************/
2492{
2493 GtkWidget *button;
2494
2496 fc_assert_ret(button != NULL);
2498
2501}
2502
2503/**********************************************************************/
2514
2515/**********************************************************************/
2525
2526/**********************************************************************/
2536
2537/**********************************************************************/
2547
2548/**********************************************************************/
2553{
2554 struct option *poption;
2555
2556#define option_var_set_callback(var, callback) \
2557 if ((poption = optset_option_by_name(client_optset, \
2558 GUI_GTK_OPTION_STR(var)))) { \
2559 option_set_changed_callback(poption, callback); \
2560 } else { \
2561 log_error("Didn't find option %s!", GUI_GTK_OPTION_STR(var)); \
2562 }
2563
2568
2575#undef option_var_set_callback
2576}
2577
2578/**********************************************************************/
2583{
2584 GtkWidget *button;
2585
2587 fc_assert_ret(button != nullptr);
2589
2590 /* Hide the "Allies Only" button for local games. */
2591 if (is_server_running()) {
2593 } else {
2597 }
2598}
2599
2600/**********************************************************************/
2608
2609/**********************************************************************/
2613{
2614 cat_snprintf(outbuf, outlen, _("\nBuilt against gtk %d.%d.%d, using %d.%d.%d"
2615 "\nBuilt against glib %d.%d.%d, using %d.%d.%d"),
2620}
2621
2622/**********************************************************************/
2627{
2630
2632 if (!display) {
2633 return FALSE;
2634 }
2635
2637
2638 if (!monitor) {
2639 return FALSE;
2640 }
2641
2643
2644 return TRUE;
2645}
2646
2647/**********************************************************************/
2651{
2652 GdkRectangle rect;
2653
2654 if (vmode.width > 0) {
2655 return vmode.width;
2656 }
2657
2658 if (monitor_size(&rect)) {
2659 return rect.width;
2660 } else {
2661 return 0;
2662 }
2663}
2664
2665/**********************************************************************/
2669{
2670 GdkRectangle rect;
2671
2672 if (vmode.height > 0) {
2673 return vmode.height;
2674 }
2675
2676 if (monitor_size(&rect)) {
2677 return rect.height;
2678 } else {
2679 return 0;
2680 }
2681}
2682
2683/**********************************************************************/
2687{
2688 if (vmode.width > 0 && vmode.height > 0) {
2689 return &vmode;
2690 }
2691
2692 return NULL;
2693}
2694
2695/**********************************************************************/
2698static void adjust_default_options(void)
2699{
2700 int scr_height = screen_height();
2701
2702 if (scr_height > 0) {
2703 /* Adjust these options only if we do know the screen height. */
2704
2705 if (scr_height <= 480) {
2706 /* Freeciv is practically unusable outside fullscreen mode in so
2707 * small display */
2708 log_verbose("Changing default to fullscreen due to very small screen");
2710 }
2711 if (scr_height < 1024) {
2712 /* This is a small display */
2713 log_verbose("Defaulting to small widget layout due to small screen");
2715 log_verbose("Defaulting to merged messages/chat due to small screen");
2717 }
2718 }
2719}
2720
2721/**********************************************************************/
2725{
2726 return fc_app;
2727}
2728
2729/**********************************************************************/
2733{
2737#ifdef GTK3_3D_ENABLED
2739#else /* GTK3_3D_ENABLED */
2741#endif /* GTK3_3D_ENABLED */
2742}
void audio_pause(void)
Definition audio.c:609
void audio_resume(void)
Definition audio.c:617
struct canvas int int struct sprite int int int int height
Definition canvas_g.h:44
struct canvas int int struct sprite int int int width
Definition canvas_g.h:44
void chat_welcome_message(bool gui_has_copying_mitem)
static struct ai_type * self
Definition classicai.c:47
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 client_player()
#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:1322
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:77
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
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:103
@ O_GOLD
Definition fc_types.h:103
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_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 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 * detached_widget_fill(GtkWidget *tearbox)
Definition gui_main.c:814
GtkWidget * top_notebook
Definition gui_main.c:130
#define MIGRATE_STR_OPTION(opt)
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
void ui_init(void)
Definition gui_main.c:1722
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
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
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
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
GtkWidget * ahbox
Definition gui_main.c:140
static void apply_reqtree_text_font(struct option *poption)
Definition gui_main.c:2436
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 * 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 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
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
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
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
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
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
#define GUI_NAME_FULL
Definition gui_main.h:29
#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 move_overviewcanvas(GtkWidget *w, GdkEventMotion *ev, gpointer data)
Definition mapctrl.c:463
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 overview_canvas_draw(GtkWidget *w, cairo_t *cr, gpointer data)
Definition mapview.c:356
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
enum client_pages get_current_client_page(void)
Definition pages.c:3345
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)
gboolean reverse_taxrates_callback(GtkGestureClick *gesture, int n_press, double x, double y)
Definition dialogs.c:1461
static GdkPaintable * empty_unit_paintable
Definition gui_main.c:159
static void tearoff_close(GtkWidget *w, gpointer data)
Definition gui_main.c:754
static void tearoff_reattach(GtkWidget *box)
Definition gui_main.c:737
gboolean terminate_signal_processing(GtkEventControllerFocus *controller, gpointer data)
Definition gui_main.c:1015
static GtkWidget * more_arrow_container
Definition gui_main.c:164
static GtkWidget * unit_pic
Definition gui_main.c:161
static gboolean animation_tick_cb(GtkWidget *widget, GdkFrameClock *frame_clock, gpointer user_data)
Definition gui_main.c:2420
static gboolean select_more_arrow_callback(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data)
Definition gui_main.c:2204
GtkWidget * econ_widget
Definition gui_main.c:154
static GtkApplication * fc_app
Definition gui_main.c:182
GtkApplication * gui_app(void)
Definition gui_main.c:2667
static GtkWidget * more_arrow
Definition gui_main.c:163
static float zoom_steps_custom[]
Definition gui_main.c:230
static void migrate_options_from_gtk3_22(void)
Definition gui_main.c:1831
static void activate_gui(GtkApplication *app, gpointer data)
Definition gui_main.c:1937
static void populate_unit_pic_table(void)
Definition gui_main.c:854
static void info_popup_closed(GtkWidget *self, gpointer data)
Definition gui_main.c:2219
static void move_from_container_to_container(GtkWidget *wdg, GtkWidget *old_wdg, GtkWidget *new_wdg)
Definition gui_main.c:682
static gboolean select_unit_pic_callback(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data)
Definition gui_main.c:2172
static GtkWidget * unit_pic_table
Definition gui_main.c:160
static GtkWidget * unit_below_pic[MAX_NUM_UNITS_BELOW]
Definition gui_main.c:162
void main_message_area_resize(void *data)
Definition gui_main.c:362
gboolean right_butt_down_overviewcanvas(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data)
Definition mapctrl.c:501
gboolean left_butt_up_mapcanvas(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data)
Definition mapctrl.c:166
gboolean right_butt_up_mapcanvas(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data)
Definition mapctrl.c:183
gboolean left_butt_down_overviewcanvas(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data)
Definition mapctrl.c:476
gboolean left_butt_down_mapcanvas(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data)
Definition mapctrl.c:208
gboolean right_butt_down_mapcanvas(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data)
Definition mapctrl.c:263
gboolean middle_butt_down_mapcanvas(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data)
Definition mapctrl.c:332
void map_canvas_resize(GtkWidget *w, int width, int height, gpointer data)
Definition mapview.c:408
void put_unit_picture(struct unit *punit, GtkPicture *p, int height)
Definition mapview.c:494
void menus_set_initial_toggle_values(void)
Definition menu.c:3051
GtkWidget * picture_new_from_surface(cairo_surface_t *surf)
Definition sprite.c:526
static void migrate_options_from_gtk4(void)
Definition gui_main.c:1887
static GtkAlertDialog * quit_dialog
Definition gui_main.c:183
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 fc_assert(condition)
Definition log.h:177
#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 update_animation(void)
void set_frame_by_frame_animation(void)
void link_marks_clear_all(void)
#define fc_malloc(sz)
Definition mem.h:34
void option_changed(struct option *poption)
Definition options.c:799
const struct option_set * server_optset
Definition options.c:4369
const struct option_set * client_optset
Definition options.c:1331
bool option_bool_get(const struct option *poption)
Definition options.c:848
enum option_type option_type(const struct option *poption)
Definition options.c:709
const char * option_font_target(const struct option *poption)
Definition options.c:1214
bool string_to_video_mode(const char *buf, struct video_mode *mode)
Definition options.c:6894
struct client_options gui_options
Definition options.c:71
const char * option_font_get(const struct option *poption)
Definition options.c:1192
struct option * optset_option_by_name(const struct option_set *poptset, const char *name)
Definition options.c:482
#define GUI_GTK_OVERVIEW_MIN_XSIZE
Definition options.h:649
#define options_iterate(poptset, poption)
Definition options.h:602
@ GUI_GTK_MSGCHAT_MERGED
Definition options.h:69
@ GUI_GTK_MSGCHAT_SPLIT
Definition options.h:67
#define options_iterate_end
Definition options.h:607
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
struct sprite int int y
Definition sprite_g.h:31
struct sprite int x
Definition sprite_g.h:31
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:192
bool gui_gtk3_22_migrated_from_gtk3
Definition options.h:134
bool gui_gtk5_migrated_from_gtk4
Definition options.h:135
bool gui_gtk3_migrated_from_2_5
Definition options.h:140
bool first_boot
Definition options.h:128
float zoom_default_level
Definition options.h:232
bool gui_gtk3_fullscreen
Definition options.h:267
bool migrate_fullscreen
Definition options.h:146
bool gui_gtk3_migrated_from_gtk2
Definition options.h:133
bool gui_gtk4_migrated_from_gtk3_22
Definition options.h:136
struct client_properties::@227 views
Definition colors.h:21
void(* notify_of_writable_data)(struct connection *pc, bool data_available_and_socket_full)
Definition connection.h:181
GtkWidget * widget
Definition editgui.h:26
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:3825
void tileset_free_tiles(struct tileset *t)
Definition tilespec.c:6845
void tileset_use_preferred_theme(const struct tileset *t)
Definition tilespec.c:7327
void tileset_init(struct tileset *t)
Definition tilespec.c:7388
struct sprite * get_arrow_sprite(const struct tileset *t, enum arrow_type arrow)
Definition tilespec.c:7126
struct sprite * get_tax_sprite(const struct tileset *t, Output_type_id otype)
Definition tilespec.c:7137
int tileset_tile_width(const struct tileset *t)
Definition tilespec.c:779
@ ARROW_RIGHT
Definition tilespec.h:203
#define unit_tile(_pu)
Definition unit.h:407
#define unit_owner(_pu)
Definition unit.h:406
float mouse_zoom
Definition zoom.c:28
void zoom_phase_set(bool individual_tiles)
Definition zoom.c:93
void zoom_set_steps(float *steps)
Definition zoom.c:80
void zoom_step_down(void)
Definition zoom.c:130
void zoom_step_up(void)
Definition zoom.c:106