summaryrefslogtreecommitdiff
path: root/fluid/nodes
diff options
context:
space:
mode:
authorMatthias Melcher <github@matthiasm.com>2026-01-05 12:54:12 +0100
committerMatthias Melcher <github@matthiasm.com>2026-01-05 21:06:04 +0100
commit89aa5726f8d772e0fec1ebcbdfa3b74aa7a217f8 (patch)
tree2bb2c31e1b283d33a1bff29aa3a105362f2a9435 /fluid/nodes
parent5f10939cfa0fc943dfc28b441efa9e9028eef5e5 (diff)
Fluid: Improve std::string output
Fluid: Update Widget_Node to std::string Fluid: Image names to std::string Fluid: std::string tooltip Fluid: stringify Widget_Node::subtype Fluid:: extra_code
Diffstat (limited to 'fluid/nodes')
-rw-r--r--fluid/nodes/Function_Node.cxx12
-rw-r--r--fluid/nodes/Function_Node.h8
-rw-r--r--fluid/nodes/Menu_Node.cxx20
-rw-r--r--fluid/nodes/Menu_Node.h2
-rw-r--r--fluid/nodes/Node.cxx6
-rw-r--r--fluid/nodes/Widget_Node.cxx185
-rw-r--r--fluid/nodes/Widget_Node.h66
-rw-r--r--fluid/nodes/Window_Node.cxx20
8 files changed, 147 insertions, 172 deletions
diff --git a/fluid/nodes/Function_Node.cxx b/fluid/nodes/Function_Node.cxx
index dc1e4958d..8404b931e 100644
--- a/fluid/nodes/Function_Node.cxx
+++ b/fluid/nodes/Function_Node.cxx
@@ -227,7 +227,7 @@ void Function_Node::write_properties(fld::io::Project_Writer &f) {
if (declare_c_) f.write_string("C");
if (!return_type().empty()) {
f.write_string("return_type");
- f.write_word(return_type().c_str());
+ f.write_word(return_type());
}
}
@@ -436,7 +436,7 @@ void Function_Node::write_code1(fld::io::Code_Writer& f) {
}
if (havewidgets && child && !child->name())
- f.write_c("%s%s* w;\n", f.indent(1), subclassname(child));
+ f.write_c("%s%s* w;\n", f.indent(1), subclassname(child).c_str());
f.indentation++;
}
@@ -655,7 +655,7 @@ void CodeBlock_Node::write_properties(fld::io::Project_Writer &f) {
Node::write_properties(f);
if (!end_code().empty()) {
f.write_string("after");
- f.write_word(end_code().c_str());
+ f.write_word(end_code());
}
}
@@ -907,7 +907,7 @@ void Data_Node::write_properties(fld::io::Project_Writer &f) {
Decl_Node::write_properties(f);
if (!filename().empty()) {
f.write_string("filename");
- f.write_word(filename().c_str());
+ f.write_word(filename());
}
switch (output_format_) {
case 1: f.write_string("textmode"); break;
@@ -1202,7 +1202,7 @@ void DeclBlock_Node::write_properties(fld::io::Project_Writer &f) {
if (write_map_ != CODE_IN_SOURCE)
f.write_string("map %d", write_map_);
f.write_string("after");
- f.write_word(end_code().c_str());
+ f.write_word(end_code());
}
/**
@@ -1467,7 +1467,7 @@ void Class_Node::write_properties(fld::io::Project_Writer &f) {
Node::write_properties(f);
if (!base_class().empty()) {
f.write_string(":");
- f.write_word(base_class().c_str());
+ f.write_word(base_class());
}
switch (public_) {
case 0: f.write_string("private"); break;
diff --git a/fluid/nodes/Function_Node.h b/fluid/nodes/Function_Node.h
index ec1aadbfe..be16e5414 100644
--- a/fluid/nodes/Function_Node.h
+++ b/fluid/nodes/Function_Node.h
@@ -150,7 +150,7 @@ public:
bool is_a(Type inType) const override { return (inType==Type::CodeBlock) ? true : super::is_a(inType); }
void write_properties(fld::io::Project_Writer &f) override;
void read_property(fld::io::Project_Reader &f, const char *) override;
- std::string end_code() { return end_code_; }
+ std::string end_code() const { return end_code_; }
void end_code(const std::string& c) { storestring(c, end_code_); }
};
@@ -212,7 +212,7 @@ public:
Type type() const override { return Type::Data; }
bool is_a(Type inType) const override { return (inType==Type::Data) ? true : super::is_a(inType); }
void filename(const std::string& fn) { storestring(fn, filename_); }
- std::string filename() { return filename_; }
+ std::string filename() const { return filename_; }
int output_format() { return output_format_; }
void output_format(int fmt) { output_format_ = fmt; }
};
@@ -253,7 +253,7 @@ public:
int is_public() const override;
Type type() const override { return Type::DeclBlock; }
bool is_a(Type inType) const override { return (inType==Type::DeclBlock) ? true : super::is_a(inType); }
- std::string end_code() { return end_code_; }
+ std::string end_code() const { return end_code_; }
void end_code(const std::string& p) { storestring(p, end_code_); }
int write_map() { return write_map_; }
void write_map(int v) { write_map_ = v; }
@@ -328,7 +328,7 @@ public:
void read_property(fld::io::Project_Reader &f, const char *) override;
/** Get base class access and name. */
- std::string base_class() { return base_class_; }
+ std::string base_class() const { return base_class_; }
/** Set base class access and name, i.e. `public Fl_Widget`. */
void base_class(const std::string& name) { storestring(name, base_class_); }
diff --git a/fluid/nodes/Menu_Node.cxx b/fluid/nodes/Menu_Node.cxx
index dcaa2fc55..b29fb8293 100644
--- a/fluid/nodes/Menu_Node.cxx
+++ b/fluid/nodes/Menu_Node.cxx
@@ -326,8 +326,8 @@ void Menu_Item_Node::write_static(fld::io::Code_Writer& f) {
f.write_h_once("extern void %s(Fl_Menu_*, %s);", callback(),
user_data_type() ? user_data_type() : "void*");
for (int n=0; n < NUM_EXTRA_CODE; n++) {
- if (extra_code(n) && isdeclare(extra_code(n)))
- f.write_h_once("%s", extra_code(n));
+ if (!extra_code(n).empty() && isdeclare(extra_code(n).c_str()))
+ f.write_h_once("%s", extra_code(n).c_str());
}
if (callback() && !is_name(callback()) && (callback()[0] != '[')) {
// see if 'o' or 'v' used, to prevent unused argument warnings:
@@ -638,9 +638,9 @@ void Menu_Item_Node::write_code1(fld::io::Code_Writer& f) {
}
}
for (int n=0; n < NUM_EXTRA_CODE; n++) {
- if (extra_code(n) && !isdeclare(extra_code(n))) {
+ if (!extra_code(n).empty() && !isdeclare(extra_code(n).c_str())) {
start_menu_initialiser(f, menuItemInitialized, mname, i);
- f.write_c("%s%s\n", f.indent(), extra_code(n));
+ f.write_c("%s%s\n", f.indent(), extra_code(n).c_str());
}
}
if (menuItemInitialized) {
@@ -837,11 +837,11 @@ Menu_Bar_Node::~Menu_Bar_Node() {
*/
bool Menu_Bar_Node::is_sys_menu_bar() {
if (o->type()==1) return true;
- return ( subclass() && (strcmp(subclass(), "Fl_Sys_Menu_Bar")==0) );
+ return (subclass() == "Fl_Sys_Menu_Bar");
}
-const char *Menu_Bar_Node::sys_menubar_name() {
- if (subclass())
+std::string Menu_Bar_Node::sys_menubar_name() const {
+ if (!subclass().empty())
return subclass();
else
return "Fl_Sys_Menu_Bar";
@@ -850,7 +850,7 @@ const char *Menu_Bar_Node::sys_menubar_name() {
const char *Menu_Bar_Node::sys_menubar_proxy_name() {
if (!_proxy_name)
_proxy_name = (char*)::malloc(128);
- ::snprintf(_proxy_name, 63, "%s_Proxy", sys_menubar_name());
+ ::snprintf(_proxy_name, 63, "%s_Proxy", sys_menubar_name().c_str());
return _proxy_name;
}
@@ -868,8 +868,8 @@ void Menu_Bar_Node::write_static(fld::io::Code_Writer& f) {
" : %s(x, y, w, h, l) { }\n"
" void *_parent_class;\n"
"};\n",
- sys_menubar_proxy_name(), sys_menubar_name(),
- sys_menubar_proxy_name(), sys_menubar_name()
+ sys_menubar_proxy_name(), sys_menubar_name().c_str(),
+ sys_menubar_proxy_name(), sys_menubar_name().c_str()
);
}
}
diff --git a/fluid/nodes/Menu_Node.h b/fluid/nodes/Menu_Node.h
index 59d3b06bb..181ab8243 100644
--- a/fluid/nodes/Menu_Node.h
+++ b/fluid/nodes/Menu_Node.h
@@ -300,7 +300,7 @@ public:
Type type() const override { return Type::Menu_Bar; }
bool is_a(Type inType) const override { return (inType==Type::Menu_Bar) ? true : super::is_a(inType); }
bool is_sys_menu_bar();
- const char *sys_menubar_name();
+ std::string sys_menubar_name() const;
const char *sys_menubar_proxy_name();
protected:
char *_proxy_name;
diff --git a/fluid/nodes/Node.cxx b/fluid/nodes/Node.cxx
index a84528b59..61d736f83 100644
--- a/fluid/nodes/Node.cxx
+++ b/fluid/nodes/Node.cxx
@@ -136,7 +136,7 @@ void print_project_tree() {
for (Node *t = Fluid.proj.tree.first; t; t = t->next) {
for (int i = t->level; i > 0; i--)
fprintf(stderr, ". ");
- fprintf(stderr, "%s\n", subclassname(t));
+ fprintf(stderr, "%s\n", subclassname(t).c_str());
}
}
#endif
@@ -783,7 +783,7 @@ int Node::msgnum() {
for (count = 0, p = this; p;) {
if (p->label()) count ++;
- if (p != this && p->is_widget() && ((Widget_Node *)p)->tooltip()) count ++;
+ if (p != this && p->is_widget() && !((Widget_Node *)p)->tooltip().empty()) count ++;
if (p->prev) p = p->prev;
else p = p->parent;
@@ -904,7 +904,7 @@ void Node::write(fld::io::Project_Writer &f) {
if (is_class()) {
auto p = ((Class_Node*)this)->prefix();
if (!p.empty())
- f.write_word(p.c_str());
+ f.write_word(p);
}
f.write_word(name());
diff --git a/fluid/nodes/Widget_Node.cxx b/fluid/nodes/Widget_Node.cxx
index b74560f05..00531abc1 100644
--- a/fluid/nodes/Widget_Node.cxx
+++ b/fluid/nodes/Widget_Node.cxx
@@ -59,7 +59,7 @@ using namespace fld::proj;
int Widget_Node::is_widget() const {return 1;}
int Widget_Node::is_public() const {return public_;}
-const char* subclassname(Node* l) {
+std::string subclassname(Node* l) {
if (l->is_a(Type::Menu_Bar)) {
Menu_Bar_Node *mb = static_cast<Menu_Bar_Node*>(l);
if (mb->is_sys_menu_bar())
@@ -67,8 +67,8 @@ const char* subclassname(Node* l) {
}
if (l->is_widget()) {
Widget_Node* p = (Widget_Node*)l;
- const char* c = p->subclass();
- if (c) return c;
+ std::string c = p->subclass();
+ if (!c.empty()) return c;
if (l->is_class()) return "Fl_Group";
if (p->o->type() == FL_DOUBLE_WINDOW) return "Fl_Double_Window";
if (p->type() == Type::Input) {
@@ -203,29 +203,6 @@ void Widget_Node::setlabel(const char *n) {
redraw();
}
-Widget_Node::Widget_Node()
-: override_visible_(0)
-{
- for (int n=0; n<NUM_EXTRA_CODE; n++) {extra_code_[n] = nullptr; }
- subclass_ = nullptr;
- hotspot_ = 0;
- tooltip_ = nullptr;
- image_name_ = nullptr;
- inactive_name_ = nullptr;
- image = nullptr;
- inactive = nullptr;
- o = nullptr;
- public_ = 1;
- bind_image_ = 0;
- compress_image_ = 1;
- bind_deimage_ = 0;
- compress_deimage_ = 1;
- scale_image_w_ = 0;
- scale_image_h_ = 0;
- scale_deimage_w_ = 0;
- scale_deimage_h_ = 0;
-}
-
Widget_Node::~Widget_Node() {
if (o) {
Fl_Window *win = o->window();
@@ -233,44 +210,38 @@ Widget_Node::~Widget_Node() {
if (win)
win->redraw();
}
- if (subclass_) free((void*)subclass_);
- if (tooltip_) free((void*)tooltip_);
- if (image_name_) {
- free((void*)image_name_);
- if (image) image->dec_ref();
- }
- if (inactive_name_) {
- free((void*)inactive_name_);
- if (inactive) inactive->dec_ref();
- }
- for (int n=0; n<NUM_EXTRA_CODE; n++) {
- if (extra_code_[n]) free((void*) extra_code_[n]);
- }
+ if (image) image->dec_ref();
+ if (inactive) inactive->dec_ref();
}
-void Widget_Node::extra_code(int m,const char *n) {
- storestring(n,extra_code_[m]);
+void Widget_Node::extra_code(int m, const std::string& n) {
+ storestring(n, extra_code_[m]);
}
extern void redraw_browser();
-void Widget_Node::subclass(const char *n) {
- if (storestring(n,subclass_) && visible)
+
+void Widget_Node::subclass(const std::string& n) {
+ if (storestring(n, subclass_) && visible)
redraw_browser();
}
-void Widget_Node::tooltip(const char *n) {
- storestring(n,tooltip_);
- o->tooltip(n);
+void Widget_Node::tooltip(const std::string& text) {
+ storestring(text, tooltip_);
+ if (text.empty()) {
+ o->tooltip(nullptr);
+ } else {
+ o->copy_tooltip(text.c_str());
+ }
}
-void Widget_Node::image_name(const char *n) {
- setimage(Image_Asset::find(n));
- storestring(n,image_name_);
+void Widget_Node::image_name(const std::string& name) {
+ setimage(Image_Asset::find(name.c_str()));
+ storestring(name, image_name_);
}
-void Widget_Node::inactive_name(const char *n) {
- setinactive(Image_Asset::find(n));
- storestring(n,inactive_name_);
+void Widget_Node::inactive_name(const std::string& name) {
+ setinactive(Image_Asset::find(name.c_str()));
+ storestring(name, inactive_name_);
}
void Widget_Node::redraw() {
@@ -1467,14 +1438,14 @@ int isdeclare(const char *c) {
}
void Widget_Node::write_static(fld::io::Code_Writer& f) {
- const char* t = subclassname(this);
- if (!subclass() || (is_class() && !strncmp(t, "Fl_", 3))) {
+ std::string t = subclassname(this);
+ if (subclass().empty() || (is_class() && (t.compare(0, 3, "Fl_")==0))) {
f.write_h_once("#include <FL/Fl.H>");
- f.write_h_once("#include <FL/%s.H>", t);
+ f.write_h_once("#include <FL/%s.H>", t.c_str());
}
for (int n=0; n < NUM_EXTRA_CODE; n++) {
- if (extra_code(n) && isdeclare(extra_code(n)))
- f.write_h_once("%s", extra_code(n));
+ if (!extra_code(n).empty() && isdeclare(extra_code(n).c_str()))
+ f.write_h_once("%s", extra_code(n).c_str());
}
if (callback() && is_name(callback())) {
int write_extern_declaration = 1;
@@ -1487,7 +1458,7 @@ void Widget_Node::write_static(fld::io::Code_Writer& f) {
write_extern_declaration = 0;
}
if (write_extern_declaration)
- f.write_h_once("extern void %s(%s*, %s);", callback(), t,
+ f.write_h_once("extern void %s(%s*, %s);", callback(), t.c_str(),
user_data_type() ? user_data_type() : "void*");
}
const char* k = class_name(1);
@@ -1495,9 +1466,9 @@ void Widget_Node::write_static(fld::io::Code_Writer& f) {
if (c && !k && !is_class()) {
f.write_c("\n");
if (!public_) f.write_c("static ");
- else f.write_h("extern %s *%s;\n", t, c);
- 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);
+ else f.write_h("extern %s *%s;\n", t.c_str(), c);
+ if (strchr(c, '[') == nullptr) f.write_c("%s *%s=(%s *)0;\n", t.c_str(), c, t.c_str());
+ else f.write_c("%s *%s={(%s *)0};\n", t.c_str(), c, t.c_str());
}
if (callback() && !is_name(callback()) && (callback()[0] != '[')) {
// see if 'o' or 'v' used, to prevent unused argument warnings:
@@ -1512,9 +1483,9 @@ void Widget_Node::write_static(fld::io::Code_Writer& f) {
}
const char* cn = callback_name(f);
if (k) {
- f.write_c("\nvoid %s::%s_i(%s*", k, cn, t);
+ f.write_c("\nvoid %s::%s_i(%s*", k, cn, t.c_str());
} else {
- f.write_c("\nstatic void %s(%s*", cn, t);
+ f.write_c("\nstatic void %s(%s*", cn, t.c_str());
}
if (use_o) f.write_c(" o");
const char* ut = user_data_type() ? user_data_type() : "void*";
@@ -1535,7 +1506,7 @@ void Widget_Node::write_static(fld::io::Code_Writer& f) {
f.tag(Mergeback::Tag::WIDGET_CALLBACK, Mergeback::Tag::GENERIC, get_uid());
f.write_c("}\n");
if (k) {
- f.write_c("void %s::%s(%s* o, %s v) {\n", k, cn, t, ut);
+ f.write_c("void %s::%s(%s* o, %s v) {\n", k, cn, t.c_str(), ut);
f.write_c("%s((%s*)(o", f.indent(1), k);
Node *q = nullptr;
for (Node* p = parent; p && p->is_widget(); q = p, p = p->parent)
@@ -1556,20 +1527,20 @@ void Widget_Node::write_static(fld::io::Code_Writer& f) {
}
void Widget_Node::write_code1(fld::io::Code_Writer& f) {
- const char* t = subclassname(this);
+ std::string t = subclassname(this);
const char *c = array_name(this);
if (c) {
if (class_name(1)) {
f.write_public(public_);
- f.write_h("%s%s *%s;\n", f.indent(1), t, c);
+ f.write_h("%s%s *%s;\n", f.indent(1), t.c_str(), c);
}
}
if (class_name(1) && callback() && !is_name(callback())) {
const char* cn = callback_name(f);
const char* ut = user_data_type() ? user_data_type() : "void*";
f.write_public(0);
- f.write_h("%sinline void %s_i(%s*, %s);\n", f.indent(1), cn, t, ut);
- f.write_h("%sstatic void %s(%s*, %s);\n", f.indent(1), cn, t, ut);
+ f.write_h("%sinline void %s_i(%s*, %s);\n", f.indent(1), cn, t.c_str(), ut);
+ f.write_h("%sstatic void %s(%s*, %s);\n", f.indent(1), cn, t.c_str(), ut);
}
// figure out if local variable will be used (prevent compiler warnings):
int wused = !name() && is_a(Type::Window);
@@ -1589,13 +1560,14 @@ void Widget_Node::write_code1(fld::io::Code_Writer& f) {
if (!f.varused) {
for (int n=0; n < NUM_EXTRA_CODE; n++)
- if (extra_code(n) && !isdeclare(extra_code(n)))
+ if (!extra_code(n).empty() && !isdeclare(extra_code(n).c_str()))
{
int instring = 0;
int inname = 0;
int incomment = 0;
int incppcomment = 0;
- for (ptr = extra_code(n); *ptr; ptr ++) {
+ std::string code = extra_code(n);
+ for (ptr = code.c_str(); *ptr; ptr ++) {
if (instring) {
if (*ptr == '\\') ptr++;
else if (*ptr == '\"') instring = 0;
@@ -1631,23 +1603,23 @@ void Widget_Node::write_code1(fld::io::Code_Writer& f) {
f.write_c("%s{ ", f.indent());
write_comment_inline_c(f);
- if (f.varused) f.write_c("%s* o = ", t);
+ if (f.varused) f.write_c("%s* o = ", t.c_str());
if (name()) f.write_c("%s = ", name());
if (is_a(Type::Window)) {
// Handle special case where user is faking a Fl_Group type as a window,
// there is no 2-argument constructor in that case:
- if (!strstr(t, "Window"))
- f.write_c("new %s(0, 0, %d, %d", t, o->w(), o->h());
+ if (t.find("Window")==t.npos)
+ f.write_c("new %s(0, 0, %d, %d", t.c_str(), o->w(), o->h());
else
- f.write_c("new %s(%d, %d", t, o->w(), o->h());
+ f.write_c("new %s(%d, %d", t.c_str(), o->w(), o->h());
} else if (is_a(Type::Menu_Bar)
&& ((Menu_Bar_Node*)this)->is_sys_menu_bar()
&& is_in_class()) {
f.write_c("(%s*)new %s(%d, %d, %d, %d",
- t, ((Menu_Bar_Node*)this)->sys_menubar_proxy_name(),
+ t.c_str(), ((Menu_Bar_Node*)this)->sys_menubar_proxy_name(),
o->x(), o->y(), o->w(), o->h());
} else {
- f.write_c("new %s(%d, %d, %d, %d", t, o->x(), o->y(), o->w(), o->h());
+ f.write_c("new %s(%d, %d, %d, %d", t.c_str(), o->x(), o->y(), o->w(), o->h());
}
if (label() && *label()) {
f.write_c(", ");
@@ -1723,15 +1695,15 @@ void Widget_Node::write_widget_code(fld::io::Code_Writer& f) {
Fl_Widget* tplate = ((Widget_Node*)factory)->o;
const char *var = is_class() ? "this" : name() ? name() : "o";
- if (tooltip() && *tooltip()) {
+ if (!tooltip().empty()) {
f.write_c("%s%s->tooltip(",f.indent(), var);
switch (Fluid.proj.i18n.type) {
case fld::I18n_Type::NONE : /* None */
- f.write_cstring(tooltip());
+ f.write_cstring(tooltip().c_str());
break;
case fld::I18n_Type::GNU : /* GNU gettext */
f.write_c("%s(", Fluid.proj.i18n.gnu_function.c_str());
- f.write_cstring(tooltip());
+ f.write_cstring(tooltip().c_str());
f.write_c(")");
break;
case fld::I18n_Type::POSIX : /* POSIX catgets */
@@ -1739,7 +1711,7 @@ void Widget_Node::write_widget_code(fld::io::Code_Writer& f) {
Fluid.proj.i18n.posix_file.empty() ? "_catalog" : Fluid.proj.i18n.posix_file.c_str(),
Fluid.proj.i18n.posix_set.c_str(),
msgnum() + 1);
- f.write_cstring(tooltip());
+ f.write_cstring(tooltip().c_str());
f.write_c(")");
break;
}
@@ -1750,7 +1722,7 @@ void Widget_Node::write_widget_code(fld::io::Code_Writer& f) {
f.write_c("%s%s->type(%d);\n", f.indent(), var, ((Fl_Spinner*)o)->type());
else if (o->type() != tplate->type() && !is_a(Type::Window))
f.write_c("%s%s->type(%d);\n", f.indent(), var, o->type());
- if (o->box() != tplate->box() || subclass())
+ if (o->box() != tplate->box() || !subclass().empty())
f.write_c("%s%s->box(FL_%s);\n", f.indent(), var, boxname(o->box()));
// write shortcut command if needed
@@ -1792,9 +1764,9 @@ void Widget_Node::write_widget_code(fld::io::Code_Writer& f) {
if (b->down_box()) f.write_c("%s%s->down_box(FL_%s);\n", f.indent(), var,
boxname(b->down_box()));
}
- if (o->color() != tplate->color() || subclass())
+ if (o->color() != tplate->color() || !subclass().empty())
write_color(f, "color", o->color());
- if (o->selection_color() != tplate->selection_color() || subclass())
+ if (o->selection_color() != tplate->selection_color() || !subclass().empty())
write_color(f, "selection_color", o->selection_color());
if (image) {
image->write_code(f, bind_image_, var);
@@ -1824,14 +1796,14 @@ void Widget_Node::write_widget_code(fld::io::Code_Writer& f) {
f.write_c("%s->deimage()->data_h(), 0, 1);\n", var);
}
}
- if (o->labeltype() != tplate->labeltype() || subclass())
+ if (o->labeltype() != tplate->labeltype() || !subclass().empty())
f.write_c("%s%s->labeltype(FL_%s);\n", f.indent(), var,
item_name(labeltypemenu, o->labeltype()));
- if (o->labelfont() != tplate->labelfont() || subclass())
+ if (o->labelfont() != tplate->labelfont() || !subclass().empty())
f.write_c("%s%s->labelfont(%d);\n", f.indent(), var, o->labelfont());
- if (o->labelsize() != tplate->labelsize() || subclass())
+ if (o->labelsize() != tplate->labelsize() || !subclass().empty())
f.write_c("%s%s->labelsize(%d);\n", f.indent(), var, o->labelsize());
- if (o->labelcolor() != tplate->labelcolor() || subclass())
+ if (o->labelcolor() != tplate->labelcolor() || !subclass().empty())
write_color(f, "labelcolor", o->labelcolor());
if (o->horizontal_label_margin() != tplate->horizontal_label_margin())
f.write_c("%s%s->horizontal_label_margin(%d);\n", f.indent(), var, o->horizontal_label_margin());
@@ -1900,7 +1872,7 @@ void Widget_Node::write_widget_code(fld::io::Code_Writer& f) {
} else if (ud) {
f.write_c("%s%s->user_data((void*)(%s));\n", f.indent(), var, ud);
}
- if (o->align() != tplate->align() || subclass()) {
+ if (o->align() != tplate->align() || !subclass().empty()) {
int i = o->align();
f.write_c("%s%s->align(Fl_Align(%s", f.indent(), var,
item_name(alignmenu, i & ~FL_ALIGN_INSIDE));
@@ -1908,7 +1880,7 @@ void Widget_Node::write_widget_code(fld::io::Code_Writer& f) {
f.write_c("));\n");
}
Fl_When ww = o->when();
- if (ww != tplate->when() || subclass())
+ if (ww != tplate->when() || !subclass().empty())
f.write_c("%s%s->when(%s);\n", f.indent(), var, when_symbol_name(ww));
if (!o->visible() && o->parent())
f.write_c("%s%s->hide();\n", f.indent(), var);
@@ -1928,13 +1900,13 @@ void Widget_Node::write_widget_code(fld::io::Code_Writer& f) {
void Widget_Node::write_extra_code(fld::io::Code_Writer& f) {
for (int n=0; n < NUM_EXTRA_CODE; n++)
- if (extra_code(n) && !isdeclare(extra_code(n)))
- f.write_c("%s%s\n", f.indent(), extra_code(n));
+ if (!extra_code(n).empty() && !isdeclare(extra_code(n).c_str()))
+ f.write_c("%s%s\n", f.indent(), extra_code(n).c_str());
}
void Widget_Node::write_block_close(fld::io::Code_Writer& f) {
f.indentation--;
- f.write_c("%s} // %s* %s\n", f.indent(), subclassname(this),
+ f.write_c("%s} // %s* %s\n", f.indent(), subclassname(this).c_str(),
name() ? name() : "o");
}
@@ -1953,11 +1925,11 @@ void Widget_Node::write_properties(fld::io::Project_Writer &f) {
case 1: break;
case 2: f.write_string("protected"); break;
}
- if (tooltip() && *tooltip()) {
+ if (!tooltip().empty()) {
f.write_string("tooltip");
f.write_word(tooltip());
}
- if (image_name() && *image_name()) {
+ if (!image_name().empty()) {
if (scale_image_w_ || scale_image_h_)
f.write_string("scale_image {%d %d}", scale_image_w_, scale_image_h_);
f.write_string("image");
@@ -1965,7 +1937,7 @@ void Widget_Node::write_properties(fld::io::Project_Writer &f) {
f.write_string("compress_image %d", compress_image_);
}
if (bind_image_) f.write_string("bind_image 1");
- if (inactive_name() && *inactive_name()) {
+ if (!inactive_name().empty()) {
if (scale_deimage_w_ || scale_deimage_h_)
f.write_string("scale_deimage {%d %d}", scale_deimage_w_, scale_deimage_h_);
f.write_string("deimage");
@@ -2067,12 +2039,12 @@ void Widget_Node::write_properties(fld::io::Project_Writer &f) {
if (resizable()) f.write_string("resizable");
if (hotspot()) f.write_string(is_a(Type::Menu_Item) ? "divider" : "hotspot");
if (menu_headline()) f.write_string("headline");
- for (int n=0; n < NUM_EXTRA_CODE; n++) if (extra_code(n)) {
+ for (int n=0; n < NUM_EXTRA_CODE; n++) if (!extra_code(n).empty()) {
f.write_indent(level+1);
f.write_string("code%d",n);
- f.write_word(extra_code(n));
+ f.write_word(extra_code(n).c_str());
}
- if (subclass()) {
+ if (!subclass().empty()) {
f.write_indent(level+1);
f.write_string("class");
f.write_word(subclass());
@@ -2107,7 +2079,7 @@ void Widget_Node::read_property(fld::io::Project_Reader &f, const char *c) {
image_name(f.read_word());
// starting in 2023, `image` is always followed by `compress_image`
// the code below is for compatibility with older .fl files
- const char *ext = fl_filename_ext(image_name_);
+ const char *ext = fl_filename_ext(image_name().c_str()); // FIXME:
if ( strcmp(ext, ".jpg")
&& strcmp(ext, ".png")
&& strcmp(ext, ".svg")
@@ -2126,7 +2098,7 @@ void Widget_Node::read_property(fld::io::Project_Reader &f, const char *c) {
inactive_name(f.read_word());
// starting in 2023, `deimage` is always followed by `compress_deimage`
// the code below is for compatibility with older .fl files
- const char *ext = fl_filename_ext(inactive_name_);
+ const char *ext = fl_filename_ext(inactive_name().c_str()); // FIXME:
if ( strcmp(ext, ".jpg")
&& strcmp(ext, ".png")
&& strcmp(ext, ".svg")
@@ -2253,11 +2225,11 @@ void Widget_Node::read_property(fld::io::Project_Reader &f, const char *c) {
if (!strncmp(c,"code",4)) {
int n = atoi(c+4);
if (n >= 0 && n <= NUM_EXTRA_CODE) {
- extra_code(n,f.read_word());
+ extra_code(n, f.read_word());
return;
}
} else if (!strcmp(c,"extra_code")) {
- extra_code(0,f.read_word());
+ extra_code(0, f.read_word());
return;
}
Node::read_property(f, c);
@@ -2311,8 +2283,8 @@ int Widget_Node::read_fdesign(const char* propname, const char* value) {
user_data(value);
} else if (!strcmp(propname,"shortcut")) {
if (value[0]) {
- char buf[128]; sprintf(buf,"o->shortcut(\"%s\");",value);
- extra_code(0,buf);
+ char buf[128]; sprintf(buf,"o->shortcut(\"%s\");", value);
+ extra_code(0, buf);
}
} else if (!strcmp(propname,"style")) {
if (!strncmp(value,"FL_NORMAL",9)) return 1;
@@ -2426,7 +2398,10 @@ void Widget_Node::copy_properties() {
// copy all attributes common to all widget types
Fl_Widget *w = live_widget;
w->label(o->label());
- w->tooltip(tooltip());
+ if (tooltip().empty())
+ w->tooltip(nullptr);
+ else
+ w->copy_tooltip(tooltip().c_str());
w->type(o->type());
w->box(o->box());
w->color(o->color());
diff --git a/fluid/nodes/Widget_Node.h b/fluid/nodes/Widget_Node.h
index 0276cbcdf..d6e5ce590 100644
--- a/fluid/nodes/Widget_Node.h
+++ b/fluid/nodes/Widget_Node.h
@@ -1,7 +1,7 @@
//
// Widget Node header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2025 by Bill Spitzak and others.
+// Copyright 1998-2026 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -15,14 +15,14 @@
//
// Type for creating all subclasses of Fl_Widget
-// This should have the widget pointer in it, but it is still in the
-// Node base class.
#ifndef FLUID_NODES_WIDGET_NODE_H
#define FLUID_NODES_WIDGET_NODE_H
#include "nodes/Node.h"
+#include <string>
+
#define NUM_EXTRA_CODE 4
class Widget_Node;
@@ -32,7 +32,7 @@ extern void* const LOAD;
extern Node* current_node; // one of the selected ones
extern Widget_Node* current_widget; // one of the selected ones
-extern const char* subclassname(Node* l);
+extern std::string subclassname(Node* l);
extern int is_name(const char *c);
void selection_changed(Node* new_current);
Node *sort(Node *parent);
@@ -45,12 +45,12 @@ class Widget_Node : public Node
virtual Widget_Node *_make() = 0; // virtual constructor
void setlabel(const char *) override;
- const char *extra_code_[NUM_EXTRA_CODE];
- const char *subclass_;
- const char *tooltip_;
- const char *image_name_;
- const char *inactive_name_;
- uchar hotspot_;
+ std::string extra_code_[NUM_EXTRA_CODE];
+ std::string subclass_;
+ std::string tooltip_;
+ std::string image_name_;
+ std::string inactive_name_;
+ uchar hotspot_ = 0;
bool menu_headline_ { false };
@@ -60,7 +60,7 @@ protected:
/// We can't open a window in batch mode, even if we want the "visible" flags
/// set, so we need a second place to store this information while also
/// disabling the output of the "hide" property by the Widget Type.
- uchar override_visible_;
+ uchar override_visible_ = 0;
void write_static(fld::io::Code_Writer& f) override;
void write_code1(fld::io::Code_Writer& f) override;
@@ -72,34 +72,34 @@ protected:
Fl_Widget *live_widget;
public:
- Fl_Widget *o;
- int public_;
- int bind_image_;
- int compress_image_;
- int bind_deimage_;
- int compress_deimage_;
- int scale_image_w_, scale_image_h_;
- int scale_deimage_w_, scale_deimage_h_;
-
- Image_Asset *image;
+ Fl_Widget *o = nullptr;
+ int public_ = 1;
+ int bind_image_ = 0;
+ int compress_image_ = 1;
+ int bind_deimage_ = 0;
+ int compress_deimage_ = 1;
+ int scale_image_w_ = 0, scale_image_h_ = 0;
+ int scale_deimage_w_ = 0, scale_deimage_h_ = 0;
+
+ Image_Asset *image = nullptr;
void setimage(Image_Asset *);
- Image_Asset *inactive;
+ Image_Asset *inactive = nullptr;
void setinactive(Image_Asset *);
- Widget_Node();
+ Widget_Node() = default;
Node *make(Strategy strategy) override;
void open() override;
- const char *extra_code(int n) const {return extra_code_[n];}
- void extra_code(int n,const char *);
- const char *subclass() const {return subclass_;}
- void subclass(const char *);
- const char *tooltip() const {return tooltip_;}
- void tooltip(const char *);
- const char *image_name() const {return image_name_;}
- void image_name(const char *);
- const char *inactive_name() const {return inactive_name_;}
- void inactive_name(const char *);
+ std::string extra_code(int n) const { return extra_code_[n]; }
+ void extra_code(int n, const std::string& code);
+ std::string subclass() const { return subclass_; }
+ void subclass(const std::string& name);
+ std::string tooltip() const { return tooltip_; }
+ void tooltip(const std::string& text);
+ std::string image_name() const { return image_name_; }
+ void image_name(const std::string& name);
+ std::string inactive_name() const { return inactive_name_; }
+ void inactive_name(const std::string& name);
// Note: hotspot is misused by menu items to indicate a divider
uchar hotspot() const {return hotspot_;}
void hotspot(uchar v) {hotspot_ = v;}
diff --git a/fluid/nodes/Window_Node.cxx b/fluid/nodes/Window_Node.cxx
index e63debebe..0ea3b306f 100644
--- a/fluid/nodes/Window_Node.cxx
+++ b/fluid/nodes/Window_Node.cxx
@@ -1382,13 +1382,13 @@ void Widget_Class_Node::write_code1(fld::io::Code_Writer& f) {
current_widget_class = this;
write_public_state = 1;
- const char *c = subclass();
- if (!c) c = "Fl_Group";
+ std::string c = subclass();
+ if (c.empty()) c = "Fl_Group";
f.write_c("\n");
write_comment_h(f);
- f.write_h("\nclass %s : public %s {\n", name(), c);
- if (strstr(c, "Window")) {
+ f.write_h("\nclass %s : public %s {\n", name(), c.c_str());
+ if (c.find("Window")!=c.npos) {
f.write_h("%svoid _%s();\n", f.indent(1), trimclassname(name()));
f.write_h("public:\n");
f.write_h("%s%s(int X, int Y, int W, int H, const char *L = 0);\n", f.indent(1), trimclassname(name()));
@@ -1397,20 +1397,20 @@ void Widget_Class_Node::write_code1(fld::io::Code_Writer& f) {
// a constructor with all four dimensions plus label
f.write_c("%s::%s(int X, int Y, int W, int H, const char *L) :\n", name(), trimclassname(name()));
- f.write_c("%s%s(X, Y, W, H, L)\n{\n", f.indent(1), c);
+ f.write_c("%s%s(X, Y, W, H, L)\n{\n", f.indent(1), c.c_str());
f.write_c("%s_%s();\n", f.indent(1), trimclassname(name()));
f.write_c("}\n\n");
// a constructor with just the size and label. The window manager will position the window
f.write_c("%s::%s(int W, int H, const char *L) :\n", name(), trimclassname(name()));
- f.write_c("%s%s(0, 0, W, H, L)\n{\n", f.indent(1), c);
+ f.write_c("%s%s(0, 0, W, H, L)\n{\n", f.indent(1), c.c_str());
f.write_c("%sclear_flag(16);\n", f.indent(1));
f.write_c("%s_%s();\n", f.indent(1), trimclassname(name()));
f.write_c("}\n\n");
// a constructor that takes size and label from the Fluid database
f.write_c("%s::%s() :\n", name(), trimclassname(name()));
- f.write_c("%s%s(0, 0, %d, %d, ", f.indent(1), c, o->w(), o->h());
+ f.write_c("%s%s(0, 0, %d, %d, ", f.indent(1), c.c_str(), o->w(), o->h());
const char *cstr = label();
if (cstr) f.write_cstring(cstr);
else f.write_c("0");
@@ -1427,11 +1427,11 @@ void Widget_Class_Node::write_code1(fld::io::Code_Writer& f) {
f.indent(1), trimclassname(name()));
f.write_c("%s::%s(int X, int Y, int W, int H, const char *L) :\n", name(), trimclassname(name()));
if (wc_relative==1)
- f.write_c("%s%s(0, 0, W, H, L)\n{\n", f.indent(1), c);
+ f.write_c("%s%s(0, 0, W, H, L)\n{\n", f.indent(1), c.c_str());
else if (wc_relative==2)
- f.write_c("%s%s(0, 0, %d, %d, L)\n{\n", f.indent(1), c, o->w(), o->h());
+ f.write_c("%s%s(0, 0, %d, %d, L)\n{\n", f.indent(1), c.c_str(), o->w(), o->h());
else
- f.write_c("%s%s(X, Y, W, H, L)\n{\n", f.indent(1), c);
+ f.write_c("%s%s(X, Y, W, H, L)\n{\n", f.indent(1), c.c_str());
}
// f.write_c("%s%s *o = this;\n", f.indent(1), name());