FLTK logo

[master] fd791a0 - Separate FLUID user documentation, screen shot automation (#936)

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] fd791a0 - Separate FLUID user documentation, screen shot automation (#936) "Matthias Melcher" 09:02 Apr 17  
 
commit fd791a068e39e06785adc44693f4c533d3d6c903
Author:     Matthias Melcher <github@matthiasm.com>
AuthorDate: Wed Apr 17 17:51:32 2024 +0200
Commit:     GitHub <noreply@github.com>
CommitDate: Wed Apr 17 17:51:32 2024 +0200

    Separate FLUID user documentation, screen shot automation (#936)
    
    
    * CMake integration, no autotiools
    * alignment panel is now correctly renamed to setting panel
    * source view is now correctly renamed to code view
    * Merge FLTK FLUID docs into FLUID user manual.
    * Add two simple entry tutorials
    * Remove FLUID chapter form FLTK docs.
    * GitHub action to generate HTML and PDF docs and
      make the available as artefacts

 .github/workflows/build_fluid_docs.yml             |   84 +
 CMake/options.cmake                                |    6 +
 README.CMake.txt                                   |   11 +-
 documentation/CMakeLists.txt                       |    2 +-
 documentation/Doxyfile.in                          |    1 -
 documentation/Makefile                             |    1 -
 documentation/src/cubeview.png                     |  Bin 4482 -> 0 bytes
 documentation/src/examples.dox                     |   16 +-
 documentation/src/fltk-options.dox                 |    8 +-
 documentation/src/fltk-options.png                 |  Bin 0 -> 160099 bytes
 documentation/src/fluid-catgets.png                |  Bin 40651 -> 0 bytes
 .../src/fluid-edit-global-fltk-settings.png        |  Bin 160099 -> 0 bytes
 documentation/src/fluid-edit-gui-settings.png      |  Bin 70258 -> 0 bytes
 documentation/src/fluid-edit-proj-settings.png     |  Bin 55000 -> 0 bytes
 documentation/src/fluid-gettext.png                |  Bin 44085 -> 0 bytes
 .../src/fluid-layout-grid-and-size-settings.png    |  Bin 88526 -> 0 bytes
 documentation/src/fluid-org.png                    |  Bin 27580 -> 0 bytes
 documentation/src/fluid-org.xcf                    |  Bin 110511 -> 0 bytes
 documentation/src/fluid.dox                        | 1760 ----------
 documentation/src/fluid1.png                       |  Bin 48759 -> 0 bytes
 documentation/src/fluid2.png                       |  Bin 117079 -> 0 bytes
 documentation/src/fluid3-cxx.png                   |  Bin 54533 -> 0 bytes
 documentation/src/fluid3-gui.png                   |  Bin 77268 -> 0 bytes
 documentation/src/fluid3-style.png                 |  Bin 52943 -> 0 bytes
 documentation/src/fluid4.png                       |  Bin 36419 -> 0 bytes
 documentation/src/fluid_widget_cxx.png             |  Bin 55645 -> 0 bytes
 documentation/src/fluid_widget_gui.png             |  Bin 32441 -> 0 bytes
 documentation/src/fluid_widget_style.png           |  Bin 54373 -> 0 bytes
 documentation/src/index.dox                        |    5 -
 documentation/src/intro.dox                        |   11 +
 documentation/src/opengl.dox                       |    8 +-
 documentation/src/osissues.dox                     |    2 +-
 documentation/src/preface.dox                      |    1 -
 documentation/src/subclassing.dox                  |    4 +-
 fluid/CMakeLists.txt                               |   11 +-
 fluid/CodeEditor.h                                 |    2 +-
 fluid/Fd_Snap_Action.cxx                           |    2 +-
 fluid/Fl_Function_Type.cxx                         |   22 +-
 fluid/Fl_Type.cxx                                  |   14 +-
 fluid/Fl_Type.h                                    |    2 +-
 fluid/Fl_Widget_Type.cxx                           |   10 +-
 fluid/Fl_Widget_Type.h                             |    1 +
 fluid/Fl_Window_Type.cxx                           |    2 +-
 fluid/Makefile                                     |    9 +-
 fluid/alignment_panel.cxx                          | 3543 -------------------
 fluid/alignment_panel.fl                           | 1879 -----------
 fluid/alignment_panel.h                            |  141 -
 fluid/autodoc.cxx                                  |  602 ++++
 fluid/autodoc.h                                    |   59 +
 fluid/code.cxx                                     |   62 +-
 fluid/code.h                                       |    4 +-
 fluid/codeview_panel.cxx                           |  548 +++
 fluid/codeview_panel.fl                            |  506 +++
 fluid/codeview_panel.h                             |   58 +
 fluid/custom_widgets.cxx                           |    2 +-
 fluid/documentation/CMakeLists.txt                 |  232 ++
 fluid/documentation/Doxyfile.in                    | 2485 ++++++++++++++
 fluid/documentation/convert_doxyfile               |   44 +
 fluid/documentation/copyright.dox.in               |    1 +
 fluid/documentation/generated.dox.in               |    6 +
 fluid/documentation/make_header                    |   63 +
 fluid/documentation/make_pdf                       |   41 +
 fluid/documentation/src/1of7GUIs.png               |  Bin 0 -> 32692 bytes
 fluid/documentation/src/cubeview.png               |  Bin 0 -> 4482 bytes
 fluid/documentation/src/edit_live_resize.png       |  Bin 0 -> 71715 bytes
 fluid/documentation/src/edit_outside.png           |  Bin 0 -> 20358 bytes
 fluid/documentation/src/edit_overlap.png           |  Bin 0 -> 20462 bytes
 fluid/documentation/src/edit_select_group.png      |  Bin 0 -> 74343 bytes
 fluid/documentation/src/edit_select_multiple.png   |  Bin 0 -> 27736 bytes
 fluid/documentation/src/edit_snap_grid.png         |  Bin 0 -> 18025 bytes
 fluid/documentation/src/edit_snap_group.png        |  Bin 0 -> 15375 bytes
 fluid/documentation/src/edit_snap_sibling.png      |  Bin 0 -> 16034 bytes
 fluid/documentation/src/edit_snap_size.png         |  Bin 0 -> 14755 bytes
 fluid/documentation/src/edit_window.png            |  Bin 0 -> 72016 bytes
 fluid/documentation/src/flBox.png                  |  Bin 0 -> 453 bytes
 fluid/documentation/src/flClass.png                |  Bin 0 -> 176 bytes
 fluid/documentation/src/flCode.png                 |  Bin 0 -> 120 bytes
 fluid/documentation/src/flCodeBlock.png            |  Bin 0 -> 210 bytes
 fluid/documentation/src/flComment.png              |  Bin 0 -> 154 bytes
 fluid/documentation/src/flData.png                 |  Bin 0 -> 212 bytes
 fluid/documentation/src/flDeclaration.png          |  Bin 0 -> 165 bytes
 fluid/documentation/src/flDeclarationBlock.png     |  Bin 0 -> 217 bytes
 fluid/documentation/src/flFunction.png             |  Bin 0 -> 200 bytes
 fluid/documentation/src/flWidgetClass.png          |  Bin 0 -> 202 bytes
 fluid/documentation/src/flWindow.png               |  Bin 0 -> 488 bytes
 fluid/documentation/src/fluid-128.png              |  Bin 0 -> 10179 bytes
 fluid/documentation/src/fluid-title.tex.in         |   35 +
 fluid/documentation/src/fluid1.png                 |  Bin 0 -> 41825 bytes
 fluid/documentation/src/fluid2.png                 |  Bin 0 -> 101220 bytes
 fluid/documentation/src/fluid3-cxx.png             |  Bin 0 -> 44546 bytes
 fluid/documentation/src/fluid4.png                 |  Bin 0 -> 31481 bytes
 fluid/documentation/src/fluid_flow_chart.png       |  Bin 0 -> 83226 bytes
 fluid/documentation/src/fluid_flow_chart_800.png   |  Bin 0 -> 41559 bytes
 fluid/documentation/src/fluid_gui_overview_800.png |  Bin 0 -> 334048 bytes
 fluid/documentation/src/index.dox                  |  118 +
 fluid/documentation/src/main_titlebar.png          |  Bin 0 -> 14952 bytes
 fluid/documentation/src/page_appendices.dox        |   92 +
 fluid/documentation/src/page_codeview_panel.dox    |   76 +
 fluid/documentation/src/page_commandline.dox       |  124 +
 fluid/documentation/src/page_edit_window.dox       |  179 +
 fluid/documentation/src/page_functional_nodes.dox  |  450 +++
 fluid/documentation/src/page_interactive.dox       |   57 +
 fluid/documentation/src/page_introduction.dox      |   69 +
 fluid/documentation/src/page_main_window.dox       |  371 ++
 fluid/documentation/src/page_setting_dialog.dox    |  338 ++
 fluid/documentation/src/page_tutorial.dox          |  534 +++
 fluid/documentation/src/page_widget_panel.dox      |  429 +++
 fluid/documentation/src/page_widgetbin_panel.dox   |   34 +
 fluid/documentation/src/widgetbin_action.png       |  Bin 0 -> 232128 bytes
 fluid/factory.cxx                                  |    9 +-
 fluid/factory.h                                    |    4 +-
 fluid/file.cxx                                     |   12 +-
 fluid/file.h                                       |   10 +-
 fluid/fluid.cxx                                    |   80 +-
 fluid/fluid.h                                      |    5 +-
 fluid/makedepend                                   |  285 +-
 fluid/settings_panel.cxx                           | 3547 ++++++++++++++++++++
 fluid/settings_panel.fl                            | 1879 +++++++++++
 fluid/settings_panel.h                             |  143 +
 fluid/shell_command.cxx                            |    2 +-
 fluid/sourceview_panel.cxx                         |  542 ---
 fluid/sourceview_panel.fl                          |  506 ---
 fluid/sourceview_panel.h                           |   55 -
 fluid/widget_panel.cxx                             |  407 ++-
 fluid/widget_panel.fl                              |   66 +-
 fluid/widget_panel.h                               |   24 +
 src/Fl_Input_Choice.cxx                            |   23 +-
 src/Fl_get_system_colors.cxx                       |   18 +-
 128 files changed, 13849 insertions(+), 8945 deletions(-)

diff --git .github/workflows/build_fluid_docs.yml .github/workflows/build_fluid_docs.yml
new file mode 100644
index 0000000..57b30af
--- /dev/null
+++ .github/workflows/build_fluid_docs.yml
@@ -0,0 +1,84 @@
+#
+# This script builds the FLUID User Handbook as html directory and pdf
+# document on a Linux machine.
+#
+
+name: 'Build FLUID User Handbook'
+
+# This job must be called explicitly form the 'Actions' tab in GitHub
+on: [workflow_dispatch]
+
+permissions:
+  contents: read
+
+jobs:
+  build-html:
+    runs-on: ubuntu-latest
+
+## This can also run on macOS, but BasicTeX will not generate the pdf document
+#    runs-on: macos-latest
+
+    steps:
+    - uses: actions/checkout@v2
+
+    - name: Install prerequisites
+      run: |
+        sudo apt-get update -y
+        sudo apt-get install -y libwayland-dev wayland-protocols libdbus-1-dev libxkbcommon-dev libpango1.0-dev libgtk-3-dev
+        sudo apt-get install -y doxygen
+        sudo apt-get install -y doxygen-latex
+        sudo apt-get install -y xvfb
+        sudo apt-get install -y x11-xkb-utils xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic x11-apps
+
+## Use the following line when 1.10.0 becomes available on Ubuntu. On 4/14/24 it's 1.9.2
+#        sudo apt-get install -y doxygen=1.10.0
+
+## xvfb creates a headless X server for us, so we can render snapshot with FLUID
+
+## We need at least Doxygen on macOS. BasicTeX is not enough though.
+#        brew install doxygen
+#        brew install --cask basictex
+#        eval "$(/usr/libexec/path_helper)"
+
+    - name: Create Build Environment
+      run: cmake -E make_directory ${{github.workspace}}/build
+
+    - name: Configure CMake
+      shell: bash
+      working-directory: ${{github.workspace}}/build
+      run: |
+        cmake $GITHUB_WORKSPACE \
+          -D CMAKE_BUILD_TYPE=Debug \
+          -D CMAKE_CXX_STANDARD=11 \
+          -D CMAKE_CXX_EXTENSIONS=OFF \
+          -D CMAKE_C_FLAGS_INIT="-Wall -Wunused" \
+          -D CMAKE_CXX_FLAGS_INIT="-Wall -Wunused -Wsuggest-override" \
+          -D FLTK_BUILD_FLTK_OPTIONS=OFF \
+          -D FLTK_BUILD_FLUID=ON \
+          -D FLTK_BUILD_GL=OFF \
+          -D FLTK_BUILD_TEST=OFF \
+          -D FLTK_BUILD_FLUID_DOCS=ON
+
+    - name: Build
+      working-directory: ${{github.workspace}}/build
+      shell: bash
+      run: |
+        Xvfb :19 -screen 0 1024x768x16 &
+        export DISPLAY=:19
+        cmake --build . --config Debug --target fluid_docs
+        cmake --build . --config Debug --target fluid_pdf
+    - name: Store html docs as an artifact
+      uses: actions/upload-artifact@v4
+      with:
+        name: fluid-html
+        path: build/fluid/documentation/html
+        retention-days: 3
+        overwrite: true
+    - name: Store pdf docs as an artifact
+      uses: actions/upload-artifact@v4
+      with:
+        name: fluid-pdf
+        path: build/fluid/documentation/fluid.pdf
+        retention-days: 3
+        overwrite: true
+
diff --git CMake/options.cmake CMake/options.cmake
index b242c5f..c1aa0dc 100644
--- CMake/options.cmake
+++ CMake/options.cmake
@@ -459,6 +459,8 @@ endif()
 if(DOXYGEN_FOUND)
   option(FLTK_BUILD_HTML_DOCS "build html docs" ON)
   option(FLTK_INSTALL_HTML_DOCS "install html docs" OFF)
+  option(FLTK_BUILD_FLUID_DOCS "build FLUID docs" OFF)
+  option(FLTK_INSTALL_FLUID_DOCS "install FLUID docs" OFF)
 
   option(FLTK_INCLUDE_DRIVER_DOCS "include driver (developer) docs" OFF)
   mark_as_advanced(FLTK_INCLUDE_DRIVER_DOCS)
@@ -473,6 +475,10 @@ if(FLTK_BUILD_HTML_DOCS OR FLTK_BUILD_PDF_DOCS)
   add_subdirectory(documentation)
 endif(FLTK_BUILD_HTML_DOCS OR FLTK_BUILD_PDF_DOCS)
 
+if(FLTK_BUILD_FLUID_DOCS)
+  add_subdirectory(fluid/documentation)
+endif(FLTK_BUILD_FLUID_DOCS)
+
 #######################################################################
 # Include optional Cairo support
 #######################################################################
diff --git README.CMake.txt README.CMake.txt
index b117b6b..a915b3b 100644
--- README.CMake.txt
+++ README.CMake.txt
@@ -325,6 +325,12 @@ FLTK_BUILD_PDF_DOCS  - default ON
     You can safely leave these two options ON if you want to save build time
     because the docs are not built automatically.
 
+FLTK_BUILD_FLUID_DOCS - default OFF
+    If this option is ON, the FLUID user documentation will be built. If 
+    FLTK_BUILD_PDF_DOCS is ON, the FLUID documentation will be generated
+    in PDF forma. To generate the screen shots used in the handbook,
+    the CMake build mode must be set to "Debug".
+
 FLTK_INCLUDE_DRIVER_DOCS - default OFF
     This option adds driver documentation to HTML and PDF docs (if ON). This
     option is marked as "advanced" since it is only useful for FLTK developers
@@ -332,9 +338,10 @@ FLTK_INCLUDE_DRIVER_DOCS - default OFF
     options above is ON as well.
 
 FLTK_INSTALL_HTML_DOCS - default OFF
+FLTK_INSTALL_FLUID_DOCS - default OFF
 FLTK_INSTALL_PDF_DOCS  - default OFF
-    If these options are ON then the HTML and/or PDF docs are installed
-    when the 'install' target is executed, e.g. with `make install'. You
+    If these options are ON then the HTML, FLUID, and/or PDF docs are installed
+    when the 'install' target is executed, e.g. with `make install'. You 
     need to select above options FLTK_BUILD_*_DOCS as well.
 
 
diff --git documentation/CMakeLists.txt documentation/CMakeLists.txt
index 4d7b517..cf96994 100644
--- documentation/CMakeLists.txt
+++ documentation/CMakeLists.txt
@@ -52,7 +52,7 @@ if(GENERATE_DOCS)
   # find git revision
 
   # FIXME: This must also work with tarballs where git is not available.
-  #        For now we just ignore errors and set GIT_REVISION = "unkown".
+  #        For now we just ignore errors and set GIT_REVISION = "unknown".
   #        In the future tarball/zip generation should create a file
   #        that contains the git revision.
 
diff --git documentation/Doxyfile.in documentation/Doxyfile.in
index 130dd18..56df6bd 100644
--- documentation/Doxyfile.in
+++ documentation/Doxyfile.in
@@ -794,7 +794,6 @@ INPUT                  = @CMAKE_CURRENT_SOURCE_DIR@/src/index.dox \
                          @CMAKE_CURRENT_SOURCE_DIR@/src/events.dox \
                          @CMAKE_CURRENT_SOURCE_DIR@/src/subclassing.dox \
                          @CMAKE_CURRENT_SOURCE_DIR@/src/opengl.dox \
-                         @CMAKE_CURRENT_SOURCE_DIR@/src/fluid.dox \
                          @CMAKE_CURRENT_SOURCE_DIR@/src/fltk-options.dox \
                          @CMAKE_CURRENT_SOURCE_DIR@/src/advanced.dox \
                          @CMAKE_CURRENT_SOURCE_DIR@/src/unicode.dox \
diff --git documentation/Makefile documentation/Makefile
index 0b17624..6760e46 100644
--- documentation/Makefile
+++ documentation/Makefile
@@ -36,7 +36,6 @@ HTMLFILES	= 	 \
                          $(SRC_DOCDIR)/events.dox \
                          $(SRC_DOCDIR)/subclassing.dox \
                          $(SRC_DOCDIR)/opengl.dox \
-                         $(SRC_DOCDIR)/fluid.dox \
                          $(SRC_DOCDIR)/fltk-options.dox \
                          $(SRC_DOCDIR)/advanced.dox \
                          $(SRC_DOCDIR)/unicode.dox \
diff --git documentation/src/cubeview.png documentation/src/cubeview.png
deleted file mode 100644
index 877be18..0000000
Binary files documentation/src/cubeview.png and /dev/null differ
diff --git documentation/src/examples.dox documentation/src/examples.dox
index fa7bcd9..992b855 100644
--- documentation/src/examples.dox
+++ documentation/src/examples.dox
@@ -252,7 +252,7 @@ and shows OpenGL text.
 \subsection examples_CubeView CubeView
 
 \par
-\c CubeView shows how to create a UI containing OpenGL with Fluid.
+\c CubeView shows how to create a UI containing OpenGL with FLUID.
 
 
 \subsection examples_cursor cursor
@@ -577,7 +577,7 @@ come in handy. They remember any kind of data between program launches.
 \subsection examples_radio radio
 
 \par
-The \c radio tool was created entirely with <i>fluid</i>. It
+The \c radio tool was created entirely with <i>FLUID</i>. It
 shows some of the available button types and tests radio
 button behavior.
 
@@ -658,7 +658,7 @@ The \c table demo shows the features of the Fl_Table widget.
 \subsection examples_tabs tabs
 
 \par
-The \c tabs tool was created with <i>fluid</i>. It tests
+The \c tabs tool was created with <i>FLUID</i>. It tests
 correct hiding and redisplaying of tabs, navigation across tabs,
 resize behavior, and no unneeded redrawing of invisible widgets.
 
@@ -733,13 +733,13 @@ font draws each of the Unicode code points ranging between U+0020 and U+FFFF.
 while the focus stays in the original window.
 
 
-\subsection examples_fluid fluid
+\subsection examples_fluid FLUID
 
 \par
-\c fluid is not only a big test program, but also a very
-useful visual UI designer. Many parts of \c fluid were
-created using \c fluid. See the \link fluid Fluid Tutorial \endlink
-for more details.
+\c FLUID is not only a big test program, but also a very
+useful visual UI designer. Many parts of \c FLUID were
+created using \c FLUID. Check out the FLUID User Manual and
+the tutorials that come with it at https://www.fltk.org/documentation.php .
 
 
 
diff --git documentation/src/fltk-options.dox documentation/src/fltk-options.dox
index 0478015..20365d1 100644
--- documentation/src/fltk-options.dox
+++ documentation/src/fltk-options.dox
@@ -41,8 +41,8 @@ tool called fltk-options.
 `fltk-options` is a hybrid app that is part of FLTK and can be installed on
 the target system. It includes an up-to-date man page.
 
-\image html fluid-edit-global-fltk-settings.png "fltk-options Application"
-\image latex fluid-edit-global-fltk-settings.png "fltk-options Application" width=10cm
+\image html fltk-options.png "fltk-options Application"
+\image latex fltk-options.png "fltk-options Application" width=10cm
 
 When fltk-options is called without any command-line arguments, it opens in
 interactive mode and provides a user interface to view and alter all
@@ -67,9 +67,9 @@ A full list of options can be found in the manual at Fl::Fl_Option.
 <table summary="navigation bar" width="100%" border="0">
 <tr>
   <td width="45%" align="LEFT">
-    <a class="el" href="fluid.html">
+    <a class="el" href="opengl.html">
     [Prev]
-    Programming with FLUID
+    Using OpenGL
     </a>
   </td>
   <td width="10%" align="CENTER">
diff --git documentation/src/fltk-options.png documentation/src/fltk-options.png
new file mode 100644
index 0000000..fc9bd1d
Binary files /dev/null and documentation/src/fltk-options.png differ
diff --git documentation/src/fluid-catgets.png documentation/src/fluid-catgets.png
deleted file mode 100644
index e68b42c..0000000
Binary files documentation/src/fluid-catgets.png and /dev/null differ
diff --git documentation/src/fluid-edit-global-fltk-settings.png documentation/src/fluid-edit-global-fltk-settings.png
deleted file mode 100644
index fc9bd1d..0000000
Binary files documentation/src/fluid-edit-global-fltk-settings.png and /dev/null differ
diff --git documentation/src/fluid-edit-gui-settings.png documentation/src/fluid-edit-gui-settings.png
deleted file mode 100644
index ce3cadc..0000000
Binary files documentation/src/fluid-edit-gui-settings.png and /dev/null differ
diff --git documentation/src/fluid-edit-proj-settings.png documentation/src/fluid-edit-proj-settings.png
deleted file mode 100644
index 0b44bb1..0000000
Binary files documentation/src/fluid-edit-proj-settings.png and /dev/null differ
diff --git documentation/src/fluid-gettext.png documentation/src/fluid-gettext.png
deleted file mode 100644
index 70845f0..0000000
Binary files documentation/src/fluid-gettext.png and /dev/null differ
diff --git documentation/src/fluid-layout-grid-and-size-settings.png documentation/src/fluid-layout-grid-and-size-settings.png
deleted file mode 100644
index a9f441f..0000000
Binary files documentation/src/fluid-layout-grid-and-size-settings.png and /dev/null differ
diff --git documentation/src/fluid-org.png documentation/src/fluid-org.png
deleted file mode 100644
index dd46459..0000000
Binary files documentation/src/fluid-org.png and /dev/null differ
diff --git documentation/src/fluid-org.xcf documentation/src/fluid-org.xcf
deleted file mode 100644
index 09e98e6..0000000
Binary files documentation/src/fluid-org.xcf and /dev/null differ
diff --git documentation/src/fluid.dox documentation/src/fluid.dox
deleted file mode 100644
index ebfdaaa..0000000
--- documentation/src/fluid.dox
+++ /dev/null
@@ -1,1760 +0,0 @@
-/**
- <!-- Warning: \p .fl  does not work but <tt>.fl</tt>  does -->
- <!-- Warning: \p .h   does not work but <tt>.h</tt>   does -->
- <!-- Warning: \p .cxx does not work but <tt>.cxx</tt> does -->
-
- \page  fluid   Programming with FLUID
-
-This chapter shows how to use the Fast Light User-Interface Designer
-("FLUID") to create your GUIs.
-
-Subchapters:
-
-\li \ref fluid_what_is_fluid
-\li \ref fluid_fluid_under_unix
-\li \ref fluid_fluid_under_windows
-\li \ref fluid_compiling_fl_files
-\li \ref fluid_tutorial
-\li \ref fluid_references
-\li \ref fluid_templates
-\li \ref fluid_i18n
-\li \ref fluid_limitations
-\li \ref fluid_hotkeys
-\li \ref fluid_licenses
-
-\section fluid_what_is_fluid What is FLUID?
-
-The Fast Light User Interface Designer, or FLUID, is a
-graphical editor that is used to produce FLTK source code. FLUID
-edits and saves its state in <tt>.fl</tt> files. These files
-are text, and you can (with care) edit them in a text editor,
-perhaps to get some special effects. The <tt>.fl</tt> file format is explained
-in detail in <tt>fluid/README_fl.txt</tt>
-
-FLUID can "compile" the <tt>.fl</tt> file into a
-<tt>.cxx</tt> and a <tt>.h</tt> file. The <tt>.cxx</tt> file
-defines all the objects from the <tt>.fl</tt> file and the
-<tt>.h</tt> file declares all the global ones. FLUID also
-supports localization (\ref fluid_i18n "Internationalization")
-of label strings and tooltips using message files and the GNU gettext or
-POSIX catgets interfaces.
-
-A simple program can be made by putting all your code (including a
-\p main() function) into the <tt>.fl</tt> file and thus making the
-<tt>.cxx</tt> file a
-single source file to compile. Most programs are more complex than
-this, so you write other <tt>.cxx</tt> files that call the FLUID functions.
-These <tt>.cxx</tt> files must
-\p \#include
-the <tt>.h</tt> file or they can
-\p \#include
-the <tt>.cxx</tt> file so it still appears to be a single source file.
-
- \image html  fluid-org.png "FLUID organization"
- \image latex fluid-org.png "FLUID organization" width=12cm
-
-Normally the FLUID file defines one or more functions or classes which
-output C++ code. Each function defines one or more FLTK
-windows and all the widgets that go inside those windows.
-
-Widgets created by FLUID are either "named", "complex named" or
-"unnamed". A named widget has a legal C++ variable identifier as its
-name (i.e. only alphanumeric and underscore). In this case FLUID
-defines a global variable or class member that will point at the widget
-after the function defining it is called. A complex named object has
-punctuation such as <tt>'.'</tt> or <tt>'->'</tt> or any other symbols
-in its name. In this case FLUID assigns a pointer to the widget to the name,
-but does not attempt to declare it. This can be used to get the widgets into
-structures. An unnamed widget has a blank name and no pointer is stored.
-
-Widgets may either call a named callback function that you write in
-another source file, or you can supply a small piece of C++ source and
-FLUID will write a private callback function into the <tt>.cxx</tt> file.
-
-\section fluid_fluid_under_unix Running FLUID Under UNIX
-
-To run FLUID under UNIX, type:
-
-\code
-fluid filename.fl &
-\endcode
-
-to edit the <tt>.fl</tt> file <tt>filename.fl</tt>.
-If the file does not exist
-you will get an error pop-up, but if you dismiss it you will be editing
-a blank file of that name. You can run FLUID without any name, in
-which case you will be editing an unnamed blank setup (but you can use
-save-as to write it to a file).
-
-You can provide any of the standard FLTK switches before the filename:
-
-\code
--display host:n.n
--geometry WxH+X+Y
--title windowtitle
--name classname
--iconic
--fg color
--bg color
--bg2 color
--scheme schemename
-\endcode
-
-Changing the colors may be useful to see what your interface
-will look at if the user calls it with the same switches.
-Similarly, using "-scheme plastic" will show how the interface
-will look using the "plastic" scheme.
-
-In the current version, if you don't put FLUID into the
-background with <tt>'&'</tt> then you will be able to abort FLUID by
-typing <tt>CTRL-C</tt> on the terminal. It will exit
-immediately, losing any changes.
-
-\section fluid_fluid_under_windows Running FLUID Under Microsoft Windows
-
-To run FLUID under Windows, double-click on the \e FLUID.exe
-file. You can also run FLUID from the Command Prompt window.
-FLUID always runs in the background under Windows.
-
-\section fluid_compiling_fl_files Compiling .fl Files
-
-FLUID can also be called as a command-line
-"compiler" to create the <tt>.cxx</tt> and <tt>.h</tt>
-file from a <tt>.fl</tt> file. To do this type:
-
-\code
-fluid -c filename.fl
-\endcode
-
-This is the same as the menu 'File/Write Code...'.
-It will read the <tt>filename.fl</tt> file and write
-<tt>filename.cxx</tt> and <tt>filename.h</tt>. Any leading
-directory on <tt>filename.fl</tt> will be stripped, so they are
-always written to the current directory. If there are any errors
-reading or writing the files, FLUID will print the error and
-exit with a non-zero code. You can use the following lines in a
-makefile to automate the creation of the source and header
-files:
-
-\code
-my_panels.h my_panels.cxx: my_panels.fl
-        fluid -c my_panels.fl
-\endcode
-
-Most versions of make support rules that cause <tt>.fl</tt>
-files to be compiled:
-
-\code
-.SUFFIXES: .fl .cxx .h
-.fl.h .fl.cxx:
-        fluid -c $<
-\endcode
-
-If you use
-
-\code
-fluid -cs filename.fl
-\endcode
-
-FLUID will also write the "strings" for internationalization in file
-'filename.txt' (menu: 'File/Write Strings...').
-
-Finally there is another option which is useful for program developers
-who have many .fl files and want to upgrade them to the current FLUID
-version. FLUID will read the \p filename.fl file, save it, and exit
-immediately. This writes the file with current syntax and options and
-the current FLTK version in the header of the file. Use
-
-\code
-fluid -u filename.fl
-\endcode
-
-to 'upgrade' \p filename.fl . You may combine this with '-c' or '-cs'.
-
-\note All these commands overwrite existing files w/o warning. You should
-particularly take care when running 'fluid -u' since this overwrites the
-original .fl source file.
-
-
-\section fluid_tutorial A Short Tutorial
-
-FLUID is an amazingly powerful little program. However, this
-power comes at a price as it is not always obvious how to
-accomplish seemingly simple tasks with it. This tutorial will
-show you how to generate a complete user interface class with
-FLUID that is used for the CubeView program provided with FLTK.
-
-\image html cubeview.png "CubeView demo"
-\image latex cubeview.png "CubeView demo" width=10cm
-
-The window is of class CubeViewUI, and is completely generated by FLUID,
-including class member functions. The central display of the cube is a
-separate subclass of Fl_Gl_Window called CubeView. CubeViewUI manages
-CubeView using callbacks from the various sliders and rollers to
-manipulate the viewing angle and zoom of CubeView.
-
-At the completion of this tutorial you will (hopefully) understand how to:
-
--# Use FLUID to create a complete user interface class, including
-   constructor and any member functions necessary.
--# Use FLUID to set callback member functions of custom widget classes.
--# Subclass an Fl_Gl_Window to suit your purposes.
-
-\subsection fluid_cubeview The CubeView Class
-
-The CubeView class is a subclass of Fl_Gl_Window. It has methods for
-setting the zoom, the \e x and \e y pan, and the rotation angle
-about the \e x and \e y axes.
-
-You can safely skip this section as long as you realize that CubeView
-is a sublass of Fl_Gl_Window and will respond to calls from
-CubeViewUI, generated by FLUID.
-
-\par The CubeView Class Definition
-
-Here is the CubeView class definition, as given by its header file
-"test/CubeView.h":
-<br>
-
-<!-- Code copied from test/CubeView.h -->
-\code
-#include <FL/Fl.H>
-#include <FL/Fl_Gl_Window.H>
-#include <FL/gl.h>
-
-class CubeView : public Fl_Gl_Window {
-
-public:
-  CubeView(int x, int y, int w, int h, const char *l = 0);
-
-  // This value determines the scaling factor used to draw the cube.
-  double size;
-
-  /* Set the rotation about the vertical (y) axis.
-   *
-   * This function is called by the horizontal roller in
-   * CubeViewUI and the initialize button in CubeViewUI.
-   */
-  void v_angle(double angle) { vAng = angle; }
-
-  // Return the rotation about the vertical (y) axis.
-  double v_angle() const { return vAng; }
-
-  /* Set the rotation about the horizontal (x) axis.
-   *
-   * This function is called by the vertical roller in
-   * CubeViewUI and the initialize button in CubeViewUI.
-   */
-
-  void h_angle(double angle) { hAng = angle; }
-
-  // The rotation about the horizontal (x) axis.
-  double h_angle() const { return hAng; }
-
-  /* Sets the x shift of the cube view camera.
-   *
-   * This function is called by the slider in CubeViewUI
-   * and the initialize button in CubeViewUI.
-   */
-  void panx(double x) { xshift = x; }
-
-  /* Sets the y shift of the cube view camera.
-   *
-   * This function is called by the slider in CubeViewUI
-   * and the initialize button in CubeViewUI.
-   */
-  void pany(double y) { yshift = y; }
-
-  /* The widget class draw() override.
-   *
-   * The draw() function initializes Gl for another round of
-   * drawing, then calls specialized functions for drawing each
-   * of the entities displayed in the cube view.
-   */
-  void draw();
-
-private:
-  /*  Draw the cube boundaries.
-   *
-   * Draw the faces of the cube using the boxv[] vertices,
-   * using GL_LINE_LOOP for the faces.
-   */
-  void drawCube();
-
-  double vAng, hAng;
-  double xshift, yshift;
-
-  float boxv0[3]; float boxv1[3];
-  float boxv2[3]; float boxv3[3];
-  float boxv4[3]; float boxv5[3];
-  float boxv6[3]; float boxv7[3];
-};
-\endcode
-
-\par The CubeView Class Implementation
-
-Here is the CubeView implementation. It is very similar to the
-"CubeView" demo included with FLTK.
-<br>
-
-<!-- Code copied from test/CubeView.cxx -->
-\code
-#include "CubeView.h"
-#include <math.h>
-
-CubeView::CubeView(int x, int y, int w, int h, const char *l)
-  : Fl_Gl_Window(x, y, w, h, l)
-{
-  Fl::use_high_res_GL(1);
-  vAng = 0.0;
-  hAng = 0.0;
-  size = 10.0;
-  xshift = 0.0;
-  yshift = 0.0;
-
-  /* The cube definition. These are the vertices of a unit cube
-   * centered on the origin.*/
-
-  boxv0[0] = -0.5; boxv0[1] = -0.5; boxv0[2] = -0.5;
-  boxv1[0] =  0.5; boxv1[1] = -0.5; boxv1[2] = -0.5;
-  boxv2[0] =  0.5; boxv2[1] =  0.5; boxv2[2] = -0.5;
-  boxv3[0] = -0.5; boxv3[1] =  0.5; boxv3[2] = -0.5;
-  boxv4[0] = -0.5; boxv4[1] = -0.5; boxv4[2] =  0.5;
-  boxv5[0] =  0.5; boxv5[1] = -0.5; boxv5[2] =  0.5;
-  boxv6[0] =  0.5; boxv6[1] =  0.5; boxv6[2] =  0.5;
-  boxv7[0] = -0.5; boxv7[1] =  0.5; boxv7[2] =  0.5;
-}
-
-void CubeView::drawCube() {
-/* Draw a colored cube */
-#define ALPHA 0.5
-  glShadeModel(GL_FLAT);
-
-  glBegin(GL_QUADS);
-    glColor4f(0.0, 0.0, 1.0, ALPHA);
-    glVertex3fv(boxv0);
-    glVertex3fv(boxv1);
-    glVertex3fv(boxv2);
-    glVertex3fv(boxv3);
-
-    glColor4f(1.0, 1.0, 0.0, ALPHA);
-    glVertex3fv(boxv0);
-    glVertex3fv(boxv4);
-    glVertex3fv(boxv5);
-    glVertex3fv(boxv1);
-
-    glColor4f(0.0, 1.0, 1.0, ALPHA);
-    glVertex3fv(boxv2);
-    glVertex3fv(boxv6);
-    glVertex3fv(boxv7);
-    glVertex3fv(boxv3);
-
-    glColor4f(1.0, 0.0, 0.0, ALPHA);
-    glVertex3fv(boxv4);
-    glVertex3fv(boxv5);
-    glVertex3fv(boxv6);
-    glVertex3fv(boxv7);
-
-    glColor4f(1.0, 0.0, 1.0, ALPHA);
-    glVertex3fv(boxv0);
-    glVertex3fv(boxv3);
-    glVertex3fv(boxv7);
-    glVertex3fv(boxv4);
-
-    glColor4f(0.0, 1.0, 0.0, ALPHA);
-    glVertex3fv(boxv1);
-    glVertex3fv(boxv5);
-    glVertex3fv(boxv6);
-    glVertex3fv(boxv2);
-  glEnd();
-
-  glColor3f(1.0, 1.0, 1.0);
-  glBegin(GL_LINES);
-    glVertex3fv(boxv0);
-    glVertex3fv(boxv1);
-
-    glVertex3fv(boxv1);
-    glVertex3fv(boxv2);
-
-    glVertex3fv(boxv2);
-    glVertex3fv(boxv3);
-
-    glVertex3fv(boxv3);
-    glVertex3fv(boxv0);
-
-    glVertex3fv(boxv4);
-    glVertex3fv(boxv5);
-
-    glVertex3fv(boxv5);
-    glVertex3fv(boxv6);
-
-    glVertex3fv(boxv6);
-    glVertex3fv(boxv7);
-
-    glVertex3fv(boxv7);
-    glVertex3fv(boxv4);
-
-    glVertex3fv(boxv0);
-    glVertex3fv(boxv4);
-
-    glVertex3fv(boxv1);
-    glVertex3fv(boxv5);
-
-    glVertex3fv(boxv2);
-    glVertex3fv(boxv6);
-
-    glVertex3fv(boxv3);
-    glVertex3fv(boxv7);
-  glEnd();
-} // drawCube
-
-void CubeView::draw() {
-  if (!valid()) {
-    glLoadIdentity();
-    glViewport(0, 0, pixel_w(), pixel_h());
-    glOrtho(-10, 10, -10, 10, -20050, 10000);
-    glEnable(GL_BLEND);
-    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-  }
-
-  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-  glPushMatrix();
-
-  glTranslatef((GLfloat)xshift, (GLfloat)yshift, 0);
-  glRotatef((GLfloat)hAng, 0, 1, 0);
-  glRotatef((GLfloat)vAng, 1, 0, 0);
-  glScalef(float(size), float(size), float(size));
-
-  drawCube();
-
-  glPopMatrix();
-}
-\endcode
-
-\subsection fluid_cubeview_ui The CubeViewUI Class
-
-We will completely construct a window to display and control the
-CubeView defined in the previous section using FLUID.
-
-\par Defining the CubeViewUI Class
-
-Once you have started FLUID, the first step in defining a class is to
-create a new class within FLUID using the <b>New->Code->Class</b>
-menu item. Name the class "CubeViewUI" and leave the subclass blank.
-We do not need any inheritance for this window. You should see the
-new class declaration in the FLUID browser window.
-
-\image html  fluid1.png "FLUID file for CubeView"
-\image latex fluid1.png "FLUID file for CubeView" width=10cm
-
-\par Adding the Class Constructor
-
-Click on the CubeViewUI class in the FLUID window and add a new method
-by selecting <b>New->Code->Function/Method.</b> The name of the
-function will also be CubeViewUI. FLUID will understand that this will
-be the constructor for the class and will generate the appropriate
-code. Make sure you declare the constructor public.
-
-Then add a window to the CubeViewUI class. Highlight the name of
-the constructor in the FLUID browser window and click on
-<b>New->Group->Window</b>. In a similar manner add the
-following to the CubeViewUI constructor:
-
-\li A horizontal roller named \p hrot
-\li A vertical roller named \p vrot
-\li A horizontal slider named \p xpan
-\li A vertical slider named \p ypan
-\li A horizontal value slider named \p zoom
-
-None of these additions need be public. And they shouldn't be
-unless you plan to expose them as part of the interface for
-CubeViewUI.
-
-When you are finished you should have something like this:
-
-\image html fluid2.png "FLUID window containing CubeView demo"
-\image latex fluid2.png "FLUID window containing CubeView demo" width=10cm
-
-We will talk about the \p show() method that is highlighted
-shortly.
-
-\par Adding the CubeView Widget
-
-What we have is nice, but does little to show our cube. We have already
-defined the CubeView class and we would like to show it within the
-CubeViewUI.
-
-The CubeView class inherits the Fl_Gl_Window class, which
-is created in the same way as an Fl_Box widget. Use
-<b>New->Other->Box</b> to add a square box to the main window.
-This will be no ordinary box, however.
-
-The Box properties window will appear. The key to letting CubeViewUI
-display CubeView is to enter CubeView in the <b>Class:</b> text
-entry box. This tells FLUID that it is not an Fl_Box, but a
-similar widget with the same constructor.
-
-In the <b>Extra Code:</b> field enter <tt>\#include "CubeView.h"</tt>
-
-This \p \#include is important, as we have just included
-CubeView as a member of CubeViewUI, so any public CubeView methods are
-now available to CubeViewUI.
-
-\image html fluid3-cxx.png "CubeView methods"
-\image latex fluid3-cxx.png "CubeView methods" width=10cm
-
-\par Defining the Callbacks
-
-Each of the widgets we defined before adding CubeView can have
-callbacks that call CubeView methods. You can call an external
-function or put a short amount of code in the <b>Callback</b>
-field of the widget panel. For example, the callback for the
-\p ypan slider is:
-
-\code
-cube->pany(((Fl_Slider *)o)->value());
-cube->redraw();
-\endcode
-
-We call <tt>cube->redraw()</tt> after changing the value to update
-the CubeView window. CubeView could easily be modified to do this, but
-it is nice to keep this exposed. In the case where you may want to do
-more than one view change only redrawing once saves a lot of time.
-
-There is no reason to wait until after you have added CubeView to
-enter these callbacks. FLUID assumes you are smart enough not to refer
-to members or functions that don't exist.
-
-\par Adding a Class Method
-
-You can add class methods within FLUID that have nothing to do with the
-GUI. As an example add a show function so that CubeViewUI can actually
-appear on the screen.
-
-Make sure the top level CubeViewUI is selected and select
-<b>New->Code->Function/Method</b>. Just use the name
-\p show(). We don't need a return value here, and since we will
-not be adding any widgets to this method FLUID will assign it a return
-type of \p void.
-
-\image html fluid4.png "CubeView constructor"
-\image latex fluid4.png "CubeView constructor" width=10cm
-
-Once the new method has been added, highlight its name and select
-<b>New->Code->Code.</b> Enter the method's code in the code window.
-
-\subsection fluid_addconst Adding Constructor Initialization Code
-
-If you need to add code to initialize a class, for example setting
-initial values of the horizontal and vertical angles in the
-CubeView, you can simply highlight the constructor and select
-<b>New->Code->Code</b>. Add any required code.
-
-\subsection fluid_gencode Generating the Code
-
-Now that we have completely defined the CubeViewUI, we have to generate
-the code. There is one last trick to ensure this all works. Open the
-preferences dialog from <b>Edit->Preferences</b>.
-
-At the bottom of the preferences dialog box is the key:
-<b>"Include Header from Code"</b>.
-Select that option and set your desired file
-extensions and you are in business. You can include the CubeViewUI.h
-(or whatever extension you prefer) as you would any other C++ class.
-
-<!-- NEW PAGE -->
-
-\section fluid_references FLUID Reference
-
-The following sections describe each of the windows in FLUID.
-
-\subsection fluid_browser The Widget Browser
-
-The main window shows a menu bar and a scrolling browser of
-all the defined widgets. The name of the <tt>.fl</tt> file being
-edited is shown in the window title.
-
-The widgets are stored in a hierarchy. You can open and close a
-level by clicking the "triangle" at the left of a widget.
-The leftmost widgets are the \e parents, and all the widgets
-listed below them are their \e children. Parents don't have to have
-any children.
-
-The top level of the hierarchy is composed of \e functions and
-\e classes. Each of these will produce a single C++ public function
-or class in the output <tt>.cxx</tt> file. Calling the function or
-instantiating the class will create all of the child widgets.
-
-The second level of the hierarchy contains the \e windows.
-Each of these produces an instance of class Fl_Window.
-
-Below that are either \e widgets (subclasses of Fl_Widget) or
-\e groups of widgets (including other groups). Plain groups are for
-layout, navigation, and resize purposes. <i>Tab groups</i> provide the
-well-known file-card tab interface.
-
-Widgets are shown in the browser by either their \e name (such
-as "main_panel" in the example), or by their \e type
-and \e label (such as "Button "the green"").
-
-You \e select widgets by clicking on their names, which highlights
-them (you can also select widgets from any displayed window). You can
-select many widgets by dragging the mouse across them, or by using
-Shift+Click to toggle them on and off. To select no widgets, click in
-the blank area under the last widget. Note that hidden children may
-be selected even when there is no visual indication of this.
-
-You \e open widgets by double-clicking on them, or (to open several
-widgets you have picked) by typing the F1 key. A control panel will appear
-so you can change the widget(s).
-
-\subsection fluid_menu_items Menu Items
-
-The menu bar at the top is duplicated as a pop-up menu on any
-displayed window. The shortcuts for all the menu items work in any
-window. The menu items are:
-
-\par File/Open... (Ctrl+o)
-
-\par
-Discards the current editing session and reads in a different
-<tt>.fl</tt> file. You are asked for confirmation if you have
-changed the current file.
-
-\par
-FLUID can also read <tt>.fd</tt> files produced by the Forms
-and XForms "fdesign" programs. It is best to
-File/Merge them instead of opening them. FLUID does not
-understand everything in a <tt>.fd</tt> file, and will print a
-warning message on the controlling terminal for all data it does
-not understand. You will probably need to edit the resulting
-setup to fix these errors. Be careful not to save the file
-without changing the name, as FLUID will write over the
-<tt>.fd</tt> file with its own format, which fdesign cannot read!
-
-\par File/Insert... (Ctrl+i)
-
-\par
-Inserts the contents of another <tt>.fl</tt> file, without
-changing the name of the current <tt>.fl</tt> file. All the
-functions (even if they have the same names as the current ones)
-are added, and you will have to use cut/paste to put the widgets
-where you want.
-
-\par File/Save (Ctrl+s)
-
-\par
-Writes the current data to the <tt>.fl</tt> file. If the
-file is unnamed then FLUID will ask for a filename.
-
-\par File/Save As... (Ctrl+Shift+S)
-
-\par
-Asks for a new filename and saves the file.
-
-\par File/Save A Copy...
-
-\par
-Save a copy of the <tt>.fl</tt> data to a different file.
-
-\par File/Revert...
-
-\par
-Revert the <tt>.fl</tt> data to a previously saved state.
-
-\par File/New From Template...
-
-\par
-Create a new user interface design from a previously saved template.
-This can be useful for including a predefined enterprise copyright message
-for projects, or for managing boilerplate code for repeating project code.
-
-\par File/Save As Template...
-
-\par
-Save the current project as a starting point for future projects.
-
-\par File/Print... (Ctrl-P)
-
-\par
-Generate a printout containing all currently open windows within your project.
-
-\par File/Write Code (Ctrl+Shift+C)
-
-\par
-"Compiles" the data into a <tt>.cxx</tt> and <tt>.h</tt>
-file. These are exactly the same as the files you get when you run
-FLUID with the \c -c switch.
-
-\par
-The output file names are the same as the <tt>.fl</tt> file, with
-the leading directory and trailing ".fl" stripped, and
-".h" or ".cxx" appended.
-
-\par File/Write Strings (Ctrl+Shift+W)
-
-\par
-Writes a message file for all of the text labels defined in
-the current file.
-
-\par
-The output file name is the same as the <tt>.fl</tt> file,
-with the leading directory and trailing ".fl"
-stripped, and ".txt", ".po", or ".msg" appended depending on the
-\ref fluid_i18n "Internationalization Mode".
-
-\par File/Quit (Ctrl+q)
-
-\par
-Exits FLUID. You are asked for confirmation if you have
-changed the current file.
-
-\par Edit/Undo (Ctrl+z) and Redo (Shift+Ctrl+z)
-
-\par
-FLUID saves the project state for undo and redo operations after every
-major change.
-
-\par Edit/Cut (Ctrl+x)
-
-\par
-Deletes the selected widgets and all of their children.
-These are saved to a "clipboard" file and can be
-pasted back into any FLUID window.
-
-\par Edit/Copy (Ctrl+c)
-
-\par
-Copies the selected widgets and all of their children to the
-"clipboard" file.
-
-\par Edit/Paste (Ctrl+v)
-
-\par
-Pastes the widgets from the clipboard file.
-
-\par
-If the widget is a window, it is added to whatever function
-is selected, or contained in the current selection.
-
-\par
-If the widget is a normal widget, it is added to whatever
-window or group is selected. If none is, it is added to the
-window or group that is the parent of the current selection.
-
-\par
-To avoid confusion, it is best to select exactly one widget
-before doing a paste.
-
-\par
-Cut/paste is the only way to change the parent of a
-widget.
-
-\par Edit/Select All (Ctrl+a)
-
-\par
-Selects all widgets in the same group as the current selection.
-
-\par
-If they are all selected already then this selects all
-widgets in that group's parent. Repeatedly typing Ctrl+a will
-select larger and larger groups of widgets until everything is
-selected.
-
-\par Edit/Properties... (F1 or double click)
-
-\par
-Displays the current widget in the attributes panel. If the
-widget is a window and it is not visible then the window is
-shown instead.
-
-\par Edit/Sort
-
-\par
-Sorts the selected widgets into left to right, top to bottom order.
-You need to do this to make navigation keys in FLTK work correctly.
-You may then fine-tune the sorting with "Earlier" and "Later".
-This does not affect the positions of windows or functions.
-
-\par Edit/Earlier (F2)
-
-\par
-Moves all of the selected widgets one earlier in order among
-the children of their parent (if possible). This will affect
-navigation order, and if the widgets overlap it will affect how
-they draw, as the later widget is drawn on top of the earlier
-one. You can also use this to reorder functions, classes, and
-windows within functions.
-
-\par Edit/Later (F3)
-
-\par
-Moves all of the selected widgets one later in order among
-the children of their parent (if possible).
-
-\par Edit/Group (F7)
-
-\par
-Creates a new Fl_Group and make all the currently
-selected widgets children of it.
-
-\par Edit/Ungroup (F8)
-
-\par
-Deletes the parent group if all the children of a group are
-selected.
-
-\par Edit/Show or Hide Overlays (Ctrl+Shift+O)
-
-\par
-Toggles the display of the red overlays off, without changing
-the selection. This makes it easier to see box borders and how
-the layout looks. The overlays will be forced back on if you
-change the selection.
-
-\par Edit/Show or Hide Guides (Ctrl+Shift+G)
-
-\par
-Guides can be used to arrange a widget layout easily and consistently. They
-indicating preferred widget positions and sizes with user definable margins,
-grids, and gap sizes. See the "Layout" tab in the "Settings" dialog.
-
-\par
-This menu item enables and disable guides and the snapping action when dragging
-widgets and their borders.
-
-\par Edit/Show or Hide Restricted (Ctrl+Shift+R)
-
-\par
-It is recommended to ensure that user interface elements within FLTK do not
-exceed the size of their container group or overlap with each other.
-By activating this button, a hatch pattern is enabled, visually highlighting
-areas where restricted or undefined behavior may occur.
-
-\par Edit/Show or Hide Widget Bin (Alt+B)
-
-\par
-The widget bin provides quick access to all widget types supported by FLUID.
-Layouts can be created by clicking on elements in the widget bin, or by dragging
-them from the bin to their position within the layout. This button shows or
-hides the widget bin.
-
-\par Edit/Show or Hide Source Code (Shift+Alt+S)
-
-\par
-This button shows or hides the source code preview window. Any change to the
-layout or code in the layout editores can be previewed and verified immediatly
-in the Code View window.
-
-\par Edit/Settings... (Alt+p)
-
-\par
-Displays the FLUID settings panel. The settings panel contains tabs for
-general FLUID settings, project setting, layout preferences, custom shell
-commands, and the internationalisation settings for <i>GNU Gettext</i>
-and <i>POSIX catgets</i>.
-
-\par
-Under the "Project" tab you control the extensions or names of the files
-that are generated by FLUID. If you check the "Include Header from Code"
-button the code file will include the header file automatically.
-
-\par
-Under the "Locale" tab are the \ref fluid_i18n "internationalization"
-options, described later in this chapter.
-
-\image html fluid-edit-gui-settings.png "FLUID General Settings Tab"
-\image latex fluid-edit-gui-settings.png "FLUID General Settings Tab" width=10cm
-
-\image html fluid-edit-proj-settings.png "FLUID Project Settings Tab"
-\image latex fluid-edit-proj-settings.png "FLUID Project Settings Tab" width=10cm
-
-\par New/Code/Function
-
-\par
-Creates a new C function. You will be asked for a name for
-the function. This name should be a legal C++ function
-template, without the return type. You can pass arguments which
-can be referred to by code you type into the individual widgets.
-
-\par
-If the function contains any unnamed windows, it will be
-declared as returning an Fl_Window pointer. The unnamed window
-will be returned from it (more than one unnamed window is
-useless). If the function contains only named windows, it will
-be declared as returning nothing (\c void ).
-
-\par
-It is possible to make the <tt>.cxx</tt> output be a
-self-contained program that can be compiled and executed. This
-is done by deleting the function name so
-\p main(argc,argv) is used. The function will call
-\p show() on all the windows it creates and then call
-\p Fl::run(). This can also be used to test resize
-behavior or other parts of the user interface.
-
-\par
-You can change the function name by double-clicking on the
-function.
-
-\par New/Window
-
-\par
-Creates a new Fl_Window widget. The window is added
-to the currently selected function, or to the function
-containing the currently selected item. The window will appear,
-sized to 100x100. You can resize it to whatever size you
-require.
-
-\par
-The widget panel will also appear and is described later in
-this chapter.
-
-\par New/...
-
-\par
-All other items on the New menu are subclasses of
-Fl_Widget. Creating them will add them to the
-currently selected group or window, or the group or window
-containing the currently selected widget. The initial
-dimensions and position are chosen by copying the current
-widget, if possible.
-
-\par
-When you create the widget you will get the widget's control
-panel, which is described later in this chapter.
-
-\par Layout/Align/...
-
-\par
-Align all selected widgets to the first widget in the selection.
-
-\par Layout/Space Evenly/...
-
-\par
-Space all selected widgets evenly inside the selected space.
-Widgets will be sorted from first to last.
-
-\par Layout/Make Same Size/...
-
-\par
-Make all selected widgets the same size as the first selected widget.
-
-\par Layout/Center in Group/...
-
-\par
-Center all selected widgets relative to their parent widget
-
-\par Layout/Grid and Size Settings... (Ctrl+g)
-
-\par
-Displays the grid settings panel.
-
-\par
-This panel controls dimensions that all widgets snap to when you move
-and resize them, and for the "snap" which is how far a widget has to be
-dragged from its original position to actually change.
-
-Layout preferences are defined using margins to parent groups and window, gaps
-between widget, and /orr by overlaying a grid over a group or window. A layout
-comes as a suite of three presets, one for the main application window, one
-for dialog boxes, and one for toolboxes.
-
-FLUID comes with two include layout suites. `FLTK` was used to design FLUID and
-other included apps, and `Grid` is a more ridgid grid layout. Users can add
-more suites, import and export them, and include them into their <tt>.fl</tt>
-project files.
-
-\image html fluid-layout-grid-and-size-settings.png "FLUID Layout/Grid Settings Window"
-\image latex fluid-layout-grid-and-size-settings.png "FLUID Layout/Grid Settings Window" width=10cm
-
-\par Shell/Execute Command... (Alt+x)
-
-\par
-Displays the shell command panel. The shell command
-is commonly used to run a 'make' script to compile the FLTK output.
-
-\par Shell/Execute Again (Alt+g)
-
-\par
-Run the shell command again.
-
-\par Help/Repid development with FLUID
-
-\par
-Shows this chapter of the manual.
-
-\par Help/FLTK Programmers Manual
-
-\par
-Shows the contents page of the manual
-
-\par Help/About FLUID
-
-\par
-Pops up a panel showing the version of FLUID.
-
-\subsection fluid_widget_panel The Widget Panel
-
-When you double-click on a widget or a set of widgets you
-will get the "widget attribute panel".
-
-When you change attributes using this panel, the changes are
-reflected immediately in the window. It is useful to hit the
-"Hide Overlays" button (or type Ctrl+Shift+O) to hide the
-red overlay so you can see the widgets more accurately,
-especially when setting the box type.
-
-If you have several widgets selected, they may have different
-values for the fields. In this case the value for \e one of
-the widgets is shown. But if you change this value, \e all
-of the selected widgets are changed to the new value.
-
-Hitting "OK" makes the changes permanent.
-Selecting a different widget also makes the changes permanent.
-FLUID checks for simple syntax errors such as mismatched
-parenthesis in any code before saving any text.
-
-<!-- NEW PAGE -->
-
-\image html fluid_widget_gui.png "The FLUID widget GUI attributes"
-\image latex fluid_widget_gui.png "The FLUID widget GUI attributes" width=10cm
-
-\section fluid_widget_attributes GUI Attributes
-
-\par Not all fields in the Widget attributes dialog will be visible
-for all types of widgets.
-
-\par Label (text field)
-
-\par
-String to print next to or inside the button. You can put
-newlines into the string to make multiple lines. The easiest way
-is by typing Ctrl+j.
-
-\par
-\ref common_labels "Symbols"
-can be added to the label using the at sign ("@").
-
-\par Label (pull down menu)
-
-\par
-How to draw the label. Normal, shadowed, engraved, and
-embossed change the appearance of the text.
-
-\par Image
-
-\par
-The active image for the widget. Click on the
-\b Browse... button to pick an image file using the file
-chooser.
-
-\par Inactive
-
-\par
-The inactive image for the widget. Click on the
-\b Browse... button to pick an image file using the file
-chooser.
-
-\par Alignment (buttons)
-
-\par
-Where to draw the label. The arrows put it on that side of the
-widget, you can combine them to put it in the corner. The "box"
-button puts the label inside the widget, rather than outside.
-
-\par
-The \b clip button clips the label to the widget box, the
-\b wrap button wraps any text in the label, and the
-<b>text image</b> button puts the text over the image instead of under
-the image.
-
-\par Position (text fields)
-
-\par
-The position fields show the current position and size of the
-widget box. Enter new values to move and/or resize a widget.
-
-\par
-These fields understand basic math and variables.
-Appending <tt>+10</tt> to the <b>X</b> coordinate will move a widget 10 units
-to the right without having to reenter the value.
-Entering the formula <tt>w+3</tt> in the <b>Width</b> field will widen all
-selected Widgets by 3 units.
-The formula <tt>py+i*20</tt> in the <b>Y</b> field will order all selected
-widgets vertically in their group by increments of 20 units.
-
-\par
-<table>
-<tr><th>Name</th><th>Value</th></tr>
-<tr><td> `i` </td><td> zero based counter of selected widgets </td></tr>
-<tr><td> `x`, `y`, `w`, `h` </td><td> position and size of the current widget </td></tr>
-<tr><td> `px`, `py`, `pw`, `ph` </td><td> dimensions of the parent widget </td></tr>
-<tr><td> `sx`, `sy`, `sw`, `sh` </td><td> dimensions of the previous sibling </td></tr>
-<tr><td> `cx`, `cy`, `cw`, `ch` </td><td> bounding box of all children </td></tr>
-</table>
-
-\par Values (text fields)
-
-\par
-The values and limits of the current widget. Depending on the
-type of widget, some or all of these fields may be inactive.
-
-\par Shortcut
-
-\par
-The shortcut key to activate the widget. Click on the
-shortcut button and press any key sequence to set the shortcut.
-
-\par Attributes (buttons)
-
-\par
-The \b Visible button controls whether the widget is
-visible (on) or hidden (off) initially. Don't change this for
-windows or for the immediate children of a Tabs group.
-
-\par
-The \b Active button controls whether the widget is
-activated (on) or deactivated (off) initially. Most widgets
-appear greyed out when deactivated.
-
-\par
-The \b Resizable button controls whether the window is
-resizeable. In addition all the size changes of a window or
-group will go "into" the resizable child. If you have
-a large data display surrounded by buttons, you probably want
-that data area to be resizable. You can get more complex
-behavior by making invisible boxes the resizable widget, or by
-using hierarchies of groups. Unfortunately the only way to test
-it is to compile the program. Resizing the FLUID window is
-\e not the same as what will happen in the user program.
-
-\par
-The \b Hotspot button causes the parent window to be
-positioned with that widget centered on the mouse. This
-position is determined <i>when the FLUID function is called</i>,
-so you should call it immediately before showing the window. If
-you want the window to hide and then reappear at a new position,
-you should have your program set the hotspot itself just before
-\p show().
-
-\par
-The \b Border button turns the window manager border on
-or off. On most window managers you will have to close the
-window and reopen it to see the effect.
-
-\par X Class (text field)
-
-\par
-The string typed into here is passed to the X window manager
-as the class. This can change the icon or window decorations.
-On most (all?) window managers you will have to close the window
-and reopen it to see the effect.
-
-\image html fluid_widget_style.png "The FLUID widget Style attributes"
-\image latex fluid_widget_style.png "The FLUID widget Style attributes" width=10cm
-
-\subsection fluid_style_attributes Style Attributes
-
-\par Label Font (pulldown menu)
-
-\par
-Font to draw the label in. Ignored by symbols, bitmaps, and
-pixmaps. Your program can change the actual font used by these
-"slots" in case you want some font other than the 16
-provided.
-
-\par Label Size (pulldown menu)
-
-\par
-Pixel size (height) for the font to draw the label in.
-Ignored by symbols, bitmaps, and pixmaps. To see the result
-without dismissing the panel, type the new number and then Tab.
-
-\par Label Color (button)
-
-\par
-Color to draw the label. Ignored by pixmaps (bitmaps,
-however, do use this color as the foreground color).
-
-\par Box (pulldown menu)
-
-\par
-The boxtype to draw as a background for the widget.
-
-\par
-Many widgets will work, and draw faster, with a
-"frame" instead of a "box". A frame does
-not draw the colored interior, leaving whatever was already
-there visible. Be careful, as FLUID may draw this ok but the
-real program may leave unwanted stuff inside the widget.
-
-\par
-If a window is filled with child widgets, you can speed up
-redrawing by changing the window's box type to
-"NO_BOX". FLUID will display a checkerboard for any
-areas that are not colored in by boxes. Note that this
-checkerboard is not drawn by the resulting program. Instead
-random garbage will be displayed.
-
-\par Down Box (pulldown menu)
-
-\par
-The boxtype to draw when a button is pressed or for some
-parts of other widgets like scrollbars and valuators.
-
-\par Color (button)
-
-\par
-The color to draw the box with.
-
-\par Select Color (button)
-
-\par
-Some widgets will use this color for certain parts. FLUID
-does not always show the result of this: this is the color
-buttons draw in when pushed down, and the color of input fields
-when they have the focus.
-
-\par Text Font, Size, and Color
-
-\par
-Some widgets display text, such as input fields, pull-down
-menus, and browsers.
-
-\image html fluid_widget_cxx.png "The FLUID widget C++ attributes"
-\image latex fluid_widget_cxx.png "The FLUID widget C++ attributes" width=10cm
-
-\subsection fluid_cpp_attributes C++ Attributes
-
-\par Class
-
-\par
-This is how you use your own subclasses of
-Fl_Widget. Whatever identifier you type in here will
-be the class that is instantiated.
-
-\par
-In addition, no \p \#include header file is put in the
-<tt>.h</tt> file. You must provide a \p \#include line as
-the first line of the "Extra Code" which declares your
-subclass.
-
-\par
-The class must be similar to the class you are spoofing. It
-does not have to be a subclass. It is sometimes useful to
-change this to another FLTK class. For windows you can select either
-\p Single or \p Double in the drop-down box right to the "Class:" field
-to get a normal window (Fl_Window) or a double-buffered window
-(Fl_Double_Window), respectively.
-
-\par Type (upper-right pulldown menu)
-
-\par
-Some classes have subtypes that modify their appearance or behavior.
-You pick the subtype off of this menu.
-
-\par Name (text field)
-
-\par
-Name of a variable to declare, and to store a pointer to this
-widget into. This variable will be of type "<class>*". If the name is
-blank then no variable is created.
-
-\par
-You can name several widgets with "name[0]", "name[1]", "name[2]", etc.
-This will cause FLUID to declare an array of pointers. The array
-is big enough that the highest number found can be stored. All widgets
-in the array must be the same type.
-
-\par Public (button)
-
-\par
-Controls whether the widget is publicly accessible. When
-embedding widgets in a C++ class, this controls whether the
-widget is \p public or \p private in the class.
-Otherwise it controls whether the widget is declared
-\p static or global (\p extern ).
-
-\par Extra Code (text fields)
-
-\par
-These four fields let you type in literal lines of code to
-dump into the <tt>.h</tt> or <tt>.cxx</tt> files.
-
-\par
-If the text starts with a <tt>\#</tt> or the word
-\p extern then FLUID thinks this is an "include"
-line, and it is written to the <tt>.h</tt> file. If the same
-include line occurs several times then only one copy is
-written.
-
-\par
-All other lines are "code" lines. The current
-widget is pointed to by the local variable \p o. The
-window being constructed is pointed to by the local variable
-\p w. You can also access any arguments passed to the
-function here, and any named widgets that are before this one.
-
-\par
-FLUID will check for matching parenthesis, braces, and
-quotes, but does not do much other error checking. Be careful
-here, as it may be hard to figure out what widget is producing
-an error in the compiler. If you need more than four lines you
-probably should call a function in your own <tt>.cxx</tt>
-code.
-
-\par Callback (text field)
-
-\par
-This can either be the name of a function, or a small snippet
-of code. If you enter anything other than letters, numbers, and the
-underscore then FLUID treats it as code.
-
-\par
-A name refers to a function in your own code. It must be
-declared as <tt>void name(<class>*,void*)</tt>.
-
-\par
-A code snippet is inserted into a static function in the
-<tt>.cxx</tt> output file. The function prototype is
-<tt>void name(class *o, void *v)</tt>
-so that you can refer to the widget as \p o and the \p user_data()
-as \p v. FLUID will check for matching parenthesis, braces,
-and quotes, but does not do much other error checking. Be
-careful here, as it may be hard to figure out what widget is
-producing an error in the compiler.
-
-\par
-If the callback is blank then no callback is set.
-
-\par User Data (text field)
-
-\par
-This is a value for the \p user_data() of the widget.
-If blank the default value of zero is used. This can be any
-piece of C code that can be cast to a \p void pointer.
-
-\par Type (text field)
-
-\par
-The \p void* in the callback function prototypes is
-replaced with this. You may want to use \p long for old
-XForms code. Be warned that anything other than \p void*
-is not guaranteed to work! However on most architectures other
-pointer types are ok, and \p long is usually ok, too.
-
-\par When (pulldown menu)
-
-\par
-When to do the callback. This can be \b Never,
-\b Changed, \b Release, or \b Enter Key. The value of
-<b>Enter Key</b> is only useful for text input fields.
-
-\par
-There are other rare but useful values for the
-\p when() field that are not in the menu. You should use
-the extra code fields to put these values in.
-
-\par No Change (button)
-
-\par
-The <b>No Change</b> button means the callback is done on the
-matching event even if the data is not changed.
-
-\section fluid_selecting_moving Selecting and Moving Widgets
-
-Double-clicking a window name in the browser will display it,
-if not displayed yet. From this display you can select widgets,
-sets of widgets, and move or resize them. To close a window
-either double-click it or type \c ESC.
-
-To select a widget, click it. To select several widgets drag
-a rectangle around them. Holding down shift will toggle the
-selection of the widgets instead.
-
-You cannot pick hidden widgets. You also cannot choose some
-widgets if they are completely overlapped by later widgets. Use
-the browser to select these widgets.
-
-The selected widgets are shown with a red "overlay"
-line around them. You can move the widgets by dragging this
-box. Or you can resize them by dragging the outer edges and
-corners. Hold down the Alt key while dragging the mouse to
-defeat the snap-to-grid effect for fine positioning.
-
-If there is a tab box displayed you can change which child is
-visible by clicking on the file tabs. The child you pick is
-selected.
-
-The arrow, tab, and shift+tab keys "navigate" the
-selection. Left, right, tab, or shift+tab move to the next or
-previous widgets in the hierarchy. Hit the right arrow enough
-and you will select every widget in the window. Up/down widgets
-move to the previous/next widgets that overlap horizontally. If
-the navigation does not seem to work you probably need to
-"Sort" the widgets. This is important if you have
-input fields, as FLTK uses the same rules when using arrow keys
-to move between input fields.
-
-To "open" a widget, double click it. To open
-several widgets select them and then type F1 or pick
-"Edit/Open" off the pop-up menu.
-
-Type Ctrl+o to temporarily toggle the overlay off without
-changing the selection, so you can see the widget borders.
-
-You can resize the window by using the window manager border
-controls. FLTK will attempt to round the window size to the
-nearest multiple of the grid size and makes it big enough to
-contain all the widgets (it does this using illegal X methods,
-so it is possible it will barf with some window managers!).
-Notice that the actual window in your program may not be
-resizable, and if it is, the effect on child widgets may be
-different.
-
-The panel for the window (which you get by double-clicking
-it) is almost identical to the panel for any other Fl_Widget.
-There are three extra items:
-
-\section fluid_images Image Labels
-
-The \e contents of the image files in the \b Image
-and \b Inactive text fields are written to the <tt>.cxx</tt>
-file. If many widgets share the same image then only one copy is
-written. Since the image data is embedded in the generated
-source code, you need only distribute the C++ code and not the
-image files themselves.
-
-However, the \e filenames are stored in the <tt>.fl</tt>
-file so you will need the image files as well to read the
-<tt>.fl</tt> file. Filenames are relative to the location of the
-<tt>.fl</tt> file and not necessarily the current directory. We
-recommend you either put the images in the same directory as the
-<tt>.fl</tt> file, or use absolute path names.
-
-\par Notes for All Image Types
-
-\par
-FLUID runs using the default visual of your X server. This
-may be 8 bits, which will give you dithered images. You may get
-better results in your actual program by adding the code
-"Fl::visual(FL_RGB)" to your code right before the
-first window is displayed.
-
-\par
-All widgets with the same image on them share the same code
-and source X pixmap. Thus once you have put an image on a
-widget, it is nearly free to put the same image on many other
-widgets.
-
-\par
-If you edit an image at the same time you are using it in FLUID,
-the only way to convince FLUID to read the image file again is to
-remove the image from all widgets that are using it or re-load the
-<tt>.fl</tt> file.
-
-\par
-Don't rely on how FLTK crops images that are outside the
-widget, as this may change in future versions! The cropping of
-inside labels will probably be unchanged.
-
-\par
-To more accurately place images, make a new "box"
-widget and put the image in that as the label.
-
-\par XBM (X Bitmap) Files
-
-\par
-FLUID reads X bitmap files which use C source code to define
-a bitmap. Sometimes they are stored with the ".h" or
-".bm" extension rather than the standard
-".xbm" extension.
-
-\par
-FLUID writes code to construct an Fl_Bitmap image and use it
-to label the widget. The '1' bits in the bitmap are drawn using
-the label color of the widget. You can change this color in the
-FLUID widget attributes panel. The '0' bits are transparent.
-
-\par
-The program "bitmap" on the X distribution does an
-adequate job of editing bitmaps.
-
-\par XPM (X Pixmap) Files
-
-\par
-FLUID reads X pixmap files as used by the \p libxpm
-library. These files use C source code to define a pixmap. The
-filenames usually have the ".xpm" extension.
-
-\par
-FLUID writes code to construct an Fl_Pixmap image and use it
-to label the widget. The label color of the widget is ignored,
-even for 2-color images that could be a bitmap. XPM files can
-mark a single color as being transparent, and FLTK uses this
-information to generate a transparency mask for the image.
-
-\par
-We have not found any good editors for small iconic pictures.
-For pixmaps we have used
-<A href="http://home.worldonline.dk/~torsten/xpaint/index.html";>XPaint</A>
-and the KDE icon editor.
-
-\par BMP Files
-
-\par
-FLUID reads Windows BMP image files which are often used in
-Windows applications for icons. FLUID converts BMP files into
-(modified) XPM format and uses an Fl_BMP_Image image to label the
-widget. Transparency is handled the same as for XPM files. All
-image data is uncompressed when written to the source file, so
-the code may be much bigger than the <tt>.bmp</tt> file.
-
-\par GIF Files
-
-\par
-FLUID reads GIF image files which are often used in HTML
-documents to make icons. FLUID converts GIF files into
-(modified) XPM format and uses an Fl_GIF_Image image to label the
-widget. Transparency is handled the same as for XPM files. All
-image data is uncompressed when written to the source file, so
-the code may be much bigger than the <tt>.gif</tt> file. Only
-the first image of an animated GIF file is used.
-
-\par JPEG Files
-
-\par
-If FLTK is compiled with JPEG support, FLUID can read JPEG
-image files which are often used for digital photos. FLUID uses
-an Fl_JPEG_Image image to label the widget, and writes
-uncompressed RGB or grayscale data to the source file.
-
-\par PNG (Portable Network Graphics) Files
-
-\par
-If FLTK is compiled with PNG support, FLUID can read PNG
-image files which are often used in HTML documents. FLUID uses a
-Fl_PNG_Image image to label the widget, and writes uncompressed
-RGB or grayscale data to the source file. PNG images can provide
-a full alpha channel for partial transparency, and FLTK supports
-this as best as possible on each platform.
-
-\section fluid_templates FLUID Templates
-
-\par
-Fluid can store a number of project templates. Project templates
-are great for storing often used boilerplate code for fast access.
-A common use would be projects with readily prepared copyright messages.
-
-\par
-A sample template for FLTK projects is included with Fluid.
-
-\par
-Choose "File > New From Template..." to create a new project
-based on a template file. In the template dialog, select one of
-the existing templates. All occurrences of the word
-"@INSTANCE@" in the template are replaced with the text in
-the "Instance" field. To create the new project click "New".
-
-\par
-To add your current project as a new template, choose
-"File > Save As Template...", fill in a name, and click "Save".
-
-\par
-To delete a template, open the template dialog using
-"New from Template" or "Save As Template", then select any
-existing template, and click "Delete Template".
-
-\section fluid_i18n Internationalization with FLUID
-
-FLUID supports internationalization (I18N for short) of label
-strings and tooltips used by widgets. The GNU gettext option also
-supports deferred translation of statically initialised menu item
-labels. The preferences window (<tt>Ctrl+p</tt>) provides access
-to the I18N options.
-
-\subsection fluid_i18n_methods I18N Methods
-
-FLUID supports three methods of I18N: none, GNU
-gettext, and POSIX catgets. The "none" method is the
-default and just passes the label strings as-is to the widget
-constructors.
-
-The "GNU gettext" method uses GNU gettext (or a similar
-text-based I18N library) to retrieve a localized string before
-calling the widget constructor.
-
-The "POSIX catgets" method uses the POSIX catgets function to
-retrieve a numbered message from a message catalog before
-calling the widget constructor.
-
-\subsection fluid_gettext_i18n Using GNU gettext for I18N
-
-FLUID's code support for GNU gettext is limited to calling a
-function or macro to retrieve the localized label; you still
-need to call \p setlocale() and \p textdomain() or
-\p bindtextdomain() to select the appropriate language and
-message file.
-
-To use GNU gettext for I18N, open the preferences window and
-choose "GNU gettext" from the \b Use: chooser. Four new input
-fields will then appear to control the include file and
-function/macro names to use when retrieving localized label
-strings in dynamic allocation and static initialisation.
-
- \image html fluid-gettext.png "Internationalization using GNU gettext"
- \image latex fluid-gettext.png "Internationalization using GNU gettext" width=10cm
-
-The \b \#include
-field controls the header file to include for
-I18N; by default this is \b <libintl.h>, the
-standard I18N file for GNU gettext.
-
-If the \b Conditional: field contains a macro name, i18n will only be compiled
-into the product if this macro is defined. The build system should define the
-macro only if all required headers and libraries are available. If the macro
-is not defined, no headers are included and `gettext` passes text through
-untranslated.
-
-The \b Function: field controls the function (or macro) that
-will retrieve the localized message; by default the
-\p gettext function will be called.
-
-The **Static Function:** field names a macro that will mark static text
-fields for extraction with the `xgettext` tool. The default macro name is
-\p gettext_noop and will be defined as `#define gettext_noop(text) text`
-right after the `#include` statement. Fluid will do its best to call
-`gettext` on static texts later, after the textdomain was set by the user.
-
-\see [GNU gettext special cases](https://www.gnu.org/software/gettext/manual/html_node/Special-cases.html)
-
-\subsection fluid_catgets_i18n Using POSIX catgets for I18N
-
-FLUID's code support for POSIX catgets allows you to use a
-global message file for all interfaces or a file specific to
-each <tt>.fl</tt> file; you still need to call
-\p setlocale() to select the appropriate language.
-
-To use POSIX catgets for I18N, open the preferences window
-and choose "POSIX catgets" from the \b Use: chooser. Three new
-input fields will then appear to control the include file,
-catalog file, and set number for retrieving the localized label
-strings.
-
- \image html fluid-catgets.png "Internationalization using POSIX catgets"
- \image latex fluid-catgets.png "Internationalization using POSIX catgets" width=10cm
-
-The \b \#include
-field controls the header file to include for
-I18N; by default this is \b <nl_types.h>, the
-standard I18N file for POSIX catgets.
-
-The \b File: field controls the name of the catalog file
-variable to use when retrieving localized messages; by default
-the file field is empty which forces a local (static) catalog
-file to be used for all of the windows defined in your
-<tt>.fl</tt> file.
-
-The \b Set: field controls the set number in the catalog file.
-The default set is 1 and rarely needs to be changed.
-
-\section fluid_limitations Known Limitations
-
-Declaration Blocks can be used to temporarily block out already
-designed code using <tt>\#if 0</tt> and <tt>\#endif</tt>
-type construction. This will effectively avoid compilation of
-blocks of code. However, static code and data generated by this
-segment (menu items, images, include statements, etc.) will still
-be generated and likely cause compile-time warnings.
-
-\section fluid_hotkeys Keyboard Shortcuts
-
-On Apple computers, use the Apple Command key instead of Ctrl.
-
-<table>
-<tr><th>Key Combo</th><th>Function</th></tr>
-<tr><td> `F1` </td><td> widget properties dialog </td></tr>
-<tr><td> `F2` </td><td> move widget earlier in tree </td></tr>
-<tr><td> `F3` </td><td> move widget later in tree </td></tr>
-<tr><td> `F7` </td><td> group widgets </td></tr>
-<tr><td> `F8` </td><td> ungroup widgets </td></tr>
-<tr><td> `Delete` </td><td> delete selected widgets </td></tr>
-<tr><td> `Ctrl-1..9` </td><td> load project from history </td></tr>
-<tr><td> `Alt-1` </td><td> label text tiny </td></tr>
-<tr><td> `Alt-2` </td><td> lLabel text small </td></tr>
-<tr><td> `Alt-3` </td><td> label text normal </td></tr>
-<tr><td> `Alt-4` </td><td> label text medium </td></tr>
-<tr><td> `Alt-5` </td><td> label text large </td></tr>
-<tr><td> `Alt-6` </td><td> label text huge </td></tr>
-<tr><td> `Ctrl-A` </td><td> select all </td></tr>
-<tr><td> `Shift-Ctrl-A` </td><td> select none </td></tr>
-<tr><td> `Alt-B` </td><td>  </td> widget bin </tr>
-<tr><td> `Ctrl-C` </td><td> copy widgets </td></tr>
-<tr><td> `Shift-Ctrl-C` </td><td> generate C code </td></tr>
-<tr><td> `Ctrl-G` </td><td> grid setting dialog </td></tr>
-<tr><td> `Alt-G` </td><td> execute again </td></tr>
-<tr><td> `Shift-Alt-G` </td><td> FLTK settings dialog </td></tr>
-<tr><td> `Ctrl-I` </td><td> insert design into project </td></tr>
-<tr><td> `Ctrl-N` </td><td> new design </td></tr>
-<tr><td> `Shift-Ctrl-N` </td><td> new design from template </td></tr>
-<tr><td> `Ctrl-O` </td><td> open design file </td></tr>
-<tr><td> `Shift-Ctrl-O` </td><td> toggle overlays </td></tr>
-<tr><td> `Ctrl-P` </td><td> print all windows </td></tr>
-<tr><td> `Alt-P` </td><td> project settings </td></tr>
-<tr><td> `Shift-Alt-P` </td><td> Fluid settings dialog </td></tr>
-<tr><td> `Ctrl-Q` </td><td> quit Fluid </td></tr>
-<tr><td> `Ctrl-S` </td><td> save design </td></tr>
-<tr><td> `Shift-Ctrl-S` </td><td> save design with new name </td></tr>
-<tr><td> `Shift-Alt-S` </td><td> source view window </td></tr>
-<tr><td> `Ctrl-U` </td><td> duplicate widgets </td></tr>
-<tr><td> `Ctrl-V` </td><td> paste widgets </td></tr>
-<tr><td> `Shift-Ctrl-W` </td><td> write text strings </td></tr>
-<tr><td> `Ctrl-X` </td><td> cut selected Widgets </td></tr>
-<tr><td> `Alt-X` </td><td> show 'execute command' dialog </td></tr>
-<tr><td> `Ctrl-Z` </td><td> undo </td></tr>
-<tr><td> `Shift-Ctrl-Z` </td><td> redo </td></tr>
-<tr><th>Key Combo</th><th>Function in interactive Window</th></tr>
-<tr><td> `LMB` </td><td> select one widget </td></tr>
-<tr><td> `Shift-LMB` </td><td> extend widget selection </td></tr>
-<tr><td> `Shift-LMB-Drag` </td><td> window only: resize proportional </td></tr>
-<tr><td> `Tab` </td><td> select next </td></tr>
-<tr><td> `Shift-Tab` </td><td> select previous </td></tr>
-<tr><td> `Arrow` </td><td> move by one unit </td></tr>
-<tr><td> `Shift-Arrow` </td><td> resize by one unit </td></tr>
-<tr><td> `Ctrl-Arrow` </td><td> move by grid units </td></tr>
-<tr><td> `Shift-Ctrl-Arrow` </td><td> resize by grid units </td></tr>
-</table>
-
-\section fluid_licenses Licenses
-
-FLUID uses graphical images based on the Zendesk Garden Stroke icon set:
-<a href="">https://github.com/zendeskgarden</a>.
-Garden Stroke is licensed under the Apache License, Version 2.0:
-<a href="">https://www.apache.org/licenses/LICENSE-2.0.html</a>.
-
-\htmlonly
-<hr>
-<table summary="navigation bar" width="100%" border="0">
-<tr>
-  <td width="45%" align="LEFT">
-    <a class="el" href="opengl.html">
-    [Prev]
-    Using OpenGL
-    </a>
-  </td>
-  <td width="10%" align="CENTER">
-    <a class="el" href="index.html">[Index]</a>
-  </td>
-  <td width="45%" align="RIGHT">
-    <a class="el" href="fltk-options.html">
-    FLTK Runtime Options
-    [Next]
-    </a>
-  </td>
-</tr>
-</table>
-\endhtmlonly
-
-*/
diff --git documentation/src/fluid1.png documentation/src/fluid1.png
deleted file mode 100644
index dbded1c..0000000
Binary files documentation/src/fluid1.png and /dev/null differ
diff --git documentation/src/fluid2.png documentation/src/fluid2.png
deleted file mode 100644
index 7c8faca..0000000
Binary files documentation/src/fluid2.png and /dev/null differ
diff --git documentation/src/fluid3-cxx.png documentation/src/fluid3-cxx.png
deleted file mode 100644
index 57ed92d..0000000
Binary files documentation/src/fluid3-cxx.png and /dev/null differ
diff --git documentation/src/fluid3-gui.png documentation/src/fluid3-gui.png
deleted file mode 100644
index 48d564c..0000000
Binary files documentation/src/fluid3-gui.png and /dev/null differ
diff --git documentation/src/fluid3-style.png documentation/src/fluid3-style.png
deleted file mode 100644
index b7d02a2..0000000
Binary files documentation/src/fluid3-style.png and /dev/null differ
diff --git documentation/src/fluid4.png documentation/src/fluid4.png
deleted file mode 100644
index 60cec74..0000000
Binary files documentation/src/fluid4.png and /dev/null differ
diff --git documentation/src/fluid_widget_cxx.png documentation/src/fluid_widget_cxx.png
deleted file mode 100644
index c5261fb..0000000
Binary files documentation/src/fluid_widget_cxx.png and /dev/null differ
diff --git documentation/src/fluid_widget_gui.png documentation/src/fluid_widget_gui.png
deleted file mode 100644
index df26e73..0000000
Binary files documentation/src/fluid_widget_gui.png and /dev/null differ
diff --git documentation/src/fluid_widget_style.png documentation/src/fluid_widget_style.png
deleted file mode 100644
index fd44a0f..0000000
Binary files documentation/src/fluid_widget_style.png and /dev/null differ
diff --git documentation/src/index.dox documentation/src/index.dox
index 48494d2..e82bccf 100644
--- documentation/src/index.dox
+++ documentation/src/index.dox
@@ -67,11 +67,6 @@
 
     \subpage opengl
 
-    \subpage fluid
-        - \ref fluid_widget_attributes
-        - \ref fluid_selecting_moving
-        - \ref fluid_images
-
     \subpage fltk-options
 
     \subpage advanced
diff --git documentation/src/intro.dox documentation/src/intro.dox
index 7e441b5..48eee0d 100644
--- documentation/src/intro.dox
+++ documentation/src/intro.dox
@@ -142,6 +142,17 @@ the toolkit, which was already in use by several people, Bill
 came up with "FLTK", including a bogus excuse that it
 stands for "The Fast Light Toolkit".
 
+\section intro_fluid FLUID
+
+FLTK comes bundled with FLUID. FLUID, short for Fast Light User Interface
+Designer, is a graphical editor capable of generating C++ source code and
+header files ready for compilation. These files ultimately create the graphical
+user interface for an application.
+
+The FLUID User Handbook is available at https://www.fltk.org/documentation.php .
+It can also be compiled from the FLTK source repository using the `fluid_docs`
+target in the CMake build environment.
+
 \section intro_cmake Building and Installing FLTK with CMake
 
 Starting with version 1.4, the recommended FLTK building system
diff --git documentation/src/opengl.dox documentation/src/opengl.dox
index 6ab4dc2..14f33a6 100644
--- documentation/src/opengl.dox
+++ documentation/src/opengl.dox
@@ -164,9 +164,7 @@ loading functions by doing:
 Your main program can now create one of your windows by doing
 <tt>new MyWindow(...)</tt>.
 
-You can also use your new window class in
-\ref fluid "FLUID"
-by:
+You can also use your new window class in FLUID by:
 
 -# Putting your class definition in a \p MyWindow.H file.
 -# Creating a Fl_Box widget in FLUID.
@@ -670,8 +668,8 @@ Link with libGLEW.so (with X11 or Wayland), libglew32.a (with MinGW) or glew32.l
     <a class="el" href="index.html">[Index]</a>
   </td>
   <td width="45%" align="RIGHT">
-    <a class="el" href="fluid.html">
-    Programming with FLUID
+    <a class="el" href="fltk-options.html">
+    FLTK Runtime Options
     [Next]
     </a>
   </td>
diff --git documentation/src/osissues.dox documentation/src/osissues.dox
index faf7178..43e2946 100644
--- documentation/src/osissues.dox
+++ documentation/src/osissues.dox
@@ -968,7 +968,7 @@ internally in the same way.
 
 \subsection osissues_mac_files Mac File System Specifics
 
-\par Resource Forks
+\par Resource Forks (OS X pre 10.6)
 
 FLTK does not access the resource fork of an application.
 However, a minimal resource fork must be created for OS X
diff --git documentation/src/preface.dox documentation/src/preface.dox
index 67304fb..0bfc54c 100644
--- documentation/src/preface.dox
+++ documentation/src/preface.dox
@@ -31,7 +31,6 @@ This manual is organized into the following chapters and appendices:
 \li \ref events
 \li \ref subclassing
 \li \ref opengl
-\li \ref fluid
 \li \ref fltk-options
 \li \ref advanced
 \li \ref unicode
diff --git documentation/src/subclassing.dox documentation/src/subclassing.dox
index bbf750b..e37924b 100644
--- documentation/src/subclassing.dox
+++ documentation/src/subclassing.dox
@@ -40,9 +40,7 @@ The constructor should have the following arguments:
 MyClass(int x, int y, int w, int h, const char *label = 0);
 \endcode
 
-This will allow the class to be used in
-\ref fluid "FLUID"
-without problems.
+This will allow the class to be used in FLUID without problems.
 
 The constructor must call the constructor for the base class and
 pass the same arguments:
diff --git fluid/CMakeLists.txt fluid/CMakeLists.txt
index bb3b9fe..b906561 100644
--- fluid/CMakeLists.txt
+++ fluid/CMakeLists.txt
@@ -37,7 +37,8 @@ set(CPPFILES
   Fluid_Image.cxx
   about_panel.cxx
   align_widget.cxx
-  alignment_panel.cxx
+  settings_panel.cxx
+  autodoc.cxx
   code.cxx
   custom_widgets.cxx
   factory.cxx
@@ -47,7 +48,7 @@ set(CPPFILES
   mergeback.cxx
   pixmaps.cxx
   shell_command.cxx
-  sourceview_panel.cxx
+  codeview_panel.cxx
   template_panel.cxx
   undo.cxx
   widget_browser.cxx
@@ -71,19 +72,19 @@ set(HEADERFILES
   StyleParse.h
   about_panel.h
   align_widget.h
-  alignment_panel.h
+  settings_panel.h
+  autodoc.h
   code.h
   comments.h
   custom_widgets.h
   factory.h
   file.h
-  fluid.h
   function_panel.h
   mergeback.h
   print_panel.h
   pixmaps.h
   shell_command.h
-  sourceview_panel.h
+  codeview_panel.h
   template_panel.h
   undo.h
   widget_browser.h
diff --git fluid/CodeEditor.h fluid/CodeEditor.h
index 9886705..9cfa50a 100644
--- fluid/CodeEditor.h
+++ fluid/CodeEditor.h
@@ -72,7 +72,7 @@ public:
 /**
  A widget derived from CodeEditor with highlighting for code blocks.
 
- This widget is used by the SourceView system to show the design's
+ This widget is used by the codeview system to show the design's
  source and header code. The secondary highlighting show the text
  part that corresponds to the selected widget(s).
  */
diff --git fluid/Fd_Snap_Action.cxx fluid/Fd_Snap_Action.cxx
index ffd944c..ce3d6f0 100644
--- fluid/Fd_Snap_Action.cxx
+++ fluid/Fd_Snap_Action.cxx
@@ -17,7 +17,7 @@
 #include "Fd_Snap_Action.h"
 
 #include "Fl_Group_Type.h"
-#include "alignment_panel.h"
+#include "settings_panel.h"
 #include "shell_command.h"  // get and set Fl_String preferences
 #include "file.h"
 
diff --git fluid/Fl_Function_Type.cxx fluid/Fl_Function_Type.cxx
index 6dc9fc9..22bcf72 100644
--- fluid/Fl_Function_Type.cxx
+++ fluid/Fl_Function_Type.cxx
@@ -1279,7 +1279,7 @@ void Fl_Data_Type::write_code1(Fd_Code_Writer& f) {
   int nData = -1;
   int uncompressedDataSize = 0;
   // path should be set correctly already
-  if (filename_ && !f.write_sourceview) {
+  if (filename_ && !f.write_codeview) {
     enter_project_dir();
     FILE *f = fl_fopen(filename_, "rb");
     leave_project_dir();
@@ -1395,8 +1395,8 @@ void Fl_Data_Type::write_code1(Fd_Code_Writer& f) {
     }
   }
   // if we are in interactive mode, we pop up a warning dialog
-  // giving the error: (batch_mode && !write_sourceview) ???
-  if (message && !f.write_sourceview) {
+  // giving the error: (batch_mode && !write_codeview) ???
+  if (message && !f.write_codeview) {
     if (batch_mode)
       fprintf(stderr, "FLUID ERROR: %s %s\n", message, fn);
     else
@@ -1535,9 +1535,11 @@ BREAK2:
  */
 void Fl_DeclBlock_Type::write_code1(Fd_Code_Writer& f) {
   const char* c = name();
-  if (public_)
-    f.write_h("%s\n", c);
-  f.write_c("%s\n", c);
+  if (c && *c) {
+    if (public_)
+      f.write_h("%s\n", c);
+    f.write_c("%s\n", c);
+  }
 }
 
 /**
@@ -1545,9 +1547,11 @@ void Fl_DeclBlock_Type::write_code1(Fd_Code_Writer& f) {
  */
 void Fl_DeclBlock_Type::write_code2(Fd_Code_Writer& f) {
   const char* c = after;
-  if (public_)
-    f.write_h("%s\n", c);
-  f.write_c("%s\n", c);
+  if (c && *c) {
+    if (public_)
+      f.write_h("%s\n", c);
+    f.write_c("%s\n", c);
+  }
 }
 
 // ---- Fl_Comment_Type declaration
diff --git fluid/Fl_Type.cxx fluid/Fl_Type.cxx
index e1b1843..a649ea3 100644
--- fluid/Fl_Type.cxx
+++ fluid/Fl_Type.cxx
@@ -696,8 +696,8 @@ void Fl_Type::move_before(Fl_Type* g) {
 
 // write a widget and all its children:
 void Fl_Type::write(Fd_Project_Writer &f) {
-  if (f.write_sourceview()) proj1_start = (int)ftell(f.file()) + 1;
-  if (f.write_sourceview()) proj2_start = (int)ftell(f.file()) + 1;
+  if (f.write_codeview()) proj1_start = (int)ftell(f.file()) + 1;
+  if (f.write_codeview()) proj2_start = (int)ftell(f.file()) + 1;
   f.write_indent(level);
   f.write_word(type_name());
 
@@ -712,9 +712,9 @@ void Fl_Type::write(Fd_Project_Writer &f) {
   write_properties(f);
   if (parent) parent->write_parent_properties(f, this, true);
   f.write_close(level);
-  if (f.write_sourceview()) proj1_end = (int)ftell(f.file());
+  if (f.write_codeview()) proj1_end = (int)ftell(f.file());
   if (!is_parent()) {
-    if (f.write_sourceview()) proj2_end = (int)ftell(f.file());
+    if (f.write_codeview()) proj2_end = (int)ftell(f.file());
     return;
   }
   // now do children:
@@ -722,9 +722,9 @@ void Fl_Type::write(Fd_Project_Writer &f) {
   Fl_Type *child;
   for (child = next; child && child->level > level; child = child->next)
     if (child->level == level+1) child->write(f);
-  if (f.write_sourceview()) proj2_start = (int)ftell(f.file()) + 1;
+  if (f.write_codeview()) proj2_start = (int)ftell(f.file()) + 1;
   f.write_close(level);
-  if (f.write_sourceview()) proj2_end = (int)ftell(f.file());
+  if (f.write_codeview()) proj2_end = (int)ftell(f.file());
 }
 
 void Fl_Type::write_properties(Fd_Project_Writer &f) {
@@ -1092,7 +1092,7 @@ Fl_Type *Fl_Type::find_by_uid(unsigned short uid) {
   return NULL;
 }
 
-/** Find a type node by using the sourceview text positions.
+/** Find a type node by using the codeview text positions.
 
  \param[in] text_type 0=source file, 1=header, 2=.fl project file
  \param[in] crsr cursor position in text
diff --git fluid/Fl_Type.h fluid/Fl_Type.h
index 39a9bb3..67e7c89 100644
--- fluid/Fl_Type.h
+++ fluid/Fl_Type.h
@@ -146,7 +146,7 @@ public: // things that should not be public:
   Fl_Type *factory;
   const char *callback_name(Fd_Code_Writer& f);
 
-  // text positions of this type in code, header, and project file (see SourceView)
+  // text positions of this type in code, header, and project file (see codeview)
   int code_static_start, code_static_end;
   int code1_start, code1_end;
   int code2_start, code2_end;
diff --git fluid/Fl_Widget_Type.cxx fluid/Fl_Widget_Type.cxx
index 310792d..485cb8d 100644
--- fluid/Fl_Widget_Type.cxx
+++ fluid/Fl_Widget_Type.cxx
@@ -24,7 +24,7 @@
 #include "file.h"
 #include "code.h"
 #include "Fluid_Image.h"
-#include "alignment_panel.h"
+#include "settings_panel.h"
 #include "widget_panel.h"
 #include "undo.h"
 #include "mergeback.h"
@@ -383,7 +383,7 @@ void name_public_cb(Fl_Choice* i, void* v) {
 /* Treating UNDO for text widget.
 
  Goal: we want to continuously update the UI while the user is typing text
- (changing the label, in this case). Source View does deferred updates, and
+ (changing the label, in this case). Code View does deferred updates, and
  the widget browser and widget panel update on every keystroke. At the same
  time, we want to limit undo actions to few and logical units.
 
@@ -2727,7 +2727,7 @@ void Fl_Widget_Type::open() {
 extern void redraw_overlays();
 extern void check_redraw_corresponding_parent(Fl_Type*);
 extern void redraw_browser();
-extern void update_sourceview_position();
+extern void update_codeview_position();
 
 // Called when ui changes what objects are selected:
 // p is selected object, null for all deletions (we must throw away
@@ -2761,8 +2761,8 @@ void selection_changed(Fl_Type *p) {
   redraw_overlays();
   // load the panel with the new settings:
   load_panel();
-  // update the source viewer to show the code for the selected object
-  update_sourceview_position();
+  // update the code viewer to show the code for the selected object
+  update_codeview_position();
 }
 
 ////////////////////////////////////////////////////////////////
diff --git fluid/Fl_Widget_Type.h fluid/Fl_Widget_Type.h
index b1773a5..40470c5 100644
--- fluid/Fl_Widget_Type.h
+++ fluid/Fl_Widget_Type.h
@@ -127,5 +127,6 @@ public:
   void redraw();
 };
 
+extern Fl_Window *the_panel;
 
 #endif // _FLUID_FL_WIDGET_TYPE_H
diff --git fluid/Fl_Window_Type.cxx fluid/Fl_Window_Type.cxx
index bc848ed..b68af44 100644
--- fluid/Fl_Window_Type.cxx
+++ fluid/Fl_Window_Type.cxx
@@ -25,7 +25,7 @@
 #include "fluid.h"
 #include "widget_browser.h"
 #include "undo.h"
-#include "alignment_panel.h"
+#include "settings_panel.h"
 #include "file.h"
 #include "code.h"
 #include "widget_panel.h"
diff --git fluid/Makefile fluid/Makefile
index 75a785e..eb5b8c1 100644
--- fluid/Makefile
+++ fluid/Makefile
@@ -31,7 +31,8 @@ CPPFILES = \
 	Fluid_Image.cxx \
 	about_panel.cxx \
 	align_widget.cxx \
-	alignment_panel.cxx \
+	settings_panel.cxx \
+	autodoc.cxx \
 	code.cxx \
 	custom_widgets.cxx \
 	factory.cxx \
@@ -42,7 +43,7 @@ CPPFILES = \
 	mergeback.cxx \
 	pixmaps.cxx \
 	shell_command.cxx \
-	sourceview_panel.cxx \
+	codeview_panel.cxx \
 	template_panel.cxx \
 	undo.cxx \
 	widget_browser.cxx \
@@ -141,9 +142,9 @@ uninstall-osx:
 rebuild: fluid$(EXEEXT)
 	echo 'Rebuilding fluid (.fl) and .cxx/.h files from .fl files ...'
 	./fluid$(EXEEXT) -u -c about_panel.fl
-	./fluid$(EXEEXT) -u -c alignment_panel.fl
+	./fluid$(EXEEXT) -u -c settings_panel.fl
 	./fluid$(EXEEXT) -u -c function_panel.fl
 	./fluid$(EXEEXT) -u -c print_panel.fl
-	./fluid$(EXEEXT) -u -c sourceview_panel.fl
+	./fluid$(EXEEXT) -u -c codeview_panel.fl
 	./fluid$(EXEEXT) -u -c template_panel.fl
 	./fluid$(EXEEXT) -u -c widget_panel.fl
diff --git fluid/alignment_panel.cxx fluid/alignment_panel.cxx
deleted file mode 100644
index 1ad8cfd..0000000
--- fluid/alignment_panel.cxx
+++ /dev/null
@@ -1,3543 +0,0 @@
-//
-// Setting and shell dialogs for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 1998-2023 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
-//
-// Please see the following page on how to report bugs and issues:
-//
-//     https://www.fltk.org/bugs.php
-//
-
-// generated by Fast Light User Interface Designer (fluid) version 1.0400
-
-#include "alignment_panel.h"
-#include "undo.h"
-#include <FL/Fl_Preferences.H>
-#include <FL/Fl_Tooltip.H>
-#include <FL/fl_ask.H>
-#include <string.h>
-#include "../src/flstring.h"
-void scheme_cb(Fl_Scheme_Choice *, void *);
-int w_settings_shell_list_selected;
-
-static void cb_Comments(Fl_Choice* o, void* v) {
-  Fl_Font *font = (Fl_Font*)o->user_data();
-  if (v == LOAD) {
-    o->value(*font);
-  } else {
-    *font = (int)o->value();
-    widget_browser->redraw();
-    widget_browser->save_prefs();
-  }
-}
-
-static void cb_Color_Chip(Fl_Button* o, void* v) {
-  Fl_Color *color = (Fl_Color*)o->user_data();
-  if (v == LOAD) {
-    o->color(*color);
-    o->redraw();
-  } else {
-    Fl_Color d = fl_show_colormap(*color);
-    *color = d;
-    o->color(d);
-    widget_browser->redraw();
-    widget_browser->save_prefs();
-  }
-}
-
-static void cb_Color_Choice(Fl_Menu_Button* o, void* v) {
-  if (v != LOAD) {
-    Fl_Color *color = (Fl_Color*)o->user_data();
-    Fl_Color d = (Fl_Color)(o->mvalue()->argument());
-    *color = d;
-    o->parent()->do_callback(o->parent(), LOAD);
-    widget_browser->redraw();
-    widget_browser->save_prefs();
-  }
-}
-
-Fl_Double_Window *script_panel=(Fl_Double_Window *)0;
-
-static void cb_script_panel(Fl_Double_Window*, void*) {
-  if (Fl::event()==FL_SHORTCUT && Fl::event_key()==FL_Escape)
-    return; // ignore Escape
-  script_panel->hide(); // otherwise hide..;
-}
-
-Fl_Text_Editor *script_input=(Fl_Text_Editor *)0;
-
-Fl_Return_Button *script_panel_ok=(Fl_Return_Button *)0;
-
-Fl_Button *script_panel_cancel=(Fl_Button *)0;
-
-Fl_Double_Window* make_script_panel() {
-  { Fl_Double_Window* o = script_panel = new Fl_Double_Window(540, 180, "Shell Script Editor");
-    script_panel->labelsize(11);
-    script_panel->callback((Fl_Callback*)cb_script_panel);
-    { script_input = new Fl_Text_Editor(10, 10, 520, 130);
-      script_input->box(FL_DOWN_BOX);
-      script_input->labelsize(11);
-      script_input->textfont(4);
-      script_input->textsize(11);
-      script_input->when(FL_WHEN_RELEASE | FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY);
-      Fl_Group::current()->resizable(script_input);
-      script_input->buffer(new Fl_Text_Buffer);
-    } // Fl_Text_Editor* script_input
-    { Fl_Group* o = new Fl_Group(10, 150, 520, 20);
-      o->labelsize(11);
-      o->callback((Fl_Callback*)propagate_load);
-      { script_panel_ok = new Fl_Return_Button(400, 150, 60, 20, "OK");
-        script_panel_ok->labelsize(11);
-        script_panel_ok->window()->hotspot(script_panel_ok);
-      } // Fl_Return_Button* script_panel_ok
-      { script_panel_cancel = new Fl_Button(470, 150, 60, 20, "Cancel");
-        script_panel_cancel->labelsize(11);
-      } // Fl_Button* script_panel_cancel
-      { Fl_Box* o = new Fl_Box(10, 150, 380, 20);
-        o->labelsize(11);
-        Fl_Group::current()->resizable(o);
-      } // Fl_Box* o
-      o->end();
-    } // Fl_Group* o
-    script_panel->set_modal();
-    o->size_range(200, 150);
-    script_panel->end();
-  } // Fl_Double_Window* script_panel
-  // Enable line numbers
-  script_input->linenumber_width(60);
-  script_input->linenumber_size(script_input->Fl_Text_Display::textsize());
-  return script_panel;
-}
-
-Fl_Double_Window *settings_window=(Fl_Double_Window *)0;
-
-Fl_Tabs *w_settings_tabs=(Fl_Tabs *)0;
-
-static void cb_w_settings_tabs(Fl_Tabs* o, void* v) {
-  propagate_load(o, v);
-}
-
-#include <FL/Fl_PNG_Image.H>
-
-static const unsigned char idata_general_64[] =
-{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,96,0,0,0,64,8,4,0,0,0,
-79,61,186,133,0,0,8,57,73,68,65,84,104,222,205,154,107,112,85,213,21,199,127,
-151,60,185,36,18,66,204,131,120,155,82,136,163,131,4,41,180,130,36,2,117,8,15,
-173,58,109,103,168,97,42,67,135,78,167,84,16,59,118,192,41,29,201,244,3,14,182,
-14,62,74,77,149,42,12,226,180,160,130,19,32,136,144,34,193,240,104,136,52,193,
-18,196,16,200,131,128,121,191,47,185,247,158,126,72,206,221,251,60,238,189,39,
-112,46,115,247,249,178,207,217,123,159,179,214,218,107,173,255,90,107,31,176,
-187,37,81,72,13,237,184,25,196,135,130,130,143,65,220,180,83,67,33,73,68,120,
-203,162,114,152,108,179,203,199,89,178,34,155,129,210,128,196,171,87,73,36,147,
-63,11,119,72,6,220,60,108,231,39,71,217,204,64,108,200,57,177,204,180,243,147,
-209,182,50,112,175,191,167,188,231,72,197,65,52,224,65,225,58,43,20,28,195,99,
-223,139,92,6,114,212,206,115,142,185,196,73,3,110,86,59,222,80,111,210,34,87,
-133,198,169,157,4,162,52,3,81,36,138,155,187,35,149,129,120,225,229,83,116,12,
-140,98,172,184,153,100,231,190,223,202,171,82,153,137,135,47,185,161,123,158,41,
-196,156,233,87,120,149,1,9,193,146,201,160,94,183,54,141,217,140,226,20,141,225,
-118,148,73,108,167,29,47,30,218,216,71,174,127,7,147,216,196,13,225,44,15,40,77,
-186,107,135,236,74,27,217,64,130,95,132,115,41,166,29,47,94,58,217,65,114,56,
-201,143,231,51,157,79,175,100,5,78,150,114,69,198,95,151,114,204,192,64,137,30,
-147,107,200,39,129,149,124,201,77,205,200,49,156,225,99,96,155,73,152,224,165,
-89,71,130,50,77,57,99,96,224,164,114,191,126,229,0,205,120,77,194,141,183,71,
-66,82,212,8,230,174,96,131,201,124,135,222,229,36,243,56,15,51,90,55,109,144,
-38,174,208,175,181,191,4,157,169,12,189,47,135,58,254,107,149,40,135,101,242,
-93,156,9,237,193,103,243,20,51,112,201,78,83,69,54,186,168,231,52,123,249,79,
-232,111,53,49,203,96,230,183,189,3,219,69,8,176,148,181,164,114,141,30,205,132,
-251,89,199,175,153,77,154,6,194,132,164,226,73,101,42,115,152,200,101,58,52,99,
-233,20,176,26,39,85,234,131,68,82,248,216,222,29,152,79,137,26,231,76,103,51,83,
-232,161,150,227,236,163,122,120,66,1,203,185,143,24,11,175,114,83,205,54,246,
-162,190,237,113,114,153,72,2,213,172,163,82,76,202,231,115,59,25,40,103,150,218,
-45,98,201,240,198,221,164,145,51,236,231,48,235,249,57,169,35,48,167,38,118,
-178,133,37,60,198,116,38,12,75,198,203,62,158,21,83,62,99,129,125,12,44,96,191,
-42,220,103,88,39,34,6,192,199,13,174,49,137,187,70,232,208,218,185,194,4,82,52,
-161,64,43,47,243,190,176,250,133,148,218,101,3,69,100,15,117,156,252,129,201,6,
-39,148,97,170,245,193,219,104,210,25,163,147,159,19,39,187,5,101,99,196,205,
-237,197,66,89,252,80,237,254,130,41,97,5,250,105,252,74,222,119,11,233,167,149,
-88,104,145,240,138,249,254,8,32,120,243,209,78,61,77,12,224,32,142,76,92,36,89,
-146,85,34,243,4,142,221,197,34,138,236,96,32,93,221,105,39,221,220,12,153,116,
-41,92,163,140,35,156,160,205,15,109,121,60,202,28,241,162,32,30,106,64,214,206,
-84,123,108,96,10,75,134,190,60,72,5,9,184,12,40,43,55,15,167,120,149,55,184,40,
-161,110,63,53,28,164,137,52,210,131,238,67,43,31,179,70,150,196,238,208,168,103,
-133,129,22,86,16,63,212,237,226,48,94,238,97,92,0,89,122,56,194,70,78,153,142,
-93,228,44,46,178,2,176,160,112,137,191,179,89,235,168,126,79,167,29,12,116,16,
-71,158,248,110,5,117,164,144,97,170,125,229,108,224,155,128,47,106,227,60,57,
-100,154,170,78,25,175,242,145,252,200,203,75,28,180,203,141,30,167,139,92,161,
-252,117,156,32,1,151,33,238,109,226,117,173,244,251,248,150,30,162,5,64,183,209,
-203,15,12,142,160,133,15,249,147,31,211,1,232,225,69,94,67,177,211,195,61,194,
-37,109,224,251,182,46,96,110,80,182,200,227,189,252,153,73,196,19,79,54,175,
-211,47,70,182,42,13,186,149,127,211,135,212,53,214,107,71,214,115,226,207,153,
-195,30,124,226,193,120,3,182,150,202,178,95,198,11,124,195,0,3,124,205,26,126,
-41,220,203,33,218,13,121,146,198,3,239,33,143,47,194,145,212,95,103,169,216,
-214,100,57,77,7,160,158,195,50,118,239,213,12,126,192,187,66,31,175,27,146,105,
-167,176,229,215,88,106,200,182,109,171,74,248,168,81,187,19,12,154,220,68,159,
-144,255,91,134,181,91,212,225,54,90,117,67,99,229,90,87,141,188,203,246,151,85,
-226,84,255,25,101,88,234,22,221,78,174,26,86,54,8,151,216,106,32,34,74,128,215,
-8,195,42,123,11,91,193,223,235,184,83,31,10,142,245,138,234,166,125,134,205,
-145,138,47,247,24,86,126,71,24,77,138,65,51,189,194,6,220,225,101,224,1,85,142,
-181,116,7,54,197,209,172,54,172,124,94,141,64,146,13,254,171,131,90,177,75,83,
-71,70,211,72,38,167,113,128,85,194,78,187,12,89,127,190,184,89,201,211,154,193,
-229,44,23,128,146,22,216,252,225,55,124,66,70,56,24,152,207,41,22,203,243,91,13,
-69,187,31,201,174,253,31,188,233,7,178,34,138,132,134,45,212,100,116,67,193,
-158,134,162,199,40,231,81,187,109,229,69,250,100,172,76,87,54,43,213,134,226,85,
-133,242,99,45,162,246,210,72,147,118,229,83,74,165,97,93,149,242,178,146,174,93,
-217,199,70,107,194,181,22,11,253,145,66,57,13,152,207,75,44,48,169,253,36,146,
-202,89,127,22,0,196,144,72,162,92,170,200,102,189,116,10,34,82,201,251,152,70,
-27,151,229,149,143,16,195,81,123,24,152,200,123,114,220,182,138,231,200,9,144,
-9,165,227,226,188,204,130,166,101,179,145,135,76,5,27,141,139,7,137,149,195,
-127,7,223,103,31,223,218,193,64,1,63,81,125,79,58,27,89,70,70,64,151,62,138,44,
-166,209,195,69,147,177,39,89,207,67,1,83,64,7,227,200,97,50,135,196,163,88,234,
-57,97,71,74,121,183,74,111,50,175,144,23,34,165,140,102,6,46,22,115,80,151,82,
-46,100,54,169,33,176,108,28,63,229,119,101,228,74,229,4,91,146,250,102,134,15,
-232,218,24,109,225,24,210,65,26,79,144,199,117,90,105,193,65,10,227,73,179,152,
-212,199,176,39,247,103,226,182,214,30,6,74,232,86,235,86,37,76,53,49,94,51,85,
-26,111,128,43,43,173,151,99,114,72,126,192,30,28,184,34,52,113,23,95,133,181,
-46,84,205,54,57,15,252,202,30,6,224,21,6,85,161,236,209,1,152,66,43,103,13,168,
-28,186,245,80,73,139,46,158,234,100,191,192,100,15,127,181,15,7,234,88,132,107,
-168,91,197,84,178,135,249,246,208,72,41,239,178,137,104,38,90,44,121,169,185,
-209,78,94,224,42,110,156,36,12,191,205,199,81,10,229,250,192,122,251,24,128,75,
-20,168,246,210,192,116,82,233,231,2,197,108,229,45,254,199,32,95,208,69,186,
-174,84,27,184,114,116,158,34,182,50,200,5,14,82,69,55,177,36,18,195,5,254,66,
-131,40,237,254,150,175,173,16,102,61,70,223,141,223,61,60,205,60,170,217,171,59,
-68,121,128,101,204,39,51,168,76,124,92,163,148,247,57,167,11,3,159,224,65,142,
-179,67,60,250,132,39,173,145,101,243,17,211,92,22,51,131,239,50,198,100,172,143,
-58,42,248,148,35,86,74,105,115,76,177,240,54,219,114,6,67,254,76,163,160,184,
-148,103,149,42,67,192,118,94,121,94,113,41,86,214,227,97,101,120,242,129,237,
-108,55,41,53,41,180,227,209,86,39,254,77,175,137,252,143,234,207,237,60,180,155,
-150,174,118,241,78,184,50,178,53,148,233,72,56,199,90,238,165,128,58,249,113,
-173,137,91,237,215,135,120,87,121,134,201,172,162,82,203,62,39,229,115,38,251,
-91,10,219,232,196,135,143,46,138,89,228,143,44,82,40,164,89,168,65,177,65,133,
-62,148,149,164,133,77,254,210,121,52,249,124,68,7,62,124,244,240,175,145,100,
-99,183,90,41,112,145,11,148,209,168,195,161,108,42,212,56,99,167,156,157,1,112,
-64,40,118,47,51,185,96,72,168,231,18,67,25,151,71,86,21,186,181,191,85,234,249,
-192,244,249,101,90,85,6,26,241,233,180,179,95,6,225,6,195,218,70,118,221,153,
-178,74,112,132,234,21,65,129,86,144,94,57,51,105,212,157,144,223,209,186,80,240,
-230,167,178,75,103,153,62,249,232,168,206,206,79,218,251,207,220,57,230,13,117,
-78,83,204,120,198,18,7,12,208,73,7,21,98,86,119,228,50,224,79,64,78,115,122,56,
-93,71,174,249,12,181,139,145,203,64,57,110,109,113,182,207,56,103,144,114,34,
-184,29,10,25,40,124,74,68,183,76,202,131,254,252,125,210,238,159,191,163,108,
-102,160,155,127,210,133,147,49,68,161,224,192,1,40,120,241,208,73,37,239,176,
-150,102,123,63,248,127,27,97,180,206,27,14,172,151,0,0,0,0,73,69,78,68,174,66,
-96,130};
-static Fl_Image *image_general_64() {
-  static Fl_Image *image = NULL;
-  if (!image)
-    image = new Fl_PNG_Image("general_64.png", idata_general_64, 2162);
-  return image;
-}
-
-static void cb_(Fl_Group* o, void* v) {
-  propagate_load(o, v);
-}
-
-Fl_Scheme_Choice *scheme_choice=(Fl_Scheme_Choice *)0;
-
-Fl_Check_Button *tooltips_button=(Fl_Check_Button *)0;
-
-static void cb_tooltips_button(Fl_Check_Button*, void*) {
-  Fl_Tooltip::enable(tooltips_button->value());
-  fluid_prefs.set("show_tooltips", tooltips_button->value());
-}
-
-Fl_Check_Button *completion_button=(Fl_Check_Button *)0;
-
-static void cb_completion_button(Fl_Check_Button*, void*) {
-  fluid_prefs.set("show_completion_dialogs", completion_button->value());
-}
-
-Fl_Check_Button *openlast_button=(Fl_Check_Button *)0;
-
-static void cb_openlast_button(Fl_Check_Button*, void*) {
-  fluid_prefs.set("open_previous_file", openlast_button->value());
-}
-
-Fl_Check_Button *prevpos_button=(Fl_Check_Button *)0;
-
-static void cb_prevpos_button(Fl_Check_Button*, void*) {
-  fluid_prefs.set("prev_window_pos", prevpos_button->value());
-}
-
-Fl_Check_Button *show_comments_button=(Fl_Check_Button *)0;
-
-static void cb_show_comments_button(Fl_Check_Button*, void*) {
-  show_comments = show_comments_button->value();
-  fluid_prefs.set("show_comments", show_comments);
-  redraw_browser();
-}
-
-static void cb_1(Fl_Group* o, void* v) {
-  propagate_load(o, v);
-}
-
-Fl_Spinner *recent_spinner=(Fl_Spinner *)0;
-
-static void cb_recent_spinner(Fl_Spinner*, void*) {
-  fluid_prefs.set("recent_files", recent_spinner->value());
-  load_history();
-}
-
-Fl_Check_Button *use_external_editor_button=(Fl_Check_Button *)0;
-
-static void cb_use_external_editor_button(Fl_Check_Button*, void*) {
-  G_use_external_editor = use_external_editor_button->value();
-  fluid_prefs.set("use_external_editor", G_use_external_editor);
-  redraw_browser();
-}
-
-Fl_Input *editor_command_input=(Fl_Input *)0;
-
-static void cb_editor_command_input(Fl_Input*, void*) {
-  strncpy(G_external_editor_command, editor_command_input->value(), sizeof(G_external_editor_command)-1);
-  G_external_editor_command[sizeof(G_external_editor_command)-1] = 0;
-  fluid_prefs.set("external_editor_command", G_external_editor_command);
-  redraw_browser();
-}
-
-Fl_Check_Button *guides_button=(Fl_Check_Button *)0;
-
-Fl_Check_Button *restricted_button=(Fl_Check_Button *)0;
-
-Fl_Check_Button *ghosted_outline_button=(Fl_Check_Button *)0;
-
-Fl_Group *w_settings_project_tab=(Fl_Group *)0;
-
-static void cb_w_settings_project_tab(Fl_Group* o, void* v) {
-  propagate_load(o, v);
-}
-
-static const unsigned char idata_document_64[] =
-{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,96,0,0,0,64,8,4,0,0,0,
-79,61,186,133,0,0,3,102,73,68,65,84,104,222,237,154,223,75,83,81,28,192,63,155,
-115,58,171,153,191,42,140,2,75,115,41,69,20,73,61,244,3,67,176,68,122,168,8,234,
-65,123,90,32,81,68,65,47,65,100,208,15,95,194,8,130,94,140,30,250,3,210,94,6,
-65,15,162,15,21,250,160,145,62,68,141,182,39,205,205,156,211,181,173,135,221,
-93,231,118,167,251,113,239,238,153,236,156,135,125,57,231,220,123,191,159,123,
-239,247,215,221,129,244,90,39,223,9,16,206,178,7,113,97,71,135,102,199,151,181,
-242,209,30,224,113,174,213,111,194,163,154,250,145,231,240,44,183,0,3,170,170,
-31,65,232,203,86,41,83,26,107,143,70,133,50,74,51,184,148,31,95,252,144,145,
-219,192,221,220,0,24,87,180,190,65,27,134,52,47,20,198,193,83,165,179,102,137,
-144,14,128,49,42,214,178,63,3,128,9,89,238,98,150,247,42,33,152,244,112,102,167,
-57,72,136,33,85,16,140,122,0,24,57,68,47,29,171,95,164,190,60,2,0,131,106,8,58,
-1,168,135,160,27,128,90,8,58,2,168,131,160,43,64,18,132,222,60,2,136,32,60,
-162,51,86,163,59,156,20,28,96,17,111,76,159,103,15,55,87,242,20,40,165,91,192,
-64,102,160,88,150,223,50,26,119,23,131,120,98,7,14,11,25,137,183,203,210,48,
-195,107,47,45,199,196,63,225,94,33,27,87,52,137,234,57,107,21,116,113,74,245,
-179,230,52,153,107,230,33,67,56,112,179,156,90,189,32,26,128,145,6,174,115,137,
-5,130,169,214,11,226,165,211,165,236,92,183,94,200,171,64,150,71,70,92,0,208,
-206,6,194,120,249,131,159,176,194,156,25,43,149,20,137,12,224,103,132,65,62,51,
-163,56,187,9,27,103,105,163,74,84,128,101,6,121,192,108,210,249,89,156,56,232,
-193,78,181,152,54,48,65,223,26,234,71,219,75,62,42,248,126,1,0,130,124,193,153,
-210,202,15,41,96,234,240,10,45,241,83,150,79,176,149,80,220,221,9,48,142,27,128,
-105,188,212,136,7,16,98,94,206,128,175,81,159,224,135,22,232,151,0,60,138,249,
-143,80,201,156,133,50,133,81,237,28,104,33,18,111,160,72,28,27,147,87,215,193,
-225,184,185,176,52,46,12,128,129,18,73,242,240,137,169,4,128,69,126,201,241,218,
-193,164,12,80,66,29,123,177,232,15,96,166,86,150,95,173,185,210,23,87,174,236,
-226,42,151,99,10,125,157,108,160,152,230,12,143,116,242,132,55,171,63,166,232,
-99,196,45,220,202,248,216,231,140,233,15,96,165,155,251,236,200,240,232,49,2,
-250,123,161,109,116,211,138,147,57,217,68,127,243,66,250,194,112,128,14,44,9,
-166,237,102,0,63,0,46,150,98,190,216,233,230,70,45,52,210,24,227,36,39,121,45,1,
-236,166,157,205,9,0,211,188,147,0,150,196,138,3,134,184,223,168,172,166,223,47,
-164,18,27,60,149,72,44,120,22,20,94,180,69,209,1,204,148,75,245,215,56,253,20,
-39,148,57,115,114,0,179,102,157,110,107,2,96,165,129,31,0,184,165,114,38,89,
-171,195,44,162,13,84,210,158,210,186,58,90,178,126,2,154,0,20,209,70,79,10,152,
-247,216,39,170,17,87,97,167,158,65,166,20,140,56,50,127,140,243,28,201,50,10,
-107,234,133,170,185,64,43,94,197,82,222,128,133,10,182,168,18,224,52,116,163,38,
-106,52,249,144,82,136,196,5,0,157,82,137,208,74,64,117,241,77,245,12,51,140,75,
-241,90,169,102,192,169,180,9,154,34,66,102,219,46,215,107,49,127,179,142,114,92,
-11,47,52,18,5,240,101,244,143,110,90,87,210,164,217,152,83,125,239,174,82,159,
-193,166,213,157,233,226,175,230,234,123,185,168,229,195,61,199,184,10,219,239,
-147,239,104,255,202,153,244,20,250,15,100,60,232,29,230,9,101,148,0,0,0,0,73,69,
-78,68,174,66,96,130};
-static Fl_Image *image_document_64() {
-  static Fl_Image *image = NULL;
-  if (!image)
-    image = new Fl_PNG_Image("document_64.png", idata_document_64, 927);
-  return image;
-}
-
-Fl_Input *header_file_input=(Fl_Input *)0;
-
-static void cb_header_file_input(Fl_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.header_file_name.c_str());
-  } else {
-    if (strcmp(g_project.header_file_name.c_str(), o->value())) {
-      g_project.header_file_name = o->value();
-      set_modflag(1);
-    }
-  }
-}
-
-Fl_Input *code_file_input=(Fl_Input *)0;
-
-static void cb_code_file_input(Fl_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.code_file_name.c_str());
-  } else {
-    if (strcmp(g_project.code_file_name.c_str(), o->value())) {
-      g_project.code_file_name = o->value();
-      set_modflag(1);
-    }
-  }
-}
-
-Fl_Check_Button *include_H_from_C_button=(Fl_Check_Button *)0;
-
-static void cb_include_H_from_C_button(Fl_Check_Button* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.include_H_from_C);
-  } else {
-    if (g_project.include_H_from_C != o->value()) {
-      set_modflag(1);
-      g_project.include_H_from_C = o->value();
-    }
-  }
-}
-
-Fl_Check_Button *use_FL_COMMAND_button=(Fl_Check_Button *)0;
-
-static void cb_use_FL_COMMAND_button(Fl_Check_Button* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.use_FL_COMMAND);
-  } else {
-    if (g_project.use_FL_COMMAND != o->value()) {
-      set_modflag(1);
-      g_project.use_FL_COMMAND = o->value();
-    }
-  }
-}
-
-Fl_Check_Button *utf8_in_src_button=(Fl_Check_Button *)0;
-
-static void cb_utf8_in_src_button(Fl_Check_Button* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.utf8_in_src);
-  } else {
-    if (g_project.utf8_in_src != o->value()) {
-      set_modflag(1);
-      g_project.utf8_in_src = o->value();
-    }
-  }
-}
-
-Fl_Check_Button *avoid_early_includes_button=(Fl_Check_Button *)0;
-
-static void cb_avoid_early_includes_button(Fl_Check_Button* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.avoid_early_includes);
-  } else {
-    if (g_project.avoid_early_includes != o->value()) {
-      set_modflag(1);
-      g_project.avoid_early_includes = o->value();
-    }
-  }
-}
-
-Fl_Check_Button *w_proj_mergeback=(Fl_Check_Button *)0;
-
-static void cb_w_proj_mergeback(Fl_Check_Button* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.write_mergeback_data);
-  } else {
-    if (g_project.write_mergeback_data != o->value()) {
-      set_modflag(1);
-      g_project.write_mergeback_data = o->value();
-    }
-  }
-}
-
-Fl_Group *w_settings_layout_tab=(Fl_Group *)0;
-
-static void cb_w_settings_layout_tab(Fl_Group* o, void* v) {
-  propagate_load(o, v);
-}
-
-static const unsigned char idata_layout_64[] =
-{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,96,0,0,0,64,8,4,0,0,0,
-79,61,186,133,0,0,1,168,73,68,65,84,104,222,237,154,49,75,3,49,20,199,127,119,
-84,168,109,23,197,201,209,69,116,16,197,130,159,160,123,151,226,226,42,14,98,
-29,244,35,184,56,59,250,77,244,27,88,113,171,90,144,66,41,116,180,72,75,45,120,
-92,92,122,109,167,144,75,155,35,202,123,89,18,146,123,252,127,112,239,46,47,
-121,144,206,78,232,16,161,28,181,136,14,53,28,218,21,99,103,226,147,246,205,185,
-43,249,135,12,157,203,87,40,6,28,152,139,10,83,0,92,83,36,11,43,113,106,190,56,
-151,194,241,94,210,41,144,215,46,28,51,154,246,215,141,221,207,61,85,118,1,16,
-178,154,116,47,168,16,104,22,126,112,57,17,83,161,78,17,101,224,94,241,200,109,
-50,216,32,36,94,62,192,84,243,38,59,26,0,136,201,79,0,214,216,166,100,228,94,
-209,156,13,2,115,128,144,63,110,2,32,0,2,32,0,2,176,144,229,220,186,143,24,26,
-174,84,140,125,4,104,112,195,138,209,86,2,218,62,2,116,233,74,12,72,16,47,102,
-86,249,128,63,0,150,249,128,63,0,150,249,128,4,177,0,8,128,0,8,128,0,8,128,0,8,
-128,0,8,128,0,8,128,0,184,55,171,156,184,199,155,246,146,175,109,121,76,152,25,
-192,29,247,218,121,187,3,146,12,1,70,25,10,148,32,254,151,65,92,102,75,51,27,
-208,231,193,111,128,26,85,205,87,40,224,157,103,62,125,6,200,83,210,150,26,20,
-36,6,4,64,0,4,64,0,4,192,187,31,89,60,187,171,51,207,7,250,180,140,47,249,122,
-243,131,216,84,86,144,2,182,201,110,242,167,117,92,118,249,196,145,139,173,196,
-75,2,144,38,31,176,218,19,53,220,188,110,251,12,50,41,61,254,154,149,216,46,
-219,234,153,20,127,159,185,12,250,99,90,14,203,239,127,120,165,154,78,208,47,
-215,15,118,242,56,45,94,1,0,0,0,0,73,69,78,68,174,66,96,130};
-static Fl_Image *image_layout_64() {
-  static Fl_Image *image = NULL;
-  if (!image)
-    image = new Fl_PNG_Image("layout_64.png", idata_layout_64, 481);
-  return image;
-}
-
-Fl_Choice *layout_choice=(Fl_Choice *)0;
-
-static void cb_layout_choice(Fl_Choice* o, void* v) {
-  if (v == LOAD) {
-      o->value(g_layout_list.current_suite());
-    } else {
-      int index = o->value();
-      g_layout_list.current_suite(index);
-      g_layout_list.update_dialogs();
-    }
-}
-
-Fl_Menu_Item menu_layout_choice[] = {
- {"FLTK", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
- {"Grid", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
- {0,0,0,0,0,0,0,0,0}
-};
-
-static void cb_2(Fl_Button*, void* v) {
-  // Clone the current layout suite
-
-  if (v == LOAD) return;
-
-  Fl_String old_name = "Copy of ";
-  old_name.append(g_layout_list[g_layout_list.current_suite()].name_);
-  const char *new_name = fl_input("Enter a name for the new layout:", old_name.c_str());
-  if (new_name == NULL)
-    return;
-
-  g_layout_list.add(new_name);
-  g_layout_list.update_dialogs();
-}
-
-Fl_Menu_Button *w_layout_menu=(Fl_Menu_Button *)0;
-
-static void cb_w_layout_menu(Fl_Menu_Button*, void* v) {
-  if (v == LOAD) {
-    Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
-    if (suite.storage_ == FD_STORE_INTERNAL) {
-      w_layout_menu_rename->deactivate();
-      for (int i=1; i<4; i++) w_layout_menu_storage[i]->deactivate();
-      w_layout_menu_delete->deactivate();
-    } else {
-      w_layout_menu_rename->activate();
-      for (int i=1; i<4; i++) w_layout_menu_storage[i]->activate();
-      w_layout_menu_delete->activate();
-    }
-    w_layout_menu_storage[suite.storage_]->setonly();
-  }
-}
-
-static void cb_w_layout_menu_rename(Fl_Menu_*, void*) {
-  // Rename the current layout suite
-
-  Fl_String old_name = g_layout_list[g_layout_list.current_suite()].name_;
-  const char *new_name = fl_input("Enter a new name for the layout:", old_name.c_str());
-  if (new_name == NULL)
-    return;
-
-  g_layout_list.rename(new_name);
-  g_layout_list.update_dialogs();
-}
-
-static void cb_w_layout_menu_storage(Fl_Menu_*, void*) {
-  Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
-  suite.storage(FD_STORE_INTERNAL);
-  g_layout_list.update_dialogs();
-}
-
-static void cb_w_layout_menu_storage1(Fl_Menu_*, void*) {
-  Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
-  suite.storage(FD_STORE_USER);
-  g_layout_list.update_dialogs();
-}
-
-static void cb_w_layout_menu_storage2(Fl_Menu_*, void*) {
-  Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
-  suite.storage(FD_STORE_PROJECT);
-  g_layout_list.update_dialogs();
-}
-
-static void cb_w_layout_menu_storage3(Fl_Menu_*, void*) {
-  Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
-  suite.storage(FD_STORE_FILE);
-  g_layout_list.update_dialogs();
-}
-
-static void cb_w_layout_menu_load(Fl_Menu_*, void*) {
-  // Give the user a file chooser and load that file
-  Fl_Native_File_Chooser fnfc;
-  fnfc.title("Load Layout Settings:");
-  fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE);
-  fnfc.options(Fl_Native_File_Chooser::USE_FILTER_EXT);
-  fnfc.filter("FLUID Layouts\t*.fll\n");
-  if (fnfc.show() != 0) return;
-  const char *new_filename = fnfc.filename();
-  if (!new_filename) return;
-  g_layout_list.load(new_filename);
-  //g_layout_list.current_suite(n);
-  g_layout_list.update_dialogs();
-}
-
-static void cb_w_layout_menu_save(Fl_Menu_*, void*) {
-  // Give the user a file chooser with a suggested name
-    Fl_Native_File_Chooser fnfc;
-    fnfc.title("Save Layout Settings:");
-    fnfc.type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE);
-    fnfc.options(Fl_Native_File_Chooser::SAVEAS_CONFIRM | Fl_Native_File_Chooser::USE_FILTER_EXT);
-    fnfc.filter("FLUID Layouts\t*.fll\n");
-    Fl_String filename = g_layout_list.filename_;
-    fnfc.directory(fl_filename_path(filename).c_str());
-    fnfc.preset_file(fl_filename_name(filename).c_str());
-    if (fnfc.show() != 0) return;
-    const char *new_filename = fnfc.filename();
-    if (!new_filename) return;
-    g_layout_list.filename_ = new_filename;
-    g_layout_list.save(new_filename);
-}
-
-static void cb_w_layout_menu_delete(Fl_Menu_*, void*) {
-  // remove the current suite
-
-  g_layout_list.remove(g_layout_list.current_suite());
-  g_layout_list.update_dialogs();
-}
-
-Fl_Menu_Item menu_w_layout_menu[] = {
- {"Rename...", 0,  (Fl_Callback*)cb_w_layout_menu_rename, 0, 128, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
- {"@fd_beaker  FLUID Built-In", 0,  (Fl_Callback*)cb_w_layout_menu_storage, 0, 9, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
- {"@fd_user  User Preference", 0,  (Fl_Callback*)cb_w_layout_menu_storage1, 0, 8, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
- {"@fd_project  Store in .fl Project File", 0,  (Fl_Callback*)cb_w_layout_menu_storage2, 0, 8, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
- {"@fd_file  Store in External File", 0,  (Fl_Callback*)cb_w_layout_menu_storage3, 0, 136, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
- {"Load...", 0,  (Fl_Callback*)cb_w_layout_menu_load, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
- {"Save...", 0,  (Fl_Callback*)cb_w_layout_menu_save, 0, 128, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
- {"Delete", 0,  (Fl_Callback*)cb_w_layout_menu_delete, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
- {0,0,0,0,0,0,0,0,0}
-};
-
-Fl_Button *preset_choice[3]={(Fl_Button *)0};
-
-static void cb_Left(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->left_window_margin);
-  } else {
-    layout->left_window_margin = (int)o->value();
-  }
-}
-
-static void cb_Top(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->top_window_margin);
-  } else {
-    layout->top_window_margin = (int)o->value();
-  }
-}
-
-static void cb_Right(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->right_window_margin);
-  } else {
-    layout->right_window_margin = (int)o->value();
-  }
-}
-
-static void cb_Bottom(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->bottom_window_margin);
-  } else {
-    layout->bottom_window_margin = (int)o->value();
-  }
-}
-
-static void cb_Horizontal(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->window_grid_x);
-  } else {
-    layout->window_grid_x = (int)o->value();
-  }
-}
-
-static void cb_Vertical(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->window_grid_y);
-  } else {
-    layout->window_grid_y = (int)o->value();
-  }
-}
-
-static void cb_Left1(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->left_group_margin);
-  } else {
-    layout->left_group_margin = (int)o->value();
-  }
-}
-
-static void cb_Top1(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->top_group_margin);
-  } else {
-    layout->top_group_margin = (int)o->value();
-  }
-}
-
-static void cb_Right1(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->right_group_margin);
-  } else {
-    layout->right_group_margin = (int)o->value();
-  }
-}
-
-static void cb_Bottom1(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->bottom_group_margin);
-  } else {
-    layout->bottom_group_margin = (int)o->value();
-  }
-}
-
-static void cb_Horizontal1(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->group_grid_x);
-  } else {
-    layout->group_grid_x = (int)o->value();
-  }
-}
-
-static void cb_Vertical1(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->group_grid_y);
-  } else {
-    layout->group_grid_y = (int)o->value();
-  }
-}
-
-static void cb_Top2(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->top_tabs_margin);
-  } else {
-    layout->top_tabs_margin = (int)o->value();
-  }
-}
-
-static void cb_Bottom2(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->bottom_tabs_margin);
-  } else {
-    layout->bottom_tabs_margin = (int)o->value();
-  }
-}
-
-static void cb_Minimum(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->widget_min_w);
-  } else {
-    layout->widget_min_w = (int)o->value();
-  }
-}
-
-static void cb_Increment(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->widget_inc_w);
-  } else {
-    layout->widget_inc_w = (int)o->value();
-  }
-}
-
-static void cb_Gap(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->widget_gap_x);
-  } else {
-    layout->widget_gap_x = (int)o->value();
-  }
-}
-
-static void cb_3(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->widget_min_h);
-  } else {
-    layout->widget_min_h = (int)o->value();
-  }
-}
-
-static void cb_4(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->widget_inc_h);
-  } else {
-    layout->widget_inc_h = (int)o->value();
-  }
-}
-
-static void cb_5(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value((double)layout->widget_gap_y);
-  } else {
-    layout->widget_gap_y = (int)o->value();
-  }
-}
-
-static void cb_6(Fl_Choice* o, void* v) {
-  if (v == LOAD) {
-    o->value(layout->labelfont+1);
-  } else {
-    layout->labelfont = (int)o->value()-1;
-  }
-}
-
-static void cb_7(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value(layout->labelsize);
-  } else {
-    layout->labelsize = (int)o->value();
-  }
-}
-
-static void cb_8(Fl_Choice* o, void* v) {
-  if (v == LOAD) {
-    o->value(layout->textfont+1);
-  } else {
-    layout->textfont = (int)o->value()-1;
-  }
-}
-
-static void cb_9(Fl_Value_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value(layout->textsize);
-  } else {
-    layout->textsize = (int)o->value();
-  }
-}
-
-Fl_Group *w_settings_shell_tab=(Fl_Group *)0;
-
-static const unsigned char idata_shell_64[] =
-{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,96,0,0,0,64,8,4,0,0,0,
-79,61,186,133,0,0,2,233,73,68,65,84,104,222,237,154,207,107,19,65,20,199,63,
-155,196,70,235,161,154,149,104,165,148,170,104,127,252,3,30,5,43,69,130,55,15,
-222,234,77,65,240,34,182,1,127,28,2,189,181,9,120,16,244,82,240,32,210,179,162,
-69,241,170,30,196,91,107,171,208,218,94,26,161,77,218,131,182,49,38,245,80,77,
-118,67,205,254,152,113,102,87,242,114,217,101,194,240,253,236,188,247,102,230,
-205,128,179,181,145,97,141,10,219,10,127,21,86,201,208,134,4,139,49,165,88,124,
-29,98,146,152,56,64,70,147,252,29,132,180,147,60,195,17,96,141,4,250,236,43,71,
-68,1,42,68,118,30,246,18,87,164,122,163,254,88,37,42,10,176,253,71,126,134,30,
-170,10,228,71,248,98,245,28,195,41,68,93,90,156,110,78,40,26,129,170,39,220,144,
-91,11,64,183,185,142,129,18,203,68,20,5,241,178,135,127,187,206,66,245,52,106,
-73,114,116,252,19,132,18,91,174,21,122,0,208,100,70,43,136,255,147,32,134,33,
-14,42,241,39,131,34,47,229,3,36,184,78,159,34,128,57,222,83,144,63,2,237,236,
-87,228,22,237,173,153,184,5,16,200,44,100,223,114,124,96,157,227,12,176,39,140,
-0,155,60,102,12,56,198,109,206,201,41,29,168,117,161,60,83,0,44,114,135,87,
-252,8,31,128,81,27,184,60,119,53,35,248,2,56,204,69,203,104,232,69,240,5,176,
-143,75,140,4,4,193,103,26,53,25,14,8,130,239,121,32,40,8,2,19,89,48,16,132,102,
-226,32,32,8,46,37,244,35,8,175,133,116,35,72,88,204,153,12,115,211,134,240,154,
-114,184,86,163,38,151,109,163,48,198,76,216,150,211,118,71,90,100,154,205,176,
-237,7,76,134,45,69,241,55,172,135,111,67,99,114,186,182,155,45,11,22,33,11,58,0,
-62,241,136,239,181,26,134,170,141,78,76,158,252,44,79,107,111,131,202,14,214,
-36,1,204,147,179,200,79,49,40,239,203,168,0,152,39,203,179,218,219,16,55,232,
-14,250,166,222,106,115,228,108,242,71,233,119,81,244,14,12,192,28,19,60,183,
-200,79,211,167,80,190,112,22,250,104,147,127,94,154,252,132,154,17,152,37,103,
-147,63,74,175,210,175,47,8,48,203,4,211,154,229,11,0,204,144,109,42,191,76,201,
-67,111,113,223,19,95,204,175,252,113,203,33,68,138,17,78,217,228,127,230,5,75,
-84,92,246,22,165,135,148,207,123,0,190,0,10,76,54,200,239,109,104,127,192,19,
-143,125,46,113,203,215,236,237,43,11,21,121,215,68,190,189,221,173,189,165,168,
-46,141,182,211,245,251,233,194,46,242,173,237,238,173,203,211,185,140,160,11,
-37,185,194,79,22,57,203,85,78,254,181,125,222,67,143,253,92,35,169,14,32,202,
-25,6,248,198,33,14,52,105,223,112,125,36,104,208,65,210,233,102,147,220,44,20,
-163,211,177,189,51,108,59,50,61,214,2,208,109,174,99,160,192,130,178,251,66,11,
-214,235,54,142,9,192,201,42,205,71,41,33,161,178,208,216,199,86,173,56,32,227,
-218,229,42,166,70,15,89,225,168,104,12,220,87,226,55,187,91,149,123,50,162,100,
-82,219,229,239,135,114,138,14,109,164,201,83,85,44,126,133,81,55,103,232,191,0,
-145,21,211,195,226,88,204,195,0,0,0,0,73,69,78,68,174,66,96,130};
-static Fl_Image *image_shell_64() {
-  static Fl_Image *image = NULL;
-  if (!image)
-    image = new Fl_PNG_Image("shell_64.png", idata_shell_64, 802);
-  return image;
-}
-
-Fl_Browser *w_settings_shell_list=(Fl_Browser *)0;
-
-static void cb_w_settings_shell_list(Fl_Browser* o, void* v) {
-  if (v == LOAD) {
-    // load from g_shell_config
-    if (g_shell_config) {
-      o->clear();
-      w_settings_shell_list_selected = 0;
-      for (int i=0; i<g_shell_config->list_size; i++) {
-        Fd_Shell_Command *cmd = g_shell_config->list[i];
-        o->add(cmd->name.c_str());
-        if (cmd->storage == FD_STORE_USER)
-          o->icon(i+1, w_settings_shell_fd_user->image());
-        else if (cmd->storage == FD_STORE_PROJECT)
-          o->icon(i+1, w_settings_shell_fd_project->image());
-      }
-    }
-  } else {
-  //  int prev_selected = w_settings_shell_list_selected;
-    w_settings_shell_list_selected = 0;
-    int selected = w_settings_shell_list->value();
-    if (selected) {
-      if (w_settings_shell_list->selected(selected))
-        w_settings_shell_list_selected = selected;
-    }
-    w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
-    w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
-  }
-}
-
-Fl_Group *w_settings_shell_toolbox=(Fl_Group *)0;
-
-static void cb_w_settings_shell_toolbox(Fl_Group* o, void* v) {
-  if (v==LOAD) {
-    propagate_load(o, v);
-  }
-}
-
-static void cb_a(Fl_Button*, void* v) {
-  if (v != LOAD) {
-    int selected = w_settings_shell_list_selected;
-    Fd_Shell_Command *cmd = new Fd_Shell_Command("new shell command");
-    g_shell_config->insert(selected, cmd);
-    w_settings_shell_list->insert(selected+1, cmd->name.c_str());
-    w_settings_shell_list->deselect();
-    w_settings_shell_list->value(selected+1);
-    if (cmd->storage == FD_STORE_USER)
-      w_settings_shell_list->icon(selected+1, w_settings_shell_fd_user->image());
-    else if (cmd->storage == FD_STORE_PROJECT)
-      w_settings_shell_list->icon(selected+1, w_settings_shell_fd_project->image());
-    w_settings_shell_list->do_callback();
-    w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
-    w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
-    g_shell_config->rebuild_shell_menu();
-  }
-}
-
-Fl_Button *w_settings_shell_dup=(Fl_Button *)0;
-
-static void cb_w_settings_shell_dup(Fl_Button* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v==LOAD) {
-    if (selected) {
-      o->activate();
-    } else {
-      o->deactivate();
-    }
-  } else {
-    if (!selected) return;
-    Fd_Shell_Command *cmd = new Fd_Shell_Command(g_shell_config->list[selected-1]);
-    g_shell_config->insert(selected, cmd);
-    w_settings_shell_list->insert(selected+1, cmd->name.c_str());
-    w_settings_shell_list->deselect();
-    w_settings_shell_list->deselect();
-    w_settings_shell_list->value(selected+1);
-    if (cmd->storage == FD_STORE_USER)
-      w_settings_shell_list->icon(selected+1, w_settings_shell_fd_user->image());
-    else if (cmd->storage == FD_STORE_PROJECT)
-      w_settings_shell_list->icon(selected+1, w_settings_shell_fd_project->image());
-    w_settings_shell_list->do_callback();
-    w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
-    w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
-    g_shell_config->rebuild_shell_menu();
-  }
-}
-
-Fl_Button *w_settings_shell_remove=(Fl_Button *)0;
-
-static void cb_w_settings_shell_remove(Fl_Button* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v==LOAD) {
-    if (selected) {
-      o->activate();
-    } else {
-      o->deactivate();
-    }
-  } else {
-    if (!selected) return;
-    int ret = fl_choice("Delete the shell command\n\"%s\"?\n\nThis can not be undone.",
-      "Delete", "Cancel", NULL, g_shell_config->list[selected-1]->name.c_str());
-    if (ret==1) return;
-    g_shell_config->remove(selected-1);
-    w_settings_shell_list->remove(selected);
-    if (selected <= w_settings_shell_list->size())
-      w_settings_shell_list->value(selected);
-    else
-      w_settings_shell_list->value(0);
-    w_settings_shell_list->do_callback();
-    w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
-    w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
-    g_shell_config->rebuild_shell_menu();
-  }
-}
-
-Fl_Menu_Button *w_settings_shell_menu=(Fl_Menu_Button *)0;
-
-static void cb_Import(Fl_Menu_*, void* v) {
-  if (v != LOAD)
-    Fd_Shell_Command_List::import_from_file();
-}
-
-static void cb_Export(Fl_Menu_*, void* v) {
-  if (v != LOAD)
-    Fd_Shell_Command_List::export_selected();
-}
-
-Fl_Menu_Item menu_w_settings_shell_menu[] = {
- {"Import...", 0,  (Fl_Callback*)cb_Import, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"Export selected...", 0,  (Fl_Callback*)cb_Export, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"Example Scripts:", 0,  0, 0, 17, (uchar)FL_NORMAL_LABEL, 1, 10, 0},
- {"Compile with fltk-config", 0,  0, 0, 16, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"Build and run", 0,  0, 0, 16, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"Build with Xcode on macOS", 0,  0, 0, 16, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"Build with CMake", 0,  0, 0, 16, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {0,0,0,0,0,0,0,0,0}
-};
-
-static void cb_T(Fl_Button*, void* v) {
-  if (v!=LOAD) show_terminal_window();
-}
-
-Fl_Button *w_settings_shell_play=(Fl_Button *)0;
-
-static void cb_w_settings_shell_play(Fl_Button* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v==LOAD) {
-    if (selected) {
-      o->activate();
-    } else {
-      o->deactivate();
-    }
-  } else {
-    if (!selected) return;
-    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-    cmd->run();
-  }
-}
-
-Fl_Group *w_settings_shell_cmd=(Fl_Group *)0;
-
-static void cb_w_settings_shell_cmd(Fl_Group* o, void* v) {
-  if (v==LOAD) {
-    int selected = w_settings_shell_list_selected;
-    if (selected) {
-      o->activate();
-    } else {
-      o->deactivate();
-    }
-    propagate_load(o, v);
-  }
-}
-
-static void cb_Name(Fl_Input* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v == LOAD) {
-    if (selected) {
-      o->value(g_shell_config->list[selected-1]->name.c_str());
-    } else {
-      o->value("");
-    }
-  } else {
-    if (selected) {
-      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-      cmd->name = o->value();
-      w_settings_shell_list->text(selected, o->value());
-      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-    }
-  }
-}
-
-static void cb_Menu(Fl_Input* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v == LOAD) {
-    if (selected) {
-      o->value(g_shell_config->list[selected-1]->label.c_str());
-    } else {
-      o->value("");
-    }
-  } else {
-    if (selected) {
-      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-      cmd->label = o->value();
-      cmd->update_shell_menu();
-      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-    }
-  }
-}
-
-static void cb_b(Fl_Group* o, void* v) {
-  propagate_load(o, v);
-}
-
-static void cb_Shortcut(Fl_Shortcut_Button* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v == LOAD) {
-    if (selected) {
-      o->value(g_shell_config->list[selected-1]->shortcut);
-      //o->default_value(o->value());
-    } else {
-      o->value(0);
-    }
-  } else {
-    if (selected) {
-      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-      cmd->shortcut = o->value();
-      cmd->update_shell_menu();
-      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-    }
-  }
-}
-
-static void cb_Store(Fl_Choice* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v == LOAD) {
-    if (selected) {
-      Fd_Tool_Store ts = g_shell_config->list[selected-1]->storage;
-      o->value(o->find_item_with_argument((long)ts));
-    } else {
-      o->value(o->find_item_with_argument((long)FD_STORE_USER));
-    }
-  } else {
-    if (selected) {
-      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-      Fd_Tool_Store ts = (Fd_Tool_Store)(o->mvalue()->argument());
-      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-      cmd->storage = ts;
-      //w_settings_shell_list->text(selected, cmd->name.c_str());
-      if (cmd->storage == FD_STORE_USER)
-        w_settings_shell_list->icon(selected, w_settings_shell_fd_user->image());
-      else if (cmd->storage == FD_STORE_PROJECT)
-        w_settings_shell_list->icon(selected, w_settings_shell_fd_project->image());
-      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-    }
-  }
-}
-
-Fl_Menu_Item menu_Store[] = {
- {"@fd_user User Setting", 0,  0, (void*)(FD_STORE_USER), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"@fd_project Project File", 0,  0, (void*)(FD_STORE_PROJECT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {0,0,0,0,0,0,0,0,0}
-};
-
-static void cb_Condition(Fl_Choice* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v == LOAD) {
-    if (selected) {
-      int cond = g_shell_config->list[selected-1]->condition;
-      o->value(o->find_item_with_argument(cond));
-    } else {
-      o->value(o->find_item_with_argument(0));
-    }
-  } else {
-    if (selected) {
-      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-      int cond = (int)(o->mvalue()->argument());
-      cmd->condition = cond;
-      g_shell_config->rebuild_shell_menu();
-      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-    }
-  }
-}
-
-Fl_Menu_Item menu_Condition[] = {
- {"all platforms", 0,  0, (void*)(Fd_Shell_Command::ALWAYS), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"Windows only", 0,  0, (void*)(Fd_Shell_Command::WIN_ONLY), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"Linux only", 0,  0, (void*)(Fd_Shell_Command::UX_ONLY), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"macOS only", 0,  0, (void*)(Fd_Shell_Command::MAC_ONLY), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"Linux and macOS", 0,  0, (void*)(Fd_Shell_Command::MAC_AND_UX_ONLY), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"don\'t use", 0,  0, (void*)(Fd_Shell_Command::NEVER), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {0,0,0,0,0,0,0,0,0}
-};
-
-static void cb_Label(Fl_Input* o, void* v) {
-  if (v == LOAD) {
-  //  o->value(g_shell_command.c_str());
-  } else {
-  //  g_shell_command = o->value();
-  }
-}
-
-Fl_Text_Editor *w_settings_shell_command=(Fl_Text_Editor *)0;
-
-static void cb_w_settings_shell_command(Fl_Text_Editor* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v == LOAD) {
-    if (selected) {
-      o->buffer()->text(g_shell_config->list[selected-1]->command.c_str());
-    } else {
-      o->buffer()->text("");
-    }
-  } else {
-    if (selected) {
-      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-      cmd->command = o->buffer()->text();
-      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-    }
-  }
-}
-
-Fl_Menu_Button *w_settings_shell_text_macros=(Fl_Menu_Button *)0;
-
-static void cb_w_settings_shell_text_macros(Fl_Menu_Button* o, void*) {
-  const Fl_Menu_Item *mi = o->mvalue();
-  if (mi) {
-    char buffer[256];
-    fl_strlcpy(buffer, mi->label(), 255);
-    int n = (int)strlen(buffer)-1;
-    if (buffer[n]=='@') buffer[n] = 0;
-    char *word = buffer;
-    if (word[0]=='@') word++;
-    if (w_settings_shell_command->buffer()->selected()) {
-      int start = 0, end = 0;
-      w_settings_shell_command->buffer()->selection_position(&start, &end);
-      w_settings_shell_command->buffer()->replace(start, end, word);
-    } else {
-      int pos = w_settings_shell_command->insert_position();
-      w_settings_shell_command->buffer()->insert(pos, word);
-    }
-    w_settings_shell_command->do_callback(w_settings_shell_command, (void*)NULL);
-  }
-}
-
-Fl_Menu_Item menu_w_settings_shell_text_macros[] = {
- {"@@BASENAME@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
- {"@@PROJECTFILE_PATH@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
- {"@@PROJECTFILE_NAME@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
- {"@@CODEFILE_PATH@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
- {"@@CODEFILE_NAME@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
- {"@@HEADERFILE_PATH@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
- {"@@HEADERFILE_NAME@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
- {"@@TEXTFILE_PATH@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
- {"@@TEXTFILE_NAME@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
- // Not yet implemented
- {"@@FLTK_CONFIG@@", 0,  0, 0, 16, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
- {"@@TMPDIR@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
- {0,0,0,0,0,0,0,0,0}
-};
-
-static void cb_1fd_zoom(Fl_Button*, void*) {
-  if (!script_panel) make_script_panel();
-  script_input->buffer()->text(w_settings_shell_command->buffer()->text());
-  script_panel->show();
-
-  for (;;) {
-    Fl_Widget* w = Fl::readqueue();
-    if (w == script_panel_cancel) goto BREAK2;
-    else if (w == script_panel_ok) break;
-    else if (!w) Fl::wait();
-  }
-
-  w_settings_shell_command->buffer()->text(script_input->buffer()->text());
-  w_settings_shell_command->do_callback();
-  BREAK2:
-  script_panel->hide();
-}
-
-static void cb_save(Fl_Check_Button* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v == LOAD) {
-    if (selected) {
-      o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_PROJECT);
-    } else {
-      o->value(0);
-    }
-  } else {
-    if (selected) {
-      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-      int v = o->value();
-      if (v) {
-        cmd->flags |= Fd_Shell_Command::SAVE_PROJECT;
-      } else {
-        cmd->flags &= ~Fd_Shell_Command::SAVE_PROJECT;
-      }
-      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-    }
-  }
-}
-
-static void cb_save1(Fl_Check_Button* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v == LOAD) {
-    if (selected) {
-      o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_SOURCECODE);
-    } else {
-      o->value(0);
-    }
-  } else {
-    if (selected) {
-      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-      int v = o->value();
-      if (v) {
-        cmd->flags |= Fd_Shell_Command::SAVE_SOURCECODE;
-      } else {
-        cmd->flags &= ~Fd_Shell_Command::SAVE_SOURCECODE;
-      }
-      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-    }
-  }
-}
-
-static void cb_save2(Fl_Check_Button* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v == LOAD) {
-    if (selected) {
-      o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_STRINGS);
-    } else {
-      o->value(0);
-    }
-  } else {
-    if (selected) {
-      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-      int v = o->value();
-      if (v) {
-        cmd->flags |= Fd_Shell_Command::SAVE_STRINGS;
-      } else {
-        cmd->flags &= ~Fd_Shell_Command::SAVE_STRINGS;
-      }
-      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-    }
-  }
-}
-
-static void cb_show(Fl_Check_Button* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v == LOAD) {
-    if (selected) {
-      o->value(!(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::DONT_SHOW_TERMINAL));
-    } else {
-      o->value(0);
-    }
-  } else {
-    if (selected) {
-      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-      int v = o->value();
-      if (!v) {
-        cmd->flags |= Fd_Shell_Command::DONT_SHOW_TERMINAL;
-      } else {
-        cmd->flags &= ~Fd_Shell_Command::DONT_SHOW_TERMINAL;
-      }
-      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-    }
-  }
-}
-
-static void cb_clear(Fl_Check_Button* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v == LOAD) {
-    if (selected) {
-      o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::CLEAR_TERMINAL);
-    } else {
-      o->value(0);
-    }
-  } else {
-    if (selected) {
-      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-      int v = o->value();
-      if (v) {
-        cmd->flags |= Fd_Shell_Command::CLEAR_TERMINAL;
-      } else {
-        cmd->flags &= ~Fd_Shell_Command::CLEAR_TERMINAL;
-      }
-      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-    }
-  }
-}
-
-static void cb_clear1(Fl_Check_Button* o, void* v) {
-  int selected = w_settings_shell_list_selected;
-  if (v == LOAD) {
-    if (selected) {
-      o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::CLEAR_HISTORY);
-    } else {
-      o->value(0);
-    }
-  } else {
-    if (selected) {
-      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-      int v = o->value();
-      if (v) {
-        cmd->flags |= Fd_Shell_Command::CLEAR_HISTORY;
-      } else {
-        cmd->flags &= ~Fd_Shell_Command::CLEAR_HISTORY;
-      }
-      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-    }
-  }
-}
-
-Fl_Box *w_settings_shell_fd_project=(Fl_Box *)0;
-
-static const unsigned char idata_fd_project[] =
-{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,32,8,6,0,0,0,
-115,122,122,244,0,0,1,110,105,67,67,80,105,99,99,0,0,40,145,117,145,187,75,195,
-80,20,198,127,173,239,23,14,58,136,116,200,80,197,65,65,20,196,81,235,208,165,
-72,169,21,172,186,180,49,109,133,164,13,73,139,136,171,224,226,80,112,16,93,
-124,13,254,7,186,10,174,10,130,160,8,34,110,238,190,22,145,120,174,45,180,136,
-189,225,230,252,248,238,253,14,39,95,192,31,49,117,203,109,156,2,43,87,112,98,
-225,144,182,144,88,212,90,94,104,163,153,46,2,244,39,117,215,158,142,70,35,212,
-93,159,119,248,84,189,29,81,189,234,223,251,119,117,172,24,174,14,190,86,225,9,
-221,118,10,194,50,13,145,181,130,173,120,91,184,87,207,38,87,132,15,133,135,29,
-25,80,248,74,233,169,50,63,43,206,148,249,93,177,19,143,205,128,95,245,212,50,
-53,156,170,97,61,235,88,194,67,194,65,203,44,234,149,121,212,151,116,26,185,
-249,57,169,253,178,3,184,196,8,19,66,35,69,145,85,76,10,140,72,205,73,102,255,
-251,70,127,125,179,228,197,163,203,219,102,29,71,28,25,178,226,29,22,181,40,93,
-13,169,105,209,13,121,76,214,85,238,127,243,116,211,227,99,229,238,157,33,104,
-122,242,188,183,1,104,217,129,239,146,231,125,29,121,222,247,49,52,60,194,69,
-174,234,207,75,78,147,31,162,151,170,90,240,0,186,55,225,236,178,170,165,118,
-225,124,11,250,30,236,164,147,252,149,26,100,251,211,105,120,61,133,174,4,244,
-220,64,251,82,57,171,202,57,39,247,16,223,144,95,116,13,123,251,48,40,247,187,
-151,127,0,229,44,103,253,189,250,32,75,0,0,0,9,112,72,89,115,0,0,22,37,0,0,22,
-37,1,73,82,36,240,0,0,1,13,116,69,88,116,82,97,119,32,112,114,111,102,105,108,
-101,32,116,121,112,101,32,101,120,105,102,0,10,101,120,105,102,10,32,32,32,32,
-32,49,49,52,10,52,53,55,56,54,57,54,54,48,48,48,48,52,57,52,57,50,97,48,48,48,
-56,48,48,48,48,48,48,48,52,48,48,49,97,48,49,48,53,48,48,48,49,48,48,48,48,48,
-48,51,101,48,48,48,48,48,48,49,98,48,49,48,53,48,48,48,49,48,48,48,48,48,48,10,
-52,54,48,48,48,48,48,48,50,56,48,49,48,51,48,48,48,49,48,48,48,48,48,48,48,50,
-48,48,48,48,48,48,54,57,56,55,48,52,48,48,48,49,48,48,48,48,48,48,52,101,48,48,
-48,48,48,48,48,48,48,48,48,48,48,48,57,48,48,48,48,48,48,48,10,48,49,48,48,48,
-48,48,48,57,48,48,48,48,48,48,48,48,49,48,48,48,48,48,48,48,50,48,48,48,50,97,
-48,48,52,48,48,48,49,48,48,48,48,48,48,53,50,48,48,48,48,48,48,48,51,97,48,48,
-52,48,48,48,49,48,48,48,48,48,48,56,48,48,48,10,48,48,48,48,48,48,48,48,48,48,
-48,48,10,190,225,144,105,0,0,0,90,116,69,88,116,82,97,119,32,112,114,111,102,
-105,108,101,32,116,121,112,101,32,105,112,116,99,0,10,105,112,116,99,10,32,32,
-32,32,32,32,50,54,10,53,48,54,56,54,102,55,52,54,102,55,51,54,56,54,102,55,48,
-50,48,51,51,50,101,51,48,48,48,51,56,52,50,52,57,52,100,48,52,48,52,48,48,48,
-48,48,48,48,48,48,48,48,48,10,199,209,105,220,0,0,20,96,116,69,88,116,82,97,
-119,32,112,114,111,102,105,108,101,32,116,121,112,101,32,120,109,112,0,10,120,
-109,112,10,32,32,32,32,50,53,53,53,10,51,99,51,102,55,56,55,48,54,49,54,51,54,
-98,54,53,55,52,50,48,54,50,54,53,54,55,54,57,54,101,51,100,50,50,101,102,98,98,
-98,102,50,50,50,48,54,57,54,52,51,100,50,50,53,55,51,53,52,100,51,48,52,100,55,
-48,52,51,54,53,54,56,54,57,10,52,56,55,97,55,50,54,53,53,51,55,97,52,101,53,52,
-54,51,55,97,54,98,54,51,51,57,54,52,50,50,51,102,51,101,48,97,51,99,55,56,51,
-97,55,56,54,100,55,48,54,100,54,53,55,52,54,49,50,48,55,56,54,100,54,99,54,101,
-55,51,51,97,55,56,10,51,100,50,50,54,49,54,52,54,102,54,50,54,53,51,97,54,101,
-55,51,51,97,54,100,54,53,55,52,54,49,50,102,50,50,50,48,55,56,51,97,55,56,54,
-100,55,48,55,52,54,98,51,100,50,50,53,56,52,100,53,48,50,48,52,51,54,102,55,50,
-54,53,50,48,10,51,52,50,101,51,52,50,101,51,48,50,100,52,53,55,56,54,57,55,54,
-51,50,50,50,51,101,48,97,50,48,51,99,55,50,54,52,54,54,51,97,53,50,52,52,52,54,
-50,48,55,56,54,100,54,99,54,101,55,51,51,97,55,50,54,52,54,54,51,100,50,50,54,
-56,10,55,52,55,52,55,48,51,97,50,102,50,102,55,55,55,55,55,55,50,101,55,55,51,
-51,50,101,54,102,55,50,54,55,50,102,51,49,51,57,51,57,51,57,50,102,51,48,51,50,
-50,102,51,50,51,50,50,100,55,50,54,52,54,54,50,100,55,51,55,57,54,101,55,52,10,
-54,49,55,56,50,100,54,101,55,51,50,51,50,50,51,101,48,97,50,48,50,48,51,99,55,
-50,54,52,54,54,51,97,52,52,54,53,55,51,54,51,55,50,54,57,55,48,55,52,54,57,54,
-102,54,101,50,48,55,50,54,52,54,54,51,97,54,49,54,50,54,102,55,53,10,55,52,51,
-100,50,50,50,50,48,97,50,48,50,48,50,48,50,48,55,56,54,100,54,99,54,101,55,51,
-51,97,54,53,55,56,54,57,54,54,51,100,50,50,54,56,55,52,55,52,55,48,51,97,50,
-102,50,102,54,101,55,51,50,101,54,49,54,52,54,102,54,50,54,53,10,50,101,54,51,
-54,102,54,100,50,102,54,53,55,56,54,57,54,54,50,102,51,49,50,101,51,48,50,102,
-50,50,48,97,50,48,50,48,50,48,50,48,55,56,54,100,54,99,54,101,55,51,51,97,55,
-52,54,57,54,54,54,54,51,100,50,50,54,56,55,52,55,52,55,48,10,51,97,50,102,50,
-102,54,101,55,51,50,101,54,49,54,52,54,102,54,50,54,53,50,101,54,51,54,102,54,
-100,50,102,55,52,54,57,54,54,54,54,50,102,51,49,50,101,51,48,50,102,50,50,48,97,
-50,48,50,48,50,48,54,53,55,56,54,57,54,54,51,97,53,48,10,54,57,55,56,54,53,54,
-99,53,56,52,52,54,57,54,100,54,53,54,101,55,51,54,57,54,102,54,101,51,100,50,
-50,51,56,51,50,50,50,48,97,50,48,50,48,50,48,54,53,55,56,54,57,54,54,51,97,53,
-48,54,57,55,56,54,53,54,99,53,57,52,52,54,57,10,54,100,54,53,54,101,55,51,54,
-57,54,102,54,101,51,100,50,50,51,49,51,50,51,56,50,50,48,97,50,48,50,48,50,48,
-55,52,54,57,54,54,54,54,51,97,53,50,54,53,55,51,54,102,54,99,55,53,55,52,54,57,
-54,102,54,101,53,53,54,101,54,57,55,52,10,51,100,50,50,51,50,50,50,48,97,50,48,
-50,48,50,48,55,52,54,57,54,54,54,54,51,97,53,57,53,50,54,53,55,51,54,102,54,99,
-55,53,55,52,54,57,54,102,54,101,51,100,50,50,51,49,51,52,51,52,50,48,50,102,50,
-48,51,49,50,50,48,97,50,48,10,50,48,50,48,55,52,54,57,54,54,54,54,51,97,53,56,
-53,50,54,53,55,51,54,102,54,99,55,53,55,52,54,57,54,102,54,101,51,100,50,50,51,
-49,51,52,51,52,50,48,50,102,50,48,51,49,50,50,50,102,51,101,48,97,50,48,51,99,
-50,102,55,50,54,52,10,54,54,51,97,53,50,52,52,52,54,51,101,48,97,51,99,50,102,
-55,56,51,97,55,56,54,100,55,48,54,100,54,53,55,52,54,49,51,101,48,97,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,10,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,48,
-97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,10,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,10,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,
-97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,48,97,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,10,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,51,99,51,102,55,56,55,48,54,49,
-54,51,54,98,54,53,55,52,50,48,54,53,54,101,54,52,51,100,50,50,55,55,50,50,51,
-102,51,101,10,87,123,188,247,0,0,3,115,73,68,65,84,88,71,189,151,75,75,91,65,20,
-199,79,110,222,169,52,180,203,22,186,239,210,47,80,236,206,126,5,177,17,151,46,
-68,23,82,220,138,90,84,116,163,184,80,81,132,98,93,234,42,203,210,79,209,149,
-32,213,68,164,165,165,129,230,97,94,246,252,166,157,246,246,102,154,132,230,
-226,31,134,59,247,204,153,243,158,123,207,68,206,206,206,164,86,171,73,52,26,
-149,68,34,17,175,84,42,215,123,123,123,15,119,118,118,164,23,26,141,134,164,211,
-105,243,28,29,29,149,229,229,229,183,177,88,236,101,171,213,106,235,83,154,205,
-166,120,158,39,145,72,196,12,23,188,106,181,42,201,100,82,110,111,111,69,149,55,
-246,247,247,139,187,187,187,102,209,110,252,215,200,100,50,162,202,12,111,62,
-159,151,211,211,211,49,85,252,70,135,231,212,230,64,44,149,74,201,205,205,141,
-196,227,113,97,174,222,84,48,102,102,102,70,230,230,230,186,110,110,183,219,178,
-177,177,33,219,219,219,198,129,133,133,5,188,30,27,31,31,71,78,78,89,90,93,5,40,
-60,60,32,92,8,168,215,235,120,86,96,129,148,244,138,0,70,219,208,142,140,140,
-144,66,89,89,89,145,163,163,163,49,221,255,90,195,31,65,62,60,200,7,240,48,39,
-53,198,0,187,96,94,126,230,43,195,28,239,122,129,189,150,111,120,120,88,22,23,
-23,13,109,105,105,73,142,143,143,95,169,242,247,42,51,107,249,144,79,202,49,
-136,186,1,198,0,191,17,186,88,177,194,123,1,239,134,134,134,76,228,152,79,78,78,
-202,250,250,186,137,232,218,218,154,156,156,156,60,211,72,92,43,235,115,60,247,
-43,166,238,128,137,67,192,136,102,183,170,245,3,30,45,92,227,25,74,121,78,76,
-76,152,72,112,2,168,137,195,195,195,148,210,223,169,226,23,208,40,92,210,203,
-201,3,158,205,15,33,98,232,60,101,22,188,222,133,108,235,135,90,64,40,239,200,
-154,154,154,50,17,96,190,185,185,73,77,80,224,121,93,127,130,62,12,97,15,48,6,
-88,101,254,72,244,19,1,194,138,48,242,74,26,108,152,145,145,203,229,76,65,226,
-212,234,234,170,28,28,28,96,228,71,235,168,69,44,24,110,221,156,237,39,255,22,
-40,197,155,173,173,45,115,36,153,147,22,66,205,241,198,57,140,164,54,74,165,82,
-99,122,122,250,47,71,141,235,129,40,164,131,133,249,47,16,242,96,85,227,29,133,
-201,187,149,107,63,116,58,10,24,131,209,22,158,221,4,51,2,117,67,201,127,110,
-187,1,190,249,249,121,185,188,188,148,98,177,40,87,87,87,102,126,126,126,110,
-230,133,66,65,46,46,46,100,118,118,214,242,127,192,32,127,10,92,149,246,217,65,
-11,11,159,130,4,151,1,53,7,45,44,60,8,18,92,6,60,114,208,194,66,35,72,112,25,
-80,113,208,194,66,50,72,112,25,240,205,65,11,11,55,65,194,93,167,160,175,8,68,
-29,180,176,224,142,0,103,211,254,163,245,140,86,59,247,253,31,252,95,216,95,
-243,108,144,199,21,129,14,166,16,113,63,72,112,25,80,119,208,194,194,215,32,193,
-101,64,104,41,112,160,28,36,220,117,10,238,5,9,119,157,130,14,125,46,3,254,252,
-43,195,71,51,72,112,25,240,197,65,11,11,29,245,229,217,179,106,155,10,237,104,
-154,253,180,228,253,2,153,246,142,161,207,36,223,26,123,155,2,30,139,86,33,237,
-148,246,118,41,255,197,97,16,160,148,238,135,214,140,161,198,52,81,110,47,39,
-224,119,71,196,176,157,45,253,28,173,211,160,176,109,25,45,25,50,213,193,199,
-190,27,152,225,137,209,159,99,17,30,151,203,101,218,236,44,52,154,76,90,234,65,
-128,34,228,250,90,246,136,255,29,196,176,206,118,175,58,79,232,226,83,24,236,
-213,122,16,176,223,94,207,73,175,70,249,59,81,177,117,128,158,31,49,127,246,30,
-207,181,170,20,0,0,0,0,73,69,78,68,174,66,96,130};
-static Fl_Image *image_fd_project() {
-  static Fl_Image *image = NULL;
-  if (!image)
-    image = new Fl_PNG_Image("fd_project.png", idata_fd_project, 6950);
-  return image;
-}
-
-Fl_Box *w_settings_shell_fd_user=(Fl_Box *)0;
-
-static const unsigned char idata_fd_user[] =
-{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,32,8,6,0,0,0,
-115,122,122,244,0,0,1,110,105,67,67,80,105,99,99,0,0,40,145,117,145,187,75,195,
-80,20,198,127,173,239,23,14,58,136,116,200,80,197,65,65,20,196,81,235,208,165,
-72,169,21,172,186,180,49,109,133,164,13,73,139,136,171,224,226,80,112,16,93,
-124,13,254,7,186,10,174,10,130,160,8,34,110,238,190,22,145,120,174,45,180,136,
-189,225,230,252,248,238,253,14,39,95,192,31,49,117,203,109,156,2,43,87,112,98,
-225,144,182,144,88,212,90,94,104,163,153,46,2,244,39,117,215,158,142,70,35,212,
-93,159,119,248,84,189,29,81,189,234,223,251,119,117,172,24,174,14,190,86,225,9,
-221,118,10,194,50,13,145,181,130,173,120,91,184,87,207,38,87,132,15,133,135,29,
-25,80,248,74,233,169,50,63,43,206,148,249,93,177,19,143,205,128,95,245,212,50,
-53,156,170,97,61,235,88,194,67,194,65,203,44,234,149,121,212,151,116,26,185,
-249,57,169,253,178,3,184,196,8,19,66,35,69,145,85,76,10,140,72,205,73,102,255,
-251,70,127,125,179,228,197,163,203,219,102,29,71,28,25,178,226,29,22,181,40,93,
-13,169,105,209,13,121,76,214,85,238,127,243,116,211,227,99,229,238,157,33,104,
-122,242,188,183,1,104,217,129,239,146,231,125,29,121,222,247,49,52,60,194,69,
-174,234,207,75,78,147,31,162,151,170,90,240,0,186,55,225,236,178,170,165,118,
-225,124,11,250,30,236,164,147,252,149,26,100,251,211,105,120,61,133,174,4,244,
-220,64,251,82,57,171,202,57,39,247,16,223,144,95,116,13,123,251,48,40,247,187,
-151,127,0,229,44,103,253,189,250,32,75,0,0,0,9,112,72,89,115,0,0,22,37,0,0,22,
-37,1,73,82,36,240,0,0,1,13,116,69,88,116,82,97,119,32,112,114,111,102,105,108,
-101,32,116,121,112,101,32,101,120,105,102,0,10,101,120,105,102,10,32,32,32,32,
-32,49,49,52,10,52,53,55,56,54,57,54,54,48,48,48,48,52,57,52,57,50,97,48,48,48,
-56,48,48,48,48,48,48,48,52,48,48,49,97,48,49,48,53,48,48,48,49,48,48,48,48,48,
-48,51,101,48,48,48,48,48,48,49,98,48,49,48,53,48,48,48,49,48,48,48,48,48,48,10,
-52,54,48,48,48,48,48,48,50,56,48,49,48,51,48,48,48,49,48,48,48,48,48,48,48,50,
-48,48,48,48,48,48,54,57,56,55,48,52,48,48,48,49,48,48,48,48,48,48,52,101,48,48,
-48,48,48,48,48,48,48,48,48,48,48,48,57,48,48,48,48,48,48,48,10,48,49,48,48,48,
-48,48,48,57,48,48,48,48,48,48,48,48,49,48,48,48,48,48,48,48,50,48,48,48,50,97,
-48,48,52,48,48,48,49,48,48,48,48,48,48,53,50,48,48,48,48,48,48,48,51,97,48,48,
-52,48,48,48,49,48,48,48,48,48,48,56,48,48,48,10,48,48,48,48,48,48,48,48,48,48,
-48,48,10,190,225,144,105,0,0,0,90,116,69,88,116,82,97,119,32,112,114,111,102,
-105,108,101,32,116,121,112,101,32,105,112,116,99,0,10,105,112,116,99,10,32,32,
-32,32,32,32,50,54,10,53,48,54,56,54,102,55,52,54,102,55,51,54,56,54,102,55,48,
-50,48,51,51,50,101,51,48,48,48,51,56,52,50,52,57,52,100,48,52,48,52,48,48,48,
-48,48,48,48,48,48,48,48,48,10,199,209,105,220,0,0,20,96,116,69,88,116,82,97,
-119,32,112,114,111,102,105,108,101,32,116,121,112,101,32,120,109,112,0,10,120,
-109,112,10,32,32,32,32,50,53,53,53,10,51,99,51,102,55,56,55,48,54,49,54,51,54,
-98,54,53,55,52,50,48,54,50,54,53,54,55,54,57,54,101,51,100,50,50,101,102,98,98,
-98,102,50,50,50,48,54,57,54,52,51,100,50,50,53,55,51,53,52,100,51,48,52,100,55,
-48,52,51,54,53,54,56,54,57,10,52,56,55,97,55,50,54,53,53,51,55,97,52,101,53,52,
-54,51,55,97,54,98,54,51,51,57,54,52,50,50,51,102,51,101,48,97,51,99,55,56,51,
-97,55,56,54,100,55,48,54,100,54,53,55,52,54,49,50,48,55,56,54,100,54,99,54,101,
-55,51,51,97,55,56,10,51,100,50,50,54,49,54,52,54,102,54,50,54,53,51,97,54,101,
-55,51,51,97,54,100,54,53,55,52,54,49,50,102,50,50,50,48,55,56,51,97,55,56,54,
-100,55,48,55,52,54,98,51,100,50,50,53,56,52,100,53,48,50,48,52,51,54,102,55,50,
-54,53,50,48,10,51,52,50,101,51,52,50,101,51,48,50,100,52,53,55,56,54,57,55,54,
-51,50,50,50,51,101,48,97,50,48,51,99,55,50,54,52,54,54,51,97,53,50,52,52,52,54,
-50,48,55,56,54,100,54,99,54,101,55,51,51,97,55,50,54,52,54,54,51,100,50,50,54,
-56,10,55,52,55,52,55,48,51,97,50,102,50,102,55,55,55,55,55,55,50,101,55,55,51,
-51,50,101,54,102,55,50,54,55,50,102,51,49,51,57,51,57,51,57,50,102,51,48,51,50,
-50,102,51,50,51,50,50,100,55,50,54,52,54,54,50,100,55,51,55,57,54,101,55,52,10,
-54,49,55,56,50,100,54,101,55,51,50,51,50,50,51,101,48,97,50,48,50,48,51,99,55,
-50,54,52,54,54,51,97,52,52,54,53,55,51,54,51,55,50,54,57,55,48,55,52,54,57,54,
-102,54,101,50,48,55,50,54,52,54,54,51,97,54,49,54,50,54,102,55,53,10,55,52,51,
-100,50,50,50,50,48,97,50,48,50,48,50,48,50,48,55,56,54,100,54,99,54,101,55,51,
-51,97,54,53,55,56,54,57,54,54,51,100,50,50,54,56,55,52,55,52,55,48,51,97,50,
-102,50,102,54,101,55,51,50,101,54,49,54,52,54,102,54,50,54,53,10,50,101,54,51,
-54,102,54,100,50,102,54,53,55,56,54,57,54,54,50,102,51,49,50,101,51,48,50,102,
-50,50,48,97,50,48,50,48,50,48,50,48,55,56,54,100,54,99,54,101,55,51,51,97,55,
-52,54,57,54,54,54,54,51,100,50,50,54,56,55,52,55,52,55,48,10,51,97,50,102,50,
-102,54,101,55,51,50,101,54,49,54,52,54,102,54,50,54,53,50,101,54,51,54,102,54,
-100,50,102,55,52,54,57,54,54,54,54,50,102,51,49,50,101,51,48,50,102,50,50,48,97,
-50,48,50,48,50,48,54,53,55,56,54,57,54,54,51,97,53,48,10,54,57,55,56,54,53,54,
-99,53,56,52,52,54,57,54,100,54,53,54,101,55,51,54,57,54,102,54,101,51,100,50,
-50,51,56,51,50,50,50,48,97,50,48,50,48,50,48,54,53,55,56,54,57,54,54,51,97,53,
-48,54,57,55,56,54,53,54,99,53,57,52,52,54,57,10,54,100,54,53,54,101,55,51,54,
-57,54,102,54,101,51,100,50,50,51,49,51,50,51,56,50,50,48,97,50,48,50,48,50,48,
-55,52,54,57,54,54,54,54,51,97,53,50,54,53,55,51,54,102,54,99,55,53,55,52,54,57,
-54,102,54,101,53,53,54,101,54,57,55,52,10,51,100,50,50,51,50,50,50,48,97,50,48,
-50,48,50,48,55,52,54,57,54,54,54,54,51,97,53,57,53,50,54,53,55,51,54,102,54,99,
-55,53,55,52,54,57,54,102,54,101,51,100,50,50,51,49,51,52,51,52,50,48,50,102,50,
-48,51,49,50,50,48,97,50,48,10,50,48,50,48,55,52,54,57,54,54,54,54,51,97,53,56,
-53,50,54,53,55,51,54,102,54,99,55,53,55,52,54,57,54,102,54,101,51,100,50,50,51,
-49,51,52,51,52,50,48,50,102,50,48,51,49,50,50,50,102,51,101,48,97,50,48,51,99,
-50,102,55,50,54,52,10,54,54,51,97,53,50,52,52,52,54,51,101,48,97,51,99,50,102,
-55,56,51,97,55,56,54,100,55,48,54,100,54,53,55,52,54,49,51,101,48,97,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,10,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,48,
-97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,10,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,10,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,
-97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,48,97,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,10,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
-48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
-50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,51,99,51,102,55,56,55,48,54,49,
-54,51,54,98,54,53,55,52,50,48,54,53,54,101,54,52,51,100,50,50,55,55,50,50,51,
-102,51,101,10,87,123,188,247,0,0,9,241,73,68,65,84,88,71,109,87,105,144,85,197,
-21,254,186,239,242,222,155,25,102,88,12,14,46,227,16,96,12,26,80,118,103,16,
-113,3,5,89,203,10,70,75,42,106,170,48,196,16,141,154,20,18,177,8,41,21,149,82,
-81,244,71,48,166,42,75,37,96,22,29,5,9,155,131,37,139,16,65,113,153,25,71,8,66,
-153,165,148,137,226,204,91,238,210,55,223,233,251,30,49,58,77,53,115,223,237,
-190,167,207,249,206,57,223,57,173,218,59,223,128,163,92,104,147,32,138,12,84,
-162,225,58,62,100,36,137,66,38,147,65,177,88,4,31,225,186,46,130,56,134,210,9,
-188,140,139,158,82,30,78,198,65,20,26,238,5,60,237,91,57,242,157,231,184,8,75,1,
-148,82,118,130,223,12,168,27,152,62,127,97,104,3,23,9,52,226,242,76,228,173,50,
-118,81,169,4,249,124,15,5,198,86,160,85,138,135,185,78,22,189,61,37,104,30,104,
-98,5,87,103,184,158,227,51,191,113,249,206,24,132,97,152,202,41,79,101,13,74,
-240,229,225,26,83,131,68,203,193,49,12,2,24,45,31,184,246,35,199,113,64,120,104,
-177,139,222,82,137,104,228,16,169,88,187,137,250,238,137,79,62,251,246,238,93,
-187,250,83,232,137,113,227,199,71,77,77,77,71,78,22,78,222,149,209,94,41,227,
-249,68,165,68,153,148,65,52,42,255,250,26,174,67,200,211,161,211,153,104,139,
-136,60,151,104,133,235,106,68,38,132,118,29,132,145,25,250,139,103,158,217,186,
-105,227,214,97,199,143,253,131,240,41,56,70,67,211,13,67,134,12,198,236,249,215,
-220,178,112,225,245,187,170,171,252,233,132,58,53,216,162,233,244,121,184,12,
-213,217,222,97,31,100,183,5,138,10,40,229,88,248,5,21,223,23,69,138,242,46,179,
-252,222,159,183,183,190,176,121,104,130,44,178,153,254,152,56,102,10,98,198,196,
-161,183,246,163,55,255,31,120,185,24,87,207,188,20,15,220,191,242,128,49,193,
-196,40,14,98,71,149,229,81,137,218,218,218,20,213,47,12,87,39,97,89,1,5,35,112,
-241,3,109,53,151,169,24,3,69,56,158,118,215,172,121,114,127,235,11,155,134,122,
-110,45,150,46,125,16,45,205,151,211,184,156,85,160,95,181,135,109,59,94,194,170,
-71,238,69,235,11,127,197,160,1,3,198,222,241,163,239,63,79,9,179,147,10,242,
-125,123,128,56,19,70,9,26,9,52,135,24,136,66,137,138,184,196,103,122,194,247,
-125,245,234,206,221,109,191,122,246,119,163,20,170,112,255,202,53,184,184,249,
-106,6,99,21,181,118,224,185,89,20,243,6,151,77,189,6,203,151,61,4,159,10,62,251,
-203,223,98,223,190,191,141,75,143,48,167,142,234,35,6,233,70,30,46,43,137,157,
-113,249,131,116,138,117,68,166,186,189,189,115,50,19,18,115,103,45,192,248,177,
-23,35,10,178,60,184,14,90,101,9,105,22,97,192,248,40,41,76,110,158,134,185,179,
-175,227,59,31,7,14,188,233,126,249,176,190,178,160,18,129,68,168,156,50,246,111,
-100,115,93,16,160,207,146,55,15,190,131,160,148,96,204,133,205,40,246,42,248,78,
-53,24,151,20,232,160,144,15,80,83,221,143,252,193,12,9,52,206,251,198,88,196,
-92,123,243,224,161,56,149,92,65,160,239,161,157,47,40,165,202,81,43,239,44,26,
-212,56,8,130,248,224,129,3,240,189,44,134,15,111,66,198,175,161,229,220,39,123,
-153,1,53,53,57,20,11,198,198,144,239,229,48,98,68,19,60,47,131,183,223,126,183,
-88,62,162,143,99,255,55,180,48,147,107,35,228,203,27,211,223,76,195,184,177,
-177,129,86,149,112,244,232,17,166,98,17,145,216,38,228,198,45,226,127,215,35,
-123,122,224,90,47,142,29,63,76,18,42,161,190,190,254,36,18,221,135,220,175,156,
-162,203,169,167,210,116,41,127,36,40,72,124,184,218,137,167,78,157,130,108,149,
-135,182,157,91,200,7,12,80,29,17,58,11,144,245,171,226,239,48,250,156,73,219,
-131,215,118,109,227,122,140,25,51,102,100,42,178,83,37,250,118,133,85,47,34,158,
-9,179,65,38,148,87,230,1,199,42,101,146,200,204,152,57,237,125,147,228,177,
-243,181,205,120,175,99,31,81,233,229,222,34,21,76,200,142,204,29,174,105,175,
-136,119,59,247,98,123,91,171,85,104,250,244,43,125,77,6,53,166,98,28,229,39,95,
-85,66,71,41,251,83,63,42,65,14,168,40,18,89,10,117,108,38,12,31,209,120,83,115,
-203,120,148,130,147,184,231,222,219,177,105,243,6,120,126,36,52,129,124,177,100,
-41,124,71,219,75,88,198,181,56,233,193,228,201,147,208,216,216,56,75,228,168,
-50,11,138,187,84,31,222,176,172,35,100,33,22,11,92,177,74,103,197,119,36,33,81,
-111,207,83,79,175,217,187,224,186,121,40,20,63,197,99,143,63,136,205,91,90,89,
-17,149,240,4,182,110,219,132,135,30,89,137,124,161,27,243,230,207,196,186,103,
-158,218,67,22,125,79,170,171,84,80,97,191,40,138,208,91,232,65,108,34,235,182,
-34,43,101,41,40,165,65,104,161,150,169,211,103,85,174,15,162,152,148,226,32,40,
-18,137,112,206,178,101,75,183,141,190,224,124,107,49,139,55,74,20,98,40,208,
-247,61,6,102,128,81,163,206,199,138,21,247,173,47,20,10,45,130,105,38,227,217,
-170,88,98,33,75,203,112,130,79,79,118,227,147,238,19,164,238,188,157,172,39,14,
-9,141,126,42,79,139,136,69,37,101,66,177,192,243,60,233,11,62,102,74,62,76,82,
-162,50,9,38,76,152,96,149,148,67,46,188,112,12,171,90,6,29,29,93,193,231,159,23,
-158,20,223,107,126,28,70,37,155,214,242,189,252,22,20,4,101,73,83,249,93,118,
-129,197,223,22,159,116,166,164,45,127,197,255,217,108,214,30,24,4,17,118,239,
-126,61,137,194,4,35,207,29,133,65,3,79,39,180,202,90,87,83,93,135,97,67,207,101,
-63,224,153,3,111,28,202,184,174,239,136,229,41,145,41,203,41,34,75,179,204,139,
-65,50,108,191,192,227,221,83,197,226,212,72,35,213,214,114,250,174,187,187,155,
-188,190,79,255,229,207,47,206,223,183,247,157,135,227,64,161,101,210,101,164,94,
-32,173,90,160,146,53,152,48,126,10,142,28,237,204,254,224,182,59,159,187,100,
-202,164,127,206,155,63,235,195,150,150,139,158,173,170,170,122,217,36,113,94,24,
-95,14,15,67,246,29,236,92,114,185,156,85,66,181,119,118,88,6,252,127,69,82,37,
-94,106,221,56,106,245,234,71,175,232,62,209,51,203,113,170,91,76,224,231,38,76,
-184,20,75,190,119,23,206,58,123,56,203,116,10,181,75,234,62,246,81,39,158,88,
-187,10,239,180,239,71,18,247,218,56,169,98,149,252,241,79,238,196,220,185,179,
-47,247,60,231,21,81,34,117,133,177,127,5,25,213,222,222,14,169,136,142,231,218,
-128,50,73,32,10,12,88,187,246,233,59,215,173,251,245,45,42,169,61,99,120,227,88,
-76,155,190,0,83,155,175,68,255,65,131,105,56,59,7,82,95,28,146,176,24,55,137,
-229,112,33,167,8,255,254,248,24,118,182,109,196,43,109,47,163,189,243,32,15,138,
-177,232,214,155,112,251,29,183,77,85,137,121,53,45,72,58,45,76,68,80,189,253,
-214,33,194,209,207,194,33,41,215,211,243,233,232,229,203,151,255,126,203,150,29,
-231,185,172,120,75,22,255,20,211,167,221,72,70,172,163,94,14,164,159,8,36,152,0,
-219,204,74,200,136,44,9,48,41,227,174,71,106,87,228,6,213,139,23,95,124,14,79,
-174,125,136,27,3,92,50,181,217,172,121,124,245,24,173,205,33,203,158,182,81,165,
-225,75,126,184,132,86,211,227,180,202,209,222,153,119,223,125,207,235,219,183,
-239,110,168,171,61,3,43,239,123,156,254,190,10,85,85,167,161,80,136,88,130,93,
-27,88,68,144,169,71,146,226,193,177,73,27,78,66,12,135,235,113,28,165,5,149,
-194,217,39,226,155,163,70,99,207,174,93,248,224,112,151,58,124,164,107,241,244,
-171,166,29,103,237,56,40,116,45,25,161,125,95,160,15,108,239,199,96,187,97,103,
-219,158,129,190,219,31,171,87,173,195,216,11,46,99,233,29,192,146,27,157,138,
-222,82,41,141,232,56,182,201,99,93,32,214,136,95,77,148,240,119,134,41,153,35,
-186,213,136,131,12,198,140,190,24,143,174,94,135,154,220,215,176,99,251,107,120,
-125,239,254,7,136,182,170,196,154,14,216,239,101,115,210,5,71,151,175,88,249,
-179,165,33,133,44,188,97,49,154,190,62,142,66,171,73,48,20,200,86,91,14,9,73,54,
-174,207,190,136,133,73,44,141,227,52,88,45,205,10,141,11,125,115,198,180,44,138,
-121,71,64,127,148,242,62,70,142,156,136,57,115,174,167,66,46,86,63,242,196,32,
-130,214,84,9,119,45,36,81,40,244,158,182,97,195,134,223,124,208,245,193,192,179,
-207,26,134,111,93,187,144,13,8,157,29,123,105,59,109,42,221,140,177,129,26,210,
-223,18,197,158,167,109,129,137,152,86,202,94,92,202,118,73,185,230,118,135,37,
-211,247,170,17,20,20,22,222,120,11,59,231,6,116,117,29,118,159,127,190,117,69,
-84,142,35,29,209,145,142,155,61,255,15,235,255,116,70,93,221,233,184,249,59,
-139,104,5,153,138,157,175,133,88,167,80,11,2,162,172,237,106,89,5,227,40,96,239,
-79,74,54,129,205,0,197,12,136,19,42,39,237,16,247,243,106,192,192,78,121,223,
-146,26,207,91,116,235,98,42,31,99,195,31,215,79,114,41,75,134,155,48,178,185,
-195,59,114,248,56,130,162,143,230,139,166,216,194,164,43,209,29,167,85,76,243,
-191,48,76,155,28,199,241,108,76,164,205,108,74,90,70,114,154,123,36,150,4,21,
-113,179,40,171,29,9,204,34,41,187,26,227,199,93,100,255,190,223,113,204,72,44,
-249,76,101,22,35,15,135,187,62,26,98,34,31,67,234,207,177,27,148,244,134,210,
-116,136,134,101,4,36,215,229,224,180,175,55,246,112,197,158,80,131,190,86,25,72,
-95,85,25,210,97,185,90,89,235,131,82,104,175,114,48,164,97,93,139,51,235,155,
-104,168,151,251,232,248,103,20,202,119,212,86,31,61,122,108,149,4,80,67,67,131,
-189,136,228,195,30,114,127,129,26,74,235,205,128,67,234,83,200,83,249,222,152,
-118,58,94,249,89,242,46,172,108,42,95,195,180,101,87,47,35,233,202,106,232,196,
-168,98,176,15,30,124,26,254,254,161,170,233,234,234,194,208,198,122,81,52,202,
-53,156,51,196,44,186,245,230,127,13,169,111,200,38,186,23,253,6,120,82,231,221,
-176,196,226,159,208,145,112,107,172,97,9,97,81,9,159,217,14,33,166,242,18,73,
-230,4,103,29,223,243,217,94,114,184,238,68,118,63,97,36,82,174,152,47,212,204,
-238,14,243,174,189,2,19,155,135,117,203,225,246,210,218,222,241,22,3,134,23,84,
-238,147,74,103,27,19,11,113,26,120,114,249,176,150,90,139,203,237,112,5,133,83,
-163,124,159,80,105,166,84,154,25,123,221,51,105,57,150,247,65,216,203,236,81,
-116,89,108,93,41,107,255,5,119,155,194,247,64,241,254,70,0,0,0,0,73,69,78,68,
-174,66,96,130};
-static Fl_Image *image_fd_user() {
-  static Fl_Image *image = NULL;
-  if (!image)
-    image = new Fl_PNG_Image("fd_user.png", idata_fd_user, 8612);
-  return image;
-}
-
-Fl_Group *w_settings_i18n_tab=(Fl_Group *)0;
-
-static void cb_w_settings_i18n_tab(Fl_Group* o, void* v) {
-  propagate_load(o, v);
-}
-
-static const unsigned char idata_language_64[] =
-{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,96,0,0,0,64,8,4,0,0,0,
-79,61,186,133,0,0,5,113,73,68,65,84,104,222,237,154,107,76,28,85,20,199,127,
-188,10,44,182,184,116,75,75,65,1,129,146,20,140,15,106,91,170,166,129,182,40,98,
-53,104,98,66,240,145,26,67,140,38,245,21,245,139,177,54,126,48,126,48,209,38,
-162,198,132,24,141,181,173,209,86,98,130,129,32,98,1,91,196,214,90,181,136,20,
-90,160,32,10,8,88,96,11,44,227,7,102,239,206,46,236,206,238,236,206,204,154,
-120,246,195,158,123,103,231,222,243,223,123,207,255,156,251,0,117,89,193,43,140,
-226,64,210,244,89,96,154,47,72,197,52,137,230,144,102,227,93,159,78,178,204,2,
-176,63,4,230,75,72,52,154,5,96,52,36,230,75,204,82,164,207,4,81,147,171,157,74,
-28,177,26,58,152,112,42,49,220,74,147,25,0,34,157,230,239,39,131,133,128,26,
-143,96,154,26,90,156,197,181,230,140,128,44,177,92,171,193,15,167,72,116,21,162,
-244,0,16,25,124,19,14,102,152,51,145,36,131,148,113,154,57,199,90,138,200,88,
-182,249,213,174,194,80,24,2,88,160,153,87,1,24,96,175,114,186,136,137,183,133,
-134,69,203,71,248,52,140,0,56,24,225,31,192,206,247,114,77,43,219,73,101,129,56,
-214,16,167,248,229,205,188,193,69,86,83,85,78,167,30,0,34,84,127,33,45,126,37,
-242,46,57,194,252,54,62,164,199,157,38,101,154,181,114,15,229,172,92,210,204,
-166,136,48,242,129,17,14,114,122,73,173,29,59,48,193,1,242,40,48,204,137,53,177,
-208,140,138,63,254,105,32,11,105,2,96,101,147,74,204,8,115,26,77,228,65,210,232,
-195,225,230,42,221,116,201,250,42,225,43,179,174,216,189,53,160,46,254,162,159,
-89,29,89,40,131,74,143,246,175,80,35,0,196,3,115,116,241,19,3,92,118,254,224,
-120,64,29,204,49,204,219,188,201,188,110,113,32,134,24,15,0,3,178,102,195,194,
-28,245,188,47,106,52,244,20,77,6,175,147,207,99,106,16,52,166,18,14,134,185,
-160,160,80,152,18,230,166,96,225,20,175,185,155,175,205,63,31,226,57,93,156,216,
-65,27,47,241,56,111,113,65,212,13,10,61,23,7,141,216,67,67,49,207,232,26,7,106,
-73,39,149,24,64,226,146,120,154,206,44,103,68,41,73,67,251,118,166,157,234,26,
-93,0,184,226,192,143,236,38,9,152,22,14,12,89,56,24,145,245,93,236,37,193,25,
-204,253,254,219,187,121,202,9,33,82,23,0,241,88,229,25,126,142,113,146,128,63,
-104,149,159,165,145,162,224,39,43,185,92,165,33,69,140,115,141,129,30,62,144,
-200,13,98,50,245,2,18,231,196,152,220,66,82,128,255,184,9,145,56,86,177,54,107,
-101,146,9,78,186,146,182,128,167,140,9,0,34,200,37,69,214,107,233,228,23,234,68,
-128,203,53,120,69,166,49,14,92,195,46,161,31,84,172,84,118,178,238,191,1,32,158,
-109,66,111,17,251,14,113,108,115,91,204,132,49,0,216,200,158,37,117,21,100,27,
-190,168,215,12,192,66,9,121,30,9,222,78,44,126,190,61,65,19,71,57,19,130,221,
-140,32,182,85,50,20,126,0,144,185,204,66,210,91,32,252,152,74,158,164,74,193,94,
-134,3,152,166,221,163,251,38,222,161,141,73,63,222,237,162,26,128,126,142,50,
-110,206,174,68,47,95,114,204,45,27,5,168,163,137,18,74,177,120,164,218,158,169,
-254,9,198,100,253,19,42,84,86,119,186,0,24,231,35,106,189,164,97,181,116,113,
-151,79,46,186,36,162,6,64,51,121,196,27,61,133,198,57,165,40,149,242,60,215,43,
-202,157,124,231,35,153,150,232,160,93,81,254,156,126,227,71,32,158,20,57,153,
-139,99,15,101,216,40,160,142,195,178,217,54,114,124,24,53,202,215,30,147,177,
-157,172,32,246,125,53,1,176,81,201,60,253,108,225,110,242,137,7,178,121,148,219,
-105,230,56,243,84,144,69,131,215,119,207,114,108,137,231,20,179,222,88,0,81,20,
-146,195,12,86,86,137,173,189,4,110,100,3,247,1,201,244,123,77,134,167,150,89,
-219,55,113,214,104,0,16,181,236,105,133,69,14,100,222,179,209,223,57,34,107,235,
-72,17,187,123,245,108,198,106,124,32,11,92,230,56,41,8,244,14,158,37,83,144,
-233,121,51,34,113,224,162,36,208,29,108,165,76,65,166,51,225,15,64,73,160,59,
-200,35,129,219,66,64,166,126,251,192,21,250,136,244,114,200,23,193,74,108,170,
-84,168,36,208,116,70,152,4,242,249,57,72,50,85,7,176,176,56,74,118,246,249,216,
-180,189,142,71,40,84,49,64,73,160,135,100,221,30,52,153,170,3,24,195,230,76,19,
-188,199,215,211,68,147,227,243,28,213,157,64,167,151,16,173,86,50,85,247,129,
-106,255,14,135,135,84,220,176,91,16,168,55,169,15,58,51,245,54,70,31,248,117,91,
-98,150,59,21,160,229,218,7,164,46,105,80,26,148,46,74,251,252,184,142,80,43,13,
-74,131,210,160,212,40,37,185,106,131,158,66,243,84,209,206,211,164,249,204,145,
-47,115,128,175,252,35,208,18,172,110,118,245,208,17,68,102,234,15,11,205,82,77,
-13,169,62,246,41,37,250,124,157,58,41,9,180,136,151,73,118,123,122,130,135,5,
-153,238,102,131,78,52,106,231,188,246,112,57,198,55,66,47,35,221,131,173,110,
-226,126,62,147,201,180,131,236,0,67,147,33,129,108,92,100,61,57,108,94,66,182,
-73,138,123,56,191,6,188,45,111,8,0,11,105,178,86,46,52,101,24,44,160,80,214,
-215,251,116,180,16,102,163,129,73,50,85,204,211,75,49,247,46,187,216,76,227,9,
-160,151,98,74,195,19,64,20,219,217,200,20,54,215,237,169,128,158,155,14,0,162,
-197,102,176,182,231,97,146,78,235,33,255,3,48,91,244,241,1,113,7,225,111,126,
-211,112,200,215,19,64,52,208,7,128,72,43,26,248,65,195,235,138,99,214,5,115,0,
-180,48,231,36,244,177,224,90,26,54,107,106,126,27,146,219,190,14,94,52,11,64,38,
-157,33,48,255,61,163,226,212,114,146,206,17,166,130,48,126,136,23,88,161,222,
-205,191,56,75,123,84,202,251,159,166,0,0,0,0,73,69,78,68,174,66,96,130};
-static Fl_Image *image_language_64() {
-  static Fl_Image *image = NULL;
-  if (!image)
-    image = new Fl_PNG_Image("language_64.png", idata_language_64, 1450);
-  return image;
-}
-
-Fl_Choice *i18n_type_chooser=(Fl_Choice *)0;
-
-Fl_Menu_Item menu_i18n_type_chooser[] = {
- {"None", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"GNU gettext", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"POSIX catgets", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {0,0,0,0,0,0,0,0,0}
-};
-
-Fl_Group *i18n_gnu_group=(Fl_Group *)0;
-
-static void cb_i18n_gnu_group(Fl_Group* o, void* v) {
-  propagate_load(o, v);
-}
-
-Fl_Input *i18n_gnu_include_input=(Fl_Input *)0;
-
-static void cb_i18n_gnu_include_input(Fl_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.i18n_gnu_include.c_str());
-  } else {
-    undo_checkpoint();
-    g_project.i18n_gnu_include = o->value();
-    set_modflag(1);
-  }
-}
-
-Fl_Input *i18n_gnu_conditional_input=(Fl_Input *)0;
-
-static void cb_i18n_gnu_conditional_input(Fl_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.i18n_gnu_conditional.c_str());
-  } else {
-    undo_checkpoint();
-    g_project.i18n_gnu_conditional = o->value();
-    set_modflag(1);
-  }
-}
-
-Fl_Input *i18n_gnu_function_input=(Fl_Input *)0;
-
-static void cb_i18n_gnu_function_input(Fl_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.i18n_gnu_function.c_str());
-  } else {
-    undo_checkpoint();
-    g_project.i18n_gnu_function = o->value();
-    set_modflag(1);
-  }
-}
-
-Fl_Input *i18n_gnu_static_function_input=(Fl_Input *)0;
-
-static void cb_i18n_gnu_static_function_input(Fl_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.i18n_gnu_static_function.c_str());
-  } else {
-    undo_checkpoint();
-    g_project.i18n_gnu_static_function = o->value();
-    set_modflag(1);
-  }
-}
-
-Fl_Group *i18n_posix_group=(Fl_Group *)0;
-
-static void cb_i18n_posix_group(Fl_Group* o, void* v) {
-  propagate_load(o, v);
-}
-
-Fl_Input *i18n_pos_include_input=(Fl_Input *)0;
-
-static void cb_i18n_pos_include_input(Fl_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.i18n_pos_include.c_str());
-  } else {
-    undo_checkpoint();
-    g_project.i18n_pos_include = o->value();
-    set_modflag(1);
-  }
-}
-
-Fl_Input *i18n_pos_conditional_input=(Fl_Input *)0;
-
-static void cb_i18n_pos_conditional_input(Fl_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.i18n_pos_conditional.c_str());
-  } else {
-    undo_checkpoint();
-    g_project.i18n_pos_conditional = o->value();
-    set_modflag(1);
-  }
-}
-
-Fl_Input *i18n_pos_file_input=(Fl_Input *)0;
-
-static void cb_i18n_pos_file_input(Fl_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.i18n_pos_file.c_str());
-  } else {
-    undo_checkpoint();
-    g_project.i18n_pos_file = o->value();
-    set_modflag(1);
-  }
-}
-
-static void cb_c(Fl_Group* o, void* v) {
-  propagate_load(o, v);
-}
-
-Fl_Int_Input *i18n_pos_set_input=(Fl_Int_Input *)0;
-
-static void cb_i18n_pos_set_input(Fl_Int_Input* o, void* v) {
-  if (v == LOAD) {
-    o->value(g_project.i18n_pos_set.c_str());
-  } else {
-    undo_checkpoint();
-    g_project.i18n_pos_set = o->value();
-    set_modflag(1);
-  }
-}
-
-Fl_Group *w_settings_user_tab=(Fl_Group *)0;
-
-static void cb_w_settings_user_tab(Fl_Group* o, void* v) {
-  propagate_load(o, v);
-}
-
-static const unsigned char idata_user_circle_64[] =
-{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,96,0,0,0,64,8,6,0,0,0,
-229,52,114,14,0,0,1,110,105,67,67,80,105,99,99,0,0,40,145,117,145,187,75,195,80,
-20,198,127,182,74,69,171,14,138,136,56,68,80,113,168,32,10,226,168,117,232,82,
-164,212,10,190,150,38,77,91,161,143,144,180,72,113,21,92,28,10,14,162,139,175,
-193,255,64,87,193,85,65,16,20,65,196,205,221,215,34,18,207,53,66,69,244,134,155,
-243,227,187,247,59,156,124,1,95,52,103,228,157,250,9,200,23,74,118,60,18,214,
-230,230,23,180,192,35,65,90,233,100,132,222,164,225,88,147,177,88,148,127,215,
-219,53,117,170,94,13,169,94,255,223,251,115,53,167,76,199,128,186,70,225,49,195,
-178,75,194,50,13,209,149,146,165,120,67,184,195,200,38,83,194,123,194,33,91,6,
-20,62,87,186,238,241,131,226,140,199,47,138,237,68,124,10,124,170,167,150,249,
-193,250,15,54,178,118,94,120,80,184,47,159,43,27,223,243,168,47,9,154,133,217,
-25,169,221,178,123,112,136,19,33,140,134,78,153,101,114,148,24,146,90,144,204,
-254,246,13,127,249,166,41,138,199,144,183,69,5,91,28,25,178,226,13,137,90,150,
-174,166,212,180,232,166,60,57,42,42,247,223,121,58,233,209,17,175,123,48,12,13,
-247,174,251,220,15,129,77,248,168,186,238,251,190,235,126,28,128,255,14,78,11,
-53,127,81,114,26,127,21,189,90,211,250,118,161,109,13,142,207,106,154,190,5,39,
-235,208,117,107,37,237,228,151,228,151,237,75,167,225,233,8,90,230,161,253,18,
-154,22,189,172,190,207,57,188,129,196,170,252,162,11,216,222,129,1,185,223,182,
-244,9,79,172,104,46,25,119,193,26,0,0,0,9,112,72,89,115,0,0,59,14,0,0,59,14,1,
-204,182,161,131,0,0,13,125,73,68,65,84,120,94,213,156,9,236,86,197,17,192,7,4,
-20,177,10,8,2,162,96,16,209,130,40,136,82,4,27,174,214,139,195,8,8,166,73,1,5,
-194,77,75,64,1,141,28,81,74,72,56,203,101,61,138,130,137,82,3,104,64,52,16,16,
-218,130,28,22,149,163,9,1,4,148,163,30,92,162,92,94,157,223,203,247,253,243,142,
-125,223,187,246,195,63,147,108,248,243,190,221,217,153,157,221,217,217,217,153,
-45,35,25,225,231,159,127,206,136,193,220,188,76,153,50,21,244,151,22,90,218,
-106,249,173,150,134,90,106,197,236,236,136,214,251,175,150,127,105,89,163,101,
-147,210,121,62,102,219,68,213,148,206,68,245,173,87,70,0,182,138,18,87,86,203,
-239,181,44,208,114,74,11,210,181,81,192,5,206,223,209,135,45,122,139,53,249,18,
-9,201,6,51,218,225,229,90,254,164,229,128,165,1,47,36,52,250,24,166,165,162,
-37,218,19,141,151,245,202,89,152,80,98,202,107,25,169,229,139,11,48,240,126,
-161,252,79,251,28,14,13,25,121,200,52,166,153,21,88,218,101,168,186,179,141,82,
-62,71,11,186,61,18,174,184,226,10,169,87,175,158,220,120,227,141,114,237,181,
-215,202,149,87,94,41,149,42,85,114,218,125,247,221,119,242,205,55,223,200,161,
-67,135,228,211,79,63,117,202,183,223,126,27,137,51,87,97,167,254,59,72,249,248,
-103,220,6,238,122,89,247,128,11,46,0,37,248,50,101,96,154,150,1,90,66,251,47,91,
-182,172,180,108,217,82,218,181,107,39,119,223,125,183,52,108,216,80,248,22,7,
-126,250,233,39,217,185,115,167,108,216,176,65,214,172,89,35,27,55,110,20,190,21,
-0,86,7,147,97,164,10,226,92,156,62,242,117,46,42,1,40,177,13,148,240,69,90,
-154,132,49,89,163,70,13,233,213,171,151,116,235,214,77,106,213,138,107,244,20,
-30,178,195,135,15,203,226,197,139,229,213,87,95,149,47,190,64,219,133,194,86,
-253,165,135,10,97,79,92,33,92,52,2,80,66,239,81,166,150,105,169,108,98,174,118,
-237,218,50,100,200,16,233,222,189,187,84,168,128,5,106,31,206,159,63,47,139,22,
-45,146,89,179,102,201,145,35,88,170,70,56,166,95,59,169,16,54,196,161,224,162,
-16,128,18,217,81,153,249,135,150,138,126,166,202,149,43,39,61,123,246,148,39,
-158,120,66,208,243,23,2,206,156,57,35,243,230,205,147,217,179,103,203,247,223,
-127,111,234,18,53,244,7,21,194,146,40,122,74,189,0,148,192,206,202,196,98,45,
-229,252,204,176,169,206,157,59,87,26,53,106,20,197,103,81,126,223,190,125,187,
-12,26,52,72,246,239,223,111,194,143,100,186,168,16,150,23,234,60,171,0,226,237,
-106,41,217,87,226,56,193,190,97,26,252,78,157,58,201,59,239,188,243,139,13,62,
-44,53,110,220,88,222,125,247,93,233,208,161,131,137,67,76,228,69,202,67,203,
-148,236,199,106,86,52,43,40,183,225,110,82,42,2,58,191,95,191,126,242,204,51,
-207,72,218,217,115,236,216,49,217,189,123,119,137,30,103,179,110,208,160,129,84,
-169,82,37,22,211,254,74,88,72,207,62,251,172,188,244,210,75,166,246,236,9,205,
-117,37,236,53,253,152,150,135,60,174,162,8,32,103,106,126,160,157,4,172,29,116,
-253,176,97,28,68,147,1,231,141,101,203,150,201,194,133,11,101,203,150,45,242,
-227,143,63,122,16,92,114,201,37,114,215,93,119,57,251,73,199,142,29,83,9,119,
-230,204,153,50,101,202,20,19,97,255,209,143,173,76,38,106,105,21,192,92,37,120,
-160,159,19,102,254,216,177,99,147,141,188,214,70,71,15,30,60,88,182,109,219,22,
-171,109,211,166,77,157,13,182,78,157,58,177,234,187,43,77,152,48,33,108,37,204,
-86,1,12,245,35,44,117,2,200,157,112,241,64,122,86,23,58,127,206,156,57,137,103,
-38,179,189,79,159,62,114,252,248,241,68,131,89,181,106,85,121,249,229,151,229,
-206,59,239,76,212,14,117,196,198,204,254,228,3,14,107,109,252,39,230,82,37,0,37,
-6,75,135,195,76,99,55,241,55,220,112,131,179,217,37,53,51,63,255,252,115,71,
-157,160,243,211,64,229,202,149,29,181,69,255,73,0,215,6,27,243,222,189,1,181,
-143,219,162,169,10,161,196,118,45,109,2,24,161,4,122,148,40,118,254,242,229,203,
-19,91,59,232,124,86,205,39,159,124,18,24,59,4,217,166,77,27,103,227,5,118,237,
-218,37,235,214,173,51,250,127,238,184,227,14,121,235,173,183,18,175,60,76,212,
-206,157,59,203,15,63,252,224,239,127,184,210,54,35,255,49,171,0,2,182,121,146,
-153,226,174,171,132,224,82,126,210,223,190,127,255,254,137,7,31,28,8,205,52,248,
-247,221,119,159,140,26,53,202,113,198,185,225,228,201,147,50,121,242,100,89,185,
-114,165,231,251,214,173,91,29,117,194,74,74,2,152,168,143,63,254,184,188,240,
-194,11,254,102,163,149,215,191,169,16,206,36,193,23,86,215,230,57,160,175,118,
-114,141,187,35,220,11,105,44,30,112,224,183,241,3,131,255,220,115,207,5,6,159,
-122,87,93,117,149,76,156,56,81,238,189,247,222,64,187,5,11,184,139,73,14,195,
-135,15,151,154,53,107,250,27,214,208,15,125,146,99,51,183,176,34,0,157,17,224,
-65,253,120,0,223,206,229,151,179,48,146,1,58,255,195,15,63,244,52,66,237,48,
-243,11,45,121,126,163,78,222,77,157,71,192,70,126,226,196,137,100,68,104,109,
-250,28,58,52,96,248,128,103,100,142,231,196,56,253,13,172,8,64,145,182,215,226,
-177,249,170,87,175,46,143,60,242,72,42,2,209,233,126,59,31,157,239,87,59,38,228,
-172,4,234,186,1,61,14,206,52,208,163,71,15,193,67,235,131,186,250,127,111,39,
-105,144,107,27,91,2,248,163,191,127,244,231,165,151,94,154,138,44,147,203,56,
-191,225,198,65,120,211,77,55,5,170,69,184,161,67,209,194,3,135,59,3,4,120,142,
-67,155,245,21,160,75,145,81,126,216,141,152,139,147,174,93,187,166,161,199,105,
-99,82,51,17,23,42,158,190,210,222,210,133,17,220,165,75,23,19,77,93,149,78,252,
-69,153,192,198,10,248,141,82,224,241,35,115,147,149,229,50,229,154,107,60,123,
-185,195,224,158,61,177,239,72,28,63,145,31,12,106,36,246,192,93,119,221,117,210,
-188,121,115,127,253,95,233,135,192,199,216,72,115,21,109,8,160,157,191,83,174,
-17,179,192,45,183,220,34,248,118,220,176,118,237,90,193,212,140,2,54,91,206,4,
-110,224,44,114,243,205,55,71,53,45,248,123,8,79,217,24,213,30,109,8,0,151,179,7,
-184,195,205,2,120,53,113,172,185,129,75,118,236,252,66,234,133,223,38,77,154,
-228,92,210,187,129,217,203,169,56,11,220,115,15,23,122,1,8,240,158,180,15,27,2,
-248,181,187,83,76,55,46,208,179,130,105,227,227,144,245,244,211,79,27,87,2,51,
-127,244,232,209,178,122,245,234,64,215,33,155,104,34,18,185,52,242,155,183,138,
-32,51,163,153,221,209,74,132,39,54,241,246,219,111,119,78,177,89,129,217,252,
-208,67,15,201,71,31,125,20,64,197,64,180,110,221,186,68,173,228,93,17,254,153,
-79,67,156,113,75,150,44,73,236,138,48,209,255,224,131,15,10,46,10,23,192,123,
-166,73,108,205,21,145,39,138,184,29,27,128,37,196,117,37,46,132,163,71,143,122,
-80,50,208,43,86,172,112,74,33,64,149,225,227,207,234,175,201,247,193,21,170,79,
-0,153,39,112,38,233,153,152,39,104,202,22,96,125,224,82,198,181,156,20,104,
-243,202,43,175,164,186,19,8,235,11,122,108,131,117,1,36,117,57,71,49,212,172,89,
-51,199,165,140,87,51,46,160,118,112,192,37,105,19,7,183,97,15,136,211,172,96,
-29,235,2,40,6,145,220,108,225,82,38,148,4,11,11,179,210,15,124,227,252,241,252,
-243,207,59,58,191,24,179,213,246,228,130,7,235,123,64,230,41,17,130,0,61,206,
-126,64,225,118,140,195,22,17,111,124,207,95,202,103,53,53,139,69,123,33,188,214,
-5,96,178,68,108,51,198,230,106,56,153,218,238,38,128,47,65,192,111,108,90,172,
-171,160,98,16,25,155,155,34,87,44,6,111,214,87,0,33,226,197,132,211,167,79,59,
-234,135,59,131,252,69,61,43,2,171,7,47,104,154,251,135,184,244,22,131,55,235,2,
-48,92,100,199,229,47,180,30,97,41,47,190,248,162,188,255,254,251,114,240,224,
-193,80,119,4,251,193,245,215,95,47,109,219,182,21,66,96,234,214,197,109,111,15,
-200,59,240,65,230,4,185,204,7,9,37,232,176,150,146,56,114,44,5,98,243,227,198,
-242,23,26,30,240,112,195,69,60,80,82,23,51,194,224,84,142,255,200,134,107,132,
-11,34,220,17,190,61,142,229,158,233,112,96,99,15,32,27,177,4,208,147,12,92,22,
-56,123,246,172,60,245,212,83,242,192,3,15,56,23,243,73,7,159,190,105,243,241,
-199,31,203,253,247,223,47,99,198,140,145,115,231,18,229,93,4,200,223,177,99,71,
-192,201,167,149,60,188,167,225,217,134,0,72,5,245,192,7,31,16,149,152,14,208,
-235,248,92,8,65,76,51,240,1,29,161,130,120,237,181,215,132,11,253,175,191,254,
-58,29,81,218,106,253,250,245,166,182,169,210,154,220,136,108,168,32,92,178,30,
-66,90,181,106,37,111,188,65,80,116,50,192,174,103,214,23,10,196,226,98,133,208,
-67,14,90,220,255,2,220,19,16,196,133,227,238,203,47,191,12,237,180,90,181,106,
-78,128,152,33,210,33,146,80,50,118,54,109,34,214,216,3,173,244,127,177,18,57,
-194,58,176,33,0,210,89,240,150,149,220,138,161,255,89,5,73,252,66,232,214,246,
-237,219,59,137,118,126,0,31,225,38,143,62,250,168,220,122,235,173,5,7,11,103,25,
-194,199,117,109,90,65,108,210,171,86,173,50,185,150,67,241,178,241,115,202,246,
-225,227,118,168,186,22,99,134,71,164,68,115,21,50,171,32,37,138,12,116,79,38,9,
-247,183,228,100,37,129,199,30,123,204,56,248,184,33,8,27,39,30,40,106,240,233,
-143,128,42,226,131,176,154,76,193,185,172,20,98,77,147,0,174,13,131,48,23,187,
-67,20,147,224,115,215,205,44,128,28,178,133,126,2,230,207,159,47,108,166,113,
-96,233,210,165,206,138,241,3,170,6,143,230,109,183,221,22,7,141,167,78,147,38,
-77,4,26,76,109,209,231,111,191,253,118,44,156,108,222,33,129,93,1,158,99,33,
-244,85,178,37,0,162,161,63,115,227,254,234,171,175,228,205,55,223,140,164,233,
-212,169,83,142,149,226,7,14,85,248,242,227,196,2,133,117,194,30,65,66,30,126,
-124,63,96,222,198,57,217,190,254,250,235,166,204,202,253,138,47,243,6,12,77,86,
-4,160,75,145,36,220,169,126,38,97,62,202,55,132,247,210,95,135,211,236,212,
-169,83,173,156,106,241,206,78,159,62,61,128,139,62,233,187,16,32,32,242,12,12,
-48,37,199,115,228,4,139,170,96,69,0,185,78,136,98,245,228,126,146,10,58,99,70,
-73,32,113,128,22,150,55,23,46,126,32,62,63,201,6,30,197,36,49,170,3,6,144,23,
-238,5,246,137,66,106,114,218,180,105,166,217,207,19,7,127,143,234,51,238,239,
-214,4,160,51,2,133,31,200,239,97,3,245,93,227,149,208,134,107,193,63,251,25,44,
-194,1,109,3,56,253,66,197,175,68,184,139,9,56,125,179,135,24,224,47,182,34,163,
-173,169,32,23,145,127,213,191,61,121,68,196,101,50,163,209,245,126,48,221,213,
-226,195,241,199,4,217,16,6,201,223,36,6,198,161,129,119,39,6,14,28,104,202,13,
-216,161,237,11,235,173,132,196,90,91,1,244,171,51,131,108,6,194,137,61,78,42,
-156,105,36,231,249,195,11,113,154,229,55,72,108,125,254,38,41,34,73,24,98,92,
-126,241,229,112,135,128,153,90,191,126,125,105,209,162,133,211,31,52,184,129,
-190,71,140,24,33,159,125,230,177,41,28,246,180,12,180,97,122,186,251,203,124,16,
-51,29,118,116,102,207,210,78,134,248,7,167,111,223,190,50,110,220,56,207,103,
-102,27,106,136,213,192,204,47,198,224,187,59,164,143,124,228,53,127,95,125,245,
-213,158,168,9,146,8,67,84,207,76,229,245,207,113,86,80,220,73,81,12,21,148,239,
-155,55,128,200,21,243,0,251,1,166,101,30,80,79,60,27,192,236,71,0,89,6,159,246,
-224,193,130,66,221,132,169,49,119,216,59,127,187,247,32,172,165,144,193,223,162,
-52,7,178,127,146,12,116,88,221,162,172,0,58,211,1,169,175,255,224,60,9,196,148,
-176,18,208,199,188,211,144,38,113,194,179,132,115,43,199,180,159,32,224,40,135,
-30,2,195,84,29,63,126,124,216,224,227,102,33,81,59,112,25,144,227,51,147,28,
-138,38,128,28,113,164,249,175,210,18,72,147,193,227,137,173,143,25,232,79,198,
-200,196,81,130,198,172,24,226,255,209,249,239,189,247,158,169,229,105,253,216,
-94,7,127,99,232,12,206,248,104,95,81,5,144,19,2,217,113,248,138,2,177,244,164,
-143,114,24,194,103,195,83,50,134,140,196,4,195,25,191,42,171,165,98,197,138,114,
-224,192,1,33,137,208,176,225,130,12,39,219,195,58,248,129,132,97,255,10,140,223,
-115,176,102,209,5,224,18,2,15,53,5,86,130,251,185,26,234,70,157,156,211,50,203,
-108,47,95,190,188,51,240,172,56,4,95,224,185,26,102,126,247,168,193,47,245,42,
-200,55,83,80,71,60,216,100,140,51,196,71,79,66,28,15,54,1,172,6,27,234,137,217,
-78,188,16,27,51,248,112,85,51,240,5,82,150,208,249,29,11,169,157,139,110,5,228,
-9,214,193,32,114,151,149,208,44,108,38,147,29,211,187,119,111,33,45,136,83,49,
-179,21,75,41,169,48,24,120,86,23,27,44,142,65,92,202,120,86,249,187,0,96,237,
-240,100,217,190,184,43,45,107,224,239,5,81,65,190,25,67,78,25,46,139,193,90,10,
-62,218,199,193,137,204,20,110,216,184,16,71,24,249,187,93,172,27,204,86,10,127,
-163,98,242,129,0,12,60,41,77,60,218,71,190,192,230,205,155,163,172,33,14,89,156,
-226,159,204,221,111,196,29,255,204,145,215,23,92,0,174,213,192,85,38,175,170,20,
-190,226,202,53,96,38,115,114,165,224,211,193,213,236,126,182,146,107,73,110,211,
-246,237,219,231,60,91,153,96,47,193,117,50,88,7,254,223,177,71,221,85,49,235,10,
-72,211,167,167,13,179,47,109,81,68,88,70,188,152,139,23,213,198,19,197,73,112,
-16,78,195,195,69,229,210,210,31,117,198,200,60,184,113,16,100,33,62,223,86,251,
-225,49,63,92,23,232,222,36,131,152,166,46,125,160,254,46,179,68,123,156,97,42,
-94,29,27,76,184,4,129,115,16,239,24,126,96,46,189,211,12,176,169,13,239,20,224,
-195,7,119,169,122,188,251,23,219,3,162,166,68,46,9,154,60,92,82,65,243,207,215,
-215,142,106,151,251,157,208,10,130,166,184,54,228,186,116,115,206,83,27,179,121,
-252,106,89,247,128,255,3,60,207,245,248,165,38,113,147,0,0,0,0,73,69,78,68,174,
-66,96,130};
-static Fl_Image *image_user_circle_64() {
-  static Fl_Image *image = NULL;
-  if (!image)
-    image = new Fl_PNG_Image("user_circle_64.png", idata_user_circle_64, 3909);
-  return image;
-}
-
-static void cb_Close(Fl_Button*, void*) {
-  if (g_shell_config)
-    g_shell_config->write(fluid_prefs, FD_STORE_USER);
-  g_layout_list.write(fluid_prefs, FD_STORE_USER);
-  settings_window->hide();
-}
-
-Fl_Double_Window* make_settings_window() {
-  { settings_window = new Fl_Double_Window(340, 580, "FLUID Settings");
-    settings_window->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));
-    { w_settings_tabs = new Fl_Tabs(10, 10, 320, 530);
-      w_settings_tabs->selection_color((Fl_Color)12);
-      w_settings_tabs->labelsize(11);
-      w_settings_tabs->labelcolor(FL_WHITE);
-      w_settings_tabs->callback((Fl_Callback*)cb_w_settings_tabs);
-      { Fl_Group* o = new Fl_Group(10, 60, 320, 480, "General");
-        o->image( image_general_64() );
-        o->image()->scale(36, 24, 0, 1);
-        o->labelsize(11);
-        { Fl_Group* o = new Fl_Group(120, 78, 130, 25);
-          o->callback((Fl_Callback*)cb_);
-          { scheme_choice = new Fl_Scheme_Choice(120, 78, 120, 25, "Scheme: ");
-            scheme_choice->box(FL_UP_BOX);
-            scheme_choice->down_box(FL_BORDER_BOX);
-            scheme_choice->color(FL_BACKGROUND_COLOR);
-            scheme_choice->selection_color(FL_SELECTION_COLOR);
-            scheme_choice->labeltype(FL_NORMAL_LABEL);
-            scheme_choice->labelfont(1);
-            scheme_choice->labelsize(11);
-            scheme_choice->labelcolor(FL_FOREGROUND_COLOR);
-            scheme_choice->callback((Fl_Callback*)scheme_cb);
-            scheme_choice->align(Fl_Align(FL_ALIGN_LEFT));
-            scheme_choice->when(FL_WHEN_RELEASE);
-            init_scheme();
-          } // Fl_Scheme_Choice* scheme_choice
-          { Fl_Box* o = new Fl_Box(240, 78, 10, 25);
-            o->hide();
-            Fl_Group::current()->resizable(o);
-          } // Fl_Box* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Box* o = new Fl_Box(120, 115, 0, 20, "Options: ");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
-        } // Fl_Box* o
-        { tooltips_button = new Fl_Check_Button(120, 115, 200, 20, "Show Tooltips");
-          tooltips_button->down_box(FL_DOWN_BOX);
-          tooltips_button->labelsize(11);
-          tooltips_button->callback((Fl_Callback*)cb_tooltips_button);
-          int b;
-          fluid_prefs.get("show_tooltips", b, 1);
-          tooltips_button->value(b);
-          Fl_Tooltip::enable(b);
-        } // Fl_Check_Button* tooltips_button
-        { completion_button = new Fl_Check_Button(120, 135, 200, 20, "Show Completion Dialogs");
-          completion_button->down_box(FL_DOWN_BOX);
-          completion_button->labelsize(11);
-          completion_button->callback((Fl_Callback*)cb_completion_button);
-          int b;
-          fluid_prefs.get("show_completion_dialogs", b, 1);
-          completion_button->value(b);
-        } // Fl_Check_Button* completion_button
-        { openlast_button = new Fl_Check_Button(120, 155, 200, 20, "Open Previous File on Startup");
-          openlast_button->down_box(FL_DOWN_BOX);
-          openlast_button->labelsize(11);
-          openlast_button->callback((Fl_Callback*)cb_openlast_button);
-          int b;
-          fluid_prefs.get("open_previous_file", b, 0);
-          openlast_button->value(b);
-        } // Fl_Check_Button* openlast_button
-        { prevpos_button = new Fl_Check_Button(120, 175, 200, 20, "Remember Window Positions");
-          prevpos_button->down_box(FL_DOWN_BOX);
-          prevpos_button->labelsize(11);
-          prevpos_button->callback((Fl_Callback*)cb_prevpos_button);
-          int b;
-          fluid_prefs.get("prev_window_pos", b, 1);
-          prevpos_button->value(b);
-        } // Fl_Check_Button* prevpos_button
-        { show_comments_button = new Fl_Check_Button(120, 195, 200, 20, "Show Comments in Browser");
-          show_comments_button->down_box(FL_DOWN_BOX);
-          show_comments_button->labelsize(11);
-          show_comments_button->callback((Fl_Callback*)cb_show_comments_button);
-          fluid_prefs.get("show_comments", show_comments, 1);
-          show_comments_button->value(show_comments);
-        } // Fl_Check_Button* show_comments_button
-        { Fl_Group* o = new Fl_Group(120, 225, 50, 20);
-          o->callback((Fl_Callback*)cb_1);
-          { recent_spinner = new Fl_Spinner(120, 225, 40, 20, "# Recent Files:");
-            recent_spinner->labelfont(1);
-            recent_spinner->labelsize(11);
-            recent_spinner->maximum(10);
-            recent_spinner->textsize(11);
-            recent_spinner->callback((Fl_Callback*)cb_recent_spinner);
-            recent_spinner->when(FL_WHEN_CHANGED);
-            int c;
-            fluid_prefs.get("recent_files", c, 5);
-            recent_spinner->maximum(10);
-            recent_spinner->value(c);
-          } // Fl_Spinner* recent_spinner
-          { Fl_Box* o = new Fl_Box(160, 225, 10, 20);
-            o->hide();
-            Fl_Group::current()->resizable(o);
-          } // Fl_Box* o
-          o->end();
-        } // Fl_Group* o
-        { use_external_editor_button = new Fl_Check_Button(120, 275, 200, 20, "Use for Code Nodes");
-          use_external_editor_button->down_box(FL_DOWN_BOX);
-          use_external_editor_button->labelsize(11);
-          use_external_editor_button->callback((Fl_Callback*)cb_use_external_editor_button);
-          fluid_prefs.get("use_external_editor", G_use_external_editor, 0);
-          use_external_editor_button->value(G_use_external_editor);
-        } // Fl_Check_Button* use_external_editor_button
-        { editor_command_input = new Fl_Input(120, 255, 200, 20, "External Editor:");
-          editor_command_input->tooltip("The editor command to open your external text editor.\nInclude any necessary \
-flags to ensure your editor does not background itself.\nExamples:\n    gvim -\
-f\n    gedit\n emacs");
-          editor_command_input->labelfont(1);
-          editor_command_input->labelsize(11);
-          editor_command_input->textfont(4);
-          editor_command_input->textsize(11);
-          editor_command_input->callback((Fl_Callback*)cb_editor_command_input);
-          editor_command_input->when(FL_WHEN_CHANGED);
-          fluid_prefs.get("external_editor_command", G_external_editor_command, "", sizeof(G_external_editor_command)-1);
-          editor_command_input->value(G_external_editor_command);
-        } // Fl_Input* editor_command_input
-        { Fl_Box* o = new Fl_Box(120, 300, 0, 20, "Overlays: ");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
-        } // Fl_Box* o
-        { Fl_Check_Button* o = guides_button = new Fl_Check_Button(120, 300, 200, 20, "Show Positioning Guides");
-          guides_button->tooltip("show guides that help to position and resize widgets and enable snapping");
-          guides_button->down_box(FL_DOWN_BOX);
-          guides_button->labelsize(11);
-          guides_button->callback((Fl_Callback*)toggle_guides_cb);
-          o->value(show_guides);
-        } // Fl_Check_Button* guides_button
-        { Fl_Check_Button* o = restricted_button = new Fl_Check_Button(120, 320, 200, 20, "Show Restricted Areas");
-          restricted_button->tooltip("show overlapping and out of bounds areas, show unfilled areas in Fl_Pack grou\
-ps");
-          restricted_button->down_box(FL_DOWN_BOX);
-          restricted_button->labelsize(11);
-          restricted_button->callback((Fl_Callback*)toggle_restricted_cb);
-          o->value(show_restricted);
-        } // Fl_Check_Button* restricted_button
-        { Fl_Check_Button* o = ghosted_outline_button = new Fl_Check_Button(120, 340, 200, 20, "Show Ghosted Group Outlines");
-          ghosted_outline_button->tooltip("groups with no box type or flat boxtypes without contrast will be rendered wi\
-th a dim outline in the editing window only");
-          ghosted_outline_button->down_box(FL_DOWN_BOX);
-          ghosted_outline_button->labelsize(11);
-          ghosted_outline_button->callback((Fl_Callback*)toggle_ghosted_outline_cb);
-          o->value(show_ghosted_outline);
-        } // Fl_Check_Button* ghosted_outline_button
-        { Fl_Box* o = new Fl_Box(120, 530, 200, 10);
-          o->hide();
-          Fl_Group::current()->resizable(o);
-        } // Fl_Box* o
-        o->end();
-        Fl_Group::current()->resizable(o);
-      } // Fl_Group* o
-      { w_settings_project_tab = new Fl_Group(10, 60, 320, 480, "Project");
-        w_settings_project_tab->image( image_document_64() );
-        w_settings_project_tab->image()->scale(36, 24, 0, 1);
-        w_settings_project_tab->labelsize(11);
-        w_settings_project_tab->callback((Fl_Callback*)cb_w_settings_project_tab);
-        w_settings_project_tab->hide();
-        { Fl_Group* o = new Fl_Group(100, 78, 220, 30);
-          { Fl_Box* o = new Fl_Box(100, 78, 210, 30, "Use \"name.ext\" to set a file name\nor just \".ext\" to set extension.");
-            o->labelsize(11);
-            o->align(Fl_Align(132|FL_ALIGN_INSIDE));
-          } // Fl_Box* o
-          { Fl_Box* o = new Fl_Box(310, 78, 10, 30);
-            o->hide();
-            Fl_Group::current()->resizable(o);
-          } // Fl_Box* o
-          o->end();
-        } // Fl_Group* o
-        { header_file_input = new Fl_Input(100, 112, 220, 20, "Header File:");
-          header_file_input->tooltip("The name of the generated header file.");
-          header_file_input->box(FL_THIN_DOWN_BOX);
-          header_file_input->labelfont(1);
-          header_file_input->labelsize(11);
-          header_file_input->textfont(4);
-          header_file_input->textsize(11);
-          header_file_input->callback((Fl_Callback*)cb_header_file_input, (void*)(1));
-          header_file_input->when(FL_WHEN_CHANGED);
-        } // Fl_Input* header_file_input
-        { code_file_input = new Fl_Input(100, 137, 220, 20, "Code File:");
-          code_file_input->tooltip("The name of the generated code file.");
-          code_file_input->box(FL_THIN_DOWN_BOX);
-          code_file_input->labelfont(1);
-          code_file_input->labelsize(11);
-          code_file_input->textfont(4);
-          code_file_input->textsize(11);
-          code_file_input->callback((Fl_Callback*)cb_code_file_input, (void*)(1));
-          code_file_input->when(FL_WHEN_CHANGED);
-        } // Fl_Input* code_file_input
-        { include_H_from_C_button = new Fl_Check_Button(100, 162, 220, 20, "Include Header from Code");
-          include_H_from_C_button->tooltip("Include the header file from the code file.");
-          include_H_from_C_button->down_box(FL_DOWN_BOX);
-          include_H_from_C_button->labelsize(11);
-          include_H_from_C_button->callback((Fl_Callback*)cb_include_H_from_C_button);
-        } // Fl_Check_Button* include_H_from_C_button
-        { Fl_Box* o = new Fl_Box(100, 205, 0, 20, "Options: ");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
-        } // Fl_Box* o
-        { use_FL_COMMAND_button = new Fl_Check_Button(100, 205, 220, 20, "Menu shortcuts use FL_COMMAND");
-          use_FL_COMMAND_button->tooltip("Replace FL_CTRL and FL_META with FL_COMMAND when generating menu shortcuts");
-          use_FL_COMMAND_button->down_box(FL_DOWN_BOX);
-          use_FL_COMMAND_button->labelsize(11);
-          use_FL_COMMAND_button->callback((Fl_Callback*)cb_use_FL_COMMAND_button);
-        } // Fl_Check_Button* use_FL_COMMAND_button
-        { utf8_in_src_button = new Fl_Check_Button(100, 230, 220, 20, "allow Unicode UTF-8 in source code");
-          utf8_in_src_button->tooltip("For older compilers, characters outside of the printable ASCII range are esca\
-ped using octal notation `\\0123`. If this option is checked, Fluid will write\
- UTF-8 characters unchanged.");
-          utf8_in_src_button->down_box(FL_DOWN_BOX);
-          utf8_in_src_button->labelsize(11);
-          utf8_in_src_button->callback((Fl_Callback*)cb_utf8_in_src_button);
-        } // Fl_Check_Button* utf8_in_src_button
-        { avoid_early_includes_button = new Fl_Check_Button(100, 255, 220, 20, "avoid early include of Fl.H");
-          avoid_early_includes_button->tooltip("Do not emit #include <FL//Fl.H> until it is needed by another include file.");
-          avoid_early_includes_button->down_box(FL_DOWN_BOX);
-          avoid_early_includes_button->labelsize(11);
-          avoid_early_includes_button->callback((Fl_Callback*)cb_avoid_early_includes_button);
-        } // Fl_Check_Button* avoid_early_includes_button
-        { Fl_Box* o = new Fl_Box(100, 283, 0, 20, "Experimental: ");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
-          o->hide();
-        } // Fl_Box* o
-        { // // Matt: disabled
-          w_proj_mergeback = new Fl_Check_Button(100, 283, 220, 20, "generate MergeBack data");
-          w_proj_mergeback->tooltip("MergeBack is a feature under construction that allows changes in code files t\
-o be merged back into the project file. Checking this option will generate add\
-itional data in code and project files.");
-          w_proj_mergeback->down_box(FL_DOWN_BOX);
-          w_proj_mergeback->labelsize(11);
-          w_proj_mergeback->callback((Fl_Callback*)cb_w_proj_mergeback);
-          w_proj_mergeback->hide();
-        } // Fl_Check_Button* w_proj_mergeback
-        { Fl_Box* o = new Fl_Box(100, 530, 220, 10);
-          o->hide();
-          Fl_Group::current()->resizable(o);
-        } // Fl_Box* o
-        w_settings_project_tab->end();
-      } // Fl_Group* w_settings_project_tab
-      { w_settings_layout_tab = new Fl_Group(10, 60, 320, 480, "Layout");
-        w_settings_layout_tab->image( image_layout_64() );
-        w_settings_layout_tab->image()->scale(36, 24, 0, 1);
-        w_settings_layout_tab->labelsize(11);
-        w_settings_layout_tab->callback((Fl_Callback*)cb_w_settings_layout_tab);
-        w_settings_layout_tab->hide();
-        { Fl_Box* o = new Fl_Box(25, 78, 60, 24, "Layout:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
-        } // Fl_Box* o
-        { layout_choice = new Fl_Choice(85, 78, 187, 24);
-          layout_choice->down_box(FL_BORDER_BOX);
-          layout_choice->callback((Fl_Callback*)cb_layout_choice);
-          layout_choice->menu(menu_layout_choice);
-        } // Fl_Choice* layout_choice
-        { Fl_Button* o = new Fl_Button(272, 78, 24, 24, "+");
-          o->callback((Fl_Callback*)cb_2);
-        } // Fl_Button* o
-        { w_layout_menu = new Fl_Menu_Button(296, 78, 24, 24);
-          w_layout_menu->callback((Fl_Callback*)cb_w_layout_menu);
-            w_layout_menu_storage[0] = &menu_w_layout_menu[1];
-            w_layout_menu_storage[1] = &menu_w_layout_menu[2];
-            w_layout_menu_storage[2] = &menu_w_layout_menu[3];
-            w_layout_menu_storage[3] = &menu_w_layout_menu[4];
-          w_layout_menu->menu(menu_w_layout_menu);
-        } // Fl_Menu_Button* w_layout_menu
-        { Fl_Box* o = new Fl_Box(25, 107, 60, 20, "Preset:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
-        } // Fl_Box* o
-        { Fl_Group* o = new Fl_Group(85, 107, 235, 20);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          { preset_choice[0] = new Fl_Button(85, 107, 78, 20, "Application");
-            preset_choice[0]->type(102);
-            preset_choice[0]->value(1);
-            preset_choice[0]->compact(1);
-            preset_choice[0]->selection_color(FL_DARK2);
-            preset_choice[0]->labelsize(11);
-            preset_choice[0]->callback((Fl_Callback*)edit_layout_preset_cb, (void*)(0));
-          } // Fl_Button* preset_choice[0]
-          { preset_choice[1] = new Fl_Button(163, 107, 79, 20, "Dialog");
-            preset_choice[1]->type(102);
-            preset_choice[1]->compact(1);
-            preset_choice[1]->selection_color(FL_DARK2);
-            preset_choice[1]->labelsize(11);
-            preset_choice[1]->callback((Fl_Callback*)edit_layout_preset_cb, (void*)(1));
-          } // Fl_Button* preset_choice[1]
-          { preset_choice[2] = new Fl_Button(242, 107, 78, 20, "Toolbox");
-            preset_choice[2]->type(102);
-            preset_choice[2]->compact(1);
-            preset_choice[2]->selection_color(FL_DARK2);
-            preset_choice[2]->labelsize(11);
-            preset_choice[2]->callback((Fl_Callback*)edit_layout_preset_cb, (void*)(2));
-          } // Fl_Button* preset_choice[2]
-          o->end();
-        } // Fl_Group* o
-        { Fl_Box* o = new Fl_Box(85, 132, 235, 20, "---- Window ----");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
-        } // Fl_Box* o
-        { Fl_Box* o = new Fl_Box(25, 167, 60, 20, "Margin:");
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
-        } // Fl_Box* o
-        { Fl_Value_Input* o = new Fl_Value_Input(85, 167, 55, 20, "Left:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Left);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Value_Input* o = new Fl_Value_Input(145, 167, 55, 20, "Top:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Top);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Value_Input* o = new Fl_Value_Input(205, 167, 55, 20, "Right:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Right);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Value_Input* o = new Fl_Value_Input(265, 167, 55, 20, "Bottom:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Bottom);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Box* o = new Fl_Box(32, 201, 53, 20, "Grid:");
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
-        } // Fl_Box* o
-        { Fl_Value_Input* o = new Fl_Value_Input(85, 201, 55, 20, "Horizontal:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Horizontal);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Value_Input* o = new Fl_Value_Input(145, 201, 55, 20, "Vertical:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Vertical);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Box* o = new Fl_Box(85, 226, 235, 20, "---- Group ----");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
-        } // Fl_Box* o
-        { Fl_Box* o = new Fl_Box(25, 261, 60, 20, "Margin:");
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
-        } // Fl_Box* o
-        { Fl_Value_Input* o = new Fl_Value_Input(85, 261, 55, 20, "Left:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Left1);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Value_Input* o = new Fl_Value_Input(145, 261, 55, 20, "Top:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Top1);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Value_Input* o = new Fl_Value_Input(205, 261, 55, 20, "Right:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Right1);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Value_Input* o = new Fl_Value_Input(265, 261, 55, 20, "Bottom:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Bottom1);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Box* o = new Fl_Box(32, 295, 53, 20, "Grid:");
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
-        } // Fl_Box* o
-        { Fl_Value_Input* o = new Fl_Value_Input(85, 295, 55, 20, "Horizontal:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Horizontal1);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Value_Input* o = new Fl_Value_Input(145, 295, 55, 20, "Vertical:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Vertical1);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Box* o = new Fl_Box(85, 320, 235, 20, "---- Tabs ----");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
-        } // Fl_Box* o
-        { Fl_Box* o = new Fl_Box(25, 355, 60, 20, "Margin:");
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
-        } // Fl_Box* o
-        { Fl_Value_Input* o = new Fl_Value_Input(85, 355, 55, 20, "Top:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Top2);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Value_Input* o = new Fl_Value_Input(145, 355, 55, 20, "Bottom:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Bottom2);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Box* o = new Fl_Box(85, 380, 235, 20, "---- Widget ----");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
-        } // Fl_Box* o
-        { Fl_Box* o = new Fl_Box(25, 415, 60, 20, "Horizontal:");
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
-        } // Fl_Box* o
-        { Fl_Value_Input* o = new Fl_Value_Input(85, 414, 55, 20, "Minimum:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Minimum);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Value_Input* o = new Fl_Value_Input(145, 414, 55, 20, "Increment:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Increment);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Value_Input* o = new Fl_Value_Input(205, 414, 55, 20, "Gap:");
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_Gap);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Box* o = new Fl_Box(32, 440, 53, 20, "Vertical:");
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
-        } // Fl_Box* o
-        { Fl_Value_Input* o = new Fl_Value_Input(85, 440, 55, 20);
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_3);
-        } // Fl_Value_Input* o
-        { Fl_Value_Input* o = new Fl_Value_Input(145, 440, 55, 20);
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_4);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Value_Input* o = new Fl_Value_Input(205, 440, 55, 20);
-          o->labelsize(11);
-          o->maximum(32767);
-          o->step(1);
-          o->textsize(11);
-          o->callback((Fl_Callback*)cb_5);
-          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-        } // Fl_Value_Input* o
-        { Fl_Group* o = new Fl_Group(85, 465, 201, 20, "Label Font:");
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
-          { Fl_Choice* o = new Fl_Choice(85, 465, 150, 20);
-            o->tooltip("The style of the label text.");
-            o->box(FL_THIN_UP_BOX);
-            o->down_box(FL_BORDER_BOX);
-            o->labelfont(1);
-            o->labelsize(11);
-            o->textsize(11);
-            o->callback((Fl_Callback*)cb_6);
-            Fl_Group::current()->resizable(o);
-            o->menu(fontmenu_w_default);
-          } // Fl_Choice* o
-          { Fl_Value_Input* o = new Fl_Value_Input(235, 465, 50, 20);
-            o->tooltip("The size of the label text.");
-            o->labelsize(11);
-            o->minimum(1);
-            o->maximum(1000);
-            o->step(1);
-            o->value(14);
-            o->textsize(11);
-            o->callback((Fl_Callback*)cb_7);
-          } // Fl_Value_Input* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(85, 490, 200, 20, "Text Font:");
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
-          { Fl_Choice* o = new Fl_Choice(85, 490, 150, 20);
-            o->tooltip("The value text style.");
-            o->box(FL_DOWN_BOX);
-            o->down_box(FL_BORDER_BOX);
-            o->labelfont(1);
-            o->labelsize(11);
-            o->textsize(11);
-            o->callback((Fl_Callback*)cb_8);
-            o->menu(fontmenu_w_default);
-          } // Fl_Choice* o
-          { Fl_Value_Input* o = new Fl_Value_Input(235, 490, 50, 20);
-            o->tooltip("The value text size.");
-            o->labelsize(11);
-            o->maximum(1000);
-            o->step(1);
-            o->value(14);
-            o->textsize(11);
-            o->callback((Fl_Callback*)cb_9);
-          } // Fl_Value_Input* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Box* o = new Fl_Box(325, 535, 5, 5);
-          o->hide();
-          Fl_Group::current()->resizable(o);
-        } // Fl_Box* o
-        w_settings_layout_tab->end();
-      } // Fl_Group* w_settings_layout_tab
-      { w_settings_shell_tab = new Fl_Group(10, 60, 320, 480, "Shell");
-        w_settings_shell_tab->image( image_shell_64() );
-        w_settings_shell_tab->image()->scale(36, 24, 0, 1);
-        w_settings_shell_tab->labelsize(11);
-        w_settings_shell_tab->callback((Fl_Callback*)propagate_load);
-        w_settings_shell_tab->hide();
-        { Fl_Group* o = new Fl_Group(10, 90, 320, 132);
-          o->callback((Fl_Callback*)propagate_load);
-          { w_settings_shell_list = new Fl_Browser(100, 90, 220, 110, "Shell\ncommand\nlist:");
-            w_settings_shell_list->type(3);
-            w_settings_shell_list->labelfont(1);
-            w_settings_shell_list->labelsize(11);
-            w_settings_shell_list->textsize(13);
-            w_settings_shell_list->callback((Fl_Callback*)cb_w_settings_shell_list);
-            w_settings_shell_list->align(Fl_Align(FL_ALIGN_LEFT));
-            Fl_Group::current()->resizable(w_settings_shell_list);
-          } // Fl_Browser* w_settings_shell_list
-          { w_settings_shell_toolbox = new Fl_Group(100, 200, 220, 22);
-            w_settings_shell_toolbox->callback((Fl_Callback*)cb_w_settings_shell_toolbox);
-            { Fl_Button* o = new Fl_Button(100, 200, 24, 22, "+");
-              o->tooltip("insert a new shell command into the list after the selected command");
-              o->labelfont(1);
-              o->labelsize(11);
-              o->callback((Fl_Callback*)cb_a);
-            } // Fl_Button* o
-            { w_settings_shell_dup = new Fl_Button(124, 200, 24, 22, "++");
-              w_settings_shell_dup->tooltip("duplicate the selected shell command and insert it into the list");
-              w_settings_shell_dup->labelfont(1);
-              w_settings_shell_dup->labelsize(11);
-              w_settings_shell_dup->callback((Fl_Callback*)cb_w_settings_shell_dup);
-              w_settings_shell_dup->deactivate();
-            } // Fl_Button* w_settings_shell_dup
-            { w_settings_shell_remove = new Fl_Button(148, 200, 24, 22, "DEL");
-              w_settings_shell_remove->tooltip("remove the selected shell command - this can not be undone");
-              w_settings_shell_remove->labelsize(10);
-              w_settings_shell_remove->callback((Fl_Callback*)cb_w_settings_shell_remove);
-              w_settings_shell_remove->deactivate();
-            } // Fl_Button* w_settings_shell_remove
-            { w_settings_shell_menu = new Fl_Menu_Button(172, 200, 24, 22);
-              w_settings_shell_menu->labelsize(11);
-              w_settings_shell_menu->textsize(11);
-              w_settings_shell_menu->menu(menu_w_settings_shell_menu);
-            } // Fl_Menu_Button* w_settings_shell_menu
-            { Fl_Box* o = new Fl_Box(253, 200, 13, 22);
-              o->hide();
-              Fl_Group::current()->resizable(o);
-            } // Fl_Box* o
-            { Fl_Button* o = new Fl_Button(246, 200, 24, 22, "T");
-              o->tooltip("show terminal window");
-              o->labelfont(5);
-              o->labelsize(11);
-              o->callback((Fl_Callback*)cb_T);
-            } // Fl_Button* o
-            { w_settings_shell_play = new Fl_Button(270, 200, 50, 22, "Run");
-              w_settings_shell_play->tooltip("run the selected shell command");
-              w_settings_shell_play->labelsize(11);
-              w_settings_shell_play->callback((Fl_Callback*)cb_w_settings_shell_play);
-              w_settings_shell_play->deactivate();
-            } // Fl_Button* w_settings_shell_play
-            w_settings_shell_toolbox->end();
-          } // Fl_Group* w_settings_shell_toolbox
-          o->end();
-        } // Fl_Group* o
-        { w_settings_shell_cmd = new Fl_Group(10, 235, 320, 291);
-          w_settings_shell_cmd->callback((Fl_Callback*)cb_w_settings_shell_cmd);
-          { Fl_Input* o = new Fl_Input(100, 246, 220, 20, "Name:");
-            o->tooltip("file the shell command under this name in the shell command list");
-            o->labelfont(1);
-            o->labelsize(11);
-            o->textfont(4);
-            o->textsize(11);
-            o->callback((Fl_Callback*)cb_Name);
-            o->when(FL_WHEN_RELEASE | FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY);
-          } // Fl_Input* o
-          { Fl_Input* o = new Fl_Input(100, 272, 220, 20, "Menu Label:");
-            o->tooltip("label text for the Shell menu in the main menu bar");
-            o->labelfont(1);
-            o->labelsize(11);
-            o->textfont(4);
-            o->textsize(11);
-            o->callback((Fl_Callback*)cb_Menu);
-          } // Fl_Input* o
-          { Fl_Group* o = new Fl_Group(100, 297, 140, 71);
-            o->callback((Fl_Callback*)cb_b);
-            { Fl_Shortcut_Button* o = new Fl_Shortcut_Button(100, 297, 130, 20, "Shortcut");
-              o->tooltip("an optional keyboard shortcut to run this shell command");
-              o->box(FL_UP_BOX);
-              o->color(FL_BACKGROUND_COLOR);
-              o->selection_color(FL_BACKGROUND_COLOR);
-              o->labeltype(FL_NORMAL_LABEL);
-              o->labelfont(0);
-              o->labelsize(11);
-              o->labelcolor(FL_FOREGROUND_COLOR);
-              o->callback((Fl_Callback*)cb_Shortcut);
-              o->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE));
-              o->when(FL_WHEN_RELEASE);
-            } // Fl_Shortcut_Button* o
-            { Fl_Choice* o = new Fl_Choice(100, 322, 130, 20, "Store:");
-              o->tooltip("store this shell command as a user setting or save it with the .fl project fi\
-le");
-              o->down_box(FL_BORDER_BOX);
-              o->labelfont(1);
-              o->labelsize(11);
-              o->textsize(11);
-              o->callback((Fl_Callback*)cb_Store);
-              o->menu(menu_Store);
-            } // Fl_Choice* o
-            { Fl_Choice* o = new Fl_Choice(100, 348, 130, 20, "Condition:");
-              o->tooltip("add this command to the main menu bar only if this condition is true");
-              o->down_box(FL_BORDER_BOX);
-              o->labelfont(1);
-              o->labelsize(11);
-              o->textsize(11);
-              o->callback((Fl_Callback*)cb_Condition);
-              o->menu(menu_Condition);
-            } // Fl_Choice* o
-            { Fl_Box* o = new Fl_Box(230, 297, 10, 71);
-              o->hide();
-              Fl_Group::current()->resizable(o);
-            } // Fl_Box* o
-            o->end();
-          } // Fl_Group* o
-          { Fl_Input* o = new Fl_Input(230, 348, 90, 20, "Label:");
-            o->labelfont(1);
-            o->labelsize(11);
-            o->textfont(4);
-            o->textsize(11);
-            o->callback((Fl_Callback*)cb_Label);
-            o->hide();
-          } // Fl_Input* o
-          { Fl_Group* o = new Fl_Group(100, 373, 220, 80);
-            o->callback((Fl_Callback*)propagate_load);
-            { Fl_Text_Editor* o = w_settings_shell_command = new Fl_Text_Editor(100, 373, 196, 80, "Shell script:");
-              w_settings_shell_command->labelfont(1);
-              w_settings_shell_command->labelsize(11);
-              w_settings_shell_command->textfont(4);
-              w_settings_shell_command->textsize(12);
-              w_settings_shell_command->callback((Fl_Callback*)cb_w_settings_shell_command);
-              w_settings_shell_command->align(Fl_Align(FL_ALIGN_LEFT));
-              Fl_Group::current()->resizable(w_settings_shell_command);
-              o->buffer(new Fl_Text_Buffer);
-            } // Fl_Text_Editor* w_settings_shell_command
-            { Fl_Group* o = new Fl_Group(296, 373, 24, 80);
-              { w_settings_shell_text_macros = new Fl_Menu_Button(296, 373, 24, 22);
-                w_settings_shell_text_macros->tooltip("a list of text replacements available for the shell script");
-                w_settings_shell_text_macros->labelsize(11);
-                w_settings_shell_text_macros->textsize(11);
-                w_settings_shell_text_macros->callback((Fl_Callback*)cb_w_settings_shell_text_macros);
-                w_settings_shell_text_macros->menu(menu_w_settings_shell_text_macros);
-              } // Fl_Menu_Button* w_settings_shell_text_macros
-              { Fl_Button* o = new Fl_Button(296, 395, 24, 22, "@+1fd_zoom");
-                o->tooltip("open the big code editor");
-                o->labelsize(11);
-                o->callback((Fl_Callback*)cb_1fd_zoom);
-              } // Fl_Button* o
-              { Fl_Box* o = new Fl_Box(296, 417, 24, 10);
-                o->hide();
-                Fl_Group::current()->resizable(o);
-              } // Fl_Box* o
-              o->end();
-            } // Fl_Group* o
-            o->end();
-            Fl_Group::current()->resizable(o);
-          } // Fl_Group* o
-          { Fl_Check_Button* o = new Fl_Check_Button(100, 458, 110, 20, "save .fl project file");
-            o->tooltip("save the project to the .fl file before running the command");
-            o->down_box(FL_DOWN_BOX);
-            o->labelsize(11);
-            o->callback((Fl_Callback*)cb_save);
-          } // Fl_Check_Button* o
-          { Fl_Check_Button* o = new Fl_Check_Button(100, 478, 110, 19, "save source code");
-            o->tooltip("generate the source code and header file before running the command");
-            o->down_box(FL_DOWN_BOX);
-            o->labelsize(11);
-            o->callback((Fl_Callback*)cb_save1);
-          } // Fl_Check_Button* o
-          { Fl_Check_Button* o = new Fl_Check_Button(100, 498, 110, 20, "save i18n strings");
-            o->tooltip("save the internationalisation strings before running the command");
-            o->down_box(FL_DOWN_BOX);
-            o->labelsize(11);
-            o->callback((Fl_Callback*)cb_save2);
-          } // Fl_Check_Button* o
-          { Fl_Check_Button* o = new Fl_Check_Button(214, 458, 106, 20, "show terminal");
-            o->tooltip("show the terminal window when launching this script");
-            o->down_box(FL_DOWN_BOX);
-            o->labelsize(11);
-            o->callback((Fl_Callback*)cb_show);
-          } // Fl_Check_Button* o
-          { Fl_Check_Button* o = new Fl_Check_Button(214, 478, 106, 19, "clear terminal");
-            o->tooltip("clear the teminal window before running this script");
-            o->down_box(FL_DOWN_BOX);
-            o->labelsize(11);
-            o->callback((Fl_Callback*)cb_clear);
-          } // Fl_Check_Button* o
-          { Fl_Check_Button* o = new Fl_Check_Button(214, 498, 106, 19, "clear term history");
-            o->tooltip("clear the teminal history in the terminal window");
-            o->down_box(FL_DOWN_BOX);
-            o->labelsize(11);
-            o->callback((Fl_Callback*)cb_clear1);
-          } // Fl_Check_Button* o
-          w_settings_shell_cmd->end();
-          Fl_Group::current()->resizable(w_settings_shell_cmd);
-        } // Fl_Group* w_settings_shell_cmd
-        { Fl_Box* o = w_settings_shell_fd_project = new Fl_Box(20, 70, 16, 15);
-          w_settings_shell_fd_project->bind_image( image_fd_project() );
-          w_settings_shell_fd_project->labelsize(11);
-          w_settings_shell_fd_project->hide();
-          w_settings_shell_fd_project->deactivate();
-          o->image()->scale(16, 16);
-        } // Fl_Box* w_settings_shell_fd_project
-        { Fl_Box* o = w_settings_shell_fd_user = new Fl_Box(20, 70, 16, 15);
-          w_settings_shell_fd_user->bind_image( image_fd_user() );
-          w_settings_shell_fd_user->labelsize(11);
-          w_settings_shell_fd_user->hide();
-          w_settings_shell_fd_user->deactivate();
-          o->image()->scale(16, 16);
-        } // Fl_Box* w_settings_shell_fd_user
-        w_settings_shell_tab->end();
-      } // Fl_Group* w_settings_shell_tab
-      { w_settings_i18n_tab = new Fl_Group(10, 60, 320, 480, "Locale");
-        w_settings_i18n_tab->image( image_language_64() );
-        w_settings_i18n_tab->image()->scale(36, 24, 0, 1);
-        w_settings_i18n_tab->labelsize(11);
-        w_settings_i18n_tab->callback((Fl_Callback*)cb_w_settings_i18n_tab);
-        w_settings_i18n_tab->hide();
-        { Fl_Group* o = new Fl_Group(100, 78, 170, 20);
-          o->callback((Fl_Callback*)propagate_load);
-          { i18n_type_chooser = new Fl_Choice(100, 78, 160, 20, "i18n Library:");
-            i18n_type_chooser->tooltip("Type of internationalization to use.");
-            i18n_type_chooser->box(FL_THIN_UP_BOX);
-            i18n_type_chooser->down_box(FL_BORDER_BOX);
-            i18n_type_chooser->labelsize(11);
-            i18n_type_chooser->textsize(11);
-            i18n_type_chooser->callback((Fl_Callback*)i18n_type_cb);
-            i18n_type_chooser->menu(menu_i18n_type_chooser);
-          } // Fl_Choice* i18n_type_chooser
-          { Fl_Box* o = new Fl_Box(260, 78, 10, 20);
-            o->hide();
-            Fl_Group::current()->resizable(o);
-          } // Fl_Box* o
-          o->end();
-        } // Fl_Group* o
-        { i18n_gnu_group = new Fl_Group(100, 103, 220, 95);
-          i18n_gnu_group->callback((Fl_Callback*)cb_i18n_gnu_group);
-          { i18n_gnu_include_input = new Fl_Input(100, 103, 220, 20, "#include:");
-            i18n_gnu_include_input->tooltip("The include file for internationalization.");
-            i18n_gnu_include_input->box(FL_THIN_DOWN_BOX);
-            i18n_gnu_include_input->labelsize(11);
-            i18n_gnu_include_input->textfont(4);
-            i18n_gnu_include_input->textsize(11);
-            i18n_gnu_include_input->callback((Fl_Callback*)cb_i18n_gnu_include_input);
-          } // Fl_Input* i18n_gnu_include_input
-          { i18n_gnu_conditional_input = new Fl_Input(100, 128, 220, 20, "Conditional:");
-            i18n_gnu_conditional_input->tooltip("only include the header file if this preprocessor macro is defined, for examp\
-le FLTK_GETTEXT_FOUND");
-            i18n_gnu_conditional_input->box(FL_THIN_DOWN_BOX);
-            i18n_gnu_conditional_input->labelsize(11);
-            i18n_gnu_conditional_input->textfont(4);
-            i18n_gnu_conditional_input->textsize(11);
-            i18n_gnu_conditional_input->callback((Fl_Callback*)cb_i18n_gnu_conditional_input);
-          } // Fl_Input* i18n_gnu_conditional_input
-          { i18n_gnu_function_input = new Fl_Input(100, 153, 220, 20, "Function:");
-            i18n_gnu_function_input->tooltip("The function to call to translate labels and tooltips, usually \"gettext\" or\
- \"_\"");
-            i18n_gnu_function_input->box(FL_THIN_DOWN_BOX);
-            i18n_gnu_function_input->labelsize(11);
-            i18n_gnu_function_input->textfont(4);
-            i18n_gnu_function_input->textsize(11);
-            i18n_gnu_function_input->callback((Fl_Callback*)cb_i18n_gnu_function_input);
-          } // Fl_Input* i18n_gnu_function_input
-          { i18n_gnu_static_function_input = new Fl_Input(100, 178, 220, 20, "Static Function:");
-            i18n_gnu_static_function_input->tooltip("function to call to translate static text, The function to call to internatio\
-nalize labels and tooltips, usually \"gettext_noop\" or \"N_\"");
-            i18n_gnu_static_function_input->box(FL_THIN_DOWN_BOX);
-            i18n_gnu_static_function_input->labelsize(11);
-            i18n_gnu_static_function_input->textfont(4);
-            i18n_gnu_static_function_input->textsize(11);
-            i18n_gnu_static_function_input->callback((Fl_Callback*)cb_i18n_gnu_static_function_input);
-          } // Fl_Input* i18n_gnu_static_function_input
-          i18n_gnu_group->end();
-        } // Fl_Group* i18n_gnu_group
-        { i18n_posix_group = new Fl_Group(100, 103, 220, 95);
-          i18n_posix_group->callback((Fl_Callback*)cb_i18n_posix_group);
-          i18n_posix_group->hide();
-          { i18n_pos_include_input = new Fl_Input(100, 103, 220, 20, "#include:");
-            i18n_pos_include_input->tooltip("The include file for internationalization.");
-            i18n_pos_include_input->box(FL_THIN_DOWN_BOX);
-            i18n_pos_include_input->labelsize(11);
-            i18n_pos_include_input->textfont(4);
-            i18n_pos_include_input->textsize(11);
-            i18n_pos_include_input->callback((Fl_Callback*)cb_i18n_pos_include_input);
-          } // Fl_Input* i18n_pos_include_input
-          { i18n_pos_conditional_input = new Fl_Input(100, 128, 220, 20, "Conditional:");
-            i18n_pos_conditional_input->tooltip("only include the header file if this preprocessor macro is defined, for examp\
-le FLTK_GETTEXT_FOUND");
-            i18n_pos_conditional_input->box(FL_THIN_DOWN_BOX);
-            i18n_pos_conditional_input->labelsize(11);
-            i18n_pos_conditional_input->textfont(4);
-            i18n_pos_conditional_input->textsize(11);
-            i18n_pos_conditional_input->callback((Fl_Callback*)cb_i18n_pos_conditional_input);
-          } // Fl_Input* i18n_pos_conditional_input
-          { i18n_pos_file_input = new Fl_Input(100, 153, 220, 20, "File:");
-            i18n_pos_file_input->tooltip("The name of the message catalog.");
-            i18n_pos_file_input->box(FL_THIN_DOWN_BOX);
-            i18n_pos_file_input->labelsize(11);
-            i18n_pos_file_input->textfont(4);
-            i18n_pos_file_input->textsize(11);
-            i18n_pos_file_input->callback((Fl_Callback*)cb_i18n_pos_file_input);
-          } // Fl_Input* i18n_pos_file_input
-          { Fl_Group* o = new Fl_Group(100, 178, 90, 20);
-            o->callback((Fl_Callback*)cb_c);
-            { i18n_pos_set_input = new Fl_Int_Input(100, 178, 80, 20, "Set:");
-              i18n_pos_set_input->tooltip("The message set number.");
-              i18n_pos_set_input->type(2);
-              i18n_pos_set_input->box(FL_THIN_DOWN_BOX);
-              i18n_pos_set_input->labelsize(11);
-              i18n_pos_set_input->textfont(4);
-              i18n_pos_set_input->textsize(11);
-              i18n_pos_set_input->callback((Fl_Callback*)cb_i18n_pos_set_input);
-            } // Fl_Int_Input* i18n_pos_set_input
-            { Fl_Box* o = new Fl_Box(180, 178, 10, 20);
-              o->hide();
-              Fl_Group::current()->resizable(o);
-            } // Fl_Box* o
-            o->end();
-          } // Fl_Group* o
-          i18n_posix_group->end();
-        } // Fl_Group* i18n_posix_group
-        { Fl_Box* o = new Fl_Box(100, 530, 220, 10);
-          o->hide();
-          Fl_Group::current()->resizable(o);
-        } // Fl_Box* o
-        w_settings_i18n_tab->end();
-      } // Fl_Group* w_settings_i18n_tab
-      { w_settings_user_tab = new Fl_Group(10, 60, 320, 480, "User");
-        w_settings_user_tab->image( image_user_circle_64() );
-        w_settings_user_tab->image()->scale(36, 24, 0, 1);
-        w_settings_user_tab->labelsize(11);
-        w_settings_user_tab->callback((Fl_Callback*)cb_w_settings_user_tab);
-        w_settings_user_tab->hide();
-        { Fl_Box* o = new Fl_Box(100, 84, 220, 20, "---- Widget Browser ----");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
-        } // Fl_Box* o
-        { Fl_Group* o = new Fl_Group(100, 112, 220, 20);
-          o->callback((Fl_Callback*)propagate_load);
-          { Fl_Choice* o = new Fl_Choice(100, 112, 151, 20, "Label:");
-            o->box(FL_THIN_UP_BOX);
-            o->down_box(FL_BORDER_BOX);
-            o->labelfont(1);
-            o->labelsize(11);
-            o->textsize(11);
-            o->callback((Fl_Callback*)cb_Comments, (void*)(&Widget_Browser::label_font));
-            Fl_Group::current()->resizable(o);
-            o->menu(fontmenu);
-          } // Fl_Choice* o
-          { Fl_Button* o = new Fl_Button(251, 112, 51, 20);
-            o->labelsize(11);
-            o->callback((Fl_Callback*)cb_Color_Chip, (void*)(&Widget_Browser::label_color));
-          } // Fl_Button* o
-          { Fl_Menu_Button* o = new Fl_Menu_Button(302, 112, 18, 20);
-            o->callback((Fl_Callback*)cb_Color_Choice, (void*)(&Widget_Browser::label_color));
-            o->menu(colormenu);
-          } // Fl_Menu_Button* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(100, 137, 220, 20);
-          o->callback((Fl_Callback*)propagate_load);
-          { Fl_Choice* o = new Fl_Choice(100, 137, 151, 20, "Class:");
-            o->box(FL_THIN_UP_BOX);
-            o->down_box(FL_BORDER_BOX);
-            o->labelfont(1);
-            o->labelsize(11);
-            o->textsize(11);
-            o->callback((Fl_Callback*)cb_Comments, (void*)(&Widget_Browser::class_font));
-            Fl_Group::current()->resizable(o);
-            o->menu(fontmenu);
-          } // Fl_Choice* o
-          { Fl_Button* o = new Fl_Button(251, 137, 51, 20);
-            o->labelsize(11);
-            o->callback((Fl_Callback*)cb_Color_Chip, (void*)(&Widget_Browser::class_color));
-          } // Fl_Button* o
-          { Fl_Menu_Button* o = new Fl_Menu_Button(302, 137, 18, 20);
-            o->callback((Fl_Callback*)cb_Color_Choice, (void*)(&Widget_Browser::class_color));
-            o->menu(colormenu);
-          } // Fl_Menu_Button* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(100, 162, 220, 20);
-          o->callback((Fl_Callback*)propagate_load);
-          { Fl_Choice* o = new Fl_Choice(100, 162, 151, 20, "Function:");
-            o->box(FL_THIN_UP_BOX);
-            o->down_box(FL_BORDER_BOX);
-            o->labelfont(1);
-            o->labelsize(11);
-            o->textsize(11);
-            o->callback((Fl_Callback*)cb_Comments, (void*)(&Widget_Browser::func_font));
-            Fl_Group::current()->resizable(o);
-            o->menu(fontmenu);
-          } // Fl_Choice* o
-          { Fl_Button* o = new Fl_Button(251, 162, 51, 20);
-            o->labelsize(11);
-            o->callback((Fl_Callback*)cb_Color_Chip, (void*)(&Widget_Browser::func_color));
-          } // Fl_Button* o
-          { Fl_Menu_Button* o = new Fl_Menu_Button(302, 162, 18, 20);
-            o->callback((Fl_Callback*)cb_Color_Choice, (void*)(&Widget_Browser::func_color));
-            o->menu(colormenu);
-          } // Fl_Menu_Button* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(100, 187, 220, 20);
-          o->callback((Fl_Callback*)propagate_load);
-          { Fl_Choice* o = new Fl_Choice(100, 187, 151, 20, "Name:");
-            o->box(FL_THIN_UP_BOX);
-            o->down_box(FL_BORDER_BOX);
-            o->labelfont(1);
-            o->labelsize(11);
-            o->textsize(11);
-            o->callback((Fl_Callback*)cb_Comments, (void*)(&Widget_Browser::name_font));
-            Fl_Group::current()->resizable(o);
-            o->menu(fontmenu);
-          } // Fl_Choice* o
-          { Fl_Button* o = new Fl_Button(251, 187, 51, 20);
-            o->labelsize(11);
-            o->callback((Fl_Callback*)cb_Color_Chip, (void*)(&Widget_Browser::name_color));
-          } // Fl_Button* o
-          { Fl_Menu_Button* o = new Fl_Menu_Button(302, 187, 18, 20);
-            o->callback((Fl_Callback*)cb_Color_Choice, (void*)(&Widget_Browser::name_color));
-            o->menu(colormenu);
-          } // Fl_Menu_Button* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(100, 212, 220, 20);
-          o->callback((Fl_Callback*)propagate_load);
-          { Fl_Choice* o = new Fl_Choice(100, 212, 151, 20, "Code:");
-            o->box(FL_THIN_UP_BOX);
-            o->down_box(FL_BORDER_BOX);
-            o->labelfont(1);
-            o->labelsize(11);
-            o->textsize(11);
-            o->callback((Fl_Callback*)cb_Comments, (void*)(&Widget_Browser::code_font));
-            Fl_Group::current()->resizable(o);
-            o->menu(fontmenu);
-          } // Fl_Choice* o
-          { Fl_Button* o = new Fl_Button(251, 212, 51, 20);
-            o->labelsize(11);
-            o->callback((Fl_Callback*)cb_Color_Chip, (void*)(&Widget_Browser::code_color));
-          } // Fl_Button* o
-          { Fl_Menu_Button* o = new Fl_Menu_Button(302, 212, 18, 20);
-            o->callback((Fl_Callback*)cb_Color_Choice, (void*)(&Widget_Browser::code_color));
-            o->menu(colormenu);
-          } // Fl_Menu_Button* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(100, 237, 220, 20);
-          o->callback((Fl_Callback*)propagate_load);
-          { Fl_Choice* o = new Fl_Choice(100, 237, 151, 20, "Comments:");
-            o->box(FL_THIN_UP_BOX);
-            o->down_box(FL_BORDER_BOX);
-            o->labelfont(1);
-            o->labelsize(11);
-            o->textsize(11);
-            o->callback((Fl_Callback*)cb_Comments, (void*)(&Widget_Browser::comment_font));
-            Fl_Group::current()->resizable(o);
-            o->menu(fontmenu);
-          } // Fl_Choice* o
-          { Fl_Button* o = new Fl_Button(251, 237, 51, 20);
-            o->labelsize(11);
-            o->callback((Fl_Callback*)cb_Color_Chip, (void*)(&Widget_Browser::comment_color));
-          } // Fl_Button* o
-          { Fl_Menu_Button* o = new Fl_Menu_Button(302, 237, 18, 20);
-            o->callback((Fl_Callback*)cb_Color_Choice, (void*)(&Widget_Browser::comment_color));
-            o->menu(colormenu);
-          } // Fl_Menu_Button* o
-          o->end();
-        } // Fl_Group* o
-        w_settings_user_tab->end();
-      } // Fl_Group* w_settings_user_tab
-      w_settings_tabs->end();
-      Fl_Group::current()->resizable(w_settings_tabs);
-    } // Fl_Tabs* w_settings_tabs
-    { Fl_Group* o = new Fl_Group(10, 550, 320, 20);
-      { Fl_Button* o = new Fl_Button(230, 550, 100, 20, "Close");
-        o->tooltip("Close this dialog.");
-        o->labelsize(11);
-        o->callback((Fl_Callback*)cb_Close);
-      } // Fl_Button* o
-      { Fl_Box* o = new Fl_Box(220, 550, 10, 20);
-        o->hide();
-        Fl_Group::current()->resizable(o);
-      } // Fl_Box* o
-      o->end();
-    } // Fl_Group* o
-    settings_window->size_range(340, 580);
-    settings_window->end();
-  } // Fl_Double_Window* settings_window
-  w_settings_tabs->do_callback(w_settings_tabs, LOAD);
-  return settings_window;
-}
-
-Fl_Double_Window *shell_run_window=(Fl_Double_Window *)0;
-
-Fl_Terminal *shell_run_terminal=(Fl_Terminal *)0;
-
-static void cb_Clear(Fl_Button*, void*) {
-  // clear screen, clear scrollback, home cursor
-  shell_run_terminal->append("\033[2J\033[3J\033[H");
-}
-
-Fl_Return_Button *shell_run_button=(Fl_Return_Button *)0;
-
-static void cb_shell_run_button(Fl_Return_Button*, void*) {
-  Fl_Preferences pos(fluid_prefs, "shell_run_Window_pos");
-  pos.set("x", shell_run_window->x());
-  pos.set("y", shell_run_window->y());
-  pos.set("w", shell_run_window->w());
-  pos.set("h", shell_run_window->h());
-  shell_run_window->hide();
-}
-
-Fl_Double_Window* make_shell_window() {
-  { shell_run_window = new Fl_Double_Window(555, 430, "Shell Command Output");
-    shell_run_window->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));
-    { shell_run_terminal = new Fl_Terminal(10, 10, 535, 375);
-      Fl_Group::current()->resizable(shell_run_terminal);
-      shell_run_terminal->ansi(1);
-      shell_run_terminal->history_lines(1000);
-    } // Fl_Terminal* shell_run_terminal
-    { Fl_Group* o = new Fl_Group(10, 395, 535, 25);
-      { Fl_Button* o = new Fl_Button(10, 395, 94, 25, "Clear");
-        o->callback((Fl_Callback*)cb_Clear);
-      } // Fl_Button* o
-      { Fl_Box* o = new Fl_Box(104, 395, 341, 25);
-        o->hide();
-        Fl_Group::current()->resizable(o);
-      } // Fl_Box* o
-      { shell_run_button = new Fl_Return_Button(445, 395, 100, 25, "Close");
-        shell_run_button->callback((Fl_Callback*)cb_shell_run_button);
-      } // Fl_Return_Button* shell_run_button
-      o->end();
-    } // Fl_Group* o
-    shell_run_window->end();
-  } // Fl_Double_Window* shell_run_window
-  return shell_run_window;
-}
-Fl_Menu_Item *w_layout_menu_storage[4];
diff --git fluid/alignment_panel.fl fluid/alignment_panel.fl
deleted file mode 100644
index 8c14d98..0000000
--- fluid/alignment_panel.fl
+++ /dev/null
@@ -1,1879 +0,0 @@
-# data file for the Fltk User Interface Designer (fluid)
-version 1.0400
-header_name {.h}
-code_name {.cxx}
-snap {
-  ver 1
-  current_suite {FLUID (based on FLTK)}
-  current_preset 0
-  suite {
-    name {FLUID (based on FLTK)}
-    preset { 1
-      15 15 15 15 0 0
-      10 10 10 10 0 0
-      25 25
-      20 10 4 20 4 8
-      0 14 0 14
-    }
-    preset { 1
-      10 10 10 10 0 0
-      10 10 10 10 0 0
-      20 20
-      20 10 5 20 5 5
-      0 11 0 11
-    }
-    preset { 1
-      10 10 10 10 0 0
-      10 10 10 10 0 0
-      18 18
-      16 8 2 16 4 2
-      0 10 0 10
-    }
-  }
-}
-comment {//
-// Setting and shell dialogs for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 1998-2023 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
-//
-// Please see the following page on how to report bugs and issues:
-//
-//     https://www.fltk.org/bugs.php
-//
-} {in_source in_header
-}
-
-decl {\#include "fluid.h"} {public global
-}
-
-decl {\#include "undo.h"} {private global
-}
-
-decl {\#include "widget_browser.h"} {public global
-}
-
-decl {\#include "Fd_Snap_Action.h"} {public global
-}
-
-decl {\#include "shell_command.h"} {public global
-}
-
-decl {\#include <FL/Fl_Text_Buffer.H>} {public local
-}
-
-decl {\#include <FL/Fl_Text_Display.H>} {public local
-}
-
-decl {\#include "fluid_filename.h"} {public local
-}
-
-decl {\#include <FL/fl_string_functions.h>} {public local
-}
-
-decl {\#include <FL/Fl_Scheme_Choice.H>} {public local
-}
-
-decl {\#include <FL/Fl_Preferences.H>} {private global
-}
-
-decl {\#include <FL/Fl_Tooltip.H>} {private global
-}
-
-decl {\#include <FL/fl_ask.H>} {private global
-}
-
-decl {\#include <string.h>} {private global
-}
-
-decl {\#include "../src/flstring.h"} {private global
-}
-
-decl {void init_scheme(void);} {
-  comment {// initialize the scheme from preferences} public global
-}
-
-decl {extern struct Fl_Menu_Item *dbmanager_item;} {public local
-}
-
-decl {extern void i18n_cb(Fl_Choice *,void *);} {public local
-}
-
-decl {void scheme_cb(Fl_Scheme_Choice *, void *);} {public local
-}
-
-decl {int w_settings_shell_list_selected;} {public local
-}
-
-Function {cb_Comments(Fl_Choice* o, void* v)} {open private return_type void
-} {
-  code {Fl_Font *font = (Fl_Font*)o->user_data();
-if (v == LOAD) {
-  o->value(*font);
-} else {
-  *font = (int)o->value();
-  widget_browser->redraw();
-  widget_browser->save_prefs();
-}} {}
-}
-
-Function {cb_Color_Chip(Fl_Button* o, void* v)} {open private return_type void
-} {
-  code {Fl_Color *color = (Fl_Color*)o->user_data();
-if (v == LOAD) {
-  o->color(*color);
-  o->redraw();
-} else {
-  Fl_Color d = fl_show_colormap(*color);
-  *color = d;
-  o->color(d);
-  widget_browser->redraw();
-  widget_browser->save_prefs();
-}} {}
-}
-
-Function {cb_Color_Choice(Fl_Menu_Button* o, void* v)} {open private return_type void
-} {
-  code {if (v != LOAD) {
-  Fl_Color *color = (Fl_Color*)o->user_data();
-  Fl_Color d = (Fl_Color)(o->mvalue()->argument());
-  *color = d;
-  o->parent()->do_callback(o->parent(), LOAD);
-  widget_browser->redraw();
-  widget_browser->save_prefs();
-}} {}
-}
-
-Function {make_script_panel()} {open
-} {
-  Fl_Window script_panel {
-    label {Shell Script Editor}
-    callback {if (Fl::event()==FL_SHORTCUT && Fl::event_key()==FL_Escape)
-  return; // ignore Escape
-script_panel->hide(); // otherwise hide..} open
-    xywh {764 319 540 180} type Double labelsize 11 resizable
-    code0 {o->size_range(200, 150);} modal visible
-  } {
-    Fl_Text_Editor script_input {
-      xywh {10 10 520 130} box DOWN_BOX labelsize 11 when 13 textfont 4 textsize 11 resizable
-      code0 {script_input->buffer(new Fl_Text_Buffer);}
-    }
-    Fl_Group {} {
-      callback propagate_load open
-      xywh {10 150 520 20} labelsize 11
-    } {
-      Fl_Return_Button script_panel_ok {
-        label OK
-        xywh {400 150 60 20} labelsize 11 hotspot
-      }
-      Fl_Button script_panel_cancel {
-        label Cancel
-        xywh {470 150 60 20} labelsize 11
-      }
-      Fl_Box {} {
-        xywh {10 150 380 20} labelsize 11 resizable
-      }
-    }
-  }
-  code {// Enable line numbers
-script_input->linenumber_width(60);
-script_input->linenumber_size(script_input->Fl_Text_Display::textsize());} {}
-}
-
-Function {make_settings_window()} {open
-} {
-  Fl_Window settings_window {
-    label {FLUID Settings} open
-    xywh {392 362 340 580} type Double align 80 resizable size_range {340 580 0 0} visible
-  } {
-    Fl_Tabs w_settings_tabs {
-      callback {propagate_load(o, v);} open
-      xywh {10 10 320 530} selection_color 12 labelsize 11 labelcolor 255 resizable
-    } {
-      Fl_Group {} {
-        label General open selected
-        scale_image {36 24} image {icons/general_64.png} compress_image 1 xywh {10 60 320 480} labelsize 11 resizable
-      } {
-        Fl_Group {} {
-          callback {propagate_load(o, v);} open
-          xywh {120 78 130 25}
-        } {
-          Fl_Choice scheme_choice {
-            label {Scheme: }
-            callback scheme_cb open
-            xywh {120 78 120 25} down_box BORDER_BOX labelfont 1 labelsize 11
-            code0 {init_scheme();}
-            class Fl_Scheme_Choice
-          } {}
-          Fl_Box {} {
-            xywh {240 78 10 25} hide resizable
-          }
-        }
-        Fl_Box {} {
-          label {Options: }
-          xywh {120 115 0 20} labelfont 1 labelsize 11 align 4
-        }
-        Fl_Check_Button tooltips_button {
-          label {Show Tooltips}
-          callback {Fl_Tooltip::enable(tooltips_button->value());
-fluid_prefs.set("show_tooltips", tooltips_button->value());}
-          xywh {120 115 200 20} down_box DOWN_BOX labelsize 11
-          code0 {int b;}
-          code1 {fluid_prefs.get("show_tooltips", b, 1);}
-          code2 {tooltips_button->value(b);}
-          code3 {Fl_Tooltip::enable(b);}
-        }
-        Fl_Check_Button completion_button {
-          label {Show Completion Dialogs}
-          callback {fluid_prefs.set("show_completion_dialogs", completion_button->value());}
-          xywh {120 135 200 20} down_box DOWN_BOX labelsize 11
-          code0 {int b;}
-          code1 {fluid_prefs.get("show_completion_dialogs", b, 1);}
-          code2 {completion_button->value(b);}
-        }
-        Fl_Check_Button openlast_button {
-          label {Open Previous File on Startup}
-          callback {fluid_prefs.set("open_previous_file", openlast_button->value());}
-          xywh {120 155 200 20} down_box DOWN_BOX labelsize 11
-          code0 {int b;}
-          code1 {fluid_prefs.get("open_previous_file", b, 0);}
-          code2 {openlast_button->value(b);}
-        }
-        Fl_Check_Button prevpos_button {
-          label {Remember Window Positions}
-          callback {fluid_prefs.set("prev_window_pos", prevpos_button->value());}
-          xywh {120 175 200 20} down_box DOWN_BOX labelsize 11
-          code0 {int b;}
-          code1 {fluid_prefs.get("prev_window_pos", b, 1);}
-          code2 {prevpos_button->value(b);}
-        }
-        Fl_Check_Button show_comments_button {
-          label {Show Comments in Browser}
-          callback {show_comments = show_comments_button->value();
-fluid_prefs.set("show_comments", show_comments);
-redraw_browser();}
-          xywh {120 195 200 20} down_box DOWN_BOX labelsize 11
-          code1 {fluid_prefs.get("show_comments", show_comments, 1);}
-          code2 {show_comments_button->value(show_comments);}
-        }
-        Fl_Group {} {
-          callback {propagate_load(o, v);} open
-          xywh {120 225 50 20}
-        } {
-          Fl_Spinner recent_spinner {
-            label {\# Recent Files:}
-            callback {fluid_prefs.set("recent_files", recent_spinner->value());
-load_history();}
-            xywh {120 225 40 20} labelfont 1 labelsize 11 when 1 maximum 10 textsize 11
-            code0 {int c;}
-            code1 {fluid_prefs.get("recent_files", c, 5);}
-            code2 {recent_spinner->maximum(10);}
-            code3 {recent_spinner->value(c);}
-          }
-          Fl_Box {} {
-            xywh {160 225 10 20} hide resizable
-          }
-        }
-        Fl_Check_Button use_external_editor_button {
-          label {Use for Code Nodes}
-          callback {G_use_external_editor = use_external_editor_button->value();
-fluid_prefs.set("use_external_editor", G_use_external_editor);
-redraw_browser();}
-          xywh {120 275 200 20} down_box DOWN_BOX labelsize 11
-          code1 {fluid_prefs.get("use_external_editor", G_use_external_editor, 0);}
-          code2 {use_external_editor_button->value(G_use_external_editor);}
-        }
-        Fl_Input editor_command_input {
-          label {External Editor:}
-          callback {strncpy(G_external_editor_command, editor_command_input->value(), sizeof(G_external_editor_command)-1);
-G_external_editor_command[sizeof(G_external_editor_command)-1] = 0;
-fluid_prefs.set("external_editor_command", G_external_editor_command);
-redraw_browser();}
-          tooltip {The editor command to open your external text editor.
-Include any necessary flags to ensure your editor does not background itself.
-Examples:
-    gvim -f
-    gedit
- emacs} xywh {120 255 200 20} labelfont 1 labelsize 11 when 1 textfont 4 textsize 11
-          code1 {fluid_prefs.get("external_editor_command", G_external_editor_command, "", sizeof(G_external_editor_command)-1);}
-          code2 {editor_command_input->value(G_external_editor_command);}
-        }
-        Fl_Box {} {
-          label {Overlays: }
-          xywh {120 300 0 20} labelfont 1 labelsize 11 align 4
-        }
-        Fl_Check_Button guides_button {
-          label {Show Positioning Guides}
-          callback toggle_guides_cb
-          tooltip {show guides that help to position and resize widgets and enable snapping} xywh {120 300 200 20} down_box DOWN_BOX labelsize 11
-          code0 {o->value(show_guides);}
-        }
-        Fl_Check_Button restricted_button {
-          label {Show Restricted Areas}
-          callback toggle_restricted_cb
-          tooltip {show overlapping and out of bounds areas, show unfilled areas in Fl_Pack groups} xywh {120 320 200 20} down_box DOWN_BOX labelsize 11
-          code0 {o->value(show_restricted);}
-        }
-        Fl_Check_Button ghosted_outline_button {
-          label {Show Ghosted Group Outlines}
-          callback toggle_ghosted_outline_cb
-          tooltip {groups with no box type or flat boxtypes without contrast will be rendered with a dim outline in the editing window only} xywh {120 340 200 20} down_box DOWN_BOX labelsize 11
-          code0 {o->value(show_ghosted_outline);}
-        }
-        Fl_Box {} {
-          xywh {120 530 200 10} hide resizable
-        }
-      }
-      Fl_Group w_settings_project_tab {
-        label Project
-        callback {propagate_load(o, v);} open
-        scale_image {36 24} image {icons/document_64.png} compress_image 1 xywh {10 60 320 480} labelsize 11 hide
-      } {
-        Fl_Group {} {open
-          xywh {100 78 220 30}
-        } {
-          Fl_Box {} {
-            label {Use "name.ext" to set a file name
-or just ".ext" to set extension.}
-            xywh {100 78 210 30} labelsize 11 align 148
-          }
-          Fl_Box {} {
-            xywh {310 78 10 30} hide resizable
-          }
-        }
-        Fl_Input header_file_input {
-          label {Header File:}
-          user_data 1 user_data_type {void*}
-          callback {if (v == LOAD) {
-  o->value(g_project.header_file_name.c_str());
-} else {
-  if (strcmp(g_project.header_file_name.c_str(), o->value())) {
-    g_project.header_file_name = o->value();
-    set_modflag(1);
-  }
-}}
-          tooltip {The name of the generated header file.} xywh {100 112 220 20} box THIN_DOWN_BOX labelfont 1 labelsize 11 when 1 textfont 4 textsize 11
-        }
-        Fl_Input code_file_input {
-          label {Code File:}
-          user_data 1 user_data_type {void*}
-          callback {if (v == LOAD) {
-  o->value(g_project.code_file_name.c_str());
-} else {
-  if (strcmp(g_project.code_file_name.c_str(), o->value())) {
-    g_project.code_file_name = o->value();
-    set_modflag(1);
-  }
-}}
-          tooltip {The name of the generated code file.} xywh {100 137 220 20} box THIN_DOWN_BOX labelfont 1 labelsize 11 when 1 textfont 4 textsize 11
-        }
-        Fl_Check_Button include_H_from_C_button {
-          label {Include Header from Code}
-          callback {if (v == LOAD) {
-  o->value(g_project.include_H_from_C);
-} else {
-  if (g_project.include_H_from_C != o->value()) {
-    set_modflag(1);
-    g_project.include_H_from_C = o->value();
-  }
-}}
-          tooltip {Include the header file from the code file.} xywh {100 162 220 20} down_box DOWN_BOX labelsize 11
-        }
-        Fl_Box {} {
-          label {Options: }
-          xywh {100 205 0 20} labelfont 1 labelsize 11 align 4
-        }
-        Fl_Check_Button use_FL_COMMAND_button {
-          label {Menu shortcuts use FL_COMMAND}
-          callback {if (v == LOAD) {
-  o->value(g_project.use_FL_COMMAND);
-} else {
-  if (g_project.use_FL_COMMAND != o->value()) {
-    set_modflag(1);
-    g_project.use_FL_COMMAND = o->value();
-  }
-}}
-          tooltip {Replace FL_CTRL and FL_META with FL_COMMAND when generating menu shortcuts} xywh {100 205 220 20} down_box DOWN_BOX labelsize 11
-        }
-        Fl_Check_Button utf8_in_src_button {
-          label {allow Unicode UTF-8 in source code}
-          callback {if (v == LOAD) {
-  o->value(g_project.utf8_in_src);
-} else {
-  if (g_project.utf8_in_src != o->value()) {
-    set_modflag(1);
-    g_project.utf8_in_src = o->value();
-  }
-}}
-          tooltip {For older compilers, characters outside of the printable ASCII range are escaped using octal notation `\\0123`. If this option is checked, Fluid will write UTF-8 characters unchanged.} xywh {100 230 220 20} down_box DOWN_BOX labelsize 11
-        }
-        Fl_Check_Button avoid_early_includes_button {
-          label {avoid early include of Fl.H}
-          callback {if (v == LOAD) {
-  o->value(g_project.avoid_early_includes);
-} else {
-  if (g_project.avoid_early_includes != o->value()) {
-    set_modflag(1);
-    g_project.avoid_early_includes = o->value();
-  }
-}}
-          tooltip {Do not emit \#include <FL//Fl.H> until it is needed by another include file.} xywh {100 255 220 20} down_box DOWN_BOX labelsize 11
-        }
-        Fl_Box {} {
-          label {Experimental: }
-          xywh {100 283 0 20} labelfont 1 labelsize 11 align 4 hide
-        }
-        Fl_Check_Button w_proj_mergeback {
-          label {generate MergeBack data}
-          callback {if (v == LOAD) {
-  o->value(g_project.write_mergeback_data);
-} else {
-  if (g_project.write_mergeback_data != o->value()) {
-    set_modflag(1);
-    g_project.write_mergeback_data = o->value();
-  }
-}}
-          comment {// Matt: disabled}
-          tooltip {MergeBack is a feature under construction that allows changes in code files to be merged back into the project file. Checking this option will generate additional data in code and project files.} xywh {100 283 220 20} down_box DOWN_BOX labelsize 11 hide
-        }
-        Fl_Box {} {
-          xywh {100 530 220 10} hide resizable
-        }
-      }
-      Fl_Group w_settings_layout_tab {
-        label Layout
-        callback {propagate_load(o, v);} open
-        scale_image {36 24} image {icons/layout_64.png} compress_image 1 xywh {10 60 320 480} labelsize 11 hide
-      } {
-        Fl_Box {} {
-          label {Layout:}
-          xywh {25 78 60 24} labelfont 1 labelsize 11 align 24
-        }
-        Fl_Choice layout_choice {
-          callback {if (v == LOAD) {
-    o->value(g_layout_list.current_suite());
-  } else {
-    int index = o->value();
-    g_layout_list.current_suite(index);
-    g_layout_list.update_dialogs();
-  }}
-          xywh {85 78 187 24} down_box BORDER_BOX
-        } {
-          MenuItem {} {
-            label FLTK
-            xywh {0 0 31 20}
-          }
-          MenuItem {} {
-            label Grid
-            xywh {0 0 31 20}
-          }
-        }
-        Fl_Button {} {
-          label {+}
-          callback {// Clone the current layout suite
-
-if (v == LOAD) return;
-
-Fl_String old_name = "Copy of ";
-old_name.append(g_layout_list[g_layout_list.current_suite()].name_);
-const char *new_name = fl_input("Enter a name for the new layout:", old_name.c_str());
-if (new_name == NULL)
-  return;
-
-g_layout_list.add(new_name);
-g_layout_list.update_dialogs();}
-          xywh {272 78 24 24}
-        }
-        Fl_Menu_Button w_layout_menu {
-          callback {if (v == LOAD) {
-  Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
-  if (suite.storage_ == FD_STORE_INTERNAL) {
-    w_layout_menu_rename->deactivate();
-    for (int i=1; i<4; i++) w_layout_menu_storage[i]->deactivate();
-    w_layout_menu_delete->deactivate();
-  } else {
-    w_layout_menu_rename->activate();
-    for (int i=1; i<4; i++) w_layout_menu_storage[i]->activate();
-    w_layout_menu_delete->activate();
-  }
-  w_layout_menu_storage[suite.storage_]->setonly();
-}} open
-          xywh {296 78 24 24}
-        } {
-          MenuItem w_layout_menu_rename {
-            label {Rename...}
-            callback {// Rename the current layout suite
-
-Fl_String old_name = g_layout_list[g_layout_list.current_suite()].name_;
-const char *new_name = fl_input("Enter a new name for the layout:", old_name.c_str());
-if (new_name == NULL)
-  return;
-
-g_layout_list.rename(new_name);
-g_layout_list.update_dialogs();}
-            xywh {0 0 31 20} divider
-          }
-          MenuItem {w_layout_menu_storage[0]} {
-            label {@fd_beaker  FLUID Built-In}
-            callback {Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
-suite.storage(FD_STORE_INTERNAL);
-g_layout_list.update_dialogs();}
-            xywh {0 0 31 20} type Radio deactivate
-          }
-          MenuItem {w_layout_menu_storage[1]} {
-            label {@fd_user  User Preference}
-            callback {Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
-suite.storage(FD_STORE_USER);
-g_layout_list.update_dialogs();}
-            xywh {0 0 31 20} type Radio
-          }
-          MenuItem {w_layout_menu_storage[2]} {
-            label {@fd_project  Store in .fl Project File}
-            callback {Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
-suite.storage(FD_STORE_PROJECT);
-g_layout_list.update_dialogs();}
-            xywh {0 0 31 20} type Radio
-          }
-          MenuItem {w_layout_menu_storage[3]} {
-            label {@fd_file  Store in External File}
-            callback {Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
-suite.storage(FD_STORE_FILE);
-g_layout_list.update_dialogs();}
-            xywh {0 0 31 20} type Radio divider
-          }
-          MenuItem w_layout_menu_load {
-            label {Load...}
-            callback {// Give the user a file chooser and load that file
-Fl_Native_File_Chooser fnfc;
-fnfc.title("Load Layout Settings:");
-fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE);
-fnfc.options(Fl_Native_File_Chooser::USE_FILTER_EXT);
-fnfc.filter("FLUID Layouts\\t*.fll\\n");
-if (fnfc.show() != 0) return;
-const char *new_filename = fnfc.filename();
-if (!new_filename) return;
-g_layout_list.load(new_filename);
-//g_layout_list.current_suite(n);
-g_layout_list.update_dialogs();}
-            xywh {0 0 31 20}
-          }
-          MenuItem w_layout_menu_save {
-            label {Save...}
-            callback {// Give the user a file chooser with a suggested name
-  Fl_Native_File_Chooser fnfc;
-  fnfc.title("Save Layout Settings:");
-  fnfc.type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE);
-  fnfc.options(Fl_Native_File_Chooser::SAVEAS_CONFIRM | Fl_Native_File_Chooser::USE_FILTER_EXT);
-  fnfc.filter("FLUID Layouts\\t*.fll\\n");
-  Fl_String filename = g_layout_list.filename_;
-  fnfc.directory(fl_filename_path(filename).c_str());
-  fnfc.preset_file(fl_filename_name(filename).c_str());
-  if (fnfc.show() != 0) return;
-  const char *new_filename = fnfc.filename();
-  if (!new_filename) return;
-  g_layout_list.filename_ = new_filename;
-  g_layout_list.save(new_filename);}
-            xywh {0 0 31 20} divider
-            code0 {\#include <FL/Fl_Native_File_Chooser.H>}
-          }
-          MenuItem w_layout_menu_delete {
-            label Delete
-            callback {// remove the current suite
-
-g_layout_list.remove(g_layout_list.current_suite());
-g_layout_list.update_dialogs();}
-            xywh {0 0 31 20}
-          }
-        }
-        Fl_Box {} {
-          label {Preset:}
-          xywh {25 107 60 20} labelfont 1 labelsize 11 align 24
-        }
-        Fl_Group {} {
-          callback propagate_load open
-          xywh {85 107 235 20} labelsize 11
-        } {
-          Fl_Button {preset_choice[0]} {
-            label Application
-            user_data 0 user_data_type long
-            callback edit_layout_preset_cb
-            xywh {85 107 78 20} type Radio value 1 selection_color 45 labelsize 11 compact 1
-          }
-          Fl_Button {preset_choice[1]} {
-            label Dialog
-            user_data 1 user_data_type long
-            callback edit_layout_preset_cb
-            xywh {163 107 79 20} type Radio selection_color 45 labelsize 11 compact 1
-          }
-          Fl_Button {preset_choice[2]} {
-            label Toolbox
-            user_data 2 user_data_type long
-            callback edit_layout_preset_cb
-            xywh {242 107 78 20} type Radio selection_color 45 labelsize 11 compact 1
-          }
-        }
-        Fl_Box {} {
-          label {---- Window ----}
-          xywh {85 132 235 20} labelfont 1 labelsize 11 align 20
-        }
-        Fl_Box {} {
-          label {Margin:}
-          xywh {25 167 60 20} labelsize 11 align 24
-        }
-        Fl_Value_Input {} {
-          label {Left:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->left_window_margin);
-} else {
-  layout->left_window_margin = (int)o->value();
-}}
-          xywh {85 167 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Value_Input {} {
-          label {Top:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->top_window_margin);
-} else {
-  layout->top_window_margin = (int)o->value();
-}}
-          xywh {145 167 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Value_Input {} {
-          label {Right:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->right_window_margin);
-} else {
-  layout->right_window_margin = (int)o->value();
-}}
-          xywh {205 167 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Value_Input {} {
-          label {Bottom:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->bottom_window_margin);
-} else {
-  layout->bottom_window_margin = (int)o->value();
-}}
-          xywh {265 167 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Box {} {
-          label {Grid:}
-          xywh {32 201 53 20} labelsize 11 align 24
-        }
-        Fl_Value_Input {} {
-          label {Horizontal:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->window_grid_x);
-} else {
-  layout->window_grid_x = (int)o->value();
-}}
-          xywh {85 201 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Value_Input {} {
-          label {Vertical:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->window_grid_y);
-} else {
-  layout->window_grid_y = (int)o->value();
-}}
-          xywh {145 201 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Box {} {
-          label {---- Group ----}
-          xywh {85 226 235 20} labelfont 1 labelsize 11 align 20
-        }
-        Fl_Box {} {
-          label {Margin:}
-          xywh {25 261 60 20} labelsize 11 align 24
-        }
-        Fl_Value_Input {} {
-          label {Left:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->left_group_margin);
-} else {
-  layout->left_group_margin = (int)o->value();
-}}
-          xywh {85 261 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Value_Input {} {
-          label {Top:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->top_group_margin);
-} else {
-  layout->top_group_margin = (int)o->value();
-}}
-          xywh {145 261 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Value_Input {} {
-          label {Right:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->right_group_margin);
-} else {
-  layout->right_group_margin = (int)o->value();
-}}
-          xywh {205 261 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Value_Input {} {
-          label {Bottom:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->bottom_group_margin);
-} else {
-  layout->bottom_group_margin = (int)o->value();
-}}
-          xywh {265 261 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Box {} {
-          label {Grid:}
-          xywh {32 295 53 20} labelsize 11 align 24
-        }
-        Fl_Value_Input {} {
-          label {Horizontal:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->group_grid_x);
-} else {
-  layout->group_grid_x = (int)o->value();
-}}
-          xywh {85 295 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Value_Input {} {
-          label {Vertical:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->group_grid_y);
-} else {
-  layout->group_grid_y = (int)o->value();
-}}
-          xywh {145 295 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Box {} {
-          label {---- Tabs ----}
-          xywh {85 320 235 20} labelfont 1 labelsize 11 align 20
-        }
-        Fl_Box {} {
-          label {Margin:}
-          xywh {25 355 60 20} labelsize 11 align 24
-        }
-        Fl_Value_Input {} {
-          label {Top:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->top_tabs_margin);
-} else {
-  layout->top_tabs_margin = (int)o->value();
-}}
-          xywh {85 355 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Value_Input {} {
-          label {Bottom:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->bottom_tabs_margin);
-} else {
-  layout->bottom_tabs_margin = (int)o->value();
-}}
-          xywh {145 355 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Box {} {
-          label {---- Widget ----}
-          xywh {85 380 235 20} labelfont 1 labelsize 11 align 20
-        }
-        Fl_Box {} {
-          label {Horizontal:}
-          xywh {25 415 60 20} labelsize 11 align 24
-        }
-        Fl_Value_Input {} {
-          label {Minimum:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->widget_min_w);
-} else {
-  layout->widget_min_w = (int)o->value();
-}}
-          xywh {85 414 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Value_Input {} {
-          label {Increment:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->widget_inc_w);
-} else {
-  layout->widget_inc_w = (int)o->value();
-}}
-          xywh {145 414 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Value_Input {} {
-          label {Gap:}
-          callback {if (v == LOAD) {
-  o->value((double)layout->widget_gap_x);
-} else {
-  layout->widget_gap_x = (int)o->value();
-}}
-          xywh {205 414 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Box {} {
-          label {Vertical:}
-          xywh {32 440 53 20} labelsize 11 align 24
-        }
-        Fl_Value_Input {} {
-          callback {if (v == LOAD) {
-  o->value((double)layout->widget_min_h);
-} else {
-  layout->widget_min_h = (int)o->value();
-}}
-          xywh {85 440 55 20} labelsize 11 maximum 32767 step 1 textsize 11
-        }
-        Fl_Value_Input {} {
-          callback {if (v == LOAD) {
-  o->value((double)layout->widget_inc_h);
-} else {
-  layout->widget_inc_h = (int)o->value();
-}}
-          xywh {145 440 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Value_Input {} {
-          callback {if (v == LOAD) {
-  o->value((double)layout->widget_gap_y);
-} else {
-  layout->widget_gap_y = (int)o->value();
-}}
-          xywh {205 440 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
-        }
-        Fl_Group {} {
-          label {Label Font:}
-          callback propagate_load open
-          xywh {85 465 201 20} labelsize 11 align 4
-        } {
-          Fl_Choice {} {
-            callback {if (v == LOAD) {
-  o->value(layout->labelfont+1);
-} else {
-  layout->labelfont = (int)o->value()-1;
-}} open
-            tooltip {The style of the label text.} xywh {85 465 150 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
-            code0 {extern Fl_Menu_Item fontmenu_w_default[];}
-            code1 {o->menu(fontmenu_w_default);}
-          } {}
-          Fl_Value_Input {} {
-            callback {if (v == LOAD) {
-  o->value(layout->labelsize);
-} else {
-  layout->labelsize = (int)o->value();
-}}
-            tooltip {The size of the label text.} xywh {235 465 50 20} labelsize 11 minimum 1 maximum 1000 step 1 value 14 textsize 11
-          }
-        }
-        Fl_Group {} {
-          label {Text Font:}
-          callback propagate_load open
-          xywh {85 490 200 20} labelsize 11 align 4
-        } {
-          Fl_Choice {} {
-            callback {if (v == LOAD) {
-  o->value(layout->textfont+1);
-} else {
-  layout->textfont = (int)o->value()-1;
-}} open
-            tooltip {The value text style.} xywh {85 490 150 20} box DOWN_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11
-            code0 {extern Fl_Menu_Item fontmenu_w_default[];}
-            code1 {o->menu(fontmenu_w_default);}
-          } {}
-          Fl_Value_Input {} {
-            callback {if (v == LOAD) {
-  o->value(layout->textsize);
-} else {
-  layout->textsize = (int)o->value();
-}}
-            tooltip {The value text size.} xywh {235 490 50 20} labelsize 11 maximum 1000 step 1 value 14 textsize 11
-          }
-        }
-        Fl_Box {} {
-          xywh {325 535 5 5} hide resizable
-        }
-      }
-      Fl_Group w_settings_shell_tab {
-        label Shell
-        callback propagate_load open
-        scale_image {36 24} image {icons/shell_64.png} compress_image 1 xywh {10 60 320 480} labelsize 11 hide
-      } {
-        Fl_Group {} {
-          callback propagate_load open
-          xywh {10 90 320 132}
-        } {
-          Fl_Browser w_settings_shell_list {
-            label {Shell
-command
-list:}
-            callback {if (v == LOAD) {
-  // load from g_shell_config
-  if (g_shell_config) {
-    o->clear();
-    w_settings_shell_list_selected = 0;
-    for (int i=0; i<g_shell_config->list_size; i++) {
-      Fd_Shell_Command *cmd = g_shell_config->list[i];
-      o->add(cmd->name.c_str());
-      if (cmd->storage == FD_STORE_USER)
-        o->icon(i+1, w_settings_shell_fd_user->image());
-      else if (cmd->storage == FD_STORE_PROJECT)
-        o->icon(i+1, w_settings_shell_fd_project->image());
-    }
-  }
-} else {
-//  int prev_selected = w_settings_shell_list_selected;
-  w_settings_shell_list_selected = 0;
-  int selected = w_settings_shell_list->value();
-  if (selected) {
-    if (w_settings_shell_list->selected(selected))
-      w_settings_shell_list_selected = selected;
-  }
-  w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
-  w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
-}}
-            xywh {100 90 220 110} type Multi labelfont 1 labelsize 11 align 4 textsize 13 resizable
-          }
-          Fl_Group w_settings_shell_toolbox {
-            callback {if (v==LOAD) {
-  propagate_load(o, v);
-}} open
-            xywh {100 200 220 22}
-          } {
-            Fl_Button {} {
-              label {+}
-              callback {if (v != LOAD) {
-  int selected = w_settings_shell_list_selected;
-  Fd_Shell_Command *cmd = new Fd_Shell_Command("new shell command");
-  g_shell_config->insert(selected, cmd);
-  w_settings_shell_list->insert(selected+1, cmd->name.c_str());
-  w_settings_shell_list->deselect();
-  w_settings_shell_list->value(selected+1);
-  if (cmd->storage == FD_STORE_USER)
-    w_settings_shell_list->icon(selected+1, w_settings_shell_fd_user->image());
-  else if (cmd->storage == FD_STORE_PROJECT)
-    w_settings_shell_list->icon(selected+1, w_settings_shell_fd_project->image());
-  w_settings_shell_list->do_callback();
-  w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
-  w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
-  g_shell_config->rebuild_shell_menu();
-}}
-              tooltip {insert a new shell command into the list after the selected command} xywh {100 200 24 22} labelfont 1 labelsize 11
-            }
-            Fl_Button w_settings_shell_dup {
-              label {++}
-              callback {int selected = w_settings_shell_list_selected;
-if (v==LOAD) {
-  if (selected) {
-    o->activate();
-  } else {
-    o->deactivate();
-  }
-} else {
-  if (!selected) return;
-  Fd_Shell_Command *cmd = new Fd_Shell_Command(g_shell_config->list[selected-1]);
-  g_shell_config->insert(selected, cmd);
-  w_settings_shell_list->insert(selected+1, cmd->name.c_str());
-  w_settings_shell_list->deselect();
-  w_settings_shell_list->deselect();
-  w_settings_shell_list->value(selected+1);
-  if (cmd->storage == FD_STORE_USER)
-    w_settings_shell_list->icon(selected+1, w_settings_shell_fd_user->image());
-  else if (cmd->storage == FD_STORE_PROJECT)
-    w_settings_shell_list->icon(selected+1, w_settings_shell_fd_project->image());
-  w_settings_shell_list->do_callback();
-  w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
-  w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
-  g_shell_config->rebuild_shell_menu();
-}}
-              tooltip {duplicate the selected shell command and insert it into the list} xywh {124 200 24 22} labelfont 1 labelsize 11 deactivate
-            }
-            Fl_Button w_settings_shell_remove {
-              label DEL
-              callback {int selected = w_settings_shell_list_selected;
-if (v==LOAD) {
-  if (selected) {
-    o->activate();
-  } else {
-    o->deactivate();
-  }
-} else {
-  if (!selected) return;
-  int ret = fl_choice("Delete the shell command\\n\\"%s\\"?\\n\\nThis can not be undone.",
-    "Delete", "Cancel", NULL, g_shell_config->list[selected-1]->name.c_str());
-  if (ret==1) return;
-  g_shell_config->remove(selected-1);
-  w_settings_shell_list->remove(selected);
-  if (selected <= w_settings_shell_list->size())
-    w_settings_shell_list->value(selected);
-  else
-    w_settings_shell_list->value(0);
-  w_settings_shell_list->do_callback();
-  w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
-  w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
-  g_shell_config->rebuild_shell_menu();
-}}
-              tooltip {remove the selected shell command - this can not be undone} xywh {148 200 24 22} labelsize 10 deactivate
-            }
-            Fl_Menu_Button w_settings_shell_menu {open
-              xywh {172 200 24 22} labelsize 11 textsize 11
-            } {
-              MenuItem {} {
-                label {Import...}
-                callback {if (v != LOAD)
-  Fd_Shell_Command_List::import_from_file();}
-                tooltip {import shell commands from an external file} xywh {90 90 100 20} labelsize 11
-              }
-              MenuItem {} {
-                label {Export selected...}
-                callback {if (v != LOAD)
-  Fd_Shell_Command_List::export_selected();}
-                tooltip {export selected shell commands to an external file} xywh {10 10 100 20} labelsize 11
-              }
-              MenuItem {} {
-                label {Example Scripts:}
-                xywh {20 20 100 20} labelfont 1 labelsize 10 hide deactivate
-              }
-              MenuItem {} {
-                label {Compile with fltk-config}
-                xywh {30 30 100 20} labelsize 11 hide
-              }
-              MenuItem {} {
-                label {Build and run}
-                xywh {40 40 100 20} labelsize 11 hide
-              }
-              MenuItem {} {
-                label {Build with Xcode on macOS}
-                xywh {50 50 100 20} labelsize 11 hide
-              }
-              MenuItem {} {
-                label {Build with CMake}
-                xywh {60 60 100 20} labelsize 11 hide
-              }
-            }
-            Fl_Box {} {
-              xywh {253 200 13 22} hide resizable
-            }
-            Fl_Button {} {
-              label T
-              callback {if (v!=LOAD) show_terminal_window();}
-              tooltip {show terminal window} xywh {246 200 24 22} labelfont 5 labelsize 11
-            }
-            Fl_Button w_settings_shell_play {
-              label Run
-              callback {int selected = w_settings_shell_list_selected;
-if (v==LOAD) {
-  if (selected) {
-    o->activate();
-  } else {
-    o->deactivate();
-  }
-} else {
-  if (!selected) return;
-  Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-  cmd->run();
-}}
-              tooltip {run the selected shell command} xywh {270 200 50 22} labelsize 11 deactivate
-            }
-          }
-        }
-        Fl_Group w_settings_shell_cmd {
-          callback {if (v==LOAD) {
-  int selected = w_settings_shell_list_selected;
-  if (selected) {
-    o->activate();
-  } else {
-    o->deactivate();
-  }
-  propagate_load(o, v);
-}} open
-          xywh {10 235 320 291} resizable
-        } {
-          Fl_Input {} {
-            label {Name:}
-            callback {int selected = w_settings_shell_list_selected;
-if (v == LOAD) {
-  if (selected) {
-    o->value(g_shell_config->list[selected-1]->name.c_str());
-  } else {
-    o->value("");
-  }
-} else {
-  if (selected) {
-    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-    cmd->name = o->value();
-    w_settings_shell_list->text(selected, o->value());
-    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-  }
-}}
-            tooltip {file the shell command under this name in the shell command list} xywh {100 246 220 20} labelfont 1 labelsize 11 when 13 textfont 4 textsize 11
-          }
-          Fl_Input {} {
-            label {Menu Label:}
-            callback {int selected = w_settings_shell_list_selected;
-if (v == LOAD) {
-  if (selected) {
-    o->value(g_shell_config->list[selected-1]->label.c_str());
-  } else {
-    o->value("");
-  }
-} else {
-  if (selected) {
-    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-    cmd->label = o->value();
-    cmd->update_shell_menu();
-    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-  }
-}}
-            tooltip {label text for the Shell menu in the main menu bar} xywh {100 272 220 20} labelfont 1 labelsize 11 textfont 4 textsize 11
-          }
-          Fl_Group {} {
-            callback {propagate_load(o, v);} open
-            xywh {100 297 140 71}
-          } {
-            Fl_Button {} {
-              label Shortcut
-              callback {int selected = w_settings_shell_list_selected;
-if (v == LOAD) {
-  if (selected) {
-    o->value(g_shell_config->list[selected-1]->shortcut);
-    //o->default_value(o->value());
-  } else {
-    o->value(0);
-  }
-} else {
-  if (selected) {
-    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-    cmd->shortcut = o->value();
-    cmd->update_shell_menu();
-    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-  }
-}}
-              tooltip {an optional keyboard shortcut to run this shell command} xywh {100 297 130 20} labelsize 11 align 16
-              code0 {\#include <FL/Fl_Shortcut_Button.H>}
-              class Fl_Shortcut_Button
-            }
-            Fl_Choice {} {
-              label {Store:}
-              callback {int selected = w_settings_shell_list_selected;
-if (v == LOAD) {
-  if (selected) {
-    Fd_Tool_Store ts = g_shell_config->list[selected-1]->storage;
-    o->value(o->find_item_with_argument((long)ts));
-  } else {
-    o->value(o->find_item_with_argument((long)FD_STORE_USER));
-  }
-} else {
-  if (selected) {
-    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-    Fd_Tool_Store ts = (Fd_Tool_Store)(o->mvalue()->argument());
-    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-    cmd->storage = ts;
-    //w_settings_shell_list->text(selected, cmd->name.c_str());
-    if (cmd->storage == FD_STORE_USER)
-      w_settings_shell_list->icon(selected, w_settings_shell_fd_user->image());
-    else if (cmd->storage == FD_STORE_PROJECT)
-      w_settings_shell_list->icon(selected, w_settings_shell_fd_project->image());
-    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-  }
-}} open
-              tooltip {store this shell command as a user setting or save it with the .fl project file} xywh {100 322 130 20} down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11
-            } {
-              MenuItem {} {
-                label {@fd_user User Setting}
-                user_data FD_STORE_USER user_data_type long
-                xywh {0 0 100 20} labelsize 11
-              }
-              MenuItem {} {
-                label {@fd_project Project File}
-                user_data FD_STORE_PROJECT user_data_type long
-                xywh {0 0 100 20} labelsize 11
-              }
-            }
-            Fl_Choice {} {
-              label {Condition:}
-              callback {int selected = w_settings_shell_list_selected;
-if (v == LOAD) {
-  if (selected) {
-    int cond = g_shell_config->list[selected-1]->condition;
-    o->value(o->find_item_with_argument(cond));
-  } else {
-    o->value(o->find_item_with_argument(0));
-  }
-} else {
-  if (selected) {
-    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-    int cond = (int)(o->mvalue()->argument());
-    cmd->condition = cond;
-    g_shell_config->rebuild_shell_menu();
-    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-  }
-}} open
-              tooltip {add this command to the main menu bar only if this condition is true} xywh {100 348 130 20} down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11
-            } {
-              MenuItem {} {
-                label {all platforms}
-                user_data {Fd_Shell_Command::ALWAYS} user_data_type long
-                xywh {0 0 100 20} labelsize 11
-              }
-              MenuItem {} {
-                label {Windows only}
-                user_data {Fd_Shell_Command::WIN_ONLY} user_data_type long
-                xywh {0 0 100 20} labelsize 11
-              }
-              MenuItem {} {
-                label {Linux only}
-                user_data {Fd_Shell_Command::UX_ONLY} user_data_type long
-                xywh {0 0 100 20} labelsize 11
-              }
-              MenuItem {} {
-                label {macOS only}
-                user_data {Fd_Shell_Command::MAC_ONLY} user_data_type long
-                xywh {0 0 100 20} labelsize 11
-              }
-              MenuItem {} {
-                label {Linux and macOS}
-                user_data {Fd_Shell_Command::MAC_AND_UX_ONLY} user_data_type long
-                xywh {0 0 100 20} labelsize 11
-              }
-              MenuItem {} {
-                label {don't use}
-                user_data {Fd_Shell_Command::NEVER} user_data_type long
-                xywh {0 0 100 20} labelsize 11
-              }
-            }
-            Fl_Box {} {
-              xywh {230 297 10 71} hide resizable
-            }
-          }
-          Fl_Input {} {
-            label {Label:}
-            callback {if (v == LOAD) {
-//  o->value(g_shell_command.c_str());
-} else {
-//  g_shell_command = o->value();
-}}
-            xywh {230 348 90 20} labelfont 1 labelsize 11 textfont 4 textsize 11 hide
-          }
-          Fl_Group {} {
-            callback propagate_load open
-            xywh {100 373 220 80} resizable
-          } {
-            Fl_Text_Editor w_settings_shell_command {
-              label {Shell script:}
-              callback {int selected = w_settings_shell_list_selected;
-if (v == LOAD) {
-  if (selected) {
-    o->buffer()->text(g_shell_config->list[selected-1]->command.c_str());
-  } else {
-    o->buffer()->text("");
-  }
-} else {
-  if (selected) {
-    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-    cmd->command = o->buffer()->text();
-    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-  }
-}}
-              xywh {100 373 196 80} labelfont 1 labelsize 11 align 4 textfont 4 textsize 12 resizable
-              code0 {o->buffer(new Fl_Text_Buffer);}
-            }
-            Fl_Group {} {open
-              xywh {296 373 24 80}
-            } {
-              Fl_Menu_Button w_settings_shell_text_macros {
-                callback {const Fl_Menu_Item *mi = o->mvalue();
-if (mi) {
-  char buffer[256];
-  fl_strlcpy(buffer, mi->label(), 255);
-  int n = (int)strlen(buffer)-1;
-  if (buffer[n]=='@') buffer[n] = 0;
-  char *word = buffer;
-  if (word[0]=='@') word++;
-  if (w_settings_shell_command->buffer()->selected()) {
-    int start = 0, end = 0;
-    w_settings_shell_command->buffer()->selection_position(&start, &end);
-    w_settings_shell_command->buffer()->replace(start, end, word);
-  } else {
-    int pos = w_settings_shell_command->insert_position();
-    w_settings_shell_command->buffer()->insert(pos, word);
-  }
-  w_settings_shell_command->do_callback(w_settings_shell_command, (void*)NULL);
-}} open
-                tooltip {a list of text replacements available for the shell script} xywh {296 373 24 22} labelsize 11 textsize 11
-              } {
-                MenuItem {} {
-                  label {@@BASENAME@@}
-                  xywh {80 80 100 20} labelfont 4 labelsize 11
-                }
-                MenuItem {} {
-                  label {@@PROJECTFILE_PATH@@}
-                  xywh {0 0 100 20} labelfont 4 labelsize 11
-                }
-                MenuItem {} {
-                  label {@@PROJECTFILE_NAME@@}
-                  xywh {10 10 100 20} labelfont 4 labelsize 11
-                }
-                MenuItem {} {
-                  label {@@CODEFILE_PATH@@}
-                  xywh {20 20 100 20} labelfont 4 labelsize 11
-                }
-                MenuItem {} {
-                  label {@@CODEFILE_NAME@@}
-                  xywh {30 30 100 20} labelfont 4 labelsize 11
-                }
-                MenuItem {} {
-                  label {@@HEADERFILE_PATH@@}
-                  xywh {40 40 100 20} labelfont 4 labelsize 11
-                }
-                MenuItem {} {
-                  label {@@HEADERFILE_NAME@@}
-                  xywh {50 50 100 20} labelfont 4 labelsize 11
-                }
-                MenuItem {} {
-                  label {@@TEXTFILE_PATH@@}
-                  xywh {60 60 100 20} labelfont 4 labelsize 11
-                }
-                MenuItem {} {
-                  label {@@TEXTFILE_NAME@@}
-                  xywh {70 70 100 20} labelfont 4 labelsize 11
-                }
-                MenuItem {} {
-                  label {@@FLTK_CONFIG@@}
-                  comment {Not yet implemented}
-                  xywh {70 70 100 20} labelfont 4 labelsize 11 hide
-                }
-                MenuItem {} {
-                  label {@@TMPDIR@@}
-                  xywh {70 70 100 20} labelfont 4 labelsize 11
-                }
-              }
-              Fl_Button {} {
-                label {@+1fd_zoom}
-                callback {if (!script_panel) make_script_panel();
-script_input->buffer()->text(w_settings_shell_command->buffer()->text());
-script_panel->show();
-
-for (;;) {
-  Fl_Widget* w = Fl::readqueue();
-  if (w == script_panel_cancel) goto BREAK2;
-  else if (w == script_panel_ok) break;
-  else if (!w) Fl::wait();
-}
-
-w_settings_shell_command->buffer()->text(script_input->buffer()->text());
-w_settings_shell_command->do_callback();
-BREAK2:
-script_panel->hide();}
-                tooltip {open the big code editor} xywh {296 395 24 22} labelsize 11
-              }
-              Fl_Box {} {
-                xywh {296 417 24 10} hide resizable
-              }
-            }
-          }
-          Fl_Check_Button {} {
-            label {save .fl project file}
-            callback {int selected = w_settings_shell_list_selected;
-if (v == LOAD) {
-  if (selected) {
-    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_PROJECT);
-  } else {
-    o->value(0);
-  }
-} else {
-  if (selected) {
-    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-    int v = o->value();
-    if (v) {
-      cmd->flags |= Fd_Shell_Command::SAVE_PROJECT;
-    } else {
-      cmd->flags &= ~Fd_Shell_Command::SAVE_PROJECT;
-    }
-    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-  }
-}}
-            tooltip {save the project to the .fl file before running the command} xywh {100 458 110 20} down_box DOWN_BOX labelsize 11
-          }
-          Fl_Check_Button {} {
-            label {save source code}
-            callback {int selected = w_settings_shell_list_selected;
-if (v == LOAD) {
-  if (selected) {
-    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_SOURCECODE);
-  } else {
-    o->value(0);
-  }
-} else {
-  if (selected) {
-    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-    int v = o->value();
-    if (v) {
-      cmd->flags |= Fd_Shell_Command::SAVE_SOURCECODE;
-    } else {
-      cmd->flags &= ~Fd_Shell_Command::SAVE_SOURCECODE;
-    }
-    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-  }
-}}
-            tooltip {generate the source code and header file before running the command} xywh {100 478 110 19} down_box DOWN_BOX labelsize 11
-          }
-          Fl_Check_Button {} {
-            label {save i18n strings}
-            callback {int selected = w_settings_shell_list_selected;
-if (v == LOAD) {
-  if (selected) {
-    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_STRINGS);
-  } else {
-    o->value(0);
-  }
-} else {
-  if (selected) {
-    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-    int v = o->value();
-    if (v) {
-      cmd->flags |= Fd_Shell_Command::SAVE_STRINGS;
-    } else {
-      cmd->flags &= ~Fd_Shell_Command::SAVE_STRINGS;
-    }
-    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-  }
-}}
-            tooltip {save the internationalisation strings before running the command} xywh {100 498 110 20} down_box DOWN_BOX labelsize 11
-          }
-          Fl_Check_Button {} {
-            label {show terminal}
-            callback {int selected = w_settings_shell_list_selected;
-if (v == LOAD) {
-  if (selected) {
-    o->value(!(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::DONT_SHOW_TERMINAL));
-  } else {
-    o->value(0);
-  }
-} else {
-  if (selected) {
-    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-    int v = o->value();
-    if (!v) {
-      cmd->flags |= Fd_Shell_Command::DONT_SHOW_TERMINAL;
-    } else {
-      cmd->flags &= ~Fd_Shell_Command::DONT_SHOW_TERMINAL;
-    }
-    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-  }
-}}
-            tooltip {show the terminal window when launching this script} xywh {214 458 106 20} down_box DOWN_BOX labelsize 11
-          }
-          Fl_Check_Button {} {
-            label {clear terminal}
-            callback {int selected = w_settings_shell_list_selected;
-if (v == LOAD) {
-  if (selected) {
-    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::CLEAR_TERMINAL);
-  } else {
-    o->value(0);
-  }
-} else {
-  if (selected) {
-    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-    int v = o->value();
-    if (v) {
-      cmd->flags |= Fd_Shell_Command::CLEAR_TERMINAL;
-    } else {
-      cmd->flags &= ~Fd_Shell_Command::CLEAR_TERMINAL;
-    }
-    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-  }
-}}
-            tooltip {clear the teminal window before running this script} xywh {214 478 106 19} down_box DOWN_BOX labelsize 11
-          }
-          Fl_Check_Button {} {
-            label {clear term history}
-            callback {int selected = w_settings_shell_list_selected;
-if (v == LOAD) {
-  if (selected) {
-    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::CLEAR_HISTORY);
-  } else {
-    o->value(0);
-  }
-} else {
-  if (selected) {
-    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
-    int v = o->value();
-    if (v) {
-      cmd->flags |= Fd_Shell_Command::CLEAR_HISTORY;
-    } else {
-      cmd->flags &= ~Fd_Shell_Command::CLEAR_HISTORY;
-    }
-    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
-  }
-}}
-            tooltip {clear the teminal history in the terminal window} xywh {214 498 106 19} down_box DOWN_BOX labelsize 11
-          }
-        }
-        Fl_Box w_settings_shell_fd_project {
-          image {pixmaps/fd_project.png} compress_image 1 bind_image 1 bind_deimage 1 xywh {20 70 16 15} labelsize 11 hide deactivate
-          code0 {o->image()->scale(16, 16);}
-        }
-        Fl_Box w_settings_shell_fd_user {
-          image {pixmaps/fd_user.png} compress_image 1 bind_image 1 bind_deimage 1 xywh {20 70 16 15} labelsize 11 hide deactivate
-          code0 {o->image()->scale(16, 16);}
-        }
-      }
-      Fl_Group w_settings_i18n_tab {
-        label Locale
-        callback {propagate_load(o, v);} open
-        scale_image {36 24} image {icons/language_64.png} compress_image 1 xywh {10 60 320 480} labelsize 11 hide
-      } {
-        Fl_Group {} {
-          callback propagate_load open
-          xywh {100 78 170 20}
-        } {
-          Fl_Choice i18n_type_chooser {
-            label {i18n Library:}
-            callback i18n_type_cb open
-            tooltip {Type of internationalization to use.} xywh {100 78 160 20} box THIN_UP_BOX down_box BORDER_BOX labelsize 11 textsize 11
-          } {
-            MenuItem {} {
-              label None
-              xywh {0 -11 100 20} labelsize 11
-            }
-            MenuItem {} {
-              label {GNU gettext}
-              xywh {0 -11 100 20} labelsize 11
-            }
-            MenuItem {} {
-              label {POSIX catgets}
-              xywh {0 -11 100 20} labelsize 11
-            }
-          }
-          Fl_Box {} {
-            xywh {260 78 10 20} hide resizable
-          }
-        }
-        Fl_Group i18n_gnu_group {
-          callback {propagate_load(o, v);} open
-          xywh {100 103 220 95}
-        } {
-          Fl_Input i18n_gnu_include_input {
-            label {\#include:}
-            callback {if (v == LOAD) {
-  o->value(g_project.i18n_gnu_include.c_str());
-} else {
-  undo_checkpoint();
-  g_project.i18n_gnu_include = o->value();
-  set_modflag(1);
-}}
-            tooltip {The include file for internationalization.} xywh {100 103 220 20} box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
-          }
-          Fl_Input i18n_gnu_conditional_input {
-            label {Conditional:}
-            callback {if (v == LOAD) {
-  o->value(g_project.i18n_gnu_conditional.c_str());
-} else {
-  undo_checkpoint();
-  g_project.i18n_gnu_conditional = o->value();
-  set_modflag(1);
-}}
-            tooltip {only include the header file if this preprocessor macro is defined, for example FLTK_GETTEXT_FOUND} xywh {100 128 220 20} box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
-          }
-          Fl_Input i18n_gnu_function_input {
-            label {Function:}
-            callback {if (v == LOAD) {
-  o->value(g_project.i18n_gnu_function.c_str());
-} else {
-  undo_checkpoint();
-  g_project.i18n_gnu_function = o->value();
-  set_modflag(1);
-}}
-            tooltip {The function to call to translate labels and tooltips, usually "gettext" or "_"} xywh {100 153 220 20} box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
-          }
-          Fl_Input i18n_gnu_static_function_input {
-            label {Static Function:}
-            callback {if (v == LOAD) {
-  o->value(g_project.i18n_gnu_static_function.c_str());
-} else {
-  undo_checkpoint();
-  g_project.i18n_gnu_static_function = o->value();
-  set_modflag(1);
-}}
-            tooltip {function to call to translate static text, The function to call to internationalize labels and tooltips, usually "gettext_noop" or "N_"} xywh {100 178 220 20} box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
-          }
-        }
-        Fl_Group i18n_posix_group {
-          callback {propagate_load(o, v);} open
-          xywh {100 103 220 95} hide
-        } {
-          Fl_Input i18n_pos_include_input {
-            label {\#include:}
-            callback {if (v == LOAD) {
-  o->value(g_project.i18n_pos_include.c_str());
-} else {
-  undo_checkpoint();
-  g_project.i18n_pos_include = o->value();
-  set_modflag(1);
-}}
-            tooltip {The include file for internationalization.} xywh {100 103 220 20} box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
-          }
-          Fl_Input i18n_pos_conditional_input {
-            label {Conditional:}
-            callback {if (v == LOAD) {
-  o->value(g_project.i18n_pos_conditional.c_str());
-} else {
-  undo_checkpoint();
-  g_project.i18n_pos_conditional = o->value();
-  set_modflag(1);
-}}
-            tooltip {only include the header file if this preprocessor macro is defined, for example FLTK_GETTEXT_FOUND} xywh {100 128 220 20} box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
-          }
-          Fl_Input i18n_pos_file_input {
-            label {File:}
-            callback {if (v == LOAD) {
-  o->value(g_project.i18n_pos_file.c_str());
-} else {
-  undo_checkpoint();
-  g_project.i18n_pos_file = o->value();
-  set_modflag(1);
-}}
-            tooltip {The name of the message catalog.} xywh {100 153 220 20} box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
-          }
-          Fl_Group {} {
-            callback {propagate_load(o, v);} open
-            xywh {100 178 90 20}
-          } {
-            Fl_Input i18n_pos_set_input {
-              label {Set:}
-              callback {if (v == LOAD) {
-  o->value(g_project.i18n_pos_set.c_str());
-} else {
-  undo_checkpoint();
-  g_project.i18n_pos_set = o->value();
-  set_modflag(1);
-}}
-              tooltip {The message set number.} xywh {100 178 80 20} type Int box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
-            }
-            Fl_Box {} {
-              xywh {180 178 10 20} hide resizable
-            }
-          }
-        }
-        Fl_Box {} {
-          xywh {100 530 220 10} hide resizable
-        }
-      }
-      Fl_Group w_settings_user_tab {
-        label User
-        callback {propagate_load(o, v);} open
-        scale_image {36 24} image {icons/user_circle_64.png} compress_image 1 xywh {10 60 320 480} labelsize 11 hide
-        code0 {\#include <FL/fl_show_colormap.H>}
-      } {
-        Fl_Box {} {
-          label {---- Widget Browser ----}
-          xywh {100 84 220 20} labelfont 1 labelsize 11 align 20
-        }
-        Fl_Group {} {
-          callback propagate_load open
-          xywh {100 112 220 20}
-        } {
-          Fl_Choice {} {
-            label {Label:}
-            user_data {&Widget_Browser::label_font}
-            callback cb_Comments open
-            xywh {100 112 151 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
-            code0 {extern Fl_Menu_Item fontmenu[];}
-            code1 {o->menu(fontmenu);}
-          } {}
-          Fl_Button {} {
-            user_data {&Widget_Browser::label_color}
-            callback cb_Color_Chip
-            xywh {251 112 51 20} labelsize 11
-          }
-          Fl_Menu_Button {} {
-            user_data {&Widget_Browser::label_color}
-            callback cb_Color_Choice open
-            xywh {302 112 18 20}
-            code0 {extern Fl_Menu_Item colormenu[];}
-            code1 {o->menu(colormenu);}
-          } {}
-        }
-        Fl_Group {} {
-          callback propagate_load open
-          xywh {100 137 220 20}
-        } {
-          Fl_Choice {} {
-            label {Class:}
-            user_data {&Widget_Browser::class_font}
-            callback cb_Comments open
-            xywh {100 137 151 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
-            code0 {extern Fl_Menu_Item fontmenu[];}
-            code1 {o->menu(fontmenu);}
-          } {}
-          Fl_Button {} {
-            user_data {&Widget_Browser::class_color}
-            callback cb_Color_Chip
-            xywh {251 137 51 20} labelsize 11
-          }
-          Fl_Menu_Button {} {
-            user_data {&Widget_Browser::class_color}
-            callback cb_Color_Choice open
-            xywh {302 137 18 20}
-            code0 {extern Fl_Menu_Item colormenu[];}
-            code1 {o->menu(colormenu);}
-          } {}
-        }
-        Fl_Group {} {
-          callback propagate_load open
-          xywh {100 162 220 20}
-        } {
-          Fl_Choice {} {
-            label {Function:}
-            user_data {&Widget_Browser::func_font}
-            callback cb_Comments open
-            xywh {100 162 151 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
-            code0 {extern Fl_Menu_Item fontmenu[];}
-            code1 {o->menu(fontmenu);}
-          } {}
-          Fl_Button {} {
-            user_data {&Widget_Browser::func_color}
-            callback cb_Color_Chip
-            xywh {251 162 51 20} labelsize 11
-          }
-          Fl_Menu_Button {} {
-            user_data {&Widget_Browser::func_color}
-            callback cb_Color_Choice open
-            xywh {302 162 18 20}
-            code0 {extern Fl_Menu_Item colormenu[];}
-            code1 {o->menu(colormenu);}
-          } {}
-        }
-        Fl_Group {} {
-          callback propagate_load open
-          xywh {100 187 220 20}
-        } {
-          Fl_Choice {} {
-            label {Name:}
-            user_data {&Widget_Browser::name_font}
-            callback cb_Comments open
-            xywh {100 187 151 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
-            code0 {extern Fl_Menu_Item fontmenu[];}
-            code1 {o->menu(fontmenu);}
-          } {}
-          Fl_Button {} {
-            user_data {&Widget_Browser::name_color}
-            callback cb_Color_Chip
-            xywh {251 187 51 20} labelsize 11
-          }
-          Fl_Menu_Button {} {
-            user_data {&Widget_Browser::name_color}
-            callback cb_Color_Choice open
-            xywh {302 187 18 20}
-            code0 {extern Fl_Menu_Item colormenu[];}
-            code1 {o->menu(colormenu);}
-          } {}
-        }
-        Fl_Group {} {
-          callback propagate_load open
-          xywh {100 212 220 20}
-        } {
-          Fl_Choice {} {
-            label {Code:}
-            user_data {&Widget_Browser::code_font}
-            callback cb_Comments open
-            xywh {100 212 151 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
-            code0 {extern Fl_Menu_Item fontmenu[];}
-            code1 {o->menu(fontmenu);}
-          } {}
-          Fl_Button {} {
-            user_data {&Widget_Browser::code_color}
-            callback cb_Color_Chip
-            xywh {251 212 51 20} labelsize 11
-          }
-          Fl_Menu_Button {} {
-            user_data {&Widget_Browser::code_color}
-            callback cb_Color_Choice open
-            xywh {302 212 18 20}
-            code0 {extern Fl_Menu_Item colormenu[];}
-            code1 {o->menu(colormenu);}
-          } {}
-        }
-        Fl_Group {} {
-          callback propagate_load open
-          xywh {100 237 220 20}
-        } {
-          Fl_Choice {} {
-            label {Comments:}
-            user_data {&Widget_Browser::comment_font}
-            callback cb_Comments open
-            xywh {100 237 151 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
-            code0 {extern Fl_Menu_Item fontmenu[];}
-            code1 {o->menu(fontmenu);}
-          } {}
-          Fl_Button {} {
-            user_data {&Widget_Browser::comment_color}
-            callback cb_Color_Chip
-            xywh {251 237 51 20} labelsize 11
-          }
-          Fl_Menu_Button {} {
-            user_data {&Widget_Browser::comment_color}
-            callback cb_Color_Choice open
-            xywh {302 237 18 20}
-            code0 {extern Fl_Menu_Item colormenu[];}
-            code1 {o->menu(colormenu);}
-          } {}
-        }
-      }
-    }
-    Fl_Group {} {open
-      xywh {10 550 320 20}
-    } {
-      Fl_Button {} {
-        label Close
-        callback {if (g_shell_config)
-  g_shell_config->write(fluid_prefs, FD_STORE_USER);
-g_layout_list.write(fluid_prefs, FD_STORE_USER);
-settings_window->hide();}
-        tooltip {Close this dialog.} xywh {230 550 100 20} labelsize 11
-      }
-      Fl_Box {} {
-        xywh {220 550 10 20} hide resizable
-      }
-    }
-  }
-  code {w_settings_tabs->do_callback(w_settings_tabs, LOAD);} {}
-}
-
-Function {make_shell_window()} {open
-} {
-  Fl_Window shell_run_window {
-    label {Shell Command Output} open
-    xywh {769 584 555 430} type Double align 80 resizable visible
-  } {
-    Fl_Terminal shell_run_terminal {
-      xywh {10 10 535 375} resizable
-      code0 {shell_run_terminal->ansi(1);}
-      code1 {shell_run_terminal->history_lines(1000);}
-    }
-    Fl_Group {} {open
-      xywh {10 395 535 25}
-    } {
-      Fl_Button {} {
-        label Clear
-        callback {// clear screen, clear scrollback, home cursor
-shell_run_terminal->append("\\033[2J\\033[3J\\033[H");}
-        xywh {10 395 94 25}
-      }
-      Fl_Box {} {
-        xywh {104 395 341 25} hide resizable
-      }
-      Fl_Return_Button shell_run_button {
-        label Close
-        callback {Fl_Preferences pos(fluid_prefs, "shell_run_Window_pos");
-pos.set("x", shell_run_window->x());
-pos.set("y", shell_run_window->y());
-pos.set("w", shell_run_window->w());
-pos.set("h", shell_run_window->h());
-shell_run_window->hide();}
-        xywh {445 395 100 25}
-      }
-    }
-  }
-}
-
-decl {Fl_Menu_Item *w_layout_menu_storage[4];} {private global
-}
diff --git fluid/alignment_panel.h fluid/alignment_panel.h
deleted file mode 100644
index 0f10e94..0000000
--- fluid/alignment_panel.h
+++ /dev/null
@@ -1,141 +0,0 @@
-//
-// Setting and shell dialogs for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 1998-2023 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
-//
-// Please see the following page on how to report bugs and issues:
-//
-//     https://www.fltk.org/bugs.php
-//
-
-// generated by Fast Light User Interface Designer (fluid) version 1.0400
-
-#ifndef alignment_panel_h
-#define alignment_panel_h
-#include <FL/Fl.H>
-#include "fluid.h"
-#include "widget_browser.h"
-#include "Fd_Snap_Action.h"
-#include "shell_command.h"
-#include <FL/Fl_Text_Buffer.H>
-#include <FL/Fl_Text_Display.H>
-#include "fluid_filename.h"
-#include <FL/fl_string_functions.h>
-#include <FL/Fl_Scheme_Choice.H>
-/**
- // initialize the scheme from preferences
-*/
-void init_scheme(void);
-extern struct Fl_Menu_Item *dbmanager_item;
-extern void i18n_cb(Fl_Choice *,void *);
-extern void scheme_cb(Fl_Scheme_Choice *, void *);
-extern int w_settings_shell_list_selected;
-#include <FL/Fl_Double_Window.H>
-extern Fl_Double_Window *script_panel;
-#include <FL/Fl_Text_Editor.H>
-extern Fl_Text_Editor *script_input;
-#include <FL/Fl_Group.H>
-extern void propagate_load(Fl_Group*, void*);
-#include <FL/Fl_Return_Button.H>
-extern Fl_Return_Button *script_panel_ok;
-#include <FL/Fl_Button.H>
-extern Fl_Button *script_panel_cancel;
-#include <FL/Fl_Box.H>
-Fl_Double_Window* make_script_panel();
-extern Fl_Double_Window *settings_window;
-#include <FL/Fl_Tabs.H>
-extern Fl_Tabs *w_settings_tabs;
-extern void scheme_cb(Fl_Scheme_Choice*, void*);
-extern Fl_Scheme_Choice *scheme_choice;
-#include <FL/Fl_Check_Button.H>
-extern Fl_Check_Button *tooltips_button;
-extern Fl_Check_Button *completion_button;
-extern Fl_Check_Button *openlast_button;
-extern Fl_Check_Button *prevpos_button;
-extern Fl_Check_Button *show_comments_button;
-#include <FL/Fl_Spinner.H>
-extern Fl_Spinner *recent_spinner;
-extern Fl_Check_Button *use_external_editor_button;
-#include <FL/Fl_Input.H>
-extern Fl_Input *editor_command_input;
-extern void toggle_guides_cb(Fl_Check_Button*, void*);
-extern Fl_Check_Button *guides_button;
-extern void toggle_restricted_cb(Fl_Check_Button*, void*);
-extern Fl_Check_Button *restricted_button;
-extern void toggle_ghosted_outline_cb(Fl_Check_Button*, void*);
-extern Fl_Check_Button *ghosted_outline_button;
-extern Fl_Group *w_settings_project_tab;
-extern Fl_Input *header_file_input;
-extern Fl_Input *code_file_input;
-extern Fl_Check_Button *include_H_from_C_button;
-extern Fl_Check_Button *use_FL_COMMAND_button;
-extern Fl_Check_Button *utf8_in_src_button;
-extern Fl_Check_Button *avoid_early_includes_button;
-extern Fl_Check_Button *w_proj_mergeback;
-extern Fl_Group *w_settings_layout_tab;
-#include <FL/Fl_Choice.H>
-extern Fl_Choice *layout_choice;
-#include <FL/Fl_Menu_Button.H>
-extern Fl_Menu_Button *w_layout_menu;
-#include <FL/Fl_Native_File_Chooser.H>
-extern void edit_layout_preset_cb(Fl_Button*, long);
-extern Fl_Button *preset_choice[3];
-#include <FL/Fl_Value_Input.H>
-extern Fl_Menu_Item fontmenu_w_default[];
-extern Fl_Group *w_settings_shell_tab;
-#include <FL/Fl_Browser.H>
-extern Fl_Browser *w_settings_shell_list;
-extern Fl_Group *w_settings_shell_toolbox;
-extern Fl_Button *w_settings_shell_dup;
-extern Fl_Button *w_settings_shell_remove;
-extern Fl_Menu_Button *w_settings_shell_menu;
-extern Fl_Button *w_settings_shell_play;
-extern Fl_Group *w_settings_shell_cmd;
-#include <FL/Fl_Shortcut_Button.H>
-extern Fl_Text_Editor *w_settings_shell_command;
-extern Fl_Menu_Button *w_settings_shell_text_macros;
-extern Fl_Box *w_settings_shell_fd_project;
-extern Fl_Box *w_settings_shell_fd_user;
-extern Fl_Group *w_settings_i18n_tab;
-extern void i18n_type_cb(Fl_Choice*, void*);
-extern Fl_Choice *i18n_type_chooser;
-extern Fl_Group *i18n_gnu_group;
-extern Fl_Input *i18n_gnu_include_input;
-extern Fl_Input *i18n_gnu_conditional_input;
-extern Fl_Input *i18n_gnu_function_input;
-extern Fl_Input *i18n_gnu_static_function_input;
-extern Fl_Group *i18n_posix_group;
-extern Fl_Input *i18n_pos_include_input;
-extern Fl_Input *i18n_pos_conditional_input;
-extern Fl_Input *i18n_pos_file_input;
-#include <FL/Fl_Int_Input.H>
-extern Fl_Int_Input *i18n_pos_set_input;
-#include <FL/fl_show_colormap.H>
-extern Fl_Group *w_settings_user_tab;
-extern Fl_Menu_Item fontmenu[];
-extern Fl_Menu_Item colormenu[];
-Fl_Double_Window* make_settings_window();
-extern Fl_Menu_Item menu_layout_choice[];
-extern Fl_Menu_Item menu_w_layout_menu[];
-#define w_layout_menu_rename (menu_w_layout_menu+0)
-extern Fl_Menu_Item *w_layout_menu_storage[4];
-#define w_layout_menu_load (menu_w_layout_menu+5)
-#define w_layout_menu_save (menu_w_layout_menu+6)
-#define w_layout_menu_delete (menu_w_layout_menu+7)
-extern Fl_Menu_Item menu_w_settings_shell_menu[];
-extern Fl_Menu_Item menu_Store[];
-extern Fl_Menu_Item menu_Condition[];
-extern Fl_Menu_Item menu_w_settings_shell_text_macros[];
-extern Fl_Menu_Item menu_i18n_type_chooser[];
-extern Fl_Double_Window *shell_run_window;
-#include <FL/Fl_Terminal.H>
-extern Fl_Terminal *shell_run_terminal;
-extern Fl_Return_Button *shell_run_button;
-Fl_Double_Window* make_shell_window();
-#endif
diff --git fluid/autodoc.cxx fluid/autodoc.cxx
new file mode 100644
index 0000000..63818d8
--- /dev/null
+++ fluid/autodoc.cxx
@@ -0,0 +1,602 @@
+//
+// Self-generate snapshots of user interface for FLUID documentation.
+//
+// Copyright 2024 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
+//
+// Please see the following page on how to report bugs and issues:
+//
+//     https://www.fltk.org/bugs.php
+//
+
+#ifndef NDEBUG
+
+#include "autodoc.h"
+#include "fluid.h"
+#include "factory.h"
+#include "widget_browser.h"
+#include "widget_panel.h"
+#include "Fl_Widget_Type.h"
+#include "Fl_Window_Type.h"
+#include "function_panel.h"
+#include "settings_panel.h"
+#include "codeview_panel.h"
+
+#include <FL/Enumerations.H>
+#include <FL/fl_draw.H>
+#include <FL/Fl_Image_Surface.H>
+#include <FL/Fl_PNG_Image.H>
+#include <FL/Fl_Menu_Bar.H>
+
+extern Fl_Double_Window *settings_window;
+
+/** \file autodoc.cxx
+
+ \todo Implement a function to snapshot a window including decoration
+    - see: void Fl_Widget_Surface::draw_decorated_window(Fl_Window *win, int win_offset_x, int win_offset_y)
+    - see: void Fl_Widget_Surface::origin(int x, int y)
+    - see: void Fl_Widget_Surface::draw(Fl_Widget* widget, int delta_x, int delta_y)
+    - see: void Fl_Widget_Surface::print_window_part(Fl_Window *win, int x, int y, int w, int h, int delta_x, int delta_y)
+
+ \todo Implement a version that snaps multiple windows in a desktop style situation.
+
+ \todo a version that takes snapshots of a range of menu items
+
+ \todo implement FL_SNAP_TO_GROUP, possibly with a number on how many groups up in the hierarchy
+ */
+
+/** \addtogroup fl_drawings
+ @{
+ */
+
+const int FL_SNAP_TO_WINDOW = 0x7f000000;
+
+static Fl_Box snap_clear_(0, 0, 0, 0);
+Fl_Widget *FL_SNAP_AREA_CLEAR = &snap_clear_;
+
+static inline int fl_min(int a, int b) { return a < b ? a : b; }
+static inline uchar fl_min(uchar a, uchar b) { return a < b ? a : b; }
+static inline int fl_max(int a, int b) { return a > b ? a : b; }
+
+/**
+ Create a rect by providing a margin around a zero size rectangle.
+ \param[in] dx, dy positive integers, move margin up and left
+ \param[in] dr, db move margin to the right and down
+ */
+Fl_Margin::Fl_Margin(int dx, int dy, int dr, int db)
+  : Fl_Rect(-dx, -dy, dx+dr, dy+db)
+{
+}
+
+/**
+ Convert an RGB image into an RGBA image.
+ \param[inout] image pointer to an RGB image, deletes the RGB image, returns the RGBA image
+ \return 0 if the image is now in RGBA format, or -1 if it can't be converted
+ */
+static int convert_RGB_to_RGBA(Fl_RGB_Image *&img) {
+  if (img->d() == 4)
+    return 0;
+  if (img->d() != 3)
+    return -1;
+
+  // Copy pixel data from RGB to RGBA raw data
+  int img_w = img->w();
+  int img_h = img->h();
+  uchar *data = new uchar[img_w * img_h * 4], *dst = data;
+  int ld = img->ld(); if (ld == 0) ld = img_w * 3;
+  int i, j;
+  for (i=0; i<img_h; i++) {
+    const uchar *src = (const uchar*)img->data()[0] + i * ld;
+    for (j=0; j<img_w; j++) {
+      *dst++ = *src++;
+      *dst++ = *src++;
+      *dst++ = *src++;
+      *dst++ = 255;
+    }
+  }
+
+  // Delete the old image
+  delete img;
+  // Create the new image
+  img = new Fl_RGB_Image(data, img_w, img_h, 4);
+  return 0;
+}
+
+/**
+ Blend the left side lines of the alpha channel of an RBGA image to full transparency.
+ \param[in] img must be an RGBA image
+ \param[in] dx number of lines to blend
+ */
+void blend_alpha_left(const Fl_RGB_Image *img, int dx) {
+  if (img->d() != 4)
+    return;
+  if (dx > img->w())
+    return;
+  if (dx > 0) {
+    int max_x = dx, max_y = img->h();
+    int ld = img->ld(); if (ld == 0) ld = img->w() * img->d();
+    float a = 255/max_x;
+    for (int i = 0; i < max_x; i++) {
+      uchar *rgba = (uchar*)img->data()[0] + i * img->d();
+      uchar alpha = static_cast<uchar>(i * a);
+      for (int j = 0; j < max_y; j++) {
+        rgba[3] = fl_min(alpha, rgba[3]);
+        rgba += ld;
+      }
+    }
+  }
+}
+
+/**
+ Blend the top lines of the alpha channel of an RBGA image to full transparency.
+ \param[in] img must be an RGBA image
+ \param[in] dy number of lines to blend
+ */
+void blend_alpha_top(const Fl_RGB_Image *img, int dy) {
+  if (img->d() != 4)
+    return;
+  if (dy  > img->h())
+    return;
+  if (dy > 0) {
+    int max_x = img->w(), max_y = dy;
+    int ld = img->ld(); if (ld == 0) ld = img->w() * img->d();
+    float a = 255/max_y;
+    for (int i = 0; i < max_y; i++) {
+      uchar *rgba = (uchar*)img->data()[0] + i * ld;
+      uchar alpha = static_cast<uchar>(i * a);
+      for (int j = 0; j < max_x; j++) {
+        rgba[3] = fl_min(alpha, rgba[3]);
+        rgba += 4;
+      }
+    }
+  }
+}
+
+/**
+ Blend the right side lines of the alpha channel of an RBGA image to full transparency.
+ \param[in] img must be an RGBA image
+ \param[in] dx number of lines to blend
+ */
+void blend_alpha_right(const Fl_RGB_Image *img, int dx) {
+  if (img->d() != 4)
+    return;
+  if (dx  > img->w())
+    return;
+  if (dx > 0) {
+    int max_x = dx, max_y = img->h();
+    int ld = img->ld(); if (ld == 0) ld = img->w() * img->d();
+    float a = 255/max_x;
+    for (int i = 0; i < max_x; i++) {
+      uchar *rgba = (uchar*)img->data()[0] + (img->w()-i-1) * img->d();
+      uchar alpha = static_cast<uchar>(i * a);
+      for (int j = 0; j < max_y; j++) {
+        rgba[3] = fl_min(alpha, rgba[3]);
+        rgba += ld;
+      }
+    }
+  }
+}
+
+/**
+ Blend the bottom lines of the alpha channel of an RBGA image to full transparency.
+ \param[in] img must be an RGBA image
+ \param[in] dy number of lines to blend
+ */
+void blend_alpha_bottom(const Fl_RGB_Image *img, int dy) {
+  if (img->d() != 4)
+    return;
+  if (dy  > img->h())
+    return;
+  if (dy > 0) {
+    int max_x = img->w(), max_y = dy;
+    int ld = img->ld(); if (ld == 0) ld = img->w() * img->d();
+    float a = 255/max_y;
+    for (int i = 0; i < max_y; i++) {
+      uchar *rgba = (uchar*)img->data()[0] + (img->h()-i-1) * ld;
+      uchar alpha = static_cast<uchar>(i * a);
+      for (int j = 0; j < max_x; j++) {
+        rgba[3] = fl_min(alpha, rgba[3]);
+        rgba += 4;
+      }
+    }
+  }
+}
+
+/**
+ Take a snapshot of a number of widgets and save it as a png image.
+
+ Draw a rectangular snapshot that fits around all widgets inside a window.
+ All widgets must be inside the same window. It's up to the caller to ensure
+ that widgets are visible. This includes children of `Fl_Tabs`.
+
+ Outside labels of widgets are not taken into account, but a `frame` can be
+ provided to grow the snapshot rectangle. Setting individual parameters of the
+ frame to `FL_SNAP_TO_WINDOW` will extend the snapshot to the borders of the
+ top level window.
+
+ Another `blend` frame can be added around the image that fades to full
+ transparency on selected sides.
+
+ Use `Fl_Margin` to create `frame` and `blend` using positive integers to grow
+ the rectangle to the left, top, right, and bottom.
+
+ The image can be scaled after all processing. Note that snapshot is always
+ created in FLTK resolution, even if the screen uses a higher resolution.
+
+ \param[in] filename the snapshot will be written to this file in png format
+ \param[in] w draw a bounding box around all widgets in the NULL terminated list
+ \param[in] frame add a margin around the bounding box
+ \param[in] blend add another margin around the bounding box that fades to full transparency
+ \param[in] scale scale everything by this factor before saving it
+ \return the result of fl_write_png or -3 if another error occurred
+ */
+int fl_snapshot(const char *filename, Fl_Widget **w,
+                const Fl_Rect &frame,
+                const Fl_Rect &blend,
+                double scale)
+{
+  int i, min_x = 0, min_y = 0, max_x = 0, max_y = 0, bb_w, bb_h, img_w, img_h;
+
+  // Get the bounding box for all widgets and make sure that all widgets are shown
+  for (i=0; w[i]; i++) {
+    int x, y;
+    Fl_Widget *ww = w[i];
+    if (ww == FL_SNAP_AREA_CLEAR) {
+      min_x = max_x = 0;
+      min_y = max_y = 0;
+    } else {
+      ww->top_window_offset(x, y);
+      if (i==0) {
+        min_x = x; max_x = x + ww->w();
+        min_y = y; max_y = y + ww->h();
+      } else {
+        min_x = fl_min(min_x, x); max_x = fl_max(max_x, x + ww->w());
+        min_y = fl_min(min_y, y); max_y = fl_max(max_y, y + ww->h());
+      }
+    }
+
+    // this does not help us with Fl_Tab groups
+    while (ww) { ww->show(); ww = ww->parent(); }
+  }
+
+  // Check for special values in frame and adjust bounding box
+  Fl_Rect c_frame = frame;
+  if (frame.x() == -FL_SNAP_TO_WINDOW) c_frame.x(-min_x);
+  if (frame.y() == -FL_SNAP_TO_WINDOW) c_frame.y(-min_y);
+  if (frame.r() == FL_SNAP_TO_WINDOW) c_frame.r(w[0]->top_window()->w()-max_x);
+  if (frame.b() == FL_SNAP_TO_WINDOW) c_frame.b(w[0]->top_window()->h()-max_y);
+
+  min_x += c_frame.x(); max_x += c_frame.r();
+  min_y += c_frame.y(); max_y += c_frame.b();
+  bb_w = max_x - min_x; bb_h = max_y - min_y;
+  img_w = bb_w + blend.w();
+  img_h = bb_h + blend.h();
+
+  // Generate the Image Surface
+  Fl_Image_Surface *srfc = new Fl_Image_Surface(img_w, img_h);
+  Fl_Image_Surface::push_current(srfc);
+
+  // Draw the background
+  fl_rectf(0, 0, img_w, img_h, 0x1395bf00);
+
+  // Draw the top level window
+  srfc->draw(w[0]->top_window(), -blend.x()-min_x, -blend.y()-min_y);
+  Fl_Image_Surface::pop_current();
+  Fl_RGB_Image *img = srfc->image();
+
+  // Do we want an alpha blended extension of the frame?
+  if ((blend.x()<0 || blend.y()<0 || blend.r()>0 || blend.b()>0)) {
+    if (convert_RGB_to_RGBA(img) == -1) {
+      delete img;
+      delete srfc;
+      return -3;
+    }
+    if (blend.x() < 0) blend_alpha_left(img, -blend.x());
+    if (blend.y() < 0) blend_alpha_top(img, -blend.y());
+    if (blend.r() > 0) blend_alpha_right(img, blend.r());
+    if (blend.b() > 0) blend_alpha_bottom(img, blend.b());
+  }
+
+  // If scale is set, scale the image
+  if (scale != 1.0) {
+    Fl_Image::scaling_algorithm(FL_RGB_SCALING_BILINEAR);
+    Fl_RGB_Image *scaled_img = (Fl_RGB_Image*)img->copy(img->w()*scale, img->h()*scale);
+    delete img;
+    img = scaled_img;
+  }
+
+  // Write the image to disk
+  int ret = fl_write_png(filename, img);
+
+  // Clean up
+  delete img;
+  delete srfc;
+  return ret;
+}
+
+/**
+ Take a snapshot of the size of the bounding box around two widgets and save it as a png image.
+
+ \param[in] filename the snapshot will be written to this file in png format
+ \param[in] w1, w2 top left and bottom right widget
+ \param[in] frame add a margin around the bounding box
+ \param[in] blend add another margin around the bounding box that fades to full transparency
+ \param[in] scale scale everything by this factor before saving it
+ \return the result of fl_write_png or -3 if another error occurred
+
+ \see fl_snapshot(const char*, Fl_Widget**, const Fl_Rect&, const Fl_Rect&, double)
+ */
+int fl_snapshot(const char *filename, Fl_Widget *w1, Fl_Widget *w2,
+                const Fl_Rect &frame,
+                const Fl_Rect &blend,
+                double scale)
+{
+  Fl_Widget *ww[3] = { w1, w2, NULL };
+  return fl_snapshot(filename, ww, frame, blend, scale);
+}
+
+/**
+ Take a snapshot of a widget inside its window and save it as a png image.
+
+ \param[in] filename the snapshot will be written to this file in png format
+ \param[in] w snap this window, can also be a groups
+ \param[in] frame add a margin around the bounding box
+ \param[in] blend add another margin around the bounding box that fades to full transparency
+ \param[in] scale scale everything by this factor before saving it
+ \return the result of fl_write_png or -3 if another error occurred
+
+ \see fl_snapshot(const char*, Fl_Widget**, const Fl_Rect&, const Fl_Rect&, double)
+ */
+int fl_snapshot(const char *filename, Fl_Widget *w,
+                const Fl_Rect &frame,
+                const Fl_Rect &blend,
+                double scale)
+{
+  Fl_Widget *ww[2] = { w, NULL };
+  return fl_snapshot(filename, ww, frame, blend, scale);
+}
+
+/** @} */
+
+
+void run_autodoc(const Fl_String &target_dir) {
+  // A list of all the margins we will use later
+  Fl_Margin win_margin(0, 0, 0, 0);
+  Fl_Margin win_blend(10, 10, 10, 10);
+  Fl_Margin tab_margin(FL_SNAP_TO_WINDOW, 32, FL_SNAP_TO_WINDOW, 4);
+  Fl_Margin xtab_margin(FL_SNAP_TO_WINDOW, 50, FL_SNAP_TO_WINDOW, 4);
+  Fl_Margin row_margin(FL_SNAP_TO_WINDOW, 4, FL_SNAP_TO_WINDOW, 4);
+  Fl_Margin xrow_margin(FL_SNAP_TO_WINDOW, 14, FL_SNAP_TO_WINDOW, 4);
+  Fl_Margin row_blend(0, 10, 0, 10);
+
+//  Fl::scheme("gtk+");
+
+  // Create a silly project that contains all widgets that we want to document
+  new_project(false);
+
+  /*Fl_Type *t_func = */ add_new_widget_from_user("Function", kAddAsLastChild, false);
+  Fl_Window_Type *t_win = (Fl_Window_Type*)add_new_widget_from_user("Fl_Window", kAddAsLastChild, false);
+  t_win->label("My Main Window");
+  Fl_Widget_Type *t_grp = (Fl_Widget_Type*)add_new_widget_from_user("Fl_Group", kAddAsLastChild, false);
+  t_grp->public_ = 0;
+  Fl_Widget_Type *t_btn = (Fl_Widget_Type*)add_new_widget_from_user("Fl_Button", kAddAsLastChild, false);
+  t_btn->comment("Don't press this button!");
+  t_btn->name("emergency_btn");
+  ((Fl_Button*)t_btn->o)->shortcut(FL_COMMAND|'g');
+  Fl_Type *t_sldr = add_new_widget_from_user("Fl_Slider", kAddAsLastChild, false);
+  Fl_Type *t_inp = add_new_widget_from_user("Fl_Input", kAddAsLastChild, false);
+  Fl_Type *t_flx = add_new_widget_from_user("Fl_Flex", kAddAsLastChild, false);
+  Fl_Type *t_flxc = add_new_widget_from_user("Fl_Button", kAddAsLastChild, false);
+  select_only(t_grp);
+  Fl_Type *t_grd = add_new_widget_from_user("Fl_Grid", kAddAsLastChild, false);
+  Fl_Type *t_grdc = add_new_widget_from_user("Fl_Button", kAddAsLastChild, false);
+
+  widget_browser->rebuild();
+  g_project.update_settings_dialog();
+
+  // TODO: FLUID overview
+
+  // TODO: explain FLUID command line usage
+
+  // TODO: take a snapshot of FLUID in a desktop situation
+  // (main, toolbar, document, widget editor, code view)
+
+  // ---- main window
+  // explain titlebar
+  // explain menubar?
+  // explain widget browser
+  // explain widget browser entry
+  main_window->size(350, 320);
+  fl_snapshot((target_dir + "main_window.png").c_str(), main_window, win_margin, win_blend);
+  fl_snapshot((target_dir + "main_menubar.png").c_str(), main_menubar, row_margin, row_blend);
+  fl_snapshot((target_dir + "main_browser.png").c_str(), widget_browser, FL_SNAP_AREA_CLEAR, 
+              Fl_Rect(0, 30, FL_SNAP_TO_WINDOW, 100), row_blend, 2.0);
+
+
+  // TODO: document view
+  // explain dnd
+  // explain selection, multiple selection, keyboard shortcuts
+  // explain mouse functionality and alignment
+  // explain live resize
+  // arrow: move by 1
+  // shift: resize by one
+  // Meta: move by Widget Gap
+  // Shift Meta: resize by Widget Increment
+
+  // ---- widget bin
+  // show grouping
+  // explain non-widget types and where they will be located
+  // explain widgets types an their dnd option
+  // explain menu arrays
+  // list exceptions (subwindow, scroll)
+  if (!widgetbin_panel) make_widgetbin();
+  fl_snapshot((target_dir + "widgetbin_panel.png").c_str(), widgetbin_panel, win_margin, win_blend);
+
+  // ---- code view
+  // explain functionality
+  // explain live update and choices
+  // show various tabs
+  // explain find and locate
+  if (!codeview_panel) make_codeview();
+  update_codeview_cb(NULL, NULL);
+  cv_tab->value(cv_source_tab);
+  fl_snapshot((target_dir + "codeview_panel.png").c_str(), codeview_panel, win_margin, win_blend);
+  fl_snapshot((target_dir + "cv_find_row.png").c_str(), cv_find_row, row_margin, row_blend);
+  fl_snapshot((target_dir + "cv_settings_row.png").c_str(), cv_settings_row, row_margin, row_blend);
+
+  // ---- settings dialog
+  // show and explain all tabs
+  fl_snapshot((target_dir + "w_settings.png").c_str(), settings_window, win_margin, win_blend);
+  fl_snapshot((target_dir + "w_settings_general_tab.png").c_str(), w_settings_general_tab, xtab_margin, row_blend);
+  w_settings_tabs->value(w_settings_project_tab);
+  fl_snapshot((target_dir + "w_settings_project_tab.png").c_str(), w_settings_project_tab, xtab_margin, row_blend);
+  w_settings_tabs->value(w_settings_layout_tab);
+  fl_snapshot((target_dir + "w_settings_layout_tab.png").c_str(), w_settings_layout_tab, xtab_margin, row_blend);
+  w_settings_tabs->value(w_settings_shell_tab);
+  w_settings_shell_list->value(1);
+  w_settings_shell_list->do_callback();
+  fl_snapshot((target_dir + "w_settings_shell_tab.png").c_str(), w_settings_shell_tab, xtab_margin, row_blend);
+  w_settings_tabs->value(w_settings_i18n_tab);
+  i18n_type_chooser->value(1);
+  i18n_type_chooser->do_callback();
+  fl_snapshot((target_dir + "w_settings_i18n_gnu.png").c_str(), i18n_type_chooser, i18n_gnu_static_function_input, row_margin, row_blend);
+  i18n_type_chooser->value(2);
+  i18n_type_chooser->do_callback();
+  fl_snapshot((target_dir + "w_settings_i18n_psx.png").c_str(), i18n_type_chooser, i18n_pos_set_input, row_margin, row_blend);
+  w_settings_tabs->value(w_settings_user_tab);
+  fl_snapshot((target_dir + "w_settings_user_tab.png").c_str(), w_settings_user_tab, xtab_margin, row_blend);
+
+
+  // ---- dialog types
+  // list and show all non-widget types and their respective dialog boxes
+
+  // -- ID_Function
+  Fl_Window *adoc_function_panel = make_function_panel();
+  f_name_input->value("count_trees(const char *forest_name)");
+  f_return_type_input->value("unsigned int");
+  fl_snapshot((target_dir + "function_panel.png").c_str(), adoc_function_panel, win_margin, win_blend);
+  adoc_function_panel->hide();
+
+  // -- ID_Code
+  Fl_Window *adoc_code_panel = make_code_panel();
+  code_input->buffer()->text("// increment user count\nif (new_user) {\n  user_count++;\n}\n");
+  fl_snapshot((target_dir + "code_panel.png").c_str(), adoc_code_panel, win_margin, win_blend);
+  adoc_code_panel->hide();
+
+  // -- ID_CodeBlock
+  Fl_Window *adoc_codeblock_panel = make_codeblock_panel();
+  code_before_input->value("if (test())");
+  code_after_input->value("// test widgets added...");
+  fl_snapshot((target_dir + "codeblock_panel.png").c_str(), adoc_codeblock_panel, win_margin, win_blend);
+  adoc_codeblock_panel->hide();
+
+  // -- ID_Decl
+  Fl_Window *adoc_decl_panel = make_decl_panel();
+  decl_class_choice->hide();
+  decl_input->buffer()->text("const char *damage = \"'tis but a scratch\";");
+  fl_snapshot((target_dir + "decl_panel.png").c_str(), adoc_decl_panel, win_margin, win_blend);
+  adoc_decl_panel->hide();
+
+  // -- ID_DeclBlock
+  Fl_Window *adoc_declblock_panel = make_declblock_panel();
+  decl_before_input->value("#ifdef NDEBUG");
+  decl_after_input->value("#endif // NDEBUG");
+  fl_snapshot((target_dir + "declblock_panel.png").c_str(), adoc_declblock_panel, win_margin, win_blend);
+  adoc_declblock_panel->hide();
+
+  // -- ID_Class
+  Fl_Window *adoc_class_panel = make_class_panel();
+  decl_class_choice->hide();
+  c_name_input->value("Zoo_Giraffe");
+  c_subclass_input->value("Zoo_Animal");
+  fl_snapshot((target_dir + "class_panel.png").c_str(), adoc_class_panel, win_margin, win_blend);
+  adoc_class_panel->hide();
+
+  // -- ID_Widget_Class is handled like Fl_Window_Type
+
+  // -- ID_Comment
+  Fl_Window *adoc_comment_panel = make_comment_panel();
+  comment_input->buffer()->text("Make sure that the giraffe gets enough hay,\nbut the monkey can't reach it.");
+  fl_snapshot((target_dir + "comment_panel.png").c_str(), adoc_comment_panel, win_margin, win_blend);
+  adoc_comment_panel->hide();
+
+  // -- ID_Data
+  Fl_Window *adoc_data_panel = make_data_panel();
+  data_class_choice->hide();
+  data_input->value("emulated_ROM");
+  data_filename->value("./ROM.bin");
+  fl_snapshot((target_dir + "data_panel.png").c_str(), adoc_data_panel, win_margin, win_blend);
+  adoc_data_panel->hide();
+
+
+  // ---- widget dialog
+  t_win->open(); // open the window
+  t_win->open(); // open the panel
+  select_only(t_win);
+
+  // -- snapshot of the widget properties panel
+  fl_snapshot((target_dir + "widget_panel.png").c_str(), the_panel, win_margin, win_blend);
+  fl_snapshot((target_dir + "wLiveMode.png").c_str(), wLiveMode, row_margin, row_blend);
+
+  // -- snapshot of the GUI tab
+  widget_tabs->value(wp_gui_tab);
+  fl_snapshot((target_dir + "wp_gui_tab.png").c_str(), wp_gui_tab, tab_margin, row_blend);
+  fl_snapshot((target_dir + "wp_gui_label.png").c_str(), wp_gui_label, row_margin, row_blend);
+  select_only(t_btn);
+  fl_snapshot((target_dir + "wp_gui_image.png").c_str(), widget_image_input, widget_deimage_input, row_margin, row_blend);
+  fl_snapshot((target_dir + "wp_gui_alignment.png").c_str(), wp_gui_alignment, row_margin, row_blend);
+  fl_snapshot((target_dir + "wp_gui_size.png").c_str(), widget_x_input, xrow_margin, row_blend);
+  select_only(t_sldr);
+  fl_snapshot((target_dir + "wp_gui_values.png").c_str(), wp_gui_values, xrow_margin, row_blend);
+  select_only(t_flxc);
+  fl_snapshot((target_dir + "wp_gui_flexp.png").c_str(), wp_gui_flexp, xrow_margin, row_blend);
+  select_only(t_flx);
+  fl_snapshot((target_dir + "wp_gui_margins.png").c_str(), wp_gui_margins, xrow_margin, row_blend);
+  select_only(t_win);
+  fl_snapshot((target_dir + "wp_gui_sizerange.png").c_str(), wp_gui_sizerange, xrow_margin, row_blend);
+  select_only(t_btn);
+  fl_snapshot((target_dir + "wp_gui_shortcut.png").c_str(), wp_gui_shortcut, row_margin, row_blend);
+  select_only(t_win);
+  fl_snapshot((target_dir + "wp_gui_xclass.png").c_str(), wp_gui_xclass, row_margin, row_blend);
+  select_only(t_btn);
+  fl_snapshot((target_dir + "wp_gui_attributes.png").c_str(), wp_gui_attributes, row_margin, row_blend);
+  fl_snapshot((target_dir + "wp_gui_tooltip.png").c_str(), wp_gui_tooltip, row_margin, row_blend);
+
+  // -- snapshot of the style tab
+  widget_tabs->value(wp_style_tab);
+  select_only(t_inp);
+  fl_snapshot((target_dir + "wp_style_tab.png").c_str(), wp_style_tab, tab_margin, row_blend);
+  fl_snapshot((target_dir + "wp_style_label.png").c_str(), wp_style_label, row_margin, row_blend);
+  select_only(t_btn);
+  fl_snapshot((target_dir + "wp_style_box.png").c_str(), wp_style_box, wp_style_downbox, row_margin, row_blend);
+  select_only(t_inp);
+  fl_snapshot((target_dir + "wp_style_text.png").c_str(), wp_style_text, row_margin, row_blend);
+
+  // -- snapshot of the C++ tab
+  widget_tabs->value(wp_cpp_tab);
+  select_only(t_btn);
+  fl_snapshot((target_dir + "wp_cpp_tab.png").c_str(), wp_cpp_tab, tab_margin, row_blend);
+  fl_snapshot((target_dir + "wp_cpp_class.png").c_str(), wp_cpp_class, row_margin, row_blend);
+  fl_snapshot((target_dir + "wp_cpp_name.png").c_str(), wp_cpp_name, row_margin, row_blend);
+  fl_snapshot((target_dir + "v_input.png").c_str(), v_input[0], v_input[3], row_margin, row_blend);
+  fl_snapshot((target_dir + "wComment.png").c_str(), wComment, row_margin, row_blend);
+  fl_snapshot((target_dir + "wp_cpp_callback.png").c_str(), wCallback, w_when_box, row_margin, row_blend);
+
+  // -- snapshot of the Grid tab
+  select_only(t_grd);
+  widget_tabs->value(widget_tab_grid);
+  fl_snapshot((target_dir + "wp_grid_tab.png").c_str(), widget_tab_grid, tab_margin, row_blend);
+
+  // -- snapshot of the Grid Child tab
+  select_only(t_grdc);
+  widget_tabs->value(widget_tab_grid_child);
+  fl_snapshot((target_dir + "wp_gridc_tab.png").c_str(), widget_tab_grid_child, tab_margin, row_blend);
+}
+
+
+#endif // NDEBUG
diff --git fluid/autodoc.h fluid/autodoc.h
new file mode 100644
index 0000000..060b166
--- /dev/null
+++ fluid/autodoc.h
@@ -0,0 +1,59 @@
+//
+// Widget snapshot header-only file for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 2023-2024 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
+//
+// Please see the following page on how to report bugs and issues:
+//
+//     https://www.fltk.org/bugs.php
+//
+
+/**
+ \file autodoc.h
+ \brief tools to take snapshots of UI elements for documentation purposes
+ */
+
+#ifndef fl_screenshot_H
+#define fl_screenshot_H
+
+#include "../src/Fl_String.H"
+
+#include <FL/Fl_Export.H>
+#include <FL/Fl_Window.H>
+#include <FL/Fl_Rect.H>
+
+/** Class to initialize a Rect by providing the margin around a rect. */
+class Fl_Margin : public Fl_Rect {
+public:
+  Fl_Margin(int dx, int dy, int dr, int db);
+};
+
+int fl_snapshot(const char *filename, Fl_Widget **w,
+                const Fl_Rect &frame = Fl_Margin(4, 4, 4, 4),
+                const Fl_Rect &blend = Fl_Margin(4, 4, 4, 4),
+                double scale=1.0);
+
+int fl_snapshot(const char *filename, Fl_Widget *w1, Fl_Widget *w2,
+                const Fl_Rect &frame = Fl_Margin(4, 4, 4, 4),
+                const Fl_Rect &blend = Fl_Margin(4, 4, 4, 4),
+                double scale=1.0);
+
+int fl_snapshot(const char *filename, Fl_Widget *w,
+                const Fl_Rect &frame = Fl_Margin(4, 4, 4, 4),
+                const Fl_Rect &blend = Fl_Margin(4, 4, 4, 4),
+                double scale=1.0);
+
+extern const int FL_SNAP_TO_WINDOW;
+
+extern Fl_Widget *FL_SNAP_AREA_CLEAR;
+
+extern void run_autodoc(const Fl_String &target_dir);
+
+#endif
+
diff --git fluid/code.cxx fluid/code.cxx
index eef2aac..24088ca 100644
--- fluid/code.cxx
+++ fluid/code.cxx
@@ -414,7 +414,7 @@ void Fd_Code_Writer::write_cstring(const char *s, int length) {
   }
   // if we are rendering to the source code preview window, and the text is
   // longer than four lines, we only render a placeholder.
-  if (write_sourceview && ((s==NULL) || (length>300))) {
+  if (write_codeview && ((s==NULL) || (length>300))) {
     if (length>=0)
       crc_printf("\" ... %d bytes of text... \"", length);
     else
@@ -523,7 +523,7 @@ void Fd_Code_Writer::write_cdata(const char *s, int length) {
     varused = 1;
     return;
   }
-  if (write_sourceview) {
+  if (write_codeview) {
     if (length>=0)
       crc_printf("{ /* ... %d bytes of binary data... */ }", length);
     else
@@ -707,11 +707,11 @@ Fl_Type* Fd_Code_Writer::write_code(Fl_Type* p) {
   // write all code that comes before the children code
   // (but don't write the last comment until the very end)
   if (!(p==Fl_Type::last && p->is_a(ID_Comment))) {
-    if (write_sourceview) p->code1_start = (int)ftell(code_file);
-    if (write_sourceview) p->header1_start = (int)ftell(header_file);
+    if (write_codeview) p->code1_start = (int)ftell(code_file);
+    if (write_codeview) p->header1_start = (int)ftell(header_file);
     p->write_code1(*this);
-    if (write_sourceview) p->code1_end = (int)ftell(code_file);
-    if (write_sourceview) p->header1_end = (int)ftell(header_file);
+    if (write_codeview) p->code1_end = (int)ftell(code_file);
+    if (write_codeview) p->header1_end = (int)ftell(header_file);
   }
   // recursively write the code of all children
   Fl_Type* q;
@@ -730,11 +730,11 @@ Fl_Type* Fd_Code_Writer::write_code(Fl_Type* p) {
     }
 
     // write all code that come after the children
-    if (write_sourceview) p->code2_start = (int)ftell(code_file);
-    if (write_sourceview) p->header2_start = (int)ftell(header_file);
+    if (write_codeview) p->code2_start = (int)ftell(code_file);
+    if (write_codeview) p->header2_start = (int)ftell(header_file);
     p->write_code2(*this);
-    if (write_sourceview) p->code2_end = (int)ftell(code_file);
-    if (write_sourceview) p->header2_end = (int)ftell(header_file);
+    if (write_codeview) p->code2_end = (int)ftell(code_file);
+    if (write_codeview) p->header2_end = (int)ftell(header_file);
 
     for (q = p->next; q && q->level > p->level;) {
       if (is_class_member(q) || is_comment_before_class_member(q)) {
@@ -752,11 +752,11 @@ Fl_Type* Fd_Code_Writer::write_code(Fl_Type* p) {
   } else {
     for (q = p->next; q && q->level > p->level;) q = write_code(q);
     // write all code that come after the children
-    if (write_sourceview) p->code2_start = (int)ftell(code_file);
-    if (write_sourceview) p->header2_start = (int)ftell(header_file);
+    if (write_codeview) p->code2_start = (int)ftell(code_file);
+    if (write_codeview) p->header2_start = (int)ftell(header_file);
     p->write_code2(*this);
-    if (write_sourceview) p->code2_end = (int)ftell(code_file);
-    if (write_sourceview) p->header2_end = (int)ftell(header_file);
+    if (write_codeview) p->code2_end = (int)ftell(code_file);
+    if (write_codeview) p->header2_end = (int)ftell(header_file);
   }
   return q;
 }
@@ -772,8 +772,8 @@ Fl_Type* Fd_Code_Writer::write_code(Fl_Type* p) {
  \param[in] t filename of the header file
  \return 0 if the operation failed, 1 if it was successful
  */
-int Fd_Code_Writer::write_code(const char *s, const char *t, bool to_sourceview) {
-  write_sourceview = to_sourceview;
+int Fd_Code_Writer::write_code(const char *s, const char *t, bool to_codeview) {
+  write_codeview = to_codeview;
   delete id_root; id_root = 0;
   indentation = 0;
   current_class = 0L;
@@ -791,7 +791,7 @@ int Fd_Code_Writer::write_code(const char *s, const char *t, bool to_sourceview)
     header_file = f;
   }
   // Remember the last code file location for MergeBack
-  if (s && g_project.write_mergeback_data && !to_sourceview) {
+  if (s && g_project.write_mergeback_data && !to_codeview) {
     Fl_String proj_filename = g_project.projectfile_path() + g_project.projectfile_name();
     int i, n = proj_filename.size();
     for (i=0; i<n; i++) if (proj_filename[i]=='\\') proj_filename[i] = '/';
@@ -803,13 +803,13 @@ int Fd_Code_Writer::write_code(const char *s, const char *t, bool to_sourceview)
   // a copyright notice. We print that before anything else in the file!
   Fl_Type* first_type = Fl_Type::first;
   if (first_type && first_type->is_a(ID_Comment)) {
-    if (write_sourceview) {
+    if (write_codeview) {
       first_type->code1_start = first_type->code2_start = (int)ftell(code_file);
       first_type->header1_start = first_type->header2_start = (int)ftell(header_file);
     }
     // it is ok to write non-recursive code here, because comments have no children or code2 blocks
     first_type->write_code1(*this);
-    if (write_sourceview) {
+    if (write_codeview) {
       first_type->code1_end = first_type->code2_end = (int)ftell(code_file);
       first_type->header1_end = first_type->header2_end = (int)ftell(header_file);
     }
@@ -835,7 +835,7 @@ int Fd_Code_Writer::write_code(const char *s, const char *t, bool to_sourceview)
     write_h_once("#include <FL/Fl.H>");
   }
   if (t && g_project.include_H_from_C) {
-    if (to_sourceview) {
+    if (to_codeview) {
       write_c("#include \"CodeView.h\"\n");
     } else if (g_project.header_file_name[0] == '.' && strchr(g_project.header_file_name.c_str(), '/') == NULL) {
       write_c("#include \"%s\"\n", fl_filename_name(t));
@@ -896,17 +896,17 @@ int Fd_Code_Writer::write_code(const char *s, const char *t, bool to_sourceview)
   }
   for (Fl_Type* p = first_type; p;) {
     // write all static data for this & all children first
-    if (write_sourceview) p->header_static_start = (int)ftell(header_file);
-    if (write_sourceview) p->code_static_start = (int)ftell(code_file);
+    if (write_codeview) p->header_static_start = (int)ftell(header_file);
+    if (write_codeview) p->code_static_start = (int)ftell(code_file);
     p->write_static(*this);
-    if (write_sourceview) p->code_static_end = (int)ftell(code_file);
-    if (write_sourceview) p->header_static_end = (int)ftell(header_file);
+    if (write_codeview) p->code_static_end = (int)ftell(code_file);
+    if (write_codeview) p->header_static_end = (int)ftell(header_file);
     for (Fl_Type* q = p->next; q && q->level > p->level; q = q->next) {
-      if (write_sourceview) q->header_static_start = (int)ftell(header_file);
-      if (write_sourceview) q->code_static_start = (int)ftell(code_file);
+      if (write_codeview) q->header_static_start = (int)ftell(header_file);
+      if (write_codeview) q->code_static_start = (int)ftell(code_file);
       q->write_static(*this);
-      if (write_sourceview) q->code_static_end = (int)ftell(code_file);
-      if (write_sourceview) q->header_static_end = (int)ftell(header_file);
+      if (write_codeview) q->code_static_end = (int)ftell(code_file);
+      if (write_codeview) q->header_static_end = (int)ftell(header_file);
     }
     // then write the nested code:
     p = write_code(p);
@@ -918,12 +918,12 @@ int Fd_Code_Writer::write_code(const char *s, const char *t, bool to_sourceview)
 
   Fl_Type* last_type = Fl_Type::last;
   if (last_type && (last_type != Fl_Type::first) && last_type->is_a(ID_Comment)) {
-    if (write_sourceview) {
+    if (write_codeview) {
       last_type->code1_start = last_type->code2_start = (int)ftell(code_file);
       last_type->header1_start = last_type->header2_start = (int)ftell(header_file);
     }
     last_type->write_code1(*this);
-    if (write_sourceview) {
+    if (write_codeview) {
       last_type->code1_end = last_type->code2_end = (int)ftell(code_file);
       last_type->header1_end = last_type->header2_end = (int)ftell(header_file);
     }
@@ -973,7 +973,7 @@ Fd_Code_Writer::Fd_Code_Writer()
   block_buffer_(NULL),
   block_buffer_size_(0),
   indentation(0),
-  write_sourceview(false),
+  write_codeview(false),
   varused_test(0),
   varused(0)
 {
diff --git fluid/code.h fluid/code.h
index bac7bc7..8581c90 100644
--- fluid/code.h
+++ fluid/code.h
@@ -68,7 +68,7 @@ public:
   int indentation;
   /// set if we write abbreviated file for the source code previewer
   /// (disables binary data blocks, for example)
-  bool write_sourceview;
+  bool write_codeview;
   /// 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:
@@ -100,7 +100,7 @@ public:
   void write_hc(const char *, int, const char*, const char*);
   void write_c_indented(const char *textlines, int inIndent, char inTrailwWith);
   Fl_Type* write_code(Fl_Type* p);
-  int write_code(const char *cfile, const char *hfile, bool to_sourceview=false);
+  int write_code(const char *cfile, const char *hfile, bool to_codeview=false);
   void write_public(int state); // writes pubic:/private: as needed
 
   void tag(int type, unsigned short uid);
diff --git fluid/codeview_panel.cxx fluid/codeview_panel.cxx
new file mode 100644
index 0000000..0ca8c0d
--- /dev/null
+++ fluid/codeview_panel.cxx
@@ -0,0 +1,548 @@
+//
+// Code dialogs for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2023 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
+//
+// Please see the following page on how to report bugs and issues:
+//
+//     https://www.fltk.org/bugs.php
+//
+
+// generated by Fast Light User Interface Designer (fluid) version 1.0400
+
+#include "codeview_panel.h"
+#include "fluid.h"
+#include "file.h"
+#include "../src/flstring.h"
+#include <FL/Fl_Tabs.H>
+#include <FL/Fl_Button.H>
+static char *cv_source_filename = NULL;
+static char *cv_header_filename = NULL;
+static char *cv_design_filename = NULL;
+int cv_code_choice;
+extern void select_only(Fl_Type *o);
+extern void reveal_in_browser(Fl_Type *t);
+
+/**
+ Update the header and source code highlighting depending on the
+ currently selected object
+ 
+ The Code View system offers an immediate preview of the code
+ files that will be generated by FLUID. It also marks the code
+ generated for the last selected item in the header and the source
+ file.
+*/
+void update_codeview_position() {
+  if (!codeview_panel || !codeview_panel->visible())
+      return;
+    if (cv_autoposition->value()==0)
+      return;
+    if (codeview_panel && codeview_panel->visible() && Fl_Type::current) {
+      int pos0 = 0, pos1 = 0;
+      if (cv_source->visible_r()) {
+        switch (cv_code_choice) {
+          case 0: // prolog: not yet (include statements)
+            pos0 = Fl_Type::current->code1_start;
+            pos1 = Fl_Type::current->code2_end;
+            break;
+          case 1: // static: callbacks, menu declarations
+            pos0 = Fl_Type::current->code_static_start;
+            pos1 = Fl_Type::current->code_static_end;
+            break;
+          case 2: // code: entire implementation block including children
+            pos0 = Fl_Type::current->code1_start;
+            pos1 = Fl_Type::current->code2_end;
+            break;
+          case 3: // code1: all implementation code before the children
+            pos0 = Fl_Type::current->code1_start;
+            pos1 = Fl_Type::current->code1_end;
+            break;
+          case 4: // code1: all implementation code before the children
+            pos0 = Fl_Type::current->code2_start;
+            pos1 = Fl_Type::current->code2_end;
+            break;
+        }
+        if (pos0>=0) {
+          if (pos1<pos0)
+            pos1 = cv_source->buffer()->line_end(pos0);
+          cv_source->buffer()->highlight(pos0, pos1);
+          int line = cv_source->buffer()->count_lines(0, pos0);
+          cv_source->scroll(line, 0);
+        }
+      }
+      if (cv_header->visible_r()) {
+        switch (cv_code_choice) {
+          case 0: // prolog: not yet (include statements)
+          case 1: // static: callbacks, menu declarations
+            pos0 = Fl_Type::current->header_static_start;
+            pos1 = Fl_Type::current->header_static_end;
+            break;
+          case 2: // code: entire implementation block including children
+            pos0 = Fl_Type::current->header1_start;
+            pos1 = Fl_Type::current->header2_end;
+            break;
+          case 3: // code1: all implementation code before the children
+            pos0 = Fl_Type::current->header1_start;
+            pos1 = Fl_Type::current->header1_end;
+            break;
+          case 4: // code1: all implementation code before the children
+            pos0 = Fl_Type::current->header2_start;
+            pos1 = Fl_Type::current->header2_end;
+            break;
+        }
+        if (pos0>=0) {
+          if (pos1<pos0)
+            pos1 = cv_header->buffer()->line_end(pos0);
+          cv_header->buffer()->highlight(pos0, pos1);
+          int line = cv_header->buffer()->count_lines(0, pos0);
+          cv_header->scroll(line, 0);
+        }
+      }
+      if (cv_project->visible_r()) {
+        switch (cv_code_choice) {
+          case 0: // prolog: not yet (include statements)
+          case 1: // static: callbacks, menu declarations
+          case 2: // code: entire implementation block including children
+            pos0 = Fl_Type::current->proj1_start;
+            pos1 = Fl_Type::current->proj2_end;
+            break;
+          case 3: // code1: all implementation code before the children
+            pos0 = Fl_Type::current->proj1_start;
+            pos1 = Fl_Type::current->proj1_end;
+            break;
+          case 4: // code1: all implementation code before the children
+            pos0 = Fl_Type::current->proj2_start;
+            pos1 = Fl_Type::current->proj2_end;
+            break;
+        }
+        if (pos0>=0) {
+          if (pos1<pos0)
+            pos1 = cv_project->buffer()->line_end(pos0);
+          cv_project->buffer()->highlight(pos0, pos1);
+          int line = cv_project->buffer()->count_lines(0, pos0);
+          cv_project->scroll(line, 0);
+        }
+      }
+    }
+}
+
+/**
+ Callback to update the codeview position.
+*/
+void update_codeview_position_cb(class Fl_Tabs*, void*) {
+  // make sure that the selected tab shows the current view
+    update_codeview_cb(0,0);
+    // highlight the selected widget in the selected tab
+    update_codeview_position();
+}
+
+/**
+ Generate a header, source, strings, or design file in a temporary directory
+ and load those into the Code Viewer widgets.
+*/
+void update_codeview_cb(class Fl_Button*, void*) {
+  if (!codeview_panel || !codeview_panel->visible())
+      return;
+
+    if (!cv_source_filename) {
+      cv_source_filename = (char*)malloc(FL_PATH_MAX);
+      fl_strlcpy(cv_source_filename, get_tmpdir().c_str(), FL_PATH_MAX);
+      fl_strlcat(cv_source_filename, "codeview_tmp.cxx", FL_PATH_MAX);
+    }
+    if (!cv_header_filename) {
+      cv_header_filename = (char*)malloc(FL_PATH_MAX);
+      fl_strlcpy(cv_header_filename, get_tmpdir().c_str(), FL_PATH_MAX);
+      fl_strlcat(cv_header_filename, "codeview_tmp.h", FL_PATH_MAX);
+    }
+    if (!cv_design_filename) {
+      cv_design_filename = (char*)malloc(FL_PATH_MAX);
+      fl_strlcpy(cv_design_filename, get_tmpdir().c_str(), FL_PATH_MAX);
+      fl_strlcat(cv_design_filename, "codeview_tmp.fl", FL_PATH_MAX);
+    }
+
+    if (cv_project->visible_r()) {
+      write_file(cv_design_filename, false, true);
+      int top = cv_project->top_line();
+      cv_project->buffer()->loadfile(cv_design_filename);
+      cv_project->scroll(top, 0);
+    } else if (cv_strings->visible_r()) {
+      static const char *exts[] = { ".txt", ".po", ".msg" };
+      char fn[FL_PATH_MAX+1];
+      fl_strlcpy(fn, get_tmpdir().c_str(), FL_PATH_MAX);
+      fl_strlcat(fn, "strings", FL_PATH_MAX);
+      fl_filename_setext(fn, FL_PATH_MAX, exts[g_project.i18n_type]);
+      write_strings(fn);
+      int top = cv_strings->top_line();
+      cv_strings->buffer()->loadfile(fn);
+      cv_strings->scroll(top, 0);
+    } else if (cv_source->visible_r() || cv_header->visible_r()) {
+      Fl_String code_file_name_bak = g_project.code_file_name;
+      g_project.code_file_name = cv_source_filename;
+      Fl_String header_file_name_bak = g_project.header_file_name;
+      g_project.header_file_name = cv_header_filename;
+
+      // generate the code and load the files
+      Fd_Code_Writer f;
+      // generate files
+      if (f.write_code(cv_source_filename, cv_header_filename, true))
+      {
+        // load file into source editor
+        int pos = cv_source->top_line();
+        cv_source->buffer()->loadfile(cv_source_filename);
+        cv_source->scroll(pos, 0);
+        // load file into header editor
+        pos = cv_header->top_line();
+        cv_header->buffer()->loadfile(cv_header_filename);
+        cv_header->scroll(pos, 0);
+        // update the source code highlighting
+        update_codeview_position();
+      }
+
+      g_project.code_file_name = code_file_name_bak;
+      g_project.header_file_name = header_file_name_bak;
+    }
+}
+
+/**
+ This is called by the timer itself
+*/
+void update_codeview_timer(void*) {
+  update_codeview_cb(0,0);
+}
+
+void codeview_defer_update() {
+  // we will only update earliest 0.5 seconds after the last change, and only
+      // if no other change was made, so dragging a widget will not generate any
+      // CPU load
+      Fl::remove_timeout(update_codeview_timer, 0);
+      Fl::add_timeout(0.5, update_codeview_timer, 0);
+}
+
+/**
+ Show or hide the source code preview.
+ The state is stored in the app preferences.
+*/
+void codeview_toggle_visibility() {
+  if (!codeview_panel) {
+      make_codeview();
+      codeview_panel->callback((Fl_Callback*)toggle_codeview_cb);
+      Fl_Preferences svp(fluid_prefs, "codeview");
+      int autorefresh;
+      svp.get("autorefresh", autorefresh, 1);
+      cv_autorefresh->value(autorefresh);
+      int autoposition;
+      svp.get("autoposition", autoposition, 1);
+      cv_autoposition->value(autoposition);
+      int tab;
+      svp.get("tab", tab, 0);
+      if (tab>=0 && tab<cv_tab->children()) cv_tab->value(cv_tab->child(tab));
+      svp.get("code_choice", cv_code_choice, 2);
+      cv_code_choice_w->value(cv_code_choice_w->find_item_with_argument(cv_code_choice));
+      if (!position_window(codeview_panel,"codeview_pos", 0, 320, 120, 550, 500)) return;
+    }
+
+    if (codeview_panel->visible()) {
+      codeview_panel->hide();
+      codeview_item->label("Show Code View");
+    } else {
+      codeview_panel->show();
+      codeview_item->label("Hide Code View");
+      update_codeview_cb(0,0);
+    }
+}
+
+Fl_Double_Window *codeview_panel=(Fl_Double_Window *)0;
+
+Fl_Tabs *cv_tab=(Fl_Tabs *)0;
+
+Fl_Group *cv_source_tab=(Fl_Group *)0;
+
+CodeViewer *cv_source=(CodeViewer *)0;
+
+CodeViewer *cv_header=(CodeViewer *)0;
+
+TextViewer *cv_strings=(TextViewer *)0;
+
+TextViewer *cv_project=(TextViewer *)0;
+
+Fl_Group *cv_find_row=(Fl_Group *)0;
+
+Fl_Button *cv_find_text_case=(Fl_Button *)0;
+
+Fl_Input *cv_find_text=(Fl_Input *)0;
+
+static void cb_cv_find_text(Fl_Input* o, void*) {
+  Fl_Text_Display *e = NULL;
+  if (cv_source->visible_r()) {
+    e = cv_source;
+  } else if (cv_header->visible_r()) {
+    e = cv_header;
+  } else if (cv_project->visible_r()) {
+    e = cv_project;
+  }
+  if (e) {
+    Fl_Text_Buffer *b = e->buffer();
+    int pos = e->insert_position();
+    int found = b->search_forward(pos, o->value(), &pos, cv_find_text_case->value());
+    if (found) {
+      b->select(pos, pos + (int)strlen(o->value()));
+      e->insert_position(pos);
+      e->show_insert_position();
+    }
+  }
+}
+
+static void cb_(Fl_Button*, void*) {
+  Fl_Text_Display *e = NULL;
+  if (cv_source->visible_r()) {
+    e = cv_source;
+  } else if (cv_header->visible_r()) {
+    e = cv_header;
+  } else if (cv_project->visible_r()) {
+    e = cv_project;
+  }
+  if (e) {
+    const char *needle = cv_find_text->value();
+    Fl_Text_Buffer *b = e->buffer();
+    int pos = e->insert_position()-1;
+    if (pos < 0) pos = b->length()-1;
+    int found = b->search_backward(pos, needle, &pos, cv_find_text_case->value());
+    if (!found)
+      found = b->search_backward(b->length()-1, needle, &pos, cv_find_text_case->value());
+    if (found) {
+      b->select(pos, pos + (int)strlen(needle));
+      e->insert_position(pos);
+      e->show_insert_position();
+    }
+  }
+}
+
+static void cb_1(Fl_Button*, void*) {
+  Fl_Text_Display *e = NULL;
+  if (cv_source->visible_r()) {
+    e = cv_source;
+  } else if (cv_header->visible_r()) {
+    e = cv_header;
+  } else if (cv_project->visible_r()) {
+    e = cv_project;
+  }
+  if (e) {
+    const char *needle = cv_find_text->value();
+    Fl_Text_Buffer *b = e->buffer();
+    int pos = e->insert_position() + 1;
+    if (pos+1 >= b->length()) pos = 0;
+    int found = b->search_forward(pos, needle, &pos, cv_find_text_case->value());
+    if (!found && (pos > 0))
+      found = b->search_forward(0, needle, &pos, cv_find_text_case->value());
+    if (found) {
+      b->select(pos, pos + (int)strlen(needle));
+      e->insert_position(pos);
+      e->show_insert_position();
+    }
+  }
+}
+
+static void cb_Reveal(Fl_Button*, void*) {
+  if (codeview_panel && codeview_panel->visible()) {
+    Fl_Type *node = NULL;
+    if (cv_source->visible_r())
+      node = Fl_Type::find_in_text(0, cv_source->insert_position());
+    else if (cv_header->visible_r())
+      node = Fl_Type::find_in_text(1, cv_header->insert_position());
+    else if (cv_project->visible_r())
+      node = Fl_Type::find_in_text(2, cv_project->insert_position());
+    if (node) {
+      select_only(node);
+      reveal_in_browser(node);
+      if (Fl::event_clicks()==1) // double click
+        node->open();
+    }
+  }
+}
+
+Fl_Group *cv_settings_row=(Fl_Group *)0;
+
+Fl_Light_Button *cv_autorefresh=(Fl_Light_Button *)0;
+
+Fl_Light_Button *cv_autoposition=(Fl_Light_Button *)0;
+
+Fl_Choice *cv_code_choice_w=(Fl_Choice *)0;
+
+static void cb_cv_code_choice_w(Fl_Choice* o, void*) {
+  cv_code_choice = (int)o->mvalue()->argument();
+  update_codeview_position();
+}
+
+Fl_Menu_Item menu_cv_code_choice_w[] = {
+ {"prolog", 0,  0, (void*)(0), 16, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"static", 0,  0, (void*)(1), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"code", 0,  0, (void*)(2), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"code 1", 0,  0, (void*)(3), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"code 2", 0,  0, (void*)(4), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {0,0,0,0,0,0,0,0,0}
+};
+
+Fl_Double_Window* make_codeview() {
+  { codeview_panel = new Fl_Double_Window(520, 515, "Code View");
+    codeview_panel->callback((Fl_Callback*)toggle_codeview_cb);
+    codeview_panel->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));
+    { cv_tab = new Fl_Tabs(10, 10, 500, 440);
+      cv_tab->selection_color((Fl_Color)4);
+      cv_tab->labelcolor(FL_BACKGROUND2_COLOR);
+      cv_tab->callback((Fl_Callback*)update_codeview_position_cb);
+      { cv_source_tab = new Fl_Group(10, 35, 500, 415, "Source");
+        cv_source_tab->labelsize(13);
+        { CodeViewer* o = cv_source = new CodeViewer(10, 40, 500, 410);
+          cv_source->box(FL_DOWN_FRAME);
+          cv_source->color(FL_BACKGROUND2_COLOR);
+          cv_source->selection_color(FL_SELECTION_COLOR);
+          cv_source->labeltype(FL_NORMAL_LABEL);
+          cv_source->labelfont(0);
+          cv_source->labelsize(14);
+          cv_source->labelcolor(FL_FOREGROUND_COLOR);
+          cv_source->textfont(4);
+          cv_source->textsize(11);
+          cv_source->align(Fl_Align(FL_ALIGN_TOP));
+          cv_source->when(FL_WHEN_RELEASE);
+          Fl_Group::current()->resizable(cv_source);
+          o->linenumber_width(60);
+          o->linenumber_size(o->Fl_Text_Display::textsize());
+        } // CodeViewer* cv_source
+        cv_source_tab->end();
+        Fl_Group::current()->resizable(cv_source_tab);
+      } // Fl_Group* cv_source_tab
+      { Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Header");
+        o->labelsize(13);
+        o->hide();
+        { CodeViewer* o = cv_header = new CodeViewer(10, 40, 500, 410);
+          cv_header->box(FL_DOWN_FRAME);
+          cv_header->color(FL_BACKGROUND2_COLOR);
+          cv_header->selection_color(FL_SELECTION_COLOR);
+          cv_header->labeltype(FL_NORMAL_LABEL);
+          cv_header->labelfont(0);
+          cv_header->labelsize(14);
+          cv_header->labelcolor(FL_FOREGROUND_COLOR);
+          cv_header->textfont(4);
+          cv_header->textsize(11);
+          cv_header->align(Fl_Align(FL_ALIGN_TOP));
+          cv_header->when(FL_WHEN_RELEASE);
+          Fl_Group::current()->resizable(cv_header);
+          o->linenumber_width(60);
+          o->linenumber_size(o->Fl_Text_Display::textsize());
+        } // CodeViewer* cv_header
+        o->end();
+      } // Fl_Group* o
+      { Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Strings");
+        o->labelsize(13);
+        o->hide();
+        { TextViewer* o = cv_strings = new TextViewer(10, 40, 500, 410);
+          cv_strings->box(FL_DOWN_FRAME);
+          cv_strings->color(FL_BACKGROUND2_COLOR);
+          cv_strings->selection_color(FL_SELECTION_COLOR);
+          cv_strings->labeltype(FL_NORMAL_LABEL);
+          cv_strings->labelfont(0);
+          cv_strings->labelsize(14);
+          cv_strings->labelcolor(FL_FOREGROUND_COLOR);
+          cv_strings->textfont(4);
+          cv_strings->textsize(11);
+          cv_strings->align(Fl_Align(FL_ALIGN_TOP));
+          cv_strings->when(FL_WHEN_RELEASE);
+          Fl_Group::current()->resizable(cv_strings);
+          o->linenumber_width(60);
+          o->linenumber_size(o->Fl_Text_Display::textsize());
+        } // TextViewer* cv_strings
+        o->end();
+      } // Fl_Group* o
+      { Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Project");
+        o->labelsize(13);
+        o->hide();
+        { TextViewer* o = cv_project = new TextViewer(10, 40, 500, 410);
+          cv_project->box(FL_DOWN_FRAME);
+          cv_project->color(FL_BACKGROUND2_COLOR);
+          cv_project->selection_color(FL_SELECTION_COLOR);
+          cv_project->labeltype(FL_NORMAL_LABEL);
+          cv_project->labelfont(0);
+          cv_project->labelsize(14);
+          cv_project->labelcolor(FL_FOREGROUND_COLOR);
+          cv_project->textfont(4);
+          cv_project->textsize(11);
+          cv_project->align(Fl_Align(FL_ALIGN_TOP));
+          cv_project->when(FL_WHEN_RELEASE);
+          Fl_Group::current()->resizable(cv_project);
+          o->linenumber_width(60);
+          o->linenumber_size(o->Fl_Text_Display::textsize());
+        } // TextViewer* cv_project
+        o->end();
+      } // Fl_Group* o
+      cv_tab->end();
+      Fl_Group::current()->resizable(cv_tab);
+    } // Fl_Tabs* cv_tab
+    { cv_find_row = new Fl_Group(10, 460, 500, 20);
+      { cv_find_text_case = new Fl_Button(244, 460, 25, 20, "aA");
+        cv_find_text_case->type(1);
+        cv_find_text_case->labelsize(11);
+      } // Fl_Button* cv_find_text_case
+      { cv_find_text = new Fl_Input(40, 460, 200, 20, "Find:");
+        cv_find_text->labelsize(11);
+        cv_find_text->textsize(11);
+        cv_find_text->callback((Fl_Callback*)cb_cv_find_text);
+        cv_find_text->when(FL_WHEN_RELEASE | FL_WHEN_ENTER_KEY_CHANGED);
+      } // Fl_Input* cv_find_text
+      { Fl_Button* o = new Fl_Button(273, 460, 25, 20, "<<");
+        o->labelsize(11);
+        o->callback((Fl_Callback*)cb_);
+      } // Fl_Button* o
+      { Fl_Button* o = new Fl_Button(298, 460, 25, 20, ">>");
+        o->labelsize(11);
+        o->callback((Fl_Callback*)cb_1);
+      } // Fl_Button* o
+      { Fl_Button* o = new Fl_Button(327, 460, 61, 20, "Reveal");
+        o->labelsize(11);
+        o->callback((Fl_Callback*)cb_Reveal);
+      } // Fl_Button* o
+      { Fl_Box* o = new Fl_Box(490, 460, 20, 20);
+        Fl_Group::current()->resizable(o);
+      } // Fl_Box* o
+      cv_find_row->end();
+    } // Fl_Group* cv_find_row
+    { cv_settings_row = new Fl_Group(10, 485, 500, 20);
+      { Fl_Button* o = new Fl_Button(10, 485, 61, 20, "Refresh");
+        o->labelsize(11);
+        o->callback((Fl_Callback*)update_codeview_cb);
+      } // Fl_Button* o
+      { Fl_Light_Button* o = cv_autorefresh = new Fl_Light_Button(77, 485, 91, 20, "Auto-Refresh");
+        cv_autorefresh->labelsize(11);
+        o->callback((Fl_Callback*)update_codeview_cb);
+      } // Fl_Light_Button* cv_autorefresh
+      { cv_autoposition = new Fl_Light_Button(172, 485, 89, 20, "Auto-Position");
+        cv_autoposition->labelsize(11);
+      } // Fl_Light_Button* cv_autoposition
+      { cv_code_choice_w = new Fl_Choice(265, 485, 70, 20);
+        cv_code_choice_w->down_box(FL_BORDER_BOX);
+        cv_code_choice_w->labelsize(11);
+        cv_code_choice_w->textsize(11);
+        cv_code_choice_w->callback((Fl_Callback*)cb_cv_code_choice_w);
+        cv_code_choice_w->menu(menu_cv_code_choice_w);
+      } // Fl_Choice* cv_code_choice_w
+      { Fl_Box* o = new Fl_Box(375, 485, 80, 20);
+        Fl_Group::current()->resizable(o);
+      } // Fl_Box* o
+      { Fl_Button* o = new Fl_Button(460, 485, 50, 20, "Close");
+        o->labelsize(11);
+        o->callback((Fl_Callback*)toggle_codeview_b_cb);
+      } // Fl_Button* o
+      cv_settings_row->end();
+    } // Fl_Group* cv_settings_row
+    codeview_panel->size_range(384, 120);
+    codeview_panel->end();
+  } // Fl_Double_Window* codeview_panel
+  return codeview_panel;
+}
+
+//
diff --git fluid/codeview_panel.fl fluid/codeview_panel.fl
new file mode 100644
index 0000000..51ac5f4
--- /dev/null
+++ fluid/codeview_panel.fl
@@ -0,0 +1,506 @@
+# data file for the Fltk User Interface Designer (fluid)
+version 1.0400
+header_name {.h}
+code_name {.cxx}
+comment {//
+// Code dialogs for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2023 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
+//
+// Please see the following page on how to report bugs and issues:
+//
+//     https://www.fltk.org/bugs.php
+//
+} {in_source in_header
+}
+
+decl {\#include "fluid.h"} {private local
+}
+
+decl {\#include "file.h"} {private local
+}
+
+decl {\#include "../src/flstring.h"} {selected private local
+}
+
+decl {\#include <FL/Fl_Tabs.H>} {private local
+}
+
+decl {\#include <FL/Fl_Button.H>} {private local
+}
+
+decl {char *cv_source_filename = NULL;} {private local
+}
+
+decl {char *cv_header_filename = NULL;} {private local
+}
+
+decl {char *cv_design_filename = NULL;} {private local
+}
+
+decl {int cv_code_choice;} {public local
+}
+
+decl {extern void select_only(Fl_Type *o);} {private global
+}
+
+decl {extern void reveal_in_browser(Fl_Type *t);} {private global
+}
+
+Function {update_codeview_position()} {
+  comment {Update the header and source code highlighting depending on the
+currently selected object
+
+The Code View system offers an immediate preview of the code
+files that will be generated by FLUID. It also marks the code
+generated for the last selected item in the header and the source
+file.} open return_type void
+} {
+  code {if (!codeview_panel || !codeview_panel->visible())
+    return;
+  if (cv_autoposition->value()==0)
+    return;
+  if (codeview_panel && codeview_panel->visible() && Fl_Type::current) {
+    int pos0 = 0, pos1 = 0;
+    if (cv_source->visible_r()) {
+      switch (cv_code_choice) {
+        case 0: // prolog: not yet (include statements)
+          pos0 = Fl_Type::current->code1_start;
+          pos1 = Fl_Type::current->code2_end;
+          break;
+        case 1: // static: callbacks, menu declarations
+          pos0 = Fl_Type::current->code_static_start;
+          pos1 = Fl_Type::current->code_static_end;
+          break;
+        case 2: // code: entire implementation block including children
+          pos0 = Fl_Type::current->code1_start;
+          pos1 = Fl_Type::current->code2_end;
+          break;
+        case 3: // code1: all implementation code before the children
+          pos0 = Fl_Type::current->code1_start;
+          pos1 = Fl_Type::current->code1_end;
+          break;
+        case 4: // code1: all implementation code before the children
+          pos0 = Fl_Type::current->code2_start;
+          pos1 = Fl_Type::current->code2_end;
+          break;
+      }
+      if (pos0>=0) {
+        if (pos1<pos0)
+          pos1 = cv_source->buffer()->line_end(pos0);
+        cv_source->buffer()->highlight(pos0, pos1);
+        int line = cv_source->buffer()->count_lines(0, pos0);
+        cv_source->scroll(line, 0);
+      }
+    }
+    if (cv_header->visible_r()) {
+      switch (cv_code_choice) {
+        case 0: // prolog: not yet (include statements)
+        case 1: // static: callbacks, menu declarations
+          pos0 = Fl_Type::current->header_static_start;
+          pos1 = Fl_Type::current->header_static_end;
+          break;
+        case 2: // code: entire implementation block including children
+          pos0 = Fl_Type::current->header1_start;
+          pos1 = Fl_Type::current->header2_end;
+          break;
+        case 3: // code1: all implementation code before the children
+          pos0 = Fl_Type::current->header1_start;
+          pos1 = Fl_Type::current->header1_end;
+          break;
+        case 4: // code1: all implementation code before the children
+          pos0 = Fl_Type::current->header2_start;
+          pos1 = Fl_Type::current->header2_end;
+          break;
+      }
+      if (pos0>=0) {
+        if (pos1<pos0)
+          pos1 = cv_header->buffer()->line_end(pos0);
+        cv_header->buffer()->highlight(pos0, pos1);
+        int line = cv_header->buffer()->count_lines(0, pos0);
+        cv_header->scroll(line, 0);
+      }
+    }
+    if (cv_project->visible_r()) {
+      switch (cv_code_choice) {
+        case 0: // prolog: not yet (include statements)
+        case 1: // static: callbacks, menu declarations
+        case 2: // code: entire implementation block including children
+          pos0 = Fl_Type::current->proj1_start;
+          pos1 = Fl_Type::current->proj2_end;
+          break;
+        case 3: // code1: all implementation code before the children
+          pos0 = Fl_Type::current->proj1_start;
+          pos1 = Fl_Type::current->proj1_end;
+          break;
+        case 4: // code1: all implementation code before the children
+          pos0 = Fl_Type::current->proj2_start;
+          pos1 = Fl_Type::current->proj2_end;
+          break;
+      }
+      if (pos0>=0) {
+        if (pos1<pos0)
+          pos1 = cv_project->buffer()->line_end(pos0);
+        cv_project->buffer()->highlight(pos0, pos1);
+        int line = cv_project->buffer()->count_lines(0, pos0);
+        cv_project->scroll(line, 0);
+      }
+    }
+  }} {}
+}
+
+Function {update_codeview_position_cb(class Fl_Tabs*, void*)} {
+  comment {Callback to update the codeview position.} open return_type void
+} {
+  code {// make sure that the selected tab shows the current view
+  update_codeview_cb(0,0);
+  // highlight the selected widget in the selected tab
+  update_codeview_position();} {}
+}
+
+Function {update_codeview_cb(class Fl_Button*, void*)} {
+  comment {Generate a header, source, strings, or design file in a temporary directory
+and load those into the Code Viewer widgets.} open return_type void
+} {
+  code {if (!codeview_panel || !codeview_panel->visible())
+    return;
+
+  if (!cv_source_filename) {
+    cv_source_filename = (char*)malloc(FL_PATH_MAX);
+    fl_strlcpy(cv_source_filename, get_tmpdir().c_str(), FL_PATH_MAX);
+    fl_strlcat(cv_source_filename, "codeview_tmp.cxx", FL_PATH_MAX);
+  }
+  if (!cv_header_filename) {
+    cv_header_filename = (char*)malloc(FL_PATH_MAX);
+    fl_strlcpy(cv_header_filename, get_tmpdir().c_str(), FL_PATH_MAX);
+    fl_strlcat(cv_header_filename, "codeview_tmp.h", FL_PATH_MAX);
+  }
+  if (!cv_design_filename) {
+    cv_design_filename = (char*)malloc(FL_PATH_MAX);
+    fl_strlcpy(cv_design_filename, get_tmpdir().c_str(), FL_PATH_MAX);
+    fl_strlcat(cv_design_filename, "codeview_tmp.fl", FL_PATH_MAX);
+  }
+
+  if (cv_project->visible_r()) {
+    write_file(cv_design_filename, false, true);
+    int top = cv_project->top_line();
+    cv_project->buffer()->loadfile(cv_design_filename);
+    cv_project->scroll(top, 0);
+  } else if (cv_strings->visible_r()) {
+    static const char *exts[] = { ".txt", ".po", ".msg" };
+    char fn[FL_PATH_MAX+1];
+    fl_strlcpy(fn, get_tmpdir().c_str(), FL_PATH_MAX);
+    fl_strlcat(fn, "strings", FL_PATH_MAX);
+    fl_filename_setext(fn, FL_PATH_MAX, exts[g_project.i18n_type]);
+    write_strings(fn);
+    int top = cv_strings->top_line();
+    cv_strings->buffer()->loadfile(fn);
+    cv_strings->scroll(top, 0);
+  } else if (cv_source->visible_r() || cv_header->visible_r()) {
+    Fl_String code_file_name_bak = g_project.code_file_name;
+    g_project.code_file_name = cv_source_filename;
+    Fl_String header_file_name_bak = g_project.header_file_name;
+    g_project.header_file_name = cv_header_filename;
+
+    // generate the code and load the files
+    Fd_Code_Writer f;
+    // generate files
+    if (f.write_code(cv_source_filename, cv_header_filename, true))
+    {
+      // load file into source editor
+      int pos = cv_source->top_line();
+      cv_source->buffer()->loadfile(cv_source_filename);
+      cv_source->scroll(pos, 0);
+      // load file into header editor
+      pos = cv_header->top_line();
+      cv_header->buffer()->loadfile(cv_header_filename);
+      cv_header->scroll(pos, 0);
+      // update the source code highlighting
+      update_codeview_position();
+    }
+
+    g_project.code_file_name = code_file_name_bak;
+    g_project.header_file_name = header_file_name_bak;
+  }} {}
+}
+
+Function {update_codeview_timer(void*)} {
+  comment {This is called by the timer itself
+} open return_type void
+} {
+  code {update_codeview_cb(0,0);} {}
+}
+
+Function {codeview_defer_update()} {open return_type void
+} {
+  code {// we will only update earliest 0.5 seconds after the last change, and only
+    // if no other change was made, so dragging a widget will not generate any
+    // CPU load
+    Fl::remove_timeout(update_codeview_timer, 0);
+    Fl::add_timeout(0.5, update_codeview_timer, 0);} {}
+}
+
+Function {codeview_toggle_visibility()} {
+  comment {Show or hide the source code preview.
+The state is stored in the app preferences.
+} open return_type void
+} {
+  code {if (!codeview_panel) {
+    make_codeview();
+    codeview_panel->callback((Fl_Callback*)toggle_codeview_cb);
+    Fl_Preferences svp(fluid_prefs, "codeview");
+    int autorefresh;
+    svp.get("autorefresh", autorefresh, 1);
+    cv_autorefresh->value(autorefresh);
+    int autoposition;
+    svp.get("autoposition", autoposition, 1);
+    cv_autoposition->value(autoposition);
+    int tab;
+    svp.get("tab", tab, 0);
+    if (tab>=0 && tab<cv_tab->children()) cv_tab->value(cv_tab->child(tab));
+    svp.get("code_choice", cv_code_choice, 2);
+    cv_code_choice_w->value(cv_code_choice_w->find_item_with_argument(cv_code_choice));
+    if (!position_window(codeview_panel,"codeview_pos", 0, 320, 120, 550, 500)) return;
+  }
+
+  if (codeview_panel->visible()) {
+    codeview_panel->hide();
+    codeview_item->label("Show Code View");
+  } else {
+    codeview_panel->show();
+    codeview_item->label("Hide Code View");
+    update_codeview_cb(0,0);
+  }} {}
+}
+
+Function {make_codeview()} {open
+} {
+  Fl_Window codeview_panel {
+    label {Code View}
+    callback toggle_codeview_cb open
+    xywh {389 507 520 515} type Double align 80 resizable size_range {384 120 0 0} visible
+  } {
+    Fl_Tabs cv_tab {
+      callback update_codeview_position_cb open
+      xywh {10 10 500 440} selection_color 4 labelcolor 7 resizable
+    } {
+      Fl_Group cv_source_tab {
+        label Source open
+        xywh {10 35 500 415} labelsize 13 resizable
+      } {
+        Fl_Text_Editor cv_source {
+          xywh {10 40 500 410} textfont 4 textsize 11 resizable
+          code0 {\#include "CodeEditor.h"}
+          code1 {o->linenumber_width(60);}
+          code2 {o->linenumber_size(o->Fl_Text_Display::textsize());}
+          class CodeViewer
+        }
+      }
+      Fl_Group {} {
+        label Header open
+        xywh {10 35 500 415} labelsize 13 hide
+      } {
+        Fl_Text_Editor cv_header {
+          xywh {10 40 500 410} textfont 4 textsize 11 resizable
+          code0 {\#include "CodeEditor.h"}
+          code1 {o->linenumber_width(60);}
+          code2 {o->linenumber_size(o->Fl_Text_Display::textsize());}
+          class CodeViewer
+        }
+      }
+      Fl_Group {} {
+        label Strings open
+        xywh {10 35 500 415} labelsize 13 hide
+      } {
+        Fl_Text_Display cv_strings {
+          xywh {10 40 500 410} textfont 4 textsize 11 resizable
+          code1 {o->linenumber_width(60);}
+          code2 {o->linenumber_size(o->Fl_Text_Display::textsize());}
+          class TextViewer
+        }
+      }
+      Fl_Group {} {
+        label Project open
+        xywh {10 35 500 415} labelsize 13 hide
+      } {
+        Fl_Text_Display cv_project {
+          xywh {10 40 500 410} textfont 4 textsize 11 resizable
+          code1 {o->linenumber_width(60);}
+          code2 {o->linenumber_size(o->Fl_Text_Display::textsize());}
+          class TextViewer
+        }
+      }
+    }
+    Fl_Group cv_find_row {open
+      xywh {10 460 500 20}
+    } {
+      Fl_Button cv_find_text_case {
+        label aA
+        xywh {244 460 25 20} type Toggle labelsize 11
+      }
+      Fl_Input cv_find_text {
+        label {Find:}
+        callback {Fl_Text_Display *e = NULL;
+if (cv_source->visible_r()) {
+  e = cv_source;
+} else if (cv_header->visible_r()) {
+  e = cv_header;
+} else if (cv_project->visible_r()) {
+  e = cv_project;
+}
+if (e) {
+  Fl_Text_Buffer *b = e->buffer();
+  int pos = e->insert_position();
+  int found = b->search_forward(pos, o->value(), &pos, cv_find_text_case->value());
+  if (found) {
+    b->select(pos, pos + (int)strlen(o->value()));
+    e->insert_position(pos);
+    e->show_insert_position();
+  }
+}}
+        xywh {40 460 200 20} labelsize 11 when 15 textsize 11
+      }
+      Fl_Button {} {
+        label {<<}
+        callback {Fl_Text_Display *e = NULL;
+if (cv_source->visible_r()) {
+  e = cv_source;
+} else if (cv_header->visible_r()) {
+  e = cv_header;
+} else if (cv_project->visible_r()) {
+  e = cv_project;
+}
+if (e) {
+  const char *needle = cv_find_text->value();
+  Fl_Text_Buffer *b = e->buffer();
+  int pos = e->insert_position()-1;
+  if (pos < 0) pos = b->length()-1;
+  int found = b->search_backward(pos, needle, &pos, cv_find_text_case->value());
+  if (!found)
+    found = b->search_backward(b->length()-1, needle, &pos, cv_find_text_case->value());
+  if (found) {
+    b->select(pos, pos + (int)strlen(needle));
+    e->insert_position(pos);
+    e->show_insert_position();
+  }
+}}
+        xywh {273 460 25 20} labelsize 11
+      }
+      Fl_Button {} {
+        label {>>}
+        callback {Fl_Text_Display *e = NULL;
+if (cv_source->visible_r()) {
+  e = cv_source;
+} else if (cv_header->visible_r()) {
+  e = cv_header;
+} else if (cv_project->visible_r()) {
+  e = cv_project;
+}
+if (e) {
+  const char *needle = cv_find_text->value();
+  Fl_Text_Buffer *b = e->buffer();
+  int pos = e->insert_position() + 1;
+  if (pos+1 >= b->length()) pos = 0;
+  int found = b->search_forward(pos, needle, &pos, cv_find_text_case->value());
+  if (!found && (pos > 0))
+    found = b->search_forward(0, needle, &pos, cv_find_text_case->value());
+  if (found) {
+    b->select(pos, pos + (int)strlen(needle));
+    e->insert_position(pos);
+    e->show_insert_position();
+  }
+}}
+        xywh {298 460 25 20} labelsize 11
+      }
+      Fl_Button {} {
+        label Reveal
+        callback {if (codeview_panel && codeview_panel->visible()) {
+  Fl_Type *node = NULL;
+  if (cv_source->visible_r())
+    node = Fl_Type::find_in_text(0, cv_source->insert_position());
+  else if (cv_header->visible_r())
+    node = Fl_Type::find_in_text(1, cv_header->insert_position());
+  else if (cv_project->visible_r())
+    node = Fl_Type::find_in_text(2, cv_project->insert_position());
+  if (node) {
+    select_only(node);
+    reveal_in_browser(node);
+    if (Fl::event_clicks()==1) // double click
+      node->open();
+  }
+}}
+        xywh {327 460 61 20} labelsize 11
+      }
+      Fl_Box {} {
+        xywh {490 460 20 20} resizable
+      }
+    }
+    Fl_Group cv_settings_row {open
+      xywh {10 485 500 20}
+    } {
+      Fl_Button {} {
+        label Refresh
+        callback update_codeview_cb
+        xywh {10 485 61 20} labelsize 11
+      }
+      Fl_Light_Button cv_autorefresh {
+        label {Auto-Refresh}
+        xywh {77 485 91 20} labelsize 11
+        code0 {o->callback((Fl_Callback*)update_codeview_cb);}
+      }
+      Fl_Light_Button cv_autoposition {
+        label {Auto-Position}
+        xywh {172 485 89 20} labelsize 11
+      }
+      Fl_Choice cv_code_choice_w {
+        callback {cv_code_choice = (int)o->mvalue()->argument();
+update_codeview_position();} open
+        xywh {265 485 70 20} down_box BORDER_BOX labelsize 11 textsize 11
+      } {
+        MenuItem {} {
+          label prolog
+          user_data 0 user_data_type long
+          tooltip {Include statements in header or source code} xywh {0 0 100 20} labelsize 11 hide
+        }
+        MenuItem {} {
+          label static
+          user_data 1 user_data_type long
+          tooltip {static declarations in source code} xywh {10 10 100 20} labelsize 11
+        }
+        MenuItem {} {
+          label code
+          user_data 2 user_data_type long
+          tooltip {widget code block including children} xywh {20 20 100 20} labelsize 11
+        }
+        MenuItem {} {
+          label {code 1}
+          user_data 3 user_data_type long
+          tooltip {widget code block before children} xywh {30 30 100 20} labelsize 11
+        }
+        MenuItem {} {
+          label {code 2}
+          user_data 4 user_data_type long
+          tooltip {widget code block after children} xywh {40 40 100 20} labelsize 11
+        }
+      }
+      Fl_Box {} {
+        xywh {375 485 80 20} resizable
+      }
+      Fl_Button {} {
+        label Close
+        callback toggle_codeview_b_cb
+        xywh {460 485 50 20} labelsize 11
+      }
+    }
+  }
+}
+
+comment {
+//} {in_source in_header
+}
diff --git fluid/codeview_panel.h fluid/codeview_panel.h
new file mode 100644
index 0000000..8fa5663
--- /dev/null
+++ fluid/codeview_panel.h
@@ -0,0 +1,58 @@
+//
+// Code dialogs for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2023 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
+//
+// Please see the following page on how to report bugs and issues:
+//
+//     https://www.fltk.org/bugs.php
+//
+
+// generated by Fast Light User Interface Designer (fluid) version 1.0400
+
+#ifndef codeview_panel_h
+#define codeview_panel_h
+#include <FL/Fl.H>
+extern int cv_code_choice;
+void update_codeview_position();
+void update_codeview_position_cb(class Fl_Tabs*, void*);
+void update_codeview_cb(class Fl_Button*, void*);
+void update_codeview_timer(void*);
+void codeview_defer_update();
+void codeview_toggle_visibility();
+#include <FL/Fl_Double_Window.H>
+extern void toggle_codeview_cb(Fl_Double_Window*, void*);
+extern Fl_Double_Window *codeview_panel;
+#include <FL/Fl_Tabs.H>
+extern Fl_Tabs *cv_tab;
+#include <FL/Fl_Group.H>
+extern Fl_Group *cv_source_tab;
+#include "CodeEditor.h"
+extern CodeViewer *cv_source;
+extern CodeViewer *cv_header;
+extern TextViewer *cv_strings;
+extern TextViewer *cv_project;
+extern Fl_Group *cv_find_row;
+#include <FL/Fl_Button.H>
+extern Fl_Button *cv_find_text_case;
+#include <FL/Fl_Input.H>
+extern Fl_Input *cv_find_text;
+#include <FL/Fl_Box.H>
+extern Fl_Group *cv_settings_row;
+#include <FL/Fl_Light_Button.H>
+extern Fl_Light_Button *cv_autorefresh;
+extern Fl_Light_Button *cv_autoposition;
+#include <FL/Fl_Choice.H>
+extern Fl_Choice *cv_code_choice_w;
+extern void toggle_codeview_b_cb(Fl_Button*, void*);
+Fl_Double_Window* make_codeview();
+extern Fl_Menu_Item menu_cv_code_choice_w[];
+#endif
+
+//
diff --git fluid/custom_widgets.cxx fluid/custom_widgets.cxx
index 99cfbbb..887e2ba 100644
--- fluid/custom_widgets.cxx
+++ fluid/custom_widgets.cxx
@@ -55,7 +55,7 @@ int Widget_Bin_Button::handle(int inEvent)
         // fake a drag outside of the widget
         Fl::e_x = x()-1;
         Fl_Button::handle(inEvent);
-        // fake a buttton release
+        // fake a button release
         Fl_Button::handle(FL_RELEASE);
         // make it into a dnd event
         const char *type_name = (const char*)user_data();
diff --git fluid/documentation/CMakeLists.txt fluid/documentation/CMakeLists.txt
new file mode 100644
index 0000000..fb2fac4
--- /dev/null
+++ fluid/documentation/CMakeLists.txt
@@ -0,0 +1,232 @@
+#
+# CMakeLists.txt to build docs for the FLTK project using CMake (www.cmake.org)
+#
+# Copyright 1998-2024 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
+#
+# Please see the following page on how to report bugs and issues:
+#
+#     https://www.fltk.org/bugs.php
+#
+
+set(DOCS)
+set(GIT_REVISION "")
+set(YEAR "")
+set(CURRENT_DATE "")
+
+#------------------------------------------------
+# generate files used for both HTML and PDF docs
+#------------------------------------------------
+
+if(FLTK_BUILD_FLUID_DOCS OR FLTK_BUILD_PDF_DOCS)
+
+  # create required variables
+
+  execute_process(COMMAND date "+%Y"
+    OUTPUT_VARIABLE YEAR
+    OUTPUT_STRIP_TRAILING_WHITESPACE
+  )
+
+  # note: current locale is used for abbreviated month
+  execute_process(COMMAND date "+%b %d, %Y"
+    OUTPUT_VARIABLE CURRENT_DATE
+    OUTPUT_STRIP_TRAILING_WHITESPACE
+  )
+
+  # find git revision
+
+  # FIXME: This must also work with tarballs where git is not available.
+  #        For now we just ignore errors and set GIT_REVISION = "unknown".
+  #        In the future tarball/zip generation should create a file
+  #        that contains the git revision.
+
+  execute_process(COMMAND
+    git rev-parse --short=10 HEAD
+    OUTPUT_VARIABLE GIT_REVISION
+    OUTPUT_STRIP_TRAILING_WHITESPACE
+    WORKING_DIRECTORY ${FLTK_SOURCE_DIR}
+    ERROR_QUIET
+  )
+
+  # set to "'unknown'" if git is not available
+  if(GIT_REVISION STREQUAL "")
+    set(GIT_REVISION "'unknown'")
+  endif()
+
+  # Find "short" doxygen version if it was built from Git
+  # Note: this is still needed in CMake 3.12.0 but later CMake versions
+  #       (notably 3.25) remove the Git revision in 'DOXYGEN_VERSION'.
+  # Todo: Find the "first good" CMake version and remove this redundant
+  #       code once we require this as our minimal version and replace the
+  #       variable DOXYGEN_VERSION_SHORT with DOXYGEN_VERSION below.
+
+  if(DOXYGEN_FOUND)
+    # strip trailing git revision if doxygen was built from source
+    string(REGEX REPLACE " .*$" "" DOXYGEN_VERSION_SHORT ${DOXYGEN_VERSION})
+  endif(DOXYGEN_FOUND)
+
+  # configure copyright.dox (includes current year)
+  configure_file(
+    ${CMAKE_CURRENT_SOURCE_DIR}/copyright.dox.in
+    ${CMAKE_CURRENT_BINARY_DIR}/copyright.dox
+    @ONLY
+  )
+
+  # configure generated.dox (includes date and versions)
+  configure_file(
+    ${CMAKE_CURRENT_SOURCE_DIR}/generated.dox.in
+    ${CMAKE_CURRENT_BINARY_DIR}/generated.dox
+    @ONLY
+  )
+
+endif(FLTK_BUILD_FLUID_DOCS OR FLTK_BUILD_PDF_DOCS)
+
+#-------------------------------
+# build FLUID html documentation
+#-------------------------------
+
+if(FLTK_BUILD_FLUID_DOCS)
+
+  #list(APPEND DOCS html)
+
+  # generate Doxygen file "Doxyfile"
+
+  set(GENERATE_FLUID_HTML YES)
+  set(GENERATE_LATEX NO)
+  set(LATEX_HEADER   "")
+  set(FL_HTML_INDEX  "FL_HTML_INDEX")
+  set(DOXYFILE       "Doxyfile")
+  set(LOGFILE        "${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}_error.log")
+
+  # configure Doxygen input file for HTML docs (Doxyfile.in)
+
+  configure_file(
+    ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
+    ${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}.in
+    @ONLY
+  )
+
+  # convert Doxyfile to used doxygen version
+
+  add_custom_command(
+    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}
+    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/convert_doxyfile
+            ${DOXYGEN_EXECUTABLE}
+            ${DOXYFILE}.in
+            ${DOXYFILE}
+            ${LOGFILE}
+    BYPRODUCTS ${LOGFILE}
+    COMMENT "Converting ${DOXYFILE} to doxygen version ${DOXYGEN_VERSION_SHORT}" VERBATIM
+  )
+
+  # generate screen shot using FLUID --autodoc target_dir
+  # generate HTML documentation
+
+  add_custom_target(fluid_docs
+    COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/src/
+    COMMAND fltk::fluid -scheme gtk+ --autodoc ${CMAKE_CURRENT_BINARY_DIR}/src/
+    COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYFILE}
+    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}
+    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+    COMMENT "Generating HTML documentation" VERBATIM
+  )
+  add_dependencies(fluid_docs fltk::fluid)
+
+endif(FLTK_BUILD_FLUID_DOCS)
+
+#--------------------------
+# build pdf documentation
+#--------------------------
+
+if(FLTK_BUILD_PDF_DOCS AND FLTK_BUILD_FLUID_DOCS)
+
+  # generate Doxygen input file "Doxybook"
+
+  set(GENERATE_FLUID_HTML  NO)
+  set(GENERATE_LATEX YES)
+  set(LATEX_HEADER   "${CMAKE_CURRENT_BINARY_DIR}/fluid-book.tex")
+  set(FL_HTML_INDEX  "FL_NO_HTML_INDEX")
+  set(DOXYFILE       "Doxybook")
+  set(LOGFILE        "${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}_error.log")
+
+  # configure Doxygen input file for PDF docs (Doxybook.in)
+
+  configure_file(
+    ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
+    ${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}.in
+    @ONLY
+  )
+
+  # convert Doxybook to current doxygen version
+
+  add_custom_command(
+    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}
+    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/convert_doxyfile
+            ${DOXYGEN_EXECUTABLE}
+            ${DOXYFILE}.in
+            ${DOXYFILE}
+            ${LOGFILE}
+    BYPRODUCTS ${LOGFILE}
+    COMMENT "Converting ${DOXYFILE} to doxygen version ${DOXYGEN_VERSION_SHORT}" VERBATIM
+  )
+
+  # generate LaTeX title fluid-title.tex
+
+  configure_file(
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/fluid-title.tex.in
+    ${CMAKE_CURRENT_BINARY_DIR}/fluid-title.tex
+    @ONLY
+  )
+
+  # generate fluid.pdf
+
+  add_custom_command(
+    OUTPUT  ${CMAKE_CURRENT_BINARY_DIR}/fluid.pdf
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/make_header
+            ${DOXYGEN_EXECUTABLE}
+            ${CMAKE_CURRENT_BINARY_DIR}/fluid-title.tex
+            ${CMAKE_CURRENT_BINARY_DIR}/fluid-book.tex
+    COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYFILE}
+    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/make_pdf
+    COMMAND cp -f latex/refman.pdf fluid.pdf
+    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}
+            ${CMAKE_CURRENT_BINARY_DIR}/fluid-title.tex
+    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+    COMMENT "Generating FLUID PDF documentation" VERBATIM
+  )
+
+  # add target 'pdf'
+
+  add_custom_target(fluid_pdf
+    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/fluid.pdf
+  )
+  add_dependencies(fluid_pdf fluid_docs)
+
+endif(FLTK_BUILD_PDF_DOCS AND FLTK_BUILD_FLUID_DOCS)
+
+#---------------------------------------
+# install FLUID html + pdf documentation
+#---------------------------------------
+
+if(FLTK_INSTALL_FLUID_DOCS AND FLTK_BUILD_FLUID_DOCS)
+
+  install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html
+    DESTINATION ${FLTK_DATADIR}/doc/fltk/fluid
+  )
+
+endif(FLTK_INSTALL_FLUID_DOCS AND FLTK_BUILD_FLUID_DOCS)
+
+if(FLTK_INSTALL_PDF_DOCS AND FLTK_BUILD_PDF_DOCS AND FLTK_BUILD_FLUID_DOCS)
+
+  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/fluid.pdf
+    DESTINATION ${FLTK_DATADIR}/doc/fltk/
+  )
+
+endif(FLTK_INSTALL_PDF_DOCS AND FLTK_BUILD_PDF_DOCS AND FLTK_BUILD_FLUID_DOCS)
diff --git fluid/documentation/Doxyfile.in fluid/documentation/Doxyfile.in
new file mode 100644
index 0000000..f625dd5
--- /dev/null
+++ fluid/documentation/Doxyfile.in
@@ -0,0 +1,2485 @@
+# Doxyfile 1.8.14
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "FLUID for FLTK @FLTK_VERSION@"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = .
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = NO
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines (in the resulting output). You can put ^^ in the value part of an
+# alias to insert a newline as if a physical newline was in the original file.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 0.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS   = 0
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = NO
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = YES
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       = @FL_HTML_INDEX@
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = NO
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = @CMAKE_CURRENT_SOURCE_DIR@/src/index.dox \
+                         @CMAKE_CURRENT_SOURCE_DIR@/src/page_introduction.dox \
+                         @CMAKE_CURRENT_SOURCE_DIR@/src/page_commandline.dox \
+                         @CMAKE_CURRENT_SOURCE_DIR@/src/page_interactive.dox \
+                         @CMAKE_CURRENT_SOURCE_DIR@/src/page_main_window.dox \
+                         @CMAKE_CURRENT_SOURCE_DIR@/src/page_widgetbin_panel.dox \
+                         @CMAKE_CURRENT_SOURCE_DIR@/src/page_edit_window.dox \
+                         @CMAKE_CURRENT_SOURCE_DIR@/src/page_functional_nodes.dox \
+                         @CMAKE_CURRENT_SOURCE_DIR@/src/page_widget_panel.dox \
+                         @CMAKE_CURRENT_SOURCE_DIR@/src/page_setting_dialog.dox \
+                         @CMAKE_CURRENT_SOURCE_DIR@/src/page_codeview_panel.dox \
+                         @CMAKE_CURRENT_SOURCE_DIR@/src/page_tutorial.dox \
+                         @CMAKE_CURRENT_SOURCE_DIR@/src/page_appendices.dox
+                         
+#                         @FLTK_SOURCE_DIR@/fluid
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
+# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
+
+FILE_PATTERNS          = *.H \
+                         *.h \
+                         *.c \
+                         *.cxx \
+                         *.dox
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+# @FLTK_SOURCE_DIR@/src/drivers/
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+#                         */src/*_win32.cxx \
+#                         */src/*_mac.cxx \
+#                         */src/*_x.cxx \
+#                         */src/xdg* \
+#                         */src/text-input*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           =
+#                         @CMAKE_CURRENT_SOURCE_DIR@/../test \
+#                         @CMAKE_CURRENT_SOURCE_DIR@/../examples \
+#                         @CMAKE_CURRENT_BINARY_DIR@ \
+#                         @CMAKE_CURRENT_SOURCE_DIR@
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       = *.cxx \
+                         *.h \
+                         *.H \
+                         *.fl
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             = @CMAKE_CURRENT_SOURCE_DIR@/src \
+                         @CMAKE_CURRENT_BINARY_DIR@/src
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see https://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+#                         fl_ \
+#                         FL_ \
+#                         Fl_
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = @GENERATE_FLUID_HTML@
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output
+# should be rendered with a dark or light theme.
+# Possible values are: LIGHT always generate light mode output, DARK always
+# generate dark mode output, AUTO_LIGHT automatically set the mode according to
+# the user preference, use light mode if no preference is set (the default),
+# AUTO_DARK automatically set the mode according to the user preference, use
+# dark mode if no preference is set and TOGGLE allow to user to switch between
+# light and dark mode via a button.
+# The default value is: AUTO_LIGHT.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+# Note: since doxygen 1.9.5
+
+HTML_COLORSTYLE        = TOGGLE
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via Javascript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have Javascript,
+# like the Qt help browser.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_MENUS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: https://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See https://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = YES
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://doc.qt.io/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://doc.qt.io/qt-4.8/qthelpproject.html#virtual-folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://doc.qt.io/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = YES
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# https://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from https://www.mathjax.org before deployment.
+# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: https://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: https://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = @GENERATE_LATEX@
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           = @LATEX_HEADER@
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = YES
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             = FL_DOXYGEN \
+                         FL_ABI_VERSION=99999 \
+                         FLTK_HAVE_CAIRO \
+                         HAVE_GL \
+                         HAVE_GL_OVERLAY \
+                         FL_EXPORT:= \
+                         __cplusplus
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      = FL_DEPRECATED
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git fluid/documentation/convert_doxyfile fluid/documentation/convert_doxyfile
new file mode 100755
index 0000000..1e06e76
--- /dev/null
+++ fluid/documentation/convert_doxyfile
@@ -0,0 +1,44 @@
+#!/bin/sh
+#
+# Convert 'Doxyfile.in' to 'Doxyfile' or 'Doxybook' for doxygen docs
+#
+# Usage:
+#
+#   $ sh convert_doxyfile doxygen_path input output logfile
+#
+# where
+# - 'doxygen_path' is the full path to the doxygen executable or just
+#   'doxygen' if this is in the user's PATH. If the full path is used
+#   an arbitrary doxygen executable and thus doxygen version can be used.
+# - 'input' is the file 'Doxyfile.in' stored in Git or any other file.
+# - 'output' is the generated doxygen file, usually either 'Doxyfile'
+#   or 'Doxybook' which will be used subsequently to generate the
+#   HTML or PDF docs, respectively.
+#
+# Doxygen warnings and errors are stored in 'logfile' for review.
+#
+#=======================================================================
+# This script requires a posix shell and uses the following commands:
+#   'echo', 'date', and (obviously) doxygen.
+#=======================================================================
+
+# doxygen command, input and output file names
+
+DOXYGEN="$1"
+ INFILE="$2"
+OUTFILE="$3"
+LOGFILE="$4"
+
+# get doxygen version
+
+VERSION=$("$DOXYGEN" --version)
+
+# write info header to LOGFILE
+
+echo "$OUTFILE created by doxygen version $VERSION" > $LOGFILE
+echo "  at `date`" >> $LOGFILE
+echo "" >> $LOGFILE
+
+# convert doxygen file and append errors and warnings to LOGFILE
+
+"${DOXYGEN}" -u -s - < $INFILE > $OUTFILE 2>> $LOGFILE
diff --git fluid/documentation/copyright.dox.in fluid/documentation/copyright.dox.in
new file mode 100644
index 0000000..990de88
--- /dev/null
+++ fluid/documentation/copyright.dox.in
@@ -0,0 +1 @@
+Copyright &copy; 1998 - @YEAR@ by Bill Spitzak and others.
diff --git fluid/documentation/generated.dox.in fluid/documentation/generated.dox.in
new file mode 100644
index 0000000..9ab6987
--- /dev/null
+++ fluid/documentation/generated.dox.in
@@ -0,0 +1,6 @@
+<br>
+<small>
+  Generated on @CURRENT_DATE@
+  from Git revision @GIT_REVISION@
+  by Doxygen @DOXYGEN_VERSION_SHORT@
+</small>
diff --git fluid/documentation/make_header fluid/documentation/make_header
new file mode 100755
index 0000000..58df10a
--- /dev/null
+++ fluid/documentation/make_header
@@ -0,0 +1,63 @@
+#!/bin/sh
+#
+# Create a new LaTeX header file for doxygen PDF docs
+#
+# Note: this LaTeX file depends on Doxygen and LaTeX versions, resp.
+# and needs therefore to be created with current Doxygen and LaTeX
+# versions on the build system.
+#
+# Usage:
+#
+#   $ sh make_header doxygen_path input-file output-file
+#
+# where
+# - 'doxygen_path' is the full path to the doxygen executable
+#   or just 'doxygen'. If the full path is used an arbitrary
+#   doxygen executable and thus doxygen version can be used.
+# - 'input-file' is the pure (LaTeX) title page (template)
+# - 'output-file' is the generated (LaTeX) title page (template)
+#   that is used by `make' or `cmake` to generate the final LaTeX
+#   page header (combined doxygen template + FLTK title page).
+#
+#=======================================================================
+# This script requires a posix shell and uses the following commands:
+# cat, rm and sed and (obviously) doxygen
+#=======================================================================
+
+# input and output file names
+DOXY_CMD="$1"
+FLTK_HEAD="$2"
+DOXY_HEAD="$3"
+# temp file
+DOXY_TEMP="doxy-header.tex.$$"
+
+if test x$FLTK_HEAD = x; then
+  echo "usage: $0 fltk-header-file output-file"
+  exit 1
+fi
+
+if test x$DOXY_HEAD = x; then
+  echo "usage: $0 fltk-header-file output-file"
+  exit 1
+fi
+
+# Create the doxygen LaTeX header template and replace the LaTeX
+# code between (and including) the lines containing
+# - 'begin{titlepage}' and
+# - 'end{titlepage}'
+# with our PDF document title page (LaTeX code) and write the
+# result to $DOXY_HEAD.
+
+"$DOXY_CMD" -w latex $DOXY_TEMP /dev/null /dev/null
+
+# combine three parts of these files to the output file
+# using '( ... ) > $DOXY_HEAD' to write (concatenate)
+# all three parts to one file
+
+( sed -e'/begin{titlepage}/,$d' < $DOXY_TEMP
+  cat $FLTK_HEAD
+  sed -e'1,/end{titlepage}/d' < $DOXY_TEMP
+) > $DOXY_HEAD
+
+# cleanup
+rm -f $DOXY_TEMP
diff --git fluid/documentation/make_pdf fluid/documentation/make_pdf
new file mode 100755
index 0000000..abc7b37
--- /dev/null
+++ fluid/documentation/make_pdf
@@ -0,0 +1,41 @@
+#! /bin/sh
+#
+# Makefile helper script for the Fast Light Tool Kit (FLTK) documentation.
+#
+# Copyright 1998-2020 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
+#
+# Please see the following page on how to report bugs and issues:
+#
+#      https://www.fltk.org/bugs.php
+#
+
+# This script generates latex/refman.pdf after doxygen has been executed.
+#
+# Input:  run `doxygen Doxybook' (creates files in subdirectory latex)
+# Output: latex/refman.pdf (if successful)
+#
+# Next step: cp -f latex/refman.pdf fluid.pdf (why is this extra step needed ?)
+#
+# Working directory: fltk/documentation
+#
+# Used in: Makefile and CMakeLists.txt
+
+( cd latex
+  pdflatex --interaction=nonstopmode refman.tex
+  makeindex refman.idx
+  pdflatex --interaction=nonstopmode refman.tex
+  latex_count=5
+  while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log \
+	  && [ $latex_count -gt 0 ]
+    do
+      echo "Rerunning pdflatex ..."
+      pdflatex --interaction=nonstopmode refman.tex
+      latex_count=`expr $latex_count - 1`
+    done
+  cd ..) > pdfall.log 2>&1
diff --git fluid/documentation/src/1of7GUIs.png fluid/documentation/src/1of7GUIs.png
new file mode 100644
index 0000000..a7a98df
Binary files /dev/null and fluid/documentation/src/1of7GUIs.png differ
diff --git fluid/documentation/src/cubeview.png fluid/documentation/src/cubeview.png
new file mode 100644
index 0000000..877be18
Binary files /dev/null and fluid/documentation/src/cubeview.png differ
diff --git fluid/documentation/src/edit_live_resize.png fluid/documentation/src/edit_live_resize.png
new file mode 100644
index 0000000..3ff6013
Binary files /dev/null and fluid/documentation/src/edit_live_resize.png differ
diff --git fluid/documentation/src/edit_outside.png fluid/documentation/src/edit_outside.png
new file mode 100644
index 0000000..8755a92
Binary files /dev/null and fluid/documentation/src/edit_outside.png differ
diff --git fluid/documentation/src/edit_overlap.png fluid/documentation/src/edit_overlap.png
new file mode 100644
index 0000000..0e2264a
Binary files /dev/null and fluid/documentation/src/edit_overlap.png differ
diff --git fluid/documentation/src/edit_select_group.png fluid/documentation/src/edit_select_group.png
new file mode 100644
index 0000000..1959929
Binary files /dev/null and fluid/documentation/src/edit_select_group.png differ
diff --git fluid/documentation/src/edit_select_multiple.png fluid/documentation/src/edit_select_multiple.png
new file mode 100644
index 0000000..4df984b
Binary files /dev/null and fluid/documentation/src/edit_select_multiple.png differ
diff --git fluid/documentation/src/edit_snap_grid.png fluid/documentation/src/edit_snap_grid.png
new file mode 100644
index 0000000..0a4a65d
Binary files /dev/null and fluid/documentation/src/edit_snap_grid.png differ
diff --git fluid/documentation/src/edit_snap_group.png fluid/documentation/src/edit_snap_group.png
new file mode 100644
index 0000000..5638ee3
Binary files /dev/null and fluid/documentation/src/edit_snap_group.png differ
diff --git fluid/documentation/src/edit_snap_sibling.png fluid/documentation/src/edit_snap_sibling.png
new file mode 100644
index 0000000..c1b0cb4
Binary files /dev/null and fluid/documentation/src/edit_snap_sibling.png differ
diff --git fluid/documentation/src/edit_snap_size.png fluid/documentation/src/edit_snap_size.png
new file mode 100644
index 0000000..bcc4558
Binary files /dev/null and fluid/documentation/src/edit_snap_size.png differ
diff --git fluid/documentation/src/edit_window.png fluid/documentation/src/edit_window.png
new file mode 100644
index 0000000..fcf325e
Binary files /dev/null and fluid/documentation/src/edit_window.png differ
diff --git fluid/documentation/src/flBox.png fluid/documentation/src/flBox.png
new file mode 100644
index 0000000..acc3e7e
Binary files /dev/null and fluid/documentation/src/flBox.png differ
diff --git fluid/documentation/src/flClass.png fluid/documentation/src/flClass.png
new file mode 100644
index 0000000..ed707b3
Binary files /dev/null and fluid/documentation/src/flClass.png differ
diff --git fluid/documentation/src/flCode.png fluid/documentation/src/flCode.png
new file mode 100644
index 0000000..f5510a3
Binary files /dev/null and fluid/documentation/src/flCode.png differ
diff --git fluid/documentation/src/flCodeBlock.png fluid/documentation/src/flCodeBlock.png
new file mode 100644
index 0000000..9092d6c
Binary files /dev/null and fluid/documentation/src/flCodeBlock.png differ
diff --git fluid/documentation/src/flComment.png fluid/documentation/src/flComment.png
new file mode 100644
index 0000000..ed3dc5e
Binary files /dev/null and fluid/documentation/src/flComment.png differ
diff --git fluid/documentation/src/flData.png fluid/documentation/src/flData.png
new file mode 100644
index 0000000..bf48487
Binary files /dev/null and fluid/documentation/src/flData.png differ
diff --git fluid/documentation/src/flDeclaration.png fluid/documentation/src/flDeclaration.png
new file mode 100644
index 0000000..9921330
Binary files /dev/null and fluid/documentation/src/flDeclaration.png differ
diff --git fluid/documentation/src/flDeclarationBlock.png fluid/documentation/src/flDeclarationBlock.png
new file mode 100644
index 0000000..65f1b69
Binary files /dev/null and fluid/documentation/src/flDeclarationBlock.png differ
diff --git fluid/documentation/src/flFunction.png fluid/documentation/src/flFunction.png
new file mode 100644
index 0000000..9c5b7e9
Binary files /dev/null and fluid/documentation/src/flFunction.png differ
diff --git fluid/documentation/src/flWidgetClass.png fluid/documentation/src/flWidgetClass.png
new file mode 100644
index 0000000..92fd7d0
Binary files /dev/null and fluid/documentation/src/flWidgetClass.png differ
diff --git fluid/documentation/src/flWindow.png fluid/documentation/src/flWindow.png
new file mode 100644
index 0000000..84a8508
Binary files /dev/null and fluid/documentation/src/flWindow.png differ
diff --git fluid/documentation/src/fluid-128.png fluid/documentation/src/fluid-128.png
new file mode 100644
index 0000000..cf9cf40
Binary files /dev/null and fluid/documentation/src/fluid-128.png differ
diff --git fluid/documentation/src/fluid-title.tex.in fluid/documentation/src/fluid-title.tex.in
new file mode 100644
index 0000000..f0036d4
--- /dev/null
+++ fluid/documentation/src/fluid-title.tex.in
@@ -0,0 +1,35 @@
+%
+% FLUID PDF documentation title page (LaTeX)
+%
+\begin{titlepage}
+\vspace*{4cm}
+\begin{center}%
+{\Huge FLUID for FLTK @FLTK_VERSION@ User Manual}\\
+\vspace*{2cm}
+\begin{DoxyImageNoCaption}
+ \mbox{\includegraphics[width=4cm]{fluid-128.png}}
+\end{DoxyImageNoCaption}\\
+\vspace*{2cm}
+{\Large
+By F. Costantini, D. Gibson, M. Melcher, \\
+A. Schlosser, B. Spitzak, and M. Sweet.}\\
+\vspace*{1.5cm}
+{\large Copyright © 1998 - @YEAR@ by Bill Spitzak and others.}\\
+\vspace*{0.75cm}
+{\small
+This software and manual are provided under the terms of the GNU Library General Public License.}\\
+{\small
+Permission is granted to reproduce this manual or any portion for any purpose,}\\
+{\small
+provided this copyright and permission notice are preserved.}\\
+\vspace*{1.5cm}
+{\large Generated by Doxygen @DOXY_VERSION@}\\
+\vspace*{0.5cm}
+\today{}\\
+\vspace*{0.5cm}
+{\small Git revision @GIT_REVISION@}\\
+\end{center}
+\end{titlepage}
+%
+% end of FLUID PDF documentation title page (LaTeX)
+%
diff --git fluid/documentation/src/fluid1.png fluid/documentation/src/fluid1.png
new file mode 100644
index 0000000..ddfd8ce
Binary files /dev/null and fluid/documentation/src/fluid1.png differ
diff --git fluid/documentation/src/fluid2.png fluid/documentation/src/fluid2.png
new file mode 100644
index 0000000..0438293
Binary files /dev/null and fluid/documentation/src/fluid2.png differ
diff --git fluid/documentation/src/fluid3-cxx.png fluid/documentation/src/fluid3-cxx.png
new file mode 100644
index 0000000..5ac96a4
Binary files /dev/null and fluid/documentation/src/fluid3-cxx.png differ
diff --git fluid/documentation/src/fluid4.png fluid/documentation/src/fluid4.png
new file mode 100644
index 0000000..64b2548
Binary files /dev/null and fluid/documentation/src/fluid4.png differ
diff --git fluid/documentation/src/fluid_flow_chart.png fluid/documentation/src/fluid_flow_chart.png
new file mode 100644
index 0000000..71d50e2
Binary files /dev/null and fluid/documentation/src/fluid_flow_chart.png differ
diff --git fluid/documentation/src/fluid_flow_chart_800.png fluid/documentation/src/fluid_flow_chart_800.png
new file mode 100644
index 0000000..1e5bd7c
Binary files /dev/null and fluid/documentation/src/fluid_flow_chart_800.png differ
diff --git fluid/documentation/src/fluid_gui_overview_800.png fluid/documentation/src/fluid_gui_overview_800.png
new file mode 100644
index 0000000..d61156a
Binary files /dev/null and fluid/documentation/src/fluid_gui_overview_800.png differ
diff --git fluid/documentation/src/index.dox fluid/documentation/src/index.dox
new file mode 100644
index 0000000..984981d
--- /dev/null
+++ fluid/documentation/src/index.dox
@@ -0,0 +1,118 @@
+
+
+/**
+
+ \cond FL_HTML_INDEX
+
+ \mainpage FLUID User Manual
+
+
+ <TABLE CELLPADDING="8" CELLSPACING="0" SUMMARY="TITLE BAR" WIDTH="100%" BORDER="0">
+ <TR>
+   <TD><CENTER>
+     \image html fluid-128.png
+     \image latex fluid-128.png  "" width=3cm
+   </CENTER></TD>
+   <TD><CENTER>
+     <B>FLUID 1.4.0 User Manual</B>
+
+     By F.&nbsp;Costantini, D.&nbsp;Gibson, M.&nbsp;Melcher,
+     A.&nbsp;Schlosser, B.&nbsp;Spitzak and M.&nbsp;Sweet.
+
+     Copyright © 1998 - 2024 by Bill Spitzak and others.
+   </CENTER></TD>
+ </TR>
+ </TABLE>
+
+ <TABLE CELLPADDING="8" CELLSPACING="0" SUMMARY="TITLE BAR" WIDTH="100%" BORDER="0">
+ <TR>
+   <TD style="text-align: center;">
+     This software and manual are provided under the terms of the GNU
+     Library General Public License. Permission is granted to reproduce
+     this manual or any portion for any purpose, provided this copyright
+     and permission notice are preserved.
+   </TD>
+ </TR>
+ </TABLE>
+
+ <TABLE CELLPADDING="8" CELLSPACING="0" SUMMARY="Table of Contents" WIDTH="100%" BORDER="0">
+ <TR>
+ <TD ALIGN="LEFT" VALIGN="TOP">
+
+ \subpage page_introduction
+ - \ref introduction_workflow
+
+ \subpage page_commandline
+ - \ref commandline_options
+ - \ref commandline_passive
+ - \ref commandline_windows
+
+ \subpage page_interactive
+
+ \subpage page_main_window
+ - \ref main_titlebar
+ - \ref main_menubar
+ - \ref main_widget_browser
+ - \ref main_menu_items
+
+ \subpage page_widgetbin_panel
+
+ \subpage page_edit_window
+ - \ref edit_selection
+ - \ref edit_layout
+ - \ref edit_snap
+ - \ref edit_resize
+
+ \subpage page_widget_panel
+ - \ref widget_panel_gui
+ - \ref widget_panel_style
+ - \ref widget_panel_cpp
+ - \ref widget_panel_grid
+ - \ref widget_panel_gridc
+
+ </TD>
+ <TD ALIGN="LEFT" VALIGN="TOP">
+
+ \subpage page_functional_nodes
+ - \ref functional_function
+ - \ref functional_code
+ - \ref functional_codeblock
+ - \ref functional_decl
+ - \ref functional_declblock
+ - \ref functional_class
+ - \ref functional_widgetclass
+ - \ref functional_comment
+ - \ref functional_data
+
+ \subpage page_codeview_panel
+ - \ref codeview_find
+ - \ref codeview_settings
+
+ \subpage page_setting_dialog
+ - \ref setting_general
+ - \ref setting_project
+ - \ref setting_layout
+ - \ref setting_shell
+ - \ref setting_i18n
+ - \ref setting_user
+
+ \subpage page_tutorial
+ - \ref fluid_hello_world_tutorial
+ - \ref fluid_1of7guis_tutorial
+ - \ref fluid_cubeview_tutorial
+   - \ref fluid_cubeview_ui
+   - \ref fluid_addconst
+   - \ref fluid_gencode
+
+ \subpage page_appendices
+ - \ref appendix_keyboard_shortcuts
+ - \ref appendix_fileformat
+ - \ref appendix_licenses
+
+ </TD>
+ </TR>
+ </TABLE>
+
+ \endcond
+
+*/
diff --git fluid/documentation/src/main_titlebar.png fluid/documentation/src/main_titlebar.png
new file mode 100644
index 0000000..128ecdd
Binary files /dev/null and fluid/documentation/src/main_titlebar.png differ
diff --git fluid/documentation/src/page_appendices.dox fluid/documentation/src/page_appendices.dox
new file mode 100644
index 0000000..4b352ce
--- /dev/null
+++ fluid/documentation/src/page_appendices.dox
@@ -0,0 +1,92 @@
+/**
+
+ \page page_appendices Appendices
+
+ \tableofcontents
+
+<!-- ---------------------------------------------------------------------- -->
+\section appendix_keyboard_shortcuts Keyboard Shortcuts
+
+On Apple computers, use the Apple Command key instead of Ctrl.
+
+| Key Combo | Function |
+| :-------: | :------- |
+| `F1` | open widget dialog |
+| `F2` | move widget earlier in tree |
+| `F3` | move widget later in tree |
+| `F7` | move widgets into group |
+| `F8` | ungroup widgets |
+| `Delete` | delete selected widgets |
+| `Ctrl-1..9` | load project from history |
+| `Ctrl-A` | select all |
+| `Shift-Ctrl-A` | select none |
+| `Alt-B` | show or hide Widget Bin |
+| `Ctrl-C` | copy widgets |
+| `Alt-C` | show or hide Code View window |
+| `Shift-Ctrl-C` | generate C++ code files |
+| `Ctrl-G` | grid setting dialog |
+| `Ctrl-I` | merge project file into current project |
+| `Ctrl-N` | start a new project, close the current project |
+| `Shift-Ctrl-N` | new project from template |
+| `Ctrl-O` | open project file |
+| `Shift-Ctrl-O` | toggle overlays |
+| `Ctrl-P` | print all visible project windows |
+| `Alt-P` | open FLUID settings dialog |
+| `Ctrl-Q` | quit FLUID |
+| `Ctrl-S` | save project |
+| `Shift-Ctrl-S` | save project with new name |
+| `Ctrl-U` | duplicate selected widgets |
+| `Ctrl-V` | paste last copied widgets |
+| `Shift-Ctrl-W` | write i18n translation file |
+| `Ctrl-X` | cut selected widgets |
+| `Alt-X` | show shell command settings |
+| `Ctrl-Z` | undo |
+| `Shift-Ctrl-Z` | redo |
+
+<!-- | `Alt-G` | rund last shell command again | -->
+
+
+| Action | Function in Layout Editor |
+| :----: | :------------------------ |
+| `left mouse button (LMB)` | select one widget |
+| `LMB-drag` | select multiple widgets with selection box |
+| `Shift-LMB` | extend widget selection |
+| `Shift-LMB-Drag` | toggle selection in selection box |
+| `Shift-LMB-Drag` | resize window proportionally |
+| `Tab` | select next widget |
+| `Shift-Tab` | select previous widget |
+| `Arrow` | move selected widgets by one unit |
+| `Shift-Arrow` | resize by one unit |
+| `Ctrl-Arrow` | move by grid units |
+| `Shift-Ctrl-Arrow` | resize by grid units |
+
+
+<!-- ---------------------------------------------------------------------- -->
+
+\section appendix_fileformat .fl File Format
+
+FLUID edits and saves its state in `.fl` project files. These files are text,
+and you can (with care) edit them in a text editor, perhaps to get some special
+effects. The `.fl` file format is described in detail in the file
+`fluid/README_fl.txt` which is part of the FLTK source code repository.
+
+<!-- ---------------------------------------------------------------------- -->
+
+\section appendix_licenses External Licenses
+
+FLUID uses graphical images based on the Zendesk Garden Stroke icon set:
+
+[https://github.com/zendeskgarden](https://github.com/zendeskgarden)
+Garden Stroke is licensed under the
+[Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.html).
+
+FLUID includes templates based on 7GUIs:
+
+[7GUIs](https://7guis.github.io/7guis/) was created as a spin-off
+of the masterâ??s thesis Comparison of Object-Oriented and Functional
+Programming for GUI Development by Eugen Kiss at the Human-Computer
+Interaction group of the Leibniz Universität Hannover in 2014.
+
+With kind permission by Prof. Dr. Michael Rohs.
+
+ */
diff --git fluid/documentation/src/page_codeview_panel.dox fluid/documentation/src/page_codeview_panel.dox
new file mode 100644
index 0000000..2fac1a2
--- /dev/null
+++ fluid/documentation/src/page_codeview_panel.dox
@@ -0,0 +1,76 @@
+/**
+
+ \page page_codeview_panel Code View Panel
+
+ \tableofcontents
+
+ # The Code View Panel #
+
+ \image html codeview_panel.png "Code View Panel"
+ \image latex codeview_panel.png "Code View Panel" width=9cm
+
+ The Code View panel shows all code files that can be generated by FLUID.
+
+ The Code View window can be activated via the main
+ menu: *Edit* > *Show Source Code* . FLUID will remember the state and
+ dimensions of the Code View panel.
+
+ If the Auto-Refresh option is selected, the code views will be updated
+ automatically while editing the project.
+
+ Code View has four tabs. The first tab shows the source code. Inlined data
+ is omitted in the code view for brevity.
+
+ The second tab shows the content of the header file. The size of inline data
+ is not calculated and shown as `-1`.
+
+ The third tab shows the list of labels and tooltips as they would be written
+ to a translation file, using the selected project internationalization method.
+
+ The fourth tab previews the contents of the `.fl` project file.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section codeview_find Code View Find
+
+ \image html cv_find_row.png
+ \image latex cv_find_row.png "Find in Code" width=9cm
+
+ This group of buttons makes it easy to find any text in the Source, Header, or
+ Project file. Press *Reveal* to select the widget that generated the indicated
+ line of code.
+
+ __Find__: enter any text you may want to find in the current tab
+
+ __aA__: press this button to activate case sensitive search
+
+ __&lt;&lt;__, __&gt;&gt;__: find the previous or next occurrence
+
+ __Reveal__: clicking this button reveals the widget that generated the
+ selected code in the widget browser
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section codeview_settings Code View Settings
+
+ \image html cv_settings_row.png
+ \image latex cv_settings_row.png "Code View Settings" width=9cm
+
+ __Refresh__: preview the code in the selected tab as it would be generated
+ for the project in its current state
+
+ __Auto-Refresh__: Automatically refresh the code view when the project changes.
+ The Auto Refresh is designed to use relatively little resources, even when
+ continuously updating the selected code tab.
+ The Code View window can usually stay open and auto refresh during the entire
+ design process, even for relatively complex GUIs.
+
+ __Auto-Position__: highlight and reposition to the source code generated by
+ the currently selected widget whenever the selection changes
+
+ __code...__: choose the type of code that is highlighted. In source
+ files, *static* code is generated by Menu Items, *code* refers to widget
+ creation code, *code1* is the part before possible children, *code2* is
+ code generated after children. In header files, *static* highlights
+ `#include` statements generated by a widget, *code* refers to
+ the widget declaration.
+
+*/
diff --git fluid/documentation/src/page_commandline.dox fluid/documentation/src/page_commandline.dox
new file mode 100644
index 0000000..b89c5f3
--- /dev/null
+++ fluid/documentation/src/page_commandline.dox
@@ -0,0 +1,124 @@
+/**
+
+ \page page_commandline Command Line
+
+ \tableofcontents
+
+ FLUID can be used in interactive and in command line mode. If launched with
+ `-c`, followed by a project filename, FLUID will convert the project file
+ into C++ source files without ever opening a window (or opening an X11 server
+ connection under Linux/X11). This makes FLUID a great command line tool
+ for build processes with complex project files that reference
+ external resources. For example, an image referenced by a `.fl` file can be
+ modified and recompiled into the application binary without the need to reload
+ it in an interactive FLUID session.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section commandline_options Command Line Options
+
+ To launch FLUID in interactive mode from the command line, you can give it an
+ optional name of a project file. If no name is given, it will launch with an
+ empty project, or with the last open project, if so selected in the
+ application setting dialog.
+
+ The ampersand `&` is optional on Linux machines and lets FLUID run in its
+ own new process, giving the shell back to the caller.
+
+ ```
+ fluid filename.fl &
+ ```
+
+If the file does not exist you will get an error pop-up, but if you dismiss it
+you will be editing a blank file of that name.
+
+FLUID understands all of the standard FLTK switches before the filename:
+
+```
+-display host:n.n
+-geometry WxH+X+Y
+-title windowtitle
+-name classname
+-iconic
+-fg color
+-bg color
+-bg2 color
+-scheme schemename
+```
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section commandline_passive Compile Tool Options
+
+FLUID can also be called as a command-line only tool to create
+the `.cxx` and `.h` file from a `.fl` file directly. To do this type:
+
+```
+fluid -c filename.fl
+```
+
+This is the same as the menu __File > Write Code...__ .
+It will read the `filename.fl` file and write
+`filename.cxx` and `filename.h`. Any leading
+directory on `filename.fl` will be stripped, so they are
+always written to the current directory. If there are any errors
+reading or writing the files, FLUID will print the error and
+exit with a non-zero code. You can use the following lines in a
+Makefile to automate the creation of the source and header
+files:
+
+```
+my_panels.h my_panels.cxx: my_panels.fl
+        fluid -c my_panels.fl
+```
+
+Most versions of "make" support rules that cause `.fl` files to be compiled:
+
+```
+.SUFFIXES: .fl .cxx .h
+.fl.h .fl.cxx:
+        fluid -c $<
+```
+
+Check `README.CMake.txt` for examples on how to integrate FLUID into the
+`CMake` build process.
+
+If you use
+
+\code
+fluid -cs filename.fl
+\endcode
+
+FLUID will also write the "strings" for internationalization into the file
+'filename.txt', 'filename.po', or 'filename.msg', depending on the chosen type
+of i18n (menu: 'File/Write Strings...').
+
+Finally there is another option which is useful for program developers
+who have many `.fl` files and want to upgrade them to the current FLUID
+version. FLUID will read the `filename.fl` file, save it, and exit
+immediately. This writes the file with current syntax and options and
+the current FLTK version in the header of the file. Use
+
+```
+fluid -u filename.fl
+```
+
+to 'upgrade' `filename.fl` . You may combine this with `-c` or `-cs`.
+
+\note All these commands overwrite existing files w/o warning. You should
+particularly take care when running `fluid -u` since this overwrites the
+original `.fl` project file.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section commandline_windows Windows Specifics
+
+ FLTK uses Linux-style forward slashes to separate path segments in file names.
+ When running on Windows, FLUID will understand Microsoft drive names and
+ backward slashes as path separators and convert them internally into
+ forward slashes.
+
+ Under Windows, binaries can only be defined either as command line tools, or
+ as interactive apps. FLTK generates two almost identical binaries under
+ Windows. `fluid.exe` is meant to be used in interactive mode, and
+ `fluid-cmd.exe` is generated for the command line. Both tools do exactly the
+ same thing, except `fluid-cmd.exe` can use stdio to output error messages.
+
+*/
diff --git fluid/documentation/src/page_edit_window.dox fluid/documentation/src/page_edit_window.dox
new file mode 100644
index 0000000..7cbbf5d
--- /dev/null
+++ fluid/documentation/src/page_edit_window.dox
@@ -0,0 +1,179 @@
+/**
+
+ \page page_edit_window Layout Editor Window
+
+ \tableofcontents
+
+ \image html edit_window.png "Layout Editor Window"
+ \image latex edit_window.png "Layout Editor Window" width=7cm
+
+ The Layout Editor window is used to interactively add groups and widgets, and
+ resize and align them. The editor window already looks very much like the
+ final product that will be built by the FLUID generated C++ source code.
+
+ To create a user interface, first add a function to the project tree by either
+ clicking the Function icon in the widget bin, or by selecting __New* > Code >
+ Function/Method__ from the main menu.
+
+ Now just drag the Window icon from the widget bin onto the desktop. FLUID
+ will generate code that instantiates this window when the function is called.
+ The return value of the function is a pointer to that window, unless changed
+ in the Function Panel. Widgets can be added to the window by dragging them from
+ the widget bin. If a widget is dropped on a group, it will automatically
+ become a child of that group.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section edit_selection Selecting and Moving Widgets
+
+ To move or resize a widget, it must be selected first by clicking on it.
+ Multiple widgets can be selected by holding down the Shift key when clicking
+ on them, or by dragging a selection box around widgets. Widgets can also be
+ selected in the widget browser the main window. Shift-click will select a
+ range of widgets, Ctrl-click will add widgets to the selection.
+
+ \image html edit_select_multiple.png
+ \image latex edit_select_multiple.png "Select Multiple Widgets" width=5cm
+
+ Menu items are selected by clicking on the menu button and selecting it from
+ the popup menu. Multiple menu items can only be selected in the widget browser
+ in the main application window.
+
+ Once selected, widgets can be moved by clicking and dragging the center
+ of the selection box. The outer edges allow resizing in one direction, and
+ dragging the corners resizes widgets horizontally and vertically.
+
+ Widgets can also be repositioned with the arrow keys. Without a shift key,
+ the selection moves by a single pixel. With the Meta key held down, they
+ move by the amount indicated in the *Gap* field in the *Widget* section of
+ the *Layout* setting panel.
+
+ Holding down the Shift key resizes a selected widget by moving the bottom
+ right corner of the widget. Holding Shift and Meta while pressing arrow keys
+ resizes by the amount in the *Widget* *Gap* layout setting.
+
+ Children of groups that reposition their contained widgets may behave
+ differently. Pressing the arrow keys on children of `Fl_Grid` will move
+ the widget from grid cell to grid cell instead. Resizing a child of `Fl_Flex`
+ will also mark the child size as `fixed`.
+
+ The tab and shift+tab keys "navigate" the selection. Tab or shift+tab move to
+ the next or previous widgets in the hierarchy. If the navigation does not seem
+ to work you probably need to "Sort" the widgets. This is important if you have
+ input fields, as FLTK uses the same rules when using tab keys
+ to move between input fields.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section edit_layout Layout Helpers
+
+ \image html edit_overlap.png
+ \image latex edit_overlap.png "Overlapping Widgets" width=5cm
+
+ In FLTK, the behavior of overlapping children of a group is undefined. If
+ enabled in the settings, FLUID will show overlapping widgets in a group
+ with a green hash pattern.
+
+ \image html edit_outside.png
+ \image latex edit_outside.png "Out Of Bounds" width=5cm
+
+ The behavior of widgets that reach outside the bounds of their parent group
+ is also undefined. They may be visible, but confuse the user when they don't
+ react to mouse clicks or don't redraw as expected. Outside widgets are marked
+ with a red hash pattern.
+
+ Note that `Fl_Tile` requires that all children exactly fill the area of the
+ tile group to function properly. The hash patterns are great helpers to align
+ children correctly.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section edit_snap Layout Alignment
+
+ FLUID layouts are a handful of rules that help creating a clean and consistent
+ user interface. When repositioning widgets, the mouse pointer snaps to the
+ closest position based on those rules. A guide line is drawn for the rule that was
+ applied. Guides and snaps can be disabled with `Ctrl-Shift-G` or via the
+ *Edit* > *Hide Guides* menu.
+
+ \image html edit_snap_group.png
+ \image latex edit_snap_group.png "Snap To Group" width=5cm
+
+ If a horizontal or vertical outline snaps to the group, the
+ border of that group will highlight. If the outline snaps to the margin
+ of the parent window or group, an additional arrow is drawn.
+
+ Children of `Fl_Tabs` use the top and bottom margin from the *Tabs*
+ section. If all children use this rule, the margin height will also be the
+ height of all tabs.
+
+ \image html edit_snap_sibling.png
+ \image latex edit_snap_sibling.png "Snap To Sibling" width=5cm
+
+ The selection can also snap to the outline of other widgets in the same group,
+ or to the outline plus the Widget Gap. The outline that triggers the snap
+ action is highlighted.
+
+ Note that only the first snap guide found is drawn for horizontal and vertical
+ movement. Multiple rules may apply, but are not highlighted.
+
+ \image html edit_snap_size.png
+ \image latex edit_snap_size.png "Snap To Size" width=7cm
+
+ Widget size rules define a minimum size and an increment value that may
+ be applied multiple times to the size. For example, with a minimum width of 25
+ and an increment of 10, the widget will snap horizontally to 25, 35, 45,
+ 55, etc. .
+
+ \image html edit_snap_grid.png
+ \image latex edit_snap_grid.png "Snap To Grid" width=5cm
+
+ The grid rule is the easiest to explain. All corners of a selection snap to
+ a fixed grid. If the selected widgets are children of a window, they will snap
+ to the window grid. If they are in a group, they snap to the group grid.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section edit_resize Live Resize
+
+ \image html edit_select_group.png
+ \image latex edit_select_group.png "Selected Group" width=9cm
+
+ The Resizable system within FLTK is smart, but not always obvious. When
+ constructing a sophisticated GUI, it is helpful to organize widgets into
+ multiple levels of nested groups. Sometimes, incorporating an invisible
+ resizable box can improve the behavior of a group. FLUID offers a Live Resize
+ feature, allowing designers to experiment with resizing at each level within
+ the hierarchy independently.
+
+ To test the resizing behavior of a group, begin by selecting it:
+
+ \image html edit_live_resize.png
+ \image latex edit_live_resize.png "Live Resize" width=7cm
+
+ Click on *Live Resize* in the widget panel. FLUID will generate a new window
+ with all the resizing attributes inherited from the original design. This
+ enables the designer to thoroughly test the behavior and limitations,
+ making adjustments until they are satisfied. This streamlined process makes
+ it significantly easier to address resizing behavior at a higher level,
+ particularly once the lower levels are behaving as intended.
+
+ In the example above, the radio buttons are not fixed to the left side of
+ the group and the text snippet "of the bed" does not stay aligned
+ to "right side". To fix this, a thin hidden box could be added to the right
+ edge of the group that holds the radio button which is then marked `resizable`.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section edit_limits Limitations
+
+ Almost all FLTK widgets can be edited with FLUID. Notable exceptions include
+
+ - FLUID does not support an `Fl_Window` inside another `Fl_Window`
+ - widgets inside `Fl_Scroll` can not be created in the hidden areas of the
+   scrollable rectangle. It is recommended to organize the children in
+   a separate Widget Class that is derived from `Fl_Scroll` and then inserted
+   as a single custom widget.
+ - children of `Fl_Pack` are not automatically reorganized to fit the packing
+   group. Again, a Widget Class is recommended here.
+ - if children of `Fl_Grid` are again some kind of group, their internal layout
+   may not follow changes in the grid widgets. It's best to complete the grid
+   first, then add children to the grid cells, size them correctly, and
+   then finally lay out the grid cell children.
+
+*/
diff --git fluid/documentation/src/page_functional_nodes.dox fluid/documentation/src/page_functional_nodes.dox
new file mode 100644
index 0000000..4407f0e
--- /dev/null
+++ fluid/documentation/src/page_functional_nodes.dox
@@ -0,0 +1,450 @@
+/**
+
+ \page page_functional_nodes Functional Node Panels
+
+ \tableofcontents
+
+ <!-- ---------------------------------------------------------------------- -->
+
+ \section functional_function Function and Method Panel
+
+ ![](flFunction.png) Functions and Methods
+
+ Fluid can generate C functions, C++ functions, and methods in classes.
+ Functions can contain widgets to build windows and dialogs. *Code* nodes can
+ be used to add more source code to a function.
+
+ ### Parents ###
+
+ To generate a function, the function node must be created at the top level or
+ inside a declaration block. If added inside a class node, this node generates
+ a method inside that class.
+
+ ### Children ###
+
+ Function nodes can contain code nodes and windows that in turn contain widgets.
+ If the function node has no children, only a forward declaration will be
+ created in the header, but no source code will be generated.
+
+ \image html function_panel.png "Function/Method Properties"
+ \image latex function_panel.png "Function/Method Properties" width=7cm
+
+ ### Declaring a Function ###
+
+ A function node at the top level or inside a declaration block generates a C
+ or C++ function.
+
+ The *Name* field  contains the function name and all arguments.
+ If the *Name* field is left empty, Fluid will generate a typical 'main()' function.
+ ```
+ // .cxx
+ int main(int argc, char **argv) {
+   // code generated by children
+   w->show(argc, argv); // <-- code generated if function has a child widget
+   Fl::run();
+ }
+ ```
+
+ If a function node has a name but no children, a forward declaration is
+ generated in the header, but the implementation in the source file is omitted.
+ This is used to reference functions in other modules.
+ ```
+ // .h
+ void make_window();
+ ```
+
+ If the function contains one or more Code nodes, the implementation code will
+ be generated. The default return type is `void`. Text in the *Return Type* field
+ overrides the default type.
+ ```
+ // .cxx
+ void make_window() {
+   // code generated by children
+ }
+ ```
+
+ If the function contains one or more windows, a pointer to the first window
+ will be returned. The default return type will match the window class.
+ ```
+ // .h
+ Fl_Window* make_window();
+ ```
+
+ ```
+ // .cxx
+ Fl_Window* make_window() {
+   Fl_Window* w;
+   // code generated by children:
+   // w = new Fl_Window(...)
+   return w;
+ }
+ ```
+
+ #### Options for Functions ####
+
+ Choosing *static* in the pulldown menu will generate the function `static` in
+ the source file. No forward declaration will be generated in the header file.
+ ```
+ // .cxx
+ static Fl_Window* make_window() { ... }
+ ```
+
+ Choosing *global* will generate a forward declaration of the function in the
+ header file and no `static` attribute in the source file.
+ ```
+ // .h
+ void make_window();
+ // .cxx
+ Fl_Window* make_window() { ... }
+ ```
+
+ Additionally,
+ if the *C* option is checked, the function will be declared as a plain C
+ function in the header file.
+ ```
+ // .h
+ extern "C" { void my_plain_c_function(); }
+ // .cxx
+ void my_plain_c_function() { ... }
+ ```
+
+ The *local* option will generate a function in the source file with no `static`
+ attribute. No forward declaration will be generated in the header file.
+ ```
+ // .cxx
+ Fl_Window* make_window() { ... }
+ ```
+
+ ### Declaring a Method ###
+
+ A function node inside a class node generates a C++ method. If a method node has
+ no children, the declaration is generated in the header, but no implementation
+ in the source file.
+ ```
+ // .h
+ class UserInterface {
+ public:
+   void make_window();
+ };
+ ```
+
+ If the method contains one or more Code nodes, an implementation will also be
+ generated.
+
+ ```
+ // .cxx
+ void UserInterface::make_window() {
+   printf("Hello, World!\n");
+ }
+ ```
+
+ If the method contains at least one widget, a pointer to the topmost widget
+ will be returned and the return type will be generated accordingly.
+ ```
+ // .h
+ class UserInterface {
+ public:
+   Fl_Double_Window* make_window();
+ };
+ ```
+
+ ```
+ // .cxx
+ Fl_Double_Window* UserInterface::make_window() {
+   Fl_Double_Window* w;
+   // code generated by children
+   return w;
+ }
+ ```
+
+ #### Options for Methods ####
+
+ Class access can be defined with the pulldown menu. It provides a choice of
+ `private`, `protected`, and `public`.
+
+ Fluid recognizes the keyword `static` or `virtual` at the beginning of the
+ *return type* and will generate the declaration including the keyword, but will
+ omit it in the implementation. The return type defaults still apply if there
+ is no text after the keyword.
+
+ #### Further Options ####
+
+ Users can define a comment text in the *comment* field. The first line of the
+ comment will be shown in the widget browser. The comment text will be generated
+ in the source file before the function.
+ ```
+ // .cxx
+ //
+ // My multilen comment will be here... .
+ // Fluid may actually use C style comment markers.
+ //
+ Fl_Window* make_window() {
+ ```
+
+ FLUID recognizes default values in the argument list and generates them in the
+ declaration, but omits them in the implementation.
+
+ A short function body can be appended in the *Name* field. With no child, this
+ creates an inlined function in the header file.
+
+ <!-- ---------------------------------------------------------------------- -->
+
+ \section functional_code C Source Code
+
+ ![](flCode.png) Code
+
+ Code nodes hold arbitrary C++ code that is copied verbatim into the
+ source code file. They are commonly used inside Function nodes.
+
+ ### Parents ###
+
+ Code nodes can be added inside Functions, Code Blocks, and Widget Classes.
+
+ \image html code_panel.png "Code Properties"
+ \image latex code_panel.png "Code Properties" width=9cm
+
+ The Code Properties panel features a syntax-highlighting C++ code editor.
+ Some basic bracket and braces match checking is done when closing the dialog.
+
+ When inside a Function or Code Block, the C++ code is inserted directly.
+ Inside a Widget Class, the code will be added to the constructor of the
+ widget class.
+
+ <!-- ---------------------------------------------------------------------- -->
+
+ \section functional_codeblock Code Block
+
+ ![](flCodeBlock.png) Code Block
+
+ Code Blocks are used when a single function generates different GUI elements
+ conditionally.
+
+ ### Parents ###
+
+ Code Blocks are used inside functions and methods.
+
+ ### Children ###
+
+ Code Blocks can contain widgets, code, or more code blocks.
+
+ \image html codeblock_panel.png "Code Block Properties"
+ \image latex codeblock_panel.png "Code Block Properties" width=7cm
+
+ The two fields expect the code before and after the `{ ... }` statements. The
+ second field can be empty.
+
+ Two consecutive Code Blocks can be used to generate `else`/`else if`
+ statements by leaving the second field of the first node empty.
+
+ <!-- ---------------------------------------------------------------------- -->
+
+ \section functional_decl Declaration
+
+ ![](flDeclaration.png) Declaration
+
+ ### Parents ###
+
+ Declarations can be added at the top level or inside classes and widget classes.
+
+ \image html decl_panel.png "Declaration Properties"
+ \image latex decl_panel.png "Declaration Properties" width=7cm
+
+ Declaration nodes are quite flexible and can be a simple variable declaration
+ such as `int i;`. But include statements are also allowed, as are type
+ declarations, and comments. FLUID does its best to understand user intention,
+ but the generated code should be verified by the user.
+
+ Declarations nodes at the top level can selectively generate code in the header
+ and /or in the source file. If a declaration is inside a class, the user can
+ select if the class member is *private*, *protected*, or *public* instead.
+
+ <!-- ---------------------------------------------------------------------- -->
+
+ \section functional_declblock Declaration Block
+
+ ![](flDeclarationBlock.png) Declaration Block
+
+ Declaration Blocks are a way to selectively compile child nodes via
+ preprocessor commands, typically `#ifdef TEST` and `#endif`.
+
+ ### Parents ###
+
+ Declaration Blocks can be created at the top level or inside classes.
+
+ ### Children ###
+
+ Declaration Blocks can contain classes, functions, methods, declarations, and
+ comments.
+
+ \image html declblock_panel.png "Declaration Block Properties"
+ \image latex declblock_panel.png "Declaration Block Properties" width=7cm
+
+ Users can select if the block is generated in the source file only, or in the
+ header file as well. The two input fields are used to enter the line of code
+ before and after the child nodes. Two consecutive Declaration Blocks can be
+ used to generate `#else`/`#elif` style code by leaving the second field of
+ the first node empty.
+
+ \note Declaration Blocks are not smart, and child nodes may still generate
+ unexpected code outside the scope of this block. This may change in future
+ versions of FLUID.
+
+ <!-- ---------------------------------------------------------------------- -->
+
+ \section functional_class Classes
+
+![](flClass.png) Class
+
+ FLUID can generate code to implement C++ classes. Classes can be used to keep
+ dialogs and groups of UI elements organized. See Widget Class nodes as an
+ alternative to implement compound widgets.
+
+ ### Parents ###
+
+ Class nodes can be created at top level or inside a Class or Widget
+ Class node.
+
+ ### Children ###
+
+ Class nodes can contain Functions, Declarations, Widgets, Data, and
+ other classes.
+
+ \image html class_panel.png "Class Properties"
+ \image latex class_panel.png "Class Properties" width=7cm
+
+ The *Name:* and *Subclass of:* fields should be set to standard C++ class
+ names.
+
+ Function nodes inside classes are implemented as methods. Constructors and
+ destructors are recognized and implemented as such. Inlined data is declared
+ as a static class member.
+
+ Note that methods without a code or widget node are only declared in the
+ header file, but no code is generated for them in the source file.
+
+ <!-- ---------------------------------------------------------------------- -->
+
+ \section functional_widgetclass Widget Class
+
+ ![](flWidgetClass.png) Widget Class
+
+ The Widget Class node creates a new widget type by deriving a class from another
+ widget class. These are often compound widgets derived from `Fl_Group`. A less
+ automated but more flexible way to implement compound widgets is the Class node.
+
+ ### Parents ###
+
+ Widget Class nodes can be created at top level or inside a Class or Widget
+ Class node.
+
+ ### Children ###
+
+ Widget Class nodes can contain Functions, Declarations, Widgets, Data, and
+ other classes.
+
+ ### Properties ###
+
+ Widget Class nodes use the Widget panel to edit their properties. The super
+ class can be set in the *C++* tab in the *Class* field. If that field is empty,
+ FLUID derives from `Fl_Group`.
+
+ The Widget Class always creates a constructor with the common widget parameters:
+ ```
+ MyWidget::MyWidget(int X, int Y, int W, int H, const char *L)
+ : Fl_Group(X, Y, W, H, L) { ... }
+ ```
+
+ If the super class name contains the text `Window`, two more constructors
+ and a common initializer method are created:
+ ```
+ MyWidget::MyWidget(int W, int H, const char *L) :
+   Fl_Window(0, 0, W, H, L) { ... }
+
+ MyWidget::MyWidget() :
+   Fl_Window(0, 0, 480, 320, 0) { ... }
+
+ void MyWidget::_MyWidget() { ... }
+ ```
+
+ Code and Widget nodes are then added to the constructor. Function nodes are
+ added as methods to the class. Declarations are added as class members.
+ Data nodes generate static class members.
+
+ It may be useful to design compound widgets with a variable size. The Widget
+ Panel provides a choice menu in the *GUI* tab's *Position* row under
+ *Children*. The options *resize* and *reposition* generate code to fix up
+ the coordinates of the widget after instantiation.
+
+ Note that methods without a code or widget node are only declared in the
+ header file, but no code is generated for them in the source file.
+
+ <!-- ---------------------------------------------------------------------- -->
+
+ \section functional_comment Comments
+
+ ![](flComment.png) Comment
+
+ This node adds a comment block to the generated source code.
+
+ ### Parents ###
+
+ Comment nodes can be added inside Functions, Code Blocks, and Widget Classes.
+ If a Comment node is the top node in a tree, it will appear in the source
+ files even before the `// generated by FLUID ...` line.
+
+ \image html comment_panel.png "Comment Properties"
+ \image latex comment_panel.png "Comment Properties" width=9cm
+
+ Comment blocks are generated by adding `// ` to the start of each line unless
+ the first line of a comment starts with `/``*`. In that case, FLUID assumes
+ a correct block comment and will copy the text verbatim.
+
+ Comments can be generated in the header file, the source file, or both.
+
+ FLUID keeps a small database of predefined comments. Users can add reoccurring
+ comment blocks, license information for example, to this database via the
+ pulldown menu.
+
+ Comments can also be imported from an external file.
+
+ <!-- ---------------------------------------------------------------------- -->
+
+ \section functional_data Inlined Data
+
+ ![](flData.png) Inlined Data
+
+ The Data node makes it easy to inline data from an external file into the
+ source code.
+
+ ### Parents ###
+
+ Data nodes can be added at the top level or inside Widget Classes, Classes,
+ and Declaration Blocks.
+
+ \image html data_panel.png "Data Properties"
+ \image latex data_panel.png "Data Properties" width=7cm
+
+ At top level, or inside a Declaration Block, Data can be declared *in source
+ file only*, *static in source file*, or *in source and extern in header*.
+
+ If Data is inside a Class node, it is always declared `static`. The user can
+ select *private*, *protected*, or *public*.
+
+ Data in binary mode will be stored in an `unsigned char` array. The data size
+ can be queried with `sizeof()`. In Text mode, it will be stored as `const
+ char*` and terminated with a `NUL` character.
+
+ In compressed mode, data will be compressed with zlib `compress()` and stored
+ in an `unsigned char` array. A second variable, holding the original data size,
+ is declared `int` by appending `_size` to the variable name.
+
+ ```
+ // .cxx
+ int myInlineData_size = 12034;
+ unsigned char myInlineData[380] = { 65, 128, ... };
+ ```
+
+ The Variable Name should be a regular C++ name. The Filename field expects
+ the path and name of a file, relative to the location of the .fl file.
+
+ */
diff --git fluid/documentation/src/page_interactive.dox fluid/documentation/src/page_interactive.dox
new file mode 100644
index 0000000..58f46b1
--- /dev/null
+++ fluid/documentation/src/page_interactive.dox
@@ -0,0 +1,57 @@
+/**
+
+ \page page_interactive Interactive Mode
+
+ \tableofcontents
+
+ <!-- ---------------------------------------------------------------------- -->
+
+ In interactive mode, FLUID allows users to construct and modify their GUI
+ design by organizing widgets hierarchically through drag-and-drop actions.
+ The project windows provide a live preview of the final UI layout.
+ Most widget attributes can be adjusted in detail using the
+ \ref page_widget_panel.
+
+ Users can also incorporate C++ coding elements such as functions, code blocks,
+ and classes. FLUID supports the integration of external sources, for
+ example images, text, or binary data, by embedding them directly into the
+ generated source code.
+
+ \image html fluid_gui_overview_800.png
+ \image latex fluid_gui_overview_800.png "FLUID Overview"
+
+ A typical FLUID session manages the widget hierarchy in the main application
+ window on the left. The project file name is shown in the title bar. In the
+ example above, we edit the FLTK _Preferences_ example file
+ `test/preferences.fl`.
+
+ \see \ref page_main_window
+
+ The layout editor window left of center, titled
+ "My Preferences" shows the GUI design as it will be generated by the C++
+ source file. The widgets "shower", "shave", and "brush teeth" are shown
+ in their selected state and can now be resized or moved by grabbing any of
+ the red boxes around the selection frame.
+
+ \see \ref page_edit_window
+
+ To the right, we have the "Widget Properties" panel. We can use this to
+ edit many more parameters of the selected widget. If multiple widgets are
+ selected, changes are applied to all of them where appropriate.
+
+ \see \ref page_widget_panel
+
+ The Widget Bin at the top is an optional tool bar (__Edit > Show Widget Bin__,
+ Alt-B). It gives quick access to all widget and code types. Widgets can
+ be added by clicking onto the tool, or by dragging them out of the tool box
+ into the layout editor.
+
+ \see \ref page_widgetbin_panel
+
+ The optional panel on the right shows a live source code preview. This is
+ very helpful for verifying how changes in the GUI will be reflected in the
+ generated C++ code (__Edit > Show Code View__, Alt-C).
+
+ \see \ref page_codeview_panel
+
+*/
diff --git fluid/documentation/src/page_introduction.dox fluid/documentation/src/page_introduction.dox
new file mode 100644
index 0000000..890dc37
--- /dev/null
+++ fluid/documentation/src/page_introduction.dox
@@ -0,0 +1,69 @@
+/**
+
+ \page page_introduction Introduction
+
+ \tableofcontents
+
+<!-- ---------------------------------------------------------------------- -->
+
+ \image latex fluid-128.png "FLUID" width=3cm
+
+ FLUID, short for Fast Light User Interface Designer, is a graphical editor
+ capable of generating C++ source code and header files ready for compilation.
+ These files ultimately create an FLTK based graphical user interface
+ for an application.
+
+ The FLTK programming manual is available at https://www.fltk.org/documentation.php .
+
+ This manual provides instructions on launching FLUID as a command line tool
+ and integrating `.fl` project files into the application build process.
+ FLTK utilizes _CMake_, but other build systems and IDEs capable of running
+ external tools can also build applications based on FLUID.
+
+ The majority of the manual focuses on using FLUID as an interactive GUI
+ design tool. It covers an overview of windows, menu items, and dialog boxes,
+ detailing how to create visually appealing and consistent user experiences
+ through drag and drop functionality, a "what you see is what you get" editor,
+ and alignment tools. The \ref page_setting_dialog will detail the process of initiating
+ a new project, creating an alignment template, and incorporating
+ internationalization.
+
+ Several tutorials will explain how to generate small apps in FLUID alone,
+ and how to create more complex user interfaces, followed by some advanced
+ subjects like creating integrated reusable widget classes.
+
+ The appendices contain additional technical information for reference.
+
+<!-- ---------------------------------------------------------------------- -->
+
+ \section introduction_workflow Workflow
+
+ FLUID stores user interface designs within `.fl` project files. These files
+ are transformed into a binary application through a multi-step process.
+ Initially, FLUID converts `.fl` files into C++ source and header files.
+ Subsequently, these files are compiled into object files, which are then
+ linked with other object files to form an executable binary.
+ FLUID-generated header files give access to UI elements from other C++ modules
+ within the project. FLUID can also generate forward declarations to
+ variables and callback functions that are defined and implemented in other
+ C++ modules.
+
+ \image html fluid_flow_chart_800.png "FLUID Workflow"
+ \image latex fluid_flow_chart.png "FLUID Workflow"
+
+ Small applications can be fully designed and developed with FLUID alone.
+ Users have the option to include shell scripts in FLUID projects, enabling
+ them to directly call compilers and linkers to produce the binaries.
+
+ For medium-sized projects, a build system such as _CMake_ or an IDE
+ with integrated build setup is recommended. FLUID in interactive mode
+ can pre-generate C++ code files for direct compilation by the IDE.
+
+ In larger projects, FLUID projects frequently reference external resources
+ such as graphics, binary data, and internationalized text.
+ In such scenarios, it is very useful to distribute the `.fl` project files
+ instead of prebuilt source files. FLUID in command-line mode can then be
+ called as an external tool, dynamically generating C++ source code from all
+ external resources at build time.
+
+ */
diff --git fluid/documentation/src/page_main_window.dox fluid/documentation/src/page_main_window.dox
new file mode 100644
index 0000000..005ce01
--- /dev/null
+++ fluid/documentation/src/page_main_window.dox
@@ -0,0 +1,371 @@
+/**
+
+ \page page_main_window Main Application Window
+
+ \tableofcontents
+
+ \image html main_window.png "Main Application Window"
+ \image latex main_window.png "Main Application Window" width=5cm
+
+ A FLUID project is a hierarchy of nodes. Each node holds information to
+ generate C++ source code which in turn generates the user interface that
+ is created in the layout editor windows. Projects usually define one or more
+ functions. These functions can generate one or more
+ FLTK windows and all the widgets that go inside those windows.
+
+ The FLUID Main Window is split into three parts. The title bar shows the
+ status of the source and project files. The menu bar provides a wealth of
+ menu items for all major actions in FLUID. The biggest part of the
+ app window is the widget browser, a tree structure that lists every code
+ node and widget in the project.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section main_titlebar Title Bar
+
+ \image html main_titlebar.png
+ \image latex main_titlebar.png "Title Bar" width=5cm
+
+ The title bar shows the status of the project file, _function_panel.fl_ in this
+ case, followed by an asterisk if the project was changed after it was saved.
+ If the asterisk shows, FLUID will ask the user to save changes before closing
+ the project, loading another project, or starting a new one. Pressing `Ctrl-S`
+ will save the project and make the asterisk disappear.
+
+ The _.cxx_ in the title bar reflects the status of header and source files
+ in relation to the project. A trailing asterisk indicates that the project and code
+ files differ. Pressing `Ctrl-Shift-C` to write the code files will make this
+ asterisk go away.
+
+ \note FLUID currently supports only one open project at a time.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section main_menubar Application Menu Bar
+
+ \image html main_menubar.png
+ \image latex main_menubar.png "Main Menu" width=5cm
+
+ The menu bar is the true control center of FLUID. All actions start here.
+
+ The *File* menu offers the common file operation for FLUID projects. Projects
+ can be loaded, merged, and saved. *Print* will print a snapshot of all open
+ project windows.
+ The *New From Template* item opens a dialog that provides access to a small
+ number of sample projects. More projects can be added using *Save as Template*.
+ 
+ Use *Write Code* to write the header and source code files, and *Write Strings*
+ to write the translation file if one of the internationalization options
+ is active.
+
+ The *Edit* menu is mainly used to manipulate widgets within the widget tree.
+ The bottom entries toggle various dialogs and pop up the settings panel.
+
+ The *New* menu holds a list of all widgets that can be used in FLUID. They
+ are grouped by functionality, very similarly to the widget bin. New widgets are
+ added inside or right after the selected widget. If the parent widget is not
+ compatible, FLUID tries to find another location for the widget. If that also
+ fails, FLUID will pop up a dialog, describing the required parent type.
+
+ The *Layout* menu is used to adjust the position and size of widgets in
+ relation to each other.
+
+ The *Shell* menu gives quick access to user definable shell scripts. Note that
+ scripts can be stored inside `.fl` project files.
+
+ \see \ref main_menu_items
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section main_widget_browser Widget Tree View
+
+ \image html main_browser.png
+ \image latex main_browser.png "Widget Browser" width=5cm
+
+ Widgets are stored in a hierarchy. You can open and close a level by clicking
+ the "triangle" at the left of a widget. The leftmost widgets are the
+ \e parents, and all the widgets listed below them are their \e children.
+ Parents don't have to have any children.
+
+ The top level of the hierarchy is composed of \e functions and
+ \e classes. Each of these will produce a single C++ public function
+ or class in the output <tt>.cxx</tt> file. Calling the function or
+ instantiating the class will create all of the child widgets.
+
+ The second level of the hierarchy contains the \e windows.
+ Each of these produces an instance of class Fl_Window.
+
+ Below that are either \e widgets (subclasses of Fl_Widget) or
+ \e groups of widgets (including other groups). Plain groups are for
+ layout, navigation, and resize purposes. <i>Tab groups</i> provide the
+ well-known file-card tab interface.
+
+ Widgets are shown in the browser by either their \e name (such
+ as "Button emergency_btn" in the example), or by their \e type
+ and \e label (such as "Double_Window "My Main Window"").
+
+ You \e select widgets by clicking on their names, which highlights
+ them (you can also select widgets from any displayed window). You can
+ select many widgets by dragging the mouse across them, or by using
+ Shift+Click to toggle them on and off. To select no widgets, click in
+ the blank area under the last widget. Note that hidden children may
+ be selected even when there is no visual indication of this.
+
+ You \e open widgets by double-clicking on them, or (to open several
+ widgets you have picked) by typing the F1 key. A control panel will appear
+ so you can change the widget(s).
+
+ Nodes are moved within their group using
+ `F2` and `F3`. They can be grouped and ungrouped with `F7` and `F8`, and
+ relocated by selecting them and using cut, copy, and paste.
+
+ Every line in the browser has the same basic format. The level of indentation
+ reflects the depth of a node within the tree.
+
+ The triangle appears only in front of nodes that can have children. If it is
+ white, the group has no children. If it is black, there is at least one child.
+ If the triangle points to the right, the children are hidden in the tree view.
+ Click the triangle to reveal all children.
+
+ The icon to the right is a small representation of the base type of the node.
+ Widgets are gray, windows have a blue title bar, and functional nodes are
+ green. If the widget is static or private, a padlock icon will appear in the
+ bottom right corner of the type icon.
+
+ The content of text fields depends on the node type. If a comment is set, it
+ appears in green over the text. Widgets combine their type (bold black) and
+ label text (red), or their C++ name in black (not bold).
+
+ All colors and font styles can be customized in the User tab of the
+ Settings panel.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section main_menu_items The Main Menu
+
+The "New" menu of the main menu bar is duplicated as a pop-up menu on any
+layout editor window. The shortcuts for all the menu items work in any
+window. The menu items are:
+
+__File > New (Ctrl+n)__: Close the current project and start a new, empty project.
+
+__File > Open... (Ctrl+o)__: Discard the current editing session and read in a
+different `.fl` project file. You are asked for confirmation if you have
+changed the current file.
+
+FLUID can also read `.fd` files produced by the Forms and XForms "fdesign"
+programs. It is best to _File > Merge_ them instead of opening them. FLUID does
+not understand everything in a `.fd` file, and will print a warning message on
+the controlling terminal for all data it does not understand. You will probably
+need to edit the resulting setup to fix these errors. Be careful not to save
+the file without changing the name, as FLUID will write over the `.fd` file
+with its own format, which fdesign cannot read!
+
+__File > Insert... (Ctrl+i)__: Insert the contents of another `.fl` file
+without changing the name of the current `.fl` file. All the functions (even if
+they have the same names as the current ones) are added, and you will have to
+use cut/paste to put the widgets where you want.
+
+__File > Save (Ctrl+s)__: Write the current data to the `.fl` file. If the
+file is unnamed then FLUID will ask for a filename.
+
+__File > Save As... (Ctrl+Shift+S)__: Ask for a new filename and
+save the file.
+
+__File > Save A Copy...__: Save a copy of the `.fl` data to a different file.
+
+__File > Revert...__: Revert the `.fl` data to the previously saved state.
+
+__File > New From Template...__: Create a new user interface design from a
+previously saved template. This can be useful for including a predefined
+enterprise copyright message for projects, or for managing boilerplate code
+for repeating project code.
+
+__File > Save As Template...__: Save the current project as a starting point
+for future projects.
+
+__File > Print... (Ctrl-P)__: Generate a printout containing all currently
+open windows within your project.
+
+__File > Write Code (Ctrl+Shift+C)__: Write the GUI layout as a `.cxx` and
+`.h` file. These are exactly the same as the files you get when you run
+FLUID with the `-c` switch.
+
+The output file names are the same as the `.fl` file, with the leading directory
+and trailing ".fl" stripped, and ".h" or ".cxx" appended.
+
+__File > Write Strings (Ctrl+Shift+W)__: Write a message file for all of the
+text labels and tooltips defined in the current file.
+
+The output file name is the same as the `.fl` file, with the leading directory
+and trailing ".fl" stripped, and ".txt", ".po", or ".msg" appended depending on
+the \ref setting_i18n "Internationalization Mode".
+
+__File > Quit (Ctrl+q)__: Exit FLUID. You are asked for confirmation if you
+have changed the current file.
+
+__Edit > Undo (Ctrl+z)__ and __Redo (Shift+Ctrl+z)__: FLUID saves the project
+state for undo and redo operations after every major change.
+
+__Edit > Cut (Ctrl+x)__: Delete the selected widgets and all of their children.
+These are saved to a "clipboard" file and can be pasted back into any
+FLUID window.
+
+__Edit > Copy (Ctrl+c)__: Copy the selected widgets and all of their children
+to the "clipboard" file.
+
+__Edit > Paste (Ctrl+v)__: Paste the widgets from the clipboard file.
+
+If the widget is a window, it is added to whatever function
+is selected, or contained in the current selection.
+
+If the widget is a normal widget, it is added to whatever
+window or group is selected. If none is, it is added to the
+window or group that is the parent of the current selection.
+
+To avoid confusion, it is best to select exactly one widget
+before doing a paste.
+
+Cut/paste is the only way to change the parent of a
+widget.
+
+__Edit > Duplicate (Ctrl-u)__: Duplicate all currently selected widgets and
+insert the duplicates after the last selected widget.
+
+__Edit > Delete__: Delete all selected widgets.
+
+__Edit > Select All (Ctrl+a)__: Select all widgets in the same group as the
+current selection.
+
+If they are all selected already then this selects all
+widgets in that group's parent. Repeatedly typing `Ctrl+a` will
+select larger and larger groups of widgets until everything is
+selected.
+
+__Edit > Properties... (F1 or double click)__: Display the current widget in
+the widgets panel. If the widget is a window and it is not visible then the
+window is shown instead.
+
+__Edit > Sort__: Sort the selected widgets into left to right, top to bottom
+order. You need to do this to make navigation keys in FLTK work correctly.
+You may then fine-tune the sorting with "Earlier" and "Later". This does not
+affect the positions of windows or functions.
+
+__Edit > Earlier (F2)__: Move all of the selected widgets one earlier in order
+among the children of their parent (if possible). This will affect navigation
+order, and if the widgets overlap it will affect how they draw, as the later
+widget is drawn on top of the earlier one. You can also use this to reorder
+functions, classes, and windows within functions.
+
+__Edit > Later (F3)__: Move all of the selected widgets one later in order
+among the children of their parent (if possible).
+
+__Edit > Group (F7)__: Create a new Fl_Group and make all the currently
+selected widgets children of it.
+
+__Edit > Ungroup (F8)__: Delete the parent group if all the children of a
+group are selected.
+
+__Edit > Show or Hide Overlays (Ctrl+Shift+O)__: Toggle the display of the
+red overlays off, without changing the selection. This makes it easier to see
+box borders and how the layout looks. The overlays will be forced back on if
+you change the selection.
+
+__Edit > Show or Hide Guides (Ctrl+Shift+G)__: Guides can be used to arrange a
+widget layout easily and consistently. They indicate preferred widget
+positions and sizes with user definable margins, grids, and gap sizes. See
+the "Layout" tab in the "Settings" dialog, \ref setting_layout.
+
+This menu item enables and disables guides and the snapping action when dragging
+widgets and their borders.
+
+__Edit > Show or Hide Restricted (Ctrl+Shift+R)__: The behavior of overlapping
+widgets in FLTK is undefined. By activating this button, a hatch pattern is
+shown, highlighting areas where restricted or undefined behavior may occur.
+
+__Edit > Show or Hide Widget Bin (Alt+B)__: The widget bin provides quick
+access to all widget types supported by FLUID. Layouts can be created by
+clicking on elements in the widget bin, or by dragging them from the bin to
+their position within the layout. This button shows or hides the widget bin.
+
+__Edit > Show or Hide Code View (Alt+C)__: Shows or hide
+the source code preview window. Any changes to the layout or code in the layout
+editor can be previewed and verified immediately in the Code View window.
+
+__Edit > Settings... (Alt+p)__: Open the application and project settings
+dialog: \ref page_setting_dialog
+
+__New > Code > Function__: Create a new C function. You will be asked for a
+name for the function. This name should be a legal C++ function
+template, without the return type. You can pass arguments which
+can be referred to by code you type into the individual widgets.
+
+If the function contains any unnamed windows, it will be
+declared as returning an Fl_Window pointer. The unnamed window
+will be returned from it (more than one unnamed window is
+useless). If the function contains only named windows, it will
+be declared as returning nothing (\c void ).
+
+It is possible to make the <tt>.cxx</tt> output be a
+self-contained program that can be compiled and executed. This
+is done by deleting the function name so
+\p main(argc,argv) is used. The function will call
+\p show() on all the windows it creates and then call
+\p Fl::run(). This can also be used to test resize
+behavior or other parts of the user interface.
+
+You can change the function name by double-clicking on the
+function.
+
+\see \ref functional_function
+
+__New > Group > Window__: Create a new Fl_Window widget. The window is added
+to the currently selected function, or to the function containing the currently
+selected item. The window will appear, sized to 480x320. You can resize it to
+whatever size you require.
+
+The widget panel will also appear and is described later in
+this chapter.
+
+__New > ...__: All other items on the New menu are subclasses of
+`Fl_Widget`. Creating them will add them to the
+currently selected group or window, or the group or window
+containing the currently selected widget. The initial
+dimensions and position are chosen by copying the current
+widget, if possible.
+
+When you create the widget you will get the widget's control
+panel, which is described later in this chapter.
+
+__Layout > Align > ...__: Align all selected widgets to the first widget in
+the selection.
+
+__Layout > Space Evenly > ...__: Space all selected widgets evenly inside the
+selected space. Widgets will be sorted from first to last.
+
+__Layout > Make Same Size > ...__: Make all selected widgets the same size as
+the first selected widget.
+
+__Layout > Center in Group > ...__: Center all selected widgets relative to
+their parent widget
+
+__Layout > Grid and Size Settings... (Ctrl+g)__: Display the grid settings
+panel. See \ref setting_layout .
+
+This panel controls dimensions that all widgets snap to when you move
+and resize them, and for the "snap" which is how far a widget has to be
+dragged from its original position to actually change.
+
+Layout preferences are defined using margins to parent groups and windows, gaps
+between widget, and/or by overlaying a grid over a group or window. A layout
+comes as a suite of three presets, one for the main application window, one
+for dialog boxes, and one for toolboxes.
+
+FLUID comes with two included layout suites. `FLTK` was used to design FLUID and
+other included apps, and `Grid` is a more rigid grid layout. Users can add
+more suites, import and export them, and include them into their `.fl`
+project files.
+
+__Shell > Customize... (Alt+x)__: Displays the shell command settings panel.
+Shell commands are commonly used to run a 'make' script to compile the FLUID
+output. See \ref setting_shell .
+
+__Help > About FLUID__: Pops up a panel showing the version of FLUID.
+
+*/
diff --git fluid/documentation/src/page_setting_dialog.dox fluid/documentation/src/page_setting_dialog.dox
new file mode 100644
index 0000000..78b7282
--- /dev/null
+++ fluid/documentation/src/page_setting_dialog.dox
@@ -0,0 +1,338 @@
+/**
+
+ \page page_setting_dialog Settings Dialog
+
+ \tableofcontents
+
+ <img src="w_settings.png" align="left" hspace="10" vspace="10" />
+ \image latex w_settings.png "Settings Dialog" width=7cm
+
+ The *Settings* dialog combines application preferences
+ and project settings in a compact set of six tabs.
+
+ The *General* tab contains a collection of application wide settings. They are
+ stored as user preferences.
+
+ The *Project* tab holds settings for the current project. They are saved with
+ the `.fl` file.
+
+ The *Layout* tab manages databases of preferred widget alignment. These
+ preferences can be saved per user, or as part of the project, or exported for
+ use in other projects.
+
+ The *Shell* tab manages a database of quick access shell commands and scripts.
+ Shell commands can be saved as a user preference and also as part of the
+ `.fl` project file.
+
+ The *Locale* tab sets the method of internationalizing texts in the project,
+ commonly used for labels and tooltips.
+
+ The *User* tab manages customization of fonts and colors in the widget browser.
+ These settings are stored as user preferences.
+
+ <div style="clear:both;"></div>
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section setting_general Application Settings
+
+ <img src="w_settings_general_tab.png" align="left" hspace="10" vspace="10" />
+ \image latex w_settings_general_tab.png "General Settings Tab" width=7cm
+
+ __Scheme__:
+
+ Select one of the graphics schemes built into FLTK. It's helpful
+ to verify the look of various schemes for an application design.
+
+ __Options__:
+
+ Various options to make life as a developer more convenient.
+
+ __Recent Files__:
+
+ FLUID keeps track of recently opened files.
+
+ __External Editor__:
+
+ Users that don't like the built-in FLUID code editor can enter a shell command
+ here that opens the content of Code nodes in an external editor. FLUID does
+ its best to pick up on changed content or when the editor is closed.
+
+ __Overlays__:
+
+ The *Position Guides* are little red arrows that indicate if snap points are
+ found. See the *Layout* tab for details. *Restricted Areas* are areas where
+ widgets from within the same group overlap. They are visible in the project
+ window as a diagonally hashed pattern. *Ghosted Group Outlines* show faint
+ frames around groups that would otherwise be invisible in the project window.
+
+ <div style="clear:both;"></div>
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section setting_project Project Settings
+
+ <img src="w_settings_project_tab.png" align="left" hspace="10" vspace="10" />
+ \image latex w_settings_project_tab.png "Project Settings Tab" width=7cm
+
+ __Header File__, __Code File__:
+
+ These fields are used to build the file path and name of the generated header
+ and source file. If one field is empty the value defaults to `.h` and `.cxx`
+ respectively. If a name starts with a `.`, FLUID assumes that the rest of the
+ text is a file extension. The code file name is then generated by replacing
+ the extension of the `.fl` project file name.
+
+ \todo Document the exact way the source and header file paths are calculated
+ for interactive FLUID, and for FLUID launched from the command line.
+
+ __Include Header from Code__:
+
+ If checked, the statement to include the header file is automatically
+ generated in one of the first lines of the source file.
+
+ __Menu shortcuts use FL_COMMAND__:
+
+ Setting this option will replace FL_CTRL and FL_META as a modifier for
+ shortcuts with the platform aware modifiers FL_COMMAND and FL_CONTROL, making
+ shortcuts more portable between macOS and Windows/Linux.
+
+ __allow Unicode__:
+
+ If unchecked, Unicode characters in strings are escaped. If checked, the Unicode
+ character is stored in the source code in UTF-8 encoding.
+
+ __avoid early include__:
+
+ FLUID by default includes `<FL/Fl.H>` early in the header file. If this option
+ is checked, users can include other files before including the FL header. The
+ user must then include `<FL/Fl.H>` later using a Declaration node.
+
+  <div style="clear:both;"></div>
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section setting_layout Layout Preferences
+
+ <img src="w_settings_layout_tab.png" align="left" hspace="10" vspace="10" />
+ \image latex w_settings_layout_tab.png "Layout Settings Tab" width=7cm
+
+ Layouts are a collection of hints that help when interactively positioning and
+ resizing widgets in the project window. Layouts come in a set of three for
+ the application window, for dialog boxes, and for toolboxes.
+
+ __Layout__:
+
+ The layout pulldown menu lets users choose from a list of existing layouts.
+ The plus button creates a new set of layouts based on the currently selected
+ layout.
+ The pulldown menu has items to rename, load, and save layouts. It can also
+ change the location where the layout is stored. The FLUID beaker is for
+ layouts that are predefined in FLUID, the portrait icon stores as user
+ preference, the document
+ icon stores the layout in the `.fl` file, and the disk icon lets users store
+ layout in external files.
+
+ __Window Margin and Grid__:
+
+ Snap widget position to that margin in relation to the window. The grid
+ snaps widgets to fixed intervals.
+
+ __Group Margin and Grid__:
+
+ Snap widget position to that margin in relation to the group. The grid
+ snaps widgets to fixed intervals relative to the top left of the group.
+
+ __Tabs Margin__:
+
+ Snap the tab inside `Fl_Tabs` to the tab border and the offset given in
+ Margins.
+
+ __Widget Minimum, Increment, and Gap__:
+
+ _Minimum_ sets the minimal width of a widget. _Increment_ is the size multiplier
+ added to the _Minimum_ value. _Gap_ is the preferred distance to other widgets
+ in the same group.
+
+  __Label Font__, __Text Font__:
+
+  The preferred label and text font and size for new widgets.
+
+  <div style="clear:both;"></div>
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section setting_shell Shell Commands
+
+ <img src="w_settings_shell_tab.png" align="left" hspace="10" vspace="10" />
+ \image latex w_settings_shell_tab.png "Shell Settings Tab" width=7cm
+
+ __Shell Command List__:
+
+ A list of all currently available shell commands. The portrait symbol in front
+ of the name indicates that the script is stored in the user preferences. The
+ document symbol saves them within the `.fl` project file.
+
+ `[+]` adds a fresh new script to the list, `[++]` duplicates the currently
+ selected script. `[DEL]` deletes it, and `[v]` offers import and export
+ functionality. The `[T]` button shows the terminal window, and finally the
+ `[Run]` button runs the selected shell script.
+
+ Selecting a shell script will fill in the bottom half of the dialog.
+
+ __Name__:
+
+ This is the name of the script as it appears in the Shell Command List.
+
+ __Menu Label__:
+
+ Shell scripts that match the *Condition* flag are also available for quick
+ access in the *Shell* menu in the main window and via shortcut key
+ combinations. This is the text that is used for the menu entry.
+
+ __Shortcut__:
+
+ Assign a keyboard shortcut to this shell script for even faster access. FLUID
+ does not check if a shortcut is already used elsewhere. Try to avoid
+ collisions, especially when the script is part of a project file.
+
+ __Store__:
+
+ Choose where to store the settings of this shell script, either in the user
+ preferences or as part of the `.fl` project file.
+
+ __Condition__:
+
+ Shell scripts can be quite different for different platforms hosting FLUID.
+ This choice limits scripts to specific platforms. Multiple scripts can have
+ the same shortcut if they have different conditions.
+
+ __Shell Script__:
+
+ This is a text field for the shell script. The `[v]` pulldown menu has a list
+ of variables that are replaced with the corresponding value before running
+ the script. The zoom button gives access to a much larger shell script editor.
+
+ The options below are a list of actions that can be executed before running
+ the script.
+
+  <div style="clear:both;"></div>
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section setting_i18n Internationalization
+
+ The *Locale* tab can be used to configure optional internationalization.
+ FLUID supports GNU `gettext` and POSIX `catgets`.
+
+ FLUID supports internationalization (I18N for short) of label
+ strings and tooltips used by widgets. The GNU gettext option also
+ supports deferred translation of statically initialized menu item
+ labels. The setting panel (`Alt+p`) provides access
+ to the I18N options.
+
+ \image html w_settings_i18n_gnu.png
+ \image latex w_settings_i18n_gnu.png "I18N With GNU gettext" width=7cm
+
+ FLUID supports three methods of I18N: none, GNU
+ gettext, and POSIX catgets. The "none" method is the
+ default and just passes the label strings as-is to the widget
+ constructors.
+
+ The "GNU gettext" method uses GNU gettext (or a similar
+ text-based I18N library) to retrieve a localized string before
+ calling the widget constructor.
+
+ The GNU gettext option adds some preprocessor code to the source file:
+ ```
+ #include <libintl.h>
+ #ifndef gettext_noop
+ #  define gettext_noop(text) text
+ #endif
+ ```
+ and the gettext call around strings in the source code:
+ ```
+ new Fl_Button(50, 50, 54, 40, "Button");
+ // ->
+ new Fl_Button(50, 50, 54, 40, gettext("Button"));
+ ```
+
+ FLUID's code support for GNU gettext is limited to calling a
+ function or macro to retrieve the localized label; you still
+ need to call \p setlocale() and \p textdomain() or
+ \p bindtextdomain() to select the appropriate language and
+ message file.
+
+ __Include__: controls the header file to include for
+I18N; by default this is \b <libintl.h>, the
+standard I18N file for GNU gettext.
+
+ __Conditional__: If this field contains a macro name, i18n will only be
+ compiled into the product if this macro is defined. The build system should
+ define the macro only if all required headers and libraries are available. If
+ the macro is not defined, no headers are included and `gettext` passes text
+ through untranslated.
+
+ __Function__: controls the function (or macro) that will retrieve the localized
+ message; by default the \p gettext function will be called.
+
+ __Static Function__: names a macro that will mark static text fields for
+ extraction with the `xgettext` tool. The default macro name is
+ \p gettext_noop and will be defined as `#define gettext_noop(text) text`
+ right after the `#include` statement. FLUID will call `gettext` on static
+ texts later, after the textdomain was set by the user.
+
+ \see [GNU gettext special cases](https://www.gnu.org/software/gettext/manual/html_node/Special-cases.html)
+
+ \image html w_settings_i18n_psx.png
+ \image latex w_settings_i18n_psx.png "I18N With POSIX catgets" width=7cm
+
+ The "POSIX catgets" method uses the POSIX catgets function to
+ retrieve a numbered message from a message catalog before
+ calling the widget constructor.
+
+ FLUID's code support for POSIX catgets allows you to use a
+ global message file for all interfaces or a file specific to
+ each <tt>.fl</tt> file; you still need to call
+ \p setlocale() to select the appropriate language.
+
+ This option adds some preprocessor code to the source file:
+ ```
+ #include <nl_types.h>
+ // Initialize I18N stuff now for menus...
+ #include <locale.h>
+ static char *_locale = setlocale(LC_MESSAGES, "");
+ static nl_catd _catalog = catopen("", 0);
+ ```
+ and the catgets call around strings in the source code:
+ ```
+ new Fl_Button(50, 50, 54, 40, "Button");
+ // ->
+ new Fl_Button(50, 50, 54, 40, catgets(_catalog,1,6,"Button"));
+ ```
+
+ __Include__:  controls the header file to include for
+ I18N; by default this is \b <nl_types.h>, the
+ standard I18N file for POSIX catgets.
+
+ __Conditional__: include the header file only if this preprocessor macro is
+ defined.
+
+ __Catalog__: controls the name of the catalog file
+variable to use when retrieving localized messages; by default
+the file field is empty which forces a local (static) catalog
+file to be used for all of the windows defined in your
+<tt>.fl</tt> file.
+
+ __Set__: controls the set number in the catalog file.
+The default set is 1 and rarely needs to be changed.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section setting_user User Interface Preferences
+
+ <img src="w_settings_user_tab.png" align="left" hspace="10" vspace="10" />
+ \image latex w_settings_user_tab.png "User Settings Tab" width=7cm
+
+ This tab lets users change the font and color of text in the widget browser.
+ The settings are stored in the user preferences.
+
+ All changes are directly visible in the widget browser.
+
+ <div style="clear:both;"></div>
+
+ */
diff --git fluid/documentation/src/page_tutorial.dox fluid/documentation/src/page_tutorial.dox
new file mode 100644
index 0000000..3f0d48c
--- /dev/null
+++ fluid/documentation/src/page_tutorial.dox
@@ -0,0 +1,534 @@
+/**
+
+ \page page_tutorial Tutorials
+
+ \tableofcontents
+
+<!-- ---------------------------------------------------------------------- -->
+
+ \section fluid_hello_world_tutorial Hello, World!
+
+ The first FLUID tutorial explains the FLUID basics. It creates a single
+ `main()` function that opens an application window with a static text box
+ inside.
+
+ After launching FLUID we want to make sure that two very useful tool windows
+ are open.
+ The "Widget Bin" gives quick access to all available widgets and functional
+ types. It can be opened via the main menu: __Edit > Show Widget Bin__, or
+ using the shortcut __Alt-B__.
+
+ The second very helpful tool box is the "Code View". The Code View gives
+ a preview of the code as it will be generated by FLUID. All changes in the
+ layout or in attributes are reflected immediately in the Code View.
+ Choose __Edit > Show Code View__ or press __Alt-C__ to get this
+ toolbox. Make sure that _Auto-Refresh_ and _Auto-Position_ are active in
+ the Code View.
+
+ Let's start Hello World from scratch. If there is already a previous project
+ loaded, select __File > New__ or __Ctrl-N__.
+
+ Before we can create a window, we need a "C" function that can be called
+ when we run the program. Select __New > Code > Function/Method...__ or click on
+ the
+ \image{inline} html flFunction.png "Function/Method"
+ \image{inline} latex flFunction.png
+ image in the widget bin.
+
+ A function is added as a first line to the widget tree in the main window,
+ and a "Function/Method Properties" dialog box will pop up. For our Hello World
+ program, delete all text in the top "Name(args)" text field. If this field
+ is left empty, FLUID will generate a `main(argc, argv)` function for us.
+
+ \image html fluid4.png "Function/Method Properties Dialog"
+ \image latex fluid4.png "Function/Method Properties Dialog" width=7cm
+
+ Click OK to apply the changes you made in the Function Properties dialog.
+ You can get this dialog back at any time by selecting the function in the
+ main window and pressing __F1__, or by double-clicking it.
+
+ Note that the function will not show up in the Code View yet. FLUID will
+ not generate code for functions that don't have any content, and only create
+ a forward declaration in the header file, assuming that the function will
+ be implemented inside another module.
+
+ Keep the `main` function selected and add an `Fl_Window` to the function by
+ selecting __New > Group > Window...__, by clicking the
+ \image{inline} html flWindow.png "Group/Window"
+ \image{inline} latex flWindow.png
+ image in the Widget Bin, or by dragging the Group/Window image from the
+ Widget Bin onto the desktop.
+
+ A new application window will open up on the desktop. The thin red outline
+ around the window indicates that it is selected. Dragging the red line will
+ resize the window. Take a look at the Code View: the main function
+ is now generated, including code to instantiate our `Fl_Window`.
+
+ To edit all the attributes of our window, make sure it is selected and press
+ __F1__, or double-click the entry in the main FLUID window, or double-click
+ the window itself. The "Widget Properties" dialog box will pop up. Enter
+ some text in the "Label:" text box and see how the label is updated immediately
+ in the window itself, in the widget list, and in the Code View.
+
+ Adding a static text to our window is just as easy. Put an `Fl_Box` into our
+ window by selecting __New > Other > Box__, or by clicking on the
+ \image{inline} html flBox.png "Other/Box"
+ \image{inline} latex flBox.png
+ image in the Widget Bin, or by dragging the Other/Box image from the
+ Widget Bin into our newly created window.
+
+ Most importantly, enter the text "Hello, World!" in the "Label:" field
+ of the Box Widget Properties panel to achieve the goal of this tutorial. Now
+ is also a great time to experiment with label styles, label fonts, sizes,
+ colors, etc. .
+
+ Finally, we should save our project as an `.fl` project file somewhere. Once
+ the project is saved, select __File > Write Code__ or press __Shift-Ctrl-C__
+ to write our source code and header file to the same directory.
+
+ Compile the program using a Makefile, CMake file, or fltk-config as described
+ in the FLTK manual and the `README.txt` files in the FLTK source tree.
+
+<!-- ---------------------------------------------------------------------- -->
+
+ \section fluid_1of7guis_tutorial 7GUIs, Task 1
+
+ In the first "Hello World" tutorial, we built an entire application in FLUID.
+ It's a boring application though that does nothing except quitting when the
+ close button in the window border is clicked.
+
+ \image html 1of7GUIs.png "Task 1 of 7GUIs"
+ \image latex 1of7GUIs.png "Task 1 of 7GUIs" width=5cm
+
+ The second tutorial will introduce callbacks by implementing task 1, "Counter",
+ of 7GUIs. 7GUIs has been created as a spin-off of my masterâ??s thesis
+ Comparison of Object-Oriented and Functional Programming for GUI Development
+ at the Human-Computer Interaction group of the Leibniz Universität Hannover
+ in 2014. 7GUIs defines seven tasks that represent typical challenges in GUI
+ programming. https://eugenkiss.github.io/7guis/ .
+
+ Task 1 requires "Understanding the basic ideas of a language/toolkit. The
+ task is to build a frame containing a label or read-only textfield T and a
+ button B. Initially, the value in T is â??0â?? and each click of B increases the
+ value in T by one."
+
+ Our knowledge from tutorial 1 is enough to generate the `main()` function, and
+ add an `Fl_Window`, an `Fl_Output`, and an `Fl_Button`. To make life easy,
+ FLUID comes with a built-in template for this tutorial. Just select
+ __File > New from Template...__ and double-click "1of7GUIs" in the Template
+ Panel.
+
+ We will need to reference the output widget in our callback, so let's assign a
+ pointer to the widget to a global variable and give that variable a name.
+ Open the Widget Properties dialog by double-clicking the output widget.
+ Change to the "C++" tab, and enter "`counter_widget`" in the "Name:" field.
+
+ The "Count" button is the active element in our application. To tell the
+ app what to do when the user clicks the button, we create a callback function
+ for that button. Open the widget properties dialog for the button.
+ In the "C++" tab, we find the input field "Callback:".
+
+ The callback is called exactly once every time the user clicks the button. Our
+ strategy here is to read the current value from the `counter_widget`,
+ increment it by 1, and write it back to `counter_widget`.
+ The FLTK documentation tells us that we can use `Fl_Output::ivalue()` to get
+ text in `Fl_Output` as an integer, and we can write it back by calling
+ `Fl_Output::value(int)`. When the value is changed, FLTK will automatically
+ redraw the output widget for us. So here is the callback code:
+
+ ```
+ int i = counter_widget->ivalue();
+ i++;
+ counter_widget->value(i);
+ ```
+
+ That's it. This is a complete interactive desktop application. Compile, link,
+ run, and test it to see how it works.
+
+<!-- ---------------------------------------------------------------------- -->
+
+\section fluid_cubeview_tutorial Cube View
+
+This tutorial will show you how to generate a complete user interface
+class with FLUID that is used for the CubeView program provided with FLTK.
+
+\image html cubeview.png "CubeView demo"
+\image latex cubeview.png "CubeView demo" width=7cm
+
+The window is of class CubeViewUI, and is completely generated by FLUID,
+including class member functions. The central display of the cube is a
+separate subclass of Fl_Gl_Window called CubeView. CubeViewUI manages
+CubeView using callbacks from the various sliders and rollers to
+manipulate the viewing angle and zoom of CubeView.
+
+At the completion of this tutorial you will (hopefully) understand how to:
+
+-# Use FLUID to create a complete user interface class, including
+   constructor and any member functions necessary.
+-# Use FLUID to set callback member functions of custom widget classes.
+-# Subclass an Fl_Gl_Window to suit your purposes.
+
+\subsection fluid_cubeview The CubeView Class
+
+The CubeView class is a subclass of Fl_Gl_Window. It has methods for
+setting the zoom, the \e x and \e y pan, and the rotation angle
+about the \e x and \e y axes.
+
+You can safely skip this section as long as you realize that CubeView
+is a sublass of Fl_Gl_Window and will respond to calls from
+CubeViewUI, generated by FLUID.
+
+\par The CubeView Class Definition
+
+Here is the CubeView class definition, as given by its header file
+"test/CubeView.h":
+<br>
+
+<!-- Code copied from test/CubeView.h -->
+\code
+#include <FL/Fl.H>
+#include <FL/Fl_Gl_Window.H>
+#include <FL/gl.h>
+
+class CubeView : public Fl_Gl_Window {
+
+public:
+  CubeView(int x, int y, int w, int h, const char *l = 0);
+
+  // This value determines the scaling factor used to draw the cube.
+  double size;
+
+  /* Set the rotation about the vertical (y) axis.
+   *
+   * This function is called by the horizontal roller in
+   * CubeViewUI and the initialize button in CubeViewUI.
+   */
+  void v_angle(double angle) { vAng = angle; }
+
+  // Return the rotation about the vertical (y) axis.
+  double v_angle() const { return vAng; }
+
+  /* Set the rotation about the horizontal (x) axis.
+   *
+   * This function is called by the vertical roller in
+   * CubeViewUI and the initialize button in CubeViewUI.
+   */
+
+  void h_angle(double angle) { hAng = angle; }
+
+  // The rotation about the horizontal (x) axis.
+  double h_angle() const { return hAng; }
+
+  /* Sets the x shift of the cube view camera.
+   *
+   * This function is called by the slider in CubeViewUI
+   * and the initialize button in CubeViewUI.
+   */
+  void panx(double x) { xshift = x; }
+
+  /* Sets the y shift of the cube view camera.
+   *
+   * This function is called by the slider in CubeViewUI
+   * and the initialize button in CubeViewUI.
+   */
+  void pany(double y) { yshift = y; }
+
+  /* The widget class draw() override.
+   *
+   * The draw() function initializes Gl for another round of
+   * drawing, then calls specialized functions for drawing each
+   * of the entities displayed in the cube view.
+   */
+  void draw();
+
+private:
+  /*  Draw the cube boundaries.
+   *
+   * Draw the faces of the cube using the boxv[] vertices,
+   * using GL_LINE_LOOP for the faces.
+   */
+  void drawCube();
+
+  double vAng, hAng;
+  double xshift, yshift;
+
+  float boxv0[3]; float boxv1[3];
+  float boxv2[3]; float boxv3[3];
+  float boxv4[3]; float boxv5[3];
+  float boxv6[3]; float boxv7[3];
+};
+\endcode
+
+\par The CubeView Class Implementation
+
+Here is the CubeView implementation. It is very similar to the
+"CubeView" demo included with FLTK.
+<br>
+
+<!-- Code copied from test/CubeView.cxx -->
+\code
+#include "CubeView.h"
+#include <math.h>
+
+CubeView::CubeView(int x, int y, int w, int h, const char *l)
+  : Fl_Gl_Window(x, y, w, h, l)
+{
+  Fl::use_high_res_GL(1);
+  vAng = 0.0;
+  hAng = 0.0;
+  size = 10.0;
+  xshift = 0.0;
+  yshift = 0.0;
+
+  /* The cube definition. These are the vertices of a unit cube
+   * centered on the origin.*/
+
+  boxv0[0] = -0.5; boxv0[1] = -0.5; boxv0[2] = -0.5;
+  boxv1[0] =  0.5; boxv1[1] = -0.5; boxv1[2] = -0.5;
+  boxv2[0] =  0.5; boxv2[1] =  0.5; boxv2[2] = -0.5;
+  boxv3[0] = -0.5; boxv3[1] =  0.5; boxv3[2] = -0.5;
+  boxv4[0] = -0.5; boxv4[1] = -0.5; boxv4[2] =  0.5;
+  boxv5[0] =  0.5; boxv5[1] = -0.5; boxv5[2] =  0.5;
+  boxv6[0] =  0.5; boxv6[1] =  0.5; boxv6[2] =  0.5;
+  boxv7[0] = -0.5; boxv7[1] =  0.5; boxv7[2] =  0.5;
+}
+
+void CubeView::drawCube() {
+/* Draw a colored cube */
+#define ALPHA 0.5
+  glShadeModel(GL_FLAT);
+
+  glBegin(GL_QUADS);
+    glColor4f(0.0, 0.0, 1.0, ALPHA);
+    glVertex3fv(boxv0);
+    glVertex3fv(boxv1);
+    glVertex3fv(boxv2);
+    glVertex3fv(boxv3);
+
+    glColor4f(1.0, 1.0, 0.0, ALPHA);
+    glVertex3fv(boxv0);
+    glVertex3fv(boxv4);
+    glVertex3fv(boxv5);
+    glVertex3fv(boxv1);
+
+    glColor4f(0.0, 1.0, 1.0, ALPHA);
+    glVertex3fv(boxv2);
+    glVertex3fv(boxv6);
+    glVertex3fv(boxv7);
+    glVertex3fv(boxv3);
+
+    glColor4f(1.0, 0.0, 0.0, ALPHA);
+    glVertex3fv(boxv4);
+    glVertex3fv(boxv5);
+    glVertex3fv(boxv6);
+    glVertex3fv(boxv7);
+
+    glColor4f(1.0, 0.0, 1.0, ALPHA);
+    glVertex3fv(boxv0);
+    glVertex3fv(boxv3);
+    glVertex3fv(boxv7);
+    glVertex3fv(boxv4);
+
+    glColor4f(0.0, 1.0, 0.0, ALPHA);
+    glVertex3fv(boxv1);
+    glVertex3fv(boxv5);
+    glVertex3fv(boxv6);
+    glVertex3fv(boxv2);
+  glEnd();
+
+  glColor3f(1.0, 1.0, 1.0);
+  glBegin(GL_LINES);
+    glVertex3fv(boxv0);
+    glVertex3fv(boxv1);
+
+    glVertex3fv(boxv1);
+    glVertex3fv(boxv2);
+
+    glVertex3fv(boxv2);
+    glVertex3fv(boxv3);
+
+    glVertex3fv(boxv3);
+    glVertex3fv(boxv0);
+
+    glVertex3fv(boxv4);
+    glVertex3fv(boxv5);
+
+    glVertex3fv(boxv5);
+    glVertex3fv(boxv6);
+
+    glVertex3fv(boxv6);
+    glVertex3fv(boxv7);
+
+    glVertex3fv(boxv7);
+    glVertex3fv(boxv4);
+
+    glVertex3fv(boxv0);
+    glVertex3fv(boxv4);
+
+    glVertex3fv(boxv1);
+    glVertex3fv(boxv5);
+
+    glVertex3fv(boxv2);
+    glVertex3fv(boxv6);
+
+    glVertex3fv(boxv3);
+    glVertex3fv(boxv7);
+  glEnd();
+} // drawCube
+
+void CubeView::draw() {
+  if (!valid()) {
+    glLoadIdentity();
+    glViewport(0, 0, pixel_w(), pixel_h());
+    glOrtho(-10, 10, -10, 10, -20050, 10000);
+    glEnable(GL_BLEND);
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  }
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  glPushMatrix();
+
+  glTranslatef((GLfloat)xshift, (GLfloat)yshift, 0);
+  glRotatef((GLfloat)hAng, 0, 1, 0);
+  glRotatef((GLfloat)vAng, 1, 0, 0);
+  glScalef(float(size), float(size), float(size));
+
+  drawCube();
+
+  glPopMatrix();
+}
+\endcode
+
+\subsection fluid_cubeview_ui The CubeViewUI Class
+
+We will completely construct a window to display and control the
+CubeView defined in the previous section using FLUID.
+
+\par Defining the CubeViewUI Class
+
+Once you have started FLUID, the first step in defining a class is to
+create a new class within FLUID using the <b>New->Code->Class</b>
+menu item. Name the class "CubeViewUI" and leave the subclass blank.
+We do not need any inheritance for this window. You should see the
+new class declaration in the FLUID browser window.
+
+\image html  fluid1.png "FLUID file for CubeView"
+\image latex fluid1.png "FLUID file for CubeView" width=7cm
+
+\par Adding the Class Constructor
+
+Click on the CubeViewUI class in the FLUID window and add a new method
+by selecting <b>New->Code->Function/Method.</b> The name of the
+function will also be CubeViewUI. FLUID will understand that this will
+be the constructor for the class and will generate the appropriate
+code. Make sure you declare the constructor public.
+
+Then add a window to the CubeViewUI class. Highlight the name of
+the constructor in the FLUID browser window and click on
+<b>New->Group->Window</b>. In a similar manner add the
+following to the CubeViewUI constructor:
+
+\li A horizontal roller named \p hrot
+\li A vertical roller named \p vrot
+\li A horizontal slider named \p xpan
+\li A vertical slider named \p ypan
+\li A horizontal value slider named \p zoom
+
+None of these additions need be public. And they shouldn't be
+unless you plan to expose them as part of the interface for
+CubeViewUI.
+
+When you are finished you should have something like this:
+
+\image html fluid2.png "FLUID window containing CubeView demo"
+\image latex fluid2.png "FLUID window containing CubeView demo" width=7cm
+
+We will talk about the \p show() method that is highlighted
+shortly.
+
+\par Adding the CubeView Widget
+
+What we have is nice, but does little to show our cube. We have already
+defined the CubeView class and we would like to show it within the
+CubeViewUI.
+
+The CubeView class inherits the Fl_Gl_Window class, which
+is created in the same way as an Fl_Box widget. Use
+<b>New->Other->Box</b> to add a square box to the main window.
+This will be no ordinary box, however.
+
+The Box properties window will appear. The key to letting CubeViewUI
+display CubeView is to enter CubeView in the <b>Class:</b> text
+entry box. This tells FLUID that it is not an Fl_Box, but a
+similar widget with the same constructor.
+
+In the <b>Extra Code:</b> field enter <tt>\#include "CubeView.h"</tt>
+
+This \p \#include is important, as we have just included
+CubeView as a member of CubeViewUI, so any public CubeView methods are
+now available to CubeViewUI.
+
+\image html fluid3-cxx.png "CubeView methods"
+\image latex fluid3-cxx.png "CubeView methods" width=7cm
+
+\par Defining the Callbacks
+
+Each of the widgets we defined before adding CubeView can have
+callbacks that call CubeView methods. You can call an external
+function or put a short amount of code in the <b>Callback</b>
+field of the widget panel. For example, the callback for the
+\p ypan slider is:
+
+\code
+cube->pany(((Fl_Slider *)o)->value());
+cube->redraw();
+\endcode
+
+We call <tt>cube->redraw()</tt> after changing the value to update
+the CubeView window. CubeView could easily be modified to do this, but
+it is nice to keep this exposed. In the case where you may want to do
+more than one view change only redrawing once saves a lot of time.
+
+There is no reason to wait until after you have added CubeView to
+enter these callbacks. FLUID assumes you are smart enough not to refer
+to members or functions that don't exist.
+
+\par Adding a Class Method
+
+You can add class methods within FLUID that have nothing to do with the
+GUI. As an example add a show function so that CubeViewUI can actually
+appear on the screen.
+
+Make sure the top level CubeViewUI is selected and select
+<b>New->Code->Function/Method</b>. Just use the name
+\p show(). We don't need a return value here, and since we will
+not be adding any widgets to this method FLUID will assign it a return
+type of \p void.
+
+\image html fluid4.png "CubeView constructor"
+\image latex fluid4.png "CubeView constructor" width=7cm
+
+Once the new method has been added, highlight its name and select
+<b>New->Code->Code.</b> Enter the method's code in the code window.
+
+\subsection fluid_addconst Adding Constructor Initialization Code
+
+If you need to add code to initialize a class, for example setting
+initial values of the horizontal and vertical angles in the
+CubeView, you can simply highlight the constructor and select
+<b>New->Code->Code</b>. Add any required code.
+
+\subsection fluid_gencode Generating the Code
+
+Now that we have completely defined the CubeViewUI, we have to generate
+the code. There is one last trick to ensure this all works. Open the
+preferences dialog from <b>Edit->Preferences</b>.
+
+At the bottom of the preferences dialog box is the key:
+<b>"Include Header from Code"</b>.
+Select that option and set your desired file
+extensions and you are in business. You can include the CubeViewUI.h
+(or whatever extension you prefer) as you would any other C++ class.
+
+*/
diff --git fluid/documentation/src/page_widget_panel.dox fluid/documentation/src/page_widget_panel.dox
new file mode 100644
index 0000000..158f466
--- /dev/null
+++ fluid/documentation/src/page_widget_panel.dox
@@ -0,0 +1,429 @@
+/**
+
+ \page page_widget_panel Widget Properties Panel
+
+ \tableofcontents
+
+ # The Widget Properties Panel #
+
+ \image html widget_panel.png "Widget Properties"
+ \image latex widget_panel.png "Widget Properties" width=9cm
+
+ This panel is used to edit the properties of the currently selected widgets.
+ It can be opened by double-clicking on a widget or by pressing `F1`.
+
+ When you change attributes using this panel, the changes are
+ reflected immediately in the window. It is useful to hit the
+ "Hide Overlays" button (or type Ctrl+Shift+O) to hide the
+ red overlay so you can see the widgets more accurately,
+ especially when setting the box type.
+
+ One or more widgets can be selected at the same time, and most attribute
+ changes will be applied to the entire selection.
+ Depending on the selected widget types, some properties may
+ be grayed out or may not be visible.
+
+ All changes in the widget panel are immediately applied to all selected
+ widgets and their effect can be seen in the project window. It can be very
+ useful to keep the *Code View* window open at all times. All code changes
+ appear instantly for all generated files if *Auto-Refresh* is active.
+
+ FLUID generates only code for properties that differ from their default
+ setting. If a widget class is derived from another class, FLUID can't know
+ the defaults and will generate code for all attributes instead.
+
+ \image html wLiveMode.png
+ \image latex wLiveMode.png "" width=9cm
+
+ Correctly resizing a window can be a complex task. It is easier to check
+ resizing behavior on a more local level first.
+ To use *Live Resize*, select any group or window in your project. FLUID creates
+ a resizable clone of that part of your design to try out resizing behavior
+ of that group only.
+
+ The widget panel itself is resizable to make more room for entering code
+ and long texts.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section widget_panel_gui The GUI Tab
+
+ \image html wp_gui_tab.png
+ \image latex wp_gui_tab.png "" width=9cm
+
+ The widget panel has three standard tabs that apply to all widgets. Some widget
+ types, `Fl_Grid` and children of `Fl_Grid`, will create additional
+ tabs with more options.
+
+ The GUI tab controls basic GUI settings, including label text and widget size.
+
+ \image html wp_gui_label.png
+ \image latex wp_gui_label.png "" width=7cm
+
+ The *Label* field can be any Unicode string and is stored as a static text.
+ If internationalization is enabled, the corresponding modifiers are
+ added. Labels can span multiple lines by pressing `Ctrl-J` to insert a newline
+ (NL) character.
+
+ The `@` character adds a symbol to the label. See *Labels and Label Types*
+ in the FLTK documentation.
+
+ The pulldown menu offers some additional rendering styles for the label.
+
+ \image html wp_gui_image.png
+ \image latex wp_gui_image.png "" width=7cm
+
+ Add an image to the widget label here. The second row takes an optional image
+ for rendering a deactivated widget.
+
+ The image path must be relative to the location of the `.fl` file and not
+ necessarily the current directory. It is helpful to keep images in the same
+ directory as the `.fl` file.
+
+ The image data is inlined into the source code. If many widgets share the same
+ image then only one copy is written. Since the image data is embedded in the
+ generated source code, you need only distribute the C++ code and not the
+ image files themselves. The `.fl` project files however store only the image
+ file name, so you will need the image files as well to read a project file.
+
+ FLUID can read XBM bitmap files, XPM pixmaps with a transparency channel, and
+ all other types supported by the FLTK image extension. FLUID stores images
+ as bitmaps or RGB data by default. If *compressed* is selected in the image
+ properties field, the image is stored in its original format, and
+ the FLTK-images library must be linked to decompress the image at runtime.
+
+ Images are stored at their original resolution. The image properties dialog
+ provides *Scale* settings to scale the image before rendering to screen.
+ To make full use of high-dpi screen support, images should be stored at double
+ resolution and then scaled to FLTK coordinates. This gives FLTK the chance to
+ fall back to the full size image for high-dpi screens.
+
+ \image html wp_gui_alignment.png
+ \image latex wp_gui_alignment.png "" width=7cm
+
+ Control alignment of the label in relation to the widget position and size as
+ well as the relation between the image and the label. The box on the right
+ toggles between inside and outside label alignment.
+
+ \image html wp_gui_size.png
+ \image latex wp_gui_size.png "" width=7cm
+
+ Control the size and position of a widget here. The input fields react to
+ vertical scroll wheel input for interactive positioning.
+
+ All fields understand basic math. They are evaluated after the formula is
+ entered and the result is stored in the respective properties. Formulas can
+ also contain a number of variables. The *x* input can handle the variables
+ `x` for its own position, `px` for the parent position, `sx` for the previous
+ sibling, `cx` for the leftmost x position of all children, and `i`, which is a
+ counter through all selected widgets.
+
+ The formula `x+10` in the *x* field moves all selected widgets 10 pixels to
+ the right. `100+25*i` in the *y* field arranges all widgets vertically
+ starting at 100 with 25 pixels distance.
+
+| Name | Value |
+| ---- | ----- |
+| `i`  | zero based counter of selected widgets |
+| `x`, `y`, `w`, `h` | position and size of the current widget |
+| `px`, `py`, `pw`, `ph` | dimensions of the parent widget |
+| `sx`, `sy`, `sw`, `sh` | dimensions of the previous sibling |
+| `cx`, `cy`, `cw`, `ch` | bounding box of all children |
+
+ \image html wp_gui_values.png
+ \image latex wp_gui_values.png "" width=7cm
+
+ Activate for widgets that can take numerical values, these input fields take
+ floating point numbers. They generate lines like `o->minimum(2);` only if the
+ corresponding value differs from the default value for this property.
+
+ \image html wp_gui_flexp.png
+ \image latex wp_gui_flexp.png "" width=7cm
+
+ This row is only visible for children of `Fl_Flex` widgets. It sets the
+ width or height of a widget in a horizontal or vertical Flex widget. If *fixed*
+ is unchecked, this value is instead calculated by the Flex.
+
+ \image html wp_gui_margins.png
+ \image latex wp_gui_margins.png "" width=7cm
+
+ This row is only visible for `Fl_Flex` widgets. It sets the various margins
+ and the gap value for this widget.
+
+ \image html wp_gui_sizerange.png
+ \image latex wp_gui_sizerange.png "" width=7cm
+
+ This row is only visible for top level windows. The fields set the minimum
+ and maximum size range for windows. Use the *set* button to copy the current
+ size. Set width and height to `0` to disable that aspect of the size range.
+
+ \image html wp_gui_shortcut.png
+ \image latex wp_gui_shortcut.png "" width=7cm
+
+ This option is only visible for buttons and other widgets that can react to a
+ shortcut key combination. FLUID does not check if a shortcut was already used
+ elsewhere.
+
+ If *shortcut use FL_COMMAND* is set in the project settings, modifiers are
+ created in a more compatible way across platforms.
+
+ \image html wp_gui_xclass.png
+ \image latex wp_gui_xclass.png "" width=7cm
+
+ This row is only visible for top level windows. Note that selecting *modal*
+ and *non modal* together is undefined.
+
+ The string typed into the *X Class* field is passed to the X window manager
+ as the class. This can change the icon or window decorations. On most window
+ managers you will have to close the window and reopen it at runtime to
+ see the effect.
+
+ \image html wp_gui_attributes.png
+ \image latex wp_gui_attributes.png "" width=7cm
+
+ Some additional attributes for all widget types.
+
+ The *Visible* button controls whether the widget is
+ visible (on) or hidden (off) initially. Don't change this for
+ windows or for the immediate children of a Tabs group.
+
+ The *Active* button controls whether the widget is
+ activated (on) or deactivated (off) initially. Most widgets
+ appear grayed out when deactivated.
+
+ The *Resizable* button controls whether the window or widget is
+ resizable. In addition all the size changes of a window or
+ group will go "into" the resizable child. If you have
+ a large data display surrounded by buttons, you probably want
+ that data area to be resizable. You can get more complex
+ behavior by making invisible boxes the resizable widget, or by
+ using hierarchies of groups. Resizing of a window or group can be tested
+ using the *live resize* button.
+
+ The *Hotspot* button causes the parent window to be
+ positioned with that widget centered on the mouse. This
+ position is determined when the FLUID function is called,
+ so you should call it immediately before showing the window. If
+ you want the window to hide and then reappear at a new position,
+ you should have your program set the hotspot itself just before
+ `show()`.
+
+ \image html wp_gui_tooltip.png
+ \image latex wp_gui_tooltip.png "" width=7cm
+
+ The *Tooltip* field can be any Unicode string and is stored as a static text.
+ If internationalization is enabled, the corresponding modifiers are
+ added.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section widget_panel_style The Style Tab
+
+ \image html wp_style_tab.png
+ \image latex wp_style_tab.png "Style Tab" width=9cm
+
+ The Style tab is used to edit font styles and sizes, and the color of elements
+ of the widget.
+
+ \image html wp_style_label.png
+ \image latex wp_style_label.png "" width=7cm
+
+ \image html wp_style_text.png
+ \image latex wp_style_text.png "" width=7cm
+
+ The font pulldown menu provides a list of standard fonts. To enter the index
+ of a user loaded font, an *extra code* field must be used. The *label color*
+ and *text color* fields opens a color palette selector. The arrow pulldown
+ contains a list of the most commonly used colors. Again, user specific colors
+ can be defined using the *extra code* field.
+
+ The *Text Font* row is only available for widgets that contain an additional
+ text area.
+
+ \image html wp_style_box.png
+ \image latex wp_style_box.png "" width=7cm
+
+ Select the up and down box for the given widget. The first six entries in the
+ box and frame style list are influenced by the FLTK Scheme setting. Other
+ box styles will always look the same, independently of the selected scheme.
+
+ Many widgets will work, and draw faster, with a
+ "frame" instead of a "box". A frame does
+ not draw the colored interior, leaving whatever was already
+ there visible. Be careful, as FLUID may draw this ok but the
+ real program may leave unwanted stuff inside the widget.
+
+ If a window is filled with child widgets, you can speed up
+ redrawing by changing the window's box type to
+ "NO_BOX". FLUID will display a checkerboard for any
+ areas that are not colored in by boxes. Note that this
+ checkerboard is not drawn by the resulting program. Instead
+ random garbage will be displayed.
+
+ The *Down Box* row is only available for widgets that can be pressed down
+ by the user.
+
+ Some widgets will use the *Select Color* for certain parts. FLUID
+ does not always show the result of this: this is the color
+ buttons draw in when pushed down, and the color of input fields
+ when they have the focus.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section widget_panel_cpp The C++ Tab
+
+ \image html wp_cpp_tab.png
+ \image latex wp_cpp_tab.png "C++ Tab" width=9cm
+
+ The C++ tab has various input fields for adding C++ code at various places
+ in the source and header file.
+
+ \image html wp_cpp_class.png
+ \image latex wp_cpp_class.png "" width=7cm
+
+ If the class property is set, FLUID assumes that the user wants to instantiate
+ a widget that is derived from the selected widget. For a derived widget, the
+ default values of attribute can not be known. FLUID will generate code to
+ explicitly set every known attribute of the super class.
+
+ FLUID generates "include" statements for known classes. Custom classes should
+ provide a \p \#include line as one of the "Extra Code" lines of the widget.
+
+ If the selected widget is a Widget Class node, the Class property will instead
+ set the super class of the widget.
+
+ The pulldown menu on the right side contains additional subtypes for some
+ widget types. `Fl_Button` widgets, for instance, can be further refined to
+ be an `Fl_Toggle_Button` or an `Fl_Radio_Button`.
+
+ \image html wp_cpp_name.png
+ \image latex wp_cpp_name.png "" width=7cm
+
+ The name field can be any valid C++ variable name. If the widget is inside
+ a class, the pulldown menu lets the user select between *private*, *protected*,
+ and *public*. If not in the group, the variable can be *global* or *static*
+ within the source file.
+
+ Widgets created by FLUID are either "named", "complex named" or
+ "unnamed". A named widget has a legal C++ variable identifier as its
+ name (i.e. only alphanumeric and underscore). In this case FLUID
+ defines a global variable or class member that will point at the widget
+ after the function defining it is called. A complex named object has
+ punctuation such as <tt>'.'</tt> or <tt>'->'</tt> or any other symbols
+ in its name. In this case FLUID does not attempt to declare it. This can be
+ used to get the widgets into structures. An unnamed widget has a blank
+ name and no pointer is stored.
+
+ You can name several widgets with "name[0]", "name[1]", "name[2]", etc..
+ This will cause FLUID to declare an array of pointers. The array
+ is big enough that the highest number found can be stored. All widgets
+ in the array must be the same type.
+
+ \image html v_input.png
+ \image latex v_input.png "" width=7cm
+
+ These four input fields can be used to add arbitrary code to different parts
+ of the header and source file. A line can be divided into multiple lines
+ of code by inserting a `Ctrl-J`.
+
+ All Extra Code fields are interpreted individually. If a field contains a `#`
+ character, or the words `extern`, `typedef`, or `using`, FLUID assumes that
+ the code is a declaration and writes it to the header file, and only if it
+ does not duplicate previously written code. This is great for creating a
+ `#include "MyWidgetType.H"` include statement in the header.
+
+ If the code is not recognized as a declaration, it will instead be put after
+ the code that instantiates the widget and all its children. For menu items,
+ the code is added after the container  `Fl_Menu_` is created, but before the
+ menu array is added to the container.
+
+ FLUID will check for matching parentheses, braces, and
+ quotes, but does not do much other error checking. Be careful
+ here, as it may be hard to figure out what widget is producing
+ an error in the compiler. If you need more than four lines you
+ probably should call a function in your own `.cxx`
+ code.
+
+ \image html wComment.png
+ \image latex wComment.png "" width=7cm
+
+ Comments are added to the source code before the widget constructor by adding
+ `// ` in front of every line of the comment. The first few characters of a
+ comment are also visible in the widget browser in the main window.
+
+ \image html wp_cpp_callback.png
+ \image latex wp_cpp_callback.png "" width=7cm
+
+ The callback field can be interpreted in two ways. If the callback text is only
+ a single word, FLUID assumes that this is the name of an external callback
+ function and declares it in the header as
+ `extern void my_button_action(Fl_Button*, void*);`.
+
+ Otherwise, FLUID assumes that the text is the body of a C++ callback function
+ and instead creates a local static callback function. The name of the callback
+ function is generated by FLUID and guaranteed to be unique within the file.
+ ```
+ static void cb_input(Fl_Input *o, void *v) {
+   ... // my text from the Callback field here
+ }
+ ```
+ You can refer to the widget as \p o and the \p user_data()
+ as \p v. FLUID will check for matching parentheses, braces,
+ and quotes, but does not do much other error checking.
+
+ If the callback is blank then no callback is set.
+
+ The *User Data* field can contain any valid C++ code and is copied as the
+ callback argument. If blank the default value of zero is used.
+ *Type* is currently limited to a pointer (a type name ending in `*`) or `long`.
+
+ The *When* pulldown gives access to the `Fl_When` flags, including some
+ commonly used combinations.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section widget_panel_grid The Grid Tab
+
+ \image html wp_grid_tab.png
+ \image latex wp_grid_tab.png "Grid Tab" width=9cm
+
+ This tab is only available if the selected widget is an `Fl_Grid`. When editing
+ a Grid widget, no other widgets should be selected.
+
+ The *Grid Layout* fields adjust the number of rows and columns in the grid.
+
+ The *Margins* fields describe the size of the margins around all children of
+ the grid.
+
+ The *Gaps* fields set the gaps between individual children in the grid.
+
+ The *Row* and *Column* groups can be used to set the size of individual rows
+ and columns within the grid.
+
+ <!-- ---------------------------------------------------------------------- -->
+ \section widget_panel_gridc The Grid Child Tab
+
+ \image html wp_gridc_tab.png
+ \image latex wp_gridc_tab.png "Grid Child Tab" width=9cm
+
+ This tab is only available if the selected widget is a child of an `Fl_Grid`.
+ When editing a child of a Grid widget, no other widgets should be selected.
+
+ Use the *Location* group to move a child around within the grid. Note that
+ every cell in a grid can only manage one single widget. When moving widgets
+ over occupied cells, they become "transient". Just continue and move them into
+ an available cell. If a layout is saved with a transient widget, all grid
+ attributes for that widget are lost, and it will remain unassigned in the
+ project file and in the source code.
+
+ The *Align* fields provide a way to align a widget within its cell.
+
+ The *Min. Size* fields define a minimum width and height for the widget
+ in the cell.
+
+ The *Span* fields change the number of cells that a widget can span in x and y.
+
+ \note Most attributes in this tab will also change the size of the widget. If
+ the child of the Grid is itself a group, the children of that group do not
+ follow changes in position or size. It is recommended to either lay out the
+ grid contents first and leave it unchanged, or to use widgets generated with
+ Widget Class that automatically adjust themselves to the size constraints
+ of the grid.
+
+*/
diff --git fluid/documentation/src/page_widgetbin_panel.dox fluid/documentation/src/page_widgetbin_panel.dox
new file mode 100644
index 0000000..c9da9f9
--- /dev/null
+++ fluid/documentation/src/page_widgetbin_panel.dox
@@ -0,0 +1,34 @@
+/**
+
+ \page page_widgetbin_panel Widget Bin Panel
+
+ \tableofcontents
+
+ # The Widget Bin Panel #
+
+ \image html widgetbin_panel.png "Widget Bin"
+ \image latex widgetbin_panel.png "Widget Bin"  width=9cm
+
+ The Widget Bin can be activated via the main
+ menu: *Edit* > *Show Widget Bin* . FLUID will remember its
+ state and dimensions.
+
+ The Widget Bin is a great way to quickly create a GUI project. Clicking
+ an icon in the bin will create the corresponding code or widget node inside
+ or right after the selected widget. If the parent widget is not supported
+ for this widget type, FLUID tries to find a better position. If that fails,
+ a dialog box will pop up, explaining what type of parent node is required.
+
+ The Window and Widget Class icons can be dragged onto the desktop,
+ creating a new window or widget at the drop position.
+
+ \image html widgetbin_action.png
+ \image latex widgetbin_action.png
+
+ All other widget types can be dragged from the bin into a window, or a group
+ inside a window. When dropped, they will be positioned close to the drop point
+ and inserted into the widget tree as the last child of the chosen group.
+ The order of widgets within their group can be changed with
+ the `F2` and `F3` keys.
+
+*/
diff --git fluid/documentation/src/widgetbin_action.png fluid/documentation/src/widgetbin_action.png
new file mode 100644
index 0000000..26463b6
Binary files /dev/null and fluid/documentation/src/widgetbin_action.png differ
diff --git fluid/factory.cxx fluid/factory.cxx
index 46183bb..a407296 100644
--- fluid/factory.cxx
+++ fluid/factory.cxx
@@ -1208,7 +1208,7 @@ static Fl_Type *known_types[] = {
  add_new_widget_from_user(Fl_Type*, int)
  add_new_widget_from_user(const char*, int)
  */
-Fl_Type *add_new_widget_from_user(Fl_Type *inPrototype, Strategy strategy) {
+Fl_Type *add_new_widget_from_user(Fl_Type *inPrototype, Strategy strategy, bool and_open) {
   undo_checkpoint();
   undo_suspend();
   Fl_Type *t = ((Fl_Type*)inPrototype)->make(strategy);
@@ -1314,7 +1314,8 @@ Fl_Type *add_new_widget_from_user(Fl_Type *inPrototype, Strategy strategy) {
     // make the new widget visible
     select_only(t);
     set_modflag(1);
-    t->open();
+    if (and_open)
+      t->open();
   } else {
     undo_current --;
     undo_last --;
@@ -1332,10 +1333,10 @@ Fl_Type *add_new_widget_from_user(Fl_Type *inPrototype, Strategy strategy) {
  add_new_widget_from_user(Fl_Type*, int)
  add_new_widget_from_user(const char*, int)
  */
-Fl_Type *add_new_widget_from_user(const char *inName, Strategy strategy) {
+Fl_Type *add_new_widget_from_user(const char *inName, Strategy strategy, bool and_open) {
   Fl_Type *prototype = typename_to_prototype(inName);
   if (prototype)
-    return add_new_widget_from_user(prototype, strategy);
+    return add_new_widget_from_user(prototype, strategy, and_open);
   else
     return NULL;
 }
diff --git fluid/factory.h fluid/factory.h
index 7bd09eb..7f3ca6d 100644
--- fluid/factory.h
+++ fluid/factory.h
@@ -27,8 +27,8 @@ void fill_in_New_Menu();
 Fl_Type *typename_to_prototype(const char *inName);
 
 Fl_Type *add_new_widget_from_file(const char *inName, Strategy strategy);
-Fl_Type *add_new_widget_from_user(Fl_Type *inPrototype, Strategy strategy);
-Fl_Type *add_new_widget_from_user(const char *inName, Strategy strategy);
+Fl_Type *add_new_widget_from_user(Fl_Type *inPrototype, Strategy strategy, bool and_open=true);
+Fl_Type *add_new_widget_from_user(const char *inName, Strategy strategy, bool and_open=true);
 
 
 #endif // _FLUID_FACTORY_H
diff --git fluid/file.cxx fluid/file.cxx
index a054a34..e71f4b9 100644
--- fluid/file.cxx
+++ fluid/file.cxx
@@ -27,7 +27,7 @@
 #include "Fl_Widget_Type.h"
 #include "Fl_Grid_Type.h"
 #include "Fl_Window_Type.h"
-#include "alignment_panel.h"
+#include "settings_panel.h"
 #include "widget_browser.h"
 #include "shell_command.h"
 #include "code.h"
@@ -75,9 +75,9 @@ int read_file(const char *filename, int merge, Strategy strategy) {
     is used to implement copy and paste.
  \return 0 if the operation failed, 1 if it succeeded
  */
-int write_file(const char *filename, int selected_only, bool to_sourceview) {
+int write_file(const char *filename, int selected_only, bool to_codeview) {
   Fd_Project_Writer out;
-  return out.write_project(filename, selected_only, to_sourceview);
+  return out.write_project(filename, selected_only, to_codeview);
 }
 
 /**
@@ -780,7 +780,7 @@ void Fd_Project_Reader::read_fdesign() {
 Fd_Project_Writer::Fd_Project_Writer()
 : fout(NULL),
   needspace(0),
-  write_sourceview_(false)
+  write_codeview_(false)
 {
 }
 
@@ -824,11 +824,11 @@ int Fd_Project_Writer::close_write() {
  \param[in] filename create this file, and if it exists, overwrite it
  \param[in] selected_only write only the selected nodes in the widget_tree. This
             is used to implement copy and paste.
- \param[in] sv if set, this file will be used by SourceView
+ \param[in] sv if set, this file will be used by codeview
  \return 0 if the operation failed, 1 if it succeeded
  */
 int Fd_Project_Writer::write_project(const char *filename, int selected_only, bool sv) {
-  write_sourceview_ = sv;
+  write_codeview_ = sv;
   undo_suspend();
   if (!open_write(filename)) {
     undo_resume();
diff --git fluid/file.h fluid/file.h
index b2e3739..71ee543 100644
--- fluid/file.h
+++ fluid/file.h
@@ -26,7 +26,7 @@ class Fl_Type;
 extern int fdesign_flip;
 
 int read_file(const char *, int merge, Strategy strategy=kAddAsLastChild);
-int write_file(const char *, int selected_only = 0, bool to_sourceview = false);
+int write_file(const char *, int selected_only = 0, bool to_codeview = false);
 
 class Fd_Project_Reader
 {
@@ -73,22 +73,22 @@ protected:
   FILE *fout;
   /// If set, one space is written before text unless the format starts with a newline character
   int needspace;
-  /// Set if this file will be used in the SourceView dialog
-  bool write_sourceview_;
+  /// Set if this file will be used in the codeview dialog
+  bool write_codeview_;
 
 public:
   Fd_Project_Writer();
   ~Fd_Project_Writer();
   int open_write(const char *s);
   int close_write();
-  int write_project(const char *filename, int selected_only, bool sourceview);
+  int write_project(const char *filename, int selected_only, bool codeview);
   void write_word(const char *);
   void write_string(const char *,...) __fl_attr((__format__ (__printf__, 2, 3)));
   void write_indent(int n);
   void write_open();
   void write_close(int n);
   FILE *file() const { return fout; }
-  bool write_sourceview() const { return write_sourceview_; }
+  bool write_codeview() const { return write_codeview_; }
 };
 
 #endif // _FLUID_FILE_H
diff --git fluid/fluid.cxx fluid/fluid.cxx
index 7878124..fcc859a 100644
--- fluid/fluid.cxx
+++ fluid/fluid.cxx
@@ -29,11 +29,12 @@
 #include "code.h"
 #include "mergeback.h"
 
-#include "alignment_panel.h"
+#include "settings_panel.h"
 #include "function_panel.h"
-#include "sourceview_panel.h"
+#include "codeview_panel.h"
 #include "template_panel.h"
 #include "about_panel.h"
+#include "autodoc.h"
 
 #include <FL/Fl.H>
 #ifdef __APPLE__
@@ -132,8 +133,8 @@ Fl_Menu_Item *history_item = NULL;
 /// Menuitem to show or hide the widget bin, label will change if bin is visible.
 Fl_Menu_Item *widgetbin_item = NULL;
 
-/// Menuitem to show or hide the source view, label will change if view is visible.
-Fl_Menu_Item *sourceview_item = NULL;
+/// Menuitem to show or hide the code view, label will change if view is visible.
+Fl_Menu_Item *codeview_item = NULL;
 
 /// Menuitem to show or hide the editing overlay, label will change if overlay visibility changes.
 Fl_Menu_Item *overlay_item = NULL;
@@ -184,6 +185,9 @@ Fl_String g_header_filename_arg;
 /// current directory path at application launch
 Fl_String g_launch_path;
 
+/// if set, generate images for automatic documentation in this directory
+Fl_String g_autodoc_path;
+
 /// path to store temporary files during app run
 /// \see tmpdir_create_called
 Fl_String tmpdir_path;
@@ -796,15 +800,15 @@ void exit_cb(Fl_Widget *,void *) {
     save_position(widgetbin_panel,"widgetbin_pos");
     delete widgetbin_panel;
   }
-  if (sourceview_panel) {
-    Fl_Preferences svp(fluid_prefs, "sourceview");
-    svp.set("autorefresh", sv_autorefresh->value());
-    svp.set("autoposition", sv_autoposition->value());
-    svp.set("tab", sv_tab->find(sv_tab->value()));
-    svp.set("code_choice", sv_code_choice);
-    save_position(sourceview_panel,"sourceview_pos");
-    delete sourceview_panel;
-    sourceview_panel = 0;
+  if (codeview_panel) {
+    Fl_Preferences svp(fluid_prefs, "codeview");
+    svp.set("autorefresh", cv_autorefresh->value());
+    svp.set("autoposition", cv_autoposition->value());
+    svp.set("tab", cv_tab->find(cv_tab->value()));
+    svp.set("code_choice", cv_code_choice);
+    save_position(codeview_panel,"codeview_pos");
+    delete codeview_panel;
+    codeview_panel = 0;
   }
   if (shell_run_window) {
     save_position(shell_run_window,"shell_run_Window_pos");
@@ -838,10 +842,10 @@ void exit_cb(Fl_Widget *,void *) {
  to save the old project first.
 
  \param[in] user_must_confirm if set, a confimation dialog is presented to the
-    user before resetting the project.
+    user before resetting the project. Default is `true`.
  \return false if the operation was canceled
  */
-bool new_project(bool user_must_confirm = true) {
+bool new_project(bool user_must_confirm) {
   // verify user intention
   if ((user_must_confirm) &&  (confirm_project_clear() == false))
     return false;
@@ -1696,7 +1700,7 @@ Fl_Menu_Item Main_Menu[] = {
   {"Hide Guides",FL_COMMAND+FL_SHIFT+'g',toggle_guides},
   {"Hide Restricted",FL_COMMAND+FL_SHIFT+'r',toggle_restricted},
   {"Show Widget &Bin...",FL_ALT+'b',toggle_widgetbin_cb},
-  {"Show Source Code...",FL_ALT+FL_SHIFT+'s', (Fl_Callback*)toggle_sourceview_cb, 0, FL_MENU_DIVIDER},
+  {"Show Code View",FL_ALT+'c', (Fl_Callback*)toggle_codeview_cb, 0, FL_MENU_DIVIDER},
   {"Settings...",FL_ALT+'p',show_settings_cb},
   {0},
 {"&New", 0, 0, (void *)New_Menu, FL_SUBMENU_POINTER},
@@ -1813,7 +1817,11 @@ void init_scheme() {
     scheme_name = const_cast<char *>(scheme_choice->text(scheme_index));
     fluid_prefs.set("scheme_name", scheme_name);
   }
-  Fl::scheme(scheme_name);
+  // Set the new scheme only if it was not overridden by the -scheme
+  // command line option
+  if (Fl::scheme() == NULL) {
+    Fl::scheme(scheme_name);
+  }
   free(scheme_name);
 }
 
@@ -1839,15 +1847,15 @@ void toggle_widgetbin_cb(Fl_Widget *, void *) {
 /**
  Show or hide the code preview window.
  */
-void toggle_sourceview_cb(Fl_Double_Window *, void *) {
-  sourceview_toggle_visibility();
+void toggle_codeview_cb(Fl_Double_Window *, void *) {
+  codeview_toggle_visibility();
 }
 
 /**
  Show or hide the code preview window, button callback.
  */
-void toggle_sourceview_b_cb(Fl_Button*, void *) {
-  sourceview_toggle_visibility();
+void toggle_codeview_b_cb(Fl_Button*, void *) {
+  codeview_toggle_visibility();
 }
 
 /**
@@ -1877,7 +1885,7 @@ void make_main_window() {
     save_item = (Fl_Menu_Item*)main_menubar->find_item(save_cb);
     history_item = (Fl_Menu_Item*)main_menubar->find_item(menu_file_open_history_cb);
     widgetbin_item = (Fl_Menu_Item*)main_menubar->find_item(toggle_widgetbin_cb);
-    sourceview_item = (Fl_Menu_Item*)main_menubar->find_item((Fl_Callback*)toggle_sourceview_cb);
+    codeview_item = (Fl_Menu_Item*)main_menubar->find_item((Fl_Callback*)toggle_codeview_cb);
     overlay_item = (Fl_Menu_Item*)main_menubar->find_item((Fl_Callback*)toggle_overlays);
     guides_item = (Fl_Menu_Item*)main_menubar->find_item((Fl_Callback*)toggle_guides);
     restricted_item = (Fl_Menu_Item*)main_menubar->find_item((Fl_Callback*)toggle_restricted);
@@ -2049,9 +2057,9 @@ void set_modflag(int mf, int mfc) {
     if (!old_title || strcmp(old_title, new_title))
       main_window->copy_label(new_title);
   }
-  // if the UI was modified in any way, update the Source View panel
-  if (sourceview_panel && sourceview_panel->visible() && sv_autorefresh->value())
-    sourceview_defer_update();
+  // if the UI was modified in any way, update the Code View panel
+  if (codeview_panel && codeview_panel->visible() && cv_autorefresh->value())
+    codeview_defer_update();
 }
 
 // ---- Main program entry point
@@ -2091,6 +2099,12 @@ static int arg(int argc, char** argv, int& i) {
     batch_mode++;
     i += 2; return 2;
   }
+#ifndef NDEBUG
+  if ((i+1 < argc) && (strcmp(argv[i], "--autodoc") == 0)) {
+    g_autodoc_path = argv[i+1];
+    i += 2; return 2;
+  }
+#endif
   if (argv[i][1] == 'h' && !argv[i][2]) {
     if ( (i+1 < argc) && (argv[i+1][0] != '-') ) {
       g_header_filename_arg = argv[i+1];
@@ -2179,7 +2193,9 @@ int main(int argc,char **argv) {
     return 1;
   }
 
-  const char *c = argv[i];
+  const char *c = NULL;
+  if (g_autodoc_path.empty())
+    c = argv[i];
 
   fl_register_images();
 
@@ -2202,8 +2218,8 @@ int main(int argc,char **argv) {
     g_layout_list.read(fluid_prefs, FD_STORE_USER);
     main_window->show(argc,argv);
     toggle_widgetbin_cb(0,0);
-    toggle_sourceview_cb(0,0);
-    if (!c && openlast_button->value() && absolute_history[0][0]) {
+    toggle_codeview_cb(0,0);
+    if (!c && openlast_button->value() && absolute_history[0][0] && g_autodoc_path.empty()) {
       // Open previous file when no file specified...
       open_project_file(absolute_history[0]);
     }
@@ -2257,6 +2273,14 @@ int main(int argc,char **argv) {
   // Set (but do not start) timer callback for external editor updates
   ExternalCodeEditor::set_update_timer_callback(external_editor_timer);
 
+#ifndef NDEBUG
+  // check if the user wants FLUID to generate image for the user documentation
+  if (!g_autodoc_path.empty()) {
+    run_autodoc(g_autodoc_path);
+    return 0;
+  }
+#endif
+
 #ifdef _WIN32
   Fl::run();
 #else
diff --git fluid/fluid.h fluid/fluid.h
index b71baae..95f4dc4 100644
--- fluid/fluid.h
+++ fluid/fluid.h
@@ -78,7 +78,7 @@ extern void update_history(const char *);
 extern Fl_Menu_Item *save_item;
 extern Fl_Menu_Item *history_item;
 extern Fl_Menu_Item *widgetbin_item;
-extern Fl_Menu_Item *sourceview_item;
+extern Fl_Menu_Item *codeview_item;
 extern Fl_Menu_Item *overlay_item;
 extern Fl_Button *overlay_button;
 extern Fl_Menu_Item *guides_item;
@@ -98,6 +98,8 @@ extern Fl_String g_code_filename_arg;
 extern Fl_String g_header_filename_arg;
 extern Fl_String g_launch_path;
 
+extern Fl_String g_autodoc_path;
+
 // ---- project class declaration
 
 /**
@@ -176,6 +178,7 @@ extern Fluid_Project g_project;
 
 // ---- public functions
 
+extern bool new_project(bool user_must_confirm = true);
 extern void enter_project_dir();
 extern void leave_project_dir();
 extern void set_filename(const char *c);
diff --git fluid/makedepend fluid/makedepend
index f3a4d99..cdef22f 100644
--- fluid/makedepend
+++ fluid/makedepend
@@ -26,89 +26,89 @@ about_panel.o: ../FL/Fl_Window.H
 about_panel.o: ../FL/platform_types.h
 about_panel.o: ../src/flstring.h
 about_panel.o: about_panel.h
-alignment_panel.o: ../config.h
-alignment_panel.o: ../FL/Enumerations.H
-alignment_panel.o: ../FL/filename.H
-alignment_panel.o: ../FL/Fl.H
-alignment_panel.o: ../FL/fl_ask.H
-alignment_panel.o: ../FL/fl_attr.h
-alignment_panel.o: ../FL/Fl_Bitmap.H
-alignment_panel.o: ../FL/Fl_Box.H
-alignment_panel.o: ../FL/Fl_Browser.H
-alignment_panel.o: ../FL/Fl_Browser_.H
-alignment_panel.o: ../FL/Fl_Button.H
-alignment_panel.o: ../FL/Fl_Cairo.H
-alignment_panel.o: ../FL/fl_casts.H
-alignment_panel.o: ../FL/Fl_Check_Button.H
-alignment_panel.o: ../FL/Fl_Choice.H
-alignment_panel.o: ../FL/fl_config.h
-alignment_panel.o: ../FL/Fl_Device.H
-alignment_panel.o: ../FL/Fl_Double_Window.H
-alignment_panel.o: ../FL/fl_draw.H
-alignment_panel.o: ../FL/Fl_Export.H
-alignment_panel.o: ../FL/Fl_File_Browser.H
-alignment_panel.o: ../FL/Fl_File_Chooser.H
-alignment_panel.o: ../FL/Fl_File_Icon.H
-alignment_panel.o: ../FL/Fl_File_Input.H
-alignment_panel.o: ../FL/Fl_Flex.H
-alignment_panel.o: ../FL/Fl_Graphics_Driver.H
-alignment_panel.o: ../FL/Fl_Group.H
-alignment_panel.o: ../FL/Fl_Image.H
-alignment_panel.o: ../FL/Fl_Input.H
-alignment_panel.o: ../FL/Fl_Input_.H
-alignment_panel.o: ../FL/Fl_Int_Input.H
-alignment_panel.o: ../FL/Fl_Light_Button.H
-alignment_panel.o: ../FL/Fl_Menu_.H
-alignment_panel.o: ../FL/Fl_Menu_Button.H
-alignment_panel.o: ../FL/Fl_Menu_Item.H
-alignment_panel.o: ../FL/Fl_Multi_Label.H
-alignment_panel.o: ../FL/Fl_Native_File_Chooser.H
-alignment_panel.o: ../FL/Fl_Pack.H
-alignment_panel.o: ../FL/Fl_Pixmap.H
-alignment_panel.o: ../FL/Fl_Plugin.H
-alignment_panel.o: ../FL/Fl_PNG_Image.H
-alignment_panel.o: ../FL/Fl_Preferences.H
-alignment_panel.o: ../FL/Fl_Rect.H
-alignment_panel.o: ../FL/Fl_Repeat_Button.H
-alignment_panel.o: ../FL/Fl_Return_Button.H
-alignment_panel.o: ../FL/Fl_RGB_Image.H
-alignment_panel.o: ../FL/Fl_Scheme.H
-alignment_panel.o: ../FL/Fl_Scheme_Choice.H
-alignment_panel.o: ../FL/Fl_Scrollbar.H
-alignment_panel.o: ../FL/Fl_Shortcut_Button.H
-alignment_panel.o: ../FL/fl_show_colormap.H
-alignment_panel.o: ../FL/Fl_Slider.H
-alignment_panel.o: ../FL/Fl_Spinner.H
-alignment_panel.o: ../FL/fl_string_functions.h
-alignment_panel.o: ../FL/Fl_Tabs.H
-alignment_panel.o: ../FL/Fl_Terminal.H
-alignment_panel.o: ../FL/Fl_Text_Buffer.H
-alignment_panel.o: ../FL/Fl_Text_Display.H
-alignment_panel.o: ../FL/Fl_Text_Editor.H
-alignment_panel.o: ../FL/Fl_Tile.H
-alignment_panel.o: ../FL/Fl_Tooltip.H
-alignment_panel.o: ../FL/fl_types.h
-alignment_panel.o: ../FL/fl_utf8.h
-alignment_panel.o: ../FL/Fl_Valuator.H
-alignment_panel.o: ../FL/Fl_Value_Input.H
-alignment_panel.o: ../FL/Fl_Widget.H
-alignment_panel.o: ../FL/Fl_Window.H
-alignment_panel.o: ../FL/Fl_Wizard.H
-alignment_panel.o: ../FL/platform_types.h
-alignment_panel.o: ../src/flstring.h
-alignment_panel.o: ../src/Fl_String.H
-alignment_panel.o: alignment_panel.h
-alignment_panel.o: code.h
-alignment_panel.o: Fd_Snap_Action.h
-alignment_panel.o: fluid.h
-alignment_panel.o: fluid_filename.h
-alignment_panel.o: Fl_Group_Type.h
-alignment_panel.o: Fl_Type.h
-alignment_panel.o: Fl_Widget_Type.h
-alignment_panel.o: Fl_Window_Type.h
-alignment_panel.o: shell_command.h
-alignment_panel.o: undo.h
-alignment_panel.o: widget_browser.h
+settings_panel.o: ../config.h
+settings_panel.o: ../FL/Enumerations.H
+settings_panel.o: ../FL/filename.H
+settings_panel.o: ../FL/Fl.H
+settings_panel.o: ../FL/fl_ask.H
+settings_panel.o: ../FL/fl_attr.h
+settings_panel.o: ../FL/Fl_Bitmap.H
+settings_panel.o: ../FL/Fl_Box.H
+settings_panel.o: ../FL/Fl_Browser.H
+settings_panel.o: ../FL/Fl_Browser_.H
+settings_panel.o: ../FL/Fl_Button.H
+settings_panel.o: ../FL/Fl_Cairo.H
+settings_panel.o: ../FL/fl_casts.H
+settings_panel.o: ../FL/Fl_Check_Button.H
+settings_panel.o: ../FL/Fl_Choice.H
+settings_panel.o: ../FL/fl_config.h
+settings_panel.o: ../FL/Fl_Device.H
+settings_panel.o: ../FL/Fl_Double_Window.H
+settings_panel.o: ../FL/fl_draw.H
+settings_panel.o: ../FL/Fl_Export.H
+settings_panel.o: ../FL/Fl_File_Browser.H
+settings_panel.o: ../FL/Fl_File_Chooser.H
+settings_panel.o: ../FL/Fl_File_Icon.H
+settings_panel.o: ../FL/Fl_File_Input.H
+settings_panel.o: ../FL/Fl_Flex.H
+settings_panel.o: ../FL/Fl_Graphics_Driver.H
+settings_panel.o: ../FL/Fl_Group.H
+settings_panel.o: ../FL/Fl_Image.H
+settings_panel.o: ../FL/Fl_Input.H
+settings_panel.o: ../FL/Fl_Input_.H
+settings_panel.o: ../FL/Fl_Int_Input.H
+settings_panel.o: ../FL/Fl_Light_Button.H
+settings_panel.o: ../FL/Fl_Menu_.H
+settings_panel.o: ../FL/Fl_Menu_Button.H
+settings_panel.o: ../FL/Fl_Menu_Item.H
+settings_panel.o: ../FL/Fl_Multi_Label.H
+settings_panel.o: ../FL/Fl_Native_File_Chooser.H
+settings_panel.o: ../FL/Fl_Pack.H
+settings_panel.o: ../FL/Fl_Pixmap.H
+settings_panel.o: ../FL/Fl_Plugin.H
+settings_panel.o: ../FL/Fl_PNG_Image.H
+settings_panel.o: ../FL/Fl_Preferences.H
+settings_panel.o: ../FL/Fl_Rect.H
+settings_panel.o: ../FL/Fl_Repeat_Button.H
+settings_panel.o: ../FL/Fl_Return_Button.H
+settings_panel.o: ../FL/Fl_RGB_Image.H
+settings_panel.o: ../FL/Fl_Scheme.H
+settings_panel.o: ../FL/Fl_Scheme_Choice.H
+settings_panel.o: ../FL/Fl_Scrollbar.H
+settings_panel.o: ../FL/Fl_Shortcut_Button.H
+settings_panel.o: ../FL/fl_show_colormap.H
+settings_panel.o: ../FL/Fl_Slider.H
+settings_panel.o: ../FL/Fl_Spinner.H
+settings_panel.o: ../FL/fl_string_functions.h
+settings_panel.o: ../FL/Fl_Tabs.H
+settings_panel.o: ../FL/Fl_Terminal.H
+settings_panel.o: ../FL/Fl_Text_Buffer.H
+settings_panel.o: ../FL/Fl_Text_Display.H
+settings_panel.o: ../FL/Fl_Text_Editor.H
+settings_panel.o: ../FL/Fl_Tile.H
+settings_panel.o: ../FL/Fl_Tooltip.H
+settings_panel.o: ../FL/fl_types.h
+settings_panel.o: ../FL/fl_utf8.h
+settings_panel.o: ../FL/Fl_Valuator.H
+settings_panel.o: ../FL/Fl_Value_Input.H
+settings_panel.o: ../FL/Fl_Widget.H
+settings_panel.o: ../FL/Fl_Window.H
+settings_panel.o: ../FL/Fl_Wizard.H
+settings_panel.o: ../FL/platform_types.h
+settings_panel.o: ../src/flstring.h
+settings_panel.o: ../src/Fl_String.H
+settings_panel.o: settings_panel.h
+settings_panel.o: code.h
+settings_panel.o: Fd_Snap_Action.h
+settings_panel.o: fluid.h
+settings_panel.o: fluid_filename.h
+settings_panel.o: Fl_Group_Type.h
+settings_panel.o: Fl_Type.h
+settings_panel.o: Fl_Widget_Type.h
+settings_panel.o: Fl_Window_Type.h
+settings_panel.o: shell_command.h
+settings_panel.o: undo.h
+settings_panel.o: widget_browser.h
 align_widget.o: ../FL/Enumerations.H
 align_widget.o: ../FL/filename.H
 align_widget.o: ../FL/Fl.H
@@ -476,7 +476,7 @@ Fd_Snap_Action.o: ../FL/Fl_Window.H
 Fd_Snap_Action.o: ../FL/Fl_Wizard.H
 Fd_Snap_Action.o: ../FL/platform_types.h
 Fd_Snap_Action.o: ../src/Fl_String.H
-Fd_Snap_Action.o: alignment_panel.h
+Fd_Snap_Action.o: settings_panel.h
 Fd_Snap_Action.o: code.h
 Fd_Snap_Action.o: Fd_Snap_Action.h
 Fd_Snap_Action.o: file.h
@@ -561,7 +561,7 @@ file.o: ../FL/Fl_Wizard.H
 file.o: ../FL/platform_types.h
 file.o: ../src/flstring.h
 file.o: ../src/Fl_String.H
-file.o: alignment_panel.h
+file.o: settings_panel.h
 file.o: code.h
 file.o: ExternalCodeEditor_UNIX.h
 file.o: factory.h
@@ -658,7 +658,7 @@ fluid.o: ../FL/platform_types.h
 fluid.o: ../src/flstring.h
 fluid.o: ../src/Fl_String.H
 fluid.o: about_panel.h
-fluid.o: alignment_panel.h
+fluid.o: settings_panel.h
 fluid.o: code.h
 fluid.o: CodeEditor.h
 fluid.o: ExternalCodeEditor_UNIX.h
@@ -677,7 +677,7 @@ fluid.o: function_panel.h
 fluid.o: mergeback.h
 fluid.o: pixmaps.h
 fluid.o: shell_command.h
-fluid.o: sourceview_panel.h
+fluid.o: codeview_panel.h
 fluid.o: StyleParse.h
 fluid.o: template_panel.h
 fluid.o: undo.h
@@ -1195,7 +1195,7 @@ Fl_Widget_Type.o: ../FL/Fl_Wizard.H
 Fl_Widget_Type.o: ../FL/platform_types.h
 Fl_Widget_Type.o: ../src/flstring.h
 Fl_Widget_Type.o: ../src/Fl_String.H
-Fl_Widget_Type.o: alignment_panel.h
+Fl_Widget_Type.o: settings_panel.h
 Fl_Widget_Type.o: code.h
 Fl_Widget_Type.o: CodeEditor.h
 Fl_Widget_Type.o: custom_widgets.h
@@ -1296,7 +1296,7 @@ Fl_Window_Type.o: ../FL/platform_types.h
 Fl_Window_Type.o: ../FL/x11.H
 Fl_Window_Type.o: ../src/flstring.h
 Fl_Window_Type.o: ../src/Fl_String.H
-Fl_Window_Type.o: alignment_panel.h
+Fl_Window_Type.o: settings_panel.h
 Fl_Window_Type.o: code.h
 Fl_Window_Type.o: CodeEditor.h
 Fl_Window_Type.o: custom_widgets.h
@@ -1525,7 +1525,7 @@ shell_command.o: ../FL/Fl_Window.H
 shell_command.o: ../FL/Fl_Wizard.H
 shell_command.o: ../FL/platform_types.h
 shell_command.o: ../src/Fl_String.H
-shell_command.o: alignment_panel.h
+shell_command.o: settings_panel.h
 shell_command.o: code.h
 shell_command.o: Fd_Snap_Action.h
 shell_command.o: file.h
@@ -1537,59 +1537,58 @@ shell_command.o: Fl_Widget_Type.h
 shell_command.o: Fl_Window_Type.h
 shell_command.o: shell_command.h
 shell_command.o: widget_browser.h
-sourceview_panel.o: ../config.h
-sourceview_panel.o: ../FL/Enumerations.H
-sourceview_panel.o: ../FL/filename.H
-sourceview_panel.o: ../FL/Fl.H
-sourceview_panel.o: ../FL/fl_attr.h
-sourceview_panel.o: ../FL/Fl_Bitmap.H
-sourceview_panel.o: ../FL/Fl_Box.H
-sourceview_panel.o: ../FL/Fl_Button.H
-sourceview_panel.o: ../FL/Fl_Cairo.H
-sourceview_panel.o: ../FL/fl_casts.H
-sourceview_panel.o: ../FL/Fl_Choice.H
-sourceview_panel.o: ../FL/fl_config.h
-sourceview_panel.o: ../FL/Fl_Device.H
-sourceview_panel.o: ../FL/Fl_Double_Window.H
-sourceview_panel.o: ../FL/fl_draw.H
-sourceview_panel.o: ../FL/Fl_Export.H
-sourceview_panel.o: ../FL/Fl_Graphics_Driver.H
-sourceview_panel.o: ../FL/Fl_Group.H
-sourceview_panel.o: ../FL/Fl_Image.H
-sourceview_panel.o: ../FL/Fl_Input.H
-sourceview_panel.o: ../FL/Fl_Input_.H
-sourceview_panel.o: ../FL/Fl_Light_Button.H
-sourceview_panel.o: ../FL/Fl_Menu_.H
-sourceview_panel.o: ../FL/Fl_Menu_Item.H
-sourceview_panel.o: ../FL/Fl_Multi_Label.H
-sourceview_panel.o: ../FL/Fl_Pixmap.H
-sourceview_panel.o: ../FL/Fl_Plugin.H
-sourceview_panel.o: ../FL/Fl_Preferences.H
-sourceview_panel.o: ../FL/Fl_Rect.H
-sourceview_panel.o: ../FL/Fl_RGB_Image.H
-sourceview_panel.o: ../FL/Fl_Scrollbar.H
-sourceview_panel.o: ../FL/Fl_Slider.H
-sourceview_panel.o: ../FL/fl_string_functions.h
-sourceview_panel.o: ../FL/Fl_Tabs.H
-sourceview_panel.o: ../FL/Fl_Text_Buffer.H
-sourceview_panel.o: ../FL/Fl_Text_Display.H
-sourceview_panel.o: ../FL/Fl_Text_Editor.H
-sourceview_panel.o: ../FL/fl_types.h
-sourceview_panel.o: ../FL/fl_utf8.h
-sourceview_panel.o: ../FL/Fl_Valuator.H
-sourceview_panel.o: ../FL/Fl_Widget.H
-sourceview_panel.o: ../FL/Fl_Window.H
-sourceview_panel.o: ../FL/platform_types.h
-sourceview_panel.o: ../src/flstring.h
-sourceview_panel.o: ../src/Fl_String.H
-sourceview_panel.o: code.h
-sourceview_panel.o: CodeEditor.h
-sourceview_panel.o: file.h
-sourceview_panel.o: fluid.h
-sourceview_panel.o: fluid_filename.h
-sourceview_panel.o: Fl_Type.h
-sourceview_panel.o: sourceview_panel.h
-sourceview_panel.o: StyleParse.h
+codeview_panel.o: ../config.h
+codeview_panel.o: ../FL/Enumerations.H
+codeview_panel.o: ../FL/filename.H
+codeview_panel.o: ../FL/Fl.H
+codeview_panel.o: ../FL/fl_attr.h
+codeview_panel.o: ../FL/Fl_Bitmap.H
+codeview_panel.o: ../FL/Fl_Box.H
+codeview_panel.o: ../FL/Fl_Button.H
+codeview_panel.o: ../FL/Fl_Cairo.H
+codeview_panel.o: ../FL/fl_casts.H
+codeview_panel.o: ../FL/Fl_Choice.H
+codeview_panel.o: ../FL/fl_config.h
+codeview_panel.o: ../FL/Fl_Device.H
+codeview_panel.o: ../FL/Fl_Double_Window.H
+codeview_panel.o: ../FL/fl_draw.H
+codeview_panel.o: ../FL/Fl_Export.H
+codeview_panel.o: ../FL/Fl_Graphics_Driver.H
+codeview_panel.o: ../FL/Fl_Group.H
+codeview_panel.o: ../FL/Fl_Image.H
+codeview_panel.o: ../FL/Fl_Input.H
+codeview_panel.o: ../FL/Fl_Input_.H
+codeview_panel.o: ../FL/Fl_Light_Button.H
+codeview_panel.o: ../FL/Fl_Menu_.H
+codeview_panel.o: ../FL/Fl_Menu_Item.H
+codeview_panel.o: ../FL/Fl_Multi_Label.H
+codeview_panel.o: ../FL/Fl_Pixmap.H
+codeview_panel.o: ../FL/Fl_Plugin.H
+codeview_panel.o: ../FL/Fl_Preferences.H
+codeview_panel.o: ../FL/Fl_Rect.H
+codeview_panel.o: ../FL/Fl_RGB_Image.H
+codeview_panel.o: ../FL/Fl_Scrollbar.H
+codeview_panel.o: ../FL/Fl_Slider.H
+codeview_panel.o: ../FL/Fl_Tabs.H
+codeview_panel.o: ../FL/Fl_Text_Buffer.H
+codeview_panel.o: ../FL/Fl_Text_Display.H
+codeview_panel.o: ../FL/Fl_Text_Editor.H
+codeview_panel.o: ../FL/fl_types.h
+codeview_panel.o: ../FL/fl_utf8.h
+codeview_panel.o: ../FL/Fl_Valuator.H
+codeview_panel.o: ../FL/Fl_Widget.H
+codeview_panel.o: ../FL/Fl_Window.H
+codeview_panel.o: ../FL/platform_types.h
+codeview_panel.o: ../src/flstring.h
+codeview_panel.o: ../src/Fl_String.H
+codeview_panel.o: code.h
+codeview_panel.o: CodeEditor.h
+codeview_panel.o: file.h
+codeview_panel.o: fluid.h
+codeview_panel.o: fluid_filename.h
+codeview_panel.o: Fl_Type.h
+codeview_panel.o: codeview_panel.h
+codeview_panel.o: StyleParse.h
 StyleParse.o: StyleParse.h
 template_panel.o: ../config.h
 template_panel.o: ../FL/Enumerations.H
diff --git fluid/settings_panel.cxx fluid/settings_panel.cxx
new file mode 100644
index 0000000..8a403bb
--- /dev/null
+++ fluid/settings_panel.cxx
@@ -0,0 +1,3547 @@
+//
+// Setting and shell dialogs for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2023 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
+//
+// Please see the following page on how to report bugs and issues:
+//
+//     https://www.fltk.org/bugs.php
+//
+
+// generated by Fast Light User Interface Designer (fluid) version 1.0400
+
+#include "settings_panel.h"
+#include "undo.h"
+#include <FL/Fl_Preferences.H>
+#include <FL/Fl_Tooltip.H>
+#include <FL/fl_ask.H>
+#include <string.h>
+#include "../src/flstring.h"
+void scheme_cb(Fl_Scheme_Choice *, void *);
+int w_settings_shell_list_selected;
+
+static void cb_Comments(Fl_Choice* o, void* v) {
+  Fl_Font *font = (Fl_Font*)o->user_data();
+  if (v == LOAD) {
+    o->value(*font);
+  } else {
+    *font = (int)o->value();
+    widget_browser->redraw();
+    widget_browser->save_prefs();
+  }
+}
+
+static void cb_Color_Chip(Fl_Button* o, void* v) {
+  Fl_Color *color = (Fl_Color*)o->user_data();
+  if (v == LOAD) {
+    o->color(*color);
+    o->redraw();
+  } else {
+    Fl_Color d = fl_show_colormap(*color);
+    *color = d;
+    o->color(d);
+    widget_browser->redraw();
+    widget_browser->save_prefs();
+  }
+}
+
+static void cb_Color_Choice(Fl_Menu_Button* o, void* v) {
+  if (v != LOAD) {
+    Fl_Color *color = (Fl_Color*)o->user_data();
+    Fl_Color d = (Fl_Color)(o->mvalue()->argument());
+    *color = d;
+    o->parent()->do_callback(o->parent(), LOAD);
+    widget_browser->redraw();
+    widget_browser->save_prefs();
+  }
+}
+
+Fl_Double_Window *script_panel=(Fl_Double_Window *)0;
+
+static void cb_script_panel(Fl_Double_Window*, void*) {
+  if (Fl::event()==FL_SHORTCUT && Fl::event_key()==FL_Escape)
+    return; // ignore Escape
+  script_panel->hide(); // otherwise hide..;
+}
+
+Fl_Text_Editor *script_input=(Fl_Text_Editor *)0;
+
+Fl_Return_Button *script_panel_ok=(Fl_Return_Button *)0;
+
+Fl_Button *script_panel_cancel=(Fl_Button *)0;
+
+Fl_Double_Window* make_script_panel() {
+  { Fl_Double_Window* o = script_panel = new Fl_Double_Window(540, 180, "Shell Script Editor");
+    script_panel->labelsize(11);
+    script_panel->callback((Fl_Callback*)cb_script_panel);
+    { script_input = new Fl_Text_Editor(10, 10, 520, 130);
+      script_input->box(FL_DOWN_BOX);
+      script_input->labelsize(11);
+      script_input->textfont(4);
+      script_input->textsize(11);
+      script_input->when(FL_WHEN_RELEASE | FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY);
+      Fl_Group::current()->resizable(script_input);
+      script_input->buffer(new Fl_Text_Buffer);
+    } // Fl_Text_Editor* script_input
+    { Fl_Group* o = new Fl_Group(10, 150, 520, 20);
+      o->labelsize(11);
+      o->callback((Fl_Callback*)propagate_load);
+      { script_panel_ok = new Fl_Return_Button(400, 150, 60, 20, "OK");
+        script_panel_ok->labelsize(11);
+        script_panel_ok->window()->hotspot(script_panel_ok);
+      } // Fl_Return_Button* script_panel_ok
+      { script_panel_cancel = new Fl_Button(470, 150, 60, 20, "Cancel");
+        script_panel_cancel->labelsize(11);
+      } // Fl_Button* script_panel_cancel
+      { Fl_Box* o = new Fl_Box(10, 150, 380, 20);
+        o->labelsize(11);
+        Fl_Group::current()->resizable(o);
+      } // Fl_Box* o
+      o->end();
+    } // Fl_Group* o
+    script_panel->set_modal();
+    o->size_range(200, 150);
+    script_panel->end();
+  } // Fl_Double_Window* script_panel
+  // Enable line numbers
+  script_input->linenumber_width(60);
+  script_input->linenumber_size(script_input->Fl_Text_Display::textsize());
+  return script_panel;
+}
+
+Fl_Double_Window *settings_window=(Fl_Double_Window *)0;
+
+Fl_Tabs *w_settings_tabs=(Fl_Tabs *)0;
+
+static void cb_w_settings_tabs(Fl_Tabs* o, void* v) {
+  propagate_load(o, v);
+}
+
+Fl_Group *w_settings_general_tab=(Fl_Group *)0;
+
+#include <FL/Fl_PNG_Image.H>
+
+static const unsigned char idata_general_64[] =
+{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,96,0,0,0,64,8,4,0,0,0,
+79,61,186,133,0,0,8,57,73,68,65,84,104,222,205,154,107,112,85,213,21,199,127,
+151,60,185,36,18,66,204,131,120,155,82,136,163,131,4,41,180,130,36,2,117,8,15,
+173,58,109,103,168,97,42,67,135,78,167,84,16,59,118,192,41,29,201,244,3,14,182,
+14,62,74,77,149,42,12,226,180,160,130,19,32,136,144,34,193,240,104,136,52,193,
+18,196,16,200,131,128,121,191,47,185,247,158,126,72,206,221,251,60,238,189,39,
+112,46,115,247,249,178,207,217,123,159,179,214,218,107,173,255,90,107,31,176,
+187,37,81,72,13,237,184,25,196,135,130,130,143,65,220,180,83,67,33,73,68,120,
+203,162,114,152,108,179,203,199,89,178,34,155,129,210,128,196,171,87,73,36,147,
+63,11,119,72,6,220,60,108,231,39,71,217,204,64,108,200,57,177,204,180,243,147,
+209,182,50,112,175,191,167,188,231,72,197,65,52,224,65,225,58,43,20,28,195,99,
+223,139,92,6,114,212,206,115,142,185,196,73,3,110,86,59,222,80,111,210,34,87,
+133,198,169,157,4,162,52,3,81,36,138,155,187,35,149,129,120,225,229,83,116,12,
+140,98,172,184,153,100,231,190,223,202,171,82,153,137,135,47,185,161,123,158,41,
+196,156,233,87,120,149,1,9,193,146,201,160,94,183,54,141,217,140,226,20,141,225,
+118,148,73,108,167,29,47,30,218,216,71,174,127,7,147,216,196,13,225,44,15,40,77,
+186,107,135,236,74,27,217,64,130,95,132,115,41,166,29,47,94,58,217,65,114,56,
+201,143,231,51,157,79,175,100,5,78,150,114,69,198,95,151,114,204,192,64,137,30,
+147,107,200,39,129,149,124,201,77,205,200,49,156,225,99,96,155,73,152,224,165,
+89,71,130,50,77,57,99,96,224,164,114,191,126,229,0,205,120,77,194,141,183,71,
+66,82,212,8,230,174,96,131,201,124,135,222,229,36,243,56,15,51,90,55,109,144,
+38,174,208,175,181,191,4,157,169,12,189,47,135,58,254,107,149,40,135,101,242,
+93,156,9,237,193,103,243,20,51,112,201,78,83,69,54,186,168,231,52,123,249,79,
+232,111,53,49,203,96,230,183,189,3,219,69,8,176,148,181,164,114,141,30,205,132,
+251,89,199,175,153,77,154,6,194,132,164,226,73,101,42,115,152,200,101,58,52,99,
+233,20,176,26,39,85,234,131,68,82,248,216,222,29,152,79,137,26,231,76,103,51,83,
+232,161,150,227,236,163,122,120,66,1,203,185,143,24,11,175,114,83,205,54,246,
+162,190,237,113,114,153,72,2,213,172,163,82,76,202,231,115,59,25,40,103,150,218,
+45,98,201,240,198,221,164,145,51,236,231,48,235,249,57,169,35,48,167,38,118,
+178,133,37,60,198,116,38,12,75,198,203,62,158,21,83,62,99,129,125,12,44,96,191,
+42,220,103,88,39,34,6,192,199,13,174,49,137,187,70,232,208,218,185,194,4,82,52,
+161,64,43,47,243,190,176,250,133,148,218,101,3,69,100,15,117,156,252,129,201,6,
+39,148,97,170,245,193,219,104,210,25,163,147,159,19,39,187,5,101,99,196,205,
+237,197,66,89,252,80,237,254,130,41,97,5,250,105,252,74,222,119,11,233,167,149,
+88,104,145,240,138,249,254,8,32,120,243,209,78,61,77,12,224,32,142,76,92,36,89,
+146,85,34,243,4,142,221,197,34,138,236,96,32,93,221,105,39,221,220,12,153,116,
+41,92,163,140,35,156,160,205,15,109,121,60,202,28,241,162,32,30,106,64,214,206,
+84,123,108,96,10,75,134,190,60,72,5,9,184,12,40,43,55,15,167,120,149,55,184,40,
+161,110,63,53,28,164,137,52,210,131,238,67,43,31,179,70,150,196,238,208,168,103,
+133,129,22,86,16,63,212,237,226,48,94,238,97,92,0,89,122,56,194,70,78,153,142,
+93,228,44,46,178,2,176,160,112,137,191,179,89,235,168,126,79,167,29,12,116,16,
+71,158,248,110,5,117,164,144,97,170,125,229,108,224,155,128,47,106,227,60,57,
+100,154,170,78,25,175,242,145,252,200,203,75,28,180,203,141,30,167,139,92,161,
+252,117,156,32,1,151,33,238,109,226,117,173,244,251,248,150,30,162,5,64,183,209,
+203,15,12,142,160,133,15,249,147,31,211,1,232,225,69,94,67,177,211,195,61,194,
+37,109,224,251,182,46,96,110,80,182,200,227,189,252,153,73,196,19,79,54,175,
+211,47,70,182,42,13,186,149,127,211,135,212,53,214,107,71,214,115,226,207,153,
+195,30,124,226,193,120,3,182,150,202,178,95,198,11,124,195,0,3,124,205,26,126,
+41,220,203,33,218,13,121,146,198,3,239,33,143,47,194,145,212,95,103,169,216,
+214,100,57,77,7,160,158,195,50,118,239,213,12,126,192,187,66,31,175,27,146,105,
+167,176,229,215,88,106,200,182,109,171,74,248,168,81,187,19,12,154,220,68,159,
+144,255,91,134,181,91,212,225,54,90,117,67,99,229,90,87,141,188,203,246,151,85,
+226,84,255,25,101,88,234,22,221,78,174,26,86,54,8,151,216,106,32,34,74,128,215,
+8,195,42,123,11,91,193,223,235,184,83,31,10,142,245,138,234,166,125,134,205,
+145,138,47,247,24,86,126,71,24,77,138,65,51,189,194,6,220,225,101,224,1,85,142,
+181,116,7,54,197,209,172,54,172,124,94,141,64,146,13,254,171,131,90,177,75,83,
+71,70,211,72,38,167,113,128,85,194,78,187,12,89,127,190,184,89,201,211,154,193,
+229,44,23,128,146,22,216,252,225,55,124,66,70,56,24,152,207,41,22,203,243,91,13,
+69,187,31,201,174,253,31,188,233,7,178,34,138,132,134,45,212,100,116,67,193,
+158,134,162,199,40,231,81,187,109,229,69,250,100,172,76,87,54,43,213,134,226,85,
+133,242,99,45,162,246,210,72,147,118,229,83,74,165,97,93,149,242,178,146,174,93,
+217,199,70,107,194,181,22,11,253,145,66,57,13,152,207,75,44,48,169,253,36,146,
+202,89,127,22,0,196,144,72,162,92,170,200,102,189,116,10,34,82,201,251,152,70,
+27,151,229,149,143,16,195,81,123,24,152,200,123,114,220,182,138,231,200,9,144,
+9,165,227,226,188,204,130,166,101,179,145,135,76,5,27,141,139,7,137,149,195,
+127,7,223,103,31,223,218,193,64,1,63,81,125,79,58,27,89,70,70,64,151,62,138,44,
+166,209,195,69,147,177,39,89,207,67,1,83,64,7,227,200,97,50,135,196,163,88,234,
+57,97,71,74,121,183,74,111,50,175,144,23,34,165,140,102,6,46,22,115,80,151,82,
+46,100,54,169,33,176,108,28,63,229,119,101,228,74,229,4,91,146,250,102,134,15,
+232,218,24,109,225,24,210,65,26,79,144,199,117,90,105,193,65,10,227,73,179,152,
+212,199,176,39,247,103,226,182,214,30,6,74,232,86,235,86,37,76,53,49,94,51,85,
+26,111,128,43,43,173,151,99,114,72,126,192,30,28,184,34,52,113,23,95,133,181,
+46,84,205,54,57,15,252,202,30,6,224,21,6,85,161,236,209,1,152,66,43,103,13,168,
+28,186,245,80,73,139,46,158,234,100,191,192,100,15,127,181,15,7,234,88,132,107,
+168,91,197,84,178,135,249,246,208,72,41,239,178,137,104,38,90,44,121,169,185,
+209,78,94,224,42,110,156,36,12,191,205,199,81,10,229,250,192,122,251,24,128,75,
+20,168,246,210,192,116,82,233,231,2,197,108,229,45,254,199,32,95,208,69,186,
+174,84,27,184,114,116,158,34,182,50,200,5,14,82,69,55,177,36,18,195,5,254,66,
+131,40,237,254,150,175,173,16,102,61,70,223,141,223,61,60,205,60,170,217,171,59,
+68,121,128,101,204,39,51,168,76,124,92,163,148,247,57,167,11,3,159,224,65,142,
+179,67,60,250,132,39,173,145,101,243,17,211,92,22,51,131,239,50,198,100,172,143,
+58,42,248,148,35,86,74,105,115,76,177,240,54,219,114,6,67,254,76,163,160,184,
+148,103,149,42,67,192,118,94,121,94,113,41,86,214,227,97,101,120,242,129,237,
+108,55,41,53,41,180,227,209,86,39,254,77,175,137,252,143,234,207,237,60,180,155,
+150,174,118,241,78,184,50,178,53,148,233,72,56,199,90,238,165,128,58,249,113,
+173,137,91,237,215,135,120,87,121,134,201,172,162,82,203,62,39,229,115,38,251,
+91,10,219,232,196,135,143,46,138,89,228,143,44,82,40,164,89,168,65,177,65,133,
+62,148,149,164,133,77,254,210,121,52,249,124,68,7,62,124,244,240,175,145,100,
+99,183,90,41,112,145,11,148,209,168,195,161,108,42,212,56,99,167,156,157,1,112,
+64,40,118,47,51,185,96,72,168,231,18,67,25,151,71,86,21,186,181,191,85,234,249,
+192,244,249,101,90,85,6,26,241,233,180,179,95,6,225,6,195,218,70,118,221,153,
+178,74,112,132,234,21,65,129,86,144,94,57,51,105,212,157,144,223,209,186,80,240,
+230,167,178,75,103,153,62,249,232,168,206,206,79,218,251,207,220,57,230,13,117,
+78,83,204,120,198,18,7,12,208,73,7,21,98,86,119,228,50,224,79,64,78,115,122,56,
+93,71,174,249,12,181,139,145,203,64,57,110,109,113,182,207,56,103,144,114,34,
+184,29,10,25,40,124,74,68,183,76,202,131,254,252,125,210,238,159,191,163,108,
+102,160,155,127,210,133,147,49,68,161,224,192,1,40,120,241,208,73,37,239,176,
+150,102,123,63,248,127,27,97,180,206,27,14,172,151,0,0,0,0,73,69,78,68,174,66,
+96,130};
+static Fl_Image *image_general_64() {
+  static Fl_Image *image = NULL;
+  if (!image)
+    image = new Fl_PNG_Image("general_64.png", idata_general_64, 2162);
+  return image;
+}
+
+static void cb_(Fl_Group* o, void* v) {
+  propagate_load(o, v);
+}
+
+Fl_Scheme_Choice *scheme_choice=(Fl_Scheme_Choice *)0;
+
+Fl_Check_Button *tooltips_button=(Fl_Check_Button *)0;
+
+static void cb_tooltips_button(Fl_Check_Button*, void*) {
+  Fl_Tooltip::enable(tooltips_button->value());
+  fluid_prefs.set("show_tooltips", tooltips_button->value());
+}
+
+Fl_Check_Button *completion_button=(Fl_Check_Button *)0;
+
+static void cb_completion_button(Fl_Check_Button*, void*) {
+  fluid_prefs.set("show_completion_dialogs", completion_button->value());
+}
+
+Fl_Check_Button *openlast_button=(Fl_Check_Button *)0;
+
+static void cb_openlast_button(Fl_Check_Button*, void*) {
+  fluid_prefs.set("open_previous_file", openlast_button->value());
+}
+
+Fl_Check_Button *prevpos_button=(Fl_Check_Button *)0;
+
+static void cb_prevpos_button(Fl_Check_Button*, void*) {
+  fluid_prefs.set("prev_window_pos", prevpos_button->value());
+}
+
+Fl_Check_Button *show_comments_button=(Fl_Check_Button *)0;
+
+static void cb_show_comments_button(Fl_Check_Button*, void*) {
+  show_comments = show_comments_button->value();
+  fluid_prefs.set("show_comments", show_comments);
+  redraw_browser();
+}
+
+static void cb_1(Fl_Group* o, void* v) {
+  propagate_load(o, v);
+}
+
+Fl_Spinner *recent_spinner=(Fl_Spinner *)0;
+
+static void cb_recent_spinner(Fl_Spinner*, void*) {
+  fluid_prefs.set("recent_files", recent_spinner->value());
+  load_history();
+}
+
+Fl_Check_Button *use_external_editor_button=(Fl_Check_Button *)0;
+
+static void cb_use_external_editor_button(Fl_Check_Button*, void*) {
+  G_use_external_editor = use_external_editor_button->value();
+  fluid_prefs.set("use_external_editor", G_use_external_editor);
+  redraw_browser();
+}
+
+Fl_Input *editor_command_input=(Fl_Input *)0;
+
+static void cb_editor_command_input(Fl_Input*, void*) {
+  strncpy(G_external_editor_command, editor_command_input->value(), sizeof(G_external_editor_command)-1);
+  G_external_editor_command[sizeof(G_external_editor_command)-1] = 0;
+  fluid_prefs.set("external_editor_command", G_external_editor_command);
+  redraw_browser();
+}
+
+Fl_Check_Button *guides_button=(Fl_Check_Button *)0;
+
+Fl_Check_Button *restricted_button=(Fl_Check_Button *)0;
+
+Fl_Check_Button *ghosted_outline_button=(Fl_Check_Button *)0;
+
+Fl_Group *w_settings_project_tab=(Fl_Group *)0;
+
+static void cb_w_settings_project_tab(Fl_Group* o, void* v) {
+  propagate_load(o, v);
+}
+
+static const unsigned char idata_document_64[] =
+{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,96,0,0,0,64,8,4,0,0,0,
+79,61,186,133,0,0,3,102,73,68,65,84,104,222,237,154,223,75,83,81,28,192,63,155,
+115,58,171,153,191,42,140,2,75,115,41,69,20,73,61,244,3,67,176,68,122,168,8,234,
+65,123,90,32,81,68,65,47,65,100,208,15,95,194,8,130,94,140,30,250,3,210,94,6,
+65,15,162,15,21,250,160,145,62,68,141,182,39,205,205,156,211,181,173,135,221,
+93,231,118,167,251,113,239,238,153,236,156,135,125,57,231,220,123,191,159,123,
+239,247,215,221,129,244,90,39,223,9,16,206,178,7,113,97,71,135,102,199,151,181,
+242,209,30,224,113,174,213,111,194,163,154,250,145,231,240,44,183,0,3,170,170,
+31,65,232,203,86,41,83,26,107,143,70,133,50,74,51,184,148,31,95,252,144,145,
+219,192,221,220,0,24,87,180,190,65,27,134,52,47,20,198,193,83,165,179,102,137,
+144,14,128,49,42,214,178,63,3,128,9,89,238,98,150,247,42,33,152,244,112,102,167,
+57,72,136,33,85,16,140,122,0,24,57,68,47,29,171,95,164,190,60,2,0,131,106,8,58,
+1,168,135,160,27,128,90,8,58,2,168,131,160,43,64,18,132,222,60,2,136,32,60,
+162,51,86,163,59,156,20,28,96,17,111,76,159,103,15,55,87,242,20,40,165,91,192,
+64,102,160,88,150,223,50,26,119,23,131,120,98,7,14,11,25,137,183,203,210,48,
+195,107,47,45,199,196,63,225,94,33,27,87,52,137,234,57,107,21,116,113,74,245,
+179,230,52,153,107,230,33,67,56,112,179,156,90,189,32,26,128,145,6,174,115,137,
+5,130,169,214,11,226,165,211,165,236,92,183,94,200,171,64,150,71,70,92,0,208,
+206,6,194,120,249,131,159,176,194,156,25,43,149,20,137,12,224,103,132,65,62,51,
+163,56,187,9,27,103,105,163,74,84,128,101,6,121,192,108,210,249,89,156,56,232,
+193,78,181,152,54,48,65,223,26,234,71,219,75,62,42,248,126,1,0,130,124,193,153,
+210,202,15,41,96,234,240,10,45,241,83,150,79,176,149,80,220,221,9,48,142,27,128,
+105,188,212,136,7,16,98,94,206,128,175,81,159,224,135,22,232,151,0,60,138,249,
+143,80,201,156,133,50,133,81,237,28,104,33,18,111,160,72,28,27,147,87,215,193,
+225,184,185,176,52,46,12,128,129,18,73,242,240,137,169,4,128,69,126,201,241,218,
+193,164,12,80,66,29,123,177,232,15,96,166,86,150,95,173,185,210,23,87,174,236,
+226,42,151,99,10,125,157,108,160,152,230,12,143,116,242,132,55,171,63,166,232,
+99,196,45,220,202,248,216,231,140,233,15,96,165,155,251,236,200,240,232,49,2,
+250,123,161,109,116,211,138,147,57,217,68,127,243,66,250,194,112,128,14,44,9,
+166,237,102,0,63,0,46,150,98,190,216,233,230,70,45,52,210,24,227,36,39,121,45,1,
+236,166,157,205,9,0,211,188,147,0,150,196,138,3,134,184,223,168,172,166,223,47,
+164,18,27,60,149,72,44,120,22,20,94,180,69,209,1,204,148,75,245,215,56,253,20,
+39,148,57,115,114,0,179,102,157,110,107,2,96,165,129,31,0,184,165,114,38,89,
+171,195,44,162,13,84,210,158,210,186,58,90,178,126,2,154,0,20,209,70,79,10,152,
+247,216,39,170,17,87,97,167,158,65,166,20,140,56,50,127,140,243,28,201,50,10,
+107,234,133,170,185,64,43,94,197,82,222,128,133,10,182,168,18,224,52,116,163,38,
+106,52,249,144,82,136,196,5,0,157,82,137,208,74,64,117,241,77,245,12,51,140,75,
+241,90,169,102,192,169,180,9,154,34,66,102,219,46,215,107,49,127,179,142,114,92,
+11,47,52,18,5,240,101,244,143,110,90,87,210,164,217,152,83,125,239,174,82,159,
+193,166,213,157,233,226,175,230,234,123,185,168,229,195,61,199,184,10,219,239,
+147,239,104,255,202,153,244,20,250,15,100,60,232,29,230,9,101,148,0,0,0,0,73,69,
+78,68,174,66,96,130};
+static Fl_Image *image_document_64() {
+  static Fl_Image *image = NULL;
+  if (!image)
+    image = new Fl_PNG_Image("document_64.png", idata_document_64, 927);
+  return image;
+}
+
+Fl_Input *header_file_input=(Fl_Input *)0;
+
+static void cb_header_file_input(Fl_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.header_file_name.c_str());
+  } else {
+    if (strcmp(g_project.header_file_name.c_str(), o->value())) {
+      g_project.header_file_name = o->value();
+      set_modflag(1);
+    }
+  }
+}
+
+Fl_Input *code_file_input=(Fl_Input *)0;
+
+static void cb_code_file_input(Fl_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.code_file_name.c_str());
+  } else {
+    if (strcmp(g_project.code_file_name.c_str(), o->value())) {
+      g_project.code_file_name = o->value();
+      set_modflag(1);
+    }
+  }
+}
+
+Fl_Check_Button *include_H_from_C_button=(Fl_Check_Button *)0;
+
+static void cb_include_H_from_C_button(Fl_Check_Button* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.include_H_from_C);
+  } else {
+    if (g_project.include_H_from_C != o->value()) {
+      set_modflag(1);
+      g_project.include_H_from_C = o->value();
+    }
+  }
+}
+
+Fl_Check_Button *use_FL_COMMAND_button=(Fl_Check_Button *)0;
+
+static void cb_use_FL_COMMAND_button(Fl_Check_Button* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.use_FL_COMMAND);
+  } else {
+    if (g_project.use_FL_COMMAND != o->value()) {
+      set_modflag(1);
+      g_project.use_FL_COMMAND = o->value();
+    }
+  }
+}
+
+Fl_Check_Button *utf8_in_src_button=(Fl_Check_Button *)0;
+
+static void cb_utf8_in_src_button(Fl_Check_Button* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.utf8_in_src);
+  } else {
+    if (g_project.utf8_in_src != o->value()) {
+      set_modflag(1);
+      g_project.utf8_in_src = o->value();
+    }
+  }
+}
+
+Fl_Check_Button *avoid_early_includes_button=(Fl_Check_Button *)0;
+
+static void cb_avoid_early_includes_button(Fl_Check_Button* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.avoid_early_includes);
+  } else {
+    if (g_project.avoid_early_includes != o->value()) {
+      set_modflag(1);
+      g_project.avoid_early_includes = o->value();
+    }
+  }
+}
+
+Fl_Check_Button *w_proj_mergeback=(Fl_Check_Button *)0;
+
+static void cb_w_proj_mergeback(Fl_Check_Button* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.write_mergeback_data);
+  } else {
+    if (g_project.write_mergeback_data != o->value()) {
+      set_modflag(1);
+      g_project.write_mergeback_data = o->value();
+    }
+  }
+}
+
+Fl_Group *w_settings_layout_tab=(Fl_Group *)0;
+
+static void cb_w_settings_layout_tab(Fl_Group* o, void* v) {
+  propagate_load(o, v);
+}
+
+static const unsigned char idata_layout_64[] =
+{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,96,0,0,0,64,8,4,0,0,0,
+79,61,186,133,0,0,1,168,73,68,65,84,104,222,237,154,49,75,3,49,20,199,127,119,
+84,168,109,23,197,201,209,69,116,16,197,130,159,160,123,151,226,226,42,14,98,
+29,244,35,184,56,59,250,77,244,27,88,113,171,90,144,66,41,116,180,72,75,45,120,
+92,92,122,109,167,144,75,155,35,202,123,89,18,146,123,252,127,112,239,46,47,
+121,144,206,78,232,16,161,28,181,136,14,53,28,218,21,99,103,226,147,246,205,185,
+43,249,135,12,157,203,87,40,6,28,152,139,10,83,0,92,83,36,11,43,113,106,190,56,
+151,194,241,94,210,41,144,215,46,28,51,154,246,215,141,221,207,61,85,118,1,16,
+178,154,116,47,168,16,104,22,126,112,57,17,83,161,78,17,101,224,94,241,200,109,
+50,216,32,36,94,62,192,84,243,38,59,26,0,136,201,79,0,214,216,166,100,228,94,
+209,156,13,2,115,128,144,63,110,2,32,0,2,32,0,2,176,144,229,220,186,143,24,26,
+174,84,140,125,4,104,112,195,138,209,86,2,218,62,2,116,233,74,12,72,16,47,102,
+86,249,128,63,0,150,249,128,63,0,150,249,128,4,177,0,8,128,0,8,128,0,8,128,0,8,
+128,0,8,128,0,8,128,0,184,55,171,156,184,199,155,246,146,175,109,121,76,152,25,
+192,29,247,218,121,187,3,146,12,1,70,25,10,148,32,254,151,65,92,102,75,51,27,
+208,231,193,111,128,26,85,205,87,40,224,157,103,62,125,6,200,83,210,150,26,20,
+36,6,4,64,0,4,64,0,4,192,187,31,89,60,187,171,51,207,7,250,180,140,47,249,122,
+243,131,216,84,86,144,2,182,201,110,242,167,117,92,118,249,196,145,139,173,196,
+75,2,144,38,31,176,218,19,53,220,188,110,251,12,50,41,61,254,154,149,216,46,
+219,234,153,20,127,159,185,12,250,99,90,14,203,239,127,120,165,154,78,208,47,
+215,15,118,242,56,45,94,1,0,0,0,0,73,69,78,68,174,66,96,130};
+static Fl_Image *image_layout_64() {
+  static Fl_Image *image = NULL;
+  if (!image)
+    image = new Fl_PNG_Image("layout_64.png", idata_layout_64, 481);
+  return image;
+}
+
+Fl_Choice *layout_choice=(Fl_Choice *)0;
+
+static void cb_layout_choice(Fl_Choice* o, void* v) {
+  if (v == LOAD) {
+      o->value(g_layout_list.current_suite());
+    } else {
+      int index = o->value();
+      g_layout_list.current_suite(index);
+      g_layout_list.update_dialogs();
+    }
+}
+
+Fl_Menu_Item menu_layout_choice[] = {
+ {"FLTK", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"Grid", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {0,0,0,0,0,0,0,0,0}
+};
+
+static void cb_2(Fl_Button*, void* v) {
+  // Clone the current layout suite
+
+  if (v == LOAD) return;
+
+  Fl_String old_name = "Copy of ";
+  old_name.append(g_layout_list[g_layout_list.current_suite()].name_);
+  const char *new_name = fl_input("Enter a name for the new layout:", old_name.c_str());
+  if (new_name == NULL)
+    return;
+
+  g_layout_list.add(new_name);
+  g_layout_list.update_dialogs();
+}
+
+Fl_Menu_Button *w_layout_menu=(Fl_Menu_Button *)0;
+
+static void cb_w_layout_menu(Fl_Menu_Button*, void* v) {
+  if (v == LOAD) {
+    Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
+    if (suite.storage_ == FD_STORE_INTERNAL) {
+      w_layout_menu_rename->deactivate();
+      for (int i=1; i<4; i++) w_layout_menu_storage[i]->deactivate();
+      w_layout_menu_delete->deactivate();
+    } else {
+      w_layout_menu_rename->activate();
+      for (int i=1; i<4; i++) w_layout_menu_storage[i]->activate();
+      w_layout_menu_delete->activate();
+    }
+    w_layout_menu_storage[suite.storage_]->setonly();
+  }
+}
+
+static void cb_w_layout_menu_rename(Fl_Menu_*, void*) {
+  // Rename the current layout suite
+
+  Fl_String old_name = g_layout_list[g_layout_list.current_suite()].name_;
+  const char *new_name = fl_input("Enter a new name for the layout:", old_name.c_str());
+  if (new_name == NULL)
+    return;
+
+  g_layout_list.rename(new_name);
+  g_layout_list.update_dialogs();
+}
+
+static void cb_w_layout_menu_storage(Fl_Menu_*, void*) {
+  Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
+  suite.storage(FD_STORE_INTERNAL);
+  g_layout_list.update_dialogs();
+}
+
+static void cb_w_layout_menu_storage1(Fl_Menu_*, void*) {
+  Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
+  suite.storage(FD_STORE_USER);
+  g_layout_list.update_dialogs();
+}
+
+static void cb_w_layout_menu_storage2(Fl_Menu_*, void*) {
+  Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
+  suite.storage(FD_STORE_PROJECT);
+  g_layout_list.update_dialogs();
+}
+
+static void cb_w_layout_menu_storage3(Fl_Menu_*, void*) {
+  Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
+  suite.storage(FD_STORE_FILE);
+  g_layout_list.update_dialogs();
+}
+
+static void cb_w_layout_menu_load(Fl_Menu_*, void*) {
+  // Give the user a file chooser and load that file
+  Fl_Native_File_Chooser fnfc;
+  fnfc.title("Load Layout Settings:");
+  fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE);
+  fnfc.options(Fl_Native_File_Chooser::USE_FILTER_EXT);
+  fnfc.filter("FLUID Layouts\t*.fll\n");
+  if (fnfc.show() != 0) return;
+  const char *new_filename = fnfc.filename();
+  if (!new_filename) return;
+  g_layout_list.load(new_filename);
+  //g_layout_list.current_suite(n);
+  g_layout_list.update_dialogs();
+}
+
+static void cb_w_layout_menu_save(Fl_Menu_*, void*) {
+  // Give the user a file chooser with a suggested name
+    Fl_Native_File_Chooser fnfc;
+    fnfc.title("Save Layout Settings:");
+    fnfc.type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE);
+    fnfc.options(Fl_Native_File_Chooser::SAVEAS_CONFIRM | Fl_Native_File_Chooser::USE_FILTER_EXT);
+    fnfc.filter("FLUID Layouts\t*.fll\n");
+    Fl_String filename = g_layout_list.filename_;
+    fnfc.directory(fl_filename_path(filename).c_str());
+    fnfc.preset_file(fl_filename_name(filename).c_str());
+    if (fnfc.show() != 0) return;
+    const char *new_filename = fnfc.filename();
+    if (!new_filename) return;
+    g_layout_list.filename_ = new_filename;
+    g_layout_list.save(new_filename);
+}
+
+static void cb_w_layout_menu_delete(Fl_Menu_*, void*) {
+  // remove the current suite
+
+  g_layout_list.remove(g_layout_list.current_suite());
+  g_layout_list.update_dialogs();
+}
+
+Fl_Menu_Item menu_w_layout_menu[] = {
+ {"Rename...", 0,  (Fl_Callback*)cb_w_layout_menu_rename, 0, 128, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"@fd_beaker  FLUID Built-In", 0,  (Fl_Callback*)cb_w_layout_menu_storage, 0, 9, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"@fd_user  User Preference", 0,  (Fl_Callback*)cb_w_layout_menu_storage1, 0, 8, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"@fd_project  Store in .fl Project File", 0,  (Fl_Callback*)cb_w_layout_menu_storage2, 0, 8, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"@fd_file  Store in External File", 0,  (Fl_Callback*)cb_w_layout_menu_storage3, 0, 136, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"Load...", 0,  (Fl_Callback*)cb_w_layout_menu_load, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"Save...", 0,  (Fl_Callback*)cb_w_layout_menu_save, 0, 128, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"Delete", 0,  (Fl_Callback*)cb_w_layout_menu_delete, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {0,0,0,0,0,0,0,0,0}
+};
+
+Fl_Button *preset_choice[3]={(Fl_Button *)0};
+
+static void cb_Left(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->left_window_margin);
+  } else {
+    layout->left_window_margin = (int)o->value();
+  }
+}
+
+static void cb_Top(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->top_window_margin);
+  } else {
+    layout->top_window_margin = (int)o->value();
+  }
+}
+
+static void cb_Right(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->right_window_margin);
+  } else {
+    layout->right_window_margin = (int)o->value();
+  }
+}
+
+static void cb_Bottom(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->bottom_window_margin);
+  } else {
+    layout->bottom_window_margin = (int)o->value();
+  }
+}
+
+static void cb_Horizontal(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->window_grid_x);
+  } else {
+    layout->window_grid_x = (int)o->value();
+  }
+}
+
+static void cb_Vertical(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->window_grid_y);
+  } else {
+    layout->window_grid_y = (int)o->value();
+  }
+}
+
+static void cb_Left1(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->left_group_margin);
+  } else {
+    layout->left_group_margin = (int)o->value();
+  }
+}
+
+static void cb_Top1(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->top_group_margin);
+  } else {
+    layout->top_group_margin = (int)o->value();
+  }
+}
+
+static void cb_Right1(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->right_group_margin);
+  } else {
+    layout->right_group_margin = (int)o->value();
+  }
+}
+
+static void cb_Bottom1(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->bottom_group_margin);
+  } else {
+    layout->bottom_group_margin = (int)o->value();
+  }
+}
+
+static void cb_Horizontal1(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->group_grid_x);
+  } else {
+    layout->group_grid_x = (int)o->value();
+  }
+}
+
+static void cb_Vertical1(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->group_grid_y);
+  } else {
+    layout->group_grid_y = (int)o->value();
+  }
+}
+
+static void cb_Top2(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->top_tabs_margin);
+  } else {
+    layout->top_tabs_margin = (int)o->value();
+  }
+}
+
+static void cb_Bottom2(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->bottom_tabs_margin);
+  } else {
+    layout->bottom_tabs_margin = (int)o->value();
+  }
+}
+
+static void cb_Minimum(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->widget_min_w);
+  } else {
+    layout->widget_min_w = (int)o->value();
+  }
+}
+
+static void cb_Increment(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->widget_inc_w);
+  } else {
+    layout->widget_inc_w = (int)o->value();
+  }
+}
+
+static void cb_Gap(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->widget_gap_x);
+  } else {
+    layout->widget_gap_x = (int)o->value();
+  }
+}
+
+static void cb_3(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->widget_min_h);
+  } else {
+    layout->widget_min_h = (int)o->value();
+  }
+}
+
+static void cb_4(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->widget_inc_h);
+  } else {
+    layout->widget_inc_h = (int)o->value();
+  }
+}
+
+static void cb_5(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value((double)layout->widget_gap_y);
+  } else {
+    layout->widget_gap_y = (int)o->value();
+  }
+}
+
+static void cb_6(Fl_Choice* o, void* v) {
+  if (v == LOAD) {
+    o->value(layout->labelfont+1);
+  } else {
+    layout->labelfont = (int)o->value()-1;
+  }
+}
+
+static void cb_7(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value(layout->labelsize);
+  } else {
+    layout->labelsize = (int)o->value();
+  }
+}
+
+static void cb_8(Fl_Choice* o, void* v) {
+  if (v == LOAD) {
+    o->value(layout->textfont+1);
+  } else {
+    layout->textfont = (int)o->value()-1;
+  }
+}
+
+static void cb_9(Fl_Value_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value(layout->textsize);
+  } else {
+    layout->textsize = (int)o->value();
+  }
+}
+
+Fl_Group *w_settings_shell_tab=(Fl_Group *)0;
+
+static const unsigned char idata_shell_64[] =
+{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,96,0,0,0,64,8,4,0,0,0,
+79,61,186,133,0,0,2,233,73,68,65,84,104,222,237,154,207,107,19,65,20,199,63,
+155,196,70,235,161,154,149,104,165,148,170,104,127,252,3,30,5,43,69,130,55,15,
+222,234,77,65,240,34,182,1,127,28,2,189,181,9,120,16,244,82,240,32,210,179,162,
+69,241,170,30,196,91,107,171,208,218,94,26,161,77,218,131,182,49,38,245,80,77,
+118,67,205,254,152,113,102,87,242,114,217,101,194,240,253,236,188,247,102,230,
+205,128,179,181,145,97,141,10,219,10,127,21,86,201,208,134,4,139,49,165,88,124,
+29,98,146,152,56,64,70,147,252,29,132,180,147,60,195,17,96,141,4,250,236,43,71,
+68,1,42,68,118,30,246,18,87,164,122,163,254,88,37,42,10,176,253,71,126,134,30,
+170,10,228,71,248,98,245,28,195,41,68,93,90,156,110,78,40,26,129,170,39,220,144,
+91,11,64,183,185,142,129,18,203,68,20,5,241,178,135,127,187,206,66,245,52,106,
+73,114,116,252,19,132,18,91,174,21,122,0,208,100,70,43,136,255,147,32,134,33,
+14,42,241,39,131,34,47,229,3,36,184,78,159,34,128,57,222,83,144,63,2,237,236,
+87,228,22,237,173,153,184,5,16,200,44,100,223,114,124,96,157,227,12,176,39,140,
+0,155,60,102,12,56,198,109,206,201,41,29,168,117,161,60,83,0,44,114,135,87,
+252,8,31,128,81,27,184,60,119,53,35,248,2,56,204,69,203,104,232,69,240,5,176,
+143,75,140,4,4,193,103,26,53,25,14,8,130,239,121,32,40,8,2,19,89,48,16,132,102,
+226,32,32,8,46,37,244,35,8,175,133,116,35,72,88,204,153,12,115,211,134,240,154,
+114,184,86,163,38,151,109,163,48,198,76,216,150,211,118,71,90,100,154,205,176,
+237,7,76,134,45,69,241,55,172,135,111,67,99,114,186,182,155,45,11,22,33,11,58,0,
+62,241,136,239,181,26,134,170,141,78,76,158,252,44,79,107,111,131,202,14,214,
+36,1,204,147,179,200,79,49,40,239,203,168,0,152,39,203,179,218,219,16,55,232,
+14,250,166,222,106,115,228,108,242,71,233,119,81,244,14,12,192,28,19,60,183,
+200,79,211,167,80,190,112,22,250,104,147,127,94,154,252,132,154,17,152,37,103,
+147,63,74,175,210,175,47,8,48,203,4,211,154,229,11,0,204,144,109,42,191,76,201,
+67,111,113,223,19,95,204,175,252,113,203,33,68,138,17,78,217,228,127,230,5,75,
+84,92,246,22,165,135,148,207,123,0,190,0,10,76,54,200,239,109,104,127,192,19,
+143,125,46,113,203,215,236,237,43,11,21,121,215,68,190,189,221,173,189,165,168,
+46,141,182,211,245,251,233,194,46,242,173,237,238,173,203,211,185,140,160,11,
+37,185,194,79,22,57,203,85,78,254,181,125,222,67,143,253,92,35,169,14,32,202,
+25,6,248,198,33,14,52,105,223,112,125,36,104,208,65,210,233,102,147,220,44,20,
+163,211,177,189,51,108,59,50,61,214,2,208,109,174,99,160,192,130,178,251,66,11,
+214,235,54,142,9,192,201,42,205,71,41,33,161,178,208,216,199,86,173,56,32,227,
+218,229,42,166,70,15,89,225,168,104,12,220,87,226,55,187,91,149,123,50,162,100,
+82,219,229,239,135,114,138,14,109,164,201,83,85,44,126,133,81,55,103,232,191,0,
+145,21,211,195,226,88,204,195,0,0,0,0,73,69,78,68,174,66,96,130};
+static Fl_Image *image_shell_64() {
+  static Fl_Image *image = NULL;
+  if (!image)
+    image = new Fl_PNG_Image("shell_64.png", idata_shell_64, 802);
+  return image;
+}
+
+Fl_Browser *w_settings_shell_list=(Fl_Browser *)0;
+
+static void cb_w_settings_shell_list(Fl_Browser* o, void* v) {
+  if (v == LOAD) {
+    // load from g_shell_config
+    if (g_shell_config) {
+      o->clear();
+      w_settings_shell_list_selected = 0;
+      for (int i=0; i<g_shell_config->list_size; i++) {
+        Fd_Shell_Command *cmd = g_shell_config->list[i];
+        o->add(cmd->name.c_str());
+        if (cmd->storage == FD_STORE_USER)
+          o->icon(i+1, w_settings_shell_fd_user->image());
+        else if (cmd->storage == FD_STORE_PROJECT)
+          o->icon(i+1, w_settings_shell_fd_project->image());
+      }
+    }
+  } else {
+  //  int prev_selected = w_settings_shell_list_selected;
+    w_settings_shell_list_selected = 0;
+    int selected = w_settings_shell_list->value();
+    if (selected) {
+      if (w_settings_shell_list->selected(selected))
+        w_settings_shell_list_selected = selected;
+    }
+    w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
+    w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
+  }
+}
+
+Fl_Group *w_settings_shell_toolbox=(Fl_Group *)0;
+
+static void cb_w_settings_shell_toolbox(Fl_Group* o, void* v) {
+  if (v==LOAD) {
+    propagate_load(o, v);
+  }
+}
+
+static void cb_a(Fl_Button*, void* v) {
+  if (v != LOAD) {
+    int selected = w_settings_shell_list_selected;
+    Fd_Shell_Command *cmd = new Fd_Shell_Command("new shell command");
+    g_shell_config->insert(selected, cmd);
+    w_settings_shell_list->insert(selected+1, cmd->name.c_str());
+    w_settings_shell_list->deselect();
+    w_settings_shell_list->value(selected+1);
+    if (cmd->storage == FD_STORE_USER)
+      w_settings_shell_list->icon(selected+1, w_settings_shell_fd_user->image());
+    else if (cmd->storage == FD_STORE_PROJECT)
+      w_settings_shell_list->icon(selected+1, w_settings_shell_fd_project->image());
+    w_settings_shell_list->do_callback();
+    w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
+    w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
+    g_shell_config->rebuild_shell_menu();
+  }
+}
+
+Fl_Button *w_settings_shell_dup=(Fl_Button *)0;
+
+static void cb_w_settings_shell_dup(Fl_Button* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v==LOAD) {
+    if (selected) {
+      o->activate();
+    } else {
+      o->deactivate();
+    }
+  } else {
+    if (!selected) return;
+    Fd_Shell_Command *cmd = new Fd_Shell_Command(g_shell_config->list[selected-1]);
+    g_shell_config->insert(selected, cmd);
+    w_settings_shell_list->insert(selected+1, cmd->name.c_str());
+    w_settings_shell_list->deselect();
+    w_settings_shell_list->deselect();
+    w_settings_shell_list->value(selected+1);
+    if (cmd->storage == FD_STORE_USER)
+      w_settings_shell_list->icon(selected+1, w_settings_shell_fd_user->image());
+    else if (cmd->storage == FD_STORE_PROJECT)
+      w_settings_shell_list->icon(selected+1, w_settings_shell_fd_project->image());
+    w_settings_shell_list->do_callback();
+    w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
+    w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
+    g_shell_config->rebuild_shell_menu();
+  }
+}
+
+Fl_Button *w_settings_shell_remove=(Fl_Button *)0;
+
+static void cb_w_settings_shell_remove(Fl_Button* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v==LOAD) {
+    if (selected) {
+      o->activate();
+    } else {
+      o->deactivate();
+    }
+  } else {
+    if (!selected) return;
+    int ret = fl_choice("Delete the shell command\n\"%s\"?\n\nThis can not be undone.",
+      "Delete", "Cancel", NULL, g_shell_config->list[selected-1]->name.c_str());
+    if (ret==1) return;
+    g_shell_config->remove(selected-1);
+    w_settings_shell_list->remove(selected);
+    if (selected <= w_settings_shell_list->size())
+      w_settings_shell_list->value(selected);
+    else
+      w_settings_shell_list->value(0);
+    w_settings_shell_list->do_callback();
+    w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
+    w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
+    g_shell_config->rebuild_shell_menu();
+  }
+}
+
+Fl_Menu_Button *w_settings_shell_menu=(Fl_Menu_Button *)0;
+
+static void cb_Import(Fl_Menu_*, void* v) {
+  if (v != LOAD)
+    Fd_Shell_Command_List::import_from_file();
+}
+
+static void cb_Export(Fl_Menu_*, void* v) {
+  if (v != LOAD)
+    Fd_Shell_Command_List::export_selected();
+}
+
+Fl_Menu_Item menu_w_settings_shell_menu[] = {
+ {"Import...", 0,  (Fl_Callback*)cb_Import, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"Export selected...", 0,  (Fl_Callback*)cb_Export, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"Example Scripts:", 0,  0, 0, 17, (uchar)FL_NORMAL_LABEL, 1, 10, 0},
+ {"Compile with fltk-config", 0,  0, 0, 16, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"Build and run", 0,  0, 0, 16, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"Build with Xcode on macOS", 0,  0, 0, 16, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"Build with CMake", 0,  0, 0, 16, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {0,0,0,0,0,0,0,0,0}
+};
+
+static void cb_T(Fl_Button*, void* v) {
+  if (v!=LOAD) show_terminal_window();
+}
+
+Fl_Button *w_settings_shell_play=(Fl_Button *)0;
+
+static void cb_w_settings_shell_play(Fl_Button* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v==LOAD) {
+    if (selected) {
+      o->activate();
+    } else {
+      o->deactivate();
+    }
+  } else {
+    if (!selected) return;
+    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+    cmd->run();
+  }
+}
+
+Fl_Group *w_settings_shell_cmd=(Fl_Group *)0;
+
+static void cb_w_settings_shell_cmd(Fl_Group* o, void* v) {
+  if (v==LOAD) {
+    int selected = w_settings_shell_list_selected;
+    if (selected) {
+      o->activate();
+    } else {
+      o->deactivate();
+    }
+    propagate_load(o, v);
+  }
+}
+
+static void cb_Name(Fl_Input* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v == LOAD) {
+    if (selected) {
+      o->value(g_shell_config->list[selected-1]->name.c_str());
+    } else {
+      o->value("");
+    }
+  } else {
+    if (selected) {
+      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+      cmd->name = o->value();
+      w_settings_shell_list->text(selected, o->value());
+      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+    }
+  }
+}
+
+static void cb_Menu(Fl_Input* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v == LOAD) {
+    if (selected) {
+      o->value(g_shell_config->list[selected-1]->label.c_str());
+    } else {
+      o->value("");
+    }
+  } else {
+    if (selected) {
+      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+      cmd->label = o->value();
+      cmd->update_shell_menu();
+      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+    }
+  }
+}
+
+static void cb_b(Fl_Group* o, void* v) {
+  propagate_load(o, v);
+}
+
+static void cb_Shortcut(Fl_Shortcut_Button* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v == LOAD) {
+    if (selected) {
+      o->value(g_shell_config->list[selected-1]->shortcut);
+      //o->default_value(o->value());
+    } else {
+      o->value(0);
+    }
+  } else {
+    if (selected) {
+      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+      cmd->shortcut = o->value();
+      cmd->update_shell_menu();
+      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+    }
+  }
+}
+
+static void cb_Store(Fl_Choice* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v == LOAD) {
+    if (selected) {
+      Fd_Tool_Store ts = g_shell_config->list[selected-1]->storage;
+      o->value(o->find_item_with_argument((long)ts));
+    } else {
+      o->value(o->find_item_with_argument((long)FD_STORE_USER));
+    }
+  } else {
+    if (selected) {
+      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+      Fd_Tool_Store ts = (Fd_Tool_Store)(o->mvalue()->argument());
+      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+      cmd->storage = ts;
+      //w_settings_shell_list->text(selected, cmd->name.c_str());
+      if (cmd->storage == FD_STORE_USER)
+        w_settings_shell_list->icon(selected, w_settings_shell_fd_user->image());
+      else if (cmd->storage == FD_STORE_PROJECT)
+        w_settings_shell_list->icon(selected, w_settings_shell_fd_project->image());
+      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+    }
+  }
+}
+
+Fl_Menu_Item menu_Store[] = {
+ {"@fd_user User Setting", 0,  0, (void*)(FD_STORE_USER), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"@fd_project Project File", 0,  0, (void*)(FD_STORE_PROJECT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {0,0,0,0,0,0,0,0,0}
+};
+
+static void cb_Condition(Fl_Choice* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v == LOAD) {
+    if (selected) {
+      int cond = g_shell_config->list[selected-1]->condition;
+      o->value(o->find_item_with_argument(cond));
+    } else {
+      o->value(o->find_item_with_argument(0));
+    }
+  } else {
+    if (selected) {
+      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+      int cond = (int)(o->mvalue()->argument());
+      cmd->condition = cond;
+      g_shell_config->rebuild_shell_menu();
+      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+    }
+  }
+}
+
+Fl_Menu_Item menu_Condition[] = {
+ {"all platforms", 0,  0, (void*)(Fd_Shell_Command::ALWAYS), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"Windows only", 0,  0, (void*)(Fd_Shell_Command::WIN_ONLY), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"Linux only", 0,  0, (void*)(Fd_Shell_Command::UX_ONLY), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"macOS only", 0,  0, (void*)(Fd_Shell_Command::MAC_ONLY), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"Linux and macOS", 0,  0, (void*)(Fd_Shell_Command::MAC_AND_UX_ONLY), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"don\'t use", 0,  0, (void*)(Fd_Shell_Command::NEVER), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {0,0,0,0,0,0,0,0,0}
+};
+
+static void cb_Label(Fl_Input* o, void* v) {
+  if (v == LOAD) {
+  //  o->value(g_shell_command.c_str());
+  } else {
+  //  g_shell_command = o->value();
+  }
+}
+
+Fl_Text_Editor *w_settings_shell_command=(Fl_Text_Editor *)0;
+
+static void cb_w_settings_shell_command(Fl_Text_Editor* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v == LOAD) {
+    if (selected) {
+      o->buffer()->text(g_shell_config->list[selected-1]->command.c_str());
+    } else {
+      o->buffer()->text("");
+    }
+  } else {
+    if (selected) {
+      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+      cmd->command = o->buffer()->text();
+      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+    }
+  }
+}
+
+Fl_Menu_Button *w_settings_shell_text_macros=(Fl_Menu_Button *)0;
+
+static void cb_w_settings_shell_text_macros(Fl_Menu_Button* o, void*) {
+  const Fl_Menu_Item *mi = o->mvalue();
+  if (mi) {
+    char buffer[256];
+    fl_strlcpy(buffer, mi->label(), 255);
+    int n = (int)strlen(buffer)-1;
+    if (buffer[n]=='@') buffer[n] = 0;
+    char *word = buffer;
+    if (word[0]=='@') word++;
+    if (w_settings_shell_command->buffer()->selected()) {
+      int start = 0, end = 0;
+      w_settings_shell_command->buffer()->selection_position(&start, &end);
+      w_settings_shell_command->buffer()->replace(start, end, word);
+    } else {
+      int pos = w_settings_shell_command->insert_position();
+      w_settings_shell_command->buffer()->insert(pos, word);
+    }
+    w_settings_shell_command->do_callback(w_settings_shell_command, (void*)NULL);
+  }
+}
+
+Fl_Menu_Item menu_w_settings_shell_text_macros[] = {
+ {"@@BASENAME@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
+ {"@@PROJECTFILE_PATH@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
+ {"@@PROJECTFILE_NAME@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
+ {"@@CODEFILE_PATH@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
+ {"@@CODEFILE_NAME@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
+ {"@@HEADERFILE_PATH@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
+ {"@@HEADERFILE_NAME@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
+ {"@@TEXTFILE_PATH@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
+ {"@@TEXTFILE_NAME@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
+ // Not yet implemented
+ {"@@FLTK_CONFIG@@", 0,  0, 0, 16, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
+ {"@@TMPDIR@@", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
+ {0,0,0,0,0,0,0,0,0}
+};
+
+static void cb_1fd_zoom(Fl_Button*, void*) {
+  if (!script_panel) make_script_panel();
+  script_input->buffer()->text(w_settings_shell_command->buffer()->text());
+  script_panel->show();
+
+  for (;;) {
+    Fl_Widget* w = Fl::readqueue();
+    if (w == script_panel_cancel) goto BREAK2;
+    else if (w == script_panel_ok) break;
+    else if (!w) Fl::wait();
+  }
+
+  w_settings_shell_command->buffer()->text(script_input->buffer()->text());
+  w_settings_shell_command->do_callback();
+  BREAK2:
+  script_panel->hide();
+}
+
+static void cb_save(Fl_Check_Button* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v == LOAD) {
+    if (selected) {
+      o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_PROJECT);
+    } else {
+      o->value(0);
+    }
+  } else {
+    if (selected) {
+      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+      int v = o->value();
+      if (v) {
+        cmd->flags |= Fd_Shell_Command::SAVE_PROJECT;
+      } else {
+        cmd->flags &= ~Fd_Shell_Command::SAVE_PROJECT;
+      }
+      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+    }
+  }
+}
+
+static void cb_save1(Fl_Check_Button* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v == LOAD) {
+    if (selected) {
+      o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_SOURCECODE);
+    } else {
+      o->value(0);
+    }
+  } else {
+    if (selected) {
+      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+      int v = o->value();
+      if (v) {
+        cmd->flags |= Fd_Shell_Command::SAVE_SOURCECODE;
+      } else {
+        cmd->flags &= ~Fd_Shell_Command::SAVE_SOURCECODE;
+      }
+      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+    }
+  }
+}
+
+static void cb_save2(Fl_Check_Button* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v == LOAD) {
+    if (selected) {
+      o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_STRINGS);
+    } else {
+      o->value(0);
+    }
+  } else {
+    if (selected) {
+      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+      int v = o->value();
+      if (v) {
+        cmd->flags |= Fd_Shell_Command::SAVE_STRINGS;
+      } else {
+        cmd->flags &= ~Fd_Shell_Command::SAVE_STRINGS;
+      }
+      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+    }
+  }
+}
+
+static void cb_show(Fl_Check_Button* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v == LOAD) {
+    if (selected) {
+      o->value(!(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::DONT_SHOW_TERMINAL));
+    } else {
+      o->value(0);
+    }
+  } else {
+    if (selected) {
+      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+      int v = o->value();
+      if (!v) {
+        cmd->flags |= Fd_Shell_Command::DONT_SHOW_TERMINAL;
+      } else {
+        cmd->flags &= ~Fd_Shell_Command::DONT_SHOW_TERMINAL;
+      }
+      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+    }
+  }
+}
+
+static void cb_clear(Fl_Check_Button* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v == LOAD) {
+    if (selected) {
+      o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::CLEAR_TERMINAL);
+    } else {
+      o->value(0);
+    }
+  } else {
+    if (selected) {
+      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+      int v = o->value();
+      if (v) {
+        cmd->flags |= Fd_Shell_Command::CLEAR_TERMINAL;
+      } else {
+        cmd->flags &= ~Fd_Shell_Command::CLEAR_TERMINAL;
+      }
+      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+    }
+  }
+}
+
+static void cb_clear1(Fl_Check_Button* o, void* v) {
+  int selected = w_settings_shell_list_selected;
+  if (v == LOAD) {
+    if (selected) {
+      o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::CLEAR_HISTORY);
+    } else {
+      o->value(0);
+    }
+  } else {
+    if (selected) {
+      Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+      int v = o->value();
+      if (v) {
+        cmd->flags |= Fd_Shell_Command::CLEAR_HISTORY;
+      } else {
+        cmd->flags &= ~Fd_Shell_Command::CLEAR_HISTORY;
+      }
+      if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+    }
+  }
+}
+
+Fl_Box *w_settings_shell_fd_project=(Fl_Box *)0;
+
+static const unsigned char idata_fd_project[] =
+{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,32,8,6,0,0,0,
+115,122,122,244,0,0,1,110,105,67,67,80,105,99,99,0,0,40,145,117,145,187,75,195,
+80,20,198,127,173,239,23,14,58,136,116,200,80,197,65,65,20,196,81,235,208,165,
+72,169,21,172,186,180,49,109,133,164,13,73,139,136,171,224,226,80,112,16,93,
+124,13,254,7,186,10,174,10,130,160,8,34,110,238,190,22,145,120,174,45,180,136,
+189,225,230,252,248,238,253,14,39,95,192,31,49,117,203,109,156,2,43,87,112,98,
+225,144,182,144,88,212,90,94,104,163,153,46,2,244,39,117,215,158,142,70,35,212,
+93,159,119,248,84,189,29,81,189,234,223,251,119,117,172,24,174,14,190,86,225,9,
+221,118,10,194,50,13,145,181,130,173,120,91,184,87,207,38,87,132,15,133,135,29,
+25,80,248,74,233,169,50,63,43,206,148,249,93,177,19,143,205,128,95,245,212,50,
+53,156,170,97,61,235,88,194,67,194,65,203,44,234,149,121,212,151,116,26,185,
+249,57,169,253,178,3,184,196,8,19,66,35,69,145,85,76,10,140,72,205,73,102,255,
+251,70,127,125,179,228,197,163,203,219,102,29,71,28,25,178,226,29,22,181,40,93,
+13,169,105,209,13,121,76,214,85,238,127,243,116,211,227,99,229,238,157,33,104,
+122,242,188,183,1,104,217,129,239,146,231,125,29,121,222,247,49,52,60,194,69,
+174,234,207,75,78,147,31,162,151,170,90,240,0,186,55,225,236,178,170,165,118,
+225,124,11,250,30,236,164,147,252,149,26,100,251,211,105,120,61,133,174,4,244,
+220,64,251,82,57,171,202,57,39,247,16,223,144,95,116,13,123,251,48,40,247,187,
+151,127,0,229,44,103,253,189,250,32,75,0,0,0,9,112,72,89,115,0,0,22,37,0,0,22,
+37,1,73,82,36,240,0,0,1,13,116,69,88,116,82,97,119,32,112,114,111,102,105,108,
+101,32,116,121,112,101,32,101,120,105,102,0,10,101,120,105,102,10,32,32,32,32,
+32,49,49,52,10,52,53,55,56,54,57,54,54,48,48,48,48,52,57,52,57,50,97,48,48,48,
+56,48,48,48,48,48,48,48,52,48,48,49,97,48,49,48,53,48,48,48,49,48,48,48,48,48,
+48,51,101,48,48,48,48,48,48,49,98,48,49,48,53,48,48,48,49,48,48,48,48,48,48,10,
+52,54,48,48,48,48,48,48,50,56,48,49,48,51,48,48,48,49,48,48,48,48,48,48,48,50,
+48,48,48,48,48,48,54,57,56,55,48,52,48,48,48,49,48,48,48,48,48,48,52,101,48,48,
+48,48,48,48,48,48,48,48,48,48,48,48,57,48,48,48,48,48,48,48,10,48,49,48,48,48,
+48,48,48,57,48,48,48,48,48,48,48,48,49,48,48,48,48,48,48,48,50,48,48,48,50,97,
+48,48,52,48,48,48,49,48,48,48,48,48,48,53,50,48,48,48,48,48,48,48,51,97,48,48,
+52,48,48,48,49,48,48,48,48,48,48,56,48,48,48,10,48,48,48,48,48,48,48,48,48,48,
+48,48,10,190,225,144,105,0,0,0,90,116,69,88,116,82,97,119,32,112,114,111,102,
+105,108,101,32,116,121,112,101,32,105,112,116,99,0,10,105,112,116,99,10,32,32,
+32,32,32,32,50,54,10,53,48,54,56,54,102,55,52,54,102,55,51,54,56,54,102,55,48,
+50,48,51,51,50,101,51,48,48,48,51,56,52,50,52,57,52,100,48,52,48,52,48,48,48,
+48,48,48,48,48,48,48,48,48,10,199,209,105,220,0,0,20,96,116,69,88,116,82,97,
+119,32,112,114,111,102,105,108,101,32,116,121,112,101,32,120,109,112,0,10,120,
+109,112,10,32,32,32,32,50,53,53,53,10,51,99,51,102,55,56,55,48,54,49,54,51,54,
+98,54,53,55,52,50,48,54,50,54,53,54,55,54,57,54,101,51,100,50,50,101,102,98,98,
+98,102,50,50,50,48,54,57,54,52,51,100,50,50,53,55,51,53,52,100,51,48,52,100,55,
+48,52,51,54,53,54,56,54,57,10,52,56,55,97,55,50,54,53,53,51,55,97,52,101,53,52,
+54,51,55,97,54,98,54,51,51,57,54,52,50,50,51,102,51,101,48,97,51,99,55,56,51,
+97,55,56,54,100,55,48,54,100,54,53,55,52,54,49,50,48,55,56,54,100,54,99,54,101,
+55,51,51,97,55,56,10,51,100,50,50,54,49,54,52,54,102,54,50,54,53,51,97,54,101,
+55,51,51,97,54,100,54,53,55,52,54,49,50,102,50,50,50,48,55,56,51,97,55,56,54,
+100,55,48,55,52,54,98,51,100,50,50,53,56,52,100,53,48,50,48,52,51,54,102,55,50,
+54,53,50,48,10,51,52,50,101,51,52,50,101,51,48,50,100,52,53,55,56,54,57,55,54,
+51,50,50,50,51,101,48,97,50,48,51,99,55,50,54,52,54,54,51,97,53,50,52,52,52,54,
+50,48,55,56,54,100,54,99,54,101,55,51,51,97,55,50,54,52,54,54,51,100,50,50,54,
+56,10,55,52,55,52,55,48,51,97,50,102,50,102,55,55,55,55,55,55,50,101,55,55,51,
+51,50,101,54,102,55,50,54,55,50,102,51,49,51,57,51,57,51,57,50,102,51,48,51,50,
+50,102,51,50,51,50,50,100,55,50,54,52,54,54,50,100,55,51,55,57,54,101,55,52,10,
+54,49,55,56,50,100,54,101,55,51,50,51,50,50,51,101,48,97,50,48,50,48,51,99,55,
+50,54,52,54,54,51,97,52,52,54,53,55,51,54,51,55,50,54,57,55,48,55,52,54,57,54,
+102,54,101,50,48,55,50,54,52,54,54,51,97,54,49,54,50,54,102,55,53,10,55,52,51,
+100,50,50,50,50,48,97,50,48,50,48,50,48,50,48,55,56,54,100,54,99,54,101,55,51,
+51,97,54,53,55,56,54,57,54,54,51,100,50,50,54,56,55,52,55,52,55,48,51,97,50,
+102,50,102,54,101,55,51,50,101,54,49,54,52,54,102,54,50,54,53,10,50,101,54,51,
+54,102,54,100,50,102,54,53,55,56,54,57,54,54,50,102,51,49,50,101,51,48,50,102,
+50,50,48,97,50,48,50,48,50,48,50,48,55,56,54,100,54,99,54,101,55,51,51,97,55,
+52,54,57,54,54,54,54,51,100,50,50,54,56,55,52,55,52,55,48,10,51,97,50,102,50,
+102,54,101,55,51,50,101,54,49,54,52,54,102,54,50,54,53,50,101,54,51,54,102,54,
+100,50,102,55,52,54,57,54,54,54,54,50,102,51,49,50,101,51,48,50,102,50,50,48,97,
+50,48,50,48,50,48,54,53,55,56,54,57,54,54,51,97,53,48,10,54,57,55,56,54,53,54,
+99,53,56,52,52,54,57,54,100,54,53,54,101,55,51,54,57,54,102,54,101,51,100,50,
+50,51,56,51,50,50,50,48,97,50,48,50,48,50,48,54,53,55,56,54,57,54,54,51,97,53,
+48,54,57,55,56,54,53,54,99,53,57,52,52,54,57,10,54,100,54,53,54,101,55,51,54,
+57,54,102,54,101,51,100,50,50,51,49,51,50,51,56,50,50,48,97,50,48,50,48,50,48,
+55,52,54,57,54,54,54,54,51,97,53,50,54,53,55,51,54,102,54,99,55,53,55,52,54,57,
+54,102,54,101,53,53,54,101,54,57,55,52,10,51,100,50,50,51,50,50,50,48,97,50,48,
+50,48,50,48,55,52,54,57,54,54,54,54,51,97,53,57,53,50,54,53,55,51,54,102,54,99,
+55,53,55,52,54,57,54,102,54,101,51,100,50,50,51,49,51,52,51,52,50,48,50,102,50,
+48,51,49,50,50,48,97,50,48,10,50,48,50,48,55,52,54,57,54,54,54,54,51,97,53,56,
+53,50,54,53,55,51,54,102,54,99,55,53,55,52,54,57,54,102,54,101,51,100,50,50,51,
+49,51,52,51,52,50,48,50,102,50,48,51,49,50,50,50,102,51,101,48,97,50,48,51,99,
+50,102,55,50,54,52,10,54,54,51,97,53,50,52,52,52,54,51,101,48,97,51,99,50,102,
+55,56,51,97,55,56,54,100,55,48,54,100,54,53,55,52,54,49,51,101,48,97,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,10,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,48,
+97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,10,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,10,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,
+97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,48,97,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,10,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,51,99,51,102,55,56,55,48,54,49,
+54,51,54,98,54,53,55,52,50,48,54,53,54,101,54,52,51,100,50,50,55,55,50,50,51,
+102,51,101,10,87,123,188,247,0,0,3,115,73,68,65,84,88,71,189,151,75,75,91,65,20,
+199,79,110,222,169,52,180,203,22,186,239,210,47,80,236,206,126,5,177,17,151,46,
+68,23,82,220,138,90,84,116,163,184,80,81,132,98,93,234,42,203,210,79,209,149,
+32,213,68,164,165,165,129,230,97,94,246,252,166,157,246,246,102,154,132,230,
+226,31,134,59,247,204,153,243,158,123,207,68,206,206,206,164,86,171,73,52,26,
+149,68,34,17,175,84,42,215,123,123,123,15,119,118,118,164,23,26,141,134,164,211,
+105,243,28,29,29,149,229,229,229,183,177,88,236,101,171,213,106,235,83,154,205,
+166,120,158,39,145,72,196,12,23,188,106,181,42,201,100,82,110,111,111,69,149,55,
+246,247,247,139,187,187,187,102,209,110,252,215,200,100,50,162,202,12,111,62,
+159,151,211,211,211,49,85,252,70,135,231,212,230,64,44,149,74,201,205,205,141,
+196,227,113,97,174,222,84,48,102,102,102,70,230,230,230,186,110,110,183,219,178,
+177,177,33,219,219,219,198,129,133,133,5,188,30,27,31,31,71,78,78,89,90,93,5,40,
+60,60,32,92,8,168,215,235,120,86,96,129,148,244,138,0,70,219,208,142,140,140,
+144,66,89,89,89,145,163,163,163,49,221,255,90,195,31,65,62,60,200,7,240,48,39,
+53,198,0,187,96,94,126,230,43,195,28,239,122,129,189,150,111,120,120,88,22,23,
+23,13,109,105,105,73,142,143,143,95,169,242,247,42,51,107,249,144,79,202,49,
+136,186,1,198,0,191,17,186,88,177,194,123,1,239,134,134,134,76,228,152,79,78,78,
+202,250,250,186,137,232,218,218,154,156,156,156,60,211,72,92,43,235,115,60,247,
+43,166,238,128,137,67,192,136,102,183,170,245,3,30,45,92,227,25,74,121,78,76,
+76,152,72,112,2,168,137,195,195,195,148,210,223,169,226,23,208,40,92,210,203,
+201,3,158,205,15,33,98,232,60,101,22,188,222,133,108,235,135,90,64,40,239,200,
+154,154,154,50,17,96,190,185,185,73,77,80,224,121,93,127,130,62,12,97,15,48,6,
+88,101,254,72,244,19,1,194,138,48,242,74,26,108,152,145,145,203,229,76,65,226,
+212,234,234,170,28,28,28,96,228,71,235,168,69,44,24,110,221,156,237,39,255,22,
+40,197,155,173,173,45,115,36,153,147,22,66,205,241,198,57,140,164,54,74,165,82,
+99,122,122,250,47,71,141,235,129,40,164,131,133,249,47,16,242,96,85,227,29,133,
+201,187,149,107,63,116,58,10,24,131,209,22,158,221,4,51,2,117,67,201,127,110,
+187,1,190,249,249,121,185,188,188,148,98,177,40,87,87,87,102,126,126,126,110,
+230,133,66,65,46,46,46,100,118,118,214,242,127,192,32,127,10,92,149,246,217,65,
+11,11,159,130,4,151,1,53,7,45,44,60,8,18,92,6,60,114,208,194,66,35,72,112,25,
+80,113,208,194,66,50,72,112,25,240,205,65,11,11,55,65,194,93,167,160,175,8,68,
+29,180,176,224,142,0,103,211,254,163,245,140,86,59,247,253,31,252,95,216,95,
+243,108,144,199,21,129,14,166,16,113,63,72,112,25,80,119,208,194,194,215,32,193,
+101,64,104,41,112,160,28,36,220,117,10,238,5,9,119,157,130,14,125,46,3,254,252,
+43,195,71,51,72,112,25,240,197,65,11,11,29,245,229,217,179,106,155,10,237,104,
+154,253,180,228,253,2,153,246,142,161,207,36,223,26,123,155,2,30,139,86,33,237,
+148,246,118,41,255,197,97,16,160,148,238,135,214,140,161,198,52,81,110,47,39,
+224,119,71,196,176,157,45,253,28,173,211,160,176,109,25,45,25,50,213,193,199,
+190,27,152,225,137,209,159,99,17,30,151,203,101,218,236,44,52,154,76,90,234,65,
+128,34,228,250,90,246,136,255,29,196,176,206,118,175,58,79,232,226,83,24,236,
+213,122,16,176,223,94,207,73,175,70,249,59,81,177,117,128,158,31,49,127,246,30,
+207,181,170,20,0,0,0,0,73,69,78,68,174,66,96,130};
+static Fl_Image *image_fd_project() {
+  static Fl_Image *image = NULL;
+  if (!image)
+    image = new Fl_PNG_Image("fd_project.png", idata_fd_project, 6950);
+  return image;
+}
+
+Fl_Box *w_settings_shell_fd_user=(Fl_Box *)0;
+
+static const unsigned char idata_fd_user[] =
+{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,32,8,6,0,0,0,
+115,122,122,244,0,0,1,110,105,67,67,80,105,99,99,0,0,40,145,117,145,187,75,195,
+80,20,198,127,173,239,23,14,58,136,116,200,80,197,65,65,20,196,81,235,208,165,
+72,169,21,172,186,180,49,109,133,164,13,73,139,136,171,224,226,80,112,16,93,
+124,13,254,7,186,10,174,10,130,160,8,34,110,238,190,22,145,120,174,45,180,136,
+189,225,230,252,248,238,253,14,39,95,192,31,49,117,203,109,156,2,43,87,112,98,
+225,144,182,144,88,212,90,94,104,163,153,46,2,244,39,117,215,158,142,70,35,212,
+93,159,119,248,84,189,29,81,189,234,223,251,119,117,172,24,174,14,190,86,225,9,
+221,118,10,194,50,13,145,181,130,173,120,91,184,87,207,38,87,132,15,133,135,29,
+25,80,248,74,233,169,50,63,43,206,148,249,93,177,19,143,205,128,95,245,212,50,
+53,156,170,97,61,235,88,194,67,194,65,203,44,234,149,121,212,151,116,26,185,
+249,57,169,253,178,3,184,196,8,19,66,35,69,145,85,76,10,140,72,205,73,102,255,
+251,70,127,125,179,228,197,163,203,219,102,29,71,28,25,178,226,29,22,181,40,93,
+13,169,105,209,13,121,76,214,85,238,127,243,116,211,227,99,229,238,157,33,104,
+122,242,188,183,1,104,217,129,239,146,231,125,29,121,222,247,49,52,60,194,69,
+174,234,207,75,78,147,31,162,151,170,90,240,0,186,55,225,236,178,170,165,118,
+225,124,11,250,30,236,164,147,252,149,26,100,251,211,105,120,61,133,174,4,244,
+220,64,251,82,57,171,202,57,39,247,16,223,144,95,116,13,123,251,48,40,247,187,
+151,127,0,229,44,103,253,189,250,32,75,0,0,0,9,112,72,89,115,0,0,22,37,0,0,22,
+37,1,73,82,36,240,0,0,1,13,116,69,88,116,82,97,119,32,112,114,111,102,105,108,
+101,32,116,121,112,101,32,101,120,105,102,0,10,101,120,105,102,10,32,32,32,32,
+32,49,49,52,10,52,53,55,56,54,57,54,54,48,48,48,48,52,57,52,57,50,97,48,48,48,
+56,48,48,48,48,48,48,48,52,48,48,49,97,48,49,48,53,48,48,48,49,48,48,48,48,48,
+48,51,101,48,48,48,48,48,48,49,98,48,49,48,53,48,48,48,49,48,48,48,48,48,48,10,
+52,54,48,48,48,48,48,48,50,56,48,49,48,51,48,48,48,49,48,48,48,48,48,48,48,50,
+48,48,48,48,48,48,54,57,56,55,48,52,48,48,48,49,48,48,48,48,48,48,52,101,48,48,
+48,48,48,48,48,48,48,48,48,48,48,48,57,48,48,48,48,48,48,48,10,48,49,48,48,48,
+48,48,48,57,48,48,48,48,48,48,48,48,49,48,48,48,48,48,48,48,50,48,48,48,50,97,
+48,48,52,48,48,48,49,48,48,48,48,48,48,53,50,48,48,48,48,48,48,48,51,97,48,48,
+52,48,48,48,49,48,48,48,48,48,48,56,48,48,48,10,48,48,48,48,48,48,48,48,48,48,
+48,48,10,190,225,144,105,0,0,0,90,116,69,88,116,82,97,119,32,112,114,111,102,
+105,108,101,32,116,121,112,101,32,105,112,116,99,0,10,105,112,116,99,10,32,32,
+32,32,32,32,50,54,10,53,48,54,56,54,102,55,52,54,102,55,51,54,56,54,102,55,48,
+50,48,51,51,50,101,51,48,48,48,51,56,52,50,52,57,52,100,48,52,48,52,48,48,48,
+48,48,48,48,48,48,48,48,48,10,199,209,105,220,0,0,20,96,116,69,88,116,82,97,
+119,32,112,114,111,102,105,108,101,32,116,121,112,101,32,120,109,112,0,10,120,
+109,112,10,32,32,32,32,50,53,53,53,10,51,99,51,102,55,56,55,48,54,49,54,51,54,
+98,54,53,55,52,50,48,54,50,54,53,54,55,54,57,54,101,51,100,50,50,101,102,98,98,
+98,102,50,50,50,48,54,57,54,52,51,100,50,50,53,55,51,53,52,100,51,48,52,100,55,
+48,52,51,54,53,54,56,54,57,10,52,56,55,97,55,50,54,53,53,51,55,97,52,101,53,52,
+54,51,55,97,54,98,54,51,51,57,54,52,50,50,51,102,51,101,48,97,51,99,55,56,51,
+97,55,56,54,100,55,48,54,100,54,53,55,52,54,49,50,48,55,56,54,100,54,99,54,101,
+55,51,51,97,55,56,10,51,100,50,50,54,49,54,52,54,102,54,50,54,53,51,97,54,101,
+55,51,51,97,54,100,54,53,55,52,54,49,50,102,50,50,50,48,55,56,51,97,55,56,54,
+100,55,48,55,52,54,98,51,100,50,50,53,56,52,100,53,48,50,48,52,51,54,102,55,50,
+54,53,50,48,10,51,52,50,101,51,52,50,101,51,48,50,100,52,53,55,56,54,57,55,54,
+51,50,50,50,51,101,48,97,50,48,51,99,55,50,54,52,54,54,51,97,53,50,52,52,52,54,
+50,48,55,56,54,100,54,99,54,101,55,51,51,97,55,50,54,52,54,54,51,100,50,50,54,
+56,10,55,52,55,52,55,48,51,97,50,102,50,102,55,55,55,55,55,55,50,101,55,55,51,
+51,50,101,54,102,55,50,54,55,50,102,51,49,51,57,51,57,51,57,50,102,51,48,51,50,
+50,102,51,50,51,50,50,100,55,50,54,52,54,54,50,100,55,51,55,57,54,101,55,52,10,
+54,49,55,56,50,100,54,101,55,51,50,51,50,50,51,101,48,97,50,48,50,48,51,99,55,
+50,54,52,54,54,51,97,52,52,54,53,55,51,54,51,55,50,54,57,55,48,55,52,54,57,54,
+102,54,101,50,48,55,50,54,52,54,54,51,97,54,49,54,50,54,102,55,53,10,55,52,51,
+100,50,50,50,50,48,97,50,48,50,48,50,48,50,48,55,56,54,100,54,99,54,101,55,51,
+51,97,54,53,55,56,54,57,54,54,51,100,50,50,54,56,55,52,55,52,55,48,51,97,50,
+102,50,102,54,101,55,51,50,101,54,49,54,52,54,102,54,50,54,53,10,50,101,54,51,
+54,102,54,100,50,102,54,53,55,56,54,57,54,54,50,102,51,49,50,101,51,48,50,102,
+50,50,48,97,50,48,50,48,50,48,50,48,55,56,54,100,54,99,54,101,55,51,51,97,55,
+52,54,57,54,54,54,54,51,100,50,50,54,56,55,52,55,52,55,48,10,51,97,50,102,50,
+102,54,101,55,51,50,101,54,49,54,52,54,102,54,50,54,53,50,101,54,51,54,102,54,
+100,50,102,55,52,54,57,54,54,54,54,50,102,51,49,50,101,51,48,50,102,50,50,48,97,
+50,48,50,48,50,48,54,53,55,56,54,57,54,54,51,97,53,48,10,54,57,55,56,54,53,54,
+99,53,56,52,52,54,57,54,100,54,53,54,101,55,51,54,57,54,102,54,101,51,100,50,
+50,51,56,51,50,50,50,48,97,50,48,50,48,50,48,54,53,55,56,54,57,54,54,51,97,53,
+48,54,57,55,56,54,53,54,99,53,57,52,52,54,57,10,54,100,54,53,54,101,55,51,54,
+57,54,102,54,101,51,100,50,50,51,49,51,50,51,56,50,50,48,97,50,48,50,48,50,48,
+55,52,54,57,54,54,54,54,51,97,53,50,54,53,55,51,54,102,54,99,55,53,55,52,54,57,
+54,102,54,101,53,53,54,101,54,57,55,52,10,51,100,50,50,51,50,50,50,48,97,50,48,
+50,48,50,48,55,52,54,57,54,54,54,54,51,97,53,57,53,50,54,53,55,51,54,102,54,99,
+55,53,55,52,54,57,54,102,54,101,51,100,50,50,51,49,51,52,51,52,50,48,50,102,50,
+48,51,49,50,50,48,97,50,48,10,50,48,50,48,55,52,54,57,54,54,54,54,51,97,53,56,
+53,50,54,53,55,51,54,102,54,99,55,53,55,52,54,57,54,102,54,101,51,100,50,50,51,
+49,51,52,51,52,50,48,50,102,50,48,51,49,50,50,50,102,51,101,48,97,50,48,51,99,
+50,102,55,50,54,52,10,54,54,51,97,53,50,52,52,52,54,51,101,48,97,51,99,50,102,
+55,56,51,97,55,56,54,100,55,48,54,100,54,53,55,52,54,49,51,101,48,97,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,10,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,48,
+97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,10,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,10,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,
+97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,48,97,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,10,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,48,97,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,
+48,50,48,50,48,50,48,50,48,10,50,48,50,48,50,48,50,48,50,48,50,48,50,48,50,48,
+50,48,50,48,50,48,50,48,50,48,50,48,50,48,48,97,51,99,51,102,55,56,55,48,54,49,
+54,51,54,98,54,53,55,52,50,48,54,53,54,101,54,52,51,100,50,50,55,55,50,50,51,
+102,51,101,10,87,123,188,247,0,0,9,241,73,68,65,84,88,71,109,87,105,144,85,197,
+21,254,186,239,242,222,155,25,102,88,12,14,46,227,16,96,12,26,80,118,103,16,
+113,3,5,89,203,10,70,75,42,106,170,48,196,16,141,154,20,18,177,8,41,21,149,82,
+81,244,71,48,166,42,75,37,96,22,29,5,9,155,131,37,139,16,65,113,153,25,71,8,66,
+153,165,148,137,226,204,91,238,210,55,223,233,251,30,49,58,77,53,115,223,237,
+190,167,207,249,206,57,223,57,173,218,59,223,128,163,92,104,147,32,138,12,84,
+162,225,58,62,100,36,137,66,38,147,65,177,88,4,31,225,186,46,130,56,134,210,9,
+188,140,139,158,82,30,78,198,65,20,26,238,5,60,237,91,57,242,157,231,184,8,75,1,
+148,82,118,130,223,12,168,27,152,62,127,97,104,3,23,9,52,226,242,76,228,173,50,
+118,81,169,4,249,124,15,5,198,86,160,85,138,135,185,78,22,189,61,37,104,30,104,
+98,5,87,103,184,158,227,51,191,113,249,206,24,132,97,152,202,41,79,101,13,74,
+240,229,225,26,83,131,68,203,193,49,12,2,24,45,31,184,246,35,199,113,64,120,104,
+177,139,222,82,137,104,228,16,169,88,187,137,250,238,137,79,62,251,246,238,93,
+187,250,83,232,137,113,227,199,71,77,77,77,71,78,22,78,222,149,209,94,41,227,
+249,68,165,68,153,148,65,52,42,255,250,26,174,67,200,211,161,211,153,104,139,
+136,60,151,104,133,235,106,68,38,132,118,29,132,145,25,250,139,103,158,217,186,
+105,227,214,97,199,143,253,131,240,41,56,70,67,211,13,67,134,12,198,236,249,215,
+220,178,112,225,245,187,170,171,252,233,132,58,53,216,162,233,244,121,184,12,
+213,217,222,97,31,100,183,5,138,10,40,229,88,248,5,21,223,23,69,138,242,46,179,
+252,222,159,183,183,190,176,121,104,130,44,178,153,254,152,56,102,10,98,198,196,
+161,183,246,163,55,255,31,120,185,24,87,207,188,20,15,220,191,242,128,49,193,
+196,40,14,98,71,149,229,81,137,218,218,218,20,213,47,12,87,39,97,89,1,5,35,112,
+241,3,109,53,151,169,24,3,69,56,158,118,215,172,121,114,127,235,11,155,134,122,
+110,45,150,46,125,16,45,205,151,211,184,156,85,160,95,181,135,109,59,94,194,170,
+71,238,69,235,11,127,197,160,1,3,198,222,241,163,239,63,79,9,179,147,10,242,
+125,123,128,56,19,70,9,26,9,52,135,24,136,66,137,138,184,196,103,122,194,247,
+125,245,234,206,221,109,191,122,246,119,163,20,170,112,255,202,53,184,184,249,
+106,6,99,21,181,118,224,185,89,20,243,6,151,77,189,6,203,151,61,4,159,10,62,251,
+203,223,98,223,190,191,141,75,143,48,167,142,234,35,6,233,70,30,46,43,137,157,
+113,249,131,116,138,117,68,166,186,189,189,115,50,19,18,115,103,45,192,248,177,
+23,35,10,178,60,184,14,90,101,9,105,22,97,192,248,40,41,76,110,158,134,185,179,
+175,227,59,31,7,14,188,233,126,249,176,190,178,160,18,129,68,168,156,50,246,111,
+100,115,93,16,160,207,146,55,15,190,131,160,148,96,204,133,205,40,246,42,248,78,
+53,24,151,20,232,160,144,15,80,83,221,143,252,193,12,9,52,206,251,198,88,196,
+92,123,243,224,161,56,149,92,65,160,239,161,157,47,40,165,202,81,43,239,44,26,
+212,56,8,130,248,224,129,3,240,189,44,134,15,111,66,198,175,161,229,220,39,123,
+153,1,53,53,57,20,11,198,198,144,239,229,48,98,68,19,60,47,131,183,223,126,183,
+88,62,162,143,99,255,55,180,48,147,107,35,228,203,27,211,223,76,195,184,177,
+177,129,86,149,112,244,232,17,166,98,17,145,216,38,228,198,45,226,127,215,35,
+123,122,224,90,47,142,29,63,76,18,42,161,190,190,254,36,18,221,135,220,175,156,
+162,203,169,167,210,116,41,127,36,40,72,124,184,218,137,167,78,157,130,108,149,
+135,182,157,91,200,7,12,80,29,17,58,11,144,245,171,226,239,48,250,156,73,219,
+131,215,118,109,227,122,140,25,51,102,100,42,178,83,37,250,118,133,85,47,34,158,
+9,179,65,38,148,87,230,1,199,42,101,146,200,204,152,57,237,125,147,228,177,
+243,181,205,120,175,99,31,81,233,229,222,34,21,76,200,142,204,29,174,105,175,
+136,119,59,247,98,123,91,171,85,104,250,244,43,125,77,6,53,166,98,28,229,39,95,
+85,66,71,41,251,83,63,42,65,14,168,40,18,89,10,117,108,38,12,31,209,120,83,115,
+203,120,148,130,147,184,231,222,219,177,105,243,6,120,126,36,52,129,124,177,100,
+41,124,71,219,75,88,198,181,56,233,193,228,201,147,208,216,216,56,75,228,168,
+50,11,138,187,84,31,222,176,172,35,100,33,22,11,92,177,74,103,197,119,36,33,81,
+111,207,83,79,175,217,187,224,186,121,40,20,63,197,99,143,63,136,205,91,90,89,
+17,149,240,4,182,110,219,132,135,30,89,137,124,161,27,243,230,207,196,186,103,
+158,218,67,22,125,79,170,171,84,80,97,191,40,138,208,91,232,65,108,34,235,182,
+34,43,101,41,40,165,65,104,161,150,169,211,103,85,174,15,162,152,148,226,32,40,
+18,137,112,206,178,101,75,183,141,190,224,124,107,49,139,55,74,20,98,40,208,
+247,61,6,102,128,81,163,206,199,138,21,247,173,47,20,10,45,130,105,38,227,217,
+170,88,98,33,75,203,112,130,79,79,118,227,147,238,19,164,238,188,157,172,39,14,
+9,141,126,42,79,139,136,69,37,101,66,177,192,243,60,233,11,62,102,74,62,76,82,
+162,50,9,38,76,152,96,149,148,67,46,188,112,12,171,90,6,29,29,93,193,231,159,23,
+158,20,223,107,126,28,70,37,155,214,242,189,252,22,20,4,101,73,83,249,93,118,
+129,197,223,22,159,116,166,164,45,127,197,255,217,108,214,30,24,4,17,118,239,
+126,61,137,194,4,35,207,29,133,65,3,79,39,180,202,90,87,83,93,135,97,67,207,101,
+63,224,153,3,111,28,202,184,174,239,136,229,41,145,41,203,41,34,75,179,204,139,
+65,50,108,191,192,227,221,83,197,226,212,72,35,213,214,114,250,174,187,187,155,
+188,190,79,255,229,207,47,206,223,183,247,157,135,227,64,161,101,210,101,164,94,
+32,173,90,160,146,53,152,48,126,10,142,28,237,204,254,224,182,59,159,187,100,
+202,164,127,206,155,63,235,195,150,150,139,158,173,170,170,122,217,36,113,94,24,
+95,14,15,67,246,29,236,92,114,185,156,85,66,181,119,118,88,6,252,127,69,82,37,
+94,106,221,56,106,245,234,71,175,232,62,209,51,203,113,170,91,76,224,231,38,76,
+184,20,75,190,119,23,206,58,123,56,203,116,10,181,75,234,62,246,81,39,158,88,
+187,10,239,180,239,71,18,247,218,56,169,98,149,252,241,79,238,196,220,185,179,
+47,247,60,231,21,81,34,117,133,177,127,5,25,213,222,222,14,169,136,142,231,218,
+128,50,73,32,10,12,88,187,246,233,59,215,173,251,245,45,42,169,61,99,120,227,88,
+76,155,190,0,83,155,175,68,255,65,131,105,56,59,7,82,95,28,146,176,24,55,137,
+229,112,33,167,8,255,254,248,24,118,182,109,196,43,109,47,163,189,243,32,15,138,
+177,232,214,155,112,251,29,183,77,85,137,121,53,45,72,58,45,76,68,80,189,253,
+214,33,194,209,207,194,33,41,215,211,243,233,232,229,203,151,255,126,203,150,29,
+231,185,172,120,75,22,255,20,211,167,221,72,70,172,163,94,14,164,159,8,36,152,0,
+219,204,74,200,136,44,9,48,41,227,174,71,106,87,228,6,213,139,23,95,124,14,79,
+174,125,136,27,3,92,50,181,217,172,121,124,245,24,173,205,33,203,158,182,81,165,
+225,75,126,184,132,86,211,227,180,202,209,222,153,119,223,125,207,235,219,183,
+239,110,168,171,61,3,43,239,123,156,254,190,10,85,85,167,161,80,136,88,130,93,
+27,88,68,144,169,71,146,226,193,177,73,27,78,66,12,135,235,113,28,165,5,149,
+194,217,39,226,155,163,70,99,207,174,93,248,224,112,151,58,124,164,107,241,244,
+171,166,29,103,237,56,40,116,45,25,161,125,95,160,15,108,239,199,96,187,97,103,
+219,158,129,190,219,31,171,87,173,195,216,11,46,99,233,29,192,146,27,157,138,
+222,82,41,141,232,56,182,201,99,93,32,214,136,95,77,148,240,119,134,41,153,35,
+186,213,136,131,12,198,140,190,24,143,174,94,135,154,220,215,176,99,251,107,120,
+125,239,254,7,136,182,170,196,154,14,216,239,101,115,210,5,71,151,175,88,249,
+179,165,33,133,44,188,97,49,154,190,62,142,66,171,73,48,20,200,86,91,14,9,73,54,
+174,207,190,136,133,73,44,141,227,52,88,45,205,10,141,11,125,115,198,180,44,138,
+121,71,64,127,148,242,62,70,142,156,136,57,115,174,167,66,46,86,63,242,196,32,
+130,214,84,9,119,45,36,81,40,244,158,182,97,195,134,223,124,208,245,193,192,179,
+207,26,134,111,93,187,144,13,8,157,29,123,105,59,109,42,221,140,177,129,26,210,
+223,18,197,158,167,109,129,137,152,86,202,94,92,202,118,73,185,230,118,135,37,
+211,247,170,17,20,20,22,222,120,11,59,231,6,116,117,29,118,159,127,190,117,69,
+84,142,35,29,209,145,142,155,61,255,15,235,255,116,70,93,221,233,184,249,59,
+139,104,5,153,138,157,175,133,88,167,80,11,2,162,172,237,106,89,5,227,40,96,239,
+79,74,54,129,205,0,197,12,136,19,42,39,237,16,247,243,106,192,192,78,121,223,
+146,26,207,91,116,235,98,42,31,99,195,31,215,79,114,41,75,134,155,48,178,185,
+195,59,114,248,56,130,162,143,230,139,166,216,194,164,43,209,29,167,85,76,243,
+191,48,76,155,28,199,241,108,76,164,205,108,74,90,70,114,154,123,36,150,4,21,
+113,179,40,171,29,9,204,34,41,187,26,227,199,93,100,255,190,223,113,204,72,44,
+249,76,101,22,35,15,135,187,62,26,98,34,31,67,234,207,177,27,148,244,134,210,
+116,136,134,101,4,36,215,229,224,180,175,55,246,112,197,158,80,131,190,86,25,72,
+95,85,25,210,97,185,90,89,235,131,82,104,175,114,48,164,97,93,139,51,235,155,
+104,168,151,251,232,248,103,20,202,119,212,86,31,61,122,108,149,4,80,67,67,131,
+189,136,228,195,30,114,127,129,26,74,235,205,128,67,234,83,200,83,249,222,152,
+118,58,94,249,89,242,46,172,108,42,95,195,180,101,87,47,35,233,202,106,232,196,
+168,98,176,15,30,124,26,254,254,161,170,233,234,234,194,208,198,122,81,52,202,
+53,156,51,196,44,186,245,230,127,13,169,111,200,38,186,23,253,6,120,82,231,221,
+176,196,226,159,208,145,112,107,172,97,9,97,81,9,159,217,14,33,166,242,18,73,
+230,4,103,29,223,243,217,94,114,184,238,68,118,63,97,36,82,174,152,47,212,204,
+238,14,243,174,189,2,19,155,135,117,203,225,246,210,218,222,241,22,3,134,23,84,
+238,147,74,103,27,19,11,113,26,120,114,249,176,150,90,139,203,237,112,5,133,83,
+163,124,159,80,105,166,84,154,25,123,221,51,105,57,150,247,65,216,203,236,81,
+116,89,108,93,41,107,255,5,119,155,194,247,64,241,254,70,0,0,0,0,73,69,78,68,
+174,66,96,130};
+static Fl_Image *image_fd_user() {
+  static Fl_Image *image = NULL;
+  if (!image)
+    image = new Fl_PNG_Image("fd_user.png", idata_fd_user, 8612);
+  return image;
+}
+
+Fl_Group *w_settings_i18n_tab=(Fl_Group *)0;
+
+static void cb_w_settings_i18n_tab(Fl_Group* o, void* v) {
+  propagate_load(o, v);
+}
+
+static const unsigned char idata_language_64[] =
+{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,96,0,0,0,64,8,4,0,0,0,
+79,61,186,133,0,0,5,113,73,68,65,84,104,222,237,154,107,76,28,85,20,199,127,
+188,10,44,182,184,116,75,75,65,1,129,146,20,140,15,106,91,170,166,129,182,40,98,
+53,104,98,66,240,145,26,67,140,38,245,21,245,139,177,54,126,48,126,48,209,38,
+162,198,132,24,141,181,173,209,86,98,130,129,32,98,1,91,196,214,90,181,136,20,
+90,160,32,10,8,88,96,11,44,227,7,102,239,206,46,236,206,238,236,206,204,154,
+120,246,195,158,123,103,231,222,243,223,123,207,255,156,251,0,117,89,193,43,140,
+226,64,210,244,89,96,154,47,72,197,52,137,230,144,102,227,93,159,78,178,204,2,
+176,63,4,230,75,72,52,154,5,96,52,36,230,75,204,82,164,207,4,81,147,171,157,74,
+28,177,26,58,152,112,42,49,220,74,147,25,0,34,157,230,239,39,131,133,128,26,
+143,96,154,26,90,156,197,181,230,140,128,44,177,92,171,193,15,167,72,116,21,162,
+244,0,16,25,124,19,14,102,152,51,145,36,131,148,113,154,57,199,90,138,200,88,
+182,249,213,174,194,80,24,2,88,160,153,87,1,24,96,175,114,186,136,137,183,133,
+134,69,203,71,248,52,140,0,56,24,225,31,192,206,247,114,77,43,219,73,101,129,56,
+214,16,167,248,229,205,188,193,69,86,83,85,78,167,30,0,34,84,127,33,45,126,37,
+242,46,57,194,252,54,62,164,199,157,38,101,154,181,114,15,229,172,92,210,204,
+166,136,48,242,129,17,14,114,122,73,173,29,59,48,193,1,242,40,48,204,137,53,177,
+208,140,138,63,254,105,32,11,105,2,96,101,147,74,204,8,115,26,77,228,65,210,232,
+195,225,230,42,221,116,201,250,42,225,43,179,174,216,189,53,160,46,254,162,159,
+89,29,89,40,131,74,143,246,175,80,35,0,196,3,115,116,241,19,3,92,118,254,224,
+120,64,29,204,49,204,219,188,201,188,110,113,32,134,24,15,0,3,178,102,195,194,
+28,245,188,47,106,52,244,20,77,6,175,147,207,99,106,16,52,166,18,14,134,185,
+160,160,80,152,18,230,166,96,225,20,175,185,155,175,205,63,31,226,57,93,156,216,
+65,27,47,241,56,111,113,65,212,13,10,61,23,7,141,216,67,67,49,207,232,26,7,106,
+73,39,149,24,64,226,146,120,154,206,44,103,68,41,73,67,251,118,166,157,234,26,
+93,0,184,226,192,143,236,38,9,152,22,14,12,89,56,24,145,245,93,236,37,193,25,
+204,253,254,219,187,121,202,9,33,82,23,0,241,88,229,25,126,142,113,146,128,63,
+104,149,159,165,145,162,224,39,43,185,92,165,33,69,140,115,141,129,30,62,144,
+200,13,98,50,245,2,18,231,196,152,220,66,82,128,255,184,9,145,56,86,177,54,107,
+101,146,9,78,186,146,182,128,167,140,9,0,34,200,37,69,214,107,233,228,23,234,68,
+128,203,53,120,69,166,49,14,92,195,46,161,31,84,172,84,118,178,238,191,1,32,158,
+109,66,111,17,251,14,113,108,115,91,204,132,49,0,216,200,158,37,117,21,100,27,
+190,168,215,12,192,66,9,121,30,9,222,78,44,126,190,61,65,19,71,57,19,130,221,
+140,32,182,85,50,20,126,0,144,185,204,66,210,91,32,252,152,74,158,164,74,193,94,
+134,3,152,166,221,163,251,38,222,161,141,73,63,222,237,162,26,128,126,142,50,
+110,206,174,68,47,95,114,204,45,27,5,168,163,137,18,74,177,120,164,218,158,169,
+254,9,198,100,253,19,42,84,86,119,186,0,24,231,35,106,189,164,97,181,116,113,
+151,79,46,186,36,162,6,64,51,121,196,27,61,133,198,57,165,40,149,242,60,215,43,
+202,157,124,231,35,153,150,232,160,93,81,254,156,126,227,71,32,158,20,57,153,
+139,99,15,101,216,40,160,142,195,178,217,54,114,124,24,53,202,215,30,147,177,
+157,172,32,246,125,53,1,176,81,201,60,253,108,225,110,242,137,7,178,121,148,219,
+105,230,56,243,84,144,69,131,215,119,207,114,108,137,231,20,179,222,88,0,81,20,
+146,195,12,86,86,137,173,189,4,110,100,3,247,1,201,244,123,77,134,167,150,89,
+219,55,113,214,104,0,16,181,236,105,133,69,14,100,222,179,209,223,57,34,107,235,
+72,17,187,123,245,108,198,106,124,32,11,92,230,56,41,8,244,14,158,37,83,144,
+233,121,51,34,113,224,162,36,208,29,108,165,76,65,166,51,225,15,64,73,160,59,
+200,35,129,219,66,64,166,126,251,192,21,250,136,244,114,200,23,193,74,108,170,
+84,168,36,208,116,70,152,4,242,249,57,72,50,85,7,176,176,56,74,118,246,249,216,
+180,189,142,71,40,84,49,64,73,160,135,100,221,30,52,153,170,3,24,195,230,76,19,
+188,199,215,211,68,147,227,243,28,213,157,64,167,151,16,173,86,50,85,247,129,
+106,255,14,135,135,84,220,176,91,16,168,55,169,15,58,51,245,54,70,31,248,117,91,
+98,150,59,21,160,229,218,7,164,46,105,80,26,148,46,74,251,252,184,142,80,43,13,
+74,131,210,160,212,40,37,185,106,131,158,66,243,84,209,206,211,164,249,204,145,
+47,115,128,175,252,35,208,18,172,110,118,245,208,17,68,102,234,15,11,205,82,77,
+13,169,62,246,41,37,250,124,157,58,41,9,180,136,151,73,118,123,122,130,135,5,
+153,238,102,131,78,52,106,231,188,246,112,57,198,55,66,47,35,221,131,173,110,
+226,126,62,147,201,180,131,236,0,67,147,33,129,108,92,100,61,57,108,94,66,182,
+73,138,123,56,191,6,188,45,111,8,0,11,105,178,86,46,52,101,24,44,160,80,214,
+215,251,116,180,16,102,163,129,73,50,85,204,211,75,49,247,46,187,216,76,227,9,
+160,151,98,74,195,19,64,20,219,217,200,20,54,215,237,169,128,158,155,14,0,162,
+197,102,176,182,231,97,146,78,235,33,255,3,48,91,244,241,1,113,7,225,111,126,
+211,112,200,215,19,64,52,208,7,128,72,43,26,248,65,195,235,138,99,214,5,115,0,
+180,48,231,36,244,177,224,90,26,54,107,106,126,27,146,219,190,14,94,52,11,64,38,
+157,33,48,255,61,163,226,212,114,146,206,17,166,130,48,126,136,23,88,161,222,
+205,191,56,75,123,84,202,251,159,166,0,0,0,0,73,69,78,68,174,66,96,130};
+static Fl_Image *image_language_64() {
+  static Fl_Image *image = NULL;
+  if (!image)
+    image = new Fl_PNG_Image("language_64.png", idata_language_64, 1450);
+  return image;
+}
+
+Fl_Choice *i18n_type_chooser=(Fl_Choice *)0;
+
+Fl_Menu_Item menu_i18n_type_chooser[] = {
+ {"None", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"GNU gettext", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"POSIX catgets", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {0,0,0,0,0,0,0,0,0}
+};
+
+Fl_Group *i18n_gnu_group=(Fl_Group *)0;
+
+static void cb_i18n_gnu_group(Fl_Group* o, void* v) {
+  propagate_load(o, v);
+}
+
+Fl_Input *i18n_gnu_include_input=(Fl_Input *)0;
+
+static void cb_i18n_gnu_include_input(Fl_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.i18n_gnu_include.c_str());
+  } else {
+    undo_checkpoint();
+    g_project.i18n_gnu_include = o->value();
+    set_modflag(1);
+  }
+}
+
+Fl_Input *i18n_gnu_conditional_input=(Fl_Input *)0;
+
+static void cb_i18n_gnu_conditional_input(Fl_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.i18n_gnu_conditional.c_str());
+  } else {
+    undo_checkpoint();
+    g_project.i18n_gnu_conditional = o->value();
+    set_modflag(1);
+  }
+}
+
+Fl_Input *i18n_gnu_function_input=(Fl_Input *)0;
+
+static void cb_i18n_gnu_function_input(Fl_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.i18n_gnu_function.c_str());
+  } else {
+    undo_checkpoint();
+    g_project.i18n_gnu_function = o->value();
+    set_modflag(1);
+  }
+}
+
+Fl_Input *i18n_gnu_static_function_input=(Fl_Input *)0;
+
+static void cb_i18n_gnu_static_function_input(Fl_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.i18n_gnu_static_function.c_str());
+  } else {
+    undo_checkpoint();
+    g_project.i18n_gnu_static_function = o->value();
+    set_modflag(1);
+  }
+}
+
+Fl_Group *i18n_posix_group=(Fl_Group *)0;
+
+static void cb_i18n_posix_group(Fl_Group* o, void* v) {
+  propagate_load(o, v);
+}
+
+Fl_Input *i18n_pos_include_input=(Fl_Input *)0;
+
+static void cb_i18n_pos_include_input(Fl_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.i18n_pos_include.c_str());
+  } else {
+    undo_checkpoint();
+    g_project.i18n_pos_include = o->value();
+    set_modflag(1);
+  }
+}
+
+Fl_Input *i18n_pos_conditional_input=(Fl_Input *)0;
+
+static void cb_i18n_pos_conditional_input(Fl_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.i18n_pos_conditional.c_str());
+  } else {
+    undo_checkpoint();
+    g_project.i18n_pos_conditional = o->value();
+    set_modflag(1);
+  }
+}
+
+Fl_Input *i18n_pos_file_input=(Fl_Input *)0;
+
+static void cb_i18n_pos_file_input(Fl_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.i18n_pos_file.c_str());
+  } else {
+    undo_checkpoint();
+    g_project.i18n_pos_file = o->value();
+    set_modflag(1);
+  }
+}
+
+static void cb_c(Fl_Group* o, void* v) {
+  propagate_load(o, v);
+}
+
+Fl_Int_Input *i18n_pos_set_input=(Fl_Int_Input *)0;
+
+static void cb_i18n_pos_set_input(Fl_Int_Input* o, void* v) {
+  if (v == LOAD) {
+    o->value(g_project.i18n_pos_set.c_str());
+  } else {
+    undo_checkpoint();
+    g_project.i18n_pos_set = o->value();
+    set_modflag(1);
+  }
+}
+
+Fl_Group *w_settings_user_tab=(Fl_Group *)0;
+
+static void cb_w_settings_user_tab(Fl_Group* o, void* v) {
+  propagate_load(o, v);
+}
+
+static const unsigned char idata_user_circle_64[] =
+{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,96,0,0,0,64,8,6,0,0,0,
+229,52,114,14,0,0,1,110,105,67,67,80,105,99,99,0,0,40,145,117,145,187,75,195,80,
+20,198,127,182,74,69,171,14,138,136,56,68,80,113,168,32,10,226,168,117,232,82,
+164,212,10,190,150,38,77,91,161,143,144,180,72,113,21,92,28,10,14,162,139,175,
+193,255,64,87,193,85,65,16,20,65,196,205,221,215,34,18,207,53,66,69,244,134,155,
+243,227,187,247,59,156,124,1,95,52,103,228,157,250,9,200,23,74,118,60,18,214,
+230,230,23,180,192,35,65,90,233,100,132,222,164,225,88,147,177,88,148,127,215,
+219,53,117,170,94,13,169,94,255,223,251,115,53,167,76,199,128,186,70,225,49,195,
+178,75,194,50,13,209,149,146,165,120,67,184,195,200,38,83,194,123,194,33,91,6,
+20,62,87,186,238,241,131,226,140,199,47,138,237,68,124,10,124,170,167,150,249,
+193,250,15,54,178,118,94,120,80,184,47,159,43,27,223,243,168,47,9,154,133,217,
+25,169,221,178,123,112,136,19,33,140,134,78,153,101,114,148,24,146,90,144,204,
+254,246,13,127,249,166,41,138,199,144,183,69,5,91,28,25,178,226,13,137,90,150,
+174,166,212,180,232,166,60,57,42,42,247,223,121,58,233,209,17,175,123,48,12,13,
+247,174,251,220,15,129,77,248,168,186,238,251,190,235,126,28,128,255,14,78,11,
+53,127,81,114,26,127,21,189,90,211,250,118,161,109,13,142,207,106,154,190,5,39,
+235,208,117,107,37,237,228,151,228,151,237,75,167,225,233,8,90,230,161,253,18,
+154,22,189,172,190,207,57,188,129,196,170,252,162,11,216,222,129,1,185,223,182,
+244,9,79,172,104,46,25,119,193,26,0,0,0,9,112,72,89,115,0,0,59,14,0,0,59,14,1,
+204,182,161,131,0,0,13,125,73,68,65,84,120,94,213,156,9,236,86,197,17,192,7,4,
+20,177,10,8,2,162,96,16,209,130,40,136,82,4,27,174,214,139,195,8,8,166,73,1,5,
+194,77,75,64,1,141,28,81,74,72,56,203,101,61,138,130,137,82,3,104,64,52,16,16,
+218,130,28,22,149,163,9,1,4,148,163,30,92,162,92,94,157,223,203,247,253,243,142,
+125,223,187,246,195,63,147,108,248,243,190,221,217,153,157,221,217,217,217,153,
+45,35,25,225,231,159,127,206,136,193,220,188,76,153,50,21,244,151,22,90,218,
+106,249,173,150,134,90,106,197,236,236,136,214,251,175,150,127,105,89,163,101,
+147,210,121,62,102,219,68,213,148,206,68,245,173,87,70,0,182,138,18,87,86,203,
+239,181,44,208,114,74,11,210,181,81,192,5,206,223,209,135,45,122,139,53,249,18,
+9,201,6,51,218,225,229,90,254,164,229,128,165,1,47,36,52,250,24,166,165,162,
+37,218,19,141,151,245,202,89,152,80,98,202,107,25,169,229,139,11,48,240,126,
+161,252,79,251,28,14,13,25,121,200,52,166,153,21,88,218,101,168,186,179,141,82,
+62,71,11,186,61,18,174,184,226,10,169,87,175,158,220,120,227,141,114,237,181,
+215,202,149,87,94,41,149,42,85,114,218,125,247,221,119,242,205,55,223,200,161,
+67,135,228,211,79,63,117,202,183,223,126,27,137,51,87,97,167,254,59,72,249,248,
+103,220,6,238,122,89,247,128,11,46,0,37,248,50,101,96,154,150,1,90,66,251,47,91,
+182,172,180,108,217,82,218,181,107,39,119,223,125,183,52,108,216,80,248,22,7,
+126,250,233,39,217,185,115,167,108,216,176,65,214,172,89,35,27,55,110,20,190,21,
+0,86,7,147,97,164,10,226,92,156,62,242,117,46,42,1,40,177,13,148,240,69,90,
+154,132,49,89,163,70,13,233,213,171,151,116,235,214,77,106,213,138,107,244,20,
+30,178,195,135,15,203,226,197,139,229,213,87,95,149,47,190,64,219,133,194,86,
+253,165,135,10,97,79,92,33,92,52,2,80,66,239,81,166,150,105,169,108,98,174,118,
+237,218,50,100,200,16,233,222,189,187,84,168,128,5,106,31,206,159,63,47,139,22,
+45,146,89,179,102,201,145,35,88,170,70,56,166,95,59,169,16,54,196,161,224,162,
+16,128,18,217,81,153,249,135,150,138,126,166,202,149,43,39,61,123,246,148,39,
+158,120,66,208,243,23,2,206,156,57,35,243,230,205,147,217,179,103,203,247,223,
+127,111,234,18,53,244,7,21,194,146,40,122,74,189,0,148,192,206,202,196,98,45,
+229,252,204,176,169,206,157,59,87,26,53,106,20,197,103,81,126,223,190,125,187,
+12,26,52,72,246,239,223,111,194,143,100,186,168,16,150,23,234,60,171,0,226,237,
+106,41,217,87,226,56,193,190,97,26,252,78,157,58,201,59,239,188,243,139,13,62,
+44,53,110,220,88,222,125,247,93,233,208,161,131,137,67,76,228,69,202,67,203,
+148,236,199,106,86,52,43,40,183,225,110,82,42,2,58,191,95,191,126,242,204,51,
+207,72,218,217,115,236,216,49,217,189,123,119,137,30,103,179,110,208,160,129,84,
+169,82,37,22,211,254,74,88,72,207,62,251,172,188,244,210,75,166,246,236,9,205,
+117,37,236,53,253,152,150,135,60,174,162,8,32,103,106,126,160,157,4,172,29,116,
+253,176,97,28,68,147,1,231,141,101,203,150,201,194,133,11,101,203,150,45,242,
+227,143,63,122,16,92,114,201,37,114,215,93,119,57,251,73,199,142,29,83,9,119,
+230,204,153,50,101,202,20,19,97,255,209,143,173,76,38,106,105,21,192,92,37,120,
+160,159,19,102,254,216,177,99,147,141,188,214,70,71,15,30,60,88,182,109,219,22,
+171,109,211,166,77,157,13,182,78,157,58,177,234,187,43,77,152,48,33,108,37,204,
+86,1,12,245,35,44,117,2,200,157,112,241,64,122,86,23,58,127,206,156,57,137,103,
+38,179,189,79,159,62,114,252,248,241,68,131,89,181,106,85,121,249,229,151,229,
+206,59,239,76,212,14,117,196,198,204,254,228,3,14,107,109,252,39,230,82,37,0,37,
+6,75,135,195,76,99,55,241,55,220,112,131,179,217,37,53,51,63,255,252,115,71,
+157,160,243,211,64,229,202,149,29,181,69,255,73,0,215,6,27,243,222,189,1,181,
+143,219,162,169,10,161,196,118,45,109,2,24,161,4,122,148,40,118,254,242,229,203,
+19,91,59,232,124,86,205,39,159,124,18,24,59,4,217,166,77,27,103,227,5,118,237,
+218,37,235,214,173,51,250,127,238,184,227,14,121,235,173,183,18,175,60,76,212,
+206,157,59,203,15,63,252,224,239,127,184,210,54,35,255,49,171,0,2,182,121,146,
+153,226,174,171,132,224,82,126,210,223,190,127,255,254,137,7,31,28,8,205,52,248,
+247,221,119,159,140,26,53,202,113,198,185,225,228,201,147,50,121,242,100,89,185,
+114,165,231,251,214,173,91,29,117,194,74,74,2,152,168,143,63,254,184,188,240,
+194,11,254,102,163,149,215,191,169,16,206,36,193,23,86,215,230,57,160,175,118,
+114,141,187,35,220,11,105,44,30,112,224,183,241,3,131,255,220,115,207,5,6,159,
+122,87,93,117,149,76,156,56,81,238,189,247,222,64,187,5,11,184,139,73,14,195,
+135,15,151,154,53,107,250,27,214,208,15,125,146,99,51,183,176,34,0,157,17,224,
+65,253,120,0,223,206,229,151,179,48,146,1,58,255,195,15,63,244,52,66,237,48,
+243,11,45,121,126,163,78,222,77,157,71,192,70,126,226,196,137,100,68,104,109,
+250,28,58,52,96,248,128,103,100,142,231,196,56,253,13,172,8,64,145,182,215,226,
+177,249,170,87,175,46,143,60,242,72,42,2,209,233,126,59,31,157,239,87,59,38,228,
+172,4,234,186,1,61,14,206,52,208,163,71,15,193,67,235,131,186,250,127,111,39,
+105,144,107,27,91,2,248,163,191,127,244,231,165,151,94,154,138,44,147,203,56,
+191,225,198,65,120,211,77,55,5,170,69,184,161,67,209,194,3,135,59,3,4,120,142,
+67,155,245,21,160,75,145,81,126,216,141,152,139,147,174,93,187,166,161,199,105,
+99,82,51,17,23,42,158,190,210,222,210,133,17,220,165,75,23,19,77,93,149,78,252,
+69,153,192,198,10,248,141,82,224,241,35,115,147,149,229,50,229,154,107,60,123,
+185,195,224,158,61,177,239,72,28,63,145,31,12,106,36,246,192,93,119,221,117,210,
+188,121,115,127,253,95,233,135,192,199,216,72,115,21,109,8,160,157,191,83,174,
+17,179,192,45,183,220,34,248,118,220,176,118,237,90,193,212,140,2,54,91,206,4,
+110,224,44,114,243,205,55,71,53,45,248,123,8,79,217,24,213,30,109,8,0,151,179,7,
+184,195,205,2,120,53,113,172,185,129,75,118,236,252,66,234,133,223,38,77,154,
+228,92,210,187,129,217,203,169,56,11,220,115,15,23,122,1,8,240,158,180,15,27,2,
+248,181,187,83,76,55,46,208,179,130,105,227,227,144,245,244,211,79,27,87,2,51,
+127,244,232,209,178,122,245,234,64,215,33,155,104,34,18,185,52,242,155,183,138,
+32,51,163,153,221,209,74,132,39,54,241,246,219,111,119,78,177,89,129,217,252,
+208,67,15,201,71,31,125,20,64,197,64,180,110,221,186,68,173,228,93,17,254,153,
+79,67,156,113,75,150,44,73,236,138,48,209,255,224,131,15,10,46,10,23,192,123,
+166,73,108,205,21,145,39,138,184,29,27,128,37,196,117,37,46,132,163,71,143,122,
+80,50,208,43,86,172,112,74,33,64,149,225,227,207,234,175,201,247,193,21,170,79,
+0,153,39,112,38,233,153,152,39,104,202,22,96,125,224,82,198,181,156,20,104,
+243,202,43,175,164,186,19,8,235,11,122,108,131,117,1,36,117,57,71,49,212,172,89,
+51,199,165,140,87,51,46,160,118,112,192,37,105,19,7,183,97,15,136,211,172,96,
+29,235,2,40,6,145,220,108,225,82,38,148,4,11,11,179,210,15,124,227,252,241,252,
+243,207,59,58,191,24,179,213,246,228,130,7,235,123,64,230,41,17,130,0,61,206,
+126,64,225,118,140,195,22,17,111,124,207,95,202,103,53,53,139,69,123,33,188,214,
+5,96,178,68,108,51,198,230,106,56,153,218,238,38,128,47,65,192,111,108,90,172,
+171,160,98,16,25,155,155,34,87,44,6,111,214,87,0,33,226,197,132,211,167,79,59,
+234,135,59,131,252,69,61,43,2,171,7,47,104,154,251,135,184,244,22,131,55,235,2,
+48,92,100,199,229,47,180,30,97,41,47,190,248,162,188,255,254,251,114,240,224,
+193,80,119,4,251,193,245,215,95,47,109,219,182,21,66,96,234,214,197,109,111,15,
+200,59,240,65,230,4,185,204,7,9,37,232,176,150,146,56,114,44,5,98,243,227,198,
+242,23,26,30,240,112,195,69,60,80,82,23,51,194,224,84,142,255,200,134,107,132,
+11,34,220,17,190,61,142,229,158,233,112,96,99,15,32,27,177,4,208,147,12,92,22,
+56,123,246,172,60,245,212,83,242,192,3,15,56,23,243,73,7,159,190,105,243,241,
+199,31,203,253,247,223,47,99,198,140,145,115,231,18,229,93,4,200,223,177,99,71,
+192,201,167,149,60,188,167,225,217,134,0,72,5,245,192,7,31,16,149,152,14,208,
+235,248,92,8,65,76,51,240,1,29,161,130,120,237,181,215,132,11,253,175,191,254,
+58,29,81,218,106,253,250,245,166,182,169,210,154,220,136,108,168,32,92,178,30,
+66,90,181,106,37,111,188,65,80,116,50,192,174,103,214,23,10,196,226,98,133,208,
+67,14,90,220,255,2,220,19,16,196,133,227,238,203,47,191,12,237,180,90,181,106,
+78,128,152,33,210,33,146,80,50,118,54,109,34,214,216,3,173,244,127,177,18,57,
+194,58,176,33,0,210,89,240,150,149,220,138,161,255,89,5,73,252,66,232,214,246,
+237,219,59,137,118,126,0,31,225,38,143,62,250,168,220,122,235,173,5,7,11,103,25,
+194,199,117,109,90,65,108,210,171,86,173,50,185,150,67,241,178,241,115,202,246,
+225,227,118,168,186,22,99,134,71,164,68,115,21,50,171,32,37,138,12,116,79,38,9,
+247,183,228,100,37,129,199,30,123,204,56,248,184,33,8,27,39,30,40,106,240,233,
+143,128,42,226,131,176,154,76,193,185,172,20,98,77,147,0,174,13,131,48,23,187,
+67,20,147,224,115,215,205,44,128,28,178,133,126,2,230,207,159,47,108,166,113,
+96,233,210,165,206,138,241,3,170,6,143,230,109,183,221,22,7,141,167,78,147,38,
+77,4,26,76,109,209,231,111,191,253,118,44,156,108,222,33,129,93,1,158,99,33,
+244,85,178,37,0,162,161,63,115,227,254,234,171,175,228,205,55,223,140,164,233,
+212,169,83,142,149,226,7,14,85,248,242,227,196,2,133,117,194,30,65,66,30,126,
+124,63,96,222,198,57,217,190,254,250,235,166,204,202,253,138,47,243,6,12,77,86,
+4,160,75,145,36,220,169,126,38,97,62,202,55,132,247,210,95,135,211,236,212,
+169,83,173,156,106,241,206,78,159,62,61,128,139,62,233,187,16,32,32,242,12,12,
+48,37,199,115,228,4,139,170,96,69,0,185,78,136,98,245,228,126,146,10,58,99,70,
+73,32,113,128,22,150,55,23,46,126,32,62,63,201,6,30,197,36,49,170,3,6,144,23,
+238,5,246,137,66,106,114,218,180,105,166,217,207,19,7,127,143,234,51,238,239,
+214,4,160,51,2,133,31,200,239,97,3,245,93,227,149,208,134,107,193,63,251,25,44,
+194,1,109,3,56,253,66,197,175,68,184,139,9,56,125,179,135,24,224,47,182,34,163,
+173,169,32,23,145,127,213,191,61,121,68,196,101,50,163,209,245,126,48,221,213,
+226,195,241,199,4,217,16,6,201,223,36,6,198,161,129,119,39,6,14,28,104,202,13,
+216,161,237,11,235,173,132,196,90,91,1,244,171,51,131,108,6,194,137,61,78,42,
+156,105,36,231,249,195,11,113,154,229,55,72,108,125,254,38,41,34,73,24,98,92,
+126,241,229,112,135,128,153,90,191,126,125,105,209,162,133,211,31,52,184,129,
+190,71,140,24,33,159,125,230,177,41,28,246,180,12,180,97,122,186,251,203,124,16,
+51,29,118,116,102,207,210,78,134,248,7,167,111,223,190,50,110,220,56,207,103,
+102,27,106,136,213,192,204,47,198,224,187,59,164,143,124,228,53,127,95,125,245,
+213,158,168,9,146,8,67,84,207,76,229,245,207,113,86,80,220,73,81,12,21,148,239,
+155,55,128,200,21,243,0,251,1,166,101,30,80,79,60,27,192,236,71,0,89,6,159,246,
+224,193,130,66,221,132,169,49,119,216,59,127,187,247,32,172,165,144,193,223,162,
+52,7,178,127,146,12,116,88,221,162,172,0,58,211,1,169,175,255,224,60,9,196,148,
+176,18,208,199,188,211,144,38,113,194,179,132,115,43,199,180,159,32,224,40,135,
+30,2,195,84,29,63,126,124,216,224,227,102,33,81,59,112,25,144,227,51,147,28,
+138,38,128,28,113,164,249,175,210,18,72,147,193,227,137,173,143,25,232,79,198,
+200,196,81,130,198,172,24,226,255,209,249,239,189,247,158,169,229,105,253,216,
+94,7,127,99,232,12,206,248,104,95,81,5,144,19,2,217,113,248,138,2,177,244,164,
+143,114,24,194,103,195,83,50,134,140,196,4,195,25,191,42,171,165,98,197,138,114,
+224,192,1,33,137,208,176,225,130,12,39,219,195,58,248,129,132,97,255,10,140,223,
+115,176,102,209,5,224,18,2,15,53,5,86,130,251,185,26,234,70,157,156,211,50,203,
+108,47,95,190,188,51,240,172,56,4,95,224,185,26,102,126,247,168,193,47,245,42,
+200,55,83,80,71,60,216,100,140,51,196,71,79,66,28,15,54,1,172,6,27,234,137,217,
+78,188,16,27,51,248,112,85,51,240,5,82,150,208,249,29,11,169,157,139,110,5,228,
+9,214,193,32,114,151,149,208,44,108,38,147,29,211,187,119,111,33,45,136,83,49,
+179,21,75,41,169,48,24,120,86,23,27,44,142,65,92,202,120,86,249,187,0,96,237,
+240,100,217,190,184,43,45,107,224,239,5,81,65,190,25,67,78,25,46,139,193,90,10,
+62,218,199,193,137,204,20,110,216,184,16,71,24,249,187,93,172,27,204,86,10,127,
+163,98,242,129,0,12,60,41,77,60,218,71,190,192,230,205,155,163,172,33,14,89,156,
+226,159,204,221,111,196,29,255,204,145,215,23,92,0,174,213,192,85,38,175,170,20,
+190,226,202,53,96,38,115,114,165,224,211,193,213,236,126,182,146,107,73,110,211,
+246,237,219,231,60,91,153,96,47,193,117,50,88,7,254,223,177,71,221,85,49,235,10,
+72,211,167,167,13,179,47,109,81,68,88,70,188,152,139,23,213,198,19,197,73,112,
+16,78,195,195,69,229,210,210,31,117,198,200,60,184,113,16,100,33,62,223,86,251,
+225,49,63,92,23,232,222,36,131,152,166,46,125,160,254,46,179,68,123,156,97,42,
+94,29,27,76,184,4,129,115,16,239,24,126,96,46,189,211,12,176,169,13,239,20,224,
+195,7,119,169,122,188,251,23,219,3,162,166,68,46,9,154,60,92,82,65,243,207,215,
+215,142,106,151,251,157,208,10,130,166,184,54,228,186,116,115,206,83,27,179,121,
+252,106,89,247,128,255,3,60,207,245,248,165,38,113,147,0,0,0,0,73,69,78,68,174,
+66,96,130};
+static Fl_Image *image_user_circle_64() {
+  static Fl_Image *image = NULL;
+  if (!image)
+    image = new Fl_PNG_Image("user_circle_64.png", idata_user_circle_64, 3909);
+  return image;
+}
+
+Fl_Choice *w_settings_user_commenttext=(Fl_Choice *)0;
+
+static void cb_Close(Fl_Button*, void*) {
+  if (g_shell_config)
+    g_shell_config->write(fluid_prefs, FD_STORE_USER);
+  g_layout_list.write(fluid_prefs, FD_STORE_USER);
+  settings_window->hide();
+}
+
+Fl_Double_Window* make_settings_window() {
+  { settings_window = new Fl_Double_Window(340, 580, "FLUID Settings");
+    settings_window->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));
+    { w_settings_tabs = new Fl_Tabs(10, 10, 320, 530);
+      w_settings_tabs->selection_color((Fl_Color)12);
+      w_settings_tabs->labelsize(11);
+      w_settings_tabs->labelcolor(FL_WHITE);
+      w_settings_tabs->callback((Fl_Callback*)cb_w_settings_tabs);
+      { w_settings_general_tab = new Fl_Group(10, 60, 320, 480, "General");
+        w_settings_general_tab->image( image_general_64() );
+        w_settings_general_tab->image()->scale(36, 24, 0, 1);
+        w_settings_general_tab->labelsize(11);
+        { Fl_Group* o = new Fl_Group(120, 78, 130, 25);
+          o->callback((Fl_Callback*)cb_);
+          { scheme_choice = new Fl_Scheme_Choice(120, 78, 120, 25, "Scheme: ");
+            scheme_choice->box(FL_UP_BOX);
+            scheme_choice->down_box(FL_BORDER_BOX);
+            scheme_choice->color(FL_BACKGROUND_COLOR);
+            scheme_choice->selection_color(FL_SELECTION_COLOR);
+            scheme_choice->labeltype(FL_NORMAL_LABEL);
+            scheme_choice->labelfont(1);
+            scheme_choice->labelsize(11);
+            scheme_choice->labelcolor(FL_FOREGROUND_COLOR);
+            scheme_choice->callback((Fl_Callback*)scheme_cb);
+            scheme_choice->align(Fl_Align(FL_ALIGN_LEFT));
+            scheme_choice->when(FL_WHEN_RELEASE);
+            init_scheme();
+          } // Fl_Scheme_Choice* scheme_choice
+          { Fl_Box* o = new Fl_Box(240, 78, 10, 25);
+            o->hide();
+            Fl_Group::current()->resizable(o);
+          } // Fl_Box* o
+          o->end();
+        } // Fl_Group* o
+        { Fl_Box* o = new Fl_Box(120, 115, 0, 20, "Options: ");
+          o->labelfont(1);
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_LEFT));
+        } // Fl_Box* o
+        { tooltips_button = new Fl_Check_Button(120, 115, 200, 20, "Show Tooltips");
+          tooltips_button->down_box(FL_DOWN_BOX);
+          tooltips_button->labelsize(11);
+          tooltips_button->callback((Fl_Callback*)cb_tooltips_button);
+          int b;
+          fluid_prefs.get("show_tooltips", b, 1);
+          tooltips_button->value(b);
+          Fl_Tooltip::enable(b);
+        } // Fl_Check_Button* tooltips_button
+        { completion_button = new Fl_Check_Button(120, 135, 200, 20, "Show Completion Dialogs");
+          completion_button->down_box(FL_DOWN_BOX);
+          completion_button->labelsize(11);
+          completion_button->callback((Fl_Callback*)cb_completion_button);
+          int b;
+          fluid_prefs.get("show_completion_dialogs", b, 1);
+          completion_button->value(b);
+        } // Fl_Check_Button* completion_button
+        { openlast_button = new Fl_Check_Button(120, 155, 200, 20, "Open Previous File on Startup");
+          openlast_button->down_box(FL_DOWN_BOX);
+          openlast_button->labelsize(11);
+          openlast_button->callback((Fl_Callback*)cb_openlast_button);
+          int b;
+          fluid_prefs.get("open_previous_file", b, 0);
+          openlast_button->value(b);
+        } // Fl_Check_Button* openlast_button
+        { prevpos_button = new Fl_Check_Button(120, 175, 200, 20, "Remember Window Positions");
+          prevpos_button->down_box(FL_DOWN_BOX);
+          prevpos_button->labelsize(11);
+          prevpos_button->callback((Fl_Callback*)cb_prevpos_button);
+          int b;
+          fluid_prefs.get("prev_window_pos", b, 1);
+          prevpos_button->value(b);
+        } // Fl_Check_Button* prevpos_button
+        { show_comments_button = new Fl_Check_Button(120, 195, 200, 20, "Show Comments in Browser");
+          show_comments_button->down_box(FL_DOWN_BOX);
+          show_comments_button->labelsize(11);
+          show_comments_button->callback((Fl_Callback*)cb_show_comments_button);
+          fluid_prefs.get("show_comments", show_comments, 1);
+          show_comments_button->value(show_comments);
+        } // Fl_Check_Button* show_comments_button
+        { Fl_Group* o = new Fl_Group(120, 225, 50, 20);
+          o->callback((Fl_Callback*)cb_1);
+          { recent_spinner = new Fl_Spinner(120, 225, 40, 20, "# Recent Files:");
+            recent_spinner->labelfont(1);
+            recent_spinner->labelsize(11);
+            recent_spinner->maximum(10);
+            recent_spinner->textsize(11);
+            recent_spinner->callback((Fl_Callback*)cb_recent_spinner);
+            recent_spinner->when(FL_WHEN_CHANGED);
+            int c;
+            fluid_prefs.get("recent_files", c, 5);
+            recent_spinner->maximum(10);
+            recent_spinner->value(c);
+          } // Fl_Spinner* recent_spinner
+          { Fl_Box* o = new Fl_Box(160, 225, 10, 20);
+            o->hide();
+            Fl_Group::current()->resizable(o);
+          } // Fl_Box* o
+          o->end();
+        } // Fl_Group* o
+        { use_external_editor_button = new Fl_Check_Button(120, 275, 200, 20, "Use for Code Nodes");
+          use_external_editor_button->down_box(FL_DOWN_BOX);
+          use_external_editor_button->labelsize(11);
+          use_external_editor_button->callback((Fl_Callback*)cb_use_external_editor_button);
+          fluid_prefs.get("use_external_editor", G_use_external_editor, 0);
+          use_external_editor_button->value(G_use_external_editor);
+        } // Fl_Check_Button* use_external_editor_button
+        { editor_command_input = new Fl_Input(120, 255, 200, 20, "External Editor:");
+          editor_command_input->tooltip("The editor command to open your external text editor.\nInclude any necessary \
+flags to ensure your editor does not background itself.\nExamples:\n    gvim -\
+f\n    gedit\n emacs");
+          editor_command_input->labelfont(1);
+          editor_command_input->labelsize(11);
+          editor_command_input->textfont(4);
+          editor_command_input->textsize(11);
+          editor_command_input->callback((Fl_Callback*)cb_editor_command_input);
+          editor_command_input->when(FL_WHEN_CHANGED);
+          fluid_prefs.get("external_editor_command", G_external_editor_command, "", sizeof(G_external_editor_command)-1);
+          editor_command_input->value(G_external_editor_command);
+        } // Fl_Input* editor_command_input
+        { Fl_Box* o = new Fl_Box(120, 300, 0, 20, "Overlays: ");
+          o->labelfont(1);
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_LEFT));
+        } // Fl_Box* o
+        { Fl_Check_Button* o = guides_button = new Fl_Check_Button(120, 300, 200, 20, "Show Positioning Guides");
+          guides_button->tooltip("show guides that help to position and resize widgets and enable snapping");
+          guides_button->down_box(FL_DOWN_BOX);
+          guides_button->labelsize(11);
+          guides_button->callback((Fl_Callback*)toggle_guides_cb);
+          o->value(show_guides);
+        } // Fl_Check_Button* guides_button
+        { Fl_Check_Button* o = restricted_button = new Fl_Check_Button(120, 320, 200, 20, "Show Restricted Areas");
+          restricted_button->tooltip("show overlapping and out of bounds areas, show unfilled areas in Fl_Pack grou\
+ps");
+          restricted_button->down_box(FL_DOWN_BOX);
+          restricted_button->labelsize(11);
+          restricted_button->callback((Fl_Callback*)toggle_restricted_cb);
+          o->value(show_restricted);
+        } // Fl_Check_Button* restricted_button
+        { Fl_Check_Button* o = ghosted_outline_button = new Fl_Check_Button(120, 340, 200, 20, "Show Ghosted Group Outlines");
+          ghosted_outline_button->tooltip("groups with no box type or flat boxtypes without contrast will be rendered wi\
+th a dim outline in the editing window only");
+          ghosted_outline_button->down_box(FL_DOWN_BOX);
+          ghosted_outline_button->labelsize(11);
+          ghosted_outline_button->callback((Fl_Callback*)toggle_ghosted_outline_cb);
+          o->value(show_ghosted_outline);
+        } // Fl_Check_Button* ghosted_outline_button
+        { Fl_Box* o = new Fl_Box(120, 530, 200, 10);
+          o->hide();
+          Fl_Group::current()->resizable(o);
+        } // Fl_Box* o
+        w_settings_general_tab->end();
+        Fl_Group::current()->resizable(w_settings_general_tab);
+      } // Fl_Group* w_settings_general_tab
+      { w_settings_project_tab = new Fl_Group(10, 60, 320, 480, "Project");
+        w_settings_project_tab->image( image_document_64() );
+        w_settings_project_tab->image()->scale(36, 24, 0, 1);
+        w_settings_project_tab->labelsize(11);
+        w_settings_project_tab->callback((Fl_Callback*)cb_w_settings_project_tab);
+        w_settings_project_tab->hide();
+        { Fl_Group* o = new Fl_Group(100, 78, 220, 30);
+          { Fl_Box* o = new Fl_Box(100, 78, 210, 30, "Use \"name.ext\" to set a file name\nor just \".ext\" to set extension.");
+            o->labelsize(11);
+            o->align(Fl_Align(132|FL_ALIGN_INSIDE));
+          } // Fl_Box* o
+          { Fl_Box* o = new Fl_Box(310, 78, 10, 30);
+            o->hide();
+            Fl_Group::current()->resizable(o);
+          } // Fl_Box* o
+          o->end();
+        } // Fl_Group* o
+        { header_file_input = new Fl_Input(100, 112, 220, 20, "Header File:");
+          header_file_input->tooltip("The name of the generated header file.");
+          header_file_input->box(FL_THIN_DOWN_BOX);
+          header_file_input->labelfont(1);
+          header_file_input->labelsize(11);
+          header_file_input->textfont(4);
+          header_file_input->textsize(11);
+          header_file_input->callback((Fl_Callback*)cb_header_file_input, (void*)(1));
+          header_file_input->when(FL_WHEN_CHANGED);
+        } // Fl_Input* header_file_input
+        { code_file_input = new Fl_Input(100, 137, 220, 20, "Code File:");
+          code_file_input->tooltip("The name of the generated code file.");
+          code_file_input->box(FL_THIN_DOWN_BOX);
+          code_file_input->labelfont(1);
+          code_file_input->labelsize(11);
+          code_file_input->textfont(4);
+          code_file_input->textsize(11);
+          code_file_input->callback((Fl_Callback*)cb_code_file_input, (void*)(1));
+          code_file_input->when(FL_WHEN_CHANGED);
+        } // Fl_Input* code_file_input
+        { include_H_from_C_button = new Fl_Check_Button(100, 162, 220, 20, "Include Header from Code");
+          include_H_from_C_button->tooltip("Include the header file from the code file.");
+          include_H_from_C_button->down_box(FL_DOWN_BOX);
+          include_H_from_C_button->labelsize(11);
+          include_H_from_C_button->callback((Fl_Callback*)cb_include_H_from_C_button);
+        } // Fl_Check_Button* include_H_from_C_button
+        { Fl_Box* o = new Fl_Box(100, 205, 0, 20, "Options: ");
+          o->labelfont(1);
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_LEFT));
+        } // Fl_Box* o
+        { use_FL_COMMAND_button = new Fl_Check_Button(100, 205, 220, 20, "Menu shortcuts use FL_COMMAND");
+          use_FL_COMMAND_button->tooltip("Replace FL_CTRL and FL_META with FL_COMMAND when generating menu shortcuts");
+          use_FL_COMMAND_button->down_box(FL_DOWN_BOX);
+          use_FL_COMMAND_button->labelsize(11);
+          use_FL_COMMAND_button->callback((Fl_Callback*)cb_use_FL_COMMAND_button);
+        } // Fl_Check_Button* use_FL_COMMAND_button
+        { utf8_in_src_button = new Fl_Check_Button(100, 230, 220, 20, "allow Unicode UTF-8 in source code");
+          utf8_in_src_button->tooltip("For older compilers, characters outside of the printable ASCII range are esca\
+ped using octal notation `\\0123`. If this option is checked, Fluid will write\
+ UTF-8 characters unchanged.");
+          utf8_in_src_button->down_box(FL_DOWN_BOX);
+          utf8_in_src_button->labelsize(11);
+          utf8_in_src_button->callback((Fl_Callback*)cb_utf8_in_src_button);
+        } // Fl_Check_Button* utf8_in_src_button
+        { avoid_early_includes_button = new Fl_Check_Button(100, 255, 220, 20, "avoid early include of Fl.H");
+          avoid_early_includes_button->tooltip("Do not emit #include <FL//Fl.H> until it is needed by another include file.");
+          avoid_early_includes_button->down_box(FL_DOWN_BOX);
+          avoid_early_includes_button->labelsize(11);
+          avoid_early_includes_button->callback((Fl_Callback*)cb_avoid_early_includes_button);
+        } // Fl_Check_Button* avoid_early_includes_button
+        { Fl_Box* o = new Fl_Box(100, 283, 0, 20, "Experimental: ");
+          o->labelfont(1);
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_LEFT));
+          o->hide();
+        } // Fl_Box* o
+        { // // Matt: disabled
+          w_proj_mergeback = new Fl_Check_Button(100, 283, 220, 20, "generate MergeBack data");
+          w_proj_mergeback->tooltip("MergeBack is a feature under construction that allows changes in code files t\
+o be merged back into the project file. Checking this option will generate add\
+itional data in code and project files.");
+          w_proj_mergeback->down_box(FL_DOWN_BOX);
+          w_proj_mergeback->labelsize(11);
+          w_proj_mergeback->callback((Fl_Callback*)cb_w_proj_mergeback);
+          w_proj_mergeback->hide();
+        } // Fl_Check_Button* w_proj_mergeback
+        { Fl_Box* o = new Fl_Box(100, 530, 220, 10);
+          o->hide();
+          Fl_Group::current()->resizable(o);
+        } // Fl_Box* o
+        w_settings_project_tab->end();
+      } // Fl_Group* w_settings_project_tab
+      { w_settings_layout_tab = new Fl_Group(10, 60, 320, 480, "Layout");
+        w_settings_layout_tab->image( image_layout_64() );
+        w_settings_layout_tab->image()->scale(36, 24, 0, 1);
+        w_settings_layout_tab->labelsize(11);
+        w_settings_layout_tab->callback((Fl_Callback*)cb_w_settings_layout_tab);
+        w_settings_layout_tab->hide();
+        { Fl_Box* o = new Fl_Box(25, 78, 60, 24, "Layout:");
+          o->labelfont(1);
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
+        } // Fl_Box* o
+        { layout_choice = new Fl_Choice(85, 78, 187, 24);
+          layout_choice->down_box(FL_BORDER_BOX);
+          layout_choice->callback((Fl_Callback*)cb_layout_choice);
+          layout_choice->menu(menu_layout_choice);
+        } // Fl_Choice* layout_choice
+        { Fl_Button* o = new Fl_Button(272, 78, 24, 24, "+");
+          o->callback((Fl_Callback*)cb_2);
+        } // Fl_Button* o
+        { w_layout_menu = new Fl_Menu_Button(296, 78, 24, 24);
+          w_layout_menu->callback((Fl_Callback*)cb_w_layout_menu);
+            w_layout_menu_storage[0] = &menu_w_layout_menu[1];
+            w_layout_menu_storage[1] = &menu_w_layout_menu[2];
+            w_layout_menu_storage[2] = &menu_w_layout_menu[3];
+            w_layout_menu_storage[3] = &menu_w_layout_menu[4];
+          w_layout_menu->menu(menu_w_layout_menu);
+        } // Fl_Menu_Button* w_layout_menu
+        { Fl_Box* o = new Fl_Box(25, 107, 60, 20, "Preset:");
+          o->labelfont(1);
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
+        } // Fl_Box* o
+        { Fl_Group* o = new Fl_Group(85, 107, 235, 20);
+          o->labelsize(11);
+          o->callback((Fl_Callback*)propagate_load);
+          { preset_choice[0] = new Fl_Button(85, 107, 78, 20, "Application");
+            preset_choice[0]->type(102);
+            preset_choice[0]->value(1);
+            preset_choice[0]->compact(1);
+            preset_choice[0]->selection_color(FL_DARK2);
+            preset_choice[0]->labelsize(11);
+            preset_choice[0]->callback((Fl_Callback*)edit_layout_preset_cb, (void*)(0));
+          } // Fl_Button* preset_choice[0]
+          { preset_choice[1] = new Fl_Button(163, 107, 79, 20, "Dialog");
+            preset_choice[1]->type(102);
+            preset_choice[1]->compact(1);
+            preset_choice[1]->selection_color(FL_DARK2);
+            preset_choice[1]->labelsize(11);
+            preset_choice[1]->callback((Fl_Callback*)edit_layout_preset_cb, (void*)(1));
+          } // Fl_Button* preset_choice[1]
+          { preset_choice[2] = new Fl_Button(242, 107, 78, 20, "Toolbox");
+            preset_choice[2]->type(102);
+            preset_choice[2]->compact(1);
+            preset_choice[2]->selection_color(FL_DARK2);
+            preset_choice[2]->labelsize(11);
+            preset_choice[2]->callback((Fl_Callback*)edit_layout_preset_cb, (void*)(2));
+          } // Fl_Button* preset_choice[2]
+          o->end();
+        } // Fl_Group* o
+        { Fl_Box* o = new Fl_Box(85, 132, 235, 20, "---- Window ----");
+          o->labelfont(1);
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
+        } // Fl_Box* o
+        { Fl_Box* o = new Fl_Box(25, 167, 60, 20, "Margins:");
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
+        } // Fl_Box* o
+        { Fl_Value_Input* o = new Fl_Value_Input(85, 167, 55, 20, "Left:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Left);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Value_Input* o = new Fl_Value_Input(145, 167, 55, 20, "Top:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Top);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Value_Input* o = new Fl_Value_Input(205, 167, 55, 20, "Right:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Right);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Value_Input* o = new Fl_Value_Input(265, 167, 55, 20, "Bottom:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Bottom);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Box* o = new Fl_Box(32, 201, 53, 20, "Grid:");
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
+        } // Fl_Box* o
+        { Fl_Value_Input* o = new Fl_Value_Input(85, 201, 55, 20, "Horizontal:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Horizontal);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Value_Input* o = new Fl_Value_Input(145, 201, 55, 20, "Vertical:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Vertical);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Box* o = new Fl_Box(85, 226, 235, 20, "---- Group ----");
+          o->labelfont(1);
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
+        } // Fl_Box* o
+        { Fl_Box* o = new Fl_Box(25, 261, 60, 20, "Margins:");
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
+        } // Fl_Box* o
+        { Fl_Value_Input* o = new Fl_Value_Input(85, 261, 55, 20, "Left:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Left1);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Value_Input* o = new Fl_Value_Input(145, 261, 55, 20, "Top:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Top1);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Value_Input* o = new Fl_Value_Input(205, 261, 55, 20, "Right:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Right1);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Value_Input* o = new Fl_Value_Input(265, 261, 55, 20, "Bottom:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Bottom1);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Box* o = new Fl_Box(32, 295, 53, 20, "Grid:");
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
+        } // Fl_Box* o
+        { Fl_Value_Input* o = new Fl_Value_Input(85, 295, 55, 20, "Horizontal:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Horizontal1);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Value_Input* o = new Fl_Value_Input(145, 295, 55, 20, "Vertical:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Vertical1);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Box* o = new Fl_Box(85, 320, 235, 20, "---- Tabs ----");
+          o->labelfont(1);
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
+        } // Fl_Box* o
+        { Fl_Box* o = new Fl_Box(25, 355, 60, 20, "Margins:");
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
+        } // Fl_Box* o
+        { Fl_Value_Input* o = new Fl_Value_Input(85, 355, 55, 20, "Top:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Top2);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Value_Input* o = new Fl_Value_Input(145, 355, 55, 20, "Bottom:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Bottom2);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Box* o = new Fl_Box(85, 380, 235, 20, "---- Widget ----");
+          o->labelfont(1);
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
+        } // Fl_Box* o
+        { Fl_Box* o = new Fl_Box(25, 415, 60, 20, "Horizontal:");
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
+        } // Fl_Box* o
+        { Fl_Value_Input* o = new Fl_Value_Input(85, 414, 55, 20, "Minimum:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Minimum);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Value_Input* o = new Fl_Value_Input(145, 414, 55, 20, "Increment:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Increment);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Value_Input* o = new Fl_Value_Input(205, 414, 55, 20, "Gap:");
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_Gap);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Box* o = new Fl_Box(32, 440, 53, 20, "Vertical:");
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE));
+        } // Fl_Box* o
+        { Fl_Value_Input* o = new Fl_Value_Input(85, 440, 55, 20);
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_3);
+        } // Fl_Value_Input* o
+        { Fl_Value_Input* o = new Fl_Value_Input(145, 440, 55, 20);
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_4);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Value_Input* o = new Fl_Value_Input(205, 440, 55, 20);
+          o->labelsize(11);
+          o->maximum(32767);
+          o->step(1);
+          o->textsize(11);
+          o->callback((Fl_Callback*)cb_5);
+          o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+        } // Fl_Value_Input* o
+        { Fl_Group* o = new Fl_Group(85, 465, 201, 20, "Label Font:");
+          o->labelsize(11);
+          o->callback((Fl_Callback*)propagate_load);
+          o->align(Fl_Align(FL_ALIGN_LEFT));
+          { Fl_Choice* o = new Fl_Choice(85, 465, 150, 20);
+            o->tooltip("The style of the label text.");
+            o->box(FL_THIN_UP_BOX);
+            o->down_box(FL_BORDER_BOX);
+            o->labelfont(1);
+            o->labelsize(11);
+            o->textsize(11);
+            o->callback((Fl_Callback*)cb_6);
+            Fl_Group::current()->resizable(o);
+            o->menu(fontmenu_w_default);
+          } // Fl_Choice* o
+          { Fl_Value_Input* o = new Fl_Value_Input(235, 465, 50, 20);
+            o->tooltip("The size of the label text.");
+            o->labelsize(11);
+            o->minimum(1);
+            o->maximum(1000);
+            o->step(1);
+            o->value(14);
+            o->textsize(11);
+            o->callback((Fl_Callback*)cb_7);
+          } // Fl_Value_Input* o
+          o->end();
+        } // Fl_Group* o
+        { Fl_Group* o = new Fl_Group(85, 490, 200, 20, "Text Font:");
+          o->labelsize(11);
+          o->callback((Fl_Callback*)propagate_load);
+          o->align(Fl_Align(FL_ALIGN_LEFT));
+          { Fl_Choice* o = new Fl_Choice(85, 490, 150, 20);
+            o->tooltip("The value text style.");
+            o->box(FL_DOWN_BOX);
+            o->down_box(FL_BORDER_BOX);
+            o->labelfont(1);
+            o->labelsize(11);
+            o->textsize(11);
+            o->callback((Fl_Callback*)cb_8);
+            o->menu(fontmenu_w_default);
+          } // Fl_Choice* o
+          { Fl_Value_Input* o = new Fl_Value_Input(235, 490, 50, 20);
+            o->tooltip("The value text size.");
+            o->labelsize(11);
+            o->maximum(1000);
+            o->step(1);
+            o->value(14);
+            o->textsize(11);
+            o->callback((Fl_Callback*)cb_9);
+          } // Fl_Value_Input* o
+          o->end();
+        } // Fl_Group* o
+        { Fl_Box* o = new Fl_Box(325, 535, 5, 5);
+          o->hide();
+          Fl_Group::current()->resizable(o);
+        } // Fl_Box* o
+        w_settings_layout_tab->end();
+      } // Fl_Group* w_settings_layout_tab
+      { w_settings_shell_tab = new Fl_Group(10, 60, 320, 480, "Shell");
+        w_settings_shell_tab->image( image_shell_64() );
+        w_settings_shell_tab->image()->scale(36, 24, 0, 1);
+        w_settings_shell_tab->labelsize(11);
+        w_settings_shell_tab->callback((Fl_Callback*)propagate_load);
+        w_settings_shell_tab->hide();
+        { Fl_Group* o = new Fl_Group(10, 90, 320, 132);
+          o->callback((Fl_Callback*)propagate_load);
+          { w_settings_shell_list = new Fl_Browser(100, 90, 220, 110, "Shell\ncommand\nlist:");
+            w_settings_shell_list->type(3);
+            w_settings_shell_list->labelfont(1);
+            w_settings_shell_list->labelsize(11);
+            w_settings_shell_list->textsize(13);
+            w_settings_shell_list->callback((Fl_Callback*)cb_w_settings_shell_list);
+            w_settings_shell_list->align(Fl_Align(FL_ALIGN_LEFT));
+            Fl_Group::current()->resizable(w_settings_shell_list);
+          } // Fl_Browser* w_settings_shell_list
+          { w_settings_shell_toolbox = new Fl_Group(100, 200, 220, 22);
+            w_settings_shell_toolbox->callback((Fl_Callback*)cb_w_settings_shell_toolbox);
+            { Fl_Button* o = new Fl_Button(100, 200, 24, 22, "+");
+              o->tooltip("insert a new shell command into the list after the selected command");
+              o->labelfont(1);
+              o->labelsize(11);
+              o->callback((Fl_Callback*)cb_a);
+            } // Fl_Button* o
+            { w_settings_shell_dup = new Fl_Button(124, 200, 24, 22, "++");
+              w_settings_shell_dup->tooltip("duplicate the selected shell command and insert it into the list");
+              w_settings_shell_dup->labelfont(1);
+              w_settings_shell_dup->labelsize(11);
+              w_settings_shell_dup->callback((Fl_Callback*)cb_w_settings_shell_dup);
+              w_settings_shell_dup->deactivate();
+            } // Fl_Button* w_settings_shell_dup
+            { w_settings_shell_remove = new Fl_Button(148, 200, 24, 22, "DEL");
+              w_settings_shell_remove->tooltip("remove the selected shell command - this can not be undone");
+              w_settings_shell_remove->labelsize(10);
+              w_settings_shell_remove->callback((Fl_Callback*)cb_w_settings_shell_remove);
+              w_settings_shell_remove->deactivate();
+            } // Fl_Button* w_settings_shell_remove
+            { w_settings_shell_menu = new Fl_Menu_Button(172, 200, 24, 22);
+              w_settings_shell_menu->labelsize(11);
+              w_settings_shell_menu->textsize(11);
+              w_settings_shell_menu->menu(menu_w_settings_shell_menu);
+            } // Fl_Menu_Button* w_settings_shell_menu
+            { Fl_Box* o = new Fl_Box(253, 200, 13, 22);
+              o->hide();
+              Fl_Group::current()->resizable(o);
+            } // Fl_Box* o
+            { Fl_Button* o = new Fl_Button(246, 200, 24, 22, "T");
+              o->tooltip("show terminal window");
+              o->labelfont(5);
+              o->labelsize(11);
+              o->callback((Fl_Callback*)cb_T);
+            } // Fl_Button* o
+            { w_settings_shell_play = new Fl_Button(270, 200, 50, 22, "Run");
+              w_settings_shell_play->tooltip("run the selected shell command");
+              w_settings_shell_play->labelsize(11);
+              w_settings_shell_play->callback((Fl_Callback*)cb_w_settings_shell_play);
+              w_settings_shell_play->deactivate();
+            } // Fl_Button* w_settings_shell_play
+            w_settings_shell_toolbox->end();
+          } // Fl_Group* w_settings_shell_toolbox
+          o->end();
+        } // Fl_Group* o
+        { w_settings_shell_cmd = new Fl_Group(10, 235, 320, 291);
+          w_settings_shell_cmd->callback((Fl_Callback*)cb_w_settings_shell_cmd);
+          { Fl_Input* o = new Fl_Input(100, 246, 220, 20, "Name:");
+            o->tooltip("file the shell command under this name in the shell command list");
+            o->labelfont(1);
+            o->labelsize(11);
+            o->textfont(4);
+            o->textsize(11);
+            o->callback((Fl_Callback*)cb_Name);
+            o->when(FL_WHEN_RELEASE | FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY);
+          } // Fl_Input* o
+          { Fl_Input* o = new Fl_Input(100, 272, 220, 20, "Menu Label:");
+            o->tooltip("label text for the Shell menu in the main menu bar");
+            o->labelfont(1);
+            o->labelsize(11);
+            o->textfont(4);
+            o->textsize(11);
+            o->callback((Fl_Callback*)cb_Menu);
+          } // Fl_Input* o
+          { Fl_Group* o = new Fl_Group(100, 297, 140, 71);
+            o->callback((Fl_Callback*)cb_b);
+            { Fl_Shortcut_Button* o = new Fl_Shortcut_Button(100, 297, 130, 20, "Shortcut");
+              o->tooltip("an optional keyboard shortcut to run this shell command");
+              o->box(FL_UP_BOX);
+              o->color(FL_BACKGROUND_COLOR);
+              o->selection_color(FL_BACKGROUND_COLOR);
+              o->labeltype(FL_NORMAL_LABEL);
+              o->labelfont(0);
+              o->labelsize(11);
+              o->labelcolor(FL_FOREGROUND_COLOR);
+              o->callback((Fl_Callback*)cb_Shortcut);
+              o->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE));
+              o->when(FL_WHEN_RELEASE);
+            } // Fl_Shortcut_Button* o
+            { Fl_Choice* o = new Fl_Choice(100, 322, 130, 20, "Store:");
+              o->tooltip("store this shell command as a user setting or save it with the .fl project fi\
+le");
+              o->down_box(FL_BORDER_BOX);
+              o->labelfont(1);
+              o->labelsize(11);
+              o->textsize(11);
+              o->callback((Fl_Callback*)cb_Store);
+              o->menu(menu_Store);
+            } // Fl_Choice* o
+            { Fl_Choice* o = new Fl_Choice(100, 348, 130, 20, "Condition:");
+              o->tooltip("add this command to the main menu bar only if this condition is true");
+              o->down_box(FL_BORDER_BOX);
+              o->labelfont(1);
+              o->labelsize(11);
+              o->textsize(11);
+              o->callback((Fl_Callback*)cb_Condition);
+              o->menu(menu_Condition);
+            } // Fl_Choice* o
+            { Fl_Box* o = new Fl_Box(230, 297, 10, 71);
+              o->hide();
+              Fl_Group::current()->resizable(o);
+            } // Fl_Box* o
+            o->end();
+          } // Fl_Group* o
+          { Fl_Input* o = new Fl_Input(230, 348, 90, 20, "Label:");
+            o->labelfont(1);
+            o->labelsize(11);
+            o->textfont(4);
+            o->textsize(11);
+            o->callback((Fl_Callback*)cb_Label);
+            o->hide();
+          } // Fl_Input* o
+          { Fl_Group* o = new Fl_Group(100, 373, 220, 80);
+            o->callback((Fl_Callback*)propagate_load);
+            { Fl_Text_Editor* o = w_settings_shell_command = new Fl_Text_Editor(100, 373, 196, 80, "Shell script:");
+              w_settings_shell_command->labelfont(1);
+              w_settings_shell_command->labelsize(11);
+              w_settings_shell_command->textfont(4);
+              w_settings_shell_command->textsize(12);
+              w_settings_shell_command->callback((Fl_Callback*)cb_w_settings_shell_command);
+              w_settings_shell_command->align(Fl_Align(FL_ALIGN_LEFT));
+              Fl_Group::current()->resizable(w_settings_shell_command);
+              o->buffer(new Fl_Text_Buffer);
+            } // Fl_Text_Editor* w_settings_shell_command
+            { Fl_Group* o = new Fl_Group(296, 373, 24, 80);
+              { w_settings_shell_text_macros = new Fl_Menu_Button(296, 373, 24, 22);
+                w_settings_shell_text_macros->tooltip("a list of text replacements available for the shell script");
+                w_settings_shell_text_macros->labelsize(11);
+                w_settings_shell_text_macros->textsize(11);
+                w_settings_shell_text_macros->callback((Fl_Callback*)cb_w_settings_shell_text_macros);
+                w_settings_shell_text_macros->menu(menu_w_settings_shell_text_macros);
+              } // Fl_Menu_Button* w_settings_shell_text_macros
+              { Fl_Button* o = new Fl_Button(296, 395, 24, 22, "@+1fd_zoom");
+                o->tooltip("open the big code editor");
+                o->labelsize(11);
+                o->callback((Fl_Callback*)cb_1fd_zoom);
+              } // Fl_Button* o
+              { Fl_Box* o = new Fl_Box(296, 417, 24, 10);
+                o->hide();
+                Fl_Group::current()->resizable(o);
+              } // Fl_Box* o
+              o->end();
+            } // Fl_Group* o
+            o->end();
+            Fl_Group::current()->resizable(o);
+          } // Fl_Group* o
+          { Fl_Check_Button* o = new Fl_Check_Button(100, 458, 110, 20, "save .fl project file");
+            o->tooltip("save the project to the .fl file before running the command");
+            o->down_box(FL_DOWN_BOX);
+            o->labelsize(11);
+            o->callback((Fl_Callback*)cb_save);
+          } // Fl_Check_Button* o
+          { Fl_Check_Button* o = new Fl_Check_Button(100, 478, 110, 19, "save source code");
+            o->tooltip("generate the source code and header file before running the command");
+            o->down_box(FL_DOWN_BOX);
+            o->labelsize(11);
+            o->callback((Fl_Callback*)cb_save1);
+          } // Fl_Check_Button* o
+          { Fl_Check_Button* o = new Fl_Check_Button(100, 498, 110, 20, "save i18n strings");
+            o->tooltip("save the internationalisation strings before running the command");
+            o->down_box(FL_DOWN_BOX);
+            o->labelsize(11);
+            o->callback((Fl_Callback*)cb_save2);
+          } // Fl_Check_Button* o
+          { Fl_Check_Button* o = new Fl_Check_Button(214, 458, 106, 20, "show terminal");
+            o->tooltip("show the terminal window when launching this script");
+            o->down_box(FL_DOWN_BOX);
+            o->labelsize(11);
+            o->callback((Fl_Callback*)cb_show);
+          } // Fl_Check_Button* o
+          { Fl_Check_Button* o = new Fl_Check_Button(214, 478, 106, 19, "clear terminal");
+            o->tooltip("clear the teminal window before running this script");
+            o->down_box(FL_DOWN_BOX);
+            o->labelsize(11);
+            o->callback((Fl_Callback*)cb_clear);
+          } // Fl_Check_Button* o
+          { Fl_Check_Button* o = new Fl_Check_Button(214, 498, 106, 19, "clear term history");
+            o->tooltip("clear the teminal history in the terminal window");
+            o->down_box(FL_DOWN_BOX);
+            o->labelsize(11);
+            o->callback((Fl_Callback*)cb_clear1);
+          } // Fl_Check_Button* o
+          w_settings_shell_cmd->end();
+          Fl_Group::current()->resizable(w_settings_shell_cmd);
+        } // Fl_Group* w_settings_shell_cmd
+        { Fl_Box* o = w_settings_shell_fd_project = new Fl_Box(20, 70, 16, 15);
+          w_settings_shell_fd_project->bind_image( image_fd_project() );
+          w_settings_shell_fd_project->labelsize(11);
+          w_settings_shell_fd_project->hide();
+          w_settings_shell_fd_project->deactivate();
+          o->image()->scale(16, 16);
+        } // Fl_Box* w_settings_shell_fd_project
+        { Fl_Box* o = w_settings_shell_fd_user = new Fl_Box(20, 70, 16, 15);
+          w_settings_shell_fd_user->bind_image( image_fd_user() );
+          w_settings_shell_fd_user->labelsize(11);
+          w_settings_shell_fd_user->hide();
+          w_settings_shell_fd_user->deactivate();
+          o->image()->scale(16, 16);
+        } // Fl_Box* w_settings_shell_fd_user
+        w_settings_shell_tab->end();
+      } // Fl_Group* w_settings_shell_tab
+      { w_settings_i18n_tab = new Fl_Group(10, 60, 320, 480, "Locale");
+        w_settings_i18n_tab->image( image_language_64() );
+        w_settings_i18n_tab->image()->scale(36, 24, 0, 1);
+        w_settings_i18n_tab->labelsize(11);
+        w_settings_i18n_tab->callback((Fl_Callback*)cb_w_settings_i18n_tab);
+        w_settings_i18n_tab->hide();
+        { Fl_Group* o = new Fl_Group(100, 78, 170, 20);
+          o->callback((Fl_Callback*)propagate_load);
+          { i18n_type_chooser = new Fl_Choice(100, 78, 160, 20, "i18n Library:");
+            i18n_type_chooser->tooltip("Type of internationalization to use.");
+            i18n_type_chooser->box(FL_THIN_UP_BOX);
+            i18n_type_chooser->down_box(FL_BORDER_BOX);
+            i18n_type_chooser->labelsize(11);
+            i18n_type_chooser->textsize(11);
+            i18n_type_chooser->callback((Fl_Callback*)i18n_type_cb);
+            i18n_type_chooser->menu(menu_i18n_type_chooser);
+          } // Fl_Choice* i18n_type_chooser
+          { Fl_Box* o = new Fl_Box(260, 78, 10, 20);
+            o->hide();
+            Fl_Group::current()->resizable(o);
+          } // Fl_Box* o
+          o->end();
+        } // Fl_Group* o
+        { i18n_gnu_group = new Fl_Group(100, 103, 220, 95);
+          i18n_gnu_group->callback((Fl_Callback*)cb_i18n_gnu_group);
+          { i18n_gnu_include_input = new Fl_Input(100, 103, 220, 20, "#include:");
+            i18n_gnu_include_input->tooltip("The include file for internationalization.");
+            i18n_gnu_include_input->box(FL_THIN_DOWN_BOX);
+            i18n_gnu_include_input->labelsize(11);
+            i18n_gnu_include_input->textfont(4);
+            i18n_gnu_include_input->textsize(11);
+            i18n_gnu_include_input->callback((Fl_Callback*)cb_i18n_gnu_include_input);
+          } // Fl_Input* i18n_gnu_include_input
+          { i18n_gnu_conditional_input = new Fl_Input(100, 128, 220, 20, "Conditional:");
+            i18n_gnu_conditional_input->tooltip("only include the header file if this preprocessor macro is defined, for examp\
+le FLTK_GETTEXT_FOUND");
+            i18n_gnu_conditional_input->box(FL_THIN_DOWN_BOX);
+            i18n_gnu_conditional_input->labelsize(11);
+            i18n_gnu_conditional_input->textfont(4);
+            i18n_gnu_conditional_input->textsize(11);
+            i18n_gnu_conditional_input->callback((Fl_Callback*)cb_i18n_gnu_conditional_input);
+          } // Fl_Input* i18n_gnu_conditional_input
+          { i18n_gnu_function_input = new Fl_Input(100, 153, 220, 20, "Function:");
+            i18n_gnu_function_input->tooltip("The function to call to translate labels and tooltips, usually \"gettext\" or\
+ \"_\"");
+            i18n_gnu_function_input->box(FL_THIN_DOWN_BOX);
+            i18n_gnu_function_input->labelsize(11);
+            i18n_gnu_function_input->textfont(4);
+            i18n_gnu_function_input->textsize(11);
+            i18n_gnu_function_input->callback((Fl_Callback*)cb_i18n_gnu_function_input);
+          } // Fl_Input* i18n_gnu_function_input
+          { i18n_gnu_static_function_input = new Fl_Input(100, 178, 220, 20, "Static Function:");
+            i18n_gnu_static_function_input->tooltip("function to call to translate static text, The function to call to internatio\
+nalize labels and tooltips, usually \"gettext_noop\" or \"N_\"");
+            i18n_gnu_static_function_input->box(FL_THIN_DOWN_BOX);
+            i18n_gnu_static_function_input->labelsize(11);
+            i18n_gnu_static_function_input->textfont(4);
+            i18n_gnu_static_function_input->textsize(11);
+            i18n_gnu_static_function_input->callback((Fl_Callback*)cb_i18n_gnu_static_function_input);
+          } // Fl_Input* i18n_gnu_static_function_input
+          i18n_gnu_group->end();
+        } // Fl_Group* i18n_gnu_group
+        { i18n_posix_group = new Fl_Group(100, 103, 220, 95);
+          i18n_posix_group->callback((Fl_Callback*)cb_i18n_posix_group);
+          i18n_posix_group->hide();
+          { i18n_pos_include_input = new Fl_Input(100, 103, 220, 20, "#include:");
+            i18n_pos_include_input->tooltip("The include file for internationalization.");
+            i18n_pos_include_input->box(FL_THIN_DOWN_BOX);
+            i18n_pos_include_input->labelsize(11);
+            i18n_pos_include_input->textfont(4);
+            i18n_pos_include_input->textsize(11);
+            i18n_pos_include_input->callback((Fl_Callback*)cb_i18n_pos_include_input);
+          } // Fl_Input* i18n_pos_include_input
+          { i18n_pos_conditional_input = new Fl_Input(100, 128, 220, 20, "Conditional:");
+            i18n_pos_conditional_input->tooltip("only include the header file if this preprocessor macro is defined, for examp\
+le FLTK_GETTEXT_FOUND");
+            i18n_pos_conditional_input->box(FL_THIN_DOWN_BOX);
+            i18n_pos_conditional_input->labelsize(11);
+            i18n_pos_conditional_input->textfont(4);
+            i18n_pos_conditional_input->textsize(11);
+            i18n_pos_conditional_input->callback((Fl_Callback*)cb_i18n_pos_conditional_input);
+          } // Fl_Input* i18n_pos_conditional_input
+          { i18n_pos_file_input = new Fl_Input(100, 153, 220, 20, "Catalog:");
+            i18n_pos_file_input->tooltip("The name of the message catalog.");
+            i18n_pos_file_input->box(FL_THIN_DOWN_BOX);
+            i18n_pos_file_input->labelsize(11);
+            i18n_pos_file_input->textfont(4);
+            i18n_pos_file_input->textsize(11);
+            i18n_pos_file_input->callback((Fl_Callback*)cb_i18n_pos_file_input);
+          } // Fl_Input* i18n_pos_file_input
+          { Fl_Group* o = new Fl_Group(100, 178, 90, 20);
+            o->callback((Fl_Callback*)cb_c);
+            { i18n_pos_set_input = new Fl_Int_Input(100, 178, 80, 20, "Set:");
+              i18n_pos_set_input->tooltip("The message set number.");
+              i18n_pos_set_input->type(2);
+              i18n_pos_set_input->box(FL_THIN_DOWN_BOX);
+              i18n_pos_set_input->labelsize(11);
+              i18n_pos_set_input->textfont(4);
+              i18n_pos_set_input->textsize(11);
+              i18n_pos_set_input->callback((Fl_Callback*)cb_i18n_pos_set_input);
+            } // Fl_Int_Input* i18n_pos_set_input
+            { Fl_Box* o = new Fl_Box(180, 178, 10, 20);
+              o->hide();
+              Fl_Group::current()->resizable(o);
+            } // Fl_Box* o
+            o->end();
+          } // Fl_Group* o
+          i18n_posix_group->end();
+        } // Fl_Group* i18n_posix_group
+        { Fl_Box* o = new Fl_Box(100, 530, 220, 10);
+          o->hide();
+          Fl_Group::current()->resizable(o);
+        } // Fl_Box* o
+        w_settings_i18n_tab->end();
+      } // Fl_Group* w_settings_i18n_tab
+      { w_settings_user_tab = new Fl_Group(10, 60, 320, 480, "User");
+        w_settings_user_tab->image( image_user_circle_64() );
+        w_settings_user_tab->image()->scale(36, 24, 0, 1);
+        w_settings_user_tab->labelsize(11);
+        w_settings_user_tab->callback((Fl_Callback*)cb_w_settings_user_tab);
+        w_settings_user_tab->hide();
+        { Fl_Box* o = new Fl_Box(100, 84, 220, 20, "---- Widget Browser ----");
+          o->labelfont(1);
+          o->labelsize(11);
+          o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
+        } // Fl_Box* o
+        { Fl_Group* o = new Fl_Group(100, 112, 220, 20);
+          o->callback((Fl_Callback*)propagate_load);
+          { Fl_Choice* o = new Fl_Choice(100, 112, 151, 20, "Label:");
+            o->box(FL_THIN_UP_BOX);
+            o->down_box(FL_BORDER_BOX);
+            o->labelfont(1);
+            o->labelsize(11);
+            o->textsize(11);
+            o->callback((Fl_Callback*)cb_Comments, (void*)(&Widget_Browser::label_font));
+            Fl_Group::current()->resizable(o);
+            o->menu(fontmenu);
+          } // Fl_Choice* o
+          { Fl_Button* o = new Fl_Button(251, 112, 51, 20);
+            o->labelsize(11);
+            o->callback((Fl_Callback*)cb_Color_Chip, (void*)(&Widget_Browser::label_color));
+          } // Fl_Button* o
+          { Fl_Menu_Button* o = new Fl_Menu_Button(302, 112, 18, 20);
+            o->callback((Fl_Callback*)cb_Color_Choice, (void*)(&Widget_Browser::label_color));
+            o->menu(colormenu);
+          } // Fl_Menu_Button* o
+          o->end();
+        } // Fl_Group* o
+        { Fl_Group* o = new Fl_Group(100, 137, 220, 20);
+          o->callback((Fl_Callback*)propagate_load);
+          { Fl_Choice* o = new Fl_Choice(100, 137, 151, 20, "Class:");
+            o->box(FL_THIN_UP_BOX);
+            o->down_box(FL_BORDER_BOX);
+            o->labelfont(1);
+            o->labelsize(11);
+            o->textsize(11);
+            o->callback((Fl_Callback*)cb_Comments, (void*)(&Widget_Browser::class_font));
+            Fl_Group::current()->resizable(o);
+            o->menu(fontmenu);
+          } // Fl_Choice* o
+          { Fl_Button* o = new Fl_Button(251, 137, 51, 20);
+            o->labelsize(11);
+            o->callback((Fl_Callback*)cb_Color_Chip, (void*)(&Widget_Browser::class_color));
+          } // Fl_Button* o
+          { Fl_Menu_Button* o = new Fl_Menu_Button(302, 137, 18, 20);
+            o->callback((Fl_Callback*)cb_Color_Choice, (void*)(&Widget_Browser::class_color));
+            o->menu(colormenu);
+          } // Fl_Menu_Button* o
+          o->end();
+        } // Fl_Group* o
+        { Fl_Group* o = new Fl_Group(100, 162, 220, 20);
+          o->callback((Fl_Callback*)propagate_load);
+          { Fl_Choice* o = new Fl_Choice(100, 162, 151, 20, "Function:");
+            o->box(FL_THIN_UP_BOX);
+            o->down_box(FL_BORDER_BOX);
+            o->labelfont(1);
+            o->labelsize(11);
+            o->textsize(11);
+            o->callback((Fl_Callback*)cb_Comments, (void*)(&Widget_Browser::func_font));
+            Fl_Group::current()->resizable(o);
+            o->menu(fontmenu);
+          } // Fl_Choice* o
+          { Fl_Button* o = new Fl_Button(251, 162, 51, 20);
+            o->labelsize(11);
+            o->callback((Fl_Callback*)cb_Color_Chip, (void*)(&Widget_Browser::func_color));
+          } // Fl_Button* o
+          { Fl_Menu_Button* o = new Fl_Menu_Button(302, 162, 18, 20);
+            o->callback((Fl_Callback*)cb_Color_Choice, (void*)(&Widget_Browser::func_color));
+            o->menu(colormenu);
+          } // Fl_Menu_Button* o
+          o->end();
+        } // Fl_Group* o
+        { Fl_Group* o = new Fl_Group(100, 187, 220, 20);
+          o->callback((Fl_Callback*)propagate_load);
+          { Fl_Choice* o = new Fl_Choice(100, 187, 151, 20, "Name:");
+            o->box(FL_THIN_UP_BOX);
+            o->down_box(FL_BORDER_BOX);
+            o->labelfont(1);
+            o->labelsize(11);
+            o->textsize(11);
+            o->callback((Fl_Callback*)cb_Comments, (void*)(&Widget_Browser::name_font));
+            Fl_Group::current()->resizable(o);
+            o->menu(fontmenu);
+          } // Fl_Choice* o
+          { Fl_Button* o = new Fl_Button(251, 187, 51, 20);
+            o->labelsize(11);
+            o->callback((Fl_Callback*)cb_Color_Chip, (void*)(&Widget_Browser::name_color));
+          } // Fl_Button* o
+          { Fl_Menu_Button* o = new Fl_Menu_Button(302, 187, 18, 20);
+            o->callback((Fl_Callback*)cb_Color_Choice, (void*)(&Widget_Browser::name_color));
+            o->menu(colormenu);
+          } // Fl_Menu_Button* o
+          o->end();
+        } // Fl_Group* o
+        { Fl_Group* o = new Fl_Group(100, 212, 220, 20);
+          o->callback((Fl_Callback*)propagate_load);
+          { Fl_Choice* o = new Fl_Choice(100, 212, 151, 20, "Code:");
+            o->box(FL_THIN_UP_BOX);
+            o->down_box(FL_BORDER_BOX);
+            o->labelfont(1);
+            o->labelsize(11);
+            o->textsize(11);
+            o->callback((Fl_Callback*)cb_Comments, (void*)(&Widget_Browser::code_font));
+            Fl_Group::current()->resizable(o);
+            o->menu(fontmenu);
+          } // Fl_Choice* o
+          { Fl_Button* o = new Fl_Button(251, 212, 51, 20);
+            o->labelsize(11);
+            o->callback((Fl_Callback*)cb_Color_Chip, (void*)(&Widget_Browser::code_color));
+          } // Fl_Button* o
+          { Fl_Menu_Button* o = new Fl_Menu_Button(302, 212, 18, 20);
+            o->callback((Fl_Callback*)cb_Color_Choice, (void*)(&Widget_Browser::code_color));
+            o->menu(colormenu);
+          } // Fl_Menu_Button* o
+          o->end();
+        } // Fl_Group* o
+        { Fl_Group* o = new Fl_Group(100, 237, 220, 20);
+          o->callback((Fl_Callback*)propagate_load);
+          { Fl_Choice* o = w_settings_user_commenttext = new Fl_Choice(100, 237, 151, 20, "Comments:");
+            w_settings_user_commenttext->box(FL_THIN_UP_BOX);
+            w_settings_user_commenttext->down_box(FL_BORDER_BOX);
+            w_settings_user_commenttext->labelfont(1);
+            w_settings_user_commenttext->labelsize(11);
+            w_settings_user_commenttext->textsize(11);
+            w_settings_user_commenttext->callback((Fl_Callback*)cb_Comments, (void*)(&Widget_Browser::comment_font));
+            Fl_Group::current()->resizable(w_settings_user_commenttext);
+            o->menu(fontmenu);
+          } // Fl_Choice* w_settings_user_commenttext
+          { Fl_Button* o = new Fl_Button(251, 237, 51, 20);
+            o->labelsize(11);
+            o->callback((Fl_Callback*)cb_Color_Chip, (void*)(&Widget_Browser::comment_color));
+          } // Fl_Button* o
+          { Fl_Menu_Button* o = new Fl_Menu_Button(302, 237, 18, 20);
+            o->callback((Fl_Callback*)cb_Color_Choice, (void*)(&Widget_Browser::comment_color));
+            o->menu(colormenu);
+          } // Fl_Menu_Button* o
+          o->end();
+        } // Fl_Group* o
+        w_settings_user_tab->end();
+      } // Fl_Group* w_settings_user_tab
+      w_settings_tabs->end();
+      Fl_Group::current()->resizable(w_settings_tabs);
+    } // Fl_Tabs* w_settings_tabs
+    { Fl_Group* o = new Fl_Group(10, 550, 320, 20);
+      { Fl_Button* o = new Fl_Button(230, 550, 100, 20, "Close");
+        o->tooltip("Close this dialog.");
+        o->labelsize(11);
+        o->callback((Fl_Callback*)cb_Close);
+      } // Fl_Button* o
+      { Fl_Box* o = new Fl_Box(220, 550, 10, 20);
+        o->hide();
+        Fl_Group::current()->resizable(o);
+      } // Fl_Box* o
+      o->end();
+    } // Fl_Group* o
+    settings_window->size_range(340, 580);
+    settings_window->end();
+  } // Fl_Double_Window* settings_window
+  w_settings_tabs->do_callback(w_settings_tabs, LOAD);
+  return settings_window;
+}
+
+Fl_Double_Window *shell_run_window=(Fl_Double_Window *)0;
+
+Fl_Terminal *shell_run_terminal=(Fl_Terminal *)0;
+
+static void cb_Clear(Fl_Button*, void*) {
+  // clear screen, clear scrollback, home cursor
+  shell_run_terminal->append("\033[2J\033[3J\033[H");
+}
+
+Fl_Return_Button *shell_run_button=(Fl_Return_Button *)0;
+
+static void cb_shell_run_button(Fl_Return_Button*, void*) {
+  Fl_Preferences pos(fluid_prefs, "shell_run_Window_pos");
+  pos.set("x", shell_run_window->x());
+  pos.set("y", shell_run_window->y());
+  pos.set("w", shell_run_window->w());
+  pos.set("h", shell_run_window->h());
+  shell_run_window->hide();
+}
+
+Fl_Double_Window* make_shell_window() {
+  { shell_run_window = new Fl_Double_Window(555, 430, "Shell Command Output");
+    shell_run_window->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));
+    { shell_run_terminal = new Fl_Terminal(10, 10, 535, 375);
+      Fl_Group::current()->resizable(shell_run_terminal);
+      shell_run_terminal->ansi(1);
+      shell_run_terminal->history_lines(1000);
+    } // Fl_Terminal* shell_run_terminal
+    { Fl_Group* o = new Fl_Group(10, 395, 535, 25);
+      { Fl_Button* o = new Fl_Button(10, 395, 94, 25, "Clear");
+        o->callback((Fl_Callback*)cb_Clear);
+      } // Fl_Button* o
+      { Fl_Box* o = new Fl_Box(104, 395, 341, 25);
+        o->hide();
+        Fl_Group::current()->resizable(o);
+      } // Fl_Box* o
+      { shell_run_button = new Fl_Return_Button(445, 395, 100, 25, "Close");
+        shell_run_button->callback((Fl_Callback*)cb_shell_run_button);
+      } // Fl_Return_Button* shell_run_button
+      o->end();
+    } // Fl_Group* o
+    shell_run_window->end();
+  } // Fl_Double_Window* shell_run_window
+  return shell_run_window;
+}
+Fl_Menu_Item *w_layout_menu_storage[4];
diff --git fluid/settings_panel.fl fluid/settings_panel.fl
new file mode 100644
index 0000000..ed5a2d7
--- /dev/null
+++ fluid/settings_panel.fl
@@ -0,0 +1,1879 @@
+# data file for the Fltk User Interface Designer (fluid)
+version 1.0400
+header_name {.h}
+code_name {.cxx}
+snap {
+  ver 1
+  current_suite {FLUID (based on FLTK)}
+  current_preset 0
+  suite {
+    name {FLUID (based on FLTK)}
+    preset { 1
+      15 15 15 15 0 0
+      10 10 10 10 0 0
+      25 25
+      20 10 4 20 4 8
+      0 14 0 14
+    }
+    preset { 1
+      10 10 10 10 0 0
+      10 10 10 10 0 0
+      20 20
+      20 10 5 20 5 5
+      0 11 0 11
+    }
+    preset { 1
+      10 10 10 10 0 0
+      10 10 10 10 0 0
+      18 18
+      16 8 2 16 4 2
+      0 10 0 10
+    }
+  }
+}
+comment {//
+// Setting and shell dialogs for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2023 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
+//
+// Please see the following page on how to report bugs and issues:
+//
+//     https://www.fltk.org/bugs.php
+//
+} {in_source in_header
+}
+
+decl {\#include "fluid.h"} {public global
+}
+
+decl {\#include "undo.h"} {private global
+}
+
+decl {\#include "widget_browser.h"} {public global
+}
+
+decl {\#include "Fd_Snap_Action.h"} {public global
+}
+
+decl {\#include "shell_command.h"} {public global
+}
+
+decl {\#include <FL/Fl_Text_Buffer.H>} {public local
+}
+
+decl {\#include <FL/Fl_Text_Display.H>} {public local
+}
+
+decl {\#include "fluid_filename.h"} {public local
+}
+
+decl {\#include <FL/fl_string_functions.h>} {public local
+}
+
+decl {\#include <FL/Fl_Scheme_Choice.H>} {public local
+}
+
+decl {\#include <FL/Fl_Preferences.H>} {private global
+}
+
+decl {\#include <FL/Fl_Tooltip.H>} {selected private global
+}
+
+decl {\#include <FL/fl_ask.H>} {private global
+}
+
+decl {\#include <string.h>} {private global
+}
+
+decl {\#include "../src/flstring.h"} {private global
+}
+
+decl {void init_scheme(void);} {
+  comment {// initialize the scheme from preferences} public global
+}
+
+decl {extern struct Fl_Menu_Item *dbmanager_item;} {public local
+}
+
+decl {extern void i18n_cb(Fl_Choice *,void *);} {public local
+}
+
+decl {void scheme_cb(Fl_Scheme_Choice *, void *);} {public local
+}
+
+decl {int w_settings_shell_list_selected;} {public local
+}
+
+Function {cb_Comments(Fl_Choice* o, void* v)} {open private return_type void
+} {
+  code {Fl_Font *font = (Fl_Font*)o->user_data();
+if (v == LOAD) {
+  o->value(*font);
+} else {
+  *font = (int)o->value();
+  widget_browser->redraw();
+  widget_browser->save_prefs();
+}} {}
+}
+
+Function {cb_Color_Chip(Fl_Button* o, void* v)} {open private return_type void
+} {
+  code {Fl_Color *color = (Fl_Color*)o->user_data();
+if (v == LOAD) {
+  o->color(*color);
+  o->redraw();
+} else {
+  Fl_Color d = fl_show_colormap(*color);
+  *color = d;
+  o->color(d);
+  widget_browser->redraw();
+  widget_browser->save_prefs();
+}} {}
+}
+
+Function {cb_Color_Choice(Fl_Menu_Button* o, void* v)} {open private return_type void
+} {
+  code {if (v != LOAD) {
+  Fl_Color *color = (Fl_Color*)o->user_data();
+  Fl_Color d = (Fl_Color)(o->mvalue()->argument());
+  *color = d;
+  o->parent()->do_callback(o->parent(), LOAD);
+  widget_browser->redraw();
+  widget_browser->save_prefs();
+}} {}
+}
+
+Function {make_script_panel()} {open
+} {
+  Fl_Window script_panel {
+    label {Shell Script Editor}
+    callback {if (Fl::event()==FL_SHORTCUT && Fl::event_key()==FL_Escape)
+  return; // ignore Escape
+script_panel->hide(); // otherwise hide..} open
+    xywh {764 319 540 180} type Double labelsize 11 resizable
+    code0 {o->size_range(200, 150);} modal visible
+  } {
+    Fl_Text_Editor script_input {
+      xywh {10 10 520 130} box DOWN_BOX labelsize 11 when 13 textfont 4 textsize 11 resizable
+      code0 {script_input->buffer(new Fl_Text_Buffer);}
+    }
+    Fl_Group {} {
+      callback propagate_load open
+      xywh {10 150 520 20} labelsize 11
+    } {
+      Fl_Return_Button script_panel_ok {
+        label OK
+        xywh {400 150 60 20} labelsize 11 hotspot
+      }
+      Fl_Button script_panel_cancel {
+        label Cancel
+        xywh {470 150 60 20} labelsize 11
+      }
+      Fl_Box {} {
+        xywh {10 150 380 20} labelsize 11 resizable
+      }
+    }
+  }
+  code {// Enable line numbers
+script_input->linenumber_width(60);
+script_input->linenumber_size(script_input->Fl_Text_Display::textsize());} {}
+}
+
+Function {make_settings_window()} {open
+} {
+  Fl_Window settings_window {
+    label {FLUID Settings} open
+    xywh {392 362 340 580} type Double align 80 resizable size_range {340 580 0 0} visible
+  } {
+    Fl_Tabs w_settings_tabs {
+      callback {propagate_load(o, v);} open
+      xywh {10 10 320 530} selection_color 12 labelsize 11 labelcolor 255 resizable
+    } {
+      Fl_Group w_settings_general_tab {
+        label General open
+        scale_image {36 24} image {icons/general_64.png} compress_image 1 xywh {10 60 320 480} labelsize 11 resizable
+      } {
+        Fl_Group {} {
+          callback {propagate_load(o, v);} open
+          xywh {120 78 130 25}
+        } {
+          Fl_Choice scheme_choice {
+            label {Scheme: }
+            callback scheme_cb open
+            xywh {120 78 120 25} down_box BORDER_BOX labelfont 1 labelsize 11
+            code0 {init_scheme();}
+            class Fl_Scheme_Choice
+          } {}
+          Fl_Box {} {
+            xywh {240 78 10 25} hide resizable
+          }
+        }
+        Fl_Box {} {
+          label {Options: }
+          xywh {120 115 0 20} labelfont 1 labelsize 11 align 4
+        }
+        Fl_Check_Button tooltips_button {
+          label {Show Tooltips}
+          callback {Fl_Tooltip::enable(tooltips_button->value());
+fluid_prefs.set("show_tooltips", tooltips_button->value());}
+          xywh {120 115 200 20} down_box DOWN_BOX labelsize 11
+          code0 {int b;}
+          code1 {fluid_prefs.get("show_tooltips", b, 1);}
+          code2 {tooltips_button->value(b);}
+          code3 {Fl_Tooltip::enable(b);}
+        }
+        Fl_Check_Button completion_button {
+          label {Show Completion Dialogs}
+          callback {fluid_prefs.set("show_completion_dialogs", completion_button->value());}
+          xywh {120 135 200 20} down_box DOWN_BOX labelsize 11
+          code0 {int b;}
+          code1 {fluid_prefs.get("show_completion_dialogs", b, 1);}
+          code2 {completion_button->value(b);}
+        }
+        Fl_Check_Button openlast_button {
+          label {Open Previous File on Startup}
+          callback {fluid_prefs.set("open_previous_file", openlast_button->value());}
+          xywh {120 155 200 20} down_box DOWN_BOX labelsize 11
+          code0 {int b;}
+          code1 {fluid_prefs.get("open_previous_file", b, 0);}
+          code2 {openlast_button->value(b);}
+        }
+        Fl_Check_Button prevpos_button {
+          label {Remember Window Positions}
+          callback {fluid_prefs.set("prev_window_pos", prevpos_button->value());}
+          xywh {120 175 200 20} down_box DOWN_BOX labelsize 11
+          code0 {int b;}
+          code1 {fluid_prefs.get("prev_window_pos", b, 1);}
+          code2 {prevpos_button->value(b);}
+        }
+        Fl_Check_Button show_comments_button {
+          label {Show Comments in Browser}
+          callback {show_comments = show_comments_button->value();
+fluid_prefs.set("show_comments", show_comments);
+redraw_browser();}
+          xywh {120 195 200 20} down_box DOWN_BOX labelsize 11
+          code1 {fluid_prefs.get("show_comments", show_comments, 1);}
+          code2 {show_comments_button->value(show_comments);}
+        }
+        Fl_Group {} {
+          callback {propagate_load(o, v);} open
+          xywh {120 225 50 20}
+        } {
+          Fl_Spinner recent_spinner {
+            label {\# Recent Files:}
+            callback {fluid_prefs.set("recent_files", recent_spinner->value());
+load_history();}
+            xywh {120 225 40 20} labelfont 1 labelsize 11 when 1 maximum 10 textsize 11
+            code0 {int c;}
+            code1 {fluid_prefs.get("recent_files", c, 5);}
+            code2 {recent_spinner->maximum(10);}
+            code3 {recent_spinner->value(c);}
+          }
+          Fl_Box {} {
+            xywh {160 225 10 20} hide resizable
+          }
+        }
+        Fl_Check_Button use_external_editor_button {
+          label {Use for Code Nodes}
+          callback {G_use_external_editor = use_external_editor_button->value();
+fluid_prefs.set("use_external_editor", G_use_external_editor);
+redraw_browser();}
+          xywh {120 275 200 20} down_box DOWN_BOX labelsize 11
+          code1 {fluid_prefs.get("use_external_editor", G_use_external_editor, 0);}
+          code2 {use_external_editor_button->value(G_use_external_editor);}
+        }
+        Fl_Input editor_command_input {
+          label {External Editor:}
+          callback {strncpy(G_external_editor_command, editor_command_input->value(), sizeof(G_external_editor_command)-1);
+G_external_editor_command[sizeof(G_external_editor_command)-1] = 0;
+fluid_prefs.set("external_editor_command", G_external_editor_command);
+redraw_browser();}
+          tooltip {The editor command to open your external text editor.
+Include any necessary flags to ensure your editor does not background itself.
+Examples:
+    gvim -f
+    gedit
+ emacs} xywh {120 255 200 20} labelfont 1 labelsize 11 when 1 textfont 4 textsize 11
+          code1 {fluid_prefs.get("external_editor_command", G_external_editor_command, "", sizeof(G_external_editor_command)-1);}
+          code2 {editor_command_input->value(G_external_editor_command);}
+        }
+        Fl_Box {} {
+          label {Overlays: }
+          xywh {120 300 0 20} labelfont 1 labelsize 11 align 4
+        }
+        Fl_Check_Button guides_button {
+          label {Show Positioning Guides}
+          callback toggle_guides_cb
+          tooltip {show guides that help to position and resize widgets and enable snapping} xywh {120 300 200 20} down_box DOWN_BOX labelsize 11
+          code0 {o->value(show_guides);}
+        }
+        Fl_Check_Button restricted_button {
+          label {Show Restricted Areas}
+          callback toggle_restricted_cb
+          tooltip {show overlapping and out of bounds areas, show unfilled areas in Fl_Pack groups} xywh {120 320 200 20} down_box DOWN_BOX labelsize 11
+          code0 {o->value(show_restricted);}
+        }
+        Fl_Check_Button ghosted_outline_button {
+          label {Show Ghosted Group Outlines}
+          callback toggle_ghosted_outline_cb
+          tooltip {groups with no box type or flat boxtypes without contrast will be rendered with a dim outline in the editing window only} xywh {120 340 200 20} down_box DOWN_BOX labelsize 11
+          code0 {o->value(show_ghosted_outline);}
+        }
+        Fl_Box {} {
+          xywh {120 530 200 10} hide resizable
+        }
+      }
+      Fl_Group w_settings_project_tab {
+        label Project
+        callback {propagate_load(o, v);} open
+        scale_image {36 24} image {icons/document_64.png} compress_image 1 xywh {10 60 320 480} labelsize 11 hide
+      } {
+        Fl_Group {} {open
+          xywh {100 78 220 30}
+        } {
+          Fl_Box {} {
+            label {Use "name.ext" to set a file name
+or just ".ext" to set extension.}
+            xywh {100 78 210 30} labelsize 11 align 148
+          }
+          Fl_Box {} {
+            xywh {310 78 10 30} hide resizable
+          }
+        }
+        Fl_Input header_file_input {
+          label {Header File:}
+          user_data 1 user_data_type {void*}
+          callback {if (v == LOAD) {
+  o->value(g_project.header_file_name.c_str());
+} else {
+  if (strcmp(g_project.header_file_name.c_str(), o->value())) {
+    g_project.header_file_name = o->value();
+    set_modflag(1);
+  }
+}}
+          tooltip {The name of the generated header file.} xywh {100 112 220 20} box THIN_DOWN_BOX labelfont 1 labelsize 11 when 1 textfont 4 textsize 11
+        }
+        Fl_Input code_file_input {
+          label {Code File:}
+          user_data 1 user_data_type {void*}
+          callback {if (v == LOAD) {
+  o->value(g_project.code_file_name.c_str());
+} else {
+  if (strcmp(g_project.code_file_name.c_str(), o->value())) {
+    g_project.code_file_name = o->value();
+    set_modflag(1);
+  }
+}}
+          tooltip {The name of the generated code file.} xywh {100 137 220 20} box THIN_DOWN_BOX labelfont 1 labelsize 11 when 1 textfont 4 textsize 11
+        }
+        Fl_Check_Button include_H_from_C_button {
+          label {Include Header from Code}
+          callback {if (v == LOAD) {
+  o->value(g_project.include_H_from_C);
+} else {
+  if (g_project.include_H_from_C != o->value()) {
+    set_modflag(1);
+    g_project.include_H_from_C = o->value();
+  }
+}}
+          tooltip {Include the header file from the code file.} xywh {100 162 220 20} down_box DOWN_BOX labelsize 11
+        }
+        Fl_Box {} {
+          label {Options: }
+          xywh {100 205 0 20} labelfont 1 labelsize 11 align 4
+        }
+        Fl_Check_Button use_FL_COMMAND_button {
+          label {Menu shortcuts use FL_COMMAND}
+          callback {if (v == LOAD) {
+  o->value(g_project.use_FL_COMMAND);
+} else {
+  if (g_project.use_FL_COMMAND != o->value()) {
+    set_modflag(1);
+    g_project.use_FL_COMMAND = o->value();
+  }
+}}
+          tooltip {Replace FL_CTRL and FL_META with FL_COMMAND when generating menu shortcuts} xywh {100 205 220 20} down_box DOWN_BOX labelsize 11
+        }
+        Fl_Check_Button utf8_in_src_button {
+          label {allow Unicode UTF-8 in source code}
+          callback {if (v == LOAD) {
+  o->value(g_project.utf8_in_src);
+} else {
+  if (g_project.utf8_in_src != o->value()) {
+    set_modflag(1);
+    g_project.utf8_in_src = o->value();
+  }
+}}
+          tooltip {For older compilers, characters outside of the printable ASCII range are escaped using octal notation `\\0123`. If this option is checked, Fluid will write UTF-8 characters unchanged.} xywh {100 230 220 20} down_box DOWN_BOX labelsize 11
+        }
+        Fl_Check_Button avoid_early_includes_button {
+          label {avoid early include of Fl.H}
+          callback {if (v == LOAD) {
+  o->value(g_project.avoid_early_includes);
+} else {
+  if (g_project.avoid_early_includes != o->value()) {
+    set_modflag(1);
+    g_project.avoid_early_includes = o->value();
+  }
+}}
+          tooltip {Do not emit \#include <FL//Fl.H> until it is needed by another include file.} xywh {100 255 220 20} down_box DOWN_BOX labelsize 11
+        }
+        Fl_Box {} {
+          label {Experimental: }
+          xywh {100 283 0 20} labelfont 1 labelsize 11 align 4 hide
+        }
+        Fl_Check_Button w_proj_mergeback {
+          label {generate MergeBack data}
+          callback {if (v == LOAD) {
+  o->value(g_project.write_mergeback_data);
+} else {
+  if (g_project.write_mergeback_data != o->value()) {
+    set_modflag(1);
+    g_project.write_mergeback_data = o->value();
+  }
+}}
+          comment {// Matt: disabled}
+          tooltip {MergeBack is a feature under construction that allows changes in code files to be merged back into the project file. Checking this option will generate additional data in code and project files.} xywh {100 283 220 20} down_box DOWN_BOX labelsize 11 hide
+        }
+        Fl_Box {} {
+          xywh {100 530 220 10} hide resizable
+        }
+      }
+      Fl_Group w_settings_layout_tab {
+        label Layout
+        callback {propagate_load(o, v);} open
+        scale_image {36 24} image {icons/layout_64.png} compress_image 1 xywh {10 60 320 480} labelsize 11 hide
+      } {
+        Fl_Box {} {
+          label {Layout:}
+          xywh {25 78 60 24} labelfont 1 labelsize 11 align 24
+        }
+        Fl_Choice layout_choice {
+          callback {if (v == LOAD) {
+    o->value(g_layout_list.current_suite());
+  } else {
+    int index = o->value();
+    g_layout_list.current_suite(index);
+    g_layout_list.update_dialogs();
+  }}
+          xywh {85 78 187 24} down_box BORDER_BOX
+        } {
+          MenuItem {} {
+            label FLTK
+            xywh {0 0 31 20}
+          }
+          MenuItem {} {
+            label Grid
+            xywh {0 0 31 20}
+          }
+        }
+        Fl_Button {} {
+          label {+}
+          callback {// Clone the current layout suite
+
+if (v == LOAD) return;
+
+Fl_String old_name = "Copy of ";
+old_name.append(g_layout_list[g_layout_list.current_suite()].name_);
+const char *new_name = fl_input("Enter a name for the new layout:", old_name.c_str());
+if (new_name == NULL)
+  return;
+
+g_layout_list.add(new_name);
+g_layout_list.update_dialogs();}
+          xywh {272 78 24 24}
+        }
+        Fl_Menu_Button w_layout_menu {
+          callback {if (v == LOAD) {
+  Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
+  if (suite.storage_ == FD_STORE_INTERNAL) {
+    w_layout_menu_rename->deactivate();
+    for (int i=1; i<4; i++) w_layout_menu_storage[i]->deactivate();
+    w_layout_menu_delete->deactivate();
+  } else {
+    w_layout_menu_rename->activate();
+    for (int i=1; i<4; i++) w_layout_menu_storage[i]->activate();
+    w_layout_menu_delete->activate();
+  }
+  w_layout_menu_storage[suite.storage_]->setonly();
+}} open
+          xywh {296 78 24 24}
+        } {
+          MenuItem w_layout_menu_rename {
+            label {Rename...}
+            callback {// Rename the current layout suite
+
+Fl_String old_name = g_layout_list[g_layout_list.current_suite()].name_;
+const char *new_name = fl_input("Enter a new name for the layout:", old_name.c_str());
+if (new_name == NULL)
+  return;
+
+g_layout_list.rename(new_name);
+g_layout_list.update_dialogs();}
+            xywh {0 0 31 20} divider
+          }
+          MenuItem {w_layout_menu_storage[0]} {
+            label {@fd_beaker  FLUID Built-In}
+            callback {Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
+suite.storage(FD_STORE_INTERNAL);
+g_layout_list.update_dialogs();}
+            xywh {0 0 31 20} type Radio deactivate
+          }
+          MenuItem {w_layout_menu_storage[1]} {
+            label {@fd_user  User Preference}
+            callback {Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
+suite.storage(FD_STORE_USER);
+g_layout_list.update_dialogs();}
+            xywh {0 0 31 20} type Radio
+          }
+          MenuItem {w_layout_menu_storage[2]} {
+            label {@fd_project  Store in .fl Project File}
+            callback {Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
+suite.storage(FD_STORE_PROJECT);
+g_layout_list.update_dialogs();}
+            xywh {0 0 31 20} type Radio
+          }
+          MenuItem {w_layout_menu_storage[3]} {
+            label {@fd_file  Store in External File}
+            callback {Fd_Layout_Suite &suite = g_layout_list[g_layout_list.current_suite()];
+suite.storage(FD_STORE_FILE);
+g_layout_list.update_dialogs();}
+            xywh {0 0 31 20} type Radio divider
+          }
+          MenuItem w_layout_menu_load {
+            label {Load...}
+            callback {// Give the user a file chooser and load that file
+Fl_Native_File_Chooser fnfc;
+fnfc.title("Load Layout Settings:");
+fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE);
+fnfc.options(Fl_Native_File_Chooser::USE_FILTER_EXT);
+fnfc.filter("FLUID Layouts\\t*.fll\\n");
+if (fnfc.show() != 0) return;
+const char *new_filename = fnfc.filename();
+if (!new_filename) return;
+g_layout_list.load(new_filename);
+//g_layout_list.current_suite(n);
+g_layout_list.update_dialogs();}
+            xywh {0 0 31 20}
+          }
+          MenuItem w_layout_menu_save {
+            label {Save...}
+            callback {// Give the user a file chooser with a suggested name
+  Fl_Native_File_Chooser fnfc;
+  fnfc.title("Save Layout Settings:");
+  fnfc.type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE);
+  fnfc.options(Fl_Native_File_Chooser::SAVEAS_CONFIRM | Fl_Native_File_Chooser::USE_FILTER_EXT);
+  fnfc.filter("FLUID Layouts\\t*.fll\\n");
+  Fl_String filename = g_layout_list.filename_;
+  fnfc.directory(fl_filename_path(filename).c_str());
+  fnfc.preset_file(fl_filename_name(filename).c_str());
+  if (fnfc.show() != 0) return;
+  const char *new_filename = fnfc.filename();
+  if (!new_filename) return;
+  g_layout_list.filename_ = new_filename;
+  g_layout_list.save(new_filename);}
+            xywh {0 0 31 20} divider
+            code0 {\#include <FL/Fl_Native_File_Chooser.H>}
+          }
+          MenuItem w_layout_menu_delete {
+            label Delete
+            callback {// remove the current suite
+
+g_layout_list.remove(g_layout_list.current_suite());
+g_layout_list.update_dialogs();}
+            xywh {0 0 31 20}
+          }
+        }
+        Fl_Box {} {
+          label {Preset:}
+          xywh {25 107 60 20} labelfont 1 labelsize 11 align 24
+        }
+        Fl_Group {} {
+          callback propagate_load open
+          xywh {85 107 235 20} labelsize 11
+        } {
+          Fl_Button {preset_choice[0]} {
+            label Application
+            user_data 0 user_data_type long
+            callback edit_layout_preset_cb
+            xywh {85 107 78 20} type Radio value 1 selection_color 45 labelsize 11 compact 1
+          }
+          Fl_Button {preset_choice[1]} {
+            label Dialog
+            user_data 1 user_data_type long
+            callback edit_layout_preset_cb
+            xywh {163 107 79 20} type Radio selection_color 45 labelsize 11 compact 1
+          }
+          Fl_Button {preset_choice[2]} {
+            label Toolbox
+            user_data 2 user_data_type long
+            callback edit_layout_preset_cb
+            xywh {242 107 78 20} type Radio selection_color 45 labelsize 11 compact 1
+          }
+        }
+        Fl_Box {} {
+          label {---- Window ----}
+          xywh {85 132 235 20} labelfont 1 labelsize 11 align 20
+        }
+        Fl_Box {} {
+          label {Margins:}
+          xywh {25 167 60 20} labelsize 11 align 24
+        }
+        Fl_Value_Input {} {
+          label {Left:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->left_window_margin);
+} else {
+  layout->left_window_margin = (int)o->value();
+}}
+          xywh {85 167 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Value_Input {} {
+          label {Top:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->top_window_margin);
+} else {
+  layout->top_window_margin = (int)o->value();
+}}
+          xywh {145 167 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Value_Input {} {
+          label {Right:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->right_window_margin);
+} else {
+  layout->right_window_margin = (int)o->value();
+}}
+          xywh {205 167 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Value_Input {} {
+          label {Bottom:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->bottom_window_margin);
+} else {
+  layout->bottom_window_margin = (int)o->value();
+}}
+          xywh {265 167 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Box {} {
+          label {Grid:}
+          xywh {32 201 53 20} labelsize 11 align 24
+        }
+        Fl_Value_Input {} {
+          label {Horizontal:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->window_grid_x);
+} else {
+  layout->window_grid_x = (int)o->value();
+}}
+          xywh {85 201 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Value_Input {} {
+          label {Vertical:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->window_grid_y);
+} else {
+  layout->window_grid_y = (int)o->value();
+}}
+          xywh {145 201 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Box {} {
+          label {---- Group ----}
+          xywh {85 226 235 20} labelfont 1 labelsize 11 align 20
+        }
+        Fl_Box {} {
+          label {Margins:}
+          xywh {25 261 60 20} labelsize 11 align 24
+        }
+        Fl_Value_Input {} {
+          label {Left:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->left_group_margin);
+} else {
+  layout->left_group_margin = (int)o->value();
+}}
+          xywh {85 261 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Value_Input {} {
+          label {Top:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->top_group_margin);
+} else {
+  layout->top_group_margin = (int)o->value();
+}}
+          xywh {145 261 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Value_Input {} {
+          label {Right:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->right_group_margin);
+} else {
+  layout->right_group_margin = (int)o->value();
+}}
+          xywh {205 261 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Value_Input {} {
+          label {Bottom:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->bottom_group_margin);
+} else {
+  layout->bottom_group_margin = (int)o->value();
+}}
+          xywh {265 261 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Box {} {
+          label {Grid:}
+          xywh {32 295 53 20} labelsize 11 align 24
+        }
+        Fl_Value_Input {} {
+          label {Horizontal:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->group_grid_x);
+} else {
+  layout->group_grid_x = (int)o->value();
+}}
+          xywh {85 295 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Value_Input {} {
+          label {Vertical:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->group_grid_y);
+} else {
+  layout->group_grid_y = (int)o->value();
+}}
+          xywh {145 295 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Box {} {
+          label {---- Tabs ----}
+          xywh {85 320 235 20} labelfont 1 labelsize 11 align 20
+        }
+        Fl_Box {} {
+          label {Margins:}
+          xywh {25 355 60 20} labelsize 11 align 24
+        }
+        Fl_Value_Input {} {
+          label {Top:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->top_tabs_margin);
+} else {
+  layout->top_tabs_margin = (int)o->value();
+}}
+          xywh {85 355 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Value_Input {} {
+          label {Bottom:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->bottom_tabs_margin);
+} else {
+  layout->bottom_tabs_margin = (int)o->value();
+}}
+          xywh {145 355 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Box {} {
+          label {---- Widget ----}
+          xywh {85 380 235 20} labelfont 1 labelsize 11 align 20
+        }
+        Fl_Box {} {
+          label {Horizontal:}
+          xywh {25 415 60 20} labelsize 11 align 24
+        }
+        Fl_Value_Input {} {
+          label {Minimum:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->widget_min_w);
+} else {
+  layout->widget_min_w = (int)o->value();
+}}
+          xywh {85 414 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Value_Input {} {
+          label {Increment:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->widget_inc_w);
+} else {
+  layout->widget_inc_w = (int)o->value();
+}}
+          xywh {145 414 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Value_Input {} {
+          label {Gap:}
+          callback {if (v == LOAD) {
+  o->value((double)layout->widget_gap_x);
+} else {
+  layout->widget_gap_x = (int)o->value();
+}}
+          xywh {205 414 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Box {} {
+          label {Vertical:}
+          xywh {32 440 53 20} labelsize 11 align 24
+        }
+        Fl_Value_Input {} {
+          callback {if (v == LOAD) {
+  o->value((double)layout->widget_min_h);
+} else {
+  layout->widget_min_h = (int)o->value();
+}}
+          xywh {85 440 55 20} labelsize 11 maximum 32767 step 1 textsize 11
+        }
+        Fl_Value_Input {} {
+          callback {if (v == LOAD) {
+  o->value((double)layout->widget_inc_h);
+} else {
+  layout->widget_inc_h = (int)o->value();
+}}
+          xywh {145 440 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Value_Input {} {
+          callback {if (v == LOAD) {
+  o->value((double)layout->widget_gap_y);
+} else {
+  layout->widget_gap_y = (int)o->value();
+}}
+          xywh {205 440 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 11
+        }
+        Fl_Group {} {
+          label {Label Font:}
+          callback propagate_load open
+          xywh {85 465 201 20} labelsize 11 align 4
+        } {
+          Fl_Choice {} {
+            callback {if (v == LOAD) {
+  o->value(layout->labelfont+1);
+} else {
+  layout->labelfont = (int)o->value()-1;
+}} open
+            tooltip {The style of the label text.} xywh {85 465 150 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
+            code0 {extern Fl_Menu_Item fontmenu_w_default[];}
+            code1 {o->menu(fontmenu_w_default);}
+          } {}
+          Fl_Value_Input {} {
+            callback {if (v == LOAD) {
+  o->value(layout->labelsize);
+} else {
+  layout->labelsize = (int)o->value();
+}}
+            tooltip {The size of the label text.} xywh {235 465 50 20} labelsize 11 minimum 1 maximum 1000 step 1 value 14 textsize 11
+          }
+        }
+        Fl_Group {} {
+          label {Text Font:}
+          callback propagate_load open
+          xywh {85 490 200 20} labelsize 11 align 4
+        } {
+          Fl_Choice {} {
+            callback {if (v == LOAD) {
+  o->value(layout->textfont+1);
+} else {
+  layout->textfont = (int)o->value()-1;
+}} open
+            tooltip {The value text style.} xywh {85 490 150 20} box DOWN_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11
+            code0 {extern Fl_Menu_Item fontmenu_w_default[];}
+            code1 {o->menu(fontmenu_w_default);}
+          } {}
+          Fl_Value_Input {} {
+            callback {if (v == LOAD) {
+  o->value(layout->textsize);
+} else {
+  layout->textsize = (int)o->value();
+}}
+            tooltip {The value text size.} xywh {235 490 50 20} labelsize 11 maximum 1000 step 1 value 14 textsize 11
+          }
+        }
+        Fl_Box {} {
+          xywh {325 535 5 5} hide resizable
+        }
+      }
+      Fl_Group w_settings_shell_tab {
+        label Shell
+        callback propagate_load open
+        scale_image {36 24} image {icons/shell_64.png} compress_image 1 xywh {10 60 320 480} labelsize 11 hide
+      } {
+        Fl_Group {} {
+          callback propagate_load open
+          xywh {10 90 320 132}
+        } {
+          Fl_Browser w_settings_shell_list {
+            label {Shell
+command
+list:}
+            callback {if (v == LOAD) {
+  // load from g_shell_config
+  if (g_shell_config) {
+    o->clear();
+    w_settings_shell_list_selected = 0;
+    for (int i=0; i<g_shell_config->list_size; i++) {
+      Fd_Shell_Command *cmd = g_shell_config->list[i];
+      o->add(cmd->name.c_str());
+      if (cmd->storage == FD_STORE_USER)
+        o->icon(i+1, w_settings_shell_fd_user->image());
+      else if (cmd->storage == FD_STORE_PROJECT)
+        o->icon(i+1, w_settings_shell_fd_project->image());
+    }
+  }
+} else {
+//  int prev_selected = w_settings_shell_list_selected;
+  w_settings_shell_list_selected = 0;
+  int selected = w_settings_shell_list->value();
+  if (selected) {
+    if (w_settings_shell_list->selected(selected))
+      w_settings_shell_list_selected = selected;
+  }
+  w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
+  w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
+}}
+            xywh {100 90 220 110} type Multi labelfont 1 labelsize 11 align 4 textsize 13 resizable
+          }
+          Fl_Group w_settings_shell_toolbox {
+            callback {if (v==LOAD) {
+  propagate_load(o, v);
+}} open
+            xywh {100 200 220 22}
+          } {
+            Fl_Button {} {
+              label {+}
+              callback {if (v != LOAD) {
+  int selected = w_settings_shell_list_selected;
+  Fd_Shell_Command *cmd = new Fd_Shell_Command("new shell command");
+  g_shell_config->insert(selected, cmd);
+  w_settings_shell_list->insert(selected+1, cmd->name.c_str());
+  w_settings_shell_list->deselect();
+  w_settings_shell_list->value(selected+1);
+  if (cmd->storage == FD_STORE_USER)
+    w_settings_shell_list->icon(selected+1, w_settings_shell_fd_user->image());
+  else if (cmd->storage == FD_STORE_PROJECT)
+    w_settings_shell_list->icon(selected+1, w_settings_shell_fd_project->image());
+  w_settings_shell_list->do_callback();
+  w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
+  w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
+  g_shell_config->rebuild_shell_menu();
+}}
+              tooltip {insert a new shell command into the list after the selected command} xywh {100 200 24 22} labelfont 1 labelsize 11
+            }
+            Fl_Button w_settings_shell_dup {
+              label {++}
+              callback {int selected = w_settings_shell_list_selected;
+if (v==LOAD) {
+  if (selected) {
+    o->activate();
+  } else {
+    o->deactivate();
+  }
+} else {
+  if (!selected) return;
+  Fd_Shell_Command *cmd = new Fd_Shell_Command(g_shell_config->list[selected-1]);
+  g_shell_config->insert(selected, cmd);
+  w_settings_shell_list->insert(selected+1, cmd->name.c_str());
+  w_settings_shell_list->deselect();
+  w_settings_shell_list->deselect();
+  w_settings_shell_list->value(selected+1);
+  if (cmd->storage == FD_STORE_USER)
+    w_settings_shell_list->icon(selected+1, w_settings_shell_fd_user->image());
+  else if (cmd->storage == FD_STORE_PROJECT)
+    w_settings_shell_list->icon(selected+1, w_settings_shell_fd_project->image());
+  w_settings_shell_list->do_callback();
+  w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
+  w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
+  g_shell_config->rebuild_shell_menu();
+}}
+              tooltip {duplicate the selected shell command and insert it into the list} xywh {124 200 24 22} labelfont 1 labelsize 11 deactivate
+            }
+            Fl_Button w_settings_shell_remove {
+              label DEL
+              callback {int selected = w_settings_shell_list_selected;
+if (v==LOAD) {
+  if (selected) {
+    o->activate();
+  } else {
+    o->deactivate();
+  }
+} else {
+  if (!selected) return;
+  int ret = fl_choice("Delete the shell command\\n\\"%s\\"?\\n\\nThis can not be undone.",
+    "Delete", "Cancel", NULL, g_shell_config->list[selected-1]->name.c_str());
+  if (ret==1) return;
+  g_shell_config->remove(selected-1);
+  w_settings_shell_list->remove(selected);
+  if (selected <= w_settings_shell_list->size())
+    w_settings_shell_list->value(selected);
+  else
+    w_settings_shell_list->value(0);
+  w_settings_shell_list->do_callback();
+  w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
+  w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
+  g_shell_config->rebuild_shell_menu();
+}}
+              tooltip {remove the selected shell command - this can not be undone} xywh {148 200 24 22} labelsize 10 deactivate
+            }
+            Fl_Menu_Button w_settings_shell_menu {open
+              xywh {172 200 24 22} labelsize 11 textsize 11
+            } {
+              MenuItem {} {
+                label {Import...}
+                callback {if (v != LOAD)
+  Fd_Shell_Command_List::import_from_file();}
+                tooltip {import shell commands from an external file} xywh {90 90 100 20} labelsize 11
+              }
+              MenuItem {} {
+                label {Export selected...}
+                callback {if (v != LOAD)
+  Fd_Shell_Command_List::export_selected();}
+                tooltip {export selected shell commands to an external file} xywh {10 10 100 20} labelsize 11
+              }
+              MenuItem {} {
+                label {Example Scripts:}
+                xywh {20 20 100 20} labelfont 1 labelsize 10 hide deactivate
+              }
+              MenuItem {} {
+                label {Compile with fltk-config}
+                xywh {30 30 100 20} labelsize 11 hide
+              }
+              MenuItem {} {
+                label {Build and run}
+                xywh {40 40 100 20} labelsize 11 hide
+              }
+              MenuItem {} {
+                label {Build with Xcode on macOS}
+                xywh {50 50 100 20} labelsize 11 hide
+              }
+              MenuItem {} {
+                label {Build with CMake}
+                xywh {60 60 100 20} labelsize 11 hide
+              }
+            }
+            Fl_Box {} {
+              xywh {253 200 13 22} hide resizable
+            }
+            Fl_Button {} {
+              label T
+              callback {if (v!=LOAD) show_terminal_window();}
+              tooltip {show terminal window} xywh {246 200 24 22} labelfont 5 labelsize 11
+            }
+            Fl_Button w_settings_shell_play {
+              label Run
+              callback {int selected = w_settings_shell_list_selected;
+if (v==LOAD) {
+  if (selected) {
+    o->activate();
+  } else {
+    o->deactivate();
+  }
+} else {
+  if (!selected) return;
+  Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+  cmd->run();
+}}
+              tooltip {run the selected shell command} xywh {270 200 50 22} labelsize 11 deactivate
+            }
+          }
+        }
+        Fl_Group w_settings_shell_cmd {
+          callback {if (v==LOAD) {
+  int selected = w_settings_shell_list_selected;
+  if (selected) {
+    o->activate();
+  } else {
+    o->deactivate();
+  }
+  propagate_load(o, v);
+}} open
+          xywh {10 235 320 291} resizable
+        } {
+          Fl_Input {} {
+            label {Name:}
+            callback {int selected = w_settings_shell_list_selected;
+if (v == LOAD) {
+  if (selected) {
+    o->value(g_shell_config->list[selected-1]->name.c_str());
+  } else {
+    o->value("");
+  }
+} else {
+  if (selected) {
+    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+    cmd->name = o->value();
+    w_settings_shell_list->text(selected, o->value());
+    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+  }
+}}
+            tooltip {file the shell command under this name in the shell command list} xywh {100 246 220 20} labelfont 1 labelsize 11 when 13 textfont 4 textsize 11
+          }
+          Fl_Input {} {
+            label {Menu Label:}
+            callback {int selected = w_settings_shell_list_selected;
+if (v == LOAD) {
+  if (selected) {
+    o->value(g_shell_config->list[selected-1]->label.c_str());
+  } else {
+    o->value("");
+  }
+} else {
+  if (selected) {
+    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+    cmd->label = o->value();
+    cmd->update_shell_menu();
+    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+  }
+}}
+            tooltip {label text for the Shell menu in the main menu bar} xywh {100 272 220 20} labelfont 1 labelsize 11 textfont 4 textsize 11
+          }
+          Fl_Group {} {
+            callback {propagate_load(o, v);} open
+            xywh {100 297 140 71}
+          } {
+            Fl_Button {} {
+              label Shortcut
+              callback {int selected = w_settings_shell_list_selected;
+if (v == LOAD) {
+  if (selected) {
+    o->value(g_shell_config->list[selected-1]->shortcut);
+    //o->default_value(o->value());
+  } else {
+    o->value(0);
+  }
+} else {
+  if (selected) {
+    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+    cmd->shortcut = o->value();
+    cmd->update_shell_menu();
+    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+  }
+}}
+              tooltip {an optional keyboard shortcut to run this shell command} xywh {100 297 130 20} labelsize 11 align 16
+              code0 {\#include <FL/Fl_Shortcut_Button.H>}
+              class Fl_Shortcut_Button
+            }
+            Fl_Choice {} {
+              label {Store:}
+              callback {int selected = w_settings_shell_list_selected;
+if (v == LOAD) {
+  if (selected) {
+    Fd_Tool_Store ts = g_shell_config->list[selected-1]->storage;
+    o->value(o->find_item_with_argument((long)ts));
+  } else {
+    o->value(o->find_item_with_argument((long)FD_STORE_USER));
+  }
+} else {
+  if (selected) {
+    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+    Fd_Tool_Store ts = (Fd_Tool_Store)(o->mvalue()->argument());
+    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+    cmd->storage = ts;
+    //w_settings_shell_list->text(selected, cmd->name.c_str());
+    if (cmd->storage == FD_STORE_USER)
+      w_settings_shell_list->icon(selected, w_settings_shell_fd_user->image());
+    else if (cmd->storage == FD_STORE_PROJECT)
+      w_settings_shell_list->icon(selected, w_settings_shell_fd_project->image());
+    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+  }
+}} open
+              tooltip {store this shell command as a user setting or save it with the .fl project file} xywh {100 322 130 20} down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11
+            } {
+              MenuItem {} {
+                label {@fd_user User Setting}
+                user_data FD_STORE_USER user_data_type long
+                xywh {0 0 100 20} labelsize 11
+              }
+              MenuItem {} {
+                label {@fd_project Project File}
+                user_data FD_STORE_PROJECT user_data_type long
+                xywh {0 0 100 20} labelsize 11
+              }
+            }
+            Fl_Choice {} {
+              label {Condition:}
+              callback {int selected = w_settings_shell_list_selected;
+if (v == LOAD) {
+  if (selected) {
+    int cond = g_shell_config->list[selected-1]->condition;
+    o->value(o->find_item_with_argument(cond));
+  } else {
+    o->value(o->find_item_with_argument(0));
+  }
+} else {
+  if (selected) {
+    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+    int cond = (int)(o->mvalue()->argument());
+    cmd->condition = cond;
+    g_shell_config->rebuild_shell_menu();
+    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+  }
+}} open
+              tooltip {add this command to the main menu bar only if this condition is true} xywh {100 348 130 20} down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11
+            } {
+              MenuItem {} {
+                label {all platforms}
+                user_data {Fd_Shell_Command::ALWAYS} user_data_type long
+                xywh {0 0 100 20} labelsize 11
+              }
+              MenuItem {} {
+                label {Windows only}
+                user_data {Fd_Shell_Command::WIN_ONLY} user_data_type long
+                xywh {0 0 100 20} labelsize 11
+              }
+              MenuItem {} {
+                label {Linux only}
+                user_data {Fd_Shell_Command::UX_ONLY} user_data_type long
+                xywh {0 0 100 20} labelsize 11
+              }
+              MenuItem {} {
+                label {macOS only}
+                user_data {Fd_Shell_Command::MAC_ONLY} user_data_type long
+                xywh {0 0 100 20} labelsize 11
+              }
+              MenuItem {} {
+                label {Linux and macOS}
+                user_data {Fd_Shell_Command::MAC_AND_UX_ONLY} user_data_type long
+                xywh {0 0 100 20} labelsize 11
+              }
+              MenuItem {} {
+                label {don't use}
+                user_data {Fd_Shell_Command::NEVER} user_data_type long
+                xywh {0 0 100 20} labelsize 11
+              }
+            }
+            Fl_Box {} {
+              xywh {230 297 10 71} hide resizable
+            }
+          }
+          Fl_Input {} {
+            label {Label:}
+            callback {if (v == LOAD) {
+//  o->value(g_shell_command.c_str());
+} else {
+//  g_shell_command = o->value();
+}}
+            xywh {230 348 90 20} labelfont 1 labelsize 11 textfont 4 textsize 11 hide
+          }
+          Fl_Group {} {
+            callback propagate_load open
+            xywh {100 373 220 80} resizable
+          } {
+            Fl_Text_Editor w_settings_shell_command {
+              label {Shell script:}
+              callback {int selected = w_settings_shell_list_selected;
+if (v == LOAD) {
+  if (selected) {
+    o->buffer()->text(g_shell_config->list[selected-1]->command.c_str());
+  } else {
+    o->buffer()->text("");
+  }
+} else {
+  if (selected) {
+    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+    cmd->command = o->buffer()->text();
+    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+  }
+}}
+              xywh {100 373 196 80} labelfont 1 labelsize 11 align 4 textfont 4 textsize 12 resizable
+              code0 {o->buffer(new Fl_Text_Buffer);}
+            }
+            Fl_Group {} {open
+              xywh {296 373 24 80}
+            } {
+              Fl_Menu_Button w_settings_shell_text_macros {
+                callback {const Fl_Menu_Item *mi = o->mvalue();
+if (mi) {
+  char buffer[256];
+  fl_strlcpy(buffer, mi->label(), 255);
+  int n = (int)strlen(buffer)-1;
+  if (buffer[n]=='@') buffer[n] = 0;
+  char *word = buffer;
+  if (word[0]=='@') word++;
+  if (w_settings_shell_command->buffer()->selected()) {
+    int start = 0, end = 0;
+    w_settings_shell_command->buffer()->selection_position(&start, &end);
+    w_settings_shell_command->buffer()->replace(start, end, word);
+  } else {
+    int pos = w_settings_shell_command->insert_position();
+    w_settings_shell_command->buffer()->insert(pos, word);
+  }
+  w_settings_shell_command->do_callback(w_settings_shell_command, (void*)NULL);
+}} open
+                tooltip {a list of text replacements available for the shell script} xywh {296 373 24 22} labelsize 11 textsize 11
+              } {
+                MenuItem {} {
+                  label {@@BASENAME@@}
+                  xywh {80 80 100 20} labelfont 4 labelsize 11
+                }
+                MenuItem {} {
+                  label {@@PROJECTFILE_PATH@@}
+                  xywh {0 0 100 20} labelfont 4 labelsize 11
+                }
+                MenuItem {} {
+                  label {@@PROJECTFILE_NAME@@}
+                  xywh {10 10 100 20} labelfont 4 labelsize 11
+                }
+                MenuItem {} {
+                  label {@@CODEFILE_PATH@@}
+                  xywh {20 20 100 20} labelfont 4 labelsize 11
+                }
+                MenuItem {} {
+                  label {@@CODEFILE_NAME@@}
+                  xywh {30 30 100 20} labelfont 4 labelsize 11
+                }
+                MenuItem {} {
+                  label {@@HEADERFILE_PATH@@}
+                  xywh {40 40 100 20} labelfont 4 labelsize 11
+                }
+                MenuItem {} {
+                  label {@@HEADERFILE_NAME@@}
+                  xywh {50 50 100 20} labelfont 4 labelsize 11
+                }
+                MenuItem {} {
+                  label {@@TEXTFILE_PATH@@}
+                  xywh {60 60 100 20} labelfont 4 labelsize 11
+                }
+                MenuItem {} {
+                  label {@@TEXTFILE_NAME@@}
+                  xywh {70 70 100 20} labelfont 4 labelsize 11
+                }
+                MenuItem {} {
+                  label {@@FLTK_CONFIG@@}
+                  comment {Not yet implemented}
+                  xywh {70 70 100 20} labelfont 4 labelsize 11 hide
+                }
+                MenuItem {} {
+                  label {@@TMPDIR@@}
+                  xywh {70 70 100 20} labelfont 4 labelsize 11
+                }
+              }
+              Fl_Button {} {
+                label {@+1fd_zoom}
+                callback {if (!script_panel) make_script_panel();
+script_input->buffer()->text(w_settings_shell_command->buffer()->text());
+script_panel->show();
+
+for (;;) {
+  Fl_Widget* w = Fl::readqueue();
+  if (w == script_panel_cancel) goto BREAK2;
+  else if (w == script_panel_ok) break;
+  else if (!w) Fl::wait();
+}
+
+w_settings_shell_command->buffer()->text(script_input->buffer()->text());
+w_settings_shell_command->do_callback();
+BREAK2:
+script_panel->hide();}
+                tooltip {open the big code editor} xywh {296 395 24 22} labelsize 11
+              }
+              Fl_Box {} {
+                xywh {296 417 24 10} hide resizable
+              }
+            }
+          }
+          Fl_Check_Button {} {
+            label {save .fl project file}
+            callback {int selected = w_settings_shell_list_selected;
+if (v == LOAD) {
+  if (selected) {
+    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_PROJECT);
+  } else {
+    o->value(0);
+  }
+} else {
+  if (selected) {
+    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+    int v = o->value();
+    if (v) {
+      cmd->flags |= Fd_Shell_Command::SAVE_PROJECT;
+    } else {
+      cmd->flags &= ~Fd_Shell_Command::SAVE_PROJECT;
+    }
+    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+  }
+}}
+            tooltip {save the project to the .fl file before running the command} xywh {100 458 110 20} down_box DOWN_BOX labelsize 11
+          }
+          Fl_Check_Button {} {
+            label {save source code}
+            callback {int selected = w_settings_shell_list_selected;
+if (v == LOAD) {
+  if (selected) {
+    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_SOURCECODE);
+  } else {
+    o->value(0);
+  }
+} else {
+  if (selected) {
+    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+    int v = o->value();
+    if (v) {
+      cmd->flags |= Fd_Shell_Command::SAVE_SOURCECODE;
+    } else {
+      cmd->flags &= ~Fd_Shell_Command::SAVE_SOURCECODE;
+    }
+    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+  }
+}}
+            tooltip {generate the source code and header file before running the command} xywh {100 478 110 19} down_box DOWN_BOX labelsize 11
+          }
+          Fl_Check_Button {} {
+            label {save i18n strings}
+            callback {int selected = w_settings_shell_list_selected;
+if (v == LOAD) {
+  if (selected) {
+    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_STRINGS);
+  } else {
+    o->value(0);
+  }
+} else {
+  if (selected) {
+    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+    int v = o->value();
+    if (v) {
+      cmd->flags |= Fd_Shell_Command::SAVE_STRINGS;
+    } else {
+      cmd->flags &= ~Fd_Shell_Command::SAVE_STRINGS;
+    }
+    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+  }
+}}
+            tooltip {save the internationalisation strings before running the command} xywh {100 498 110 20} down_box DOWN_BOX labelsize 11
+          }
+          Fl_Check_Button {} {
+            label {show terminal}
+            callback {int selected = w_settings_shell_list_selected;
+if (v == LOAD) {
+  if (selected) {
+    o->value(!(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::DONT_SHOW_TERMINAL));
+  } else {
+    o->value(0);
+  }
+} else {
+  if (selected) {
+    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+    int v = o->value();
+    if (!v) {
+      cmd->flags |= Fd_Shell_Command::DONT_SHOW_TERMINAL;
+    } else {
+      cmd->flags &= ~Fd_Shell_Command::DONT_SHOW_TERMINAL;
+    }
+    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+  }
+}}
+            tooltip {show the terminal window when launching this script} xywh {214 458 106 20} down_box DOWN_BOX labelsize 11
+          }
+          Fl_Check_Button {} {
+            label {clear terminal}
+            callback {int selected = w_settings_shell_list_selected;
+if (v == LOAD) {
+  if (selected) {
+    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::CLEAR_TERMINAL);
+  } else {
+    o->value(0);
+  }
+} else {
+  if (selected) {
+    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+    int v = o->value();
+    if (v) {
+      cmd->flags |= Fd_Shell_Command::CLEAR_TERMINAL;
+    } else {
+      cmd->flags &= ~Fd_Shell_Command::CLEAR_TERMINAL;
+    }
+    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+  }
+}}
+            tooltip {clear the teminal window before running this script} xywh {214 478 106 19} down_box DOWN_BOX labelsize 11
+          }
+          Fl_Check_Button {} {
+            label {clear term history}
+            callback {int selected = w_settings_shell_list_selected;
+if (v == LOAD) {
+  if (selected) {
+    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::CLEAR_HISTORY);
+  } else {
+    o->value(0);
+  }
+} else {
+  if (selected) {
+    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
+    int v = o->value();
+    if (v) {
+      cmd->flags |= Fd_Shell_Command::CLEAR_HISTORY;
+    } else {
+      cmd->flags &= ~Fd_Shell_Command::CLEAR_HISTORY;
+    }
+    if (cmd->storage == FD_STORE_PROJECT) set_modflag(1);
+  }
+}}
+            tooltip {clear the teminal history in the terminal window} xywh {214 498 106 19} down_box DOWN_BOX labelsize 11
+          }
+        }
+        Fl_Box w_settings_shell_fd_project {
+          image {pixmaps/fd_project.png} compress_image 1 bind_image 1 bind_deimage 1 xywh {20 70 16 15} labelsize 11 hide deactivate
+          code0 {o->image()->scale(16, 16);}
+        }
+        Fl_Box w_settings_shell_fd_user {
+          image {pixmaps/fd_user.png} compress_image 1 bind_image 1 bind_deimage 1 xywh {20 70 16 15} labelsize 11 hide deactivate
+          code0 {o->image()->scale(16, 16);}
+        }
+      }
+      Fl_Group w_settings_i18n_tab {
+        label Locale
+        callback {propagate_load(o, v);} open
+        scale_image {36 24} image {icons/language_64.png} compress_image 1 xywh {10 60 320 480} labelsize 11 hide
+      } {
+        Fl_Group {} {
+          callback propagate_load open
+          xywh {100 78 170 20}
+        } {
+          Fl_Choice i18n_type_chooser {
+            label {i18n Library:}
+            callback i18n_type_cb open
+            tooltip {Type of internationalization to use.} xywh {100 78 160 20} box THIN_UP_BOX down_box BORDER_BOX labelsize 11 textsize 11
+          } {
+            MenuItem {} {
+              label None
+              xywh {0 -11 100 20} labelsize 11
+            }
+            MenuItem {} {
+              label {GNU gettext}
+              xywh {0 -11 100 20} labelsize 11
+            }
+            MenuItem {} {
+              label {POSIX catgets}
+              xywh {0 -11 100 20} labelsize 11
+            }
+          }
+          Fl_Box {} {
+            xywh {260 78 10 20} hide resizable
+          }
+        }
+        Fl_Group i18n_gnu_group {
+          callback {propagate_load(o, v);} open
+          xywh {100 103 220 95}
+        } {
+          Fl_Input i18n_gnu_include_input {
+            label {\#include:}
+            callback {if (v == LOAD) {
+  o->value(g_project.i18n_gnu_include.c_str());
+} else {
+  undo_checkpoint();
+  g_project.i18n_gnu_include = o->value();
+  set_modflag(1);
+}}
+            tooltip {The include file for internationalization.} xywh {100 103 220 20} box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
+          }
+          Fl_Input i18n_gnu_conditional_input {
+            label {Conditional:}
+            callback {if (v == LOAD) {
+  o->value(g_project.i18n_gnu_conditional.c_str());
+} else {
+  undo_checkpoint();
+  g_project.i18n_gnu_conditional = o->value();
+  set_modflag(1);
+}}
+            tooltip {only include the header file if this preprocessor macro is defined, for example FLTK_GETTEXT_FOUND} xywh {100 128 220 20} box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
+          }
+          Fl_Input i18n_gnu_function_input {
+            label {Function:}
+            callback {if (v == LOAD) {
+  o->value(g_project.i18n_gnu_function.c_str());
+} else {
+  undo_checkpoint();
+  g_project.i18n_gnu_function = o->value();
+  set_modflag(1);
+}}
+            tooltip {The function to call to translate labels and tooltips, usually "gettext" or "_"} xywh {100 153 220 20} box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
+          }
+          Fl_Input i18n_gnu_static_function_input {
+            label {Static Function:}
+            callback {if (v == LOAD) {
+  o->value(g_project.i18n_gnu_static_function.c_str());
+} else {
+  undo_checkpoint();
+  g_project.i18n_gnu_static_function = o->value();
+  set_modflag(1);
+}}
+            tooltip {function to call to translate static text, The function to call to internationalize labels and tooltips, usually "gettext_noop" or "N_"} xywh {100 178 220 20} box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
+          }
+        }
+        Fl_Group i18n_posix_group {
+          callback {propagate_load(o, v);} open
+          xywh {100 103 220 95} hide
+        } {
+          Fl_Input i18n_pos_include_input {
+            label {\#include:}
+            callback {if (v == LOAD) {
+  o->value(g_project.i18n_pos_include.c_str());
+} else {
+  undo_checkpoint();
+  g_project.i18n_pos_include = o->value();
+  set_modflag(1);
+}}
+            tooltip {The include file for internationalization.} xywh {100 103 220 20} box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
+          }
+          Fl_Input i18n_pos_conditional_input {
+            label {Conditional:}
+            callback {if (v == LOAD) {
+  o->value(g_project.i18n_pos_conditional.c_str());
+} else {
+  undo_checkpoint();
+  g_project.i18n_pos_conditional = o->value();
+  set_modflag(1);
+}}
+            tooltip {only include the header file if this preprocessor macro is defined, for example FLTK_GETTEXT_FOUND} xywh {100 128 220 20} box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
+          }
+          Fl_Input i18n_pos_file_input {
+            label {Catalog:}
+            callback {if (v == LOAD) {
+  o->value(g_project.i18n_pos_file.c_str());
+} else {
+  undo_checkpoint();
+  g_project.i18n_pos_file = o->value();
+  set_modflag(1);
+}}
+            tooltip {The name of the message catalog.} xywh {100 153 220 20} box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
+          }
+          Fl_Group {} {
+            callback {propagate_load(o, v);} open
+            xywh {100 178 90 20}
+          } {
+            Fl_Input i18n_pos_set_input {
+              label {Set:}
+              callback {if (v == LOAD) {
+  o->value(g_project.i18n_pos_set.c_str());
+} else {
+  undo_checkpoint();
+  g_project.i18n_pos_set = o->value();
+  set_modflag(1);
+}}
+              tooltip {The message set number.} xywh {100 178 80 20} type Int box THIN_DOWN_BOX labelsize 11 textfont 4 textsize 11
+            }
+            Fl_Box {} {
+              xywh {180 178 10 20} hide resizable
+            }
+          }
+        }
+        Fl_Box {} {
+          xywh {100 530 220 10} hide resizable
+        }
+      }
+      Fl_Group w_settings_user_tab {
+        label User
+        callback {propagate_load(o, v);} open
+        scale_image {36 24} image {icons/user_circle_64.png} compress_image 1 xywh {10 60 320 480} labelsize 11 hide
+        code0 {\#include <FL/fl_show_colormap.H>}
+      } {
+        Fl_Box {} {
+          label {---- Widget Browser ----}
+          xywh {100 84 220 20} labelfont 1 labelsize 11 align 20
+        }
+        Fl_Group {} {
+          callback propagate_load open
+          xywh {100 112 220 20}
+        } {
+          Fl_Choice {} {
+            label {Label:}
+            user_data {&Widget_Browser::label_font}
+            callback cb_Comments open
+            xywh {100 112 151 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
+            code0 {extern Fl_Menu_Item fontmenu[];}
+            code1 {o->menu(fontmenu);}
+          } {}
+          Fl_Button {} {
+            user_data {&Widget_Browser::label_color}
+            callback cb_Color_Chip
+            xywh {251 112 51 20} labelsize 11
+          }
+          Fl_Menu_Button {} {
+            user_data {&Widget_Browser::label_color}
+            callback cb_Color_Choice open
+            xywh {302 112 18 20}
+            code0 {extern Fl_Menu_Item colormenu[];}
+            code1 {o->menu(colormenu);}
+          } {}
+        }
+        Fl_Group {} {
+          callback propagate_load open
+          xywh {100 137 220 20}
+        } {
+          Fl_Choice {} {
+            label {Class:}
+            user_data {&Widget_Browser::class_font}
+            callback cb_Comments open
+            xywh {100 137 151 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
+            code0 {extern Fl_Menu_Item fontmenu[];}
+            code1 {o->menu(fontmenu);}
+          } {}
+          Fl_Button {} {
+            user_data {&Widget_Browser::class_color}
+            callback cb_Color_Chip
+            xywh {251 137 51 20} labelsize 11
+          }
+          Fl_Menu_Button {} {
+            user_data {&Widget_Browser::class_color}
+            callback cb_Color_Choice open
+            xywh {302 137 18 20}
+            code0 {extern Fl_Menu_Item colormenu[];}
+            code1 {o->menu(colormenu);}
+          } {}
+        }
+        Fl_Group {} {
+          callback propagate_load open
+          xywh {100 162 220 20}
+        } {
+          Fl_Choice {} {
+            label {Function:}
+            user_data {&Widget_Browser::func_font}
+            callback cb_Comments open
+            xywh {100 162 151 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
+            code0 {extern Fl_Menu_Item fontmenu[];}
+            code1 {o->menu(fontmenu);}
+          } {}
+          Fl_Button {} {
+            user_data {&Widget_Browser::func_color}
+            callback cb_Color_Chip
+            xywh {251 162 51 20} labelsize 11
+          }
+          Fl_Menu_Button {} {
+            user_data {&Widget_Browser::func_color}
+            callback cb_Color_Choice open
+            xywh {302 162 18 20}
+            code0 {extern Fl_Menu_Item colormenu[];}
+            code1 {o->menu(colormenu);}
+          } {}
+        }
+        Fl_Group {} {
+          callback propagate_load open
+          xywh {100 187 220 20}
+        } {
+          Fl_Choice {} {
+            label {Name:}
+            user_data {&Widget_Browser::name_font}
+            callback cb_Comments open
+            xywh {100 187 151 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
+            code0 {extern Fl_Menu_Item fontmenu[];}
+            code1 {o->menu(fontmenu);}
+          } {}
+          Fl_Button {} {
+            user_data {&Widget_Browser::name_color}
+            callback cb_Color_Chip
+            xywh {251 187 51 20} labelsize 11
+          }
+          Fl_Menu_Button {} {
+            user_data {&Widget_Browser::name_color}
+            callback cb_Color_Choice open
+            xywh {302 187 18 20}
+            code0 {extern Fl_Menu_Item colormenu[];}
+            code1 {o->menu(colormenu);}
+          } {}
+        }
+        Fl_Group {} {
+          callback propagate_load open
+          xywh {100 212 220 20}
+        } {
+          Fl_Choice {} {
+            label {Code:}
+            user_data {&Widget_Browser::code_font}
+            callback cb_Comments open
+            xywh {100 212 151 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
+            code0 {extern Fl_Menu_Item fontmenu[];}
+            code1 {o->menu(fontmenu);}
+          } {}
+          Fl_Button {} {
+            user_data {&Widget_Browser::code_color}
+            callback cb_Color_Chip
+            xywh {251 212 51 20} labelsize 11
+          }
+          Fl_Menu_Button {} {
+            user_data {&Widget_Browser::code_color}
+            callback cb_Color_Choice open
+            xywh {302 212 18 20}
+            code0 {extern Fl_Menu_Item colormenu[];}
+            code1 {o->menu(colormenu);}
+          } {}
+        }
+        Fl_Group {} {
+          callback propagate_load open
+          xywh {100 237 220 20}
+        } {
+          Fl_Choice w_settings_user_commenttext {
+            label {Comments:}
+            user_data {&Widget_Browser::comment_font}
+            callback cb_Comments open
+            xywh {100 237 151 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
+            code0 {extern Fl_Menu_Item fontmenu[];}
+            code1 {o->menu(fontmenu);}
+          } {}
+          Fl_Button {} {
+            user_data {&Widget_Browser::comment_color}
+            callback cb_Color_Chip
+            xywh {251 237 51 20} labelsize 11
+          }
+          Fl_Menu_Button {} {
+            user_data {&Widget_Browser::comment_color}
+            callback cb_Color_Choice open
+            xywh {302 237 18 20}
+            code0 {extern Fl_Menu_Item colormenu[];}
+            code1 {o->menu(colormenu);}
+          } {}
+        }
+      }
+    }
+    Fl_Group {} {open
+      xywh {10 550 320 20}
+    } {
+      Fl_Button {} {
+        label Close
+        callback {if (g_shell_config)
+  g_shell_config->write(fluid_prefs, FD_STORE_USER);
+g_layout_list.write(fluid_prefs, FD_STORE_USER);
+settings_window->hide();}
+        tooltip {Close this dialog.} xywh {230 550 100 20} labelsize 11
+      }
+      Fl_Box {} {
+        xywh {220 550 10 20} hide resizable
+      }
+    }
+  }
+  code {w_settings_tabs->do_callback(w_settings_tabs, LOAD);} {}
+}
+
+Function {make_shell_window()} {open
+} {
+  Fl_Window shell_run_window {
+    label {Shell Command Output} open
+    xywh {769 584 555 430} type Double align 80 resizable visible
+  } {
+    Fl_Terminal shell_run_terminal {
+      xywh {10 10 535 375} resizable
+      code0 {shell_run_terminal->ansi(1);}
+      code1 {shell_run_terminal->history_lines(1000);}
+    }
+    Fl_Group {} {open
+      xywh {10 395 535 25}
+    } {
+      Fl_Button {} {
+        label Clear
+        callback {// clear screen, clear scrollback, home cursor
+shell_run_terminal->append("\\033[2J\\033[3J\\033[H");}
+        xywh {10 395 94 25}
+      }
+      Fl_Box {} {
+        xywh {104 395 341 25} hide resizable
+      }
+      Fl_Return_Button shell_run_button {
+        label Close
+        callback {Fl_Preferences pos(fluid_prefs, "shell_run_Window_pos");
+pos.set("x", shell_run_window->x());
+pos.set("y", shell_run_window->y());
+pos.set("w", shell_run_window->w());
+pos.set("h", shell_run_window->h());
+shell_run_window->hide();}
+        xywh {445 395 100 25}
+      }
+    }
+  }
+}
+
+decl {Fl_Menu_Item *w_layout_menu_storage[4];} {private global
+}
diff --git fluid/settings_panel.h fluid/settings_panel.h
new file mode 100644
index 0000000..faf4686
--- /dev/null
+++ fluid/settings_panel.h
@@ -0,0 +1,143 @@
+//
+// Setting and shell dialogs for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2023 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
+//
+// Please see the following page on how to report bugs and issues:
+//
+//     https://www.fltk.org/bugs.php
+//
+
+// generated by Fast Light User Interface Designer (fluid) version 1.0400
+
+#ifndef settings_panel_h
+#define settings_panel_h
+#include <FL/Fl.H>
+#include "fluid.h"
+#include "widget_browser.h"
+#include "Fd_Snap_Action.h"
+#include "shell_command.h"
+#include <FL/Fl_Text_Buffer.H>
+#include <FL/Fl_Text_Display.H>
+#include "fluid_filename.h"
+#include <FL/fl_string_functions.h>
+#include <FL/Fl_Scheme_Choice.H>
+/**
+ // initialize the scheme from preferences
+*/
+void init_scheme(void);
+extern struct Fl_Menu_Item *dbmanager_item;
+extern void i18n_cb(Fl_Choice *,void *);
+extern void scheme_cb(Fl_Scheme_Choice *, void *);
+extern int w_settings_shell_list_selected;
+#include <FL/Fl_Double_Window.H>
+extern Fl_Double_Window *script_panel;
+#include <FL/Fl_Text_Editor.H>
+extern Fl_Text_Editor *script_input;
+#include <FL/Fl_Group.H>
+extern void propagate_load(Fl_Group*, void*);
+#include <FL/Fl_Return_Button.H>
+extern Fl_Return_Button *script_panel_ok;
+#include <FL/Fl_Button.H>
+extern Fl_Button *script_panel_cancel;
+#include <FL/Fl_Box.H>
+Fl_Double_Window* make_script_panel();
+extern Fl_Double_Window *settings_window;
+#include <FL/Fl_Tabs.H>
+extern Fl_Tabs *w_settings_tabs;
+extern Fl_Group *w_settings_general_tab;
+extern void scheme_cb(Fl_Scheme_Choice*, void*);
+extern Fl_Scheme_Choice *scheme_choice;
+#include <FL/Fl_Check_Button.H>
+extern Fl_Check_Button *tooltips_button;
+extern Fl_Check_Button *completion_button;
+extern Fl_Check_Button *openlast_button;
+extern Fl_Check_Button *prevpos_button;
+extern Fl_Check_Button *show_comments_button;
+#include <FL/Fl_Spinner.H>
+extern Fl_Spinner *recent_spinner;
+extern Fl_Check_Button *use_external_editor_button;
+#include <FL/Fl_Input.H>
+extern Fl_Input *editor_command_input;
+extern void toggle_guides_cb(Fl_Check_Button*, void*);
+extern Fl_Check_Button *guides_button;
+extern void toggle_restricted_cb(Fl_Check_Button*, void*);
+extern Fl_Check_Button *restricted_button;
+extern void toggle_ghosted_outline_cb(Fl_Check_Button*, void*);
+extern Fl_Check_Button *ghosted_outline_button;
+extern Fl_Group *w_settings_project_tab;
+extern Fl_Input *header_file_input;
+extern Fl_Input *code_file_input;
+extern Fl_Check_Button *include_H_from_C_button;
+extern Fl_Check_Button *use_FL_COMMAND_button;
+extern Fl_Check_Button *utf8_in_src_button;
+extern Fl_Check_Button *avoid_early_includes_button;
+extern Fl_Check_Button *w_proj_mergeback;
+extern Fl_Group *w_settings_layout_tab;
+#include <FL/Fl_Choice.H>
+extern Fl_Choice *layout_choice;
+#include <FL/Fl_Menu_Button.H>
+extern Fl_Menu_Button *w_layout_menu;
+#include <FL/Fl_Native_File_Chooser.H>
+extern void edit_layout_preset_cb(Fl_Button*, long);
+extern Fl_Button *preset_choice[3];
+#include <FL/Fl_Value_Input.H>
+extern Fl_Menu_Item fontmenu_w_default[];
+extern Fl_Group *w_settings_shell_tab;
+#include <FL/Fl_Browser.H>
+extern Fl_Browser *w_settings_shell_list;
+extern Fl_Group *w_settings_shell_toolbox;
+extern Fl_Button *w_settings_shell_dup;
+extern Fl_Button *w_settings_shell_remove;
+extern Fl_Menu_Button *w_settings_shell_menu;
+extern Fl_Button *w_settings_shell_play;
+extern Fl_Group *w_settings_shell_cmd;
+#include <FL/Fl_Shortcut_Button.H>
+extern Fl_Text_Editor *w_settings_shell_command;
+extern Fl_Menu_Button *w_settings_shell_text_macros;
+extern Fl_Box *w_settings_shell_fd_project;
+extern Fl_Box *w_settings_shell_fd_user;
+extern Fl_Group *w_settings_i18n_tab;
+extern void i18n_type_cb(Fl_Choice*, void*);
+extern Fl_Choice *i18n_type_chooser;
+extern Fl_Group *i18n_gnu_group;
+extern Fl_Input *i18n_gnu_include_input;
+extern Fl_Input *i18n_gnu_conditional_input;
+extern Fl_Input *i18n_gnu_function_input;
+extern Fl_Input *i18n_gnu_static_function_input;
+extern Fl_Group *i18n_posix_group;
+extern Fl_Input *i18n_pos_include_input;
+extern Fl_Input *i18n_pos_conditional_input;
+extern Fl_Input *i18n_pos_file_input;
+#include <FL/Fl_Int_Input.H>
+extern Fl_Int_Input *i18n_pos_set_input;
+#include <FL/fl_show_colormap.H>
+extern Fl_Group *w_settings_user_tab;
+extern Fl_Menu_Item fontmenu[];
+extern Fl_Menu_Item colormenu[];
+extern Fl_Choice *w_settings_user_commenttext;
+Fl_Double_Window* make_settings_window();
+extern Fl_Menu_Item menu_layout_choice[];
+extern Fl_Menu_Item menu_w_layout_menu[];
+#define w_layout_menu_rename (menu_w_layout_menu+0)
+extern Fl_Menu_Item *w_layout_menu_storage[4];
+#define w_layout_menu_load (menu_w_layout_menu+5)
+#define w_layout_menu_save (menu_w_layout_menu+6)
+#define w_layout_menu_delete (menu_w_layout_menu+7)
+extern Fl_Menu_Item menu_w_settings_shell_menu[];
+extern Fl_Menu_Item menu_Store[];
+extern Fl_Menu_Item menu_Condition[];
+extern Fl_Menu_Item menu_w_settings_shell_text_macros[];
+extern Fl_Menu_Item menu_i18n_type_chooser[];
+extern Fl_Double_Window *shell_run_window;
+#include <FL/Fl_Terminal.H>
+extern Fl_Terminal *shell_run_terminal;
+extern Fl_Return_Button *shell_run_button;
+Fl_Double_Window* make_shell_window();
+#endif
diff --git fluid/shell_command.cxx fluid/shell_command.cxx
index 525f581..b1dd6d1 100644
--- fluid/shell_command.cxx
+++ fluid/shell_command.cxx
@@ -93,7 +93,7 @@
 
 #include "fluid.h"
 #include "file.h"
-#include "alignment_panel.h"
+#include "settings_panel.h"
 
 #include <FL/Fl_Double_Window.H>
 #include <FL/Fl_Menu_Bar.H>
diff --git fluid/sourceview_panel.cxx fluid/sourceview_panel.cxx
deleted file mode 100644
index 0b7c523..0000000
--- fluid/sourceview_panel.cxx
+++ /dev/null
@@ -1,542 +0,0 @@
-//
-// Code dialogs for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 1998-2023 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
-//
-// Please see the following page on how to report bugs and issues:
-//
-//     https://www.fltk.org/bugs.php
-//
-
-// generated by Fast Light User Interface Designer (fluid) version 1.0400
-
-#include "sourceview_panel.h"
-#include "fluid.h"
-#include "file.h"
-#include "../src/flstring.h"
-#include <FL/Fl_Tabs.H>
-#include <FL/Fl_Button.H>
-static char *sv_source_filename = NULL;
-static char *sv_header_filename = NULL;
-static char *sv_design_filename = NULL;
-int sv_code_choice;
-extern void select_only(Fl_Type *o);
-extern void reveal_in_browser(Fl_Type *t);
-
-/**
- Update the header and source code highlighting depending on the
- currently selected object
-
- The Source View system offers an immediate preview of the code
- files that will be generated by FLUID. It also marks the code
- generated for the last selected item in the header and the source
- file.
-*/
-void update_sourceview_position() {
-  if (!sourceview_panel || !sourceview_panel->visible())
-      return;
-    if (sv_autoposition->value()==0)
-      return;
-    if (sourceview_panel && sourceview_panel->visible() && Fl_Type::current) {
-      int pos0 = 0, pos1 = 0;
-      if (sv_source->visible_r()) {
-        switch (sv_code_choice) {
-          case 0: // prolog: not yet (include statements)
-            pos0 = Fl_Type::current->code1_start;
-            pos1 = Fl_Type::current->code2_end;
-            break;
-          case 1: // static: callbacks, menu declarations
-            pos0 = Fl_Type::current->code_static_start;
-            pos1 = Fl_Type::current->code_static_end;
-            break;
-          case 2: // code: entire implementation block including children
-            pos0 = Fl_Type::current->code1_start;
-            pos1 = Fl_Type::current->code2_end;
-            break;
-          case 3: // code1: all implementation code before the children
-            pos0 = Fl_Type::current->code1_start;
-            pos1 = Fl_Type::current->code1_end;
-            break;
-          case 4: // code1: all implementation code before the children
-            pos0 = Fl_Type::current->code2_start;
-            pos1 = Fl_Type::current->code2_end;
-            break;
-        }
-        if (pos0>=0) {
-          if (pos1<pos0)
-            pos1 = sv_source->buffer()->line_end(pos0);
-          sv_source->buffer()->highlight(pos0, pos1);
-          int line = sv_source->buffer()->count_lines(0, pos0);
-          sv_source->scroll(line, 0);
-        }
-      }
-      if (sv_header->visible_r()) {
-        switch (sv_code_choice) {
-          case 0: // prolog: not yet (include statements)
-          case 1: // static: callbacks, menu declarations
-            pos0 = Fl_Type::current->header_static_start;
-            pos1 = Fl_Type::current->header_static_end;
-            break;
-          case 2: // code: entire implementation block including children
-            pos0 = Fl_Type::current->header1_start;
-            pos1 = Fl_Type::current->header2_end;
-            break;
-          case 3: // code1: all implementation code before the children
-            pos0 = Fl_Type::current->header1_start;
-            pos1 = Fl_Type::current->header1_end;
-            break;
-          case 4: // code1: all implementation code before the children
-            pos0 = Fl_Type::current->header2_start;
-            pos1 = Fl_Type::current->header2_end;
-            break;
-        }
-        if (pos0>=0) {
-          if (pos1<pos0)
-            pos1 = sv_header->buffer()->line_end(pos0);
-          sv_header->buffer()->highlight(pos0, pos1);
-          int line = sv_header->buffer()->count_lines(0, pos0);
-          sv_header->scroll(line, 0);
-        }
-      }
-      if (sv_project->visible_r()) {
-        switch (sv_code_choice) {
-          case 0: // prolog: not yet (include statements)
-          case 1: // static: callbacks, menu declarations
-          case 2: // code: entire implementation block including children
-            pos0 = Fl_Type::current->proj1_start;
-            pos1 = Fl_Type::current->proj2_end;
-            break;
-          case 3: // code1: all implementation code before the children
-            pos0 = Fl_Type::current->proj1_start;
-            pos1 = Fl_Type::current->proj1_end;
-            break;
-          case 4: // code1: all implementation code before the children
-            pos0 = Fl_Type::current->proj2_start;
-            pos1 = Fl_Type::current->proj2_end;
-            break;
-        }
-        if (pos0>=0) {
-          if (pos1<pos0)
-            pos1 = sv_project->buffer()->line_end(pos0);
-          sv_project->buffer()->highlight(pos0, pos1);
-          int line = sv_project->buffer()->count_lines(0, pos0);
-          sv_project->scroll(line, 0);
-        }
-      }
-    }
-}
-
-/**
- Callback to update the sourceview position.
-*/
-void update_sourceview_position_cb(class Fl_Tabs*, void*) {
-  // make sure that the selected tab shows the current view
-    update_sourceview_cb(0,0);
-    // highlight the selected widget in the selected tab
-    update_sourceview_position();
-}
-
-/**
- Generate a header, source, strings, or design file in a temporary directory
- and load those into the Code Viewer widgets.
-*/
-void update_sourceview_cb(class Fl_Button*, void*) {
-  if (!sourceview_panel || !sourceview_panel->visible())
-      return;
-
-    if (!sv_source_filename) {
-      sv_source_filename = (char*)malloc(FL_PATH_MAX);
-      fl_strlcpy(sv_source_filename, get_tmpdir().c_str(), FL_PATH_MAX);
-      fl_strlcat(sv_source_filename, "source_view_tmp.cxx", FL_PATH_MAX);
-    }
-    if (!sv_header_filename) {
-      sv_header_filename = (char*)malloc(FL_PATH_MAX);
-      fl_strlcpy(sv_header_filename, get_tmpdir().c_str(), FL_PATH_MAX);
-      fl_strlcat(sv_header_filename, "source_view_tmp.h", FL_PATH_MAX);
-    }
-    if (!sv_design_filename) {
-      sv_design_filename = (char*)malloc(FL_PATH_MAX);
-      fl_strlcpy(sv_design_filename, get_tmpdir().c_str(), FL_PATH_MAX);
-      fl_strlcat(sv_design_filename, "source_view_tmp.fl", FL_PATH_MAX);
-    }
-
-    if (sv_project->visible_r()) {
-      write_file(sv_design_filename, false, true);
-      int top = sv_project->top_line();
-      sv_project->buffer()->loadfile(sv_design_filename);
-      sv_project->scroll(top, 0);
-    } else if (sv_strings->visible_r()) {
-      static const char *exts[] = { ".txt", ".po", ".msg" };
-      char fn[FL_PATH_MAX+1];
-      fl_strlcpy(fn, get_tmpdir().c_str(), FL_PATH_MAX);
-      fl_strlcat(fn, "strings", FL_PATH_MAX);
-      fl_filename_setext(fn, FL_PATH_MAX, exts[g_project.i18n_type]);
-      write_strings(fn);
-      int top = sv_strings->top_line();
-      sv_strings->buffer()->loadfile(fn);
-      sv_strings->scroll(top, 0);
-    } else if (sv_source->visible_r() || sv_header->visible_r()) {
-      Fl_String code_file_name_bak = g_project.code_file_name;
-      g_project.code_file_name = sv_source_filename;
-      Fl_String header_file_name_bak = g_project.header_file_name;
-      g_project.header_file_name = sv_header_filename;
-
-      // generate the code and load the files
-      Fd_Code_Writer f;
-      // generate files
-      if (f.write_code(sv_source_filename, sv_header_filename, true))
-      {
-        // load file into source editor
-        int pos = sv_source->top_line();
-        sv_source->buffer()->loadfile(sv_source_filename);
-        sv_source->scroll(pos, 0);
-        // load file into header editor
-        pos = sv_header->top_line();
-        sv_header->buffer()->loadfile(sv_header_filename);
-        sv_header->scroll(pos, 0);
-        // update the source code highlighting
-        update_sourceview_position();
-      }
-
-      g_project.code_file_name = code_file_name_bak;
-      g_project.header_file_name = header_file_name_bak;
-    }
-}
-
-/**
- This is called by the timer itself
-*/
-void update_sourceview_timer(void*) {
-  update_sourceview_cb(0,0);
-}
-
-void sourceview_defer_update() {
-  // we will only update earliest 0.5 seconds after the last change, and only
-      // if no other change was made, so dragging a widget will not generate any
-      // CPU load
-      Fl::remove_timeout(update_sourceview_timer, 0);
-      Fl::add_timeout(0.5, update_sourceview_timer, 0);
-}
-
-/**
- Show or hide the source code preview.
- The state is stored in the app preferences.
-*/
-void sourceview_toggle_visibility() {
-  if (!sourceview_panel) {
-      make_sourceview();
-      sourceview_panel->callback((Fl_Callback*)toggle_sourceview_cb);
-      Fl_Preferences svp(fluid_prefs, "sourceview");
-      int autorefresh;
-      svp.get("autorefresh", autorefresh, 1);
-      sv_autorefresh->value(autorefresh);
-      int autoposition;
-      svp.get("autoposition", autoposition, 1);
-      sv_autoposition->value(autoposition);
-      int tab;
-      svp.get("tab", tab, 0);
-      if (tab>=0 && tab<sv_tab->children()) sv_tab->value(sv_tab->child(tab));
-      svp.get("code_choice", sv_code_choice, 2);
-      sv_code_choice_w->value(sv_code_choice_w->find_item_with_argument(sv_code_choice));
-      if (!position_window(sourceview_panel,"sourceview_pos", 0, 320, 120, 550, 500)) return;
-    }
-
-    if (sourceview_panel->visible()) {
-      sourceview_panel->hide();
-      sourceview_item->label("Show Source Code...");
-    } else {
-      sourceview_panel->show();
-      sourceview_item->label("Hide Source Code...");
-      update_sourceview_cb(0,0);
-    }
-}
-
-Fl_Double_Window *sourceview_panel=(Fl_Double_Window *)0;
-
-Fl_Tabs *sv_tab=(Fl_Tabs *)0;
-
-CodeViewer *sv_source=(CodeViewer *)0;
-
-CodeViewer *sv_header=(CodeViewer *)0;
-
-TextViewer *sv_strings=(TextViewer *)0;
-
-TextViewer *sv_project=(TextViewer *)0;
-
-Fl_Button *sv_find_text_case=(Fl_Button *)0;
-
-Fl_Input *sv_find_text=(Fl_Input *)0;
-
-static void cb_sv_find_text(Fl_Input* o, void*) {
-  Fl_Text_Display *e = NULL;
-  if (sv_source->visible_r()) {
-    e = sv_source;
-  } else if (sv_header->visible_r()) {
-    e = sv_header;
-  } else if (sv_project->visible_r()) {
-    e = sv_project;
-  }
-  if (e) {
-    Fl_Text_Buffer *b = e->buffer();
-    int pos = e->insert_position();
-    int found = b->search_forward(pos, o->value(), &pos, sv_find_text_case->value());
-    if (found) {
-      b->select(pos, pos + (int)strlen(o->value()));
-      e->insert_position(pos);
-      e->show_insert_position();
-    }
-  }
-}
-
-static void cb_(Fl_Button*, void*) {
-  Fl_Text_Display *e = NULL;
-  if (sv_source->visible_r()) {
-    e = sv_source;
-  } else if (sv_header->visible_r()) {
-    e = sv_header;
-  } else if (sv_project->visible_r()) {
-    e = sv_project;
-  }
-  if (e) {
-    const char *needle = sv_find_text->value();
-    Fl_Text_Buffer *b = e->buffer();
-    int pos = e->insert_position()-1;
-    if (pos < 0) pos = b->length()-1;
-    int found = b->search_backward(pos, needle, &pos, sv_find_text_case->value());
-    if (!found)
-      found = b->search_backward(b->length()-1, needle, &pos, sv_find_text_case->value());
-    if (found) {
-      b->select(pos, pos + (int)strlen(needle));
-      e->insert_position(pos);
-      e->show_insert_position();
-    }
-  }
-}
-
-static void cb_1(Fl_Button*, void*) {
-  Fl_Text_Display *e = NULL;
-  if (sv_source->visible_r()) {
-    e = sv_source;
-  } else if (sv_header->visible_r()) {
-    e = sv_header;
-  } else if (sv_project->visible_r()) {
-    e = sv_project;
-  }
-  if (e) {
-    const char *needle = sv_find_text->value();
-    Fl_Text_Buffer *b = e->buffer();
-    int pos = e->insert_position() + 1;
-    if (pos+1 >= b->length()) pos = 0;
-    int found = b->search_forward(pos, needle, &pos, sv_find_text_case->value());
-    if (!found && (pos > 0))
-      found = b->search_forward(0, needle, &pos, sv_find_text_case->value());
-    if (found) {
-      b->select(pos, pos + (int)strlen(needle));
-      e->insert_position(pos);
-      e->show_insert_position();
-    }
-  }
-}
-
-static void cb_Reveal(Fl_Button*, void*) {
-  if (sourceview_panel && sourceview_panel->visible()) {
-    Fl_Type *node = NULL;
-    if (sv_source->visible_r())
-      node = Fl_Type::find_in_text(0, sv_source->insert_position());
-    else if (sv_header->visible_r())
-      node = Fl_Type::find_in_text(1, sv_header->insert_position());
-    else if (sv_project->visible_r())
-      node = Fl_Type::find_in_text(2, sv_project->insert_position());
-    if (node) {
-      select_only(node);
-      reveal_in_browser(node);
-      if (Fl::event_clicks()==1) // double click
-        node->open();
-    }
-  }
-}
-
-Fl_Light_Button *sv_autorefresh=(Fl_Light_Button *)0;
-
-Fl_Light_Button *sv_autoposition=(Fl_Light_Button *)0;
-
-Fl_Choice *sv_code_choice_w=(Fl_Choice *)0;
-
-static void cb_sv_code_choice_w(Fl_Choice* o, void*) {
-  sv_code_choice = (int)o->mvalue()->argument();
-  update_sourceview_position();
-}
-
-Fl_Menu_Item menu_sv_code_choice_w[] = {
- {"prolog", 0,  0, (void*)(0), 16, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"static", 0,  0, (void*)(1), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"code", 0,  0, (void*)(2), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"code 1", 0,  0, (void*)(3), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"code 2", 0,  0, (void*)(4), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {0,0,0,0,0,0,0,0,0}
-};
-
-Fl_Double_Window* make_sourceview() {
-  { sourceview_panel = new Fl_Double_Window(520, 515, "Code View");
-    sourceview_panel->callback((Fl_Callback*)toggle_sourceview_cb);
-    sourceview_panel->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));
-    { sv_tab = new Fl_Tabs(10, 10, 500, 440);
-      sv_tab->selection_color((Fl_Color)4);
-      sv_tab->labelcolor(FL_BACKGROUND2_COLOR);
-      sv_tab->callback((Fl_Callback*)update_sourceview_position_cb);
-      { Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Source");
-        o->labelsize(13);
-        { CodeViewer* o = sv_source = new CodeViewer(10, 40, 500, 410);
-          sv_source->box(FL_DOWN_FRAME);
-          sv_source->color(FL_BACKGROUND2_COLOR);
-          sv_source->selection_color(FL_SELECTION_COLOR);
-          sv_source->labeltype(FL_NORMAL_LABEL);
-          sv_source->labelfont(0);
-          sv_source->labelsize(14);
-          sv_source->labelcolor(FL_FOREGROUND_COLOR);
-          sv_source->textfont(4);
-          sv_source->textsize(11);
-          sv_source->align(Fl_Align(FL_ALIGN_TOP));
-          sv_source->when(FL_WHEN_RELEASE);
-          Fl_Group::current()->resizable(sv_source);
-          o->linenumber_width(60);
-          o->linenumber_size(o->Fl_Text_Display::textsize());
-        } // CodeViewer* sv_source
-        o->end();
-        Fl_Group::current()->resizable(o);
-      } // Fl_Group* o
-      { Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Header");
-        o->labelsize(13);
-        o->hide();
-        { CodeViewer* o = sv_header = new CodeViewer(10, 40, 500, 410);
-          sv_header->box(FL_DOWN_FRAME);
-          sv_header->color(FL_BACKGROUND2_COLOR);
-          sv_header->selection_color(FL_SELECTION_COLOR);
-          sv_header->labeltype(FL_NORMAL_LABEL);
-          sv_header->labelfont(0);
-          sv_header->labelsize(14);
-          sv_header->labelcolor(FL_FOREGROUND_COLOR);
-          sv_header->textfont(4);
-          sv_header->textsize(11);
-          sv_header->align(Fl_Align(FL_ALIGN_TOP));
-          sv_header->when(FL_WHEN_RELEASE);
-          Fl_Group::current()->resizable(sv_header);
-          o->linenumber_width(60);
-          o->linenumber_size(o->Fl_Text_Display::textsize());
-        } // CodeViewer* sv_header
-        o->end();
-      } // Fl_Group* o
-      { Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Strings");
-        o->labelsize(13);
-        o->hide();
-        { TextViewer* o = sv_strings = new TextViewer(10, 40, 500, 410);
-          sv_strings->box(FL_DOWN_FRAME);
-          sv_strings->color(FL_BACKGROUND2_COLOR);
-          sv_strings->selection_color(FL_SELECTION_COLOR);
-          sv_strings->labeltype(FL_NORMAL_LABEL);
-          sv_strings->labelfont(0);
-          sv_strings->labelsize(14);
-          sv_strings->labelcolor(FL_FOREGROUND_COLOR);
-          sv_strings->textfont(4);
-          sv_strings->textsize(11);
-          sv_strings->align(Fl_Align(FL_ALIGN_TOP));
-          sv_strings->when(FL_WHEN_RELEASE);
-          Fl_Group::current()->resizable(sv_strings);
-          o->linenumber_width(60);
-          o->linenumber_size(o->Fl_Text_Display::textsize());
-        } // TextViewer* sv_strings
-        o->end();
-      } // Fl_Group* o
-      { Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Project");
-        o->labelsize(13);
-        o->hide();
-        { TextViewer* o = sv_project = new TextViewer(10, 40, 500, 410);
-          sv_project->box(FL_DOWN_FRAME);
-          sv_project->color(FL_BACKGROUND2_COLOR);
-          sv_project->selection_color(FL_SELECTION_COLOR);
-          sv_project->labeltype(FL_NORMAL_LABEL);
-          sv_project->labelfont(0);
-          sv_project->labelsize(14);
-          sv_project->labelcolor(FL_FOREGROUND_COLOR);
-          sv_project->textfont(4);
-          sv_project->textsize(11);
-          sv_project->align(Fl_Align(FL_ALIGN_TOP));
-          sv_project->when(FL_WHEN_RELEASE);
-          Fl_Group::current()->resizable(sv_project);
-          o->linenumber_width(60);
-          o->linenumber_size(o->Fl_Text_Display::textsize());
-        } // TextViewer* sv_project
-        o->end();
-      } // Fl_Group* o
-      sv_tab->end();
-      Fl_Group::current()->resizable(sv_tab);
-    } // Fl_Tabs* sv_tab
-    { Fl_Group* o = new Fl_Group(10, 460, 500, 20);
-      { sv_find_text_case = new Fl_Button(244, 460, 25, 20, "aA");
-        sv_find_text_case->type(1);
-        sv_find_text_case->labelsize(11);
-      } // Fl_Button* sv_find_text_case
-      { sv_find_text = new Fl_Input(40, 460, 200, 20, "Find:");
-        sv_find_text->labelsize(11);
-        sv_find_text->textsize(11);
-        sv_find_text->callback((Fl_Callback*)cb_sv_find_text);
-        sv_find_text->when(FL_WHEN_RELEASE | FL_WHEN_ENTER_KEY_CHANGED);
-      } // Fl_Input* sv_find_text
-      { Fl_Button* o = new Fl_Button(273, 460, 25, 20, "<<");
-        o->labelsize(11);
-        o->callback((Fl_Callback*)cb_);
-      } // Fl_Button* o
-      { Fl_Button* o = new Fl_Button(298, 460, 25, 20, ">>");
-        o->labelsize(11);
-        o->callback((Fl_Callback*)cb_1);
-      } // Fl_Button* o
-      { Fl_Button* o = new Fl_Button(327, 460, 61, 20, "Reveal");
-        o->labelsize(11);
-        o->callback((Fl_Callback*)cb_Reveal);
-      } // Fl_Button* o
-      { Fl_Box* o = new Fl_Box(490, 460, 20, 20);
-        Fl_Group::current()->resizable(o);
-      } // Fl_Box* o
-      o->end();
-    } // Fl_Group* o
-    { Fl_Group* o = new Fl_Group(10, 485, 500, 20);
-      { Fl_Button* o = new Fl_Button(10, 485, 61, 20, "Refresh");
-        o->labelsize(11);
-        o->callback((Fl_Callback*)update_sourceview_cb);
-      } // Fl_Button* o
-      { Fl_Light_Button* o = sv_autorefresh = new Fl_Light_Button(77, 485, 91, 20, "Auto-Refresh");
-        sv_autorefresh->labelsize(11);
-        o->callback((Fl_Callback*)update_sourceview_cb);
-      } // Fl_Light_Button* sv_autorefresh
-      { sv_autoposition = new Fl_Light_Button(172, 485, 89, 20, "Auto-Position");
-        sv_autoposition->labelsize(11);
-      } // Fl_Light_Button* sv_autoposition
-      { sv_code_choice_w = new Fl_Choice(265, 485, 70, 20);
-        sv_code_choice_w->down_box(FL_BORDER_BOX);
-        sv_code_choice_w->labelsize(11);
-        sv_code_choice_w->textsize(11);
-        sv_code_choice_w->callback((Fl_Callback*)cb_sv_code_choice_w);
-        sv_code_choice_w->menu(menu_sv_code_choice_w);
-      } // Fl_Choice* sv_code_choice_w
-      { Fl_Box* o = new Fl_Box(375, 485, 80, 20);
-        Fl_Group::current()->resizable(o);
-      } // Fl_Box* o
-      { Fl_Button* o = new Fl_Button(460, 485, 50, 20, "Close");
-        o->labelsize(11);
-        o->callback((Fl_Callback*)toggle_sourceview_b_cb);
-      } // Fl_Button* o
-      o->end();
-    } // Fl_Group* o
-    sourceview_panel->size_range(384, 120);
-    sourceview_panel->end();
-  } // Fl_Double_Window* sourceview_panel
-  return sourceview_panel;
-}
-
-//
diff --git fluid/sourceview_panel.fl fluid/sourceview_panel.fl
deleted file mode 100644
index 2159a06..0000000
--- fluid/sourceview_panel.fl
+++ /dev/null
@@ -1,506 +0,0 @@
-# data file for the Fltk User Interface Designer (fluid)
-version 1.0400
-header_name {.h}
-code_name {.cxx}
-comment {//
-// Code dialogs for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 1998-2023 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
-//
-// Please see the following page on how to report bugs and issues:
-//
-//     https://www.fltk.org/bugs.php
-//
-} {in_source in_header
-}
-
-decl {\#include "fluid.h"} {private local
-}
-
-decl {\#include "file.h"} {private local
-}
-
-decl {\#include "../src/flstring.h"} {private local
-}
-
-decl {\#include <FL/Fl_Tabs.H>} {private local
-}
-
-decl {\#include <FL/Fl_Button.H>} {private local
-}
-
-decl {char *sv_source_filename = NULL;} {private local
-}
-
-decl {char *sv_header_filename = NULL;} {private local
-}
-
-decl {char *sv_design_filename = NULL;} {private local
-}
-
-decl {int sv_code_choice;} {public local
-}
-
-decl {extern void select_only(Fl_Type *o);} {private global
-}
-
-decl {extern void reveal_in_browser(Fl_Type *t);} {private global
-}
-
-Function {update_sourceview_position()} {
-  comment {Update the header and source code highlighting depending on the
-currently selected object
-
-The Source View system offers an immediate preview of the code
-files that will be generated by FLUID. It also marks the code
-generated for the last selected item in the header and the source
-file.} open return_type void
-} {
-  code {if (!sourceview_panel || !sourceview_panel->visible())
-    return;
-  if (sv_autoposition->value()==0)
-    return;
-  if (sourceview_panel && sourceview_panel->visible() && Fl_Type::current) {
-    int pos0 = 0, pos1 = 0;
-    if (sv_source->visible_r()) {
-      switch (sv_code_choice) {
-        case 0: // prolog: not yet (include statements)
-          pos0 = Fl_Type::current->code1_start;
-          pos1 = Fl_Type::current->code2_end;
-          break;
-        case 1: // static: callbacks, menu declarations
-          pos0 = Fl_Type::current->code_static_start;
-          pos1 = Fl_Type::current->code_static_end;
-          break;
-        case 2: // code: entire implementation block including children
-          pos0 = Fl_Type::current->code1_start;
-          pos1 = Fl_Type::current->code2_end;
-          break;
-        case 3: // code1: all implementation code before the children
-          pos0 = Fl_Type::current->code1_start;
-          pos1 = Fl_Type::current->code1_end;
-          break;
-        case 4: // code1: all implementation code before the children
-          pos0 = Fl_Type::current->code2_start;
-          pos1 = Fl_Type::current->code2_end;
-          break;
-      }
-      if (pos0>=0) {
-        if (pos1<pos0)
-          pos1 = sv_source->buffer()->line_end(pos0);
-        sv_source->buffer()->highlight(pos0, pos1);
-        int line = sv_source->buffer()->count_lines(0, pos0);
-        sv_source->scroll(line, 0);
-      }
-    }
-    if (sv_header->visible_r()) {
-      switch (sv_code_choice) {
-        case 0: // prolog: not yet (include statements)
-        case 1: // static: callbacks, menu declarations
-          pos0 = Fl_Type::current->header_static_start;
-          pos1 = Fl_Type::current->header_static_end;
-          break;
-        case 2: // code: entire implementation block including children
-          pos0 = Fl_Type::current->header1_start;
-          pos1 = Fl_Type::current->header2_end;
-          break;
-        case 3: // code1: all implementation code before the children
-          pos0 = Fl_Type::current->header1_start;
-          pos1 = Fl_Type::current->header1_end;
-          break;
-        case 4: // code1: all implementation code before the children
-          pos0 = Fl_Type::current->header2_start;
-          pos1 = Fl_Type::current->header2_end;
-          break;
-      }
-      if (pos0>=0) {
-        if (pos1<pos0)
-          pos1 = sv_header->buffer()->line_end(pos0);
-        sv_header->buffer()->highlight(pos0, pos1);
-        int line = sv_header->buffer()->count_lines(0, pos0);
-        sv_header->scroll(line, 0);
-      }
-    }
-    if (sv_project->visible_r()) {
-      switch (sv_code_choice) {
-        case 0: // prolog: not yet (include statements)
-        case 1: // static: callbacks, menu declarations
-        case 2: // code: entire implementation block including children
-          pos0 = Fl_Type::current->proj1_start;
-          pos1 = Fl_Type::current->proj2_end;
-          break;
-        case 3: // code1: all implementation code before the children
-          pos0 = Fl_Type::current->proj1_start;
-          pos1 = Fl_Type::current->proj1_end;
-          break;
-        case 4: // code1: all implementation code before the children
-          pos0 = Fl_Type::current->proj2_start;
-          pos1 = Fl_Type::current->proj2_end;
-          break;
-      }
-      if (pos0>=0) {
-        if (pos1<pos0)
-          pos1 = sv_project->buffer()->line_end(pos0);
-        sv_project->buffer()->highlight(pos0, pos1);
-        int line = sv_project->buffer()->count_lines(0, pos0);
-        sv_project->scroll(line, 0);
-      }
-    }
-  }} {}
-}
-
-Function {update_sourceview_position_cb(class Fl_Tabs*, void*)} {
-  comment {Callback to update the sourceview position.} open return_type void
-} {
-  code {// make sure that the selected tab shows the current view
-  update_sourceview_cb(0,0);
-  // highlight the selected widget in the selected tab
-  update_sourceview_position();} {}
-}
-
-Function {update_sourceview_cb(class Fl_Button*, void*)} {
-  comment {Generate a header, source, strings, or design file in a temporary directory
-and load those into the Code Viewer widgets.} open return_type void
-} {
-  code {if (!sourceview_panel || !sourceview_panel->visible())
-    return;
-
-  if (!sv_source_filename) {
-    sv_source_filename = (char*)malloc(FL_PATH_MAX);
-    fl_strlcpy(sv_source_filename, get_tmpdir().c_str(), FL_PATH_MAX);
-    fl_strlcat(sv_source_filename, "source_view_tmp.cxx", FL_PATH_MAX);
-  }
-  if (!sv_header_filename) {
-    sv_header_filename = (char*)malloc(FL_PATH_MAX);
-    fl_strlcpy(sv_header_filename, get_tmpdir().c_str(), FL_PATH_MAX);
-    fl_strlcat(sv_header_filename, "source_view_tmp.h", FL_PATH_MAX);
-  }
-  if (!sv_design_filename) {
-    sv_design_filename = (char*)malloc(FL_PATH_MAX);
-    fl_strlcpy(sv_design_filename, get_tmpdir().c_str(), FL_PATH_MAX);
-    fl_strlcat(sv_design_filename, "source_view_tmp.fl", FL_PATH_MAX);
-  }
-
-  if (sv_project->visible_r()) {
-    write_file(sv_design_filename, false, true);
-    int top = sv_project->top_line();
-    sv_project->buffer()->loadfile(sv_design_filename);
-    sv_project->scroll(top, 0);
-  } else if (sv_strings->visible_r()) {
-    static const char *exts[] = { ".txt", ".po", ".msg" };
-    char fn[FL_PATH_MAX+1];
-    fl_strlcpy(fn, get_tmpdir().c_str(), FL_PATH_MAX);
-    fl_strlcat(fn, "strings", FL_PATH_MAX);
-    fl_filename_setext(fn, FL_PATH_MAX, exts[g_project.i18n_type]);
-    write_strings(fn);
-    int top = sv_strings->top_line();
-    sv_strings->buffer()->loadfile(fn);
-    sv_strings->scroll(top, 0);
-  } else if (sv_source->visible_r() || sv_header->visible_r()) {
-    Fl_String code_file_name_bak = g_project.code_file_name;
-    g_project.code_file_name = sv_source_filename;
-    Fl_String header_file_name_bak = g_project.header_file_name;
-    g_project.header_file_name = sv_header_filename;
-
-    // generate the code and load the files
-    Fd_Code_Writer f;
-    // generate files
-    if (f.write_code(sv_source_filename, sv_header_filename, true))
-    {
-      // load file into source editor
-      int pos = sv_source->top_line();
-      sv_source->buffer()->loadfile(sv_source_filename);
-      sv_source->scroll(pos, 0);
-      // load file into header editor
-      pos = sv_header->top_line();
-      sv_header->buffer()->loadfile(sv_header_filename);
-      sv_header->scroll(pos, 0);
-      // update the source code highlighting
-      update_sourceview_position();
-    }
-
-    g_project.code_file_name = code_file_name_bak;
-    g_project.header_file_name = header_file_name_bak;
-  }} {}
-}
-
-Function {update_sourceview_timer(void*)} {
-  comment {This is called by the timer itself
-} open return_type void
-} {
-  code {update_sourceview_cb(0,0);} {}
-}
-
-Function {sourceview_defer_update()} {open return_type void
-} {
-  code {// we will only update earliest 0.5 seconds after the last change, and only
-    // if no other change was made, so dragging a widget will not generate any
-    // CPU load
-    Fl::remove_timeout(update_sourceview_timer, 0);
-    Fl::add_timeout(0.5, update_sourceview_timer, 0);} {}
-}
-
-Function {sourceview_toggle_visibility()} {
-  comment {Show or hide the source code preview.
-The state is stored in the app preferences.
-} open return_type void
-} {
-  code {if (!sourceview_panel) {
-    make_sourceview();
-    sourceview_panel->callback((Fl_Callback*)toggle_sourceview_cb);
-    Fl_Preferences svp(fluid_prefs, "sourceview");
-    int autorefresh;
-    svp.get("autorefresh", autorefresh, 1);
-    sv_autorefresh->value(autorefresh);
-    int autoposition;
-    svp.get("autoposition", autoposition, 1);
-    sv_autoposition->value(autoposition);
-    int tab;
-    svp.get("tab", tab, 0);
-    if (tab>=0 && tab<sv_tab->children()) sv_tab->value(sv_tab->child(tab));
-    svp.get("code_choice", sv_code_choice, 2);
-    sv_code_choice_w->value(sv_code_choice_w->find_item_with_argument(sv_code_choice));
-    if (!position_window(sourceview_panel,"sourceview_pos", 0, 320, 120, 550, 500)) return;
-  }
-
-  if (sourceview_panel->visible()) {
-    sourceview_panel->hide();
-    sourceview_item->label("Show Source Code...");
-  } else {
-    sourceview_panel->show();
-    sourceview_item->label("Hide Source Code...");
-    update_sourceview_cb(0,0);
-  }} {}
-}
-
-Function {make_sourceview()} {open
-} {
-  Fl_Window sourceview_panel {
-    label {Code View}
-    callback toggle_sourceview_cb open
-    xywh {389 507 520 515} type Double align 80 resizable size_range {384 120 0 0} visible
-  } {
-    Fl_Tabs sv_tab {
-      callback update_sourceview_position_cb open
-      xywh {10 10 500 440} selection_color 4 labelcolor 7 resizable
-    } {
-      Fl_Group {} {
-        label Source open
-        xywh {10 35 500 415} labelsize 13 resizable
-      } {
-        Fl_Text_Editor sv_source {
-          xywh {10 40 500 410} textfont 4 textsize 11 resizable
-          code0 {\#include "CodeEditor.h"}
-          code1 {o->linenumber_width(60);}
-          code2 {o->linenumber_size(o->Fl_Text_Display::textsize());}
-          class CodeViewer
-        }
-      }
-      Fl_Group {} {
-        label Header open
-        xywh {10 35 500 415} labelsize 13 hide
-      } {
-        Fl_Text_Editor sv_header {
-          xywh {10 40 500 410} textfont 4 textsize 11 resizable
-          code0 {\#include "CodeEditor.h"}
-          code1 {o->linenumber_width(60);}
-          code2 {o->linenumber_size(o->Fl_Text_Display::textsize());}
-          class CodeViewer
-        }
-      }
-      Fl_Group {} {
-        label Strings open
-        xywh {10 35 500 415} labelsize 13 hide
-      } {
-        Fl_Text_Display sv_strings {
-          xywh {10 40 500 410} textfont 4 textsize 11 resizable
-          code1 {o->linenumber_width(60);}
-          code2 {o->linenumber_size(o->Fl_Text_Display::textsize());}
-          class TextViewer
-        }
-      }
-      Fl_Group {} {
-        label Project open
-        xywh {10 35 500 415} labelsize 13 hide
-      } {
-        Fl_Text_Display sv_project {
-          xywh {10 40 500 410} textfont 4 textsize 11 resizable
-          code1 {o->linenumber_width(60);}
-          code2 {o->linenumber_size(o->Fl_Text_Display::textsize());}
-          class TextViewer
-        }
-      }
-    }
-    Fl_Group {} {open
-      xywh {10 460 500 20}
-    } {
-      Fl_Button sv_find_text_case {
-        label aA
-        xywh {244 460 25 20} type Toggle labelsize 11
-      }
-      Fl_Input sv_find_text {
-        label {Find:}
-        callback {Fl_Text_Display *e = NULL;
-if (sv_source->visible_r()) {
-  e = sv_source;
-} else if (sv_header->visible_r()) {
-  e = sv_header;
-} else if (sv_project->visible_r()) {
-  e = sv_project;
-}
-if (e) {
-  Fl_Text_Buffer *b = e->buffer();
-  int pos = e->insert_position();
-  int found = b->search_forward(pos, o->value(), &pos, sv_find_text_case->value());
-  if (found) {
-    b->select(pos, pos + (int)strlen(o->value()));
-    e->insert_position(pos);
-    e->show_insert_position();
-  }
-}}
-        xywh {40 460 200 20} labelsize 11 when 15 textsize 11
-      }
-      Fl_Button {} {
-        label {<<}
-        callback {Fl_Text_Display *e = NULL;
-if (sv_source->visible_r()) {
-  e = sv_source;
-} else if (sv_header->visible_r()) {
-  e = sv_header;
-} else if (sv_project->visible_r()) {
-  e = sv_project;
-}
-if (e) {
-  const char *needle = sv_find_text->value();
-  Fl_Text_Buffer *b = e->buffer();
-  int pos = e->insert_position()-1;
-  if (pos < 0) pos = b->length()-1;
-  int found = b->search_backward(pos, needle, &pos, sv_find_text_case->value());
-  if (!found)
-    found = b->search_backward(b->length()-1, needle, &pos, sv_find_text_case->value());
-  if (found) {
-    b->select(pos, pos + (int)strlen(needle));
-    e->insert_position(pos);
-    e->show_insert_position();
-  }
-}} selected
-        xywh {273 460 25 20} labelsize 11
-      }
-      Fl_Button {} {
-        label {>>}
-        callback {Fl_Text_Display *e = NULL;
-if (sv_source->visible_r()) {
-  e = sv_source;
-} else if (sv_header->visible_r()) {
-  e = sv_header;
-} else if (sv_project->visible_r()) {
-  e = sv_project;
-}
-if (e) {
-  const char *needle = sv_find_text->value();
-  Fl_Text_Buffer *b = e->buffer();
-  int pos = e->insert_position() + 1;
-  if (pos+1 >= b->length()) pos = 0;
-  int found = b->search_forward(pos, needle, &pos, sv_find_text_case->value());
-  if (!found && (pos > 0))
-    found = b->search_forward(0, needle, &pos, sv_find_text_case->value());
-  if (found) {
-    b->select(pos, pos + (int)strlen(needle));
-    e->insert_position(pos);
-    e->show_insert_position();
-  }
-}}
-        xywh {298 460 25 20} labelsize 11
-      }
-      Fl_Button {} {
-        label Reveal
-        callback {if (sourceview_panel && sourceview_panel->visible()) {
-  Fl_Type *node = NULL;
-  if (sv_source->visible_r())
-    node = Fl_Type::find_in_text(0, sv_source->insert_position());
-  else if (sv_header->visible_r())
-    node = Fl_Type::find_in_text(1, sv_header->insert_position());
-  else if (sv_project->visible_r())
-    node = Fl_Type::find_in_text(2, sv_project->insert_position());
-  if (node) {
-    select_only(node);
-    reveal_in_browser(node);
-    if (Fl::event_clicks()==1) // double click
-      node->open();
-  }
-}}
-        xywh {327 460 61 20} labelsize 11
-      }
-      Fl_Box {} {
-        xywh {490 460 20 20} resizable
-      }
-    }
-    Fl_Group {} {open
-      xywh {10 485 500 20}
-    } {
-      Fl_Button {} {
-        label Refresh
-        callback update_sourceview_cb
-        xywh {10 485 61 20} labelsize 11
-      }
-      Fl_Light_Button sv_autorefresh {
-        label {Auto-Refresh}
-        xywh {77 485 91 20} labelsize 11
-        code0 {o->callback((Fl_Callback*)update_sourceview_cb);}
-      }
-      Fl_Light_Button sv_autoposition {
-        label {Auto-Position}
-        xywh {172 485 89 20} labelsize 11
-      }
-      Fl_Choice sv_code_choice_w {
-        callback {sv_code_choice = (int)o->mvalue()->argument();
-update_sourceview_position();} open
-        xywh {265 485 70 20} down_box BORDER_BOX labelsize 11 textsize 11
-      } {
-        MenuItem {} {
-          label prolog
-          user_data 0 user_data_type long
-          tooltip {Include statements in header or source code} xywh {0 0 100 20} labelsize 11 hide
-        }
-        MenuItem {} {
-          label static
-          user_data 1 user_data_type long
-          tooltip {static declarations in source code} xywh {10 10 100 20} labelsize 11
-        }
-        MenuItem {} {
-          label code
-          user_data 2 user_data_type long
-          tooltip {widget code block including children} xywh {20 20 100 20} labelsize 11
-        }
-        MenuItem {} {
-          label {code 1}
-          user_data 3 user_data_type long
-          tooltip {widget code block before children} xywh {30 30 100 20} labelsize 11
-        }
-        MenuItem {} {
-          label {code 2}
-          user_data 4 user_data_type long
-          tooltip {widget code block after children} xywh {40 40 100 20} labelsize 11
-        }
-      }
-      Fl_Box {} {
-        xywh {375 485 80 20} resizable
-      }
-      Fl_Button {} {
-        label Close
-        callback toggle_sourceview_b_cb
-        xywh {460 485 50 20} labelsize 11
-      }
-    }
-  }
-}
-
-comment {
-//} {in_source in_header
-}
diff --git fluid/sourceview_panel.h fluid/sourceview_panel.h
deleted file mode 100644
index 281aa41..0000000
--- fluid/sourceview_panel.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-// Code dialogs for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 1998-2023 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
-//
-// Please see the following page on how to report bugs and issues:
-//
-//     https://www.fltk.org/bugs.php
-//
-
-// generated by Fast Light User Interface Designer (fluid) version 1.0400
-
-#ifndef sourceview_panel_h
-#define sourceview_panel_h
-#include <FL/Fl.H>
-extern int sv_code_choice;
-void update_sourceview_position();
-void update_sourceview_position_cb(class Fl_Tabs*, void*);
-void update_sourceview_cb(class Fl_Button*, void*);
-void update_sourceview_timer(void*);
-void sourceview_defer_update();
-void sourceview_toggle_visibility();
-#include <FL/Fl_Double_Window.H>
-extern void toggle_sourceview_cb(Fl_Double_Window*, void*);
-extern Fl_Double_Window *sourceview_panel;
-#include <FL/Fl_Tabs.H>
-extern Fl_Tabs *sv_tab;
-#include <FL/Fl_Group.H>
-#include "CodeEditor.h"
-extern CodeViewer *sv_source;
-extern CodeViewer *sv_header;
-extern TextViewer *sv_strings;
-extern TextViewer *sv_project;
-#include <FL/Fl_Button.H>
-extern Fl_Button *sv_find_text_case;
-#include <FL/Fl_Input.H>
-extern Fl_Input *sv_find_text;
-#include <FL/Fl_Box.H>
-#include <FL/Fl_Light_Button.H>
-extern Fl_Light_Button *sv_autorefresh;
-extern Fl_Light_Button *sv_autoposition;
-#include <FL/Fl_Choice.H>
-extern Fl_Choice *sv_code_choice_w;
-extern void toggle_sourceview_b_cb(Fl_Button*, void*);
-Fl_Double_Window* make_sourceview();
-extern Fl_Menu_Item menu_sv_code_choice_w[];
-#endif
-
-//
diff --git fluid/widget_panel.cxx fluid/widget_panel.cxx
index 46cd295..cb08f13 100644
--- fluid/widget_panel.cxx
+++ fluid/widget_panel.cxx
@@ -413,6 +413,10 @@ static void cb_widget_tabs(Fl_Tabs* o, void* v) {
   propagate_load((Fl_Group *)o,v);
 }
 
+Fl_Group *wp_gui_tab=(Fl_Group *)0;
+
+Fl_Input *wp_gui_label=(Fl_Input *)0;
+
 Fl_Input *widget_image_input=(Fl_Input *)0;
 
 static void cb_(Fl_Button*, void* v) {
@@ -423,6 +427,8 @@ static void cb_(Fl_Button*, void* v) {
 
 Fl_Input *widget_deimage_input=(Fl_Input *)0;
 
+Fl_Group *wp_gui_alignment=(Fl_Group *)0;
+
 Fl_Menu_Item menu_[] = {
  {"   Image Alignment   ", 0,  0, (void*)((fl_intptr_t)0xFFFFFFFF), 1, (uchar)FL_NORMAL_LABEL, 2, 10, 0},
  {"image over text", 0,  0, (void*)((fl_intptr_t)FL_ALIGN_IMAGE_OVER_TEXT), 0, (uchar)FL_NORMAL_LABEL, 0, 9, 0},
@@ -467,18 +473,50 @@ Fl_Menu_Item menu_Children[] = {
  {0,0,0,0,0,0,0,0,0}
 };
 
+Fl_Group *wp_gui_flexp=(Fl_Group *)0;
+
 Fl_Value_Input *widget_flex_size=(Fl_Value_Input *)0;
 
 Fl_Check_Button *widget_flex_fixed=(Fl_Check_Button *)0;
 
+Fl_Group *wp_gui_values=(Fl_Group *)0;
+
+Fl_Group *wp_gui_margins=(Fl_Group *)0;
+
+Fl_Group *wp_gui_sizerange=(Fl_Group *)0;
+
+Fl_Shortcut_Button *wp_gui_shortcut=(Fl_Shortcut_Button *)0;
+
+Fl_Group *wp_gui_xclass=(Fl_Group *)0;
+
+Fl_Group *wp_gui_attributes=(Fl_Group *)0;
+
+Fl_Input *wp_gui_tooltip=(Fl_Input *)0;
+
+Fl_Group *wp_style_tab=(Fl_Group *)0;
+
+Fl_Group *wp_style_label=(Fl_Group *)0;
+
 Fl_Button *w_labelcolor=(Fl_Button *)0;
 
+Fl_Group *wp_style_box=(Fl_Group *)0;
+
 Fl_Button *w_color=(Fl_Button *)0;
 
+Fl_Group *wp_style_downbox=(Fl_Group *)0;
+
 Fl_Button *w_selectcolor=(Fl_Button *)0;
 
+Fl_Group *wp_style_text=(Fl_Group *)0;
+
 Fl_Button *w_textcolor=(Fl_Button *)0;
 
+Fl_Group *wp_cpp_tab=(Fl_Group *)0;
+
+Fl_Group *wp_cpp_class=(Fl_Group *)0;
+
+Fl_Group *wp_cpp_name=(Fl_Group *)0;
+
 Fl_Menu_Item menu_2[] = {
  {"private", 0,  0, (void*)(0), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
  {"public", 0,  0, (void*)(1), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
@@ -503,6 +541,8 @@ Fl_Text_Editor *wComment=(Fl_Text_Editor *)0;
 
 CodeEditor *wCallback=(CodeEditor *)0;
 
+Fl_Group *wp_cpp_callback=(Fl_Group *)0;
+
 Fl_Menu_Item menu_4[] = {
  {"void*", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
  {"long", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 4, 11, 0},
@@ -537,6 +577,8 @@ static void cb_widget_grid_transient(Fl_Box* o, void* v) {
 
 Fl_Box *widget_grid_unlinked=(Fl_Box *)0;
 
+Fl_Group *wp_gridc_align=(Fl_Group *)0;
+
 Fl_Menu_Item menu_Horizontal[] = {
  {"GRID_LEFT", 0,  0, (void*)(FL_GRID_LEFT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
  {"GRID_CENTER", 0,  0, (void*)(FL_GRID_CENTER), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
@@ -553,6 +595,8 @@ Fl_Menu_Item menu_Vertical[] = {
  {0,0,0,0,0,0,0,0,0}
 };
 
+Fl_Group *wp_gridc_size=(Fl_Group *)0;
+
 Fluid_Coord_Input *widget_grid_rowspan_input=(Fluid_Coord_Input *)0;
 
 Fluid_Coord_Input *widget_grid_colspan_input=(Fluid_Coord_Input *)0;
@@ -643,6 +687,8 @@ static void cb_5(Fl_Button*, void* v) {
   }
 }
 
+Fl_Group *wp_grid_margin=(Fl_Group *)0;
+
 static void cb_Left(Fl_Value_Input* o, void* v) {
   Fl_Grid *grid = Fl_Grid_Type::selected();
   if (!grid) return;
@@ -719,6 +765,8 @@ static void cb_Bottom(Fl_Value_Input* o, void* v) {
   }
 }
 
+Fl_Group *wp_grid_gaps=(Fl_Group *)0;
+
 static void cb_Row(Fl_Value_Input* o, void* v) {
   Fl_Grid *grid = Fl_Grid_Type::selected();
   if (!grid) return;
@@ -963,24 +1011,24 @@ Fl_Double_Window* make_widget_panel() {
       widget_tabs->labelcolor(FL_BACKGROUND2_COLOR);
       widget_tabs->callback((Fl_Callback*)cb_widget_tabs);
       widget_tabs->when(FL_WHEN_NEVER);
-      { Fl_Group* o = new Fl_Group(10, 30, 400, 330, "GUI");
-        o->labelsize(11);
-        o->callback((Fl_Callback*)propagate_load);
-        o->when(FL_WHEN_NEVER);
+      { wp_gui_tab = new Fl_Group(10, 30, 400, 330, "GUI");
+        wp_gui_tab->labelsize(11);
+        wp_gui_tab->callback((Fl_Callback*)propagate_load);
+        wp_gui_tab->when(FL_WHEN_NEVER);
         { Fl_Group* o = new Fl_Group(95, 40, 309, 20, "Label:");
           o->labelfont(1);
           o->labelsize(11);
           o->callback((Fl_Callback*)propagate_load);
           o->align(Fl_Align(FL_ALIGN_LEFT));
-          { Fl_Input* o = new Fl_Input(95, 40, 190, 20);
-            o->tooltip("The label text for the widget.\nUse Ctrl-J for newlines.");
-            o->labelfont(1);
-            o->labelsize(11);
-            o->textsize(11);
-            o->callback((Fl_Callback*)label_cb);
-            o->when(FL_WHEN_RELEASE | FL_WHEN_ENTER_KEY_CHANGED);
-            Fl_Group::current()->resizable(o);
-          } // Fl_Input* o
+          { wp_gui_label = new Fl_Input(95, 40, 190, 20);
+            wp_gui_label->tooltip("The label text for the widget.\nUse Ctrl-J for newlines.");
+            wp_gui_label->labelfont(1);
+            wp_gui_label->labelsize(11);
+            wp_gui_label->textsize(11);
+            wp_gui_label->callback((Fl_Callback*)label_cb);
+            wp_gui_label->when(FL_WHEN_RELEASE | FL_WHEN_ENTER_KEY_CHANGED);
+            Fl_Group::current()->resizable(wp_gui_label);
+          } // Fl_Input* wp_gui_label
           { Fl_Choice* o = new Fl_Choice(285, 40, 119, 20);
             o->tooltip("The label style for the widget.");
             o->box(FL_THIN_UP_BOX);
@@ -1038,11 +1086,11 @@ Fl_Double_Window* make_widget_panel() {
           } // Fl_Button* o
           o->end();
         } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(95, 115, 310, 20, "Alignment:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+        { wp_gui_alignment = new Fl_Group(95, 115, 310, 20, "Alignment:");
+          wp_gui_alignment->labelfont(1);
+          wp_gui_alignment->labelsize(11);
+          wp_gui_alignment->callback((Fl_Callback*)propagate_load);
+          wp_gui_alignment->align(Fl_Align(FL_ALIGN_LEFT));
           { Fl_Button* o = new Fl_Button(95, 115, 30, 20, "Clip");
             o->tooltip("Clip the label to the inside of the widget.");
             o->type(1);
@@ -1120,8 +1168,8 @@ Fl_Double_Window* make_widget_panel() {
             o->labelsize(11);
             Fl_Group::current()->resizable(o);
           } // Fl_Box* o
-          o->end();
-        } // Fl_Group* o
+          wp_gui_alignment->end();
+        } // Fl_Group* wp_gui_alignment
         { Fl_Group* o = new Fl_Group(95, 150, 314, 20, "Position:");
           o->labelfont(1);
           o->labelsize(11);
@@ -1205,12 +1253,12 @@ sized to fit the container.");
           o->end();
         } // Fl_Group* o
         { // This group is only visible if the parent is an Fl_Flex widget
-          Fl_Group* o = new Fl_Group(95, 150, 314, 20, "Flex Parent:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)flex_size_group_cb);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
-          o->hide();
+          wp_gui_flexp = new Fl_Group(95, 150, 314, 20, "Flex Parent:");
+          wp_gui_flexp->labelfont(1);
+          wp_gui_flexp->labelsize(11);
+          wp_gui_flexp->callback((Fl_Callback*)flex_size_group_cb);
+          wp_gui_flexp->align(Fl_Align(FL_ALIGN_LEFT));
+          wp_gui_flexp->hide();
           { widget_flex_size = new Fl_Value_Input(95, 150, 55, 20, "Size:");
             widget_flex_size->tooltip("Fixed Width or Height for a horizontal or vertical Fl_Flex Parent.");
             widget_flex_size->labelsize(11);
@@ -1227,13 +1275,13 @@ sized to fit the container.");
           { Fl_Box* o = new Fl_Box(398, 150, 1, 20);
             Fl_Group::current()->resizable(o);
           } // Fl_Box* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(95, 185, 300, 20, "Values:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)values_group_cb);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+          wp_gui_flexp->end();
+        } // Fl_Group* wp_gui_flexp
+        { wp_gui_values = new Fl_Group(95, 185, 300, 20, "Values:");
+          wp_gui_values->labelfont(1);
+          wp_gui_values->labelsize(11);
+          wp_gui_values->callback((Fl_Callback*)values_group_cb);
+          wp_gui_values->align(Fl_Align(FL_ALIGN_LEFT));
           { Fl_Value_Input* o = new Fl_Value_Input(95, 185, 55, 20, "Size:");
             o->tooltip("The size of the slider.");
             o->labelsize(11);
@@ -1273,15 +1321,15 @@ sized to fit the container.");
           { Fl_Box* o = new Fl_Box(395, 185, 0, 20);
             Fl_Group::current()->resizable(o);
           } // Fl_Box* o
-          o->end();
-        } // Fl_Group* o
+          wp_gui_values->end();
+        } // Fl_Group* wp_gui_values
         { // This group is only visible for Fl_Flex widgets
-          Fl_Group* o = new Fl_Group(95, 185, 300, 20, "Margins:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)flex_margin_group_cb);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
-          o->hide();
+          wp_gui_margins = new Fl_Group(95, 185, 300, 20, "Margins:");
+          wp_gui_margins->labelfont(1);
+          wp_gui_margins->labelsize(11);
+          wp_gui_margins->callback((Fl_Callback*)flex_margin_group_cb);
+          wp_gui_margins->align(Fl_Align(FL_ALIGN_LEFT));
+          wp_gui_margins->hide();
           { Fl_Value_Input* o = new Fl_Value_Input(95, 185, 55, 20, "Left:");
             o->tooltip("Left margin in group.");
             o->labelsize(11);
@@ -1320,14 +1368,14 @@ sized to fit the container.");
           { Fl_Box* o = new Fl_Box(395, 185, 0, 20);
             Fl_Group::current()->resizable(o);
           } // Fl_Box* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(95, 185, 300, 20, "Size Range:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)size_range_group_cb);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
-          o->hide();
+          wp_gui_margins->end();
+        } // Fl_Group* wp_gui_margins
+        { wp_gui_sizerange = new Fl_Group(95, 185, 300, 20, "Size Range:");
+          wp_gui_sizerange->labelfont(1);
+          wp_gui_sizerange->labelsize(11);
+          wp_gui_sizerange->callback((Fl_Callback*)size_range_group_cb);
+          wp_gui_sizerange->align(Fl_Align(FL_ALIGN_LEFT));
+          wp_gui_sizerange->hide();
           { Fl_Value_Input* o = new Fl_Value_Input(95, 185, 55, 20, "Minimum Size:");
             o->tooltip("The size of the slider.");
             o->labelsize(11);
@@ -1375,34 +1423,34 @@ sized to fit the container.");
           { Fl_Box* o = new Fl_Box(395, 185, 0, 20);
             Fl_Group::current()->resizable(o);
           } // Fl_Box* o
-          o->end();
-        } // Fl_Group* o
+          wp_gui_sizerange->end();
+        } // Fl_Group* wp_gui_sizerange
         { Fl_Group* o = new Fl_Group(95, 210, 310, 20, "Shortcut:");
           o->labelfont(1);
           o->labelsize(11);
           o->callback((Fl_Callback*)propagate_load);
           o->align(Fl_Align(FL_ALIGN_LEFT));
           { // This is a special button that grabs keystrokes directly
-            Fl_Shortcut_Button* o = new Fl_Shortcut_Button(95, 210, 310, 20);
-            o->tooltip("The shortcut key for the widget.\nUse \'Backspace\' key to clear.");
-            o->box(FL_DOWN_BOX);
-            o->color(FL_BACKGROUND2_COLOR);
-            o->selection_color((Fl_Color)12);
-            o->labeltype(FL_NORMAL_LABEL);
-            o->labelfont(0);
-            o->labelsize(11);
-            o->labelcolor(FL_FOREGROUND_COLOR);
-            o->callback((Fl_Callback*)shortcut_in_cb);
-            o->align(Fl_Align(FL_ALIGN_CENTER));
-            o->when(FL_WHEN_CHANGED);
-          } // Fl_Shortcut_Button* o
+            wp_gui_shortcut = new Fl_Shortcut_Button(95, 210, 310, 20);
+            wp_gui_shortcut->tooltip("The shortcut key for the widget.\nUse \'Backspace\' key to clear.");
+            wp_gui_shortcut->box(FL_DOWN_BOX);
+            wp_gui_shortcut->color(FL_BACKGROUND2_COLOR);
+            wp_gui_shortcut->selection_color((Fl_Color)12);
+            wp_gui_shortcut->labeltype(FL_NORMAL_LABEL);
+            wp_gui_shortcut->labelfont(0);
+            wp_gui_shortcut->labelsize(11);
+            wp_gui_shortcut->labelcolor(FL_FOREGROUND_COLOR);
+            wp_gui_shortcut->callback((Fl_Callback*)shortcut_in_cb);
+            wp_gui_shortcut->align(Fl_Align(FL_ALIGN_CENTER));
+            wp_gui_shortcut->when(FL_WHEN_CHANGED);
+          } // Fl_Shortcut_Button* wp_gui_shortcut
           o->end();
         } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(95, 235, 300, 20, "X Class:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+        { wp_gui_xclass = new Fl_Group(95, 235, 300, 20, "X Class:");
+          wp_gui_xclass->labelfont(1);
+          wp_gui_xclass->labelsize(11);
+          wp_gui_xclass->callback((Fl_Callback*)propagate_load);
+          wp_gui_xclass->align(Fl_Align(FL_ALIGN_LEFT));
           { Fl_Input* o = new Fl_Input(95, 235, 95, 20, ":");
             o->tooltip("The X resource class.");
             o->labelfont(1);
@@ -1430,13 +1478,13 @@ sized to fit the container.");
             o->callback((Fl_Callback*)non_modal_cb);
             o->align(Fl_Align(132|FL_ALIGN_INSIDE));
           } // Fl_Light_Button* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(95, 260, 305, 20, "Attributes:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+          wp_gui_xclass->end();
+        } // Fl_Group* wp_gui_xclass
+        { wp_gui_attributes = new Fl_Group(95, 260, 305, 20, "Attributes:");
+          wp_gui_attributes->labelfont(1);
+          wp_gui_attributes->labelsize(11);
+          wp_gui_attributes->callback((Fl_Callback*)propagate_load);
+          wp_gui_attributes->align(Fl_Align(FL_ALIGN_LEFT));
           { Fl_Light_Button* o = new Fl_Light_Button(95, 260, 60, 20, "Visible");
             o->tooltip("Show the widget.");
             o->selection_color((Fl_Color)1);
@@ -1467,32 +1515,32 @@ sized to fit the container.");
             o->labelsize(11);
             Fl_Group::current()->resizable(o);
           } // Fl_Box* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Input* o = new Fl_Input(95, 285, 310, 20, "Tooltip:");
-          o->tooltip("The tooltip text for the widget.\nUse Ctrl-J for newlines.");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->textsize(11);
-          o->callback((Fl_Callback*)tooltip_cb);
-        } // Fl_Input* o
+          wp_gui_attributes->end();
+        } // Fl_Group* wp_gui_attributes
+        { wp_gui_tooltip = new Fl_Input(95, 285, 310, 20, "Tooltip:");
+          wp_gui_tooltip->tooltip("The tooltip text for the widget.\nUse Ctrl-J for newlines.");
+          wp_gui_tooltip->labelfont(1);
+          wp_gui_tooltip->labelsize(11);
+          wp_gui_tooltip->textsize(11);
+          wp_gui_tooltip->callback((Fl_Callback*)tooltip_cb);
+        } // Fl_Input* wp_gui_tooltip
         { Fl_Box* o = new Fl_Box(95, 305, 300, 5);
           o->hide();
           Fl_Group::current()->resizable(o);
         } // Fl_Box* o
-        o->end();
-        Fl_Group::current()->resizable(o);
-      } // Fl_Group* o
-      { Fl_Group* o = new Fl_Group(10, 30, 400, 330, "Style");
-        o->labelsize(11);
-        o->callback((Fl_Callback*)propagate_load);
-        o->when(FL_WHEN_NEVER);
-        o->hide();
-        { Fl_Group* o = new Fl_Group(95, 40, 309, 20, "Label Font:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+        wp_gui_tab->end();
+        Fl_Group::current()->resizable(wp_gui_tab);
+      } // Fl_Group* wp_gui_tab
+      { wp_style_tab = new Fl_Group(10, 30, 400, 330, "Style");
+        wp_style_tab->labelsize(11);
+        wp_style_tab->callback((Fl_Callback*)propagate_load);
+        wp_style_tab->when(FL_WHEN_NEVER);
+        wp_style_tab->hide();
+        { wp_style_label = new Fl_Group(95, 40, 309, 20, "Label Font:");
+          wp_style_label->labelfont(1);
+          wp_style_label->labelsize(11);
+          wp_style_label->callback((Fl_Callback*)propagate_load);
+          wp_style_label->align(Fl_Align(FL_ALIGN_LEFT));
           { Fl_Choice* o = new Fl_Choice(95, 40, 152, 20);
             o->tooltip("The style of the label text.");
             o->box(FL_THIN_UP_BOX);
@@ -1522,13 +1570,13 @@ sized to fit the container.");
             o->callback((Fl_Callback*)labelcolor_menu_cb);
             o->menu(colormenu);
           } // Fl_Menu_Button* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(95, 65, 309, 20, "Box:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+          wp_style_label->end();
+        } // Fl_Group* wp_style_label
+        { wp_style_box = new Fl_Group(95, 65, 309, 20, "Box:");
+          wp_style_box->labelfont(1);
+          wp_style_box->labelsize(11);
+          wp_style_box->callback((Fl_Callback*)propagate_load);
+          wp_style_box->align(Fl_Align(FL_ALIGN_LEFT));
           { Fl_Choice* o = new Fl_Choice(95, 65, 201, 20);
             o->tooltip("The \"up\" box of the widget.");
             o->box(FL_THIN_UP_BOX);
@@ -1549,20 +1597,19 @@ sized to fit the container.");
             o->callback((Fl_Callback*)color_menu_cb);
             o->menu(colormenu);
           } // Fl_Menu_Button* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(95, 90, 309, 20, "Down Box:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+          wp_style_box->end();
+        } // Fl_Group* wp_style_box
+        { wp_style_downbox = new Fl_Group(95, 90, 309, 20, "Down Box:");
+          wp_style_downbox->labelfont(1);
+          wp_style_downbox->labelsize(11);
+          wp_style_downbox->callback((Fl_Callback*)propagate_load);
+          wp_style_downbox->align(Fl_Align(FL_ALIGN_LEFT));
           { Fl_Choice* o = new Fl_Choice(95, 90, 201, 20);
             o->tooltip("The \"down\" box of the widget.");
             o->box(FL_THIN_UP_BOX);
             o->down_box(FL_BORDER_BOX);
             o->labelfont(1);
             o->labelsize(11);
-            o->labelcolor(FL_DARK2);
             o->textsize(11);
             o->callback((Fl_Callback*)down_box_cb);
             Fl_Group::current()->resizable(o);
@@ -1577,13 +1624,13 @@ sized to fit the container.");
             o->callback((Fl_Callback*)color2_menu_cb);
             o->menu(colormenu);
           } // Fl_Menu_Button* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(95, 115, 309, 20, "Text Font:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+          wp_style_downbox->end();
+        } // Fl_Group* wp_style_downbox
+        { wp_style_text = new Fl_Group(95, 115, 309, 20, "Text Font:");
+          wp_style_text->labelfont(1);
+          wp_style_text->labelsize(11);
+          wp_style_text->callback((Fl_Callback*)propagate_load);
+          wp_style_text->align(Fl_Align(FL_ALIGN_LEFT));
           { Fl_Choice* o = new Fl_Choice(95, 115, 152, 20);
             o->tooltip("The value text style.");
             o->box(FL_DOWN_BOX);
@@ -1613,8 +1660,8 @@ sized to fit the container.");
             o->callback((Fl_Callback*)textcolor_menu_cb);
             o->menu(colormenu);
           } // Fl_Menu_Button* o
-          o->end();
-        } // Fl_Group* o
+          wp_style_text->end();
+        } // Fl_Group* wp_style_text
         { Fl_Box* o = new Fl_Box(95, 165, 300, 40);
           o->labelsize(11);
           Fl_Group::current()->resizable(o);
@@ -1625,18 +1672,18 @@ sized to fit the container.");
           o->labelsize(11);
           o->callback((Fl_Callback*)compact_cb);
         } // Fl_Light_Button* o
-        o->end();
-      } // Fl_Group* o
-      { Fl_Group* o = new Fl_Group(10, 30, 400, 330, "C++");
-        o->labelsize(11);
-        o->callback((Fl_Callback*)propagate_load);
-        o->when(FL_WHEN_NEVER);
-        o->hide();
-        { Fl_Group* o = new Fl_Group(95, 40, 310, 20, "Class:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+        wp_style_tab->end();
+      } // Fl_Group* wp_style_tab
+      { wp_cpp_tab = new Fl_Group(10, 30, 400, 330, "C++");
+        wp_cpp_tab->labelsize(11);
+        wp_cpp_tab->callback((Fl_Callback*)propagate_load);
+        wp_cpp_tab->when(FL_WHEN_NEVER);
+        wp_cpp_tab->hide();
+        { wp_cpp_class = new Fl_Group(95, 40, 310, 20, "Class:");
+          wp_cpp_class->labelfont(1);
+          wp_cpp_class->labelsize(11);
+          wp_cpp_class->callback((Fl_Callback*)propagate_load);
+          wp_cpp_class->align(Fl_Align(FL_ALIGN_LEFT));
           { Fl_Input* o = new Fl_Input(95, 40, 172, 20);
             o->tooltip("The widget subclass.");
             o->labelfont(1);
@@ -1654,13 +1701,13 @@ sized to fit the container.");
             o->textsize(11);
             o->callback((Fl_Callback*)subtype_cb);
           } // Fl_Choice* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(95, 65, 310, 20, "Name:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+          wp_cpp_class->end();
+        } // Fl_Group* wp_cpp_class
+        { wp_cpp_name = new Fl_Group(95, 65, 310, 20, "Name:");
+          wp_cpp_name->labelfont(1);
+          wp_cpp_name->labelsize(11);
+          wp_cpp_name->callback((Fl_Callback*)propagate_load);
+          wp_cpp_name->align(Fl_Align(FL_ALIGN_LEFT));
           { Fl_Input* o = new Fl_Input(95, 65, 235, 20);
             o->tooltip("The name of the widget.");
             o->labelfont(1);
@@ -1688,8 +1735,8 @@ sized to fit the container.");
             o->hide();
             o->menu(menu_3);
           } // Fl_Choice* o
-          o->end();
-        } // Fl_Group* o
+          wp_cpp_name->end();
+        } // Fl_Group* wp_cpp_name
         { v_input[0] = new Fl_Input(95, 90, 310, 20, "Extra Code:");
           v_input[0]->tooltip("Extra initialization code for the widget.");
           v_input[0]->labelfont(1);
@@ -1764,11 +1811,11 @@ access the Widget pointer and \'v\' to access the user value.");
           o->end();
           Fl_Group::current()->resizable(o);
         } // Fl_Tile* o
-        { Fl_Group* o = new Fl_Group(95, 310, 310, 20, "User Data:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+        { wp_cpp_callback = new Fl_Group(95, 310, 310, 20, "User Data:");
+          wp_cpp_callback->labelfont(1);
+          wp_cpp_callback->labelsize(11);
+          wp_cpp_callback->callback((Fl_Callback*)propagate_load);
+          wp_cpp_callback->align(Fl_Align(FL_ALIGN_LEFT));
           { Fl_Input* o = new Fl_Input(95, 310, 158, 20);
             o->tooltip("The user data to pass into the callback code.");
             o->labelfont(1);
@@ -1789,8 +1836,8 @@ access the Widget pointer and \'v\' to access the user value.");
             o->when(FL_WHEN_CHANGED);
             o->menu(whenmenu);
           } // Fl_Menu_Button* o
-          o->end();
-        } // Fl_Group* o
+          wp_cpp_callback->end();
+        } // Fl_Group* wp_cpp_callback
         { Fl_Group* o = new Fl_Group(95, 332, 310, 26, "Type:");
           o->labelfont(1);
           o->labelsize(11);
@@ -1814,8 +1861,8 @@ access the Widget pointer and \'v\' to access the user value.");
           } // Fl_Box* w_when_box
           o->end();
         } // Fl_Group* o
-        o->end();
-      } // Fl_Group* o
+        wp_cpp_tab->end();
+      } // Fl_Group* wp_cpp_tab
       { widget_tab_grid_child = new Fl_Group(10, 30, 400, 330, "Grid Child");
         widget_tab_grid_child->labelsize(11);
         widget_tab_grid_child->callback((Fl_Callback*)propagate_load);
@@ -1898,11 +1945,11 @@ access the Widget pointer and \'v\' to access the user value.");
           } // Fl_Box* widget_grid_unlinked
           o->end();
         } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(95, 100, 315, 20, "Align:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+        { wp_gridc_align = new Fl_Group(95, 100, 315, 20, "Align:");
+          wp_gridc_align->labelfont(1);
+          wp_gridc_align->labelsize(11);
+          wp_gridc_align->callback((Fl_Callback*)propagate_load);
+          wp_gridc_align->align(Fl_Align(FL_ALIGN_LEFT));
           { Fl_Choice* o = new Fl_Choice(95, 100, 115, 20, "Horizontal");
             o->down_box(FL_BORDER_BOX);
             o->labelsize(11);
@@ -1923,13 +1970,13 @@ access the Widget pointer and \'v\' to access the user value.");
             o->hide();
             Fl_Group::current()->resizable(o);
           } // Fl_Box* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(95, 135, 315, 20, "Min. Size:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+          wp_gridc_align->end();
+        } // Fl_Group* wp_gridc_align
+        { wp_gridc_size = new Fl_Group(95, 135, 315, 20, "Min. Size:");
+          wp_gridc_size->labelfont(1);
+          wp_gridc_size->labelsize(11);
+          wp_gridc_size->callback((Fl_Callback*)propagate_load);
+          wp_gridc_size->align(Fl_Align(FL_ALIGN_LEFT));
           { Fluid_Coord_Input* o = new Fluid_Coord_Input(95, 135, 55, 20, "Width:");
             o->box(FL_DOWN_BOX);
             o->color(FL_BACKGROUND2_COLOR);
@@ -1960,8 +2007,8 @@ access the Widget pointer and \'v\' to access the user value.");
             o->hide();
             Fl_Group::current()->resizable(o);
           } // Fl_Box* o
-          o->end();
-        } // Fl_Group* o
+          wp_gridc_size->end();
+        } // Fl_Group* wp_gridc_size
         { Fl_Group* o = new Fl_Group(95, 170, 315, 20, "Span:");
           o->labelfont(1);
           o->labelsize(11);
@@ -2108,11 +2155,11 @@ access the Widget pointer and \'v\' to access the user value.");
           } // Fl_Box* o
           o->end();
         } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(95, 100, 315, 20, "Margin:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+        { wp_grid_margin = new Fl_Group(95, 100, 315, 20, "Margins:");
+          wp_grid_margin->labelfont(1);
+          wp_grid_margin->labelsize(11);
+          wp_grid_margin->callback((Fl_Callback*)propagate_load);
+          wp_grid_margin->align(Fl_Align(FL_ALIGN_LEFT));
           { Fl_Value_Input* o = new Fl_Value_Input(95, 100, 55, 20, "Left:");
             o->tooltip("Left margin in group.");
             o->labelsize(11);
@@ -2152,13 +2199,13 @@ access the Widget pointer and \'v\' to access the user value.");
           { Fl_Box* o = new Fl_Box(396, 100, 0, 20);
             Fl_Group::current()->resizable(o);
           } // Fl_Box* o
-          o->end();
-        } // Fl_Group* o
-        { Fl_Group* o = new Fl_Group(95, 135, 315, 20, "Gaps:");
-          o->labelfont(1);
-          o->labelsize(11);
-          o->callback((Fl_Callback*)propagate_load);
-          o->align(Fl_Align(FL_ALIGN_LEFT));
+          wp_grid_margin->end();
+        } // Fl_Group* wp_grid_margin
+        { wp_grid_gaps = new Fl_Group(95, 135, 315, 20, "Gaps:");
+          wp_grid_gaps->labelfont(1);
+          wp_grid_gaps->labelsize(11);
+          wp_grid_gaps->callback((Fl_Callback*)propagate_load);
+          wp_grid_gaps->align(Fl_Align(FL_ALIGN_LEFT));
           { Fl_Value_Input* o = new Fl_Value_Input(95, 135, 55, 20, "Row:");
             o->tooltip("Gap between children.");
             o->labelsize(11);
@@ -2180,8 +2227,8 @@ access the Widget pointer and \'v\' to access the user value.");
           { Fl_Box* o = new Fl_Box(396, 135, 0, 20);
             Fl_Group::current()->resizable(o);
           } // Fl_Box* o
-          o->end();
-        } // Fl_Group* o
+          wp_grid_gaps->end();
+        } // Fl_Group* wp_grid_gaps
         { Fl_Group* o = new Fl_Group(95, 175, 315, 20, "Row:");
           o->labelfont(1);
           o->labelsize(11);
diff --git fluid/widget_panel.fl fluid/widget_panel.fl
index de9863c..b6ee299 100644
--- fluid/widget_panel.fl
+++ fluid/widget_panel.fl
@@ -335,7 +335,7 @@ Function {make_widget_panel()} {
 } {
   Fl_Window {} {
     comment {Use a Double Window to avoid flickering.} open
-    xywh {160 297 420 400} type Double labelsize 11 align 80 resizable hotspot
+    xywh {430 217 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_Tabs widget_tabs {
@@ -343,9 +343,9 @@ Function {make_widget_panel()} {
       xywh {10 10 400 350} selection_color 12 labelsize 11 labelcolor 7 when 0 resizable
       code0 {o->show();}
     } {
-      Fl_Group {} {
+      Fl_Group wp_gui_tab {
         label GUI
-        callback propagate_load open
+        callback propagate_load open selected
         xywh {10 30 400 330} labelsize 11 when 0 resizable
       } {
         Fl_Group {} {
@@ -353,7 +353,7 @@ Function {make_widget_panel()} {
           callback propagate_load open
           xywh {95 40 309 20} labelfont 1 labelsize 11 align 4
         } {
-          Fl_Input {} {
+          Fl_Input wp_gui_label {
             callback label_cb
             tooltip {The label text for the widget.
 Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 15 textsize 11 resizable
@@ -402,7 +402,7 @@ Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 15 t
             tooltip {Click to choose the inactive image.} xywh {295 90 89 20} labelsize 11
           }
         }
-        Fl_Group {} {
+        Fl_Group wp_gui_alignment {
           label {Alignment:}
           callback propagate_load
           xywh {95 115 310 20} labelfont 1 labelsize 11 align 4
@@ -561,7 +561,7 @@ Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 15 t
           Fl_Button {} {
             label {@-3square}
             user_data {(fl_intptr_t)FL_ALIGN_INSIDE}
-            callback align_cb selected
+            callback align_cb
             tooltip {Show the label inside the widget.} xywh {384 115 20 20} type Toggle selection_color 8 labelsize 11 labelcolor 8
           }
           Fl_Box {} {
@@ -570,7 +570,7 @@ Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 15 t
         }
         Fl_Group {} {
           label {Position:}
-          callback position_group_cb
+          callback position_group_cb open
           xywh {95 150 314 20} labelfont 1 labelsize 11 align 4
         } {
           Fl_Input widget_x_input {
@@ -627,7 +627,7 @@ h, ph, sh, ch, and i} xywh {275 150 55 20} labelsize 11 align 5 textsize 11
             xywh {399 150 1 20} hide resizable
           }
         }
-        Fl_Group {} {
+        Fl_Group wp_gui_flexp {
           label {Flex Parent:}
           callback flex_size_group_cb
           comment {This group is only visible if the parent is an Fl_Flex widget}
@@ -647,7 +647,7 @@ h, ph, sh, ch, and i} xywh {275 150 55 20} labelsize 11 align 5 textsize 11
             xywh {398 150 1 20} resizable
           }
         }
-        Fl_Group {} {
+        Fl_Group wp_gui_values {
           label {Values:}
           callback values_group_cb open
           xywh {95 185 300 20} labelfont 1 labelsize 11 align 4
@@ -681,7 +681,7 @@ h, ph, sh, ch, and i} xywh {275 150 55 20} labelsize 11 align 5 textsize 11
             xywh {395 185 0 20} resizable
           }
         }
-        Fl_Group {} {
+        Fl_Group wp_gui_margins {
           label {Margins:}
           callback flex_margin_group_cb
           comment {This group is only visible for Fl_Flex widgets}
@@ -716,7 +716,7 @@ h, ph, sh, ch, and i} xywh {275 150 55 20} labelsize 11 align 5 textsize 11
             xywh {395 185 0 20} resizable
           }
         }
-        Fl_Group {} {
+        Fl_Group wp_gui_sizerange {
           label {Size Range:}
           callback size_range_group_cb open
           xywh {95 185 300 20} labelfont 1 labelsize 11 align 4 hide
@@ -755,10 +755,10 @@ h, ph, sh, ch, and i} xywh {275 150 55 20} labelsize 11 align 5 textsize 11
         }
         Fl_Group {} {
           label {Shortcut:}
-          callback propagate_load
+          callback propagate_load open
           xywh {95 210 310 20} labelfont 1 labelsize 11 align 4
         } {
-          Fl_Button {} {
+          Fl_Button wp_gui_shortcut {
             callback shortcut_in_cb
             comment {This is a special button that grabs keystrokes directly}
             tooltip {The shortcut key for the widget.
@@ -767,7 +767,7 @@ Use 'Backspace' key to clear.} xywh {95 210 310 20} box DOWN_BOX color 7 selecti
             class Fl_Shortcut_Button
           }
         }
-        Fl_Group {} {
+        Fl_Group wp_gui_xclass {
           label {X Class:}
           callback propagate_load
           xywh {95 235 300 20} labelfont 1 labelsize 11 align 4
@@ -793,7 +793,7 @@ Use 'Backspace' key to clear.} xywh {95 210 310 20} box DOWN_BOX color 7 selecti
             tooltip {Make the window non-modal.} xywh {320 235 75 20} selection_color 1 labelsize 11 align 148
           }
         }
-        Fl_Group {} {
+        Fl_Group wp_gui_attributes {
           label {Attributes:}
           callback propagate_load
           xywh {95 260 305 20} labelfont 1 labelsize 11 align 4
@@ -822,7 +822,7 @@ Use 'Backspace' key to clear.} xywh {95 210 310 20} box DOWN_BOX color 7 selecti
             xywh {395 260 0 20} labelsize 11 resizable
           }
         }
-        Fl_Input {} {
+        Fl_Input wp_gui_tooltip {
           label {Tooltip:}
           callback tooltip_cb
           tooltip {The tooltip text for the widget.
@@ -832,12 +832,12 @@ Use Ctrl-J for newlines.} xywh {95 285 310 20} labelfont 1 labelsize 11 textsize
           xywh {95 305 300 5} hide resizable
         }
       }
-      Fl_Group {} {
+      Fl_Group wp_style_tab {
         label Style
         callback propagate_load open
         xywh {10 30 400 330} labelsize 11 when 0 hide
       } {
-        Fl_Group {} {
+        Fl_Group wp_style_label {
           label {Label Font:}
           callback propagate_load open
           xywh {95 40 309 20} labelfont 1 labelsize 11 align 4
@@ -864,7 +864,7 @@ Use Ctrl-J for newlines.} xywh {95 285 310 20} labelfont 1 labelsize 11 textsize
             code1 {o->menu(colormenu);}
           } {}
         }
-        Fl_Group {} {
+        Fl_Group wp_style_box {
           label {Box:}
           callback propagate_load open
           xywh {95 65 309 20} labelfont 1 labelsize 11 align 4
@@ -887,14 +887,14 @@ Use Ctrl-J for newlines.} xywh {95 285 310 20} labelfont 1 labelsize 11 textsize
             code1 {o->menu(colormenu);}
           } {}
         }
-        Fl_Group {} {
+        Fl_Group wp_style_downbox {
           label {Down Box:}
           callback propagate_load open
           xywh {95 90 309 20} labelfont 1 labelsize 11 align 4
         } {
           Fl_Choice {} {
             callback down_box_cb open
-            tooltip {The "down" box of the widget.} xywh {95 90 201 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 labelcolor 45 textsize 11 resizable
+            tooltip {The "down" box of the widget.} xywh {95 90 201 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable
             code0 {extern Fl_Menu_Item boxmenu[];}
             code1 {o->menu(boxmenu);}
           } {}
@@ -910,7 +910,7 @@ Use Ctrl-J for newlines.} xywh {95 285 310 20} labelfont 1 labelsize 11 textsize
             code1 {o->menu(colormenu);}
           } {}
         }
-        Fl_Group {} {
+        Fl_Group wp_style_text {
           label {Text Font:}
           callback propagate_load open
           xywh {95 115 309 20} labelfont 1 labelsize 11 align 4
@@ -946,12 +946,12 @@ Use Ctrl-J for newlines.} xywh {95 285 310 20} labelfont 1 labelsize 11 textsize
           tooltip {use compact box types for closely set buttons} xywh {95 140 90 20} selection_color 1 labelsize 11
         }
       }
-      Fl_Group {} {
+      Fl_Group wp_cpp_tab {
         label {C++}
-        callback propagate_load
+        callback propagate_load open
         xywh {10 30 400 330} labelsize 11 when 0 hide
       } {
-        Fl_Group {} {
+        Fl_Group wp_cpp_class {
           label {Class:}
           callback propagate_load open
           xywh {95 40 310 20} labelfont 1 labelsize 11 align 4
@@ -966,9 +966,9 @@ Use Ctrl-J for newlines.} xywh {95 285 310 20} labelfont 1 labelsize 11 textsize
             tooltip {The widget subtype.} xywh {267 40 138 20} box THIN_UP_BOX down_box BORDER_BOX labelsize 11 textsize 11
           } {}
         }
-        Fl_Group {} {
+        Fl_Group wp_cpp_name {
           label {Name:}
-          callback propagate_load open
+          callback propagate_load
           xywh {95 65 310 20} labelfont 1 labelsize 11 align 4
         } {
           Fl_Input {} {
@@ -1059,7 +1059,7 @@ wCallback->do_callback(wCallback, v);} open
             }
           }
         }
-        Fl_Group {} {
+        Fl_Group wp_cpp_callback {
           label {User Data:}
           callback propagate_load open
           xywh {95 310 310 20} labelfont 1 labelsize 11 align 4
@@ -1179,7 +1179,7 @@ wCallback->do_callback(wCallback, v);} open
             xywh {250 60 80 20} labelsize 11 labelcolor 1 hide
           }
         }
-        Fl_Group {} {
+        Fl_Group wp_gridc_align {
           label {Align:}
           callback propagate_load open
           xywh {95 100 315 20} labelfont 1 labelsize 11 align 4
@@ -1240,7 +1240,7 @@ wCallback->do_callback(wCallback, v);} open
             xywh {395 100 1 20} hide resizable
           }
         }
-        Fl_Group {} {
+        Fl_Group wp_gridc_size {
           label {Min. Size:}
           callback propagate_load open
           xywh {95 135 315 20} labelfont 1 labelsize 11 align 4
@@ -1432,8 +1432,8 @@ if (v == LOAD) {
             xywh {396 60 0 20} resizable
           }
         }
-        Fl_Group {} {
-          label {Margin:}
+        Fl_Group wp_grid_margin {
+          label {Margins:}
           callback propagate_load open
           xywh {95 100 315 20} labelfont 1 labelsize 11 align 4
         } {
@@ -1521,7 +1521,7 @@ if (v == LOAD) {
             xywh {396 100 0 20} resizable
           }
         }
-        Fl_Group {} {
+        Fl_Group wp_grid_gaps {
           label {Gaps:}
           callback propagate_load open
           xywh {95 135 315 20} labelfont 1 labelsize 11 align 4
diff --git fluid/widget_panel.h fluid/widget_panel.h
index 013fa4a..38a2599 100644
--- fluid/widget_panel.h
+++ fluid/widget_panel.h
@@ -45,8 +45,10 @@ Fl_Double_Window* make_image_panel();
 void run_image_panel();
 #include <FL/Fl_Tabs.H>
 extern Fl_Tabs *widget_tabs;
+extern Fl_Group *wp_gui_tab;
 #include <FL/Fl_Input.H>
 extern void label_cb(Fl_Input*, void*);
+extern Fl_Input *wp_gui_label;
 #include <FL/Fl_Choice.H>
 extern Fl_Menu_Item labeltypemenu[];
 extern void labeltype_cb(Fl_Choice*, void*);
@@ -56,6 +58,7 @@ extern void image_browse_cb(Fl_Button*, void*);
 extern void inactive_cb(Fl_Input*, void*);
 extern Fl_Input *widget_deimage_input;
 extern void inactive_browse_cb(Fl_Button*, void*);
+extern Fl_Group *wp_gui_alignment;
 extern void align_cb(Fl_Button*, void*);
 extern void align_text_image_cb(Fl_Choice*, void*);
 extern void align_position_cb(Fl_Choice*, void*);
@@ -70,24 +73,28 @@ extern void h_cb(Fluid_Coord_Input*, void*);
 extern Fluid_Coord_Input *widget_h_input;
 extern void wc_relative_cb(Fl_Choice*, void*);
 extern void flex_size_group_cb(Fl_Group*, void*);
+extern Fl_Group *wp_gui_flexp;
 #include <FL/Fl_Value_Input.H>
 extern void flex_size_cb(Fl_Value_Input*, void*);
 extern Fl_Value_Input *widget_flex_size;
 extern void flex_fixed_cb(Fl_Check_Button*, void*);
 extern Fl_Check_Button *widget_flex_fixed;
 extern void values_group_cb(Fl_Group*, void*);
+extern Fl_Group *wp_gui_values;
 extern void slider_size_cb(Fl_Value_Input*, void*);
 extern void min_cb(Fl_Value_Input*, void*);
 extern void max_cb(Fl_Value_Input*, void*);
 extern void step_cb(Fl_Value_Input*, void*);
 extern void value_cb(Fl_Value_Input*, void*);
 extern void flex_margin_group_cb(Fl_Group*, void*);
+extern Fl_Group *wp_gui_margins;
 extern void flex_margin_left_cb(Fl_Value_Input*, void*);
 extern void flex_margin_top_cb(Fl_Value_Input*, void*);
 extern void flex_margin_right_cb(Fl_Value_Input*, void*);
 extern void flex_margin_bottom_cb(Fl_Value_Input*, void*);
 extern void flex_margin_gap_cb(Fl_Value_Input*, void*);
 extern void size_range_group_cb(Fl_Group*, void*);
+extern Fl_Group *wp_gui_sizerange;
 extern void min_w_cb(Fl_Value_Input*, void*);
 extern void min_h_cb(Fl_Value_Input*, void*);
 extern void set_min_size_cb(Fl_Button*, void*);
@@ -96,16 +103,22 @@ extern void max_h_cb(Fl_Value_Input*, void*);
 extern void set_max_size_cb(Fl_Button*, void*);
 #include <FL/Fl_Shortcut_Button.H>
 extern void shortcut_in_cb(Fl_Shortcut_Button*, void*);
+extern Fl_Shortcut_Button *wp_gui_shortcut;
+extern Fl_Group *wp_gui_xclass;
 extern void xclass_cb(Fl_Input*, void*);
 #include <FL/Fl_Light_Button.H>
 extern void border_cb(Fl_Light_Button*, void*);
 extern void modal_cb(Fl_Light_Button*, void*);
 extern void non_modal_cb(Fl_Light_Button*, void*);
+extern Fl_Group *wp_gui_attributes;
 extern void visible_cb(Fl_Light_Button*, void*);
 extern void active_cb(Fl_Light_Button*, void*);
 extern void resizable_cb(Fl_Light_Button*, void*);
 extern void hotspot_cb(Fl_Light_Button*, void*);
 extern void tooltip_cb(Fl_Input*, void*);
+extern Fl_Input *wp_gui_tooltip;
+extern Fl_Group *wp_style_tab;
+extern Fl_Group *wp_style_label;
 extern Fl_Menu_Item fontmenu[];
 extern void labelfont_cb(Fl_Choice*, void*);
 extern void labelsize_cb(Fl_Value_Input*, void*);
@@ -114,23 +127,29 @@ extern Fl_Button *w_labelcolor;
 #include <FL/Fl_Menu_Button.H>
 extern Fl_Menu_Item colormenu[];
 extern void labelcolor_menu_cb(Fl_Menu_Button*, void*);
+extern Fl_Group *wp_style_box;
 extern Fl_Menu_Item boxmenu[];
 extern void box_cb(Fl_Choice*, void*);
 extern void color_cb(Fl_Button*, void*);
 extern Fl_Button *w_color;
 extern void color_menu_cb(Fl_Menu_Button*, void*);
+extern Fl_Group *wp_style_downbox;
 extern void down_box_cb(Fl_Choice*, void*);
 extern void color2_cb(Fl_Button*, void*);
 extern Fl_Button *w_selectcolor;
 extern void color2_menu_cb(Fl_Menu_Button*, void*);
+extern Fl_Group *wp_style_text;
 extern void textfont_cb(Fl_Choice*, void*);
 extern void textsize_cb(Fl_Value_Input*, void*);
 extern void textcolor_cb(Fl_Button*, void*);
 extern Fl_Button *w_textcolor;
 extern void textcolor_menu_cb(Fl_Menu_Button*, void*);
 extern void compact_cb(Fl_Light_Button*, void*);
+extern Fl_Group *wp_cpp_tab;
+extern Fl_Group *wp_cpp_class;
 extern void subclass_cb(Fl_Input*, void*);
 extern void subtype_cb(Fl_Choice*, void*);
+extern Fl_Group *wp_cpp_name;
 extern void name_cb(Fl_Input*, void*);
 extern void name_public_member_cb(Fl_Choice*, void*);
 extern void name_public_cb(Fl_Choice*, void*);
@@ -142,6 +161,7 @@ extern Fl_Text_Editor *wComment;
 #include "CodeEditor.h"
 extern void callback_cb(CodeEditor*, void*);
 extern CodeEditor *wCallback;
+extern Fl_Group *wp_cpp_callback;
 extern void user_data_cb(Fl_Input*, void*);
 extern Fl_Menu_Item whenmenu[];
 extern void when_cb(Fl_Menu_Button*, void*);
@@ -159,8 +179,10 @@ extern void grid_dec_col_cb(Fl_Button*, void*);
 extern void grid_inc_col_cb(Fl_Button*, void*);
 extern Fl_Box *widget_grid_transient;
 extern Fl_Box *widget_grid_unlinked;
+extern Fl_Group *wp_gridc_align;
 extern void grid_align_horizontal_cb(Fl_Choice*, void*);
 extern void grid_align_vertical_cb(Fl_Choice*, void*);
+extern Fl_Group *wp_gridc_size;
 extern void grid_set_min_wdt_cb(Fluid_Coord_Input*, void*);
 extern void grid_set_min_hgt_cb(Fluid_Coord_Input*, void*);
 extern void grid_set_rowspan_cb(Fluid_Coord_Input*, void*);
@@ -174,6 +196,8 @@ extern void grid_inc_colspan_cb(Fl_Button*, void*);
 extern Fl_Group *widget_tab_grid;
 extern Fluid_Coord_Input *widget_grid_rows;
 extern Fluid_Coord_Input *widget_grid_cols;
+extern Fl_Group *wp_grid_margin;
+extern Fl_Group *wp_grid_gaps;
 extern Fluid_Coord_Input *widget_grid_curr_row;
 extern Fl_Group *widget_grid_curr_row_attributes;
 extern Fluid_Coord_Input *widget_grid_curr_col;
diff --git src/Fl_Input_Choice.cxx src/Fl_Input_Choice.cxx
index fcb9f9c..534e68f 100644
--- src/Fl_Input_Choice.cxx
+++ src/Fl_Input_Choice.cxx
@@ -230,14 +230,21 @@ void Fl_Input_Choice::menu_cb(Fl_Widget*, void *data) {
 void Fl_Input_Choice::inp_cb(Fl_Widget*, void *data) {
   Fl_Input_Choice *o=(Fl_Input_Choice *)data;
   Fl_Widget_Tracker wp(o);
-  if (o->inp_->changed()) {
-    o->Fl_Widget::set_changed();
-    if (o->when() & (FL_WHEN_CHANGED|FL_WHEN_RELEASE))
-      o->do_callback(FL_REASON_CHANGED);
+  if (  (   (Fl::callback_reason()==FL_REASON_RELEASED)
+         || (Fl::callback_reason()==FL_REASON_LOST_FOCUS) )
+      && (o->when() & FL_WHEN_RELEASE) ) 
+  {
+    o->do_callback(FL_REASON_RELEASED);
   } else {
-    o->Fl_Widget::clear_changed();
-    if (o->when() & FL_WHEN_NOT_CHANGED)
-      o->do_callback(FL_REASON_RESELECTED);
+    if (o->inp_->changed()) {
+      o->Fl_Widget::set_changed();
+      if (o->when() & FL_WHEN_CHANGED)
+        o->do_callback(FL_REASON_CHANGED);
+    } else {
+      o->Fl_Widget::clear_changed();
+      if (o->when() & FL_WHEN_NOT_CHANGED)
+        o->do_callback(FL_REASON_RESELECTED);
+    }
   }
 
   if (wp.deleted()) return;
@@ -259,7 +266,7 @@ Fl_Input_Choice::Fl_Input_Choice (int X, int Y, int W, int H, const char *L)
   inp_ = new Fl_Input(inp_x(), inp_y(), inp_w(), inp_h());
   inp_->callback(inp_cb, (void*)this);
   inp_->box(FL_FLAT_BOX);                               // cosmetic
-  inp_->when(FL_WHEN_CHANGED|FL_WHEN_NOT_CHANGED);
+  inp_->when(FL_WHEN_CHANGED|FL_WHEN_NOT_CHANGED|FL_WHEN_RELEASE);
   menu_ = new InputMenuButton(menu_x(), menu_y(), menu_w(), menu_h());
   menu_->callback(menu_cb, (void*)this);
   end();
diff --git src/Fl_get_system_colors.cxx src/Fl_get_system_colors.cxx
index e0a78fd..ecc08a5 100644
--- src/Fl_get_system_colors.cxx
+++ src/Fl_get_system_colors.cxx
@@ -186,10 +186,11 @@ static Fl_Pixmap        tile(tile_xpm);
 
   \param[in]  s   Scheme name of NULL
 
-  \returns    Current scheme name or NULL
-  \retval     NULL if the scheme has not been set or is the default scheme
+  \retval     0 if the scheme has not been set or is the default scheme
+  \retval     1 if a scheme other than "none"/"base" was set
 
-  \see Fl::is_scheme()
+  \see Fl::scheme() to get the name of the current scheme
+  \see Fl::is_scheme(const char*) to test if the specified scheme is set
 */
 int Fl::scheme(const char *s) {
   if (!s) {
@@ -197,12 +198,12 @@ int Fl::scheme(const char *s) {
   }
 
   if (s) {
-    if (!fl_ascii_strcasecmp(s, "none") || !fl_ascii_strcasecmp(s, "base") || !*s) s = 0;
+    if (!fl_ascii_strcasecmp(s, "none") || !fl_ascii_strcasecmp(s, "base") || !*s) s = NULL;
     else if (!fl_ascii_strcasecmp(s, "gtk+")) s = fl_strdup("gtk+");
     else if (!fl_ascii_strcasecmp(s, "plastic")) s = fl_strdup("plastic");
     else if (!fl_ascii_strcasecmp(s, "gleam")) s = fl_strdup("gleam");
     else if (!fl_ascii_strcasecmp(s, "oxy")) s = fl_strdup("oxy");
-    else s = 0;
+    else s = NULL;
   }
   if (scheme_) free((void*)scheme_);
   scheme_ = s;
@@ -210,12 +211,13 @@ int Fl::scheme(const char *s) {
   // Save the new scheme in the FLTK_SCHEME env var so that child processes
   // inherit it...
   static char e[1024];
-  strcpy(e,"FLTK_SCHEME=");
-  if (s) strlcat(e,s,sizeof(e));
+  strcpy(e, "FLTK_SCHEME=");
+  if (s) strlcat(e, s, sizeof(e));
   Fl::system_driver()->putenv(e);
 
   // Load the scheme...
-  return reload_scheme();
+  reload_scheme();
+  return (s != NULL);
 }
 
 /**
Direct Link to Message ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.