2012-11-12 30 views
4

吉斯特触发信号:禁止GTK回调时通过代码

handler_block是根据具体情况逐案有用的,但我宁愿放弃一些在节目的开始打压的信号所有致电gtk_entry_set_text和gtk_toggle_button_set_active。有没有办法?


背景信息

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

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

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

我有一个回调连接到类型条目,并由“更改”信号触发。回调似乎触发每当我在代码中手动设置条目文字显示实体正在编辑:

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)获得gulong那是在您首先连接信号时创建的。 g_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);

+1

您可以将窗体中的文本与“已保存”信息进行比较,然后返回?我不知道是否有办法从触发中清空事件。在一个即时编程应用程序中,我只需要修改事件或任何写入它的值,基本上就是说你写了你刚刚写回的内容,但它并没有真正妨碍我(假设你没有这样做你的回调中有什么特别之处)。 – senshikaze

+2

而不是像这样阻止你自己的处理程序,你可以设置一些标志变量,告诉处理程序什么都不做。据我所知,GTK +为什么会发出信号,即使是源代码发生变化的原因也是健壮的。例如。两个库(或一个库和你自己的代码)可以连接到同一个对象,但仍然可以看到彼此所做的更改。] * – doublep

+0

感谢您的解释@doublep。我疯了,诅咒这个图书馆的创造者,但很高兴知道这个令人沮丧的概念背后有一个原因。我目前使用一个称为_suppress_callback的布尔,尽管这只是解决了问题(1),并仍然要求我用两行代码来限制违规函数。 – nnnn

回答

1

我想你要寻找的是g_signal_handlers_block_matched。如果您将掩码设置为只有G_SIGNAL_MATCH_CLOSURE,并且信号中使用了闭包,则它应该执行该操作。

您必须查看signal_id中正在发出的信号,但您应该只需要这样做一次,因为所有小部件之间的信号ID相同,这就是为什么需要实例打电话。

并取消阻止您要使用g_signal_handlers_unblock_matched