First shot at callbacks separation
parent
d76bb074c6
commit
44c870ebeb
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
|
@ -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__
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
105
src/xqf-ui.c
105
src/xqf-ui.c
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
231
src/xqf.c
|
@ -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
215
src/xqf.h
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue