diff options
Diffstat (limited to 'fluid/nodes')
| -rw-r--r-- | fluid/nodes/Function_Node.cxx | 12 | ||||
| -rw-r--r-- | fluid/nodes/Function_Node.h | 8 | ||||
| -rw-r--r-- | fluid/nodes/Menu_Node.cxx | 20 | ||||
| -rw-r--r-- | fluid/nodes/Menu_Node.h | 2 | ||||
| -rw-r--r-- | fluid/nodes/Node.cxx | 6 | ||||
| -rw-r--r-- | fluid/nodes/Widget_Node.cxx | 185 | ||||
| -rw-r--r-- | fluid/nodes/Widget_Node.h | 66 | ||||
| -rw-r--r-- | fluid/nodes/Window_Node.cxx | 20 |
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()); |
