- auto pass = std::make_tuple(f, extra);
- auto func = [](ui_widget *widget, GdkEventKey *event, void *pass_) -> bool {
- using pass_t = decltype(pass);
- auto &args = *(pass_t *) pass_;
- auto func = std::get<0>(args);
- auto pass = std::get<1>(args);
- return func(Widget(widget), event, pass);
+ using f_t = decltype(f);
+ struct user_data {
+ f_t f;
+ void *extra;
+ } *pass = new user_data{f, extra};
+ auto dtor = [](user_data *data, GClosure *) {
+ delete data;
+ };
+ auto func = [](ui_widget *widget, GdkEventKey *event, user_data *args) -> bool {
+ return args->f(Widget(widget), event, args->extra);