[gnome-builder] terminal: add new subprocess launcher helper
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] terminal: add new subprocess launcher helper
- Date: Mon, 5 Aug 2019 19:34:14 +0000 (UTC)
commit d5d9803b9d49d3a8a97ec9cc7f09adf26884fbc9
Author: Christian Hergert <chergert redhat com>
Date: Mon Aug 5 12:32:56 2019 -0700
terminal: add new subprocess launcher helper
src/libide/terminal/ide-terminal-launcher.c | 93 ++++++++++++++++++++++++++---
src/libide/terminal/ide-terminal-launcher.h | 47 ++++++++-------
2 files changed, 112 insertions(+), 28 deletions(-)
---
diff --git a/src/libide/terminal/ide-terminal-launcher.c b/src/libide/terminal/ide-terminal-launcher.c
index b6dc382ea..2034db699 100644
--- a/src/libide/terminal/ide-terminal-launcher.c
+++ b/src/libide/terminal/ide-terminal-launcher.c
@@ -36,17 +36,19 @@ typedef enum
LAUNCHER_KIND_DEBUG,
LAUNCHER_KIND_RUNTIME,
LAUNCHER_KIND_RUNNER,
+ LAUNCHER_KIND_LAUNCHER,
} LauncherKind;
struct _IdeTerminalLauncher
{
- GObject parent_instance;
- gchar *cwd;
- gchar *shell;
- gchar *title;
- IdeRuntime *runtime;
- IdeContext *context;
- LauncherKind kind;
+ GObject parent_instance;
+ gchar *cwd;
+ gchar *shell;
+ gchar *title;
+ IdeRuntime *runtime;
+ IdeContext *context;
+ IdeSubprocessLauncher *launcher;
+ LauncherKind kind;
};
G_DEFINE_TYPE (IdeTerminalLauncher, ide_terminal_launcher, G_TYPE_OBJECT)
@@ -251,6 +253,44 @@ spawn_host_launcher (IdeTerminalLauncher *self,
g_object_ref (task));
}
+static void
+spawn_launcher (IdeTerminalLauncher *self,
+ IdeTask *task,
+ IdeSubprocessLauncher *launcher,
+ gint pty_fd)
+{
+ g_autoptr(IdeSubprocess) subprocess = NULL;
+ g_autoptr(GError) error = NULL;
+
+ g_assert (IDE_IS_TERMINAL_LAUNCHER (self));
+ g_assert (IDE_IS_TASK (task));
+ g_assert (!launcher || IDE_IS_SUBPROCESS_LAUNCHER (launcher));
+ g_assert (pty_fd >= 0);
+
+ if (launcher == NULL)
+ {
+ ide_task_return_new_error (task,
+ G_IO_ERROR,
+ G_IO_ERROR_FAILED,
+ "process may only be spawned once");
+ return;
+ }
+
+ ide_subprocess_launcher_set_flags (launcher, 0);
+
+ ide_subprocess_launcher_take_stdin_fd (launcher, dup (pty_fd));
+ ide_subprocess_launcher_take_stdout_fd (launcher, dup (pty_fd));
+ ide_subprocess_launcher_take_stderr_fd (launcher, dup (pty_fd));
+
+ if (!(subprocess = ide_subprocess_launcher_spawn (launcher, NULL, &error)))
+ ide_task_return_error (task, g_steal_pointer (&error));
+ else
+ ide_subprocess_wait_check_async (subprocess,
+ ide_task_get_cancellable (task),
+ ide_terminal_launcher_wait_check_cb,
+ g_object_ref (task));
+}
+
static void
spawn_runtime_launcher (IdeTerminalLauncher *self,
IdeTask *task,
@@ -429,6 +469,11 @@ ide_terminal_launcher_spawn_async (IdeTerminalLauncher *self,
spawn_runner_launcher (self, task, self->runtime, pty_fd);
break;
+ case LAUNCHER_KIND_LAUNCHER:
+ spawn_launcher (self, task, self->launcher, pty_fd);
+ g_clear_object (&self->launcher);
+ break;
+
case LAUNCHER_KIND_DEBUG:
case LAUNCHER_KIND_HOST:
default:
@@ -470,6 +515,7 @@ ide_terminal_launcher_finalize (GObject *object)
g_clear_pointer (&self->cwd, g_free);
g_clear_pointer (&self->shell, g_free);
g_clear_pointer (&self->title, g_free);
+ g_clear_object (&self->launcher);
g_clear_object (&self->runtime);
G_OBJECT_CLASS (ide_terminal_launcher_parent_class)->finalize (object);
@@ -661,6 +707,31 @@ ide_terminal_launcher_new (IdeContext *context)
return g_steal_pointer (&self);
}
+/**
+ * ide_terminal_launcher_new_for_launcher:
+ * @launcher: an #IdeSubprocessLauncher
+ *
+ * Creates a new #IdeTerminalLauncher that can be used to launch a process
+ * using the provided #IdeSubprocessLauncher.
+ *
+ * Returns: (transfer full): an #IdeTerminalLauncher
+ *
+ * Since: 3.34
+ */
+IdeTerminalLauncher *
+ide_terminal_launcher_new_for_launcher (IdeSubprocessLauncher *launcher)
+{
+ IdeTerminalLauncher *self;
+
+ g_return_val_if_fail (IDE_IS_SUBPROCESS_LAUNCHER (launcher), NULL);
+
+ self = g_object_new (IDE_TYPE_TERMINAL_LAUNCHER, NULL);
+ self->kind = LAUNCHER_KIND_LAUNCHER;
+ self->launcher = g_object_ref (launcher);
+
+ return g_steal_pointer (&self);
+}
+
/**
* ide_terminal_launcher_new_for_debug
*
@@ -725,3 +796,11 @@ ide_terminal_launcher_new_for_runner (IdeRuntime *runtime)
return g_steal_pointer (&self);
}
+
+gboolean
+ide_terminal_launcher_can_respawn (IdeTerminalLauncher *self)
+{
+ g_return_val_if_fail (IDE_IS_TERMINAL_LAUNCHER (self), FALSE);
+
+ return self->kind != LAUNCHER_KIND_LAUNCHER;
+}
diff --git a/src/libide/terminal/ide-terminal-launcher.h b/src/libide/terminal/ide-terminal-launcher.h
index 8abd50245..fbf42b64c 100644
--- a/src/libide/terminal/ide-terminal-launcher.h
+++ b/src/libide/terminal/ide-terminal-launcher.h
@@ -21,6 +21,7 @@
#pragma once
#include <libide-gui.h>
+#include <libide-threading.h>
G_BEGIN_DECLS
@@ -30,37 +31,41 @@ IDE_AVAILABLE_IN_3_34
G_DECLARE_FINAL_TYPE (IdeTerminalLauncher, ide_terminal_launcher, IDE, TERMINAL_LAUNCHER, GObject)
IDE_AVAILABLE_IN_3_34
-IdeTerminalLauncher *ide_terminal_launcher_new (IdeContext *context);
+IdeTerminalLauncher *ide_terminal_launcher_new (IdeContext *context);
IDE_AVAILABLE_IN_3_34
-IdeTerminalLauncher *ide_terminal_launcher_new_for_debug (void);
+IdeTerminalLauncher *ide_terminal_launcher_new_for_launcher (IdeSubprocessLauncher *launcher);
IDE_AVAILABLE_IN_3_34
-IdeTerminalLauncher *ide_terminal_launcher_new_for_runtime (IdeRuntime *runtime);
+IdeTerminalLauncher *ide_terminal_launcher_new_for_debug (void);
IDE_AVAILABLE_IN_3_34
-IdeTerminalLauncher *ide_terminal_launcher_new_for_runner (IdeRuntime *runtime);
+IdeTerminalLauncher *ide_terminal_launcher_new_for_runtime (IdeRuntime *runtime);
IDE_AVAILABLE_IN_3_34
-const gchar *ide_terminal_launcher_get_cwd (IdeTerminalLauncher *self);
+IdeTerminalLauncher *ide_terminal_launcher_new_for_runner (IdeRuntime *runtime);
IDE_AVAILABLE_IN_3_34
-void ide_terminal_launcher_set_cwd (IdeTerminalLauncher *self,
- const gchar *cwd);
+gboolean ide_terminal_launcher_can_respawn (IdeTerminalLauncher *self);
IDE_AVAILABLE_IN_3_34
-const gchar *ide_terminal_launcher_get_shell (IdeTerminalLauncher *self);
+const gchar *ide_terminal_launcher_get_cwd (IdeTerminalLauncher *self);
IDE_AVAILABLE_IN_3_34
-void ide_terminal_launcher_set_shell (IdeTerminalLauncher *self,
- const gchar *shell);
+void ide_terminal_launcher_set_cwd (IdeTerminalLauncher *self,
+ const gchar *cwd);
IDE_AVAILABLE_IN_3_34
-const gchar *ide_terminal_launcher_get_title (IdeTerminalLauncher *self);
+const gchar *ide_terminal_launcher_get_shell (IdeTerminalLauncher *self);
IDE_AVAILABLE_IN_3_34
-void ide_terminal_launcher_set_title (IdeTerminalLauncher *self,
- const gchar *title);
+void ide_terminal_launcher_set_shell (IdeTerminalLauncher *self,
+ const gchar *shell);
IDE_AVAILABLE_IN_3_34
-void ide_terminal_launcher_spawn_async (IdeTerminalLauncher *self,
- VtePty *pty,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
+const gchar *ide_terminal_launcher_get_title (IdeTerminalLauncher *self);
IDE_AVAILABLE_IN_3_34
-gboolean ide_terminal_launcher_spawn_finish (IdeTerminalLauncher *self,
- GAsyncResult *result,
- GError **error);
+void ide_terminal_launcher_set_title (IdeTerminalLauncher *self,
+ const gchar *title);
+IDE_AVAILABLE_IN_3_34
+void ide_terminal_launcher_spawn_async (IdeTerminalLauncher *self,
+ VtePty *pty,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+IDE_AVAILABLE_IN_3_34
+gboolean ide_terminal_launcher_spawn_finish (IdeTerminalLauncher *self,
+ GAsyncResult *result,
+ GError **error);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]