├── .github └── workflows │ ├── ci.yml │ ├── linux.yml │ ├── linux_arch.yml │ ├── linux_arm.yml │ ├── linux_redhat.yml │ ├── macos.yml │ ├── windows.yml │ └── zig.yml ├── .gitignore ├── CMakeLists.txt ├── GNUmakefile ├── LICENSE ├── Makefile ├── README.md ├── bridge ├── .gitignore ├── README.md ├── build.bat ├── build.sh ├── js2c.js ├── utils.ts ├── webui.ts └── webui_bridge.h ├── build.zig ├── build.zig.zon ├── conanfile.py ├── examples ├── C++ │ ├── README.md │ ├── call_cpp_from_js │ │ ├── GNUmakefile │ │ ├── Makefile │ │ └── main.cpp │ ├── call_js_from_cpp │ │ ├── GNUmakefile │ │ ├── Makefile │ │ └── main.cpp │ ├── minimal │ │ ├── GNUmakefile │ │ ├── Makefile │ │ └── main.cpp │ └── serve_a_folder │ │ ├── GNUmakefile │ │ ├── Makefile │ │ ├── index.html │ │ ├── main.cpp │ │ └── second.html └── C │ ├── README.md │ ├── call_c_from_js │ ├── GNUmakefile │ ├── Makefile │ └── main.c │ ├── call_js_from_c │ ├── GNUmakefile │ ├── Makefile │ └── main.c │ ├── chatgpt_api │ ├── GNUmakefile │ ├── Makefile │ └── main.c │ ├── custom_web_server │ ├── GNUmakefile │ ├── Makefile │ ├── index.html │ ├── main.c │ ├── second.html │ └── simple_web_server.py │ ├── frameless │ ├── GNUmakefile │ ├── Makefile │ ├── main.c │ └── webui_frameless.png │ ├── minimal │ ├── GNUmakefile │ ├── Makefile │ └── main.c │ ├── public_network_access │ ├── GNUmakefile │ ├── Makefile │ └── main.c │ ├── react │ ├── GNUmakefile │ ├── Makefile │ ├── README.md │ ├── build_react.bat │ ├── build_react.sh │ ├── main.c │ ├── vfs.h │ ├── vfs.py │ ├── webui-react-example │ │ ├── .gitignore │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── logo192.png │ │ │ ├── logo512.png │ │ │ ├── manifest.json │ │ │ └── robots.txt │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── App.test.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── logo.svg │ │ │ ├── reportWebVitals.js │ │ │ └── setupTests.js │ └── webui_react.png │ ├── serve_a_folder │ ├── GNUmakefile │ ├── Makefile │ ├── bun_test.ts │ ├── deno_test.ts │ ├── index.html │ ├── main.c │ ├── node_test.js │ └── second.html │ ├── text-editor │ ├── GNUmakefile │ ├── Makefile │ ├── README.md │ ├── main.c │ └── ui │ │ ├── css │ │ ├── all.min.css │ │ ├── codemirror.min.css │ │ ├── lucario.css │ │ └── style.css │ │ ├── img │ │ └── icon.png │ │ ├── index.html │ │ ├── js │ │ ├── clike.min.js │ │ ├── codemirror.min.js │ │ ├── css.min.js │ │ ├── javascript.min.js │ │ ├── python.min.js │ │ ├── ui.js │ │ └── xml.min.js │ │ └── webfonts │ │ ├── fa-brands-400.eot │ │ ├── fa-brands-400.svg │ │ ├── fa-brands-400.ttf │ │ ├── fa-brands-400.woff │ │ ├── fa-brands-400.woff2 │ │ ├── fa-regular-400.eot │ │ ├── fa-regular-400.svg │ │ ├── fa-regular-400.ttf │ │ ├── fa-regular-400.woff │ │ ├── fa-regular-400.woff2 │ │ ├── fa-solid-900.eot │ │ ├── fa-solid-900.svg │ │ ├── fa-solid-900.ttf │ │ ├── fa-solid-900.woff │ │ └── fa-solid-900.woff2 │ ├── virtual_file_system │ ├── GNUmakefile │ ├── Makefile │ ├── main.c │ ├── ui │ │ ├── index.html │ │ ├── sub │ │ │ └── index.html │ │ └── svg │ │ │ └── webui.svg │ ├── vfs.h │ └── vfs.py │ └── web_app_multi_client │ ├── GNUmakefile │ ├── Makefile │ ├── index.html │ └── main.c ├── include ├── webui.h └── webui.hpp ├── src ├── civetweb │ ├── CMakeLists.txt │ ├── README.md │ ├── civetweb.c │ ├── civetweb.h │ ├── handle_form.inl │ ├── match.inl │ ├── md5.inl │ ├── response.inl │ ├── sha1.inl │ └── sort.inl ├── webui.c └── webview │ ├── EventToken.h │ ├── README.md │ ├── WebView2.h │ └── wkwebview.m └── vcpkg.json /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # https://webui.me 2 | # https://github.com/webui-dev/webui 3 | # Copyright (c) 2020-2025 Hassan Draga. 4 | # Licensed under MIT License. 5 | # All rights reserved. 6 | # Canada. 7 | # 8 | # Special Thanks to Turiiya (https://github.com/ttytm) 9 | 10 | name: CI 11 | on: 12 | push: 13 | paths-ignore: ['**/*.md'] 14 | pull_request: 15 | branches: [main] 16 | paths-ignore: ['**/*.md'] 17 | 18 | concurrency: 19 | group: ${{ github.workflow }}-${{ github.ref_name == 'main' && github.sha || github.ref }} 20 | cancel-in-progress: true 21 | 22 | jobs: 23 | windows: 24 | uses: ./.github/workflows/windows.yml 25 | permissions: 26 | contents: write 27 | 28 | macos: 29 | uses: ./.github/workflows/macos.yml 30 | permissions: 31 | contents: write 32 | 33 | linux: 34 | uses: ./.github/workflows/linux.yml 35 | permissions: 36 | contents: write 37 | 38 | linux_arm: 39 | uses: ./.github/workflows/linux_arm.yml 40 | permissions: 41 | contents: write 42 | 43 | linux_redhat: 44 | uses: ./.github/workflows/linux_redhat.yml 45 | permissions: 46 | contents: write 47 | 48 | linux_arch: 49 | uses: ./.github/workflows/linux_arch.yml 50 | permissions: 51 | contents: write 52 | 53 | zig: 54 | uses: ./.github/workflows/zig.yml 55 | -------------------------------------------------------------------------------- /.github/workflows/linux_arch.yml: -------------------------------------------------------------------------------- 1 | # https://webui.me 2 | # https://github.com/webui-dev/webui 3 | # Copyright (c) 2020-2025 Hassan Draga. 4 | # Licensed under MIT License. 5 | # All rights reserved. 6 | # Canada. 7 | 8 | name: Linux-Arch 9 | on: 10 | workflow_call: 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | strategy: 16 | matrix: 17 | include: 18 | - cc: gcc 19 | arch: x64 20 | - cc: clang 21 | arch: x64 22 | fail-fast: false 23 | env: 24 | ARTIFACT: webui-linux-arch-${{ matrix.cc }}-${{ matrix.arch }} 25 | CC: ${{ matrix.cc }} 26 | steps: 27 | - name: Check out the repository 28 | uses: actions/checkout@v4 29 | 30 | - name: Set up Docker Buildx 31 | uses: docker/setup-buildx-action@v2 32 | 33 | - name: Build Arch Linux Docker Image 34 | run: | 35 | docker build -t archlinux:latest - < 77 | github.repository_owner == 'webui-dev' 78 | && (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push')) 79 | run: | 80 | zip -r "$ARTIFACT.zip" "$ARTIFACT" 81 | if [ $GITHUB_REF_TYPE == tag ]; then 82 | echo "TAG=$GITHUB_REF_NAME" >> $GITHUB_ENV 83 | else 84 | { 85 | echo "IS_PRERELEASE=true"; 86 | echo "TAG=nightly"; 87 | echo "TITLE=WebUI Nightly Build $(date -u +'%Y-%m-%d %H:%M:%S UTC')" 88 | echo "BODY=Generated from commit $GITHUB_SHA." 89 | } >> $GITHUB_ENV 90 | fi 91 | 92 | - name: Update Nightly Tag 93 | if: env.IS_PRERELEASE 94 | uses: richardsimko/update-tag@v1 95 | env: 96 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 97 | with: 98 | tag_name: nightly 99 | 100 | - name: Release 101 | if: > 102 | github.repository_owner == 'webui-dev' 103 | && (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push')) 104 | uses: ncipollo/release-action@v1 105 | with: 106 | artifacts: ${{ env.ARTIFACT }}.zip 107 | tag: ${{ env.TAG }} 108 | body: ${{ env.BODY }} 109 | name: ${{ env.TITLE }} 110 | prerelease: ${{ env.IS_PRERELEASE }} 111 | allowUpdates: true 112 | -------------------------------------------------------------------------------- /.github/workflows/linux_redhat.yml: -------------------------------------------------------------------------------- 1 | # https://webui.me 2 | # https://github.com/webui-dev/webui 3 | # Copyright (c) 2020-2025 Hassan Draga. 4 | # Licensed under MIT License. 5 | # All rights reserved. 6 | # Canada. 7 | 8 | name: Linux-RedHat 9 | on: 10 | workflow_call: 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | strategy: 16 | matrix: 17 | include: 18 | - cc: gcc 19 | arch: x64 20 | - cc: clang 21 | arch: x64 22 | fail-fast: false 23 | env: 24 | ARTIFACT: webui-linux-redhat-${{ matrix.cc }}-${{ matrix.arch }} 25 | CC: ${{ matrix.cc }} 26 | steps: 27 | - name: Check out the repository 28 | uses: actions/checkout@v4 29 | 30 | - name: Set up Docker Buildx 31 | uses: docker/setup-buildx-action@v2 32 | 33 | - name: Build RedHat Docker Image 34 | run: | 35 | docker build -t redhat:latest - < 79 | github.repository_owner == 'webui-dev' 80 | && (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push')) 81 | run: | 82 | zip -r "$ARTIFACT.zip" "$ARTIFACT" 83 | if [ $GITHUB_REF_TYPE == tag ]; then 84 | echo "TAG=$GITHUB_REF_NAME" >> $GITHUB_ENV 85 | else 86 | { 87 | echo "IS_PRERELEASE=true"; 88 | echo "TAG=nightly"; 89 | echo "TITLE=WebUI Nightly Build $(date -u +'%Y-%m-%d %H:%M:%S UTC')" 90 | echo "BODY=Generated from commit $GITHUB_SHA." 91 | } >> $GITHUB_ENV 92 | fi 93 | 94 | - name: Update Nightly Tag 95 | if: env.IS_PRERELEASE 96 | uses: richardsimko/update-tag@v1 97 | env: 98 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 99 | with: 100 | tag_name: nightly 101 | 102 | - name: Release 103 | if: > 104 | github.repository_owner == 'webui-dev' 105 | && (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push')) 106 | uses: ncipollo/release-action@v1 107 | with: 108 | artifacts: ${{ env.ARTIFACT }}.zip 109 | tag: ${{ env.TAG }} 110 | body: ${{ env.BODY }} 111 | name: ${{ env.TITLE }} 112 | prerelease: ${{ env.IS_PRERELEASE }} 113 | allowUpdates: true 114 | -------------------------------------------------------------------------------- /.github/workflows/zig.yml: -------------------------------------------------------------------------------- 1 | name: Zig Build 2 | 3 | on: 4 | workflow_call: 5 | 6 | jobs: 7 | build: 8 | strategy: 9 | matrix: 10 | os: [ubuntu-latest, macos-latest, windows-latest] 11 | version: [0.14.0, ''] 12 | fail-fast: false 13 | runs-on: ${{ matrix.os }} 14 | steps: 15 | - uses: maxim-lobanov/setup-xcode@v1 16 | if: runner.os == 'macOS' 17 | with: 18 | xcode-version: latest-stable 19 | - uses: actions/checkout@v4 20 | - name: Setup Zig 21 | uses: goto-bus-stop/setup-zig@v2 22 | with: 23 | version: ${{ matrix.version }} 24 | - name: Build static library 25 | run: zig build -Dverbose=debug 26 | - name: Build dynamic library 27 | if: ${{ !cancelled() }} 28 | run: zig build -Ddynamic -Dverbose=debug 29 | - name: Build static library with TLS support 30 | if: runner.os == 'Linux' 31 | run: zig build -Denable-tls -Dverbose=debug 32 | - name: Build dynamic library with TLS support 33 | if: runner.os == 'Linux' 34 | run: zig build -Ddynamic -Denable-tls -Dverbose=debug 35 | - name: Build examples 36 | run: zig build examples 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Build 2 | build/ 3 | *.exe 4 | *.ilk 5 | *.pdb 6 | *.exp 7 | *.res 8 | *.out 9 | *.def 10 | 11 | # All sub-level build binaries 12 | */**/* 13 | !*/**/*/ 14 | !*/**/*.* 15 | !*makefile 16 | !Makefile 17 | */**/*.exe 18 | 19 | # Compiled Object files 20 | *.slo 21 | *.lo 22 | *.o 23 | *.obj 24 | 25 | # Shared objects (inc. Windows DLLs) 26 | *.dll 27 | *.so 28 | *.so.* 29 | *.dylib 30 | 31 | # Compiled Static libraries 32 | *.lai 33 | *.la 34 | *.a 35 | *.lib 36 | 37 | # Logs 38 | *.log 39 | *.logs 40 | *.tlog 41 | 42 | # IDE 43 | .vscode/ 44 | .vs/ 45 | 46 | # Visual Studio 47 | .idea/ 48 | *.recipe 49 | *.idb 50 | *.iobj 51 | *.pdb 52 | 53 | # Visual Studio for Mac 54 | .idea/ 55 | 56 | # Visual Studio cache files 57 | ipch/ 58 | *.dbmdl 59 | *.dbproj.schemaview 60 | 61 | # Others 62 | .builds 63 | *~* 64 | *.cache 65 | *.swp 66 | *.bak 67 | *.tmp 68 | *.swp 69 | *.userosscache 70 | *.err 71 | *.vspscc 72 | *.vssscc 73 | *.pidb 74 | *.svclog 75 | *.scc 76 | 77 | # NuGet 78 | packages/ 79 | !packages/repositories.config 80 | *.nupkg 81 | 82 | # Microsoft Azure Build Output 83 | csx/ 84 | *.build.csdef 85 | 86 | # User-specific files 87 | *.suo 88 | *.user 89 | *.userprefs 90 | *.sln.docstates 91 | 92 | # Python 93 | __pycache__/ 94 | dist/ 95 | webui2.egg-info/ 96 | 97 | # Rust 98 | target/ 99 | *.lock 100 | 101 | # Broken NTFS 102 | nul 103 | 104 | # Zig 105 | zig-cache/ 106 | zig-out/ 107 | 108 | # macOS 109 | .DS_Store 110 | .DS_Store? 111 | ._* 112 | .Spotlight-V100 113 | .Trashes 114 | ehthumbs.db 115 | Thumbs.db 116 | 117 | # User-specific private settings 118 | *.DotSettings.user 119 | 120 | # Compressed 121 | *.zip 122 | *.gz 123 | 124 | # CMake 125 | **/cmake_install.cmake 126 | **/CMakeCache.txt 127 | **/CMakeFiles/ 128 | CMakeUserPresets.json 129 | .zig-cache 130 | 131 | # Conan 132 | **/compressor 133 | **/conan-* 134 | **/cmake-build-* 135 | **/deactivate_conanbuildenv* 136 | 137 | # vcpkg 138 | vcpkg-manifest-install.log 139 | vcpkg_installed/ -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.18) 2 | 3 | # Project name 4 | project(WebUILibrary 5 | VERSION 2.5.0 6 | DESCRIPTION "Use any web browser or WebView as GUI, with your preferred language in the backend and modern web technologies in the frontend, all in a lightweight portable library." 7 | HOMEPAGE_URL "https://webui.me/") 8 | 9 | # Set C & C++ standard 10 | set(CMAKE_CXX_STANDARD 17) 11 | set(CMAKE_CXX_STANDARD_REQUIRED ON) 12 | set(CMAKE_C_STANDARD 99) 13 | set(CMAKE_C_STANDARD_REQUIRED ON) 14 | 15 | # Variables for library names, source files, etc. 16 | set(WEBUI_DEFAULT_OUT_LIB_NAME "webui-2") 17 | 18 | # Conditional compilation for TLS 19 | option(WEBUI_USE_TLS "Enable TLS support" OFF) 20 | if (WEBUI_USE_TLS) 21 | find_package(OpenSSL REQUIRED) 22 | set(WEBUI_DEFAULT_OUT_LIB_NAME "webui-2-secure") 23 | endif() 24 | 25 | if (NOT BUILD_SHARED_LIBS) 26 | set(WEBUI_DEFAULT_OUT_LIB_NAME "${WEBUI_DEFAULT_OUT_LIB_NAME}-static") 27 | endif() 28 | 29 | # Output library name 30 | set(WEBUI_OUT_LIB_NAME "${WEBUI_DEFAULT_OUT_LIB_NAME}" CACHE STRING "Name of the output library") 31 | 32 | # Source files (already filled) 33 | set(SOURCE_FILES 34 | src/civetweb/civetweb.c 35 | src/webui.c 36 | ) 37 | if (APPLE) 38 | # enable macos webview 39 | enable_language(OBJC) 40 | set(CMAKE_OBJC_STANDARD 11) 41 | list(APPEND SOURCE_FILES src/webview/wkwebview.m) 42 | endif() 43 | 44 | # Library targets 45 | add_library(webui ${SOURCE_FILES}) 46 | target_include_directories(webui PUBLIC $ $) 47 | target_compile_definitions(webui PUBLIC NO_CACHING NO_CGI USE_WEBSOCKET 48 | "$<$:WEBUI_LOG>" "$<$>:NDEBUG>") 49 | 50 | if (BUILD_SHARED_LIBS AND WIN32) 51 | target_compile_definitions(webui PRIVATE CIVETWEB_DLL_EXPORTS PUBLIC CIVETWEB_DLL_IMPORTS) 52 | endif() 53 | 54 | if (WEBUI_USE_TLS) 55 | target_compile_definitions(webui PUBLIC WEBUI_TLS NO_SSL_DL OPENSSL_API_1_1) 56 | target_link_libraries(webui PRIVATE OpenSSL::SSL OpenSSL::Crypto) 57 | else() 58 | target_compile_definitions(webui PUBLIC NO_SSL) 59 | endif() 60 | 61 | if (WIN32) 62 | target_link_libraries(webui PRIVATE ws2_32 user32 shell32 ole32) 63 | elseif (APPLE) 64 | # link required frameworks 65 | find_library(COCOA_FRAMEWORK Cocoa REQUIRED) 66 | find_library(WEBKIT_FRAMEWORK WebKit REQUIRED) 67 | 68 | target_link_libraries(webui PRIVATE ${COCOA_FRAMEWORK} ${WEBKIT_FRAMEWORK}) 69 | endif() 70 | 71 | set_target_properties(webui PROPERTIES 72 | OUTPUT_NAME ${WEBUI_OUT_LIB_NAME}) 73 | 74 | # Install headers 75 | install(FILES include/webui.h include/webui.hpp DESTINATION include) 76 | 77 | # Install targets 78 | install(TARGETS webui 79 | EXPORT webui 80 | ARCHIVE DESTINATION lib 81 | LIBRARY DESTINATION lib 82 | RUNTIME DESTINATION bin) 83 | 84 | install(EXPORT webui 85 | FILE webui-config.cmake 86 | NAMESPACE webui:: 87 | DESTINATION share/webui 88 | ) 89 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Hassan Draga 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # WebUI Library 2 | # Windows - Microsoft Visual C 3 | 4 | # == 1. VARIABLES ============================================================= 5 | 6 | WEBUI_OUT_LIB_NAME = webui-2 7 | TLS_CFLAG = /DNO_SSL 8 | 9 | # TLS Enabled 10 | !IF "$(WEBUI_USE_TLS)" == "1" 11 | 12 | WEBUI_OUT_LIB_NAME = webui-2-secure 13 | TLS_CFLAG = /DWEBUI_TLS /DNO_SSL_DL /DOPENSSL_API_1_1 14 | TLS_LDFLAG_DYNAMIC = libssl.lib libcrypto.lib 15 | 16 | !IF "$(WEBUI_TLS_INCLUDE)" != "" 17 | TLS_CFLAG = $(TLS_CFLAG) /I"$(WEBUI_TLS_INCLUDE)" 18 | !ELSE 19 | TLS_CFLAG = $(TLS_CFLAG) /I"." 20 | !ENDIF 21 | 22 | !IF "$(WEBUI_TLS_LIB)" != "" 23 | TLS_LDFLAG_DYNAMIC = $(TLS_LDFLAG_DYNAMIC) /LIBPATH:"$(WEBUI_TLS_LIB)" 24 | !ELSE 25 | TLS_LDFLAG_DYNAMIC += $(TLS_LDFLAG_DYNAMIC) /LIBPATH:"." 26 | !ENDIF 27 | 28 | !ENDIF 29 | 30 | # Build Flags 31 | CIVETWEB_BUILD_FLAGS = /Fo"civetweb.obj" /c /EHsc "$(MAKEDIR)/src/civetweb/civetweb.c" /I"$(MAKEDIR)/src/civetweb/" $(TLS_CFLAG) 32 | CIVETWEB_DEFINE_FLAGS = /D NDEBUG /D NO_CACHING /D NO_CGI /D USE_WEBSOCKET 33 | WEBUI_BUILD_FLAGS = /Fo"webui.obj" /c /EHsc "$(MAKEDIR)/src/webui.c" /I"$(MAKEDIR)/include" /I"$(WEBUI_TLS_INCLUDE)" $(TLS_CFLAG) 34 | WARNING_RELEASE = /w 35 | WARNING_LOG = /W4 36 | 37 | # Output Commands 38 | LIB_STATIC_OUT = /OUT:"$(WEBUI_OUT_LIB_NAME)-static.lib" "webui.obj" "civetweb.obj" 39 | LIB_DYN_OUT = /DLL /OUT:"$(WEBUI_OUT_LIB_NAME).dll" "webui.obj" "civetweb.obj" user32.lib Advapi32.lib Shell32.lib Ole32.lib $(TLS_LDFLAG_DYNAMIC) 40 | 41 | # == 2.TARGETS ================================================================ 42 | 43 | all: release 44 | 45 | debug: 46 | @- mkdir dist\debug >nul 2>&1 47 | # Static with Debug info 48 | @- cd $(MAKEDIR)/dist/debug 49 | @echo Build WebUI Library (MSVC Debug Static)... 50 | @cl /Zl /Zi $(CIVETWEB_BUILD_FLAGS) $(CIVETWEB_DEFINE_FLAGS) 51 | @cl /Zl /Zi $(WEBUI_BUILD_FLAGS) $(WARNING_LOG) /D WEBUI_LOG 52 | @lib $(LIB_STATIC_OUT) 53 | # Dynamic with Debug info 54 | @echo Build WebUI Library (MSVC Debug Dynamic)... 55 | @cl /Zi $(CIVETWEB_BUILD_FLAGS) $(CIVETWEB_DEFINE_FLAGS) 56 | @cl /Zi $(WEBUI_BUILD_FLAGS) $(WARNING_LOG) /D WEBUI_LOG /D WEBUI_DYNAMIC 57 | @link $(LIB_DYN_OUT) 58 | # Clean 59 | @- del *.obj >nul 2>&1 60 | @- del *.ilk >nul 2>&1 61 | @- del *.exp >nul 2>&1 62 | @echo Done. 63 | 64 | release: 65 | @- mkdir dist >nul 2>&1 66 | @- cd $(MAKEDIR)/dist 67 | # Static Release 68 | @echo Build WebUI Library (MSVC Release Static)... 69 | @cl /Zl $(CIVETWEB_BUILD_FLAGS) $(CIVETWEB_DEFINE_FLAGS) 70 | @cl /Zl $(WEBUI_BUILD_FLAGS) $(WARNING_RELEASE) 71 | @lib $(LIB_STATIC_OUT) 72 | # Dynamic Release 73 | @echo Build WebUI Library (MSVC Release Dynamic)... 74 | @cl $(CIVETWEB_BUILD_FLAGS) $(CIVETWEB_DEFINE_FLAGS) 75 | @cl $(WEBUI_BUILD_FLAGS) $(WARNING_RELEASE) /D WEBUI_DYNAMIC 76 | @link $(LIB_DYN_OUT) 77 | # Clean 78 | @- del *.pdb >nul 2>&1 79 | @- del *.obj >nul 2>&1 80 | @- del *.ilk >nul 2>&1 81 | @- del *.exp >nul 2>&1 82 | @- echo Done. 83 | 84 | clean: 85 | @- cd $(BUILD_DIR) 86 | @- del *.pdb >nul 2>&1 87 | @- del *.obj >nul 2>&1 88 | @- del *.ilk >nul 2>&1 89 | @- del *.exp >nul 2>&1 90 | @- del *.dll >nul 2>&1 91 | @- del *.lib >nul 2>&1 92 | @- echo Done. 93 | -------------------------------------------------------------------------------- /bridge/.gitignore: -------------------------------------------------------------------------------- 1 | # Do not track Nodejs output files 2 | node_modules/ 3 | *.json 4 | 5 | # Do not track js2c.py output files 6 | webui.js 7 | -------------------------------------------------------------------------------- /bridge/README.md: -------------------------------------------------------------------------------- 1 | # WebUI Bridge 2 | 3 | The WebUI Bridge connects the UI (_Web Browser_) with the backend application through WebSocket. This bridge is written in TypeScript, and it needs to be transpiled to JavaScript using [ESBuild](https://esbuild.github.io/) to produce `webui.js`, then converted to C header using the Python script `js2c.py` to generate `webui_bridge.h`. 4 | 5 | ### Windows 6 | 7 | - Install [Python](https://www.python.org/downloads/) 8 | - Install [Node.js](https://nodejs.org/en/download) 9 | - cd `webui\bridge` 10 | - `npm install esbuild` 11 | - `.\node_modules\.bin\esbuild --bundle --target="chrome90,firefox90,safari15" --format=esm --tree-shaking=false --outdir=.\ .\webui.ts` 12 | - `python js2c.py` 13 | 14 | ### Windows PowerShell 15 | 16 | - cd `webui\bridge` 17 | - `build.bat` 18 | - If you get _running scripts is disabled on this 19 | system_ error. Then run `Set-ExecutionPolicy RemoteSigned` to enable script execution. After done, you can roll back by running `Set-ExecutionPolicy Restricted` 20 | 21 | ### Linux 22 | 23 | - Install [Python](https://www.python.org/downloads/) 24 | - Install [Node.js](https://nodejs.org/en/download) 25 | - cd `webui/bridge` 26 | - `npm install esbuild` 27 | - `./node_modules/.bin/esbuild --bundle --target="chrome90,firefox90,safari15" --format=esm --tree-shaking=false --outdir=./ ./webui.ts` 28 | - `python js2c.py` 29 | 30 | ### Linux Bash 31 | 32 | - cd `webui\bridge` 33 | - sh `./build.sh` 34 | 35 | ### macOS 36 | 37 | - Install [Python](https://www.python.org/downloads/) 38 | - Install [Node.js](https://nodejs.org/en/download) 39 | - cd `webui/bridge` 40 | - `npm install esbuild` 41 | - `./node_modules/.bin/esbuild --bundle --target="chrome90,firefox90,safari15" --format=esm --tree-shaking=false --outdir=./ ./webui.ts` 42 | - `python js2c.py` 43 | 44 | ### macOS Bash 45 | 46 | - cd `webui\bridge` 47 | - sh `./build.sh` 48 | -------------------------------------------------------------------------------- /bridge/build.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | SETLOCAL EnableDelayedExpansion 3 | 4 | REM Get current location and project root 5 | cd %~dp0 6 | FOR /F "tokens=*" %%i IN ('git rev-parse --show-toplevel') DO SET project_root=%%i 7 | cd %project_root%/bridge 8 | 9 | REM Check if node_modules\esbuild exists, if not, install using npm 10 | IF NOT EXIST "%project_root%\bridge\node_modules\esbuild\" ( 11 | where npm > NUL 2>&1 12 | IF %errorlevel%==0 ( 13 | echo Installing esbuild... 14 | npm install --prefix ./ esbuild 15 | ) ELSE ( 16 | echo Error: Please install NPM. 17 | cd %cd% 18 | exit /b 19 | ) 20 | ) 21 | 22 | REM Transpile WebUI-Bridge (TS to JS) & Convert WebUI-Bridge (JS to C) 23 | echo Transpile and bundle WebUI-Bridge from TypeScript to JavaScript... 24 | .\node_modules\.bin\esbuild --bundle --target="chrome90,firefox90,safari15" --format=esm --tree-shaking=false --minify-syntax --minify-whitespace --outdir=. ./webui.ts & node js2c.js 25 | 26 | echo Done. 27 | cd %cd% 28 | 29 | ENDLOCAL 30 | -------------------------------------------------------------------------------- /bridge/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # https://webui.me 4 | # https://github.com/webui-dev/webui 5 | # Copyright (c) 2020-2025 Hassan Draga. 6 | # Licensed under MIT License. 7 | # All rights reserved. 8 | # Canada. 9 | # 10 | # Special Thanks to Turiiya (https://github.com/ttytm) 11 | 12 | project_root=$(git rev-parse --show-toplevel) 13 | cd $project_root/bridge 14 | 15 | echo "Transpile and bundle TS sources to webui.js" 16 | esbuild --bundle --target="chrome90,firefox90,safari15" --format=esm --tree-shaking=false --minify-syntax --minify-whitespace --outdir=. ./webui.ts 17 | 18 | echo "Convert JS source to C header" 19 | node js2c.js 20 | 21 | echo "Done." 22 | -------------------------------------------------------------------------------- /bridge/js2c.js: -------------------------------------------------------------------------------- 1 | // WebUI v2.5.0-beta.4 2 | // https://webui.me 3 | // https://github.com/webui-dev/webui 4 | // Copyright (c) 2020-2025 Hassan Draga. 5 | // Licensed under MIT License. 6 | // All rights reserved. 7 | // Canada. 8 | 9 | async function jsToCHeader(inputFilename, outputFilename) { 10 | try { 11 | console.log(`Converting '${inputFilename}' to '${outputFilename}'...`); 12 | // Comment block 13 | const comment = `// WebUI v2.5.0-beta.4\n// https://webui.me\n// https://github.com/webui-dev/webui\n// Copyright (c) 2020-2025 Hassan Draga.\n// Licensed under MIT License.\n// All rights reserved.\n// Canada.\n\n`; 14 | // Read JS file content 15 | const fs = require('fs').promises; 16 | let content = await fs.readFile(inputFilename, 'utf-8'); 17 | // Add comment to js 18 | let newContent = comment + content; 19 | await fs.writeFile(inputFilename, newContent); 20 | // Convert each character in JS content to its hexadecimal value 21 | const hexValues = [...newContent].map(char => `0x${char.charCodeAt(0).toString(16).padStart(2, '0')}`); 22 | // Prepare the content for the C header file 23 | let headerContent = `${comment}// --- PLEASE DO NOT EDIT THIS FILE -------\n// --- THIS FILE IS GENERATED BY JS2C.PY --\n\n`; 24 | headerContent += `#ifndef WEBUI_BRIDGE_H\n#define WEBUI_BRIDGE_H\n`; 25 | headerContent += `unsigned char webui_javascript_bridge[] = { `; 26 | // Split the hexadecimal values to make the output more readable, adding a new line every 10 values 27 | for (let i = 0; i < hexValues.length; i += 10) { 28 | headerContent += "\n " + hexValues.slice(i, i + 10).join(', ') + ','; 29 | } 30 | headerContent += `\n 0x00\n};\n\n#endif // WEBUI_BRIDGE_H`; 31 | // Write the header content to the output file 32 | await fs.writeFile(outputFilename, headerContent); 33 | } catch (error) { 34 | if (error.code === 'ENOENT') { 35 | console.error(`Error: File '${inputFilename}' not found.`); 36 | } else { 37 | console.error('An error occurred:', error); 38 | } 39 | } 40 | } 41 | 42 | // Main 43 | jsToCHeader('webui.js', 'webui_bridge.h'); 44 | -------------------------------------------------------------------------------- /bridge/utils.ts: -------------------------------------------------------------------------------- 1 | /* 2 | https://webui.me 3 | https://github.com/webui-dev/webui 4 | Copyright (c) 2020-2025 Hassan Draga. 5 | Licensed under MIT License. 6 | All rights reserved. 7 | Canada. 8 | 9 | File: WebUI Bridge Utils 10 | Copyright (c) 2024 Oculi Julien. 11 | */ 12 | 13 | /** 14 | * Allows you to automatically bind an event listener to newly added 15 | * elements that match a specific selector within a given root element. 16 | * Track dom update to rebind event listeners automatically. 17 | * 18 | * @param {HTMLElement} root - The root element to observe for changes. 19 | * @param {string} targetSelector - Query selector matching elements that you want to bind the event listener to. 20 | * @param {K} type - Type of event listener to bind (same as for addEventListener). 21 | * @param listener - Event listener to bind (same as for addEventListener). 22 | * @param {boolean | AddEventListenerOptions} [options] - Event listener options (same as for addEventListener). 23 | * @returns the used observer to allow disconnect. 24 | */ 25 | export function addRefreshableEventListener( 26 | root: HTMLElement, 27 | targetSelector: string, 28 | type: K, 29 | listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => unknown, 30 | options?: boolean | AddEventListenerOptions, 31 | ) { 32 | function rebindListener(mutations: MutationRecord[]) { 33 | for (const mutation of mutations) { 34 | for (const node of mutation.addedNodes) { 35 | if (!(node instanceof HTMLElement)) return; // Target only html elements 36 | if (node.matches(targetSelector)) { 37 | // Bind event on added nodes 38 | node.addEventListener(type, listener, options); 39 | } 40 | for (const child of node.querySelectorAll(targetSelector)) { 41 | if (!(child instanceof HTMLElement)) continue; //Target only html elements 42 | child.addEventListener(type, listener, options); 43 | } 44 | } 45 | } 46 | } 47 | 48 | const observer = new MutationObserver(rebindListener); //Set mutation observer callback 49 | observer.observe(root, { subtree: true, childList: true }); // Observe root element and all his children 50 | return observer; // Allow user to stop observer for performance issues 51 | } 52 | 53 | /** 54 | * Async function constructor 55 | */ 56 | export const AsyncFunction = async function () {}.constructor; 57 | -------------------------------------------------------------------------------- /build.zig.zon: -------------------------------------------------------------------------------- 1 | .{ 2 | .name = .webui, 3 | .version = "2.5.0-beta.4", 4 | .fingerprint = 0xac5d87f2e5831aa7, 5 | .paths = .{ 6 | "src", 7 | "include", 8 | "bridge", 9 | "build.zig", 10 | "build.zig.zon", 11 | "LICENSE", 12 | "README.md", 13 | }, 14 | } 15 | -------------------------------------------------------------------------------- /conanfile.py: -------------------------------------------------------------------------------- 1 | from conan import ConanFile 2 | from conan.tools.cmake import CMake, CMakeToolchain 3 | 4 | class WebuiConan(ConanFile): 5 | name = "webui" 6 | version = "2.5.0-beta.4" 7 | license = "MIT" 8 | url = "https://github.com/webui-dev/webui" 9 | homepage = "https://webui.me" 10 | description = "Use any web browser or WebView as GUI, with your preferred language in the backend and modern web technologies in the frontend, all in a lightweight portable library." 11 | 12 | settings = "os", "compiler", "build_type", "arch" 13 | options = {"tls": [True, False], "shared": [True, False]} 14 | default_options = {"tls": False, "shared": False} 15 | 16 | generators = "CMakeDeps" 17 | 18 | def generate(self): 19 | tc = CMakeToolchain(self) 20 | tc.variables["WEBUI_USE_TLS"] = self.options.tls 21 | tc.variables["BUILD_SHARED_LIBS"] = self.options.shared 22 | tc.generate() 23 | 24 | def build(self): 25 | cmake = CMake(self) 26 | cmake.configure() 27 | cmake.build() 28 | 29 | def requirements(self): 30 | self.tool_requires("cmake/[>=3.18.0]") 31 | 32 | if self.options.tls: 33 | self.requires("openssl/[>3.0.0]") -------------------------------------------------------------------------------- /examples/C++/README.md: -------------------------------------------------------------------------------- 1 | # WebUI C++ Examples 2 | 3 | Examples of how to create a WebUI application in C++. 4 | 5 | The only requirement to build the examples is a a C++11 compiler. 6 | 7 | - `minimal`: Creates a minimal WebUI application. 8 | - `call_c_from_js`: Calls C++ from JavaScript. 9 | - `call_js_from_c`: Calls JavaScript from C++. 10 | - `serve_a_folder`: Uses WebUI to serve a folder that contains multiple files. 11 | 12 | To build an example, cd into its directory and run the make command. 13 | 14 | - **Windows** 15 | 16 | ```sh 17 | # G++ 18 | mingw32-make 19 | 20 | # MSVC 21 | nmake 22 | ``` 23 | 24 | - **Linux** 25 | 26 | ```sh 27 | # G++ 28 | make 29 | 30 | # Clang 31 | make CXX=clang 32 | ``` 33 | 34 | - **macOS** 35 | ```sh 36 | make 37 | ``` 38 | -------------------------------------------------------------------------------- /examples/C++/call_cpp_from_js/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C++ Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=g++` / `make CC=clang` 20 | CC = g++ 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.cpp -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.cpp -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C++ Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C++ Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C++ Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C++ Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),g++ clang aarch64-linux-gnu-g++ arm-linux-gnueabihf-g++ musl-g++),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C++/call_cpp_from_js/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C++ Example 2 | # Windows - Microsoft Visual C++ 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C++ Example (Debug Static)... 24 | @cl /Zi /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)/debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C++ Example (Debug Dynamic)... 28 | @cl /Zi /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)/debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 29 | # Clean 30 | @- del *.exp >nul 2>&1 31 | @- del *.ilk >nul 2>&1 32 | @- del *.lib >nul 2>&1 33 | @- del *.obj >nul 2>&1 34 | @- del *.pdb >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C++ Example (Release Static)... 44 | @cl /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C++ Example (Release Dynamic)... 48 | @cl /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 49 | # Clean 50 | @- del *.exp >nul 2>&1 51 | @- del *.ilk >nul 2>&1 52 | @- del *.lib >nul 2>&1 53 | @- del *.obj >nul 2>&1 54 | @- del *.pdb >nul 2>&1 55 | @echo Done. 56 | 57 | clean: 58 | - del *.obj >nul 2>&1 59 | - del *.ilk >nul 2>&1 60 | - del *.pdb >nul 2>&1 61 | - del *.exp >nul 2>&1 62 | - del *.exe >nul 2>&1 63 | - del *.lib >nul 2>&1 64 | -------------------------------------------------------------------------------- /examples/C++/call_js_from_cpp/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C++ Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=g++` / `make CC=clang` 20 | CC = g++ 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.cpp -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.cpp -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C++ Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C++ Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C++ Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C++ Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),g++ clang aarch64-linux-gnu-g++ arm-linux-gnueabihf-g++ musl-g++),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C++/call_js_from_cpp/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C++ Example 2 | # Windows - Microsoft Visual C++ 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C++ Example (Debug Static)... 24 | @cl /Zi /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)/debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C++ Example (Debug Dynamic)... 28 | @cl /Zi /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)/debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 29 | # Clean 30 | @- del *.exp >nul 2>&1 31 | @- del *.ilk >nul 2>&1 32 | @- del *.lib >nul 2>&1 33 | @- del *.obj >nul 2>&1 34 | @- del *.pdb >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C++ Example (Release Static)... 44 | @cl /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C++ Example (Release Dynamic)... 48 | @cl /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 49 | # Clean 50 | @- del *.exp >nul 2>&1 51 | @- del *.ilk >nul 2>&1 52 | @- del *.lib >nul 2>&1 53 | @- del *.obj >nul 2>&1 54 | @- del *.pdb >nul 2>&1 55 | @echo Done. 56 | 57 | clean: 58 | - del *.obj >nul 2>&1 59 | - del *.ilk >nul 2>&1 60 | - del *.pdb >nul 2>&1 61 | - del *.exp >nul 2>&1 62 | - del *.exe >nul 2>&1 63 | - del *.lib >nul 2>&1 64 | -------------------------------------------------------------------------------- /examples/C++/call_js_from_cpp/main.cpp: -------------------------------------------------------------------------------- 1 | // Call JavaScript from C++ Example 2 | 3 | // Include the WebUI header 4 | #include "webui.hpp" 5 | 6 | // Include C++ STD 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | void my_function_exit(webui::window::event* e) { 13 | 14 | // Close all opened windows 15 | webui::exit(); 16 | } 17 | 18 | void my_function_count(webui::window::event* e) { 19 | 20 | // Create a buffer to hold the response 21 | char response[64]; 22 | 23 | // This is another way to create a buffer: 24 | // std::string buffer; 25 | // buffer.reserve(64); 26 | // my_window.script(..., ..., &buffer[0], 64); 27 | 28 | // Run JavaScript 29 | if (!e->get_window().script("return GetCount();", 0, response, 64)) { 30 | 31 | if (!e->get_window().is_shown()) 32 | std::cout << "Window closed." << std::endl; 33 | else 34 | std::cout << "JavaScript Error: " << response << std::endl; 35 | return; 36 | } 37 | 38 | // Get the count 39 | int count = std::stoi(response); 40 | 41 | // Increment 42 | count++; 43 | 44 | // Generate a JavaScript 45 | std::stringstream js; 46 | js << "SetCount(" << count << ");"; 47 | 48 | // Run JavaScript (Quick Way) 49 | e->get_window().run(js.str()); 50 | } 51 | 52 | int main() { 53 | 54 | // HTML 55 | const std::string my_html = R"V0G0N( 56 | 57 | 58 | 59 | 60 | Call JavaScript from C++ Example 61 | 73 | 74 | 75 |

WebUI - Call JavaScript from C++

76 |
77 |

0

78 |
79 | 80 |
81 | 82 |
83 | 84 | 99 | 100 | 101 | )V0G0N"; 102 | 103 | // Create a window 104 | webui::window my_window; 105 | 106 | // Bind HTML elements with C++ functions 107 | my_window.bind("my_function_count", my_function_count); 108 | my_window.bind("Exit", my_function_exit); 109 | 110 | // Show the window 111 | my_window.show(my_html); // my_window.show_browser(my_html, Chrome); 112 | 113 | // Wait until all windows get closed 114 | webui::wait(); 115 | 116 | return 0; 117 | } 118 | 119 | #if defined(_MSC_VER) 120 | int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { main(); } 121 | #endif 122 | -------------------------------------------------------------------------------- /examples/C++/minimal/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C++ Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=g++` / `make CC=clang` 20 | CC = g++ 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.cpp -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.cpp -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C++ Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C++ Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C++ Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C++ Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),g++ clang aarch64-linux-gnu-g++ arm-linux-gnueabihf-g++ musl-g++),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C++/minimal/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C++ Example 2 | # Windows - Microsoft Visual C++ 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C++ Example (Debug Static)... 24 | @cl /Zi /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)/debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C++ Example (Debug Dynamic)... 28 | @cl /Zi /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)/debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 29 | # Clean 30 | @- del *.exp >nul 2>&1 31 | @- del *.ilk >nul 2>&1 32 | @- del *.lib >nul 2>&1 33 | @- del *.obj >nul 2>&1 34 | @- del *.pdb >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C++ Example (Release Static)... 44 | @cl /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C++ Example (Release Dynamic)... 48 | @cl /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 49 | # Clean 50 | @- del *.exp >nul 2>&1 51 | @- del *.ilk >nul 2>&1 52 | @- del *.lib >nul 2>&1 53 | @- del *.obj >nul 2>&1 54 | @- del *.pdb >nul 2>&1 55 | @echo Done. 56 | 57 | clean: 58 | - del *.obj >nul 2>&1 59 | - del *.ilk >nul 2>&1 60 | - del *.pdb >nul 2>&1 61 | - del *.exp >nul 2>&1 62 | - del *.exe >nul 2>&1 63 | - del *.lib >nul 2>&1 64 | -------------------------------------------------------------------------------- /examples/C++/minimal/main.cpp: -------------------------------------------------------------------------------- 1 | #include "webui.hpp" 2 | #include 3 | 4 | int main() { 5 | webui::window my_window; 6 | my_window.show(" C++ Hello World ! "); 7 | webui::wait(); 8 | return 0; 9 | } 10 | 11 | #ifdef _WIN32 12 | // Release build 13 | int WINAPI 14 | wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd) { 15 | return main(); 16 | } 17 | #endif 18 | -------------------------------------------------------------------------------- /examples/C++/serve_a_folder/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C++ Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=g++` / `make CC=clang` 20 | CC = g++ 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.cpp -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.cpp -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C++ Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C++ Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C++ Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C++ Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),g++ clang aarch64-linux-gnu-g++ arm-linux-gnueabihf-g++ musl-g++),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C++/serve_a_folder/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C++ Example 2 | # Windows - Microsoft Visual C++ 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C++ Example (Debug Static)... 24 | @cl /Zi /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)/debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C++ Example (Debug Dynamic)... 28 | @cl /Zi /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)/debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 29 | # Clean 30 | @- del *.exp >nul 2>&1 31 | @- del *.ilk >nul 2>&1 32 | @- del *.lib >nul 2>&1 33 | @- del *.obj >nul 2>&1 34 | @- del *.pdb >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C++ Example (Release Static)... 44 | @cl /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C++ Example (Release Dynamic)... 48 | @cl /EHsc /std:c++17 main.cpp /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 49 | # Clean 50 | @- del *.exp >nul 2>&1 51 | @- del *.ilk >nul 2>&1 52 | @- del *.lib >nul 2>&1 53 | @- del *.obj >nul 2>&1 54 | @- del *.pdb >nul 2>&1 55 | @echo Done. 56 | 57 | clean: 58 | - del *.obj >nul 2>&1 59 | - del *.ilk >nul 2>&1 60 | - del *.pdb >nul 2>&1 61 | - del *.exp >nul 2>&1 62 | - del *.exe >nul 2>&1 63 | - del *.lib >nul 2>&1 64 | -------------------------------------------------------------------------------- /examples/C++/serve_a_folder/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | WebUI - Serve a Folder Example (C++) 6 | 17 | 18 | 19 |

Serve a Folder Example (C++)

20 |
21 |

22 | You can edit this HTML file as you need.
23 | Also, you can config WebUI to use Deno or Nodejs runtime for your JS/TS files.
24 |
25 | Please click on the link to switch to the second page
26 | Or click on the button to switch to the second page programmatically. 27 |

28 |
29 |

Second Page As A Simple Link

30 |
31 | 32 |
33 |
34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /examples/C++/serve_a_folder/main.cpp: -------------------------------------------------------------------------------- 1 | // Include the WebUI header 2 | #include "webui.hpp" 3 | 4 | // Include C++ STD 5 | #include 6 | 7 | // Making this object global so show_second_window() can access it. 8 | webui::window my_second_window; 9 | 10 | // Example of a simple Class 11 | class MyClass { 12 | public: 13 | // This method gets called every time the 14 | // user clicks on "OpenNewWindow" 15 | void show_second_window(webui::window::event* e) { 16 | // Show a new window, and navigate to `/second.html` 17 | // if the window is already opened, then switch in the same window 18 | my_second_window.show("second.html"); 19 | } 20 | 21 | // This method gets called every time the 22 | // user clicks on "SwitchToSecondPage" 23 | void switch_to_second_page(webui::window::event* e) { 24 | // Switch to `/second.html` in the same opened window. 25 | e->get_window().show("second.html"); 26 | } 27 | 28 | // Example of a simple function (Not a method) 29 | // This function receives all events because 30 | // it's get bind with an empty HTML ID. 31 | void events(webui::window::event* e) { 32 | if (e->event_type == webui::CONNECTED) 33 | std::cout << "Window Connected." << std::endl; 34 | else if (e->event_type == webui::DISCONNECTED) 35 | std::cout << "Window Disconnected." << std::endl; 36 | else if (e->event_type == webui::MOUSE_CLICK) 37 | std::cout << "Click on element: " << e->element << std::endl; 38 | else if (e->event_type == webui::NAVIGATION) { 39 | std::string url = e->get_string(); 40 | std::cout << "Starting navigation to: " << url << std::endl; 41 | e->get_window().navigate(url); 42 | } 43 | } 44 | 45 | // Example of a simple function (Not a method) 46 | void exit_app(webui::window::event* e) { 47 | // Close all opened windows 48 | webui::exit(); 49 | } 50 | }; 51 | 52 | // -- MyClass C Wrapper ------------------------------------------------------------------------ 53 | // Because WebUI is written in C, so it can not access `MyClass` directly. 54 | // That's why we should create a simple C++ wrapper. 55 | MyClass myClassObj; 56 | void show_second_window_wrp(webui::window::event* e) { myClassObj.show_second_window(e); } 57 | void switch_to_second_page_wrp(webui::window::event* e) { myClassObj.switch_to_second_page(e); } 58 | void events_wrp(webui::window::event* e) { myClassObj.events(e); } 59 | void exit_app_wrp(webui::window::event* e) { myClassObj.exit_app(e); } 60 | // --------------------------------------------------------------------------------------------- 61 | 62 | int main() { 63 | 64 | // Print logs (debug build only) 65 | std::cout << "Starting..." << std::endl; 66 | 67 | // Create a new window 68 | webui::window my_window; 69 | 70 | // Bind HTML element IDs with a C functions 71 | my_window.bind("SwitchToSecondPage", switch_to_second_page_wrp); 72 | my_window.bind("OpenNewWindow", show_second_window_wrp); 73 | my_window.bind("Exit", exit_app_wrp); 74 | my_second_window.bind("Exit", exit_app_wrp); 75 | 76 | // Bind all events 77 | my_window.bind("", events_wrp); 78 | my_second_window.bind("", events_wrp); 79 | 80 | // Show a new window 81 | my_window.show("index.html"); // my_window.show_browser("index.html", Chrome); 82 | 83 | // Wait until all windows get closed 84 | webui::wait(); 85 | 86 | // Print logs (debug build only) 87 | std::cout << "Thank you." << std::endl; 88 | 89 | return 0; 90 | } 91 | 92 | #ifdef _WIN32 93 | // Release build 94 | int WINAPI 95 | wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd) { 96 | return main(); 97 | } 98 | #endif 99 | -------------------------------------------------------------------------------- /examples/C++/serve_a_folder/second.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | WebUI - Second Page (C++) 6 | 17 | 18 | 19 |

This is the second page !

20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /examples/C/README.md: -------------------------------------------------------------------------------- 1 | # WebUI C Examples 2 | 3 | Examples of how to create a WebUI application in C. 4 | 5 | ## C Examples 6 | 7 | The only requirement to build the examples is a C compiler. 8 | 9 | - `minimal`: Creates a minimal WebUI application. 10 | - `call_c_from_js`: Calls C from JavaScript. 11 | - `call_js_from_c`: Calls JavaScript from C. 12 | - `serve_a_folder`: Use WebUI to serve a folder that contains `.html`, `.css`, `.js`, or `.ts` files. 13 | - `custom_web_server`: Use your preferred web server like NGINX/Apache... with WebUI to serve a folder. 14 | 15 | To build an example, cd into its directory and run the make command. 16 | 17 | - **Windows** 18 | 19 | ```sh 20 | # GCC 21 | mingw32-make 22 | 23 | # MSVC 24 | nmake 25 | ``` 26 | 27 | - **Linux** 28 | 29 | ```sh 30 | # GCC 31 | make 32 | 33 | # Clang 34 | make CC=clang 35 | ``` 36 | 37 | - **macOS** 38 | ```sh 39 | make 40 | ``` 41 | 42 | ## Additional Examples 43 | 44 | - [`text-editor`](https://github.com/webui-dev/webui/tree/main/examples/C/text-editor): A lightweight and portable text editor written in C using WebUI as the GUI library. 45 | -------------------------------------------------------------------------------- /examples/C/call_c_from_js/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=gcc` / `make CC=clang` 20 | CC = gcc 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),gcc clang aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc musl-gcc),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C/call_c_from_js/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | # Windows - Microsoft Visual C 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C Example (Static Debug)... 24 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C Example (Dynamic Debug)... 28 | @copy "$(LIB_DIR)\debug\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 29 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 30 | # Clean 31 | @- del *.exp >nul 2>&1 32 | @- del *.ilk >nul 2>&1 33 | @- del *.lib >nul 2>&1 34 | @- del *.obj >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C Example (Static Release)... 44 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C Example (Dynamic Release)... 48 | @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 49 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 50 | # Clean 51 | @- del *.exp >nul 2>&1 52 | @- del *.ilk >nul 2>&1 53 | @- del *.lib >nul 2>&1 54 | @- del *.obj >nul 2>&1 55 | @- del *.pdb >nul 2>&1 56 | @echo Done. 57 | 58 | clean: 59 | - del *.obj >nul 2>&1 60 | - del *.ilk >nul 2>&1 61 | - del *.pdb >nul 2>&1 62 | - del *.exp >nul 2>&1 63 | - del *.exe >nul 2>&1 64 | - del *.lib >nul 2>&1 65 | -------------------------------------------------------------------------------- /examples/C/call_js_from_c/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=gcc` / `make CC=clang` 20 | CC = gcc 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),gcc clang aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc musl-gcc),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C/call_js_from_c/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | # Windows - Microsoft Visual C 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C Example (Static Debug)... 24 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C Example (Dynamic Debug)... 28 | @copy "$(LIB_DIR)\debug\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 29 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 30 | # Clean 31 | @- del *.exp >nul 2>&1 32 | @- del *.ilk >nul 2>&1 33 | @- del *.lib >nul 2>&1 34 | @- del *.obj >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C Example (Static Release)... 44 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C Example (Dynamic Release)... 48 | @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 49 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 50 | # Clean 51 | @- del *.exp >nul 2>&1 52 | @- del *.ilk >nul 2>&1 53 | @- del *.lib >nul 2>&1 54 | @- del *.obj >nul 2>&1 55 | @- del *.pdb >nul 2>&1 56 | @echo Done. 57 | 58 | clean: 59 | - del *.obj >nul 2>&1 60 | - del *.ilk >nul 2>&1 61 | - del *.pdb >nul 2>&1 62 | - del *.exp >nul 2>&1 63 | - del *.exe >nul 2>&1 64 | - del *.lib >nul 2>&1 65 | -------------------------------------------------------------------------------- /examples/C/chatgpt_api/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=gcc` / `make CC=clang` 20 | CC = gcc 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),gcc clang aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc musl-gcc),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C/chatgpt_api/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | # Windows - Microsoft Visual C 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C Example (Static Debug)... 24 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C Example (Dynamic Debug)... 28 | @copy "$(LIB_DIR)\debug\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 29 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 30 | # Clean 31 | @- del *.exp >nul 2>&1 32 | @- del *.ilk >nul 2>&1 33 | @- del *.lib >nul 2>&1 34 | @- del *.obj >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C Example (Static Release)... 44 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C Example (Dynamic Release)... 48 | @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 49 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 50 | # Clean 51 | @- del *.exp >nul 2>&1 52 | @- del *.ilk >nul 2>&1 53 | @- del *.lib >nul 2>&1 54 | @- del *.obj >nul 2>&1 55 | @- del *.pdb >nul 2>&1 56 | @echo Done. 57 | 58 | clean: 59 | - del *.obj >nul 2>&1 60 | - del *.ilk >nul 2>&1 61 | - del *.pdb >nul 2>&1 62 | - del *.exp >nul 2>&1 63 | - del *.exe >nul 2>&1 64 | - del *.lib >nul 2>&1 65 | -------------------------------------------------------------------------------- /examples/C/chatgpt_api/main.c: -------------------------------------------------------------------------------- 1 | // WebUI C - ChatGPT HTTPS API Example 2 | 3 | #include "webui.h" 4 | 5 | // ChatGPT Configuration 6 | #define USER_KEY "sk-proj-xxx-xxxxxxxxxxxxxxxxxxxxxxx_xxx" 7 | #define USER_MODEL "gpt-4o" 8 | #define USER_ASSISTANT "You are an assistant, answer with very short messages." 9 | 10 | #define BUF_SIZE (1024) 11 | size_t hiddenWindow = 0; 12 | 13 | // HTML 14 | const char* html = "" 15 | "" 16 | " " 17 | " " 18 | " " 19 | " " 20 | " " 40 | " " 41 | ""; 42 | 43 | bool run_ai_query(const char* user_query, char* ai_response) { 44 | 45 | char js[BUF_SIZE]; 46 | memset(js, 0, BUF_SIZE); 47 | 48 | // Generate JavaScript 49 | sprintf(js, 50 | "return run_gpt_api('%s', '%s', '%s', '%s');", 51 | USER_KEY, USER_MODEL, USER_ASSISTANT, user_query 52 | ); 53 | 54 | // Run HTTPS API 55 | if (webui_script(hiddenWindow, js, 30, ai_response, BUF_SIZE)) { 56 | return true; 57 | } 58 | 59 | return false; 60 | } 61 | 62 | int main(int argc, char *argv[]) { 63 | 64 | if (argc < 2) { 65 | printf("Please provide a query.\nExample: %s What is the capital of Canada?\n", argv[0]); 66 | return 0; 67 | } 68 | 69 | // Initializing 70 | char ai_response[BUF_SIZE]; 71 | char user_query[BUF_SIZE]; 72 | memset(ai_response, 0, BUF_SIZE); 73 | memset(user_query, 0, BUF_SIZE); 74 | 75 | // Get user query 76 | for (int i = 1; i < argc; i++) { 77 | strcat(user_query, argv[i]); 78 | strcat(user_query, " "); 79 | } 80 | 81 | // Start WebUI server 82 | hiddenWindow = webui_new_window(); 83 | webui_set_hide(hiddenWindow, true); 84 | webui_show_browser(hiddenWindow, html, ChromiumBased); 85 | 86 | // Run HTTPS API 87 | if (run_ai_query(user_query, ai_response)) { 88 | printf("AI Response: %s\n", ai_response); 89 | } else { 90 | printf("Error:\n%s\n", ai_response); 91 | } 92 | 93 | // Exit 94 | webui_exit(); 95 | webui_clean(); 96 | 97 | return 0; 98 | } 99 | -------------------------------------------------------------------------------- /examples/C/custom_web_server/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=gcc` / `make CC=clang` 20 | CC = gcc 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),gcc clang aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc musl-gcc),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C/custom_web_server/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | # Windows - Microsoft Visual C 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C Example (Static Debug)... 24 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C Example (Dynamic Debug)... 28 | @copy "$(LIB_DIR)\debug\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 29 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 30 | # Clean 31 | @- del *.exp >nul 2>&1 32 | @- del *.ilk >nul 2>&1 33 | @- del *.lib >nul 2>&1 34 | @- del *.obj >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C Example (Static Release)... 44 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C Example (Dynamic Release)... 48 | @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 49 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 50 | # Clean 51 | @- del *.exp >nul 2>&1 52 | @- del *.ilk >nul 2>&1 53 | @- del *.lib >nul 2>&1 54 | @- del *.obj >nul 2>&1 55 | @- del *.pdb >nul 2>&1 56 | @echo Done. 57 | 58 | clean: 59 | - del *.obj >nul 2>&1 60 | - del *.ilk >nul 2>&1 61 | - del *.pdb >nul 2>&1 62 | - del *.exp >nul 2>&1 63 | - del *.exe >nul 2>&1 64 | - del *.lib >nul 2>&1 65 | -------------------------------------------------------------------------------- /examples/C/custom_web_server/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | WebUI - Custom Web-Server Example (C) 6 | 7 | 8 | 9 | 10 |

Custom Web-Server Example (C)

11 |

12 | This HTML page is handled by a custom Web-Server other than WebUI.
13 | This window is connected to the back-end because we used:

http://localhost:8081/webui.js
14 |

15 |

Simple link example (Local file)

16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /examples/C/custom_web_server/main.c: -------------------------------------------------------------------------------- 1 | // Serve a Folder Example 2 | 3 | #include "webui.h" 4 | 5 | void events(webui_event_t* e) { 6 | 7 | // This function gets called every time 8 | // there is an event 9 | 10 | if (e->event_type == WEBUI_EVENT_CONNECTED) 11 | printf("Connected. \n"); 12 | else if (e->event_type == WEBUI_EVENT_DISCONNECTED) 13 | printf("Disconnected. \n"); 14 | else if (e->event_type == WEBUI_EVENT_MOUSE_CLICK) 15 | printf("Click. \n"); 16 | else if (e->event_type == WEBUI_EVENT_NAVIGATION) { 17 | const char* url = webui_get_string(e); 18 | printf("Starting navigation to: %s \n", url); 19 | 20 | // Because we used `webui_bind(MyWindow, "", events);` 21 | // WebUI will block all `href` link clicks and sent here instead. 22 | // We can then control the behaviour of links as needed. 23 | webui_navigate(e->window, url); 24 | } 25 | } 26 | 27 | void my_backend_func(webui_event_t* e) { 28 | 29 | // JavaScript: 30 | // my_backend_func(123, 456, 789); 31 | // or webui.my_backend_func(...); 32 | 33 | long long number_1 = webui_get_int_at(e, 0); 34 | long long number_2 = webui_get_int_at(e, 1); 35 | long long number_3 = webui_get_int_at(e, 2); 36 | 37 | printf("my_backend_func 1: %lld\n", number_1); // 123 38 | printf("my_backend_func 2: %lld\n", number_2); // 456 39 | printf("my_backend_func 3: %lld\n", number_3); // 789 40 | } 41 | 42 | int main() { 43 | 44 | // Create new windows 45 | size_t window = webui_new_window(); 46 | 47 | // Bind all events 48 | webui_bind(window, "", events); 49 | 50 | // Bind HTML elements with C functions 51 | webui_bind(window, "my_backend_func", my_backend_func); 52 | 53 | // Set the web-server/WebSocket port that WebUI should 54 | // use. This means `webui.js` will be available at: 55 | // http://localhost:MY_PORT_NUMBER/webui.js 56 | webui_set_port(window, 8081); 57 | 58 | // Show a new window and show our custom web server 59 | // Assuming the custom web server is running on port 60 | // 8080... 61 | webui_show(window, "http://localhost:8080/"); 62 | 63 | // Wait until all windows get closed 64 | webui_wait(); 65 | 66 | // Free all memory resources (Optional) 67 | webui_clean(); 68 | 69 | return 0; 70 | } 71 | 72 | #if defined(_MSC_VER) 73 | int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { return main(); } 74 | #endif 75 | -------------------------------------------------------------------------------- /examples/C/custom_web_server/second.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | WebUI - Custom Web-Server second page (C) 6 | 7 | 8 | 9 | 10 |

This is the second page !

11 |

Back

12 | 13 | 14 | -------------------------------------------------------------------------------- /examples/C/custom_web_server/simple_web_server.py: -------------------------------------------------------------------------------- 1 | import http.server 2 | import socketserver 3 | 4 | PORT = 8080 5 | 6 | Handler = http.server.SimpleHTTPRequestHandler 7 | 8 | with socketserver.TCPServer(("", PORT), Handler) as httpd: 9 | print(f"Server started at http://localhost:{PORT}") 10 | httpd.serve_forever() 11 | -------------------------------------------------------------------------------- /examples/C/frameless/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=gcc` / `make CC=clang` 20 | CC = gcc 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),gcc clang aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc musl-gcc),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C/frameless/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | # Windows - Microsoft Visual C 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C Example (Static Debug)... 24 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C Example (Dynamic Debug)... 28 | @copy "$(LIB_DIR)\debug\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 29 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 30 | # Clean 31 | @- del *.exp >nul 2>&1 32 | @- del *.ilk >nul 2>&1 33 | @- del *.lib >nul 2>&1 34 | @- del *.obj >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C Example (Static Release)... 44 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C Example (Dynamic Release)... 48 | @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 49 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 50 | # Clean 51 | @- del *.exp >nul 2>&1 52 | @- del *.ilk >nul 2>&1 53 | @- del *.lib >nul 2>&1 54 | @- del *.obj >nul 2>&1 55 | @- del *.pdb >nul 2>&1 56 | @echo Done. 57 | 58 | clean: 59 | - del *.obj >nul 2>&1 60 | - del *.ilk >nul 2>&1 61 | - del *.pdb >nul 2>&1 62 | - del *.exp >nul 2>&1 63 | - del *.exe >nul 2>&1 64 | - del *.lib >nul 2>&1 65 | -------------------------------------------------------------------------------- /examples/C/frameless/main.c: -------------------------------------------------------------------------------- 1 | // WebUI C - Frameless Example 2 | 3 | #include "webui.h" 4 | 5 | const char* html = 6 | "" 7 | " " 8 | " " 9 | " " 10 | " " 57 | " " 58 | " " 59 | "
" 60 | " WebUI Frameless Window" 61 | "
" 62 | " " 63 | // " " 64 | " " 65 | "
" 66 | "
" 67 | "
" 68 | " This is a WebUI frameless example" 69 | "
" 70 | " " 71 | ""; 72 | 73 | void minimize(webui_event_t* e) { 74 | webui_minimize(e->window); 75 | } 76 | 77 | void maximize(webui_event_t* e) { 78 | webui_maximize(e->window); 79 | } 80 | 81 | void close_win(webui_event_t* e) { 82 | webui_close(e->window); 83 | } 84 | 85 | int main() { 86 | 87 | size_t my_window = webui_new_window(); 88 | 89 | webui_bind(my_window, "minimize", minimize); 90 | webui_bind(my_window, "maximize", maximize); 91 | webui_bind(my_window, "close_win", close_win); 92 | 93 | webui_set_size(my_window, 800, 600); 94 | webui_set_frameless(my_window, true); 95 | webui_set_transparent(my_window, true); 96 | webui_set_resizable(my_window, false); 97 | webui_set_center(my_window); 98 | 99 | webui_show_wv(my_window, html); 100 | webui_wait(); 101 | return 0; 102 | } 103 | 104 | #if defined(_MSC_VER) 105 | int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { return main(); } 106 | #endif 107 | -------------------------------------------------------------------------------- /examples/C/frameless/webui_frameless.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/frameless/webui_frameless.png -------------------------------------------------------------------------------- /examples/C/minimal/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=gcc` / `make CC=clang` 20 | CC = gcc 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),gcc clang aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc musl-gcc),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C/minimal/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | # Windows - Microsoft Visual C 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C Example (Static Debug)... 24 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C Example (Dynamic Debug)... 28 | @copy "$(LIB_DIR)\debug\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 29 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 30 | # Clean 31 | @- del *.exp >nul 2>&1 32 | @- del *.ilk >nul 2>&1 33 | @- del *.lib >nul 2>&1 34 | @- del *.obj >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C Example (Static Release)... 44 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C Example (Dynamic Release)... 48 | @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 49 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 50 | # Clean 51 | @- del *.exp >nul 2>&1 52 | @- del *.ilk >nul 2>&1 53 | @- del *.lib >nul 2>&1 54 | @- del *.obj >nul 2>&1 55 | @- del *.pdb >nul 2>&1 56 | @echo Done. 57 | 58 | clean: 59 | - del *.obj >nul 2>&1 60 | - del *.ilk >nul 2>&1 61 | - del *.pdb >nul 2>&1 62 | - del *.exp >nul 2>&1 63 | - del *.exe >nul 2>&1 64 | - del *.lib >nul 2>&1 65 | -------------------------------------------------------------------------------- /examples/C/minimal/main.c: -------------------------------------------------------------------------------- 1 | // WebUI C - Minimal Example 2 | 3 | #include "webui.h" 4 | 5 | int main() { 6 | 7 | size_t my_window = webui_new_window(); 8 | webui_show(my_window, " Hello World ! "); 9 | webui_wait(); 10 | return 0; 11 | } 12 | 13 | #if defined(_MSC_VER) 14 | int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { return main(); } 15 | #endif 16 | -------------------------------------------------------------------------------- /examples/C/public_network_access/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=gcc` / `make CC=clang` 20 | CC = gcc 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),gcc clang aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc musl-gcc),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C/public_network_access/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | # Windows - Microsoft Visual C 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C Example (Static Debug)... 24 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C Example (Dynamic Debug)... 28 | @copy "$(LIB_DIR)\debug\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 29 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 30 | # Clean 31 | @- del *.exp >nul 2>&1 32 | @- del *.ilk >nul 2>&1 33 | @- del *.lib >nul 2>&1 34 | @- del *.obj >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C Example (Static Release)... 44 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C Example (Dynamic Release)... 48 | @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 49 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 50 | # Clean 51 | @- del *.exp >nul 2>&1 52 | @- del *.ilk >nul 2>&1 53 | @- del *.lib >nul 2>&1 54 | @- del *.obj >nul 2>&1 55 | @- del *.pdb >nul 2>&1 56 | @echo Done. 57 | 58 | clean: 59 | - del *.obj >nul 2>&1 60 | - del *.ilk >nul 2>&1 61 | - del *.pdb >nul 2>&1 62 | - del *.exp >nul 2>&1 63 | - del *.exe >nul 2>&1 64 | - del *.lib >nul 2>&1 65 | -------------------------------------------------------------------------------- /examples/C/public_network_access/main.c: -------------------------------------------------------------------------------- 1 | // Public Network Access Example 2 | 3 | #include "webui.h" 4 | 5 | // Windows 6 | size_t private_window = 0; 7 | size_t public_window = 0; 8 | 9 | void app_exit(webui_event_t* e) { 10 | webui_exit(); 11 | } 12 | 13 | void public_window_events(webui_event_t* e) { 14 | if (e->event_type == WEBUI_EVENT_CONNECTED) { 15 | // New connection 16 | webui_run(private_window, "document.getElementById(\"Logs\").value += \"New connection.\\n\";"); 17 | } 18 | else if (e->event_type == WEBUI_EVENT_DISCONNECTED) { 19 | // Disconnection 20 | webui_run(private_window, "document.getElementById(\"Logs\").value += \"Disconnected.\\n\";"); 21 | } 22 | } 23 | 24 | void private_window_events(webui_event_t* e) { 25 | if (e->event_type == WEBUI_EVENT_CONNECTED) { 26 | // Get URL of public window 27 | const char* public_win_url = webui_get_url(public_window); 28 | char javascript[1024]; 29 | sprintf(javascript, "document.getElementById('urlSpan').innerHTML = '%s';", public_win_url); 30 | webui_run(private_window, javascript); 31 | } 32 | } 33 | 34 | int main() { 35 | 36 | // Main Private Window HTML 37 | const char* private_html = "" 38 | "" 39 | " " 40 | " " 41 | " " 42 | " Public Network Access Example" 43 | " " 69 | " " 70 | " " 71 | "

WebUI - Public Network Access Example

" 72 | "
" 73 | " The second public window is configured to be accessible from
" 74 | " any device in the public network.
" 75 | "
" 76 | " Second public window link:
" 77 | "

...

" 78 | " Second public window events:
" 79 | " " 80 | "
" 81 | " " 82 | " " 83 | ""; 84 | 85 | // Public Window HTML 86 | const char* public_html = "" 87 | "" 88 | " " 89 | " " 90 | " " 91 | " Welcome to Public UI" 92 | " " 93 | " " 94 | "

Welcome to Public UI!

" 95 | " " 96 | ""; 97 | 98 | // Create windows 99 | private_window = webui_new_window(); 100 | public_window = webui_new_window(); 101 | 102 | // App 103 | webui_set_timeout(0); // Wait forever (never timeout) 104 | 105 | // Public Window 106 | webui_set_public(public_window, true); // Make URL accessible from public networks 107 | webui_bind(public_window, "", public_window_events); // Bind all events 108 | webui_show_browser(public_window, public_html, NoBrowser); // Set public window HTML 109 | 110 | // Private Window 111 | webui_bind(private_window, "", private_window_events); // Run JS 112 | webui_bind(private_window, "Exit", app_exit); // Bind exit button 113 | webui_show(private_window, private_html); // Show the window 114 | 115 | // Wait until all windows get closed 116 | webui_wait(); 117 | 118 | // Free all memory resources (Optional) 119 | webui_clean(); 120 | 121 | return 0; 122 | } 123 | 124 | #if defined(_MSC_VER) 125 | int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { return main(); } 126 | #endif 127 | -------------------------------------------------------------------------------- /examples/C/react/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=gcc` / `make CC=clang` 20 | CC = gcc 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),gcc clang aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc musl-gcc),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C/react/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | # Windows - Microsoft Visual C 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C Example (Static Debug)... 24 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C Example (Dynamic Debug)... 28 | @copy "$(LIB_DIR)\debug\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 29 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 30 | # Clean 31 | @- del *.exp >nul 2>&1 32 | @- del *.ilk >nul 2>&1 33 | @- del *.lib >nul 2>&1 34 | @- del *.obj >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C Example (Static Release)... 44 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C Example (Dynamic Release)... 48 | @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 49 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 50 | # Clean 51 | @- del *.exp >nul 2>&1 52 | @- del *.ilk >nul 2>&1 53 | @- del *.lib >nul 2>&1 54 | @- del *.obj >nul 2>&1 55 | @- del *.pdb >nul 2>&1 56 | @echo Done. 57 | 58 | clean: 59 | - del *.obj >nul 2>&1 60 | - del *.ilk >nul 2>&1 61 | - del *.pdb >nul 2>&1 62 | - del *.exp >nul 2>&1 63 | - del *.exe >nul 2>&1 64 | - del *.lib >nul 2>&1 65 | -------------------------------------------------------------------------------- /examples/C/react/README.md: -------------------------------------------------------------------------------- 1 | ## React WebUI Example 2 | 3 | This is a basic example of how to use WebUI with React to generate a portable single executable program. WebUI will run the internal web server and use any installed web browser as GUI to show the React UI. 4 | 5 | A simple Python script `vfs.py` is used to generate `vfs.h` to embed the whole react's build folder into the portable single executable program. 6 | 7 | ![Screenshot](webui_react.png) 8 | 9 | ### How to use it? 10 | 11 | 1. Run script `build_react` to re-build the React project and compile the C file 12 | 13 | ### How to create a React WebUI project from scratch? 14 | 15 | 1. Run `npx create-react-app my-react-app` to create a React app using NPM 16 | 2. Add `` into `public/index.html` to connect UI with the backend 17 | 3. Run `python vfs.py "./my-react-app/build" "vfs.h"` to embed the build folder 18 | 4. Now, use any C compiler to compile `main.c` into a portable executable program 19 | 20 | ### Other backend languages examples: 21 | 22 | - Coming soon... 23 | -------------------------------------------------------------------------------- /examples/C/react/build_react.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | echo. 4 | echo * Build React project... 5 | 6 | cd webui-react-example 7 | call npm install 8 | call npm run build 9 | cd .. 10 | 11 | echo. 12 | echo * Embedding React's build files into 'vfs.h' 13 | 14 | python vfs.py "./webui-react-example/build" "vfs.h" 15 | 16 | echo. 17 | echo * Compiling 'main.c' into 'main.exe' using Microsoft Visual Studio... 18 | 19 | nmake 20 | -------------------------------------------------------------------------------- /examples/C/react/build_react.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo 4 | echo "* Build React project..." 5 | 6 | cd webui-react-example 7 | npm install || exit 8 | npm run build || exit 9 | cd .. 10 | 11 | echo 12 | echo "* Embedding React's build files into 'vfs.h'" 13 | 14 | python3 vfs.py "./webui-react-example/build" "vfs.h" 15 | 16 | echo 17 | echo "* Compiling 'main.c' into 'main' using GCC..." 18 | 19 | make 20 | -------------------------------------------------------------------------------- /examples/C/react/main.c: -------------------------------------------------------------------------------- 1 | // React Example 2 | 3 | #include "webui.h" 4 | #include "vfs.h" 5 | 6 | void exit_app(webui_event_t* e) { 7 | webui_exit(); 8 | } 9 | 10 | int main() { 11 | 12 | // Create new windows 13 | size_t react_window = webui_new_window(); 14 | 15 | // Set window size 16 | webui_set_size(react_window, 550, 450); 17 | 18 | // Set window position 19 | webui_set_position(react_window, 250, 250); 20 | 21 | // Allow multi-user connection to WebUI window 22 | webui_set_config(multi_client, true); 23 | 24 | // Disable WebUI's cookies 25 | webui_set_config(use_cookies, false); 26 | 27 | // Bind React HTML element IDs with a C functions 28 | webui_bind(react_window, "Exit", exit_app); 29 | 30 | // VSF (Virtual File System) Example 31 | // 32 | // 1. Run Python script to generate header file of a folder 33 | // python vfs.py "/path/to/folder" "vfs.h" 34 | // 35 | // 2. Include header file in your C project 36 | // #include "vfs.h" 37 | // 38 | // 3. use vfs in your custom files handler `webui_set_file_handler()` 39 | // webui_set_file_handler(react_window, vfs); 40 | 41 | // Set a custom files handler 42 | webui_set_file_handler(react_window, vfs); 43 | 44 | // Show the React window 45 | // webui_show_browser(react_window, "index.html", Chrome); 46 | webui_show(react_window, "index.html"); 47 | 48 | // Wait until all windows get closed 49 | webui_wait(); 50 | 51 | // Free all memory resources (Optional) 52 | webui_clean(); 53 | 54 | return 0; 55 | } 56 | 57 | #if defined(_MSC_VER) 58 | int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { return main(); } 59 | #endif 60 | -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webui-react-example", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.17.0", 7 | "@testing-library/react": "^13.4.0", 8 | "@testing-library/user-event": "^13.5.0", 9 | "react": "^18.3.1", 10 | "react-dom": "^18.3.1", 11 | "react-scripts": "5.0.1", 12 | "web-vitals": "^2.1.4" 13 | }, 14 | "scripts": { 15 | "start": "react-scripts start", 16 | "build": "react-scripts build", 17 | "test": "react-scripts test", 18 | "eject": "react-scripts eject" 19 | }, 20 | "eslintConfig": { 21 | "extends": [ 22 | "react-app", 23 | "react-app/jest" 24 | ] 25 | }, 26 | "browserslist": { 27 | "production": [ 28 | ">0.2%", 29 | "not dead", 30 | "not op_mini all" 31 | ], 32 | "development": [ 33 | "last 1 chrome version", 34 | "last 1 firefox version", 35 | "last 1 safari version" 36 | ] 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/react/webui-react-example/public/favicon.ico -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | WebUI React 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/react/webui-react-example/public/logo192.png -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/react/webui-react-example/public/logo512.png -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/src/App.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | 3 | const App = () => { 4 | const [value1, setValue1] = useState(''); 5 | const [value2, setValue2] = useState(''); 6 | const [result, setResult] = useState(null); 7 | 8 | const calculateSum = () => { 9 | const sum = parseFloat(value1 || 0) + parseFloat(value2 || 0); 10 | setResult(sum); 11 | }; 12 | 13 | return ( 14 |
15 | 16 |

WebUI React Example

17 |
18 | 21 | setValue1(e.target.value)} 25 | style={{ marginLeft: '10px', padding: '5px', fontSize: '16px' }} 26 | /> 27 |
28 |
29 | 32 | setValue2(e.target.value)} 36 | style={{ marginLeft: '10px', padding: '5px', fontSize: '16px' }} 37 | /> 38 |
39 | 54 | 68 |
69 | Result: {result !== null ? result : 'N/A'} 70 |
71 |
72 | ); 73 | }; 74 | 75 | export default App; 76 | -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/src/App.test.js: -------------------------------------------------------------------------------- 1 | import { render, screen } from '@testing-library/react'; 2 | import App from './App'; 3 | 4 | test('renders learn react link', () => { 5 | render(); 6 | const linkElement = screen.getByText(/learn react/i); 7 | expect(linkElement).toBeInTheDocument(); 8 | }); 9 | -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | 9 | color: #5ed2f2; 10 | background-color: #2a2c2e; 11 | } 12 | 13 | code { 14 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 15 | monospace; 16 | } 17 | -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import './index.css'; 4 | import App from './App'; 5 | import reportWebVitals from './reportWebVitals'; 6 | 7 | const root = ReactDOM.createRoot(document.getElementById('root')); 8 | root.render( 9 | 10 | 11 | 12 | ); 13 | 14 | // If you want to start measuring performance in your app, pass a function 15 | // to log results (for example: reportWebVitals(console.log)) 16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 17 | reportWebVitals(); 18 | -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /examples/C/react/webui-react-example/src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /examples/C/react/webui_react.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/react/webui_react.png -------------------------------------------------------------------------------- /examples/C/serve_a_folder/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=gcc` / `make CC=clang` 20 | CC = gcc 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),gcc clang aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc musl-gcc),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C/serve_a_folder/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | # Windows - Microsoft Visual C 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C Example (Static Debug)... 24 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C Example (Dynamic Debug)... 28 | @copy "$(LIB_DIR)\debug\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 29 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 30 | # Clean 31 | @- del *.exp >nul 2>&1 32 | @- del *.ilk >nul 2>&1 33 | @- del *.lib >nul 2>&1 34 | @- del *.obj >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C Example (Static Release)... 44 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C Example (Dynamic Release)... 48 | @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 49 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 50 | # Clean 51 | @- del *.exp >nul 2>&1 52 | @- del *.ilk >nul 2>&1 53 | @- del *.lib >nul 2>&1 54 | @- del *.obj >nul 2>&1 55 | @- del *.pdb >nul 2>&1 56 | @echo Done. 57 | 58 | clean: 59 | - del *.obj >nul 2>&1 60 | - del *.ilk >nul 2>&1 61 | - del *.pdb >nul 2>&1 62 | - del *.exp >nul 2>&1 63 | - del *.exe >nul 2>&1 64 | - del *.lib >nul 2>&1 65 | -------------------------------------------------------------------------------- /examples/C/serve_a_folder/bun_test.ts: -------------------------------------------------------------------------------- 1 | // This file gets called like follow: 2 | // 3 | // 1. UI `Index.html` request: 4 | // `http://localhost:xxx/bun_test.ts?foo=123&bar=456` 5 | // 6 | // 2. WebUI runs command: 7 | // `bun run "bun_test.ts" "foo=123&bar=456"` 8 | // 9 | // 3. Bun parses args and prints the response 10 | 11 | // Get Query (HTTP GET) 12 | const args = process.argv.slice(2); 13 | const query = args[0]; 14 | 15 | // Variables 16 | let foo: string = ''; 17 | let bar: string = ''; 18 | 19 | // Read Query 20 | const params = new URLSearchParams(query); 21 | for (const [key, value] of params.entries()) { 22 | if (key === 'foo') foo = value; // 123 23 | else if (key === 'bar') bar = value; // 456 24 | } 25 | 26 | console.log('Response from Bun: ' + (parseInt(foo) + parseInt(bar))); // 579 27 | -------------------------------------------------------------------------------- /examples/C/serve_a_folder/deno_test.ts: -------------------------------------------------------------------------------- 1 | // This file gets called like follow: 2 | // 3 | // 1. UI `Index.html` request: 4 | // `http://localhost:xxx/deno_test.ts?foo=123&bar=456` 5 | // 6 | // 2. WebUI runs command: 7 | // `deno run --allow-all --unstable "deno_test.ts" "foo=123&bar=456"` 8 | // 9 | // 3. Deno parse args and print the response 10 | 11 | // Import parse() 12 | import { parse } from 'https://deno.land/std/flags/mod.ts'; 13 | 14 | // Get Query (HTTP GET) 15 | const args = parse(Deno.args); 16 | const query = args._[0] as string; 17 | 18 | // Variables 19 | let foo: string = ''; 20 | let bar: string = ''; 21 | 22 | // Read Query 23 | const params = new URLSearchParams(query); 24 | for (const [key, value] of params.entries()) { 25 | if (key == 'foo') foo = value; // 123 26 | else if (key == 'bar') bar = value; // 456 27 | } 28 | 29 | console.log('Response from Deno: ' + (parseInt(foo) + parseInt(bar))); // 579 30 | -------------------------------------------------------------------------------- /examples/C/serve_a_folder/node_test.js: -------------------------------------------------------------------------------- 1 | // This file gets called like follow: 2 | // 3 | // 1. UI `Index.html` request: 4 | // `http://localhost:xxx/node_test.js?foo=123&bar=456` 5 | // 6 | // 2. WebUI runs command: 7 | // `node node_test.js "foo=123&bar=456"` 8 | // 9 | // 3. Node.js parses args and prints the response 10 | 11 | // Get Query (HTTP GET) 12 | const args = process.argv.slice(2); 13 | const query = args[0]; 14 | 15 | // Variables 16 | let foo = ''; 17 | let bar = ''; 18 | 19 | // Read Query 20 | const params = new URLSearchParams(query); 21 | for (const [key, value] of params.entries()) { 22 | if (key === 'foo') foo = value; // 123 23 | else if (key === 'bar') bar = value; // 456 24 | } 25 | 26 | console.log('Response from Node.js: ' + (parseInt(foo) + parseInt(bar))); // 579 27 | -------------------------------------------------------------------------------- /examples/C/serve_a_folder/second.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | WebUI - Second Page (C) 6 | 39 | 40 | 41 |

This is the second page !

42 |
43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /examples/C/text-editor/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=gcc` / `make CC=clang` 20 | CC = gcc 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),gcc clang aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc musl-gcc),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C/text-editor/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | # Windows - Microsoft Visual C 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C Example (Static Debug)... 24 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C Example (Dynamic Debug)... 28 | @copy "$(LIB_DIR)\debug\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 29 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 30 | # Clean 31 | @- del *.exp >nul 2>&1 32 | @- del *.ilk >nul 2>&1 33 | @- del *.lib >nul 2>&1 34 | @- del *.obj >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C Example (Static Release)... 44 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C Example (Dynamic Release)... 48 | @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 49 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 50 | # Clean 51 | @- del *.exp >nul 2>&1 52 | @- del *.ilk >nul 2>&1 53 | @- del *.lib >nul 2>&1 54 | @- del *.obj >nul 2>&1 55 | @- del *.pdb >nul 2>&1 56 | @echo Done. 57 | 58 | clean: 59 | - del *.obj >nul 2>&1 60 | - del *.ilk >nul 2>&1 61 | - del *.pdb >nul 2>&1 62 | - del *.exp >nul 2>&1 63 | - del *.exe >nul 2>&1 64 | - del *.lib >nul 2>&1 65 | -------------------------------------------------------------------------------- /examples/C/text-editor/README.md: -------------------------------------------------------------------------------- 1 | # WebUI C - Text Editor 2 | 3 | This [text editor](https://github.com/webui-dev/webui/tree/main/examples/C/text-editor) is a lightweight and portable example written in C using WebUI as the GUI library. 4 | 5 |
6 | Example 7 |
8 | 9 | - **Windows** 10 | 11 | ```sh 12 | # GCC 13 | mingw32-make 14 | ``` 15 | 16 | - **Linux** 17 | 18 | ```sh 19 | # GCC 20 | make 21 | 22 | # Clang 23 | make CC=clang 24 | ``` 25 | 26 | - **macOS** 27 | ```sh 28 | make 29 | ``` 30 | -------------------------------------------------------------------------------- /examples/C/text-editor/main.c: -------------------------------------------------------------------------------- 1 | // Text Editor in C using WebUI 2 | 3 | #include "webui.h" 4 | 5 | void close_app(webui_event_t* e) { 6 | printf("Exit.\n"); 7 | 8 | // Close all opened windows 9 | webui_exit(); 10 | } 11 | 12 | int main() { 13 | 14 | // Create a new window 15 | int MainWindow = webui_new_window(); 16 | 17 | // Set the root folder for the UI 18 | webui_set_root_folder(MainWindow, "ui"); 19 | 20 | // Bind HTML elements with the specified ID to C functions 21 | webui_bind(MainWindow, "close_app", close_app); 22 | 23 | // Show the window, preferably in a chromium based browser 24 | if (!webui_show_browser(MainWindow, "index.html", AnyBrowser)) 25 | webui_show(MainWindow, "index.html"); 26 | 27 | // Wait until all windows get closed 28 | webui_wait(); 29 | 30 | // Free all memory resources (Optional) 31 | webui_clean(); 32 | 33 | return 0; 34 | } 35 | 36 | #if defined(_MSC_VER) 37 | int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { return main(); } 38 | #endif 39 | -------------------------------------------------------------------------------- /examples/C/text-editor/ui/css/lucario.css: -------------------------------------------------------------------------------- 1 | /* 2 | Name: lucario 3 | Author: Raphael Amorim 4 | Original Lucario color scheme (https://github.com/raphamorim/lucario) 5 | Modified for WebUI Text Editor. 6 | */ 7 | 8 | .cm-s-lucario.CodeMirror, .cm-s-lucario .CodeMirror-gutters { 9 | /* background-color: #2b3e50 !important; */ 10 | color: #f8f8f2 !important; 11 | border: none; 12 | background: #f8f9fa !important; 13 | background-color: rgba(0, 0, 0, .0) !important; 14 | } 15 | .cm-s-lucario .CodeMirror-gutters { color: #2b3e50; } 16 | .cm-s-lucario .CodeMirror-cursor { border-left: solid thin #E6C845; } 17 | .cm-s-lucario .CodeMirror-linenumber { color: #f8f8f2; background-color: rgba(0, 0, 0, .2) !important; } 18 | .cm-s-lucario .CodeMirror-selected { background: #243443; } 19 | .cm-s-lucario .CodeMirror-line::selection, .cm-s-lucario .CodeMirror-line > span::selection, .cm-s-lucario .CodeMirror-line > span > span::selection { background: #243443; } 20 | .cm-s-lucario .CodeMirror-line::-moz-selection, .cm-s-lucario .CodeMirror-line > span::-moz-selection, .cm-s-lucario .CodeMirror-line > span > span::-moz-selection { background: #243443; } 21 | .cm-s-lucario span.cm-comment { color: #5c98cd; } 22 | .cm-s-lucario span.cm-string, .cm-s-lucario span.cm-string-2 { color: #E6DB74; } 23 | .cm-s-lucario span.cm-number { color: #ca94ff; } 24 | .cm-s-lucario span.cm-variable { color: #f8f8f2; } 25 | .cm-s-lucario span.cm-variable-2 { color: #f8f8f2; } 26 | .cm-s-lucario span.cm-def { color: #72C05D; } 27 | .cm-s-lucario span.cm-operator { color: #66D9EF; } 28 | .cm-s-lucario span.cm-keyword { color: #ff6541; } 29 | .cm-s-lucario span.cm-atom { color: #bd93f9; } 30 | .cm-s-lucario span.cm-meta { color: #f8f8f2; } 31 | .cm-s-lucario span.cm-tag { color: #ff6541; } 32 | .cm-s-lucario span.cm-attribute { color: #66D9EF; } 33 | .cm-s-lucario span.cm-qualifier { color: #72C05D; } 34 | .cm-s-lucario span.cm-property { color: #f8f8f2; } 35 | .cm-s-lucario span.cm-builtin { color: #72C05D; } 36 | .cm-s-lucario span.cm-variable-3, .cm-s-lucario span.cm-type { color: #ffb86c; } 37 | .cm-s-lucario .CodeMirror-activeline-background { background: #243443; } 38 | .cm-s-lucario .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } 39 | .cm-s-lucario .CodeMirror-scroll { overflow: hidden; } 40 | -------------------------------------------------------------------------------- /examples/C/text-editor/ui/css/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | height: 100vh; 5 | font-family: 'Courier New', Courier, monospace; 6 | background-image: linear-gradient(to right top, #8e44ad 0%, #3498db 100%); 7 | background-repeat: no-repeat; 8 | background-position: center center; 9 | background-size: cover; 10 | background-attachment: fixed; 11 | color: #ddecf9; 12 | } 13 | 14 | .topbar { 15 | width: 100%; 16 | height: 4px; 17 | background-image: linear-gradient(to right, #4ed2e7 0%, #db57eb 50%, #f98818 100%); 18 | } 19 | 20 | header { 21 | color: #fff; 22 | } 23 | 24 | /* Nav */ 25 | 26 | nav { 27 | background: linear-gradient( 28 | 90deg, 29 | rgba(255, 255, 255, 0) 0%, 30 | rgba(255, 255, 255, 0.2) 25%, 31 | rgba(255, 255, 255, 0.2) 75%, 32 | rgba(255, 255, 255, 0) 100% 33 | ); 34 | box-shadow: 35 | 0 0 25px rgba(0, 0, 0, 0.1), 36 | inset 0 0 1px rgba(255, 255, 255, 0.6); 37 | text-align: center; 38 | } 39 | 40 | nav button { 41 | background: none; 42 | border: none; 43 | text-shadow: 1px 1px 2px #000000; 44 | font-family: 'Font Awesome 5 Free'; 45 | font-size: 18px; 46 | color: #ddecf9; 47 | cursor: pointer; 48 | margin: 0 auto; 49 | padding: 18px; 50 | } 51 | 52 | nav button:hover { 53 | box-shadow: 54 | 0 0 10px rgba(0, 0, 0, 0.1), 55 | inset 0 0 1px rgba(255, 255, 255, 0.6); 56 | background: rgba(255, 255, 255, 0.1); 57 | } 58 | 59 | nav #save-btn:disabled { 60 | pointer-events: none; 61 | color: #7ca0df; 62 | } 63 | 64 | nav button i { 65 | /* Click through the icon in the button */ 66 | pointer-events: none; 67 | } 68 | 69 | /* Code */ 70 | 71 | .main { 72 | padding: 0px; 73 | } 74 | 75 | /* About */ 76 | 77 | .about-box { 78 | display: none; 79 | position: fixed; 80 | z-index: 1; 81 | left: 0; 82 | top: 0; 83 | width: 100%; 84 | height: 100%; 85 | background-image: linear-gradient(to right top, #8e44ad 0%, #3498db 100%); 86 | } 87 | 88 | .about-box-content { 89 | background-image: linear-gradient(to right top, #8e44ad 0%, #3498db 100%); 90 | position: absolute; 91 | margin: 0; 92 | padding: 10px; 93 | width: 30%; 94 | border-radius: 5px; 95 | top: 50%; 96 | left: 50%; 97 | transform: translate(-50%, -50%); 98 | } 99 | 100 | .about-box-content h1 { 101 | text-align: center; 102 | } 103 | 104 | .about-box-content a { 105 | color: inherit; 106 | } 107 | 108 | .CodeMirror { 109 | height: 100%; 110 | font-family: 'Courier New', Courier, monospace; 111 | font-size: 16px; 112 | text-shadow: 1px 1px 2px #000000; 113 | } 114 | -------------------------------------------------------------------------------- /examples/C/text-editor/ui/img/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/text-editor/ui/img/icon.png -------------------------------------------------------------------------------- /examples/C/text-editor/ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Text Editor in C using WebUI 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 22 |
23 | 24 |
25 |
26 |
27 |

WebUI Text Editor

28 | v1.1 29 |

Example of a text editor software in C using WebUI library.

30 |

webui.me | (C)2025 Hassan Draga

31 |
32 |
33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /examples/C/text-editor/ui/js/ui.js: -------------------------------------------------------------------------------- 1 | // Text Editor 2 | 3 | // Elements 4 | const saveBtn = document.getElementById('save-btn'); 5 | const aboutBox = document.getElementById('about-box'); 6 | 7 | // File Handling 8 | const supportsFilePicker = 'showSaveFilePicker' in window; 9 | let fileHandle; 10 | let currentFile = { name: '', ext: '' }; 11 | 12 | // Setup Editor 13 | const codeMirrorInstance = CodeMirror.fromTextArea(document.getElementById('editor'), { 14 | mode: 'text/x-csrc', 15 | lineNumbers: true, 16 | tabSize: 4, 17 | indentUnit: 2, 18 | lineWrapping: true, 19 | theme: 'lucario', 20 | }); 21 | 22 | function setLanguage(extension) { 23 | let mode = ''; 24 | switch (extension) { 25 | case 'js': 26 | mode = 'text/javascript'; 27 | break; 28 | case 'c': 29 | case 'cpp': 30 | case 'h': 31 | mode = 'text/x-csrc'; 32 | break; 33 | case 'py': 34 | mode = 'text/x-python'; 35 | break; 36 | case 'html': 37 | mode = 'text/html'; 38 | break; 39 | default: 40 | mode = 'text/x-csrc'; 41 | } 42 | codeMirrorInstance.setOption('mode', mode); 43 | } 44 | 45 | function setFile(file) { 46 | currentFile.name = file.name; 47 | currentFile.ext = file.name.split('.').pop(); 48 | // Set file title and language in editor 49 | document.title = file.name; 50 | setLanguage(currentFile.ext); 51 | } 52 | 53 | function readFile(file) { 54 | const reader = new FileReader(); 55 | // Add text to the editor 56 | reader.onload = (e) => codeMirrorInstance.setValue(e.target.result); 57 | reader.readAsText(file); 58 | } 59 | 60 | async function openFile() { 61 | if (supportsFilePicker) { 62 | [fileHandle] = await showOpenFilePicker({ multiple: false }); 63 | fileData = await fileHandle.getFile(); 64 | readFile(fileData); 65 | setFile(fileData); 66 | } else { 67 | let input = document.createElement('input'); 68 | input.type = 'file'; 69 | input.onchange = (e) => { 70 | readFile(e.target.files[0]); 71 | setFile(e.target.files[0]); 72 | }; 73 | input.click(); 74 | input.remove(); 75 | } 76 | } 77 | 78 | async function saveFile() { 79 | const content = codeMirrorInstance.getValue(); 80 | if (supportsFilePicker) { 81 | if (fileHandle) { 82 | // Create a FileSystemWritableFileStream to write to 83 | const writableStream = await fileHandle.createWritable(); 84 | await writableStream.write(content); 85 | // Write to disk 86 | await writableStream.close(); 87 | } else { 88 | fileHandle = await showSaveFilePicker(); 89 | saveFile(); 90 | setFile(await fileHandle.getFile()); 91 | } 92 | } else { 93 | // Download the file if using filePicker with a fileHandle for saving 94 | // is not supported by the browser. E.g., in Firefox. 95 | const blobData = new Blob([content], { type: 'text/${currentFile.ext}' }); 96 | const urlToBlob = window.URL.createObjectURL(blobData); 97 | const a = document.createElement('a'); 98 | a.style.setProperty('display', 'none'); 99 | a.href = urlToBlob; 100 | a.download = document.title; 101 | a.click(); 102 | window.URL.revokeObjectURL(urlToBlob); 103 | a.remove(); 104 | } 105 | saveBtn.disabled = true; 106 | } 107 | 108 | // Navigation Events 109 | // open 110 | document.getElementById('open-btn').onclick = openFile; 111 | // save 112 | saveBtn.onclick = saveFile; 113 | // about 114 | document.getElementById('about-btn').onclick = () => (aboutBox.style.display = 'block'); // show 115 | aboutBox.onclick = () => (aboutBox.style.display = 'none'); // hide 116 | 117 | // Editor Events 118 | // enable save on change 119 | codeMirrorInstance.on('change', () => { 120 | saveBtn.disabled = false; 121 | }); 122 | window.addEventListener('DOMContentLoaded', () => { 123 | codeMirrorInstance.setSize('100%', '99%'); 124 | }); 125 | -------------------------------------------------------------------------------- /examples/C/text-editor/ui/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/text-editor/ui/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /examples/C/text-editor/ui/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/text-editor/ui/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /examples/C/text-editor/ui/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/text-editor/ui/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /examples/C/text-editor/ui/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/text-editor/ui/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /examples/C/text-editor/ui/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/text-editor/ui/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /examples/C/text-editor/ui/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/text-editor/ui/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /examples/C/text-editor/ui/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/text-editor/ui/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /examples/C/text-editor/ui/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/text-editor/ui/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /examples/C/text-editor/ui/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/text-editor/ui/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /examples/C/text-editor/ui/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/text-editor/ui/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /examples/C/text-editor/ui/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/text-editor/ui/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /examples/C/text-editor/ui/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webui-dev/webui/699119f42fc64ae42c9121bc4749b740f71949af/examples/C/text-editor/ui/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /examples/C/virtual_file_system/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=gcc` / `make CC=clang` 20 | CC = gcc 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),gcc clang aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc musl-gcc),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C/virtual_file_system/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | # Windows - Microsoft Visual C 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C Example (Static Debug)... 24 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C Example (Dynamic Debug)... 28 | @copy "$(LIB_DIR)\debug\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 29 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 30 | # Clean 31 | @- del *.exp >nul 2>&1 32 | @- del *.ilk >nul 2>&1 33 | @- del *.lib >nul 2>&1 34 | @- del *.obj >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C Example (Static Release)... 44 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C Example (Dynamic Release)... 48 | @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 49 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 50 | # Clean 51 | @- del *.exp >nul 2>&1 52 | @- del *.ilk >nul 2>&1 53 | @- del *.lib >nul 2>&1 54 | @- del *.obj >nul 2>&1 55 | @- del *.pdb >nul 2>&1 56 | @echo Done. 57 | 58 | clean: 59 | - del *.obj >nul 2>&1 60 | - del *.ilk >nul 2>&1 61 | - del *.pdb >nul 2>&1 62 | - del *.exp >nul 2>&1 63 | - del *.exe >nul 2>&1 64 | - del *.lib >nul 2>&1 65 | -------------------------------------------------------------------------------- /examples/C/virtual_file_system/main.c: -------------------------------------------------------------------------------- 1 | // Virtual File System Example 2 | 3 | #include "webui.h" 4 | #include "vfs.h" 5 | 6 | void exit_app(webui_event_t* e) { 7 | webui_exit(); 8 | } 9 | 10 | int main() { 11 | 12 | // Create new windows 13 | size_t MyWindow = webui_new_window(); 14 | 15 | // Bind HTML element IDs with a C functions 16 | webui_bind(MyWindow, "Exit", exit_app); 17 | 18 | // VSF (Virtual File System) Example 19 | // 20 | // 1. Run Python script to generate header file of a folder 21 | // python vfs.py "/path/to/folder" "vfs.h" 22 | // 23 | // 2. Include header file in your C project 24 | // #include "vfs.h" 25 | // 26 | // 3. use vfs in your custom files handler `webui_set_file_handler()` 27 | // webui_set_file_handler(MyWindow, vfs); 28 | 29 | // Set a custom files handler 30 | webui_set_file_handler(MyWindow, vfs); 31 | 32 | // Show a new window 33 | // webui_show_browser(MyWindow, "index.html", Chrome); 34 | webui_show(MyWindow, "index.html"); 35 | 36 | // Wait until all windows get closed 37 | webui_wait(); 38 | 39 | // Free all memory resources (Optional) 40 | webui_clean(); 41 | 42 | return 0; 43 | } 44 | 45 | #if defined(_MSC_VER) 46 | int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { return main(); } 47 | #endif 48 | -------------------------------------------------------------------------------- /examples/C/virtual_file_system/ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | WebUI - Virtual File System 6 | 52 | 53 | 54 |

Virtual File System Example

55 |
56 | 57 |
58 |

59 | This file is embedded in this application.
60 |

61 |

/sub

62 |
63 | 64 | 65 | 66 | 67 | 68 | 69 | 135 | 136 | -------------------------------------------------------------------------------- /examples/C/virtual_file_system/ui/sub/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | WebUI - Virtual File System 6 | 52 | 53 | 54 |

55 | This is another file embedded in this application.
56 |

57 |
58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /examples/C/virtual_file_system/ui/svg/webui.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /examples/C/web_app_multi_client/GNUmakefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | 3 | # == 1. VARIABLES ============================================================= 4 | 5 | MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 6 | PROJECT_DIR := $(dir $(MAKEFILE_PATH))/../../../ 7 | TARGET := $(firstword $(MAKECMDGOALS)) 8 | LIB_DIR := $(PROJECT_DIR)/dist 9 | ifeq ($(TARGET), debug) 10 | LIB_DIR := $(LIB_DIR)/debug 11 | endif 12 | INCLUDE_DIR := $(PROJECT_DIR)/include 13 | WEBUI_LIB_NAME = webui-2 14 | ifeq ($(WEBUI_USE_TLS), 1) 15 | WEBUI_LIB_NAME = webui-2-secure 16 | endif 17 | 18 | # ARGS 19 | # Set a compiler when running on Linux via `make CC=gcc` / `make CC=clang` 20 | CC = gcc 21 | # Build the WebUI library if running via `make BUILD_LIB=true` 22 | BUILD_LIB ?= 23 | 24 | # BUILD FLAGS 25 | STATIC_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 26 | DYN_BUILD_FLAGS = main.c -I"$(INCLUDE_DIR)" -L"$(LIB_DIR)" 27 | 28 | # Platform conditions 29 | ifeq ($(OS),Windows_NT) 30 | # Windows 31 | PLATFORM := windows 32 | SHELL := CMD 33 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lws2_32 -Wall -luser32 -static 34 | COPY_LIB_CMD := @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 35 | DYN_BUILD_FLAGS += "$(WEBUI_LIB_NAME).dll" -lws2_32 -Wall -luser32 36 | STATIC_OUT := main.exe 37 | DYN_OUT := main-dyn.exe 38 | LWS2_OPT := -lws2_32 -lole32 39 | STRIP_OPT := --strip-all 40 | CONSOLE_APP := -Wl,-subsystem=console 41 | GUI_APP := -Wl,-subsystem=windows 42 | else 43 | STATIC_BUILD_FLAGS += -l$(WEBUI_LIB_NAME)-static -lpthread -lm -ldl 44 | DYN_BUILD_FLAGS += -l$(WEBUI_LIB_NAME) -lpthread -lm -ldl 45 | STATIC_OUT := main 46 | DYN_OUT := main-dyn 47 | ifeq ($(shell uname),Darwin) 48 | # MacOS 49 | PLATFORM := macos 50 | CC = clang 51 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).dylib" "lib$(WEBUI_LIB_NAME).dylib" 52 | WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit 53 | else 54 | # Linux 55 | PLATFORM := linux 56 | COPY_LIB_CMD := @cp "$(LIB_DIR)/lib$(WEBUI_LIB_NAME).so" "lib$(WEBUI_LIB_NAME).so" 57 | STRIP_OPT := --strip-all 58 | ifeq ($(CC),clang) 59 | LLVM_OPT := llvm- 60 | endif 61 | endif 62 | endif 63 | 64 | # == 2.TARGETS ================================================================ 65 | 66 | all: release 67 | 68 | debug: --validate-args 69 | ifeq ($(BUILD_LIB),true) 70 | @cd "$(PROJECT_DIR)" && $(MAKE) debug 71 | endif 72 | # Static with Debug info 73 | ifneq ($(WEBUI_USE_TLS), 1) 74 | @echo "Build C Example ($(CC) debug static)..." 75 | @$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 76 | endif 77 | # Dynamic with Debug info 78 | @echo "Build C Example ($(CC) debug dynamic)..." 79 | $(COPY_LIB_CMD) 80 | @$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 81 | # Clean 82 | ifeq ($(PLATFORM),windows) 83 | @- del *.o >nul 2>&1 84 | else 85 | @- rm -f *.o 86 | @- rm -rf *.dSYM # macOS 87 | endif 88 | @echo "Done." 89 | 90 | release: --validate-args 91 | ifeq ($(BUILD_LIB),true) 92 | @cd "$(PROJECT_DIR)" && $(MAKE) 93 | endif 94 | # Static Release 95 | ifneq ($(WEBUI_USE_TLS), 1) 96 | @echo "Build C Example ($(CC) release static)..." 97 | @$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(STATIC_OUT) 98 | @$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT) 99 | endif 100 | # Dynamic Release 101 | @echo "Build C Example ($(CC) release dynamic)..." 102 | $(COPY_LIB_CMD) 103 | @$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS) -o $(DYN_OUT) 104 | @$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT) 105 | # Clean 106 | ifeq ($(PLATFORM),windows) 107 | @- del *.o >nul 2>&1 108 | else 109 | @- rm -f *.o 110 | @- rm -rf *.dSYM # macOS 111 | endif 112 | @echo "Done." 113 | 114 | clean: --clean-$(PLATFORM) 115 | 116 | # INTERNAL TARGETS 117 | 118 | --validate-args: 119 | ifneq ($(filter $(CC),gcc clang aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc musl-gcc),$(CC)) 120 | $(error Invalid compiler specified: `$(CC)`) 121 | endif 122 | 123 | --clean-linux: --clean-unix 124 | 125 | --clean-macos: --clean-unix 126 | 127 | --clean-unix: 128 | - rm -f *.o 129 | - rm -f *.a 130 | - rm -f *.so 131 | - rm -f *.dylib 132 | - rm -rf *.dSYM 133 | 134 | --clean-windows: 135 | - del *.o >nul 2>&1 136 | - del *.dll >nul 2>&1 137 | - del *.a >nul 2>&1 138 | - del *.exe >nul 2>&1 139 | -------------------------------------------------------------------------------- /examples/C/web_app_multi_client/Makefile: -------------------------------------------------------------------------------- 1 | # WebUI C Example 2 | # Windows - Microsoft Visual C 3 | 4 | SHELL = CMD 5 | LIB_DIR = ../../../dist 6 | INCLUDE_DIR = ../../../include 7 | WEBUI_LIB_NAME = webui-2 8 | !IF "$(WEBUI_USE_TLS)" == "1" 9 | WEBUI_LIB_NAME = webui-2-secure 10 | !ENDIF 11 | 12 | # Build the WebUI library if running `nmake BUILD_LIB=true` 13 | BUILD_LIB = 14 | 15 | all: release 16 | 17 | debug: 18 | !IF "$(BUILD_LIB)" == "true" 19 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) debug 20 | !ENDIF 21 | # Static with Debug info 22 | !IF "$(WEBUI_USE_TLS)" != "1" 23 | @echo Build C Example (Static Debug)... 24 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 25 | !ENDIF 26 | # Dynamic with Debug info 27 | @echo Build C Example (Dynamic Debug)... 28 | @copy "$(LIB_DIR)\debug\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 29 | @cl /Zi main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)\debug" /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 30 | # Clean 31 | @- del *.exp >nul 2>&1 32 | @- del *.ilk >nul 2>&1 33 | @- del *.lib >nul 2>&1 34 | @- del *.obj >nul 2>&1 35 | @echo Done. 36 | 37 | release: 38 | !IF "$(BUILD_LIB)" == "true" 39 | @cd "$(LIB_DIR)" && cd .. && $(MAKE) 40 | !ENDIF 41 | # Static Release 42 | !IF "$(WEBUI_USE_TLS)" != "1" 43 | @echo Build C Example (Static Release)... 44 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main.exe 1>NUL 2>&1 45 | !ENDIF 46 | # Dynamic Release 47 | @echo Build C Example (Dynamic Release)... 48 | @copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll" 49 | @cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:main-dyn.exe 1>NUL 2>&1 50 | # Clean 51 | @- del *.exp >nul 2>&1 52 | @- del *.ilk >nul 2>&1 53 | @- del *.lib >nul 2>&1 54 | @- del *.obj >nul 2>&1 55 | @- del *.pdb >nul 2>&1 56 | @echo Done. 57 | 58 | clean: 59 | - del *.obj >nul 2>&1 60 | - del *.ilk >nul 2>&1 61 | - del *.pdb >nul 2>&1 62 | - del *.exp >nul 2>&1 63 | - del *.exe >nul 2>&1 64 | - del *.lib >nul 2>&1 65 | -------------------------------------------------------------------------------- /examples/C/web_app_multi_client/main.c: -------------------------------------------------------------------------------- 1 | // Web App Multi-Client Example 2 | 3 | #include "webui.h" 4 | 5 | // Arrays to hold permanent data 6 | char privateInput_arr[256][1024] = {0}; // One for each user 7 | char publicInput_arr[1024] = {0}; // One for all users 8 | int users_count = 0; 9 | int tab_count = 0; 10 | 11 | void exit_app(webui_event_t* e) { 12 | // Close all opened windows 13 | webui_exit(); 14 | } 15 | 16 | void save(webui_event_t* e) { 17 | // Get input value 18 | const char* privateInput = webui_get_string(e); 19 | // Save it in the array 20 | snprintf(privateInput_arr[e->client_id], 1024, "%s", privateInput); 21 | } 22 | 23 | void saveAll(webui_event_t* e) { 24 | // Get input value 25 | const char* publicInput = webui_get_string(e); 26 | // Save it in the array 27 | snprintf(publicInput_arr, 1024, "%s", publicInput); 28 | // Update all users 29 | char buffer[512] = {0}; 30 | snprintf(buffer, sizeof(buffer), "document.getElementById(\"publicInput\").value = \"%s\";", publicInput); 31 | webui_run(e->window, buffer); 32 | } 33 | 34 | void events(webui_event_t* e) { 35 | 36 | // This function gets called every time 37 | // there is an event 38 | 39 | // Full web browser cookies 40 | const char* cookies = e->cookies; 41 | 42 | // Static client (Based on web browser cookies) 43 | size_t client_id = e->client_id; 44 | 45 | // Dynamic client connection ID (Changes on connect/disconnect events) 46 | size_t connection_id = e->connection_id; 47 | 48 | if (e->event_type == WEBUI_EVENT_CONNECTED) { 49 | // New connection 50 | if (users_count < (client_id + 1)) { // +1 because it start from 0 51 | users_count = (client_id + 1); 52 | } 53 | tab_count++; 54 | } 55 | else if (e->event_type == WEBUI_EVENT_DISCONNECTED) { 56 | // Disconnection 57 | if (tab_count > 0) 58 | tab_count--; 59 | } 60 | 61 | // Buffer 62 | char buffer[512] = {0}; 63 | 64 | // Update this current user only 65 | 66 | // status 67 | webui_run_client(e, "document.getElementById(\"status\").innerText = \"Connected!\";"); 68 | 69 | // userNumber 70 | snprintf(buffer, sizeof(buffer), "document.getElementById(\"userNumber\").innerText = \"%zu\";", client_id); 71 | webui_run_client(e, buffer); 72 | 73 | // connectionNumber 74 | snprintf(buffer, sizeof(buffer), "document.getElementById(\"connectionNumber\").innerText = \"%zu\";", connection_id); 75 | webui_run_client(e, buffer); 76 | 77 | // privateInput 78 | snprintf(buffer, sizeof(buffer), "document.getElementById(\"privateInput\").value = \"%s\";", privateInput_arr[client_id]); 79 | webui_run_client(e, buffer); 80 | 81 | // publicInput 82 | snprintf(buffer, sizeof(buffer), "document.getElementById(\"publicInput\").value = \"%s\";", publicInput_arr); 83 | webui_run_client(e, buffer); 84 | 85 | // Update all connected users 86 | 87 | // userCount 88 | snprintf(buffer, sizeof(buffer), "document.getElementById(\"userCount\").innerText = \"%d\";", users_count); 89 | webui_run(e->window, buffer); 90 | 91 | // tabCount 92 | snprintf(buffer, sizeof(buffer), "document.getElementById(\"tabCount\").innerText = \"%d\";", tab_count); 93 | webui_run(e->window, buffer); 94 | } 95 | 96 | int main() { 97 | 98 | // Allow multi-user connection 99 | webui_set_config(multi_client, true); 100 | 101 | // Allow cookies 102 | webui_set_config(use_cookies, true); 103 | 104 | // Create new window 105 | size_t win = webui_new_window(); 106 | 107 | // Bind HTML with a C functions 108 | webui_bind(win, "save", save); 109 | webui_bind(win, "saveAll", saveAll); 110 | webui_bind(win, "exit_app", exit_app); 111 | 112 | // Bind all events 113 | webui_bind(win, "", events); 114 | 115 | // Start server only 116 | const char* url = webui_start_server(win, "index.html"); 117 | 118 | // Open a new page in the default native web browser 119 | webui_open_url(url); 120 | 121 | // Wait until all windows get closed 122 | webui_wait(); 123 | 124 | // Free all memory resources (Optional) 125 | webui_clean(); 126 | 127 | return 0; 128 | } 129 | 130 | #if defined(_MSC_VER) 131 | int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { return main(); } 132 | #endif 133 | -------------------------------------------------------------------------------- /src/civetweb/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.10) 2 | project(civetweb) 3 | 4 | # Source files 5 | set(SOURCE_FILES 6 | civetweb.c 7 | civetweb.h 8 | handle_form.inl 9 | match.inl 10 | md5.inl 11 | response.inl 12 | sha1.inl 13 | sort.inl 14 | ) 15 | 16 | # The C API library 17 | add_library(civetweb ${SOURCE_FILES}) 18 | 19 | # Include directories 20 | target_include_directories(civetweb PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) 21 | 22 | # Link libraries 23 | find_package(Threads REQUIRED) 24 | target_link_libraries(civetweb Threads::Threads) 25 | 26 | # If on Windows, link with WinSock 27 | if(WIN32) 28 | target_link_libraries(civetweb ws2_32) 29 | endif() 30 | -------------------------------------------------------------------------------- /src/civetweb/README.md: -------------------------------------------------------------------------------- 1 | Changes currently required when updating the submodule to ensure full direct interoperability for wrappers: 2 | 3 | - Prevent warnings for e.g. `malloc` and `snprintf` usage outside civetweb. 4 | 5 | ```diff 6 | + // Disable All Warnings 7 | + #ifdef _MSC_VER 8 | + #pragma warning(push, 0) 9 | + #pragma warning(disable: 4996) 10 | + #elif defined(__clang__) 11 | + #pragma clang system_header 12 | + #elif defined(__GNUC__) 13 | + #pragma GCC system_header 14 | + #endif 15 | 16 | /* Copyright (c) 2013-2024 the Civetweb developers 17 | ``` -------------------------------------------------------------------------------- /src/civetweb/sort.inl: -------------------------------------------------------------------------------- 1 | /* Sort function. */ 2 | /* from https://github.com/bel2125/sort_r */ 3 | 4 | static void 5 | mg_sort(void *data, 6 | size_t elemcount, 7 | size_t elemsize, 8 | int (*compfunc)(const void *data1, const void *data2, void *userarg), 9 | void *userarg) 10 | { 11 | /* We cannot use qsort_r here. For a detailed reason, see 12 | * https://github.com/civetweb/civetweb/issues/1048#issuecomment-1047093014 13 | * https://stackoverflow.com/questions/39560773/different-declarations-of-qsort-r-on-mac-and-linux 14 | */ 15 | 16 | /* We use ShellSort here with this gap sequence: https://oeis.org/A102549 */ 17 | size_t A102549[9] = {1, 4, 10, 23, 57, 132, 301, 701, 1750}; 18 | size_t gap, i, j, k; 19 | int Aidx; 20 | void *tmp = alloca(elemsize); 21 | 22 | for (Aidx = 8; Aidx >= 0; Aidx--) { 23 | gap = A102549[Aidx]; 24 | if (gap > (elemcount / 2)) { 25 | continue; 26 | } 27 | for (i = 0; i < gap; i++) { 28 | for (j = i; j < elemcount; j += gap) { 29 | memcpy(tmp, (void *)((size_t)data + elemsize * j), elemsize); 30 | 31 | for (k = j; k >= gap; k -= gap) { 32 | void *cmp = (void *)((size_t)data + elemsize * (k - gap)); 33 | int cmpres = compfunc(cmp, tmp, userarg); 34 | if (cmpres > 0) { 35 | memcpy((void *)((size_t)data + elemsize * k), 36 | cmp, 37 | elemsize); 38 | } else { 39 | break; 40 | } 41 | } 42 | memcpy((void *)((size_t)data + elemsize * k), tmp, elemsize); 43 | } 44 | } 45 | } 46 | } 47 | 48 | /* end if sort.inl */ 49 | -------------------------------------------------------------------------------- /src/webview/EventToken.h: -------------------------------------------------------------------------------- 1 | 2 | 3 | /* this ALWAYS GENERATED file contains the definitions for the interfaces */ 4 | 5 | 6 | /* File created by MIDL compiler version 8.01.0622 */ 7 | /* @@MIDL_FILE_HEADING( ) */ 8 | 9 | 10 | 11 | /* verify that the version is high enough to compile this file*/ 12 | #ifndef __REQUIRED_RPCNDR_H_VERSION__ 13 | #define __REQUIRED_RPCNDR_H_VERSION__ 500 14 | #endif 15 | 16 | /* verify that the version is high enough to compile this file*/ 17 | #ifndef __REQUIRED_RPCSAL_H_VERSION__ 18 | #define __REQUIRED_RPCSAL_H_VERSION__ 100 19 | #endif 20 | 21 | #include "rpc.h" 22 | #include "rpcndr.h" 23 | 24 | #ifndef __RPCNDR_H_VERSION__ 25 | #error this stub requires an updated version of 26 | #endif /* __RPCNDR_H_VERSION__ */ 27 | 28 | 29 | #ifndef __eventtoken_h__ 30 | #define __eventtoken_h__ 31 | 32 | #if defined(_MSC_VER) && (_MSC_VER >= 1020) 33 | #pragma once 34 | #endif 35 | 36 | /* Forward Declarations */ 37 | 38 | #ifdef __cplusplus 39 | extern "C"{ 40 | #endif 41 | 42 | 43 | /* interface __MIDL_itf_eventtoken_0000_0000 */ 44 | /* [local] */ 45 | 46 | // Microsoft Windows 47 | // Copyright (c) Microsoft Corporation. All rights reserved. 48 | #pragma once 49 | typedef struct EventRegistrationToken 50 | { 51 | __int64 value; 52 | } EventRegistrationToken; 53 | 54 | 55 | 56 | extern RPC_IF_HANDLE __MIDL_itf_eventtoken_0000_0000_v0_0_c_ifspec; 57 | extern RPC_IF_HANDLE __MIDL_itf_eventtoken_0000_0000_v0_0_s_ifspec; 58 | 59 | /* Additional Prototypes for ALL interfaces */ 60 | 61 | /* end of Additional Prototypes */ 62 | 63 | #ifdef __cplusplus 64 | } 65 | #endif 66 | 67 | #endif 68 | 69 | 70 | -------------------------------------------------------------------------------- /src/webview/README.md: -------------------------------------------------------------------------------- 1 | Changes currently required when updating the submodule to ensure full direct interoperability for wrappers: 2 | 3 | - Prevent warnings. 4 | 5 | ```diff 6 | + // Disable All Warnings 7 | + #ifdef _MSC_VER 8 | + #pragma warning(push, 0) 9 | + #pragma warning(disable: 4996) 10 | + #elif defined(__clang__) 11 | + #pragma clang system_header 12 | + #elif defined(__GNUC__) 13 | + #pragma GCC system_header 14 | + #endif 15 | 16 | /* this ALWAYS GENERATED file contains the definitions for the interfaces */ 17 | ``` 18 | -------------------------------------------------------------------------------- /vcpkg.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webui", 3 | "version": "2.5.0-beta.4", 4 | "description": "Use any web browser or WebView as GUI, with your preferred language in the backend and modern web technologies in the frontend, all in a lightweight portable library.", 5 | "license": "MIT", 6 | "homepage": "https://webui.me", 7 | "dependencies": [ 8 | { 9 | "name": "webview2", 10 | "platform": "windows" 11 | }, 12 | { 13 | "name": "vcpkg-cmake", 14 | "host": true 15 | }, 16 | { 17 | "name": "vcpkg-cmake-config", 18 | "host": true 19 | } 20 | ], 21 | "features": { 22 | "tls": { 23 | "description": "Enable TLS support", 24 | "dependencies": [{ 25 | "name": "openssl", 26 | "version>=": "3.0.0" 27 | }] 28 | } 29 | } 30 | } 31 | --------------------------------------------------------------------------------