shithub: choc

Download patch

ref: 8efab8a2b8d726e43544f5b12bef3f79df1a31af
parent: 5c456761451e2002a5ae43f5acf7210ee92f00fa
author: Simon Howard <[email protected]>
date: Mon Oct 23 18:27:10 EDT 2006

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

--- a/setup/Makefile.am
+++ b/setup/Makefile.am
@@ -16,7 +16,7 @@
     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
 
--- /dev/null
+++ b/setup/execute.c
@@ -1,0 +1,130 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// Copyright(C) 2006 Simon Howard
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA.
+//
+
+// 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;
+    
+    testwindow = TXT_NewWindow("Starting Doom");
+
+    label = TXT_NewLabel("Starting Doom to test the\n"
+                         "settings.  Please wait.");
+    TXT_SetWidgetAlign(label, TXT_HORIZ_CENTER);
+    TXT_AddWidget(testwindow, label);
+    TXT_DrawDesktop();
+    
+    // Run with the -testcontrols parameter
+
+    exec = NewExecuteContext();
+    AddCmdLineParameter(exec, "-testcontrols");
+    ExecuteDoom(exec);
+
+    TXT_CloseWindow(testwindow);
+}
+
+txt_window_action_t *TestConfigAction(void)
+{
+    txt_window_action_t *test_action;
+    
+    test_action = TXT_NewWindowAction('t', "Test");
+    TXT_SignalConnect(test_action, "pressed", TestCallback, NULL);
+
+    return test_action;
+}
+
--- /dev/null
+++ b/setup/execute.h
@@ -1,0 +1,36 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// Copyright(C) 2006 Simon Howard
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA.
+//
+
+#ifndef TESTCONFIG_H
+#define TESTCONFIG_H
+
+#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 */
+
--- 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"
--- 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 @@
     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 @@
     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 @@
                          (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),
--- 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"
--- a/setup/testconfig.c
+++ /dev/null
@@ -1,62 +1,0 @@
-// Emacs style mode select   -*- C++ -*- 
-//-----------------------------------------------------------------------------
-//
-// Copyright(C) 2006 Simon Howard
-//
-// This program 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.
-//
-// This program 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 this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-// 02111-1307, USA.
-//
-
-// Code for invoking Doom to test the current configuration.
-
-#include <stdlib.h>
-
-#include "textscreen.h"
-
-static void TestCallback(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(data))
-{
-    txt_window_t *testwindow;
-    txt_label_t *label;
-    
-    testwindow = TXT_NewWindow("Starting Doom");
-
-    label = TXT_NewLabel("Starting Doom to test the\n"
-                         "settings.  Please wait.");
-    TXT_SetWidgetAlign(label, TXT_HORIZ_CENTER);
-    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
-
-    TXT_CloseWindow(testwindow);
-}
-
-txt_window_action_t *TestConfigAction(void)
-{
-    txt_window_action_t *test_action;
-    
-    test_action = TXT_NewWindowAction('t', "Test");
-    TXT_SignalConnect(test_action, "pressed", TestCallback, NULL);
-
-    return test_action;
-}
-
--- a/setup/testconfig.h
+++ /dev/null
@@ -1,30 +1,0 @@
-// Emacs style mode select   -*- C++ -*- 
-//-----------------------------------------------------------------------------
-//
-// Copyright(C) 2006 Simon Howard
-//
-// This program 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.
-//
-// This program 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 this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-// 02111-1307, USA.
-//
-
-#ifndef TESTCONFIG_H
-#define TESTCONFIG_H
-
-#include "textscreen.h"
-
-txt_window_action_t *TestConfigAction(void);
-
-#endif /* #ifndef TESTCONFIG_H */
-