2012-07-03 2 views
0

GTK + версии 2.24.8GTK + ВТЭ скроллинга не работает

ВТЭ версия 0.28.2

я только начинал создавать терминал приложений, однако, ни один из примеров, которые я нашел в Интернете (5) не имеют работу скроллинг. Есть ли проблема с scrollback в 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); Если больше строк добавляются к терминалу, просто ударяя возврат или производить выход из программы скроллинга буфера не расширяется. Он фиксируется на 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); 
Смежные вопросы