[Terminal] Add tilda_terminal_start_shell()
authorIra W. Snyder <devel@irasnyder.com>
Mon, 14 Jan 2008 04:53:57 +0000 (20:53 -0800)
committerIra W. Snyder <devel@irasnyder.com>
Mon, 14 Jan 2008 04:53:57 +0000 (20:53 -0800)
This adds real capability of starting shells properly to TildaTerminal.
It will now start the proper shell on startup, as well as launching whatever
the user requested by setting the shell member.

tilda-terminal.c

index 92e73b6..2619495 100644 (file)
@@ -2,6 +2,11 @@
 #include "tilda-terminal.h"
 #include "tilda-terminal-dbus-glue.h"
 
+// FIXME: temporary helpers for gettext
+// TODO:  remove these
+#define _(X) X
+#define N_(X) X
+
 static void
 tilda_terminal_dbus_register_object (TildaTerminal *tt)
 {
@@ -14,13 +19,84 @@ tilda_terminal_dbus_register_object (TildaTerminal *tt)
        g_free (object_path);
 }
 
-static GObjectClass *parent_class = NULL;
+/**
+ * Start the current tt->shell in the given TildaTerminal
+ * NOTE: this will kill whatever is running in the terminal,
+ * NOTE: and run the current tt->shell instead :)
+ * Return: TRUE if ok, FALSE otherwise
+ */
+static gboolean
+tilda_terminal_start_shell (TildaTerminal *tt)
+{
+       gint ret;
+       gint argc;
+       gchar **argv;
+       GError *error = NULL;
 
-/* API */
+       /* Launch a custom command if tt->shell is set (not NULL) */
+       if (tt->shell)
+       {
+               /* Try to parse the user's custom command */
+               ret = g_shell_parse_argv (tt->shell, &argc, &argv, &error);
+
+               if (ret == FALSE)
+               {
+                       g_printerr (_("Problem parsing custom command: %s\n"), error->message);
+                       g_printerr (_("Launching default shell instead\n"));
+
+                       g_error_free (error);
+                       goto launch_default_shell;
+               }
+
+               /* Try to start the user's custom command */
+               ret = vte_terminal_fork_command (VTE_TERMINAL(tt->vte_term),
+                                                                                argv[0], /* Command */
+                                                                                argv,    /* Arg Vector */
+                                                                                NULL,    /* Env Vector */
+                                                                                tt->working_directory, /* Start directory */
+                                                                                TRUE,    /* Add to lastlog */
+                                                                                TRUE,    /* Add to utmp */
+                                                                                TRUE);   /* Add to wtmp */
+
+               g_strfreev (argv);
+
+               /* Check for error */
+               if (ret == -1)
+               {
+                       g_printerr (_("Unable to launch custom command: %s\n"), tt->shell);
+                       g_printerr (_("Launching default shell instead\n"));
+
+                       goto launch_default_shell;
+               }
+
+               return TRUE; /* SUCCESS: the early way out */
+       }
+
+launch_default_shell:
 
-/*
+    ret = vte_terminal_fork_command (VTE_TERMINAL(tt->vte_term),
+                                                                        NULL, /* Command -- VTE will figure it out */
+                                                                        NULL, /* Arg Vector */
+                                                                        NULL, /* Env Vector */
+                                                                        tt->working_directory, /* Start Directory */
+                                                                        TRUE, /* Add to lastlog */
+                                                                        TRUE, /* Add to utmp */
+                                                                        TRUE);/* Add to wtmp */
+
+       if (ret == -1)
+       {
+               g_printerr (_("Unable to launch default shell\n"));
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+/*******************************************************************************
  * All GObject stuff is below. You probably don't need to change this...
- */
+ ******************************************************************************/
+
+static GObjectClass *parent_class = NULL;
 
 enum tilda_terminal_properties {
        TILDA_TERMINAL_NUMBER = 1,
@@ -105,6 +181,7 @@ tilda_terminal_set_property (GObject      *object,
                case TILDA_TERMINAL_SHELL:
                        g_free (self->shell);
                        self->shell = g_value_dup_string (value);
+                       tilda_terminal_start_shell (self);
                        g_print ("terminal shell: %s\n", self->shell);
                        break;
 
@@ -364,8 +441,7 @@ tilda_terminal_constructor (GType                  type,
        g_signal_connect (G_OBJECT(self->vte_term), "child-exited",
                                          G_CALLBACK(gtk_main_quit), self);
 
-       vte_terminal_fork_command (VTE_TERMINAL(self->vte_term), NULL, NULL, NULL, NULL, FALSE, FALSE, FALSE);
-
+       tilda_terminal_start_shell (self);
        tilda_terminal_dbus_register_object (self);
 
        return obj;