From e4b3713fadf053aa3af3434c74657baf2e5e4150 Mon Sep 17 00:00:00 2001 From: Matthias Melcher Date: Wed, 7 Jan 2026 13:35:11 +0100 Subject: [PATCH] Fluid: user_data_ --- fluid/nodes/Menu_Node.cxx | 10 ++++++---- fluid/nodes/Node.cxx | 8 +++----- fluid/nodes/Node.h | 6 +++--- fluid/nodes/Widget_Node.cxx | 10 +++++----- fluid/panels/widget_panel.cxx | 10 +++++++--- fluid/panels/widget_panel.fl | 14 +++++++++----- fluid/proj/mergeback.cxx | 2 +- 7 files changed, 34 insertions(+), 26 deletions(-) diff --git a/fluid/nodes/Menu_Node.cxx b/fluid/nodes/Menu_Node.cxx index ba949b514..0647d428b 100644 --- a/fluid/nodes/Menu_Node.cxx +++ b/fluid/nodes/Menu_Node.cxx @@ -464,8 +464,10 @@ int Menu_Item_Node::flags() { if (!o->active()) i |= FL_MENU_INACTIVE; if (!o->visible()) i |= FL_MENU_INVISIBLE; if (can_have_children()) { - if (user_data() == nullptr) i |= FL_SUBMENU; - else i |= FL_SUBMENU_POINTER; + if (user_data().empty()) + i |= FL_SUBMENU; + else + i |= FL_SUBMENU_POINTER; } if (hotspot()) i |= FL_MENU_DIVIDER; if (menu_headline()) i |= FL_MENU_HEADLINE; @@ -538,8 +540,8 @@ void Menu_Item_Node::write_item(fld::io::Code_Writer& f) { } } else f.write_c(" 0,"); - if (user_data()) - f.write_c(" (void*)(%s),", user_data()); + if (!user_data().empty()) + f.write_c(" (void*)(%s),", user_data().c_str()); else f.write_c(" 0,"); f.write_c(" %d, (uchar)%s, %d, %d, %d", flags(), diff --git a/fluid/nodes/Node.cxx b/fluid/nodes/Node.cxx index 5a5ba75d3..1bddd2742 100644 --- a/fluid/nodes/Node.cxx +++ b/fluid/nodes/Node.cxx @@ -512,7 +512,6 @@ Node::Node() : name_(nullptr), label_(nullptr), callback_(nullptr), - user_data_(nullptr), comment_(nullptr), uid_(0), parent(nullptr), @@ -555,7 +554,6 @@ Node::~Node() { if (name_) free((void*)name_); if (label_) free((void*)label_); if (callback_) free((void*)callback_); - if (user_data_) free((void*)user_data_); if (comment_) free((void*)comment_); } @@ -846,8 +844,8 @@ void Node::callback(const char *n) { storestring(n,callback_); } -void Node::user_data(const char *n) { - storestring(n,user_data_); +void Node::user_data(const std::string& n) { + storestring(n, user_data_); } void Node::user_data_type(const std::string& n) { @@ -936,7 +934,7 @@ void Node::write_properties(fld::io::Project_Writer &f) { f.write_word("label"); f.write_word(label()); } - if (user_data()) { + if (!user_data().empty()) { f.write_indent(level+1); f.write_word("user_data"); f.write_word(user_data()); diff --git a/fluid/nodes/Node.h b/fluid/nodes/Node.h index 6a59b8224..4f1f9c1bc 100644 --- a/fluid/nodes/Node.h +++ b/fluid/nodes/Node.h @@ -168,7 +168,7 @@ protected: it is the full callback C++ code. Can be nullptr. */ const char *callback_; /** Widget user data field as C++ text. */ - const char *user_data_; + std::string user_data_; /** Widget user data type as C++ text, usually `void*` or `long`. */ std::string user_data_type_; /** Optional comment for every node in the graph. Visible in browser and @@ -234,8 +234,8 @@ public: void label(const char *); const char *callback() const {return callback_;} void callback(const char *); - const char *user_data() const {return user_data_;} - void user_data(const char *); + std::string user_data() const { return user_data_; } + void user_data(const std::string&); std::string user_data_type() const { return user_data_type_; } std::string user_data_type_or_voidp() const { return user_data_type_.empty() ? "void*" : user_data_type_; } void user_data_type(const std::string&); diff --git a/fluid/nodes/Widget_Node.cxx b/fluid/nodes/Widget_Node.cxx index 867360f3f..347a6025c 100644 --- a/fluid/nodes/Widget_Node.cxx +++ b/fluid/nodes/Widget_Node.cxx @@ -1924,7 +1924,7 @@ void Widget_Node::write_widget_code(fld::io::Code_Writer& f) { if (s != fs) f.write_c("%s%s->textsize(%d);\n", f.indent(), var, s); if (c != fc) write_color(f, "textcolor", c); }} - const char* ud = user_data(); + std::string ud = user_data(); if (class_name(1) && !parent->is_widget()) ud = "this"; if (callback()) { if (callback()[0] == '[') { @@ -1937,12 +1937,12 @@ void Widget_Node::write_widget_code(fld::io::Code_Writer& f) { } 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); + if (!ud.empty()) + f.write_c(", (void*)(%s));\n", ud.c_str()); else f.write_c(");\n"); - } else if (ud) { - f.write_c("%s%s->user_data((void*)(%s));\n", f.indent(), var, ud); + } else if (!ud.empty()) { + f.write_c("%s%s->user_data((void*)(%s));\n", f.indent(), var, ud.c_str()); } if (o->align() != tplate->align() || !subclass().empty()) { int i = o->align(); diff --git a/fluid/panels/widget_panel.cxx b/fluid/panels/widget_panel.cxx index e44bdbd6a..3434533d5 100644 --- a/fluid/panels/widget_panel.cxx +++ b/fluid/panels/widget_panel.cxx @@ -2396,19 +2396,23 @@ Fl_Group *wp_cpp_callback=(Fl_Group *)0; static void cb_13(Fl_Input* o, void* v) { //fl ▼ ---------------------- callback -~~=~-~----==~-=~~=~-= ▼ fl// if (v == LOAD) { - o->value(current_widget->user_data()); + o->value(current_widget->user_data().c_str()); } else { int mod = 0; const char *c = o->value(); const char *d = c_check(c); - if (d) {fl_message("Error in user_data: %s",d); haderror = 1; return;} + if (d) { + fl_message("Error in user_data: %s",d); + haderror = 1; + return; + } for (Node *n: Fluid.proj.tree.all_selected_nodes()) { n->user_data(c); mod = 1; } if (mod) Fluid.proj.set_modflag(1); } -//fl ▲ ----------=~-=-~--~--=----------~-~=-~=~-~~---=-~~-~-- ▲ fl// +//fl ▲ ----------=~-=-~--~--=-----------~=--~~~~=~-=~-~=-~==~ ▲ fl// } static void cb_When(Fl_Menu_Button* o, void* v) { diff --git a/fluid/panels/widget_panel.fl b/fluid/panels/widget_panel.fl index c93adb9c7..9676829da 100644 --- a/fluid/panels/widget_panel.fl +++ b/fluid/panels/widget_panel.fl @@ -519,7 +519,7 @@ Function {make_widget_panel()} {uid 9310 } { Fl_Window {} {uid 30ee comment {Use a Double Window to avoid flickering.} open - xywh {444 254 420 400} type Double labelsize 11 align 80 resizable hotspot + xywh {444 253 420 400} type Double labelsize 11 align 80 resizable hotspot code0 {o->size_range(o->w(), o->h());} size_range {420 400 0 0} visible } { Fl_Wizard tabs_wizard {uid 647f @@ -1601,7 +1601,7 @@ Use 'Backspace' key to clear.} xywh {95 210 310 20} box DOWN_BOX color 7 selecti Fluid.proj.undo.checkpoint(); ((Fl_Window*)(current_widget->o))->border(o->value()); Fluid.proj.set_modflag(1); -}} +}} selected tooltip {Add a border around the window.} xywh {195 235 60 20} selection_color 1 labelsize 11 } Fl_Light_Button {} {uid 457d @@ -1784,7 +1784,7 @@ unselectable, but not grayed out} xywh {225 260 75 20} selection_color 1 labelsi mod = 1; } if (mod) Fluid.proj.set_modflag(1); -}} selected +}} tooltip {The tooltip text for the widget. Use Ctrl-J for newlines.} xywh {95 285 310 20} labelfont 1 labelsize 11 textsize 11 } @@ -2506,12 +2506,16 @@ wCallback->do_callback(wCallback, v);} open } { Fl_Input {} {uid c214 callback {if (v == LOAD) { - o->value(current_widget->user_data()); + o->value(current_widget->user_data().c_str()); } else { int mod = 0; const char *c = o->value(); const char *d = c_check(c); - if (d) {fl_message("Error in user_data: %s",d); haderror = 1; return;} + if (d) { + fl_message("Error in user_data: %s",d); + haderror = 1; + return; + } for (Node *n: Fluid.proj.tree.all_selected_nodes()) { n->user_data(c); mod = 1; diff --git a/fluid/proj/mergeback.cxx b/fluid/proj/mergeback.cxx index cef683f3e..fca1f7296 100644 --- a/fluid/proj/mergeback.cxx +++ b/fluid/proj/mergeback.cxx @@ -693,7 +693,7 @@ static void deferred_mergeback_handler(void*) { static int app_event_handler(int event) { if (event == FL_APP_ACTIVATE) { - Fl::add_idle(deferred_mergeback_handler, nullptr); + Fl::add_timeout(0.5, deferred_mergeback_handler, nullptr); } return 0; }