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