Skip to content

Commit c51ae98

Browse files
committed
make signal signature match other widget types and gpointer
1 parent 3cc166d commit c51ae98

File tree

1 file changed

+54
-42
lines changed

1 file changed

+54
-42
lines changed

src/gui/gtk.h

Lines changed: 54 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)