1 /* XQF - Quake server browser and launcher
2 * Copyright (C) 1998-2000 Roman Pozlevich <roma@botik.ru>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
17 */
18
19 #include "gnuconfig.h"
20
21 #include <sys/types.h> /* FD_SETSIZE */
22 #include <stdio.h> /* fprintf */
23 #include <stdlib.h> /* strtol */
24 #include <string.h> /* strcmp, strlen */
25 #include <sys/time.h> /* FD_SETSIZE */
26 #include <sys/stat.h> /* stat */
27 #include <unistd.h> /* readlink */
28 #include <sys/resource.h> /* setrlimit */
29 #include <errno.h>
30
31 #include <gtk/gtk.h>
32
33 #include "i18n.h"
34 #include "xqf.h"
35 #include "xqf-ui.h"
36 #include "game.h"
37 #include "pref.h"
38 #include "dialogs.h"
39 #include "skin.h"
40 #include "utils.h"
41 #include "srv-prop.h"
42 #include "pixmaps.h"
43 #include "xutils.h"
44 #include "config.h"
45 #include "rc.h"
46 #include "debug.h"
47 #include "sort.h"
48 #include "q3maps.h"
49 #include "splash.h"
50 #include "srv-list.h"
51 #include "scripts.h"
52
53 static struct generic_prefs* new_generic_prefs (void);
54 static GtkWidget *custom_args_options_page (enum server_type type);
55
56 static void scan_maps_for(enum server_type type);
57
58 char *user_rcdir = NULL;
59
60 char *default_q1_name = NULL;
61 char *default_qw_name = NULL;
62 char *default_q2_name = NULL;
63 char *default_t2_name = NULL;
64 char *default_qw_team = NULL;
65 char *default_qw_skin = NULL;
66 char *default_q2_skin = NULL;
67 int default_q1_top_color = 0;
68 int default_q1_bottom_color = 0;
69 int default_qw_top_color = 0;
70 int default_qw_bottom_color = 0;
71
72 int default_qw_rate;
73 int default_q2_rate;
74 int default_qw_cl_nodelta;
75 int default_q2_cl_nodelta;
76 int default_qw_cl_predict;
77 int default_q2_cl_predict;
78 int default_noaim;
79 int default_qw_noskins;
80 int default_q2_noskins;
81 int default_b_switch;
82 int default_w_switch;
83
84 int pushlatency_mode;
85 int pushlatency_value;
86
87 int default_nosound;
88 int default_nocdaudio;
89
90 int show_hostnames;
91 int show_default_port;
92
93 int serverlist_countbots;
94
95 int default_terminate;
96 int default_iconify;
97 int default_launchinfo;
98 int default_stopxmms;
99 int default_prelaunchexec;
100 int default_save_lists;
101 int default_save_srvinfo;
102 int default_save_plrinfo;
103 int default_auto_favorites;
104 int default_show_splash;
105 int default_auto_maps;
106 int skip_startup_mapscan;
107 int default_show_tray_icon;
108 int default_toolbar_style;
109 int default_toolbar_tips;
110 int default_refresh_sorts;
111 int default_refresh_on_update;
112 int default_resolve_on_update;
113 int default_show_only_configured_games;
114 char* default_icontheme;
115
116 int maxretries;
117 int maxsimultaneous;
118 char* qstat_srcip;
119 unsigned short qstat_srcport_low;
120 unsigned short qstat_srcport_high;
121 gboolean qstat_srcport_changed;
122 gboolean qstat_srcip_changed;
123
124 int sound_enable;
125 char *sound_player = NULL;
126 char *sound_xqf_start = NULL;
127 char *sound_xqf_quit = NULL;
128 char *sound_update_done = NULL;
129 char *sound_refresh_done = NULL;
130 char *sound_stop = NULL;
131 char *sound_server_connect = NULL;
132 char *sound_redial_success = NULL;
133
134 gboolean use_custom_gtkrc;
135
136 GtkTooltips *tooltips;
137
138 static int pref_q1_top_color;
139 static int pref_q1_bottom_color;
140 static int pref_qw_top_color;
141 static int pref_qw_bottom_color;
142 static int pref_b_switch;
143 static int pref_w_switch;
144 static int pref_qw_noskins;
145 static int pref_q2_noskins;
146 static char *pref_qw_skin;
147 static char *pref_q2_skin;
148
149 static GtkWidget *games_notebook;
150 static GtkWidget *pref_notebook;
151
152 static GtkWidget *rate_spinner[2];
153 static GtkWidget *cl_nodelta_check_button[2];
154 static GtkWidget *cl_predict_check_button[2];
155 static GtkWidget *noaim_check_button;
156 static GtkWidget *nosound_check_button;
157 static GtkWidget *nocdaudio_check_button;
158 static GtkWidget *name_q1_entry;
159 static GtkWidget *name_qw_entry;
160 static GtkWidget *name_q2_entry;
161 static GtkWidget *name_t2_entry;
162 static GtkWidget *team_qw_entry;
163 static GtkWidget *q1_skin_preview = NULL;
164 static GtkWidget *qw_skin_preview = NULL;
165 static GtkWidget *q2_skin_preview = NULL;
166 static GtkWidget *qw_skin_combo;
167 static GtkWidget *q2_skin_combo;
168 static GtkWidget *q1_top_color_button;
169 static GtkWidget *q1_bottom_color_button;
170 static GtkWidget *qw_top_color_button;
171 static GtkWidget *qw_bottom_color_button;
172
173 static GtkWidget *terminate_check_button;
174 static GtkWidget *iconify_check_button;
175 static GtkWidget *launchinfo_check_button;
176 static GtkWidget *stopxmms_check_button;
177 static GtkWidget *prelaunchexec_check_button;
178 static GtkWidget *save_lists_check_button;
179 static GtkWidget *save_srvinfo_check_button;
180 static GtkWidget *save_plrinfo_check_button;
181 static GtkWidget *auto_favorites_check_button;
182 static GtkWidget *show_splash_button;
183 static GtkWidget *auto_maps_check_button;
184
185 /*Tray Icon*/
186 static GtkWidget *tray_icon_check_button;
187
188 static GtkWidget *show_hostnames_check_button;
189 static GtkWidget *show_defport_check_button;
190 static GtkWidget *toolbar_style_radio_buttons[3];
191 static GtkWidget *toolbar_tips_check_button;
192 static GtkWidget *countbots_check_button;
193 static GtkWidget *refresh_sorts_check_button;
194 static GtkWidget *refresh_on_update_check_button;
195 static GtkWidget *resolve_on_update_check_button;
196 static GtkWidget *show_only_configured_games_check_button;
197 static GtkWidget *use_custom_gtkrc_check_button;
198
199 static GtkWidget *pushlatency_mode_radio_buttons[3];
200 static GtkWidget *pushlatency_value_spinner;
201
202 static GtkWidget *maxretries_spinner;
203 static GtkWidget *maxsimultaneous_spinner;
204 static GtkWidget *qstat_srcip_entry;
205 static GtkWidget *qstat_srcport_entry_low;
206 static GtkWidget *qstat_srcport_entry_high;
207
208 static GtkWidget *sound_enable_check_button;
209
210 static GtkWidget *sound_player_entry;
211 static GtkWidget *sound_xqf_start_entry;
212 static GtkWidget *sound_xqf_quit_entry;
213 static GtkWidget *sound_update_done_entry;
214 static GtkWidget *sound_refresh_done_entry;
215 static GtkWidget *sound_stop_entry;
216 static GtkWidget *sound_server_connect_entry;
217 static GtkWidget *sound_redial_success_entry;
218
219 static GtkWidget *sound_player_file_dialog_button;
220 static GtkWidget *sound_xqf_start_file_dialog_button;
221 static GtkWidget *sound_xqf_quit_file_dialog_button;
222 static GtkWidget *sound_update_done_file_dialog_button;
223 static GtkWidget *sound_refresh_done_file_dialog_button;
224 static GtkWidget *sound_stop_file_dialog_button;
225 static GtkWidget *sound_server_connect_file_dialog_button;
226 static GtkWidget *sound_redial_success_file_dialog_button;
227
228 static GtkWidget *sound_xqf_start_file_test_button;
229 static GtkWidget *sound_xqf_start_file_test_button;
230 static GtkWidget *sound_xqf_quit_file_test_button;
231 static GtkWidget *sound_update_done_file_test_button;
232 static GtkWidget *sound_refresh_done_file_test_button;
233 static GtkWidget *sound_stop_file_test_button;
234 static GtkWidget *sound_server_connect_file_test_button;
235 static GtkWidget *sound_redial_success_file_test_button;
236
237 static guchar *q1_skin_data = NULL;
238 static int q1_skin_is_valid = TRUE;
239
240 static guchar *qw_skin_data = NULL;
241 static int qw_skin_is_valid = TRUE;
242
243 static guchar *q2_skin_data = NULL;
244 static int q2_skin_is_valid = TRUE;
245
246 static GtkWidget *color_menu = NULL;
247
248 static GtkWidget *custom_args_add_button[GAMES_TOTAL];
249 static GtkWidget *custom_args_entry_game[GAMES_TOTAL];
250 static GtkWidget *custom_args_entry_args[GAMES_TOTAL];
251 static int current_row = -1;
252
253 struct generic_prefs {
254 char *pref_dir;
255 char *real_dir;
256 GtkWidget *dir_entry;
257 GtkWidget *cmd_entry;
258 GtkWidget *cfg_combo;
259 GtkWidget *game_button;
260 // function for adding game specific tabs to notebook
261 void (*add_options_to_notebook) (GtkWidget *notebook, enum server_type type);
262
263 // game specific data
264 GData* games_data;
265
266 GSList *custom_args;
267 } *genprefs = NULL;
268
269 enum {
270 Q3_PREF_SETFS_GAME = 0x01,
271 Q3_PREF_PB = 0x02,
272 Q3_PREF_CONSOLE = 0x04,
273 };
274
275 /* Quake 3 settings */
276 struct q3_common_prefs_s {
277 const char** protocols;
278 const char* defproto;
279 unsigned flags;
280 GtkWidget *setfs_gamebutton;
281 GtkWidget *set_punkbusterbutton;
282 GtkWidget *proto_entry;
283 GtkWidget *console_button;
284 };
285
286 // change config_get_string below too!
287 static const char* q3_masterprotocols[] = {
288 "68 - v1.32",
289 "67 - v1.31",
290 "66 - v1.30",
291 "48 - v1.27",
292 "46 - v1.25",
293 "45 - v1.17",
294 "43 - v1.11",
295 NULL
296 };
297
298 static struct q3_common_prefs_s q3_prefs = {
299 .protocols = q3_masterprotocols,
300 .defproto = "68",
301 .flags = Q3_PREF_SETFS_GAME | Q3_PREF_PB,
302 };
303
304 static GtkWidget *pass_memory_options_button;
305 static GtkWidget *com_hunkmegs_spinner;
306 static GtkWidget *com_soundmegs_spinner;
307 static GtkWidget *com_zonemegs_spinner;
308 static GtkWidget *cg_precachedmodels_spinner;
309
310
311 // change config_get_string below too!
312 static const char* wo_masterprotocols[] = {
313 "60 - v1.4",
314 "59 - v1.32",
315 "58 - v1.3",
316 "57 - retail",
317 "56 - test2",
318 "55 - test1",
319 NULL
320 };
321
322 static struct q3_common_prefs_s wo_prefs = {
323 .protocols = wo_masterprotocols,
324 .defproto = "60",
325 .flags = Q3_PREF_SETFS_GAME | Q3_PREF_PB,
326 };
327
328 // change config_get_string below too!
329 static const char* woet_masterprotocols[] = {
330 "84 - v2.60",
331 "83 - v2.56",
332 "82 - v2.55 (Release)",
333 "71 - v2.32 (test)",
334 NULL
335 };
336
337 static struct q3_common_prefs_s woet_prefs = {
338 .protocols = woet_masterprotocols,
339 .defproto = "84",
340 .flags = Q3_PREF_SETFS_GAME | Q3_PREF_PB,
341 };
342
343 static const char* etl_masterprotocols[] = {
344 "84 - v2.71",
345 NULL
346 };
347
348 static struct q3_common_prefs_s etl_prefs = {
349 .protocols = etl_masterprotocols,
350 .defproto = "84",
351 .flags = Q3_PREF_SETFS_GAME | Q3_PREF_PB,
352 };
353
354 static const char* ef_masterprotocols[] = {
355 "24",
356 NULL
357 };
358
359 static struct q3_common_prefs_s ef_prefs = {
360 .protocols = ef_masterprotocols,
361 .defproto = "24",
362 };
363
364 static const char* cod_masterprotocols[] = {
365 "6 - v1.5",
366 "5 - v1.4",
367 "1 - retail",
368 NULL
369 };
370
371 static struct q3_common_prefs_s cod_prefs = {
372 .protocols = cod_masterprotocols,
373 .defproto = "5",
374 };
375
376 static const char* jk2_masterprotocols[] = {
377 "15 - v1.02",
378 "16 - v1.04",
379 NULL
380 };
381
382 static const char* jk3_masterprotocols[] = {
383 "26 - v1.01",
384 "25 - v1.0",
385 NULL
386 };
387
388 static struct q3_common_prefs_s jk2_prefs = {
389 .protocols = jk2_masterprotocols,
390 .defproto = "16",
391 };
392
393 static struct q3_common_prefs_s jk3_prefs = {
394 .protocols = jk3_masterprotocols,
395 .defproto = "26",
396 };
397
398 static const char* sof2_masterprotocols[] = {
399 "2004 - SOF2 1.02",
400 "2003 - SOF2 1.01",
401 "2002 - SOF2 1.00",
402 NULL
403 };
404
405 static struct q3_common_prefs_s sof2_prefs = {
406 .protocols = sof2_masterprotocols,
407 .defproto = "2004",
408 };
409
410 static const char* doom3_masterprotocols[] = {
411 "auto",
412 "1.40 - 1.3.1302",
413 "1.35 - 1.1.1282",
414 "1.33 - retail",
415 NULL
416 };
417
418 static struct q3_common_prefs_s doom3_prefs = {
419 .protocols = doom3_masterprotocols,
420 .defproto = "auto",
421 .flags = Q3_PREF_PB,
422 };
423
424 static const char* quake4_masterprotocols[] = {
425 "auto",
426 "0 - any",
427 "2.63 - German retail",
428 "2.62 - retail",
429 "2.32837 - 1.2 German",
430 "2.69 - 1.2",
431 "2.32853 - 1.4.2 German",
432 "2.85 - 1.4.2",
433 NULL
434 };
435
436 static struct q3_common_prefs_s q4_prefs = {
437 .protocols = quake4_masterprotocols,
438 .defproto = "auto",
439 .flags = Q3_PREF_PB | Q3_PREF_CONSOLE,
440 };
441
442 static const char* etqw_masterprotocols[] = {
443 "auto",
444 "0 - any",
445 "10.16 - retail",
446 "10.17 - 1.2",
447 NULL
448 };
449
450 static struct q3_common_prefs_s etqw_prefs = {
451 .protocols = etqw_masterprotocols,
452 .defproto = "auto",
453 .flags = Q3_PREF_PB | Q3_PREF_CONSOLE,
454 };
455
456 static const char* nexuiz_masterprotocols[] = {
457 "3",
458 NULL
459 };
460
461 static struct q3_common_prefs_s nexuiz_prefs = {
462 .protocols = nexuiz_masterprotocols,
463 .defproto = "3",
464 };
465
466 static const char* xonotic_masterprotocols[] = {
467 "3",
468 NULL
469 };
470
471 static struct q3_common_prefs_s xonotic_prefs = {
472 .protocols = xonotic_masterprotocols,
473 .defproto = "3",
474 };
475
476 static const char* warsow_masterprotocols[] = {
477 "auto",
478 "15 - v1.02",
479 "10 - v0.40",
480 "9 - v0.32",
481 "8 - v0.2",
482 "7 - v0.1",
483 "6 - v0.072",
484 NULL
485 };
486
487 static struct q3_common_prefs_s warsow_prefs = {
488 .protocols = warsow_masterprotocols,
489 .defproto = "15",
490 };
491
492 static const char* tremulous_masterprotocols[] = {
493 "auto",
494 "69 - v1.1.0",
495 NULL
496 };
497
498 static struct q3_common_prefs_s tremulous_prefs = {
499 .protocols = tremulous_masterprotocols,
500 .defproto = "69",
501 };
502
503 static const char* tremulousgpp_masterprotocols[] = {
504 "auto",
505 "70 - GPP",
506 NULL
507 };
508
509 static struct q3_common_prefs_s tremulousgpp_prefs = {
510 .protocols = tremulousgpp_masterprotocols,
511 .defproto = "70",
512 };
513
514 static const char* tremfusion_masterprotocols[] = {
515 "auto",
516 "69 - v0.99",
517 NULL
518 };
519
520 static struct q3_common_prefs_s tremfusion_prefs = {
521 .protocols = tremfusion_masterprotocols,
522 .defproto = "69",
523 };
524
525 static const char* unvanquished_masterprotocols[] = {
526 "auto",
527 "86",
528 NULL
529 };
530
531 static struct q3_common_prefs_s unvanquished_prefs = {
532 .protocols = unvanquished_masterprotocols,
533 .defproto = "86",
534 };
535
536 static const char* openarena_masterprotocols[] = {
537 "auto",
538 "71 - v0.8.8"
539 "70 - v0.8.0",
540 NULL
541 };
542
543 static struct q3_common_prefs_s openarena_prefs = {
544 .protocols = openarena_masterprotocols,
545 .defproto = "71",
546 };
547
548 static const char* q3rally_masterprotocols[] = {
549 "auto",
550 "71 - v0.0.0.3",
551 NULL
552 };
553
554 static struct q3_common_prefs_s q3rally_prefs = {
555 .protocols = q3rally_masterprotocols,
556 .defproto = "71",
557 };
558
559 static const char* wop_masterprotocols[] = {
560 "auto",
561 "71",
562 "70",
563 "69",
564 "68",
565 NULL
566 };
567
568 static struct q3_common_prefs_s wop_prefs = {
569 .protocols = wop_masterprotocols,
570 .defproto = "71",
571 };
572
573 static const char* iourt_masterprotocols[] = {
574 "auto",
575 "68 - v1.35",
576 NULL
577 };
578
579 static struct q3_common_prefs_s iourt_prefs = {
580 .protocols = iourt_masterprotocols,
581 .defproto = "68",
582 };
583
584 static const char* reaction_masterprotocols[] = {
585 "auto",
586 "68",
587 NULL
588 };
589
590 static struct q3_common_prefs_s reaction_prefs = {
591 .protocols = reaction_masterprotocols,
592 .defproto = "68",
593 };
594
595 static const char* smokinguns_masterprotocols[] = {
596 "auto",
597 "68 - v1.1",
598 NULL
599 };
600
601 static struct q3_common_prefs_s smokinguns_prefs = {
602 .protocols = smokinguns_masterprotocols,
603 .defproto = "68",
604 };
605
606 static const char* zeq2lite_masterprotocols[] = {
607 "auto",
608 "75",
609 NULL
610 };
611
612 static struct q3_common_prefs_s zeq2lite_prefs = {
613 .protocols = zeq2lite_masterprotocols,
614 .defproto = "75",
615 };
616
617 static const char* turtlearena_masterprotocols[] = {
618 "auto",
619 "9",
620 NULL
621 };
622
623 static struct q3_common_prefs_s turtlearena_prefs = {
624 .protocols = turtlearena_masterprotocols,
625 .defproto = "9",
626 };
627
628 static const char* alienarena_masterprotocols[] = {
629 "auto",
630 "34 - v7.66",
631 NULL
632 };
633
634 static struct q3_common_prefs_s alienarena_prefs = {
635 .protocols = alienarena_masterprotocols,
636 .defproto = "34",
637 };
638
639 static struct q3_common_prefs_s* get_pref_widgets_for_game(enum server_type type);
640
641 static void game_file_dialog(enum server_type type);
642 static void game_dir_dialog(enum server_type type);
643 static void game_file_activate_callback(enum server_type type);
644 static void sound_player_file_dialog();
645 static void sound_xqf_start_file_dialog();
646 static void sound_xqf_quit_file_dialog();
647 static void sound_update_done_file_dialog();
648 static void sound_refresh_done_file_dialog();
649 static void sound_stop_file_dialog();
650 static void sound_server_connect_file_dialog();
651 static void sound_redial_success_file_dialog();
652
compare_slist_strings(gconstpointer str1,gconstpointer str2)653 static inline int compare_slist_strings (gconstpointer str1, gconstpointer str2) {
654 int res;
655
656 if (str1) {
657 if (str2) {
658 res = g_ascii_strcasecmp (str1, str2);
659 if (!res) {
660 res = strcmp (str1, str2);
661 }
662 }
663 else {
664 res = 1;
665 }
666 }
667 else {
668 res = (str2)? -1 : 0;
669 }
670 return res;
671 }
672
673
get_new_defaults_for_game(enum server_type type)674 static void get_new_defaults_for_game (enum server_type type) {
675 struct game *g = &games[type];
676 struct generic_prefs *prefs = &genprefs[type];
677 char buf[256];
678
679 debug (5, "get_new_defaults_for_game(%d)",type);
680
681 if (prefs->cmd_entry) {
682 if (g->cmd) g_free(g->cmd);
683 g->cmd = strdup_strip (gtk_entry_get_text (GTK_ENTRY (prefs->cmd_entry)));
684 }
685
686 if (prefs->dir_entry) {
687 if (g->dir) g_free(g->dir);
688 g->dir = strdup_strip (gtk_entry_get_text (GTK_ENTRY (prefs->dir_entry)));
689
690 if (g->real_dir) g_free(g->real_dir);
691 g->real_dir = expand_tilde (g->dir);
692
693 if (prefs->pref_dir) g_free(prefs->pref_dir);
694 prefs->pref_dir = NULL;
695
696 if (prefs->real_dir) g_free(prefs->real_dir);
697 prefs->real_dir = NULL;
698 }
699
700 if (prefs->cfg_combo) {
701 if (g->game_cfg) g_free(g->game_cfg);
702 g->game_cfg = strdup_strip (gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (prefs->cfg_combo)->entry)));
703 }
704
705 g_snprintf (buf, sizeof(buf), "/" CONFIG_FILE "/Game: %s", type2id (type));
706 config_push_prefix (buf);
707
708 if (g->cmd)
709 config_set_string ("cmd", g->cmd);
710 else
711 config_clean_key ("cmd");
712
713 if (g->dir)
714 config_set_string ("dir", g->dir);
715 else
716 config_clean_key ("dir");
717
718 if (g->game_cfg)
719 config_set_string ("custom cfg", g->game_cfg);
720 else
721 config_clean_key ("custom cfg");
722
723
724 // Set custom arguments
725 if (g->custom_args) {
726 g_slist_free (g->custom_args);
727 }
728
729 g->custom_args = g_slist_sort (prefs->custom_args, compare_slist_strings);
730
731 {
732 int i = 0;
733 char *str = NULL;
734 int isdefault = FALSE;
735 GSList *list = g->custom_args;
736
737 for (i = 0;list; list = g_slist_next(list), ++i) {
738 g_snprintf (buf, sizeof(buf), "custom_arg%d", i);
739
740 config_set_string (buf, (char *) list->data);
741 }
742
743 // Clear remaining existing arguments
744 g_snprintf (buf, sizeof(buf), "custom_arg%d", i);
745
746 str = config_get_string_with_default (buf,&isdefault);
747 while (!isdefault) {
748 config_clean_key (buf);
749
750 ++i;
751 g_snprintf (buf, sizeof(buf), "custom_arg%d", i);
752 g_free(str);
753 str = config_get_string_with_default (buf,&isdefault);
754 }
755 }
756
757 if (g->update_prefs) {
758 g->update_prefs(g);
759 }
760
761 config_pop_prefix();
762 }
763
764
load_game_defaults(enum server_type type)765 static void load_game_defaults (enum server_type type) {
766 struct game *g = &games[type];
767 char str[256];
768
769 int isdefault = FALSE;
770 char *str2;
771 char conf[64];
772 int j;
773
774 g_snprintf (str, 256, "/" CONFIG_FILE "/Game: %s", type2id (type));
775 config_push_prefix (str);
776
777 g_free(g->cmd);
778 g->cmd = config_get_string("cmd");
779
780 g_free(g->dir);
781 g->dir = config_get_string("dir");
782
783 g_free(g->real_dir);
784 g->real_dir = expand_tilde (g->dir);
785
786 g_free(g->game_cfg);
787 g->game_cfg = config_get_string("custom cfg");
788
789 g->real_home = expand_tilde (g->default_home);
790
791 // Load custom arguments
792 j = 0;
793 g_snprintf (conf, 64, "custom_arg%d", j);
794 str2 = config_get_string_with_default (conf,&isdefault);
795 while (!isdefault) {
796 g->custom_args = g_slist_append(g->custom_args, str2);
797 debug(2,"game: %s: %s=%s",type2id (type), conf,str2);
798
799 ++j;
800 g_snprintf (conf, sizeof(conf), "custom_arg%d", j);
801 str2 = config_get_string_with_default (conf,&isdefault);
802 }
803
804 config_pop_prefix();
805 }
806
807 // verify Quake3 settings, return false if something's not ok
verify_q3_settings(void)808 int verify_q3_settings (void) {
809 int com_hunkmegs = 0;
810 int com_zonemegs = 0;
811 int com_soundmegs = 0;
812 // int cg_precachedmodels = 0;
813
814 com_hunkmegs = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(com_hunkmegs_spinner));
815 com_soundmegs = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(com_soundmegs_spinner));
816 com_zonemegs = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(com_zonemegs_spinner));
817 // cg_precachedmodels = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(cg_precachedmodels_spinner));
818
819 if (com_soundmegs + com_zonemegs >= com_hunkmegs) {
820 dialog_ok (NULL, _("com_soundmegs and com_zonemegs must be lower than com_hunkmegs"));
821 return FALSE;
822 }
823 return TRUE;
824 }
825
q1_update_prefs(struct game * g)826 void q1_update_prefs (struct game* g) {
827 char* str;
828
829 if (pref_q1_top_color != default_q1_top_color) {
830 config_set_int ("top", default_q1_top_color = pref_q1_top_color);
831 }
832
833 if (pref_q1_bottom_color != default_q1_bottom_color) {
834 config_set_int ("bottom", default_q1_bottom_color = pref_q1_bottom_color);
835 }
836
837 str = strdup_strip (gtk_entry_get_text (GTK_ENTRY (name_q1_entry)));
838 if (str == NULL || default_q1_name == NULL || (default_q1_name && strcmp (str, default_q1_name))) {
839 if (default_q1_name) {
840 g_free(default_q1_name);
841 }
842 default_q1_name = str;
843 config_set_string ("player name", (str)? str : "");
844 }
845 str=NULL;
846 }
847
848 /* QuakeWorld (some network settings are used by Q2) */
qw_update_prefs(struct game * g)849 void qw_update_prefs (struct game* g) {
850 char* str;
851 int i;
852
853 str = strdup_strip (gtk_entry_get_text (GTK_ENTRY (name_qw_entry)));
854 if (str == NULL || default_qw_name == NULL || (default_qw_name && strcmp (str, default_qw_name))) {
855 if (default_qw_name) {
856 g_free(default_qw_name);
857 }
858 default_qw_name = str;
859 config_set_string ("player name", (str)? str : "");
860 }
861 str=NULL;
862
863 str = strdup_strip (gtk_entry_get_text (GTK_ENTRY (team_qw_entry)));
864 if (str == NULL || default_qw_team == NULL || (default_qw_team && strcmp (str, default_qw_team))) {
865 if (default_qw_team) {
866 g_free(default_qw_team);
867 }
868 default_qw_team = str;
869 config_set_string ("team", (str)? str : "");
870 }
871 str=NULL;
872
873 if (pref_qw_top_color != default_qw_top_color) {
874 config_set_int ("top", default_qw_top_color = pref_qw_top_color);
875 }
876
877 if (pref_qw_bottom_color != default_qw_bottom_color) {
878 config_set_int ("bottom", default_qw_bottom_color = pref_qw_bottom_color);
879 }
880
881 if (pref_qw_skin == NULL || (default_qw_skin && strcmp (pref_qw_skin, default_qw_skin))) {
882 if (default_qw_skin) {
883 g_free(default_qw_skin);
884 }
885 default_qw_skin = pref_qw_skin;
886 config_set_string ("skin", (pref_qw_skin)? pref_qw_skin : "");
887 }
888 pref_qw_skin = NULL;
889
890 i = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (rate_spinner[0]));
891 if (i != default_qw_rate) {
892 config_set_int ("rate", default_qw_rate = i);
893 }
894
895 i = GTK_TOGGLE_BUTTON (cl_nodelta_check_button[0])->active;
896 if (i != default_qw_cl_nodelta) {
897 config_set_int ("cl_nodelta", default_qw_cl_nodelta = i);
898 }
899
900 i = 1 - GTK_TOGGLE_BUTTON (cl_predict_check_button[0])->active;
901 if (i != default_qw_cl_predict) {
902 config_set_int ("cl_predict", default_qw_cl_predict = i);
903 }
904
905 if (pref_qw_noskins != default_qw_noskins) {
906 config_set_int ("noskins", default_qw_noskins = pref_qw_noskins);
907 }
908
909 i = GTK_TOGGLE_BUTTON (noaim_check_button)->active;
910 if (i != default_noaim) {
911 config_set_int ("noaim", default_noaim = i);
912 }
913
914 for (i = 0; i < 3; i++) {
915 if (GTK_TOGGLE_BUTTON (pushlatency_mode_radio_buttons[i])->active) {
916 if (i != pushlatency_mode) {
917 config_set_int ("pushlatency mode", pushlatency_mode = i);
918 }
919 break;
920 }
921 }
922
923 i = gtk_spin_button_get_value_as_int (
924 GTK_SPIN_BUTTON (pushlatency_value_spinner));
925 if (i != pushlatency_value) {
926 config_set_int ("pushlatency value", pushlatency_value = i);
927 }
928
929 if (pref_b_switch != default_b_switch) {
930 config_set_int ("b_switch", default_b_switch = pref_b_switch);
931 }
932
933 if (pref_w_switch != default_w_switch) {
934 config_set_int ("w_switch", default_w_switch = pref_w_switch);
935 }
936 }
937
q2_update_prefs(struct game * g)938 void q2_update_prefs (struct game* g) {
939 char* str;
940 int i;
941
942 if (pref_q2_skin == NULL ||
943 (default_q2_skin && strcmp (pref_q2_skin, default_q2_skin))) {
944 if (default_q2_skin) g_free(default_q2_skin);
945 default_q2_skin = pref_q2_skin;
946 config_set_string ("skin", (pref_q2_skin)? pref_q2_skin : "");
947 }
948 pref_q2_skin = NULL;
949
950 str = strdup_strip (gtk_entry_get_text (GTK_ENTRY (name_q2_entry)));
951 if (str == NULL || default_q2_name == NULL ||
952 (default_q2_name && strcmp (str, default_q2_name))) {
953 if (default_q2_name) g_free(default_q2_name);
954 default_q2_name = str;
955 config_set_string ("player name", (str)? str : "");
956 }
957 str=NULL;
958
959 i = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (rate_spinner[1]));
960 if (i != default_q2_rate) {
961 config_set_int ("rate", default_q2_rate = i);
962 }
963
964 i = GTK_TOGGLE_BUTTON (cl_nodelta_check_button[1])->active;
965 if (i != default_q2_cl_nodelta) {
966 config_set_int ("cl_nodelta", default_q2_cl_nodelta = i);
967 }
968
969 i = 1 - GTK_TOGGLE_BUTTON (cl_predict_check_button[1])->active;
970 if (i != default_q2_cl_predict) {
971 config_set_int ("cl_predict", default_q2_cl_predict = i);
972 }
973
974 if (pref_q2_noskins != default_q2_noskins) {
975 config_set_int ("noskins", default_q2_noskins = pref_q2_noskins);
976 }
977 }
978
q3_update_prefs_common(struct game * g)979 void q3_update_prefs_common (struct game* g) {
980 char* str, *str1;
981 const char* strold;
982 int i;
983 enum server_type type = g->type;
984 struct q3_common_prefs_s* w;
985
986 w = get_pref_widgets_for_game(type);
987 g_return_if_fail(w != NULL);
988
989 str = strdup_strip (gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (w->proto_entry)->entry)));
990 // locate first space and mark it as str's end
991 str1 = strchr(str,' ');
992 if (str1) *str1='\0';
993
994 strold = game_get_attribute(type,"masterprotocol");
995 if (strcmp(str, strold?strold:"")) {
996 game_set_attribute(type,"masterprotocol",strdup_strip(str));
997 config_set_string ("protocol", (str)? str : "");
998 }
999 g_free(str);
1000 str=NULL;
1001
1002 if (w->setfs_gamebutton) {
1003 int o;
1004 i = GTK_TOGGLE_BUTTON (w->setfs_gamebutton)->active;
1005 o = str2bool(game_get_attribute(type,"setfs_game"));
1006 if (i != o) {
1007 config_set_bool ("setfs_game", i);
1008 game_set_attribute(type,"setfs_game",g_strdup(bool2str(i)));
1009 }
1010 }
1011
1012 if (w->set_punkbusterbutton) {
1013 int o;
1014 i = GTK_TOGGLE_BUTTON (w->set_punkbusterbutton)->active;
1015 o = str2bool(game_get_attribute(type,"set_punkbuster"));
1016 if (i != o) {
1017 config_set_bool ("set_punkbuster", i);
1018 game_set_attribute(type,"set_punkbuster",g_strdup(bool2str(i)));
1019 }
1020 }
1021
1022 if (w->console_button) {
1023 int o;
1024 i = GTK_TOGGLE_BUTTON (w->console_button)->active;
1025 o = str2bool(game_get_attribute(type,"enable_console"));
1026 if (i != o) {
1027 config_set_bool ("enable_console", i);
1028 game_set_attribute(type,"enable_console",g_strdup(bool2str(i)));
1029 }
1030 }
1031 }
1032
q3_update_prefs(struct game * g)1033 void q3_update_prefs (struct game* g) {
1034 int i;
1035 enum server_type type = g->type;
1036 struct q3_common_prefs_s* w;
1037
1038 w = get_pref_widgets_for_game(type);
1039 g_return_if_fail(w != NULL);
1040
1041 q3_update_prefs_common(g);
1042
1043 i = GTK_TOGGLE_BUTTON (pass_memory_options_button)->active;
1044 config_set_bool ("pass_memory_options", i);
1045 game_set_attribute(type,"pass_memory_options",g_strdup(bool2str(i)));
1046
1047 i = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(com_hunkmegs_spinner));
1048 config_set_int ("com_hunkmegs", i);
1049 game_set_attribute(type,"com_hunkmegs",g_strdup_printf("%d",i));
1050
1051 i = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(com_soundmegs_spinner));
1052 config_set_int ("com_soundmegs", i);
1053 game_set_attribute(type,"com_soundmegs",g_strdup_printf("%d",i));
1054
1055 i = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(com_zonemegs_spinner));
1056 config_set_int ("com_zonemegs", i);
1057 game_set_attribute(type,"com_zonemegs",g_strdup_printf("%d",i));
1058
1059 i = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(cg_precachedmodels_spinner));
1060 config_set_int ("cg_precachedmodels", i);
1061 game_set_attribute(type,"cg_precachedmodels",g_strdup_printf("%d",i));
1062 }
1063
doom3_detect_version(struct game * g)1064 static void doom3_detect_version(struct game* g) {
1065 FILE* f = NULL;
1066 char* verinfo = NULL;
1067 // const char* attrproto;
1068 char line[64];
1069
1070 debug(3, "cmd: %s, dir: %s", g->cmd, g->real_dir);
1071
1072 // attrproto = game_get_attribute(g->type,"masterprotocol");
1073
1074 if (g->real_home && *g->real_home) {
1075 verinfo = file_in_dir (g->real_home, "version.info");
1076 f = fopen(verinfo, "r");
1077 }
1078
1079 if (!f) {
1080 g_free(verinfo);
1081 verinfo = file_in_dir (g->real_dir, "version.info");
1082 f = fopen(verinfo, "r");
1083 }
1084
1085 if (!f) {
1086 goto out;
1087 }
1088
1089 if (!fgets(line, sizeof(line), f)) {
1090 goto out;
1091 }
1092
1093 if (!fgets(line, sizeof(line), f)) {
1094 goto out;
1095 }
1096
1097 if (strlen(line) && line[strlen(line)-1] == '\n') {
1098 line[strlen(line)-1] = '\0';
1099 }
1100
1101 debug(3, "detected %s protocol version %s", g->name, line);
1102
1103 game_set_attribute(g->type, "_masterprotocol", g_strdup(line));
1104
1105 out:
1106 if (f) {
1107 fclose(f);
1108 }
1109 g_free(verinfo);
1110 }
1111
doom3_update_prefs(struct game * g)1112 void doom3_update_prefs (struct game* g) {
1113 q3_update_prefs_common(g);
1114 doom3_detect_version(g);
1115 }
1116
quake4_update_prefs(struct game * g)1117 void quake4_update_prefs (struct game* g) {
1118 q3_update_prefs_common(g);
1119 doom3_detect_version(g);
1120 }
1121
tribes2_update_prefs(struct game * g)1122 void tribes2_update_prefs (struct game* g) {
1123 char* str;
1124
1125 str = strdup_strip (gtk_entry_get_text (GTK_ENTRY (name_t2_entry)));
1126 if (str == NULL || default_t2_name == NULL || (default_t2_name && strcmp (str, default_t2_name))) {
1127 if (default_t2_name) {
1128 g_free(default_t2_name);
1129 }
1130 default_t2_name = str;
1131 config_set_string ("player name", (str)? str : "");
1132 }
1133 str=NULL;
1134 }
1135
ut2004_detect_cdkey(struct game * g)1136 static void ut2004_detect_cdkey(struct game* g) {
1137 FILE* f = NULL;
1138 char* keyfile = NULL;
1139
1140 debug(2, "cmd: %s, dir: %s, home: %s", g->cmd, g->real_dir, g->real_home);
1141
1142 keyfile = file_in_dir (g->real_home, "System/cdkey");
1143 if (keyfile) {
1144 f = fopen(keyfile, "r");
1145 if (!f) {
1146 g_free(keyfile);
1147 keyfile = NULL;
1148 }
1149 }
1150
1151 if (!keyfile) {
1152 if (f) {
1153 fclose(f);
1154 }
1155 keyfile = file_in_dir (g->real_dir, "System/cdkey");
1156 if (keyfile) {
1157 f = fopen(keyfile, "r");
1158 if (!f) {
1159 g_free(keyfile);
1160 keyfile = NULL;
1161 }
1162 }
1163 }
1164
1165 if (keyfile || (!keyfile && game_get_attribute(g->type,"cdkey"))) {
1166 game_set_attribute(g->type, "cdkey", keyfile);
1167 }
1168
1169 if (f) {
1170 fclose(f);
1171 }
1172 }
1173
ut2004_update_prefs(struct game * g)1174 void ut2004_update_prefs (struct game* g) {
1175 ut2004_detect_cdkey(g);
1176 }
1177
get_new_defaults(void)1178 static void get_new_defaults (void) {
1179 int i;
1180
1181 debug (5, "get_new_defaults()");
1182
1183 /* Common part of games config */
1184
1185 config_push_prefix ("/" CONFIG_FILE "/Games Config");
1186
1187 i = GTK_TOGGLE_BUTTON (nosound_check_button)->active;
1188 if (i != default_nosound) {
1189 config_set_bool ("nosound", default_nosound = i);
1190 }
1191
1192 i = GTK_TOGGLE_BUTTON (nocdaudio_check_button)->active;
1193 if (i != default_nocdaudio) {
1194 config_set_bool ("nocdaudio", default_nocdaudio = i);
1195 }
1196
1197 config_pop_prefix();
1198
1199 for (i = 0; i < GAMES_TOTAL; i++) {
1200 get_new_defaults_for_game (i);
1201 }
1202
1203 /* Appearance */
1204
1205 config_push_prefix ("/" CONFIG_FILE "/Appearance");
1206
1207 for (i = 0; i < 3; i++) {
1208 if (GTK_TOGGLE_BUTTON (toolbar_style_radio_buttons[i])->active) {
1209 if (i != default_toolbar_style) {
1210 config_set_int ("toolbar style", default_toolbar_style = i);
1211 }
1212 break;
1213 }
1214 }
1215
1216 i = GTK_TOGGLE_BUTTON (toolbar_tips_check_button)->active;
1217 if (i != default_toolbar_tips) {
1218 config_set_bool ("toolbar tips", default_toolbar_tips = i);
1219 }
1220
1221 i = GTK_TOGGLE_BUTTON (countbots_check_button)->active;
1222 if (i != serverlist_countbots) {
1223 config_set_bool ("count bots", serverlist_countbots = i);
1224 }
1225
1226 i = GTK_TOGGLE_BUTTON (refresh_sorts_check_button)->active;
1227 if (i != default_refresh_sorts) {
1228 config_set_bool ("sort on refresh", default_refresh_sorts = i);
1229 }
1230
1231 i = GTK_TOGGLE_BUTTON (refresh_on_update_check_button)->active;
1232 if (i != default_refresh_on_update) {
1233 config_set_bool ("refresh on update", default_refresh_on_update = i);
1234 }
1235
1236 i = GTK_TOGGLE_BUTTON (resolve_on_update_check_button)->active;
1237 if (i != default_resolve_on_update) {
1238 config_set_bool ("resolve on update", default_resolve_on_update = i);
1239 }
1240
1241 i = GTK_TOGGLE_BUTTON (show_only_configured_games_check_button)->active;
1242 if (i != default_show_only_configured_games) {
1243 config_set_bool ("show only configured games", default_show_only_configured_games = i);
1244 }
1245
1246 i = GTK_TOGGLE_BUTTON (use_custom_gtkrc_check_button)->active;
1247 if (i != use_custom_gtkrc) {
1248 config_set_bool ("use custom gtkrc", use_custom_gtkrc = i);
1249 }
1250
1251 config_pop_prefix();
1252
1253 /* General */
1254
1255 config_push_prefix ("/" CONFIG_FILE "/General");
1256
1257 i = GTK_TOGGLE_BUTTON (terminate_check_button)->active;
1258 if (i != default_terminate) {
1259 config_set_bool ("terminate", default_terminate = i);
1260 }
1261
1262 i = GTK_TOGGLE_BUTTON (iconify_check_button)->active;
1263 if (i != default_iconify) {
1264 config_set_bool ("iconify", default_iconify = i);
1265 }
1266
1267 i = GTK_TOGGLE_BUTTON (launchinfo_check_button)->active;
1268 if (i != default_launchinfo) {
1269 config_set_bool ("launchinfo", default_launchinfo = i);
1270 }
1271
1272 i = GTK_TOGGLE_BUTTON (stopxmms_check_button)->active;
1273 if (i != default_stopxmms) {
1274 config_set_bool ("stopxmms", default_stopxmms = i);
1275 }
1276
1277 i = GTK_TOGGLE_BUTTON (prelaunchexec_check_button)->active;
1278 if (i != default_prelaunchexec) {
1279 config_set_bool ("prelaunchexec", default_prelaunchexec = i);
1280 }
1281
1282 i = GTK_TOGGLE_BUTTON (save_lists_check_button)->active;
1283 if (i != default_save_lists) {
1284 config_set_bool ("save lists", default_save_lists = i);
1285 }
1286
1287 i = GTK_TOGGLE_BUTTON (save_srvinfo_check_button)->active;
1288 if (i != default_save_srvinfo) {
1289 config_set_bool ("save srvinfo", default_save_srvinfo = i);
1290 }
1291
1292 i = GTK_TOGGLE_BUTTON (save_plrinfo_check_button)->active;
1293 if (i != default_save_plrinfo) {
1294 config_set_bool ("save players", default_save_plrinfo = i);
1295 }
1296
1297 i = GTK_TOGGLE_BUTTON (auto_favorites_check_button)->active;
1298 if (i != default_auto_favorites) {
1299 config_set_bool ("refresh favorites", default_auto_favorites = i);
1300 }
1301
1302 i = GTK_TOGGLE_BUTTON (show_splash_button)->active;
1303 if (i != default_show_splash) {
1304 config_set_bool ("splash screen", default_show_splash = i);
1305 }
1306
1307 i = GTK_TOGGLE_BUTTON (auto_maps_check_button)->active;
1308 if (i != default_auto_maps) {
1309 config_set_bool ("search maps", default_auto_maps = i);
1310 }
1311
1312 /*Tray icon*/
1313 i = GTK_TOGGLE_BUTTON (tray_icon_check_button)->active;
1314 if (i != default_show_tray_icon) {
1315 config_set_bool ("showtray", default_show_tray_icon = i);
1316 }
1317
1318 config_pop_prefix();
1319
1320 /* QStat */
1321
1322 config_push_prefix ("/" CONFIG_FILE "/QStat");
1323
1324 i = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (maxretries_spinner));
1325 if (i != maxretries) {
1326 config_set_int ("maxretires", maxretries = i);
1327 }
1328
1329 i = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (maxsimultaneous_spinner));
1330 if (i != maxsimultaneous) {
1331 config_set_int ("maxsimultaneous", maxsimultaneous = i);
1332 }
1333
1334 if (qstat_srcip_changed) {
1335 if (qstat_srcip) {
1336 config_set_string ("srcip", qstat_srcip);
1337 }
1338 else {
1339 config_clean_key("srcip");
1340 }
1341 qstat_srcip_changed = FALSE;
1342 }
1343
1344 if (qstat_srcport_changed) {
1345 if (qstat_srcport_low) {
1346 config_set_int ("port_low", qstat_srcport_low);
1347 config_set_int ("port_high", qstat_srcport_high);
1348 }
1349 else {
1350 config_clean_key("port_low");
1351 config_clean_key("port_high");
1352 }
1353 qstat_srcport_changed = FALSE;
1354 }
1355
1356 config_pop_prefix();
1357
1358 /* Sounds */
1359
1360 config_push_prefix ("/" CONFIG_FILE "/Sounds");
1361
1362 i = GTK_TOGGLE_BUTTON (sound_enable_check_button)->active;
1363 if (i != sound_enable) {
1364 config_set_bool ("sound_enable", sound_enable = i);
1365 }
1366
1367 sound_player = strdup_strip (gtk_entry_get_text (GTK_ENTRY (sound_player_entry)));
1368 config_set_string ("sound_player", (sound_player)? sound_player : "");
1369
1370 sound_xqf_start = strdup_strip (gtk_entry_get_text (GTK_ENTRY (sound_xqf_start_entry)));
1371 config_set_string ("sound_xqf_start", (sound_xqf_start)? sound_xqf_start : "");
1372
1373 sound_xqf_quit = strdup_strip (gtk_entry_get_text (GTK_ENTRY (sound_xqf_quit_entry)));
1374 config_set_string ("sound_xqf_quit", (sound_xqf_quit)? sound_xqf_quit : "");
1375
1376 sound_update_done = strdup_strip (gtk_entry_get_text (GTK_ENTRY (sound_update_done_entry)));
1377 config_set_string ("sound_update_done", (sound_update_done)? sound_update_done : "");
1378
1379 sound_refresh_done = strdup_strip (gtk_entry_get_text (GTK_ENTRY (sound_refresh_done_entry)));
1380 config_set_string ("sound_refresh_done", (sound_refresh_done)? sound_refresh_done : "");
1381
1382 sound_stop = strdup_strip (gtk_entry_get_text (GTK_ENTRY (sound_stop_entry)));
1383 config_set_string ("sound_stop", (sound_stop)? sound_stop : "");
1384
1385 sound_server_connect = strdup_strip (gtk_entry_get_text (GTK_ENTRY (sound_server_connect_entry)));
1386 config_set_string ("sound_server_connect", (sound_server_connect)? sound_server_connect : "");
1387
1388 sound_redial_success = strdup_strip (gtk_entry_get_text (GTK_ENTRY (sound_redial_success_entry)));
1389 config_set_string ("sound_redial_success", (sound_redial_success)? sound_redial_success : "");
1390
1391 config_pop_prefix();
1392
1393 /* These are set from chained calls to "activate" callbacks */
1394
1395 gtk_check_menu_item_set_active (
1396 GTK_CHECK_MENU_ITEM (view_hostnames_menu_item),
1397 GTK_TOGGLE_BUTTON (show_hostnames_check_button)->active);
1398
1399 gtk_check_menu_item_set_active (
1400 GTK_CHECK_MENU_ITEM (view_defport_menu_item),
1401 GTK_TOGGLE_BUTTON (show_defport_check_button)->active);
1402
1403 // i = gtk_notebook_get_current_page (GTK_NOTEBOOK (profile_notebook));
1404 // config_set_string ("/" CONFIG_FILE "/Player Profile/game", type2id (i));
1405
1406 i = gtk_notebook_get_current_page (GTK_NOTEBOOK (games_notebook));
1407 config_set_string ("/" CONFIG_FILE "/Games Config/game", type2id (i));
1408
1409 config_sync();
1410 rc_save();
1411 }
1412
check_qstat_source_port()1413 static int check_qstat_source_port() {
1414 unsigned short low, high;
1415 const char* val;
1416 struct in_addr in;
1417
1418 val = gtk_entry_get_text(GTK_ENTRY(qstat_srcport_entry_low));
1419 low = atoi(val);
1420
1421 val = gtk_entry_get_text(GTK_ENTRY(qstat_srcport_entry_high));
1422 high = atoi(val);
1423
1424 val = gtk_entry_get_text(GTK_ENTRY(qstat_srcip_entry));
1425 if (val && *val) {
1426 if (!inet_aton(val, &in)) {
1427 dialog_ok(NULL, _("Invalid source IP address"));
1428 gtk_notebook_set_page (GTK_NOTEBOOK (pref_notebook), PREF_PAGE_QSTAT);
1429 return FALSE;
1430 }
1431 else {
1432 val = inet_ntoa(in);
1433 }
1434 }
1435
1436 if ((low != 0 || high != 0) && (low < 1024 || high < 1024 || low > high)) {
1437 dialog_ok(NULL, _("Invalid source port range"));
1438 gtk_notebook_set_page (GTK_NOTEBOOK (pref_notebook), PREF_PAGE_QSTAT);
1439 return FALSE;
1440 }
1441
1442 if (val && *val) {
1443 if (!qstat_srcip || strcmp(qstat_srcip,val)) {
1444 g_free(qstat_srcip);
1445 qstat_srcip = g_strdup(val);
1446 qstat_srcip_changed = TRUE;
1447 }
1448 }
1449 else if (qstat_srcip) {
1450 g_free(qstat_srcip);
1451 qstat_srcip = NULL;
1452 qstat_srcip_changed = TRUE;
1453 }
1454
1455 if (qstat_srcport_low != low) {
1456 qstat_srcport_low = low;
1457 qstat_srcport_changed = TRUE;
1458 }
1459 if (qstat_srcport_high != high) {
1460 qstat_srcport_high = high;
1461 qstat_srcport_changed = TRUE;
1462 }
1463
1464 return TRUE;
1465 }
1466
1467 // call various verification fuctions, store settings and destroy preferences
1468 // window if everything's fine
ok_callback(GtkWidget * widget,GtkWidget * window)1469 static void ok_callback (GtkWidget *widget, GtkWidget* window) {
1470 if (!verify_q3_settings()) {
1471 return;
1472 }
1473
1474 if (!check_qstat_source_port()) {
1475 return;
1476 }
1477
1478 if (!check_script_prefs()) {
1479 return;
1480 }
1481
1482 save_script_prefs();
1483
1484 get_new_defaults();
1485 gtk_widget_destroy(window);
1486
1487 // Refresh list of sources on screen in case the 'Show only configured games'
1488 // setting has changes, or a game command line has been added or removed.
1489 refresh_source_list();
1490
1491 // Enable / disable tooltips after config change
1492 if (default_toolbar_tips) {
1493 gtk_tooltips_enable(tooltips);
1494 }
1495 else {
1496 gtk_tooltips_disable(tooltips);
1497 }
1498 }
1499
update_q1_skin(void)1500 static void update_q1_skin (void) {
1501
1502 if (q1_skin_preview == NULL) {
1503 return; /* no configuration window */
1504 }
1505
1506 if (q1_skin_data) {
1507 g_free(q1_skin_data);
1508 q1_skin_data = NULL;
1509 }
1510
1511 /* Use QuakeWorld 'base' skin */
1512
1513 q1_skin_data = get_qw_skin ("base", genprefs[QW_SERVER].real_dir);
1514
1515 if (q1_skin_data || q1_skin_is_valid) {
1516 draw_qw_skin (q1_skin_preview, q1_skin_data, pref_q1_top_color, pref_q1_bottom_color);
1517 q1_skin_is_valid = (q1_skin_data)? TRUE : FALSE;
1518 }
1519 }
1520
1521
update_qw_skins(char * initstr)1522 static void update_qw_skins (char *initstr) {
1523 GList *list;
1524 char *str = NULL;
1525
1526 if (qw_skin_preview == NULL) {
1527 return; /* no configuration window */
1528 }
1529
1530 if (qw_skin_data) {
1531 g_free(qw_skin_data);
1532 qw_skin_data = NULL;
1533 }
1534
1535 list = get_qw_skin_list (genprefs[QW_SERVER].real_dir);
1536
1537 if (initstr) {
1538 combo_set_vals (qw_skin_combo, list, initstr);
1539 }
1540 else {
1541 str = g_strdup (gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (qw_skin_combo)->entry)));
1542 combo_set_vals (qw_skin_combo, list, str);
1543 }
1544
1545 if (list) {
1546 qw_skin_data = get_qw_skin (pref_qw_skin, genprefs[QW_SERVER].real_dir);
1547 g_list_foreach (list, (GFunc) g_free, NULL);
1548 g_list_free (list);
1549 }
1550
1551 if (str) {
1552 g_free(str);
1553 }
1554
1555 if (qw_skin_data || qw_skin_is_valid) {
1556 draw_qw_skin (qw_skin_preview, qw_skin_data, pref_qw_top_color, pref_qw_bottom_color);
1557 qw_skin_is_valid = (qw_skin_data)? TRUE : FALSE;
1558 }
1559 }
1560
1561
update_q2_skins(char * initstr)1562 static void update_q2_skins (char *initstr) {
1563 GList *list;
1564 char *str = NULL;
1565
1566 if (q2_skin_preview == NULL) {
1567 return; /* no configuration window */
1568 }
1569
1570 if (q2_skin_data) {
1571 g_free(q2_skin_data);
1572 q2_skin_data = NULL;
1573 }
1574
1575 list = get_q2_skin_list (genprefs[Q2_SERVER].real_dir);
1576
1577 if (initstr) {
1578 combo_set_vals (q2_skin_combo, list, initstr);
1579 }
1580 else {
1581 str = g_strdup (gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (q2_skin_combo)->entry)));
1582 combo_set_vals (q2_skin_combo, list, str);
1583 }
1584
1585 if (list) {
1586 q2_skin_data = get_q2_skin (pref_q2_skin, genprefs[Q2_SERVER].real_dir);
1587 g_list_foreach (list, (GFunc) g_free, NULL);
1588 g_list_free (list);
1589 }
1590
1591 if (str)
1592 g_free(str);
1593
1594 if (q2_skin_data || q2_skin_is_valid) {
1595 draw_q2_skin (q2_skin_preview, q2_skin_data, Q2_SKIN_SCALE);
1596 q2_skin_is_valid = (q2_skin_data)? TRUE : FALSE;
1597 }
1598 }
1599
1600
update_cfgs(enum server_type type,char * dir,char * initstr)1601 static void update_cfgs (enum server_type type, char *dir, char *initstr) {
1602 struct generic_prefs *prefs = &genprefs[type];
1603
1604 GList *cfgs;
1605 char *str = NULL;
1606
1607 debug (5, "update_cfgs(%d,%s,%s)",type,dir,initstr);
1608
1609 if (!prefs->cfg_combo) {
1610 return;
1611 }
1612
1613 cfgs = (*games[type].custom_cfgs) (&games[type], dir, NULL);
1614
1615 if (initstr) {
1616 combo_set_vals (prefs->cfg_combo, cfgs, initstr);
1617 }
1618 else {
1619 str = g_strdup (gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (prefs->cfg_combo)->entry)));
1620 combo_set_vals (prefs->cfg_combo, cfgs, str);
1621 }
1622
1623 if (cfgs) {
1624 g_list_foreach (cfgs, (GFunc) g_free, NULL);
1625 g_list_free (cfgs);
1626 }
1627
1628 if (str) {
1629 g_free(str);
1630 }
1631 }
1632
1633
dir_entry_activate_callback(GtkWidget * widget,gpointer data)1634 static gboolean dir_entry_activate_callback (GtkWidget *widget, gpointer data) {
1635 struct generic_prefs *prefs;
1636 enum server_type type;
1637
1638 type = GPOINTER_TO_INT(gtk_object_get_user_data (GTK_OBJECT (widget)));
1639 prefs = &genprefs[type];
1640
1641 debug (3, "type=%d",type);
1642
1643 if (prefs->pref_dir) g_free(prefs->pref_dir);
1644 prefs->pref_dir = strdup_strip (gtk_entry_get_text (GTK_ENTRY (prefs->dir_entry)));
1645
1646 g_free(prefs->real_dir);
1647 prefs->real_dir = expand_tilde (prefs->pref_dir);
1648
1649 if (games[type].cmd_or_dir_changed) {
1650 games[type].cmd_or_dir_changed(&games[type]);
1651 }
1652
1653 update_cfgs (type, prefs->real_dir, NULL);
1654
1655 return FALSE;
1656 }
1657
1658
qw_skin_combo_changed_callback(GtkWidget * widget,gpointer data)1659 static void qw_skin_combo_changed_callback (GtkWidget *widget, gpointer data) {
1660 char *new_skin;
1661
1662 new_skin = strdup_strip (gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (qw_skin_combo)->entry)));
1663
1664 if (!pref_qw_skin && !new_skin) {
1665 return;
1666 }
1667
1668 if (pref_qw_skin && new_skin) {
1669 if (strcmp (pref_qw_skin, new_skin) == 0) {
1670 g_free(new_skin);
1671 return;
1672 }
1673 }
1674
1675 if (pref_qw_skin) g_free(pref_qw_skin);
1676 pref_qw_skin = new_skin;
1677
1678 if (qw_skin_data) g_free(qw_skin_data);
1679 qw_skin_data = get_qw_skin (pref_qw_skin, genprefs[QW_SERVER].real_dir);
1680
1681 if (qw_skin_data || qw_skin_is_valid) {
1682 draw_qw_skin (qw_skin_preview, qw_skin_data,
1683 pref_qw_top_color, pref_qw_bottom_color);
1684 qw_skin_is_valid = (qw_skin_data)? TRUE : FALSE;
1685 }
1686 }
1687
1688
1689 static GtkWidget *color_button_event_widget = NULL;
1690
1691
set_player_color(GtkWidget * widget,int i)1692 static void set_player_color (GtkWidget *widget, int i) {
1693
1694 if (color_button_event_widget == qw_top_color_button) {
1695 if (pref_qw_top_color != i) {
1696 pref_qw_top_color = i;
1697 set_bg_color (qw_top_color_button, pref_qw_top_color);
1698 if (qw_skin_is_valid) {
1699 draw_qw_skin (qw_skin_preview, qw_skin_data,
1700 pref_qw_top_color, pref_qw_bottom_color);
1701 }
1702 }
1703 return;
1704 }
1705
1706 if (color_button_event_widget == qw_bottom_color_button) {
1707 if (pref_qw_bottom_color != i) {
1708 pref_qw_bottom_color = i;
1709 set_bg_color (qw_bottom_color_button, pref_qw_bottom_color);
1710 if (qw_skin_is_valid) {
1711 draw_qw_skin (qw_skin_preview, qw_skin_data,
1712 pref_qw_top_color, pref_qw_bottom_color);
1713 }
1714 }
1715 return;
1716 }
1717
1718 if (color_button_event_widget == q1_top_color_button) {
1719 if (pref_q1_top_color != i) {
1720 pref_q1_top_color = i;
1721 set_bg_color (q1_top_color_button, pref_q1_top_color);
1722 if (q1_skin_is_valid) {
1723 draw_qw_skin (q1_skin_preview, q1_skin_data,
1724 pref_q1_top_color, pref_q1_bottom_color);
1725 }
1726 }
1727 return;
1728 }
1729
1730 if (color_button_event_widget == q1_bottom_color_button) {
1731 if (pref_q1_bottom_color != i) {
1732 pref_q1_bottom_color = i;
1733 set_bg_color (q1_bottom_color_button, pref_q1_bottom_color);
1734 if (q1_skin_is_valid) {
1735 draw_qw_skin (q1_skin_preview, q1_skin_data,
1736 pref_q1_top_color, pref_q1_bottom_color);
1737 }
1738 }
1739 return;
1740 }
1741 }
1742
1743
color_button_event_callback(GtkWidget * widget,GdkEvent * event)1744 static int color_button_event_callback (GtkWidget *widget, GdkEvent *event) {
1745 GdkEventButton *bevent;
1746
1747 if (event->type == GDK_BUTTON_PRESS) {
1748 bevent = (GdkEventButton *) event;
1749 color_button_event_widget = widget;
1750
1751 if (color_menu == NULL) {
1752 color_menu = create_color_menu (set_player_color);
1753 }
1754
1755 gtk_menu_popup (GTK_MENU (color_menu), NULL, NULL, NULL, NULL,
1756 bevent->button, bevent->time);
1757 return TRUE;
1758 }
1759 return FALSE;
1760 }
1761
1762
q1_skin_box_create(void)1763 static GtkWidget *q1_skin_box_create (void) {
1764 GtkWidget *vbox;
1765 GtkWidget *hbox;
1766 GtkWidget *alignment;
1767 GtkWidget *frame;
1768 GtkWidget *table;
1769 GtkWidget *label;
1770
1771 vbox = gtk_vbox_new (FALSE, 4);
1772 gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
1773
1774 hbox = gtk_hbox_new (FALSE, 4);
1775 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1776
1777 /* Top and Bottom Colors */
1778
1779 table = gtk_table_new (2, 2, FALSE);
1780 gtk_table_set_row_spacings (GTK_TABLE (table), 2);
1781 gtk_table_set_col_spacings (GTK_TABLE (table), 4);
1782 gtk_box_pack_end (GTK_BOX (hbox), table, FALSE, FALSE, 2);
1783
1784 /* Top (Shirt) Color */
1785
1786 label = gtk_label_new (_("Top"));
1787 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
1788 gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1);
1789 gtk_widget_show (label);
1790
1791 q1_top_color_button = gtk_button_new_with_label (" ");
1792 gtk_widget_set_usize (q1_top_color_button, 40, -1);
1793 gtk_signal_connect (GTK_OBJECT (q1_top_color_button), "event",
1794 GTK_SIGNAL_FUNC (color_button_event_callback), NULL);
1795 gtk_table_attach_defaults (GTK_TABLE (table), q1_top_color_button,
1796 1, 2, 0, 1);
1797 set_bg_color (q1_top_color_button, fix_qw_player_color (pref_q1_top_color));
1798 gtk_widget_show (q1_top_color_button);
1799
1800 /* Bottom (Pants) Color */
1801
1802 label = gtk_label_new (_("Bottom"));
1803 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
1804 gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
1805 gtk_widget_show (label);
1806
1807 q1_bottom_color_button = gtk_button_new_with_label (" ");
1808 gtk_widget_set_usize (q1_bottom_color_button, 40, -1);
1809 gtk_signal_connect (GTK_OBJECT (q1_bottom_color_button), "event",
1810 GTK_SIGNAL_FUNC (color_button_event_callback), NULL);
1811 gtk_table_attach_defaults (GTK_TABLE (table), q1_bottom_color_button,
1812 1, 2, 1, 2);
1813 set_bg_color (q1_bottom_color_button,
1814 fix_qw_player_color (pref_q1_bottom_color));
1815 gtk_widget_show (q1_bottom_color_button);
1816
1817 gtk_widget_show (table);
1818
1819 gtk_widget_show (hbox);
1820
1821 /* Skin Preview */
1822
1823 alignment = gtk_alignment_new (0.5, 0.5, 0, 0);
1824 gtk_box_pack_start (GTK_BOX (vbox), alignment, FALSE, FALSE, 0);
1825
1826 frame = gtk_frame_new (NULL);
1827 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
1828 gtk_container_add (GTK_CONTAINER (alignment), frame);
1829
1830 q1_skin_preview = gtk_preview_new (GTK_PREVIEW_COLOR);
1831 gtk_preview_size (GTK_PREVIEW (q1_skin_preview), 320, 200);
1832 gtk_container_add (GTK_CONTAINER (frame), q1_skin_preview);
1833 gtk_widget_show (q1_skin_preview);
1834
1835 gtk_widget_show (frame);
1836
1837 gtk_widget_show (alignment);
1838
1839 gtk_widget_show (vbox);
1840
1841 return vbox;
1842 }
1843
1844
qw_skin_box_create(void)1845 static GtkWidget *qw_skin_box_create (void) {
1846 GtkWidget *vbox;
1847 GtkWidget *hbox;
1848 GtkWidget *alignment;
1849 GtkWidget *frame;
1850 GtkWidget *table;
1851 GtkWidget *label;
1852
1853 vbox = gtk_vbox_new (FALSE, 4);
1854 gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
1855
1856 hbox = gtk_hbox_new (FALSE, 4);
1857 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1858
1859 /* QW Skin ComboBox */
1860
1861 alignment = gtk_alignment_new (0, 0, 0, 0);
1862 gtk_box_pack_start(GTK_BOX (hbox), alignment, FALSE, FALSE, 0);
1863
1864 qw_skin_combo = gtk_combo_new();
1865 gtk_entry_set_max_length(GTK_ENTRY(GTK_COMBO(qw_skin_combo)->entry), 256);
1866 gtk_widget_set_usize(GTK_COMBO(qw_skin_combo)->entry, 112, -1);
1867 gtk_combo_set_use_arrows_always(GTK_COMBO(qw_skin_combo), TRUE);
1868 gtk_combo_set_case_sensitive(GTK_COMBO(qw_skin_combo), TRUE);
1869 gtk_signal_connect (GTK_OBJECT(GTK_COMBO(qw_skin_combo)->entry),
1870 "changed", GTK_SIGNAL_FUNC(qw_skin_combo_changed_callback), NULL);
1871 gtk_container_add(GTK_CONTAINER(alignment), qw_skin_combo);
1872 gtk_widget_show(qw_skin_combo);
1873
1874 gtk_widget_show(alignment);
1875
1876 /* Top and Bottom Colors */
1877
1878 table = gtk_table_new(2, 2, FALSE);
1879 gtk_table_set_row_spacings(GTK_TABLE (table), 2);
1880 gtk_table_set_col_spacings(GTK_TABLE (table), 4);
1881 gtk_box_pack_end(GTK_BOX(hbox), table, FALSE, FALSE, 2);
1882
1883 /* Top (Shirt) Color */
1884
1885 label = gtk_label_new(_("Top"));
1886 gtk_misc_set_alignment(GTK_MISC (label), 0.0, 0.5);
1887 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
1888 gtk_widget_show(label);
1889
1890 qw_top_color_button = gtk_button_new_with_label (" ");
1891 gtk_widget_set_usize (qw_top_color_button, 40, -1);
1892 gtk_signal_connect (GTK_OBJECT (qw_top_color_button), "event",
1893 GTK_SIGNAL_FUNC (color_button_event_callback), NULL);
1894 gtk_table_attach_defaults (GTK_TABLE (table), qw_top_color_button,
1895 1, 2, 0, 1);
1896 set_bg_color (qw_top_color_button, fix_qw_player_color (pref_qw_top_color));
1897 gtk_widget_show (qw_top_color_button);
1898
1899 /* Bottom (Pants) Color */
1900
1901 label = gtk_label_new (_("Bottom"));
1902 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
1903 gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
1904 gtk_widget_show (label);
1905
1906 qw_bottom_color_button = gtk_button_new_with_label (" ");
1907 gtk_widget_set_usize (qw_bottom_color_button, 40, -1);
1908 gtk_signal_connect (GTK_OBJECT (qw_bottom_color_button), "event", GTK_SIGNAL_FUNC (color_button_event_callback), NULL);
1909 gtk_table_attach_defaults (GTK_TABLE (table), qw_bottom_color_button, 1, 2, 1, 2);
1910 set_bg_color (qw_bottom_color_button, fix_qw_player_color (pref_qw_bottom_color));
1911 gtk_widget_show (qw_bottom_color_button);
1912
1913 gtk_widget_show (table);
1914
1915 gtk_widget_show (hbox);
1916
1917 /* Skin Preview */
1918
1919 alignment = gtk_alignment_new (0.5, 0.5, 0, 0);
1920 gtk_box_pack_start (GTK_BOX (vbox), alignment, FALSE, FALSE, 0);
1921
1922 frame = gtk_frame_new (NULL);
1923 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
1924 gtk_container_add (GTK_CONTAINER (alignment), frame);
1925
1926 qw_skin_preview = gtk_preview_new (GTK_PREVIEW_COLOR);
1927 gtk_preview_size (GTK_PREVIEW (qw_skin_preview), 320, 200);
1928 gtk_container_add (GTK_CONTAINER (frame), qw_skin_preview);
1929 gtk_widget_show (qw_skin_preview);
1930
1931 gtk_widget_show (frame);
1932
1933 gtk_widget_show (alignment);
1934
1935 gtk_widget_show (vbox);
1936
1937 return vbox;
1938 }
1939
1940
q2_skin_combo_changed_callback(GtkWidget * widget,gpointer data)1941 static void q2_skin_combo_changed_callback (GtkWidget *widget, gpointer data) {
1942 char *new_skin;
1943
1944 new_skin = strdup_strip (gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (q2_skin_combo)->entry)));
1945
1946 if (!pref_q2_skin && !new_skin) {
1947 return;
1948 }
1949
1950 if (pref_q2_skin && new_skin) {
1951 if (strcmp (pref_q2_skin, new_skin) == 0) {
1952 g_free(new_skin);
1953 return;
1954 }
1955 }
1956
1957 if (pref_q2_skin) g_free(pref_q2_skin);
1958 pref_q2_skin = new_skin;
1959
1960 if (q2_skin_data) g_free(q2_skin_data);
1961 q2_skin_data = get_q2_skin (pref_q2_skin, genprefs[Q2_SERVER].real_dir);
1962
1963 if (q2_skin_data || q2_skin_is_valid) {
1964 draw_q2_skin (q2_skin_preview, q2_skin_data, Q2_SKIN_SCALE);
1965 q2_skin_is_valid = (q2_skin_data)? TRUE : FALSE;
1966 }
1967 }
1968
1969
q2_skin_box_create(void)1970 static GtkWidget *q2_skin_box_create (void) {
1971 GtkWidget *vbox;
1972 GtkWidget *hbox;
1973 GtkWidget *alignment;
1974 GtkWidget *frame;
1975
1976 vbox = gtk_vbox_new(FALSE, 4);
1977 gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
1978
1979 hbox = gtk_hbox_new(FALSE, 4);
1980 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1981
1982 /* Skin Preview */
1983
1984 alignment = gtk_alignment_new(0, 0.5, 0, 0);
1985 gtk_box_pack_start(GTK_BOX(hbox), alignment, FALSE, FALSE, 0);
1986
1987 frame = gtk_frame_new(NULL);
1988 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
1989 gtk_container_add(GTK_CONTAINER(alignment), frame);
1990
1991 q2_skin_preview = gtk_preview_new(GTK_PREVIEW_COLOR);
1992 gtk_preview_size(GTK_PREVIEW(q2_skin_preview), 32 * Q2_SKIN_SCALE, 32 * Q2_SKIN_SCALE);
1993 gtk_container_add(GTK_CONTAINER(frame), q2_skin_preview);
1994 gtk_widget_show(q2_skin_preview);
1995
1996 gtk_widget_show(frame);
1997 gtk_widget_show(alignment);
1998
1999 /* Q2 Skin ComboBox */
2000
2001 alignment = gtk_alignment_new(1.0, 0, 0, 0);
2002 gtk_box_pack_end(GTK_BOX(hbox), alignment, FALSE, FALSE, 0);
2003
2004 q2_skin_combo = gtk_combo_new();
2005 gtk_entry_set_max_length(GTK_ENTRY(GTK_COMBO(q2_skin_combo)->entry), 256);
2006 gtk_widget_set_usize(GTK_COMBO(q2_skin_combo)->entry, 144, -1);
2007 gtk_combo_set_use_arrows_always(GTK_COMBO(q2_skin_combo), TRUE);
2008 gtk_combo_set_case_sensitive(GTK_COMBO(q2_skin_combo), TRUE);
2009 gtk_signal_connect(GTK_OBJECT(GTK_COMBO(q2_skin_combo)->entry), "changed", GTK_SIGNAL_FUNC(q2_skin_combo_changed_callback), NULL);
2010 gtk_container_add(GTK_CONTAINER(alignment), q2_skin_combo);
2011 gtk_widget_show(q2_skin_combo);
2012
2013 gtk_widget_show(alignment);
2014
2015 gtk_widget_show(hbox);
2016
2017 gtk_widget_show(vbox);
2018
2019 return vbox;
2020 }
2021
2022
player_profile_q1_page(void)2023 static GtkWidget *player_profile_q1_page (void) {
2024 GtkWidget *page_vbox;
2025 GtkWidget *alignment;
2026 GtkWidget *frame;
2027 GtkWidget *q1_skin;
2028 GtkWidget *hbox;
2029 GtkWidget *hbox2;
2030 GtkWidget *label;
2031
2032 page_vbox = gtk_vbox_new(FALSE, 8);
2033 gtk_container_set_border_width(GTK_CONTAINER(page_vbox), 6);
2034
2035 hbox = gtk_hbox_new(TRUE, 4);
2036 gtk_box_pack_start(GTK_BOX(page_vbox), hbox, FALSE, FALSE, 0);
2037
2038 // Player Name
2039
2040 hbox2 = gtk_hbox_new(FALSE, 4);
2041 gtk_box_pack_start(GTK_BOX(hbox), hbox2, FALSE, FALSE, 0);
2042
2043 label = gtk_label_new(_("Name"));
2044 gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
2045 gtk_widget_show(label);
2046
2047 name_q1_entry = gtk_entry_new_with_max_length(32);
2048 gtk_widget_set_usize(name_q1_entry, 96, -1);
2049 if (default_q1_name) {
2050 gtk_entry_set_text(GTK_ENTRY(name_q1_entry), default_q1_name);
2051 gtk_entry_set_position(GTK_ENTRY(name_q1_entry), 0);
2052 }
2053 gtk_box_pack_start(GTK_BOX(hbox2), name_q1_entry, FALSE, FALSE, 0);
2054 gtk_widget_show(name_q1_entry);
2055 gtk_widget_show(hbox2);
2056
2057 // /Player Name
2058
2059 /* Q1 Colors */
2060
2061 alignment = gtk_alignment_new(0.5, 0.5, 0, 0);
2062 gtk_box_pack_start(GTK_BOX(page_vbox), alignment, FALSE, FALSE, 0);
2063
2064 frame = gtk_frame_new(_("Colors"));
2065 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
2066 gtk_container_add(GTK_CONTAINER(alignment), frame);
2067
2068 q1_skin = q1_skin_box_create();
2069 gtk_container_add(GTK_CONTAINER(frame), q1_skin);
2070
2071 gtk_widget_show(frame);
2072 gtk_widget_show(alignment);
2073
2074 gtk_widget_show(hbox);
2075 gtk_widget_show(page_vbox);
2076
2077 return page_vbox;
2078 }
2079
player_profile_t2_page(void)2080 static GtkWidget *player_profile_t2_page (void) {
2081 GtkWidget *page_vbox;
2082 GtkWidget *hbox;
2083 GtkWidget *hbox2;
2084 GtkWidget *label;
2085
2086 page_vbox = gtk_vbox_new(FALSE, 8);
2087 gtk_container_set_border_width(GTK_CONTAINER(page_vbox), 6);
2088
2089 hbox = gtk_hbox_new(TRUE, 4);
2090 gtk_box_pack_start(GTK_BOX(page_vbox), hbox, FALSE, FALSE, 0);
2091
2092 // Player Name
2093
2094 hbox2 = gtk_hbox_new(FALSE, 4);
2095 gtk_box_pack_start(GTK_BOX(hbox), hbox2, FALSE, FALSE, 0);
2096
2097 label = gtk_label_new(_("Login name"));
2098 gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
2099 gtk_widget_show(label);
2100
2101 name_t2_entry = gtk_entry_new_with_max_length(32);
2102 gtk_widget_set_usize(name_t2_entry, 96, -1);
2103 if (default_t2_name) {
2104 gtk_entry_set_text(GTK_ENTRY(name_t2_entry), default_t2_name);
2105 gtk_entry_set_position(GTK_ENTRY(name_t2_entry), 0);
2106 }
2107 gtk_box_pack_start(GTK_BOX(hbox2), name_t2_entry, FALSE, FALSE, 0);
2108 gtk_widget_show(name_t2_entry);
2109 gtk_widget_show(hbox2);
2110
2111 // /Player Name
2112
2113 gtk_widget_show(hbox);
2114 gtk_widget_show(page_vbox);
2115
2116 return page_vbox;
2117 }
2118
player_profile_qw_page(void)2119 static GtkWidget *player_profile_qw_page (void) {
2120 GtkWidget *page_vbox;
2121 GtkWidget *alignment;
2122 GtkWidget *frame;
2123 GtkWidget *qw_skin;
2124 GtkWidget *hbox;
2125 GtkWidget *hbox2;
2126 GtkWidget *label;
2127
2128 page_vbox = gtk_vbox_new(FALSE, 8);
2129 gtk_container_set_border_width(GTK_CONTAINER(page_vbox), 6);
2130
2131 hbox = gtk_hbox_new(TRUE, 4);
2132 gtk_box_pack_start(GTK_BOX(page_vbox), hbox, FALSE, FALSE, 0);
2133
2134 /* QW Skin */
2135
2136 alignment = gtk_alignment_new(0.5, 0.5, 0, 0);
2137 gtk_box_pack_start(GTK_BOX(page_vbox), alignment, FALSE, FALSE, 0);
2138
2139 frame = gtk_frame_new(_("Skin/Colors"));
2140 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
2141 gtk_container_add(GTK_CONTAINER(alignment), frame);
2142
2143 qw_skin = qw_skin_box_create();
2144 gtk_container_add(GTK_CONTAINER(frame), qw_skin);
2145
2146 gtk_widget_show(frame);
2147 gtk_widget_show(alignment);
2148
2149 // Player Name
2150
2151 hbox2 = gtk_hbox_new(FALSE, 4);
2152 gtk_box_pack_start(GTK_BOX(hbox), hbox2, FALSE, FALSE, 0);
2153
2154 label = gtk_label_new(_("Name"));
2155 gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
2156 gtk_widget_show(label);
2157
2158 name_qw_entry = gtk_entry_new_with_max_length(32);
2159 gtk_widget_set_usize(name_qw_entry, 96, -1);
2160 if (default_qw_name) {
2161 gtk_entry_set_text(GTK_ENTRY(name_qw_entry), default_qw_name);
2162 gtk_entry_set_position(GTK_ENTRY(name_qw_entry), 0);
2163 }
2164 gtk_box_pack_start(GTK_BOX(hbox2), name_qw_entry, FALSE, FALSE, 0);
2165 gtk_widget_show(name_qw_entry);
2166 gtk_widget_show(hbox2);
2167
2168 // /Player Name
2169
2170 /* QW Team */
2171
2172 hbox2 = gtk_hbox_new(FALSE, 4);
2173 gtk_box_pack_start(GTK_BOX(hbox), hbox2, FALSE, FALSE, 4);
2174
2175 label = gtk_label_new(_("Team"));
2176 gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
2177 gtk_widget_show(label);
2178
2179 team_qw_entry = gtk_entry_new_with_max_length(32);
2180 gtk_widget_set_usize(team_qw_entry, 96, -1);
2181 if (default_qw_team) {
2182 gtk_entry_set_text(GTK_ENTRY(team_qw_entry), default_qw_team);
2183 gtk_entry_set_position(GTK_ENTRY(team_qw_entry), 0);
2184 }
2185 gtk_box_pack_start(GTK_BOX(hbox2), team_qw_entry, FALSE, FALSE, 0);
2186 gtk_widget_show(team_qw_entry);
2187
2188 gtk_widget_show(hbox2);
2189
2190 gtk_widget_show(hbox);
2191
2192 gtk_widget_show(page_vbox);
2193
2194 return page_vbox;
2195 }
2196
2197
player_profile_q2_page(void)2198 static GtkWidget *player_profile_q2_page (void) {
2199 GtkWidget *page_vbox;
2200 GtkWidget *alignment;
2201 GtkWidget *frame;
2202 GtkWidget *q2_skin;
2203 GtkWidget *label;
2204 GtkWidget *hbox;
2205
2206 page_vbox = gtk_vbox_new(FALSE, 8);
2207 gtk_container_set_border_width(GTK_CONTAINER(page_vbox), 8);
2208
2209 // Player Name
2210
2211 hbox = gtk_hbox_new(FALSE, 4);
2212 gtk_box_pack_start(GTK_BOX(page_vbox), hbox, FALSE, FALSE, 0);
2213
2214 label = gtk_label_new(_("Name"));
2215 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
2216 gtk_widget_show(label);
2217
2218 name_q2_entry = gtk_entry_new_with_max_length(32);
2219 gtk_widget_set_usize(name_q2_entry, 96, -1);
2220 if (default_q2_name) {
2221 gtk_entry_set_text(GTK_ENTRY(name_q2_entry), default_q2_name);
2222 gtk_entry_set_position(GTK_ENTRY(name_q2_entry), 0);
2223 }
2224 gtk_box_pack_start(GTK_BOX(hbox), name_q2_entry, FALSE, FALSE, 0);
2225 gtk_widget_show(name_q2_entry);
2226 gtk_widget_show(hbox);
2227
2228 // /Player Name
2229
2230 alignment = gtk_alignment_new(0.5, 0.5, 0, 0);
2231 gtk_box_pack_start(GTK_BOX(page_vbox), alignment, FALSE, FALSE, 0);
2232
2233 frame = gtk_frame_new(_("Model/Skin"));
2234 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
2235 gtk_container_add(GTK_CONTAINER(alignment), frame);
2236
2237 q2_skin = q2_skin_box_create();
2238 gtk_container_add(GTK_CONTAINER(frame), q2_skin);
2239
2240 gtk_widget_show(frame);
2241 gtk_widget_show(alignment);
2242
2243 gtk_widget_show(page_vbox);
2244
2245 return page_vbox;
2246 }
2247
2248 #if 0
2249 static GtkWidget *player_profile_page(void) {
2250 GtkWidget *page_vbox;
2251 GtkWidget *page;
2252 GtkWidget *label;
2253 GtkWidget *hbox;
2254 GtkWidget *game_label;
2255 char *typestr;
2256 enum server_type type = QW_SERVER;
2257
2258 page_vbox = gtk_vbox_new(FALSE, 8);
2259 gtk_container_set_border_width(GTK_CONTAINER(page_vbox), 8);
2260
2261 hbox = gtk_hbox_new(FALSE, 4);
2262 gtk_box_pack_start(GTK_BOX(page_vbox), hbox, FALSE, FALSE, 8);
2263
2264 /* Player Name */
2265
2266 label = gtk_label_new(_("Name"));
2267 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
2268 gtk_widget_show(label);
2269
2270 name_entry = gtk_entry_new_with_max_length(32);
2271 gtk_widget_set_usize(name_entry, 96, -1);
2272 if (default_name) {
2273 gtk_entry_set_text(GTK_ENTRY(name_entry), default_name);
2274 gtk_entry_set_position(GTK_ENTRY(name_entry), 0);
2275 }
2276 gtk_box_pack_start(GTK_BOX(hbox), name_entry, FALSE, FALSE, 0);
2277 gtk_widget_show(name_entry);
2278
2279 gtk_widget_show(hbox);
2280
2281 profile_notebook = gtk_notebook_new();
2282 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(profile_notebook), GTK_POS_TOP);
2283 gtk_notebook_set_tab_hborder(GTK_NOTEBOOK(profile_notebook), 4);
2284 gtk_box_pack_start(GTK_BOX(page_vbox), profile_notebook, FALSE, FALSE, 0);
2285
2286 game_label = game_pixmap_with_label(Q1_SERVER);
2287
2288 page = player_profile_q1_page();
2289 gtk_notebook_append_page(GTK_NOTEBOOK(profile_notebook), page, game_label);
2290
2291 game_label = game_pixmap_with_label(QW_SERVER);
2292
2293 page = player_profile_qw_page();
2294 gtk_notebook_append_page(GTK_NOTEBOOK(profile_notebook), page, game_label);
2295
2296 game_label = game_pixmap_with_label(Q2_SERVER);
2297
2298 page = player_profile_q2_page();
2299 gtk_notebook_append_page(GTK_NOTEBOOK(profile_notebook), page, game_label);
2300
2301 typestr = config_get_string("/" CONFIG_FILE "/Player Profile/game");
2302 if (typestr) {
2303 type = id2type(typestr);
2304 g_free(typestr);
2305 }
2306
2307 gtk_notebook_set_page(GTK_NOTEBOOK(profile_notebook),
2308 (type == Q2_SERVER)? 2 :(type == Q1_SERVER)? 0 : 1);
2309
2310 gtk_widget_show(profile_notebook);
2311
2312 gtk_widget_show(page_vbox);
2313
2314 return page_vbox;
2315 }
2316 #endif
2317
2318
2319 static char *wb_switch_labels[9] = {
2320 N_("--- Anything ---"),
2321 N_("Axe"),
2322 N_("Shotgun"),
2323 N_("Super Shotgun"),
2324 N_("Nailgun"),
2325 N_("Super Nailgun"),
2326 N_("Grenade Launcher"),
2327 N_("Rocket Launcher"),
2328 N_("ThunderBolt")
2329 };
2330
2331
set_w_switch_callback(GtkWidget * widget,int i)2332 static void set_w_switch_callback(GtkWidget *widget, int i) {
2333 pref_w_switch = i;
2334 }
2335
2336
set_b_switch_callback(GtkWidget * widget,int i)2337 static void set_b_switch_callback(GtkWidget *widget, int i) {
2338 pref_b_switch = i;
2339 }
2340
2341
create_wb_switch_menu(void (* callback)(GtkWidget *,int))2342 static GtkWidget *create_wb_switch_menu(void(*callback)(GtkWidget *, int)) {
2343 GtkWidget *menu;
2344 GtkWidget *menu_item;
2345 int i;
2346
2347 menu = gtk_menu_new();
2348
2349 for (i = 0; i < 9; i++) {
2350 menu_item = gtk_menu_item_new_with_label(_(wb_switch_labels[i]));
2351 gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(callback), GINT_TO_POINTER(i));
2352 gtk_menu_append(GTK_MENU(menu), menu_item);
2353 gtk_widget_show(menu_item);
2354 }
2355
2356 return menu;
2357 }
2358
2359
qw_noskins_option_menu_callback(GtkWidget * widget,int i)2360 static void qw_noskins_option_menu_callback (GtkWidget *widget, int i) {
2361 pref_qw_noskins = i;
2362 }
2363
q2_noskins_option_menu_callback(GtkWidget * widget,int i)2364 static void q2_noskins_option_menu_callback (GtkWidget *widget, int i) {
2365 pref_q2_noskins = i;
2366 }
2367
create_noskins_menu(int qworq2)2368 static GtkWidget *create_noskins_menu (int qworq2) {
2369 GtkWidget *menu;
2370 GtkWidget *menu_item;
2371 void(*callback)=qworq2?q2_noskins_option_menu_callback:qw_noskins_option_menu_callback;
2372
2373 menu = gtk_menu_new();
2374
2375 menu_item = gtk_menu_item_new_with_label(_("Use skins"));
2376 gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(callback), (gpointer) 0);
2377 gtk_menu_append(GTK_MENU(menu), menu_item);
2378 gtk_widget_show(menu_item);
2379
2380 menu_item = gtk_menu_item_new_with_label(_("Don\'t use skins"));
2381 gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(callback), (gpointer) 1);
2382 gtk_menu_append(GTK_MENU(menu), menu_item);
2383 gtk_widget_show(menu_item);
2384
2385 menu_item = gtk_menu_item_new_with_label(_("Don\'t download new skins"));
2386 gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(callback), (gpointer) 2);
2387 gtk_menu_append(GTK_MENU(menu), menu_item);
2388 gtk_widget_show(menu_item);
2389
2390 return menu;
2391 }
2392
2393 // fill working directory with result of the directory guess function for first
2394 // token of command line if working directory is empty
pref_guess_dir(enum server_type type,const char * cmdline,gboolean interactive)2395 static void pref_guess_dir(enum server_type type, const char* cmdline, gboolean interactive) {
2396 const char* dir_entry = NULL;
2397
2398 dir_entry = gtk_entry_get_text(GTK_ENTRY(genprefs[type].dir_entry));
2399
2400 if (dir_entry && *dir_entry && !interactive) {
2401 return;
2402 }
2403
2404 if (cmdline && *cmdline) { // if not empty
2405 char *guessed_dir = NULL;
2406 char** cmds = NULL;
2407
2408 cmds = g_strsplit(cmdline," ",2);
2409
2410 if (cmds && *cmds && **cmds) {
2411 guessed_dir = resolve_path(*cmds);
2412 if (guessed_dir) {
2413 gtk_entry_set_text(GTK_ENTRY(genprefs[type].dir_entry), guessed_dir);
2414 }
2415 g_free(guessed_dir);
2416 g_strfreev(cmds);
2417
2418 return;
2419 }
2420
2421 g_strfreev(cmds);
2422 }
2423
2424 if (interactive) {
2425 dialog_ok(NULL, _("You must configure a command line first"));
2426 }
2427 }
2428
2429
2430 /**
2431 * return true if game 'type' has commands to suggest
2432 */
pref_can_suggest(enum server_type type)2433 static gboolean pref_can_suggest(enum server_type type) {
2434 return (games[type].command != NULL);
2435 }
2436
2437 /**
2438 * find game binary in path and fill in command entry
2439 */
pref_suggest_command(enum server_type type)2440 static void pref_suggest_command(enum server_type type) {
2441 char** files = NULL;
2442 char* suggested_file = NULL;
2443 const char* prevcmd = NULL;
2444 unsigned i = 0;
2445
2446 files = games[type].command;
2447 if (!files || !files[0]) {
2448 return;
2449 }
2450
2451 // start suggestion based on last found binary
2452 prevcmd = gtk_entry_get_text(GTK_ENTRY(genprefs[type].cmd_entry));
2453 for (i = 0; prevcmd && files[i]; ++i) {
2454 if (files[i+1] && !strcmp(files[i], prevcmd)) {
2455 files = files+i+1;
2456 break;
2457 }
2458 }
2459
2460 suggested_file = find_file_in_path_list_relative(files);
2461 if (!suggested_file) {
2462 dialog_ok(_("Game not found"),
2463 // %s name of a game
2464 _("%s not found"),
2465 games[type].name);
2466 return;
2467 }
2468
2469 // gtk entry does the freeing? -- no
2470 gtk_entry_set_text(GTK_ENTRY(genprefs[type].cmd_entry), suggested_file);
2471
2472 pref_guess_dir(type, suggested_file, TRUE);
2473
2474 if (games[type].cmd_or_dir_changed) {
2475 games[type].cmd_or_dir_changed(&games[type]);
2476 }
2477
2478 g_free(suggested_file);
2479
2480 return;
2481 }
2482
custom_args_compare_func(gconstpointer ptr1,gconstpointer ptr2)2483 static int custom_args_compare_func (gconstpointer ptr1, gconstpointer ptr2) {
2484 // ptr1 = entire string
2485 // ptr2 = game
2486 gchar *token[2];
2487 gchar *tmpstr;
2488
2489
2490 tmpstr = g_strdup((gchar *)ptr1);
2491 tokenize(tmpstr, token, 2, ",");
2492 g_free(tmpstr);
2493
2494 if (strcasecmp(token[0], ptr2) == 0) {
2495 return (0);
2496 }
2497 else {
2498 return (1);
2499 }
2500 }
2501
add_custom_args_defaults2(char * str1,char * str2,enum server_type type,gpointer data)2502 static void add_custom_args_defaults2 (char *str1, char *str2, enum server_type type, gpointer data) {
2503 char *temp;
2504 char *temp2[2];
2505
2506 temp = g_strconcat(str1, ",", str2, NULL);
2507
2508 temp2[0] = strdup_strip(str1);
2509 temp2[1] = strdup_strip(str2);
2510
2511 if (str1 && str2) {
2512 if (g_slist_find_custom(genprefs[type].custom_args, str1, custom_args_compare_func) == NULL) {
2513 genprefs[type].custom_args = g_slist_append(genprefs[type].custom_args, g_strdup(temp));
2514 gtk_clist_append(GTK_CLIST((GtkCList *) data), temp2);
2515 }
2516 else {
2517 dialog_ok(NULL, _("An entry already exists for the game %s.\n\n"
2518 "A default entry for this game will not be added.\n\n"
2519 "Delete the entry and try again."), str1);
2520 }
2521 }
2522 g_free(temp);
2523 }
2524
2525
2526 // Add default custom arguments
2527 // TODO: implement a proper generic solution
add_custom_args_defaults(GtkWidget * widget,gpointer data)2528 static void add_custom_args_defaults (GtkWidget *widget, gpointer data) {
2529 enum server_type type;
2530
2531 type = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(widget)));
2532
2533 switch(type) {
2534
2535 case UN_SERVER:
2536 add_custom_args_defaults2("s_SWATGame","-ini=TacticalOps.ini",UN_SERVER, data);
2537 add_custom_args_defaults2("SFTeamDM","-ini=StrikeForce.ini -userini=SFUser.ini",UN_SERVER, data);
2538 break;
2539
2540 case UT2_SERVER:
2541 add_custom_args_defaults2("DB_DeathBall",
2542 "-USERLOGO=dbsplash.bmp -INI=DeathBall.ini -USERINI=DBUser.ini",UT2_SERVER, data);
2543 add_custom_args_defaults2("FragOpsMission",
2544 "-INI=FragOps.ini -USERINI=FOUser.ini",UT2_SERVER, data);
2545 break;
2546
2547 case UT2004_SERVER:
2548 add_custom_args_defaults2("ROTeamGame", "-mod=RedOrchestra -log=RedOrchestra.log",UT2004_SERVER, data);
2549 add_custom_args_defaults2("TObjectiveGame", "-mod=Troopers -log=Troopers.log",UT2004_SERVER, data);
2550 add_custom_args_defaults2("TTeamGame", "-mod=Troopers -log=Troopers.log",UT2004_SERVER, data);
2551 add_custom_args_defaults2("TCTFGame", "-mod=Troopers -log=Troopers.log",UT2004_SERVER, data);
2552 add_custom_args_defaults2("AoGameInfo", "-mod=AlienSwarm -log=AlienSwarm.log",UT2004_SERVER, data);
2553 add_custom_args_defaults2("AoCampaignLobbyGame", "-mod=AlienSwarm -log=AlienSwarm.log",UT2004_SERVER, data);
2554 break;
2555
2556 case HL2_SERVER:
2557 add_custom_args_defaults2("cstrike", "-applaunch 240",HL2_SERVER, data);
2558 add_custom_args_defaults2("dod", "-applaunch 300",HL2_SERVER, data);
2559 add_custom_args_defaults2("hl2mp", "-applaunch 320",HL2_SERVER, data);
2560 break;
2561
2562 case HL_SERVER:
2563 add_custom_args_defaults2("cstrike", "-applaunch 10",HL_SERVER, data);
2564 add_custom_args_defaults2("tfc", "-applaunch 20",HL_SERVER, data);
2565 add_custom_args_defaults2("dod", "-applaunch 30",HL_SERVER, data);
2566 add_custom_args_defaults2("dmc", "-applaunch 40",HL_SERVER, data);
2567 add_custom_args_defaults2("op4", "-applaunch 50",HL_SERVER, data);
2568 add_custom_args_defaults2("ricochet", "-applaunch 60",HL_SERVER, data);
2569 add_custom_args_defaults2("valve", "-applaunch 70",HL_SERVER, data);
2570 add_custom_args_defaults2("czero", "-applaunch 80",HL_SERVER, data);
2571 break;
2572
2573 default:
2574 dialog_ok(NULL, _("There are no defaults for this game"));
2575 break;
2576 }
2577 }
2578
new_custom_args_callback(GtkWidget * widget,gpointer data)2579 static void new_custom_args_callback (GtkWidget *widget, gpointer data) {
2580
2581 enum server_type type;
2582
2583 type = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(widget)));
2584
2585 current_row = -1;
2586
2587 gtk_widget_set_sensitive(custom_args_entry_game[type], TRUE);
2588 gtk_widget_set_sensitive(custom_args_entry_args[type], TRUE);
2589 gtk_widget_set_sensitive(custom_args_add_button[type], TRUE);
2590
2591 gtk_entry_set_text(GTK_ENTRY(custom_args_entry_game[type]), "");
2592 gtk_entry_set_text(GTK_ENTRY(custom_args_entry_args[type]), "");
2593
2594 gtk_widget_grab_focus(GTK_WIDGET(custom_args_entry_game[type]));
2595 }
2596
add_custom_args_callback(GtkWidget * widget,gpointer data)2597 static void add_custom_args_callback (GtkWidget *widget, gpointer data) {
2598 GSList *link;
2599 int row;
2600 char *temp[2];
2601 enum server_type type;
2602
2603 type = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(widget)));
2604
2605 temp[0] = strdup_strip(gtk_entry_get_text(GTK_ENTRY(custom_args_entry_game[type])));
2606 temp[1] = strdup_strip(gtk_entry_get_text(GTK_ENTRY(custom_args_entry_args[type])));
2607
2608 if (current_row > -1) {
2609 row = current_row;
2610
2611 link = g_slist_nth(genprefs[type].custom_args, current_row);
2612
2613 genprefs[type].custom_args = g_slist_remove_link(genprefs[type].custom_args, link);
2614
2615 current_row = -1;
2616 gtk_clist_remove(GTK_CLIST((GtkCList *) data), row);
2617 }
2618
2619 if (temp[0] && temp[1]) {
2620 if (g_slist_find_custom(genprefs[type].custom_args, temp[0], custom_args_compare_func) == NULL) {
2621 genprefs[type].custom_args = g_slist_append(genprefs[type].custom_args, g_strconcat(temp[0], ",",temp[1], NULL));
2622
2623 gtk_clist_append(GTK_CLIST((GtkCList *) data), temp);
2624
2625 gtk_widget_set_sensitive(custom_args_entry_game[type], FALSE);
2626 gtk_widget_set_sensitive(custom_args_entry_args[type], FALSE);
2627 gtk_widget_set_sensitive(custom_args_add_button[type], FALSE);
2628
2629 gtk_entry_set_text(GTK_ENTRY(custom_args_entry_game[type]), "");
2630 gtk_entry_set_text(GTK_ENTRY(custom_args_entry_args[type]), "");
2631 }
2632 else
2633 dialog_ok(NULL, _("There is already an entry for this game.\n\nTo modify it, select it from the list, "\
2634 "modify it\nand then click Add/Update."));
2635 }
2636 else
2637 dialog_ok(NULL, _("You must enter both a game and at least one argument."));
2638
2639 g_free(temp[0]);
2640 g_free(temp[1]);
2641 }
2642
delete_custom_args_callback(GtkWidget * widget,gpointer data)2643 static void delete_custom_args_callback (GtkWidget *widget, gpointer data) {
2644 GSList *link;
2645 int row;
2646 enum server_type type;
2647
2648 type = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(widget)));
2649
2650 if (current_row < 0) {
2651 return;
2652 }
2653
2654 row = current_row;
2655
2656 link = g_slist_nth(genprefs[type].custom_args, current_row);
2657
2658 genprefs[type].custom_args = g_slist_remove_link(genprefs[type].custom_args, link);
2659
2660 current_row = -1;
2661 gtk_clist_remove(GTK_CLIST((GtkCList *) data), row);
2662
2663 current_row = -1;
2664
2665 gtk_widget_set_sensitive(custom_args_entry_game[type], FALSE);
2666 gtk_widget_set_sensitive(custom_args_entry_args[type], FALSE);
2667 gtk_widget_set_sensitive(custom_args_add_button[type], FALSE);
2668
2669 gtk_entry_set_text(GTK_ENTRY(custom_args_entry_game[type]), "");
2670 gtk_entry_set_text(GTK_ENTRY(custom_args_entry_args[type]), "");
2671 }
2672
custom_args_clist_select_row_callback(GtkWidget * widget,int row,int column,GdkEventButton * event,GtkCList * clist)2673 static void custom_args_clist_select_row_callback (GtkWidget *widget, int row, int column, GdkEventButton *event, GtkCList *clist) {
2674 enum server_type type;
2675 GSList* item;
2676 char* argstr;
2677 char* game_args[2] = {0} ;
2678
2679 type = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(widget)));
2680
2681 current_row = row;
2682
2683 if (row<0) return;
2684
2685 item = g_slist_nth(genprefs[type].custom_args, row);
2686
2687 if (!item) return;
2688
2689 argstr = g_strdup(item->data);
2690 tokenize(argstr, game_args, 2, ",");
2691
2692 gtk_entry_set_text(GTK_ENTRY(custom_args_entry_game[type]), game_args[0]);
2693 gtk_entry_set_text(GTK_ENTRY(custom_args_entry_args[type]), game_args[1]);
2694
2695 gtk_widget_set_sensitive(custom_args_entry_game[type], TRUE);
2696 gtk_widget_set_sensitive(custom_args_entry_args[type], TRUE);
2697 gtk_widget_set_sensitive(custom_args_add_button[type], TRUE);
2698
2699 g_free(argstr);
2700 }
2701
generic_game_frame(enum server_type type)2702 static GtkWidget *generic_game_frame (enum server_type type) {
2703 GtkWidget *frame;
2704 GtkWidget *vbox;
2705 GtkWidget *page_vbox;
2706 GtkWidget *table;
2707 GtkWidget *label;
2708 GtkWidget *notebook;
2709 GtkWidget *hbox;
2710 GtkWidget *button;
2711 GtkWidget *hbox2 = NULL;
2712 struct generic_prefs *prefs = &genprefs[type];
2713
2714 page_vbox = gtk_vbox_new(FALSE, 4);
2715
2716 frame = gtk_frame_new(NULL);
2717 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_OUT);
2718 label = gtk_label_new(_(games[type].name));
2719 gtk_container_add(GTK_CONTAINER(frame), label);
2720 gtk_widget_show(label);
2721
2722 gtk_box_pack_start(GTK_BOX(page_vbox), frame, FALSE, FALSE, 0);
2723 gtk_widget_show(frame);
2724
2725 notebook = gtk_notebook_new();
2726
2727 vbox = gtk_vbox_new(FALSE, 4);
2728 gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
2729
2730 label = gtk_label_new(_("Invoking"));
2731 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
2732 gtk_widget_show(label);
2733
2734 gtk_box_pack_start(GTK_BOX(page_vbox), notebook, TRUE, TRUE, 0);
2735
2736 if ((games[type].flags & GAME_CONNECT) == 0) {
2737 label = gtk_label_new(_("*** Not Implemented ***"));
2738 gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
2739 gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
2740 gtk_widget_show(label);
2741
2742 gtk_widget_show(vbox);
2743 gtk_widget_show(notebook);
2744 gtk_widget_show(page_vbox);
2745 return page_vbox;
2746 }
2747
2748 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), custom_args_options_page(type), gtk_label_new(_("Custom Args")));
2749
2750 // call game specific function to add its options
2751 if (genprefs[type].add_options_to_notebook) {
2752 genprefs[type].add_options_to_notebook(notebook, type);
2753 }
2754
2755
2756 table = gtk_table_new((games[type].custom_cfgs)? 3 : 2, 2, FALSE);
2757 gtk_table_set_row_spacings(GTK_TABLE(table), 2);
2758 gtk_table_set_col_spacings(GTK_TABLE(table), 4);
2759 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
2760
2761 label = gtk_label_new(_("Command Line"));
2762 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
2763 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
2764 GTK_FILL, GTK_FILL, 0, 0);
2765 gtk_widget_show(label);
2766
2767 hbox = gtk_hbox_new(FALSE, 0);
2768 gtk_table_attach_defaults(GTK_TABLE(table), hbox, 1, 2, 0, 1);
2769 gtk_widget_show(hbox);
2770
2771 genprefs[type].cmd_entry = gtk_entry_new();
2772 if (games[type].cmd) {
2773 gtk_entry_set_text(GTK_ENTRY(genprefs[type].cmd_entry), games[type].cmd);
2774 gtk_entry_set_position(GTK_ENTRY(genprefs[type].cmd_entry), 0);
2775 }
2776 gtk_signal_connect_object(GTK_OBJECT(genprefs[type].cmd_entry), "activate", GTK_SIGNAL_FUNC(game_file_activate_callback), GINT_TO_POINTER(type));
2777 gtk_box_pack_start(GTK_BOX(hbox),genprefs[type].cmd_entry , TRUE, TRUE, 0);
2778 gtk_widget_show(genprefs[type].cmd_entry);
2779
2780 button = gtk_button_new_with_label("...");
2781 gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(game_file_dialog), GINT_TO_POINTER(type));
2782 gtk_box_pack_start(GTK_BOX(hbox),button , FALSE, FALSE, 3);
2783 gtk_widget_show(button);
2784
2785 // translator: button for command suggestion
2786 button = gtk_button_new_with_label(_("Suggest"));
2787 gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(pref_suggest_command), GINT_TO_POINTER(type));
2788 gtk_widget_set_sensitive(button, pref_can_suggest(type));
2789
2790 gtk_box_pack_start(GTK_BOX(hbox),button , FALSE, FALSE, 0);
2791 gtk_tooltips_set_tip(tooltips, button, _("Searches the path for the game executable"), NULL);
2792 gtk_widget_show(button);
2793
2794
2795 /////
2796
2797
2798 label = gtk_label_new(_("Working Directory"));
2799 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
2800 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
2801 gtk_widget_show(label);
2802
2803 hbox = gtk_hbox_new(FALSE, 0);
2804 gtk_table_attach_defaults(GTK_TABLE(table), hbox, 1, 2, 1, 2);
2805 gtk_widget_show(hbox);
2806
2807 genprefs[type].dir_entry = gtk_entry_new();
2808 if (genprefs[type].pref_dir) {
2809 gtk_entry_set_text(GTK_ENTRY(genprefs[type].dir_entry), genprefs[type].pref_dir);
2810 gtk_entry_set_position(GTK_ENTRY(genprefs[type].dir_entry), 0);
2811 }
2812 gtk_box_pack_start(GTK_BOX(hbox),genprefs[type].dir_entry , TRUE, TRUE, 0);
2813
2814 button = gtk_button_new_with_label("...");
2815 gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(game_dir_dialog), (gpointer)type);
2816 gtk_box_pack_start(GTK_BOX(hbox),button , FALSE, FALSE, 3);
2817 gtk_widget_show(button);
2818
2819 // translator: button for directory guess
2820 button = gtk_button_new_with_label(_("Suggest"));
2821 gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(game_file_activate_callback), (gpointer)type);
2822
2823 gtk_box_pack_start(GTK_BOX(hbox),button , FALSE, FALSE, 0);
2824 gtk_tooltips_set_tip(tooltips, button, _("Tries to guess the working directory based on the command line"), NULL);
2825 gtk_widget_show(button);
2826
2827 if (games[type].custom_cfgs) {
2828 gtk_object_set_user_data(GTK_OBJECT(genprefs[type].dir_entry), (gpointer) type);
2829 gtk_signal_connect(GTK_OBJECT(genprefs[type].dir_entry),
2830 "activate",
2831 GTK_SIGNAL_FUNC(dir_entry_activate_callback),
2832 NULL);
2833 gtk_signal_connect(GTK_OBJECT(genprefs[type].dir_entry),
2834 "focus_out_event",
2835 GTK_SIGNAL_FUNC(dir_entry_activate_callback),
2836 NULL);
2837 }
2838 gtk_widget_show(genprefs[type].dir_entry);
2839
2840 if (games[type].custom_cfgs) {
2841 label = gtk_label_new(_("Custom CFG"));
2842 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
2843 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0);
2844 gtk_widget_show(label);
2845
2846 prefs->cfg_combo = gtk_combo_new();
2847 gtk_entry_set_max_length(GTK_ENTRY(GTK_COMBO(prefs->cfg_combo)->entry), 256);
2848 gtk_combo_set_case_sensitive(GTK_COMBO(prefs->cfg_combo), TRUE);
2849 gtk_table_attach_defaults(GTK_TABLE(table), prefs->cfg_combo, 1, 2, 2, 3);
2850 gtk_widget_show(prefs->cfg_combo);
2851 }
2852
2853 // Game specific notes
2854 if (game_get_attribute(type,"game_notes")) {
2855
2856 hbox2 = gtk_hbox_new(FALSE, 0);
2857 gtk_box_pack_end(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0);
2858 gtk_widget_show(hbox2);
2859
2860 label = gtk_label_new(game_get_attribute(type,"game_notes"));
2861
2862 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
2863 gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
2864 gtk_widget_show(label);
2865 }
2866
2867 gtk_widget_show(table);
2868
2869 gtk_widget_show(vbox);
2870
2871 gtk_notebook_set_page(GTK_NOTEBOOK(notebook), 0);
2872
2873 gtk_widget_show(notebook);
2874 gtk_widget_show(page_vbox);
2875
2876 return page_vbox;
2877 }
2878
2879 // Used by user_fix_defaults to add a custom arg
2880
2881
custom_args_options_page(enum server_type type)2882 static GtkWidget *custom_args_options_page (enum server_type type) {
2883 GtkWidget *hbox1;
2884 GtkWidget *vbox1;
2885 GtkWidget *scrolledwindow1;
2886 GtkWidget *arguments_clist;
2887 GtkWidget *game_label;
2888 GtkWidget *arguments_label;
2889 GtkWidget *frame1;
2890 GtkWidget *hbox2;
2891 GtkWidget *vbuttonbox1;
2892 GtkWidget *new_button;
2893 GtkWidget *delete_button;
2894 GtkWidget *defaults_button;
2895 GtkWidget *page_vbox;
2896 struct game *g;
2897 int width;
2898
2899 //tooltips = gtk_tooltips_new();
2900
2901 g = &games[type];
2902
2903 genprefs[type].custom_args = g_slist_copy(g->custom_args);
2904
2905 page_vbox = gtk_vbox_new(FALSE, 4);
2906 gtk_container_set_border_width(GTK_CONTAINER(page_vbox), 8);
2907
2908 hbox1 = gtk_hbox_new(FALSE, 0);
2909 gtk_widget_ref(hbox1);
2910 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "hbox1", hbox1, (GtkDestroyNotify) gtk_widget_unref);
2911 gtk_widget_show(hbox1);
2912 gtk_container_add(GTK_CONTAINER(page_vbox), hbox1);
2913 gtk_container_set_border_width(GTK_CONTAINER(hbox1), 3);
2914
2915 vbox1 = gtk_vbox_new(FALSE, 0);
2916 gtk_widget_ref(vbox1);
2917 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "vbox1", vbox1, (GtkDestroyNotify) gtk_widget_unref);
2918 gtk_widget_show(vbox1);
2919 gtk_box_pack_start(GTK_BOX(hbox1), vbox1, TRUE, TRUE, 0);
2920 gtk_container_set_border_width(GTK_CONTAINER(vbox1), 2);
2921
2922 scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL);
2923 gtk_widget_ref(scrolledwindow1);
2924 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "scrolledwindow1", scrolledwindow1, (GtkDestroyNotify) gtk_widget_unref);
2925 gtk_widget_show(scrolledwindow1);
2926 gtk_box_pack_start(GTK_BOX(vbox1), scrolledwindow1, TRUE, TRUE, 0);
2927 gtk_container_set_border_width(GTK_CONTAINER(scrolledwindow1), 2);
2928 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow1), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2929
2930 arguments_clist = gtk_clist_new(2);
2931 gtk_widget_ref(arguments_clist);
2932 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "arguments_clist", arguments_clist, (GtkDestroyNotify) gtk_widget_unref);
2933 gtk_widget_show(arguments_clist);
2934 gtk_container_add(GTK_CONTAINER(scrolledwindow1), arguments_clist);
2935 gtk_clist_column_titles_show(GTK_CLIST(arguments_clist));
2936 gtk_signal_connect(GTK_OBJECT(arguments_clist), "select_row", GTK_SIGNAL_FUNC(custom_args_clist_select_row_callback), arguments_clist);
2937 gtk_object_set_user_data(GTK_OBJECT(arguments_clist), (gpointer) type);
2938
2939 game_label = gtk_label_new(_("Game"));
2940 gtk_widget_ref(game_label);
2941 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "game_label", game_label, (GtkDestroyNotify) gtk_widget_unref);
2942 gtk_label_set_justify(GTK_LABEL(game_label), GTK_JUSTIFY_LEFT);
2943 gtk_widget_show(game_label);
2944 gtk_clist_set_column_widget(GTK_CLIST(arguments_clist), 0, game_label);
2945
2946 arguments_label = gtk_label_new(_("Arguments"));
2947 gtk_widget_ref(arguments_label);
2948 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "arguments_label", arguments_label, (GtkDestroyNotify) gtk_widget_unref);
2949 gtk_label_set_justify(GTK_LABEL(arguments_label), GTK_JUSTIFY_LEFT);
2950 gtk_widget_show(arguments_label);
2951 gtk_clist_set_column_widget(GTK_CLIST(arguments_clist), 1, arguments_label);
2952
2953 frame1 = gtk_frame_new(_("Game and Arguments"));
2954 gtk_widget_ref(frame1);
2955 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "frame1", frame1, (GtkDestroyNotify) gtk_widget_unref);
2956 gtk_widget_show(frame1);
2957 gtk_box_pack_start(GTK_BOX(vbox1), frame1, FALSE, FALSE, 0);
2958 gtk_container_set_border_width(GTK_CONTAINER(frame1), 3);
2959
2960 hbox2 = gtk_hbox_new(FALSE, 0);
2961 gtk_widget_ref(hbox2);
2962 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "hbox2", hbox2, (GtkDestroyNotify) gtk_widget_unref);
2963 gtk_widget_show(hbox2);
2964 gtk_container_add(GTK_CONTAINER(frame1), hbox2);
2965 gtk_container_set_border_width(GTK_CONTAINER(hbox2), 4);
2966
2967 custom_args_entry_game[type] = gtk_entry_new();
2968 gtk_widget_ref(custom_args_entry_game[type]);
2969 gtk_widget_set_usize(custom_args_entry_game[type], 90, -2);
2970 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "custom_args_entry_game[type]",
2971 custom_args_entry_game[type],
2972 (GtkDestroyNotify) gtk_widget_unref);
2973 gtk_widget_show(custom_args_entry_game[type]);
2974 gtk_box_pack_start(GTK_BOX(hbox2), custom_args_entry_game[type], FALSE, TRUE, 0);
2975 gtk_tooltips_set_tip(tooltips, custom_args_entry_game[type], _("Enter the game name from the game column"), NULL);
2976 gtk_widget_set_sensitive(custom_args_entry_game[type], FALSE);
2977
2978 custom_args_entry_args[type] = gtk_entry_new();
2979 gtk_widget_ref(custom_args_entry_args[type]);
2980 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "custom_args_entry_args[type]",
2981 custom_args_entry_args[type],
2982 (GtkDestroyNotify) gtk_widget_unref);
2983 gtk_widget_show(custom_args_entry_args[type]);
2984 gtk_box_pack_start(GTK_BOX(hbox2), custom_args_entry_args[type], TRUE, TRUE, 0);
2985 gtk_tooltips_set_tip(tooltips, custom_args_entry_args[type], _("Enter the arguments separated by spaces"), NULL);
2986 gtk_widget_set_sensitive(custom_args_entry_args[type], FALSE);
2987
2988 vbuttonbox1 = gtk_vbox_new(FALSE, 0);
2989 gtk_widget_ref(vbuttonbox1);
2990 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "vbuttonbox1", vbuttonbox1, (GtkDestroyNotify) gtk_widget_unref);
2991 gtk_widget_show(vbuttonbox1);
2992 gtk_box_pack_start(GTK_BOX(hbox1), vbuttonbox1, FALSE, TRUE, 0);
2993
2994 new_button = gtk_button_new_with_label(_("New"));
2995 gtk_widget_ref(new_button);
2996 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "new_button", new_button, (GtkDestroyNotify) gtk_widget_unref);
2997 gtk_widget_show(new_button);
2998 gtk_box_pack_start(GTK_BOX(vbuttonbox1), new_button, FALSE, FALSE, 5);
2999 GTK_WIDGET_SET_FLAGS(new_button, GTK_CAN_DEFAULT);
3000
3001 delete_button = gtk_button_new_with_label(_("Delete"));
3002 gtk_widget_ref(delete_button);
3003 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "delete_button", delete_button, (GtkDestroyNotify) gtk_widget_unref);
3004 gtk_widget_show(delete_button);
3005 gtk_box_pack_start(GTK_BOX(vbuttonbox1), delete_button, FALSE, FALSE, 5);
3006 GTK_WIDGET_SET_FLAGS(delete_button, GTK_CAN_DEFAULT);
3007
3008 defaults_button = gtk_button_new_with_label(_("Add Defaults"));
3009 gtk_widget_ref(defaults_button);
3010 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "defaults_button", defaults_button, (GtkDestroyNotify) gtk_widget_unref);
3011 gtk_widget_show(defaults_button);
3012 gtk_box_pack_start(GTK_BOX(vbuttonbox1), defaults_button, FALSE, FALSE, 5);
3013 GTK_WIDGET_SET_FLAGS(defaults_button, GTK_CAN_DEFAULT);
3014
3015 custom_args_add_button[type] = gtk_button_new_with_label(_("Add/Update"));
3016 gtk_widget_ref(custom_args_add_button[type]);
3017 gtk_object_set_data_full(GTK_OBJECT(page_vbox), "add_button", custom_args_add_button[type], (GtkDestroyNotify) gtk_widget_unref);
3018 gtk_widget_show(custom_args_add_button[type]);
3019 gtk_box_pack_end(GTK_BOX(vbuttonbox1), custom_args_add_button[type], FALSE, FALSE, 7);
3020 gtk_widget_set_sensitive(custom_args_add_button[type], FALSE);
3021 GTK_WIDGET_SET_FLAGS(custom_args_add_button[type], GTK_CAN_DEFAULT);
3022
3023 gtk_object_set_user_data(GTK_OBJECT(new_button), (gpointer) type);
3024 gtk_signal_connect(GTK_OBJECT(new_button), "clicked",
3025 GTK_SIGNAL_FUNC(new_custom_args_callback),
3026 (gpointer) arguments_clist);
3027
3028 gtk_object_set_user_data(GTK_OBJECT(delete_button), (gpointer) type);
3029 gtk_signal_connect(GTK_OBJECT(delete_button), "clicked",
3030 GTK_SIGNAL_FUNC(delete_custom_args_callback),
3031 (gpointer) arguments_clist);
3032
3033 gtk_object_set_user_data(GTK_OBJECT(defaults_button), (gpointer) type);
3034 gtk_signal_connect(GTK_OBJECT(defaults_button), "clicked",
3035 GTK_SIGNAL_FUNC(add_custom_args_defaults),
3036 (gpointer) arguments_clist);
3037
3038 gtk_object_set_user_data(GTK_OBJECT(custom_args_add_button[type]), (gpointer) type);
3039 gtk_signal_connect(GTK_OBJECT(custom_args_add_button[type]), "clicked",
3040 GTK_SIGNAL_FUNC(add_custom_args_callback),
3041 (gpointer) arguments_clist);
3042
3043 // Populate clist with custom_args from g_slist
3044 {
3045 GSList *list;
3046 char *token[2];
3047
3048 list = genprefs[type].custom_args;
3049 while (list) {
3050 char* tmp = g_strdup((char *)list->data);
3051 tokenize(tmp, token, 2, ",");
3052 gtk_clist_append(GTK_CLIST(arguments_clist), token);
3053 g_free(tmp);
3054
3055 list = g_slist_next(list);
3056 }
3057 }
3058
3059 width = gtk_clist_optimal_column_width(GTK_CLIST(arguments_clist), 0);
3060 gtk_clist_set_column_width(GTK_CLIST(arguments_clist), 0, width?width:60);
3061 gtk_clist_set_column_width(GTK_CLIST(arguments_clist), 1, gtk_clist_optimal_column_width(GTK_CLIST(arguments_clist), 1));
3062
3063
3064 gtk_widget_show(page_vbox);
3065
3066 return page_vbox;
3067 }
3068
3069
game_listitem_selected_callback(GtkItem * item,enum server_type type)3070 static void game_listitem_selected_callback (GtkItem *item, enum server_type type) {
3071 gtk_notebook_set_page (GTK_NOTEBOOK (games_notebook), type);
3072 }
3073
3074
3075 #define GAMES_COLS 3
3076 #define GAMES_ROWS ((GAMES_TOTAL + GAMES_COLS - 1) / GAMES_COLS)
3077
3078 // create dialog where commandline and working dir for all games are configured
games_config_page(int defgame)3079 static GtkWidget *games_config_page (int defgame) {
3080 GtkWidget *page_vbox;
3081 GtkWidget *frame;
3082 GtkWidget *hbox;
3083 GtkWidget *page;
3084 GtkWidget *label;
3085 GtkWidget *gtklist=NULL;
3086 GtkWidget *scrollwin=NULL;
3087 GtkWidget *games_hbox;
3088 char *typestr;
3089 int i;
3090
3091 page_vbox = gtk_vbox_new (FALSE, 0);
3092 gtk_container_set_border_width (GTK_CONTAINER (page_vbox), 8);
3093
3094 games_hbox = gtk_hbox_new (FALSE, 0);
3095 gtk_container_set_border_width (GTK_CONTAINER (games_hbox), 0);
3096 gtk_box_pack_start (GTK_BOX (page_vbox), games_hbox, TRUE, TRUE, 0);
3097
3098 frame = gtk_frame_new (NULL);
3099 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
3100
3101 scrollwin = gtk_scrolled_window_new (NULL, NULL);
3102
3103 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
3104
3105 gtklist = gtk_list_new ();
3106
3107 gtk_widget_set_usize (gtklist, 136, -1);
3108
3109 // gtk_container_add (GTK_CONTAINER (scrollwin), gtklist);
3110 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollwin), gtklist);
3111
3112 for (i = 0; i < GAMES_TOTAL; i++) {
3113 genprefs[i].game_button = gtk_list_item_new();
3114
3115 gtk_container_add (GTK_CONTAINER (genprefs[i].game_button), game_pixmap_with_label (i));
3116
3117 gtk_signal_connect (GTK_OBJECT (genprefs[i].game_button), "select",
3118 GTK_SIGNAL_FUNC (game_listitem_selected_callback), GINT_TO_POINTER(i));
3119
3120 gtk_widget_show(genprefs[i].game_button);
3121 gtk_container_add (GTK_CONTAINER (gtklist), genprefs[i].game_button);
3122 }
3123
3124 gtk_widget_show(gtklist);
3125 gtk_container_add (GTK_CONTAINER (frame), scrollwin);
3126 gtk_widget_show(scrollwin);
3127 gtk_box_pack_start (GTK_BOX (games_hbox), frame, FALSE, FALSE, 0);
3128 gtk_widget_show (frame);
3129
3130 games_notebook = gtk_notebook_new ();
3131 // the tabs are hidden, so nobody will notice its a notebook
3132 gtk_notebook_set_show_tabs (GTK_NOTEBOOK (games_notebook), FALSE);
3133 gtk_notebook_set_show_border (GTK_NOTEBOOK (games_notebook), FALSE);
3134 gtk_box_pack_start (GTK_BOX (games_hbox), games_notebook, FALSE, FALSE, 15);
3135
3136 for (i = 0; i < GAMES_TOTAL; i++) {
3137 page = generic_game_frame (i);
3138
3139 label = gtk_label_new (games[i].name);
3140 gtk_widget_show (label);
3141
3142 gtk_notebook_append_page (GTK_NOTEBOOK (games_notebook), page, label);
3143 }
3144
3145 if (defgame == UNKNOWN_SERVER) {
3146 defgame = QW_SERVER;
3147 typestr = config_get_string("/" CONFIG_FILE "/Games Config/game");
3148 if (typestr) {
3149 defgame = id2type (typestr);
3150 g_free(typestr);
3151 }
3152 }
3153
3154 if (defgame >= GAMES_TOTAL) {
3155 defgame = QW_SERVER;
3156 }
3157
3158 gtk_notebook_set_page (GTK_NOTEBOOK (games_notebook), defgame);
3159
3160 gtk_list_item_select(GTK_LIST_ITEM(genprefs[defgame].game_button));
3161
3162 gtk_widget_show (games_notebook);
3163
3164 /* Common Options */
3165
3166 frame = gtk_frame_new (_("Common Options"));
3167 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
3168 gtk_box_pack_start (GTK_BOX (page_vbox), frame, FALSE, FALSE, 15);
3169
3170 hbox = gtk_hbox_new (TRUE, 4);
3171 gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
3172 gtk_container_add (GTK_CONTAINER (frame), hbox);
3173
3174 /* Disable CD Audio */
3175
3176 nocdaudio_check_button = gtk_check_button_new_with_label (_("Disable CD Audio"));
3177 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (nocdaudio_check_button), default_nocdaudio);
3178 gtk_box_pack_end (GTK_BOX (hbox), nocdaudio_check_button, TRUE, FALSE, 0);
3179 gtk_widget_show (nocdaudio_check_button);
3180
3181 /* Disable Sound */
3182
3183 nosound_check_button = gtk_check_button_new_with_label (_("Disable Sound"));
3184 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (nosound_check_button), default_nosound);
3185 gtk_box_pack_end (GTK_BOX (hbox), nosound_check_button, TRUE, FALSE, 0);
3186 gtk_widget_show (nosound_check_button);
3187
3188 gtk_widget_show (hbox);
3189 gtk_widget_show (frame);
3190
3191 gtk_widget_show (page_vbox);
3192
3193 gtk_widget_show (games_hbox);
3194
3195 return page_vbox;
3196 }
3197
3198
add_pushlatency_options(GtkWidget * vbox)3199 static void add_pushlatency_options (GtkWidget *vbox) {
3200 GtkWidget *hbox;
3201 GtkObject *adj;
3202 GSList *group = NULL;
3203 int i;
3204
3205 static const char *pushlatency_modes[] = {
3206 N_("Do not set (use game default)"),
3207 N_("Automatically calculate from server ping time"),
3208 N_("Fixed value")
3209 };
3210
3211 for (i = 0; i < 3; i++) {
3212 hbox = gtk_hbox_new (FALSE, 4);
3213 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
3214
3215 pushlatency_mode_radio_buttons[i] = gtk_radio_button_new_with_label (group, _(pushlatency_modes[i]));
3216 group = gtk_radio_button_group (GTK_RADIO_BUTTON (pushlatency_mode_radio_buttons[i]));
3217 gtk_box_pack_start (GTK_BOX (hbox), pushlatency_mode_radio_buttons[i], FALSE, FALSE, 0);
3218 gtk_widget_show (pushlatency_mode_radio_buttons[i]);
3219
3220 gtk_widget_show (hbox);
3221 }
3222
3223 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pushlatency_mode_radio_buttons[pushlatency_mode]), TRUE);
3224
3225 adj = gtk_adjustment_new (pushlatency_value, -1000.0, -10.0, 10.0, 50.0, 0.0);
3226
3227 pushlatency_value_spinner = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 0, 0);
3228 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (pushlatency_value_spinner), GTK_UPDATE_ALWAYS);
3229 gtk_widget_set_usize (pushlatency_value_spinner, 64, -1);
3230 gtk_box_pack_start (GTK_BOX (hbox), pushlatency_value_spinner, FALSE, FALSE, 0);
3231 gtk_widget_show (pushlatency_value_spinner);
3232 }
3233
get_pref_widgets_for_game(enum server_type type)3234 static struct q3_common_prefs_s* get_pref_widgets_for_game(enum server_type type) {
3235 switch(type) {
3236 case Q3_SERVER: return &q3_prefs;
3237 case Q4_SERVER: return &q4_prefs;
3238 case WO_SERVER: return &wo_prefs;
3239 case WOET_SERVER: return &woet_prefs;
3240 case ETL_SERVER: return &etl_prefs;
3241 case DOOM3_SERVER: return &doom3_prefs;
3242 case ETQW_SERVER: return &etqw_prefs;
3243 case EF_SERVER: return &ef_prefs;
3244 case SOF2S_SERVER: return &sof2_prefs;
3245 case COD_SERVER: return &cod_prefs;
3246 case JK2_SERVER: return &jk2_prefs;
3247 case JK3_SERVER: return &jk3_prefs;
3248 case NEXUIZ_SERVER: return &nexuiz_prefs;
3249 case XONOTIC_SERVER: return &xonotic_prefs;
3250 case WARSOW_SERVER: return &warsow_prefs;
3251 case TREMULOUS_SERVER: return &tremulous_prefs;
3252 case TREMULOUSGPP_SERVER: return &tremulousgpp_prefs;
3253 case TREMFUSION_SERVER: return &tremfusion_prefs;
3254 case UNVANQUISHED_SERVER: return &unvanquished_prefs;
3255 case OPENARENA_SERVER: return &openarena_prefs;
3256 case Q3RALLY_SERVER: return &q3rally_prefs;
3257 case WOP_SERVER: return &wop_prefs;
3258 case IOURT_SERVER: return &iourt_prefs;
3259 case REACTION_SERVER: return &reaction_prefs;
3260 case SMOKINGUNS_SERVER: return &smokinguns_prefs;
3261 case ZEQ2LITE_SERVER: return &zeq2lite_prefs;
3262 case TURTLEARENA_SERVER: return &turtlearena_prefs;
3263 case ALIENARENA_SERVER: return &alienarena_prefs;
3264 default: xqf_error("need to define preferences"); return NULL;
3265 }
3266 }
3267
q3_options_page(enum server_type type)3268 static GtkWidget *q3_options_page (enum server_type type) {
3269 GtkWidget *page_vbox;
3270 GtkWidget *hbox;
3271 GtkWidget *label;
3272
3273 struct q3_common_prefs_s* w = get_pref_widgets_for_game(type);
3274
3275 page_vbox = gtk_vbox_new (FALSE, 4);
3276 gtk_container_set_border_width (GTK_CONTAINER (page_vbox), 8);
3277
3278 if (w->protocols) {
3279 hbox = gtk_hbox_new (FALSE, 8);
3280 gtk_box_pack_start (GTK_BOX (page_vbox), hbox, FALSE, FALSE, 0);
3281
3282 label = gtk_label_new (_("Masterserver Protocol Version"));
3283 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
3284 gtk_widget_show (label);
3285
3286 w->proto_entry = gtk_combo_new ();
3287 gtk_combo_set_use_arrows_always (GTK_COMBO (w->proto_entry), TRUE);
3288 gtk_combo_set_popdown_strings(GTK_COMBO (w->proto_entry), createGListfromchar((char**)w->protocols));
3289 gtk_list_set_selection_mode (GTK_LIST (GTK_COMBO (w->proto_entry)->list), GTK_SELECTION_BROWSE);
3290
3291 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (w->proto_entry)->entry), game_get_attribute(type,"masterprotocol"));
3292
3293 gtk_box_pack_start (GTK_BOX (hbox), w->proto_entry, FALSE, FALSE, 0);
3294 gtk_widget_show (w->proto_entry);
3295
3296 gtk_widget_show (hbox);
3297
3298 }
3299
3300 if (w->flags & Q3_PREF_SETFS_GAME) {
3301 w->setfs_gamebutton = gtk_check_button_new_with_label (_("set fs_game on connect"));
3302 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w->setfs_gamebutton), str2bool(game_get_attribute(type,"setfs_game")));
3303 gtk_box_pack_start (GTK_BOX (page_vbox), w->setfs_gamebutton, FALSE, FALSE, 0);
3304 gtk_widget_show (w->setfs_gamebutton);
3305 }
3306
3307 if (w->flags & Q3_PREF_PB) {
3308 w->set_punkbusterbutton = gtk_check_button_new_with_label (_("set cl_punkbuster on connect"));
3309 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w->set_punkbusterbutton), str2bool(game_get_attribute(type,"set_punkbuster")));
3310 gtk_box_pack_start (GTK_BOX (page_vbox), w->set_punkbusterbutton, FALSE, FALSE, 0);
3311 gtk_widget_show (w->set_punkbusterbutton);
3312 }
3313
3314 if (w->flags & Q3_PREF_CONSOLE) {
3315 w->console_button = gtk_check_button_new_with_label (_("enable console"));
3316 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w->console_button), str2bool(game_get_attribute(type,"enable_console")));
3317 gtk_box_pack_start (GTK_BOX (page_vbox), w->console_button, FALSE, FALSE, 0);
3318 gtk_widget_show (w->console_button);
3319 }
3320
3321 gtk_widget_show (page_vbox);
3322
3323 return page_vbox;
3324 }
3325
q3_set_memory_callback(GtkWidget * widget,int what)3326 static void q3_set_memory_callback (GtkWidget *widget, int what) {
3327 int com_hunkmegs = 56;
3328 int com_zonemegs = 16;
3329 int com_soundmegs = 8;
3330 int cg_precachedmodels = 3;
3331
3332 if (what == 1) {
3333 com_hunkmegs = 72;
3334 com_zonemegs = 24;
3335 com_soundmegs = 16;
3336 cg_precachedmodels = 6;
3337 }
3338 else if (what == 2) {
3339 com_hunkmegs = 96;
3340 com_zonemegs = 24;
3341 com_soundmegs = 16;
3342 cg_precachedmodels = 15;
3343 }
3344
3345 gtk_adjustment_set_value(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(com_hunkmegs_spinner)), com_hunkmegs);
3346 gtk_adjustment_set_value(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(com_zonemegs_spinner)), com_zonemegs);
3347 gtk_adjustment_set_value(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(com_soundmegs_spinner)), com_soundmegs);
3348 gtk_adjustment_set_value(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(cg_precachedmodels_spinner)), cg_precachedmodels);
3349 }
3350
q3_mem_options_page(void)3351 static GtkWidget *q3_mem_options_page (void) {
3352 GtkWidget *page_vbox;
3353 GtkWidget *hbox;
3354 GtkWidget *hbox2;
3355 GtkWidget *label;
3356 GtkWidget *frame;
3357 GtkObject *adj;
3358 GtkWidget *button;
3359
3360 int pass_memory_options = str2bool(game_get_attribute(Q3_SERVER,"pass_memory_options"));
3361 int com_hunkmegs = atoi(game_get_attribute(Q3_SERVER,"com_hunkmegs"));
3362 int com_zonemegs = atoi(game_get_attribute(Q3_SERVER,"com_zonemegs"));
3363 int com_soundmegs = atoi(game_get_attribute(Q3_SERVER,"com_soundmegs"));
3364 int cg_precachedmodels = atoi(game_get_attribute(Q3_SERVER,"cg_precachedmodels"));
3365
3366 page_vbox = gtk_vbox_new (FALSE, 4);
3367 gtk_container_set_border_width (GTK_CONTAINER (page_vbox), 8);
3368
3369 pass_memory_options_button = gtk_check_button_new_with_label (_("Pass memory settings on command line"));
3370 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pass_memory_options_button), pass_memory_options);
3371 gtk_box_pack_start (GTK_BOX (page_vbox), pass_memory_options_button, FALSE, FALSE, 0);
3372 gtk_widget_show (pass_memory_options_button);
3373
3374 hbox = gtk_hbox_new (FALSE, 8);
3375 gtk_box_pack_start (GTK_BOX (page_vbox), hbox, FALSE, FALSE, 0);
3376
3377 adj = gtk_adjustment_new (com_hunkmegs, 32, 1024, 8, 32, 0);
3378 com_hunkmegs_spinner = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 0, 0);
3379 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (com_hunkmegs_spinner), GTK_UPDATE_ALWAYS);
3380 gtk_widget_set_usize (com_hunkmegs_spinner, 64, -1);
3381
3382 gtk_box_pack_start (GTK_BOX (hbox), com_hunkmegs_spinner, FALSE, FALSE, 0);
3383 gtk_widget_show (com_hunkmegs_spinner);
3384
3385 // Mega Byte
3386 label = gtk_label_new (_("MB"));
3387 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
3388 gtk_widget_show (label);
3389
3390 label = gtk_label_new (_("com_hunkmegs"));
3391 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
3392 gtk_widget_show (label);
3393
3394 gtk_widget_show (hbox);
3395
3396 hbox = gtk_hbox_new (FALSE, 8);
3397 gtk_box_pack_start (GTK_BOX (page_vbox), hbox, FALSE, FALSE, 0);
3398
3399 adj = gtk_adjustment_new (com_zonemegs, 16, 1024, 4, 8, 0);
3400 com_zonemegs_spinner = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 0, 0);
3401 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (com_zonemegs_spinner), GTK_UPDATE_ALWAYS);
3402 gtk_widget_set_usize (com_zonemegs_spinner, 64, -1);
3403
3404 gtk_box_pack_start (GTK_BOX (hbox), com_zonemegs_spinner, FALSE, FALSE, 0);
3405 gtk_widget_show (com_zonemegs_spinner);
3406
3407 // Mega Byte
3408 label = gtk_label_new (_("MB"));
3409 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
3410 gtk_widget_show (label);
3411
3412 label = gtk_label_new (_("com_zonemegs"));
3413 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
3414 gtk_widget_show (label);
3415
3416 gtk_widget_show (hbox);
3417
3418 hbox = gtk_hbox_new (FALSE, 8);
3419 gtk_box_pack_start (GTK_BOX (page_vbox), hbox, FALSE, FALSE, 0);
3420
3421 adj = gtk_adjustment_new (com_soundmegs, 16, 1024, 4, 8, 0);
3422 com_soundmegs_spinner = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 0, 0);
3423 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (com_soundmegs_spinner), GTK_UPDATE_ALWAYS);
3424 gtk_widget_set_usize (com_soundmegs_spinner, 64, -1);
3425
3426 gtk_box_pack_start (GTK_BOX (hbox), com_soundmegs_spinner, FALSE, FALSE, 0);
3427 gtk_widget_show (com_soundmegs_spinner);
3428
3429 // Mega Byte
3430 label = gtk_label_new (_("MB"));
3431 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
3432 gtk_widget_show (label);
3433
3434 label = gtk_label_new (_("com_soundmegs"));
3435 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
3436 gtk_widget_show (label);
3437
3438 gtk_widget_show (hbox);
3439
3440 hbox = gtk_hbox_new (FALSE, 8);
3441 gtk_box_pack_start (GTK_BOX (page_vbox), hbox, FALSE, FALSE, 0);
3442
3443 // value, lower, upper, step_increment, page_increment, page_size
3444 adj = gtk_adjustment_new (cg_precachedmodels, 2, 32, 1, 4, 0);
3445 cg_precachedmodels_spinner = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 0, 0);
3446 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (cg_precachedmodels_spinner), GTK_UPDATE_ALWAYS);
3447 gtk_widget_set_usize (cg_precachedmodels_spinner, 64, -1);
3448
3449 gtk_box_pack_start (GTK_BOX (hbox), cg_precachedmodels_spinner, FALSE, FALSE, 0);
3450 gtk_widget_show (cg_precachedmodels_spinner);
3451
3452 // Mega Byte
3453 label = gtk_label_new (_("MB"));
3454 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
3455 gtk_widget_show (label);
3456
3457 label = gtk_label_new (_("cg_precachedmodels"));
3458 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
3459 gtk_widget_show (label);
3460
3461 gtk_widget_show (hbox);
3462
3463 hbox = gtk_hbox_new (FALSE, 0);
3464 gtk_box_pack_start (GTK_BOX (page_vbox), hbox, FALSE, FALSE, 8);
3465
3466 frame = gtk_frame_new (_("Preset values"));
3467 gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, FALSE, 0);
3468
3469 hbox2 = gtk_hbox_new (FALSE, 8);
3470 gtk_container_set_border_width(GTK_CONTAINER(hbox2),8);
3471 gtk_container_add (GTK_CONTAINER (frame), hbox2);
3472
3473 button = gtk_button_new_with_label(_("Default"));
3474 gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
3475 gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (q3_set_memory_callback), (gpointer) 0);
3476 gtk_widget_show (button);
3477
3478 button = gtk_button_new_with_label(_("128MB"));
3479 gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
3480 gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (q3_set_memory_callback), (gpointer) 1);
3481 gtk_widget_show (button);
3482
3483 button = gtk_button_new_with_label(_(">256MB"));
3484 gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
3485 gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (q3_set_memory_callback), (gpointer) 2);
3486 gtk_widget_show (button);
3487
3488 gtk_widget_show (hbox2);
3489
3490 gtk_widget_show (frame);
3491
3492 gtk_widget_show (hbox);
3493
3494 gtk_widget_show (page_vbox);
3495
3496 return page_vbox;
3497 }
3498
add_q3_options_to_notebook(GtkWidget * notebook,enum server_type type)3499 void add_q3_options_to_notebook(GtkWidget *notebook, enum server_type type) {
3500 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), q3_options_page(type), gtk_label_new (_("Options")));
3501
3502 if (type == Q3_SERVER) {
3503 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), q3_mem_options_page(), gtk_label_new (_("Memory")));
3504 }
3505 }
3506
add_un_options_to_notebook(GtkWidget * notebook,enum server_type type)3507 void add_un_options_to_notebook(GtkWidget *notebook, enum server_type type) {
3508 }
3509
add_ut2_options_to_notebook(GtkWidget * notebook,enum server_type type)3510 void add_ut2_options_to_notebook(GtkWidget *notebook, enum server_type type) {
3511 }
3512
qw_options_page(void)3513 static GtkWidget *qw_options_page (void) {
3514 GtkWidget *page_vbox;
3515 GtkWidget *label;
3516 GtkWidget *frame2;
3517 GtkWidget *hbox;
3518 GtkWidget *vbox2;
3519 GtkWidget *option_menu;
3520
3521 debug (5, "qw_options_page()");
3522
3523 page_vbox = gtk_vbox_new (FALSE, 4);
3524 gtk_container_set_border_width (GTK_CONTAINER (page_vbox), 8);
3525
3526 /* QW Specific Features */
3527
3528
3529 /* 'w_switch' & 'b_switch' control */
3530
3531 frame2 = gtk_frame_new (_("The highest weapon that Quake should switch to..."));
3532 gtk_box_pack_start (GTK_BOX (page_vbox), frame2, FALSE, FALSE, 0);
3533
3534 vbox2 = gtk_vbox_new (FALSE, 0);
3535 gtk_container_set_border_width (GTK_CONTAINER (vbox2), 6);
3536 gtk_container_add (GTK_CONTAINER (frame2), vbox2);
3537
3538 /* 'w_switch' */
3539
3540 hbox = gtk_hbox_new (FALSE, 4);
3541 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
3542
3543 label = gtk_label_new (_("upon a weapon pickup"));
3544 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
3545 gtk_widget_show (label);
3546
3547 option_menu = gtk_option_menu_new ();
3548 gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), create_wb_switch_menu (set_w_switch_callback));
3549 gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), pref_w_switch);
3550 gtk_box_pack_end (GTK_BOX (hbox), option_menu, FALSE, FALSE, 0);
3551 gtk_widget_show (option_menu);
3552
3553 gtk_widget_show (hbox);
3554
3555 /* 'b_switch' */
3556
3557 hbox = gtk_hbox_new (FALSE, 4);
3558 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
3559
3560 label = gtk_label_new (_("upon a backpack pickup"));
3561 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
3562 gtk_widget_show (label);
3563
3564 option_menu = gtk_option_menu_new ();
3565 gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), create_wb_switch_menu (set_b_switch_callback));
3566 gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), pref_b_switch);
3567 gtk_box_pack_end (GTK_BOX (hbox), option_menu, FALSE, FALSE, 0);
3568 gtk_widget_show (option_menu);
3569
3570 gtk_widget_show (hbox);
3571 gtk_widget_show (vbox2);
3572 gtk_widget_show (frame2);
3573
3574 /* 'noaim' */
3575
3576 hbox = gtk_hbox_new (FALSE, 8);
3577 gtk_box_pack_start (GTK_BOX (page_vbox), hbox, FALSE, FALSE, 10);
3578
3579 noaim_check_button = gtk_check_button_new_with_label (_("Disable auto-aiming"));
3580 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (noaim_check_button), default_noaim);
3581 gtk_box_pack_start (GTK_BOX (hbox), noaim_check_button, FALSE, FALSE, 0);
3582 gtk_widget_show (noaim_check_button);
3583
3584 gtk_widget_show (hbox);
3585
3586 gtk_widget_show (page_vbox);
3587
3588 return page_vbox;
3589
3590 }
3591
3592 // qworq2: 0=qw/1=q2
qw_q2_options_page(int qworq2)3593 static GtkWidget *qw_q2_options_page (int qworq2) {
3594 GtkWidget *page_vbox;
3595 GtkWidget *label;
3596 GtkWidget *frame2;
3597 GtkWidget *hbox;
3598 GtkWidget *hbox2;
3599 GtkWidget *vbox2;
3600 GtkWidget *option_menu;
3601 GtkObject *adj;
3602
3603 debug (5, "qw_q2_options_page(%d)",qworq2);
3604
3605 page_vbox = gtk_vbox_new (FALSE, 4);
3606 gtk_container_set_border_width (GTK_CONTAINER (page_vbox), 8);
3607
3608 hbox = gtk_hbox_new (FALSE, 16);
3609 gtk_box_pack_start (GTK_BOX (page_vbox), hbox, FALSE, FALSE, 0);
3610
3611 /* Skins */
3612
3613 hbox2 = gtk_hbox_new (FALSE, 4);
3614 gtk_box_pack_start (GTK_BOX (hbox), hbox2, FALSE, FALSE, 0);
3615
3616 label = gtk_label_new (_("Skins"));
3617 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
3618 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
3619 gtk_widget_show (label);
3620
3621 option_menu = gtk_option_menu_new ();
3622 gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), create_noskins_menu (qworq2));
3623 gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), qworq2?pref_q2_noskins:pref_qw_noskins);
3624 gtk_box_pack_end (GTK_BOX (hbox2), option_menu, FALSE, FALSE, 0);
3625 gtk_widget_show (option_menu);
3626
3627 gtk_widget_show (hbox2);
3628
3629 /* Network Options */
3630
3631 /* Rate */
3632
3633 hbox2 = gtk_hbox_new (FALSE, 4);
3634 gtk_box_pack_end (GTK_BOX (hbox), hbox2, FALSE, FALSE, 0);
3635
3636 label = gtk_label_new (_("Rate"));
3637 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
3638 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
3639 gtk_widget_show (label);
3640
3641 adj = gtk_adjustment_new (qworq2?default_q2_rate:default_qw_rate, 0.0, 25000.0, 500.0, 1000.0, 0.0);
3642
3643 rate_spinner[qworq2] = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 0, 0);
3644 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (rate_spinner[qworq2]), GTK_UPDATE_ALWAYS);
3645 gtk_widget_set_usize (rate_spinner[qworq2], 64, -1);
3646 gtk_box_pack_end (GTK_BOX (hbox2), rate_spinner[qworq2], FALSE, FALSE, 0);
3647 gtk_widget_show (rate_spinner[qworq2]);
3648
3649 gtk_widget_show (hbox2);
3650
3651 gtk_widget_show (hbox);
3652
3653 /* QW Specific Features */
3654 if (qworq2 == 0) {
3655 /* 'pushlatency' */
3656
3657 frame2 = gtk_frame_new (_("pushlatency"));
3658 gtk_box_pack_start (GTK_BOX (page_vbox), frame2, FALSE, FALSE, 10);
3659
3660 vbox2 = gtk_vbox_new (FALSE, 2);
3661 gtk_container_set_border_width (GTK_CONTAINER (vbox2), 6);
3662 gtk_container_add (GTK_CONTAINER (frame2), vbox2);
3663
3664 add_pushlatency_options (vbox2);
3665
3666 gtk_widget_show (vbox2);
3667 gtk_widget_show (frame2);
3668 }
3669
3670 /* Troubleshooting */
3671
3672 frame2 = gtk_frame_new (_("Troubleshooting"));
3673 gtk_box_pack_start (GTK_BOX (page_vbox), frame2, FALSE, FALSE, 10);
3674
3675 vbox2 = gtk_vbox_new (FALSE, 0);
3676 gtk_container_set_border_width (GTK_CONTAINER (vbox2), 6);
3677 gtk_container_add (GTK_CONTAINER (frame2), vbox2);
3678
3679 /* 'cl_nodelta' */
3680
3681 hbox = gtk_hbox_new (FALSE, 8);
3682 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
3683
3684 cl_nodelta_check_button[qworq2] = gtk_check_button_new_with_label (
3685 _("Disable delta-compression (cl_nodelta)"));
3686 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cl_nodelta_check_button[qworq2]),
3687 qworq2?default_q2_cl_nodelta:default_qw_cl_nodelta);
3688 gtk_box_pack_start (GTK_BOX (hbox), cl_nodelta_check_button[qworq2], FALSE, FALSE, 0);
3689 gtk_widget_show (cl_nodelta_check_button[qworq2]);
3690
3691 gtk_widget_show (hbox);
3692
3693 /* 'cl_predict_players' ('cl_predict' in Q2) */
3694
3695 hbox = gtk_hbox_new (FALSE, 8);
3696 gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
3697
3698 cl_predict_check_button[qworq2] = gtk_check_button_new_with_label (
3699 _("Disable player/entity prediction (cl_predict_players)"));
3700 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cl_predict_check_button[qworq2]),
3701 1 - (qworq2?default_q2_cl_predict:default_qw_cl_predict));
3702 gtk_box_pack_start (GTK_BOX (hbox), cl_predict_check_button[qworq2], FALSE, FALSE, 0);
3703 gtk_widget_show (cl_predict_check_button[qworq2]);
3704
3705 gtk_widget_show (hbox);
3706
3707 gtk_widget_show (vbox2);
3708 gtk_widget_show (frame2);
3709
3710 gtk_widget_show (page_vbox);
3711
3712 return page_vbox;
3713 }
3714
add_qw_options_to_notebook(GtkWidget * notebook,enum server_type type)3715 void add_qw_options_to_notebook(GtkWidget *notebook, enum server_type type) {
3716 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), qw_options_page(), gtk_label_new (_("Weapons")));
3717 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), qw_q2_options_page(0), gtk_label_new (_("Options")));
3718 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), player_profile_qw_page(), gtk_label_new (_("Player Profile")));
3719 }
3720
add_q2_options_to_notebook(GtkWidget * notebook,enum server_type type)3721 void add_q2_options_to_notebook(GtkWidget *notebook, enum server_type type) {
3722 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), qw_q2_options_page(1), gtk_label_new (_("Options")));
3723 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), player_profile_q2_page(), gtk_label_new (_("Player Profile")));
3724 }
3725
add_q1_options_to_notebook(GtkWidget * notebook,enum server_type type)3726 void add_q1_options_to_notebook(GtkWidget *notebook, enum server_type type) {
3727 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), player_profile_q1_page(), gtk_label_new (_("Player Profile")));
3728 }
3729
add_t2_options_to_notebook(GtkWidget * notebook,enum server_type type)3730 void add_t2_options_to_notebook(GtkWidget *notebook, enum server_type type) {
3731 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), player_profile_t2_page(), gtk_label_new (_("Player Profile")));
3732 }
3733
terminate_toggled_callback(GtkWidget * widget,gpointer data)3734 static void terminate_toggled_callback (GtkWidget *widget, gpointer data) {
3735 int val;
3736
3737 val = GTK_TOGGLE_BUTTON (terminate_check_button)->active;
3738 gtk_widget_set_sensitive (iconify_check_button, TRUE - val);
3739 }
3740
launchinfo_toggled_callback(GtkWidget * widget,gpointer data)3741 static void launchinfo_toggled_callback (GtkWidget *widget, gpointer data) {
3742 int val;
3743
3744 val = GTK_TOGGLE_BUTTON (launchinfo_check_button)->active;
3745 }
3746
prelaunchexec_toggled_callback(GtkWidget * widget,gpointer data)3747 static void prelaunchexec_toggled_callback (GtkWidget *widget, gpointer data) {
3748 int val;
3749
3750 val = GTK_TOGGLE_BUTTON (prelaunchexec_check_button)->active;
3751 }
3752
3753 /** make entries editable if yes == TRUE */
sound_set_widgets_sensitive(gboolean yes)3754 static void sound_set_widgets_sensitive(gboolean yes) {
3755 gtk_widget_set_sensitive (sound_player_entry, yes);
3756 gtk_widget_set_sensitive (sound_xqf_start_entry, yes);
3757 gtk_widget_set_sensitive (sound_xqf_quit_entry, yes);
3758 gtk_widget_set_sensitive (sound_update_done_entry, yes);
3759 gtk_widget_set_sensitive (sound_refresh_done_entry, yes);
3760 gtk_widget_set_sensitive (sound_stop_entry, yes);
3761 gtk_widget_set_sensitive (sound_redial_success_entry, yes);
3762 gtk_widget_set_sensitive (sound_server_connect_entry, yes);
3763
3764 gtk_widget_set_sensitive (sound_player_file_dialog_button, yes);
3765 gtk_widget_set_sensitive (sound_xqf_start_file_dialog_button, yes);
3766 gtk_widget_set_sensitive (sound_xqf_quit_file_dialog_button, yes);
3767 gtk_widget_set_sensitive (sound_update_done_file_dialog_button, yes);
3768 gtk_widget_set_sensitive (sound_refresh_done_file_dialog_button, yes);
3769 gtk_widget_set_sensitive (sound_stop_file_dialog_button, yes);
3770 gtk_widget_set_sensitive (sound_redial_success_file_dialog_button, yes);
3771 gtk_widget_set_sensitive (sound_server_connect_file_dialog_button, yes);
3772
3773 gtk_widget_set_sensitive (sound_xqf_start_file_test_button, yes);
3774 gtk_widget_set_sensitive (sound_xqf_quit_file_test_button, yes);
3775 gtk_widget_set_sensitive (sound_update_done_file_test_button, yes);
3776 gtk_widget_set_sensitive (sound_refresh_done_file_test_button, yes);
3777 gtk_widget_set_sensitive (sound_stop_file_test_button, yes);
3778 gtk_widget_set_sensitive (sound_redial_success_file_test_button, yes);
3779 gtk_widget_set_sensitive (sound_server_connect_file_test_button, yes);
3780
3781 }
3782
sound_enable_toggled_callback(GtkWidget * widget,gpointer data)3783 static void sound_enable_toggled_callback (GtkWidget *widget, gpointer data) {
3784 gboolean val;
3785
3786 val = GTK_TOGGLE_BUTTON (sound_enable_check_button)->active;
3787
3788 sound_set_widgets_sensitive(val);
3789 }
3790
3791
save_srvinfo_toggled_callback(GtkWidget * widget,gpointer data)3792 static void save_srvinfo_toggled_callback (GtkWidget *widget, gpointer data) {
3793 int val;
3794
3795 val = GTK_TOGGLE_BUTTON (save_srvinfo_check_button)->active;
3796 gtk_widget_set_sensitive (save_plrinfo_check_button, val);
3797 }
3798
3799
appearance_options_page(void)3800 static GtkWidget *appearance_options_page (void) {
3801 GtkWidget *page_vbox;
3802 GtkWidget *frame;
3803 GtkWidget *hbox;
3804 GtkWidget *vbox;
3805 GSList *group = NULL;
3806 static const char *toolbar_styles[] = { N_("Icons"), N_("Text"), N_("Both") };
3807 int i;
3808
3809 page_vbox = gtk_vbox_new (FALSE, 4);
3810 gtk_container_set_border_width (GTK_CONTAINER (page_vbox), 8);
3811
3812 frame = gtk_frame_new (_("Server List"));
3813 gtk_box_pack_start (GTK_BOX (page_vbox), frame, FALSE, FALSE, 0);
3814
3815 vbox = gtk_vbox_new (FALSE, 2);
3816 gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
3817 gtk_container_add (GTK_CONTAINER (frame), vbox);
3818
3819 /* Lookup host names */
3820
3821 hbox = gtk_hbox_new (FALSE, 4);
3822 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
3823
3824 show_hostnames_check_button = gtk_check_button_new_with_label (_("Show host names"));
3825 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show_hostnames_check_button), show_hostnames);
3826 gtk_box_pack_start (GTK_BOX (hbox), show_hostnames_check_button, FALSE, FALSE, 0);
3827 gtk_tooltips_set_tip (tooltips, show_hostnames_check_button, _("Show hostnames instead of IP addresses if possible"), NULL);
3828 gtk_widget_show (show_hostnames_check_button);
3829
3830 gtk_widget_show (hbox);
3831
3832 /* Show default port */
3833
3834 hbox = gtk_hbox_new (FALSE, 4);
3835 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
3836
3837 show_defport_check_button = gtk_check_button_new_with_label (_("Show default port"));
3838 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show_defport_check_button), show_default_port);
3839 gtk_box_pack_start (GTK_BOX (hbox), show_defport_check_button, FALSE, FALSE, 0);
3840 gtk_widget_show (show_defport_check_button);
3841
3842 gtk_widget_show (hbox);
3843
3844 /* show bots */
3845
3846 hbox = gtk_hbox_new (FALSE, 4);
3847 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
3848
3849 countbots_check_button = gtk_check_button_new_with_label (_("Do not count bots as players"));
3850 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (countbots_check_button), serverlist_countbots);
3851 gtk_box_pack_start (GTK_BOX (hbox), countbots_check_button, FALSE, FALSE, 0);
3852 gtk_widget_show (countbots_check_button);
3853
3854 gtk_widget_show (hbox);
3855
3856
3857 /* Sort servers real-time during refresh */
3858
3859 hbox = gtk_hbox_new (FALSE, 4);
3860 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
3861
3862 refresh_sorts_check_button = gtk_check_button_new_with_label (_("Sort servers real-time during refresh"));
3863 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (refresh_sorts_check_button), default_refresh_sorts);
3864 gtk_box_pack_start (GTK_BOX (hbox), refresh_sorts_check_button, FALSE, FALSE, 0);
3865 gtk_widget_show (refresh_sorts_check_button);
3866
3867 gtk_widget_show (hbox);
3868
3869 /* Refresh on update */
3870
3871 hbox = gtk_hbox_new (FALSE, 4);
3872 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
3873
3874 refresh_on_update_check_button = gtk_check_button_new_with_label (_("Refresh on update"));
3875 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (refresh_on_update_check_button), default_refresh_on_update);
3876 gtk_box_pack_start (GTK_BOX (hbox), refresh_on_update_check_button, FALSE, FALSE, 0);
3877 gtk_widget_show (refresh_on_update_check_button);
3878
3879 gtk_widget_show (hbox);
3880
3881 /* Resolve on update */
3882
3883 hbox = gtk_hbox_new (FALSE, 4);
3884 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
3885
3886 resolve_on_update_check_button = gtk_check_button_new_with_label (_("Resolve hostnames on update"));
3887 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (resolve_on_update_check_button), default_resolve_on_update);
3888 gtk_tooltips_set_tip (tooltips, resolve_on_update_check_button, _("Enable or disable DNS resolution of IP addresses"), NULL);
3889 gtk_box_pack_start (GTK_BOX (hbox), resolve_on_update_check_button, FALSE, FALSE, 0);
3890 gtk_widget_show (resolve_on_update_check_button);
3891
3892 gtk_widget_show (hbox);
3893
3894
3895 /* Show only configured games */
3896
3897 hbox = gtk_hbox_new (FALSE, 4);
3898 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
3899
3900 show_only_configured_games_check_button = gtk_check_button_new_with_label (_("Show only configured games"));
3901 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show_only_configured_games_check_button), default_show_only_configured_games);
3902 gtk_box_pack_start (GTK_BOX (hbox), show_only_configured_games_check_button, FALSE, FALSE, 0);
3903 gtk_widget_show (show_only_configured_games_check_button);
3904
3905 gtk_widget_show (hbox);
3906
3907 /* gtkrc */
3908
3909 hbox = gtk_hbox_new (FALSE, 4);
3910 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
3911
3912 use_custom_gtkrc_check_button = gtk_check_button_new_with_label (_("Use custom color settings"));
3913
3914 gtk_tooltips_set_tip (tooltips, use_custom_gtkrc_check_button, _("Use XQF's"
3915 " color settings instead of the system ones. You need to restart XQF"
3916 " for this setting to take effect. Note that you may need to install"
3917 " the gtk-engines package."), NULL);
3918
3919 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (use_custom_gtkrc_check_button), use_custom_gtkrc);
3920 gtk_box_pack_start (GTK_BOX (hbox), use_custom_gtkrc_check_button, FALSE, FALSE, 0);
3921 gtk_widget_show (use_custom_gtkrc_check_button);
3922
3923
3924 gtk_widget_show (hbox);
3925
3926 gtk_widget_show (vbox);
3927 gtk_widget_show (frame);
3928
3929
3930 /* Toolbar */
3931
3932 frame = gtk_frame_new (_("Toolbar"));
3933 gtk_box_pack_start (GTK_BOX (page_vbox), frame, FALSE, FALSE, 0);
3934
3935 hbox = gtk_hbox_new (FALSE, 4);
3936 gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
3937 gtk_container_add (GTK_CONTAINER (frame), hbox);
3938
3939 /* Toolbar Style */
3940
3941 for (i = 0; i < 3; i++) {
3942 toolbar_style_radio_buttons[i] = gtk_radio_button_new_with_label (group, _(toolbar_styles[i]));
3943 group = gtk_radio_button_group (GTK_RADIO_BUTTON (toolbar_style_radio_buttons[i]));
3944 gtk_box_pack_start (GTK_BOX (hbox), toolbar_style_radio_buttons[i], FALSE, FALSE, 0);
3945 gtk_widget_show (toolbar_style_radio_buttons[i]);
3946 }
3947
3948 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toolbar_style_radio_buttons[default_toolbar_style]), TRUE);
3949
3950 /* Toolbar Tips */
3951
3952 toolbar_tips_check_button = gtk_check_button_new_with_label (_("Tooltips"));
3953 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toolbar_tips_check_button), default_toolbar_tips);
3954 gtk_box_pack_end (GTK_BOX (hbox), toolbar_tips_check_button, FALSE, FALSE, 0);
3955 gtk_widget_show (toolbar_tips_check_button);
3956
3957 gtk_widget_show (hbox);
3958 gtk_widget_show (frame);
3959
3960 gtk_widget_show (page_vbox);
3961
3962 return page_vbox;
3963 }
3964
scan_maps_callback(GtkWidget * widget,gpointer data)3965 static void scan_maps_callback (GtkWidget *widget, gpointer data) {
3966 int i;
3967
3968 create_splashscreen();
3969
3970 for (i = 0; i < GAMES_TOTAL; i++) {
3971 scan_maps_for(i);
3972 }
3973
3974 destroy_splashscreen();
3975
3976 server_clist_set_list (cur_server_list);
3977 }
3978
general_options_page(void)3979 static GtkWidget *general_options_page (void) {
3980 GtkWidget *page_vbox;
3981 GtkWidget *frame;
3982 GtkWidget *hbox;
3983 GtkWidget *vbox;
3984 GtkWidget *table;
3985
3986 page_vbox = gtk_vbox_new (FALSE, 4);
3987 gtk_container_set_border_width (GTK_CONTAINER (page_vbox), 8);
3988
3989 /* On Startup */
3990
3991 frame = gtk_frame_new (_("On Startup"));
3992 gtk_box_pack_start (GTK_BOX (page_vbox), frame, FALSE, FALSE, 0);
3993
3994 /* Refresh Favorites */
3995
3996 vbox = gtk_vbox_new (FALSE, 2);
3997 gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
3998 gtk_container_add (GTK_CONTAINER (frame), vbox);
3999
4000 hbox = gtk_hbox_new (FALSE, 4);
4001 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
4002
4003 auto_favorites_check_button = gtk_check_button_new_with_label (_("Refresh Favorites"));
4004 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (auto_favorites_check_button), default_auto_favorites);
4005 gtk_box_pack_start (GTK_BOX (hbox), auto_favorites_check_button, FALSE, FALSE, 0);
4006 gtk_widget_show (auto_favorites_check_button);
4007
4008 gtk_widget_show (hbox);
4009
4010 hbox = gtk_hbox_new (FALSE, 4);
4011 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
4012
4013 show_splash_button = gtk_check_button_new_with_label (_("Show splash screen"));
4014 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show_splash_button), default_show_splash);
4015 gtk_box_pack_start (GTK_BOX (hbox), show_splash_button, FALSE, FALSE, 0);
4016 gtk_widget_show (show_splash_button);
4017
4018 gtk_widget_show (hbox);
4019
4020
4021 hbox = gtk_hbox_new (FALSE, 4);
4022 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
4023
4024 auto_maps_check_button = gtk_check_button_new_with_label (_("Scan for maps"));
4025 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (auto_maps_check_button), default_auto_maps);
4026
4027 gtk_tooltips_set_tip (tooltips, auto_maps_check_button,
4028 _("Scan game directories for installed maps. xqf will"
4029 " take longer to start up when enabled."), NULL);
4030 gtk_box_pack_start (GTK_BOX (hbox), auto_maps_check_button, FALSE, FALSE, 0);
4031 gtk_widget_show (auto_maps_check_button);
4032
4033 {
4034 GtkWidget* button = gtk_button_new_with_label(_("scan now"));
4035 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4036 gtk_misc_set_padding(GTK_MISC(GTK_BIN(button)->child),4,0);
4037 gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (scan_maps_callback), NULL);
4038 gtk_widget_show (button);
4039 }
4040
4041 gtk_widget_show (hbox);
4042
4043 /*Tray icon*/
4044 hbox = gtk_hbox_new (FALSE, 4);
4045 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
4046
4047
4048 tray_icon_check_button = gtk_check_button_new_with_label (_("Minimize to system tray"));
4049 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tray_icon_check_button), default_show_tray_icon);
4050
4051 gtk_tooltips_set_tip (tooltips, tray_icon_check_button, _("Enable xqf tray icon. You need to restart xqf for this to take effect."), NULL);
4052
4053 gtk_box_pack_start (GTK_BOX (hbox), tray_icon_check_button, FALSE, FALSE, 0);
4054 gtk_widget_show (tray_icon_check_button);
4055 gtk_widget_show (hbox);
4056
4057 gtk_widget_show (vbox);
4058
4059 gtk_widget_show (frame);
4060
4061 /* On Exit */
4062
4063 frame = gtk_frame_new (_("On Exit"));
4064 gtk_box_pack_start (GTK_BOX (page_vbox), frame, FALSE, FALSE, 0);
4065
4066 vbox = gtk_vbox_new (FALSE, 2);
4067 gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
4068 gtk_container_add (GTK_CONTAINER (frame), vbox);
4069
4070 /* Save master lists */
4071
4072 hbox = gtk_hbox_new (FALSE, 4);
4073 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
4074
4075 save_lists_check_button = gtk_check_button_new_with_label (_("Save server lists"));
4076 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (save_lists_check_button), default_save_lists);
4077 gtk_box_pack_start (GTK_BOX (hbox), save_lists_check_button, FALSE, FALSE, 0);
4078 gtk_widget_show (save_lists_check_button);
4079
4080 gtk_widget_show (hbox);
4081
4082 /* Save server information */
4083
4084 hbox = gtk_hbox_new (FALSE, 4);
4085 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
4086
4087 save_srvinfo_check_button = gtk_check_button_new_with_label (_("Save server information"));
4088 gtk_box_pack_start (GTK_BOX (hbox), save_srvinfo_check_button, FALSE, FALSE, 0);
4089 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (save_srvinfo_check_button), default_save_srvinfo);
4090 gtk_signal_connect (GTK_OBJECT (save_srvinfo_check_button), "toggled", GTK_SIGNAL_FUNC (save_srvinfo_toggled_callback), NULL);
4091 gtk_widget_show (save_srvinfo_check_button);
4092
4093 gtk_widget_show (hbox);
4094
4095 /* Save player information */
4096
4097 hbox = gtk_hbox_new (FALSE, 4);
4098 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
4099
4100 save_plrinfo_check_button = gtk_check_button_new_with_label (_("Save player information"));
4101 gtk_box_pack_start (GTK_BOX (hbox), save_plrinfo_check_button, FALSE, FALSE, 0);
4102 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (save_plrinfo_check_button), default_save_plrinfo);
4103
4104 if (!default_save_srvinfo) {
4105 gtk_widget_set_sensitive (save_plrinfo_check_button, FALSE);
4106 }
4107
4108 gtk_widget_show (save_plrinfo_check_button);
4109
4110 gtk_widget_show (hbox);
4111
4112 gtk_widget_show (vbox);
4113 gtk_widget_show (frame);
4114
4115 /* When launching a Game */
4116
4117 frame = gtk_frame_new (_("When launching a game..."));
4118 gtk_box_pack_start (GTK_BOX (page_vbox), frame, FALSE, FALSE, 0);
4119
4120 vbox = gtk_vbox_new (FALSE, 2);
4121 gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
4122 gtk_container_add (GTK_CONTAINER (frame), vbox);
4123
4124 /* Terminate */
4125
4126 table = gtk_table_new(3,2,TRUE);
4127
4128 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
4129
4130 terminate_check_button = gtk_check_button_new_with_label (_("Terminate XQF"));
4131 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (terminate_check_button), default_terminate);
4132 gtk_signal_connect (GTK_OBJECT (terminate_check_button), "toggled", GTK_SIGNAL_FUNC (terminate_toggled_callback), NULL);
4133
4134 gtk_table_attach_defaults(GTK_TABLE(table),terminate_check_button, 0, 1, 0, 1);
4135
4136 gtk_widget_show (terminate_check_button);
4137
4138 gtk_widget_show (hbox);
4139
4140 /* Iconify */
4141
4142 iconify_check_button = gtk_check_button_new_with_label (_("Iconify XQF window"));
4143 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (iconify_check_button), default_iconify);
4144
4145 if (default_terminate) {
4146 gtk_widget_set_sensitive (iconify_check_button, FALSE);
4147 }
4148
4149 gtk_widget_show (iconify_check_button);
4150
4151 gtk_table_attach_defaults(GTK_TABLE(table),iconify_check_button, 1, 2, 0, 1);
4152
4153 /* Launchinfo */
4154
4155 hbox = gtk_hbox_new (FALSE, 4);
4156 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
4157
4158 launchinfo_check_button = gtk_check_button_new_with_label (_("Create LaunchInfo.txt"));
4159 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (launchinfo_check_button), default_launchinfo);
4160 gtk_signal_connect (GTK_OBJECT (launchinfo_check_button), "toggled", GTK_SIGNAL_FUNC (launchinfo_toggled_callback), NULL);
4161 gtk_table_attach_defaults(GTK_TABLE(table),launchinfo_check_button, 0, 1, 1, 2);
4162 gtk_tooltips_set_tip (tooltips, launchinfo_check_button, _("Creates the file ~/.qf/LaunchInfo.txt with: ping ip:port name map curplayers maxplayers"), NULL);
4163 gtk_widget_show (launchinfo_check_button);
4164
4165 /* Prelaunchinfo */
4166
4167 prelaunchexec_check_button = gtk_check_button_new_with_label (_("Execute prelaunch"));
4168 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prelaunchexec_check_button), default_prelaunchexec);
4169 gtk_signal_connect (GTK_OBJECT (prelaunchexec_check_button), "toggled", GTK_SIGNAL_FUNC (prelaunchexec_toggled_callback), NULL);
4170 gtk_tooltips_set_tip (tooltips, prelaunchexec_check_button, _("Executes ~/.qf/PreLaunch (if it exists) before launching the game"), NULL);
4171 gtk_widget_show (prelaunchexec_check_button);
4172
4173 gtk_table_attach_defaults(GTK_TABLE(table),prelaunchexec_check_button, 1, 2, 1, 2);
4174
4175
4176 /* Stop XMMS */
4177
4178 stopxmms_check_button = gtk_check_button_new_with_label (_("Stop current song in XMMS"));
4179 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (stopxmms_check_button), default_stopxmms);
4180 gtk_tooltips_set_tip (tooltips, stopxmms_check_button, _("Stopping XMMS will release /dev/dsp. "
4181 "Activate this option if you use XMMS and have a cheap soundcard "
4182 "that allows only one application to open /dev/dsp."), NULL);
4183 gtk_widget_show (stopxmms_check_button);
4184
4185 gtk_table_attach_defaults(GTK_TABLE(table),stopxmms_check_button, 0, 1, 2, 3);
4186
4187
4188 gtk_widget_show(table);
4189
4190 gtk_widget_show (hbox);
4191 gtk_widget_show (vbox);
4192
4193 gtk_widget_show (frame);
4194
4195 gtk_widget_show (hbox);
4196 gtk_widget_show (frame);
4197
4198 gtk_widget_show (page_vbox);
4199
4200 return page_vbox;
4201 }
4202
4203
qstat_options_page(void)4204 static GtkWidget *qstat_options_page (void) {
4205 GtkWidget *page_vbox;
4206 GtkWidget *frame;
4207 GtkWidget *table;
4208 GtkWidget *label;
4209 GtkObject *adj;
4210 GtkWidget* alignment;
4211 GtkWidget* hbox;
4212 unsigned row = 0;
4213
4214 page_vbox = gtk_vbox_new (FALSE, 4);
4215 gtk_container_set_border_width (GTK_CONTAINER (page_vbox), 8);
4216
4217 /* QStat preferences -- maxsimultaneous & maxretries */
4218
4219 frame = gtk_frame_new (_("QStat Options"));
4220 gtk_box_pack_start (GTK_BOX (page_vbox), frame, FALSE, FALSE, 0);
4221
4222 table = gtk_table_new (2, 3, FALSE);
4223 gtk_table_set_row_spacings (GTK_TABLE (table), 2);
4224 gtk_table_set_col_spacings (GTK_TABLE (table), 4);
4225 gtk_container_set_border_width (GTK_CONTAINER (table), 6);
4226 gtk_container_add (GTK_CONTAINER (frame), table);
4227
4228 /* maxsimultaneous */
4229
4230 label = gtk_label_new (_("Number of simultaneous servers to query"));
4231 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
4232 gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, row, row+1);
4233 gtk_widget_show (label);
4234
4235
4236 adj = gtk_adjustment_new (maxsimultaneous, 1.0, FD_SETSIZE, 1.0, 5.0, 0.0);
4237
4238 maxsimultaneous_spinner = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 0, 0);
4239 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (maxsimultaneous_spinner), GTK_UPDATE_ALWAYS);
4240 gtk_widget_set_usize (maxsimultaneous_spinner, 48, -1);
4241
4242 alignment = gtk_alignment_new (1, 0.5, 0, 0);
4243 gtk_container_add (GTK_CONTAINER (alignment), maxsimultaneous_spinner);
4244
4245 gtk_table_attach_defaults (GTK_TABLE (table), alignment, 1, 2, row, row+1);
4246 gtk_widget_show (maxsimultaneous_spinner);
4247 gtk_widget_show(alignment);
4248
4249 ++row;
4250
4251 /* maxretries */
4252
4253 label = gtk_label_new (_("Number of retries"));
4254 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
4255 gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, row, row+1);
4256 gtk_widget_show (label);
4257
4258 adj = gtk_adjustment_new (maxretries, 1.0, MAX_RETRIES, 1.0, 1.0, 0.0);
4259 maxretries_spinner = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 0, 0);
4260 gtk_widget_set_usize (maxretries_spinner, 48, -1);
4261
4262 alignment = gtk_alignment_new (1, 0.5, 0, 0);
4263 gtk_container_add (GTK_CONTAINER (alignment), maxretries_spinner);
4264 gtk_table_attach_defaults (GTK_TABLE (table), alignment, 1, 2, row, row+1);
4265 gtk_widget_show (maxretries_spinner);
4266 gtk_widget_show(alignment);
4267
4268 ++row;
4269
4270 /* srcip */
4271
4272 label = gtk_label_new (_("Source IP Address"));
4273 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
4274 gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, row, row+1);
4275 gtk_widget_show (label);
4276
4277 qstat_srcip_entry = gtk_entry_new ();
4278 gtk_entry_set_max_length(GTK_ENTRY(qstat_srcip_entry), 15);
4279 gtk_entry_set_text (GTK_ENTRY (qstat_srcip_entry), qstat_srcip?qstat_srcip:"");
4280
4281 alignment = gtk_alignment_new (1, 0.5, 0, 0);
4282 gtk_container_add (GTK_CONTAINER (alignment), qstat_srcip_entry);
4283 gtk_table_attach_defaults (GTK_TABLE (table), alignment, 1, 2, row, row+1);
4284 gtk_widget_show (qstat_srcip_entry);
4285 gtk_widget_show (alignment);
4286
4287 ++row;
4288
4289 /* srcport */
4290
4291 {
4292 char buf[6];
4293 label = gtk_label_new (_("Source Port Range"));
4294 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
4295 gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, row, row+1);
4296 gtk_widget_show (label);
4297
4298 hbox = gtk_hbox_new (FALSE, 4);
4299
4300 if (qstat_srcport_low) {
4301 snprintf(buf, sizeof(buf), "%hu", qstat_srcport_low);
4302 }
4303 else {
4304 *buf = '\0';
4305 }
4306
4307 qstat_srcport_entry_low = gtk_entry_new ();
4308 gtk_entry_set_max_length(GTK_ENTRY(qstat_srcport_entry_low), 5);
4309 gtk_entry_set_text (GTK_ENTRY (qstat_srcport_entry_low), buf);
4310 gtk_box_pack_start(GTK_BOX(hbox), qstat_srcport_entry_low, FALSE, FALSE, 0);
4311 gtk_widget_set_usize (qstat_srcport_entry_low, 70, -1);
4312
4313 label = gtk_label_new ("-");
4314 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
4315
4316 if (qstat_srcport_high) {
4317 snprintf(buf, sizeof(buf), "%hu", qstat_srcport_high);
4318 }
4319 else {
4320 *buf = '\0';
4321 }
4322
4323 qstat_srcport_entry_high = gtk_entry_new ();
4324 gtk_entry_set_max_length(GTK_ENTRY(qstat_srcport_entry_high), 5);
4325 gtk_entry_set_text (GTK_ENTRY (qstat_srcport_entry_high), buf);
4326 gtk_box_pack_start(GTK_BOX(hbox), qstat_srcport_entry_high, FALSE, FALSE, 0);
4327 gtk_widget_set_usize (qstat_srcport_entry_high, 70, -1);
4328
4329 alignment = gtk_alignment_new (1, 0.5, 0, 0);
4330 gtk_container_add (GTK_CONTAINER (alignment), hbox);
4331 gtk_table_attach_defaults (GTK_TABLE (table), alignment, 1, 2, row, row+1);
4332 gtk_widget_show (qstat_srcport_entry_low);
4333 gtk_widget_show (label);
4334 gtk_widget_show (qstat_srcport_entry_high);
4335 gtk_widget_show (alignment);
4336 gtk_widget_show (hbox);
4337
4338 ++row;
4339 }
4340
4341 gtk_widget_show (table);
4342 gtk_widget_show (frame);
4343
4344 gtk_widget_show (page_vbox);
4345
4346 return page_vbox;
4347 }
4348
play_sound_pref(GtkWidget * sound_entry)4349 static void play_sound_pref (GtkWidget *sound_entry) {
4350 const char* file = gtk_entry_get_text (GTK_ENTRY (sound_entry));
4351 const char* player = gtk_entry_get_text (GTK_ENTRY (sound_player_entry));
4352 play_sound_with (player, file, 1);
4353 }
4354
4355 // create a button with label "Test", set padding to make it look nice
sound_test_button_new()4356 static inline GtkWidget* sound_test_button_new() {
4357 // Translator: sound test button
4358 GtkWidget* button = gtk_button_new_with_label (_("Test"));
4359 gtk_misc_set_padding(GTK_MISC(GTK_BIN(button)->child),4,0);
4360 return button;
4361 }
4362
sound_options_page(void)4363 static GtkWidget *sound_options_page (void) {
4364 GtkWidget *page_vbox;
4365 GtkWidget *frame;
4366 GtkWidget *table;
4367 GtkWidget *label;
4368
4369 page_vbox = gtk_vbox_new (FALSE, 4);
4370 gtk_container_set_border_width (GTK_CONTAINER (page_vbox), 8);
4371
4372 /* Sound Enable / Disable frame */
4373 /* Sounds Enable / Disable */
4374
4375 frame = gtk_frame_new (_("Sound Enable / Disable"));
4376 gtk_box_pack_start (GTK_BOX (page_vbox), frame, FALSE, FALSE, 0);
4377
4378 table = gtk_table_new (2, 3, FALSE);
4379 gtk_table_set_row_spacings (GTK_TABLE (table), 2);
4380 gtk_table_set_col_spacings (GTK_TABLE (table), 4);
4381 gtk_container_set_border_width (GTK_CONTAINER (table), 6);
4382 gtk_container_add (GTK_CONTAINER (frame), table);
4383
4384 gtk_widget_show (table);
4385
4386 /* Sound Enable */
4387
4388 sound_enable_check_button = gtk_check_button_new_with_label (_("Enable Sound"));
4389 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sound_enable_check_button), sound_enable);
4390 gtk_signal_connect (GTK_OBJECT (sound_enable_check_button), "toggled", GTK_SIGNAL_FUNC (sound_enable_toggled_callback), NULL);
4391 gtk_table_attach (GTK_TABLE (table), sound_enable_check_button, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
4392 gtk_widget_show (sound_enable_check_button);
4393
4394 /* Sound Player */
4395
4396 label = gtk_label_new (_("Player program"));
4397 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
4398 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
4399 gtk_widget_show (label);
4400
4401 sound_player_entry = gtk_entry_new ();
4402
4403 if (sound_player) {
4404 gtk_entry_set_text (GTK_ENTRY (sound_player_entry), sound_player);
4405 gtk_entry_set_position (GTK_ENTRY (sound_player_entry), 0);
4406 }
4407 gtk_table_attach_defaults (GTK_TABLE (table), sound_player_entry, 1, 2, 1, 2);
4408 gtk_widget_show (sound_player_entry);
4409
4410 // File selection dialog
4411 sound_player_file_dialog_button = gtk_button_new_with_label ("...");
4412 gtk_signal_connect_object (GTK_OBJECT (sound_player_file_dialog_button), "clicked", GTK_SIGNAL_FUNC (sound_player_file_dialog), NULL);
4413 gtk_table_attach (GTK_TABLE (table), sound_player_file_dialog_button, 2, 3, 1, 2, 0, 0, 0, 0);
4414 gtk_widget_show (sound_player_file_dialog_button);
4415
4416 gtk_widget_show (frame);
4417
4418 /* Sound Files frame */
4419 /* Sounds preferences -- player and various sounds */
4420
4421 frame = gtk_frame_new (_("Sound Files"));
4422 gtk_box_pack_start (GTK_BOX (page_vbox), frame, FALSE, FALSE, 0);
4423
4424 table = gtk_table_new (2, 3, FALSE);
4425 gtk_table_set_row_spacings (GTK_TABLE (table), 2);
4426 gtk_table_set_col_spacings (GTK_TABLE (table), 4);
4427 gtk_container_set_border_width (GTK_CONTAINER (table), 6);
4428 gtk_container_add (GTK_CONTAINER (frame), table);
4429
4430
4431 /* Sound XQF Start */
4432
4433 label = gtk_label_new (_("XQF Start"));
4434 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
4435 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
4436 gtk_widget_show (label);
4437
4438 sound_xqf_start_entry = gtk_entry_new ();
4439
4440 if (sound_xqf_start) {
4441 gtk_entry_set_text (GTK_ENTRY (sound_xqf_start_entry), sound_xqf_start);
4442 gtk_entry_set_position (GTK_ENTRY (sound_xqf_start_entry), 0);
4443 }
4444 gtk_table_attach_defaults (GTK_TABLE (table), sound_xqf_start_entry, 1, 2, 0, 1);
4445 gtk_widget_show (sound_xqf_start_entry);
4446
4447 // File selection dialog
4448 sound_xqf_start_file_dialog_button = gtk_button_new_with_label ("...");
4449 gtk_signal_connect_object (GTK_OBJECT (sound_xqf_start_file_dialog_button), "clicked", GTK_SIGNAL_FUNC (sound_xqf_start_file_dialog), NULL);
4450 gtk_table_attach (GTK_TABLE (table), sound_xqf_start_file_dialog_button, 2, 3, 0, 1, 0, 0, 0, 0);
4451 gtk_widget_show (sound_xqf_start_file_dialog_button);
4452
4453 // Test button
4454 sound_xqf_start_file_test_button = sound_test_button_new();
4455 gtk_signal_connect_object (GTK_OBJECT (sound_xqf_start_file_test_button), "clicked", GTK_SIGNAL_FUNC (play_sound_pref), (gpointer)sound_xqf_start_entry);
4456 gtk_table_attach (GTK_TABLE (table), sound_xqf_start_file_test_button, 3, 4, 0, 1, 0, 0, 0, 0);
4457 gtk_widget_show (sound_xqf_start_file_test_button);
4458
4459 /* Sound XQF Quit */
4460
4461 label = gtk_label_new (_("XQF Quit"));
4462 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
4463 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
4464 gtk_widget_show (label);
4465
4466 sound_xqf_quit_entry = gtk_entry_new ();
4467
4468 if (sound_xqf_quit) {
4469 gtk_entry_set_text (GTK_ENTRY (sound_xqf_quit_entry), sound_xqf_quit);
4470 gtk_entry_set_position (GTK_ENTRY (sound_xqf_quit_entry), 0);
4471 }
4472 gtk_table_attach_defaults (GTK_TABLE (table), sound_xqf_quit_entry, 1, 2, 1, 2);
4473 gtk_widget_show (sound_xqf_quit_entry);
4474
4475 // File selection dialog
4476 sound_xqf_quit_file_dialog_button = gtk_button_new_with_label ("...");
4477 gtk_signal_connect_object (GTK_OBJECT (sound_xqf_quit_file_dialog_button), "clicked", GTK_SIGNAL_FUNC (sound_xqf_quit_file_dialog), NULL);
4478 gtk_table_attach (GTK_TABLE (table), sound_xqf_quit_file_dialog_button, 2, 3, 1, 2, 0, 0, 0, 0);
4479 gtk_widget_show (sound_xqf_quit_file_dialog_button);
4480
4481 // Test button
4482 sound_xqf_quit_file_test_button = sound_test_button_new();
4483 gtk_signal_connect_object (GTK_OBJECT (sound_xqf_quit_file_test_button), "clicked", GTK_SIGNAL_FUNC (play_sound_pref), (gpointer)sound_xqf_quit_entry);
4484 gtk_table_attach (GTK_TABLE (table), sound_xqf_quit_file_test_button, 3, 4, 1, 2, 0, 0, 0, 0);
4485 gtk_widget_show (sound_xqf_quit_file_test_button);
4486
4487 /* Sound Update Done */
4488
4489 label = gtk_label_new (_("Update Done"));
4490 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
4491 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0);
4492 gtk_widget_show (label);
4493
4494 sound_update_done_entry = gtk_entry_new ();
4495
4496 if (sound_update_done) {
4497 gtk_entry_set_text (GTK_ENTRY (sound_update_done_entry), sound_update_done);
4498 gtk_entry_set_position (GTK_ENTRY (sound_update_done_entry), 0);
4499 }
4500 gtk_table_attach_defaults (GTK_TABLE (table), sound_update_done_entry, 1, 2, 2, 3);
4501 gtk_widget_show (sound_update_done_entry);
4502
4503 // File selection dialog
4504 sound_update_done_file_dialog_button = gtk_button_new_with_label ("...");
4505 gtk_signal_connect_object (GTK_OBJECT (sound_update_done_file_dialog_button), "clicked", GTK_SIGNAL_FUNC (sound_update_done_file_dialog), NULL);
4506 gtk_table_attach (GTK_TABLE (table), sound_update_done_file_dialog_button, 2, 3, 2, 3, 0, 0, 0, 0);
4507 gtk_widget_show (sound_update_done_file_dialog_button);
4508
4509
4510 // Test button
4511 sound_update_done_file_test_button = sound_test_button_new();
4512 gtk_signal_connect_object (GTK_OBJECT (sound_update_done_file_test_button), "clicked", GTK_SIGNAL_FUNC (play_sound_pref), (gpointer)sound_update_done_entry);
4513 gtk_table_attach (GTK_TABLE (table), sound_update_done_file_test_button, 3, 4, 2, 3, 0, 0, 0, 0);
4514 gtk_widget_show (sound_update_done_file_test_button);
4515
4516 /* Sound Refresh Done */
4517
4518 label = gtk_label_new (_("Refresh Done"));
4519 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
4520 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 3, 4, GTK_FILL, GTK_FILL, 0, 0);
4521 gtk_widget_show (label);
4522
4523 sound_refresh_done_entry = gtk_entry_new ();
4524
4525 if (sound_refresh_done) {
4526 gtk_entry_set_text (GTK_ENTRY (sound_refresh_done_entry), sound_refresh_done);
4527 gtk_entry_set_position (GTK_ENTRY (sound_refresh_done_entry), 0);
4528 }
4529 gtk_table_attach_defaults (GTK_TABLE (table), sound_refresh_done_entry, 1, 2, 3, 4);
4530 gtk_widget_show (sound_refresh_done_entry);
4531
4532 // File selection dialog
4533 sound_refresh_done_file_dialog_button = gtk_button_new_with_label ("...");
4534 gtk_signal_connect_object (GTK_OBJECT (sound_refresh_done_file_dialog_button), "clicked", GTK_SIGNAL_FUNC (sound_refresh_done_file_dialog), NULL);
4535 gtk_table_attach (GTK_TABLE (table), sound_refresh_done_file_dialog_button, 2, 3, 3, 4, 0, 0, 0, 0);
4536 gtk_widget_show (sound_refresh_done_file_dialog_button);
4537
4538
4539 // Test button
4540 sound_refresh_done_file_test_button = sound_test_button_new();
4541 gtk_signal_connect_object (GTK_OBJECT (sound_refresh_done_file_test_button), "clicked", GTK_SIGNAL_FUNC (play_sound_pref), (gpointer)sound_refresh_done_entry);
4542 gtk_table_attach (GTK_TABLE (table), sound_refresh_done_file_test_button, 3, 4, 3, 4, 0, 0, 0, 0);
4543 gtk_widget_show (sound_refresh_done_file_test_button);
4544
4545 /* Sound Stop */
4546
4547 label = gtk_label_new (_("Stop"));
4548 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
4549 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0);
4550 gtk_widget_show (label);
4551
4552 sound_stop_entry = gtk_entry_new ();
4553
4554 if (sound_stop) {
4555 gtk_entry_set_text (GTK_ENTRY (sound_stop_entry), sound_stop);
4556 gtk_entry_set_position (GTK_ENTRY (sound_stop_entry), 0);
4557 }
4558 gtk_table_attach_defaults (GTK_TABLE (table), sound_stop_entry, 1, 2, 4, 5);
4559 gtk_widget_show (sound_stop_entry);
4560
4561 // File selection dialog
4562 sound_stop_file_dialog_button = gtk_button_new_with_label ("...");
4563 gtk_signal_connect_object (GTK_OBJECT (sound_stop_file_dialog_button), "clicked", GTK_SIGNAL_FUNC (sound_stop_file_dialog), NULL);
4564 gtk_table_attach (GTK_TABLE (table), sound_stop_file_dialog_button, 2, 3, 4, 5, 0, 0, 0, 0);
4565 gtk_widget_show (sound_stop_file_dialog_button);
4566
4567
4568 // Test button
4569 sound_stop_file_test_button = sound_test_button_new();
4570 gtk_signal_connect_object (GTK_OBJECT (sound_stop_file_test_button), "clicked", GTK_SIGNAL_FUNC (play_sound_pref), (gpointer)sound_stop_entry);
4571 gtk_table_attach (GTK_TABLE (table), sound_stop_file_test_button, 3, 4, 4, 5, 0, 0, 0, 0);
4572 gtk_widget_show (sound_stop_file_test_button);
4573
4574 /* Sound Server Connect */
4575
4576 label = gtk_label_new (_("Server Connect"));
4577 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
4578 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 5, 6, GTK_FILL, GTK_FILL, 0, 0);
4579 gtk_widget_show (label);
4580
4581 sound_server_connect_entry = gtk_entry_new ();
4582
4583 if (sound_server_connect) {
4584 gtk_entry_set_text (GTK_ENTRY (sound_server_connect_entry), sound_server_connect);
4585 gtk_entry_set_position (GTK_ENTRY (sound_server_connect_entry), 0);
4586 }
4587 gtk_table_attach_defaults (GTK_TABLE (table), sound_server_connect_entry, 1, 2, 5, 6);
4588 gtk_widget_show (sound_server_connect_entry);
4589
4590 // File selection dialog
4591 sound_server_connect_file_dialog_button = gtk_button_new_with_label ("...");
4592 gtk_signal_connect_object (GTK_OBJECT (sound_server_connect_file_dialog_button), "clicked", GTK_SIGNAL_FUNC (sound_server_connect_file_dialog), NULL);
4593 gtk_table_attach (GTK_TABLE (table), sound_server_connect_file_dialog_button, 2, 3, 5, 6, 0, 0, 0, 0);
4594 gtk_widget_show (sound_server_connect_file_dialog_button);
4595
4596
4597 // Test button
4598 sound_server_connect_file_test_button = sound_test_button_new();
4599 gtk_signal_connect_object (GTK_OBJECT (sound_server_connect_file_test_button), "clicked", GTK_SIGNAL_FUNC (play_sound_pref), (gpointer)sound_server_connect_entry);
4600 gtk_table_attach (GTK_TABLE (table), sound_server_connect_file_test_button, 3, 4, 5, 6, 0, 0, 0, 0);
4601 gtk_widget_show (sound_server_connect_file_test_button);
4602
4603 /* Sound Redial Success Start */
4604
4605 label = gtk_label_new (_("Redial Success"));
4606 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
4607 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 6, 7, GTK_FILL, GTK_FILL, 0, 0);
4608 gtk_widget_show (label);
4609
4610 sound_redial_success_entry = gtk_entry_new ();
4611
4612 if (sound_redial_success) {
4613 gtk_entry_set_text (GTK_ENTRY (sound_redial_success_entry), sound_redial_success);
4614 gtk_entry_set_position (GTK_ENTRY (sound_redial_success_entry), 0);
4615 }
4616 gtk_table_attach_defaults (GTK_TABLE (table), sound_redial_success_entry, 1, 2, 6, 7);
4617 gtk_widget_show (sound_redial_success_entry);
4618
4619 // File selection dialog
4620 sound_redial_success_file_dialog_button = gtk_button_new_with_label ("...");
4621 gtk_signal_connect_object (GTK_OBJECT (sound_redial_success_file_dialog_button), "clicked", GTK_SIGNAL_FUNC (sound_redial_success_file_dialog), NULL);
4622 gtk_table_attach (GTK_TABLE (table), sound_redial_success_file_dialog_button, 2, 3, 6, 7, 0, 0, 0, 0);
4623 gtk_widget_show (sound_redial_success_file_dialog_button);
4624
4625
4626 // Test button
4627 sound_redial_success_file_test_button = sound_test_button_new();
4628 gtk_signal_connect_object (GTK_OBJECT (sound_redial_success_file_test_button), "clicked", GTK_SIGNAL_FUNC (play_sound_pref), (gpointer)sound_redial_success_entry);
4629 gtk_table_attach (GTK_TABLE (table), sound_redial_success_file_test_button, 3, 4, 6, 7, 0, 0, 0, 0);
4630 gtk_widget_show (sound_redial_success_file_test_button);
4631
4632 /* */
4633
4634 sound_set_widgets_sensitive(sound_enable);
4635
4636 gtk_widget_show (table);
4637 gtk_widget_show (frame);
4638
4639 gtk_widget_show (page_vbox);
4640
4641 return page_vbox;
4642 }
4643
4644 // constructor for generic_prefs
new_generic_prefs(void)4645 static struct generic_prefs* new_generic_prefs (void) {
4646 int i;
4647
4648 struct generic_prefs* new_genprefs;
4649
4650 new_genprefs = g_malloc0 (sizeof (struct generic_prefs) * GAMES_TOTAL);
4651
4652 pref_q1_top_color = default_q1_top_color;
4653 pref_q1_bottom_color = default_q1_bottom_color;
4654
4655 pref_qw_top_color = default_qw_top_color;
4656 pref_qw_bottom_color = default_qw_bottom_color;
4657
4658 pref_b_switch = default_b_switch;
4659 pref_w_switch = default_w_switch;
4660 pref_qw_noskins = default_qw_noskins;
4661 pref_q2_noskins = default_q2_noskins;
4662
4663 pref_qw_skin = g_strdup (default_qw_skin);
4664 pref_q2_skin = g_strdup (default_q2_skin);
4665
4666 new_genprefs[Q1_SERVER].add_options_to_notebook = add_q1_options_to_notebook;
4667 new_genprefs[QW_SERVER].add_options_to_notebook = add_qw_options_to_notebook;
4668 new_genprefs[Q2_SERVER].add_options_to_notebook = add_q2_options_to_notebook;
4669 new_genprefs[Q3_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4670 new_genprefs[UN_SERVER].add_options_to_notebook = add_un_options_to_notebook;
4671 new_genprefs[UT2_SERVER].add_options_to_notebook = add_ut2_options_to_notebook;
4672 new_genprefs[WO_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4673 new_genprefs[WOET_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4674 new_genprefs[ETL_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4675 new_genprefs[DOOM3_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4676 new_genprefs[Q4_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4677 new_genprefs[ETQW_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4678 new_genprefs[COD_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4679 new_genprefs[JK2_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4680 new_genprefs[JK3_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4681 new_genprefs[SOF2S_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4682 new_genprefs[T2_SERVER].add_options_to_notebook = add_t2_options_to_notebook;
4683 new_genprefs[EF_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4684 new_genprefs[NEXUIZ_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4685 new_genprefs[XONOTIC_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4686 new_genprefs[WARSOW_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4687 new_genprefs[TREMULOUS_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4688 new_genprefs[TREMULOUSGPP_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4689 new_genprefs[TREMFUSION_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4690 new_genprefs[UNVANQUISHED_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4691 new_genprefs[OPENARENA_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4692 new_genprefs[Q3RALLY_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4693 new_genprefs[WOP_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4694 new_genprefs[IOURT_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4695 new_genprefs[REACTION_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4696 new_genprefs[SMOKINGUNS_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4697 new_genprefs[ZEQ2LITE_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4698 new_genprefs[TURTLEARENA_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4699 new_genprefs[ALIENARENA_SERVER].add_options_to_notebook = add_q3_options_to_notebook;
4700
4701 for (i = 0; i < GAMES_TOTAL; i++) {
4702 new_genprefs[i].pref_dir = g_strdup (games[i].dir);
4703 new_genprefs[i].real_dir = g_strdup (games[i].real_dir);
4704 g_datalist_init(&new_genprefs[i].games_data);
4705 }
4706
4707 return new_genprefs;
4708 }
4709
generic_prefs_free(struct generic_prefs * prefs)4710 static void generic_prefs_free(struct generic_prefs* prefs) {
4711 int i;
4712 if (!prefs) return;
4713
4714 g_free(pref_qw_skin);
4715 g_free(pref_q2_skin);
4716
4717 for (i = 0; i < GAMES_TOTAL; i++) {
4718 g_free(prefs[i].pref_dir);
4719 g_free(prefs[i].real_dir);
4720 g_datalist_clear(&prefs[i].games_data);
4721 }
4722 g_free(prefs);
4723 }
4724
preferences_dialog(int page_num)4725 void preferences_dialog (int page_num) {
4726 GtkWidget *vbox;
4727 GtkWidget *hbox;
4728 GtkWidget *label;
4729 GtkWidget *page;
4730 GtkWidget *button;
4731 GtkWidget *window;
4732 int game_num;
4733 int i;
4734
4735 debug (5, "preferences_dialog()");
4736
4737 game_num = page_num / 256;
4738 page_num = page_num % 256;
4739
4740 genprefs = new_generic_prefs ();
4741
4742 window = dialog_create_modal_transient_window (_("XQF: Preferences"), TRUE, FALSE, NULL);
4743 if (!GTK_WIDGET_REALIZED (window)) {
4744 gtk_widget_realize (window);
4745 }
4746
4747 allocate_quake_player_colors (window->window);
4748
4749 vbox = gtk_vbox_new (FALSE, 8);
4750 gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
4751 gtk_container_add (GTK_CONTAINER (window), vbox);
4752
4753 /*
4754 * Notebook
4755 */
4756
4757 pref_notebook = gtk_notebook_new ();
4758 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (pref_notebook), GTK_POS_TOP);
4759 gtk_notebook_set_tab_hborder (GTK_NOTEBOOK (pref_notebook), 4);
4760 gtk_box_pack_start (GTK_BOX (vbox), pref_notebook, FALSE, FALSE, 0);
4761
4762 page = general_options_page ();
4763 label = gtk_label_new (_("General"));
4764 gtk_widget_show (label);
4765 gtk_notebook_append_page (GTK_NOTEBOOK (pref_notebook), page, label);
4766
4767 /*
4768 page = player_profile_page ();
4769 label = gtk_label_new (_("Player Profile"));
4770 gtk_widget_show (label);
4771 gtk_notebook_append_page (GTK_NOTEBOOK (pref_notebook), page, label);
4772 */
4773
4774 page = games_config_page (game_num);
4775 label = gtk_label_new (_("Games"));
4776 gtk_widget_show (label);
4777 gtk_notebook_append_page (GTK_NOTEBOOK (pref_notebook), page, label);
4778
4779 page = appearance_options_page ();
4780 label = gtk_label_new (_("Appearance"));
4781 gtk_widget_show (label);
4782 gtk_notebook_append_page (GTK_NOTEBOOK (pref_notebook), page, label);
4783
4784 page = qstat_options_page ();
4785 label = gtk_label_new (_("QStat"));
4786 gtk_widget_show (label);
4787 gtk_notebook_append_page (GTK_NOTEBOOK (pref_notebook), page, label);
4788
4789 page = sound_options_page ();
4790 label = gtk_label_new (_("Sounds"));
4791 gtk_widget_show (label);
4792 gtk_notebook_append_page (GTK_NOTEBOOK (pref_notebook), page, label);
4793
4794 page = scripts_config_page ();
4795 label = gtk_label_new (_("Scripts"));
4796 gtk_widget_show (label);
4797 gtk_notebook_append_page (GTK_NOTEBOOK (pref_notebook), page, label);
4798
4799 gtk_notebook_set_page (GTK_NOTEBOOK (pref_notebook), page_num);
4800
4801 /* Initialize skins and custom cfgs */
4802
4803 q1_skin_is_valid = TRUE;
4804 update_q1_skin ();
4805
4806 qw_skin_is_valid = TRUE;
4807 update_qw_skins (pref_qw_skin);
4808
4809 q2_skin_is_valid = TRUE;
4810 update_q2_skins (pref_q2_skin);
4811
4812 for (i = 0; i < GAMES_TOTAL; i++) {
4813 update_cfgs (i, genprefs[i].real_dir, games[i].game_cfg);
4814 }
4815
4816 gtk_widget_show (pref_notebook);
4817
4818 /*
4819 * Buttons at the bottom
4820 */
4821
4822 hbox = gtk_hbox_new (FALSE, 8);
4823 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
4824
4825 button = gtk_button_new_with_label (_("Cancel"));
4826 gtk_widget_set_usize (button, 80, -1);
4827 gtk_signal_connect_object (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT (window));
4828 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4829 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4830 gtk_widget_show (button);
4831
4832 button = gtk_button_new_with_label (_("OK"));
4833 gtk_widget_set_usize (button, 80, -1);
4834 gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (ok_callback), GTK_OBJECT(window));
4835 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4836 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
4837 gtk_widget_grab_default (button);
4838 gtk_widget_show (button);
4839
4840 gtk_widget_show (hbox);
4841
4842 gtk_widget_show (vbox);
4843
4844 gtk_widget_show (window);
4845
4846 gtk_main ();
4847
4848 unregister_window (window);
4849
4850 /* clean up */
4851
4852 generic_prefs_free(genprefs);
4853 genprefs=NULL;
4854
4855 if (color_menu) {
4856 gtk_widget_destroy (color_menu);
4857 color_menu = NULL;
4858 }
4859
4860 qw_skin_preview = NULL;
4861 q2_skin_preview = NULL;
4862
4863 if (q1_skin_data) {
4864 g_free(q1_skin_data);
4865 q1_skin_data=NULL;
4866 }
4867
4868 if (qw_skin_data) {
4869 g_free(qw_skin_data);
4870 qw_skin_data = NULL;
4871 }
4872
4873 if (q2_skin_data) {
4874 g_free(q2_skin_data);
4875 q2_skin_data = NULL;
4876 }
4877 }
4878
4879
4880 // set some defaults when xqf is called the first time
user_fix_defaults(void)4881 static void user_fix_defaults (void) {
4882 char** files = NULL;
4883 char* suggested_file = NULL;
4884 char* guessed_dir = NULL;
4885 char str[256];
4886 int i;
4887 int j = 0;
4888
4889 debug(1, "Setting defaults");
4890
4891 for (i = 0; i < GAMES_TOTAL; i++) {
4892 files = games[i].command;
4893 if (!files) continue;
4894 suggested_file = find_file_in_path_list_relative(files);
4895 if (!suggested_file) continue;
4896
4897 j++;
4898
4899 g_snprintf (str, 256, "/" CONFIG_FILE "/Game: %s/cmd", type2id (games[i].type));
4900 config_set_string (str, suggested_file);
4901 debug(1,"set command %s for %s",suggested_file,games[i].name);
4902
4903 guessed_dir = resolve_path(suggested_file);
4904 if (!guessed_dir) continue;
4905
4906 g_snprintf (str, 256, "/" CONFIG_FILE "/Game: %s/dir", type2id (games[i].type));
4907 config_set_string (str, guessed_dir);
4908 debug(1,"set command %s for %s",guessed_dir,games[i].name);
4909 }
4910
4911 if (j) {
4912 config_set_string ("/" CONFIG_FILE "/Appearance/show only configured games","true");
4913 debug(2,"%d games found, set 'show only configured games' to true", j);
4914 }
4915
4916 config_set_string ("/" CONFIG_FILE "/Games Config/player name", g_get_user_name ());
4917 }
4918
4919
fix_qw_player_color(int color)4920 int fix_qw_player_color (int color) {
4921 color = color % 16;
4922 if (color > 13) {
4923 color = 13;
4924 }
4925 return color;
4926 }
4927
4928
init_user_info(void)4929 int init_user_info (void) {
4930 if (!g_get_user_name () || !g_get_home_dir () || !g_get_tmp_dir () || !g_get_user_config_dir ()) {
4931 xqf_error(_("Unable to get user name/home directory/XDG config directory/tmp directory"));
4932 return FALSE;
4933 }
4934 user_rcdir = file_in_dir (g_get_user_config_dir (), XDG_RC_DIR);
4935 return TRUE;
4936 }
4937
4938
free_user_info(void)4939 void free_user_info (void) {
4940 if (user_rcdir) {
4941 g_free(user_rcdir);
4942 user_rcdir = NULL;
4943 }
4944 }
4945
4946 #define XQF_GTKRCNAME "gtkrc-2.0"
4947
set_style()4948 static void set_style() {
4949 char path[PATH_MAX];
4950 int deflt = 0;
4951
4952 use_custom_gtkrc = config_get_bool_with_default("use custom gtkrc=true", &deflt);
4953
4954 /** do not apply custom colors in GTK2 by default */
4955 if (deflt) {
4956 use_custom_gtkrc = FALSE;
4957 }
4958
4959 if (use_custom_gtkrc) {
4960 if (default_icontheme) {
4961 snprintf(path, sizeof(path), "%s/%s/" XQF_GTKRCNAME, default_icontheme, xqf_PACKAGE_DATA_DIR);
4962
4963 if (access(path, R_OK) != 0) {
4964 path[0] = '\0';
4965 }
4966 }
4967 else {
4968 path[0] = '\0';
4969 }
4970
4971 if (!*path) {
4972 snprintf(path, sizeof(path), "%s/default/" XQF_GTKRCNAME, xqf_PACKAGE_DATA_DIR);
4973 }
4974
4975 if (access(path, R_OK) == 0) {
4976 gtk_rc_parse(path);
4977 }
4978 }
4979 }
4980
prefs_load_for_game(enum server_type type)4981 static void prefs_load_for_game(enum server_type type) {
4982 char buf[256];
4983 struct game *g = &games[type];
4984
4985 if (!g->prefs_load) {
4986 return;
4987 }
4988
4989 g_snprintf (buf, sizeof(buf), "/" CONFIG_FILE "/Game: %s", type2id (type));
4990 config_push_prefix (buf);
4991
4992 g->prefs_load(g);
4993
4994 config_pop_prefix ();
4995 }
4996
q1_prefs_load(struct game * g)4997 void q1_prefs_load(struct game* g) {
4998 default_q1_name = config_get_string("player name");
4999 default_q1_top_color = config_get_int("top=0");
5000 default_q1_bottom_color = config_get_int("bottom=0");
5001 }
5002
qw_prefs_load(struct game * g)5003 void qw_prefs_load(struct game* g) {
5004 default_qw_name = config_get_string("player name");
5005 default_qw_team = config_get_string("team");
5006 default_qw_skin = config_get_string("skin");
5007 default_qw_top_color = config_get_int("top=0");
5008 default_qw_bottom_color = config_get_int("bottom=0");
5009
5010 default_qw_rate = config_get_int("rate=2500");
5011 default_qw_cl_nodelta = config_get_int("cl_nodelta=0");
5012 default_qw_cl_predict = config_get_int("cl_predict=1");
5013 default_qw_noskins = config_get_int("noskins=0");
5014 default_noaim = config_get_int("noaim=0");
5015 default_b_switch = config_get_int("b_switch=0");
5016 default_w_switch = config_get_int("w_switch=0");
5017 pushlatency_mode = config_get_int("pushlatency mode=1");
5018 pushlatency_value = config_get_int("pushlatency value=-50");
5019 }
5020
q2_prefs_load(struct game * g)5021 void q2_prefs_load(struct game* g) {
5022 default_q2_name = config_get_string("player name");
5023 default_q2_skin = config_get_string("skin");
5024 default_q2_rate = config_get_int("rate=2500");
5025 default_q2_cl_nodelta = config_get_int("cl_nodelta=0");
5026 default_q2_cl_predict = config_get_int("cl_predict=1");
5027 default_q2_noskins = config_get_int("noskins=0");
5028 }
5029
q3_prefs_load_common(struct game * g)5030 void q3_prefs_load_common(struct game* g) {
5031 char* tmp;
5032 enum server_type type = g->type;
5033 struct q3_common_prefs_s* w;
5034 char buf[256];
5035
5036 w = get_pref_widgets_for_game(type);
5037 g_return_if_fail(w->defproto != NULL);
5038
5039 g_snprintf(buf, sizeof(buf), "protocol=%s", w->defproto);
5040
5041 tmp = config_get_string(buf);
5042 if (strlen(tmp) == 0) {
5043 g_free(tmp);
5044 tmp = NULL;
5045 }
5046 game_set_attribute(type,"masterprotocol",tmp);
5047
5048 if (w->flags & Q3_PREF_SETFS_GAME) {
5049 game_set_attribute(type,"setfs_game",config_get_string("setfs_game=true"));
5050 }
5051
5052 if (w->flags & Q3_PREF_PB) {
5053 game_set_attribute(type,"set_punkbuster",config_get_string("set_punkbuster=true"));
5054 }
5055
5056 if (w->flags & Q3_PREF_CONSOLE) {
5057 game_set_attribute(type,"enable_console",config_get_string("enable_console=true"));
5058 }
5059 }
5060
q3_prefs_load(struct game * g)5061 void q3_prefs_load(struct game* g) {
5062 enum server_type type = g->type;
5063
5064 q3_prefs_load_common(g);
5065
5066 game_set_attribute(type,"pass_memory_options",config_get_string("pass_memory_options=false"));
5067 game_set_attribute(type,"com_hunkmegs",config_get_string("com_hunkmegs=54"));
5068 game_set_attribute(type,"com_zonemegs",config_get_string("com_zonemegs=16"));
5069 game_set_attribute(type,"com_soundmegs",config_get_string("com_soundmegs=8"));
5070 game_set_attribute(type,"cg_precachedmodels",config_get_string("cg_precachedmodels=3"));
5071 }
5072
tribes2_prefs_load(struct game * g)5073 void tribes2_prefs_load(struct game* g) {
5074 default_t2_name = config_get_string("player name");
5075 }
5076
prefs_load(void)5077 int prefs_load (void) {
5078 char *oldversion;
5079 int i;
5080 int old_rc_loaded;
5081 int newversion = FALSE;
5082
5083 oldversion = config_get_string("/" CONFIG_FILE "/Program/version");
5084
5085 old_rc_loaded = rc_parse ();
5086 if (old_rc_loaded == 0) {
5087 rc_save ();
5088 }
5089
5090 if (oldversion) {
5091 newversion = g_ascii_strcasecmp (oldversion, XQF_VERSION);
5092 g_free(oldversion);
5093 }
5094 else {
5095 newversion = TRUE;
5096 if (old_rc_loaded == -1) {
5097 user_fix_defaults();
5098 }
5099 }
5100
5101 do {
5102 int def = 0;
5103 struct rlimit rlim;
5104 char* coresize = NULL;
5105
5106 if (getrlimit(RLIMIT_CORE, &rlim)) break;
5107
5108 coresize = config_get_string_with_default ("/" CONFIG_FILE "/Program/coresize=0",&def);
5109 if (def || !coresize) break;
5110
5111 if (!strcmp(coresize,"unlimited")) {
5112 rlim.rlim_cur = RLIM_INFINITY;
5113 }
5114 else {
5115 char* endptr = NULL;
5116 long int size = strtol(coresize,&endptr,10);
5117 if (endptr==coresize || size < 0) break;
5118 rlim.rlim_cur = size;
5119 }
5120
5121 if (rlim.rlim_cur > rlim.rlim_max) {
5122 rlim.rlim_max = rlim.rlim_cur;
5123 }
5124
5125 if (setrlimit(RLIMIT_CORE,&rlim)) {
5126 xqf_warning("could not set core size %lu: %s",rlim.rlim_cur,strerror(errno));
5127 }
5128
5129 } while (0);
5130
5131 for (i = 0; i < GAMES_TOTAL; i++) {
5132 prefs_load_for_game (i);
5133 }
5134
5135 config_push_prefix ("/" CONFIG_FILE "/Games Config");
5136
5137 default_nosound = config_get_bool("nosound=false");
5138 default_nocdaudio = config_get_bool("nocdaudio=false");
5139
5140 config_pop_prefix();
5141
5142 config_push_prefix ("/" CONFIG_FILE "/Appearance");
5143
5144 show_hostnames = config_get_bool("show hostnames=true");
5145 show_default_port = config_get_bool("show default port=true");
5146 serverlist_countbots = config_get_bool("count bots=true");
5147 default_toolbar_style = config_get_int("toolbar style=2");
5148 default_toolbar_tips = config_get_bool("toolbar tips=true");
5149 default_refresh_sorts = config_get_bool("sort on refresh=true");
5150 default_refresh_on_update = config_get_bool("refresh on update=true");
5151 default_resolve_on_update = config_get_bool("resolve on update=false");
5152 default_show_only_configured_games = config_get_bool("show only configured games=false");
5153 default_icontheme = config_get_string("icontheme");
5154
5155 set_style();
5156
5157 config_pop_prefix();
5158
5159 config_push_prefix ("/" CONFIG_FILE "/General");
5160
5161 default_terminate = config_get_bool("terminate=false");
5162 default_iconify = config_get_bool("iconify=false");
5163 default_launchinfo = config_get_bool("launchinfo=true");
5164 default_stopxmms = config_get_bool("stopxmms=false");
5165 default_prelaunchexec = config_get_bool("prelaunchexec=false");
5166 default_save_lists = config_get_bool("save lists=true");
5167 default_save_srvinfo = config_get_bool("save srvinfo=true");
5168 default_save_plrinfo = config_get_bool("save players=false");
5169 default_auto_favorites = config_get_bool("refresh favorites=false");
5170 default_show_splash = config_get_bool("splash screen=true");
5171 default_auto_maps = config_get_bool("search maps=false");
5172 default_show_tray_icon = config_get_bool("showtray=false");
5173
5174 config_pop_prefix();
5175
5176 config_push_prefix ("/" CONFIG_FILE "/QStat");
5177
5178 maxretries = config_get_int("maxretires=3");
5179 maxsimultaneous = config_get_int("maxsimultaneous=20");
5180 qstat_srcport_low = config_get_int("port_low=0");
5181 qstat_srcport_high = config_get_int("port_high=0");
5182 qstat_srcport_changed = FALSE;
5183 qstat_srcip = config_get_string("srcip");
5184 qstat_srcip_changed = FALSE;
5185
5186 config_pop_prefix();
5187
5188 config_push_prefix ("/" CONFIG_FILE "/Sounds");
5189
5190 sound_enable = config_get_bool("sound_enable=false");
5191 sound_player = config_get_string("sound_player");
5192 sound_xqf_start = config_get_string("sound_xqf_start");
5193 sound_xqf_quit = config_get_string("sound_xqf_quit");
5194 sound_update_done = config_get_string("sound_update_done");
5195 sound_refresh_done = config_get_string("sound_refresh_done");
5196 sound_stop = config_get_string("sound_stop");
5197 sound_server_connect = config_get_string("sound_server_connect");
5198 sound_redial_success = config_get_string("sound_redial_success");
5199
5200 config_pop_prefix();
5201
5202 config_set_string ("/" CONFIG_FILE "/Program/version", XQF_VERSION);
5203 config_sync();
5204
5205 #ifdef DEBUG
5206 fprintf (stderr, "prefs_load(): program version %s\n", (newversion)? "changed" : "not changed");
5207 #endif
5208
5209 create_splashscreen();
5210
5211 /* Convert "dir" -> "real_dir" for all game types */
5212
5213 for (i = 0; i < GAMES_TOTAL; i++) {
5214 load_game_defaults (i);
5215
5216 if (default_auto_maps && !skip_startup_mapscan) {
5217 scan_maps_for(i);
5218 }
5219
5220 if (games[i].cmd_or_dir_changed) {
5221 games[i].cmd_or_dir_changed(&games[i]);
5222 }
5223 }
5224
5225 return newversion;
5226 }
5227
scan_maps_for(enum server_type type)5228 static void scan_maps_for(enum server_type type) {
5229 // translator: %s = game name, e.g. Quake 3 Arena
5230 char* msg = g_strdup_printf(_("Searching for %s maps"),games[type].name);
5231 guint per = 100/GAMES_TOTAL;
5232
5233 splash_increase_progress(msg,per);
5234 if (games[type].init_maps) {
5235 games[type].init_maps(games[type].type);
5236 }
5237
5238 g_free(msg);
5239 }
5240
5241 /*
5242 void prefs_save (void) {
5243 config_push_prefix ("/" CONFIG_FILE "/Preferences");
5244 config_set_bool ("show hostnames", show_hostnames);
5245 config_set_bool ("show default port", show_default_port);
5246 config_pop_prefix();
5247 config_sync();
5248 }
5249 */
5250
game_file_dialog_ok_callback(GtkWidget * ok_button,gpointer data)5251 void game_file_dialog_ok_callback (GtkWidget *ok_button, gpointer data) {
5252 enum server_type type;
5253 const char *filename = NULL;
5254 GtkWidget* filesel = topmost_parent(ok_button);
5255
5256 if (!filesel) {
5257 return;
5258 }
5259
5260 type = (enum server_type) GPOINTER_TO_INT(data);
5261
5262 if (type >= UNKNOWN_SERVER) {
5263 return;
5264 }
5265
5266 filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (filesel));
5267
5268 if (filename) {
5269 gtk_entry_set_text (GTK_ENTRY (genprefs[type].cmd_entry), filename);
5270 pref_guess_dir (type, filename, TRUE);
5271 }
5272 }
5273
game_file_activate_callback(enum server_type type)5274 void game_file_activate_callback (enum server_type type) {
5275 const char* file = gtk_entry_get_text (GTK_ENTRY (genprefs[type].cmd_entry));
5276
5277 pref_guess_dir (type, file, TRUE);
5278 }
5279
game_file_dialog(enum server_type type)5280 void game_file_dialog(enum server_type type) {
5281 file_dialog(_("Game Command Selection"), GTK_SIGNAL_FUNC(game_file_dialog_ok_callback), GINT_TO_POINTER(type));
5282 }
5283
game_dir_dialog(enum server_type type)5284 void game_dir_dialog(enum server_type type) {
5285 if (type >= UNKNOWN_SERVER) {
5286 return;
5287 }
5288
5289 file_dialog_textentry(_("Game Directory Selection"), genprefs[type].dir_entry);
5290 }
5291
sound_player_file_dialog()5292 void sound_player_file_dialog() {
5293 file_dialog_textentry(_("Sound Player Selection"), sound_player_entry);
5294 }
5295
sound_xqf_start_file_dialog()5296 void sound_xqf_start_file_dialog() {
5297 file_dialog_textentry(_("XQF Start Sound Selection"), sound_xqf_start_entry);
5298 }
5299
sound_xqf_quit_file_dialog()5300 void sound_xqf_quit_file_dialog() {
5301 file_dialog_textentry(_("XQF Quit Sound Selection"), sound_xqf_quit_entry);
5302 }
5303
sound_update_done_file_dialog()5304 void sound_update_done_file_dialog() {
5305 file_dialog_textentry(_("Update Done Sound Selection"), sound_update_done_entry);
5306 }
5307
sound_refresh_done_file_dialog()5308 void sound_refresh_done_file_dialog() {
5309 file_dialog_textentry(_("Refresh Done Sound Selection"), sound_refresh_done_entry);
5310 }
5311
sound_stop_file_dialog()5312 void sound_stop_file_dialog() {
5313 file_dialog_textentry(_("Stop Sound Selection"), sound_stop_entry);
5314 }
5315
sound_server_connect_file_dialog()5316 void sound_server_connect_file_dialog() {
5317 file_dialog_textentry(_("Server Connect Sound Selection"), sound_server_connect_entry);
5318 }
5319
sound_redial_success_file_dialog()5320 void sound_redial_success_file_dialog() {
5321 file_dialog_textentry(_("Redial Success Sound Selection"), sound_redial_success_entry);
5322 }
5323
5324 /*
5325 void file_dialog_destroy_callback (GtkWidget *widget, gpointer data) {
5326 }
5327 */
5328
q1_cmd_or_dir_changed(struct game * g)5329 void q1_cmd_or_dir_changed(struct game* g) {
5330 update_q1_skin();
5331 }
5332
qw_cmd_or_dir_changed(struct game * g)5333 void qw_cmd_or_dir_changed(struct game* g) {
5334 update_qw_skins (NULL);
5335 }
5336
q2_cmd_or_dir_changed(struct game * g)5337 void q2_cmd_or_dir_changed(struct game* g) {
5338 update_q2_skins (NULL);
5339 }
5340
ut2004_cmd_or_dir_changed(struct game * g)5341 void ut2004_cmd_or_dir_changed(struct game* g) {
5342 ut2004_detect_cdkey(g);
5343 }
5344
doom3_cmd_or_dir_changed(struct game * g)5345 void doom3_cmd_or_dir_changed(struct game* g) {
5346 doom3_detect_version(g);
5347 }
5348
tremulous_cmd_or_dir_changed(struct game * g)5349 void tremulous_cmd_or_dir_changed(struct game* g) {
5350 doom3_detect_version(g);
5351 }
5352