Как пользователи могут злоупотреблять сигналами (и почему некоторые думают что это хорошо)

Теперь когда вы знаете как создавать сигналы которые пользователь может легко подключать в любой точке эмиссии сигнала благодаря g_signal_connect, g_signal_connect_after и G_SIGNAL_RUN_LAST, пришло время изучить как ваши пользователи могут заморочить вас. Это интересно, чтобы знать как вы сами можете заморочить других людей. Что заставит вас чувствовать себя хорошо.

Пользователи могут:

В обоих случаях настоящий программист должен быть осторожен на столько на сколько это возможно создавая код который отвергает факт что обработчик сигнала по умолчанию может не выполниться. Это очевидно не касается случая в примере используемом в предыдущем разделе, так как запись файла зависит от того выполнен или нет обработчик по умолчанию (однако, вашей целью может быть: позволить пользователю предотвратить запись файла если он хочет).

Если вы просто хотите остановить эмиссию сигнала из одной callback-функции подключенной вами, вы можете вызвать g_signal_stop_by_name. Это очень просто поэтому я не буду описывать подробно.

Если по умолчанию обработчик сигнала является просто указателем классовой функции, возможно переписать его самостоятельно из типовой функции class_init которая унаследована у родителя. В этом случае, когда издаётся сигнал, родительский класс будет использовать функцию обеспеченную потомком как обработчик сигнала по умолчанию. Конечно, также возможно (и рекомендуется) соединять потомка с родительским обработчиком сигнала по умолчанию гарантируя целостность родительского объекта.

Перезапись классового метода и формирование цепочек было продемонстрировано в “Object methods” поэтому я не стану показывать здесь как это делается снова.