LINUX.ORG.RU

[C, gtk+] Обработчики сигналов


0

0

Добрый день. Имеется небольшой gui, сделанный в glade. Большинство обработчиков представляют из себя функции подобного вида:

static void
on_button_input_fk_toggled(GtkWidget *btn, control_panel *cp)
{
	__on_button_toggled(btn, cp, 0, 0);
}

static void
on_button_reset_avvi_toggled(GtkWidget *btn, control_panel *cp)
{
	__on_button_toggled(btn, cp, 0, 1);
}
/* ...
 * и так больше 30 обработчиков, различающихся только последними двумя параметрами
 */

Также «мозолит» глаза код подключения сигналов:

	g_signal_connect(gtk_builder_get_object(builder, "button_reset"), "toggled",
			 G_CALLBACK(on_button_reset_toggled), cp);
	g_signal_connect(gtk_builder_get_object(builder, "button_enter"), "toggled",
			 G_CALLBACK(on_button_enter_toggled), cp);
	g_signal_connect(gtk_builder_get_object(builder, "button_self_verification"), "toggled",
			 G_CALLBACK(on_button_self_verification_toggled), cp);
	g_signal_connect(gtk_builder_get_object(builder, "button_4v"), "toggled",
			 G_CALLBACK(on_button_4v_toggled), cp);

Код основной части программы значительно меньше этого «добра».

Вопросы:

  1. Как вы избавляетесь от подобного кода? (варианты)
  2. Стоит ли это вообще делать, или это вполне нормальный код?

от самих обработчиков вряд ли избавишься, да и не зная логики программы тут вообще сложно что-то сказать про оптимизацию.

а привязку сигналов лучше делать в самом glade, а в коде дергать gtk_builder_connect_signals(), и собирать код c --export-dynamic

ananas ★★★★★
()
Ответ на: комментарий от dmitry_vk

Glade уже давно не генерирует код, а дает xml-ку для GtkBuilder.

Очень хорошо. Только к чему это?

У меня где-то сказано что генерирует?

По коду видно, что как раз исользуется GtkBuilder. Только хотелось бы избавиться и от этого «дублирующего» кода.

nkondratev
() автор топика
Ответ на: комментарий от nkondratev

про регистрацию сигналов уже написал ananas, а насчет обработчиков, почему бы не сделать тогда один обработчик? и выбирать действие в зависимости от параметров?

Cy6erBr4in ★★★
()
Ответ на: комментарий от Cy6erBr4in

> и выбирать действие в зависимости от параметров?

параметр только один - control_panel *cp;

можно разве что выдергивать имя виджета и на него ориентироваться. но это, имхо, чересчур сложно

ananas ★★★★★
()
Ответ на: комментарий от ananas

у меня просто в основном код был на плюсах, не хотелось еще разбираться в склеивании с Python. Но альтернатива хорошая

vertexua ★★★★★
()
Ответ на: комментарий от ananas

как раз таки лучше не делать привязку сигналов в самом глейде. даже сами авторы не рекомендуют оное, потому и сделали swapped order параметров вызова колбеков, когда пользуешь автоконнект.

Deleted
()
Ответ на: комментарий от ananas

>>Очень жалко что автоматичесчкое подключение не работает в Gtkmm

расплата за полиморфизм

+1

Deleted
()
Ответ на: комментарий от Deleted

ну не знаю. меня оная никогда не подводила

ananas ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.