static void recursive_attach_view (int depth, GtkTextView *view, GtkTextChildAnchor *anchor) { GtkWidget *child_view; GtkWidget *event_box; GdkRGBA color; if (depth > 4) return; child_view = gtk_text_view_new_with_buffer (gtk_text_view_get_buffer (view)); /* Event box is to add a black border around each child view */ event_box = gtk_event_box_new (); gdk_rgba_parse (&color, "black"); gtk_widget_override_background_color (event_box, 0, &color); gtk_widget_set_halign (child_view, GTK_ALIGN_FILL); gtk_widget_set_valign (child_view, GTK_ALIGN_FILL); gtk_container_add (GTK_CONTAINER (event_box), child_view); gtk_text_view_add_child_at_anchor (view, event_box, anchor); recursive_attach_view (depth + 1, GTK_TEXT_VIEW (child_view), anchor); }
static void recursive_attach_view (int depth, GtkTextView *view, GtkTextChildAnchor *anchor) { GtkWidget *child_view; GtkWidget *event_box; GdkColor color; GtkWidget *align; if (depth > 4) return; child_view = gtk_text_view_new_with_buffer (gtk_text_view_get_buffer (view)); /* Event box is to add a black border around each child view */ event_box = gtk_event_box_new (); gdk_color_parse ("black", &color); gtk_widget_modify_bg (event_box, GTK_STATE_NORMAL, &color); align = gtk_alignment_new (0.5, 0.5, 1.0, 1.0); gtk_container_set_border_width (GTK_CONTAINER (align), 1); gtk_container_add (GTK_CONTAINER (event_box), align); gtk_container_add (GTK_CONTAINER (align), child_view); gtk_text_view_add_child_at_anchor (view, event_box, anchor); recursive_attach_view (depth + 1, GTK_TEXT_VIEW (child_view), anchor); }
static void easter_egg_callback (GtkWidget *button, gpointer data) { static GtkWidget *window = NULL; gpointer window_ptr; GtkTextBuffer *buffer; GtkWidget *view; GtkTextIter iter; GtkTextChildAnchor *anchor; GtkWidget *sw; if (window) { gtk_window_present (GTK_WINDOW (window)); return; } buffer = gtk_text_buffer_new (NULL); gtk_text_buffer_get_start_iter (buffer, &iter); gtk_text_buffer_insert (buffer, &iter, "This buffer is shared by a set of nested text views.\n Nested view:\n", -1); anchor = gtk_text_buffer_create_child_anchor (buffer, &iter); gtk_text_buffer_insert (buffer, &iter, "\nDon't do this in real applications, please.\n", -1); view = gtk_text_view_new_with_buffer (buffer); recursive_attach_view (0, GTK_TEXT_VIEW (view), anchor); g_object_unref (buffer); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (window), sw); gtk_container_add (GTK_CONTAINER (sw), view); window_ptr = &window; g_object_add_weak_pointer (G_OBJECT (window), window_ptr); gtk_window_set_default_size (GTK_WINDOW (window), 300, 400); gtk_widget_show_all (window); }
static void recursive_attach_view (int depth, GtkTextView *view, GtkTextChildAnchor *anchor) { GtkWidget *child_view, *frame; if (depth > 4) return; child_view = gtk_text_view_new_with_buffer (gtk_text_view_get_buffer (view)); /* Frame is to add a black border around each child view */ frame = gtk_frame_new (NULL); gtk_container_add (GTK_CONTAINER (frame), child_view); gtk_text_view_add_child_at_anchor (view, frame, anchor); recursive_attach_view (depth + 1, GTK_TEXT_VIEW (child_view), anchor); }