summaryrefslogtreecommitdiff
path: root/fluid/nodes/Widget_Node.cxx
diff options
context:
space:
mode:
authorMatthias Melcher <github@matthiasm.com>2025-12-22 23:12:25 +0100
committerMatthias Melcher <github@matthiasm.com>2025-12-22 23:12:42 +0100
commit33199dab785daaa7c6c5733021ad0cab48e0e1dd (patch)
tree7430470aace60b830659ca4d229727aa1f6f6112 /fluid/nodes/Widget_Node.cxx
parentd0d2e104e9d5303ac897f5d1faca582e619180b2 (diff)
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.
Diffstat (limited to 'fluid/nodes/Widget_Node.cxx')
-rw-r--r--fluid/nodes/Widget_Node.cxx13
1 files changed, 11 insertions, 2 deletions
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