Skip to content

Commit a4ffd6e

Browse files
committed
make the signal callback signature check fully compile-time
This will fail building until all positives fixed.
1 parent c015fa9 commit a4ffd6e

File tree

3 files changed

+28
-35
lines changed

3 files changed

+28
-35
lines changed

src/gui/gtk.c

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4666,24 +4666,6 @@ void dt_gui_dialog_restore_size(GtkDialog *dialog, const char *conf)
46664666
g_signal_connect(dialog, "configure-event", G_CALLBACK(_resize_dialog), (gpointer)conf);
46674667
}
46684668

4669-
gulong dt_signal_connect_data_with_caller(gpointer instance,
4670-
const gchar *detailed_signal,
4671-
GCallback c_handler,
4672-
gpointer data,
4673-
GClosureNotify destroy_data,
4674-
GConnectFlags connect_flags,
4675-
gboolean gboolean_return,
4676-
const char *file,
4677-
const int line)
4678-
{
4679-
GSignalQuery type_query = {};
4680-
if(!g_str_has_prefix(detailed_signal, "notify::"))
4681-
g_signal_query(g_signal_lookup(detailed_signal, G_OBJECT_TYPE(instance)), &type_query);
4682-
if((type_query.return_type == G_TYPE_BOOLEAN) ^ gboolean_return)
4683-
dt_print(DT_DEBUG_ALWAYS, "connecting signal %s to handler with wrong return type %s:%d", detailed_signal, file, line);
4684-
return g_signal_connect_data(instance, detailed_signal, c_handler, data, destroy_data, connect_flags);
4685-
}
4686-
46874669
// clang-format off
46884670
// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
46894671
// vim: shiftwidth=2 expandtab tabstop=2 cindent

src/gui/gtk.h

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -639,26 +639,37 @@ void dt_gui_dialog_restore_size(GtkDialog *dialog, const char *conf);
639639
dt_gui_session_type_t dt_gui_get_session_type(void);
640640

641641
#if !defined(__cplusplus)
642-
gulong dt_signal_connect_data_with_caller(gpointer instance,
643-
const gchar *detailed_signal,
644-
GCallback c_handler,
645-
gpointer data,
646-
GClosureNotify destroy_data,
647-
GConnectFlags connect_flags,
648-
gboolean gboolean_return,
649-
const char *file,
650-
const int line);
651642
#undef G_CALLBACK
652643
static inline GCallback G_CALLBACK(void *f) { return (GCallback)f; } // as a macro it gets expanded before reaching here
653644
#define DISABLINGPREFIXG_CALLBACK
645+
#define BOOLSIGNAL(s, signal) || !strcmp(s, #signal)
646+
#undef _Static_assert
654647
#undef g_signal_connect
655-
#define g_signal_connect(instance, signal, c_handler, user_data) \
656-
dt_signal_connect_data_with_caller((instance), (signal), (GCallback)(c_handler), (user_data), NULL, (GConnectFlags) 0, \
657-
_Generic((DISABLINGPREFIX##c_handler), \
658-
gboolean(*)() : TRUE, \
659-
void(*)() : FALSE, \
660-
gpointer: FALSE), \
661-
__FILE__, __LINE__)
648+
#define g_signal_connect(instance, signal, c_handler, user_data) do { \
649+
_Static_assert((FALSE \
650+
BOOLSIGNAL(signal, button-press-event) \
651+
BOOLSIGNAL(signal, button-release-event) \
652+
BOOLSIGNAL(signal, motion-notify-event) \
653+
BOOLSIGNAL(signal, enter-notify-event) \
654+
BOOLSIGNAL(signal, leave-notify-event) \
655+
BOOLSIGNAL(signal, key-press-event) \
656+
BOOLSIGNAL(signal, configure-event) \
657+
BOOLSIGNAL(signal, focus-out-event) \
658+
BOOLSIGNAL(signal, focus-in-event) \
659+
BOOLSIGNAL(signal, scroll-event) \
660+
BOOLSIGNAL(signal, delete-event) \
661+
BOOLSIGNAL(signal, drag-motion) \
662+
BOOLSIGNAL(signal, drag-failed) \
663+
BOOLSIGNAL(signal, drag-drop) \
664+
BOOLSIGNAL(signal, event) \
665+
BOOLSIGNAL(signal, focus) \
666+
BOOLSIGNAL(signal, draw) \
667+
BOOLSIGNAL(signal, popup-menu) \
668+
BOOLSIGNAL(signal, query-tooltip) \
669+
BOOLSIGNAL(signal, match-selected) \
670+
) == _Generic((DISABLINGPREFIX##c_handler), gboolean(*)(): TRUE, default: FALSE), \
671+
"signal " signal " return type does not match specified handler " #c_handler); \
672+
g_signal_connect_data((instance), (signal), (GCallback)(c_handler), (user_data), NULL, (GConnectFlags) 0); } while(0)
662673
#endif // __cplusplus
663674

664675
G_END_DECLS

src/lua/widget/widget.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ static int get_widget_params(lua_State *L)
107107
lua_pushnil(L); /* first key */
108108
while(lua_next(L, -2) != 0)
109109
{
110-
g_signal_connect(widget->widget, lua_tostring(L,-2), G_CALLBACK(lua_touserdata(L,-1)), widget);
110+
g_signal_connect_data(widget->widget, lua_tostring(L,-2), G_CALLBACK(lua_touserdata(L,-1)), widget, NULL, 0);
111111
lua_pop(L,1);
112112
}
113113
lua_pop(L,1);

0 commit comments

Comments
 (0)