X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fmain.c;h=7c952283a8128055a0b5da6fb3a5ca4887f6c921;hb=cef154921f6cdc07bc76edbe720036ab4c32bff8;hp=eca3f98f6866d9ddeb1a44133914c427f4bfad14;hpb=f61eb021e40f2fdf82bb93b6525189b46cbc977a;p=pspp
diff --git a/src/ui/gui/main.c b/src/ui/gui/main.c
index eca3f98f68..7c952283a8 100644
--- a/src/ui/gui/main.c
+++ b/src/ui/gui/main.c
@@ -1,5 +1,5 @@
/* PSPPIRE - a graphical user interface for PSPP.
- Copyright (C) 2004, 2005, 2006 Free Software Foundation
+ Copyright (C) 2004, 2005, 2006, 2010 Free Software Foundation
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
@@ -15,21 +15,58 @@
along with this program. If not, see . */
#include
-#include
-#include "psppire.h"
-#include "progname.h"
-#include
-#include
-#include
-#include
-#include
+#include "ui/gui/psppire.h"
-static gboolean parse_command_line (int *argc, char ***argv, gchar **filename,
- gboolean *show_splash, GError **err);
+#include
+#include
+#include "libpspp/argv-parser.h"
+#include "libpspp/assertion.h"
+#include "libpspp/getl.h"
+#include "libpspp/version.h"
+#include "libpspp/copyleft.h"
+#include "ui/source-init-opts.h"
+
+#include "gl/configmake.h"
+#include "gl/progname.h"
+#include "gl/relocatable.h"
+#include "gl/xalloc.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+
+/* Arguments to be interpreted before the X server gets initialised */
+
+enum
+ {
+ OPT_NO_SPLASH,
+ N_STARTUP_OPTIONS
+ };
+
+static const struct argv_option startup_options[N_STARTUP_OPTIONS] =
+ {
+ {"no-splash", 'q', no_argument, OPT_NO_SPLASH}
+ };
+
+static void
+startup_option_callback (int id, void *show_splash_)
+{
+ gboolean *show_splash = show_splash_;
+ switch (id)
+ {
+ case OPT_NO_SPLASH:
+ *show_splash = FALSE;
+ break;
+ default:
+ NOT_REACHED ();
+ }
+}
+
static GtkWidget *
create_splash_window (void)
{
@@ -72,13 +109,21 @@ quit_one_loop (gpointer data)
return FALSE;
}
+struct initialisation_parameters
+{
+ struct source_stream *ss;
+ const char *data_file;
+ GtkWidget *splash_window;
+};
+
static gboolean
run_inner_loop (gpointer data)
{
- initialize ();
+ struct initialisation_parameters *ip = data;
+ initialize (ip->ss, ip->data_file);
- g_timeout_add (500, hide_splash_window, data);
+ g_timeout_add (500, hide_splash_window, ip->splash_window);
gtk_main ();
@@ -88,18 +133,32 @@ run_inner_loop (gpointer data)
}
+static GMemVTable vtable =
+ {
+ xmalloc,
+ xrealloc,
+ free,
+ xcalloc,
+ malloc,
+ realloc
+ };
int
main (int argc, char *argv[])
{
- GtkWidget *splash_window;
- gchar *filename = 0;
+ struct initialisation_parameters init_p;
gboolean show_splash = TRUE;
- GError *err = 0;
+ struct argv_parser *parser;
+ struct source_stream *ss;
const gchar *vers;
set_program_name (argv[0]);
+ g_mem_set_vtable (&vtable);
+
+ gtk_disable_setlocale ();
+
+
if ( ! gtk_parse_args (&argc, &argv) )
{
perror ("Error parsing arguments");
@@ -110,78 +169,33 @@ main (int argc, char *argv[])
GTK_MINOR_VERSION,
GTK_MICRO_VERSION)) )
{
- g_critical (vers);
- }
-
- /* Deal with options like --version, --help etc */
- if ( ! parse_command_line (&argc, &argv, &filename, &show_splash, &err) )
- {
- g_clear_error (&err);
- return 0;
+ g_warning ("%s", vers);
}
+ /* Let GDK remove any options that it owns. */
gdk_init (&argc, &argv);
- splash_window = create_splash_window ();
+ /* Parse our own options. */
+ ss = create_source_stream ();
+ parser = argv_parser_create ();
+ argv_parser_add_options (parser, startup_options, N_STARTUP_OPTIONS,
+ startup_option_callback, &show_splash);
+ source_init_register_argv_parser (parser, ss);
+ if (!argv_parser_run (parser, argc, argv))
+ exit (EXIT_FAILURE);
+ argv_parser_destroy (parser);
+
+ init_p.splash_window = create_splash_window ();
+ init_p.ss = ss;
+ init_p.data_file = optind < argc ? argv[optind] : NULL;
+
if ( show_splash )
- gtk_widget_show (splash_window);
+ gtk_widget_show (init_p.splash_window);
g_idle_add (quit_one_loop, 0);
- gtk_quit_add (0, run_inner_loop, splash_window);
+ gtk_quit_add (0, run_inner_loop, &init_p);
gtk_main ();
-
return 0;
}
-
-
-/* Parses the command line specified by ARGC and ARGV as received by
- main (). Returns true if normal execution should proceed,
- false if the command-line indicates that PSPP should exit. */
-static gboolean
-parse_command_line (int *argc, char ***argv, gchar **filename,
- gboolean *show_splash, GError **err)
-{
-
- static struct option long_options[] =
- {
- {"help", no_argument, NULL, 'h'},
- {"version", no_argument, NULL, 'V'},
- {"no-splash", no_argument, NULL, 'q'},
- {0, 0, 0, 0},
- };
-
- int c;
-
- for (;;)
- {
- c = getopt_long (*argc, *argv, "hVq", long_options, NULL);
- if (c == -1)
- break;
-
- switch (c)
- {
- case 'h':
- g_print ("Usage: psppire {|--help|--version|--no-splash}\n");
- return FALSE;
- case 'V':
- g_print (version);
- g_print ("\n");
- g_print (legal);
- return FALSE;
- case 'q':
- *show_splash = FALSE;
- break;
- default:
- return FALSE;
- }
- }
-
- if ( optind < *argc)
- {
- *filename = (*argv)[optind];
- }
-
- return TRUE;
-}