static VALUE rg_watch_child(VALUE self, VALUE child_pid) { vte_terminal_watch_child(_SELF(self), NUM2INT(child_pid)); return self; }
static void gb_terminal_respawn (GbTerminalView *self, VteTerminal *terminal) { g_autoptr(GPtrArray) args = NULL; g_autofree gchar *workpath = NULL; GtkWidget *toplevel; GError *error = NULL; IdeContext *context; IdeVcs *vcs; GFile *workdir; GPid child_pid; gint64 now; g_assert (GB_IS_TERMINAL_VIEW (self)); vte_terminal_reset (terminal, TRUE, TRUE); toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self)); if (!IDE_IS_WORKBENCH (toplevel)) return; /* Prevent flapping */ now = g_get_monotonic_time (); if ((now - self->last_respawn) < (G_USEC_PER_SEC / 10)) return; self->last_respawn = now; context = ide_workbench_get_context (IDE_WORKBENCH (toplevel)); vcs = ide_context_get_vcs (context); workdir = ide_vcs_get_working_directory (vcs); workpath = g_file_get_path (workdir); args = g_ptr_array_new_with_free_func (g_free); g_ptr_array_add (args, vte_get_user_shell ()); g_ptr_array_add (args, NULL); vte_terminal_spawn_sync (terminal, VTE_PTY_DEFAULT | VTE_PTY_NO_LASTLOG | VTE_PTY_NO_UTMP | VTE_PTY_NO_WTMP, workpath, (gchar **)args->pdata, NULL, G_SPAWN_DEFAULT, NULL, NULL, &child_pid, NULL, &error); if (error != NULL) { g_warning ("%s", error->message); g_clear_error (&error); return; } vte_terminal_watch_child (terminal, child_pid); }
static void vte_spawn(VteTerminal* vte, char* working_directory, char* command, char** environment) { GError* error = NULL; char** command_argv = NULL; /* Parse command into array */ if (!command) command = vte_get_user_shell(); g_shell_parse_argv(command, NULL, &command_argv, &error); if (error) { g_printerr("Failed to parse command: %s\n", error->message); g_error_free(error); exit(EXIT_FAILURE); } /* Create pty object */ VtePty* pty = vte_terminal_pty_new_sync(vte, VTE_PTY_NO_HELPER, NULL, &error); if (error) { g_printerr("Failed to create pty: %s\n", error->message); g_error_free(error); exit(EXIT_FAILURE); } vte_terminal_set_pty(vte, pty); int child_pid; /* Spawn default shell (or specified command) */ g_spawn_async(working_directory, command_argv, environment, (G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH | G_SPAWN_LEAVE_DESCRIPTORS_OPEN), // flags from GSpawnFlags (GSpawnChildSetupFunc)vte_pty_child_setup, // an extra child setup function to run in the child just before exec() pty, // user data for child_setup &child_pid, // a location to store the child PID &error); // return location for a GError if (error) { g_printerr("%s\n", error->message); g_error_free(error); exit(EXIT_FAILURE); } vte_terminal_watch_child(vte, child_pid); g_strfreev(command_argv); }