[gnome-builder] terminal: allow setting arguments for shells
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] terminal: allow setting arguments for shells
- Date: Tue, 6 Aug 2019 22:56:29 +0000 (UTC)
commit 31b7b27dddbef4ffe1cc7a724cfff9c697caa1f3
Author: Christian Hergert <chergert redhat com>
Date: Tue Aug 6 14:50:21 2019 -0700
terminal: allow setting arguments for shells
This can be useful when re-using the terminal launcher for commands such
as "sh -c foo".
src/libide/terminal/ide-terminal-launcher.c | 64 ++++++++++++++++++++++++++---
src/libide/terminal/ide-terminal-launcher.h | 5 +++
2 files changed, 64 insertions(+), 5 deletions(-)
---
diff --git a/src/libide/terminal/ide-terminal-launcher.c b/src/libide/terminal/ide-terminal-launcher.c
index 2034db699..3d2d0166b 100644
--- a/src/libide/terminal/ide-terminal-launcher.c
+++ b/src/libide/terminal/ide-terminal-launcher.c
@@ -45,6 +45,7 @@ struct _IdeTerminalLauncher
gchar *cwd;
gchar *shell;
gchar *title;
+ gchar **args;
IdeRuntime *runtime;
IdeContext *context;
IdeSubprocessLauncher *launcher;
@@ -55,6 +56,7 @@ G_DEFINE_TYPE (IdeTerminalLauncher, ide_terminal_launcher, G_TYPE_OBJECT)
enum {
PROP_0,
+ PROP_ARGS,
PROP_CWD,
PROP_SHELL,
PROP_TITLE,
@@ -387,9 +389,9 @@ spawn_runner_launcher (IdeTerminalLauncher *self,
g_autoptr(IdeSimpleBuildTarget) build_target = NULL;
g_autoptr(IdeSubprocess) subprocess = NULL;
g_autoptr(IdeRunner) runner = NULL;
+ g_autoptr(GPtrArray) argv = NULL;
g_autoptr(GError) error = NULL;
IdeEnvironment *env;
- const gchar *argv[] = { NULL, NULL, NULL };
const gchar *shell;
g_assert (IDE_IS_TERMINAL_LAUNCHER (self));
@@ -403,12 +405,24 @@ spawn_runner_launcher (IdeTerminalLauncher *self,
if (!ide_runtime_contains_program_in_path (runtime, shell, NULL))
shell = "/bin/sh";
- argv[0] = shell;
- if (shell_supports_login (shell))
- argv[1] = "--login";
+ argv = g_ptr_array_new ();
+ g_ptr_array_add (argv, (gchar *)shell);
+
+ if (self->args == NULL)
+ {
+ if (shell_supports_login (shell))
+ g_ptr_array_add (argv, (gchar *)"--login");
+ }
+ else
+ {
+ for (guint i = 0; self->args[i]; i++)
+ g_ptr_array_add (argv, self->args[i]);
+ }
+
+ g_ptr_array_add (argv, NULL);
build_target = ide_simple_build_target_new (NULL);
- ide_simple_build_target_set_argv (build_target, argv);
+ ide_simple_build_target_set_argv (build_target, (const gchar * const *)argv->pdata);
ide_simple_build_target_set_cwd (build_target, self->cwd ? self->cwd : g_get_home_dir ());
/* Creating runner should always succeed, but run_async() may fail */
@@ -512,6 +526,7 @@ ide_terminal_launcher_finalize (GObject *object)
{
IdeTerminalLauncher *self = (IdeTerminalLauncher *)object;
+ g_clear_pointer (&self->args, g_strfreev);
g_clear_pointer (&self->cwd, g_free);
g_clear_pointer (&self->shell, g_free);
g_clear_pointer (&self->title, g_free);
@@ -531,6 +546,10 @@ ide_terminal_launcher_get_property (GObject *object,
switch (prop_id)
{
+ case PROP_ARGS:
+ g_value_set_boxed (value, ide_terminal_launcher_get_args (self));
+ break;
+
case PROP_CWD:
g_value_set_string (value, ide_terminal_launcher_get_cwd (self));
break;
@@ -558,6 +577,10 @@ ide_terminal_launcher_set_property (GObject *object,
switch (prop_id)
{
+ case PROP_ARGS:
+ ide_terminal_launcher_set_args (self, g_value_get_boxed (value));
+ break;
+
case PROP_CWD:
ide_terminal_launcher_set_cwd (self, g_value_get_string (value));
break;
@@ -583,6 +606,13 @@ ide_terminal_launcher_class_init (IdeTerminalLauncherClass *klass)
object_class->finalize = ide_terminal_launcher_finalize;
object_class->get_property = ide_terminal_launcher_get_property;
object_class->set_property = ide_terminal_launcher_set_property;
+
+ properties [PROP_ARGS] =
+ g_param_spec_boxed ("args",
+ "Args",
+ "Arguments to shell",
+ G_TYPE_STRV,
+ (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
properties [PROP_CWD] =
g_param_spec_string ("cwd",
@@ -794,6 +824,8 @@ ide_terminal_launcher_new_for_runner (IdeRuntime *runtime)
self->runtime = g_object_ref (runtime);
self->kind = LAUNCHER_KIND_RUNNER;
+ g_print ("New for runner\n");
+
return g_steal_pointer (&self);
}
@@ -804,3 +836,25 @@ ide_terminal_launcher_can_respawn (IdeTerminalLauncher *self)
return self->kind != LAUNCHER_KIND_LAUNCHER;
}
+
+const gchar * const *
+ide_terminal_launcher_get_args (IdeTerminalLauncher *self)
+{
+ g_return_val_if_fail (IDE_IS_TERMINAL_LAUNCHER (self), NULL);
+
+ return (const gchar * const *)self->args;
+}
+
+void
+ide_terminal_launcher_set_args (IdeTerminalLauncher *self,
+ const gchar * const *args)
+{
+ g_return_if_fail (IDE_IS_TERMINAL_LAUNCHER (self));
+
+ if ((gchar **)args != self->args)
+ {
+ g_auto(GStrv) freeme = g_steal_pointer (&self->args);
+ self->args = g_strdupv ((gchar **)args);
+ g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ARGS]);
+ }
+}
diff --git a/src/libide/terminal/ide-terminal-launcher.h b/src/libide/terminal/ide-terminal-launcher.h
index fbf42b64c..33c2fda43 100644
--- a/src/libide/terminal/ide-terminal-launcher.h
+++ b/src/libide/terminal/ide-terminal-launcher.h
@@ -43,6 +43,11 @@ IdeTerminalLauncher *ide_terminal_launcher_new_for_runner (IdeRuntime
IDE_AVAILABLE_IN_3_34
gboolean ide_terminal_launcher_can_respawn (IdeTerminalLauncher *self);
IDE_AVAILABLE_IN_3_34
+const gchar * const *ide_terminal_launcher_get_args (IdeTerminalLauncher *self);
+IDE_AVAILABLE_IN_3_34
+void ide_terminal_launcher_set_args (IdeTerminalLauncher *self,
+ const gchar * const *args);
+IDE_AVAILABLE_IN_3_34
const gchar *ide_terminal_launcher_get_cwd (IdeTerminalLauncher *self);
IDE_AVAILABLE_IN_3_34
void ide_terminal_launcher_set_cwd (IdeTerminalLauncher *self,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]