2012-11-12 27 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