2012-07-03 26 views
0

GTK +版本2.24.8GTK + VTE回溯不工作

VTE版本0.28.2

我剛開始創建一個終端應用程序,但是,沒有我在網上找到的例子(5)有工作回溯。在vte中有沒有回滾問題,還是我沒有看到?這裏是一個例子:

#include <gtk/gtk.h> 
#include <vte/vte.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <gdk/gdkkeysyms.h> // includes GDK_q 


/* gcc -Wall -g term.c -o term `pkg-config --cflags --libs gtk+-2.0 vte` */ 

long size; 
char *buf; 
char *ptr; 

gboolean key_press_win_main (GtkWidget *widget, GdkEventKey *event, gpointer user_data); 
void quit_activated(); 
static gboolean delete_event(GtkWidget *,GdkEvent *); 

int main(int argc, char *argv[]) 
{ 

    size = pathconf(".", _PC_PATH_MAX); 
    if ((buf = (char *)malloc((size_t)size)) != NULL) ptr = getcwd(buf, (size_t)size); 

    GtkWidget *window_main; 
    GtkWidget *vbox; 
    GtkWidget *vte; 
    GtkWidget *notebook; 
    GtkWidget *scrolled_window; 
    GtkWidget *label; 

    gtk_init (&argc, &argv); 

    window_main = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title (GTK_WINDOW (window_main), "Caraterm v0.0.1"); 

    vbox = gtk_vbox_new(FALSE,0); 
    gtk_container_add (GTK_CONTAINER (window_main), vbox); 


    notebook = gtk_notebook_new(); 
    gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_BOTTOM); 
    gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0); 

    scrolled_window = gtk_scrolled_window_new (NULL, NULL); 
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); 
    label = gtk_label_new ("term1"); 
    gtk_notebook_append_page (GTK_NOTEBOOK (notebook), scrolled_window, label); 

    vte = vte_terminal_new(); 
    vte_terminal_set_background_transparent(VTE_TERMINAL(vte), FALSE); 
    vte_terminal_set_size(VTE_TERMINAL(vte), 80, 45); 
    vte_terminal_set_scrollback_lines(VTE_TERMINAL (vte), -1); /* infinite scrollback */ 
    vte_terminal_fork_command(VTE_TERMINAL(vte), NULL, NULL, NULL, ptr, TRUE, TRUE,TRUE); 
    vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL (vte), TRUE); 
    gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), vte); 

    printf("%s\n", vte_terminal_get_emulation(VTE_TERMINAL (vte))); 

    g_signal_connect(G_OBJECT(window_main),"destroy",G_CALLBACK(quit_activated),NULL); 
    g_signal_connect(G_OBJECT(window_main),"delete_event",G_CALLBACK(delete_event),NULL); 
    g_signal_connect (G_OBJECT (window_main), "key_press_event", G_CALLBACK (key_press_win_main), NULL); 


    gtk_widget_show (label); 
    gtk_widget_show (notebook); 
    gtk_widget_show (scrolled_window); 
    gtk_widget_show (vte); 
    gtk_widget_show (vbox); 
    gtk_widget_show (window_main); 

    gtk_main(); 

    return 0; 
} 

gboolean key_press_win_main (GtkWidget *widget, GdkEventKey *event, gpointer user_data) 

{ 

    switch (event->keyval) 
    { 
    case GDK_q: 
      if (event -> state & GDK_CONTROL_MASK) 
      { 
     printf("entered q\n"); 
     quit_activated(); 
        } 

     break; 

    default: 
     return FALSE; 
    } 

    return FALSE; 
} 

void quit_activated() 
{ 
    gtk_main_quit(); 

} 

static gboolean delete_event(GtkWidget *window_main,GdkEvent *event) 
{ 
    return FALSE; 
} 

這個例子將滾動但是如果有更多的線被簡單地打回或產生輸出從程序滾動緩衝區添加到終端只以適應經由vte_terminal_set_size(VTE_TERMINAL(vte), 80, 45);設置VTE的原始尺寸不擴大。它固定在45行,儘管事實上指定了無限制的回滾事實vte_terminal_set_scrollback_lines(VTE_TERMINAL (vte), -1); /* infinite scrollback */

我在想什麼?謝謝。

+0

如果您明確指定500行的回捲,該怎麼辦? – ptomato

+0

@ptomato,感謝您的想法。我試過了,結果相同。 – nomadicME

+0

然後,您可以消除無限回滾作爲問題的根源。 @ shinkou的回答聽起來對我來說似乎合理。 – ptomato

回答

1

爲了得到回溯工作是需要的線路改變爲:

scrolled_window = gtk_scrolled_window_new (NULL, NULL); 

到:

scrolled_window = gtk_scrolled_window_new (NULL, terminal->adjustment); 

其中終端被定義爲:

VteTerminal *terminal; 

vte = vte_terminal_new(); 
terminal = VTE_TERMINAL (vte); 
0

我並不是那麼有信心,因爲我之前沒有與VTE合作過。但是,它看起來像vte_terminal本身是一個可滾動的小部件。我建議你試着擺脫scrolled_window並看看。

另外,here就是我發現的一個例子。

0

試這是作品

//gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), vte); 
gtk_container_add (GTK_CONTAINER(scrolled_window),vte);