要旨:
handler_block
ケースバイケースで便利ですが、プログラムの最初で何かを呼び出してgtk_entry_set_text
、gtk_toggle_button_set_activeへのすべての呼び出しのシグナルを抑制したいと思います。方法はありますか?
背景情報:
私のプログラムは、次の属性を持つキャラクター作成者ダイアログボックスを介してエンティティを作成するために使用されます。
名前-GTKComboBoxesアニメーション
を介して所定のリストから選択
-GTKComboBox
グループ-エンティティを分類する6つのラジオボタンの1つ
エンティティを追加できます。1つは空白の[追加]ダイアログで始まり、すべてのフィールドに入力して送信します。
エンティティは、[編集]ダイアログで編集できます。このダイアログでは、上記のすべてのフィールドに、エンティティの現在の属性が最初に入力されます。編集は瞬時に行われ([編集]ダイアログに[送信]ボタンはありません)、コンボボタンまたはラジオボタンから新しい値を選択するとすぐに、表示されるエンティティが異なって表示されます。
Typeエントリに接続され、「changed」シグナルによってトリガーされるコールバックがあります。編集中のエンティティを表示するためにコードでエントリテキストを手動で設定すると、コールバックがトリガーされるようです。
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);