diff options
author | Leo Tenenbaum <pommicket@gmail.com> | 2018-08-20 21:12:06 -0400 |
---|---|---|
committer | Leo Tenenbaum <pommicket@gmail.com> | 2018-08-20 21:12:06 -0400 |
commit | 63e87c2d0c9d263f14c77b68f85c67d46ece82a9 (patch) | |
tree | 6260365cbf7d24f37d27669e8538227fcb72e243 /gtk+-mingw/share/gtk-3.0/demo/textscroll.c | |
parent | a4460f6d9453bbd7e584937686449cef3e19f052 (diff) |
Diffstat (limited to 'gtk+-mingw/share/gtk-3.0/demo/textscroll.c')
-rw-r--r-- | gtk+-mingw/share/gtk-3.0/demo/textscroll.c | 201 |
1 files changed, 0 insertions, 201 deletions
diff --git a/gtk+-mingw/share/gtk-3.0/demo/textscroll.c b/gtk+-mingw/share/gtk-3.0/demo/textscroll.c deleted file mode 100644 index dae9b43..0000000 --- a/gtk+-mingw/share/gtk-3.0/demo/textscroll.c +++ /dev/null @@ -1,201 +0,0 @@ -/* Text Widget/Automatic scrolling - * - * This example demonstrates how to use the gravity of - * GtkTextMarks to keep a text view scrolled to the bottom - * while appending text. - */ - -#include <gtk/gtk.h> -#include "demo-common.h" - -/* Scroll to the end of the buffer. - */ -static gboolean -scroll_to_end (GtkTextView *textview) -{ - GtkTextBuffer *buffer; - GtkTextIter iter; - GtkTextMark *mark; - char *spaces; - static int count; - - buffer = gtk_text_view_get_buffer (textview); - - /* Get "end" mark. It's located at the end of buffer because - * of right gravity - */ - mark = gtk_text_buffer_get_mark (buffer, "end"); - gtk_text_buffer_get_iter_at_mark (buffer, &iter, mark); - - /* and insert some text at its position, the iter will be - * revalidated after insertion to point to the end of inserted text - */ - spaces = g_strnfill (count++, ' '); - gtk_text_buffer_insert (buffer, &iter, "\n", -1); - gtk_text_buffer_insert (buffer, &iter, spaces, -1); - gtk_text_buffer_insert (buffer, &iter, - "Scroll to end scroll to end scroll " - "to end scroll to end ", - -1); - g_free (spaces); - - /* Now scroll the end mark onscreen. - */ - gtk_text_view_scroll_mark_onscreen (textview, mark); - - /* Emulate typewriter behavior, shift to the left if we - * are far enough to the right. - */ - if (count > 150) - count = 0; - - return G_SOURCE_CONTINUE; -} - -/* Scroll to the bottom of the buffer. - */ -static gboolean -scroll_to_bottom (GtkTextView *textview) -{ - GtkTextBuffer *buffer; - GtkTextIter iter; - GtkTextMark *mark; - char *spaces; - static int count; - - buffer = gtk_text_view_get_buffer (textview); - - /* Get end iterator */ - gtk_text_buffer_get_end_iter (buffer, &iter); - - /* and insert some text at it, the iter will be revalidated - * after insertion to point to the end of inserted text - */ - spaces = g_strnfill (count++, ' '); - gtk_text_buffer_insert (buffer, &iter, "\n", -1); - gtk_text_buffer_insert (buffer, &iter, spaces, -1); - gtk_text_buffer_insert (buffer, &iter, - "Scroll to bottom scroll to bottom scroll " - "to bottom scroll to bottom", - -1); - g_free (spaces); - - /* Move the iterator to the beginning of line, so we don't scroll - * in horizontal direction - */ - gtk_text_iter_set_line_offset (&iter, 0); - - /* and place the mark at iter. the mark will stay there after we - * insert some text at the end because it has right gravity. - */ - mark = gtk_text_buffer_get_mark (buffer, "scroll"); - gtk_text_buffer_move_mark (buffer, mark, &iter); - - /* Scroll the mark onscreen. - */ - gtk_text_view_scroll_mark_onscreen (textview, mark); - - /* Shift text back if we got enough to the right. - */ - if (count > 40) - count = 0; - - return G_SOURCE_CONTINUE; -} - -static guint -setup_scroll (GtkTextView *textview, - gboolean to_end) -{ - GtkTextBuffer *buffer; - GtkTextIter iter; - - buffer = gtk_text_view_get_buffer (textview); - gtk_text_buffer_get_end_iter (buffer, &iter); - - if (to_end) - { - /* If we want to scroll to the end, including horizontal scrolling, - * then we just create a mark with right gravity at the end of the - * buffer. It will stay at the end unless explicitely moved with - * gtk_text_buffer_move_mark. - */ - gtk_text_buffer_create_mark (buffer, "end", &iter, FALSE); - - /* Add scrolling timeout. */ - return g_timeout_add (50, (GSourceFunc) scroll_to_end, textview); - } - else - { - /* If we want to scroll to the bottom, but not scroll horizontally, - * then an end mark won't do the job. Just create a mark so we can - * use it with gtk_text_view_scroll_mark_onscreen, we'll position it - * explicitely when needed. Use left gravity so the mark stays where - * we put it after inserting new text. - */ - gtk_text_buffer_create_mark (buffer, "scroll", &iter, TRUE); - - /* Add scrolling timeout. */ - return g_timeout_add (100, (GSourceFunc) scroll_to_bottom, textview); - } -} - -static void -remove_timeout (GtkWidget *window, - gpointer timeout) -{ - g_source_remove (GPOINTER_TO_UINT (timeout)); -} - -static void -create_text_view (GtkWidget *hbox, - gboolean to_end) -{ - GtkWidget *swindow; - GtkWidget *textview; - guint timeout; - - swindow = gtk_scrolled_window_new (NULL, NULL); - gtk_box_pack_start (GTK_BOX (hbox), swindow, TRUE, TRUE, 0); - textview = gtk_text_view_new (); - gtk_container_add (GTK_CONTAINER (swindow), textview); - - timeout = setup_scroll (GTK_TEXT_VIEW (textview), to_end); - - /* Remove the timeout in destroy handler, so we don't try to - * scroll destroyed widget. - */ - g_signal_connect (textview, "destroy", - G_CALLBACK (remove_timeout), - GUINT_TO_POINTER (timeout)); -} - -GtkWidget * -do_textscroll (GtkWidget *do_widget) -{ - static GtkWidget *window = NULL; - - if (!window) - { - GtkWidget *hbox; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - g_signal_connect (window, "destroy", - G_CALLBACK (gtk_widget_destroyed), &window); - gtk_window_set_default_size (GTK_WINDOW (window), 600, 400); - - hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); - gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE); - gtk_container_add (GTK_CONTAINER (window), hbox); - - create_text_view (hbox, TRUE); - create_text_view (hbox, FALSE); - } - - if (!gtk_widget_get_visible (window)) - gtk_widget_show_all (window); - else - gtk_widget_destroy (window); - - return window; -} |