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_SDL
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_SDL */
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 "options.h"
73#include "text.h"
74#include "tilespec.h"
75#include "zoom.h"
76
77/* client/gui-gtk-3.22 */
78#include "chatline.h"
79#include "citizensinfo.h"
80#include "connectdlg.h"
81#include "cma_fe.h"
82#include "dialogs.h"
83#include "diplodlg.h"
84#include "editgui.h"
85#include "gotodlg.h"
86#include "graphics.h"
87#include "gui_stuff.h"
88#include "happiness.h"
89#include "helpdlg.h"
90#include "inteldlg.h"
91#include "mapctrl.h"
92#include "mapview.h"
93#include "menu.h"
94#include "messagewin.h"
95#include "optiondlg.h"
96#include "pages.h"
97#include "plrdlg.h"
98#include "luaconsole.h"
99#include "spaceshipdlg.h"
100#include "repodlgs.h"
101#include "voteinfo_bar.h"
102
103#include "gui_main.h"
104
106
107GtkWidget *map_canvas; /* GtkDrawingArea */
110
111GtkWidget *overview_canvas; /* GtkDrawingArea */
112GtkWidget *overview_scrolled_window; /* GtkScrolledWindow */
113/* The two values below define the width and height of the map overview. The
114 * first set of values (2*62, 2*46) define the size for a netbook display. For
115 * bigger displays the values are doubled (default). */
116#define OVERVIEW_CANVAS_STORE_WIDTH_NETBOOK (2 * 64)
117#define OVERVIEW_CANVAS_STORE_HEIGHT_NETBOOK (2 * 46)
118#define OVERVIEW_CANVAS_STORE_WIDTH \
119 (2 * OVERVIEW_CANVAS_STORE_WIDTH_NETBOOK)
120#define OVERVIEW_CANVAS_STORE_HEIGHT \
121 (2 * OVERVIEW_CANVAS_STORE_HEIGHT_NETBOOK)
124
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
181static gint timer_id; /* ditto */
185
186static bool gui_up = FALSE;
187
188static bool audio_paused = FALSE;
189static bool client_focus = TRUE;
190
191static struct video_mode vmode = { -1, -1 };
192
193static void set_g_log_callbacks(void);
194
197
198static void end_turn_callback(GtkWidget *w, gpointer data);
200 gpointer data);
201static void set_wait_for_writable_socket(struct connection *pc,
202 bool socket_writable);
203
204static void print_usage(void);
205static bool parse_options(int argc, char **argv);
209
210static void tearoff_callback(GtkWidget *b, gpointer data);
211static GtkWidget *detached_widget_new(void);
213
215 gpointer data);
217 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
227/**********************************************************************/
230static void log_callback_utf8(enum log_level level, const char *message,
231 bool file_too)
232{
233 if (!file_too || level <= LOG_FATAL) {
234 fc_fprintf(stderr, "%d: %s\n", level, message);
235 }
236}
237
238/**********************************************************************/
243{
244 double seconds = real_timer_callback();
245
247 if (!audio_paused && !client_focus) {
248 audio_pause();
250 } else if (audio_paused && client_focus) {
251 audio_resume();
253 }
254 }
255
257
258 return FALSE;
259}
260
261/**********************************************************************/
265static void print_usage(void)
266{
267 /* add client-specific usage information here */
269 _("This client accepts the standard Gtk command-line options\n"
270 "after '--'. See the Gtk documentation.\n\n"));
271
273 _("Other gui-specific options are:\n"));
274
276 _("-r, --resolution WIDTHxHEIGHT\tAssume given resolution "
277 "screen\n"));
278
279#ifdef EXP_ZOOM_LEVELS
281 /* TRANS: Keep word 'default' untranslated */
282 _("-z, --zoom LEVEL\tSet zoom level; use value 'default' "
283 "to reset\n\n"));
284#else
285 fc_fprintf(stderr, "\n");
286#endif /* EXP_ZOOM_LEVELS */
287
288 /* TRANS: No full stop after the URL, could cause confusion. */
289 fc_fprintf(stderr, _("Report bugs at %s\n"), BUG_URL);
290}
291
292/**********************************************************************/
295static bool parse_options(int argc, char **argv)
296{
297 int i = 1;
298
299 while (i < argc) {
300 char *option = NULL;
301
302 if (is_option("--help", argv[i])) {
303 print_usage();
304
305 return FALSE;
306
307#ifdef EXP_ZOOM_LEVELS
308 } else if ((option = get_option_malloc("--zoom", argv, &i, argc, FALSE))) {
309 char *endptr;
310
311 if (strcmp("default", option)) {
314 } else {
316 }
317 free(option);
318#endif /* EXP_ZOOM_LEVELS */
319
320 } else if ((option = get_option_malloc("--resolution", argv, &i, argc, FALSE))) {
322 fc_fprintf(stderr, _("Illegal video mode '%s'\n"), option);
324 }
325 free(option);
326 }
327 /* Can't check against unknown options, as those might be gtk options */
328
329 i++;
330 }
331
332 return TRUE;
333}
334
335/**********************************************************************/
339{
340 switch (arg) {
343
344 if (!gtk_widget_get_can_focus(w)) {
345 return FALSE;
346 }
347
348 if (!gtk_widget_is_focus(w)) {
350 return TRUE;
351 }
352 break;
353
354 default:
355 break;
356 }
357 return FALSE;
358}
359
360/**********************************************************************/
367 gpointer data)
368{
369 static int old_width = 0, old_height = 0;
370
371 if (allocation->width != old_width
372 || allocation->height != old_height) {
374 old_width = allocation->width;
375 old_height = allocation->height;
376 }
377}
378
379/**********************************************************************/
389
390/**********************************************************************/
400{
401 GtkWidget *focus;
402
404 if (focus) {
405 if (GTK_IS_ENTRY(focus)
406 || (GTK_IS_TEXT_VIEW(focus)
408 /* Propagate event to currently focused entry widget. */
409 if (gtk_widget_event(focus, ev)) {
410 /* Do not propagate event to our children. */
411 return TRUE;
412 }
413 }
414 }
415
416 /* Continue propagating event to our children. */
417 return FALSE;
418}
419
420/**********************************************************************/
424 gpointer data)
425{
426 if ((ev->state & GDK_SHIFT_MASK)) {
427 switch (ev->keyval) {
428
429 case GDK_KEY_Left:
431 return TRUE;
432
433 case GDK_KEY_Right:
435 return TRUE;
436
437 case GDK_KEY_Up:
439 return TRUE;
440
441 case GDK_KEY_Down:
443 return TRUE;
444
445 case GDK_KEY_Home:
447 return TRUE;
448
449 case GDK_KEY_Page_Up:
452 return TRUE;
453
457 return TRUE;
458
459 default:
460 break;
461 }
462 } else if (!(ev->state & GDK_CONTROL_MASK)) {
463 switch (ev->keyval) {
464 default:
465 break;
466 }
467 }
468
469 if (ev->state & GDK_SHIFT_MASK) {
470 bool volchange = FALSE;
471
472 switch (ev->keyval) {
473 case GDK_KEY_plus:
474 case GDK_KEY_KP_Add:
476 volchange = TRUE;
477 break;
478
479 case GDK_KEY_minus:
482 volchange = TRUE;
483 break;
484
485 default:
486 break;
487 }
488
489 if (volchange) {
490 struct option *poption = optset_option_by_name(client_optset, "sound_effects_volume");
491
494
495 return TRUE;
496 }
497 } else if (!(ev->state & GDK_CONTROL_MASK)) {
498 switch (ev->keyval) {
499 case GDK_KEY_plus:
500 case GDK_KEY_KP_Add:
501 zoom_step_up();
502 return TRUE;
503
504 case GDK_KEY_minus:
507 return TRUE;
508
509 default:
510 break;
511 }
512 }
513
514 /* Return here if observer */
515 if (client_is_observer()) {
516 return FALSE;
517 }
518
519 switch (ev->keyval) {
520
521 case GDK_KEY_KP_Up:
522 case GDK_KEY_KP_8:
523 case GDK_KEY_Up:
524 case GDK_KEY_8:
526 return TRUE;
527
529 case GDK_KEY_KP_9:
530 case GDK_KEY_Page_Up:
531 case GDK_KEY_9:
533 return TRUE;
534
535 case GDK_KEY_KP_Right:
536 case GDK_KEY_KP_6:
537 case GDK_KEY_Right:
538 case GDK_KEY_6:
540 return TRUE;
541
543 case GDK_KEY_KP_3:
545 case GDK_KEY_3:
547 return TRUE;
548
549 case GDK_KEY_KP_Down:
550 case GDK_KEY_KP_2:
551 case GDK_KEY_Down:
552 case GDK_KEY_2:
554 return TRUE;
555
556 case GDK_KEY_KP_End:
557 case GDK_KEY_KP_1:
558 case GDK_KEY_End:
559 case GDK_KEY_1:
561 return TRUE;
562
563 case GDK_KEY_KP_Left:
564 case GDK_KEY_KP_4:
565 case GDK_KEY_Left:
566 case GDK_KEY_4:
568 return TRUE;
569
570 case GDK_KEY_KP_Home:
571 case GDK_KEY_KP_7:
572 case GDK_KEY_Home:
573 case GDK_KEY_7:
575 return TRUE;
576
577 case GDK_KEY_KP_Begin:
578 case GDK_KEY_KP_5:
579 case GDK_KEY_5:
581 return TRUE;
582
583 case GDK_KEY_Escape:
585 return TRUE;
586
587 case GDK_KEY_b:
590 return TRUE;
591 }
592 break;
593
594 default:
595 break;
596 };
597
598 return FALSE;
599}
600
601/**********************************************************************/
605 gpointer data)
606{
607 /* inputline history code */
609 return FALSE;
610 }
611
612 if (editor_is_active()) {
614 }
615
616 return FALSE;
617}
618
619/**********************************************************************/
623 gpointer data)
624{
625 if (inputline_has_focus()) {
626 return FALSE;
627 }
628
629 if (ev->keyval == GDK_KEY_apostrophe) {
630 /* Allow this even if not in main map view; chatline is present on
631 * some other pages too */
632
633 /* Make the chatline visible if it's not currently.
634 * FIXME: should find the correct window, even when detached, from any
635 * other window; should scroll to the bottom automatically showing the
636 * latest text from other players; MUST NOT make spurious text windows
637 * at the bottom of other dialogs. */
639 /* The main game view is visible. May need to switch notebook. */
642 } else {
644 }
645 }
646
647 /* If the chatline is (now) visible, focus it. */
648 if (inputline_is_visible()) {
650 return TRUE;
651 }
652 }
653
656 return FALSE;
657 }
658
659 if (editor_is_active()) {
661 return TRUE;
662 }
663 }
664
665 if (ev->state & GDK_SHIFT_MASK) {
666 switch (ev->keyval) {
667
668 case GDK_KEY_Return:
669 case GDK_KEY_KP_Enter:
670 key_end_turn();
671 return TRUE;
672
673 default:
674 break;
675 }
676 }
677
679 /* 0 means the map view is focused. */
680 return key_press_map_canvas(w, ev, data);
681 }
682
683#if 0
684 /* We are focused some other dialog, tab, or widget. */
685 if ((ev->state & GDK_CONTROL_MASK)) {
686 } else if ((ev->state & GDK_SHIFT_MASK)) {
687 } else {
688 switch (ev->keyval) {
689
690 case GDK_KEY_F4:
692 return TRUE;
693
694 default:
695 break;
696 };
697 }
698#endif /* 0 */
699
700 return FALSE;
701}
702
703/**********************************************************************/
707{
709
710 if (!can_client_change_view()) {
711 return FALSE;
712 }
713
716
717 switch (ev->direction) {
718 case GDK_SCROLL_UP:
719 scroll_y -= ystep*2;
720 break;
721 case GDK_SCROLL_DOWN:
722 scroll_y += ystep*2;
723 break;
724 case GDK_SCROLL_RIGHT:
725 scroll_x += xstep*2;
726 break;
727 case GDK_SCROLL_LEFT:
728 scroll_x -= xstep*2;
729 break;
730 default:
731 return FALSE;
732 };
733
735
736 /* Emulating mouse move now */
739 }
740
741 update_line(ev->x, ev->y);
742 if (rbutton_down && (ev->state & GDK_BUTTON3_MASK)) {
744 }
745
748 }
749
751
752 return TRUE;
753}
754
755/**********************************************************************/
759{
761
762 return TRUE;
763}
764
765/**********************************************************************/
769{
771
772 return TRUE;
773}
774
775/**********************************************************************/
778static void tearoff_destroy(GtkWidget *w, gpointer data)
779{
780 GtkWidget *p, *b, *box;
782
783 box = GTK_WIDGET(data);
785 p = g_object_get_data(G_OBJECT(w), "parent");
786 b = g_object_get_data(G_OBJECT(w), "toggle");
788
790
791 g_object_ref(box); /* Make sure reference count stays above 0
792 * during the transition to new parent. */
795 g_object_unref(box);
796}
797
798/**********************************************************************/
802{
804
805 return FALSE;
806}
807
808/**********************************************************************/
813{
814 GtkWidget *box = GTK_WIDGET(data);
815
818 GtkWidget *w;
820
824 gtk_widget_set_name(w, "Freeciv");
825 gtk_window_set_title(GTK_WINDOW(w), _("Freeciv"));
827 g_signal_connect(w, "destroy", G_CALLBACK(tearoff_destroy), box);
828 g_signal_connect(w, "key_press_event",
830
832 g_object_set_data(G_OBJECT(w), "toggle", b);
833
834 temp_hide = g_object_get_data(G_OBJECT(box), "hide-over-reparent");
835 if (temp_hide != NULL) {
837 }
838
839 g_object_ref(box); /* Make sure reference count stays above 0
840 * during the transition to new parent. */
843 g_object_unref(box);
845
846 if (temp_hide != NULL) {
848 }
849 } else {
851 }
852}
853
854/**********************************************************************/
863
864/**********************************************************************/
869{
870 GtkWidget *b, *fillbox;
872
875
876 /* These toggle buttons run vertically down the side of many UI
877 * elements, so they need to be thin horizontally. */
879 ".detach_button {\n"
880 " padding: 0px 0px 0px 0px;\n"
881 " min-width: 6px;\n"
882 "}",
883 -1, NULL);
884 }
885
891 "detach_button");
892 gtk_widget_set_tooltip_text(b, _("Detach/Attach the pane."));
893
896
900
902
903 return fillbox;
904}
905
906/**********************************************************************/
914{
915 int i, width;
917 GdkPixbuf *pix;
918 int ttw;
919
920 /* Get width of the overview window */
924
926
928 /* We want arrow to appear if there is other units in addition
929 to active one in tile. Active unit is not counted, so there
930 can be 0 other units to not to display arrow. */
931 num_units_below = 1 - 1;
932 } else {
935 }
936
937 /* Top row: the active unit. */
938 /* Note, we ref this and other widgets here so that we can unref them
939 * in reset_unit_table. */
949 g_signal_connect(unit_image_button, "button_press_event",
951 GINT_TO_POINTER(-1));
952
954 /* Bottom row: other units in the same tile. */
955 for (i = 0; i < num_units_below; i++) {
963 FALSE);
967 "button_press_event",
970
972 i, 1, 1, 1);
973 }
974 }
975
976 /* Create arrow (popup for all units on the selected tile) */
983 FALSE);
987 "button_press_event",
989 /* An extra layer so that we can hide the clickable button but keep
990 * an explicit size request to avoid the layout jumping around */
999 gdk_pixbuf_get_width(pix), -1);
1001
1003 /* Display on bottom row. */
1005 num_units_below, 1, 1, 1);
1006 } else {
1007 /* Display on top row (there is no bottom row). */
1009 1, 0, 1, 1);
1010 }
1011
1013}
1014
1015/**********************************************************************/
1042
1043/**********************************************************************/
1047{
1048 /* Unreference all of the widgets that we're about to reallocate, thus
1049 * avoiding a memory leak. Remove them from the container first, just
1050 * to be safe. Note, the widgets are ref'd in
1051 * populate_unit_image_table. */
1053
1055
1056 /* We have to force a redraw of the units. And we explicitly have
1057 * to force a redraw of the focus unit, which is normally only
1058 * redrawn when the focus changes. We also have to force the 'more'
1059 * arrow to go away, both by expicitly hiding it and telling it to
1060 * do so (this will be reset immediately afterwards if necessary,
1061 * but we have to make the *internal* state consistent). */
1064 if (get_num_units_in_focus() == 1) {
1066 } else {
1067 set_unit_icon(-1, NULL);
1068 }
1070}
1071
1072/**********************************************************************/
1076{
1077 if (enable) {
1079 /* Ensure the menus are really created before performing any operations
1080 * on them. */
1081 while (gtk_events_pending()) {
1083 }
1085 menus_init();
1087 } else {
1089 }
1090}
1091
1092/**********************************************************************/
1100{
1101 if (event->type != GDK_BUTTON_RELEASE) {
1102 return FALSE;
1103 }
1104
1107 /* Make sure the default gtk handler
1108 * does NOT get called in this case. */
1109 return TRUE;
1110 }
1111
1112 return FALSE;
1113}
1114
1115/**********************************************************************/
1118#if 0
1120{
1125}
1126#endif
1127
1128/**********************************************************************/
1132{
1133 struct option *opt = optset_option_by_name(server_optset, "fixedlength");
1134
1135 if (opt != NULL && option_bool_get(opt)) {
1137 _("Fixed length turns"));
1138 } else {
1139 char buf[256];
1140
1141 fc_snprintf(buf, sizeof(buf), "%s:\n%s",
1142 _("Turn Done"), _("Shift+Return"));
1144 }
1145}
1146
1147/**********************************************************************/
1150static void setup_widgets(void)
1151{
1152 GtkWidget *page, *ebox, *hgrid, *hgrid2, *label;
1153 GtkWidget *frame, *table, *table2, *paned, *sw, *text;
1154 GtkWidget *button, *view, *vgrid, *right_vbox = NULL;
1155 int i;
1156 GtkWidget *notebook, *statusbar;
1158 struct sprite *spr;
1159
1161
1162 notebook = gtk_notebook_new();
1163
1164 /* Stop mouse wheel notebook page switching. */
1165 g_signal_connect(notebook, "scroll_event",
1167
1168 toplevel_tabs = notebook;
1171 vgrid = gtk_grid_new();
1179
1190
1192
1194 g_object_set(ingame_votebar, "margin", 2, NULL);
1195
1196 /* *** everything in the top *** */
1197
1203 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, NULL);
1204
1209 hgrid = gtk_grid_new();
1210
1212 /* The window is divided into two horizontal panels: overview +
1213 * civinfo + unitinfo, main view + message window. */
1218
1224
1225 /* Overview size designed for small displays (netbooks). */
1228 } else {
1229 /* The window is divided into two vertical panes: overview +
1230 * + civinfo + unitinfo + main view, message window. */
1235
1236 /* Overview size designed for big displays (desktops). */
1239 }
1240
1241 /* this holds the overview canvas, production info, etc. */
1242 vgrid = gtk_grid_new();
1246 /* Put vgrid to the left of anything else in hgrid -- right_vbox is either
1247 * the chat/messages pane, or NULL which is OK */
1249 GTK_POS_LEFT, 1, 1);
1250
1251 /* Overview canvas */
1257
1262
1272
1277
1280
1283
1284 g_signal_connect(overview_canvas, "motion_notify_event",
1286
1287 g_signal_connect(overview_canvas, "button_press_event",
1289
1290 /* The rest */
1291
1298
1299 /* Info on player's civilization, when game is running. */
1300 frame = gtk_frame_new("");
1302
1303 main_frame_civ_name = frame;
1304
1305 vgrid = gtk_grid_new();
1310
1311 ebox = gtk_event_box_new();
1314 g_signal_connect(ebox, "button_press_event",
1317
1318 label = gtk_label_new(NULL);
1322 gtk_widget_set_margin_end(label, 2);
1323 gtk_widget_set_margin_top(label, 2);
1325 gtk_container_add(GTK_CONTAINER(ebox), label);
1326 main_label_info = label;
1327
1328 /* Production status */
1329 table = gtk_grid_new();
1333
1334 /* Citizens for taxrates */
1335 ebox = gtk_event_box_new();
1337 gtk_grid_attach(GTK_GRID(table), ebox, 0, 0, 10, 1);
1338 econ_ebox = ebox;
1339
1340 table2 = gtk_grid_new();
1342
1343 for (i = 0; i < 10; i++) {
1344 ebox = gtk_event_box_new();
1347
1348 gtk_grid_attach(GTK_GRID(table2), ebox, i, 0, 1, 1);
1349
1350 g_signal_connect(ebox, "button_press_event",
1352
1356 }
1357
1358 /* Science, environmental, govt, timeout */
1360 if (spr != NULL) {
1362 } else {
1364 }
1365
1367 if (spr != NULL) {
1369 } else {
1371 }
1372
1374 if (spr != NULL) {
1376 } else {
1378 }
1379
1381 if (spr != NULL) {
1383 } else {
1385 }
1386
1387 for (i = 0; i < 4; i++) {
1388 GtkWidget *w;
1389
1390 ebox = gtk_event_box_new();
1392
1393 switch (i) {
1394 case 0:
1395 w = bulb_label;
1396 bulb_ebox = ebox;
1397 break;
1398 case 1:
1399 w = sun_label;
1400 sun_ebox = ebox;
1401 break;
1402 case 2:
1403 w = flake_label;
1404 flake_ebox = ebox;
1405 break;
1406 default:
1407 case 3:
1408 w = government_label;
1409 government_ebox = ebox;
1410 break;
1411 }
1412
1420 gtk_grid_attach(GTK_GRID(table), ebox, i, 1, 1, 1);
1421 }
1422
1424
1425 frame = gtk_frame_new(NULL);
1426 gtk_grid_attach(GTK_GRID(table), frame, 4, 1, 6, 1);
1428
1429
1430 /* Turn done */
1432
1434
1438
1439 /* Selected unit status */
1440
1446
1447 /* In edit mode the unit_info_box widget is replaced by the
1448 * editinfobox, so we need to add a ref here so that it is
1449 * not destroyed when removed from its container.
1450 * See editinfobox_refresh(). */
1452
1455
1462
1463 label = gtk_label_new(NULL);
1468 gtk_widget_set_margin_end(label, 2);
1469 gtk_widget_set_margin_top(label, 2);
1471 gtk_container_add(GTK_CONTAINER(sw), label);
1472 unit_info_label = label;
1473
1474 hgrid2 = gtk_grid_new();
1476
1477 table = gtk_grid_new();
1478 g_object_set(table, "margin", 5, NULL);
1480
1483
1485
1486 /* Map canvas, editor toolbar, and scrollbars */
1487
1488 /* The top notebook containing the map view and dialogs. */
1489
1493
1494
1501
1505 } else {
1507 }
1508
1510
1511 vgrid = gtk_grid_new();
1515
1517 g_object_set(editgui_get_editbar()->widget, "margin", 4, NULL);
1518
1519 label = gtk_label_new(Q_("?noun:View"));
1521
1522 frame = gtk_frame_new(NULL);
1523 gtk_grid_attach(GTK_GRID(map_widget), frame, 0, 0, 1, 1);
1524
1530
1531#if 0
1540#endif /* 0 */
1541
1548
1550
1554
1558
1561
1562 g_signal_connect(map_canvas, "configure_event",
1564
1565 g_signal_connect(map_canvas, "motion_notify_event",
1567
1568 g_signal_connect(toplevel, "enter_notify_event",
1570
1571 g_signal_connect(map_canvas, "button_press_event",
1573
1574 g_signal_connect(map_canvas, "button_release_event",
1576
1577 g_signal_connect(map_canvas, "scroll_event",
1579
1580 g_signal_connect(toplevel, "key_press_event",
1582
1583 g_signal_connect(toplevel, "key_release_event",
1585
1586 /* *** The message window -- this is a detachable widget *** */
1587
1591 } else {
1593
1597
1598 vgrid = gtk_grid_new();
1603 }
1605
1608 } else {
1610 }
1612 g_object_set(hpaned, "margin", 4, NULL);
1614
1619
1624 g_signal_connect(right_notebook, "button-release-event",
1628 }
1629 }
1630
1631 vgrid = gtk_grid_new();
1634
1641
1642 label = gtk_label_new(_("Chat"));
1644
1651 g_signal_connect(text, "size-allocate",
1653
1654 gtk_widget_set_name(text, "chatline");
1655
1657 gtk_widget_realize(text);
1659
1661 if (dtach_lowbox != NULL) {
1663 }
1664
1666
1667 /* the chat line */
1670 g_object_set(view, "margin", 3, NULL);
1671
1672 button = gtk_check_button_new_with_label(_("Allies Only"));
1676 g_signal_connect(button, "toggled",
1680
1681 button = gtk_button_new_with_label(_("Clear links"));
1682 g_signal_connect(button, "clicked",
1685
1686 /* Other things to take care of */
1687
1689
1692 }
1693
1696
1700 }
1701}
1702
1703/**********************************************************************/
1708 const gchar *message,
1709 gpointer user_data)
1710{
1711 enum log_level fllvl = LOG_ERROR;
1712
1713 switch (log_level) {
1714 case G_LOG_LEVEL_DEBUG:
1715 fllvl = LOG_DEBUG;
1716 break;
1718 fllvl = LOG_WARN;
1719 break;
1720 default:
1721 break;
1722 }
1723
1724 if (log_domain != NULL) {
1725 log_base(fllvl, "%s: %s", log_domain, message);
1726 } else {
1727 log_base(fllvl, "%s", message);
1728 }
1729}
1730
1731/**********************************************************************/
1735 const GLogField *fields,
1737 gpointer user_data)
1738{
1739 /* No need to have formatter of our own - let's use glib's default one. */
1741
1743
1744 return G_LOG_WRITER_HANDLED;
1745}
1746
1747/**********************************************************************/
1758
1759/**********************************************************************/
1762static void set_g_log_callbacks(void)
1763{
1764 /* Old API, still used by many log producers */
1766
1770
1771 /* glib >= 2.50 API */
1773}
1774
1775/**********************************************************************/
1784
1785/**********************************************************************/
1788int main(int argc, char **argv)
1789{
1790 return client_main(argc, argv, FALSE);
1791}
1792
1793/**********************************************************************/
1797{
1798 log_normal(_("Migrating options from gtk2 to gtk3 client"));
1799
1800#define MIGRATE_OPTION(opt) gui_options.gui_gtk3_##opt = gui_options.gui_gtk2_##opt;
1801#define MIGRATE_STR_OPTION(opt) \
1802 strncpy(gui_options.gui_gtk3_##opt, gui_options.gui_gtk2_##opt, \
1803 sizeof(gui_options.gui_gtk3_##opt));
1804
1805 /* Default theme name is never migrated */
1806 /* 'fullscreen', 'small_display_layout', and 'message_chat_location'
1807 * not migrated, as (unlike Gtk2), Gtk3-client tries to pick better
1808 * defaults for these in fresh installations based on screen size (see
1809 * adjust_default_options()); so user is probably better served by
1810 * getting these adaptive defaults than whatever they had for Gtk2.
1811 * Since 'fullscreen' isn't migrated, we don't need to worry about
1812 * preserving gui_gtk2_migrated_from_2_5 either. */
1826 MIGRATE_OPTION(popup_tech_help);
1827
1841
1842#undef MIGRATE_OPTION
1843#undef MIGRATE_STR_OPTION
1844
1846}
1847
1848/**********************************************************************/
1852{
1853 log_normal(_("Migrating options from gtk3 to gtk3.22 client"));
1854
1855#define MIGRATE_OPTION(opt) GUI_GTK_OPTION(opt) = gui_options.gui_gtk3_##opt;
1856#define MIGRATE_STR_OPTION(opt) \
1857 strncpy(GUI_GTK_OPTION(opt), gui_options.gui_gtk3_##opt, \
1858 sizeof(GUI_GTK_OPTION(opt)));
1859
1860 /* Default theme name is never migrated */
1861
1862 /* Simulate gui-gtk3's migrate_options_from_2_5() */
1864 log_normal(_("Migrating gtk3-client options from freeciv-2.5 options."));
1867 }
1868
1885 MIGRATE_OPTION(popup_tech_help);
1886
1900
1901#undef MIGRATE_OPTION
1902#undef MIGRATE_STR_OPTION
1903
1905}
1906
1907/**********************************************************************/
1910int ui_main(int argc, char **argv)
1911{
1913 guint sig;
1914
1915 if (parse_options(argc, argv)) {
1916 char window_name[1024];
1917
1918 /* The locale has already been set in init_nls() and the windows-specific
1919 * locale logic in gtk_init() causes problems with zh_CN (see PR#39475) */
1921
1922 /* GTK withdraw gtk options. Process GTK arguments */
1923 if (!gtk_init_check(&argc, &argv)) {
1924 log_fatal(_("Failed to open graphical mode."));
1925 return EXIT_FAILURE;
1926 }
1927
1929
1931
1934 if (vmode.width > 0 && vmode.height > 0) {
1936 }
1937 g_signal_connect(toplevel, "key_press_event",
1939
1940 g_signal_connect(toplevel, "focus_out_event",
1942 g_signal_connect(toplevel, "focus_in_event",
1944
1947 gtk_widget_set_name(toplevel, "Freeciv");
1949
1950 if (gui_options.first_boot) {
1952 /* We're using fresh defaults for this version of this client,
1953 * so prevent any future migrations from other clients / versions */
1955 /* Avoid also marking gtk3 as migrated, so that it can have its own
1956 * run of its adjust_default_options() if it is ever run (as a
1957 * side effect of Gtk2->Gtk3 migration). */
1958 } else {
1962 /* We want a fresh look at screen-size-related options after Gtk2 */
1964 /* We don't ever want to consider pre-2.6 fullscreen option again
1965 * (even for gui-gtk3) */
1967 }
1969 }
1970 }
1971
1974 }
1975
1976 fc_snprintf(window_name, sizeof(window_name), _("Freeciv (%s)"), GUI_NAME_SHORT);
1978
1979 g_signal_connect(toplevel, "delete_event",
1981
1982 /* Disable GTK+ cursor key focus movement */
1985 0, 0, 0, 0);
1987
1989 if (OT_FONT == option_type(poption)) {
1990 /* Force to call the appropriate callback. */
1992 }
1994
1997
1998 if (NULL == city_names_style) {
2000 log_error("city_names_style should have been set by options.");
2001 }
2004 log_error("city_productions_style should have been set by options.");
2005 }
2006 if (NULL == reqtree_text_style) {
2008 log_error("reqtree_text_style should have been set by options.");
2009 }
2010
2013
2014 /* Keep the icon of the executable on Windows (see PR#36491) */
2015#ifndef FREECIV_MSWINDOWS
2016 {
2018
2019 /* Only call this after tileset_load_tiles is called. */
2022 }
2023#endif /* FREECIV_MSWINDOWS */
2024
2025 setup_widgets();
2026 load_cursors();
2027 cma_fe_init();
2034 chatline_init();
2036
2038
2040
2041 /* Assumes toplevel showing */
2043
2044 /* Assumes client_state is set */
2046
2047 gui_up = TRUE;
2048 gtk_main();
2049 gui_up = FALSE;
2050
2059 cma_fe_done();
2061
2062 /* We have extra ref for unit_info_box that has protected
2063 * it from getting destroyed when editinfobox_refresh()
2064 * moves widgets around. Free that extra ref here. */
2066
2067 editgui_free();
2070 menus_free();
2071 message_buffer = NULL; /* Result of destruction of everything */
2073 }
2074
2075 return EXIT_SUCCESS;
2076}
2077
2078/**********************************************************************/
2081bool is_gui_up(void)
2082{
2083 return gui_up;
2084}
2085
2086/**********************************************************************/
2089void ui_exit(void)
2090{
2091 if (message_buffer != NULL) {
2094 }
2095}
2096
2097/**********************************************************************/
2100enum gui_type get_gui_type(void)
2101{
2102 return GUI_GTK3_22;
2103}
2104
2105/**********************************************************************/
2112
2113/**********************************************************************/
2119void set_unit_icon(int idx, struct unit *punit)
2120{
2121 GtkWidget *w;
2122
2123 fc_assert_ret(idx >= -1 && idx < num_units_below);
2124
2125 if (idx == -1) {
2126 w = unit_image;
2127 unit_id_top = punit ? punit->id : 0;
2128 } else {
2129 w = unit_below_image[idx];
2130 unit_ids[idx] = punit ? punit->id : 0;
2131 }
2132
2133 if (!w) {
2134 return;
2135 }
2136
2137 if (punit) {
2139 } else {
2141 }
2142}
2143
2144/**********************************************************************/
2150{
2151 static bool showing = FALSE;
2152
2154 return;
2155 }
2156
2157 if (onoff && !showing) {
2159 showing = TRUE;
2160 } else if (!onoff && showing) {
2162 showing = FALSE;
2163 }
2164}
2165
2166/**********************************************************************/
2176
2177/**********************************************************************/
2182 gpointer data)
2183{
2184 int i = GPOINTER_TO_INT(data);
2185 struct unit *punit;
2186
2187 if (i == -1) {
2189 if (punit && unit_is_in_focus(punit)) {
2190 /* Clicking on the currently selected unit will center it. */
2192 }
2193 return TRUE;
2194 }
2195
2196 if (unit_ids[i] == 0) /* no unit displayed at this place */
2197 return TRUE;
2198
2200 if (NULL != punit && unit_owner(punit) == client.conn.playing) {
2201 /* Unit shouldn't be NULL but may be owned by an ally. */
2203 }
2204
2205 return TRUE;
2206}
2207
2208/**********************************************************************/
2213 gpointer data)
2214{
2216
2217 if (punit) {
2219 }
2220
2221 return TRUE;
2222}
2223
2224/**********************************************************************/
2228 gpointer data)
2229{
2230 gtk_grab_remove(w);
2233
2234 return FALSE;
2235}
2236
2237/**********************************************************************/
2241{
2242 if (ev->button == 1) {
2243 GtkWidget *p;
2244
2249
2250 gtk_widget_new(GTK_TYPE_LABEL, "GtkWidget::parent", p,
2251 "GtkLabel::label", get_info_label_text_popup(),
2252 "GtkWidget::visible", TRUE,
2253 NULL);
2254 gtk_widget_show(p);
2255
2258 TRUE, NULL, (GdkEvent *)ev, NULL, NULL);
2259 gtk_grab_add(p);
2260
2261 g_signal_connect_after(p, "button_release_event",
2263 }
2264
2265 return TRUE;
2266}
2267
2268/**********************************************************************/
2276
2277/**********************************************************************/
2281 gpointer data)
2282{
2284
2285 return TRUE;
2286}
2287
2288/**********************************************************************/
2292 bool socket_writable)
2293{
2294 static bool previous_state = FALSE;
2295
2297
2299 return;
2300
2301 log_debug("set_wait_for_writable_socket(%d)", socket_writable);
2302
2307 NULL);
2308
2310}
2311
2312/**********************************************************************/
2316void add_net_input(int sock)
2317{
2318#ifdef FREECIV_MSWINDOWS
2320#else
2322#endif
2324 G_IO_IN | G_IO_ERR,
2326 NULL);
2328}
2329
2330/**********************************************************************/
2340
2341/**********************************************************************/
2345static void quit_dialog_response(GtkWidget *dialog, gint response)
2346{
2347 gtk_widget_destroy(dialog);
2348 if (response == GTK_RESPONSE_YES) {
2350 if (client.conn.used) {
2352 }
2353 quit_gtk_main();
2354 }
2355}
2356
2357/**********************************************************************/
2361{
2362 /* Quit gtk main loop. After this it will return to finish
2363 * ui_main() */
2364
2365 gtk_main_quit();
2366}
2367
2368/**********************************************************************/
2373{
2374 static GtkWidget *dialog;
2375
2376 if (!dialog) {
2378 0,
2381 _("Are you sure you want to quit?"));
2382 setup_dialog(dialog, toplevel);
2383
2385
2386 g_signal_connect(dialog, "response",
2388 g_signal_connect(dialog, "destroy",
2390 }
2391
2393}
2394
2395/**********************************************************************/
2399{
2401 /* Stop emission of event. */
2402 return TRUE;
2403}
2404
2405struct callback {
2406 void (*callback)(void *data);
2407 void *data;
2408};
2409
2410/**********************************************************************/
2414{
2415 struct callback *cb = data;
2416
2417 (cb->callback)(cb->data);
2418 free(cb);
2419
2420 return FALSE;
2421}
2422
2423/**********************************************************************/
2428void add_idle_callback(void (callback)(void *), void *data)
2429{
2430 struct callback *cb = fc_malloc(sizeof(*cb));
2431
2432 cb->callback = callback;
2433 cb->data = data;
2435}
2436
2437/**********************************************************************/
2442{
2443 GtkWidget *button;
2444
2446 fc_assert_ret(button != NULL);
2448
2451}
2452
2453/**********************************************************************/
2464
2465/**********************************************************************/
2475
2476/**********************************************************************/
2486
2487/**********************************************************************/
2497
2498/**********************************************************************/
2503{
2504 struct option *poption;
2505
2506#define option_var_set_callback(var, callback) \
2507 if ((poption = optset_option_by_name(client_optset, \
2508 GUI_GTK_OPTION_STR(var)))) { \
2509 option_set_changed_callback(poption, callback); \
2510 } else { \
2511 log_error("Didn't find option %s!", GUI_GTK_OPTION_STR(var)); \
2512 }
2513
2518
2525#undef option_var_set_callback
2526}
2527
2528/**********************************************************************/
2533{
2534 GtkWidget *button;
2535
2537 fc_assert_ret(button != NULL);
2539
2540 /* Hide the "Allies Only" button for local games. */
2541 if (is_server_running()) {
2542 gtk_widget_hide(button);
2543 } else {
2544 gtk_widget_show(button);
2547 }
2548}
2549
2550/**********************************************************************/
2558
2559/**********************************************************************/
2563{
2564 cat_snprintf(outbuf, outlen, _("\nBuilt against gtk+ %d.%d.%d, using %d.%d.%d"
2565 "\nBuilt against glib %d.%d.%d, using %d.%d.%d"),
2570}
2571
2572/**********************************************************************/
2577{
2580
2582 if (!display) {
2583 return FALSE;
2584 }
2585
2587 if (!monitor) {
2588 return FALSE;
2589 }
2590
2592 return TRUE;
2593}
2594
2595/**********************************************************************/
2599{
2600 GdkRectangle rect;
2601
2602 if (vmode.width > 0) {
2603 return vmode.width;
2604 }
2605
2606 if (monitor_size(&rect)) {
2607 return rect.width;
2608 } else {
2609 return 0;
2610 }
2611}
2612
2613/**********************************************************************/
2617{
2618 GdkRectangle rect;
2619
2620 if (vmode.height > 0) {
2621 return vmode.height;
2622 }
2623
2624 if (monitor_size(&rect)) {
2625 return rect.height;
2626 } else {
2627 return 0;
2628 }
2629}
2630
2631/**********************************************************************/
2635{
2636 if (vmode.width > 0 && vmode.height > 0) {
2637 return &vmode;
2638 }
2639
2640 return NULL;
2641}
2642
2643/**********************************************************************/
2646static void adjust_default_options(void)
2647{
2648 int scr_height = screen_height();
2649
2650 if (scr_height > 0) {
2651 /* Adjust these options only if we do know the screen height. */
2652
2653 if (scr_height <= 480) {
2654 /* Freeciv is practically unusable outside fullscreen mode in so
2655 * small display */
2656 log_verbose("Changing default to fullscreen due to very small screen");
2658 }
2659 if (scr_height < 1024) {
2660 /* This is a small display */
2661 log_verbose("Defaulting to small widget layout due to small screen");
2663 log_verbose("Defaulting to merged messages/chat due to small screen");
2665 }
2666 }
2667}
void audio_pause(void)
Definition audio.c:606
void audio_resume(void)
Definition audio.c:614
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:1306
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:74
bool is_server_running(void)
void key_recall_previous_focus_unit(void)
Definition control.c:3293
bool unit_is_in_focus(const struct unit *punit)
Definition control.c:383
void key_cancel_action(void)
Definition control.c:3231
int num_units_below
Definition control.c:76
void unit_focus_set(struct unit *punit)
Definition control.c:501
struct unit_list * get_units_in_focus(void)
Definition control.c:177
void key_end_turn(void)
Definition control.c:3285
void update_unit_pix_label(struct unit_list *punitlist)
Definition control.c:967
void key_unit_move(enum direction8 gui_dir)
Definition control.c:3314
enum cursor_hover_state hover_state
Definition control.c:89
struct unit * head_of_units_in_focus(void)
Definition control.c:405
int get_num_units_in_focus(void)
Definition control.c:185
void control_mouse_cursor(struct tile *ptile)
Definition control.c:1189
void key_center_capital(void)
Definition control.c:3268
#define MAX_NUM_UNITS_BELOW
Definition control.h:295
@ 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:74
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:101
@ O_GOLD
Definition fc_types.h:101
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:1204
void diplomacy_dialog_done(void)
Definition diplodlg.c:1213
gboolean handle_edit_key_release(GdkEventKey *ev)
Definition editgui.c:1780
gboolean handle_edit_key_press(GdkEventKey *ev)
Definition editgui.c:1662
void editgui_create_widgets(void)
Definition editgui.c:1822
struct editbar * editgui_get_editbar(void)
Definition editgui.c:1788
void editgui_free(void)
Definition editgui.c:1835
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:84
GtkWidget * map_vertical_scrollbar
Definition gui_main.c:109
int ui_main(int argc, char **argv)
Definition gui_main.c:1910
const char * client_string
Definition gui_main.c:105
GtkTextBuffer * message_buffer
Definition gui_main.c:178
static void quit_dialog_response(GtkWidget *dialog, gint response)
Definition gui_main.c:2345
void real_focus_units_changed(void)
Definition gui_main.c:2172
void set_unit_icons_more_arrow(bool onoff)
Definition gui_main.c:2149
static void print_usage(void)
Definition gui_main.c:265
#define OVERVIEW_CANVAS_STORE_WIDTH_NETBOOK
Definition gui_main.c:116
#define option_var_set_callback(var, callback)
static gboolean select_unit_image_callback(GtkWidget *w, GdkEvent *ev, gpointer data)
Definition gui_main.c:2181
static gboolean quit_dialog_callback(void)
Definition gui_main.c:2398
static GIOChannel * srv_channel
Definition gui_main.c:182
GtkWidget * main_label_info
Definition gui_main.c:138
static bool monitor_size(GdkRectangle *rect_p)
Definition gui_main.c:2576
GtkWidget * bottom_notebook
Definition gui_main.c:129
GtkWidget * unit_info_label
Definition gui_main.c:151
static gboolean timer_callback(gpointer data)
Definition gui_main.c:242
struct video_mode * resolution_request_get(void)
Definition gui_main.c:2634
void set_unit_icon(int idx, struct unit *punit)
Definition gui_main.c:2119
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:186
static guint srv_id
Definition gui_main.c:183
static gboolean mouse_scroll_mapcanvas(GtkWidget *w, GdkEventScroll *ev)
Definition gui_main.c:706
PangoFontDescription * city_productions_style
Definition gui_main.c:134
GtkWidget * overview_scrolled_window
Definition gui_main.c:112
static GtkWidget * more_arrow_pixmap
Definition gui_main.c:170
static GtkWidget * detached_widget_fill(GtkWidget *tearbox)
Definition gui_main.c:868
void enable_menus(bool enable)
Definition gui_main.c:1075
static gboolean select_more_arrow_pixmap_callback(GtkWidget *w, GdkEvent *ev, gpointer data)
Definition gui_main.c:2212
GtkWidget * top_notebook
Definition gui_main.c:129
static gboolean propagate_keypress(GtkWidget *w, GdkEvent *ev)
Definition gui_main.c:801
#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:758
void ui_exit(void)
Definition gui_main.c:2089
enum gui_type get_gui_type(void)
Definition gui_main.c:2100
static GtkWidget * detached_widget_new(void)
Definition gui_main.c:857
gint cur_y
Definition gui_main.c:184
int main(int argc, char **argv)
Definition gui_main.c:1788
void fullscreen_opt_refresh(struct option *poption)
Definition gui_main.c:2456
static void main_message_area_size_allocate(GtkWidget *widget, GtkAllocation *allocation, gpointer data)
Definition gui_main.c:365
static gboolean toplevel_handler(GtkWidget *w, GdkEvent *ev, gpointer data)
Definition gui_main.c:399
void ui_init(void)
Definition gui_main.c:1778
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:1018
static gboolean idle_callback_wrapper(gpointer data)
Definition gui_main.c:2413
static void apply_city_names_font(struct option *poption)
Definition gui_main.c:2468
static void apply_city_productions_font(struct option *poption)
Definition gui_main.c:2479
gboolean fc_gained_focus(GtkWidget *w, GdkEventKey *ev, gpointer data)
Definition gui_main.c:768
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:778
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:2532
gboolean map_canvas_focus(void)
Definition gui_main.c:382
GtkWidget * turn_done_button
Definition gui_main.c:149
static GtkWidget * bottom_hpaned
Definition gui_main.c:131
static gint timer_id
Definition gui_main.c:181
static GtkWidget * main_menubar
Definition gui_main.c:164
int screen_width(void)
Definition gui_main.c:2598
GtkWidget * scroll_panel
Definition gui_main.c:141
static void end_turn_callback(GtkWidget *w, gpointer data)
Definition gui_main.c:2271
#define OVERVIEW_CANVAS_STORE_HEIGHT_NETBOOK
Definition gui_main.c:117
static void log_callback_utf8(enum log_level level, const char *message, bool file_too)
Definition gui_main.c:230
void add_idle_callback(void(callback)(void *), void *data)
Definition gui_main.c:2428
static gboolean show_info_popup(GtkWidget *w, GdkEventButton *ev, gpointer data)
Definition gui_main.c:2240
static void set_g_log_callbacks(void)
Definition gui_main.c:1762
void reset_unit_table(void)
Definition gui_main.c:1046
static gboolean key_press_map_canvas(GtkWidget *w, GdkEventKey *ev, gpointer data)
Definition gui_main.c:423
GtkWidget * unit_info_frame
Definition gui_main.c:153
void options_extra_init(void)
Definition gui_main.c:2502
GtkWidget * top_vbox
Definition gui_main.c:128
static void allied_chat_only_callback(struct option *poption)
Definition gui_main.c:2441
GdkWindow * root_window
Definition gui_main.c:126
static void adjust_default_options(void)
Definition gui_main.c:2646
static void set_wait_for_writable_socket(struct connection *pc, bool socket_writable)
Definition gui_main.c:2291
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:2490
static gboolean show_info_button_release(GtkWidget *w, GdkEventButton *ev, gpointer data)
Definition gui_main.c:2227
bool is_gui_up(void)
Definition gui_main.c:2081
static gboolean toplevel_focus(GtkWidget *w, GtkDirectionType arg)
Definition gui_main.c:338
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:1706
GtkWidget * avbox
Definition gui_main.c:140
gint cur_x
Definition gui_main.c:184
void insert_client_build_info(char *outbuf, size_t outlen)
Definition gui_main.c:2562
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:1098
static void set_g_log_callback_domain(const char *domain)
Definition gui_main.c:1750
GtkWidget * bulb_label
Definition gui_main.c:144
GtkWidget * overview_canvas
Definition gui_main.c:111
GtkWidget * toplevel
Definition gui_main.c:125
static void setup_widgets(void)
Definition gui_main.c:1150
#define OVERVIEW_CANVAS_STORE_WIDTH
Definition gui_main.c:118
static gboolean toplevel_key_release_handler(GtkWidget *w, GdkEventKey *ev, gpointer data)
Definition gui_main.c:604
void remove_net_input(void)
Definition gui_main.c:2334
GtkWidget * map_horizontal_scrollbar
Definition gui_main.c:108
GtkWidget * map_canvas
Definition gui_main.c:107
static gboolean toplevel_key_press_handler(GtkWidget *w, GdkEventKey *ev, gpointer data)
Definition gui_main.c:622
void sound_bell(void)
Definition gui_main.c:2108
static void migrate_options_from_gtk2(void)
Definition gui_main.c:1796
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:2372
static void migrate_options_from_gtk3(void)
Definition gui_main.c:1851
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:2280
static bool audio_paused
Definition gui_main.c:188
static GtkWidget * more_arrow_pixmap_container
Definition gui_main.c:172
GtkWidget * map_widget
Definition gui_main.c:130
static bool client_focus
Definition gui_main.c:189
GtkWidget * right_notebook
Definition gui_main.c:129
void quit_gtk_main(void)
Definition gui_main.c:2360
static void allied_chat_button_toggled(GtkToggleButton *button, gpointer user_data)
Definition gui_main.c:2553
static struct video_mode vmode
Definition gui_main.c:191
void add_net_input(int sock)
Definition gui_main.c:2316
static GLogWriterOutput g_log_writer_to_freelog_cb(GLogLevelFlags log_level, const GLogField *fields, gsize n_fields, gpointer user_data)
Definition gui_main.c:1734
GtkWidget * toplevel_tabs
Definition gui_main.c:127
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:122
void update_turn_done_tooltip(void)
Definition gui_main.c:1131
static void tearoff_callback(GtkWidget *b, gpointer data)
Definition gui_main.c:812
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:123
int screen_height(void)
Definition gui_main.c:2616
static bool parse_options(int argc, char **argv)
Definition gui_main.c:295
GtkWidget * conn_box
Definition gui_main.c:140
#define OVERVIEW_CANVAS_STORE_HEIGHT
Definition gui_main.c:120
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:913
#define GUI_NAME_FULL
Definition gui_main.h:22
#define GUI_NAME_SHORT
Definition gui_main.h:23
#define GUI_GTK_OPTION(optname)
Definition gui_main.h:25
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:2151
void menus_free(void)
Definition menu.c:3219
void meswin_dialog_popup(bool raise)
Definition messagewin.c:417
GtkWidget * create_start_page(void)
Definition pages.c:2621
GtkWidget * create_network_page(void)
Definition pages.c:1199
GtkWidget * create_scenario_page(void)
Definition pages.c:3183
static GtkWidget * statusbar
Definition pages.c:89
void destroy_server_scans(void)
Definition pages.c:766
GtkWidget * create_load_page(void)
Definition pages.c:2902
GtkWidget * create_statusbar(void)
Definition pages.c:907
GtkWidget * create_main_page(void)
Definition pages.c:229
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
log_callback_fn log_set_callback(log_callback_fn callback)
Definition log.c:290
#define fc_assert_ret(condition)
Definition log.h:191
#define log_verbose(message,...)
Definition log.h:109
#define log_fatal(message,...)
Definition log.h:100
#define log_debug(message,...)
Definition log.h:115
#define log_normal(message,...)
Definition log.h:107
#define log_base(level, message,...)
Definition log.h:94
log_level
Definition log.h:28
@ LOG_ERROR
Definition log.h:30
@ LOG_DEBUG
Definition log.h:34
@ LOG_FATAL
Definition log.h:29
@ LOG_WARN
Definition log.h:31
#define log_error(message,...)
Definition log.h:103
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:783
const struct option_set * server_optset
Definition options.c:4281
const struct option_set * client_optset
Definition options.c:1315
bool option_bool_get(const struct option *poption)
Definition options.c:832
enum option_type option_type(const struct option *poption)
Definition options.c:693
const char * option_font_target(const struct option *poption)
Definition options.c:1198
bool string_to_video_mode(const char *buf, struct video_mode *mode)
Definition options.c:6761
struct client_options gui_options
Definition options.c:71
const char * option_font_get(const struct option *poption)
Definition options.c:1176
struct option * optset_option_by_name(const struct option_set *poptset, const char *name)
Definition options.c:466
@ 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:635
#define options_iterate(poptset, poption)
Definition options.h:588
#define options_iterate_end
Definition options.h:593
const char * get_info_label_text_popup(void)
Definition text.c:982
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:2407
void(* callback)(void *data)
Definition gui_main.c:2406
struct connection conn
Definition client_main.h:96
bool silent_when_not_in_focus
Definition options.h:192
bool gui_gtk3_migrated_from_2_5
Definition options.h:140
int sound_effects_volume
Definition options.h:191
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
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:140
int id
Definition unit.h:147
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:3662
void tileset_free_tiles(struct tileset *t)
Definition tilespec.c:6643
void tileset_use_preferred_theme(const struct tileset *t)
Definition tilespec.c:7108
struct sprite * get_icon_sprite(const struct tileset *t, enum icon_type icon)
Definition tilespec.c:7018
void tileset_init(struct tileset *t)
Definition tilespec.c:7169
struct sprite * get_arrow_sprite(const struct tileset *t, enum arrow_type arrow)
Definition tilespec.c:6907
struct sprite * get_tax_sprite(const struct tileset *t, Output_type_id otype)
Definition tilespec.c:6918
int tileset_tile_width(const struct tileset *t)
Definition tilespec.c:754
@ ARROW_RIGHT
Definition tilespec.h:202
@ ICON_FREECIV
Definition tilespec.h:315
#define unit_tile(_pu)
Definition unit.h:397
#define unit_owner(_pu)
Definition unit.h:396
float mouse_zoom
Definition zoom.c:28
void zoom_step_down(void)
Definition zoom.c:134
void zoom_step_up(void)
Definition zoom.c:110