First shot at callbacks separation

master
Artem Vorotnikov 2015-06-30 03:50:03 +03:00
parent d76bb074c6
commit 44c870ebeb
10 changed files with 499 additions and 505 deletions

View File

@ -43,6 +43,7 @@ add_definitions (-DQSTAT_EXEC="${WITH_QSTAT}")
if (CMAKE_BUILD_TYPE MATCHES DEBUG)
add_definitions (-DDEBUG)
set (CMAKE_C_FLAGS "-g -ggdb -O0")
endif (CMAKE_BUILD_TYPE MATCHES DEBUG)
# Default GUI setting
@ -79,6 +80,7 @@ set (xqf_SOURCES
${CMAKE_SOURCE_DIR}/src/addmaster.c
${CMAKE_SOURCE_DIR}/src/addserver.c
${CMAKE_SOURCE_DIR}/src/callbacks.c
${CMAKE_SOURCE_DIR}/src/config.c
${CMAKE_SOURCE_DIR}/src/country-filter.c
${CMAKE_SOURCE_DIR}/src/debug.c
@ -118,9 +120,11 @@ set (xqf_SOURCES
${CMAKE_SOURCE_DIR}/src/addmaster.h
${CMAKE_SOURCE_DIR}/src/addserver.h
${CMAKE_SOURCE_DIR}/src/callbacks.h
${CMAKE_SOURCE_DIR}/src/config.h
${CMAKE_SOURCE_DIR}/src/country-filter.h
${CMAKE_SOURCE_DIR}/src/debug.h
${CMAKE_SOURCE_DIR}/src/defs.h
${CMAKE_SOURCE_DIR}/src/dialogs.h
${CMAKE_SOURCE_DIR}/src/dns.h
${CMAKE_SOURCE_DIR}/src/filter.h

174
src/callbacks.c Normal file
View File

@ -0,0 +1,174 @@
// XQF Game Server Browser
// Copyright (C) 1998-2015 XQF Team - https://xqf.github.io
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
#include <stdio.h>
#include <libintl.h>
#include <locale.h>
#include <glib.h>
#include <gtk/gtk.h>
#include "debug.h"
#include "filter.h"
#include "pref.h"
#include "source.h"
#include "server.h"
#include "srv-list.h"
#include "stat.h"
#include "xqf-ui.h"
void reset_main_status_bar (GtkBuilder *builder) {
// Reset bottom left status bar to show number of servers
print_status (GTK_WIDGET (gtk_builder_get_object (builder, "main-status-bar")), ngettext("%d server", "%d servers", server_clist->rows), server_clist->rows);
}
void set_widgets_sensitivity (GtkBuilder *builder) {
GList *selected = server_clist->selection;
int sens;
int i;
int source_is_favorites;
int masters_to_update;
int masters_to_delete;
// Every button with callback that can modify its sensitivity
// should be explicitly put to GTK_STATE_NORMAL state before
// changing its insensitivity
source_is_favorites = (cur_source != NULL && cur_source->next == NULL && (struct master *) cur_source->data == favorites);
if (source_is_favorites) {
masters_to_update = masters_to_delete = FALSE;
}
else {
masters_to_update = source_has_masters_to_update (cur_source);
masters_to_delete = source_has_masters_to_delete (cur_source);
}
sens = (!stat_process && cur_server);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_properties_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "server_properties_menu_item")), sens);
sens = (!stat_process && cur_server && (games[cur_server->type].flags & GAME_CONNECT) != 0);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "connect_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "server_connect_menu_item")), sens);
gtk_widget_set_state (GTK_WIDGET (gtk_builder_get_object (builder, "connect-button")), GTK_STATE_NORMAL);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "connect-button")), sens);
sens = (!stat_process && cur_server && (games[cur_server->type].flags & GAME_SPECTATE) != 0 && (cur_server->flags & SERVER_SPECTATE) != 0);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "observe_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "server_observe_menu_item")), sens);
gtk_widget_set_state (GTK_WIDGET (gtk_builder_get_object (builder, "observe-button")), GTK_STATE_NORMAL);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "observe-button")), sens);
sens = (!stat_process && cur_server && (games[cur_server->type].flags & GAME_RECORD) != 0);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "record_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "server_record_menu_item")), sens);
gtk_widget_set_state (GTK_WIDGET (gtk_builder_get_object (builder, "record-button")), GTK_STATE_NORMAL);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "record-button")), sens);
sens = (!stat_process && cur_server && (games[cur_server->type].flags & GAME_RCON) != 0);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "rcon_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "server_rcon_menu_item")), sens);
sens = (!stat_process && selected);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "refrsel_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "view_refrsel_menu_item")), sens);
gtk_widget_set_state (GTK_WIDGET (gtk_builder_get_object (builder, "refrsel-button")), GTK_STATE_NORMAL);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "refrsel-button")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "resolve_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "server_resolve_menu_item")), sens);
sens = (!stat_process);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "file_statistics_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "add_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_add_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_update_master_builtin_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_update_master_gslist_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_add_master_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_find_player_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_find_again_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "player_filter_menu_item")), sens);
gtk_widget_set_sensitive (source_ctree, sens);
sens = (!stat_process && selected && !source_is_favorites);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "favadd_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_favadd_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "server_favadd_menu_item")), sens);
sens = (!stat_process && masters_to_delete);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_delete_master_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_clear_master_servers_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "source_delete_master_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "source_clear_master_servers_menu_item")), sens);
// you can only edit one server a time, no groups and no favorites
sens = (cur_source && cur_source->next == NULL && ! ((struct master *) cur_source->data)->isgroup && ! source_is_favorites);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "source_edit_master_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_edit_master_menu_item")), sens);
sens = (!stat_process && (server_clist->rows > 0));
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "refresh_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "view_refresh_menu_item")), sens);
gtk_widget_set_state (GTK_WIDGET (gtk_builder_get_object (builder, "refresh-button")), GTK_STATE_NORMAL);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "refresh-button")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "view_hostnames_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "view_defport_menu_item")), sens);
sens = (!stat_process && masters_to_update);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "view_update_menu_item")), sens);
gtk_widget_set_state (GTK_WIDGET (gtk_builder_get_object (builder, "update-button")), GTK_STATE_NORMAL);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "update-button")), sens);
sens = (stat_process != NULL);
gtk_widget_set_state (GTK_WIDGET (gtk_builder_get_object (builder, "stop-button")), GTK_STATE_NORMAL);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "stop-button")), sens);
sens = (stat_process == NULL);
for (i = 0; i < FILTERS_TOTAL; i++) {
if (!filter_buttons[i]) {
continue;
}
gtk_widget_set_state (filter_buttons[i], GTK_STATE_NORMAL);
gtk_widget_set_sensitive (filter_buttons[i], sens);
if (GTK_IS_TOGGLE_BUTTON (filter_buttons[i]) && GTK_TOGGLE_BUTTON (filter_buttons[i])->active) {
gtk_widget_set_state (filter_buttons[i], GTK_STATE_ACTIVE);
}
}
}

27
src/callbacks.h Normal file
View File

@ -0,0 +1,27 @@
// XQF Game Server Browser
// Copyright (C) 1998-2015 XQF Team - https://xqf.github.io
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
#include <stdio.h>
#include <libintl.h>
#include <locale.h>
#include <glib.h>
#include <gtk/gtk.h>
void reset_main_status_bar (GtkBuilder *builder);
void set_widgets_sensitivity (GtkBuilder *builder);

234
src/defs.h Normal file
View File

@ -0,0 +1,234 @@
// XQF Game Server Browser
// Copyright (C) 1998-2015 XQF Team - https://xqf.github.io
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
#ifndef __DEFS_H__
#define __DEFS_H__
#include <sys/types.h>
#include <netinet/in.h> /* struct in_addr */
#include <arpa/inet.h> /* struct in_addr */
#include <time.h> /* time_t */
#include <gtk/gtk.h>
#include <glib.h>
// max 0x8000, server->flags is unsigned
enum server_flags {
PLAYER_GROUP_RED = 0x001,
PLAYER_GROUP_GREEN = 0x002,
PLAYER_GROUP_BLUE = 0x004,
PLAYER_GROUP_MASK = 0x007,
SERVER_CHEATS = 0x008,
SERVER_PASSWORD = 0x010,
SERVER_SP_PASSWORD = 0x020,
SERVER_SPECTATE = 0x040,
SERVER_PUNKBUSTER = 0x080,
SERVER_INCOMPATIBLE = 0x100
};
enum launch_mode {
LAUNCH_NORMAL,
LAUNCH_SPECTATE,
LAUNCH_RECORD
};
// note: there is a limit of 256 servers, see get_server_pixmap in srv-list.c
enum server_type {
Q1_SERVER = 0,
QW_SERVER,
Q2_SERVER,
Q3_SERVER,
Q4_SERVER,
WO_SERVER,
WOET_SERVER,
ETL_SERVER,
DOOM3_SERVER,
ETQW_SERVER,
EF_SERVER,
H2_SERVER,
HW_SERVER,
SN_SERVER,
HL_SERVER_OLD,
HL_SERVER,
HL2_SERVER,
KP_SERVER,
SFS_SERVER,
SOF2S_SERVER,
T2_SERVER,
HR_SERVER,
UN_SERVER,
UT2_SERVER,
UT2004_SERVER,
RUNE_SERVER,
POSTAL2_SERVER,
AAO_SERVER,
DESCENT3_SERVER,
SSAM_SERVER,
SSAMSE_SERVER,
MOHAA_SERVER,
COD_SERVER,
SAS_SERVER,
BF1942_SERVER,
JK2_SERVER,
JK3_SERVER,
NETP_SERVER,
NEXUIZ_SERVER,
XONOTIC_SERVER,
WARSOW_SERVER,
TREMULOUS_SERVER,
TREMULOUSGPP_SERVER,
TREMFUSION_SERVER,
UNVANQUISHED_SERVER,
OPENARENA_SERVER,
OTTD_SERVER,
Q3RALLY_SERVER,
WOP_SERVER,
IOURT_SERVER,
REACTION_SERVER,
SMOKINGUNS_SERVER,
ZEQ2LITE_SERVER,
TURTLEARENA_SERVER,
ALIENARENA_SERVER,
GPS_SERVER,
UNKNOWN_SERVER
};
#define GAMES_TOTAL UNKNOWN_SERVER
enum master_state {
SOURCE_NA = 0,
SOURCE_UP,
SOURCE_DOWN,
SOURCE_TIMEOUT,
SOURCE_ERROR
};
enum master_query_type {
MASTER_NATIVE=0,
MASTER_GAMESPY,
MASTER_HTTP,
MASTER_LAN,
MASTER_FILE,
MASTER_GSLIST,
MASTER_NUM_QUERY_TYPES,
MASTER_INVALID_TYPE
};
// A player. There is no destructor for this struct. Alloc as many data as you need at once and have the pointers point inside.
struct player {
char *name;
char *skin;
char *model;
int time;
short frags;
short ping;
unsigned char shirt;
unsigned char pants;
unsigned char flags;
};
struct host {
char *name;
struct in_addr ip;
time_t refreshed;
int ref_count;
};
// server_new, server_free_info, server_move_info must be adapted for changes to this structure
struct server {
struct host *host;
gchar *name;
char *map;
char **info;
char *game; // pointer into info, do not free
char *gametype; // pointer into info, do not free
GSList *players; // GSList<struct player *>
#ifdef USE_GEOIP
int country_id;
#endif
unsigned flags;
unsigned flt_last; // time of the last filtering
time_t refreshed;
time_t last_answer; // time of last reply from server
int ref_count;
enum server_type type;
unsigned short port;
unsigned short maxplayers;
unsigned short curplayers;
unsigned short curbots;
unsigned short private_client; // number of private clients
short ping;
short retries;
char sv_os; // L = Linux, W = windows, M = Mac
unsigned char filters;
unsigned char flt_mask;
};
struct userver {
char *hostname;
struct server *s;
int ref_count;
unsigned short port;
unsigned char type; // enum server_type type;
};
typedef struct {
int portadjust; // value added to port
char* gsmtype; // type for gslist master
} QFMasterOptions;
typedef struct master {
char *name;
enum server_type type;
int isgroup; // is it a real master or master group?
int user; // is it added or edited by user?
QFMasterOptions options;
struct host *host;
unsigned short port;
char *hostname; // unresolved hostname
char *url;
GSList *servers;
GSList *uservers;
enum master_state state;
GSList *masters;
enum master_query_type master_type;
// private
char* _qstat_master_option; // optional override from games[type].qstat_master_option
} QFMaster;
#endif //__DEFS_H__

View File

@ -390,7 +390,7 @@ void find_player (int find_next) {
if (!find_next || server_clist->selection == NULL) {
dialog_ok (NULL, _("Player not found."));
reset_main_status_bar();
reset_main_status_bar(builder);
}
else {
if (dialog_yesno (_("XQF: End of server list reached"), 0, _("Yes"), _("No"),
@ -398,6 +398,6 @@ void find_player (int find_next) {
find_player (FALSE);
}
else
reset_main_status_bar();
reset_main_status_bar(builder);
}
}

View File

@ -425,7 +425,7 @@ void server_clist_sync_selection (void) {
player_clist_set_server (cur_server);
srvinf_ctree_set_server (cur_server);
set_widgets_sensitivity ();
set_widgets_sensitivity (builder);
}
}

View File

@ -42,6 +42,8 @@ GtkWidget *pane1_widget;
GtkWidget *pane2_widget;
GtkWidget *pane3_widget;
GtkWidget *filter_buttons[FILTERS_TOTAL] = {0};
/* If you add a column here to appear in the server
list, you need to also add an entry in sort.h and sort.c
*/
@ -261,7 +263,7 @@ GtkWidget *top_window (void) {
return NULL;
}
#ifdef GUI_GTK2
static void clist_column_set_title (GtkCList *clist, struct clist_def *cldef, int set_mark) {
char buf[256];
@ -584,7 +586,7 @@ int calculate_clist_row_height (GtkWidget *clist, GdkPixmap *pixmap) {
return height;
}
#endif
void set_toolbar_appearance (GtkToolbar *toolbar, int style, int tips) {
switch (style) {
@ -597,107 +599,53 @@ void set_toolbar_appearance (GtkToolbar *toolbar, int style, int tips) {
gtk_toolbar_set_tooltips (toolbar, tips);
}
/******************************* Progress Bar *****************************/
int pbar_pulse_mode;
int pbar_timeout_id;
struct pbarinfo {
int activity_mode;
int timeout_id;
};
static void progress_bar_destroy_event (GtkWidget* widget) {
struct pbarinfo *info;
info = gtk_object_get_user_data (GTK_OBJECT (widget));
if (info->activity_mode)
gtk_timeout_remove (info->timeout_id);
g_free (info);
void progress_bar_destroy_event (GtkWidget* widget) {
progress_bar_reset(widget);
}
GtkWidget *create_progress_bar (void) {
GtkWidget *pbar;
struct pbarinfo *info;
pbar = gtk_progress_bar_new ();
info = g_malloc0 (sizeof (struct pbarinfo));
gtk_object_set_user_data (GTK_OBJECT (pbar), info);
g_signal_connect (GTK_OBJECT (pbar), "destroy",
(GtkSignalFunc) progress_bar_destroy_event, NULL);
gtk_progress_set_format_string (GTK_PROGRESS (pbar), "%1p%%");
/* gtk_progress_configure (GTK_PROGRESS (pbar), 0.0, 0.0, 100.0); */
gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (pbar), 5);
g_signal_connect (pbar, "destroy", G_CALLBACK (progress_bar_destroy_event), NULL);
return pbar;
}
void progress_bar_reset (GtkWidget *pbar) {
struct pbarinfo *info;
info = gtk_object_get_user_data (GTK_OBJECT (pbar));
if (info->activity_mode) {
gtk_timeout_remove (info->timeout_id);
info->activity_mode = FALSE;
if (pbar_pulse_mode == TRUE) {
g_source_remove (pbar_timeout_id);
pbar_pulse_mode = FALSE;
}
gtk_progress_set_activity_mode (GTK_PROGRESS (pbar), FALSE);
gtk_progress_set_show_text (GTK_PROGRESS (pbar), FALSE);
gtk_progress_set_percentage (GTK_PROGRESS (pbar), 0.0);
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pbar), 0.0);
gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pbar), NULL);
}
gboolean progress_bar_pulse (gpointer user_data) {
gtk_progress_bar_pulse (GTK_PROGRESS_BAR(user_data));
static int progress_bar_timeout_callback (GtkWidget *pbar) {
gfloat new_val;
GtkAdjustment *adj;
adj = GTK_PROGRESS (pbar)->adjustment;
new_val = adj->value + 1;
if (new_val > adj->upper)
new_val = adj->lower;
gtk_progress_set_value (GTK_PROGRESS (pbar), new_val);
return TRUE;
// Ask g_source to repeat this callback
return G_SOURCE_CONTINUE;
}
void progress_bar_start (GtkWidget *pbar, int activity_mode) {
struct pbarinfo *info;
void progress_bar_start (GtkWidget *pbar, int pulse_switch) {
progress_bar_reset (pbar);
if (activity_mode) {
info = gtk_object_get_user_data (GTK_OBJECT (pbar));
info->activity_mode = TRUE;
info->timeout_id = gtk_timeout_add (100, (GtkFunction) progress_bar_timeout_callback, pbar);
gtk_progress_set_activity_mode (GTK_PROGRESS (pbar), TRUE);
}
else {
gtk_progress_set_show_text (GTK_PROGRESS (pbar), TRUE);
if (pulse_switch && pbar_pulse_mode == FALSE) {
pbar_pulse_mode = TRUE;
gtk_progress_bar_set_pulse_step (GTK_PROGRESS_BAR (pbar), 0.03);
pbar_timeout_id = g_timeout_add (50, (GSourceFunc) progress_bar_pulse, (gpointer) pbar);
}
}
void progress_bar_set_percentage (GtkWidget *pbar, float percentage) {
struct pbarinfo *info;
info = gtk_object_get_user_data (GTK_OBJECT (pbar));
if (!info->activity_mode)
gtk_progress_set_percentage (GTK_PROGRESS (pbar), percentage);
}
static void save_cwidget_geometry (GtkWidget *clist, struct clist_def *cldef) {
void save_cwidget_geometry (GtkWidget *clist, struct clist_def *cldef) {
char buf[256];
int i;
@ -802,9 +750,7 @@ gboolean create_server_type_menu_filter_configured (enum server_type type) {
return TRUE;
}
GtkWidget *create_server_type_menu (int active_type,
gboolean (*filterfunc)(enum server_type),
GtkSignalFunc callback) {
GtkWidget *create_server_type_menu (int active_type, gboolean (*filterfunc)(enum server_type), GtkSignalFunc callback) {
GtkWidget *option_menu = NULL;
GtkWidget *menu = NULL;
GtkWidget *menu_item = NULL;
@ -852,4 +798,3 @@ GtkWidget *create_server_type_menu (int active_type,
return option_menu;
}

View File

@ -22,7 +22,8 @@
#include <gtk/gtk.h>
#include "xqf.h"
#include "callbacks.h"
#include "filter.h"
struct clist_column {
const char *name;
@ -80,8 +81,6 @@ extern void register_window (GtkWidget *window);
extern void unregister_window (GtkWidget *window);
extern GtkWidget *top_window (void);
extern void set_widgets_sensitivity (void);
extern GtkWidget *server_filter_widget[];
extern void print_status (GtkWidget *sbar, char *fmt, ...);
@ -107,7 +106,8 @@ extern void set_toolbar_appearance (GtkToolbar *toolbar, int style, int tips);
extern GtkWidget *create_progress_bar (void);
extern void progress_bar_reset (GtkWidget *pbar);
extern void progress_bar_start (GtkWidget *pbar, int activity_mode);
extern void progress_bar_set_percentage (GtkWidget *pbar, float percentage);
extern GtkWidget *filter_buttons[FILTERS_TOTAL];
extern void ui_done (void);
extern void restore_main_window_geometry (void);

231
src/xqf.c
View File

@ -1,5 +1,5 @@
/* XQF - Quake server browser and launcher
* Copyright (C) 1998-2000 Roman Pozlevich <roma@botik.ru>
* Copyright (C) 1998-2015 XQF Team - https://xqf.github.io
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -45,6 +45,7 @@
#include "xqf.h"
#include "xqf-ui.h"
#include "callbacks.h"
#include "game.h"
#include "stat.h"
#include "source.h"
@ -111,7 +112,6 @@ struct server *cur_server = NULL;
struct stat_job *stat_process = NULL;
GtkWidget *main_status_bar = NULL;
GtkWidget *main_filter_status_bar = NULL;
GtkWidget *main_progress_bar = NULL;
@ -119,8 +119,6 @@ char *progress_bar_str = NULL;
GArray *server_filter_menu_items;
GtkWidget *filter_buttons[FILTERS_TOTAL] = {0};
GtkWidget *player_skin_popup = NULL;
GtkWidget *player_skin_popup_preview = NULL;
@ -270,158 +268,6 @@ int check_qstat_version () {
return external_program_foreach_line (cmd, qstat_version_string, NULL);
}
void reset_main_status_bar () {
// Reset bottom left status bar to show number of servers
print_status (main_status_bar,
ngettext (_("%d server"), _("%d servers"), server_clist->rows),
server_clist->rows);
}
void set_widgets_sensitivity (void) {
GList *selected = server_clist->selection;
int sens;
int i;
int source_is_favorites;
int masters_to_update;
int masters_to_delete;
/*
* Every button with callback that can modify its sensitivity
* should be explicitly put to GTK_STATE_NORMAL state before
* changing its insensitivity
*/
source_is_favorites = (cur_source != NULL &&
cur_source->next == NULL &&
(struct master *) cur_source->data == favorites);
if (source_is_favorites) {
masters_to_update = masters_to_delete = FALSE;
}
else {
masters_to_update = source_has_masters_to_update (cur_source);
masters_to_delete = source_has_masters_to_delete (cur_source);
}
sens = (!stat_process && cur_server);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_properties_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "server_properties_menu_item")), sens);
sens = (!stat_process && cur_server &&
(games[cur_server->type].flags & GAME_CONNECT) != 0);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "connect_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "server_connect_menu_item")), sens);
gtk_widget_set_state (GTK_WIDGET (gtk_builder_get_object (builder, "connect-button")), GTK_STATE_NORMAL);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "connect-button")), sens);
sens = (!stat_process && cur_server &&
(games[cur_server->type].flags & GAME_SPECTATE) != 0 &&
(cur_server->flags & SERVER_SPECTATE) != 0);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "observe_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "server_observe_menu_item")), sens);
gtk_widget_set_state (GTK_WIDGET (gtk_builder_get_object (builder, "observe-button")), GTK_STATE_NORMAL);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "observe-button")), sens);
sens = (!stat_process && cur_server && (games[cur_server->type].flags & GAME_RECORD) != 0);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "record_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "server_record_menu_item")), sens);
gtk_widget_set_state (GTK_WIDGET (gtk_builder_get_object (builder, "record-button")), GTK_STATE_NORMAL);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "record-button")), sens);
sens = (!stat_process && cur_server && (games[cur_server->type].flags & GAME_RCON) != 0);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "rcon_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "server_rcon_menu_item")), sens);
sens = (!stat_process && selected);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "refrsel_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "view_refrsel_menu_item")), sens);
gtk_widget_set_state (GTK_WIDGET (gtk_builder_get_object (builder, "refrsel-button")), GTK_STATE_NORMAL);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "refrsel-button")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "resolve_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "server_resolve_menu_item")), sens);
sens = (!stat_process);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "file_statistics_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "add_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_add_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_update_master_builtin_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_update_master_gslist_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_add_master_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_find_player_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_find_again_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "player_filter_menu_item")), sens);
gtk_widget_set_sensitive (source_ctree, sens);
sens = (!stat_process && selected && !source_is_favorites);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "favadd_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_favadd_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "server_favadd_menu_item")), sens);
sens = (!stat_process && masters_to_delete);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_delete_master_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_clear_master_servers_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "source_delete_master_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "source_clear_master_servers_menu_item")), sens);
// you can only edit one server a time, no groups and no favorites
sens = (cur_source && cur_source->next == NULL
&& ! ((struct master *) cur_source->data)->isgroup
&& ! source_is_favorites);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "source_edit_master_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "edit_edit_master_menu_item")), sens);
sens = (!stat_process && (server_clist->rows > 0));
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "refresh_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "view_refresh_menu_item")), sens);
gtk_widget_set_state (GTK_WIDGET (gtk_builder_get_object (builder, "refresh-button")), GTK_STATE_NORMAL);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "refresh-button")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "view_hostnames_menu_item")), sens);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "view_defport_menu_item")), sens);
sens = (!stat_process && masters_to_update);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "view_update_menu_item")), sens);
gtk_widget_set_state (GTK_WIDGET (gtk_builder_get_object (builder, "update-button")), GTK_STATE_NORMAL);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "update-button")), sens);
sens = (stat_process != NULL);
gtk_widget_set_state (GTK_WIDGET (gtk_builder_get_object (builder, "stop-button")), GTK_STATE_NORMAL);
gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "stop-button")), sens);
sens = (stat_process == NULL);
for (i = 0; i < FILTERS_TOTAL; i++) {
if (!filter_buttons[i]) {
continue;
}
gtk_widget_set_state (filter_buttons[i], GTK_STATE_NORMAL);
gtk_widget_set_sensitive (filter_buttons[i], sens);
if (GTK_IS_TOGGLE_BUTTON (filter_buttons[i]) && GTK_TOGGLE_BUTTON (filter_buttons[i])->active) {
gtk_widget_set_state (filter_buttons[i], GTK_STATE_ACTIVE);
}
}
}
int forced_filters_flag = FALSE;
@ -449,7 +295,7 @@ void filter_toggle_callback (GtkWidget *widget, unsigned char mask) {
if (!forced_filters_flag) {
cur_filter ^= mask;
server_clist_build_filtered (cur_server_list, FALSE); /* in srv-list.c */
reset_main_status_bar ();
reset_main_status_bar(builder);
}
}
@ -500,7 +346,7 @@ void set_server_filter_menu_list_text (void){
print_status (main_filter_status_bar, status_buf);
reset_main_status_bar ();
reset_main_status_bar(builder);
}
@ -572,9 +418,9 @@ void update_server_lists_from_selected_source (void) {
collate_server_lists (cur_masters, &cur_server_list, &cur_userver_list);
}
/**
update ui with aquired data during refresh and when refresh is done
*/
// Update ui with acquired data during refresh and when refresh is done
int stat_lists_refresh (struct stat_job *job) {
int items;
int freeze;
@ -614,9 +460,8 @@ int stat_lists_refresh (struct stat_job *job) {
}
}
// print_status (main_status_bar, (progress_bar_str)? progress_bar_str : "", job->progress.done, job->progress.tasks);
if (job->progress.tasks > 0) {
progress_bar_set_percentage (main_progress_bar, ((float)job->progress.done) / job->progress.tasks);
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(main_progress_bar), ((float)job->progress.done) / job->progress.tasks);
}
return TRUE;
@ -667,19 +512,13 @@ void stat_lists_close_handler (struct stat_job *job, int killed) {
update_server_lists_from_selected_source ();
server_clist_build_filtered (cur_server_list, TRUE);
}
/*
if (redialserver == 1) {
print_status (main_status_bar, _("Waiting to redial server(s)..."));
else {
}
*/
reset_main_status_bar ();
reset_main_status_bar(builder);
progress_bar_reset (main_progress_bar);
stat_process = NULL;
set_widgets_sensitivity ();
set_widgets_sensitivity (builder);
}
@ -718,7 +557,7 @@ void stat_lists (GSList *masters, GSList *names, GSList *servers, GSList *hosts)
stat_process->master_handlers = g_slist_append (stat_process->master_handlers, stat_lists_master_handler);
stat_start (stat_process);
set_widgets_sensitivity ();
set_widgets_sensitivity (builder);
debug_decrease_indent ();
}
@ -1042,7 +881,7 @@ void launch_core2_callback (int spectate, char *demo, struct condef *con) {
stat_process->close_handlers, launch_close_handler);
stat_start (stat_process);
set_widgets_sensitivity ();
set_widgets_sensitivity (builder);
return;
@ -1105,7 +944,7 @@ void launch_record_callback (GtkWidget *widget) {
}
launch_core2_callback (spectate, demo, con);
return;
}
@ -1274,7 +1113,7 @@ void add_to_favorites_callback (GtkWidget *widget, gpointer data) {
snprintf (buf, buflen, "Server '%s' Already In Favorites",
((struct server *)tmp->data)->name);
}
print_status (main_status_bar, buf);
print_status (GTK_WIDGET (gtk_builder_get_object (builder, "main-status-bar")), buf);
}
debug (7, "add_to_favorites_callback() -- Saving To Favorites");
@ -1386,7 +1225,7 @@ void prepare_new_server_to_favorites (enum server_type type, char* str, gboolean
}
stat_start (stat_process);
set_widgets_sensitivity ();
set_widgets_sensitivity (builder);
}
}
@ -1673,7 +1512,7 @@ void find_player_callback (GtkWidget *widget, int find_next) {
if (find_next || find_player_dialog ()) {
if (!psearch_data_is_empty ()) {
pattern = psearch_lookup_pattern ();
print_status (main_status_bar, _("Find Player: %s"), pattern);
print_status (GTK_WIDGET (gtk_builder_get_object (builder, "main-status-bar")), _("Find Player: %s"), pattern);
g_free (pattern);
find_player (find_next);
@ -1755,24 +1594,10 @@ void properties_callback (GtkWidget *widget, gpointer data) {
if (cur_server) {
properties_dialog (cur_server);
set_widgets_sensitivity ();
set_widgets_sensitivity (builder);
}
}
#if 0
void cancelredial_callback (GtkWidget *widget, gpointer data) {
if (stat_process) {
return;
}
redialserver = 0;
print_status (main_status_bar, _("Done."));
progress_bar_reset (main_progress_bar);
}
#endif
void rcon_callback (GtkWidget *widget, gpointer data) {
struct server_props *sp;
char *passwd = NULL;
@ -2112,7 +1937,7 @@ void source_selection_changed (void) {
update_server_lists_from_selected_source ();
server_clist_set_list (cur_server_list);
reset_main_status_bar ();
reset_main_status_bar(builder);
}
@ -2140,7 +1965,7 @@ void source_selection_clear_master_servers (void) {
update_server_lists_from_selected_source ();
server_clist_set_list (cur_server_list);
reset_main_status_bar ();
reset_main_status_bar(builder);
}
void clear_master_servers_callback (GtkWidget *widget,
@ -2524,7 +2349,7 @@ void populate_main_window (void) {
gtk_clist_set_compare_func (server_clist, (GtkCListCompareFunc) server_clist_compare_func);
gtk_widget_show (GTK_WIDGET (server_clist));
pane3_widget = GTK_WIDGET (gtk_builder_get_object (builder, "hpaned2"));
// Player CList
@ -2559,7 +2384,6 @@ void populate_main_window (void) {
// Status Bar & Progress Bar
hbox = GTK_WIDGET (gtk_builder_get_object (builder, "hbox-status-bar"));
main_status_bar = GTK_WIDGET (gtk_builder_get_object (builder, "main-status-bar"));
main_filter_status_bar = GTK_WIDGET (gtk_builder_get_object (builder, "main-filter-status-bar"));
gtk_widget_set_usize (main_filter_status_bar, 100, -1); // ???
@ -2808,7 +2632,6 @@ void init_scripts_path () {
}
int main (int argc, char *argv[]) {
char *gtk_config;
char* var = NULL;
int newversion = FALSE;
@ -2847,18 +2670,10 @@ int main (int argc, char *argv[]) {
return 1;
}
gtk_config = file_in_dir (user_rcdir, "gtkrc");
gtk_rc_add_default_file (gtk_config);
g_free (gtk_config);
gtk_init (&argc, &argv);
parse_commandline (argc, argv);
if (!GDK_PIXBUF_INSTALLED) {
xqf_warning (_("gdk-pixbuf is not installed. Some icons may not be displayed"));
}
if (dns_spawn_helper () < 0) {
xqf_error ("Unable to start DNS helper");
return 1;
@ -2928,9 +2743,11 @@ int main (int argc, char *argv[]) {
source_ctree_select_source (favorites);
filter_menu_activate_current ();
print_status (main_status_bar, NULL);
print_status (GTK_WIDGET (gtk_builder_get_object (builder, "main-status-bar")), NULL);
if (default_auto_favorites && !cmdline_add_server) refresh_callback (NULL, NULL);
if (default_auto_favorites && !cmdline_add_server) {
refresh_callback (NULL, NULL);
}
g_timeout_add (0, check_cmdline_launch, NULL);

215
src/xqf.h
View File

@ -27,6 +27,9 @@
#include <gtk/gtk.h>
#include <glib.h>
#include "defs.h"
#include "game.h"
#define RC_DIR ".qf" /* legacy config dir, before 1.0.6 */
#define XDG_RC_DIR "xqf" /* new config dir, since 1.0.6 */
#define RC_FILE "qfrc"
@ -42,215 +45,6 @@
#define MAX_RETRIES 10
/* max 0x8000, server->flags is unsigned */
enum server_flags {
PLAYER_GROUP_RED = 0x001,
PLAYER_GROUP_GREEN = 0x002,
PLAYER_GROUP_BLUE = 0x004,
PLAYER_GROUP_MASK = 0x007,
SERVER_CHEATS = 0x008,
SERVER_PASSWORD = 0x010,
SERVER_SP_PASSWORD = 0x020,
SERVER_SPECTATE = 0x040,
SERVER_PUNKBUSTER = 0x080,
SERVER_INCOMPATIBLE = 0x100
};
enum launch_mode {
LAUNCH_NORMAL,
LAUNCH_SPECTATE,
LAUNCH_RECORD
};
// note: there is a limit of 256 servers, see get_server_pixmap in srv-list.c
enum server_type {
Q1_SERVER = 0,
QW_SERVER,
Q2_SERVER,
Q3_SERVER,
Q4_SERVER,
WO_SERVER,
WOET_SERVER,
ETL_SERVER,
DOOM3_SERVER,
ETQW_SERVER,
EF_SERVER,
H2_SERVER,
HW_SERVER,
SN_SERVER,
HL_SERVER_OLD,
HL_SERVER,
HL2_SERVER,
KP_SERVER,
SFS_SERVER,
SOF2S_SERVER,
T2_SERVER,
HR_SERVER,
UN_SERVER,
UT2_SERVER,
UT2004_SERVER,
RUNE_SERVER,
POSTAL2_SERVER,
AAO_SERVER,
DESCENT3_SERVER,
SSAM_SERVER,
SSAMSE_SERVER,
MOHAA_SERVER,
COD_SERVER,
SAS_SERVER,
BF1942_SERVER,
JK2_SERVER,
JK3_SERVER,
NETP_SERVER,
NEXUIZ_SERVER,
XONOTIC_SERVER,
WARSOW_SERVER,
TREMULOUS_SERVER,
TREMULOUSGPP_SERVER,
TREMFUSION_SERVER,
UNVANQUISHED_SERVER,
OPENARENA_SERVER,
OTTD_SERVER,
Q3RALLY_SERVER,
WOP_SERVER,
IOURT_SERVER,
REACTION_SERVER,
SMOKINGUNS_SERVER,
ZEQ2LITE_SERVER,
TURTLEARENA_SERVER,
ALIENARENA_SERVER,
GPS_SERVER,
UNKNOWN_SERVER
};
#define GAMES_TOTAL UNKNOWN_SERVER
enum master_state {
SOURCE_NA = 0,
SOURCE_UP,
SOURCE_DOWN,
SOURCE_TIMEOUT,
SOURCE_ERROR
};
enum master_query_type {
MASTER_NATIVE=0,
MASTER_GAMESPY,
MASTER_HTTP,
MASTER_LAN,
MASTER_FILE,
MASTER_GSLIST,
MASTER_NUM_QUERY_TYPES,
MASTER_INVALID_TYPE
};
/**
* A player. There is no destructor for this struct. Alloc as many data as you
* need at once and have the pointers point inside.
*/
struct player {
char *name;
char *skin;
char *model;
int time;
short frags;
short ping;
unsigned char shirt;
unsigned char pants;
unsigned char flags;
};
struct host {
char *name;
struct in_addr ip;
time_t refreshed;
int ref_count;
};
/** server_new, server_free_info, server_move_info must be adapted for
* changes to this structure
*/
struct server {
struct host *host;
gchar *name;
char *map;
char **info;
char *game; /** pointer into info, do not free */
char *gametype; /** pointer into info, do not free */
GSList *players; /** GSList<struct player *> */
#ifdef USE_GEOIP
int country_id;
#endif
unsigned flags;
unsigned flt_last; /** time of the last filtering */
time_t refreshed;
time_t last_answer; /** time of last reply from server */
int ref_count;
enum server_type type;
unsigned short port;
unsigned short maxplayers;
unsigned short curplayers;
unsigned short curbots;
unsigned short private_client; /** number of private clients */
short ping;
short retries;
char sv_os; /** L = Linux, W = windows, M = Mac */
unsigned char filters;
unsigned char flt_mask;
};
struct userver {
char *hostname;
struct server *s;
int ref_count;
unsigned short port;
unsigned char type; /* enum server_type type; */
};
typedef struct {
int portadjust; /* value added to port */
char* gsmtype; /* type for gslist master */
} QFMasterOptions;
typedef struct master {
char *name;
enum server_type type;
int isgroup; /* is it a real master or master group? */
int user; /* is it added or edited by user? */
QFMasterOptions options;
struct host *host;
unsigned short port;
char *hostname; /* unresolved hostname */
char *url;
GSList *servers;
GSList *uservers;
enum master_state state;
GSList *masters;
enum master_query_type master_type;
/** private */
char* _qstat_master_option; // optional override from games[type].qstat_master_option
} QFMaster;
char* master_qstat_option(struct master* m);
void master_set_qstat_option(struct master* m, const char* opt);
@ -271,6 +65,7 @@ extern struct server *cur_server;
extern struct stat_job *stat_process;
extern GtkBuilder *builder;
int compare_qstat_version (const char* have, const char* expected);
int start_prog_and_return_fd(char *const argv[], pid_t *pid);
@ -279,8 +74,6 @@ int check_qstat_version(void);
void play_sound (const char *sound, gboolean override);
void play_sound_with (const char* player, const char *sound, gboolean override);
extern void reset_main_status_bar(void);
//extern int filter_start_index;
extern int event_type;