static void gb_terminal_set_split_view (IdeLayoutView *view, gboolean split_view) { GbTerminalView *self = (GbTerminalView *)view; GtkStyleContext *style_context; g_assert (GB_IS_TERMINAL_VIEW (self)); g_return_if_fail (GB_IS_TERMINAL_VIEW (self)); if (split_view && (self->terminal_bottom != NULL)) return; if (!split_view && (self->terminal_bottom == NULL)) return; if (split_view) { style_context = gtk_widget_get_style_context (GTK_WIDGET (view)); self->terminal_bottom = g_object_new (GB_TYPE_TERMINAL, "audible-bell", FALSE, "scrollback-lines", G_MAXUINT, "expand", TRUE, "visible", TRUE, NULL); gtk_container_add_with_properties (GTK_CONTAINER (self->bottom_container), GTK_WIDGET (self->terminal_bottom), "position", 0, NULL); gtk_widget_show (self->bottom_container); gb_terminal_view_connect_terminal (self, self->terminal_bottom); style_context_changed (style_context, GB_TERMINAL_VIEW (view)); gtk_widget_grab_focus (GTK_WIDGET (self->terminal_bottom)); if (!self->bottom_has_spawned) { self->bottom_has_spawned = TRUE; gb_terminal_respawn (self, self->terminal_bottom); } } else { gtk_container_remove (GTK_CONTAINER (self->bottom_container), GTK_WIDGET (self->terminal_bottom)); gtk_widget_hide (self->bottom_container); self->terminal_bottom = NULL; self->bottom_has_focus = FALSE; self->bottom_has_spawned = FALSE; self->bottom_has_needs_attention = FALSE; g_clear_object (&self->save_as_file_bottom); gtk_widget_grab_focus (GTK_WIDGET (self->terminal_top)); } }
static void child_exited_cb (VteTerminal *terminal, gint exit_status, GbTerminalView *self) { g_assert (VTE_IS_TERMINAL (terminal)); g_assert (GB_IS_TERMINAL_VIEW (self)); if (!ide_widget_action (GTK_WIDGET (self), "view-stack", "close", NULL)) { if (!gtk_widget_in_destruction (GTK_WIDGET (terminal))) gb_terminal_respawn (self, terminal); } }
static void gb_terminal_realize (GtkWidget *widget) { GbTerminalView *self = (GbTerminalView *)widget; g_assert (GB_IS_TERMINAL_VIEW (self)); GTK_WIDGET_CLASS (gb_terminal_view_parent_class)->realize (widget); if (!self->top_has_spawned) { self->top_has_spawned = TRUE; gb_terminal_respawn (self, self->terminal_top); } }
static void gb_terminal_view_wait_cb (GObject *object, GAsyncResult *result, gpointer user_data) { IdeSubprocess *subprocess = (IdeSubprocess *)object; VteTerminal *terminal = user_data; GbTerminalView *self; g_autoptr(GError) error = NULL; IDE_ENTRY; g_assert (IDE_IS_SUBPROCESS (subprocess)); g_assert (G_IS_ASYNC_RESULT (result)); g_assert (VTE_IS_TERMINAL (terminal)); if (!ide_subprocess_wait_finish (subprocess, result, &error)) { g_warning ("%s", error->message); IDE_GOTO (failure); } self = (GbTerminalView *)gtk_widget_get_ancestor (GTK_WIDGET (terminal), GB_TYPE_TERMINAL_VIEW); if (self == NULL) IDE_GOTO (failure); if (!ide_widget_action (GTK_WIDGET (self), "view-stack", "close", NULL)) { if (!gtk_widget_in_destruction (GTK_WIDGET (terminal))) gb_terminal_respawn (self, terminal); } failure: g_clear_object (&terminal); IDE_EXIT; }