summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbin/fluidbin0 -> 2685848 bytes
-rw-r--r--fluid/app/Snap_Action.cxx38
-rw-r--r--fluid/app/shell_command.cxx25
-rw-r--r--fluid/fld_path.h144
-rw-r--r--fluid/nodes/Widget_Node.cxx18
-rw-r--r--fluid/nodes/Window_Node.cxx20
-rw-r--r--fluid/proj/mergeback.cxx4
-rw-r--r--fluid/tools/filename.cxx135
-rw-r--r--fluid/tools/filename.h22
-rw-r--r--fluid/widgets/Code_Editor.cxx1
-rw-r--r--lib/libfltk.abin2237456 -> 2237456 bytes
-rw-r--r--lib/libfltk_forms.abin0 -> 32888 bytes
-rw-r--r--lib/libfltk_gl.abin0 -> 212448 bytes
-rw-r--r--lib/libfltk_images.abin0 -> 268016 bytes
-rw-r--r--lib/libfltk_jpeg.abin0 -> 305416 bytes
-rw-r--r--lib/libfltk_png.abin0 -> 287384 bytes
-rw-r--r--lib/libfltk_z.abin0 -> 103976 bytes
17 files changed, 367 insertions, 40 deletions
diff --git a/bin/fluid b/bin/fluid
new file mode 100755
index 000000000..8e20d02c8
--- /dev/null
+++ b/bin/fluid
Binary files differ
diff --git a/fluid/app/Snap_Action.cxx b/fluid/app/Snap_Action.cxx
index 0de72919e..08e9bf1e5 100644
--- a/fluid/app/Snap_Action.cxx
+++ b/fluid/app/Snap_Action.cxx
@@ -30,9 +30,13 @@
#include <math.h>
#include <string.h>
#include <assert.h>
-#undef min
-#undef max
-#include <algorithm>
+
+#ifndef MIN
+#define MIN(a,b) ((a)<=(b) ? (a) : (b))
+#endif
+#ifndef MAX
+#define MAX(a,b) ((a)>=(b) ? (a) : (b))
+#endif
using namespace fld;
using namespace fld::app;
@@ -700,14 +704,15 @@ void Layout_List::write(Fl_Preferences &prefs, fld::Tool_Store storage) {
*/
void Layout_List::read(Fl_Preferences &prefs, fld::Tool_Store storage) {
Fl_Preferences prefs_list(prefs, "Layouts");
- std::string cs;
+ char *cs_ptr = 0;
int cp = 0;
- prefs_list.get("current_suite", cs, "");
+ prefs_list.get("current_suite", cs_ptr, "");
prefs_list.get("current_preset", cp, 0);
- for (int i = 0; i < prefs_list.groups(); ++i) {
+ int i;
+ for (i = 0; i < prefs_list.groups(); ++i) {
Fl_Preferences prefs_suite(prefs_list, Fl_Preferences::Name(i));
- char *new_name = nullptr;
- prefs_suite.get("name", new_name, nullptr);
+ char *new_name = 0;
+ prefs_suite.get("name", new_name, 0);
if (new_name) {
int n = add(new_name);
list_[n].read(prefs_suite);
@@ -715,7 +720,10 @@ void Layout_List::read(Fl_Preferences &prefs, fld::Tool_Store storage) {
::free(new_name);
}
}
- current_suite(cs);
+ if (cs_ptr) {
+ current_suite(std::string(cs_ptr));
+ ::free(cs_ptr);
+ }
current_preset(cp);
update_dialogs();
}
@@ -1117,8 +1125,8 @@ void Snap_Action::better_size(int &w, int &h) {
x_min = x_inc;
y_min = y_inc;
}
- int ww = std::max(w - x_min, 0); w = (w - ww + x_inc - 1) / x_inc; w = w * x_inc; w = w + ww;
- int hh = std::max(h - y_min, 0); h = (h - hh + y_inc - 1) / y_inc; h = h * y_inc; h = h + hh;
+ int ww = MAX(w - x_min, 0); w = (w - ww + x_inc - 1) / x_inc; w = w * x_inc; w = w + ww;
+ int hh = MAX(h - y_min, 0); h = (h - hh + y_inc - 1) / y_inc; h = h * y_inc; h = h + hh;
}
@@ -1511,7 +1519,7 @@ class Fd_Snap_Siblings_Left : public Fd_Snap_Sibling {
public:
Fd_Snap_Siblings_Left() { type = 1; mask = FD_LEFT|FD_DRAG; }
int sibling_check(Snap_Data &d, Fl_Widget *s) override {
- return std::min(check_x_(d, d.bx, s->x()+s->w()),
+ return MIN(check_x_(d, d.bx, s->x()+s->w()),
check_x_(d, d.bx, s->x()+s->w()+Fluid.proj.layout->widget_gap_x) );
}
void draw(Snap_Data &d) override {
@@ -1536,7 +1544,7 @@ class Fd_Snap_Siblings_Right : public Fd_Snap_Sibling {
public:
Fd_Snap_Siblings_Right() { type = 1; mask = FD_RIGHT|FD_DRAG; }
int sibling_check(Snap_Data &d, Fl_Widget *s) override {
- return std::min(check_x_(d, d.br, s->x()),
+ return MIN(check_x_(d, d.br, s->x()),
check_x_(d, d.br, s->x()-Fluid.proj.layout->widget_gap_x));
}
void draw(Snap_Data &d) override {
@@ -1561,7 +1569,7 @@ class Fd_Snap_Siblings_Top : public Fd_Snap_Sibling {
public:
Fd_Snap_Siblings_Top() { type = 2; mask = FD_TOP|FD_DRAG; }
int sibling_check(Snap_Data &d, Fl_Widget *s) override {
- return std::min(check_y_(d, d.by, s->y()+s->h()),
+ return MIN(check_y_(d, d.by, s->y()+s->h()),
check_y_(d, d.by, s->y()+s->h()+Fluid.proj.layout->widget_gap_y));
}
void draw(Snap_Data &d) override {
@@ -1586,7 +1594,7 @@ class Fd_Snap_Siblings_Bottom : public Fd_Snap_Sibling {
public:
Fd_Snap_Siblings_Bottom() { type = 2; mask = FD_BOTTOM|FD_DRAG; }
int sibling_check(Snap_Data &d, Fl_Widget *s) override {
- return std::min(check_y_(d, d.bt, s->y()),
+ return MIN(check_y_(d, d.bt, s->y()),
check_y_(d, d.bt, s->y()-Fluid.proj.layout->widget_gap_y));
}
void draw(Snap_Data &d) override {
diff --git a/fluid/app/shell_command.cxx b/fluid/app/shell_command.cxx
index bd53a28af..a4b664fda 100644
--- a/fluid/app/shell_command.cxx
+++ b/fluid/app/shell_command.cxx
@@ -564,26 +564,31 @@ bool Fd_Shell_Command::is_active() {
void Fd_Shell_Command::read(Fl_Preferences &prefs) {
int tmp;
- prefs.get("name", name, "<unnamed>");
- prefs.get("label", label, "<no label>");
+ char *str_ptr = 0;
+ prefs.get("name", str_ptr, "<unnamed>");
+ if (str_ptr) { name = str_ptr; free(str_ptr); str_ptr = 0; }
+ prefs.get("label", str_ptr, "<no label>");
+ if (str_ptr) { label = str_ptr; free(str_ptr); str_ptr = 0; }
prefs.get("shortcut", tmp, 0);
shortcut = (Fl_Shortcut)tmp;
prefs.get("storage", tmp, -1);
if (tmp != -1) storage = (fld::Tool_Store)tmp;
prefs.get("condition", condition, ALWAYS);
- prefs.get("condition_data", condition_data, "");
- prefs.get("command", command, "");
+ prefs.get("condition_data", str_ptr, "");
+ if (str_ptr) { condition_data = str_ptr; free(str_ptr); str_ptr = 0; }
+ prefs.get("command", str_ptr, "");
+ if (str_ptr) { command = str_ptr; free(str_ptr); str_ptr = 0; }
prefs.get("flags", flags, 0);
}
void Fd_Shell_Command::write(Fl_Preferences &prefs, bool save_location) {
- prefs.set("name", name);
- prefs.set("label", label);
+ prefs.set("name", name.c_str());
+ prefs.set("label", label.c_str());
if (shortcut != 0) prefs.set("shortcut", (int)shortcut);
if (save_location) prefs.set("storage", (int)storage);
if (condition != ALWAYS) prefs.set("condition", condition);
- if (!condition_data.empty()) prefs.set("condition_data", condition_data);
- if (!command.empty()) prefs.set("command", command);
+ if (!condition_data.empty()) prefs.set("condition_data", condition_data.c_str());
+ if (!command.empty()) prefs.set("command", command.c_str());
if (flags != 0) prefs.set("flags", flags);
}
@@ -695,7 +700,9 @@ void Fd_Shell_Command_List::read(Fl_Preferences &prefs, fld::Tool_Store storage)
cmd->name = "Sample Shell Command";
cmd->label = "Sample Shell Command";
cmd->shortcut = FL_ALT+'g';
- Fluid.preferences.get("shell_command", cmd->command, "echo \"Sample Shell Command\"");
+ char *cmd_str = 0;
+ Fluid.preferences.get("shell_command", cmd_str, "echo \"Sample Shell Command\"");
+ if (cmd_str) { cmd->command = cmd_str; free(cmd_str); }
Fluid.preferences.get("shell_savefl", save_fl, 1);
Fluid.preferences.get("shell_writecode", save_code, 1);
Fluid.preferences.get("shell_writemsgs", save_strings, 0);
diff --git a/fluid/fld_path.h b/fluid/fld_path.h
new file mode 100644
index 000000000..edcfb781f
--- /dev/null
+++ b/fluid/fld_path.h
@@ -0,0 +1,144 @@
+//
+// FLUID path helper functions for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2025 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
+// file is missing or damaged, see the license at:
+//
+// https://www.fltk.org/COPYING.php
+//
+
+#ifndef FLD_PATH_H
+#define FLD_PATH_H
+
+#include <FL/filename.H>
+#include <FL/fl_utf8.h>
+#include <FL/platform.H>
+#include <string.h>
+
+// Path helper functions using static buffers.
+// These are NOT thread-safe, but FLUID is single-threaded.
+// Each function uses its own buffer to allow nesting calls.
+
+// Get current working directory - returns pointer to static buffer
+inline const char *fld_getcwd(void) {
+ static char buf[FL_PATH_MAX];
+ fl_getcwd(buf, FL_PATH_MAX);
+ return buf;
+}
+
+// Get absolute path - returns pointer to static buffer
+inline const char *fld_filename_absolute(const char *from) {
+ static char buf[FL_PATH_MAX];
+ fl_filename_absolute(buf, FL_PATH_MAX, from);
+ return buf;
+}
+
+// Get absolute path with base directory - returns pointer to static buffer
+inline const char *fld_filename_absolute2(const char *from, const char *cwd) {
+ static char buf[FL_PATH_MAX];
+ fl_filename_absolute(buf, FL_PATH_MAX, from, cwd);
+ return buf;
+}
+
+// Get relative path - returns pointer to static buffer
+inline const char *fld_filename_relative(const char *from) {
+ static char buf[FL_PATH_MAX];
+ fl_filename_relative(buf, FL_PATH_MAX, from);
+ return buf;
+}
+
+// Get relative path with base directory - returns pointer to static buffer
+inline const char *fld_filename_relative2(const char *from, const char *cwd) {
+ static char buf[FL_PATH_MAX];
+ fl_filename_relative(buf, FL_PATH_MAX, from, cwd);
+ return buf;
+}
+
+// Get path component (directory) - returns pointer to static buffer
+// Note: fl_filename_name returns pointer to filename within the string,
+// so we need to copy the path portion
+inline const char *fld_filename_path(const char *filename) {
+ static char buf[FL_PATH_MAX];
+ if (!filename || !*filename) {
+ buf[0] = '\0';
+ return buf;
+ }
+ const char *name = fl_filename_name(filename);
+ if (name == filename) {
+ // no path component
+ buf[0] = '\0';
+ return buf;
+ }
+ size_t len = name - filename;
+ if (len >= FL_PATH_MAX) len = FL_PATH_MAX - 1;
+ memcpy(buf, filename, len);
+ buf[len] = '\0';
+ return buf;
+}
+
+// Set extension - returns pointer to static buffer
+inline const char *fld_filename_setext(const char *filename, const char *ext) {
+ static char buf[FL_PATH_MAX];
+ if (!filename) {
+ buf[0] = '\0';
+ return buf;
+ }
+ strlcpy(buf, filename, FL_PATH_MAX);
+ fl_filename_setext(buf, FL_PATH_MAX, ext);
+ return buf;
+}
+
+// Get filename without extension - returns pointer to static buffer
+inline const char *fld_filename_noext(const char *filename) {
+ return fld_filename_setext(filename, "");
+}
+
+// Ensure path ends with slash - returns pointer to static buffer
+inline const char *fld_end_with_slash(const char *path) {
+ static char buf[FL_PATH_MAX];
+ if (!path || !*path) {
+ buf[0] = '\0';
+ return buf;
+ }
+ size_t len = strlen(path);
+ if (len >= FL_PATH_MAX - 1) len = FL_PATH_MAX - 2;
+ memcpy(buf, path, len);
+ if (buf[len - 1] != '/' && buf[len - 1] != '\\') {
+ buf[len] = '/';
+ buf[len + 1] = '\0';
+ } else {
+ buf[len] = '\0';
+ }
+ return buf;
+}
+
+// Concatenate path and filename - returns pointer to static buffer
+inline const char *fld_path_concat(const char *path, const char *name) {
+ static char buf[FL_PATH_MAX];
+ if (!path || !*path) {
+ if (!name) {
+ buf[0] = '\0';
+ } else {
+ strlcpy(buf, name, FL_PATH_MAX);
+ }
+ return buf;
+ }
+ strlcpy(buf, path, FL_PATH_MAX);
+ size_t len = strlen(buf);
+ if (len > 0 && buf[len - 1] != '/' && buf[len - 1] != '\\') {
+ if (len < FL_PATH_MAX - 1) {
+ buf[len] = '/';
+ buf[len + 1] = '\0';
+ len++;
+ }
+ }
+ if (name && len < FL_PATH_MAX - 1) {
+ strlcat(buf, name, FL_PATH_MAX);
+ }
+ return buf;
+}
+
+#endif // FLD_PATH_H
diff --git a/fluid/nodes/Widget_Node.cxx b/fluid/nodes/Widget_Node.cxx
index 5b51db75e..b02e53e66 100644
--- a/fluid/nodes/Widget_Node.cxx
+++ b/fluid/nodes/Widget_Node.cxx
@@ -42,9 +42,13 @@
#include <stdio.h>
#include <stdlib.h>
-#undef min
-#undef max
-#include <algorithm>
+
+#ifndef MIN
+#define MIN(a,b) ((a)<=(b) ? (a) : (b))
+#endif
+#ifndef MAX
+#define MAX(a,b) ((a)>=(b) ? (a) : (b))
+#endif
using namespace fld;
using namespace fld::proj;
@@ -518,10 +522,10 @@ static void calculate_bbox(Node* p) {
bbox_r = o->x() + o->w(); bbox_b = o->y() + o->h();
first = 0;
} else {
- bbox_x = std::min(bbox_x, o->x());
- bbox_y = std::min(bbox_y, o->y());
- bbox_r = std::max(bbox_r, o->x() + o->w());
- bbox_b = std::max(bbox_b, o->y() + o->h());
+ bbox_x = MIN(bbox_x, o->x());
+ bbox_y = MIN(bbox_y, o->y());
+ bbox_r = MAX(bbox_r, o->x() + o->w());
+ bbox_b = MAX(bbox_b, o->y() + o->h());
}
}
}
diff --git a/fluid/nodes/Window_Node.cxx b/fluid/nodes/Window_Node.cxx
index 0ea3b306f..7e90f8272 100644
--- a/fluid/nodes/Window_Node.cxx
+++ b/fluid/nodes/Window_Node.cxx
@@ -49,9 +49,13 @@
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
-#undef min
-#undef max
-#include <algorithm>
+
+#ifndef MIN
+#define MIN(a,b) ((a)<=(b) ? (a) : (b))
+#endif
+#ifndef MAX
+#define MAX(a,b) ((a)>=(b) ? (a) : (b))
+#endif
extern Fl_Window *the_panel;
extern void draw_width(int x, int y, int r, Fl_Align a);
@@ -337,7 +341,7 @@ void Window_Node::ideal_size(int &w, int &h) {
Fl_Window *win = Fluid.main_window;
int screen = Fl::screen_num(win->x(), win->y());
Fl::screen_work_area(sx, sy, sw, sh, screen);
- w = std::min(w, sw*3/4); h = std::min(h, sh*3/4);
+ w = MIN(w, sw*3/4); h = MIN(h, sh*3/4);
}
fld::app::Snap_Action::better_size(w, h);
}
@@ -534,10 +538,10 @@ void Window_Node::draw_overlaps() {
if (p->level==q->level && p->is_true_widget()) {
Widget_Node *wp = (Widget_Node*)p;
if (wp->o->visible()) {
- int px = std::max(x, wp->o->x());
- int py = std::max(y, wp->o->y());
- int pr = std::min(r, wp->o->x() + wp->o->w());
- int pb = std::min(b, wp->o->y() + wp->o->h());
+ int px = MAX(x, wp->o->x());
+ int py = MAX(y, wp->o->y());
+ int pr = MIN(r, wp->o->x() + wp->o->w());
+ int pb = MIN(b, wp->o->y() + wp->o->h());
if (pr > px && pb > py)
fd_hatch(px, py, pr-px, pb-py);
}
diff --git a/fluid/proj/mergeback.cxx b/fluid/proj/mergeback.cxx
index cef683f3e..34e4e1361 100644
--- a/fluid/proj/mergeback.cxx
+++ b/fluid/proj/mergeback.cxx
@@ -652,7 +652,9 @@ int mergeback_code_files(Project &proj, Mergeback::Feedback feedback)
Fl_Preferences path(build_records, proj_filename.c_str());
int i, n = (int)proj_filename.size();
for (i=0; i<n; i++) if (proj_filename[i]=='\\') proj_filename[i] = '/';
- path.get("code", code_filename, "");
+ char *code_fn_ptr = 0;
+ path.get("code", code_fn_ptr, "");
+ if (code_fn_ptr) { code_filename = code_fn_ptr; free(code_fn_ptr); }
}
#endif
if (code_filename.empty())
diff --git a/fluid/tools/filename.cxx b/fluid/tools/filename.cxx
index a5d6e22b3..72386f78b 100644
--- a/fluid/tools/filename.cxx
+++ b/fluid/tools/filename.cxx
@@ -32,7 +32,9 @@
#include "tools/filename.h"
#include <FL/filename.H>
+#include <FL/fl_utf8.h>
#include <FL/Fl.H>
+#include "../src/flstring.h"
//#include <FL/fl_string_functions.h>
//#include "../src/flstring.h"
//
@@ -123,3 +125,136 @@ std::string fld::fix_separators(const std::string &fn) {
}
return ret;
}
+
+// ---- FLUID-local wrapper functions for filename operations ----
+
+/**
+ Get current working directory as std::string.
+ \return current working directory path
+ */
+std::string fl_getcwd_str() {
+ char buf[FL_PATH_MAX];
+ fl_getcwd(buf, FL_PATH_MAX);
+ return std::string(buf);
+}
+
+/**
+ Get path component (directory) from a filename.
+ \param[in] filename the full path
+ \return directory portion ending with separator
+ */
+std::string fl_filename_path_str(const char *filename) {
+ if (!filename || !*filename) return std::string();
+ const char *name = fl_filename_name(filename);
+ if (name == filename) return std::string();
+ return std::string(filename, name - filename);
+}
+
+std::string fl_filename_path_str(const std::string &filename) {
+ return fl_filename_path_str(filename.c_str());
+}
+
+/**
+ Make a filename absolute.
+ \param[in] from relative or absolute filename
+ \return absolute filename
+ */
+std::string fl_filename_absolute_str(const char *from) {
+ char buf[FL_PATH_MAX];
+ fl_filename_absolute(buf, FL_PATH_MAX, from);
+ return std::string(buf);
+}
+
+std::string fl_filename_absolute_str(const std::string &from) {
+ return fl_filename_absolute_str(from.c_str());
+}
+
+/**
+ Make a filename absolute relative to a given directory.
+ \param[in] from relative filename
+ \param[in] cwd current working directory to use as base
+ \return absolute filename
+ */
+std::string fl_filename_absolute_str(const char *from, const char *cwd) {
+ char buf[FL_PATH_MAX];
+ fl_filename_absolute(buf, FL_PATH_MAX, from, cwd);
+ return std::string(buf);
+}
+
+std::string fl_filename_absolute_str(const std::string &from, const std::string &cwd) {
+ return fl_filename_absolute_str(from.c_str(), cwd.c_str());
+}
+
+/**
+ Make a filename relative to current directory.
+ \param[in] from absolute filename
+ \return relative filename
+ */
+std::string fl_filename_relative_str(const char *from) {
+ char buf[FL_PATH_MAX];
+ fl_filename_relative(buf, FL_PATH_MAX, from);
+ return std::string(buf);
+}
+
+std::string fl_filename_relative_str(const std::string &from) {
+ return fl_filename_relative_str(from.c_str());
+}
+
+/**
+ Get filename portion from a path.
+ \param[in] filename the full path
+ \return filename without directory
+ */
+std::string fl_filename_name_str(const char *filename) {
+ if (!filename) return std::string();
+ return std::string(fl_filename_name(filename));
+}
+
+std::string fl_filename_name_str(const std::string &filename) {
+ return fl_filename_name_str(filename.c_str());
+}
+
+/**
+ Change the extension of a filename.
+ \param[in] filename original filename
+ \param[in] ext new extension (including dot)
+ \return filename with new extension
+ */
+std::string fl_filename_setext_str(const char *filename, const char *ext) {
+ char buf[FL_PATH_MAX];
+ if (!filename) return std::string();
+ strlcpy(buf, filename, FL_PATH_MAX);
+ fl_filename_setext(buf, FL_PATH_MAX, ext);
+ return std::string(buf);
+}
+
+std::string fl_filename_setext_str(const std::string &filename, const std::string &ext) {
+ return fl_filename_setext_str(filename.c_str(), ext.c_str());
+}
+
+/**
+ Expand a filename with shell variables like ~ for home directory.
+ \param[in] from filename with possible shell expansions
+ \return expanded filename
+ */
+std::string fl_filename_expand_str(const std::string &from) {
+ char buf[FL_PATH_MAX];
+ fl_filename_expand(buf, FL_PATH_MAX, from.c_str());
+ return std::string(buf);
+}
+
+/**
+ Get the extension of a filename.
+ \param[in] filename the filename
+ \return extension including the dot, or empty string if no extension
+ */
+std::string fl_filename_ext_str(const char *filename) {
+ if (!filename) return std::string();
+ const char *ext = fl_filename_ext(filename);
+ if (!ext) return std::string();
+ return std::string(ext);
+}
+
+std::string fl_filename_ext_str(const std::string &filename) {
+ return fl_filename_ext_str(filename.c_str());
+}
diff --git a/fluid/tools/filename.h b/fluid/tools/filename.h
index 3a4359633..85e4a2844 100644
--- a/fluid/tools/filename.h
+++ b/fluid/tools/filename.h
@@ -21,10 +21,32 @@
#ifndef FLUID_TOOLS_FILENAME_H
#define FLUID_TOOLS_FILENAME_H
+#include <FL/filename.H>
+#include <FL/fl_utf8.h>
#include <string>
std::string fl_filename_shortened(const std::string &filename, int maxchars);
+// Wrapper functions for filename operations returning std::string
+// These are FLUID-local implementations of functions that were removed from core FLTK
+
+std::string fl_getcwd_str();
+std::string fl_filename_path_str(const char *filename);
+std::string fl_filename_path_str(const std::string &filename);
+std::string fl_filename_absolute_str(const char *from);
+std::string fl_filename_absolute_str(const std::string &from);
+std::string fl_filename_absolute_str(const char *from, const char *cwd);
+std::string fl_filename_absolute_str(const std::string &from, const std::string &cwd);
+std::string fl_filename_relative_str(const char *from);
+std::string fl_filename_relative_str(const std::string &from);
+std::string fl_filename_name_str(const char *filename);
+std::string fl_filename_name_str(const std::string &filename);
+std::string fl_filename_setext_str(const char *filename, const char *ext);
+std::string fl_filename_setext_str(const std::string &filename, const std::string &ext);
+std::string fl_filename_expand_str(const std::string &from);
+std::string fl_filename_ext_str(const char *filename);
+std::string fl_filename_ext_str(const std::string &filename);
+
namespace fld {
extern std::string end_with_slash(const std::string &fn);
diff --git a/fluid/widgets/Code_Editor.cxx b/fluid/widgets/Code_Editor.cxx
index 216ffab8f..aa7c28751 100644
--- a/fluid/widgets/Code_Editor.cxx
+++ b/fluid/widgets/Code_Editor.cxx
@@ -21,6 +21,7 @@
//
#include <stdlib.h>
+#include <ctype.h>
#include "widgets/Code_Editor.h"
using namespace fld;
diff --git a/lib/libfltk.a b/lib/libfltk.a
index 856ab0207..914c19a37 100644
--- a/lib/libfltk.a
+++ b/lib/libfltk.a
Binary files differ
diff --git a/lib/libfltk_forms.a b/lib/libfltk_forms.a
new file mode 100644
index 000000000..9862d482a
--- /dev/null
+++ b/lib/libfltk_forms.a
Binary files differ
diff --git a/lib/libfltk_gl.a b/lib/libfltk_gl.a
new file mode 100644
index 000000000..c1982e5a8
--- /dev/null
+++ b/lib/libfltk_gl.a
Binary files differ
diff --git a/lib/libfltk_images.a b/lib/libfltk_images.a
new file mode 100644
index 000000000..34645bf0b
--- /dev/null
+++ b/lib/libfltk_images.a
Binary files differ
diff --git a/lib/libfltk_jpeg.a b/lib/libfltk_jpeg.a
new file mode 100644
index 000000000..a826800cd
--- /dev/null
+++ b/lib/libfltk_jpeg.a
Binary files differ
diff --git a/lib/libfltk_png.a b/lib/libfltk_png.a
new file mode 100644
index 000000000..924b33d25
--- /dev/null
+++ b/lib/libfltk_png.a
Binary files differ
diff --git a/lib/libfltk_z.a b/lib/libfltk_z.a
new file mode 100644
index 000000000..c47a475a7
--- /dev/null
+++ b/lib/libfltk_z.a
Binary files differ