首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gtk+ vte回滚不起作用

gtk+ vte回滚不起作用
EN

Stack Overflow用户
提问于 2012-07-03 09:39:26
回答 3查看 1.1K关注 0票数 0

gtk+版本2.24.8

vte版本0.28.2

我刚开始创建一个终端应用程序,然而,我在网上找到的示例(5)中没有一个可以回滚。是vte中的回滚有问题,还是我看不到?这里有一个例子:

代码语言:javascript
复制
#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的原始大小。如果通过简单地点击return或从程序产生输出来向终端添加更多行,则回滚缓冲区不会扩展。它固定在45行,尽管指定了无限制的回滚vte_terminal_set_scrollback_lines(VTE_TERMINAL (vte), -1); /* infinite scrollback */

我遗漏了什么?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-04 06:46:21

为了让scrollback工作,需要修改的代码行是:

代码语言:javascript
复制
scrolled_window = gtk_scrolled_window_new (NULL, NULL);

至:

代码语言:javascript
复制
scrolled_window = gtk_scrolled_window_new (NULL, terminal->adjustment);

其中,终端定义为:

代码语言:javascript
复制
VteTerminal *terminal;

vte = vte_terminal_new();
terminal = VTE_TERMINAL (vte);
票数 1
EN

Stack Overflow用户

发布于 2012-07-03 11:59:48

我不是很有信心,因为我以前没有使用过VTE。但是,看起来vte_terminal本身就是一个可滚动的小部件。我建议你试着去掉scrolled_window,然后看看。

另外,here就是我找到的一个例子。

票数 0
EN

Stack Overflow用户

发布于 2015-01-04 20:23:49

试试这个,挺管用的

代码语言:javascript
复制
//gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), vte);
 gtk_container_add (GTK_CONTAINER(scrolled_window),vte);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11303412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档