├── .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 | Manual Count
80 |
81 | Auto Count (Every 10ms)
82 |
83 | Exit
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 |
30 |
31 | Switch to The Second Page Programmatically
32 |
33 |
34 | Open The Second Window
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 | Call Exit()
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 |
16 | Call my_backend_func()
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 |
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 | " Exit "
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 | 
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 | You need to enable JavaScript to run this app.
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 |
19 | Input 1:
20 |
21 | setValue1(e.target.value)}
25 | style={{ marginLeft: '10px', padding: '5px', fontSize: '16px' }}
26 | />
27 |
28 |
29 |
30 | Input 2:
31 |
32 | setValue2(e.target.value)}
36 | style={{ marginLeft: '10px', padding: '5px', fontSize: '16px' }}
37 | />
38 |
39 |
52 | Calculate (React Frontend)
53 |
54 |
66 | Exit (WebUI Backend)
67 |
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 | Call Exit()
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 |
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 |
17 |
18 |
19 |
20 |
21 |
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 |
62 |
63 | Exit
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 | Exit
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 |
--------------------------------------------------------------------------------