Суть:
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);
Я думаю, что вы ищете g_signal_handlers_block_matched
, Если вы установите маску просто G_SIGNAL_MATCH_CLOSURE
с замыканием, используемым в сигнале, это должно сработать.
Вам придется искать signal_id
для сигнала, который испускается, но вам нужно сделать это только один раз, поскольку идентификатор сигнала одинаков для всех виджетов, поэтому экземпляр также необходим в вызове.
И чтобы разблокировать вы хотите использовать g_signal_handlers_unblock_matched
,
Других решений пока нет …