当通过代码触发回调时,抑制GTK信号

Suppress GTK signal when callback is triggered via code

本文关键字:抑制 GTK 信号 回调 代码      更新时间:2023-10-16

Gist

handler_block在具体情况下是有用的,但我宁愿在程序开始时调用一些东西,以抑制对gtk_entry_set_text和gtk_thogg_button\uset_active的所有调用的信号。有办法吗?


背景信息

我的程序用于通过具有以下属性的字符创建者对话框创建实体:

名称-通过GTKComboBoxes从预定列表中选择
动画-也是GTKComboBox
组-对实体进行分类的六个单选按钮之一

可以添加实体——一个实体从一个空白的"添加"对话框开始,填写所有字段,然后提交。
实体可以通过"编辑"对话框进行编辑,在该对话框中,上面列出的所有字段最初都用实体的当前属性填充。编辑是即时的("编辑"对话框上没有"提交"按钮),一旦选择组合框或单选按钮中的新值,显示的实体将显示不同。

我有一个回调连接到Type条目,并由"更改"信号触发。每当我在代码中手动设置条目文本以显示正在编辑的实体时,回调似乎就会触发:

gtk_entry_set_text(GTK_ENTRY(name_entry), entity.name); // name is a char*
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (group_button_friendly), TRUE);

是的,g_signal_handler_block有一种方法,但这需要

1) 首先获取连接信号时创建的gulongg_signal_connect(args);与。gulong entry_handler_id = g_signal_connect(args);

2) 对每个调用使用阻止/取消阻止习惯用法。
g_signal_handler_block(args, entry_handler_id);
gtk_entry_set_text(args);
g_signal_handler_unblock(args, entry_handler_id);
或者更糟,
g_signal_handler_block(args, entry_handler_id);
fn_that_calls_gtk_entry_set_text();
g_signal_handler_unblock(args, entry_handler_id);

我想您要找的是g_signal_handlers_block_matched。如果您将掩码设置为仅G_SIGNAL_MATCH_CLOSURE,并在信号中使用闭包,那么它就可以完成任务。

您必须在signal_id中查找正在发出的信号,但您只需要这样做一次,因为所有小部件之间的信号id都是相同的,这就是为什么调用中也需要实例的原因。

要解除锁定,您需要使用g_signal_handlers_unblock_matched