aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitlab-ci.yml85
-rw-r--r--FiraSans-Bold.ttf (renamed from ttf/FiraSans-Bold.ttf)bin521312 -> 521312 bytes
-rw-r--r--README.md52
-rw-r--r--VERSION2
-rw-r--r--d2tk.ttl372
-rw-r--r--d2tk_ui.ttl32
-rw-r--r--manifest.ttl.in34
-rw-r--r--meson.build442
-rw-r--r--meson_options.txt37
-rw-r--r--plug.c167
-rw-r--r--plug.h34
-rw-r--r--plug_ui.c384
-rw-r--r--subprojects/d2tk/.gitignore (renamed from .gitignore)0
-rw-r--r--subprojects/d2tk/.gitlab-ci.yml125
-rw-r--r--subprojects/d2tk/COPYING201
-rw-r--r--subprojects/d2tk/Doxyfile (renamed from Doxyfile)0
-rw-r--r--subprojects/d2tk/README.md62
-rw-r--r--subprojects/d2tk/VERSION1
-rwxr-xr-xsubprojects/d2tk/check_for_font (renamed from check_for_font)0
-rw-r--r--subprojects/d2tk/d2tk/backend.h (renamed from d2tk/backend.h)0
-rw-r--r--subprojects/d2tk/d2tk/base.h (renamed from d2tk/base.h)0
-rw-r--r--subprojects/d2tk/d2tk/config.h.in (renamed from d2tk/config.h.in)0
-rw-r--r--subprojects/d2tk/d2tk/core.h (renamed from d2tk/core.h)0
-rw-r--r--subprojects/d2tk/d2tk/d2tk.h (renamed from d2tk/d2tk.h)0
-rw-r--r--subprojects/d2tk/d2tk/frontend.h (renamed from d2tk/frontend.h)0
-rw-r--r--subprojects/d2tk/d2tk/frontend_fbdev.h (renamed from d2tk/frontend_fbdev.h)0
-rw-r--r--subprojects/d2tk/d2tk/frontend_pugl.h (renamed from d2tk/frontend_pugl.h)0
-rw-r--r--subprojects/d2tk/d2tk/hash.h (renamed from d2tk/hash.h)0
-rw-r--r--subprojects/d2tk/example/d2tk_fbdev.c (renamed from example/d2tk_fbdev.c)0
-rw-r--r--subprojects/d2tk/example/d2tk_pugl.c (renamed from example/d2tk_pugl.c)0
-rw-r--r--subprojects/d2tk/example/example.c (renamed from example/example.c)0
-rw-r--r--subprojects/d2tk/example/example.h (renamed from example/example.h)0
-rw-r--r--subprojects/d2tk/example/libre-arrow-circle-right.png (renamed from example/libre-arrow-circle-right.png)bin2133 -> 2133 bytes
-rw-r--r--subprojects/d2tk/example/libre-gui-file.png (renamed from example/libre-gui-file.png)bin1034 -> 1034 bytes
-rw-r--r--subprojects/d2tk/example/libre-gui-folder.png (renamed from example/libre-gui-folder.png)bin710 -> 710 bytes
-rw-r--r--subprojects/d2tk/glew-2.1.0/GL/eglew.h (renamed from glew-2.1.0/GL/eglew.h)0
-rw-r--r--subprojects/d2tk/glew-2.1.0/GL/glew.h (renamed from glew-2.1.0/GL/glew.h)0
-rw-r--r--subprojects/d2tk/glew-2.1.0/GL/glxew.h (renamed from glew-2.1.0/GL/glxew.h)0
-rw-r--r--subprojects/d2tk/glew-2.1.0/GL/wglew.h (renamed from glew-2.1.0/GL/wglew.h)0
-rw-r--r--subprojects/d2tk/glew-2.1.0/glew.c (renamed from glew-2.1.0/glew.c)0
-rw-r--r--subprojects/d2tk/meson.build392
-rw-r--r--subprojects/d2tk/meson_options.txt43
-rw-r--r--subprojects/d2tk/nanovg/.gitignore (renamed from nanovg/.gitignore)0
-rw-r--r--subprojects/d2tk/nanovg/LICENSE.txt (renamed from nanovg/LICENSE.txt)0
-rw-r--r--subprojects/d2tk/nanovg/README.md (renamed from nanovg/README.md)0
-rw-r--r--subprojects/d2tk/nanovg/example/LICENSE_OFL.txt (renamed from nanovg/example/LICENSE_OFL.txt)0
-rw-r--r--subprojects/d2tk/nanovg/example/NotoEmoji-Regular.ttf (renamed from nanovg/example/NotoEmoji-Regular.ttf)bin418804 -> 418804 bytes
-rwxr-xr-xsubprojects/d2tk/nanovg/example/Roboto-Bold.ttf (renamed from nanovg/example/Roboto-Bold.ttf)bin135820 -> 135820 bytes
-rwxr-xr-xsubprojects/d2tk/nanovg/example/Roboto-Light.ttf (renamed from nanovg/example/Roboto-Light.ttf)bin140276 -> 140276 bytes
-rwxr-xr-xsubprojects/d2tk/nanovg/example/Roboto-Regular.ttf (renamed from nanovg/example/Roboto-Regular.ttf)bin145348 -> 145348 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/demo.c (renamed from nanovg/example/demo.c)0
-rw-r--r--subprojects/d2tk/nanovg/example/demo.h (renamed from nanovg/example/demo.h)0
-rw-r--r--subprojects/d2tk/nanovg/example/entypo.ttf (renamed from nanovg/example/entypo.ttf)bin35392 -> 35392 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/example_fbo.c (renamed from nanovg/example/example_fbo.c)0
-rw-r--r--subprojects/d2tk/nanovg/example/example_gl2.c (renamed from nanovg/example/example_gl2.c)0
-rw-r--r--subprojects/d2tk/nanovg/example/example_gl3.c (renamed from nanovg/example/example_gl3.c)0
-rw-r--r--subprojects/d2tk/nanovg/example/example_gles2.c (renamed from nanovg/example/example_gles2.c)0
-rw-r--r--subprojects/d2tk/nanovg/example/example_gles3.c (renamed from nanovg/example/example_gles3.c)0
-rw-r--r--subprojects/d2tk/nanovg/example/images.txt (renamed from nanovg/example/images.txt)0
-rw-r--r--subprojects/d2tk/nanovg/example/images/image1.jpg (renamed from nanovg/example/images/image1.jpg)bin25760 -> 25760 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/images/image10.jpg (renamed from nanovg/example/images/image10.jpg)bin3439 -> 3439 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/images/image11.jpg (renamed from nanovg/example/images/image11.jpg)bin3818 -> 3818 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/images/image12.jpg (renamed from nanovg/example/images/image12.jpg)bin5452 -> 5452 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/images/image2.jpg (renamed from nanovg/example/images/image2.jpg)bin24091 -> 24091 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/images/image3.jpg (renamed from nanovg/example/images/image3.jpg)bin29282 -> 29282 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/images/image4.jpg (renamed from nanovg/example/images/image4.jpg)bin23830 -> 23830 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/images/image5.jpg (renamed from nanovg/example/images/image5.jpg)bin27131 -> 27131 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/images/image6.jpg (renamed from nanovg/example/images/image6.jpg)bin25116 -> 25116 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/images/image7.jpg (renamed from nanovg/example/images/image7.jpg)bin25590 -> 25590 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/images/image8.jpg (renamed from nanovg/example/images/image8.jpg)bin24607 -> 24607 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/images/image9.jpg (renamed from nanovg/example/images/image9.jpg)bin4035 -> 4035 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/perf.c (renamed from nanovg/example/perf.c)0
-rw-r--r--subprojects/d2tk/nanovg/example/perf.h (renamed from nanovg/example/perf.h)0
-rw-r--r--subprojects/d2tk/nanovg/example/screenshot-01.png (renamed from nanovg/example/screenshot-01.png)bin989424 -> 989424 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/screenshot-02.png (renamed from nanovg/example/screenshot-02.png)bin229443 -> 229443 bytes
-rw-r--r--subprojects/d2tk/nanovg/example/stb_image_write.h (renamed from nanovg/example/stb_image_write.h)0
-rw-r--r--subprojects/d2tk/nanovg/obsolete/nanovg_gl2.h (renamed from nanovg/obsolete/nanovg_gl2.h)0
-rw-r--r--subprojects/d2tk/nanovg/obsolete/nanovg_gl3.h (renamed from nanovg/obsolete/nanovg_gl3.h)0
-rw-r--r--subprojects/d2tk/nanovg/obsolete/obsolete.md (renamed from nanovg/obsolete/obsolete.md)0
-rw-r--r--subprojects/d2tk/nanovg/premake4.lua (renamed from nanovg/premake4.lua)0
-rw-r--r--subprojects/d2tk/nanovg/src/fontstash.h (renamed from nanovg/src/fontstash.h)0
-rw-r--r--subprojects/d2tk/nanovg/src/nanovg.c (renamed from nanovg/src/nanovg.c)0
-rw-r--r--subprojects/d2tk/nanovg/src/nanovg.h (renamed from nanovg/src/nanovg.h)0
-rw-r--r--subprojects/d2tk/nanovg/src/nanovg_gl.h (renamed from nanovg/src/nanovg_gl.h)0
-rw-r--r--subprojects/d2tk/nanovg/src/nanovg_gl_utils.h (renamed from nanovg/src/nanovg_gl_utils.h)0
-rw-r--r--subprojects/d2tk/nanovg/src/stb_image.h (renamed from nanovg/src/stb_image.h)0
-rw-r--r--subprojects/d2tk/nanovg/src/stb_truetype.h (renamed from nanovg/src/stb_truetype.h)0
-rw-r--r--subprojects/d2tk/pugl/.clang-format (renamed from pugl/.clang-format)0
-rw-r--r--subprojects/d2tk/pugl/.clang-tidy (renamed from pugl/.clang-tidy)0
-rw-r--r--subprojects/d2tk/pugl/.gitattributes (renamed from pugl/.gitattributes)0
-rw-r--r--subprojects/d2tk/pugl/.gitignore (renamed from pugl/.gitignore)0
-rw-r--r--subprojects/d2tk/pugl/.gitlab-ci.yml (renamed from pugl/.gitlab-ci.yml)0
-rw-r--r--subprojects/d2tk/pugl/.gitmodules (renamed from pugl/.gitmodules)0
-rw-r--r--subprojects/d2tk/pugl/AUTHORS (renamed from pugl/AUTHORS)0
-rw-r--r--subprojects/d2tk/pugl/COPYING (renamed from pugl/COPYING)0
-rw-r--r--subprojects/d2tk/pugl/README.md (renamed from pugl/README.md)0
-rw-r--r--subprojects/d2tk/pugl/doc/footer.html (renamed from pugl/doc/footer.html)0
-rw-r--r--subprojects/d2tk/pugl/doc/header.html (renamed from pugl/doc/header.html)0
-rw-r--r--subprojects/d2tk/pugl/doc/layout.xml (renamed from pugl/doc/layout.xml)0
-rw-r--r--subprojects/d2tk/pugl/doc/mainpage.md (renamed from pugl/doc/mainpage.md)0
-rw-r--r--subprojects/d2tk/pugl/doc/reference.doxygen.in (renamed from pugl/doc/reference.doxygen.in)0
-rw-r--r--subprojects/d2tk/pugl/doc/style.css (renamed from pugl/doc/style.css)0
-rw-r--r--subprojects/d2tk/pugl/examples/cube_view.h (renamed from pugl/examples/cube_view.h)0
-rw-r--r--subprojects/d2tk/pugl/examples/demo_utils.h (renamed from pugl/examples/demo_utils.h)0
-rw-r--r--subprojects/d2tk/pugl/examples/glad/glad.c (renamed from pugl/examples/glad/glad.c)0
-rw-r--r--subprojects/d2tk/pugl/examples/glad/glad.h (renamed from pugl/examples/glad/glad.h)0
-rw-r--r--subprojects/d2tk/pugl/examples/glad/khrplatform.h (renamed from pugl/examples/glad/khrplatform.h)0
-rw-r--r--subprojects/d2tk/pugl/examples/pugl_cairo_demo.c (renamed from pugl/examples/pugl_cairo_demo.c)0
-rw-r--r--subprojects/d2tk/pugl/examples/pugl_embed_demo.c (renamed from pugl/examples/pugl_embed_demo.c)0
-rw-r--r--subprojects/d2tk/pugl/examples/pugl_gl3_demo.c (renamed from pugl/examples/pugl_gl3_demo.c)0
-rw-r--r--subprojects/d2tk/pugl/examples/pugl_print_events.c (renamed from pugl/examples/pugl_print_events.c)0
-rw-r--r--subprojects/d2tk/pugl/examples/pugl_window_demo.c (renamed from pugl/examples/pugl_window_demo.c)0
-rw-r--r--subprojects/d2tk/pugl/examples/shader_utils.h (renamed from pugl/examples/shader_utils.h)0
-rw-r--r--subprojects/d2tk/pugl/pugl.pc.in (renamed from pugl/pugl.pc.in)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/implementation.c (renamed from pugl/pugl/detail/implementation.c)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/implementation.h (renamed from pugl/pugl/detail/implementation.h)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/mac.h (renamed from pugl/pugl/detail/mac.h)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/mac.m (renamed from pugl/pugl/detail/mac.m)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/mac_cairo.m (renamed from pugl/pugl/detail/mac_cairo.m)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/mac_gl.m (renamed from pugl/pugl/detail/mac_gl.m)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/mac_stub.m (renamed from pugl/pugl/detail/mac_stub.m)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/types.h (renamed from pugl/pugl/detail/types.h)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/win.c (renamed from pugl/pugl/detail/win.c)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/win.h (renamed from pugl/pugl/detail/win.h)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/win_cairo.c (renamed from pugl/pugl/detail/win_cairo.c)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/win_gl.c (renamed from pugl/pugl/detail/win_gl.c)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/x11.c (renamed from pugl/pugl/detail/x11.c)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/x11.h (renamed from pugl/pugl/detail/x11.h)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/x11_cairo.c (renamed from pugl/pugl/detail/x11_cairo.c)0
-rw-r--r--subprojects/d2tk/pugl/pugl/detail/x11_gl.c (renamed from pugl/pugl/detail/x11_gl.c)0
-rw-r--r--subprojects/d2tk/pugl/pugl/gl.h (renamed from pugl/pugl/gl.h)0
-rw-r--r--subprojects/d2tk/pugl/pugl/glu.h (renamed from pugl/pugl/glu.h)0
-rw-r--r--subprojects/d2tk/pugl/pugl/pugl.h (renamed from pugl/pugl/pugl.h)0
-rw-r--r--subprojects/d2tk/pugl/pugl/pugl.hpp (renamed from pugl/pugl/pugl.hpp)0
-rw-r--r--subprojects/d2tk/pugl/pugl/pugl_cairo.h (renamed from pugl/pugl/pugl_cairo.h)0
-rw-r--r--subprojects/d2tk/pugl/pugl/pugl_cairo_backend.h (renamed from pugl/pugl/pugl_cairo_backend.h)0
-rw-r--r--subprojects/d2tk/pugl/pugl/pugl_gl.h (renamed from pugl/pugl/pugl_gl.h)0
-rw-r--r--subprojects/d2tk/pugl/pugl/pugl_gl_backend.h (renamed from pugl/pugl/pugl_gl_backend.h)0
-rw-r--r--subprojects/d2tk/pugl/pugl/pugl_stub.h (renamed from pugl/pugl/pugl_stub.h)0
-rw-r--r--subprojects/d2tk/pugl/pugl/pugl_stub_backend.h (renamed from pugl/pugl/pugl_stub_backend.h)0
-rw-r--r--subprojects/d2tk/pugl/resources/Info.plist.in (renamed from pugl/resources/Info.plist.in)0
-rw-r--r--subprojects/d2tk/pugl/resources/pugl.ipe (renamed from pugl/resources/pugl.ipe)0
-rw-r--r--subprojects/d2tk/pugl/resources/pugl.png (renamed from pugl/resources/pugl.png)bin2641 -> 2641 bytes
-rw-r--r--subprojects/d2tk/pugl/resources/pugl.svg (renamed from pugl/resources/pugl.svg)0
-rw-r--r--subprojects/d2tk/pugl/shaders/rect.frag (renamed from pugl/shaders/rect.frag)0
-rw-r--r--subprojects/d2tk/pugl/shaders/rect.vert (renamed from pugl/shaders/rect.vert)0
-rw-r--r--subprojects/d2tk/pugl/test/test_redisplay.c (renamed from pugl/test/test_redisplay.c)0
-rw-r--r--subprojects/d2tk/pugl/test/test_show_hide.c (renamed from pugl/test/test_show_hide.c)0
-rw-r--r--subprojects/d2tk/pugl/test/test_timer.c (renamed from pugl/test/test_timer.c)0
-rw-r--r--subprojects/d2tk/pugl/test/test_update.c (renamed from pugl/test/test_update.c)0
-rw-r--r--subprojects/d2tk/pugl/test/test_utils.h (renamed from pugl/test/test_utils.h)0
-rwxr-xr-xsubprojects/d2tk/pugl/waf (renamed from pugl/waf)0
-rw-r--r--subprojects/d2tk/pugl/wscript (renamed from pugl/wscript)0
-rw-r--r--subprojects/d2tk/screenshots/screenshot_1.png (renamed from screenshots/screenshot_1.png)bin149120 -> 149120 bytes
-rw-r--r--subprojects/d2tk/screenshots/screenshot_2.png (renamed from screenshots/screenshot_2.png)bin37532 -> 37532 bytes
-rw-r--r--subprojects/d2tk/screenshots/screenshot_3.png (renamed from screenshots/screenshot_3.png)bin128486 -> 128486 bytes
-rw-r--r--subprojects/d2tk/screenshots/screenshot_4.png (renamed from screenshots/screenshot_4.png)bin35888 -> 35888 bytes
-rw-r--r--subprojects/d2tk/screenshots/screenshot_5.png (renamed from screenshots/screenshot_5.png)bin51888 -> 51888 bytes
-rw-r--r--subprojects/d2tk/screenshots/screenshot_6.png (renamed from screenshots/screenshot_6.png)bin84697 -> 84697 bytes
-rw-r--r--subprojects/d2tk/screenshots/screenshot_7.png (renamed from screenshots/screenshot_7.png)bin42476 -> 42476 bytes
-rw-r--r--subprojects/d2tk/screenshots/screenshot_8.png (renamed from screenshots/screenshot_8.png)bin73108 -> 73108 bytes
-rw-r--r--subprojects/d2tk/src/backend_cairo.c (renamed from src/backend_cairo.c)0
-rw-r--r--subprojects/d2tk/src/backend_nanovg.c (renamed from src/backend_nanovg.c)0
-rw-r--r--subprojects/d2tk/src/base.c (renamed from src/base.c)0
-rw-r--r--subprojects/d2tk/src/base_bar.c (renamed from src/base_bar.c)0
-rw-r--r--subprojects/d2tk/src/base_bitmap.c (renamed from src/base_bitmap.c)0
-rw-r--r--subprojects/d2tk/src/base_button.c (renamed from src/base_button.c)0
-rw-r--r--subprojects/d2tk/src/base_combo.c (renamed from src/base_combo.c)0
-rw-r--r--subprojects/d2tk/src/base_cursor.c (renamed from src/base_cursor.c)0
-rw-r--r--subprojects/d2tk/src/base_custom.c (renamed from src/base_custom.c)0
-rw-r--r--subprojects/d2tk/src/base_dial.c (renamed from src/base_dial.c)0
-rw-r--r--subprojects/d2tk/src/base_flowmatrix.c (renamed from src/base_flowmatrix.c)0
-rw-r--r--subprojects/d2tk/src/base_frame.c (renamed from src/base_frame.c)0
-rw-r--r--subprojects/d2tk/src/base_image.c (renamed from src/base_image.c)0
-rw-r--r--subprojects/d2tk/src/base_internal.h (renamed from src/base_internal.h)0
-rw-r--r--subprojects/d2tk/src/base_label.c (renamed from src/base_label.c)0
-rw-r--r--subprojects/d2tk/src/base_layout.c (renamed from src/base_layout.c)0
-rw-r--r--subprojects/d2tk/src/base_link.c (renamed from src/base_link.c)0
-rw-r--r--subprojects/d2tk/src/base_meter.c (renamed from src/base_meter.c)0
-rw-r--r--subprojects/d2tk/src/base_pane.c (renamed from src/base_pane.c)0
-rw-r--r--subprojects/d2tk/src/base_pty.c (renamed from src/base_pty.c)0
-rw-r--r--subprojects/d2tk/src/base_scrollbar.c (renamed from src/base_scrollbar.c)0
-rw-r--r--subprojects/d2tk/src/base_spinner.c (renamed from src/base_spinner.c)0
-rw-r--r--subprojects/d2tk/src/base_table.c (renamed from src/base_table.c)0
-rw-r--r--subprojects/d2tk/src/base_textfield.c (renamed from src/base_textfield.c)0
-rw-r--r--subprojects/d2tk/src/base_vkb.c (renamed from src/base_vkb.c)0
-rw-r--r--subprojects/d2tk/src/core.c (renamed from src/core.c)0
-rw-r--r--subprojects/d2tk/src/core_internal.h (renamed from src/core_internal.h)0
-rw-r--r--subprojects/d2tk/src/frontend_fbdev.c (renamed from src/frontend_fbdev.c)0
-rw-r--r--subprojects/d2tk/src/frontend_pugl.c (renamed from src/frontend_pugl.c)0
-rw-r--r--subprojects/d2tk/src/hash.c (renamed from src/hash.c)0
-rw-r--r--subprojects/d2tk/src/mum.h (renamed from src/mum.h)0
-rw-r--r--subprojects/d2tk/test/base.c (renamed from test/base.c)0
-rw-r--r--subprojects/d2tk/test/core.c (renamed from test/core.c)0
-rw-r--r--subprojects/d2tk/test/mock.c (renamed from test/mock.c)0
-rw-r--r--subprojects/d2tk/test/mock.h (renamed from test/mock.h)0
-rw-r--r--subprojects/d2tk/ttf/FiraCode-Bold.ttf (renamed from ttf/FiraCode-Bold.ttf)bin315784 -> 315784 bytes
-rw-r--r--subprojects/d2tk/ttf/FiraCode-Light.ttf (renamed from ttf/FiraCode-Light.ttf)bin276684 -> 276684 bytes
-rw-r--r--subprojects/d2tk/ttf/FiraCode-Medium.ttf (renamed from ttf/FiraCode-Medium.ttf)bin286232 -> 286232 bytes
-rw-r--r--subprojects/d2tk/ttf/FiraCode-Regular.ttf (renamed from ttf/FiraCode-Regular.ttf)bin290360 -> 290360 bytes
-rw-r--r--subprojects/d2tk/ttf/FiraSans-Bold.ttfbin0 -> 521312 bytes
-rw-r--r--subprojects/d2tk/ttf/LICENSE (renamed from ttf/LICENSE)0
-rw-r--r--subprojects/d2tk/utf8.h/.clang-format (renamed from utf8.h/.clang-format)0
-rw-r--r--subprojects/d2tk/utf8.h/.gitignore (renamed from utf8.h/.gitignore)0
-rw-r--r--subprojects/d2tk/utf8.h/.travis.yml (renamed from utf8.h/.travis.yml)0
-rw-r--r--subprojects/d2tk/utf8.h/LICENSE (renamed from utf8.h/LICENSE)0
-rw-r--r--subprojects/d2tk/utf8.h/README.md (renamed from utf8.h/README.md)0
-rw-r--r--subprojects/d2tk/utf8.h/appveyor.yml (renamed from utf8.h/appveyor.yml)0
-rw-r--r--subprojects/d2tk/utf8.h/test/CMakeLists.txt (renamed from utf8.h/test/CMakeLists.txt)0
-rw-r--r--subprojects/d2tk/utf8.h/test/main.c (renamed from utf8.h/test/main.c)0
-rw-r--r--subprojects/d2tk/utf8.h/test/test.c (renamed from utf8.h/test/test.c)0
-rw-r--r--subprojects/d2tk/utf8.h/test/test.cpp (renamed from utf8.h/test/test.cpp)0
-rw-r--r--subprojects/d2tk/utf8.h/test/utest.h (renamed from utf8.h/test/utest.h)0
-rw-r--r--subprojects/d2tk/utf8.h/utf8.h (renamed from utf8.h/utf8.h)0
214 files changed, 1979 insertions, 486 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8627344..93647ad 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,95 +2,66 @@ stages:
- build
- deploy
-# templates
.variables_template: &variables_definition
variables:
- BASE_NAME: "d2tk"
PKG_CONFIG_PATH: "/opt/lv2/lib/pkgconfig:/opt/${CI_BUILD_NAME}/lib/pkgconfig:/usr/lib/${CI_BUILD_NAME}/pkgconfig"
+ BUILD_OPTS: "-Duse-fontconfig=disabled"
.common_template: &common_definition
<<: *variables_definition
stage: build
artifacts:
- name: "${BASE_NAME}-$(cat VERSION)-${CI_BUILD_NAME}"
+ name: "${CI_PROJECT_NAME}-$(cat VERSION)-${CI_BUILD_NAME}"
paths:
- - "${BASE_NAME}-$(cat VERSION)/"
+ - "${CI_PROJECT_NAME}-$(cat VERSION)/${CI_BUILD_NAME}/"
.build_template: &build_definition
<<: *common_definition
- stage: build
- script:
- - meson --prefix="/" --libdir="lib" --cross-file "${CI_BUILD_NAME}" build
- - sed -i -e '/framework/s/-Wl,-O1//g' -e '/framework/s/-Wl,--start-group//g' -e '/framework/s/-Wl,--end-group//g' build/build.ninja
- - ninja -C build
- - DESTDIR="${CI_PROJECT_DIR}/${BASE_NAME}-$(cat VERSION)/${CI_BUILD_NAME}" ninja -C build install
-
-.test_template: &test_definition
- <<: *common_definition
- stage: build
- script:
- - meson --prefix="/" --libdir="lib" --cross-file "${CI_BUILD_NAME}" build
- - sed -i -e '/framework/s/-Wl,-O1//g' -e '/framework/s/-Wl,--start-group//g' -e '/framework/s/-Wl,--end-group//g' build/build.ninja
- - ninja -C build
- - DESTDIR="${CI_PROJECT_DIR}/${BASE_NAME}-$(cat VERSION)/${CI_BUILD_NAME}" ninja -C build install
-
- - meson test -C build
-
-.analyze_template: &analyze_definition
- <<: *common_definition
- stage: build
script:
- - meson --prefix="/" --libdir="lib" --cross-file "${CI_BUILD_NAME}" build
- - sed -i -e '/framework/s/-Wl,-O1//g' -e '/framework/s/-Wl,--start-group//g' -e '/framework/s/-Wl,--end-group//g' build/build.ninja
+ - meson --prefix="${CI_PROJECT_DIR}/${CI_PROJECT_NAME}-$(cat VERSION)/${CI_BUILD_NAME}" -Dlv2libdir="" --cross-file "${CI_BUILD_NAME}" "${BUILD_OPTS}" build
+ - sed -i -e '/framework/s/-Wl,-O1//g' -e '/framework/s/-Wl,--start-group//g' -e '/framework/s/-Wl,--end-group//g' -e '/framework/s/-Wl,-soname,.*dylib//g' build/build.ninja
- ninja -C build
- - DESTDIR="${CI_PROJECT_DIR}/${BASE_NAME}-$(cat VERSION)/${CI_BUILD_NAME}" ninja -C build install
-
- - meson test -C build
- - meson test -C build --wrap=valgrind
-
- - CC=clang CXX=clang++ meson --prefix="/" --libdir="lib" --cross-file "${CI_BUILD_NAME}" clang
- - ninja -C clang
- - ninja -C clang test
-
- - scan-build --status-bugs meson --prefix="/" --libdir="lib" --cross-file "${CI_BUILD_NAME}" scanbuild
- - scan-build --status-bugs ninja -C scanbuild
- - scan-build --status-bugs ninja -C scanbuild test
+ - ninja -C build install
.universal_linux_template: &universal_linux_definition
- image: ventosus/universal-linux-gnu:buster
- <<: *analyze_definition
+ image: ventosus/universal-linux-gnu
+ <<: *build_definition
.arm_linux_template: &arm_linux_definition
- image: ventosus/arm-linux-gnueabihf:buster
- <<: *test_definition
+ image: ventosus/arm-linux-gnueabihf
+ <<: *build_definition
.universal_w64_template: &universal_w64_definition
image: ventosus/universal-w64-mingw32
- <<: *test_definition
+ <<: *build_definition
.universal_apple_template: &universal_apple_definition
image: ventosus/universal-apple-darwin
<<: *build_definition
-# targets
+# building in docker
x86_64-linux-gnu:
before_script:
- - apt-get install -y libglu1-mesa-dev libevdev-dev libvterm-dev
+ - apt-get update
+ - apt-get install -y libglu1-mesa-dev
<<: *universal_linux_definition
i686-linux-gnu:
before_script:
- - apt-get install -y libglu1-mesa-dev:i386 libevdev-dev:i386 libvterm-dev:i386
+ - apt-get update
+ - apt-get install -y libglu1-mesa-dev:i386
<<: *universal_linux_definition
arm-linux-gnueabihf:
before_script:
- - apt-get install -y libglu1-mesa-dev:armhf libevdev-dev:armhf libvterm-dev:armhf
+ - apt-get update
+ - apt-get install -y libglu1-mesa-dev:armhf
<<: *arm_linux_definition
aarch64-linux-gnu:
before_script:
- - apt-get install -y libglu1-mesa-dev:arm64 libevdev-dev:arm64 libvterm-dev:arm64
+ - apt-get update
+ - apt-get install -y libglu1-mesa-dev:arm64
<<: *arm_linux_definition
x86_64-w64-mingw32:
@@ -108,18 +79,6 @@ pack:
script:
- echo 'packing up...'
artifacts:
- name: "${BASE_NAME}-$(cat VERSION)"
- paths:
- - "${BASE_NAME}-$(cat VERSION)/"
-
-pages:
- stage: deploy
- before_script:
- - apt-get update -y
- - apt-get install -y doxygen
- script:
- - doxygen
- - cp -r doc/html public
- artifacts:
+ name: "${CI_PROJECT_NAME}-$(cat VERSION)"
paths:
- - public/
+ - "${CI_PROJECT_NAME}-$(cat VERSION)/"
diff --git a/ttf/FiraSans-Bold.ttf b/FiraSans-Bold.ttf
index f03425a..f03425a 100644
--- a/ttf/FiraSans-Bold.ttf
+++ b/FiraSans-Bold.ttf
Binary files differ
diff --git a/README.md b/README.md
index 51c9529..2603a9c 100644
--- a/README.md
+++ b/README.md
@@ -1,52 +1,28 @@
-# d2tk
+# d2tk.lv2
-## Data Driven Tool Kit
+## Example LV2 plugin bundle for d2tk based GUIs
-A performant, dyamic, immediate-mode GUI tool kit in C which partially renders
-on-change only by massively hashing-and-cashing of vector drawing instructions
-and on-demand rendered sprites.
-### Build / test
+### Build status
- git clone https://git.open-music-kontrollers.ch/lad/d2tk
- cd d2tk
- meson build
- cd build
- ninja -j4
-
-#### Pugl/NanoVG backend
-
- ./d2tk.nanovg
-
-#### Pugl/Cairo backend
-
- ./d2tk.cairo
-
-#### FBdev/Cairo backend
-
- ./d2tk.fbdev
+[![build status](https://gitlab.com/OpenMusicKontrollers/d2tk.lv2/badges/master/build.svg)](https://gitlab.com/OpenMusicKontrollers/d2tk.lv2/commits/master)
-### Screenshots
+### Dependencies
-![Screenshot 1](/screenshots/screenshot_1.png)
+* [LV2](http://lv2plug.in) (LV2 Plugin Standard)
-![Screenshot 2](/screenshots/screenshot_2.png)
+### Build / install
-![Screenshot 3](/screenshots/screenshot_3.png)
-
-![Screenshot 4](/screenshots/screenshot_4.png)
-
-![Screenshot 5](/screenshots/screenshot_5.png)
-
-![Screenshot 6](/screenshots/screenshot_6.png)
-
-![Screenshot 7](/screenshots/screenshot_7.png)
-
-![Screenshot 8](/screenshots/screenshot_8.png)
+ git clone https://git.open-music-kontrollers.ch/lv2//d2tk.lv2.git
+ cd d2tk.lv2
+ meson build
+ cd build
+ ninja -j4
+ sudo ninja install
### License
-Copyright (c) 2018-2019 Hanspeter Portner (dev@open-music-kontrollers.ch)
+Copyright (c) 2019 Hanspeter Portner (dev@open-music-kontrollers.ch)
This is free software: you can redistribute it and/or modify
it under the terms of the Artistic License 2.0 as published by
diff --git a/VERSION b/VERSION
index 810aa9d..ef2f8c8 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.1.1069
+0.1.87
diff --git a/d2tk.ttl b/d2tk.ttl
new file mode 100644
index 0000000..6085bd1
--- /dev/null
+++ b/d2tk.ttl
@@ -0,0 +1,372 @@
+# Copyright (c) 2019 Hanspeter Portner (dev@open-music-kontrollers.ch)
+#
+# This is free software: you can redistribute it and/or modify
+# it under the terms of the Artistic License 2.0 as published by
+# The Perl Foundation.
+#
+# This source is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# Artistic License 2.0 for more details.
+#
+# You should have received a copy of the Artistic License 2.0
+# along the source as a COPYING file. If not, obtain it from
+# http://www.perlfoundation.org/artistic_license_2_0.
+
+@prefix foaf: <http://xmlns.com/foaf/0.1/> .
+@prefix doap: <http://usefulinc.com/ns/doap#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
+@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
+@prefix log: <http://lv2plug.in/ns/ext/log#> .
+@prefix midi: <http://lv2plug.in/ns/ext/midi#> .
+
+@prefix lic: <http://opensource.org/licenses/> .
+@prefix omk: <http://open-music-kontrollers.ch/ventosus#> .
+@prefix proj: <http://open-music-kontrollers.ch/lv2/> .
+@prefix d2tk: <http://open-music-kontrollers.ch/lv2/d2tk#> .
+
+# Maintainer
+omk:me
+ a foaf:Person ;
+ foaf:name "Hanspeter Portner" ;
+ foaf:mbox <mailto:dev@open-music-kontrollers.ch> ;
+ foaf:homepage <http://open-music-kontrollers.ch> .
+
+# Project
+proj:d2tk
+ a doap:Project ;
+ doap:maintainer omk:me ;
+ doap:name "D2TK Bundle" .
+
+# Plugin
+d2tk:d2tk
+ a lv2:Plugin,
+ lv2:AnalyserPlugin ;
+ doap:name "D2TK" ;
+ doap:license lic:Artistic-2.0 ;
+ lv2:project proj:d2tk ;
+ lv2:requiredFeature urid:map ;
+ lv2:optionalFeature lv2:isLive, lv2:hardRTCapable, log:log ;
+
+ lv2:port [
+ a lv2:InputPort ,
+ atom:AtomPort ;
+ atom:bufferType atom:Sequence ;
+ atom:supports midi:MidiEvent ;
+ lv2:index 0 ;
+ lv2:symbol "control" ;
+ lv2:name "Control" ;
+ lv2:designation lv2:control ;
+ ] , [
+ a lv2:OutputPort ,
+ atom:AtomPort ;
+ atom:bufferType atom:Sequence ;
+ atom:supports midi:MidiEvent ;
+ lv2:index 1 ;
+ lv2:symbol "notify" ;
+ lv2:name "Notify" ;
+ lv2:default 0 ;
+ lv2:designation lv2:control ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 2 ;
+ lv2:symbol "toggled_1" ;
+ lv2:name "Toggle 1" ;
+ lv2:default 0 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 3 ;
+ lv2:symbol "toggled_2" ;
+ lv2:name "Toggle 2" ;
+ lv2:default 0 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 4 ;
+ lv2:symbol "toggled_3" ;
+ lv2:name "Toggle 3" ;
+ lv2:default 0 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 5 ;
+ lv2:symbol "toggled_4" ;
+ lv2:name "Toggle 4" ;
+ lv2:default 0 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 6 ;
+ lv2:symbol "toggled_5" ;
+ lv2:name "Toggle 5" ;
+ lv2:default 0 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 7 ;
+ lv2:symbol "toggled_6" ;
+ lv2:name "Toggle 6" ;
+ lv2:default 0 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 8 ;
+ lv2:symbol "toggled_7" ;
+ lv2:name "Toggle 7" ;
+ lv2:default 0 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 9 ;
+ lv2:symbol "toggled_8" ;
+ lv2:name "Toggle 8" ;
+ lv2:default 0 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 10 ;
+ lv2:symbol "toggled_9" ;
+ lv2:name "Toggle 9" ;
+ lv2:default 1 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 11 ;
+ lv2:symbol "toggled_10" ;
+ lv2:name "Toggle 10" ;
+ lv2:default 1 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 12 ;
+ lv2:symbol "toggled_11" ;
+ lv2:name "Toggle 11" ;
+ lv2:default 1 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 13 ;
+ lv2:symbol "toggled_12" ;
+ lv2:name "Toggle 12" ;
+ lv2:default 1 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 14 ;
+ lv2:symbol "toggled_13" ;
+ lv2:name "Toggle 13" ;
+ lv2:default 1 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 15 ;
+ lv2:symbol "toggled_14" ;
+ lv2:name "Toggle 14" ;
+ lv2:default 1 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 16 ;
+ lv2:symbol "toggled_15" ;
+ lv2:name "Toggle 15" ;
+ lv2:default 1 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 17 ;
+ lv2:symbol "toggled_16" ;
+ lv2:name "Toggle 16" ;
+ lv2:default 1 ;
+ lv2:portProperty lv2:toggled ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 18 ;
+ lv2:symbol "control_1" ;
+ lv2:name "Control 1" ;
+ lv2:default 0.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 19 ;
+ lv2:symbol "control_2" ;
+ lv2:name "Control 2" ;
+ lv2:default 25.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 20 ;
+ lv2:symbol "control_3" ;
+ lv2:name "Control 3" ;
+ lv2:default 36.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 21 ;
+ lv2:symbol "control_4" ;
+ lv2:name "Control 4" ;
+ lv2:default 44.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 22 ;
+ lv2:symbol "control_5" ;
+ lv2:name "Control 5" ;
+ lv2:default 51.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 23 ;
+ lv2:symbol "control_6" ;
+ lv2:name "Control 6" ;
+ lv2:default 57.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 24 ;
+ lv2:symbol "control_7" ;
+ lv2:name "Control 7" ;
+ lv2:default 63.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 25 ;
+ lv2:symbol "control_8" ;
+ lv2:name "Control 8" ;
+ lv2:default 68.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 26 ;
+ lv2:symbol "control_9" ;
+ lv2:name "Control 9" ;
+ lv2:default 73.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 27 ;
+ lv2:symbol "control_10" ;
+ lv2:name "Control 10" ;
+ lv2:default 77.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 28 ;
+ lv2:symbol "control_11" ;
+ lv2:name "Control 11" ;
+ lv2:default 81.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 29 ;
+ lv2:symbol "control_12" ;
+ lv2:name "Control 12" ;
+ lv2:default 85.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 30 ;
+ lv2:symbol "control_13" ;
+ lv2:name "Control 13" ;
+ lv2:default 89.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 31 ;
+ lv2:symbol "control_14" ;
+ lv2:name "Control 14" ;
+ lv2:default 93.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 32 ;
+ lv2:symbol "control_15" ;
+ lv2:name "Control 15" ;
+ lv2:default 96.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 33 ;
+ lv2:symbol "control_16" ;
+ lv2:name "Control 16" ;
+ lv2:default 100.0 ;
+ lv2:minimum 0.0 ;
+ lv2:maximum 100.0 ;
+ ] , [
+ a lv2:InputPort ,
+ lv2:ControlPort ;
+ lv2:index 34 ;
+ lv2:symbol "radio" ;
+ lv2:name "Radio" ;
+ lv2:default 0 ;
+ lv2:minimum 0 ;
+ lv2:maximum 16 ;
+ lv2:portProperty lv2:integer, lv2:enumeration ;
+ lv2:scalePoint
+ [ rdfs:label "*1*" ; rdf:value 0 ] ,
+ [ rdfs:label "*2*" ; rdf:value 1 ] ,
+ [ rdfs:label "*3*" ; rdf:value 2 ] ,
+ [ rdfs:label "*4*" ; rdf:value 3 ] ,
+ [ rdfs:label "*5*" ; rdf:value 4 ] ,
+ [ rdfs:label "*6*" ; rdf:value 5 ] ,
+ [ rdfs:label "*7*" ; rdf:value 6 ] ,
+ [ rdfs:label "*8*" ; rdf:value 7 ] ,
+ [ rdfs:label "*9*" ; rdf:value 8 ] ,
+ [ rdfs:label "*10*" ; rdf:value 9 ] ,
+ [ rdfs:label "*11*" ; rdf:value 10 ] ,
+ [ rdfs:label "*12*" ; rdf:value 11 ] ,
+ [ rdfs:label "*13*" ; rdf:value 12 ] ,
+ [ rdfs:label "*14*" ; rdf:value 13 ] ,
+ [ rdfs:label "*15*" ; rdf:value 14 ] ,
+ [ rdfs:label "*16*" ; rdf:value 15 ] ;
+ ] .
diff --git a/d2tk_ui.ttl b/d2tk_ui.ttl
new file mode 100644
index 0000000..be4e32e
--- /dev/null
+++ b/d2tk_ui.ttl
@@ -0,0 +1,32 @@
+# Copyright (c) 2019 Hanspeter Portner (dev@open-music-kontrollers.ch)
+#
+# This is free software: you can redistribute it and/or modify
+# it under the terms of the Artistic License 2.0 as published by
+# The Perl Foundation.
+#
+# This source is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# Artistic License 2.0 for more details.
+#
+# You should have received a copy of the Artistic License 2.0
+# along the source as a COPYING file. If not, obtain it from
+# http://www.perlfoundation.org/artistic_license_2_0.
+
+@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+@prefix ui: <http://lv2plug.in/ns/extensions/ui#> .
+@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
+@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
+@prefix log: <http://lv2plug.in/ns/ext/log#> .
+
+@prefix d2tk: <http://open-music-kontrollers.ch/lv2/d2tk#> .
+
+d2tk:d2tk_ui
+ ui:portNotification [
+ ui:plugin d2tk:d2tk ;
+ lv2:symbol "notify" ;
+ ui:protocol atom:eventTransfer
+ ] ;
+ lv2:requiredFeature ui:idleInterface, urid:map ;
+ lv2:optionalFeature log:log, ui:resize ;
+ lv2:extensionData ui:idleInterface, ui:resize .
diff --git a/manifest.ttl.in b/manifest.ttl.in
new file mode 100644
index 0000000..9851880
--- /dev/null
+++ b/manifest.ttl.in
@@ -0,0 +1,34 @@
+# Copyright (c) 2019 Hanspeter Portner (dev@open-music-kontrollers.ch)
+#
+# This is free software: you can redistribute it and/or modify
+# it under the terms of the Artistic License 2.0 as published by
+# The Perl Foundation.
+#
+# This source is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# Artistic License 2.0 for more details.
+#
+# You should have received a copy of the Artistic License 2.0
+# along the source as a COPYING file. If not, obtain it from
+# http://www.perlfoundation.org/artistic_license_2_0.
+
+@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix ui: <http://lv2plug.in/ns/extensions/ui#> .
+
+@prefix d2tk: <http://open-music-kontrollers.ch/lv2/d2tk#> .
+
+d2tk:d2tk
+ a lv2:Plugin ;
+ lv2:minorVersion @MINOR_VERSION@ ;
+ lv2:microVersion @MICRO_VERSION@ ;
+ lv2:binary <d2tk@MODULE_SUFFIX@> ;
+ ui:ui d2tk:d2tk_ui ;
+ rdfs:seeAlso <d2tk.ttl> .
+
+d2tk:d2tk_ui
+ a ui:@UI_TYPE@ ;
+ ui:binary <d2tk_ui@MODULE_SUFFIX@> ;
+ rdfs:seeAlso <d2tk_ui.ttl> .
diff --git a/meson.build b/meson.build
index e13ad99..e7631d1 100644
--- a/meson.build
+++ b/meson.build
@@ -1,392 +1,118 @@
-project('d2tk', 'c', default_options : [
+project('d2tk.lv2', 'c', default_options : [
'buildtype=release',
'warning_level=3',
'werror=false',
'b_lto=false',
'c_std=gnu11'])
-static_link = false #meson.is_cross_build()
+d2tk = subproject('d2tk')
-build_debug_overlay = get_option('build-debug-overlay')
-build_examples = get_option('build-examples')
+lv2libdir = get_option('lv2libdir')
build_tests = get_option('build-tests')
-use_backend_cairo = get_option('use-backend-cairo')
-use_backend_nanovg = get_option('use-backend-nanovg')
-use_frontend_fbdev = get_option('use-frontend-fbdev')
-use_frontend_pugl= get_option('use-frontend-pugl')
+inst_dir = join_paths(lv2libdir, meson.project_name())
-use_vterm = get_option('use-vterm')
-use_evdev = get_option('use-evdev')
-use_fontconfig = get_option('use-fontconfig')
+if get_option('use-backend-nanovg').enabled()
+ d2tk_dep = d2tk.get_variable('d2tk_nanovg')
+elif get_option('use-backend-cairo').enabled()
+ d2tk_dep = d2tk.get_variable('d2tk_cairo')
+else
+ error('no valid UI backend given')
+endif
-grep = find_program('grep',
- native : true,
- required : use_fontconfig)
-fc_list = find_program('fc-list',
- native : true,
- required : use_fontconfig)
-check_for_font = find_program('check_for_font',
- native : true,
- required : use_fontconfig)
+source_root = meson.source_root()
+build_root = meson.build_root()
+add_project_arguments('-D_GNU_SOURCE', language : 'c')
+
+conf_data = configuration_data()
cc = meson.get_compiler('c')
-# mandatory dependencies
+lv2_validate = find_program('lv2_validate', native : true, required : false)
+sord_validate = find_program('sord_validate', native : true, required : false)
+lv2lint = find_program('lv2lint', required : false)
+
m_dep = cc.find_library('m')
+lv2_dep = dependency('lv2', version : '>=1.14.0')
-# dependencies for backend_cairo/frontend_pugl
-freetype_dep = dependency('freetype2',
- version : '>=18.0.0',
- static : static_link,
- required : use_backend_cairo)
-pixman_dep = dependency('pixman-1',
- version : '>=0.34.0',
- static : static_link,
- required : use_backend_cairo)
-cairo_dep = dependency('cairo',
- version : '>=1.14.0',
- static : static_link,
- required : use_backend_cairo)
-cairo_deps = [freetype_dep, pixman_dep, cairo_dep]
-if use_frontend_pugl.enabled()
- cairo_xlib_dep = dependency('cairo-xlib',
- version : '>=1.14.0',
- static : static_link,
- required : use_backend_cairo)
-endif
+dsp_deps = [m_dep, lv2_dep]
+ui_deps = [m_dep, lv2_dep, d2tk_dep]
-# dependencies for frontend_fbdev
-input_dep = dependency('libinput',
- version : '>=1.6.0',
- static : static_link,
- required : use_frontend_fbdev)
-udev_dep = dependency('libudev',
- static : static_link,
- required : use_frontend_fbdev)
-evdev_dep = dependency('libevdev',
- version : '>=1.5.0',
- static : static_link,
- required : use_frontend_fbdev)
+d2tk_inc = include_directories(join_paths('subprojects', 'd2tk'))
+inc_dir = [d2tk_inc]
-# dependencies for backend_nanovg
-glew_dep = dependency('glew',
- version : '>=2.1.0',
- static : static_link,
- required : false)
-if use_backend_nanovg.enabled() and not glew_dep.found()
- # use embedded glew
- glew_dep = declare_dependency(
- compile_args : '-DGLEW_STATIC',
- include_directories : include_directories('glew-2.1.0'),
- sources : join_paths('glew-2.1.0', 'glew.c'))
-endif
-
-# optional dependencies
-util_dep = cc.find_library('util',
- required : use_vterm)
-vterm_dep = dependency('vterm',
- version : '>=0.1',
- static : static_link,
- required : use_vterm)
-if not use_frontend_fbdev.enabled()
- evdev_dep = dependency('libevdev',
- version : '>=1.5.0',
- static : static_link,
- required : use_evdev)
-endif
-fontconfig_dep = dependency('fontconfig',
- version : '>=2.0.0',
- static : static_link,
- required : use_fontconfig)
+dsp_srcs = ['plug.c']
-deps = [m_dep, evdev_dep, vterm_dep, fontconfig_dep]
-links = []
+ui_srcs = ['plug_ui.c']
-pugl_inc = include_directories('pugl')
-nanovg_inc = include_directories('nanovg/src')
-inc_dir = [pugl_inc, nanovg_inc]
+c_args = ['-fvisibility=hidden']
-rawvers = run_command('cat', 'VERSION').stdout().strip()
-version = rawvers.split('.')
-
-conf_data = configuration_data()
+version = run_command('cat', 'VERSION').stdout().strip().split('.')
+add_project_arguments('-DSHELLS_BELLS_VERSION="'
+ + version[0] + '.' + version[1] + '.' + version[2] + '"', language : 'c')
conf_data.set('MAJOR_VERSION', version[0])
conf_data.set('MINOR_VERSION', version[1])
conf_data.set('MICRO_VERSION', version[2])
-add_project_arguments('-D_GNU_SOURCE', language : 'c')
-
-if build_debug_overlay
- add_project_arguments('-DD2TK_DEBUG', language : 'c')
-endif
-
-lib_srcs = [
- join_paths('src', 'hash.c'),
- join_paths('src', 'core.c'),
- join_paths('src', 'base.c'),
- join_paths('src', 'base_table.c'),
- join_paths('src', 'base_frame.c'),
- join_paths('src', 'base_layout.c'),
- join_paths('src', 'base_scrollbar.c'),
- join_paths('src', 'base_pane.c'),
- join_paths('src', 'base_cursor.c'),
- join_paths('src', 'base_button.c'),
- join_paths('src', 'base_image.c'),
- join_paths('src', 'base_bitmap.c'),
- join_paths('src', 'base_custom.c'),
- join_paths('src', 'base_meter.c'),
- join_paths('src', 'base_combo.c'),
- join_paths('src', 'base_textfield.c'),
- join_paths('src', 'base_label.c'),
- join_paths('src', 'base_link.c'),
- join_paths('src', 'base_dial.c'),
- join_paths('src', 'base_spinner.c'),
- join_paths('src', 'base_bar.c'),
- join_paths('src', 'base_flowmatrix.c')
-]
-
-if use_vterm.enabled()
- conf_data.set('D2TK_PTY', 1)
- lib_srcs += join_paths('src', 'base_pty.c')
- deps += util_dep
-else
- conf_data.set('D2TK_PTY', 0)
-endif
-
-if use_evdev.enabled()
- conf_data.set('D2TK_EVDEV', 1)
- lib_srcs += join_paths('src', 'base_vkb.c')
-else
- conf_data.set('D2TK_EVDEV', 0)
-endif
-
-if input_dep.found() and input_dep.version().version_compare('>=1.15.0')
- conf_data.set('D2TK_INPUT_1_15', 1)
-else
- conf_data.set('D2TK_INPUT_1_15', 0)
-endif
-
-if use_fontconfig.enabled()
- conf_data.set('D2TK_FONTCONFIG', 1)
-else
- conf_data.set('D2TK_FONTCONFIG', 0)
-endif
-
-if cc.has_function('vfork')
- conf_data.set('D2TK_VFORK', 1)
-else
- conf_data.set('D2TK_VFORK', 0)
-endif
-
-if cc.has_function('clone')
- conf_data.set('D2TK_CLONE', 1)
-else
- conf_data.set('D2TK_CLONE', 0)
-endif
-
-example_srcs = [
- join_paths('example', 'example.c')
-]
-
-example_pugl_srcs = [
- join_paths('example', 'd2tk_pugl.c')
-]
-
-example_fbdev_srcs = [
- join_paths('example', 'd2tk_fbdev.c')
-]
-
-pugl_srcs = [
- join_paths('src', 'frontend_pugl.c'),
- join_paths('pugl', 'pugl', 'detail', 'implementation.c')
-]
-
-pugl_gl_srcs = []
-
-pugl_cairo_srcs = []
-
-nanovg_srcs = [
- join_paths('nanovg', 'src', 'nanovg.c'),
- join_paths('src', 'backend_nanovg.c')
-]
-
-cairo_srcs = [
- join_paths('src', 'backend_cairo.c')
-]
-
-fbdev_srcs = [
- join_paths('src', 'frontend_fbdev.c')
-]
-
-test_core_srcs = [
- join_paths('test', 'core.c'),
- join_paths('test', 'mock.c')
-]
-
-test_base_srcs = [
- join_paths('test', 'base.c'),
- join_paths('test', 'mock.c')
-]
-
-c_args = ['-fvisibility=hidden',
- '-ffast-math']
-
if host_machine.system() == 'windows'
- deps += cc.find_library('opengl32', required : use_frontend_pugl)
- deps += cc.find_library('gdi32', required : use_frontend_pugl)
- deps += cc.find_library('ws2_32', required : true)
- pugl_srcs += 'pugl/pugl/detail/win.c'
- pugl_gl_srcs += 'pugl/pugl/detail/win_gl.c'
- pugl_cairo_srcs += 'pugl/pugl/detail/win_cairo.c'
+ conf_data.set('UI_TYPE', 'WindowsUI')
elif host_machine.system() == 'darwin'
- add_languages('objc')
- links += ['-framework', 'OpenGL']
- links += ['-framework', 'Cocoa']
- pugl_srcs += 'pugl/pugl/detail/mac.m'
- pugl_gl_srcs += 'pugl/pugl/detail/mac_gl.m'
- pugl_cairo_srcs += 'pugl/pugl/detail/mac_cairo.m'
+ conf_data.set('UI_TYPE', 'CocoaUI')
else
- deps += dependency('gl', required : use_frontend_pugl)
- deps += dependency('x11', version : '>=1.6.0', required : use_frontend_pugl)
- deps += dependency('xext', version : '>=1.3.0', required : use_frontend_pugl)
- pugl_srcs += 'pugl/pugl/detail/x11.c'
- pugl_gl_srcs += 'pugl/pugl/detail/x11_gl.c'
- pugl_cairo_srcs += 'pugl/pugl/detail/x11_cairo.c'
-endif
-
-if use_backend_cairo.enabled()
- if use_frontend_pugl.enabled()
- d2tk_cairo = declare_dependency(
- compile_args : '-DPUGL_HAVE_CAIRO',
- include_directories : inc_dir,
- dependencies : [deps, cairo_deps, cairo_xlib_dep],
- link_args : links,
- sources : [lib_srcs, cairo_srcs, pugl_srcs, pugl_cairo_srcs])
-
- if build_examples
- executable('d2tk.cairo', [example_srcs, example_pugl_srcs],
- c_args : c_args,
- include_directories : inc_dir,
- dependencies: d2tk_cairo,
- install : false)
- endif
- endif
-
- if use_frontend_fbdev.enabled()
- d2tk_fbdev = declare_dependency(
- include_directories : inc_dir,
- dependencies : [deps, cairo_deps, input_dep, udev_dep, evdev_dep],
- link_args : links,
- sources : [lib_srcs, cairo_srcs, fbdev_srcs])
-
- if build_examples
- executable('d2tk.fbdev', [example_srcs, example_fbdev_srcs],
- c_args : c_args,
- include_directories : inc_dir,
- dependencies: d2tk_fbdev,
- install : false)
- endif
- endif
-endif
-
-if use_backend_nanovg.enabled()
- if use_frontend_pugl.enabled()
- d2tk_nanovg = declare_dependency(
- include_directories : inc_dir,
- dependencies : [deps, glew_dep],
- link_args : links,
- sources : [lib_srcs, nanovg_srcs, pugl_srcs, pugl_gl_srcs])
-
- if build_examples
- executable('d2tk.nanovg', [example_srcs, example_pugl_srcs],
- c_args : c_args,
- include_directories : inc_dir,
- dependencies: d2tk_nanovg,
- install : false)
- endif
- endif
-endif
-
-config_h = configure_file(
- input : join_paths('d2tk', 'config.h.in'),
- output : 'config.h',
+ conf_data.set('UI_TYPE', 'X11UI')
+endif
+
+mod = shared_module('d2tk', dsp_srcs,
+ c_args : c_args,
+ include_directories : inc_dir,
+ name_prefix : '',
+ dependencies : dsp_deps,
+ install : true,
+ install_dir : inst_dir)
+
+ui = shared_module('d2tk_ui', ui_srcs,
+ c_args : c_args,
+ include_directories : inc_dir,
+ name_prefix : '',
+ dependencies : ui_deps,
+ install : true,
+ install_dir : inst_dir)
+
+suffix = mod.full_path().strip().split('.')[-1]
+conf_data.set('MODULE_SUFFIX', '.' + suffix)
+
+manifest_ttl = configure_file(
+ input : 'manifest.ttl.in',
+ output : 'manifest.ttl',
configuration : conf_data,
- install : false)
-
-if not use_fontconfig.enabled()
- fira_sans_bold_ttf = configure_file(
- input : join_paths('ttf', 'FiraSans-Bold.ttf'),
- output : 'FiraSans:bold.ttf',
- copy : true,
- install : false)
-
- fira_code_bold_ttf = configure_file(
- input : join_paths('ttf', 'FiraCode-Bold.ttf'),
- output : 'FiraCode:bold.ttf',
- copy : true,
- install : false)
-
- fira_code_light_ttf = configure_file(
- input : join_paths('ttf', 'FiraCode-Light.ttf'),
- output : 'FiraCode:light.ttf',
- copy : true,
- install : false)
-
- fira_code_medium_ttf = configure_file(
- input : join_paths('ttf', 'FiraCode-Medium.ttf'),
- output : 'FiraCode:medium.ttf',
- copy : true,
- install : false)
-
- fira_code_regular_ttf = configure_file(
- input : join_paths('ttf', 'FiraCode-Regular.ttf'),
- output : 'FiraCode:regular.ttf',
- copy : true,
- install : false)
-endif
-
-if build_examples
- configure_file(
- input : join_paths('example', 'libre-arrow-circle-right.png'),
- output : 'libre-arrow-circle-right.png',
- copy : true,
- install : false)
-
- configure_file(
- input : join_paths('example', 'libre-gui-folder.png'),
- output : 'libre-gui-folder.png',
- copy : true,
- install : false)
-
- configure_file(
- input : join_paths('example', 'libre-gui-file.png'),
- output : 'libre-gui-file.png',
- copy : true,
- install : false)
-endif
+ install : true,
+ install_dir : inst_dir)
+
+dsp_ttl = configure_file(
+ input : 'd2tk.ttl',
+ output : 'd2tk.ttl',
+ copy : true,
+ install : true,
+ install_dir : inst_dir)
+
+ui_ttl = configure_file(
+ input : 'd2tk_ui.ttl',
+ output : 'd2tk_ui.ttl',
+ copy : true,
+ install : true,
+ install_dir : inst_dir)
if build_tests
- test_core = executable('test.core', [test_core_srcs, lib_srcs],
- c_args : c_args,
- dependencies : deps,
- include_directories : inc_dir,
- install : false)
-
- test_base = executable('test.base', [test_base_srcs, lib_srcs],
- c_args : c_args,
- dependencies : deps,
- include_directories : inc_dir,
- install : false)
-
- test('Test core', test_core)
- test('Test base', test_base)
+ if lv2_validate.found() and sord_validate.found()
+ test('LV2 validate', lv2_validate,
+ args : [manifest_ttl, dsp_ttl, ui_ttl])
+ endif
- if fc_list.found() and grep.found() and check_for_font.found()
- test('FiraSans-Bold.ttf', check_for_font, args : ['FiraSans-Bold.ttf'])
- test('FiraCode-Light.ttf', check_for_font, args : ['FiraCode-Light.tt'])
- test('FiraCode-Regular.ttf', check_for_font, args : ['FiraCode-Regular.ttf'])
- test('FiraCode-Medium.ttf', check_for_font, args : ['FiraCode-Medium.ttf'])
- test('FiraCode-Bold.ttf', check_for_font, args : ['FiraCode-Bold.ttf'])
+ if lv2lint.found()
+ test('LV2 lint', lv2lint,
+ args : ['-M', 'pack',
+ '-E', 'warn',
+ '-I', join_paths(build_root, ''),
+ 'http://open-music-kontrollers.ch/lv2/d2tk#d2tk'])
endif
endif
diff --git a/meson_options.txt b/meson_options.txt
index 6396503..d174d43 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,43 +1,28 @@
option('build-debug-overlay',
type : 'boolean',
- value : false,
- yield : true)
-option('build-examples',
- type : 'boolean',
- value : false,
- yield : true)
+ value : false)
option('build-tests',
type : 'boolean',
- value : true,
- yield : true)
+ value : true)
option('use-backend-cairo',
type : 'feature',
- value : 'disabled',
- yield : true)
+ value : 'disabled')
option('use-backend-nanovg',
type : 'feature',
- value : 'disabled',
- yield : true)
+ value : 'enabled')
-option('use-frontend-fbdev',
- type : 'feature',
- value : 'disabled',
- yield : true)
option('use-frontend-pugl',
type : 'feature',
- value : 'disabled',
- yield : true)
+ value : 'enabled')
option('use-vterm',
type : 'feature',
- value : 'disabled',
- yield : true)
-option('use-evdev',
- type : 'feature',
- value : 'disabled',
- yield : true)
+ value : 'disabled')
option('use-fontconfig',
type : 'feature',
- value : 'disabled',
- yield : true)
+ value : 'enabled')
+
+option('lv2libdir',
+ type : 'string',
+ value : 'lib/lv2')
diff --git a/plug.c b/plug.c
new file mode 100644
index 0000000..0859f05
--- /dev/null
+++ b/plug.c
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2019 Hanspeter Portner (dev@open-music-kontrollers.ch)
+ *
+ * This is free software: you can redistribute it and/or modify
+ * it under the terms of the Artistic License 2.0 as published by
+ * The Perl Foundation.
+ *
+ * This source is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * Artistic License 2.0 for more details.
+ *
+ * You should have received a copy of the Artistic License 2.0
+ * along the source as a COPYING file. If not, obtain it from
+ * http://www.perlfoundation.org/artistic_license_2_0.
+ */
+
+#include <stdlib.h>
+#include <math.h>
+
+#include <plug.h>
+
+typedef struct _plughandle_t plughandle_t;
+
+struct _plughandle_t {
+ LV2_URID_Map *map;
+ LV2_Atom_Forge forge;
+
+ LV2_Log_Log *log;
+ LV2_Log_Logger logger;
+
+ const LV2_Atom_Sequence *control;
+ LV2_Atom_Sequence *notify;
+
+ float *toggle [CONTROL_N];
+ float *cntrl [CONTROL_N];
+ float *radio;
+};
+
+static LV2_Handle
+instantiate(const LV2_Descriptor* descriptor,
+ double rate __attribute__((unused)),
+ const char *bundle_path __attribute__((unused)),
+ const LV2_Feature *const *features)
+{
+ plughandle_t *handle = calloc(1, sizeof(plughandle_t));
+ if(!handle)
+ return NULL;
+
+ for(unsigned i=0; features[i]; i++)
+ {
+ if(!strcmp(features[i]->URI, LV2_URID__map))
+ handle->map = features[i]->data;
+ else if(!strcmp(features[i]->URI, LV2_LOG__log))
+ handle->log = features[i]->data;
+ }
+
+ if(!handle->map)
+ {
+ fprintf(stderr,
+ "%s: Host does not support urid:map\n", descriptor->URI);
+ free(handle);
+ return NULL;
+ }
+
+ if(handle->log)
+ lv2_log_logger_init(&handle->logger, handle->map, handle->log);
+
+ lv2_atom_forge_init(&handle->forge, handle->map);
+
+ return handle;
+}
+
+static void
+connect_port(LV2_Handle instance, uint32_t port, void *data)
+{
+ plughandle_t *handle = instance;
+
+ switch(port)
+ {
+ case 0:
+ handle->control = data;
+ break;
+ case 1:
+ handle->notify = data;
+ break;
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ handle->toggle[port - 2] = data;
+ break;
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ case 26:
+ case 27:
+ case 28:
+ case 29:
+ case 30:
+ case 31:
+ case 32:
+ case 33:
+ handle->cntrl[port - CONTROL_N - 2] = data;
+ break;
+ case 34:
+ handle->radio = data;
+ break;
+ }
+}
+
+static void
+run(LV2_Handle instance, uint32_t nsamples __attribute__((unused)))
+{
+ plughandle_t *handle = instance;
+
+ const uint32_t sz = lv2_atom_total_size(&handle->control->atom);
+ memcpy(handle->notify, handle->control, sz);
+}
+
+static void
+cleanup(LV2_Handle instance)
+{
+ plughandle_t *handle = instance;
+
+ free(handle);
+}
+
+static const LV2_Descriptor d2tk_d2tk = {
+ .URI = D2TK_PREFIX"d2tk",
+ .instantiate = instantiate,
+ .connect_port = connect_port,
+ .activate = NULL,
+ .run = run,
+ .deactivate = NULL,
+ .cleanup = cleanup,
+ .extension_data = NULL
+};
+
+LV2_SYMBOL_EXPORT const LV2_Descriptor*
+lv2_descriptor(uint32_t index)
+{
+ switch(index)
+ {
+ case 0:
+ return &d2tk_d2tk;
+ default:
+ return NULL;
+ }
+}
diff --git a/plug.h b/plug.h
new file mode 100644
index 0000000..2cb442f
--- /dev/null
+++ b/plug.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2019 Hanspeter Portner (dev@open-music-kontrollers.ch)
+ *
+ * This is free software: you can redistribute it and/or modify
+ * it under the terms of the Artistic License 2.0 as published by
+ * The Perl Foundation.
+ *
+ * This source is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * Artistic License 2.0 for more details.
+ *
+ * You should have received a copy of the Artistic License 2.0
+ * along the source as a COPYING file. If not, obtain it from
+ * http://www.perlfoundation.org/artistic_license_2_0.
+ */
+
+#ifndef _D2TK_LV2_H
+#define _D2TK_LV2_H
+
+#include "lv2/lv2plug.in/ns/ext/atom/atom.h"
+#include "lv2/lv2plug.in/ns/ext/atom/forge.h"
+#include "lv2/lv2plug.in/ns/ext/log/log.h"
+#include "lv2/lv2plug.in/ns/ext/log/logger.h"
+#include "lv2/lv2plug.in/ns/ext/patch/patch.h"
+#include "lv2/lv2plug.in/ns/extensions/ui/ui.h"
+#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
+
+#define D2TK_URI "http://open-music-kontrollers.ch/lv2/d2tk"
+#define D2TK_PREFIX D2TK_URI"#"
+
+#define CONTROL_N 16
+
+#endif // _D2TK_LV2_H
diff --git a/plug_ui.c b/plug_ui.c
new file mode 100644
index 0000000..1d25289
--- /dev/null
+++ b/plug_ui.c
@@ -0,0 +1,384 @@
+/*
+ * Copyright (c) 2019 Hanspeter Portner (dev@open-music-kontrollers.ch)
+ *
+ * This is free software: you can redistribute it and/or modify
+ * it under the terms of the Artistic License 2.0 as published by
+ * The Perl Foundation.
+ *
+ * This source is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * Artistic License 2.0 for more details.
+ *
+ * You should have received a copy of the Artistic License 2.0
+ * along the source as a COPYING file. If not, obtain it from
+ * http://www.perlfoundation.org/artistic_license_2_0.
+ */
+
+#include <stdlib.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <math.h>
+
+#include <plug.h>
+
+#include <d2tk/frontend_pugl.h>
+
+typedef struct _plughandle_t plughandle_t;
+
+struct _plughandle_t {
+ LV2_URID_Map *map;
+ LV2_Atom_Forge forge;
+
+ LV2_Log_Log *log;
+ LV2_Log_Logger logger;
+
+ d2tk_pugl_config_t config;
+ d2tk_frontend_t *dpugl;
+
+ LV2UI_Controller *controller;
+ LV2UI_Write_Function writer;
+
+ bool toggle [CONTROL_N];
+ float cntrl [CONTROL_N];
+ int32_t radio;
+};
+
+static const char * lbls [CONTROL_N] = {
+ "*1*",
+ "*2*",
+ "*3*",
+ "*4*",
+ "*5*",
+ "*6*",
+ "*7*",
+ "*8*",
+ "*9*",
+ "*10*",
+ "*11*",
+ "*12*",
+ "*13*",
+ "*14*",
+ "*15*",
+ "*16*"
+};
+
+static int
+_expose(void *data, d2tk_coord_t w, d2tk_coord_t h)
+{
+ plughandle_t *handle = data;
+
+ d2tk_frontend_t *dpugl = handle->dpugl;
+ d2tk_base_t *base = d2tk_frontend_get_base(dpugl);
+ const d2tk_rect_t rect = D2TK_RECT(0, 0, w, h);
+
+ static const d2tk_coord_t vfrac [3] = { 1, 1, CONTROL_N };
+ D2TK_BASE_LAYOUT(&rect, 3, vfrac, D2TK_FLAG_LAYOUT_Y_REL, vlay)
+ {
+ const d2tk_rect_t *vrect = d2tk_layout_get_rect(vlay);
+ const uint32_t vy = d2tk_layout_get_index(vlay);
+
+ switch(vy)
+ {
+ case 0:
+ {
+ d2tk_base_label(base, -1, "D2TK", 1.f, vrect, D2TK_ALIGN_CENTERED);
+ } break;
+ case 1:
+ {
+ if(d2tk_base_combo_is_changed(base, D2TK_ID, CONTROL_N, lbls, vrect,
+ &handle->radio))
+ {
+ const float val = handle->radio;
+ const uint32_t idx = 2 + 2*CONTROL_N;
+
+ handle->writer(handle->controller, idx, sizeof(float), 0, &val);
+ }
+ } break;
+ case 2:
+ {
+ D2TK_BASE_TABLE(vrect, 4, CONTROL_N, D2TK_FLAG_TABLE_REL, tab)
+ {
+ const d2tk_rect_t *trect = d2tk_table_get_rect(tab);
+ const uint32_t tx = d2tk_table_get_index_x(tab);
+ const uint32_t ty = d2tk_table_get_index_y(tab);
+ const uint32_t tk = d2tk_table_get_index(tab);
+ const d2tk_id_t id = D2TK_ID_IDX(tk);
+
+ switch(tx)
+ {
+ case 0:
+ {
+ char buf [16];
+ const ssize_t buflen = snprintf(buf, sizeof(buf),
+ "Toggle %"PRIu32, ty);
+ d2tk_base_label(base, buflen, buf, 0.5f, trect,
+ D2TK_ALIGN_MIDDLE | D2TK_ALIGN_LEFT);
+ } break;
+ case 1:
+ {
+ if(d2tk_base_dial_bool_is_changed(base, id, trect,
+ &handle->toggle[ty]))
+ {
+ const float val = handle->toggle[ty] ? 1.f : 0.f;
+ const uint32_t idx = ty + 2;
+
+ handle->writer(handle->controller, idx, sizeof(float), 0, &val);
+ }
+ } break;
+
+ case 2:
+ {
+ char buf [16];
+ const ssize_t buflen = snprintf(buf, sizeof(buf),
+ "Control %"PRIu32, ty);
+ d2tk_base_label(base, buflen, buf, 0.5f, trect,
+ D2TK_ALIGN_MIDDLE | D2TK_ALIGN_LEFT);
+ } break;
+ case 3:
+ {
+ if(d2tk_base_dial_float_is_changed(base, id, trect,
+ 0.f, &handle->cntrl[ty], 100.f))
+ {
+ const uint32_t idx = ty + 2 + CONTROL_N;
+
+ handle->writer(handle->controller, idx, sizeof(float), 0,
+ &handle->cntrl[ty]);
+ }
+ } break;
+ }
+ }
+ } break;
+ }
+ }
+
+ return 0;
+}
+
+static LV2UI_Handle
+instantiate(const LV2UI_Descriptor *descriptor,
+ const char *plugin_uri __attribute__((unused)),
+ const char *bundle_path __attribute__((unused)),
+ LV2UI_Write_Function write_function,
+ LV2UI_Controller controller, LV2UI_Widget *widget,
+ const LV2_Feature *const *features)
+{
+ plughandle_t *handle = calloc(1, sizeof(plughandle_t));
+ if(!handle)
+ return NULL;
+
+ void *parent = NULL;
+ LV2UI_Resize *host_resize = NULL;
+ for(int i=0; features[i]; i++)
+ {
+ if(!strcmp(features[i]->URI, LV2_UI__parent))
+ parent = features[i]->data;
+ else if(!strcmp(features[i]->URI, LV2_UI__resize))
+ host_resize = features[i]->data;
+ else if(!strcmp(features[i]->URI, LV2_URID__map))
+ handle->map = features[i]->data;
+ else if(!strcmp(features[i]->URI, LV2_LOG__log))
+ handle->log = features[i]->data;
+ }
+
+ if(!parent)
+ {
+ fprintf(stderr,
+ "%s: Host does not support ui:parent\n", descriptor->URI);
+ free(handle);
+ return NULL;
+ }
+ if(!handle->map)
+ {
+ fprintf(stderr,
+ "%s: Host does not support urid:map\n", descriptor->URI);
+ free(handle);
+ return NULL;
+ }
+
+ if(handle->log)
+ lv2_log_logger_init(&handle->logger, handle->map, handle->log);
+
+ lv2_atom_forge_init(&handle->forge, handle->map);
+
+ handle->controller = controller;
+ handle->writer = write_function;
+
+ const d2tk_coord_t w = 800;
+ const d2tk_coord_t h = 450;
+
+ d2tk_pugl_config_t *config = &handle->config;
+ config->parent = (uintptr_t)parent;
+ config->bundle_path = bundle_path;
+ config->min_w = w/2;
+ config->min_h = h/2;
+ config->w = w;
+ config->h = h;
+ config->fixed_size = false;
+ config->fixed_aspect = false;
+ config->expose = _expose;
+ config->data = handle;
+
+ handle->dpugl = d2tk_pugl_new(config, (uintptr_t *)widget);
+ if(!handle->dpugl)
+ {
+ free(handle);
+ return NULL;
+ }
+
+ if(host_resize)
+ {
+ host_resize->ui_resize(host_resize->handle, w, h);
+ }
+
+ return handle;
+}
+
+static void
+cleanup(LV2UI_Handle instance)
+{
+ plughandle_t *handle = instance;
+
+ d2tk_frontend_free(handle->dpugl);
+
+ free(handle);
+}
+
+static void
+port_event(LV2UI_Handle instance, uint32_t index, uint32_t size,
+ uint32_t protocol, const void *buf)
+{
+ plughandle_t *handle = instance;
+
+ if( (size == sizeof(float)) && (protocol == 0) )
+ {
+ bool redisplay = false;
+ const float *flt = buf;
+
+ switch(index)
+ {
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ {
+ const unsigned idx = index - 2;
+ const int32_t val = *flt != 0.f ? 1 : 0;
+ if(val != handle->toggle[idx])
+ {
+ handle->toggle[idx] =val;
+ redisplay = true;
+ }
+ break;
+ }
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ case 26:
+ case 27:
+ case 28:
+ case 29:
+ case 30:
+ case 31:
+ case 32:
+ case 33:
+ {
+ const unsigned idx = index - CONTROL_N - 2;
+ const float val = *flt;
+ if(val != handle->cntrl[idx])
+ {
+ handle->cntrl[idx] = val;
+ redisplay = true;
+ }
+ break;
+ }
+ case 34:
+ {
+ const int32_t val = floor(*flt);
+ if(val != handle->radio)
+ {
+ handle->radio = val;
+ redisplay = true;
+ }
+ break;
+ }
+ }
+
+ if(redisplay)
+ {
+ d2tk_frontend_redisplay(handle->dpugl);
+ }
+ }
+}
+
+static int
+_idle(LV2UI_Handle instance)
+{
+ plughandle_t *handle = instance;
+
+ return d2tk_frontend_step(handle->dpugl);
+}
+
+static const LV2UI_Idle_Interface idle_ext = {
+ .idle = _idle
+};
+
+static int
+_resize(LV2UI_Handle instance, int width, int height)
+{
+ plughandle_t *handle = instance;
+
+ return d2tk_frontend_set_size(handle->dpugl, width, height);
+}
+
+static const LV2UI_Resize resize_ext = {
+ .ui_resize = _resize
+};
+
+static const void *
+extension_data(const char *uri)
+{
+ if(!strcmp(uri, LV2_UI__idleInterface))
+ return &idle_ext;
+ else if(!strcmp(uri, LV2_UI__resize))
+ return &resize_ext;
+
+ return NULL;
+}
+
+static const LV2UI_Descriptor d2tk_d2tk_ui = {
+ .URI = D2TK_PREFIX"d2tk_ui",
+ .instantiate = instantiate,
+ .cleanup = cleanup,
+ .port_event = port_event,
+ .extension_data = extension_data
+};
+
+LV2_SYMBOL_EXPORT const LV2UI_Descriptor*
+lv2ui_descriptor(uint32_t index)
+{
+ switch(index)
+ {
+ case 0:
+ return &d2tk_d2tk_ui;
+ default:
+ return NULL;
+ }
+}
diff --git a/.gitignore b/subprojects/d2tk/.gitignore
index 651404e..651404e 100644
--- a/.gitignore
+++ b/subprojects/d2tk/.gitignore
diff --git a/subprojects/d2tk/.gitlab-ci.yml b/subprojects/d2tk/.gitlab-ci.yml
new file mode 100644
index 0000000..8627344
--- /dev/null
+++ b/subprojects/d2tk/.gitlab-ci.yml
@@ -0,0 +1,125 @@
+stages:
+ - build
+ - deploy
+
+# templates
+.variables_template: &variables_definition
+ variables:
+ BASE_NAME: "d2tk"
+ PKG_CONFIG_PATH: "/opt/lv2/lib/pkgconfig:/opt/${CI_BUILD_NAME}/lib/pkgconfig:/usr/lib/${CI_BUILD_NAME}/pkgconfig"
+
+.common_template: &common_definition
+ <<: *variables_definition
+ stage: build
+ artifacts:
+ name: "${BASE_NAME}-$(cat VERSION)-${CI_BUILD_NAME}"
+ paths:
+ - "${BASE_NAME}-$(cat VERSION)/"
+
+.build_template: &build_definition
+ <<: *common_definition
+ stage: build
+ script:
+ - meson --prefix="/" --libdir="lib" --cross-file "${CI_BUILD_NAME}" build
+ - sed -i -e '/framework/s/-Wl,-O1//g' -e '/framework/s/-Wl,--start-group//g' -e '/framework/s/-Wl,--end-group//g' build/build.ninja
+ - ninja -C build
+ - DESTDIR="${CI_PROJECT_DIR}/${BASE_NAME}-$(cat VERSION)/${CI_BUILD_NAME}" ninja -C build install
+
+.test_template: &test_definition
+ <<: *common_definition
+ stage: build
+ script:
+ - meson --prefix="/" --libdir="lib" --cross-file "${CI_BUILD_NAME}" build
+ - sed -i -e '/framework/s/-Wl,-O1//g' -e '/framework/s/-Wl,--start-group//g' -e '/framework/s/-Wl,--end-group//g' build/build.ninja
+ - ninja -C build
+ - DESTDIR="${CI_PROJECT_DIR}/${BASE_NAME}-$(cat VERSION)/${CI_BUILD_NAME}" ninja -C build install
+
+ - meson test -C build
+
+.analyze_template: &analyze_definition
+ <<: *common_definition
+ stage: build
+ script:
+ - meson --prefix="/" --libdir="lib" --cross-file "${CI_BUILD_NAME}" build
+ - sed -i -e '/framework/s/-Wl,-O1//g' -e '/framework/s/-Wl,--start-group//g' -e '/framework/s/-Wl,--end-group//g' build/build.ninja
+ - ninja -C build
+ - DESTDIR="${CI_PROJECT_DIR}/${BASE_NAME}-$(cat VERSION)/${CI_BUILD_NAME}" ninja -C build install
+
+ - meson test -C build
+ - meson test -C build --wrap=valgrind
+
+ - CC=clang CXX=clang++ meson --prefix="/" --libdir="lib" --cross-file "${CI_BUILD_NAME}" clang
+ - ninja -C clang
+ - ninja -C clang test
+
+ - scan-build --status-bugs meson --prefix="/" --libdir="lib" --cross-file "${CI_BUILD_NAME}" scanbuild
+ - scan-build --status-bugs ninja -C scanbuild
+ - scan-build --status-bugs ninja -C scanbuild test
+
+.universal_linux_template: &universal_linux_definition
+ image: ventosus/universal-linux-gnu:buster
+ <<: *analyze_definition
+
+.arm_linux_template: &arm_linux_definition
+ image: ventosus/arm-linux-gnueabihf:buster
+ <<: *test_definition
+
+.universal_w64_template: &universal_w64_definition
+ image: ventosus/universal-w64-mingw32
+ <<: *test_definition
+
+.universal_apple_template: &universal_apple_definition
+ image: ventosus/universal-apple-darwin
+ <<: *build_definition
+
+# targets
+x86_64-linux-gnu:
+ before_script:
+ - apt-get install -y libglu1-mesa-dev libevdev-dev libvterm-dev
+ <<: *universal_linux_definition
+
+i686-linux-gnu:
+ before_script:
+ - apt-get install -y libglu1-mesa-dev:i386 libevdev-dev:i386 libvterm-dev:i386
+ <<: *universal_linux_definition
+
+arm-linux-gnueabihf:
+ before_script:
+ - apt-get install -y libglu1-mesa-dev:armhf libevdev-dev:armhf libvterm-dev:armhf
+ <<: *arm_linux_definition
+
+aarch64-linux-gnu:
+ before_script:
+ - apt-get install -y libglu1-mesa-dev:arm64 libevdev-dev:arm64 libvterm-dev:arm64
+ <<: *arm_linux_definition
+
+x86_64-w64-mingw32:
+ <<: *universal_w64_definition
+
+i686-w64-mingw32:
+ <<: *universal_w64_definition
+
+universal-apple-darwin:
+ <<: *universal_apple_definition
+
+pack:
+ <<: *variables_definition
+ stage: deploy
+ script:
+ - echo 'packing up...'
+ artifacts:
+ name: "${BASE_NAME}-$(cat VERSION)"
+ paths:
+ - "${BASE_NAME}-$(cat VERSION)/"
+
+pages:
+ stage: deploy
+ before_script:
+ - apt-get update -y
+ - apt-get install -y doxygen
+ script:
+ - doxygen
+ - cp -r doc/html public
+ artifacts:
+ paths:
+ - public/
diff --git a/subprojects/d2tk/COPYING b/subprojects/d2tk/COPYING
new file mode 100644
index 0000000..ddb9a46
--- /dev/null
+++ b/subprojects/d2tk/COPYING
@@ -0,0 +1,201 @@
+ The Artistic License 2.0
+
+ Copyright (c) 2000-2006, The Perl Foundation.
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+
+This license establishes the terms under which a given free software
+Package may be copied, modified, distributed, and/or redistributed.
+The intent is that the Copyright Holder maintains some artistic
+control over the development of that Package while still keeping the
+Package available as open source and free software.
+
+You are always permitted to make arrangements wholly outside of this
+license directly with the Copyright Holder of a given Package. If the
+terms of this license do not permit the full use that you propose to
+make of the Package, you should contact the Copyright Holder and seek
+a different licensing arrangement.
+
+Definitions
+
+ "Copyright Holder" means the individual(s) or organization(s)
+ named in the copyright notice for the entire Package.
+
+ "Contributor" means any party that has contributed code or other
+ material to the Package, in accordance with the Copyright Holder's
+ procedures.
+
+ "You" and "your" means any person who would like to copy,
+ distribute, or modify the Package.
+
+ "Package" means the collection of files distributed by the
+ Copyright Holder, and derivatives of that collection and/or of
+ those files. A given Package may consist of either the Standard
+ Version, or a Modified Version.
+
+ "Distribute" means providing a copy of the Package or making it
+ accessible to anyone else, or in the case of a company or
+ organization, to others outside of your company or organization.
+
+ "Distributor Fee" means any fee that you charge for Distributing
+ this Package or providing support for this Package to another
+ party. It does not mean licensing fees.
+
+ "Standard Version" refers to the Package if it has not been
+ modified, or has been modified only in ways explicitly requested
+ by the Copyright Holder.
+
+ "Modified Version" means the Package, if it has been changed, and
+ such changes were not explicitly requested by the Copyright
+ Holder.
+
+ "Original License" means this Artistic License as Distributed with
+ the Standard Version of the Package, in its current version or as
+ it may be modified by The Perl Foundation in the future.
+
+ "Source" form means the source code, documentation source, and
+ configuration files for the Package.
+
+ "Compiled" form means the compiled bytecode, object code, binary,
+ or any other form resulting from mechanical transformation or
+ translation of the Source form.
+
+
+Permission for Use and Modification Without Distribution
+
+(1) You are permitted to use the Standard Version and create and use
+Modified Versions for any purpose without restriction, provided that
+you do not Distribute the Modified Version.
+
+
+Permissions for Redistribution of the Standard Version
+
+(2) You may Distribute verbatim copies of the Source form of the
+Standard Version of this Package in any medium without restriction,
+either gratis or for a Distributor Fee, provided that you duplicate
+all of the original copyright notices and associated disclaimers. At
+your discretion, such verbatim copies may or may not include a
+Compiled form of the Package.
+
+(3) You may apply any bug fixes, portability changes, and other
+modifications made available from the Copyright Holder. The resulting
+Package will still be considered the Standard Version, and as such
+will be subject to the Original License.
+
+
+Distribution of Modified Versions of the Package as Source
+
+(4) You may Distribute your Modified Version as Source (either gratis
+or for a Distributor Fee, and with or without a Compiled form of the
+Modified Version) provided that you clearly document how it differs
+from the Standard Version, including, but not limited to, documenting
+any non-standard features, executables, or modules, and provided that
+you do at least ONE of the following:
+
+ (a) make the Modified Version available to the Copyright Holder
+ of the Standard Version, under the Original License, so that the
+ Copyright Holder may include your modifications in the Standard
+ Version.
+
+ (b) ensure that installation of your Modified Version does not
+ prevent the user installing or running the Standard Version. In
+ addition, the Modified Version must bear a name that is different
+ from the name of the Standard Version.
+
+ (c) allow anyone who receives a copy of the Modified Version to
+ make the Source form of the Modified Version available to others
+ under
+
+ (i) the Original License or
+
+ (ii) a license that permits the licensee to freely copy,
+ modify and redistribute the Modified Version using the same
+ licensing terms that apply to the copy that the licensee
+ received, and requires that the Source form of the Modified
+ Version, and of any works derived from it, be made freely
+ available in that license fees are prohibited but Distributor
+ Fees are allowed.
+
+
+Distribution of Compiled Forms of the Standard Version
+or Modified Versions without the Source
+
+(5) You may Distribute Compiled forms of the Standard Version without
+the Source, provided that you include complete instructions on how to
+get the Source of the Standard Version. Such instructions must be
+valid at the time of your distribution. If these instructions, at any
+time while you are carrying out such distribution, become invalid, you
+must provide new instructions on demand or cease further distribution.
+If you provide valid instructions or cease distribution within thirty
+days after you become aware that the instructions are invalid, then
+you do not forfeit any of your rights under this license.
+
+(6) You may Distribute a Modified Version in Compiled form without
+the Source, provided that you comply with Section 4 with respect to
+the Source of the Modified Version.
+
+
+Aggregating or Linking the Package
+
+(7) You may aggregate the Package (either the Standard Version or
+Modified Version) with other packages and Distribute the resulting
+aggregation provided that you do not charge a licensing fee for the
+Package. Distributor Fees are permitted, and licensing fees for other
+components in the aggregation are permitted. The terms of this license
+apply to the use and Distribution of the Standard or Modified Versions
+as included in the aggregation.
+
+(8) You are permitted to link Modified and Standard Versions with
+other works, to embed the Package in a larger work of your own, or to
+build stand-alone binary or bytecode versions of applications that
+include the Package, and Distribute the result without restriction,
+provided the result does not expose a direct interface to the Package.
+
+
+Items That are Not Considered Part of a Modified Version
+
+(9) Works (including, but not limited to, modules and scripts) that
+merely extend or make use of the Package, do not, by themselves, cause
+the Package to be a Modified Version. In addition, such works are not
+considered parts of the Package itself, and are not subject to the
+terms of this license.
+
+
+General Provisions
+
+(10) Any use, modification, and distribution of the Standard or
+Modified Versions is governed by this Artistic License. By using,
+modifying or distributing the Package, you accept this license. Do not
+use, modify, or distribute the Package, if you do not accept this
+license.
+
+(11) If your Modified Version has been derived from a Modified
+Version made by someone other than you, you are nevertheless required
+to ensure that your Modified Version complies with the requirements of
+this license.
+
+(12) This license does not grant you the right to use any trademark,
+service mark, tradename, or logo of the Copyright Holder.
+
+(13) This license includes the non-exclusive, worldwide,
+free-of-charge patent license to make, have made, use, offer to sell,
+sell, import and otherwise transfer the Package with respect to any
+patent claims licensable by the Copyright Holder that are necessarily
+infringed by the Package. If you institute patent litigation
+(including a cross-claim or counterclaim) against any party alleging
+that the Package constitutes direct or contributory patent
+infringement, then this Artistic License to you shall terminate on the
+date that such litigation is filed.
+
+(14) Disclaimer of Warranty:
+THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
+IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL
+LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Doxyfile b/subprojects/d2tk/Doxyfile
index 294d19d..294d19d 100644
--- a/Doxyfile
+++ b/subprojects/d2tk/Doxyfile
diff --git a/subprojects/d2tk/README.md b/subprojects/d2tk/README.md
new file mode 100644
index 0000000..51c9529
--- /dev/null
+++ b/subprojects/d2tk/README.md
@@ -0,0 +1,62 @@
+# d2tk
+
+## Data Driven Tool Kit
+
+A performant, dyamic, immediate-mode GUI tool kit in C which partially renders
+on-change only by massively hashing-and-cashing of vector drawing instructions
+and on-demand rendered sprites.
+
+### Build / test
+
+ git clone https://git.open-music-kontrollers.ch/lad/d2tk
+ cd d2tk
+ meson build
+ cd build
+ ninja -j4
+
+#### Pugl/NanoVG backend
+
+ ./d2tk.nanovg
+
+#### Pugl/Cairo backend
+
+ ./d2tk.cairo
+
+#### FBdev/Cairo backend
+
+ ./d2tk.fbdev
+
+### Screenshots
+
+![Screenshot 1](/screenshots/screenshot_1.png)
+
+![Screenshot 2](/screenshots/screenshot_2.png)
+
+![Screenshot 3](/screenshots/screenshot_3.png)
+
+![Screenshot 4](/screenshots/screenshot_4.png)
+
+![Screenshot 5](/screenshots/screenshot_5.png)
+
+![Screenshot 6](/screenshots/screenshot_6.png)
+
+![Screenshot 7](/screenshots/screenshot_7.png)
+
+![Screenshot 8](/screenshots/screenshot_8.png)
+
+### License
+
+Copyright (c) 2018-2019 Hanspeter Portner (dev@open-music-kontrollers.ch)
+
+This is free software: you can redistribute it and/or modify
+it under the terms of the Artistic License 2.0 as published by
+The Perl Foundation.
+
+This source is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+Artistic License 2.0 for more details.
+
+You should have received a copy of the Artistic License 2.0
+along the source as a COPYING file. If not, obtain it from
+<http://www.perlfoundation.org/artistic_license_2_0>.
diff --git a/subprojects/d2tk/VERSION b/subprojects/d2tk/VERSION
new file mode 100644
index 0000000..810aa9d
--- /dev/null
+++ b/subprojects/d2tk/VERSION
@@ -0,0 +1 @@
+0.1.1069
diff --git a/check_for_font b/subprojects/d2tk/check_for_font
index befcbf4..befcbf4 100755
--- a/check_for_font
+++ b/subprojects/d2tk/check_for_font
diff --git a/d2tk/backend.h b/subprojects/d2tk/d2tk/backend.h
index 862f6d2..862f6d2 100644
--- a/d2tk/backend.h
+++ b/subprojects/d2tk/d2tk/backend.h
diff --git a/d2tk/base.h b/subprojects/d2tk/d2tk/base.h
index 4e4238c..4e4238c 100644
--- a/d2tk/base.h
+++ b/subprojects/d2tk/d2tk/base.h
diff --git a/d2tk/config.h.in b/subprojects/d2tk/d2tk/config.h.in
index c1d746e..c1d746e 100644
--- a/d2tk/config.h.in
+++ b/subprojects/d2tk/d2tk/config.h.in
diff --git a/d2tk/core.h b/subprojects/d2tk/d2tk/core.h
index 0b8049b..0b8049b 100644
--- a/d2tk/core.h
+++ b/subprojects/d2tk/d2tk/core.h
diff --git a/d2tk/d2tk.h b/subprojects/d2tk/d2tk/d2tk.h
index 2d12a82..2d12a82 100644
--- a/d2tk/d2tk.h
+++ b/subprojects/d2tk/d2tk/d2tk.h
diff --git a/d2tk/frontend.h b/subprojects/d2tk/d2tk/frontend.h
index eaa2b4a..eaa2b4a 100644
--- a/d2tk/frontend.h
+++ b/subprojects/d2tk/d2tk/frontend.h
diff --git a/d2tk/frontend_fbdev.h b/subprojects/d2tk/d2tk/frontend_fbdev.h
index 969c644..969c644 100644
--- a/d2tk/frontend_fbdev.h
+++ b/subprojects/d2tk/d2tk/frontend_fbdev.h
diff --git a/d2tk/frontend_pugl.h b/subprojects/d2tk/d2tk/frontend_pugl.h
index 4be0b86..4be0b86 100644
--- a/d2tk/frontend_pugl.h
+++ b/subprojects/d2tk/d2tk/frontend_pugl.h
diff --git a/d2tk/hash.h b/subprojects/d2tk/d2tk/hash.h
index a6cf614..a6cf614 100644
--- a/d2tk/hash.h
+++ b/subprojects/d2tk/d2tk/hash.h
diff --git a/example/d2tk_fbdev.c b/subprojects/d2tk/example/d2tk_fbdev.c
index f44e47d..f44e47d 100644
--- a/example/d2tk_fbdev.c
+++ b/subprojects/d2tk/example/d2tk_fbdev.c
diff --git a/example/d2tk_pugl.c b/subprojects/d2tk/example/d2tk_pugl.c
index 70ab967..70ab967 100644
--- a/example/d2tk_pugl.c
+++ b/subprojects/d2tk/example/d2tk_pugl.c
diff --git a/example/example.c b/subprojects/d2tk/example/example.c
index ce80f48..ce80f48 100644
--- a/example/example.c
+++ b/subprojects/d2tk/example/example.c
diff --git a/example/example.h b/subprojects/d2tk/example/example.h
index 84f430c..84f430c 100644
--- a/example/example.h
+++ b/subprojects/d2tk/example/example.h
diff --git a/example/libre-arrow-circle-right.png b/subprojects/d2tk/example/libre-arrow-circle-right.png
index 21c8013..21c8013 100644
--- a/example/libre-arrow-circle-right.png
+++ b/subprojects/d2tk/example/libre-arrow-circle-right.png
Binary files differ
diff --git a/example/libre-gui-file.png b/subprojects/d2tk/example/libre-gui-file.png
index 1c6d984..1c6d984 100644
--- a/example/libre-gui-file.png
+++ b/subprojects/d2tk/example/libre-gui-file.png
Binary files differ
diff --git a/example/libre-gui-folder.png b/subprojects/d2tk/example/libre-gui-folder.png
index 6960606..6960606 100644
--- a/example/libre-gui-folder.png
+++ b/subprojects/d2tk/example/libre-gui-folder.png
Binary files differ
diff --git a/glew-2.1.0/GL/eglew.h b/subprojects/d2tk/glew-2.1.0/GL/eglew.h
index 4670147..4670147 100644
--- a/glew-2.1.0/GL/eglew.h
+++ b/subprojects/d2tk/glew-2.1.0/GL/eglew.h
diff --git a/glew-2.1.0/GL/glew.h b/subprojects/d2tk/glew-2.1.0/GL/glew.h
index b5b6987..b5b6987 100644
--- a/glew-2.1.0/GL/glew.h
+++ b/subprojects/d2tk/glew-2.1.0/GL/glew.h
diff --git a/glew-2.1.0/GL/glxew.h b/subprojects/d2tk/glew-2.1.0/GL/glxew.h
index 7e39c2f..7e39c2f 100644
--- a/glew-2.1.0/GL/glxew.h
+++ b/subprojects/d2tk/glew-2.1.0/GL/glxew.h
diff --git a/glew-2.1.0/GL/wglew.h b/subprojects/d2tk/glew-2.1.0/GL/wglew.h
index 2097c0f..2097c0f 100644
--- a/glew-2.1.0/GL/wglew.h
+++ b/subprojects/d2tk/glew-2.1.0/GL/wglew.h
diff --git a/glew-2.1.0/glew.c b/subprojects/d2tk/glew-2.1.0/glew.c
index 18a2853..18a2853 100644
--- a/glew-2.1.0/glew.c
+++ b/subprojects/d2tk/glew-2.1.0/glew.c
diff --git a/subprojects/d2tk/meson.build b/subprojects/d2tk/meson.build
new file mode 100644
index 0000000..e13ad99
--- /dev/null
+++ b/subprojects/d2tk/meson.build
@@ -0,0 +1,392 @@
+project('d2tk', 'c', default_options : [
+ 'buildtype=release',
+ 'warning_level=3',
+ 'werror=false',
+ 'b_lto=false',
+ 'c_std=gnu11'])
+
+static_link = false #meson.is_cross_build()
+
+build_debug_overlay = get_option('build-debug-overlay')
+build_examples = get_option('build-examples')
+build_tests = get_option('build-tests')
+
+use_backend_cairo = get_option('use-backend-cairo')
+use_backend_nanovg = get_option('use-backend-nanovg')
+use_frontend_fbdev = get_option('use-frontend-fbdev')
+use_frontend_pugl= get_option('use-frontend-pugl')
+
+use_vterm = get_option('use-vterm')
+use_evdev = get_option('use-evdev')
+use_fontconfig = get_option('use-fontconfig')
+
+grep = find_program('grep',
+ native : true,
+ required : use_fontconfig)
+fc_list = find_program('fc-list',
+ native : true,
+ required : use_fontconfig)
+check_for_font = find_program('check_for_font',
+ native : true,
+ required : use_fontconfig)
+
+cc = meson.get_compiler('c')
+
+# mandatory dependencies
+m_dep = cc.find_library('m')
+
+# dependencies for backend_cairo/frontend_pugl
+freetype_dep = dependency('freetype2',
+ version : '>=18.0.0',
+ static : static_link,
+ required : use_backend_cairo)
+pixman_dep = dependency('pixman-1',
+ version : '>=0.34.0',
+ static : static_link,
+ required : use_backend_cairo)
+cairo_dep = dependency('cairo',
+ version : '>=1.14.0',
+ static : static_link,
+ required : use_backend_cairo)
+cairo_deps = [freetype_dep, pixman_dep, cairo_dep]
+if use_frontend_pugl.enabled()
+ cairo_xlib_dep = dependency('cairo-xlib',
+ version : '>=1.14.0',
+ static : static_link,
+ required : use_backend_cairo)
+endif
+
+# dependencies for frontend_fbdev
+input_dep = dependency('libinput',
+ version : '>=1.6.0',
+ static : static_link,
+ required : use_frontend_fbdev)
+udev_dep = dependency('libudev',
+ static : static_link,
+ required : use_frontend_fbdev)
+evdev_dep = dependency('libevdev',
+ version : '>=1.5.0',
+ static : static_link,
+ required : use_frontend_fbdev)
+
+# dependencies for backend_nanovg
+glew_dep = dependency('glew',
+ version : '>=2.1.0',
+ static : static_link,
+ required : false)
+if use_backend_nanovg.enabled() and not glew_dep.found()
+ # use embedded glew
+ glew_dep = declare_dependency(
+ compile_args : '-DGLEW_STATIC',
+ include_directories : include_directories('glew-2.1.0'),
+ sources : join_paths('glew-2.1.0', 'glew.c'))
+endif
+
+# optional dependencies
+util_dep = cc.find_library('util',
+ required : use_vterm)
+vterm_dep = dependency('vterm',
+ version : '>=0.1',
+ static : static_link,
+ required : use_vterm)
+if not use_frontend_fbdev.enabled()
+ evdev_dep = dependency('libevdev',
+ version : '>=1.5.0',
+ static : static_link,
+ required : use_evdev)
+endif
+fontconfig_dep = dependency('fontconfig',
+ version : '>=2.0.0',
+ static : static_link,
+ required : use_fontconfig)
+
+deps = [m_dep, evdev_dep, vterm_dep, fontconfig_dep]
+links = []
+
+pugl_inc = include_directories('pugl')
+nanovg_inc = include_directories('nanovg/src')
+inc_dir = [pugl_inc, nanovg_inc]
+
+rawvers = run_command('cat', 'VERSION').stdout().strip()
+version = rawvers.split('.')
+
+conf_data = configuration_data()
+conf_data.set('MAJOR_VERSION', version[0])
+conf_data.set('MINOR_VERSION', version[1])
+conf_data.set('MICRO_VERSION', version[2])
+
+add_project_arguments('-D_GNU_SOURCE', language : 'c')
+
+if build_debug_overlay
+ add_project_arguments('-DD2TK_DEBUG', language : 'c')
+endif
+
+lib_srcs = [
+ join_paths('src', 'hash.c'),
+ join_paths('src', 'core.c'),
+ join_paths('src', 'base.c'),
+ join_paths('src', 'base_table.c'),
+ join_paths('src', 'base_frame.c'),
+ join_paths('src', 'base_layout.c'),
+ join_paths('src', 'base_scrollbar.c'),
+ join_paths('src', 'base_pane.c'),
+ join_paths('src', 'base_cursor.c'),
+ join_paths('src', 'base_button.c'),
+ join_paths('src', 'base_image.c'),
+ join_paths('src', 'base_bitmap.c'),
+ join_paths('src', 'base_custom.c'),
+ join_paths('src', 'base_meter.c'),
+ join_paths('src', 'base_combo.c'),
+ join_paths('src', 'base_textfield.c'),
+ join_paths('src', 'base_label.c'),
+ join_paths('src', 'base_link.c'),
+ join_paths('src', 'base_dial.c'),
+ join_paths('src', 'base_spinner.c'),
+ join_paths('src', 'base_bar.c'),
+ join_paths('src', 'base_flowmatrix.c')
+]
+
+if use_vterm.enabled()
+ conf_data.set('D2TK_PTY', 1)
+ lib_srcs += join_paths('src', 'base_pty.c')
+ deps += util_dep
+else
+ conf_data.set('D2TK_PTY', 0)
+endif
+
+if use_evdev.enabled()
+ conf_data.set('D2TK_EVDEV', 1)
+ lib_srcs += join_paths('src', 'base_vkb.c')
+else
+ conf_data.set('D2TK_EVDEV', 0)
+endif
+
+if input_dep.found() and input_dep.version().version_compare('>=1.15.0')
+ conf_data.set('D2TK_INPUT_1_15', 1)
+else
+ conf_data.set('D2TK_INPUT_1_15', 0)
+endif
+
+if use_fontconfig.enabled()
+ conf_data.set('D2TK_FONTCONFIG', 1)
+else
+ conf_data.set('D2TK_FONTCONFIG', 0)
+endif
+
+if cc.has_function('vfork')
+ conf_data.set('D2TK_VFORK', 1)
+else
+ conf_data.set('D2TK_VFORK', 0)
+endif
+
+if cc.has_function('clone')
+ conf_data.set('D2TK_CLONE', 1)
+else
+ conf_data.set('D2TK_CLONE', 0)
+endif
+
+example_srcs = [
+ join_paths('example', 'example.c')
+]
+
+example_pugl_srcs = [
+ join_paths('example', 'd2tk_pugl.c')
+]
+
+example_fbdev_srcs = [
+ join_paths('example', 'd2tk_fbdev.c')
+]
+
+pugl_srcs = [
+ join_paths('src', 'frontend_pugl.c'),
+ join_paths('pugl', 'pugl', 'detail', 'implementation.c')
+]
+
+pugl_gl_srcs = []
+
+pugl_cairo_srcs = []
+
+nanovg_srcs = [
+ join_paths('nanovg', 'src', 'nanovg.c'),
+ join_paths('src', 'backend_nanovg.c')
+]
+
+cairo_srcs = [
+ join_paths('src', 'backend_cairo.c')
+]
+
+fbdev_srcs = [
+ join_paths('src', 'frontend_fbdev.c')
+]
+
+test_core_srcs = [
+ join_paths('test', 'core.c'),
+ join_paths('test', 'mock.c')
+]
+
+test_base_srcs = [
+ join_paths('test', 'base.c'),
+ join_paths('test', 'mock.c')
+]
+
+c_args = ['-fvisibility=hidden',
+ '-ffast-math']
+
+if host_machine.system() == 'windows'
+ deps += cc.find_library('opengl32', required : use_frontend_pugl)
+ deps += cc.find_library('gdi32', required : use_frontend_pugl)
+ deps += cc.find_library('ws2_32', required : true)
+ pugl_srcs += 'pugl/pugl/detail/win.c'
+ pugl_gl_srcs += 'pugl/pugl/detail/win_gl.c'
+ pugl_cairo_srcs += 'pugl/pugl/detail/win_cairo.c'
+elif host_machine.system() == 'darwin'
+ add_languages('objc')
+ links += ['-framework', 'OpenGL']
+ links += ['-framework', 'Cocoa']
+ pugl_srcs += 'pugl/pugl/detail/mac.m'
+ pugl_gl_srcs += 'pugl/pugl/detail/mac_gl.m'
+ pugl_cairo_srcs += 'pugl/pugl/detail/mac_cairo.m'
+else
+ deps += dependency('gl', required : use_frontend_pugl)
+ deps += dependency('x11', version : '>=1.6.0', required : use_frontend_pugl)
+ deps += dependency('xext', version : '>=1.3.0', required : use_frontend_pugl)
+ pugl_srcs += 'pugl/pugl/detail/x11.c'
+ pugl_gl_srcs += 'pugl/pugl/detail/x11_gl.c'
+ pugl_cairo_srcs += 'pugl/pugl/detail/x11_cairo.c'
+endif
+
+if use_backend_cairo.enabled()
+ if use_frontend_pugl.enabled()
+ d2tk_cairo = declare_dependency(
+ compile_args : '-DPUGL_HAVE_CAIRO',
+ include_directories : inc_dir,
+ dependencies : [deps, cairo_deps, cairo_xlib_dep],
+ link_args : links,
+ sources : [lib_srcs, cairo_srcs, pugl_srcs, pugl_cairo_srcs])
+
+ if build_examples
+ executable('d2tk.cairo', [example_srcs, example_pugl_srcs],
+ c_args : c_args,
+ include_directories : inc_dir,
+ dependencies: d2tk_cairo,
+ install : false)
+ endif
+ endif
+
+ if use_frontend_fbdev.enabled()
+ d2tk_fbdev = declare_dependency(
+ include_directories : inc_dir,
+ dependencies : [deps, cairo_deps, input_dep, udev_dep, evdev_dep],
+ link_args : links,
+ sources : [lib_srcs, cairo_srcs, fbdev_srcs])
+
+ if build_examples
+ executable('d2tk.fbdev', [example_srcs, example_fbdev_srcs],
+ c_args : c_args,
+ include_directories : inc_dir,
+ dependencies: d2tk_fbdev,
+ install : false)
+ endif
+ endif
+endif
+
+if use_backend_nanovg.enabled()
+ if use_frontend_pugl.enabled()
+ d2tk_nanovg = declare_dependency(
+ include_directories : inc_dir,
+ dependencies : [deps, glew_dep],
+ link_args : links,
+ sources : [lib_srcs, nanovg_srcs, pugl_srcs, pugl_gl_srcs])
+
+ if build_examples
+ executable('d2tk.nanovg', [example_srcs, example_pugl_srcs],
+ c_args : c_args,
+ include_directories : inc_dir,
+ dependencies: d2tk_nanovg,
+ install : false)
+ endif
+ endif
+endif
+
+config_h = configure_file(
+ input : join_paths('d2tk', 'config.h.in'),
+ output : 'config.h',
+ configuration : conf_data,
+ install : false)
+
+if not use_fontconfig.enabled()
+ fira_sans_bold_ttf = configure_file(
+ input : join_paths('ttf', 'FiraSans-Bold.ttf'),
+ output : 'FiraSans:bold.ttf',
+ copy : true,
+ install : false)
+
+ fira_code_bold_ttf = configure_file(
+ input : join_paths('ttf', 'FiraCode-Bold.ttf'),
+ output : 'FiraCode:bold.ttf',
+ copy : true,
+ install : false)
+
+ fira_code_light_ttf = configure_file(
+ input : join_paths('ttf', 'FiraCode-Light.ttf'),
+ output : 'FiraCode:light.ttf',
+ copy : true,
+ install : false)
+
+ fira_code_medium_ttf = configure_file(
+ input : join_paths('ttf', 'FiraCode-Medium.ttf'),
+ output : 'FiraCode:medium.ttf',
+ copy : true,
+ install : false)
+
+ fira_code_regular_ttf = configure_file(
+ input : join_paths('ttf', 'FiraCode-Regular.ttf'),
+ output : 'FiraCode:regular.ttf',
+ copy : true,
+ install : false)
+endif
+
+if build_examples
+ configure_file(
+ input : join_paths('example', 'libre-arrow-circle-right.png'),
+ output : 'libre-arrow-circle-right.png',
+ copy : true,
+ install : false)
+
+ configure_file(
+ input : join_paths('example', 'libre-gui-folder.png'),
+ output : 'libre-gui-folder.png',
+ copy : true,
+ install : false)
+
+ configure_file(
+ input : join_paths('example', 'libre-gui-file.png'),
+ output : 'libre-gui-file.png',
+ copy : true,
+ install : false)
+endif
+
+if build_tests
+ test_core = executable('test.core', [test_core_srcs, lib_srcs],
+ c_args : c_args,
+ dependencies : deps,
+ include_directories : inc_dir,
+ install : false)
+
+ test_base = executable('test.base', [test_base_srcs, lib_srcs],
+ c_args : c_args,
+ dependencies : deps,
+ include_directories : inc_dir,
+ install : false)
+
+ test('Test core', test_core)
+ test('Test base', test_base)
+
+ if fc_list.found() and grep.found() and check_for_font.found()
+ test('FiraSans-Bold.ttf', check_for_font, args : ['FiraSans-Bold.ttf'])
+ test('FiraCode-Light.ttf', check_for_font, args : ['FiraCode-Light.tt'])
+ test('FiraCode-Regular.ttf', check_for_font, args : ['FiraCode-Regular.ttf'])
+ test('FiraCode-Medium.ttf', check_for_font, args : ['FiraCode-Medium.ttf'])
+ test('FiraCode-Bold.ttf', check_for_font, args : ['FiraCode-Bold.ttf'])
+ endif
+endif
diff --git a/subprojects/d2tk/meson_options.txt b/subprojects/d2tk/meson_options.txt
new file mode 100644
index 0000000..6396503
--- /dev/null
+++ b/subprojects/d2tk/meson_options.txt
@@ -0,0 +1,43 @@
+option('build-debug-overlay',
+ type : 'boolean',
+ value : false,
+ yield : true)
+option('build-examples',
+ type : 'boolean',
+ value : false,
+ yield : true)
+option('build-tests',
+ type : 'boolean',
+ value : true,
+ yield : true)
+
+option('use-backend-cairo',
+ type : 'feature',
+ value : 'disabled',
+ yield : true)
+option('use-backend-nanovg',
+ type : 'feature',
+ value : 'disabled',
+ yield : true)
+
+option('use-frontend-fbdev',
+ type : 'feature',
+ value : 'disabled',
+ yield : true)
+option('use-frontend-pugl',
+ type : 'feature',
+ value : 'disabled',
+ yield : true)
+
+option('use-vterm',
+ type : 'feature',
+ value : 'disabled',
+ yield : true)
+option('use-evdev',
+ type : 'feature',
+ value : 'disabled',
+ yield : true)
+option('use-fontconfig',
+ type : 'feature',
+ value : 'disabled',
+ yield : true)
diff --git a/nanovg/.gitignore b/subprojects/d2tk/nanovg/.gitignore
index 70f534e..70f534e 100644
--- a/nanovg/.gitignore
+++ b/subprojects/d2tk/nanovg/.gitignore
diff --git a/nanovg/LICENSE.txt b/subprojects/d2tk/nanovg/LICENSE.txt
index 2a03a1a..2a03a1a 100644
--- a/nanovg/LICENSE.txt
+++ b/subprojects/d2tk/nanovg/LICENSE.txt
diff --git a/nanovg/README.md b/subprojects/d2tk/nanovg/README.md
index 4f9709b..4f9709b 100644
--- a/nanovg/README.md
+++ b/subprojects/d2tk/nanovg/README.md
diff --git a/nanovg/example/LICENSE_OFL.txt b/subprojects/d2tk/nanovg/example/LICENSE_OFL.txt
index d952d62..d952d62 100644
--- a/nanovg/example/LICENSE_OFL.txt
+++ b/subprojects/d2tk/nanovg/example/LICENSE_OFL.txt
diff --git a/nanovg/example/NotoEmoji-Regular.ttf b/subprojects/d2tk/nanovg/example/NotoEmoji-Regular.ttf
index 19b7bad..19b7bad 100644
--- a/nanovg/example/NotoEmoji-Regular.ttf
+++ b/subprojects/d2tk/nanovg/example/NotoEmoji-Regular.ttf
Binary files differ
diff --git a/nanovg/example/Roboto-Bold.ttf b/subprojects/d2tk/nanovg/example/Roboto-Bold.ttf
index aaf374d..aaf374d 100755
--- a/nanovg/example/Roboto-Bold.ttf
+++ b/subprojects/d2tk/nanovg/example/Roboto-Bold.ttf
Binary files differ
diff --git a/nanovg/example/Roboto-Light.ttf b/subprojects/d2tk/nanovg/example/Roboto-Light.ttf
index 664e1b2..664e1b2 100755
--- a/nanovg/example/Roboto-Light.ttf
+++ b/subprojects/d2tk/nanovg/example/Roboto-Light.ttf
Binary files differ
diff --git a/nanovg/example/Roboto-Regular.ttf b/subprojects/d2tk/nanovg/example/Roboto-Regular.ttf
index 3e6e2e7..3e6e2e7 100755
--- a/nanovg/example/Roboto-Regular.ttf
+++ b/subprojects/d2tk/nanovg/example/Roboto-Regular.ttf
Binary files differ
diff --git a/nanovg/example/demo.c b/subprojects/d2tk/nanovg/example/demo.c
index cfad99e..cfad99e 100644
--- a/nanovg/example/demo.c
+++ b/subprojects/d2tk/nanovg/example/demo.c
diff --git a/nanovg/example/demo.h b/subprojects/d2tk/nanovg/example/demo.h
index aace449..aace449 100644
--- a/nanovg/example/demo.h
+++ b/subprojects/d2tk/nanovg/example/demo.h
diff --git a/nanovg/example/entypo.ttf b/subprojects/d2tk/nanovg/example/entypo.ttf
index fc305d2..fc305d2 100644
--- a/nanovg/example/entypo.ttf
+++ b/subprojects/d2tk/nanovg/example/entypo.ttf
Binary files differ
diff --git a/nanovg/example/example_fbo.c b/subprojects/d2tk/nanovg/example/example_fbo.c
index cff4ed2..cff4ed2 100644
--- a/nanovg/example/example_fbo.c
+++ b/subprojects/d2tk/nanovg/example/example_fbo.c
diff --git a/nanovg/example/example_gl2.c b/subprojects/d2tk/nanovg/example/example_gl2.c
index 7fd5621..7fd5621 100644
--- a/nanovg/example/example_gl2.c
+++ b/subprojects/d2tk/nanovg/example/example_gl2.c
diff --git a/nanovg/example/example_gl3.c b/subprojects/d2tk/nanovg/example/example_gl3.c
index 409a145..409a145 100644
--- a/nanovg/example/example_gl3.c
+++ b/subprojects/d2tk/nanovg/example/example_gl3.c
diff --git a/nanovg/example/example_gles2.c b/subprojects/d2tk/nanovg/example/example_gles2.c
index ed78838..ed78838 100644
--- a/nanovg/example/example_gles2.c
+++ b/subprojects/d2tk/nanovg/example/example_gles2.c
diff --git a/nanovg/example/example_gles3.c b/subprojects/d2tk/nanovg/example/example_gles3.c
index 4a6084c..4a6084c 100644
--- a/nanovg/example/example_gles3.c
+++ b/subprojects/d2tk/nanovg/example/example_gles3.c
diff --git a/nanovg/example/images.txt b/subprojects/d2tk/nanovg/example/images.txt
index 96ad626..96ad626 100644
--- a/nanovg/example/images.txt
+++ b/subprojects/d2tk/nanovg/example/images.txt
diff --git a/nanovg/example/images/image1.jpg b/subprojects/d2tk/nanovg/example/images/image1.jpg
index c2ce39b..c2ce39b 100644
--- a/nanovg/example/images/image1.jpg
+++ b/subprojects/d2tk/nanovg/example/images/image1.jpg
Binary files differ
diff --git a/nanovg/example/images/image10.jpg b/subprojects/d2tk/nanovg/example/images/image10.jpg
index d443fb0..d443fb0 100644
--- a/nanovg/example/images/image10.jpg
+++ b/subprojects/d2tk/nanovg/example/images/image10.jpg
Binary files differ
diff --git a/nanovg/example/images/image11.jpg b/subprojects/d2tk/nanovg/example/images/image11.jpg
index 7429fe5..7429fe5 100644
--- a/nanovg/example/images/image11.jpg
+++ b/subprojects/d2tk/nanovg/example/images/image11.jpg
Binary files differ
diff --git a/nanovg/example/images/image12.jpg b/subprojects/d2tk/nanovg/example/images/image12.jpg
index eb0369d..eb0369d 100644
--- a/nanovg/example/images/image12.jpg
+++ b/subprojects/d2tk/nanovg/example/images/image12.jpg
Binary files differ
diff --git a/nanovg/example/images/image2.jpg b/subprojects/d2tk/nanovg/example/images/image2.jpg
index 1db15ab..1db15ab 100644
--- a/nanovg/example/images/image2.jpg
+++ b/subprojects/d2tk/nanovg/example/images/image2.jpg
Binary files differ
diff --git a/nanovg/example/images/image3.jpg b/subprojects/d2tk/nanovg/example/images/image3.jpg
index 884f9f2..884f9f2 100644
--- a/nanovg/example/images/image3.jpg
+++ b/subprojects/d2tk/nanovg/example/images/image3.jpg
Binary files differ
diff --git a/nanovg/example/images/image4.jpg b/subprojects/d2tk/nanovg/example/images/image4.jpg
index f6e1039..f6e1039 100644
--- a/nanovg/example/images/image4.jpg
+++ b/subprojects/d2tk/nanovg/example/images/image4.jpg
Binary files differ
diff --git a/nanovg/example/images/image5.jpg b/subprojects/d2tk/nanovg/example/images/image5.jpg
index d952d16..d952d16 100644
--- a/nanovg/example/images/image5.jpg
+++ b/subprojects/d2tk/nanovg/example/images/image5.jpg
Binary files differ
diff --git a/nanovg/example/images/image6.jpg b/subprojects/d2tk/nanovg/example/images/image6.jpg
index f098087..f098087 100644
--- a/nanovg/example/images/image6.jpg
+++ b/subprojects/d2tk/nanovg/example/images/image6.jpg
Binary files differ
diff --git a/nanovg/example/images/image7.jpg b/subprojects/d2tk/nanovg/example/images/image7.jpg
index 623b4cb..623b4cb 100644
--- a/nanovg/example/images/image7.jpg
+++ b/subprojects/d2tk/nanovg/example/images/image7.jpg
Binary files differ
diff --git a/nanovg/example/images/image8.jpg b/subprojects/d2tk/nanovg/example/images/image8.jpg
index 123b6da..123b6da 100644
--- a/nanovg/example/images/image8.jpg
+++ b/subprojects/d2tk/nanovg/example/images/image8.jpg
Binary files differ
diff --git a/nanovg/example/images/image9.jpg b/subprojects/d2tk/nanovg/example/images/image9.jpg
index 045fadb..045fadb 100644
--- a/nanovg/example/images/image9.jpg
+++ b/subprojects/d2tk/nanovg/example/images/image9.jpg
Binary files differ
diff --git a/nanovg/example/perf.c b/subprojects/d2tk/nanovg/example/perf.c
index a74dc3c..a74dc3c 100644
--- a/nanovg/example/perf.c
+++ b/subprojects/d2tk/nanovg/example/perf.c
diff --git a/nanovg/example/perf.h b/subprojects/d2tk/nanovg/example/perf.h
index 3ca67b2..3ca67b2 100644
--- a/nanovg/example/perf.h
+++ b/subprojects/d2tk/nanovg/example/perf.h
diff --git a/nanovg/example/screenshot-01.png b/subprojects/d2tk/nanovg/example/screenshot-01.png
index d8febe9..d8febe9 100644
--- a/nanovg/example/screenshot-01.png
+++ b/subprojects/d2tk/nanovg/example/screenshot-01.png
Binary files differ
diff --git a/nanovg/example/screenshot-02.png b/subprojects/d2tk/nanovg/example/screenshot-02.png
index 7cfa4bc..7cfa4bc 100644
--- a/nanovg/example/screenshot-02.png
+++ b/subprojects/d2tk/nanovg/example/screenshot-02.png
Binary files differ
diff --git a/nanovg/example/stb_image_write.h b/subprojects/d2tk/nanovg/example/stb_image_write.h
index 5de3159..5de3159 100644
--- a/nanovg/example/stb_image_write.h
+++ b/subprojects/d2tk/nanovg/example/stb_image_write.h
diff --git a/nanovg/obsolete/nanovg_gl2.h b/subprojects/d2tk/nanovg/obsolete/nanovg_gl2.h
index ad8883a..ad8883a 100644
--- a/nanovg/obsolete/nanovg_gl2.h
+++ b/subprojects/d2tk/nanovg/obsolete/nanovg_gl2.h
diff --git a/nanovg/obsolete/nanovg_gl3.h b/subprojects/d2tk/nanovg/obsolete/nanovg_gl3.h
index 971fb6b..971fb6b 100644
--- a/nanovg/obsolete/nanovg_gl3.h
+++ b/subprojects/d2tk/nanovg/obsolete/nanovg_gl3.h
diff --git a/nanovg/obsolete/obsolete.md b/subprojects/d2tk/nanovg/obsolete/obsolete.md
index 1dee5d1..1dee5d1 100644
--- a/nanovg/obsolete/obsolete.md
+++ b/subprojects/d2tk/nanovg/obsolete/obsolete.md
diff --git a/nanovg/premake4.lua b/subprojects/d2tk/nanovg/premake4.lua
index 0f86168..0f86168 100644
--- a/nanovg/premake4.lua
+++ b/subprojects/d2tk/nanovg/premake4.lua
diff --git a/nanovg/src/fontstash.h b/subprojects/d2tk/nanovg/src/fontstash.h
index 9df68b3..9df68b3 100644
--- a/nanovg/src/fontstash.h
+++ b/subprojects/d2tk/nanovg/src/fontstash.h
diff --git a/nanovg/src/nanovg.c b/subprojects/d2tk/nanovg/src/nanovg.c
index f642788..f642788 100644
--- a/nanovg/src/nanovg.c
+++ b/subprojects/d2tk/nanovg/src/nanovg.c
diff --git a/nanovg/src/nanovg.h b/subprojects/d2tk/nanovg/src/nanovg.h
index 8aaec30..8aaec30 100644
--- a/nanovg/src/nanovg.h
+++ b/subprojects/d2tk/nanovg/src/nanovg.h
diff --git a/nanovg/src/nanovg_gl.h b/subprojects/d2tk/nanovg/src/nanovg_gl.h
index 75d51e9..75d51e9 100644
--- a/nanovg/src/nanovg_gl.h
+++ b/subprojects/d2tk/nanovg/src/nanovg_gl.h
diff --git a/nanovg/src/nanovg_gl_utils.h b/subprojects/d2tk/nanovg/src/nanovg_gl_utils.h
index f7384d8..f7384d8 100644
--- a/nanovg/src/nanovg_gl_utils.h
+++ b/subprojects/d2tk/nanovg/src/nanovg_gl_utils.h
diff --git a/nanovg/src/stb_image.h b/subprojects/d2tk/nanovg/src/stb_image.h
index e06f7a1..e06f7a1 100644
--- a/nanovg/src/stb_image.h
+++ b/subprojects/d2tk/nanovg/src/stb_image.h
diff --git a/nanovg/src/stb_truetype.h b/subprojects/d2tk/nanovg/src/stb_truetype.h
index bfb1841..bfb1841 100644
--- a/nanovg/src/stb_truetype.h
+++ b/subprojects/d2tk/nanovg/src/stb_truetype.h
diff --git a/pugl/.clang-format b/subprojects/d2tk/pugl/.clang-format
index b788676..b788676 100644
--- a/pugl/.clang-format
+++ b/subprojects/d2tk/pugl/.clang-format
diff --git a/pugl/.clang-tidy b/subprojects/d2tk/pugl/.clang-tidy
index 055d63b..055d63b 100644
--- a/pugl/.clang-tidy
+++ b/subprojects/d2tk/pugl/.clang-tidy
diff --git a/pugl/.gitattributes b/subprojects/d2tk/pugl/.gitattributes
index 32967c1..32967c1 100644
--- a/pugl/.gitattributes
+++ b/subprojects/d2tk/pugl/.gitattributes
diff --git a/pugl/.gitignore b/subprojects/d2tk/pugl/.gitignore
index dad71c3..dad71c3 100644
--- a/pugl/.gitignore
+++ b/subprojects/d2tk/pugl/.gitignore
diff --git a/pugl/.gitlab-ci.yml b/subprojects/d2tk/pugl/.gitlab-ci.yml
index 29dc8be..29dc8be 100644
--- a/pugl/.gitlab-ci.yml
+++ b/subprojects/d2tk/pugl/.gitlab-ci.yml
diff --git a/pugl/.gitmodules b/subprojects/d2tk/pugl/.gitmodules
index cc8b569..cc8b569 100644
--- a/pugl/.gitmodules
+++ b/subprojects/d2tk/pugl/.gitmodules
diff --git a/pugl/AUTHORS b/subprojects/d2tk/pugl/AUTHORS
index 1470491..1470491 100644
--- a/pugl/AUTHORS
+++ b/subprojects/d2tk/pugl/AUTHORS
diff --git a/pugl/COPYING b/subprojects/d2tk/pugl/COPYING
index 4a287b9..4a287b9 100644
--- a/pugl/COPYING
+++ b/subprojects/d2tk/pugl/COPYING
diff --git a/pugl/README.md b/subprojects/d2tk/pugl/README.md
index ae9c420..ae9c420 100644
--- a/pugl/README.md
+++ b/subprojects/d2tk/pugl/README.md
diff --git a/pugl/doc/footer.html b/subprojects/d2tk/pugl/doc/footer.html
index 0dc6919..0dc6919 100644
--- a/pugl/doc/footer.html
+++ b/subprojects/d2tk/pugl/doc/footer.html
diff --git a/pugl/doc/header.html b/subprojects/d2tk/pugl/doc/header.html
index 54c25b0..54c25b0 100644
--- a/pugl/doc/header.html
+++ b/subprojects/d2tk/pugl/doc/header.html
diff --git a/pugl/doc/layout.xml b/subprojects/d2tk/pugl/doc/layout.xml
index 1889302..1889302 100644
--- a/pugl/doc/layout.xml
+++ b/subprojects/d2tk/pugl/doc/layout.xml
diff --git a/pugl/doc/mainpage.md b/subprojects/d2tk/pugl/doc/mainpage.md
index aa6f925..aa6f925 100644
--- a/pugl/doc/mainpage.md
+++ b/subprojects/d2tk/pugl/doc/mainpage.md
diff --git a/pugl/doc/reference.doxygen.in b/subprojects/d2tk/pugl/doc/reference.doxygen.in
index 1357fe4..1357fe4 100644
--- a/pugl/doc/reference.doxygen.in
+++ b/subprojects/d2tk/pugl/doc/reference.doxygen.in
diff --git a/pugl/doc/style.css b/subprojects/d2tk/pugl/doc/style.css
index 28f0519..28f0519 100644
--- a/pugl/doc/style.css
+++ b/subprojects/d2tk/pugl/doc/style.css
diff --git a/pugl/examples/cube_view.h b/subprojects/d2tk/pugl/examples/cube_view.h
index 9fd2349..9fd2349 100644
--- a/pugl/examples/cube_view.h
+++ b/subprojects/d2tk/pugl/examples/cube_view.h
diff --git a/pugl/examples/demo_utils.h b/subprojects/d2tk/pugl/examples/demo_utils.h
index 9a1cb7a..9a1cb7a 100644
--- a/pugl/examples/demo_utils.h
+++ b/subprojects/d2tk/pugl/examples/demo_utils.h
diff --git a/pugl/examples/glad/glad.c b/subprojects/d2tk/pugl/examples/glad/glad.c
index 38f442c..38f442c 100644
--- a/pugl/examples/glad/glad.c
+++ b/subprojects/d2tk/pugl/examples/glad/glad.c
diff --git a/pugl/examples/glad/glad.h b/subprojects/d2tk/pugl/examples/glad/glad.h
index d8068c6..d8068c6 100644
--- a/pugl/examples/glad/glad.h
+++ b/subprojects/d2tk/pugl/examples/glad/glad.h
diff --git a/pugl/examples/glad/khrplatform.h b/subprojects/d2tk/pugl/examples/glad/khrplatform.h
index 5b55ea2..5b55ea2 100644
--- a/pugl/examples/glad/khrplatform.h
+++ b/subprojects/d2tk/pugl/examples/glad/khrplatform.h
diff --git a/pugl/examples/pugl_cairo_demo.c b/subprojects/d2tk/pugl/examples/pugl_cairo_demo.c
index 483446f..483446f 100644
--- a/pugl/examples/pugl_cairo_demo.c
+++ b/subprojects/d2tk/pugl/examples/pugl_cairo_demo.c
diff --git a/pugl/examples/pugl_embed_demo.c b/subprojects/d2tk/pugl/examples/pugl_embed_demo.c
index 3a7b051..3a7b051 100644
--- a/pugl/examples/pugl_embed_demo.c
+++ b/subprojects/d2tk/pugl/examples/pugl_embed_demo.c
diff --git a/pugl/examples/pugl_gl3_demo.c b/subprojects/d2tk/pugl/examples/pugl_gl3_demo.c
index c49ed3d..c49ed3d 100644
--- a/pugl/examples/pugl_gl3_demo.c
+++ b/subprojects/d2tk/pugl/examples/pugl_gl3_demo.c
diff --git a/pugl/examples/pugl_print_events.c b/subprojects/d2tk/pugl/examples/pugl_print_events.c
index 52b58c4..52b58c4 100644
--- a/pugl/examples/pugl_print_events.c
+++ b/subprojects/d2tk/pugl/examples/pugl_print_events.c
diff --git a/pugl/examples/pugl_window_demo.c b/subprojects/d2tk/pugl/examples/pugl_window_demo.c
index 183119c..183119c 100644
--- a/pugl/examples/pugl_window_demo.c
+++ b/subprojects/d2tk/pugl/examples/pugl_window_demo.c
diff --git a/pugl/examples/shader_utils.h b/subprojects/d2tk/pugl/examples/shader_utils.h
index 834d8fc..834d8fc 100644
--- a/pugl/examples/shader_utils.h
+++ b/subprojects/d2tk/pugl/examples/shader_utils.h
diff --git a/pugl/pugl.pc.in b/subprojects/d2tk/pugl/pugl.pc.in
index 531cd54..531cd54 100644
--- a/pugl/pugl.pc.in
+++ b/subprojects/d2tk/pugl/pugl.pc.in
diff --git a/pugl/pugl/detail/implementation.c b/subprojects/d2tk/pugl/pugl/detail/implementation.c
index ee9b242..ee9b242 100644
--- a/pugl/pugl/detail/implementation.c
+++ b/subprojects/d2tk/pugl/pugl/detail/implementation.c
diff --git a/pugl/pugl/detail/implementation.h b/subprojects/d2tk/pugl/pugl/detail/implementation.h
index bcecd85..bcecd85 100644
--- a/pugl/pugl/detail/implementation.h
+++ b/subprojects/d2tk/pugl/pugl/detail/implementation.h
diff --git a/pugl/pugl/detail/mac.h b/subprojects/d2tk/pugl/pugl/detail/mac.h
index 2243337..2243337 100644
--- a/pugl/pugl/detail/mac.h
+++ b/subprojects/d2tk/pugl/pugl/detail/mac.h
diff --git a/pugl/pugl/detail/mac.m b/subprojects/d2tk/pugl/pugl/detail/mac.m
index 501be02..501be02 100644
--- a/pugl/pugl/detail/mac.m
+++ b/subprojects/d2tk/pugl/pugl/detail/mac.m
diff --git a/pugl/pugl/detail/mac_cairo.m b/subprojects/d2tk/pugl/pugl/detail/mac_cairo.m
index 51c1c13..51c1c13 100644
--- a/pugl/pugl/detail/mac_cairo.m
+++ b/subprojects/d2tk/pugl/pugl/detail/mac_cairo.m
diff --git a/pugl/pugl/detail/mac_gl.m b/subprojects/d2tk/pugl/pugl/detail/mac_gl.m
index eda4371..eda4371 100644
--- a/pugl/pugl/detail/mac_gl.m
+++ b/subprojects/d2tk/pugl/pugl/detail/mac_gl.m
diff --git a/pugl/pugl/detail/mac_stub.m b/subprojects/d2tk/pugl/pugl/detail/mac_stub.m
index 71a54b8..71a54b8 100644
--- a/pugl/pugl/detail/mac_stub.m
+++ b/subprojects/d2tk/pugl/pugl/detail/mac_stub.m
diff --git a/pugl/pugl/detail/types.h b/subprojects/d2tk/pugl/pugl/detail/types.h
index eb450e1..eb450e1 100644
--- a/pugl/pugl/detail/types.h
+++ b/subprojects/d2tk/pugl/pugl/detail/types.h
diff --git a/pugl/pugl/detail/win.c b/subprojects/d2tk/pugl/pugl/detail/win.c
index 44ba6cd..44ba6cd 100644
--- a/pugl/pugl/detail/win.c
+++ b/subprojects/d2tk/pugl/pugl/detail/win.c
diff --git a/pugl/pugl/detail/win.h b/subprojects/d2tk/pugl/pugl/detail/win.h
index 949fa90..949fa90 100644
--- a/pugl/pugl/detail/win.h
+++ b/subprojects/d2tk/pugl/pugl/detail/win.h
diff --git a/pugl/pugl/detail/win_cairo.c b/subprojects/d2tk/pugl/pugl/detail/win_cairo.c
index a8b371f..a8b371f 100644
--- a/pugl/pugl/detail/win_cairo.c
+++ b/subprojects/d2tk/pugl/pugl/detail/win_cairo.c
diff --git a/pugl/pugl/detail/win_gl.c b/subprojects/d2tk/pugl/pugl/detail/win_gl.c
index f5acfd6..f5acfd6 100644
--- a/pugl/pugl/detail/win_gl.c
+++ b/subprojects/d2tk/pugl/pugl/detail/win_gl.c
diff --git a/pugl/pugl/detail/x11.c b/subprojects/d2tk/pugl/pugl/detail/x11.c
index e3fb264..e3fb264 100644
--- a/pugl/pugl/detail/x11.c
+++ b/subprojects/d2tk/pugl/pugl/detail/x11.c
diff --git a/pugl/pugl/detail/x11.h b/subprojects/d2tk/pugl/pugl/detail/x11.h
index 6b7a150..6b7a150 100644
--- a/pugl/pugl/detail/x11.h
+++ b/subprojects/d2tk/pugl/pugl/detail/x11.h
diff --git a/pugl/pugl/detail/x11_cairo.c b/subprojects/d2tk/pugl/pugl/detail/x11_cairo.c
index 0229d97..0229d97 100644
--- a/pugl/pugl/detail/x11_cairo.c
+++ b/subprojects/d2tk/pugl/pugl/detail/x11_cairo.c
diff --git a/pugl/pugl/detail/x11_gl.c b/subprojects/d2tk/pugl/pugl/detail/x11_gl.c
index 33a05df..33a05df 100644
--- a/pugl/pugl/detail/x11_gl.c
+++ b/subprojects/d2tk/pugl/pugl/detail/x11_gl.c
diff --git a/pugl/pugl/gl.h b/subprojects/d2tk/pugl/pugl/gl.h
index 55a55c4..55a55c4 100644
--- a/pugl/pugl/gl.h
+++ b/subprojects/d2tk/pugl/pugl/gl.h
diff --git a/pugl/pugl/glu.h b/subprojects/d2tk/pugl/pugl/glu.h
index 0ade70c..0ade70c 100644
--- a/pugl/pugl/glu.h
+++ b/subprojects/d2tk/pugl/pugl/glu.h
diff --git a/pugl/pugl/pugl.h b/subprojects/d2tk/pugl/pugl/pugl.h
index 57e23fa..57e23fa 100644
--- a/pugl/pugl/pugl.h
+++ b/subprojects/d2tk/pugl/pugl/pugl.h
diff --git a/pugl/pugl/pugl.hpp b/subprojects/d2tk/pugl/pugl/pugl.hpp
index 73cfe2a..73cfe2a 100644
--- a/pugl/pugl/pugl.hpp
+++ b/subprojects/d2tk/pugl/pugl/pugl.hpp
diff --git a/pugl/pugl/pugl_cairo.h b/subprojects/d2tk/pugl/pugl/pugl_cairo.h
index e71072e..e71072e 100644
--- a/pugl/pugl/pugl_cairo.h
+++ b/subprojects/d2tk/pugl/pugl/pugl_cairo.h
diff --git a/pugl/pugl/pugl_cairo_backend.h b/subprojects/d2tk/pugl/pugl/pugl_cairo_backend.h
index 3f8cec3..3f8cec3 100644
--- a/pugl/pugl/pugl_cairo_backend.h
+++ b/subprojects/d2tk/pugl/pugl/pugl_cairo_backend.h
diff --git a/pugl/pugl/pugl_gl.h b/subprojects/d2tk/pugl/pugl/pugl_gl.h
index 9c5fa94..9c5fa94 100644
--- a/pugl/pugl/pugl_gl.h
+++ b/subprojects/d2tk/pugl/pugl/pugl_gl.h
diff --git a/pugl/pugl/pugl_gl_backend.h b/subprojects/d2tk/pugl/pugl/pugl_gl_backend.h
index e1b9a15..e1b9a15 100644
--- a/pugl/pugl/pugl_gl_backend.h
+++ b/subprojects/d2tk/pugl/pugl/pugl_gl_backend.h
diff --git a/pugl/pugl/pugl_stub.h b/subprojects/d2tk/pugl/pugl/pugl_stub.h
index da918aa..da918aa 100644
--- a/pugl/pugl/pugl_stub.h
+++ b/subprojects/d2tk/pugl/pugl/pugl_stub.h
diff --git a/pugl/pugl/pugl_stub_backend.h b/subprojects/d2tk/pugl/pugl/pugl_stub_backend.h
index e5aa513..e5aa513 100644
--- a/pugl/pugl/pugl_stub_backend.h
+++ b/subprojects/d2tk/pugl/pugl/pugl_stub_backend.h
diff --git a/pugl/resources/Info.plist.in b/subprojects/d2tk/pugl/resources/Info.plist.in
index a08dbd0..a08dbd0 100644
--- a/pugl/resources/Info.plist.in
+++ b/subprojects/d2tk/pugl/resources/Info.plist.in
diff --git a/pugl/resources/pugl.ipe b/subprojects/d2tk/pugl/resources/pugl.ipe
index 238c09c..238c09c 100644
--- a/pugl/resources/pugl.ipe
+++ b/subprojects/d2tk/pugl/resources/pugl.ipe
diff --git a/pugl/resources/pugl.png b/subprojects/d2tk/pugl/resources/pugl.png
index 4641660..4641660 100644
--- a/pugl/resources/pugl.png
+++ b/subprojects/d2tk/pugl/resources/pugl.png
Binary files differ
diff --git a/pugl/resources/pugl.svg b/subprojects/d2tk/pugl/resources/pugl.svg
index 5bb5335..5bb5335 100644
--- a/pugl/resources/pugl.svg
+++ b/subprojects/d2tk/pugl/resources/pugl.svg
diff --git a/pugl/shaders/rect.frag b/subprojects/d2tk/pugl/shaders/rect.frag
index 5e3af9d..5e3af9d 100644
--- a/pugl/shaders/rect.frag
+++ b/subprojects/d2tk/pugl/shaders/rect.frag
diff --git a/pugl/shaders/rect.vert b/subprojects/d2tk/pugl/shaders/rect.vert
index bf2e951..bf2e951 100644
--- a/pugl/shaders/rect.vert
+++ b/subprojects/d2tk/pugl/shaders/rect.vert
diff --git a/pugl/test/test_redisplay.c b/subprojects/d2tk/pugl/test/test_redisplay.c
index 75006cb..75006cb 100644
--- a/pugl/test/test_redisplay.c
+++ b/subprojects/d2tk/pugl/test/test_redisplay.c
diff --git a/pugl/test/test_show_hide.c b/subprojects/d2tk/pugl/test/test_show_hide.c
index cc2c972..cc2c972 100644
--- a/pugl/test/test_show_hide.c
+++ b/subprojects/d2tk/pugl/test/test_show_hide.c
diff --git a/pugl/test/test_timer.c b/subprojects/d2tk/pugl/test/test_timer.c
index 58d0652..58d0652 100644
--- a/pugl/test/test_timer.c
+++ b/subprojects/d2tk/pugl/test/test_timer.c
diff --git a/pugl/test/test_update.c b/subprojects/d2tk/pugl/test/test_update.c
index 081fb9b..081fb9b 100644
--- a/pugl/test/test_update.c
+++ b/subprojects/d2tk/pugl/test/test_update.c
diff --git a/pugl/test/test_utils.h b/subprojects/d2tk/pugl/test/test_utils.h
index 7d33601..7d33601 100644
--- a/pugl/test/test_utils.h
+++ b/subprojects/d2tk/pugl/test/test_utils.h
diff --git a/pugl/waf b/subprojects/d2tk/pugl/waf
index 58d14c3..58d14c3 100755
--- a/pugl/waf
+++ b/subprojects/d2tk/pugl/waf
diff --git a/pugl/wscript b/subprojects/d2tk/pugl/wscript
index 2fc48de..2fc48de 100644
--- a/pugl/wscript
+++ b/subprojects/d2tk/pugl/wscript
diff --git a/screenshots/screenshot_1.png b/subprojects/d2tk/screenshots/screenshot_1.png
index 461d52a..461d52a 100644
--- a/screenshots/screenshot_1.png
+++ b/subprojects/d2tk/screenshots/screenshot_1.png
Binary files differ
diff --git a/screenshots/screenshot_2.png b/subprojects/d2tk/screenshots/screenshot_2.png
index 5b40bb8..5b40bb8 100644
--- a/screenshots/screenshot_2.png
+++ b/subprojects/d2tk/screenshots/screenshot_2.png
Binary files differ
diff --git a/screenshots/screenshot_3.png b/subprojects/d2tk/screenshots/screenshot_3.png
index 13b9843..13b9843 100644
--- a/screenshots/screenshot_3.png
+++ b/subprojects/d2tk/screenshots/screenshot_3.png
Binary files differ
diff --git a/screenshots/screenshot_4.png b/subprojects/d2tk/screenshots/screenshot_4.png
index 8cd8329..8cd8329 100644
--- a/screenshots/screenshot_4.png
+++ b/subprojects/d2tk/screenshots/screenshot_4.png
Binary files differ
diff --git a/screenshots/screenshot_5.png b/subprojects/d2tk/screenshots/screenshot_5.png
index 202ab61..202ab61 100644
--- a/screenshots/screenshot_5.png
+++ b/subprojects/d2tk/screenshots/screenshot_5.png
Binary files differ
diff --git a/screenshots/screenshot_6.png b/subprojects/d2tk/screenshots/screenshot_6.png
index 10e5235..10e5235 100644
--- a/screenshots/screenshot_6.png
+++ b/subprojects/d2tk/screenshots/screenshot_6.png
Binary files differ
diff --git a/screenshots/screenshot_7.png b/subprojects/d2tk/screenshots/screenshot_7.png
index 4850e2c..4850e2c 100644
--- a/screenshots/screenshot_7.png
+++ b/subprojects/d2tk/screenshots/screenshot_7.png
Binary files differ
diff --git a/screenshots/screenshot_8.png b/subprojects/d2tk/screenshots/screenshot_8.png
index d474786..d474786 100644
--- a/screenshots/screenshot_8.png
+++ b/subprojects/d2tk/screenshots/screenshot_8.png
Binary files differ
diff --git a/src/backend_cairo.c b/subprojects/d2tk/src/backend_cairo.c
index 268f2f2..268f2f2 100644
--- a/src/backend_cairo.c
+++ b/subprojects/d2tk/src/backend_cairo.c
diff --git a/src/backend_nanovg.c b/subprojects/d2tk/src/backend_nanovg.c
index e74b33d..e74b33d 100644
--- a/src/backend_nanovg.c
+++ b/subprojects/d2tk/src/backend_nanovg.c
diff --git a/src/base.c b/subprojects/d2tk/src/base.c
index 3ee2586..3ee2586 100644
--- a/src/base.c
+++ b/subprojects/d2tk/src/base.c
diff --git a/src/base_bar.c b/subprojects/d2tk/src/base_bar.c
index d72d341..d72d341 100644
--- a/src/base_bar.c
+++ b/subprojects/d2tk/src/base_bar.c
diff --git a/src/base_bitmap.c b/subprojects/d2tk/src/base_bitmap.c
index a542169..a542169 100644
--- a/src/base_bitmap.c
+++ b/subprojects/d2tk/src/base_bitmap.c
diff --git a/src/base_button.c b/subprojects/d2tk/src/base_button.c
index 244e7d1..244e7d1 100644
--- a/src/base_button.c
+++ b/subprojects/d2tk/src/base_button.c
diff --git a/src/base_combo.c b/subprojects/d2tk/src/base_combo.c
index 3ab073c..3ab073c 100644
--- a/src/base_combo.c
+++ b/subprojects/d2tk/src/base_combo.c
diff --git a/src/base_cursor.c b/subprojects/d2tk/src/base_cursor.c
index e9be4ed..e9be4ed 100644
--- a/src/base_cursor.c
+++ b/subprojects/d2tk/src/base_cursor.c
diff --git a/src/base_custom.c b/subprojects/d2tk/src/base_custom.c
index c001e5a..c001e5a 100644
--- a/src/base_custom.c
+++ b/subprojects/d2tk/src/base_custom.c
diff --git a/src/base_dial.c b/subprojects/d2tk/src/base_dial.c
index 989ce36..989ce36 100644
--- a/src/base_dial.c
+++ b/subprojects/d2tk/src/base_dial.c
diff --git a/src/base_flowmatrix.c b/subprojects/d2tk/src/base_flowmatrix.c
index 0edc1c5..0edc1c5 100644
--- a/src/base_flowmatrix.c
+++ b/subprojects/d2tk/src/base_flowmatrix.c
diff --git a/src/base_frame.c b/subprojects/d2tk/src/base_frame.c
index d78bdf0..d78bdf0 100644
--- a/src/base_frame.c
+++ b/subprojects/d2tk/src/base_frame.c
diff --git a/src/base_image.c b/subprojects/d2tk/src/base_image.c
index cfed2d1..cfed2d1 100644
--- a/src/base_image.c
+++ b/subprojects/d2tk/src/base_image.c
diff --git a/src/base_internal.h b/subprojects/d2tk/src/base_internal.h
index e17b5a4..e17b5a4 100644
--- a/src/base_internal.h
+++ b/subprojects/d2tk/src/base_internal.h
diff --git a/src/base_label.c b/subprojects/d2tk/src/base_label.c
index 64cbd4b..64cbd4b 100644
--- a/src/base_label.c
+++ b/subprojects/d2tk/src/base_label.c
diff --git a/src/base_layout.c b/subprojects/d2tk/src/base_layout.c
index 770e5df..770e5df 100644
--- a/src/base_layout.c
+++ b/subprojects/d2tk/src/base_layout.c
diff --git a/src/base_link.c b/subprojects/d2tk/src/base_link.c
index 355d394..355d394 100644
--- a/src/base_link.c
+++ b/subprojects/d2tk/src/base_link.c
diff --git a/src/base_meter.c b/subprojects/d2tk/src/base_meter.c
index 6d8d080..6d8d080 100644
--- a/src/base_meter.c
+++ b/subprojects/d2tk/src/base_meter.c
diff --git a/src/base_pane.c b/subprojects/d2tk/src/base_pane.c
index 07b6b5d..07b6b5d 100644
--- a/src/base_pane.c
+++ b/subprojects/d2tk/src/base_pane.c
diff --git a/src/base_pty.c b/subprojects/d2tk/src/base_pty.c
index 246b206..246b206 100644
--- a/src/base_pty.c
+++ b/subprojects/d2tk/src/base_pty.c
diff --git a/src/base_scrollbar.c b/subprojects/d2tk/src/base_scrollbar.c
index c98b038..c98b038 100644
--- a/src/base_scrollbar.c
+++ b/subprojects/d2tk/src/base_scrollbar.c
diff --git a/src/base_spinner.c b/subprojects/d2tk/src/base_spinner.c
index 12c970a..12c970a 100644
--- a/src/base_spinner.c
+++ b/subprojects/d2tk/src/base_spinner.c
diff --git a/src/base_table.c b/subprojects/d2tk/src/base_table.c
index eefa6e1..eefa6e1 100644
--- a/src/base_table.c
+++ b/subprojects/d2tk/src/base_table.c
diff --git a/src/base_textfield.c b/subprojects/d2tk/src/base_textfield.c
index 9d0fbc1..9d0fbc1 100644
--- a/src/base_textfield.c
+++ b/subprojects/d2tk/src/base_textfield.c
diff --git a/src/base_vkb.c b/subprojects/d2tk/src/base_vkb.c
index 6d6ebe1..6d6ebe1 100644
--- a/src/base_vkb.c
+++ b/subprojects/d2tk/src/base_vkb.c
diff --git a/src/core.c b/subprojects/d2tk/src/core.c
index 6f111e7..6f111e7 100644
--- a/src/core.c
+++ b/subprojects/d2tk/src/core.c
diff --git a/src/core_internal.h b/subprojects/d2tk/src/core_internal.h
index 37fbf35..37fbf35 100644
--- a/src/core_internal.h
+++ b/subprojects/d2tk/src/core_internal.h
diff --git a/src/frontend_fbdev.c b/subprojects/d2tk/src/frontend_fbdev.c
index 9bcdf23..9bcdf23 100644
--- a/src/frontend_fbdev.c
+++ b/subprojects/d2tk/src/frontend_fbdev.c
diff --git a/src/frontend_pugl.c b/subprojects/d2tk/src/frontend_pugl.c
index b607a6e..b607a6e 100644
--- a/src/frontend_pugl.c
+++ b/subprojects/d2tk/src/frontend_pugl.c
diff --git a/src/hash.c b/subprojects/d2tk/src/hash.c
index f02b7f2..f02b7f2 100644
--- a/src/hash.c
+++ b/subprojects/d2tk/src/hash.c
diff --git a/src/mum.h b/subprojects/d2tk/src/mum.h
index e42e2d7..e42e2d7 100644
--- a/src/mum.h
+++ b/subprojects/d2tk/src/mum.h
diff --git a/test/base.c b/subprojects/d2tk/test/base.c
index 4826216..4826216 100644
--- a/test/base.c
+++ b/subprojects/d2tk/test/base.c
diff --git a/test/core.c b/subprojects/d2tk/test/core.c
index a7dc40b..a7dc40b 100644
--- a/test/core.c
+++ b/subprojects/d2tk/test/core.c
diff --git a/test/mock.c b/subprojects/d2tk/test/mock.c
index 5986109..5986109 100644
--- a/test/mock.c
+++ b/subprojects/d2tk/test/mock.c
diff --git a/test/mock.h b/subprojects/d2tk/test/mock.h
index 8b18ddb..8b18ddb 100644
--- a/test/mock.h
+++ b/subprojects/d2tk/test/mock.h
diff --git a/ttf/FiraCode-Bold.ttf b/subprojects/d2tk/ttf/FiraCode-Bold.ttf
index 5030383..5030383 100644
--- a/ttf/FiraCode-Bold.ttf
+++ b/subprojects/d2tk/ttf/FiraCode-Bold.ttf
Binary files differ
diff --git a/ttf/FiraCode-Light.ttf b/subprojects/d2tk/ttf/FiraCode-Light.ttf
index 95913af..95913af 100644
--- a/ttf/FiraCode-Light.ttf
+++ b/subprojects/d2tk/ttf/FiraCode-Light.ttf
Binary files differ
diff --git a/ttf/FiraCode-Medium.ttf b/subprojects/d2tk/ttf/FiraCode-Medium.ttf
index eca9e18..eca9e18 100644
--- a/ttf/FiraCode-Medium.ttf
+++ b/subprojects/d2tk/ttf/FiraCode-Medium.ttf
Binary files differ
diff --git a/ttf/FiraCode-Regular.ttf b/subprojects/d2tk/ttf/FiraCode-Regular.ttf
index 97c1159..97c1159 100644
--- a/ttf/FiraCode-Regular.ttf
+++ b/subprojects/d2tk/ttf/FiraCode-Regular.ttf
Binary files differ
diff --git a/subprojects/d2tk/ttf/FiraSans-Bold.ttf b/subprojects/d2tk/ttf/FiraSans-Bold.ttf
new file mode 100644
index 0000000..f03425a
--- /dev/null
+++ b/subprojects/d2tk/ttf/FiraSans-Bold.ttf
Binary files differ
diff --git a/ttf/LICENSE b/subprojects/d2tk/ttf/LICENSE
index 805e0b3..805e0b3 100644
--- a/ttf/LICENSE
+++ b/subprojects/d2tk/ttf/LICENSE
diff --git a/utf8.h/.clang-format b/subprojects/d2tk/utf8.h/.clang-format
index be1e9c4..be1e9c4 100644
--- a/utf8.h/.clang-format
+++ b/subprojects/d2tk/utf8.h/.clang-format
diff --git a/utf8.h/.gitignore b/subprojects/d2tk/utf8.h/.gitignore
index 378eac2..378eac2 100644
--- a/utf8.h/.gitignore
+++ b/subprojects/d2tk/utf8.h/.gitignore
diff --git a/utf8.h/.travis.yml b/subprojects/d2tk/utf8.h/.travis.yml
index b6711ea..b6711ea 100644
--- a/utf8.h/.travis.yml
+++ b/subprojects/d2tk/utf8.h/.travis.yml
diff --git a/utf8.h/LICENSE b/subprojects/d2tk/utf8.h/LICENSE
index 68a49da..68a49da 100644
--- a/utf8.h/LICENSE
+++ b/subprojects/d2tk/utf8.h/LICENSE
diff --git a/utf8.h/README.md b/subprojects/d2tk/utf8.h/README.md
index 80e806b..80e806b 100644
--- a/utf8.h/README.md
+++ b/subprojects/d2tk/utf8.h/README.md
diff --git a/utf8.h/appveyor.yml b/subprojects/d2tk/utf8.h/appveyor.yml
index 8458679..8458679 100644
--- a/utf8.h/appveyor.yml
+++ b/subprojects/d2tk/utf8.h/appveyor.yml
diff --git a/utf8.h/test/CMakeLists.txt b/subprojects/d2tk/utf8.h/test/CMakeLists.txt
index b00114b..b00114b 100644
--- a/utf8.h/test/CMakeLists.txt
+++ b/subprojects/d2tk/utf8.h/test/CMakeLists.txt
diff --git a/utf8.h/test/main.c b/subprojects/d2tk/utf8.h/test/main.c
index bc28b3c..bc28b3c 100644
--- a/utf8.h/test/main.c
+++ b/subprojects/d2tk/utf8.h/test/main.c
diff --git a/utf8.h/test/test.c b/subprojects/d2tk/utf8.h/test/test.c
index f8cd1d6..f8cd1d6 100644
--- a/utf8.h/test/test.c
+++ b/subprojects/d2tk/utf8.h/test/test.c
diff --git a/utf8.h/test/test.cpp b/subprojects/d2tk/utf8.h/test/test.cpp
index f8cd1d6..f8cd1d6 100644
--- a/utf8.h/test/test.cpp
+++ b/subprojects/d2tk/utf8.h/test/test.cpp
diff --git a/utf8.h/test/utest.h b/subprojects/d2tk/utf8.h/test/utest.h
index 2a58af6..2a58af6 100644
--- a/utf8.h/test/utest.h
+++ b/subprojects/d2tk/utf8.h/test/utest.h
diff --git a/utf8.h/utf8.h b/subprojects/d2tk/utf8.h/utf8.h
index f4c62a0..f4c62a0 100644
--- a/utf8.h/utf8.h
+++ b/subprojects/d2tk/utf8.h/utf8.h