@@ -580,11 +580,52 @@ static inline GCallback G_CALLBACK(void *f) { return (GCallback)f; } // as a mac
580580#define DISABLINGPREFIXG_CALLBACK
581581
582582#define SIGNAME (num, signal, name ) !strcmp((signal), #name) ? 1 << num :
583- #define RETURN_HANDLER (num, ret, instance, data, ...) ret(*)(__typeof__( instance) , __VA_OPT__(__VA_ARGS__,) __typeof__( data) ) : 1 << num,
583+ #define RETURN_HANDLER (num, ret, instance, data, ...) ret(*)(instance, __VA_OPT__(__VA_ARGS__,) data) : 1 << num,
584584#define BOOL_HANDLER (num, instance, data, ...) RETURN_HANDLER(num, gboolean, instance, data, __VA_ARGS__)
585585#define VOID_HANDLER (num, instance, data, ...) RETURN_HANDLER(num, void , instance, data, __VA_ARGS__)
586586#define EVENT_HANDLER (num, instance, data, event ) BOOL_HANDLER(num, instance, data, GdkEvent##event*) \
587587 BOOL_HANDLER (num, instance, data, const GdkEvent##event*)
588+ #define MATCH_HANDLER (c_handler, instance, data ) \
589+ _Generic ((DISABLINGPREFIX##c_handler), \
590+ GCallback : 1 << 0, \
591+ EVENT_HANDLER(1 , instance, data, ) \
592+ EVENT_HANDLER(1 , instance, data, Button) \
593+ EVENT_HANDLER(1 , instance, data, Motion) \
594+ EVENT_HANDLER(1 , instance, data, Scroll) \
595+ EVENT_HANDLER(1 , instance, data, Key) \
596+ EVENT_HANDLER(1 , instance, data, Focus) \
597+ EVENT_HANDLER(1 , instance, data, Crossing) \
598+ EVENT_HANDLER(1 , instance, data, Configure) \
599+ VOID_HANDLER( 2 , instance, data) \
600+ VOID_HANDLER( 3 , instance, data, char *, GtkTreeIter*) \
601+ VOID_HANDLER( 4 , instance, data, GdkRectangle*, GdkRectangle*, gboolean, gboolean) \
602+ VOID_HANDLER( 5 , instance, data, char *) \
603+ BOOL_HANDLER( 6 , instance, data, gint, gint, gboolean, GtkTooltip*) \
604+ BOOL_HANDLER( 7 , instance, data, cairo_t *) \
605+ VOID_HANDLER( 8 , instance, data, GtkWidget*) \
606+ VOID_HANDLER( 8 , instance, data, GdkRectangle*) \
607+ VOID_HANDLER( 8 , instance, data, GdkEventSequence*) \
608+ VOID_HANDLER( 8 , instance, data, GdkDragContext*) \
609+ VOID_HANDLER( 9 , instance, data, GdkDragContext*, guint) \
610+ VOID_HANDLER( 9 , instance, data, GtkWidget*, guint) \
611+ BOOL_HANDLER(10 , instance, data, GdkDragContext*, const gint, const gint, const guint) \
612+ VOID_HANDLER(11 , instance, data, GtkTreePath*, GtkTreeViewColumn*) \
613+ VOID_HANDLER(12 , instance, data, gint) \
614+ VOID_HANDLER(13 , instance, data, GdkDragContext*, gint, gint, GtkSelectionData*, guint, guint) \
615+ VOID_HANDLER(14 , instance, data, GdkDragContext*, GtkSelectionData*, guint, guint) \
616+ BOOL_HANDLER(15 , instance, data, GdkDragContext*, GtkDragResult) \
617+ VOID_HANDLER(16 , instance, data, GtkCellEditable*, char *) \
618+ VOID_HANDLER(17 , instance, data, const gchar*, const gchar*) \
619+ BOOL_HANDLER(18 , instance, data, GtkDirectionType) \
620+ BOOL_HANDLER(19 , instance, data) \
621+ VOID_HANDLER(20 , instance, data, const gchar*, const gint, gint*) \
622+ VOID_HANDLER(21 , instance, data, GtkTreePath*, GtkTreeIter*) \
623+ VOID_HANDLER(22 , instance, data, GParamSpec*) \
624+ VOID_HANDLER(23 , instance, data, GtkTreeIter*, GtkTreePath*) \
625+ BOOL_HANDLER(24 , instance, data, GtkTreeModel*, GtkTreeIter*) \
626+ default : 0)
627+ #define MATCH_HANDLER_BOTH (c_handler, instance, data ) MATCH_HANDLER(c_handler, instance, data) ?: \
628+ MATCH_HANDLER (c_handler, instance, gpointer)
588629#undef _Static_assert
589630#undef g_signal_connect
590631#define g_signal_connect (instance, signal, c_handler, user_data ) do { \
@@ -658,50 +699,21 @@ static inline GCallback G_CALLBACK(void *f) { return (GCallback)f; } // as a mac
658699 SIGNAME (23 , signal, row-expanded) \
659700 SIGNAME (24 , signal, match-selected) \
660701 0 ; \
661- const int found_signature = _Generic ((DISABLINGPREFIX##c_handler), \
662- GCallback : 1 << 0 , \
663- EVENT_HANDLER (1 , instance, user_data, ) \
664- EVENT_HANDLER (1 , instance, user_data, Button) \
665- EVENT_HANDLER (1 , instance, user_data, Motion) \
666- EVENT_HANDLER (1 , instance, user_data, Scroll) \
667- EVENT_HANDLER (1 , instance, user_data, Key) \
668- EVENT_HANDLER (1 , instance, user_data, Focus) \
669- EVENT_HANDLER (1 , instance, user_data, Crossing) \
670- EVENT_HANDLER (1 , instance, user_data, Configure) \
671- VOID_HANDLER ( 2 , instance, user_data) \
672- VOID_HANDLER ( 3 , instance, user_data, char *, GtkTreeIter*) \
673- VOID_HANDLER ( 4 , instance, user_data, GdkRectangle*, GdkRectangle*, gboolean, gboolean) \
674- VOID_HANDLER ( 5 , instance, user_data, char *) \
675- BOOL_HANDLER ( 6 , instance, user_data, gint, gint, gboolean, GtkTooltip*) \
676- BOOL_HANDLER ( 7 , instance, user_data, cairo_t *) \
677- VOID_HANDLER ( 8 , instance, user_data, GtkWidget*) \
678- VOID_HANDLER ( 8 , instance, user_data, GdkRectangle*) \
679- VOID_HANDLER ( 8 , instance, user_data, GdkEventSequence*) \
680- VOID_HANDLER ( 8 , instance, user_data, GdkDragContext*) \
681- VOID_HANDLER ( 9 , instance, user_data, GdkDragContext*, guint) \
682- VOID_HANDLER ( 9 , instance, user_data, GtkWidget*, guint) \
683- BOOL_HANDLER (10 , instance, user_data, GdkDragContext*, const gint, const gint, const guint) \
684- VOID_HANDLER (11 , instance, user_data, GtkTreePath*, GtkTreeViewColumn*) \
685- VOID_HANDLER (12 , instance, user_data, gint) \
686- VOID_HANDLER (13 , instance, user_data, GdkDragContext*, gint, gint, GtkSelectionData*, guint, guint) \
687- VOID_HANDLER (14 , instance, user_data, GdkDragContext*, GtkSelectionData*, guint, guint) \
688- BOOL_HANDLER (15 , instance, user_data, GdkDragContext*, GtkDragResult) \
689- VOID_HANDLER (16 , instance, user_data, GtkCellEditable*, char *) \
690- VOID_HANDLER (17 , instance, user_data, const gchar*, const gchar*) \
691- BOOL_HANDLER (18 , instance, user_data, GtkDirectionType) \
692- BOOL_HANDLER (19 , instance, user_data) \
693- VOID_HANDLER (20 , instance, user_data, const gchar*, const gint, gint*) \
694- VOID_HANDLER (21 , instance, user_data, GtkTreePath*, GtkTreeIter*) \
695- VOID_HANDLER (22 , instance, user_data, GParamSpec*) \
696- VOID_HANDLER (23 , instance, user_data, GtkTreeIter*, GtkTreePath*) \
697- BOOL_HANDLER (24 , instance, user_data, GtkTreeModel*, GtkTreeIter*) \
698- default : 0 ); \
702+ const int found_signature = MATCH_HANDLER_BOTH (c_handler, __typeof__ (instance), __typeof__ (user_data)) ?: \
703+ MATCH_HANDLER_BOTH (c_handler, GtkWidget*, __typeof__ (user_data)) ?: \
704+ MATCH_HANDLER_BOTH (c_handler, GtkEntry*, __typeof__ (user_data)) ?: \
705+ MATCH_HANDLER_BOTH (c_handler, GtkDrawingArea*, __typeof__ (user_data)) ?: \
706+ MATCH_HANDLER_BOTH (c_handler, GtkTreeView*, __typeof__ (user_data)) ?: \
707+ MATCH_HANDLER_BOTH (c_handler, GtkTextView*, __typeof__ (user_data)) ?: \
708+ MATCH_HANDLER_BOTH (c_handler, GtkColorButton*, __typeof__ (user_data)) ?: \
709+ MATCH_HANDLER_BOTH (c_handler, GtkToggleButton*, __typeof__ (user_data)) ?: \
710+ MATCH_HANDLER_BOTH (c_handler, GtkButton*, __typeof__ (user_data)); \
699711 if (required_signature == 0 ) \
700712 dt_print_nts_ext (" %s:%d: connecting unknown signal %s\n " , __FILE__, __LINE__, signal); \
701713 else if (!(required_signature & found_signature)) \
702- dt_print_nts_ext (" %s:%d: connecting signal %s to %s with incorrect signature\n " , __FILE__, __LINE__, signal, #c_handler); \
703- _Static_assert (required_signature, " unknown signal encountered: " signal ); \
704- /* _Static_assert(required_signature & found_signature, "incorrect function connected to " signal );*/ \
714+ dt_print_nts_ext (" %s:%d: connecting signal %s to %s with incorrect signature %d-%d \n " , __FILE__, __LINE__, signal, #c_handler, required_signature, found_signature ); \
715+ /* _Static_assert(required_signature, "unknown signal encountered: " signal ); */ \
716+ /* _Static_assert(required_signature & found_signature, "incorrect function connected to " signal ); */ \
705717 g_signal_connect_data ((instance), (signal), (c_handler), (user_data), NULL , (GConnectFlags) 0 ); } while (0 )
706718#endif // __cplusplus
707719
0 commit comments