Подавить сигнал 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);

4

Решение

Я думаю, что вы ищете g_signal_handlers_block_matched, Если вы установите маску просто G_SIGNAL_MATCH_CLOSURE с замыканием, используемым в сигнале, это должно сработать.

Вам придется искать signal_id для сигнала, который испускается, но вам нужно сделать это только один раз, поскольку идентификатор сигнала одинаков для всех виджетов, поэтому экземпляр также необходим в вызове.

И чтобы разблокировать вы хотите использовать g_signal_handlers_unblock_matched,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]