2010-05-01 153 views
4

它們都位於:如何運行gtk demo?

share\gtk-2.0\demo 

但他們都不包含main功能,我怎麼能做出以下textscroll.c實際工作:

/* 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 TRUE; 
} 

/* 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 TRUE; 
} 

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_hbox_new (TRUE, 6); 
     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; 
} 

回答

6

您也可以瀏覽源代碼在線:http://git.gnome.org/browse/gtk+/tree/demos/gtk-demo

main()函數位於main.c的最末尾。

編輯:

下面是一個簡單的main()的功能,可以添加到文件的末尾。您還必須從頭開始刪除#include "demo-common.h"行。

int 
main(int argc, char **argv) 
{ 
    GtkWidget *window; 

    gtk_init(&argc, &argv); 
    window = do_textscroll(NULL); 
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); 
    gtk_main(); 
    return 0; 
} 
+0

這太複雜了,你可以ellaborate我怎麼能寫一個使用'textscroll.c'一個'main'功能? – Gtker 2010-05-01 09:23:47

+1

你看了5分鐘,說「太複雜了」?嘖。你如何期望在態度上善於編程?不過,今天我心情很好,所以看看我的編輯。 – ptomato 2010-05-01 10:01:17

+0

謝謝@ ptomato,對不起,我真的是新的gtk,即使'c',再次感謝!它的工作原理是 – Gtker 2010-05-01 10:04:40

2

您應該運行命令行

gtk-demo 

。包含所有演示的窗口將顯示出來。您可以瀏覽源代碼,並通過雙擊運行演示。

+0

。 我必須已經安裝了jhbuild,它的工作原理。謝謝。 – 2017-11-09 09:10:59

0

更新2015年: 運行%gtkdir%/bin/gtk3-demo.exe