Skip to content

Commit c063f07

Browse files
committed
New example - Public network access
1 parent ff6fdb1 commit c063f07

3 files changed

Lines changed: 327 additions & 0 deletions

File tree

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
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
39+
STRIP_OPT := --strip-all
40+
CONSOLE_APP := -Wl,-subsystem=console
41+
GUI_APP := -Wl,-subsystem=windows
42+
else
43+
STATIC_BUILD_FLAGS += -lpthread -lm -l$(WEBUI_LIB_NAME)-static
44+
DYN_BUILD_FLAGS += -lpthread -lm
45+
STATIC_OUT := main
46+
DYN_OUT := main-dyn
47+
CONSOLE_APP :=
48+
GUI_APP :=
49+
ifeq ($(shell uname),Darwin)
50+
# MacOS
51+
PLATFORM := macos
52+
CC = clang
53+
COPY_LIB_CMD := @cp "$(LIB_DIR)/$(WEBUI_LIB_NAME).dylib" "$(WEBUI_LIB_NAME).dylib"
54+
DYN_BUILD_FLAGS += "./$(WEBUI_LIB_NAME).dylib"
55+
else
56+
# Linux
57+
PLATFORM := linux
58+
COPY_LIB_CMD := @cp "$(LIB_DIR)/$(WEBUI_LIB_NAME).so" "$(WEBUI_LIB_NAME).so"
59+
DYN_BUILD_FLAGS += "./$(WEBUI_LIB_NAME).so"
60+
STRIP_OPT := --strip-all
61+
ifeq ($(CC),clang)
62+
LLVM_OPT := llvm-
63+
endif
64+
endif
65+
endif
66+
67+
# == 2.TARGETS ================================================================
68+
69+
all: release
70+
71+
debug: --validate-args
72+
ifeq ($(BUILD_LIB),true)
73+
@cd "$(PROJECT_DIR)" && $(MAKE) debug
74+
endif
75+
# Static with Debug info
76+
ifneq ($(WEBUI_USE_TLS), 1)
77+
@echo "Build C Example ($(CC) debug static)..."
78+
@$(CC) -g $(CONSOLE_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) -o $(STATIC_OUT)
79+
endif
80+
# Dynamic with Debug info
81+
@echo "Build C Example ($(CC) debug dynamic)..."
82+
$(COPY_LIB_CMD)
83+
@$(CC) -g $(CONSOLE_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) -o $(DYN_OUT)
84+
# Clean
85+
ifeq ($(PLATFORM),windows)
86+
@- del *.o >nul 2>&1
87+
else
88+
@- rm -f *.o
89+
@- rm -rf *.dSYM # macOS
90+
endif
91+
@echo "Done."
92+
93+
release: --validate-args
94+
ifeq ($(BUILD_LIB),true)
95+
@cd "$(PROJECT_DIR)" && $(MAKE)
96+
endif
97+
# Static Release
98+
ifneq ($(WEBUI_USE_TLS), 1)
99+
@echo "Build C Example ($(CC) release static)..."
100+
@$(CC) -Os $(GUI_APP) $(STATIC_BUILD_FLAGS) $(LWS2_OPT) -o $(STATIC_OUT)
101+
@$(LLVM_OPT)strip $(STRIP_OPT) $(STATIC_OUT)
102+
endif
103+
# Dynamic Release
104+
@echo "Build C Example ($(CC) release dynamic)..."
105+
$(COPY_LIB_CMD)
106+
@$(CC) $(GUI_APP) $(DYN_BUILD_FLAGS) $(LWS2_OPT) -o $(DYN_OUT)
107+
@$(LLVM_OPT)strip $(STRIP_OPT) $(DYN_OUT)
108+
# Clean
109+
ifeq ($(PLATFORM),windows)
110+
@- del *.o >nul 2>&1
111+
else
112+
@- rm -f *.o
113+
@- rm -rf *.dSYM # macOS
114+
endif
115+
@echo "Done."
116+
117+
clean: --clean-$(PLATFORM)
118+
119+
# INTERNAL TARGETS
120+
121+
--validate-args:
122+
ifneq ($(filter $(CC),gcc clang aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc musl-gcc),$(CC))
123+
$(error Invalid compiler specified: `$(CC)`)
124+
endif
125+
126+
--clean-linux: --clean-unix
127+
128+
--clean-macos: --clean-unix
129+
130+
--clean-unix:
131+
- rm -f *.o
132+
- rm -f *.a
133+
- rm -f *.so
134+
- rm -f *.dylib
135+
- rm -rf *.dSYM
136+
137+
--clean-windows:
138+
- del *.o >nul 2>&1
139+
- del *.dll >nul 2>&1
140+
- del *.a >nul 2>&1
141+
- del *.exe >nul 2>&1
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
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" /MACHINE:X64 /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.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" /MACHINE:X64 /SUBSYSTEM:CONSOLE $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.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+
@- del *.pdb >nul 2>&1
36+
@echo Done.
37+
38+
release:
39+
!IF "$(BUILD_LIB)" == "true"
40+
@cd "$(LIB_DIR)" && cd .. && $(MAKE)
41+
!ENDIF
42+
# Static Release
43+
!IF "$(WEBUI_USE_TLS)" != "1"
44+
@echo Build C Example (Static Release)...
45+
@cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /MACHINE:X64 /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME)-static.lib user32.lib Advapi32.lib Shell32.lib /OUT:main.exe 1>NUL 2>&1
46+
!ENDIF
47+
# Dynamic Release
48+
@echo Build C Example (Dynamic Release)...
49+
@copy "$(LIB_DIR)\$(WEBUI_LIB_NAME).dll" "$(WEBUI_LIB_NAME).dll"
50+
@cl main.c /I"$(INCLUDE_DIR)" /link /LIBPATH:"$(LIB_DIR)" /MACHINE:X64 /SUBSYSTEM:WINDOWS $(WEBUI_LIB_NAME).lib user32.lib Advapi32.lib Shell32.lib /OUT:main-dyn.exe 1>NUL 2>&1
51+
# Clean
52+
@- del *.exp >nul 2>&1
53+
@- del *.ilk >nul 2>&1
54+
@- del *.lib >nul 2>&1
55+
@- del *.obj >nul 2>&1
56+
@- del *.pdb >nul 2>&1
57+
@echo Done.
58+
59+
clean:
60+
- del *.obj >nul 2>&1
61+
- del *.ilk >nul 2>&1
62+
- del *.pdb >nul 2>&1
63+
- del *.exp >nul 2>&1
64+
- del *.exe >nul 2>&1
65+
- del *.lib >nul 2>&1
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
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+
int main() {
25+
26+
// Main Private Window HTML
27+
const char* private_html = "<!DOCTYPE html>"
28+
"<html>"
29+
" <head>"
30+
" <meta charset=\"UTF-8\">"
31+
" <script src=\"webui.js\"></script>"
32+
" <title>Public Network Access Example</title>"
33+
" <style>"
34+
" body {"
35+
" font-family: 'Arial', sans-serif;"
36+
" color: white;"
37+
" background: linear-gradient(to right, #507d91, #1c596f, #022737);"
38+
" text-align: center;"
39+
" font-size: 18px;"
40+
" }"
41+
" button, input {"
42+
" padding: 10px;"
43+
" margin: 10px;"
44+
" border-radius: 3px;"
45+
" border: 1px solid #ccc;"
46+
" box-shadow: 0 3px 5px rgba(0,0,0,0.1);"
47+
" transition: 0.2s;"
48+
" }"
49+
" button {"
50+
" background: #3498db;"
51+
" color: #fff; "
52+
" cursor: pointer;"
53+
" font-size: 16px;"
54+
" }"
55+
" h1 { text-shadow: -7px 10px 7px rgb(67 57 57 / 76%); }"
56+
" button:hover { background: #c9913d; }"
57+
" input:focus { outline: none; border-color: #3498db; }"
58+
" </style>"
59+
" </head>"
60+
" <body>"
61+
" <h1>WebUI - Public Network Access Example</h1>"
62+
" <br>"
63+
" The second public window is configured to be accessible from <br>"
64+
" any device in the public network. <br>"
65+
" <br>"
66+
" Second public window link: <br>"
67+
" <h1 id=\"urlSpan\" style=\"color:#c9913d\">...</h1>"
68+
" Second public window events: <br>"
69+
" <textarea id=\"Logs\" rows=\"4\" cols=\"50\" style=\"width:80%\"></textarea>"
70+
" <br>"
71+
" <button id=\"Exit\">Exit</button>"
72+
" </body>"
73+
"</html>";
74+
75+
// Public Window HTML
76+
const char* public_html = "<!DOCTYPE html>"
77+
"<html>"
78+
" <head>"
79+
" <meta charset=\"UTF-8\">"
80+
" <script src=\"webui.js\"></script>"
81+
" <title>Welcome to Public UI</title>"
82+
" </head>"
83+
" <body>"
84+
" <h1>Welcome to Public UI!</h1>"
85+
" </body>"
86+
"</html>";
87+
88+
// Create windows
89+
private_window = webui_new_window();
90+
public_window = webui_new_window();
91+
92+
// App
93+
webui_set_timeout(0); // Wait forever (never timeout)
94+
95+
// Public Window
96+
webui_set_public(public_window, true); // Make URL accessible from public networks
97+
webui_bind(public_window, "", public_window_events); // Bind all events
98+
webui_show_browser(public_window, public_html, NoBrowser); // Set public window HTML
99+
const char* public_win_url = webui_get_url(public_window); // Get URL of public window
100+
101+
// Main Private Window
102+
webui_bind(private_window, "Exit", app_exit); // Bind exit button
103+
webui_show(private_window, private_html); // Show the window
104+
105+
// Set URL in the UI
106+
char javascript[1024];
107+
sprintf(javascript, "document.getElementById('urlSpan').innerHTML = '%s';", public_win_url);
108+
webui_run(private_window, javascript);
109+
110+
// Wait until all windows get closed
111+
webui_wait();
112+
113+
// Free all memory resources (Optional)
114+
webui_clean();
115+
116+
return 0;
117+
}
118+
119+
#if defined(_MSC_VER)
120+
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { return main(); }
121+
#endif

0 commit comments

Comments
 (0)