Bug fixes
[rodin/chimara.git] / tests / glulxercise.c
1 #include <glib.h>
2 #include <libchimara/chimara-glk.h>
3 #include <libchimara/chimara-if.h>
4 #include "error.h"
5
6 #define LOAD_WIDGET(name) GTK_WIDGET(gtk_builder_get_object(builder, name))
7
8 typedef struct {
9         GtkWidget *window, *test_picker, *go, *stop, *interp;
10 } Widgets;
11
12 gboolean
13 on_window_delete_event()
14 {
15         gtk_main_quit();
16         return TRUE;
17 }
18
19 void
20 on_go_clicked(GtkButton *go, Widgets *w)
21 {
22         GError *error = NULL;
23
24         gchar *filename = NULL;
25         GtkTreeIter iter;
26         GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(w->test_picker));
27         gtk_combo_box_get_active_iter(GTK_COMBO_BOX(w->test_picker), &iter);
28         gtk_tree_model_get(model, &iter, 1, &filename, -1);
29         g_object_unref(model);
30
31         gchar *fullpath = g_build_filename(PACKAGE_SRC_DIR, filename, NULL);
32
33         if( !chimara_if_run_game(CHIMARA_IF(w->interp), fullpath, &error) )
34         {
35                 error_dialog(GTK_WINDOW(w->window), error, "Error starting Glk library: ");
36                 gtk_main_quit();
37         }
38         g_free(fullpath);
39 }
40
41 void
42 on_interp_started(ChimaraGlk *glk, Widgets *w)
43 {
44         gtk_widget_set_sensitive(w->go, FALSE);
45         gtk_widget_set_sensitive(w->stop, TRUE);
46         gtk_widget_set_sensitive(w->test_picker, FALSE);
47 }
48
49 void
50 on_stop_clicked(GtkButton *stop, Widgets *w)
51 {
52         chimara_glk_stop( CHIMARA_GLK(w->interp) );
53         chimara_glk_wait( CHIMARA_GLK(w->interp) );
54 }
55
56 void
57 on_interp_stopped(ChimaraGlk *glk, Widgets *w)
58 {
59         gtk_widget_set_sensitive(w->stop, FALSE);
60         gtk_widget_set_sensitive(w->go, TRUE);
61         gtk_widget_set_sensitive(w->test_picker, TRUE);
62 }
63
64 void
65 on_glulxe_toggled(GtkToggleButton *glulxe, Widgets *w)
66 {
67         if(gtk_toggle_button_get_active(glulxe))
68                 chimara_if_set_preferred_interpreter(CHIMARA_IF(w->interp), CHIMARA_IF_FORMAT_GLULX, CHIMARA_IF_INTERPRETER_GLULXE);
69 }
70
71 void
72 on_git_toggled(GtkToggleButton *git, Widgets *w)
73 {
74         if(gtk_toggle_button_get_active(git))
75                 chimara_if_set_preferred_interpreter(CHIMARA_IF(w->interp), CHIMARA_IF_FORMAT_GLULX, CHIMARA_IF_INTERPRETER_GIT);
76 }
77
78 int
79 main(int argc, char *argv[])
80 {
81         GError *error = NULL;
82
83         if( !g_thread_supported() )
84                 g_thread_init(NULL);
85         gdk_threads_init();
86         gtk_init(&argc, &argv);
87
88         GtkBuilder *builder = gtk_builder_new();
89         if(!gtk_builder_add_from_file(builder, PACKAGE_SRC_DIR "/glulxercise.ui", &error))
90         {
91                 error_dialog(NULL, error, "Failed to build interface: ");
92                 return 1;
93         }
94
95         Widgets *w = g_slice_new0(Widgets);
96         w->window = LOAD_WIDGET("window");
97         GtkWidget *vbox = LOAD_WIDGET("vbox");
98         w->test_picker = LOAD_WIDGET("test_picker");
99         gtk_combo_box_set_active(GTK_COMBO_BOX(w->test_picker), 0);
100         w->go = LOAD_WIDGET("go");
101         w->stop = LOAD_WIDGET("stop");
102         w->interp = chimara_if_new();
103         gtk_widget_set_size_request(w->interp, 500, 600);
104         gtk_box_pack_end_defaults(GTK_BOX(vbox), w->interp);
105         gtk_builder_connect_signals(builder, w);
106         g_signal_connect(w->interp, "started", G_CALLBACK(on_interp_started), w);
107         g_signal_connect(w->interp, "stopped", G_CALLBACK(on_interp_stopped), w);
108         gtk_widget_show_all(w->window);
109
110         gdk_threads_enter();
111         gtk_main();
112         gdk_threads_leave();
113
114         chimara_glk_stop( CHIMARA_GLK(w->interp) );
115         chimara_glk_wait( CHIMARA_GLK(w->interp) );
116
117         g_slice_free(Widgets, w);
118
119         return 0;
120 }