static void gb_terminal_set_needs_attention (GbTerminalView *self, gboolean needs_attention, GtkPositionType position) { GtkWidget *parent; g_assert (GB_IS_TERMINAL_VIEW (self)); parent = gtk_widget_get_parent (GTK_WIDGET (self)); if (GTK_IS_STACK (parent) && !gtk_widget_in_destruction (GTK_WIDGET (self)) && !gtk_widget_in_destruction (parent)) { if (position == GTK_POS_TOP && !gtk_widget_in_destruction (GTK_WIDGET (self->terminal_top))) { self->top_has_needs_attention = TRUE; } else if (position == GTK_POS_BOTTOM && self->terminal_bottom != NULL && !gtk_widget_in_destruction (GTK_WIDGET (self->terminal_bottom))) { self->bottom_has_needs_attention = TRUE; } gtk_container_child_set (GTK_CONTAINER (parent), GTK_WIDGET (self), "needs-attention", !!(self->top_has_needs_attention || self->bottom_has_needs_attention) && needs_attention, NULL); } }
static void ide_frame_notify_visible_child (IdeFrame *self, GParamSpec *pspec, GtkStack *stack) { IdeFramePrivate *priv = ide_frame_get_instance_private (self); GtkWidget *visible_child; g_assert (IDE_IS_FRAME (self)); g_assert (GTK_IS_STACK (stack)); if (gtk_widget_in_destruction (GTK_WIDGET (self))) return; if ((visible_child = gtk_stack_get_visible_child (priv->stack))) { if (gtk_widget_in_destruction (visible_child)) visible_child = NULL; } /* * Mux/Proxy actions to our level so that they also be activated * from the header bar without any weirdness by the View. */ dzl_gtk_widget_mux_action_groups (GTK_WIDGET (self), visible_child, "IDE_FRAME_MUXED_ACTION"); /* Update our bindings targets */ dzl_binding_group_set_source (priv->bindings, visible_child); dzl_signal_group_set_target (priv->signals, visible_child); /* Show either the empty state, failed state, or actual page */ if (visible_child != NULL && ide_page_get_failed (IDE_PAGE (visible_child))) gtk_stack_set_visible_child (priv->top_stack, GTK_WIDGET (priv->failed_state)); else if (visible_child != NULL) gtk_stack_set_visible_child (priv->top_stack, GTK_WIDGET (priv->stack)); else gtk_stack_set_visible_child (priv->top_stack, GTK_WIDGET (priv->empty_placeholder)); /* Allow the header to update settings */ _ide_frame_header_update (priv->header, IDE_PAGE (visible_child)); /* Ensure action state is up to date */ _ide_frame_update_actions (self); if (priv->addins != NULL) peas_extension_set_foreach (priv->addins, ide_frame_notify_addin_of_page, visible_child); g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_VISIBLE_CHILD]); g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_HAS_VIEW]); }
static void ide_terminal_page_spawn_cb (GObject *object, GAsyncResult *result, gpointer user_data) { IdeTerminalLauncher *launcher = (IdeTerminalLauncher *)object; g_autoptr(IdeTerminalPage) self = user_data; g_autoptr(GError) error = NULL; gint64 now; g_assert (IDE_IS_TERMINAL_LAUNCHER (launcher)); g_assert (G_IS_ASYNC_RESULT (result)); g_assert (IDE_IS_TERMINAL_PAGE (self)); if (!ide_terminal_launcher_spawn_finish (launcher, result, &error)) { g_autofree gchar *format = NULL; format = g_strdup_printf ("%s: %s", _("Subprocess launcher failed"), error->message); ide_terminal_page_feed (self, format); } if (gtk_widget_in_destruction (GTK_WIDGET (self))) return; now = g_get_monotonic_time (); if (ABS (now - self->last_respawn) < FLAPPING_DURATION_USEC) { ide_terminal_page_feed (self, _("Subprocess launcher failed too quickly, will not respawn.")); return; } if (!self->respawn_on_exit) { if (self->close_on_exit) gdk_threads_add_idle_full (G_PRIORITY_LOW + 1000, (GSourceFunc) destroy_widget_in_idle, g_object_ref (self), g_object_unref); return; } g_clear_object (&self->pty); vte_terminal_reset (VTE_TERMINAL (self->terminal_top), TRUE, TRUE); self->pty = vte_pty_new_sync (VTE_PTY_DEFAULT, NULL, NULL); vte_terminal_set_pty (VTE_TERMINAL (self->terminal_top), self->pty); /* Spawn our terminal and wait for it to exit */ self->last_respawn = now; ide_terminal_launcher_spawn_async (self->launcher, self->pty, NULL, ide_terminal_page_spawn_cb, g_object_ref (self)); }
static void gbp_terminal_page_set_needs_attention (IdeTerminalPage *self, gboolean needs_attention) { GtkWidget *parent; g_assert (IDE_IS_TERMINAL_PAGE (self)); parent = gtk_widget_get_parent (GTK_WIDGET (self)); if (GTK_IS_STACK (parent) && !gtk_widget_in_destruction (GTK_WIDGET (self)) && !gtk_widget_in_destruction (parent)) { if (!gtk_widget_in_destruction (GTK_WIDGET (self->terminal_top))) self->needs_attention = !!needs_attention; gtk_container_child_set (GTK_CONTAINER (parent), GTK_WIDGET (self), "needs-attention", needs_attention, NULL); } }
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 page_changed_cb (GtkWidget *stack, GParamSpec *pspec, gpointer data) { const gchar *name; GtkWidget *page; if (gtk_widget_in_destruction (stack)) return; name = gtk_stack_get_visible_child_name (GTK_STACK (stack)); if (g_str_equal (name, "page3")) { page = gtk_stack_get_visible_child (GTK_STACK (stack)); set_needs_attention (GTK_WIDGET (page), FALSE); } }
static void visible_child_changed (GObject *stack, GParamSpec *pspec) { ExampleAppWindow *win; ExampleAppWindowPrivate *priv; if (gtk_widget_in_destruction (GTK_WIDGET (stack))) return; win = EXAMPLE_APP_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (stack))); priv = example_app_window_get_instance_private (win); gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (priv->searchbar), FALSE); update_words (win); update_lines (win); }
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; }