From 33199dab785daaa7c6c5733021ad0cab48e0e1dd Mon Sep 17 00:00:00 2001 From: Matthias Melcher Date: Mon, 22 Dec 2025 23:12:25 +0100 Subject: FLUID: Add support for lambda callbacks. Starting the callback text with a '[' assumes that the rest of the callback is a lambda and generates inlined code for it. --- fluid/nodes/Menu_Node.cxx | 21 +++++++++++++++------ fluid/nodes/Widget_Node.cxx | 13 +++++++++++-- 2 files changed, 26 insertions(+), 8 deletions(-) (limited to 'fluid/nodes') diff --git a/fluid/nodes/Menu_Node.cxx b/fluid/nodes/Menu_Node.cxx index 342fcf014..dcaa2fc55 100644 --- a/fluid/nodes/Menu_Node.cxx +++ b/fluid/nodes/Menu_Node.cxx @@ -329,7 +329,7 @@ void Menu_Item_Node::write_static(fld::io::Code_Writer& f) { if (extra_code(n) && isdeclare(extra_code(n))) f.write_h_once("%s", extra_code(n)); } - if (callback() && !is_name(callback())) { + if (callback() && !is_name(callback()) && (callback()[0] != '[')) { // see if 'o' or 'v' used, to prevent unused argument warnings: int use_o = 0; int use_v = 0; @@ -520,11 +520,20 @@ void Menu_Item_Node::write_item(fld::io::Code_Writer& f) { f.write_c(", 0, "); } if (callback()) { - const char* k = is_name(callback()) ? nullptr : class_name(1); - if (k) { - f.write_c(" (Fl_Callback*)%s::%s,", k, callback_name(f)); + if (callback()[0] == '[') { + f.write_c("\n"); + f.tag(Mergeback::Tag::GENERIC, Mergeback::Tag::WIDGET_CALLBACK, 0); + f.write_c_indented(callback(), 1, 0); + f.write_c("\n"); + f.tag(Mergeback::Tag::WIDGET_CALLBACK, Mergeback::Tag::GENERIC, get_uid()); + f.write_c("%s, ", f.indent_plus(1)); } else { - f.write_c(" (Fl_Callback*)%s,", callback_name(f)); + const char* k = is_name(callback()) ? nullptr : class_name(1); + if (k) { + f.write_c(" (Fl_Callback*)%s::%s,", k, callback_name(f)); + } else { + f.write_c(" (Fl_Callback*)%s,", callback_name(f)); + } } } else f.write_c(" 0,"); @@ -571,7 +580,7 @@ void Menu_Item_Node::write_code1(fld::io::Code_Writer& f) { } if (callback()) { - if (!is_name(callback()) && class_name(1)) { + if (!is_name(callback()) && (callback()[0] != '[') && class_name(1)) { const char* cn = callback_name(f); const char* ut = user_data_type() ? user_data_type() : "void*"; f.write_public(0); diff --git a/fluid/nodes/Widget_Node.cxx b/fluid/nodes/Widget_Node.cxx index e711c03f0..b74560f05 100644 --- a/fluid/nodes/Widget_Node.cxx +++ b/fluid/nodes/Widget_Node.cxx @@ -1499,7 +1499,7 @@ void Widget_Node::write_static(fld::io::Code_Writer& f) { if (strchr(c, '[') == nullptr) f.write_c("%s *%s=(%s *)0;\n", t, c, t); else f.write_c("%s *%s={(%s *)0};\n", t, c, t); } - if (callback() && !is_name(callback())) { + if (callback() && !is_name(callback()) && (callback()[0] != '[')) { // see if 'o' or 'v' used, to prevent unused argument warnings: int use_o = 0; int use_v = 0; @@ -1883,7 +1883,16 @@ void Widget_Node::write_widget_code(fld::io::Code_Writer& f) { const char* ud = user_data(); if (class_name(1) && !parent->is_widget()) ud = "this"; if (callback()) { - f.write_c("%s%s->callback((Fl_Callback*)%s", f.indent(), var, callback_name(f)); + if (callback()[0] == '[') { + f.write_c("%s%s->callback(\n", f.indent(), var); + f.tag(Mergeback::Tag::GENERIC, Mergeback::Tag::WIDGET_CALLBACK, 0); + f.write_c_indented(callback(), 1, 0); + f.write_c("\n"); + f.tag(Mergeback::Tag::WIDGET_CALLBACK, Mergeback::Tag::GENERIC, get_uid()); + f.write_c("%s", f.indent_plus(1)); + } else { + f.write_c("%s%s->callback((Fl_Callback*)%s", f.indent(), var, callback_name(f)); + } if (ud) f.write_c(", (void*)(%s));\n", ud); else -- cgit v1.2.3