foxygit / doom Log in
commit 8efab8a2b8d726e43544f5b12bef3f79df1a31af
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Mon Oct 23 22:27:10 2006 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Mon Oct 23 22:27:10 2006 +0000

    Rename testconfig.[ch] to execute.[ch], add generalised framework for
    launching Doom. Make the "Save parameters and launch Doom" option on the
    main menu work.

    Subversion-branch: /trunk/chocolate-doom
    Subversion-revision: 724
---
 setup/Makefile.am                 |  2 +-
 setup/{testconfig.c => execute.c} | 86 +++++++++++++++++++++++++++++++++++----
 setup/{testconfig.h => execute.h} |  6 +++
 setup/keyboard.c                  |  2 +-
 setup/mainmenu.c                  | 28 +++++++++++--
 setup/mouse.c                     |  2 +-
 6 files changed, 111 insertions(+), 15 deletions(-)

diff --git a/setup/Makefile.am b/setup/Makefile.am
index cb3f2e45..b0f2a276 100644
--- a/setup/Makefile.am
+++ b/setup/Makefile.am
@@ -16,7 +16,7 @@ chocolate_setup_SOURCES =                       \
     mouse.c           mouse.h                   \
     multiplayer.c     multiplayer.h             \
     sound.c           sound.h                   \
-    testconfig.c      testconfig.h              \
+    execute.c         execute.h                 \
     txt_keyinput.c    txt_keyinput.h            \
     txt_mouseinput.c  txt_mouseinput.h

diff --git a/setup/testconfig.c b/setup/execute.c
similarity index 51%
rename from setup/testconfig.c
rename to setup/execute.c
index 19e1ca2c..09d09489 100644
--- a/setup/testconfig.c
+++ b/setup/execute.c
@@ -19,14 +19,85 @@
 // 02111-1307, USA.
 //

-// Code for invoking Doom to test the current configuration.
+// Code for invoking Doom

+#include <stdarg.h>
+#include <stdio.h>
 #include <stdlib.h>
+#include <string.h>

 #include "textscreen.h"

+#include "execute.h"
+
+struct execute_context_s
+{
+    char *response_file;
+    FILE *stream;
+};
+
+execute_context_t *NewExecuteContext(void)
+{
+    execute_context_t *result;
+
+    result = malloc(sizeof(execute_context_t));
+
+#ifdef _WIN32
+    result->response_file = "chocolat.rsp";
+#else
+    result->response_file = "/tmp/chocolate.rsp";
+#endif
+
+    result->stream = fopen(result->response_file, "w");
+
+    if (result->stream == NULL)
+    {
+        fprintf(stderr, "Error opening response file\n");
+        exit(-1);
+    }
+
+    return result;
+}
+
+void AddCmdLineParameter(execute_context_t *context, char *s, ...)
+{
+    va_list args;
+
+    va_start(args, s);
+
+    vfprintf(context->stream, s, args);
+}
+
+void ExecuteDoom(execute_context_t *context)
+{
+    char *cmdline;
+
+    fclose(context->stream);
+
+    // Build the command line
+
+    cmdline = malloc(strlen(INSTALL_DIR)
+                     + strlen(context->response_file) + 20);
+
+#ifdef _WIN32
+    sprintf(cmdline, "chocolate-doom @%s", context->response_file);
+#else
+    sprintf(cmdline, INSTALL_DIR "/chocolate-doom @%s", context->response_file);
+#endif
+
+    // Run the command
+    system(cmdline);
+
+    free(cmdline);
+
+    // Destroy context
+    remove(context->response_file);
+    free(context);
+}
+
 static void TestCallback(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(data))
 {
+    execute_context_t *exec;
     txt_window_t *testwindow;
     txt_label_t *label;

@@ -38,14 +109,11 @@ static void TestCallback(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(data))
     TXT_AddWidget(testwindow, label);
     TXT_DrawDesktop();

-#ifdef _WIN32
-    // On windows, just run the command - we aren't installed anywhere
-    // special.
-    system("chocolate-doom -testcontrols");
-#else
-    // Use the location where we are installed
-    system(INSTALL_DIR "/chocolate-doom -testcontrols");
-#endif
+    // Run with the -testcontrols parameter
+
+    exec = NewExecuteContext();
+    AddCmdLineParameter(exec, "-testcontrols");
+    ExecuteDoom(exec);

     TXT_CloseWindow(testwindow);
 }
diff --git a/setup/testconfig.h b/setup/execute.h
similarity index 82%
rename from setup/testconfig.h
rename to setup/execute.h
index 3806e26f..d7d7e6a8 100644
--- a/setup/testconfig.h
+++ b/setup/execute.h
@@ -24,6 +24,12 @@

 #include "textscreen.h"

+typedef struct execute_context_s execute_context_t;
+
+execute_context_t *NewExecuteContext(void);
+void AddCmdLineParameter(execute_context_t *context, char *s, ...);
+void ExecuteDoom(execute_context_t *context);
+
 txt_window_action_t *TestConfigAction(void);

 #endif /* #ifndef TESTCONFIG_H */
diff --git a/setup/keyboard.c b/setup/keyboard.c
index 0485decb..0b434859 100644
--- a/setup/keyboard.c
+++ b/setup/keyboard.c
@@ -20,7 +20,7 @@
 //
 #include "textscreen.h"

-#include "testconfig.h"
+#include "execute.h"
 #include "txt_keyinput.h"

 #include "keyboard.h"
diff --git a/setup/mainmenu.c b/setup/mainmenu.c
index ca29e9cf..2b484418 100644
--- a/setup/mainmenu.c
+++ b/setup/mainmenu.c
@@ -23,6 +23,8 @@
 #include "config.h"
 #include "textscreen.h"

+#include "execute.h"
+
 #include "configfile.h"
 #include "m_argv.h"

@@ -33,7 +35,7 @@
 #include "multiplayer.h"
 #include "sound.h"

-void DoQuit(void *widget, void *dosave)
+static void DoQuit(void *widget, void *dosave)
 {
     if (dosave != NULL)
     {
@@ -43,7 +45,7 @@ void DoQuit(void *widget, void *dosave)
     exit(0);
 }

-void QuitConfirm(void *unused1, void *unused2)
+static void QuitConfirm(void *unused1, void *unused2)
 {
     txt_window_t *window;
     txt_label_t *label;
@@ -71,6 +73,26 @@ void QuitConfirm(void *unused1, void *unused2)
     TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, NULL);
 }

+static void LaunchDoom(void *unused1, void *unused2)
+{
+    execute_context_t *exec;
+
+    // Save configuration first
+
+    M_SaveDefaults();
+
+    // Shut down textscreen GUI
+
+    TXT_Shutdown();
+
+    // Launch Doom
+
+    exec = NewExecuteContext();
+    ExecuteDoom(exec);
+
+    exit(0);
+}
+
 void MainMenu(void)
 {
     txt_window_t *window;
@@ -89,7 +111,7 @@ void MainMenu(void)
                          (TxtWidgetSignalFunc) ConfigSound, NULL),
           TXT_NewButton2("Compatibility",
                          (TxtWidgetSignalFunc) CompatibilitySettings, NULL),
-          TXT_NewButton("Save parameters and launch DOOM"),
+          TXT_NewButton2("Save parameters and launch DOOM", LaunchDoom, NULL),
           TXT_NewStrut(0, 1),
           TXT_NewButton2("Start a Network game",
                          (TxtWidgetSignalFunc) StartMultiGame, NULL),
diff --git a/setup/mouse.c b/setup/mouse.c
index 2dbec612..c2d7e155 100644
--- a/setup/mouse.c
+++ b/setup/mouse.c
@@ -23,7 +23,7 @@

 #include "textscreen.h"

-#include "testconfig.h"
+#include "execute.h"
 #include "txt_mouseinput.h"

 #include "mouse.h"