summaryrefslogtreecommitdiff
path: root/fluid
diff options
context:
space:
mode:
Diffstat (limited to 'fluid')
-rw-r--r--fluid/Fl_Function_Type.cxx12
-rw-r--r--fluid/Fl_Widget_Type.cxx47
-rw-r--r--fluid/Fl_Window_Type.cxx2
-rw-r--r--fluid/code.cxx19
4 files changed, 49 insertions, 31 deletions
diff --git a/fluid/Fl_Function_Type.cxx b/fluid/Fl_Function_Type.cxx
index 6638c235d..4805f0a68 100644
--- a/fluid/Fl_Function_Type.cxx
+++ b/fluid/Fl_Function_Type.cxx
@@ -340,15 +340,15 @@ void Fl_Function_Type::write_code1() {
}
void Fl_Function_Type::write_code2() {
+ Fl_Type *child;
+ const char *var = "w";
+ for (child = next; child && child->level > level; child = child->next)
+ if (child->is_window() && child->name()) var = child->name();
+
if (ismain()) {
- if (havewidgets) write_c(" w->show(argc, argv);\n");
+ if (havewidgets) write_c(" %s->show(argc, argv);\n", var);
write_c(" return Fl::run();\n");
} else if (havewidgets && !constructor && !return_type) {
- Fl_Type *child;
- const char *var = "w";
- for (child = next; child && child->level > level; child = child->next)
- if (child->is_window() && child->name()) var = child->name();
-
write_c(" return %s;\n", var);
}
write_c("}\n");
diff --git a/fluid/Fl_Widget_Type.cxx b/fluid/Fl_Widget_Type.cxx
index b5f7441dc..c91e1c311 100644
--- a/fluid/Fl_Widget_Type.cxx
+++ b/fluid/Fl_Widget_Type.cxx
@@ -1941,6 +1941,8 @@ const char *Fl_Type::callback_name() {
return unique_id(this, "cb", name(), label());
}
+extern int varused_test, varused;
+
void Fl_Widget_Type::write_code1() {
const char* t = subclassname(this);
const char *c = array_name(this);
@@ -1958,23 +1960,34 @@ void Fl_Widget_Type::write_code1() {
write_h(" static void %s(%s*, %s);\n", cn, t, ut);
}
// figure out if local variable will be used (prevent compiler warnings):
- int oused = !name();
int wused = !name() && is_window();
const char *ptr;
- if (!oused) {
+ varused = wused;
+
+ if (!name() && !varused) {
+ varused |= is_parent();
+
+ if (!varused) {
+ varused_test = 1;
+ write_widget_code();
+ varused_test = 0;
+ }
+ }
+
+ if (!varused) {
for (int n=0; n < NUM_EXTRA_CODE; n++)
if (extra_code(n) && !isdeclare(extra_code(n)) &&
(ptr = strstr(extra_code(n), "o->")) != NULL &&
(ptr == extra_code(n) ||
(!isalnum(ptr[-1] & 255) && ptr[-1] != '_'))) {
- oused = 1;
+ varused = 1;
break;
}
}
- write_c(indent());
- if (oused) write_c("{ %s* o = ", t);
+ write_c("%s{ ", indent());
+ if (varused) write_c("%s* o = ", t);
if (name()) write_c("%s = ", name());
if (is_window()) {
// Handle special case where user is faking a Fl_Group type as a window,
@@ -2007,10 +2020,10 @@ void Fl_Widget_Type::write_code1() {
}
write_c(");\n");
- if (oused)
- indentation += 2;
+ indentation += 2;
if (wused) write_c("%sw = o;\n", indent());
+
write_widget_code();
}
@@ -2195,23 +2208,9 @@ void Fl_Widget_Type::write_extra_code() {
}
void Fl_Widget_Type::write_block_close() {
- int oused = !name();
- const char *ptr;
-
- if (!oused) {
- for (int n=0; n < NUM_EXTRA_CODE; n++)
- if (extra_code(n) && !isdeclare(extra_code(n)) &&
- (ptr = strstr(extra_code(n), "o->")) != NULL &&
- (ptr == extra_code(n) ||
- (!isalnum(ptr[-1] & 255) && ptr[-1] != '_'))) {
- oused = 1;
- break;
- }
- }
- if (oused) {
- indentation -= 2;
- write_c("%s}\n", indent());
- }
+ indentation -= 2;
+ write_c("%s} // %s* %s\n", indent(), subclassname(this),
+ name() ? name() : "o");
}
void Fl_Widget_Type::write_code2() {
diff --git a/fluid/Fl_Window_Type.cxx b/fluid/Fl_Window_Type.cxx
index b9a7f8188..00f9e22a3 100644
--- a/fluid/Fl_Window_Type.cxx
+++ b/fluid/Fl_Window_Type.cxx
@@ -1299,7 +1299,7 @@ void Fl_Window_Type::write_code2() {
}
write_c("%s%s->end();\n", indent(), var);
if (((Fl_Window*)o)->resizable() == o)
- write_c("%s%s->resizable(o);\n", indent(), var);
+ write_c("%s%s->resizable(%s);\n", indent(), var, var);
write_block_close();
}
diff --git a/fluid/code.cxx b/fluid/code.cxx
index 597f77ef3..df23e3a75 100644
--- a/fluid/code.cxx
+++ b/fluid/code.cxx
@@ -153,8 +153,18 @@ int write_declare(const char *format, ...) {
////////////////////////////////////////////////////////////////
+// silly thing to prevent declaring unused variables:
+// When this symbol is on, all attempts to write code don't write
+// anything, but set a variable if it looks like the variable "o" is used:
+int varused_test;
+int varused;
+
// write an array of C characters (adds a null):
void write_cstring(const char *w, int length) {
+ if (varused_test) {
+ varused = 1;
+ return;
+ }
const char *e = w+length;
int linelength = 1;
putc('\"', code_file);
@@ -221,6 +231,10 @@ void write_cstring(const char *w) {write_cstring(w,strlen(w));}
// write an array of C binary data (does not add a null):
void write_cdata(const char *s, int length) {
+ if (varused_test) {
+ varused = 1;
+ return;
+ }
const unsigned char *w = (const unsigned char *)s;
const unsigned char *e = w+length;
int linelength = 1;
@@ -238,6 +252,10 @@ void write_cdata(const char *s, int length) {
}
void write_c(const char* format,...) {
+ if (varused_test) {
+ varused = 1;
+ return;
+ }
va_list args;
va_start(args, format);
vfprintf(code_file, format, args);
@@ -245,6 +263,7 @@ void write_c(const char* format,...) {
}
void write_h(const char* format,...) {
+ if (varused_test) return;
va_list args;
va_start(args, format);
vfprintf(header_file, format, args);