diff -uNr xqf-1.0.5/src/filter.c xqf-1.0.5+cvars7+be+ref/src/filter.c --- xqf-1.0.5/src/filter.c 2005-08-14 07:01:59.000000000 -0400 +++ xqf-1.0.5+cvars7+be+ref/src/filter.c 2007-05-28 18:28:53.000000000 -0400 @@ -52,7 +52,8 @@ static int last_row_right_list = 0; static int last_row_country_list = 0; #endif - +static void svars_select_button_pressed(); +static void svars_clear_list(GtkWidget * widget, gpointer data); static void server_filter_vars_free(struct server_filter_vars* v); static int server_pass_filter (struct server *s); @@ -157,6 +158,7 @@ static GtkWidget *version_contains_entry; static GtkWidget *map_contains_entry; static GtkWidget *server_name_contains_entry; +static GtkWidget *at_least_that_num_spinner; #ifdef USE_GEOIP static GtkWidget *country_left_list; static GtkWidget *country_right_list; @@ -166,6 +168,12 @@ static GtkWidget *country_clear_button; static GtkWidget *country_show_all_check_button; #endif +static GtkWidget *scrolledwindow_fsvars; +static GtkWidget *svars_filter_list; +static GtkWidget *svars_selection_button; +static GtkWidget *svars_clear_button; + + static struct server_filter_vars* server_filter_vars_new() { @@ -183,11 +191,12 @@ f->version_contains = NULL; f->game_type = NULL; f->map_contains = NULL; - f->server_name_contains=NULL; + f->server_name_contains = NULL; + f->at_least_that_num = 0; #ifdef USE_GEOIP f->countries = g_array_new (FALSE, FALSE, sizeof (int)); #endif - + f->svars = NULL; return f; } @@ -205,6 +214,8 @@ g_array_free(v->countries,TRUE); v->countries=NULL; #endif + g_strfreev(v->svars); + v->svars = NULL; } // deep copy of server_filter_vars @@ -230,6 +241,7 @@ f->game_type = g_strdup(v->game_type); f->map_contains = g_strdup(v->map_contains); f->server_name_contains = g_strdup(v->server_name_contains); + f->at_least_that_num = v->at_least_that_num; #ifdef USE_GEOIP //FIXME reserve space first, then insert @@ -237,7 +249,8 @@ g_array_append_val (f->countries,g_array_index(v->countries,int,i)); #endif - + //g_strdupv from glib2 for compatibility with glib1 compiles (in utils.c) + f->svars = g_strdupv2(v->svars); return f; } @@ -259,13 +272,19 @@ printf(" game type: %s\n",f->game_type); printf(" map: %s\n",f->map_contains); printf(" server name: %s\n",f->server_name_contains); + printf(" players at least: %d\n",f->at_least_that_num); #ifdef USE_GEOIP for (i =0; i< f->countries->len;i++) - printf("country id: %d ",g_array_index(f->countries,int,i)); - printf("\n"); + printf(" country id %d: %d \n", i + 1, g_array_index(f->countries,int,i)); + //printf("\n"); #endif + for (i = 0; f->svars && f->svars[i]; i++) + printf(" custom svar %d: %s \n", i + 1, f->svars[i]); + + printf("\n"); + } void apply_filters (unsigned mask, struct server *s) { @@ -381,7 +400,7 @@ else if(!lowcasestrstr(s->game,filter->game_contains)) return FALSE; } - + if( filter->game_type && *filter->game_type ) { if( !s->gametype ) @@ -434,6 +453,51 @@ #endif + + /* Custom server info variables. Trying to satisfy all lines and + comma separated values on each line. */ + if (filter->svars != NULL ) { + int i,y; + char **tmp; + char **tmp2; + gboolean not_even_here; + gboolean line_did_not_match; + for (i = 0; filter->svars && filter->svars[i]; ++i) { + //for each filtered var check if at least having it, reset the bools. + not_even_here = TRUE; + line_did_not_match = TRUE; + for (info_ptr = s->info; info_ptr && *info_ptr; info_ptr += 2) { + tmp = g_strsplit(filter->svars[i], " = ", 2); + if (!g_ascii_strcasecmp(*info_ptr, tmp[0])) { + //at least I have the var + not_even_here = FALSE; + //check comma separated values + tmp2 = g_strsplit(tmp[1], ",", 0); + for (y = 0; tmp2[y]; y++) { + g_strstrip(tmp2[y]); + if (!g_ascii_strcasecmp(info_ptr[1], tmp2[y])) { + //matched one of the comma separated values + line_did_not_match = FALSE; + } + } + if (line_did_not_match) { + g_strfreev(tmp2); + g_strfreev(tmp); + return FALSE; + } + g_strfreev(tmp2); + } + g_strfreev(tmp); + } + if (not_even_here) + return FALSE; + } + } + + //At least that number of players + if(players < filter->at_least_that_num) + return FALSE; + if( filter->server_name_contains && *filter->server_name_contains ) { if( !s->name ) @@ -454,9 +518,9 @@ int isdefault = FALSE; // used to determine whether key exists in config char* filtername; -#ifdef USE_GEOIP +//#ifdef USE_GEOIP char *str = NULL; -#endif +//#endif struct server_filter_vars* filter; @@ -490,6 +554,7 @@ filter->game_type = config_get_string("game_type"); filter->map_contains = config_get_string("map_contains"); filter->server_name_contains = config_get_string("server_name_contains"); + filter->at_least_that_num = config_get_int ("at_least_that_num=0"); #ifdef USE_GEOIP /*country filter ids*/ @@ -511,6 +576,9 @@ } #endif + + filter->svars = g_strsplit(config_get_string("svars_include"), " || ", 0); + g_array_append_val(server_filters,filter); config_pop_prefix (); @@ -560,14 +628,16 @@ { #ifdef USE_GEOIP int country_nr; - int i; +// int i; #endif + int i; struct server_filter_vars* filter = server_filter_vars_new(); if(!filter) return NULL; filter->filter_retries = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (filter_retries_spinner)); filter->filter_ping = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (filter_ping_spinner)); + filter->at_least_that_num = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (at_least_that_num_spinner)); filter->filter_not_full = GTK_TOGGLE_BUTTON (filter_not_full_check_button)->active; filter->filter_not_empty = GTK_TOGGLE_BUTTON (filter_not_empty_check_button)->active; filter->filter_no_password = GTK_TOGGLE_BUTTON (filter_no_password_check_button)->active; @@ -577,7 +647,6 @@ filter->game_contains = gtk_editable_get_chars (GTK_EDITABLE (game_contains_entry), 0, -1 ); filter->map_contains = gtk_editable_get_chars (GTK_EDITABLE (map_contains_entry), 0, -1 ); filter->server_name_contains = gtk_editable_get_chars (GTK_EDITABLE (server_name_contains_entry), 0, -1 ); - #ifdef USE_GEOIP for (i = 0; i < last_row_country_list; ++i) { @@ -586,6 +655,16 @@ } #endif + + if (GTK_CLIST(svars_filter_list)->rows) { + filter->svars = (char **) g_malloc0 ((GTK_CLIST(svars_filter_list)->rows + 1)* sizeof(char*)); + char *tmp; + for (i = 0; i < GTK_CLIST(svars_filter_list)->rows; i++) { + gtk_clist_get_text(GTK_CLIST(svars_filter_list), i, 0, &tmp); + filter->svars[i] = (char *) g_malloc0 (strlen(tmp) + 1); + strcpy(filter->svars[i], tmp); + } + } return filter; } @@ -705,6 +784,11 @@ filters[FILTER_SERVER].changed = FILTER_CHANGED; } + if (oldfilter->at_least_that_num != newfilter->at_least_that_num) { + config_set_int ("at_least_that_num", oldfilter->at_least_that_num = newfilter->at_least_that_num); + filters[FILTER_SERVER].changed = FILTER_CHANGED; + } + /* GAMECONTAINS string values -- baa */ text_changed = 0; if(newfilter->game_contains && strlen(newfilter->game_contains )){ @@ -878,6 +962,10 @@ #endif + if (newfilter->svars != NULL) { + config_set_string ("svars_include", g_strjoinv(" || ", newfilter->svars)); + filters[FILTER_SERVER].changed = FILTER_CHANGED; + } if (oldfilter->filter_not_full != newfilter->filter_not_full) { config_set_bool ("not full", oldfilter->filter_not_full = newfilter->filter_not_full); @@ -1083,6 +1171,7 @@ gtk_widget_set_sensitive(game_contains_entry,sensitive); gtk_widget_set_sensitive(map_contains_entry,sensitive); gtk_widget_set_sensitive(server_name_contains_entry,sensitive); + gtk_widget_set_sensitive(at_least_that_num_spinner,sensitive); gtk_widget_set_sensitive(filter_ping_spinner,sensitive); gtk_widget_set_sensitive(filter_retries_spinner,sensitive); gtk_widget_set_sensitive(filter_not_full_check_button,sensitive); @@ -1101,6 +1190,12 @@ } } #endif + gtk_widget_set_sensitive(svars_filter_list, sensitive); + gtk_widget_set_sensitive(scrolledwindow_fsvars, sensitive); + gtk_widget_set_sensitive(svars_selection_button, sensitive); + gtk_widget_set_sensitive(svars_clear_button, sensitive); + if (!sensitive) + gtk_clist_clear(GTK_CLIST(svars_filter_list)); } static void server_filter_fill_widgets(guint num) @@ -1115,7 +1210,7 @@ struct pixmap* countrypix = NULL; buf[2]='\0'; -#endif +#endif if(num > 0) { @@ -1152,7 +1247,7 @@ gchar *text[1] = {buf}; if (filter->countries != NULL) { - + for (i = 0; i < filter->countries->len; ++i) { f_number=g_array_index(filter->countries,int,i); @@ -1176,9 +1271,18 @@ #endif + gtk_clist_clear(GTK_CLIST(svars_filter_list)); + if (filter->svars) { + int i; + for (i = 0; filter->svars[i]; i++) + gtk_clist_append(GTK_CLIST(svars_filter_list), &filter->svars[i]); + } + gtk_adjustment_set_value(gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON(filter_ping_spinner)),filter->filter_ping); gtk_adjustment_set_value(gtk_spin_button_get_adjustment( + GTK_SPIN_BUTTON(at_least_that_num_spinner)),filter->at_least_that_num); + gtk_adjustment_set_value(gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON(filter_retries_spinner)),filter->filter_retries); gtk_toggle_button_set_active ( @@ -1212,9 +1316,9 @@ GtkWidget *button; GtkObject *adj; -#ifdef USE_GEOIP +//#ifdef USE_GEOIP GtkWidget *vbuttonbox1; -#endif +//#endif // char label_buf[64]; @@ -1296,11 +1400,11 @@ alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); gtk_container_add (GTK_CONTAINER (frame), alignment); - #ifdef USE_GEOIP +// #ifdef USE_GEOIP table = gtk_table_new (8, 5, FALSE); - #else - table = gtk_table_new (6, 5, FALSE); - #endif +// #else +// table = gtk_table_new (6, 5, FALSE); +// #endif gtk_table_set_row_spacings (GTK_TABLE (table), 2); gtk_table_set_col_spacings (GTK_TABLE (table), 4); @@ -1327,8 +1431,7 @@ gtk_table_attach_defaults (GTK_TABLE (table), filter_ping_spinner, 1, 2, row, row+1); gtk_widget_show (filter_ping_spinner); - - /* GAMECONTAINS Filter -- baa */ + /* GAMECONTAINS Filter -- baa */ /* http://developer.gnome.org/doc/API/gtk/gtktable.html */ label = gtk_label_new (_("the game contains the string")); @@ -1461,6 +1564,25 @@ gtk_widget_show (server_name_contains_entry); row++; + + /* at least that num of players*/ + label = gtk_label_new (_("with at least that number of players")); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_table_attach (GTK_TABLE (table), label, 3, 4, row, row+1, GTK_FILL, GTK_FILL, + 0, 0); + gtk_widget_show (label); + + adj = gtk_adjustment_new (0, 0, 99, 1, 100, 0); + + at_least_that_num_spinner = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 0, 0); + gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (at_least_that_num_spinner), + GTK_UPDATE_ALWAYS); + gtk_widget_set_usize (at_least_that_num_spinner, 64, -1); + gtk_signal_connect_object (GTK_OBJECT (at_least_that_num_spinner), "changed", + GTK_SIGNAL_FUNC (server_filter_set_changed_callback), (gpointer) TRUE); + gtk_table_attach_defaults (GTK_TABLE (table), at_least_that_num_spinner, 4, 5, row, row+1); + gtk_widget_show (at_least_that_num_spinner); + /*row=5..6*/ /* no password */ @@ -1487,7 +1609,7 @@ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolledwindow_fcountry), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - + country_filter_list = gtk_clist_new(1); gtk_clist_set_shadow_type(GTK_CLIST(country_filter_list),GTK_SHADOW_NONE); gtk_widget_set_sensitive(country_filter_list,FALSE); @@ -1543,6 +1665,76 @@ gtk_widget_set_usize(country_clear_button, 80, -1); #endif +//svars + label = gtk_label_new(_("Custom server info variables:")); + gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, 6, 7); + gtk_misc_set_padding(GTK_MISC(label), 0, 15); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_widget_show(label); + + scrolledwindow_fsvars = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_set_sensitive(scrolledwindow_fsvars,FALSE); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW + (scrolledwindow_fsvars), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + //char *titles[1] = { _("Svar and value") }; + //svars_filter_list = gtk_clist_new_with_titles(1, titles); + svars_filter_list = gtk_clist_new(1); + gtk_clist_set_shadow_type(GTK_CLIST(svars_filter_list),GTK_SHADOW_NONE); + gtk_widget_set_sensitive(svars_filter_list,FALSE); + + + gtk_clist_set_column_justification(GTK_CLIST(svars_filter_list), 0, + GTK_JUSTIFY_LEFT); + gtk_clist_set_column_width(GTK_CLIST(svars_filter_list), 0, 100); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW + (scrolledwindow_fsvars), + svars_filter_list); + + gtk_widget_set_usize(scrolledwindow_fsvars, 100, 100); + + gtk_table_attach_defaults(GTK_TABLE(table), scrolledwindow_fsvars, 2, + 4, 7, 8); + gtk_widget_show(scrolledwindow_fsvars); + gtk_widget_show(svars_filter_list); + + + //svars add and clear buttons + vbuttonbox1 = gtk_vbutton_box_new(); + gtk_widget_show(vbuttonbox1); + gtk_table_attach_defaults(GTK_TABLE(table), vbuttonbox1, 4, 5, 7, 8); + gtk_button_box_set_layout(GTK_BUTTON_BOX(vbuttonbox1), + GTK_BUTTONBOX_START); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(vbuttonbox1), 1); + gtk_button_box_set_child_size(GTK_BUTTON_BOX(vbuttonbox1), 80, 0); + gtk_button_box_set_child_ipadding(GTK_BUTTON_BOX(vbuttonbox1), 5, -1); + + svars_selection_button = gtk_button_new_with_label(_("add...")); + gtk_widget_set_sensitive(svars_selection_button,FALSE); + gtk_widget_show(svars_selection_button); + gtk_container_add(GTK_CONTAINER(vbuttonbox1), + svars_selection_button); + gtk_widget_set_usize(svars_selection_button, 80, -1); + gtk_signal_connect(GTK_OBJECT(svars_selection_button), "clicked", + GTK_SIGNAL_FUNC(svars_select_button_pressed), NULL); + + gtk_signal_connect_object(GTK_OBJECT(svars_selection_button), "clicked", + GTK_SIGNAL_FUNC(server_filter_set_changed_callback),(gpointer) TRUE); + + + svars_clear_button = gtk_button_new_with_label(_("clear")); + gtk_widget_set_sensitive(svars_clear_button,FALSE); + gtk_signal_connect(GTK_OBJECT(svars_clear_button), "clicked", + GTK_SIGNAL_FUNC(svars_clear_list), NULL); + gtk_signal_connect_object(GTK_OBJECT(svars_clear_button), "clicked", + GTK_SIGNAL_FUNC(server_filter_set_changed_callback),(gpointer) TRUE); + + + gtk_widget_show(svars_clear_button); + gtk_container_add(GTK_CONTAINER(vbuttonbox1), svars_clear_button); + gtk_widget_set_usize(svars_clear_button, 80, -1); +//-svars + gtk_widget_show (table); gtk_widget_show (alignment); gtk_widget_show (frame); @@ -2138,6 +2330,27 @@ } #endif +static void svars_select_button_pressed() +{ + char *svar = enter_string_dialog(TRUE,_("Enter a server variable")); + char *value; + if (svar) + value = enter_string_dialog(TRUE,_("Enter its value, comma separated values allowed (e.g. abc or 0,2,7)")); + if (svar && value) { + g_strstrip(value); + gchar *sv = g_strconcat(svar, " = ", value, NULL); + gtk_clist_append(GTK_CLIST(svars_filter_list), &sv); + g_free(sv); + g_free(value); + } + g_free(svar); +} + +static void svars_clear_list(GtkWidget * widget, gpointer data) +{ + gtk_clist_clear(GTK_CLIST(svars_filter_list)); +} + unsigned filter_time_inc() { ++filter_current_time; diff -uNr xqf-1.0.5/src/filter.h xqf-1.0.5+cvars7+be+ref/src/filter.h --- xqf-1.0.5/src/filter.h 2004-07-24 16:32:39.000000000 -0400 +++ xqf-1.0.5+cvars7+be+ref/src/filter.h 2007-05-28 17:42:16.000000000 -0400 @@ -58,9 +58,11 @@ char *game_type; char *map_contains; char *server_name_contains; + int at_least_that_num; #ifdef USE_GEOIP - GArray *countries; + GArray *countries; #endif + char **svars; }; diff -uNr xqf-1.0.5/src/game.c xqf-1.0.5+cvars7+be+ref/src/game.c --- xqf-1.0.5/src/game.c 2006-06-18 09:15:18.000000000 -0400 +++ xqf-1.0.5+cvars7+be+ref/src/game.c 2007-04-03 21:21:57.000000000 -0400 @@ -999,6 +999,18 @@ "Bomb Mode", /* 8 = Bomb Mode */ }; +#define MAX_Q3A_UT4_TYPES 9 +static char *q3a_ut4_gametypes[MAX_Q3A_UT4_TYPES] = { + "FFA", /* 0 = Free for All */ + "FFA", /* 1 = Free for All */ + "FFA", /* 2 = Free for All */ + "TDM", /* 3 = Team Deathmatch */ + "Team Survivor", /* 4 = Team Survivor */ + "Follow the Leader", /* 5 = Follow the Leader */ + "Capture & Hold", /* 6 = Capture & Hold */ + "CTF", /* 7 = Capture the Flag */ + "Bomb Mode", /* 8 = Bomb Mode */ +}; #define MAX_Q3A_Q3TC045_TYPES 11 static char *q3a_q3tc045_gametypes[MAX_Q3A_Q3TC045_TYPES] = { @@ -1223,6 +1235,11 @@ MAX_Q3A_UT3_TYPES }, { + "q3ut4", + q3a_ut4_gametypes, + MAX_Q3A_UT4_TYPES + }, + { "threewave", q3a_threewave_gametypes, MAX_Q3A_THREEWAVE_TYPES @@ -1568,6 +1585,10 @@ else if (!strcmp(*info_ptr, "sv_punkbuster") && info_ptr[1] && info_ptr[1][0] == '1') { s->flags |= SERVER_PUNKBUSTER; } + else if (!strcmp(*info_ptr, "sv_battleye") && info_ptr[1] && info_ptr[1][0 +] == '1') { + s->flags |= SERVER_BATTLEYE; + } else if (!strcmp(*info_ptr, "protocol")) { const char* masterprotocol = game_get_attribute(s->type,"masterprotocol"); diff -uNr xqf-1.0.5/src/pixmaps.c xqf-1.0.5+cvars7+be+ref/src/pixmaps.c --- xqf-1.0.5/src/pixmaps.c 2006-04-08 04:00:56.000000000 -0400 +++ xqf-1.0.5+cvars7+be+ref/src/pixmaps.c 2007-04-03 18:34:18.000000000 -0400 @@ -107,6 +107,8 @@ #include "xpm/locked.xpm" #include "xpm/punkbuster.xpm" #include "xpm/locked_punkbuster.xpm" +#include "xpm/battleye.xpm" +#include "xpm/locked_battleye.xpm" #undef static struct pixmap update_pix; @@ -140,6 +142,8 @@ struct pixmap locked_pix; struct pixmap punkbuster_pix; struct pixmap locked_punkbuster_pix; +struct pixmap battleye_pix; +struct pixmap locked_battleye_pix; static GdkGC *pixmaps_gc; static GdkGC *masks_gc; @@ -237,6 +241,8 @@ free_pixmap (&punkbuster_pix); free_pixmap (&locked_punkbuster_pix); + free_pixmap (&battleye_pix); + free_pixmap (&locked_battleye_pix); for (i = 0; i < GAMES_TOTAL; i++) { @@ -360,6 +366,8 @@ create_pixmap (window, "locked.xpm", &locked_pix); create_pixmap (window, "punkbuster.xpm", &punkbuster_pix); cat_pixmaps(window, &locked_punkbuster_pix, &punkbuster_pix, &locked_pix); + create_pixmap (window, "battleye.xpm", &battleye_pix); + cat_pixmaps(window, &locked_battleye_pix, &battleye_pix, &locked_pix); for (i = 0; i < GAMES_TOTAL; i++) { diff -uNr xqf-1.0.5/src/pixmaps.h xqf-1.0.5+cvars7+be+ref/src/pixmaps.h --- xqf-1.0.5/src/pixmaps.h 2005-08-07 13:04:48.000000000 -0400 +++ xqf-1.0.5+cvars7+be+ref/src/pixmaps.h 2007-04-03 18:44:19.000000000 -0400 @@ -68,6 +68,9 @@ extern struct pixmap punkbuster_pix; extern struct pixmap locked_punkbuster_pix; +extern struct pixmap battleye_pix; +extern struct pixmap locked_battleye_pix; + extern int pixmap_height (GdkPixmap *pixmap); extern int pixmap_width (GdkPixmap *pixmap); diff -uNr xqf-1.0.5/src/pref.c xqf-1.0.5+cvars7+be+ref/src/pref.c --- xqf-1.0.5/src/pref.c 2006-10-28 08:12:22.000000000 -0400 +++ xqf-1.0.5+cvars7+be+ref/src/pref.c 2007-04-04 17:05:49.000000000 -0400 @@ -110,6 +110,7 @@ int default_refresh_sorts; int default_refresh_on_update; int default_resolve_on_update; +int default_refresh_non_visible; int default_show_only_configured_games; char* default_icontheme; @@ -192,6 +193,7 @@ static GtkWidget *refresh_sorts_check_button; static GtkWidget *refresh_on_update_check_button; static GtkWidget *resolve_on_update_check_button; +static GtkWidget *refresh_non_visible_check_button; static GtkWidget *show_only_configured_games_check_button; static GtkWidget *use_custom_gtkrc_check_button; @@ -1054,6 +1056,10 @@ if (i != default_resolve_on_update) config_set_bool ("resolve on update", default_resolve_on_update = i); + i = GTK_TOGGLE_BUTTON (refresh_non_visible_check_button)->active; + if (i != default_refresh_non_visible) + config_set_bool ("refresh non visible", default_refresh_non_visible = i); + i = GTK_TOGGLE_BUTTON (show_only_configured_games_check_button)->active; if (i != default_show_only_configured_games) config_set_bool ("show only configured games", default_show_only_configured_games = i); @@ -3784,6 +3790,23 @@ gtk_widget_show (hbox); + /* Refresh non visible */ + + hbox = gtk_hbox_new (FALSE, 4); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + + refresh_non_visible_check_button = + gtk_check_button_new_with_label (_("Refresh non-visible servers")); + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (refresh_non_visible_check_button), + default_refresh_non_visible); + gtk_box_pack_start (GTK_BOX (hbox), refresh_non_visible_check_button, + FALSE, FALSE, 0); + gtk_widget_show (refresh_non_visible_check_button); + + gtk_widget_show (hbox); + + /* Show only configured games */ hbox = gtk_hbox_new (FALSE, 4); @@ -5146,6 +5169,7 @@ default_refresh_sorts = config_get_bool ("sort on refresh=true"); default_refresh_on_update = config_get_bool ("refresh on update=true"); default_resolve_on_update = config_get_bool ("resolve on update=false"); + default_refresh_non_visible=config_get_bool ("refresh non visible=false"); default_show_only_configured_games = config_get_bool ("show only configured games=false"); default_icontheme = config_get_string ("icontheme"); diff -uNr xqf-1.0.5/src/pref.h xqf-1.0.5+cvars7+be+ref/src/pref.h --- xqf-1.0.5/src/pref.h 2006-04-08 04:00:56.000000000 -0400 +++ xqf-1.0.5+cvars7+be+ref/src/pref.h 2007-04-04 16:59:27.000000000 -0400 @@ -97,6 +97,7 @@ extern int default_refresh_sorts; extern int default_refresh_on_update; extern int default_resolve_on_update; +extern int default_refresh_non_visible; extern int default_show_only_configured_games; extern char* default_icontheme; diff -uNr xqf-1.0.5/src/sort.c xqf-1.0.5+cvars7+be+ref/src/sort.c --- xqf-1.0.5/src/sort.c 2005-08-07 12:04:54.000000000 -0400 +++ xqf-1.0.5+cvars7+be+ref/src/sort.c 2007-04-03 18:29:29.000000000 -0400 @@ -148,6 +148,17 @@ else res = 0; break; + + case SORT_SERVER_BATTLEYE: + if( (s1->flags & SERVER_BATTLEYE ) && ( s2->flags & SERVER_BATTLEYE )) + res = 0; + else if (s1->flags & SERVER_BATTLEYE ) + res = 1; + else if (s2->flags & SERVER_BATTLEYE ) + res = -1; + else + res = 0; + break; case SORT_SERVER_PLAYERS: res = s1->curplayers - s2->curplayers; diff -uNr xqf-1.0.5/src/sort.h xqf-1.0.5+cvars7+be+ref/src/sort.h --- xqf-1.0.5/src/sort.h 2005-08-07 12:04:55.000000000 -0400 +++ xqf-1.0.5+cvars7+be+ref/src/sort.h 2007-04-03 18:28:47.000000000 -0400 @@ -29,6 +29,7 @@ SORT_SERVER_TO, SORT_SERVER_PRIVATE, SORT_SERVER_ANTICHEAT, + SORT_SERVER_BATTLEYE, SORT_SERVER_PLAYERS, SORT_SERVER_MAXPLAYERS, SORT_SERVER_MAP, diff -uNr xqf-1.0.5/src/srv-list.c xqf-1.0.5+cvars7+be+ref/src/srv-list.c --- xqf-1.0.5/src/srv-list.c 2005-08-07 12:37:22.000000000 -0400 +++ xqf-1.0.5+cvars7+be+ref/src/srv-list.c 2007-04-04 17:01:15.000000000 -0400 @@ -80,13 +80,16 @@ { PIX_PASSWORD = 0x001, PIX_PUNKBUSTER = 0x002, + PIX_BATTLEYE = 0x004, }; struct pixmap* pix2array[] = { NULL, &locked_pix, &punkbuster_pix, - &locked_punkbuster_pix + &locked_punkbuster_pix, + &battleye_pix, + &locked_battleye_pix }; static struct pixmap* get_server_pixmap2(struct server* s) @@ -97,6 +100,8 @@ flags |= PIX_PASSWORD; if (s->flags & SERVER_PUNKBUSTER) flags |= PIX_PUNKBUSTER; + if (s->flags & SERVER_BATTLEYE) + flags |= PIX_BATTLEYE; return pix2array[flags]; } @@ -535,9 +540,16 @@ int row; debug (6, "start"); - for (row = 0; row < server_clist->rows; row++) { - server = (struct server *) gtk_clist_get_row_data (server_clist, row); - list = server_list_prepend (list, server); + if(!default_refresh_non_visible) { + for (row = 0; row < server_clist->rows; row++) { + server = (struct server *) gtk_clist_get_row_data (server_clist, row); + list = server_list_prepend (list, server); + } + } + else { + server_clist_build_filtered (cur_server_list, FALSE); + list = server_list_copy(cur_server_list); + server_clist_build_filtered (cur_server_list, TRUE); } debug (6, "Return list %lx", list); return g_slist_reverse (list); diff -uNr xqf-1.0.5/src/utils.c xqf-1.0.5+cvars7+be+ref/src/utils.c --- xqf-1.0.5/src/utils.c 2006-06-18 08:44:58.000000000 -0400 +++ xqf-1.0.5+cvars7+be+ref/src/utils.c 2007-05-25 16:35:24.000000000 -0400 @@ -1194,3 +1194,30 @@ } #endif // ! RCON_STANDALONE +//g_strdupv from glib2, for compatibility with 1.x compiles +gchar** g_strdupv2 (gchar **str_array) +{ + if (str_array) + { + gint i; + gchar **retval; + + i = 0; + while (str_array[i]) + ++i; + + retval = g_new (gchar*, i + 1); + + i = 0; + while (str_array[i]) + { + retval[i] = g_strdup (str_array[i]); + ++i; + } + retval[i] = NULL; + + return retval; + } + else + return NULL; +} diff -uNr xqf-1.0.5/src/utils.h xqf-1.0.5+cvars7+be+ref/src/utils.h --- xqf-1.0.5/src/utils.h 2005-11-12 08:15:48.000000000 -0500 +++ xqf-1.0.5+cvars7+be+ref/src/utils.h 2007-05-25 16:35:17.000000000 -0400 @@ -173,4 +173,7 @@ */ char* load_file_mem(const char* name, size_t* size); +// g_strdupv from glib2, for compatibility with glib1 compiles +gchar** g_strdupv2 (gchar **str_array); + #endif /* __UTILS_H__ */ diff -uNr xqf-1.0.5/src/xpm/battleye.xpm xqf-1.0.5+cvars7+be+ref/src/xpm/battleye.xpm --- xqf-1.0.5/src/xpm/battleye.xpm 1969-12-31 19:00:00.000000000 -0500 +++ xqf-1.0.5+cvars7+be+ref/src/xpm/battleye.xpm 2007-04-03 20:04:47.000000000 -0400 @@ -0,0 +1,167 @@ +/* XPM */ +static char * battleye_xpm[] = { +"17 17 147 2", +" c None", +". c #DD9B6A", +"+ c #CF8E5C", +"@ c #B27C51", +"# c #9A6E47", +"$ c #A07148", +"% c #C59165", +"& c #D29764", +"* c #D09561", +"= c #CF935F", +"- c #CD905B", +"; c #CD8650", +"> c #B2784D", +", c #A47148", +"' c #916540", +") c #855C38", +"! c #7D5939", +"~ c #7E5E42", +"{ c #C89162", +"] c #D29561", +"^ c #C78B58", +"/ c #CD8F58", +"( c #A56636", +"_ c #A76B3B", +": c #96653C", +"< c #8A5D37", +"[ c #6F4B2A", +"} c #684727", +"| c #725133", +"1 c #73573F", +"2 c #C38C5E", +"3 c #C88D5C", +"4 c #BA8556", +"5 c #C68B59", +"6 c #C58C57", +"7 c #8B4F22", +"8 c #75441E", +"9 c #653E1F", +"0 c #5B381B", +"a c #523115", +"b c #502F13", +"c c #644021", +"d c #AB7E57", +"e c #846347", +"f c #856244", +"g c #74563C", +"h c #703F1B", +"i c #5B3416", +"j c #533217", +"k c #512F13", +"l c #502E12", +"m c #593314", +"n c #6D4121", +"o c #806249", +"p c #936E4C", +"q c #7B5C41", +"r c #785A3F", +"s c #603715", +"t c #573112", +"u c #5B3514", +"v c #5E3613", +"w c #683B14", +"x c #7D471D", +"y c #87512A", +"z c #846449", +"A c #7A5E44", +"B c #896647", +"C c #B67F50", +"D c #846141", +"E c #623814", +"F c #693C15", +"G c #7D4D22", +"H c #824F23", +"I c #81481A", +"J c #AC6027", +"K c #AB8B70", +"L c #BD987A", +"M c #AD825F", +"N c #BD8D66", +"O c #B18461", +"P c #6A3D17", +"Q c #774314", +"R c #955F30", +"S c #986436", +"T c #9C5923", +"U c #C77436", +"V c #C47E4B", +"W c #AF9178", +"X c #CDAB8F", +"Y c #B78A67", +"Z c #C59F80", +"` c #81491A", +" . c #9F571C", +".. c #A56126", +"+. c #A6612E", +"@. c #C5814F", +"#. c #C28557", +"$. c #82634A", +"%. c #775B43", +"&. c #836042", +"*. c #AC8261", +"=. c #965520", +"-. c #BD6F32", +";. c #C1783F", +">. c #BF7843", +",. c #CA9369", +"'. c #C1906B", +"). c #8D6E55", +"!. c #BA9574", +"~. c #B08869", +"{. c #B78D6D", +"]. c #C57B45", +"^. c #D08B58", +"/. c #CA8651", +"(. c #B16B35", +"_. c #D08954", +":. c #D19B71", +"<. c #CC9F7C", +"[. c #B99475", +"}. c #CCA686", +"|. c #CAA587", +"1. c #BE9271", +"2. c #AF7B4F", +"3. c #B3825C", +"4. c #DEA67C", +"5. c #CF9A70", +"6. c #CB7533", +"7. c #CF8A56", +"8. c #A97C5A", +"9. c #B48D6D", +"0. c #C49774", +"a. c #C69C7C", +"b. c #BF9474", +"c. c #BD8B65", +"d. c #B4825D", +"e. c #DBB091", +"f. c #E0B797", +"g. c #D59E76", +"h. c #CF8E5F", +"i. c #D4976B", +"j. c #D2A989", +"k. c #BDA188", +"l. c #C0926A", +"m. c #C39A78", +"n. c #C19A7C", +"o. c #BE9577", +"p. c #AE8564", +" ", +" ", +" . + @ # $ % & * = - ", +" ; > , ' ) ! ~ { ] - ^ / ", +" ( _ : < [ } | 1 2 3 4 5 6 ", +" 7 8 9 0 a b c d e f g ", +" h i j k l m n o p q r ", +" s t u v w x y z A B C D ", +" E F G H I J K L M N O ", +" P Q R S T U V W X Y Z ", +" ` ... +.@.#.$.%.&.*. ", +" =.-.;. >.,.'.).!.~.{. ", +" ].^./.(._.:.<.[.}.|.1.2.3. ", +" 4.5._.6.7.8.9. 0.a.b.c.d. ", +" e.f.g.h.i.j.k. l.m.n.o.p. ", +" ", +" "}; diff -uNr xqf-1.0.5/src/xpm/locked_battleye.xpm xqf-1.0.5+cvars7+be+ref/src/xpm/locked_battleye.xpm --- xqf-1.0.5/src/xpm/locked_battleye.xpm 1969-12-31 19:00:00.000000000 -0500 +++ xqf-1.0.5+cvars7+be+ref/src/xpm/locked_battleye.xpm 2007-04-03 20:06:24.000000000 -0400 @@ -0,0 +1,169 @@ +/* XPM */ +static char * locked_battleye_xpm[] = { +"34 17 149 2", +" c None", +". c #DD9B6A", +"+ c #CF8E5C", +"@ c #B27C51", +"# c #9A6E47", +"$ c #A07148", +"% c #C59165", +"& c #D29764", +"* c #D09561", +"= c #CF935F", +"- c #CD905B", +"; c #FF0000", +"> c #CD8650", +", c #B2784D", +"' c #A47148", +") c #916540", +"! c #855C38", +"~ c #7D5939", +"{ c #7E5E42", +"] c #C89162", +"^ c #D29561", +"/ c #C78B58", +"( c #CD8F58", +"_ c #7F0000", +": c #A56636", +"< c #A76B3B", +"[ c #96653C", +"} c #8A5D37", +"| c #6F4B2A", +"1 c #684727", +"2 c #725133", +"3 c #73573F", +"4 c #C38C5E", +"5 c #C88D5C", +"6 c #BA8556", +"7 c #C68B59", +"8 c #C58C57", +"9 c #8B4F22", +"0 c #75441E", +"a c #653E1F", +"b c #5B381B", +"c c #523115", +"d c #502F13", +"e c #644021", +"f c #AB7E57", +"g c #846347", +"h c #856244", +"i c #74563C", +"j c #703F1B", +"k c #5B3416", +"l c #533217", +"m c #512F13", +"n c #502E12", +"o c #593314", +"p c #6D4121", +"q c #806249", +"r c #936E4C", +"s c #7B5C41", +"t c #785A3F", +"u c #603715", +"v c #573112", +"w c #5B3514", +"x c #5E3613", +"y c #683B14", +"z c #7D471D", +"A c #87512A", +"B c #846449", +"C c #7A5E44", +"D c #896647", +"E c #B67F50", +"F c #846141", +"G c #623814", +"H c #693C15", +"I c #7D4D22", +"J c #824F23", +"K c #81481A", +"L c #AC6027", +"M c #AB8B70", +"N c #BD987A", +"O c #AD825F", +"P c #BD8D66", +"Q c #B18461", +"R c #6A3D17", +"S c #774314", +"T c #955F30", +"U c #986436", +"V c #9C5923", +"W c #C77436", +"X c #C47E4B", +"Y c #AF9178", +"Z c #CDAB8F", +"` c #B78A67", +" . c #C59F80", +".. c #81491A", +"+. c #9F571C", +"@. c #A56126", +"#. c #A6612E", +"$. c #C5814F", +"%. c #C28557", +"&. c #82634A", +"*. c #775B43", +"=. c #836042", +"-. c #AC8261", +";. c #965520", +">. c #BD6F32", +",. c #C1783F", +"'. c #BF7843", +"). c #CA9369", +"!. c #C1906B", +"~. c #8D6E55", +"{. c #BA9574", +"]. c #B08869", +"^. c #B78D6D", +"/. c #C57B45", +"(. c #D08B58", +"_. c #CA8651", +":. c #B16B35", +"<. c #D08954", +"[. c #D19B71", +"}. c #CC9F7C", +"|. c #B99475", +"1. c #CCA686", +"2. c #CAA587", +"3. c #BE9271", +"4. c #AF7B4F", +"5. c #B3825C", +"6. c #DEA67C", +"7. c #CF9A70", +"8. c #CB7533", +"9. c #CF8A56", +"0. c #A97C5A", +"a. c #B48D6D", +"b. c #C49774", +"c. c #C69C7C", +"d. c #BF9474", +"e. c #BD8B65", +"f. c #B4825D", +"g. c #DBB091", +"h. c #E0B797", +"i. c #D59E76", +"j. c #CF8E5F", +"k. c #D4976B", +"l. c #D2A989", +"m. c #BDA188", +"n. c #C0926A", +"o. c #C39A78", +"p. c #C19A7C", +"q. c #BE9577", +"r. c #AE8564", +" ", +" ", +" . + @ # $ % & * = - ; ; ; ", +" > , ' ) ! ~ { ] ^ - / ( ; _ _ _ ; ", +" : < [ } | 1 2 3 4 5 6 7 8 _ ; _ _ ; _ ", +" 9 0 a b c d e f g h i _ ; _ _ ; _ ", +" j k l m n o p q r s t _ ; _ _ ; _ ", +" u v w x y z A B C D E F _ _ _ _ _ _ _ _ _ _ _ ", +" G H I J K L M N O P Q _ ; ; ; ; ; ; ; ; ; _ ", +" R S T U V W X Y Z ` . _ ; ; _ ", +" ..+.@. #.$.%.&.*.=.-. _ ; ; ; ; ; ; ; ; ; _ ", +" ;.>.,. '.).!.~.{.].^. _ ; ; _ ", +" /.(._.:.<.[.}.|.1.2.3.4.5. _ ; ; ; ; ; ; ; ; ; _ ", +" 6.7.<.8.9.0.a. b.c.d.e.f. _ _ _ _ _ _ _ _ _ _ _ ", +" g.h.i.j.k.l.m. n.o.p.q.r. ", +" ", +" "}; diff -uNr xqf-1.0.5/src/xqf-ui.c xqf-1.0.5+cvars7+be+ref/src/xqf-ui.c --- xqf-1.0.5/src/xqf-ui.c 2005-12-28 05:44:04.000000000 -0500 +++ xqf-1.0.5+cvars7+be+ref/src/xqf-ui.c 2007-04-26 18:34:39.000000000 -0400 @@ -77,10 +77,10 @@ sort_mode: { SORT_SERVER_TO, -1 } }, { - name: N_("Priv"), + name: N_("Priv/PB/BE"), width: 35, justify: GTK_JUSTIFY_RIGHT, - sort_mode: { SORT_SERVER_PRIVATE, SORT_SERVER_ANTICHEAT, -1 }, + sort_mode: { SORT_SERVER_PRIVATE, SORT_SERVER_ANTICHEAT, SORT_SERVER_BATTLEYE, -1 }, // Translator: "PunkBuster" sort_name: { NULL, N_("PB") }, }, diff -uNr xqf-1.0.5/src/xqf.c xqf-1.0.5+cvars7+be+ref/src/xqf.c --- xqf-1.0.5/src/xqf.c 2006-06-18 08:44:58.000000000 -0400 +++ xqf-1.0.5+cvars7+be+ref/src/xqf.c 2007-04-26 18:26:48.000000000 -0400 @@ -473,12 +473,14 @@ gtk_widget_set_sensitive (refresh_menu_item, sens); gtk_widget_set_sensitive (view_refresh_menu_item, sens); - gtk_widget_set_state (refresh_button, GTK_STATE_NORMAL); - gtk_widget_set_sensitive (refresh_button, sens); - gtk_widget_set_sensitive (view_hostnames_menu_item, sens); gtk_widget_set_sensitive (view_defport_menu_item, sens); + sens = ((!stat_process && (server_clist->rows > 0) && !default_refresh_non_visible) || (!stat_process && cur_server_list && default_refresh_non_visible)); + + gtk_widget_set_state (refresh_button, GTK_STATE_NORMAL); + gtk_widget_set_sensitive (refresh_button, sens); + sens = (!stat_process && masters_to_update); gtk_widget_set_sensitive (view_update_menu_item, sens); @@ -3052,7 +3054,7 @@ gtk_widget_show (pixmap); refresh_button = gtk_toolbar_append_item (GTK_TOOLBAR (main_toolbar), - _("Refresh"), _("Refresh current list"), NULL, + _("Refresh"), _("Refresh listing"), NULL, pixmap, GTK_SIGNAL_FUNC (refresh_callback), NULL); diff -uNr xqf-1.0.5/src/xqf.h xqf-1.0.5+cvars7+be+ref/src/xqf.h --- xqf-1.0.5/src/xqf.h 2006-06-18 08:44:59.000000000 -0400 +++ xqf-1.0.5+cvars7+be+ref/src/xqf.h 2007-05-28 18:38:27.000000000 -0400 @@ -85,6 +85,7 @@ SERVER_SP_PASSWORD = 0x020, SERVER_SPECTATE = 0x040, SERVER_PUNKBUSTER = 0x080, + SERVER_BATTLEYE = 0x200, SERVER_INCOMPATIBLE = 0x100 };