【问题标题】:gtk+ use keypress signal at window level, but block specific keypress signal at the child widget levelgtk+ 在窗口级别使用按键信号,但在子窗口小部件级别阻止特定按键信号
【发布时间】: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,它应该阻止它进入术语小部件。

标签: gtk signals


【解决方案1】:

Windows 在按键事件中首先得到破解,然后它们沿着焦点链上升。任何返回true 的信号处理程序都会停止这种传播。因此,如果您在处理 ctrl-t(或您不想传播的任何其他按键)时从按键信号处理程序返回 true,它应该阻止它进入术语小部件。

【讨论】:

    猜你喜欢
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多