29 #include "client-vala.h"
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 "Login method to request from server", NULL },
86 "Log command acknowledgement latency to stdout", NULL },
88 "Print map redraw times to stdout", NULL },
89 {
"verbose",
'v', 0, G_OPTION_ARG_INT, &
MINLOG,
90 "Set verbosity (0 is the most verbose)",
"LEVEL" },
92 "Print commands to and from the server", NULL },
94 "Launch client script at start (can be used multiple times)",
"SCRIPT_NAME" },
110 static int do_scriptout() {
116 static gboolean
script_launch(
const gchar *option_name,
const gchar *value, gpointer data, GError **error)
148 switch (response_id) {
150 gtk_widget_destroy(GTK_WIDGET(
self));
159 gtk_widget_destroy(GTK_WIDGET(
self));
166 gtk_widget_destroy(GTK_WIDGET(
self));
173 GtkWidget *dialog = gtk_dialog_new_with_buttons(
"Auto-AFK", GTK_WINDOW(
window_root), GTK_DIALOG_DESTROY_WITH_PARENT,
174 "Return to game", 0,
"Return to game, but stay AFK", 1,
"Return to game, disable auto-AFK", 2, NULL);
175 GtkWidget *label, *content_area;
176 content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
177 label = gtk_label_new(
"You have been automatically marked as being away.");
178 gtk_container_add(GTK_CONTAINER(content_area), label);
180 gtk_widget_show_all(dialog);
188 if (gtk_notebook_get_current_page(GTK_NOTEBOOK(
map_notebook)) !=
215 LOG(
LOG_DEBUG,
"main.c::client_exit",
"Exiting with return value 0.");
223 struct timeval timeout = {0, 0};
229 LOG(
LOG_INFO,
"main.c::do_network",
"Trying to do network when not connected.");
238 pollret = select(
maxfd, &tmp_read, NULL, NULL, &timeout);
242 LOG(
LOG_ERROR,
"do_network",
"script select() failed: %s", strerror(errno));
244 }
else if (pollret > 0) {
256 g_timeout_add(250, G_SOURCE_FUNC(do_scriptout), NULL);
260 if (net_source == NULL) {
262 "The server unexpectedly disconnected.");
266 g_source_set_callback(net_source, (GSourceFunc)
do_network, NULL, NULL);
267 g_source_attach(net_source, NULL);
285 GOptionContext *context = g_option_context_new(
"- Crossfire GTKv2 Client");
286 GError *error = NULL;
288 g_option_context_add_main_entries(context,
options, NULL);
289 g_option_context_add_group(context, gtk_get_option_group(TRUE));
291 if (!g_option_context_parse(context, &argc, &argv, &error)) {
292 g_print(
"%s\n", error->message);
297 g_option_context_free(context);
305 g_setenv(
"CF_SOUND_DEBUG",
"yes",
false);
315 GtkWidget *dialog = gtk_message_dialog_new(
316 NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
317 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
"%s", error);
318 gtk_window_set_title(GTK_WINDOW(dialog),
"Crossfire Client");
319 gtk_message_dialog_format_secondary_markup(
320 GTK_MESSAGE_DIALOG(dialog),
"%s", message);
321 gtk_dialog_run(GTK_DIALOG(dialog));
322 gtk_widget_destroy(dialog);
338 const gchar *message, gpointer user_data) {
344 signal(SIGPIPE, SIG_IGN);
352 guint retval = gtk_builder_add_from_file(
window_xml, name, NULL);
353 if (retval > 0 && strlen(name) > 0) {
364 GError *error = NULL;
365 GdkGeometry geometry;
371 error_dialog(
"Couldn't load UI dialogs.", error->message);
372 g_warning(
"Couldn't load UI dialogs: %s", error->message);
383 g_error(
"Could not load default layout!");
394 GTK_NOTEBOOK(gtk_builder_get_object(
dialog_xml,
"main_notebook"));
400 "Check that your layout files are not corrupt.");
405 gtk_widget_add_events((gpointer)
window_root, GDK_FOCUS_CHANGE_MASK);
406 g_signal_connect((gpointer)
window_root,
"focus-out-event",
409 g_signal_connect_swapped((gpointer)
window_root,
"key_press_event",
411 g_signal_connect_swapped((gpointer)
window_root,
"key_release_event",
413 g_signal_connect((gpointer)
window_root,
"destroy",
417 geometry.min_width=640;
418 geometry.min_height=480;
421 &geometry, GDK_HINT_MIN_SIZE);
424 "drawingarea_magic_map"));
426 g_signal_connect((gpointer)
magic_map,
"expose_event",
432 fprintf(stderr,
"gdk_color_parse failed (%s)\n",
colorname[i]);
434 if (!gdk_colormap_alloc_color(gtk_widget_get_colormap(
window_root),
436 fprintf(stderr,
"gdk_color_alloc failed\n");
493 int main(
int argc,
char *argv[]) {
496 bind_textdomain_codeset(GETTEXT_PACKAGE,
"UTF-8");
497 bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
498 textdomain(GETTEXT_PACKAGE);
502 gtk_init(&argc, &argv);
582 gdk_window_get_geometry(gtk_widget_get_window(win), x, y, w, h, NULL);
584 gdk_window_get_origin(gtk_widget_get_window(win), wx, wy);