From 4c015d196b73ed219f20ac1b95a590d3f2ca49da Mon Sep 17 00:00:00 2001 From: rodin Date: Mon, 30 Nov 2009 11:21:54 +0000 Subject: [PATCH] Seperation of client code from the tests --- client/.svnignore | 6 ++ client/Makefile.am | 27 +++++++ client/callbacks.c | 52 +++++++++++++ client/chimara.menus | 19 +++++ client/chimara.ui | 49 +++++++++++++ client/error.c | 52 +++++++++++++ client/error.h | 27 +++++++ client/iliad.c | 157 +++++++++++++++++++++++++++++++++++++++ client/main.c | 170 +++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 559 insertions(+) create mode 100644 client/.svnignore create mode 100644 client/Makefile.am create mode 100644 client/callbacks.c create mode 100644 client/chimara.menus create mode 100644 client/chimara.ui create mode 100644 client/error.c create mode 100644 client/error.h create mode 100644 client/iliad.c create mode 100644 client/main.c diff --git a/client/.svnignore b/client/.svnignore new file mode 100644 index 0000000..c413f5d --- /dev/null +++ b/client/.svnignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +chimara +iliad diff --git a/client/Makefile.am b/client/Makefile.am new file mode 100644 index 0000000..af25af5 --- /dev/null +++ b/client/Makefile.am @@ -0,0 +1,27 @@ +AM_CFLAGS = -Wall +AM_CPPFLAGS = -I$(top_srcdir) + +PLUGIN_LIBTOOL_FLAGS=-module -avoid-version -export-symbols-regex "^glk_main$$" + +if TARGET_ILIAD + +chimara_iliad_SOURCES = iliad.c +chimara_iliad_CFLAGS = @TEST_CFLAGS@ $(AM_CFLAGS) +chimara_iliad_LDADD = @TEST_LIBS@ $(top_builddir)/libchimara/libchimara.la + +bin_PROGRAMS = chimara_iliad + +else + +dist_data_DATA = chimara.ui chimara.menus +bin_PROGRAMS = chimara + +chimara_SOURCES = main.c callbacks.c error.c error.h +chimara_CPPFLAGS = $(AM_CPPFLAGS) \ + -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ + -DPACKAGE_SRC_DIR=\""$(srcdir)"\" \ + -DPACKAGE_DATA_DIR=\""$(datadir)"\" +chimara_CFLAGS = @TEST_CFLAGS@ $(AM_CFLAGS) +chimara_LDADD = @TEST_LIBS@ $(top_builddir)/libchimara/libchimara.la + +endif diff --git a/client/callbacks.c b/client/callbacks.c new file mode 100644 index 0000000..479a5ce --- /dev/null +++ b/client/callbacks.c @@ -0,0 +1,52 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * callbacks.c + * Copyright (C) Philip en Marijn 2008 <> + * + * callbacks.c is free software copyrighted by Philip en Marijn. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name ``Philip en Marijn'' nor the name of any other + * contributor may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * callbacks.c IS PROVIDED BY Philip en Marijn ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Philip en Marijn OR ANY OTHER CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include "error.h" + +void on_save(GtkAction *action, ChimaraGlk *glk) { + chimara_glk_feed_line_input(glk, "save"); +} + +void on_restore(GtkAction *action, ChimaraGlk *glk) { + chimara_glk_feed_line_input(glk, "restore"); +} + +gboolean on_window_delete_event(GtkWidget *widget, GdkEvent *event, ChimaraGlk *glk) { + gtk_main_quit(); + return TRUE; +} + +void on_quit(GtkAction *action, ChimaraGlk *glk) { + gtk_main_quit(); +} diff --git a/client/chimara.menus b/client/chimara.menus new file mode 100644 index 0000000..e7ead1e --- /dev/null +++ b/client/chimara.menus @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/client/chimara.ui b/client/chimara.ui new file mode 100644 index 0000000..2519722 --- /dev/null +++ b/client/chimara.ui @@ -0,0 +1,49 @@ + + + + + + Chimara + 800 + 800 + + + + True + vertical + + + + + + + + + _Game + + + _Open... + _Open + Quit the current game and load a new one + gtk-media-play + + + _Restore... + _Restore + Restore a previously saved game + gtk-open + + + + _Save + Save the game + gtk-save + + + + _Quit + Exit Chimara + gtk-quit + + + diff --git a/client/error.c b/client/error.c new file mode 100644 index 0000000..c9b6f08 --- /dev/null +++ b/client/error.c @@ -0,0 +1,52 @@ +/* Copyright 2006 P.F. Chimento + * This file is part of GNOME Inform 7. + * + * GNOME Inform 7 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. + * + * GNOME Inform 7 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 GNOME Inform 7; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include + +#include "error.h" + +/* Create and display an error dialog box, with parent window parent, and +message format string msg. If err is not NULL, tack the error message on to the +end of the format string. */ +void +error_dialog(GtkWindow *parent, GError *err, const gchar *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + gchar buffer[1024]; + g_vsnprintf(buffer, 1024, msg, ap); + va_end(ap); + + gchar *message; + if(err) { + message = g_strconcat(buffer, err->message, NULL); + g_error_free(err); + } else + message = g_strdup(buffer); + + GtkWidget *dialog = gtk_message_dialog_new(parent, + parent? GTK_DIALOG_DESTROY_WITH_PARENT : 0, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + message); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + g_free(message); +} diff --git a/client/error.h b/client/error.h new file mode 100644 index 0000000..bb05fbe --- /dev/null +++ b/client/error.h @@ -0,0 +1,27 @@ +/* Copyright 2006 P.F. Chimento + * This file is part of GNOME Inform 7. + * + * GNOME Inform 7 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. + * + * GNOME Inform 7 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 GNOME Inform 7; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef ERROR_H +#define ERROR_H + +#include +#include + +void error_dialog(GtkWindow *parent, GError *err, const gchar *msg, ...); + +#endif diff --git a/client/iliad.c b/client/iliad.c new file mode 100644 index 0000000..ee9d7f5 --- /dev/null +++ b/client/iliad.c @@ -0,0 +1,157 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * iliad.c + * Copyright (C) Philip en Marijn 2008 <> + * + * iliad.c is free software copyrighted by Philip en Marijn. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name ``Philip en Marijn'' nor the name of any other + * contributor may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * main.c IS PROVIDED BY Philip en Marijn ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Philip en Marijn OR ANY OTHER CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "error.h" +#include +#include + +/* Global pointers to widgets */ +GtkWidget *window = NULL; +GtkWidget *glk = NULL; + +static void +on_started(ChimaraGlk *glk) +{ + g_printerr("Started!\n"); +} + +static void +on_stopped(ChimaraGlk *glk) +{ + g_printerr("Stopped!\n"); +} + +static void +on_restore() +{ + chimara_glk_feed_line_input( CHIMARA_GLK(glk), "restore" ); +} + +static void +on_save() +{ + chimara_glk_feed_line_input( CHIMARA_GLK(glk), "save" ); +} + +static void +create_window(void) +{ + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + glk = chimara_if_new(); + //chimara_if_set_preferred_interpreter( CHIMARA_IF(glk), CHIMARA_IF_FORMAT_Z8, CHIMARA_IF_INTERPRETER_NITFOL); + + gtk_widget_set_size_request(window, 800, 800); + g_object_set(glk, + "border-width", 6, + "spacing", 6, + "ignore-errors", TRUE, + NULL); + chimara_glk_set_default_font_string(CHIMARA_GLK(glk), "Serif 12"); + chimara_glk_set_monospace_font_string(CHIMARA_GLK(glk), "Monospace 12"); + g_signal_connect(glk, "started", G_CALLBACK(on_started), NULL); + g_signal_connect(glk, "stopped", G_CALLBACK(on_stopped), NULL); + + GtkWidget *vbox = gtk_vbox_new(FALSE, 0); + GtkWidget *toolbar = gtk_toolbar_new(); + + GtkToolItem *restore_button = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN); + g_signal_connect(restore_button, "clicked", G_CALLBACK(on_restore), NULL); + gtk_toolbar_insert( GTK_TOOLBAR(toolbar), restore_button, 0 ); + + GtkToolItem *save_button = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE); + g_signal_connect(save_button, "clicked", G_CALLBACK(on_save), NULL); + gtk_toolbar_insert( GTK_TOOLBAR(toolbar), save_button, 0 ); + + GtkToolItem *quit_button = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT); + g_signal_connect(quit_button, "clicked", G_CALLBACK(gtk_main_quit), NULL); + gtk_toolbar_insert( GTK_TOOLBAR(toolbar), quit_button, 0 ); + + GtkWidget *spacer = gtk_vbox_new(FALSE, 0); + gtk_widget_set_size_request(spacer, -1, 250); + + gtk_box_pack_start( GTK_BOX(vbox), toolbar, FALSE, FALSE, 0 ); + gtk_box_pack_start( GTK_BOX(vbox), glk, TRUE, TRUE, 0 ); + gtk_box_pack_end( GTK_BOX(vbox), spacer, FALSE, FALSE, 0 ); + + gtk_container_add( GTK_CONTAINER(window), vbox ); +} + +int +main(int argc, char *argv[]) +{ + GError *error = NULL; + +#ifdef ENABLE_NLS + bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); + textdomain(GETTEXT_PACKAGE); +#endif + + if( !g_thread_supported() ) + g_thread_init(NULL); + gdk_threads_init(); + gtk_init(&argc, &argv); + + create_window(); + gtk_widget_show_all(window); + + if(argc < 2) { + g_printerr("Must provide a game file\n"); + return 1; + } + + if( !chimara_if_run_game(CHIMARA_IF(glk), argv[1], &error) ) { + g_printerr("Error starting Glk library: %s\n", error->message); + return 1; + } + //chimara_glk_run( CHIMARA_GLK(glk), ".libs/multiwin.so", argc, argv, NULL); + + + gdk_threads_enter(); + gtk_main(); + gdk_threads_leave(); + + chimara_glk_stop(CHIMARA_GLK(glk)); + chimara_glk_wait(CHIMARA_GLK(glk)); + + return 0; +} diff --git a/client/main.c b/client/main.c new file mode 100644 index 0000000..b86badd --- /dev/null +++ b/client/main.c @@ -0,0 +1,170 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ +/* + * main.c + * Copyright (C) Philip en Marijn 2008 <> + * + * main.c is free software copyrighted by Philip en Marijn. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name ``Philip en Marijn'' nor the name of any other + * contributor may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * main.c IS PROVIDED BY Philip en Marijn ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Philip en Marijn OR ANY OTHER CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "error.h" +#include +#include + +/* Global pointers to widgets */ +GtkBuilder *builder = NULL; +GtkUIManager *uimanager = NULL; +GtkWidget *window = NULL; +GtkWidget *glk = NULL; + +static GObject * +load_object(const gchar *name) +{ + GObject *retval; + if( (retval = gtk_builder_get_object(builder, name)) == NULL) { + error_dialog(NULL, NULL, "Error while getting object '%s'", name); + g_error("Error while getting object '%s'", name); + } + return retval; +} + +static void +create_window(void) +{ + GError *error = NULL; + + builder = gtk_builder_new(); + if( !gtk_builder_add_from_file(builder, PACKAGE_SRC_DIR "/chimara.ui", &error) ) { + error_dialog(NULL, error, "Error while building interface: "); + return; + } + + window = GTK_WIDGET(load_object("chimara")); + GtkActionGroup *actiongroup = GTK_ACTION_GROUP(load_object("actiongroup")); + + /* Add all the actions to the action group. This for-loop is a temporary fix + and can be removed once Glade supports adding actions and accelerators to an + action group. */ + const gchar *actions[] = { + "game", "", + "open", "F7", + "save", NULL, /* NULL means use stock accelerator */ + "quit", NULL, + "hint", "", + "char_input", "", + "char_input2", "", + NULL + }; + const gchar **ptr; + for(ptr = actions; *ptr; ptr += 2) + gtk_action_group_add_action_with_accel(actiongroup, GTK_ACTION(load_object(ptr[0])), ptr[1]); + + uimanager = gtk_ui_manager_new(); + if( !gtk_ui_manager_add_ui_from_file(uimanager, PACKAGE_SRC_DIR "/chimara.menus", &error) ) { + error_dialog(NULL, error, "Error while building interface: "); + return; + } + + glk = chimara_if_new(); + //chimara_if_set_preferred_interpreter( CHIMARA_IF(glk), CHIMARA_IF_FORMAT_Z8, CHIMARA_IF_INTERPRETER_NITFOL); + + g_object_set(glk, + "border-width", 6, + "spacing", 6, + "ignore-errors", TRUE, + NULL); + chimara_glk_set_default_font_string(CHIMARA_GLK(glk), "Serif 12"); + chimara_glk_set_monospace_font_string(CHIMARA_GLK(glk), "Monospace 12"); + + GtkBox *vbox = GTK_BOX( gtk_builder_get_object(builder, "vbox") ); + if(vbox == NULL) + { + error_dialog(NULL, NULL, "Could not find vbox"); + return; + } + + gtk_ui_manager_insert_action_group(uimanager, actiongroup, 0); + GtkWidget *menubar = gtk_ui_manager_get_widget(uimanager, "/menubar"); + GtkWidget *toolbar = gtk_ui_manager_get_widget(uimanager, "/toolbar"); + + gtk_box_pack_end(vbox, glk, TRUE, TRUE, 0); + gtk_box_pack_start(vbox, menubar, FALSE, FALSE, 0); + gtk_box_pack_start(vbox, toolbar, FALSE, FALSE, 0); + + gtk_builder_connect_signals(builder, glk); +} + +int +main(int argc, char *argv[]) +{ + GError *error = NULL; + +#ifdef ENABLE_NLS + bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); + textdomain(GETTEXT_PACKAGE); +#endif + + if( !g_thread_supported() ) + g_thread_init(NULL); + gdk_threads_init(); + gtk_init(&argc, &argv); + + create_window(); + gtk_widget_show_all(window); + + g_object_unref( G_OBJECT(builder) ); + g_object_unref( G_OBJECT(uimanager) ); + + if(argc < 2) { + error_dialog(GTK_WINDOW(window), NULL, "Must provide a game file"); + return 1; + } + + if( !chimara_if_run_game(CHIMARA_IF(glk), argv[1], &error) ) { + error_dialog(GTK_WINDOW(window), error, "Error starting Glk library: "); + return 1; + } + + gdk_threads_enter(); + gtk_main(); + gdk_threads_leave(); + + chimara_glk_stop(CHIMARA_GLK(glk)); + chimara_glk_wait(CHIMARA_GLK(glk)); + + return 0; +} -- 2.30.2