29 #include "client-vala.h" 60 extern SoundServer*
server;
65 static gboolean
script_launch(
const gchar *option_name,
const gchar *value, gpointer data, GError **error);
70 "Connect to the given server",
"SERVER[:PORT]" },
72 "Cache images", NULL },
74 "Download images before playing", NULL },
76 "Use the given faceset (if available)",
"FACESET" },
78 {
"sound_server", 0, 0, G_OPTION_ARG_FILENAME, &
sound_server,
79 "Path to the sound server",
"PATH" },
81 "Update the saved bindings for this keyboard", NULL },
84 "Log command acknowledgement latency to stdout", NULL },
86 "Print map redraw times to stdout", NULL },
87 {
"verbose",
'v', 0, G_OPTION_ARG_INT, &
MINLOG,
88 "Set verbosity (0 is the most verbose)",
"LEVEL" },
90 "Print commands to and from the server", NULL },
92 "Launch client script at start (can be used multiple times)",
"SCRIPT_NAME" },
105 static int do_scriptout() {
111 static gboolean
script_launch(
const gchar *option_name,
const gchar *value, gpointer data, GError **error)
149 if (gtk_notebook_get_current_page(GTK_NOTEBOOK(
map_notebook)) !=
175 LOG(
LOG_DEBUG,
"main.c::client_exit",
"Exiting with return value 0.");
183 struct timeval timeout = {0, 0};
189 LOG(
LOG_INFO,
"main.c::do_network",
"Trying to do network when not connected.");
197 pollret = select(
maxfd, &tmp_read, NULL, NULL, &timeout);
210 g_timeout_add(250, (GtkFunction) do_scriptout, NULL);
214 if (net_source == NULL) {
216 "The server unexpectedly disconnected.");
220 g_source_set_callback(net_source, (GSourceFunc)
do_network, NULL, NULL);
221 g_source_attach(net_source, NULL);
239 GOptionContext *context = g_option_context_new(
"- Crossfire GTKv2 Client");
240 GError *error = NULL;
242 g_option_context_add_main_entries(context,
options, NULL);
243 g_option_context_add_group(context, gtk_get_option_group(TRUE));
245 if (!g_option_context_parse(context, &argc, &argv, &error)) {
246 g_print(
"%s\n", error->message);
251 g_option_context_free(context);
259 g_setenv(
"CF_SOUND_DEBUG",
"yes",
false);
269 GtkWidget *dialog = gtk_message_dialog_new(
270 NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
271 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
"%s", error);
272 gtk_window_set_title(GTK_WINDOW(dialog),
"Crossfire Client");
273 gtk_message_dialog_format_secondary_markup(
274 GTK_MESSAGE_DIALOG(dialog),
"%s", message);
275 gtk_dialog_run(GTK_DIALOG(dialog));
276 gtk_widget_destroy(dialog);
292 const gchar *message, gpointer user_data) {
303 signal(SIGPIPE, SIG_IGN);
305 maxfd = sysconf(_SC_OPEN_MAX);
307 maxfd = getdtablesize();
316 guint retval = gtk_builder_add_from_file(
window_xml, name, NULL);
317 if (retval > 0 && strlen(name) > 0) {
328 GError *error = NULL;
329 GdkGeometry geometry;
335 error_dialog(
"Couldn't load UI dialogs.", error->message);
336 g_warning(
"Couldn't load UI dialogs: %s", error->message);
345 LOG(
LOG_DEBUG,
"init_ui_layout",
"Using default layout");
347 g_error(
"Could not load default layout!");
358 GTK_NOTEBOOK(gtk_builder_get_object(
dialog_xml,
"main_notebook"));
364 "Check that your layout files are not corrupt.");
369 gtk_widget_add_events((gpointer)
window_root, GDK_FOCUS_CHANGE_MASK);
370 g_signal_connect((gpointer) window_root,
"focus-out-event",
373 g_signal_connect_swapped((gpointer) window_root,
"key_press_event",
374 G_CALLBACK(
keyfunc), GTK_WIDGET(window_root));
375 g_signal_connect_swapped((gpointer) window_root,
"key_release_event",
376 G_CALLBACK(
keyrelfunc), GTK_WIDGET(window_root));
377 g_signal_connect((gpointer) window_root,
"destroy",
381 geometry.min_width=640;
382 geometry.min_height=480;
384 gtk_window_set_geometry_hints(GTK_WINDOW(window_root), window_root,
385 &geometry, GDK_HINT_MIN_SIZE);
388 "drawingarea_magic_map"));
390 g_signal_connect((gpointer)
magic_map,
"expose_event",
396 fprintf(stderr,
"gdk_color_parse failed (%s)\n",
colorname[i]);
398 if (!gdk_colormap_alloc_color(gtk_widget_get_colormap(window_root),
400 fprintf(stderr,
"gdk_color_alloc failed\n");
451 sound_server_stop(
server);
459 int main(
int argc,
char *argv[]) {
462 bind_textdomain_codeset(GETTEXT_PACKAGE,
"UTF-8");
463 bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
464 textdomain(GETTEXT_PACKAGE);
468 gtk_init(&argc, &argv);
548 gdk_window_get_geometry(gtk_widget_get_window(win), x, y, w, h, NULL);
550 gdk_window_get_origin(gtk_widget_get_window(win), wx, wy);
void update_spell_information(void)
void error_dialog(char *error, char *message)
void client_negotiate(int sound)
void init_create_character_window()
gint16 use_config[CONFIG_NUMS]
void mapdata_animation(void)
void inventory_init(GtkWidget *window_root)
item * locate_item(gint32 tag)
static char * connect_server
static char * init_ui_layout(const char *name)
void reset_image_data(void)
void keyfunc(GtkWidget *widget, GdkEventKey *event, GtkWidget *window)
void load_theme(int reload)
void stats_init(GtkWidget *window_root)
static gboolean script_launch(const gchar *option_name, const gchar *value, gpointer data, GError **error)
static const char *const colorname[NUM_COLORS]
char window_xml_file[MAX_BUF]
void clear_stat_mapping(void)
Face_Information face_info
int main(int argc, char *argv[])
void pickup_init(GtkWidget *window_root)
void init_image_cache_data(void)
void get_window_coord(GtkWidget *win, int *x, int *y, int *wx, int *wy, int *w, int *h)
char VERSION_INFO[MAX_BUF]
static GOptionEntry options[]
void LOG(LogLevel level, const char *origin, const char *format,...)
void on_window_destroy_event(GtkWidget *object, gpointer user_data)
void script_init(const char *cparams)
static gboolean redraw(gpointer data)
void msgctrl_init(GtkWidget *window_root)
static gboolean do_network(GObject *stream, gpointer data)
GSource * client_get_source()
GdkColor root_color[NUM_COLORS]
void config_init(GtkWidget *window_root)
void info_init(GtkWidget *window_root)
gboolean on_drawingarea_magic_map_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
void keys_init(GtkWidget *window_root)
gint16 want_config[CONFIG_NUMS]
void client_tick(guint32 tick)
void map_init(GtkWidget *window_root)
void client_connect(const char hostname[static 1])
Warning that something definitely didn't work.
void my_log_handler(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)
void load_window_positions(GtkWidget *window_root)
void focusoutfunc(GtkWidget *widget, GdkEventKey *event, GtkWidget *window)
void hide_all_login_windows(void)
void script_fdset(int *maxfd, fd_set *set)
void remove_item_inventory(item *op)
void account_show_login()
void info_buffer_tick(void)
void metaserver_ui_init()
void magic_map_flash_pos(void)
static void init_sockets()
static void parse_args(int argc, char *argv[])
GtkWidget * connect_window
GtkNotebook * main_notebook
Useful debugging information.
static gboolean updatekeycodes
void script_process(fd_set *set)
bool client_is_connected()
Minor, non-harmful issues.
void draw_map(int redraw)
void keyrelfunc(GtkWidget *widget, GdkEventKey *event, GtkWidget *window)
void metaserver_show_prompt(void)
void inventory_tick(void)