【发布时间】:2012-07-06 04:03:03
【问题描述】:
我正在使用 vte 在 gtk+ 中创建一个终端应用程序。当我创建一个选项卡并使用 ctrl+t 组合键将其添加到笔记本时,它会按预期在选项卡中添加带有新终端的选项卡。但是,按键信号也会通过终端并在命令提示符之前显示为“^T”以及系统哔声。如何在窗口级别使用按键信号,以便添加选项卡,然后在终端级别阻止此特定按键信号?这是一段代码,展示了它是如何组装的:
window_main = gtk_window_new (GTK_WINDOW_TOPLEVEL);
vte = vte_terminal_new();
terminal = VTE_TERMINAL (vte);
notebook = gtk_notebook_new ();
vbox = gtk_vbox_new(FALSE,0);
gtk_container_add (GTK_CONTAINER (window_main), vbox);
gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0);
scrollwin[0] = gtk_scrolled_window_new (NULL, terminal->adjustment);
gtk_container_add(GTK_CONTAINER(scrollwin[0]),vte);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwin[0]), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
label = gtk_label_new ("term1");
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), scrollwin[0], label);
谢谢。
【问题讨论】:
-
从你的信号处理程序返回 true 不行吗?
-
@ergosys,感谢您的评论。但是,当涉及到信号处理程序时,我不得不声称自己无知。是时候学习了。我已经阅读了有关如何获取处理程序 ID 的信息,并且还阅读了有关如何使用
g_signal_handler_block阻止信号的信息,但这似乎有点矫枉过正。我将从哪个信号处理程序返回 true?在哪个级别仅阻止信号到达终端,而不是窗口?一个例子真的很有帮助。我一直在寻找,但我找不到一个。谢谢。 -
我不确定我是否能提供帮助,但首先了解如何获得 ctrl-t 会很有用。
-
@ergosys,你的问题很不清楚,但我会尽力而为。首先,我按下组合键 ctrl+t,然后我有一个 g_signal_connect 语句,它将主窗口的 key_press_event 与处理这些按键的函数连接起来。由于根据定义,终端需要按键操作,所以这个 ctrl+t 信号也被发送到终端,在那里它注册为:^T(这个案例很有趣,因为大写锁定是关闭的)。无论如何,希望这可以解释它。
-
据我了解,windows 会首先破解按键信号,然后再进入焦点链。因此,如果您在处理 ctrl-t(或您不想传播的任何其他按键)时从该函数返回 true,它应该阻止它进入术语小部件。