mirror of
https://github.com/webui-dev/webui
synced 2025-03-28 21:13:17 +00:00
Compare commits
940 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
9dd20b5c98 | ||
![]() |
65fd9a8800 | ||
![]() |
3c03d4f45c | ||
![]() |
1f80350564 | ||
![]() |
4c8fc25b2d | ||
![]() |
b59ddf1c0c | ||
![]() |
5fafc9b6b6 | ||
![]() |
995f1ab25f | ||
![]() |
d274723ec6 | ||
![]() |
9430e57040 | ||
![]() |
78b163c350 | ||
![]() |
af455d38ee | ||
![]() |
5c52beebfb | ||
![]() |
ea5e9a57fc | ||
![]() |
c50fcdf5da | ||
![]() |
433dcc25e0 | ||
![]() |
c66b71a98c | ||
![]() |
f21f4f14e1 | ||
![]() |
84758f6742 | ||
![]() |
aec0f654ba | ||
![]() |
ed3aae5790 | ||
![]() |
d2b40ee7e6 | ||
![]() |
25c7e3f16c | ||
![]() |
361237669b | ||
![]() |
c6d5b58352 | ||
![]() |
7e257de1b0 | ||
![]() |
16aec7e181 | ||
![]() |
5415b19b5f | ||
![]() |
c9baba76b7 | ||
![]() |
f4b9043288 | ||
![]() |
facd97c107 | ||
![]() |
223608479b | ||
![]() |
305070eeb1 | ||
![]() |
7d310a7c1f | ||
![]() |
d58e04ff05 | ||
![]() |
1b2f7b637b | ||
![]() |
dacbfcd257 | ||
![]() |
b1595c766c | ||
![]() |
130a26cc21 | ||
![]() |
8bf01b0d3e | ||
![]() |
3a959d0402 | ||
![]() |
6cca39ecac | ||
![]() |
e019f00fad | ||
![]() |
fcd903d424 | ||
![]() |
6b61f311c8 | ||
![]() |
7dddb64d92 | ||
![]() |
bf1c8ada92 | ||
![]() |
e558709118 | ||
![]() |
b6457c88bb | ||
![]() |
8d9c6b275b | ||
![]() |
5ac66da94b | ||
![]() |
92324edf6f | ||
![]() |
9926908e4b | ||
![]() |
fd716ddcac | ||
![]() |
ef5df7f28c | ||
![]() |
5d497e3b83 | ||
![]() |
02328acc6d | ||
![]() |
b4ce0284ae | ||
![]() |
61444bfaa7 | ||
![]() |
70b6689106 | ||
![]() |
7b661f142b | ||
![]() |
72039fa0ca | ||
![]() |
bd2611ba60 | ||
![]() |
93ec28addb | ||
![]() |
52c1777c77 | ||
![]() |
3734f9fe9f | ||
![]() |
fb29c6cac4 | ||
![]() |
18b5d14f8e | ||
![]() |
f4e327208f | ||
![]() |
8c58fcb973 | ||
![]() |
8f5a306574 | ||
![]() |
e92f9b7824 | ||
![]() |
c386758414 | ||
![]() |
0f8925e358 | ||
![]() |
44971f9bca | ||
![]() |
8fa1fdb89d | ||
![]() |
cdebbfee0a | ||
![]() |
bf94687089 | ||
![]() |
36676f68ff | ||
![]() |
56f1e4eb2b | ||
![]() |
553e65e218 | ||
![]() |
d9af5b2c17 | ||
![]() |
27c877f73f | ||
![]() |
c9c7562496 | ||
![]() |
1594f9e40d | ||
![]() |
133da5072b | ||
![]() |
8eb49857c1 | ||
![]() |
6c299e49ed | ||
![]() |
ad869075d2 | ||
![]() |
0d8ed71a8a | ||
![]() |
c512af1e6c | ||
![]() |
63284fe2a7 | ||
![]() |
f2961585e2 | ||
![]() |
fb5c2ab616 | ||
![]() |
c52ac5fc4a | ||
![]() |
3ff8742f3e | ||
![]() |
27088bd5d2 | ||
![]() |
8a7ea878b5 | ||
![]() |
2d3a68ebea | ||
![]() |
1eb06bb0c7 | ||
![]() |
ddc94db8db | ||
![]() |
0268c3723b | ||
![]() |
7f60505709 | ||
![]() |
f412473dca | ||
![]() |
728cd8370d | ||
![]() |
0a088943d5 | ||
![]() |
cdda40df5f | ||
![]() |
2adfee2e04 | ||
![]() |
c05a18a2f4 | ||
![]() |
9e68b911ae | ||
![]() |
5486cb4e9c | ||
![]() |
2e9d65d2bc | ||
![]() |
c9087c35b1 | ||
![]() |
4dcf4ce07c | ||
![]() |
e0b09e3a49 | ||
![]() |
d7a87ed6f9 | ||
![]() |
737ee76cbc | ||
![]() |
b6f70527be | ||
![]() |
c9abbc9cdb | ||
![]() |
d695c5b8fc | ||
![]() |
d757120977 | ||
![]() |
0ff3b1351b | ||
![]() |
41497e1a52 | ||
![]() |
ef18fdc772 | ||
![]() |
09128cefb0 | ||
![]() |
0f4cf1a4b8 | ||
![]() |
734f00aaac | ||
![]() |
3c9137eef5 | ||
![]() |
6511bc56d8 | ||
![]() |
2a5a449900 | ||
![]() |
a3ea3619ee | ||
![]() |
a509155eaf | ||
![]() |
9d2b80d3b3 | ||
![]() |
e67788ad70 | ||
![]() |
9814a18e0a | ||
![]() |
7189093a5d | ||
![]() |
7156f6a1e2 | ||
![]() |
4a67f91554 | ||
![]() |
e01fb64666 | ||
![]() |
984de15efa | ||
![]() |
3084ff3e26 | ||
![]() |
2a406f5276 | ||
![]() |
8fc3d1a39a | ||
![]() |
89a54eb621 | ||
![]() |
39628742aa | ||
![]() |
f59d0463e0 | ||
![]() |
6e7b0dacb2 | ||
![]() |
be972b50a4 | ||
![]() |
ed77621974 | ||
![]() |
e8863a06c1 | ||
![]() |
09cfb561d1 | ||
![]() |
5273ef3925 | ||
![]() |
dc82dabf3b | ||
![]() |
39095cea86 | ||
![]() |
a44283b04d | ||
![]() |
5a710c29ce | ||
![]() |
387bebe2c1 | ||
![]() |
72ae4703aa | ||
![]() |
12dee8bab7 | ||
![]() |
45257c7f8e | ||
![]() |
114ac657e7 | ||
![]() |
c80f2fa1cd | ||
![]() |
8433878d3d | ||
![]() |
5a1e097949 | ||
![]() |
2bef6d9f67 | ||
![]() |
b122b59444 | ||
![]() |
37cdbfde9d | ||
![]() |
6a6385f515 | ||
![]() |
b261ec8c16 | ||
![]() |
b803322edc | ||
![]() |
57c0215069 | ||
![]() |
fb6ea0db5b | ||
![]() |
65b49d1d09 | ||
![]() |
31c0264a04 | ||
![]() |
f161bcaced | ||
![]() |
48df019c84 | ||
![]() |
d5b25ca1a8 | ||
![]() |
5fd3f15ac7 | ||
![]() |
15e2d684df | ||
![]() |
2702d0427b | ||
![]() |
9c7f07bd89 | ||
![]() |
5545881e4c | ||
![]() |
3b0736fb89 | ||
![]() |
cf0c54e2bd | ||
![]() |
f8e0a20820 | ||
![]() |
7cb1493d0a | ||
![]() |
ca379f7ba6 | ||
![]() |
f8172bdbfa | ||
![]() |
3e66411779 | ||
![]() |
ead99700e9 | ||
![]() |
e8aaba6560 | ||
![]() |
069cb1f3a5 | ||
![]() |
924ea94f25 | ||
![]() |
aec67a1e42 | ||
![]() |
2e94629304 | ||
![]() |
ecccc7e820 | ||
![]() |
450197ffbf | ||
![]() |
a89a10120a | ||
![]() |
9c07d87041 | ||
![]() |
0826a2c5f8 | ||
![]() |
47c11dec33 | ||
![]() |
64133f4c30 | ||
![]() |
ef8595ae1c | ||
![]() |
18f7ce3460 | ||
![]() |
78a30109de | ||
![]() |
17a3a75959 | ||
![]() |
0bfe23ceda | ||
![]() |
fb63521042 | ||
![]() |
d213bf487a | ||
![]() |
8008016de8 | ||
![]() |
1dbce3938e | ||
![]() |
13f1ebe1fe | ||
![]() |
c158487417 | ||
![]() |
708d4a16a3 | ||
![]() |
bdd89e22ea | ||
![]() |
fc0c867f25 | ||
![]() |
3f683ea036 | ||
![]() |
633a96c54b | ||
![]() |
1e8642bc6e | ||
![]() |
b2f505a41c | ||
![]() |
af46c34a02 | ||
![]() |
9350a6aa95 | ||
![]() |
d01c8a8352 | ||
![]() |
9ed9279a98 | ||
![]() |
bbcdb9c5e0 | ||
![]() |
de9508653a | ||
![]() |
51d82c82e9 | ||
![]() |
0346f0ffdc | ||
![]() |
ff97452eb0 | ||
![]() |
50e9e4c2c6 | ||
![]() |
0440eeaab1 | ||
![]() |
2a79c2b526 | ||
![]() |
faa02ad708 | ||
![]() |
f888f15dbd | ||
![]() |
4f6fbc58d0 | ||
![]() |
923f48795f | ||
![]() |
e443e318f7 | ||
![]() |
bdf6bac511 | ||
![]() |
600e8d36b1 | ||
![]() |
59f2d077a6 | ||
![]() |
13c889a10e | ||
![]() |
fb1607b3d3 | ||
![]() |
cdc78e4609 | ||
![]() |
89495f919d | ||
![]() |
3b3e4c4ab0 | ||
![]() |
57a5846746 | ||
![]() |
836e1d115f | ||
![]() |
56f787cf73 | ||
![]() |
6ca760163e | ||
![]() |
f25dd98112 | ||
![]() |
e8f6a8abdb | ||
![]() |
efe64ba0af | ||
![]() |
5f33f70d64 | ||
![]() |
c4cc398778 | ||
![]() |
327067cb7d | ||
![]() |
bb887d76f6 | ||
![]() |
cc103aa37f | ||
![]() |
92e98e84e2 | ||
![]() |
4116ec7581 | ||
![]() |
d5a82f98bf | ||
![]() |
da7bb84ca3 | ||
![]() |
4caeb82351 | ||
![]() |
88c9996ce6 | ||
![]() |
5a39692fb8 | ||
![]() |
b65608dfec | ||
![]() |
9b79e7329c | ||
![]() |
b576b2f9de | ||
![]() |
88cd5f3774 | ||
![]() |
d0b013ccda | ||
![]() |
acc77ce5d2 | ||
![]() |
8e8abd2273 | ||
![]() |
b0dd088d56 | ||
![]() |
a93083b2a2 | ||
![]() |
57f5fca41e | ||
![]() |
6b539c376a | ||
![]() |
900e6f8d61 | ||
![]() |
5399c1f2fe | ||
![]() |
3bdacf4c12 | ||
![]() |
f40d35a60b | ||
![]() |
c2f410d700 | ||
![]() |
81c778cc67 | ||
![]() |
aca21d905e | ||
![]() |
775455c809 | ||
![]() |
d32f0932b4 | ||
![]() |
e934fe6eee | ||
![]() |
0af781390d | ||
![]() |
a0595d992b | ||
![]() |
c17dc924fd | ||
![]() |
734511a1ee | ||
![]() |
104fd4803a | ||
![]() |
270c4de9fb | ||
![]() |
a628e0780e | ||
![]() |
6e7a7307cc | ||
![]() |
5aa49f6563 | ||
![]() |
56420d67b0 | ||
![]() |
a046af263c | ||
![]() |
5657f3f481 | ||
![]() |
90e774bb13 | ||
![]() |
c598ac996a | ||
![]() |
c3ce70c384 | ||
![]() |
2730c9d8e9 | ||
![]() |
1048ffaace | ||
![]() |
8ab54084e4 | ||
![]() |
6732b84cc1 | ||
![]() |
56dc82758b | ||
![]() |
a86217ebf5 | ||
![]() |
da61335597 | ||
![]() |
5ed5d688c2 | ||
![]() |
21118a5445 | ||
![]() |
6cefcb1f3d | ||
![]() |
e70f64e2c6 | ||
![]() |
b9c4530b42 | ||
![]() |
63b7cfde5f | ||
![]() |
6d1428ae61 | ||
![]() |
5a40b92cd2 | ||
![]() |
da7be60c78 | ||
![]() |
218093b958 | ||
![]() |
d4c1415fd8 | ||
![]() |
9518b9e844 | ||
![]() |
15d519c13d | ||
![]() |
46b2228ddb | ||
![]() |
18f8a1ea23 | ||
![]() |
23da99b3b7 | ||
![]() |
ea5540c833 | ||
![]() |
e8e4220b46 | ||
![]() |
0ae019b055 | ||
![]() |
486df2efbd | ||
![]() |
92b7fc7ce1 | ||
![]() |
2135b091fb | ||
![]() |
02aeef647e | ||
![]() |
934727b346 | ||
![]() |
d394a2f92a | ||
![]() |
a860746af7 | ||
![]() |
109063e5a4 | ||
![]() |
a4f0490d99 | ||
![]() |
179039bf5a | ||
![]() |
545c4f5e42 | ||
![]() |
1416e001e3 | ||
![]() |
cc3df4f040 | ||
![]() |
d4e6d5f3d5 | ||
![]() |
a1e4ef51bb | ||
![]() |
6e15893135 | ||
![]() |
2257b94a9b | ||
![]() |
cb76e0af53 | ||
![]() |
bf1a443749 | ||
![]() |
7d25559235 | ||
![]() |
911fe332c6 | ||
![]() |
93d78bf7c8 | ||
![]() |
20c350e3cd | ||
![]() |
4fb247ef25 | ||
![]() |
f182a12c8f | ||
![]() |
5be9d902db | ||
![]() |
4f2ccfb834 | ||
![]() |
45c973a387 | ||
![]() |
561c044924 | ||
![]() |
c3e2e821c6 | ||
![]() |
cdce8348bb | ||
![]() |
926dd936cb | ||
![]() |
c2bdc44371 | ||
![]() |
27160810a8 | ||
![]() |
ab827e0b50 | ||
![]() |
ee90585a0a | ||
![]() |
eacce2e00c | ||
![]() |
9039c31e68 | ||
![]() |
ced5d9795e | ||
![]() |
b57a803d5a | ||
![]() |
6c41d8d9b3 | ||
![]() |
1e6196cb9c | ||
![]() |
8b715e61f3 | ||
![]() |
a6aee12de0 | ||
![]() |
0462ca7fdb | ||
![]() |
67179f582b | ||
![]() |
97d7543289 | ||
![]() |
30889511ed | ||
![]() |
3ab322a33f | ||
![]() |
d8008e3d57 | ||
![]() |
386a26030c | ||
![]() |
743fe3d011 | ||
![]() |
6e775b277d | ||
![]() |
62a3b79e4b | ||
![]() |
cf9764a071 | ||
![]() |
4b8b4faa11 | ||
![]() |
d46f806038 | ||
![]() |
a29b0753d9 | ||
![]() |
ecea17cd3b | ||
![]() |
3de023e27e | ||
![]() |
26c9126880 | ||
![]() |
d982e5bd8a | ||
![]() |
33fd4a2f23 | ||
![]() |
62431928d8 | ||
![]() |
bf87e04a6b | ||
![]() |
37bdee47ec | ||
![]() |
4466bcfc4e | ||
![]() |
c853979fb1 | ||
![]() |
bcf08875a7 | ||
![]() |
4694a29389 | ||
![]() |
0878256bf8 | ||
![]() |
ade685fd3f | ||
![]() |
7a1eb111bb | ||
![]() |
0ade1d9b0d | ||
![]() |
41428a172c | ||
![]() |
373c546702 | ||
![]() |
817cc605be | ||
![]() |
6fe3549684 | ||
![]() |
c8c1b2b757 | ||
![]() |
218a129d25 | ||
![]() |
570a917a7d | ||
![]() |
c537df5abe | ||
![]() |
d86a795898 | ||
![]() |
769b011a87 | ||
![]() |
272b44a5e8 | ||
![]() |
43225227fa | ||
![]() |
2e1717272c | ||
![]() |
d3038f6a4a | ||
![]() |
72737eabcf | ||
![]() |
36e268c634 | ||
![]() |
d25ae317f4 | ||
![]() |
6ae5046287 | ||
![]() |
a8709a71b5 | ||
![]() |
34e9b10c68 | ||
![]() |
a1c6802a8a | ||
![]() |
ce3dce4991 | ||
![]() |
6d83d7e403 | ||
![]() |
cdc1d29879 | ||
![]() |
4517ba4982 | ||
![]() |
065cd3f09c | ||
![]() |
b4d428d09c | ||
![]() |
b61b145bb9 | ||
![]() |
19b2e32394 | ||
![]() |
21da984823 | ||
![]() |
a7475d16ee | ||
![]() |
19234368ba | ||
![]() |
9c9b3dc00a | ||
![]() |
8d94cdcae8 | ||
![]() |
225f818ce4 | ||
![]() |
cd0646274d | ||
![]() |
58f764898e | ||
![]() |
9ca7c3c8d0 | ||
![]() |
f94fa664b1 | ||
![]() |
3b3ccdfb03 | ||
![]() |
5baf13a068 | ||
![]() |
c4485be70e | ||
![]() |
6ec0c7bd6c | ||
![]() |
736cd41f9c | ||
![]() |
4f9fc49cfd | ||
![]() |
1f5d52048a | ||
![]() |
a54d90607a | ||
![]() |
f915af388e | ||
![]() |
c31abc32ee | ||
![]() |
587963ff6d | ||
![]() |
b07f5be076 | ||
![]() |
c82b21033f | ||
![]() |
ab175b489b | ||
![]() |
ac2230c4c0 | ||
![]() |
ba7d032377 | ||
![]() |
32d1917ff9 | ||
![]() |
13e2ccf17d | ||
![]() |
4700c2c5ff | ||
![]() |
9a057e1b29 | ||
![]() |
3500b053bb | ||
![]() |
b3c8f78271 | ||
![]() |
e921f0dde4 | ||
![]() |
7e99ecc7bf | ||
![]() |
ca65af8be6 | ||
![]() |
c4769e9cc3 | ||
![]() |
e8d38e4620 | ||
![]() |
c832eced7b | ||
![]() |
c5ddba49fd | ||
![]() |
33ff93f475 | ||
![]() |
d20df6483b | ||
![]() |
9f120e974f | ||
![]() |
bf81ad1b8f | ||
![]() |
cec7b8b756 | ||
![]() |
9a1e116701 | ||
![]() |
fb6618ca79 | ||
![]() |
c448c52182 | ||
![]() |
8ebdb00b43 | ||
![]() |
a3f3174c73 | ||
![]() |
7ca2382f99 | ||
![]() |
deae94bac8 | ||
![]() |
02f05a2936 | ||
![]() |
fc10b42318 | ||
![]() |
24fefb865b | ||
![]() |
4a63099003 | ||
![]() |
32f876a0ae | ||
![]() |
faeb246a03 | ||
![]() |
f37844bd56 | ||
![]() |
b2ea3861d6 | ||
![]() |
a994629f90 | ||
![]() |
7a690a514d | ||
![]() |
ce4b2e0530 | ||
![]() |
a0c42eec91 | ||
![]() |
a33a2a2717 | ||
![]() |
2503683a31 | ||
![]() |
6e5ba97b5b | ||
![]() |
b1adef299f | ||
![]() |
57e6083b7a | ||
![]() |
55e38e89ce | ||
![]() |
bb055f8fa8 | ||
![]() |
a4168b9b19 | ||
![]() |
3fcf8cea97 | ||
![]() |
328705360a | ||
![]() |
88bd588905 | ||
![]() |
2a5f0c98fb | ||
![]() |
841def61bf | ||
![]() |
1fb87145aa | ||
![]() |
350ec1d262 | ||
![]() |
6d99a29e69 | ||
![]() |
e73b3cfecd | ||
![]() |
f936a8c9e1 | ||
![]() |
c56260ff0d | ||
![]() |
146f40fa51 | ||
![]() |
01d025117d | ||
![]() |
5755fead94 | ||
![]() |
70def025c8 | ||
![]() |
b3a2677809 | ||
![]() |
de98b03522 | ||
![]() |
7c1e2c7588 | ||
![]() |
8e990d836d | ||
![]() |
be5e2940e1 | ||
![]() |
8e097357e6 | ||
![]() |
c86fc0ce97 | ||
![]() |
d40ce7caeb | ||
![]() |
c6dc314dbd | ||
![]() |
36b76afeb1 | ||
![]() |
1a495cf2d5 | ||
![]() |
69066b18f9 | ||
![]() |
288f1e9d39 | ||
![]() |
ac4ea8cd7b | ||
![]() |
152ef446c0 | ||
![]() |
29e69a970f | ||
![]() |
663e066f5e | ||
![]() |
c063f07dcd | ||
![]() |
ff6fdb1361 | ||
![]() |
02361e0518 | ||
![]() |
c9801ac2ad | ||
![]() |
4621be9f17 | ||
![]() |
c9e17a3eb0 | ||
![]() |
dd03c9f28d | ||
![]() |
05b42abd0e | ||
![]() |
75574910bd | ||
![]() |
031bb879d7 | ||
![]() |
80dd3f0bd4 | ||
![]() |
c79f499e5b | ||
![]() |
7c9f404017 | ||
![]() |
a775d1d0c7 | ||
![]() |
65bafb0f69 | ||
![]() |
88d0aba656 | ||
![]() |
9b745d434c | ||
![]() |
9d8e6a8c61 | ||
![]() |
8084a02f87 | ||
![]() |
b41ab2095b | ||
![]() |
44a488025d | ||
![]() |
4c3932ee00 | ||
![]() |
6a862f7f14 | ||
![]() |
9a5036941d | ||
![]() |
907f0330a1 | ||
![]() |
5081b5a333 | ||
![]() |
705bf9a5d8 | ||
![]() |
451a3e9bd0 | ||
![]() |
6a4ac339e6 | ||
![]() |
8adcbeff30 | ||
![]() |
509d9fa976 | ||
![]() |
514d09c538 | ||
![]() |
b907175e0c | ||
![]() |
855e279daf | ||
![]() |
8a6909fe04 | ||
![]() |
08262f3461 | ||
![]() |
f39af55093 | ||
![]() |
73d6e9f294 | ||
![]() |
4c16531a5c | ||
![]() |
bac9786d81 | ||
![]() |
f91ea36fce | ||
![]() |
eb50747970 | ||
![]() |
8363cccc9a | ||
![]() |
b1d2ae04e4 | ||
![]() |
46c5125e0d | ||
![]() |
87a3a4f4e6 | ||
![]() |
30a1e49130 | ||
![]() |
618c2a7939 | ||
![]() |
8bf9bf2279 | ||
![]() |
1866d2573c | ||
![]() |
d20d5ccfe4 | ||
![]() |
d9a4fadefb | ||
![]() |
b37395d1ac | ||
![]() |
c346969eaf | ||
![]() |
6e6bd540e7 | ||
![]() |
f96306396e | ||
![]() |
1e2fa6a7a2 | ||
![]() |
2a254db6c7 | ||
![]() |
8d0b43de00 | ||
![]() |
a59c1fe1db | ||
![]() |
4702158384 | ||
![]() |
66c95342bc | ||
![]() |
9fd3dd8d89 | ||
![]() |
270038ee6b | ||
![]() |
7d14be8eb0 | ||
![]() |
70e580334a | ||
![]() |
f7428d8d04 | ||
![]() |
cba5d302bc | ||
![]() |
45c685e21c | ||
![]() |
44875e345a | ||
![]() |
1d68040d87 | ||
![]() |
17981ec20d | ||
![]() |
682a8b6975 | ||
![]() |
27872465ed | ||
![]() |
ca82773fda | ||
![]() |
bd715963f0 | ||
![]() |
5cc97bedba | ||
![]() |
e7a344982f | ||
![]() |
8f80ffe476 | ||
![]() |
026617cb18 | ||
![]() |
5c5ff75725 | ||
![]() |
99141921ae | ||
![]() |
658a6c06e1 | ||
![]() |
42c6e22c49 | ||
![]() |
90bfa0f607 | ||
![]() |
f60cc6d320 | ||
![]() |
a0420daec3 | ||
![]() |
77cf950c3b | ||
![]() |
11093c97d4 | ||
![]() |
5518a3e044 | ||
![]() |
5e7c407bc0 | ||
![]() |
79783e5519 | ||
![]() |
3e8f854a89 | ||
![]() |
e74de08e75 | ||
![]() |
adcf4b8d9d | ||
![]() |
50cc7619ba | ||
![]() |
f42d01e2f9 | ||
![]() |
9a78898d62 | ||
![]() |
61a92b0da1 | ||
![]() |
d4caaf1593 | ||
![]() |
d2c6109533 | ||
![]() |
c398d35dd0 | ||
![]() |
058f082cd2 | ||
![]() |
022391380f | ||
![]() |
6d5612c24d | ||
![]() |
7da0677851 | ||
![]() |
e8a57331d9 | ||
![]() |
8be79a02eb | ||
![]() |
90dc676e39 | ||
![]() |
bb1c438e87 | ||
![]() |
b09c0dca94 | ||
![]() |
39f9ab0cd7 | ||
![]() |
53724d4ef8 | ||
![]() |
dd6c7ff628 | ||
![]() |
e462d7bfed | ||
![]() |
a9fa6fad99 | ||
![]() |
e7418ef36a | ||
![]() |
aade3f2119 | ||
![]() |
edcf4bd5aa | ||
![]() |
32cba040b2 | ||
![]() |
61501ee959 | ||
![]() |
5b784789ad | ||
![]() |
91c9445912 | ||
![]() |
4eda2b6670 | ||
![]() |
24a68d87a6 | ||
![]() |
62030156e5 | ||
![]() |
2f694d1a3f | ||
![]() |
67620af4cd | ||
![]() |
7c572d8d9f | ||
![]() |
f7cc098d03 | ||
![]() |
5cd3f53da7 | ||
![]() |
a2b807acd9 | ||
![]() |
9ff92268fc | ||
![]() |
6a634cc680 | ||
![]() |
2ca3b793c4 | ||
![]() |
8fa5c8f7e8 | ||
![]() |
aa739affba | ||
![]() |
bcf19bdcd4 | ||
![]() |
0f6981c14d | ||
![]() |
31997657ba | ||
![]() |
17e4171508 | ||
![]() |
5e594d5fb9 | ||
![]() |
5e17a037c1 | ||
![]() |
ffccf7491b | ||
![]() |
58f294ea9e | ||
![]() |
edc8617e96 | ||
![]() |
e06d972423 | ||
![]() |
5a6df39da9 | ||
![]() |
6059a193ab | ||
![]() |
f00cb22e3b | ||
![]() |
d305b7697a | ||
![]() |
ee9e8f9e2e | ||
![]() |
a41cf79f0b | ||
![]() |
ffb33ba831 | ||
![]() |
45c5721a36 | ||
![]() |
9200ac3b65 | ||
![]() |
ea50923288 | ||
![]() |
3377718469 | ||
![]() |
7f296436f9 | ||
![]() |
064af7a39c | ||
![]() |
a068a84320 | ||
![]() |
97857b1cce | ||
![]() |
6b42874993 | ||
![]() |
6f782bc1a8 | ||
![]() |
1478c4ffdd | ||
![]() |
c92ee58a9c | ||
![]() |
a616991ca6 | ||
![]() |
2f22d6c280 | ||
![]() |
2160aea9b0 | ||
![]() |
91dfe07aa6 | ||
![]() |
ea63be7921 | ||
![]() |
a67ff44829 | ||
![]() |
c50a576b90 | ||
![]() |
831ee41cfd | ||
![]() |
a033f1fd6a | ||
![]() |
940dcc50af | ||
![]() |
0a358cec8a | ||
![]() |
be9c0bc7cb | ||
![]() |
bbc53c0911 | ||
![]() |
4fdda5a681 | ||
![]() |
6d65890789 | ||
![]() |
72743b1c70 | ||
![]() |
c41533feac | ||
![]() |
5804b53906 | ||
![]() |
3f8254255d | ||
![]() |
24e8f52cee | ||
![]() |
bcb42c4fbb | ||
![]() |
c84e1d08b4 | ||
![]() |
1c4b5182b9 | ||
![]() |
740f6ed873 | ||
![]() |
75ebbf9625 | ||
![]() |
eaaf49a7d3 | ||
![]() |
0a1e0ebcf5 | ||
![]() |
67fa22009e | ||
![]() |
a1ba285468 | ||
![]() |
de21160566 | ||
![]() |
697fdae90e | ||
![]() |
d281258f72 | ||
![]() |
8a5880a060 | ||
![]() |
b952745732 | ||
![]() |
ae1bf47772 | ||
![]() |
0ed682fcf2 | ||
![]() |
294883704b | ||
![]() |
4fae3e19ed | ||
![]() |
bdea4fc64c | ||
![]() |
7f73b90836 | ||
![]() |
3beb01bc78 | ||
![]() |
d2bf059d4e | ||
![]() |
bc9d074b4d | ||
![]() |
661ab75dec | ||
![]() |
e91d6d70bf | ||
![]() |
500f030c35 | ||
![]() |
782fdf461a | ||
![]() |
cde123517d | ||
![]() |
9574724f99 | ||
![]() |
94a3db07b7 | ||
![]() |
349dbad06b | ||
![]() |
ee66862f87 | ||
![]() |
e5363cd5c3 | ||
![]() |
9308d767c9 | ||
![]() |
74830815cd | ||
![]() |
eda58b315e | ||
![]() |
cdfed3d7a2 | ||
![]() |
ccac4a482e | ||
![]() |
db5bc6bed3 | ||
![]() |
cf794df7d9 | ||
![]() |
af3e61c5c0 | ||
![]() |
2194f600f2 | ||
![]() |
b368b819b9 | ||
![]() |
0d400644d1 | ||
![]() |
8c965807e1 | ||
![]() |
7f0656c255 | ||
![]() |
b4a3092480 | ||
![]() |
77df52247d | ||
![]() |
83c802608c | ||
![]() |
e941e35fc6 | ||
![]() |
ece2b15456 | ||
![]() |
7ac0b7c3d4 | ||
![]() |
2784a076a1 | ||
![]() |
8299c0a9ba | ||
![]() |
7a59da84f0 | ||
![]() |
a79ebbf7ac | ||
![]() |
900d9670ca | ||
![]() |
9a8081647d | ||
![]() |
491c9541db | ||
![]() |
80ec655901 | ||
![]() |
3432cf4562 | ||
![]() |
bb9cdb1c88 | ||
![]() |
6bc8133232 | ||
![]() |
2bc90bd9cc | ||
![]() |
a5810e63d8 | ||
![]() |
1a71813a2b | ||
![]() |
549f901a9b | ||
![]() |
4768018655 | ||
![]() |
7839a42cba | ||
![]() |
4088230ebc | ||
![]() |
68a5d48e87 | ||
![]() |
78da533a3a | ||
![]() |
6a762b161f | ||
![]() |
3133bcb92a | ||
![]() |
52885648d2 | ||
![]() |
28274c53e8 | ||
![]() |
3fe765cad3 | ||
![]() |
ba84f249b5 | ||
![]() |
ecff6fdf0f | ||
![]() |
672a7db67b | ||
![]() |
096b0cf836 | ||
![]() |
e569039b0d | ||
![]() |
5b0333dbba | ||
![]() |
eab5f1a4e3 | ||
![]() |
1bf8e669a1 | ||
![]() |
acceaca7db | ||
![]() |
0723ad46ac | ||
![]() |
8fd74a902b | ||
![]() |
8f68da6dd8 | ||
![]() |
c455048a24 | ||
![]() |
49a26c7faa | ||
![]() |
6a85c9dfac | ||
![]() |
b68ab52409 | ||
![]() |
b883ca8aea | ||
![]() |
095a9e85e1 | ||
![]() |
edf5eeae65 | ||
![]() |
b5b528d03e | ||
![]() |
6d81f79230 | ||
![]() |
87cdf9acac | ||
![]() |
c4925dd4b8 | ||
![]() |
4818e6018c | ||
![]() |
4d76051471 | ||
![]() |
7eec4ac7c2 | ||
![]() |
7ebcc72dc3 | ||
![]() |
3d2fcc4363 | ||
![]() |
7ebf1f3299 | ||
![]() |
10e11da5e2 | ||
![]() |
639571c4d1 | ||
![]() |
b63ddfa185 | ||
![]() |
54075bf1ec | ||
![]() |
673c3278b9 | ||
![]() |
e4f052140b | ||
![]() |
006e28b97d | ||
![]() |
979b0b5877 | ||
![]() |
af06ebe165 | ||
![]() |
ae96c7299c | ||
![]() |
711dc0996d | ||
![]() |
e025a179cf | ||
![]() |
068d99fa04 | ||
![]() |
21fdee9eba | ||
![]() |
4919613bee | ||
![]() |
d169029523 | ||
![]() |
b38c9eb532 | ||
![]() |
5ac34890e8 | ||
![]() |
8026cf8886 | ||
![]() |
55b69ba46c | ||
![]() |
93b4f23a7b | ||
![]() |
5572dc7a1c | ||
![]() |
3bf700e139 | ||
![]() |
62b953d31f | ||
![]() |
d26c89e175 | ||
![]() |
378bd3cfba | ||
![]() |
3890c41bd4 | ||
![]() |
f7007ef71c | ||
![]() |
455e7333ff | ||
![]() |
0e83205383 | ||
![]() |
4c9b4fe00f | ||
![]() |
87e8742544 | ||
![]() |
8b467a464c | ||
![]() |
2f527e717e | ||
![]() |
3f4119d267 | ||
![]() |
99dea3f9ac | ||
![]() |
a9535a1d7e | ||
![]() |
3e20e0dc3a | ||
![]() |
00db084421 | ||
![]() |
eda195f668 | ||
![]() |
be02f83e31 | ||
![]() |
f1af7bb9ce | ||
![]() |
dbc27e49e0 | ||
![]() |
892229f0a1 | ||
![]() |
a08f46481a | ||
![]() |
9d87505004 | ||
![]() |
c528255458 | ||
![]() |
75859ff859 | ||
![]() |
964910d4af | ||
![]() |
8849b2cdaf | ||
![]() |
84ea9b8b42 | ||
![]() |
390a9dc168 | ||
![]() |
07e786f4b1 | ||
![]() |
f0655307d2 | ||
![]() |
507f3ebd60 | ||
![]() |
046ff37a05 | ||
![]() |
caf9e16de0 | ||
![]() |
7912046d8b | ||
![]() |
904855eec8 | ||
![]() |
6117505650 | ||
![]() |
f8175ab7a3 | ||
![]() |
eaad13d0d5 | ||
![]() |
956a9ff339 | ||
![]() |
45d922ff8b | ||
![]() |
81857eb25f | ||
![]() |
32d0dbdd0e | ||
![]() |
17a951a9e8 | ||
![]() |
969c388006 | ||
![]() |
4099952634 | ||
![]() |
f71a63f2b4 | ||
![]() |
b78d0abb97 | ||
![]() |
c13a9e88e3 | ||
![]() |
8c4cc1c429 | ||
![]() |
43b9f103e3 | ||
![]() |
1687d5b759 | ||
![]() |
72b37e39c7 | ||
![]() |
f79bb3458a | ||
![]() |
4f2cab41d4 | ||
![]() |
5cc88c3c3c | ||
![]() |
0ff4101c9b | ||
![]() |
4877d1e4da | ||
![]() |
28c49dd4cc | ||
![]() |
0b55abff5a | ||
![]() |
bd2f83516e | ||
![]() |
20f828a47f | ||
![]() |
89feefb41c | ||
![]() |
c57a19f204 | ||
![]() |
20276882dd | ||
![]() |
6d700fce2b | ||
![]() |
c16647fc6e | ||
![]() |
fd0be388d7 | ||
![]() |
c06f225904 | ||
![]() |
78ca30a585 | ||
![]() |
36436d7ef7 | ||
![]() |
d786f6db2a | ||
![]() |
234d0d40ba | ||
![]() |
3cf9191509 | ||
![]() |
e2931ac8fa | ||
![]() |
1d149165b2 | ||
![]() |
d0477a1f1e | ||
![]() |
9a683acdef | ||
![]() |
fa0918e862 | ||
![]() |
8d3924833c | ||
![]() |
026714bbc8 | ||
![]() |
85db018779 | ||
![]() |
5564d32c1d | ||
![]() |
010c91bcc6 | ||
![]() |
2891a5b5bf | ||
![]() |
be7132aa01 | ||
![]() |
25f66ae8fc | ||
![]() |
0213b80adb | ||
![]() |
f18bf530af | ||
![]() |
cdf67b17ac | ||
![]() |
e955ee2228 | ||
![]() |
5280738772 | ||
![]() |
dc98f8c0a4 |
45
.github/workflows/build.yml
vendored
45
.github/workflows/build.yml
vendored
@ -1,45 +0,0 @@
|
||||
name: Build WebUI
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
|
||||
Windows-WebUI:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: microsoft/setup-msbuild@v1.1
|
||||
- name: Windows-WebUI
|
||||
shell: cmd
|
||||
run: |
|
||||
cd build\Windows\GCC
|
||||
mingw32-make
|
||||
cd ..\..\..
|
||||
cd build\Windows\MSVC
|
||||
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
|
||||
nmake
|
||||
|
||||
Linux-WebUI:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Linux-WebUI
|
||||
run: |
|
||||
cd build/Linux/GCC
|
||||
make
|
||||
cd ../../..
|
||||
cd build/Linux/Clang
|
||||
sudo ln -s llvm-ar-13 /usr/bin/llvm-ar
|
||||
sudo ln -s llvm-ranlib-13 /usr/bin/llvm-ranlib
|
||||
make
|
||||
|
||||
macOS-WebUI:
|
||||
runs-on: macOS-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: macOS-WebUI
|
||||
run: |
|
||||
cd build/macOS/Clang
|
||||
make
|
54
.github/workflows/ci.yml
vendored
Normal file
54
.github/workflows/ci.yml
vendored
Normal file
@ -0,0 +1,54 @@
|
||||
# https://webui.me
|
||||
# https://github.com/webui-dev/webui
|
||||
# Copyright (c) 2020-2025 Hassan Draga.
|
||||
# Licensed under MIT License.
|
||||
# All rights reserved.
|
||||
# Canada.
|
||||
#
|
||||
# Special Thanks to Turiiya (https://github.com/ttytm)
|
||||
|
||||
name: CI
|
||||
on:
|
||||
push:
|
||||
paths-ignore: ['**/*.md']
|
||||
pull_request:
|
||||
branches: [main]
|
||||
paths-ignore: ['**/*.md']
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref_name == 'main' && github.sha || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
windows:
|
||||
uses: ./.github/workflows/windows.yml
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
macos:
|
||||
uses: ./.github/workflows/macos.yml
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
linux:
|
||||
uses: ./.github/workflows/linux.yml
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
linux_arm:
|
||||
uses: ./.github/workflows/linux_arm.yml
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
linux_redhat:
|
||||
uses: ./.github/workflows/linux_redhat.yml
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
linux_arch:
|
||||
uses: ./.github/workflows/linux_arch.yml
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
zig:
|
||||
uses: ./.github/workflows/zig.yml
|
20
.github/workflows/ftp.yml
vendored
20
.github/workflows/ftp.yml
vendored
@ -1,20 +0,0 @@
|
||||
name: WebUI-FTP
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: WebUI-FTP
|
||||
uses: airvzxf/ftp-deployment-action@latest
|
||||
with:
|
||||
server: ${{ secrets.WEBUI_FTP_SERVER }}
|
||||
user: ${{ secrets.WEBUI_FTP_USERNAME }}
|
||||
password: ${{ secrets.WEBUI_FTP_PASSWORD }}
|
||||
local_dir: "./website"
|
||||
remote_dir: "./public_html"
|
||||
delete: "true"
|
||||
ftp_ssl_allow: "false"
|
||||
max_retries: "3"
|
193
.github/workflows/linux.yml
vendored
Normal file
193
.github/workflows/linux.yml
vendored
Normal file
@ -0,0 +1,193 @@
|
||||
# https://webui.me
|
||||
# https://github.com/webui-dev/webui
|
||||
# Copyright (c) 2020-2025 Hassan Draga.
|
||||
# Licensed under MIT License.
|
||||
# All rights reserved.
|
||||
# Canada.
|
||||
#
|
||||
# Special Thanks to Turiiya (https://github.com/ttytm)
|
||||
|
||||
name: Linux
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Bundle WebUI Bridge
|
||||
run: |
|
||||
npm i -g esbuild
|
||||
chmod +x bridge/build.sh
|
||||
bridge/build.sh
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: bridge/webui_bridge.h
|
||||
key: ${{ runner.os }}-${{ github.sha }}-bridge
|
||||
|
||||
build:
|
||||
needs: setup
|
||||
runs-on: ubuntu-22.04
|
||||
permissions:
|
||||
contents: write
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- cc: gcc
|
||||
arch: x64
|
||||
- cc: clang
|
||||
arch: x64
|
||||
fail-fast: false
|
||||
env:
|
||||
ARTIFACT: webui-linux-${{ matrix.cc }}-${{ matrix.arch }}
|
||||
CC: ${{ matrix.cc }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: bridge/webui_bridge.h
|
||||
key: ${{ runner.os }}-${{ github.sha }}-bridge
|
||||
fail-on-cache-miss: true
|
||||
- name: Setup
|
||||
run: |
|
||||
if [ "$CC" == "clang" ]; then
|
||||
sudo ln -s llvm-ar-14 /usr/bin/llvm-ar
|
||||
sudo ln -s llvm-ranlib-14 /usr/bin/llvm-ranlib
|
||||
sudo ln -s llvm-strip-14 /usr/bin/llvm-strip
|
||||
fi
|
||||
- name: Build Debug Target
|
||||
run: make debug
|
||||
- name: Build Release Target
|
||||
if: ${{ !cancelled() }}
|
||||
run: make
|
||||
- name: Build TLS Debug Target
|
||||
run: make WEBUI_USE_TLS=1 debug
|
||||
- name: Build TLS Release Target
|
||||
run: make WEBUI_USE_TLS=1
|
||||
- name: Build Examples
|
||||
run: |
|
||||
examples_base_dir=$(pwd)/examples/C
|
||||
for example in $(find $examples_base_dir/* -maxdepth 0 -type d); do
|
||||
echo "> $example"
|
||||
cd $example || (exit_code=1 && continue)
|
||||
if ! make; then
|
||||
echo "Failed to build '$example'"
|
||||
exit_code=1
|
||||
continue
|
||||
fi
|
||||
if [[ ! -e "main" || ! -e "main-dyn" ]] ; then
|
||||
echo "Failed to find executable for '$example'" && find .
|
||||
exit_code=1
|
||||
continue
|
||||
fi
|
||||
done
|
||||
exit $exit_code
|
||||
- name: Setup Browser
|
||||
uses: browser-actions/setup-chrome@v1
|
||||
- name: Prepare Artifact
|
||||
run: |
|
||||
cp -r include dist
|
||||
mv dist/ "$ARTIFACT"
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ env.ARTIFACT }}
|
||||
path: ${{ env.ARTIFACT }}
|
||||
- name: Prepare Release
|
||||
if: >
|
||||
github.repository_owner == 'webui-dev'
|
||||
&& (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push'))
|
||||
run: |
|
||||
zip -r "$ARTIFACT.zip" "$ARTIFACT"
|
||||
if [ $GITHUB_REF_TYPE == tag ]; then
|
||||
echo "TAG=$GITHUB_REF_NAME" >> $GITHUB_ENV
|
||||
else
|
||||
{
|
||||
echo "IS_PRERELEASE=true";
|
||||
echo "TAG=nightly";
|
||||
echo "TITLE=WebUI Nightly Build $(date -u +'%Y-%m-%d %H:%M:%S UTC')"
|
||||
echo "BODY=Generated from commit $GITHUB_SHA."
|
||||
} >> $GITHUB_ENV
|
||||
fi
|
||||
- name: Update Nightly Tag
|
||||
if: env.IS_PRERELEASE
|
||||
uses: richardsimko/update-tag@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: nightly
|
||||
- name: Release
|
||||
if: >
|
||||
github.repository_owner == 'webui-dev'
|
||||
&& (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push'))
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: ${{ env.ARTIFACT }}.zip
|
||||
tag: ${{ env.TAG }}
|
||||
body: ${{ env.BODY }}
|
||||
name: ${{ env.TITLE }}
|
||||
prerelease: ${{ env.IS_PRERELEASE }}
|
||||
allowUpdates: true
|
||||
|
||||
build-ubuntu-22:
|
||||
needs: setup
|
||||
runs-on: ubuntu-22.04
|
||||
permissions:
|
||||
contents: write
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- cc: gcc
|
||||
arch: x64
|
||||
- cc: clang
|
||||
arch: x64
|
||||
fail-fast: false
|
||||
env:
|
||||
ARTIFACT: webui-linux-${{ matrix.cc }}-${{ matrix.arch }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: bridge/webui_bridge.h
|
||||
key: ${{ runner.os }}-${{ github.sha }}-bridge
|
||||
fail-on-cache-miss: true
|
||||
- name: Setup
|
||||
run: |
|
||||
CC="${{ matrix.cc }}"
|
||||
if [ "$CC" == "clang" ]; then
|
||||
sudo ln -s llvm-ar-14 /usr/bin/llvm-ar
|
||||
sudo ln -s llvm-ranlib-14 /usr/bin/llvm-ranlib
|
||||
sudo ln -s llvm-strip-14 /usr/bin/llvm-strip
|
||||
else
|
||||
sudo apt -qq install gcc-11
|
||||
CC+="-11"
|
||||
fi
|
||||
echo "CC=$CC" >> $GITHUB_ENV
|
||||
- name: Build Debug Target
|
||||
run: make debug
|
||||
- name: Build Release Target
|
||||
if: ${{ !cancelled() }}
|
||||
run: make
|
||||
- name: Build TLS Debug Target
|
||||
run: make WEBUI_USE_TLS=1 debug
|
||||
- name: Build TLS Release Target
|
||||
run: make WEBUI_USE_TLS=1
|
||||
- name: Build Examples
|
||||
run: |
|
||||
examples_base_dir=$(pwd)/examples/C
|
||||
for example in $(find $examples_base_dir/* -maxdepth 0 -type d); do
|
||||
echo "> $example"
|
||||
cd $example || (exit_code=1 && continue)
|
||||
if ! make; then
|
||||
echo "Failed to build '$example'"
|
||||
exit_code=1
|
||||
continue
|
||||
fi
|
||||
if [[ ! -e "main" || ! -e "main-dyn" ]] ; then
|
||||
echo "Failed to find executable for '$example'" && find .
|
||||
exit_code=1
|
||||
continue
|
||||
fi
|
||||
done
|
||||
exit $exit_code
|
111
.github/workflows/linux_arch.yml
vendored
Normal file
111
.github/workflows/linux_arch.yml
vendored
Normal file
@ -0,0 +1,111 @@
|
||||
# https://webui.me
|
||||
# https://github.com/webui-dev/webui
|
||||
# Copyright (c) 2020-2025 Hassan Draga.
|
||||
# Licensed under MIT License.
|
||||
# All rights reserved.
|
||||
# Canada.
|
||||
|
||||
name: Linux-Arch
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- cc: gcc
|
||||
arch: x64
|
||||
- cc: clang
|
||||
arch: x64
|
||||
fail-fast: false
|
||||
env:
|
||||
ARTIFACT: webui-linux-arch-${{ matrix.cc }}-${{ matrix.arch }}
|
||||
CC: ${{ matrix.cc }}
|
||||
steps:
|
||||
- name: Check out the repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Build Arch Linux Docker Image
|
||||
run: |
|
||||
docker build -t archlinux:latest - <<EOF
|
||||
FROM archlinux:latest
|
||||
RUN pacman -Syu --noconfirm git npm make gcc clang llvm lld
|
||||
EOF
|
||||
|
||||
- name: Run build inside Arch Linux container
|
||||
run: |
|
||||
docker run --rm \
|
||||
-v ${{ github.workspace }}:/workspace \
|
||||
-w /workspace \
|
||||
--user root \
|
||||
-e CC=${{ matrix.cc }} \
|
||||
archlinux:latest \
|
||||
bash -c "
|
||||
git config --global --add safe.directory /workspace &&
|
||||
npm i -g esbuild &&
|
||||
chmod +x bridge/build.sh &&
|
||||
if [ '${{ matrix.cc }}' == 'clang' ]; then
|
||||
export AR=llvm-ar
|
||||
export STRIP=llvm-strip
|
||||
fi &&
|
||||
./bridge/build.sh &&
|
||||
make debug &&
|
||||
make &&
|
||||
make WEBUI_USE_TLS=1 debug &&
|
||||
make WEBUI_USE_TLS=1 &&
|
||||
chown -R $(id -u):$(id -g) /workspace
|
||||
"
|
||||
|
||||
- name: Prepare Artifact
|
||||
run: |
|
||||
cp -r include dist
|
||||
mv dist/ "$ARTIFACT"
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ env.ARTIFACT }}
|
||||
path: ${{ env.ARTIFACT}}
|
||||
|
||||
- name: Prepare Release
|
||||
if: >
|
||||
github.repository_owner == 'webui-dev'
|
||||
&& (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push'))
|
||||
run: |
|
||||
zip -r "$ARTIFACT.zip" "$ARTIFACT"
|
||||
if [ $GITHUB_REF_TYPE == tag ]; then
|
||||
echo "TAG=$GITHUB_REF_NAME" >> $GITHUB_ENV
|
||||
else
|
||||
{
|
||||
echo "IS_PRERELEASE=true";
|
||||
echo "TAG=nightly";
|
||||
echo "TITLE=WebUI Nightly Build $(date -u +'%Y-%m-%d %H:%M:%S UTC')"
|
||||
echo "BODY=Generated from commit $GITHUB_SHA."
|
||||
} >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Update Nightly Tag
|
||||
if: env.IS_PRERELEASE
|
||||
uses: richardsimko/update-tag@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: nightly
|
||||
|
||||
- name: Release
|
||||
if: >
|
||||
github.repository_owner == 'webui-dev'
|
||||
&& (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push'))
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: ${{ env.ARTIFACT }}.zip
|
||||
tag: ${{ env.TAG }}
|
||||
body: ${{ env.BODY }}
|
||||
name: ${{ env.TITLE }}
|
||||
prerelease: ${{ env.IS_PRERELEASE }}
|
||||
allowUpdates: true
|
165
.github/workflows/linux_arm.yml
vendored
Normal file
165
.github/workflows/linux_arm.yml
vendored
Normal file
@ -0,0 +1,165 @@
|
||||
# https://webui.me
|
||||
# https://github.com/webui-dev/webui
|
||||
# Copyright (c) 2020-2025 Hassan Draga.
|
||||
# Licensed under MIT License.
|
||||
# All rights reserved.
|
||||
# Canada.
|
||||
#
|
||||
# Special Thanks to Turiiya (https://github.com/ttytm)
|
||||
|
||||
name: Linux ARM
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
runs-on: buildjet-32vcpu-ubuntu-2204-arm
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Check CPU Architecture
|
||||
run: |
|
||||
ARCH=$(uname -m)
|
||||
if [[ "$ARCH" != "arm"* && "$ARCH" != "aarch64" ]]; then
|
||||
echo "Expected ARM-based CPU architecture. Detected: $ARCH"
|
||||
exit 1
|
||||
else
|
||||
echo "ARM CPU Detected: $ARCH"
|
||||
fi
|
||||
- name: Bundle WebUI Bridge
|
||||
run: |
|
||||
npm i -g esbuild
|
||||
chmod +x bridge/build.sh
|
||||
bridge/build.sh
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: bridge/webui_bridge.h
|
||||
key: ${{ runner.os }}-${{ github.sha }}-bridge
|
||||
|
||||
build:
|
||||
needs: setup
|
||||
# Same as `buildjet-32vcpu-ubuntu-2204-arm`
|
||||
runs-on: ubuntu-22.04
|
||||
permissions:
|
||||
contents: write
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- cc: gcc
|
||||
arch: arm
|
||||
- cc: gcc
|
||||
arch: arm64
|
||||
fail-fast: false
|
||||
env:
|
||||
ARTIFACT: webui-linux-${{ matrix.cc }}-${{ matrix.arch }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: bridge/webui_bridge.h
|
||||
key: ${{ runner.os }}-${{ github.sha }}-bridge
|
||||
fail-on-cache-miss: true
|
||||
- name: Setup
|
||||
run: |
|
||||
CC=${{ matrix.cc }}
|
||||
if [ "${{ matrix.arch }}" == "arm64" ]; then
|
||||
sudo apt update
|
||||
sudo apt install -y gcc-aarch64-linux-gnu
|
||||
CC=aarch64-linux-gnu-gcc
|
||||
wget https://github.com/openssl/openssl/releases/download/openssl-3.3.1/openssl-3.3.1.tar.gz
|
||||
tar -xzf openssl-3.3.1.tar.gz
|
||||
cd openssl-3.3.1
|
||||
./Configure linux-generic64 --prefix=/usr/aarch64-linux-gnu --cross-compile-prefix=aarch64-linux-gnu- --release -latomic
|
||||
make
|
||||
sudo make install
|
||||
elif [ "${{ matrix.arch }}" == "arm" ]; then
|
||||
sudo apt update
|
||||
sudo apt install -y gcc-arm-linux-gnueabi
|
||||
CC=arm-linux-gnueabi-gcc
|
||||
wget https://github.com/openssl/openssl/releases/download/openssl-3.3.1/openssl-3.3.1.tar.gz
|
||||
tar -xzf openssl-3.3.1.tar.gz
|
||||
cd openssl-3.3.1
|
||||
./Configure linux-generic32 --prefix=/usr/arm-linux-gnueabi --cross-compile-prefix=arm-linux-gnueabi- --release -latomic
|
||||
make
|
||||
sudo make install
|
||||
fi
|
||||
echo "CC=$CC" >> $GITHUB_ENV
|
||||
- name: Build Debug Target
|
||||
run: make debug
|
||||
- name: Build Release Target
|
||||
if: ${{ !cancelled() }}
|
||||
run: make
|
||||
- name: Build TLS Debug ARM64 Target
|
||||
if: matrix.arch == 'arm64'
|
||||
run: make WEBUI_USE_TLS=1 debug WEBUI_TLS_INCLUDE="/usr/aarch64-linux-gnu/include" WEBUI_TLS_LIB="/usr/aarch64-linux-gnu/lib"
|
||||
- name: Build TLS Debug ARM Target
|
||||
if: matrix.arch == 'arm'
|
||||
run: make WEBUI_USE_TLS=1 debug WEBUI_TLS_INCLUDE="/usr/arm-linux-gnueabi/include" WEBUI_TLS_LIB="/usr/arm-linux-gnueabi/lib"
|
||||
- name: Build TLS Release ARM64 Target
|
||||
if: matrix.arch == 'arm64'
|
||||
run: make WEBUI_USE_TLS=1 WEBUI_TLS_INCLUDE="/usr/aarch64-linux-gnu/include" WEBUI_TLS_LIB="/usr/aarch64-linux-gnu/lib"
|
||||
- name: Build TLS Release ARM Target
|
||||
if: matrix.arch == 'arm'
|
||||
run: make WEBUI_USE_TLS=1 WEBUI_TLS_INCLUDE="/usr/arm-linux-gnueabi/include" WEBUI_TLS_LIB="/usr/arm-linux-gnueabi/lib"
|
||||
# - name: Build Examples
|
||||
# if: matrix.arch == 'arm64'
|
||||
# run: |
|
||||
# examples_base_dir=$(pwd)/examples/C
|
||||
# for example in $(find $examples_base_dir/* -maxdepth 0 -type d); do
|
||||
# echo "> $example"
|
||||
# cd $example || (exit_code=1 && continue)
|
||||
# if ! make CC=aarch64-linux-gnu-gcc; then
|
||||
# echo "Failed to build '$example'"
|
||||
# exit_code=1
|
||||
# continue
|
||||
# fi
|
||||
# if [[ ! -e "main" || ! -e "main-dyn" ]] ; then
|
||||
# echo "Failed to find executable for '$example'" && find .
|
||||
# exit_code=1
|
||||
# continue
|
||||
# fi
|
||||
# done
|
||||
# exit $exit_code
|
||||
- name: Prepare Artifact
|
||||
run: |
|
||||
cp -r include dist
|
||||
mv dist/ "$ARTIFACT"
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ env.ARTIFACT }}
|
||||
path: ${{ env.ARTIFACT }}
|
||||
- name: Prepare Release
|
||||
if: >
|
||||
github.repository_owner == 'webui-dev'
|
||||
&& (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push'))
|
||||
run: |
|
||||
zip -r "$ARTIFACT.zip" "$ARTIFACT"
|
||||
if [ $GITHUB_REF_TYPE == tag ]; then
|
||||
echo "TAG=$GITHUB_REF_NAME" >> $GITHUB_ENV
|
||||
else
|
||||
{
|
||||
echo "IS_PRERELEASE=true";
|
||||
echo "TAG=nightly";
|
||||
echo "TITLE=WebUI Nightly Build $(date -u +'%Y-%m-%d %H:%M:%S UTC')"
|
||||
echo "BODY=Generated from commit $GITHUB_SHA."
|
||||
} >> $GITHUB_ENV
|
||||
fi
|
||||
- name: Update Nightly Tag
|
||||
if: env.IS_PRERELEASE
|
||||
uses: richardsimko/update-tag@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: nightly
|
||||
- name: Release
|
||||
if: >
|
||||
github.repository_owner == 'webui-dev'
|
||||
&& (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push'))
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: ${{ env.ARTIFACT }}.zip
|
||||
tag: ${{ env.TAG }}
|
||||
body: ${{ env.BODY }}
|
||||
name: ${{ env.TITLE }}
|
||||
prerelease: ${{ env.IS_PRERELEASE }}
|
||||
allowUpdates: true
|
113
.github/workflows/linux_redhat.yml
vendored
Normal file
113
.github/workflows/linux_redhat.yml
vendored
Normal file
@ -0,0 +1,113 @@
|
||||
# https://webui.me
|
||||
# https://github.com/webui-dev/webui
|
||||
# Copyright (c) 2020-2025 Hassan Draga.
|
||||
# Licensed under MIT License.
|
||||
# All rights reserved.
|
||||
# Canada.
|
||||
|
||||
name: Linux-RedHat
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- cc: gcc
|
||||
arch: x64
|
||||
- cc: clang
|
||||
arch: x64
|
||||
fail-fast: false
|
||||
env:
|
||||
ARTIFACT: webui-linux-redhat-${{ matrix.cc }}-${{ matrix.arch }}
|
||||
CC: ${{ matrix.cc }}
|
||||
steps:
|
||||
- name: Check out the repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Build RedHat Docker Image
|
||||
run: |
|
||||
docker build -t redhat:latest - <<EOF
|
||||
FROM almalinux:9
|
||||
RUN dnf install -y epel-release
|
||||
RUN dnf groupinstall -y "Development Tools"
|
||||
RUN dnf install -y git nodejs npm clang llvm-toolset lld openssl-devel
|
||||
EOF
|
||||
|
||||
- name: Run build inside RedHat container
|
||||
run: |
|
||||
docker run --rm \
|
||||
-v ${{ github.workspace }}:/workspace \
|
||||
-w /workspace \
|
||||
--user root \
|
||||
-e CC=${{ matrix.cc }} \
|
||||
redhat:latest \
|
||||
bash -c "
|
||||
git config --global --add safe.directory /workspace &&
|
||||
npm i -g esbuild &&
|
||||
chmod +x bridge/build.sh &&
|
||||
if [ '${{ matrix.cc }}' == 'clang' ]; then
|
||||
export AR=llvm-ar
|
||||
export STRIP=llvm-strip
|
||||
fi &&
|
||||
./bridge/build.sh &&
|
||||
make debug &&
|
||||
make &&
|
||||
make WEBUI_USE_TLS=1 debug &&
|
||||
make WEBUI_USE_TLS=1 &&
|
||||
chown -R $(id -u):$(id -g) /workspace
|
||||
"
|
||||
|
||||
- name: Prepare Artifact
|
||||
run: |
|
||||
cp -r include dist
|
||||
mv dist/ "$ARTIFACT"
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ env.ARTIFACT }}
|
||||
path: ${{ env.ARTIFACT }}
|
||||
|
||||
- name: Prepare Release
|
||||
if: >
|
||||
github.repository_owner == 'webui-dev'
|
||||
&& (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push'))
|
||||
run: |
|
||||
zip -r "$ARTIFACT.zip" "$ARTIFACT"
|
||||
if [ $GITHUB_REF_TYPE == tag ]; then
|
||||
echo "TAG=$GITHUB_REF_NAME" >> $GITHUB_ENV
|
||||
else
|
||||
{
|
||||
echo "IS_PRERELEASE=true";
|
||||
echo "TAG=nightly";
|
||||
echo "TITLE=WebUI Nightly Build $(date -u +'%Y-%m-%d %H:%M:%S UTC')"
|
||||
echo "BODY=Generated from commit $GITHUB_SHA."
|
||||
} >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Update Nightly Tag
|
||||
if: env.IS_PRERELEASE
|
||||
uses: richardsimko/update-tag@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: nightly
|
||||
|
||||
- name: Release
|
||||
if: >
|
||||
github.repository_owner == 'webui-dev'
|
||||
&& (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push'))
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: ${{ env.ARTIFACT }}.zip
|
||||
tag: ${{ env.TAG }}
|
||||
body: ${{ env.BODY }}
|
||||
name: ${{ env.TITLE }}
|
||||
prerelease: ${{ env.IS_PRERELEASE }}
|
||||
allowUpdates: true
|
125
.github/workflows/macos.yml
vendored
Normal file
125
.github/workflows/macos.yml
vendored
Normal file
@ -0,0 +1,125 @@
|
||||
# https://webui.me
|
||||
# https://github.com/webui-dev/webui
|
||||
# Copyright (c) 2020-2025 Hassan Draga.
|
||||
# Licensed under MIT License.
|
||||
# All rights reserved.
|
||||
# Canada.
|
||||
#
|
||||
# Special Thanks to Turiiya (https://github.com/ttytm)
|
||||
|
||||
name: macOS
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Bundle WebUI Bridge
|
||||
run: |
|
||||
npm i -g esbuild
|
||||
chmod +x bridge/build.sh
|
||||
bridge/build.sh
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: bridge/webui_bridge.h
|
||||
key: ${{ runner.os }}-${{ github.sha }}-bridge
|
||||
|
||||
build:
|
||||
needs: setup
|
||||
runs-on: macos-latest
|
||||
permissions:
|
||||
contents: write
|
||||
strategy:
|
||||
matrix:
|
||||
cc: [clang]
|
||||
arch: [x64, arm64]
|
||||
fail-fast: false
|
||||
env:
|
||||
ARTIFACT: webui-macos-${{ matrix.cc }}-${{ matrix.arch }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: bridge/webui_bridge.h
|
||||
key: ${{ runner.os }}-${{ github.sha }}-bridge
|
||||
fail-on-cache-miss: true
|
||||
- name: Setup OpenSSL
|
||||
run: |
|
||||
echo "WEBUI_TLS_INCLUDE=$(brew --cellar)/openssl@1.1/1.1.1w/include/" >> $GITHUB_ENV
|
||||
echo "WEBUI_TLS_LIB=$(brew --cellar)/openssl@1.1/1.1.1w/lib/" >> $GITHUB_ENV
|
||||
- name: Build Debug Target
|
||||
run: make ARCH_TARGET=${{ matrix.arch }} debug
|
||||
- name: Build Release Target
|
||||
if: ${{ !cancelled() }}
|
||||
run: make ARCH_TARGET=${{ matrix.arch }}
|
||||
- name: Build TLS Debug Target
|
||||
if: ${{ matrix.arch != 'x64' }}
|
||||
run: make ARCH_TARGET=${{ matrix.arch }} WEBUI_USE_TLS=1 debug
|
||||
- name: Build TLS Release Target
|
||||
if: ${{ matrix.arch != 'x64' }}
|
||||
run: make ARCH_TARGET=${{ matrix.arch }} WEBUI_USE_TLS=1
|
||||
- name: Build examples
|
||||
if: ${{ matrix.arch != 'x64' }}
|
||||
run: |
|
||||
examples_base_dir=$(pwd)/examples/C
|
||||
for example in $(find $examples_base_dir/* -maxdepth 0 -type d); do
|
||||
echo "> $example"
|
||||
cd $example || (exit_code=1 && continue)
|
||||
if ! make ARCH_TARGET=${{ matrix.arch }}; then
|
||||
echo "Failed to build '$example'"
|
||||
exit_code=1
|
||||
continue
|
||||
fi
|
||||
if [[ ! -e "main" || ! -e "main-dyn" ]] ; then
|
||||
echo "Failed to find executable for '$example'" && find .
|
||||
exit_code=1
|
||||
continue
|
||||
fi
|
||||
done
|
||||
exit $exit_code
|
||||
- name: Prepare Artifacts
|
||||
run: |
|
||||
cp -r include dist
|
||||
mv dist/ "$ARTIFACT"
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ env.ARTIFACT }}
|
||||
path: ${{ env.ARTIFACT }}
|
||||
- name: Prepare Release
|
||||
if: >
|
||||
github.repository_owner == 'webui-dev'
|
||||
&& (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push'))
|
||||
run: |
|
||||
zip -r "$ARTIFACT.zip" "$ARTIFACT"
|
||||
if [ $GITHUB_REF_TYPE == tag ]; then
|
||||
echo "TAG=$GITHUB_REF_NAME" >> $GITHUB_ENV
|
||||
else
|
||||
{
|
||||
echo "IS_PRERELEASE=true";
|
||||
echo "TAG=nightly";
|
||||
echo "TITLE=WebUI Nightly Build $(date -u +'%Y-%m-%d %H:%M:%S UTC')"
|
||||
echo "BODY=Generated from commit $GITHUB_SHA."
|
||||
} >> $GITHUB_ENV
|
||||
fi
|
||||
- name: Update Nightly Tag
|
||||
if: env.IS_PRERELEASE
|
||||
uses: richardsimko/update-tag@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: nightly
|
||||
- name: Release
|
||||
if: >
|
||||
github.repository_owner == 'webui-dev'
|
||||
&& (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push'))
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: ${{ env.ARTIFACT }}.zip
|
||||
tag: ${{ env.TAG }}
|
||||
body: ${{ env.BODY }}
|
||||
name: ${{ env.TITLE }}
|
||||
prerelease: ${{ env.IS_PRERELEASE }}
|
||||
allowUpdates: true
|
133
.github/workflows/windows.yml
vendored
Normal file
133
.github/workflows/windows.yml
vendored
Normal file
@ -0,0 +1,133 @@
|
||||
# https://webui.me
|
||||
# https://github.com/webui-dev/webui
|
||||
# Copyright (c) 2020-2025 Hassan Draga.
|
||||
# Licensed under MIT License.
|
||||
# All rights reserved.
|
||||
# Canada.
|
||||
#
|
||||
# Special Thanks to Turiiya (https://github.com/ttytm)
|
||||
|
||||
name: Windows
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Bundle WebUI Bridge
|
||||
run: bridge/build.ps1
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: bridge/webui_bridge.h
|
||||
key: ${{ runner.os }}-${{ github.sha }}-bridge
|
||||
|
||||
build:
|
||||
needs: setup
|
||||
runs-on: windows-latest
|
||||
permissions:
|
||||
contents: write
|
||||
strategy:
|
||||
matrix:
|
||||
cc: ['gcc', 'msvc']
|
||||
include:
|
||||
- cc: gcc
|
||||
make: mingw32-make
|
||||
- cc: msvc
|
||||
make: nmake
|
||||
fail-fast: false
|
||||
env:
|
||||
ARTIFACT: webui-windows-${{ matrix.cc }}-x64
|
||||
WEBUI_TLS_INCLUDE: "C:\\Program Files\\OpenSSL\\include"
|
||||
WEBUI_TLS_LIB: "C:\\Program Files\\OpenSSL\\lib"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: bridge/webui_bridge.h
|
||||
key: ${{ runner.os }}-${{ github.sha }}-bridge
|
||||
fail-on-cache-miss: true
|
||||
- uses: microsoft/setup-msbuild@v2
|
||||
- uses: ilammy/msvc-dev-cmd@v1
|
||||
if: matrix.cc == 'msvc'
|
||||
- name: Build Debug Target
|
||||
run: ${{ matrix.make }} debug
|
||||
- name: Build Release Target
|
||||
if: ${{ !cancelled() }}
|
||||
run: ${{ matrix.make }}
|
||||
- name: Build TLS Debug Target
|
||||
run: ${{ matrix.make }} WEBUI_USE_TLS=1 debug
|
||||
- name: Build TLS Release Target
|
||||
run: ${{ matrix.make }} WEBUI_USE_TLS=1
|
||||
- name: Build examples
|
||||
run: |
|
||||
$examples_base_dir = "$(Get-Location)/examples/C/"
|
||||
foreach ($example in Get-ChildItem -Path $examples_base_dir -Directory) {
|
||||
Write-Host "> $example"
|
||||
Set-Location -Path $example.FullName
|
||||
if (!$?) {
|
||||
$exit_code = 1
|
||||
continue
|
||||
}
|
||||
$make_output = Invoke-Expression ${{ matrix.make }}
|
||||
if (!$?) {
|
||||
Write-Host "Failed to build '$example': $make_output"
|
||||
$exit_code = 1
|
||||
continue
|
||||
}
|
||||
Write-Output $make_output
|
||||
if (!(Test-Path "main.exe") -or !(Test-Path "main-dyn.exe")) {
|
||||
Write-Host "Failed to find executable for '$example'"
|
||||
Get-ChildItem
|
||||
$exit_code = 1
|
||||
continue
|
||||
}
|
||||
}
|
||||
exit $exit_code
|
||||
- name: Prepare Artifact
|
||||
shell: bash
|
||||
run: |
|
||||
cp -r include dist
|
||||
mv dist/ "$ARTIFACT"
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ env.ARTIFACT }}
|
||||
path: ${{ env.ARTIFACT }}
|
||||
- name: Prepare Release
|
||||
if: >
|
||||
github.repository_owner == 'webui-dev'
|
||||
&& (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push'))
|
||||
shell: bash
|
||||
run: |
|
||||
7z a -tzip "$ARTIFACT.zip" "$ARTIFACT/*"
|
||||
if [ $GITHUB_REF_TYPE == tag ]; then
|
||||
echo "TAG=$GITHUB_REF_NAME" >> $GITHUB_ENV
|
||||
else
|
||||
{
|
||||
echo "IS_PRERELEASE=true";
|
||||
echo "TAG=nightly";
|
||||
echo "TITLE=WebUI Nightly Build $(date -u +'%Y-%m-%d %H:%M:%S UTC')"
|
||||
echo "BODY=Generated from commit $GITHUB_SHA."
|
||||
} >> $GITHUB_ENV
|
||||
fi
|
||||
- name: Update Nightly Tag
|
||||
if: env.IS_PRERELEASE
|
||||
uses: richardsimko/update-tag@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: nightly
|
||||
- name: Release
|
||||
if: >
|
||||
github.repository_owner == 'webui-dev'
|
||||
&& (github.ref_type == 'tag' || (github.ref_name == 'main' && github.event_name == 'push'))
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: ${{ env.ARTIFACT }}.zip
|
||||
tag: ${{ env.TAG }}
|
||||
body: ${{ env.BODY }}
|
||||
name: ${{ env.TITLE }}
|
||||
prerelease: ${{ env.IS_PRERELEASE }}
|
||||
allowUpdates: true
|
36
.github/workflows/zig.yml
vendored
Normal file
36
.github/workflows/zig.yml
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
name: Zig Build
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||
version: [0.14.0, '']
|
||||
fail-fast: false
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: maxim-lobanov/setup-xcode@v1
|
||||
if: runner.os == 'macOS'
|
||||
with:
|
||||
xcode-version: latest-stable
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Zig
|
||||
uses: goto-bus-stop/setup-zig@v2
|
||||
with:
|
||||
version: ${{ matrix.version }}
|
||||
- name: Build static library
|
||||
run: zig build -Dverbose=debug
|
||||
- name: Build dynamic library
|
||||
if: ${{ !cancelled() }}
|
||||
run: zig build -Ddynamic -Dverbose=debug
|
||||
- name: Build static library with TLS support
|
||||
if: runner.os == 'Linux'
|
||||
run: zig build -Denable-tls -Dverbose=debug
|
||||
- name: Build dynamic library with TLS support
|
||||
if: runner.os == 'Linux'
|
||||
run: zig build -Ddynamic -Denable-tls -Dverbose=debug
|
||||
- name: Build examples
|
||||
run: zig build examples
|
40
.gitignore
vendored
40
.gitignore
vendored
@ -1,4 +1,5 @@
|
||||
# Build
|
||||
build/
|
||||
*.exe
|
||||
*.ilk
|
||||
*.pdb
|
||||
@ -6,9 +7,32 @@
|
||||
*.res
|
||||
*.out
|
||||
*.def
|
||||
*.obj
|
||||
*.iobj
|
||||
|
||||
# All sub-level build binaries
|
||||
*/**/*
|
||||
!*/**/*/
|
||||
!*/**/*.*
|
||||
!*makefile
|
||||
!Makefile
|
||||
*/**/*.exe
|
||||
|
||||
# Compiled Object files
|
||||
*.slo
|
||||
*.lo
|
||||
*.o
|
||||
*.obj
|
||||
|
||||
# Shared objects (inc. Windows DLLs)
|
||||
*.dll
|
||||
*.so
|
||||
*.so.*
|
||||
*.dylib
|
||||
|
||||
# Compiled Static libraries
|
||||
*.lai
|
||||
*.la
|
||||
*.a
|
||||
*.lib
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
@ -23,6 +47,8 @@
|
||||
.idea/
|
||||
*.recipe
|
||||
*.idb
|
||||
*.iobj
|
||||
*.pdb
|
||||
|
||||
# Visual Studio for Mac
|
||||
.idea/
|
||||
@ -90,3 +116,13 @@ Thumbs.db
|
||||
|
||||
# User-specific private settings
|
||||
*.DotSettings.user
|
||||
|
||||
# Compressed
|
||||
*.zip
|
||||
*.gz
|
||||
|
||||
# CMake
|
||||
**/cmake_install.cmake
|
||||
**/CMakeCache.txt
|
||||
**/CMakeFiles/
|
||||
.zig-cache
|
||||
|
59
CMakeLists.txt
Normal file
59
CMakeLists.txt
Normal file
@ -0,0 +1,59 @@
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
|
||||
# Project name
|
||||
project(WebUILibrary)
|
||||
|
||||
# Set C++ standard
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
# Variables for library names, source files, etc.
|
||||
set(WEBUI_OUT_LIB_NAME "webui-2")
|
||||
|
||||
# Conditional compilation for TLS
|
||||
option(WEBUI_USE_TLS "Enable TLS support" OFF)
|
||||
if(WEBUI_USE_TLS)
|
||||
find_package(OpenSSL REQUIRED)
|
||||
set(WEBUI_OUT_LIB_NAME "webui-2-secure")
|
||||
endif()
|
||||
|
||||
# Source files (already filled)
|
||||
set(SOURCE_FILES
|
||||
src/civetweb/civetweb.c
|
||||
src/webui.c
|
||||
)
|
||||
|
||||
# Library targets
|
||||
add_library(webui ${SOURCE_FILES})
|
||||
target_include_directories(webui PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>)
|
||||
target_compile_definitions(webui PUBLIC NDEBUG NO_CACHING NO_CGI USE_WEBSOCKET)
|
||||
|
||||
if(BUILD_SHARED_LIBS AND WIN32)
|
||||
target_compile_definitions(webui PRIVATE CIVETWEB_DLL_EXPORTS PUBLIC CIVETWEB_DLL_IMPORTS)
|
||||
endif()
|
||||
|
||||
if(WEBUI_USE_TLS)
|
||||
target_compile_definitions(webui PUBLIC WEBUI_TLS NO_SSL_DL OPENSSL_API_1_1)
|
||||
target_link_libraries(webui PRIVATE OpenSSL::SSL OpenSSL::Crypto)
|
||||
else()
|
||||
target_compile_definitions(webui PUBLIC NO_SSL)
|
||||
endif()
|
||||
|
||||
set_target_properties(webui PROPERTIES
|
||||
OUTPUT_NAME ${WEBUI_OUT_LIB_NAME}
|
||||
PREFIX "")
|
||||
|
||||
# Install headers
|
||||
install(FILES include/webui.h include/webui.hpp DESTINATION include)
|
||||
|
||||
# Install targets
|
||||
install(TARGETS webui
|
||||
EXPORT webui
|
||||
ARCHIVE DESTINATION lib
|
||||
LIBRARY DESTINATION lib)
|
||||
|
||||
install(EXPORT webui
|
||||
FILE webui-config.cmake
|
||||
NAMESPACE webui::
|
||||
DESTINATION share/webui
|
||||
)
|
200
GNUmakefile
Normal file
200
GNUmakefile
Normal file
@ -0,0 +1,200 @@
|
||||
# WebUI Library
|
||||
|
||||
# == 1. VARIABLES =============================================================
|
||||
|
||||
WEBUI_OUT_LIB_NAME = webui-2
|
||||
|
||||
# Detect the OS once
|
||||
ifeq ($(OS),Windows_NT)
|
||||
DETECTED_OS := Windows
|
||||
else
|
||||
DETECTED_OS := $(shell uname -s)
|
||||
endif
|
||||
|
||||
# TLS
|
||||
WEBUI_USE_TLS =
|
||||
WEBUI_TLS_INCLUDE ?= .
|
||||
WEBUI_TLS_LIB ?= .
|
||||
TLS_CFLAG = -DNO_SSL
|
||||
TLS_LDFLAG_DYNAMIC =
|
||||
ifeq ($(WEBUI_USE_TLS), 1)
|
||||
WEBUI_OUT_LIB_NAME = webui-2-secure
|
||||
TLS_CFLAG = -DWEBUI_TLS -DNO_SSL_DL -DOPENSSL_API_1_1
|
||||
ifeq ($(DETECTED_OS),Windows)
|
||||
TLS_LDFLAG_DYNAMIC = -lssl -lcrypto -lbcrypt
|
||||
else
|
||||
TLS_LDFLAG_DYNAMIC = -lssl -lcrypto
|
||||
endif
|
||||
endif
|
||||
|
||||
MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
|
||||
MAKEFILE_DIR := $(dir $(MAKEFILE_PATH))
|
||||
BUILD_DIR := $(MAKEFILE_DIR)/dist
|
||||
|
||||
# ARGS
|
||||
CC ?= gcc
|
||||
ifeq ($(CC), cc)
|
||||
ifeq ($(DETECTED_OS),Darwin)
|
||||
CC = clang
|
||||
else
|
||||
CC = gcc
|
||||
endif
|
||||
endif
|
||||
|
||||
# Allow to add arch-target for macOS CI cross compilation
|
||||
ARCH_TARGET ?=
|
||||
|
||||
# BUILD FLAGS
|
||||
CIVETWEB_BUILD_FLAGS := -o civetweb.o -I"$(MAKEFILE_DIR)/include/" -c "$(MAKEFILE_DIR)/src/civetweb/civetweb.c" -I"$(WEBUI_TLS_INCLUDE)" $(TLS_CFLAG) -w
|
||||
CIVETWEB_DEFINE_FLAGS = -DNDEBUG -DNO_CACHING -DNO_CGI -DUSE_WEBSOCKET $(TLS_CFLAG)
|
||||
WEBUI_BUILD_FLAGS := -o webui.o -I"$(MAKEFILE_DIR)/include/" -c "$(MAKEFILE_DIR)/src/webui.c" -I"$(WEBUI_TLS_INCLUDE)" $(TLS_CFLAG)
|
||||
WARNING_RELEASE := -w
|
||||
WARNING_LOG := -Wall -Wno-unused
|
||||
|
||||
# OUTPUT FILES
|
||||
# The static output is the same for all platforms
|
||||
# The dynamic output is platform dependent
|
||||
LIB_STATIC_OUT := lib$(WEBUI_OUT_LIB_NAME)-static.a
|
||||
|
||||
# Platform defaults and dynamic library outputs
|
||||
ifeq ($(DETECTED_OS),Windows)
|
||||
# Windows
|
||||
SHELL := CMD
|
||||
PLATFORM := windows
|
||||
LIB_DYN_OUT := $(WEBUI_OUT_LIB_NAME).dll
|
||||
LWS2_OPT := -lws2_32 -lole32
|
||||
CIVETWEB_DEFINE_FLAGS += -DMUST_IMPLEMENT_CLOCK_GETTIME
|
||||
else ifeq ($(DETECTED_OS),Darwin)
|
||||
# MacOS
|
||||
PLATFORM := macos
|
||||
CC = clang
|
||||
LIB_DYN_OUT := lib$(WEBUI_OUT_LIB_NAME).dylib
|
||||
WEBKIT_OBJ := wkwebview.o
|
||||
WKWEBKIT_BUILD_FLAGS := -o wkwebview.o -c "$(MAKEFILE_DIR)/src/webview/wkwebview.m"
|
||||
WKWEBKIT_LINK_FLAGS := -framework Cocoa -framework WebKit
|
||||
else
|
||||
# Linux
|
||||
PLATFORM := linux
|
||||
LIB_DYN_OUT := lib$(WEBUI_OUT_LIB_NAME).so
|
||||
ifeq ($(CC),clang)
|
||||
LLVM_OPT := llvm-
|
||||
endif
|
||||
endif
|
||||
|
||||
# macOS can set `ARCH_TARGET=arm64` for cross-compilation.
|
||||
ifneq ($(ARCH_TARGET),)
|
||||
ifneq ($(PLATFORM),macos)
|
||||
$(error ARCH_TARGET is only available on macOS)
|
||||
endif
|
||||
ifeq ($(ARCH_TARGET),arm64)
|
||||
TARGET := -target arm64-apple-darwin -arch arm64
|
||||
else ifeq ($(ARCH_TARGET),x64)
|
||||
TARGET := -target x86_64-apple-darwin -arch x86_64
|
||||
else
|
||||
$(error Unsupported ARCH_TARGET: $(ARCH_TARGET). Use 'arm64' or 'x64'.)
|
||||
endif
|
||||
endif
|
||||
|
||||
# == 2.TARGETS ================================================================
|
||||
|
||||
all: release
|
||||
|
||||
debug: --debug
|
||||
|
||||
release: --release
|
||||
|
||||
clean: --clean-$(PLATFORM)
|
||||
|
||||
# == 2.1 INTERNAL TARGETS =====================================================
|
||||
|
||||
--debug:
|
||||
# Create build directory
|
||||
ifeq ($(PLATFORM),windows)
|
||||
@mkdir "$(BUILD_DIR)/debug" >nul 2>&1 ||:
|
||||
else
|
||||
@mkdir -p "$(BUILD_DIR)/debug"
|
||||
endif
|
||||
# Build macOS WKWebView
|
||||
ifeq ($(DETECTED_OS),Darwin)
|
||||
@cd "$(BUILD_DIR)/debug" \
|
||||
&& echo "Build WebUI Objective-C WKWebKit ($(CC) $(TARGET) debug)..." \
|
||||
&& $(CC) $(TARGET) $(WKWEBKIT_BUILD_FLAGS) -g -DWEBUI_LOG
|
||||
endif
|
||||
# Static with Debug info
|
||||
@cd "$(BUILD_DIR)/debug" \
|
||||
&& echo "Build WebUI library ($(CC) $(TARGET) debug static)..." \
|
||||
&& $(CC) $(TARGET) $(CIVETWEB_BUILD_FLAGS) $(CIVETWEB_DEFINE_FLAGS) -g \
|
||||
&& $(CC) $(TARGET) $(WEBUI_BUILD_FLAGS) $(WARNING_LOG) -g -DWEBUI_LOG \
|
||||
&& $(LLVM_OPT)ar rc $(LIB_STATIC_OUT) webui.o civetweb.o $(WEBKIT_OBJ) \
|
||||
&& $(LLVM_OPT)ranlib $(LIB_STATIC_OUT)
|
||||
# Dynamic with Debug info
|
||||
@cd "$(BUILD_DIR)/debug" \
|
||||
&& echo "Build WebUI library ($(CC) $(TARGET) debug dynamic)..." \
|
||||
&& $(CC) $(TARGET) $(CIVETWEB_BUILD_FLAGS) $(CIVETWEB_DEFINE_FLAGS) -g -fPIC \
|
||||
&& $(CC) $(TARGET) $(WEBUI_BUILD_FLAGS) $(WARNING_LOG) -g -fPIC -DWEBUI_LOG -DWEBUI_DYNAMIC \
|
||||
&& $(CC) $(TARGET) -shared -o $(LIB_DYN_OUT) webui.o civetweb.o $(WEBKIT_OBJ) -g -L"$(WEBUI_TLS_LIB)" $(TLS_LDFLAG_DYNAMIC) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS)
|
||||
ifeq ($(PLATFORM),windows)
|
||||
@cd "$(BUILD_DIR)/debug" && del *.o >nul 2>&1
|
||||
else
|
||||
@rm -f $(BUILD_DIR)/debug/*.o
|
||||
endif
|
||||
@echo "Done."
|
||||
|
||||
--release:
|
||||
# Create build directory
|
||||
ifeq ($(PLATFORM),windows)
|
||||
@mkdir "$(BUILD_DIR)" >nul 2>&1 ||:
|
||||
else
|
||||
@mkdir -p "$(BUILD_DIR)"
|
||||
endif
|
||||
# Build macOS WKWebView
|
||||
ifeq ($(DETECTED_OS),Darwin)
|
||||
@cd "$(BUILD_DIR)" \
|
||||
&& echo "Build WebUI Objective-C WKWebKit ($(CC) $(TARGET) release)..." \
|
||||
&& $(CC) $(TARGET) $(WKWEBKIT_BUILD_FLAGS) -Os
|
||||
endif
|
||||
# Static Release
|
||||
@cd "$(BUILD_DIR)" \
|
||||
&& echo "Build WebUI library ($(CC) $(TARGET) release static)..." \
|
||||
&& $(CC) $(TARGET) $(CIVETWEB_BUILD_FLAGS) $(CIVETWEB_DEFINE_FLAGS) -Os \
|
||||
&& $(CC) $(TARGET) $(WEBUI_BUILD_FLAGS) $(WARNING_RELEASE) -Os \
|
||||
&& $(LLVM_OPT)ar rc $(LIB_STATIC_OUT) webui.o civetweb.o $(WEBKIT_OBJ) \
|
||||
&& $(LLVM_OPT)ranlib $(LIB_STATIC_OUT)
|
||||
# Dynamic Release
|
||||
@cd "$(BUILD_DIR)" \
|
||||
&& echo "Build WebUI library ($(CC) $(TARGET) release dynamic)..." \
|
||||
&& $(CC) $(TARGET) $(CIVETWEB_BUILD_FLAGS) $(CIVETWEB_DEFINE_FLAGS) -Os -fPIC \
|
||||
&& $(CC) $(TARGET) $(WEBUI_BUILD_FLAGS) $(WARNING_RELEASE) -O3 -fPIC -DWEBUI_DYNAMIC \
|
||||
&& $(CC) $(TARGET) -shared -o $(LIB_DYN_OUT) webui.o civetweb.o $(WEBKIT_OBJ) -L"$(WEBUI_TLS_LIB)" $(TLS_LDFLAG_DYNAMIC) $(LWS2_OPT) $(WKWEBKIT_LINK_FLAGS)
|
||||
# Clean
|
||||
ifeq ($(PLATFORM),windows)
|
||||
@strip --strip-unneeded $(BUILD_DIR)/$(LIB_DYN_OUT)
|
||||
@cd "$(BUILD_DIR)" && del *.o >nul 2>&1
|
||||
else
|
||||
@rm -f $(BUILD_DIR)/*.o
|
||||
endif
|
||||
@echo "Done."
|
||||
|
||||
# PLATFROM CLEAN TARGETS
|
||||
|
||||
--clean-linux: --clean-unix
|
||||
|
||||
--clean-macos: --clean-unix
|
||||
|
||||
--clean-unix:
|
||||
@- cd "$(BUILD_DIR)" \
|
||||
&& rm -f *.o \
|
||||
&& rm -f *.so \
|
||||
&& rm -f *.dylib \
|
||||
&& rm -f *.a
|
||||
|
||||
--clean-windows:
|
||||
@- cd "$(BUILD_DIR)" \
|
||||
&& del *.a >nul 2>&1 \
|
||||
&& del *.o >nul 2>&1 \
|
||||
&& del *.dll >nul 2>&1 \
|
||||
&& del *.obj >nul 2>&1 \
|
||||
&& del *.ilk >nul 2>&1 \
|
||||
&& del *.pdb >nul 2>&1 \
|
||||
&& del *.lib >nul 2>&1 \
|
||||
&& del *.exp >nul 2>&1
|
2
LICENSE
2
LICENSE
@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 Albert Shown
|
||||
Copyright (c) 2025 Hassan Draga
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
92
Makefile
Normal file
92
Makefile
Normal file
@ -0,0 +1,92 @@
|
||||
# WebUI Library
|
||||
# Windows - Microsoft Visual C
|
||||
|
||||
# == 1. VARIABLES =============================================================
|
||||
|
||||
WEBUI_OUT_LIB_NAME = webui-2
|
||||
TLS_CFLAG = /DNO_SSL
|
||||
|
||||
# TLS Enabled
|
||||
!IF "$(WEBUI_USE_TLS)" == "1"
|
||||
|
||||
WEBUI_OUT_LIB_NAME = webui-2-secure
|
||||
TLS_CFLAG = /DWEBUI_TLS /DNO_SSL_DL /DOPENSSL_API_1_1
|
||||
TLS_LDFLAG_DYNAMIC = libssl.lib libcrypto.lib
|
||||
|
||||
!IF "$(WEBUI_TLS_INCLUDE)" != ""
|
||||
TLS_CFLAG = $(TLS_CFLAG) /I"$(WEBUI_TLS_INCLUDE)"
|
||||
!ELSE
|
||||
TLS_CFLAG = $(TLS_CFLAG) /I"."
|
||||
!ENDIF
|
||||
|
||||
!IF "$(WEBUI_TLS_LIB)" != ""
|
||||
TLS_LDFLAG_DYNAMIC = $(TLS_LDFLAG_DYNAMIC) /LIBPATH:"$(WEBUI_TLS_LIB)"
|
||||
!ELSE
|
||||
TLS_LDFLAG_DYNAMIC += $(TLS_LDFLAG_DYNAMIC) /LIBPATH:"."
|
||||
!ENDIF
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Build Flags
|
||||
CIVETWEB_BUILD_FLAGS = /Fo"civetweb.obj" /c /EHsc "$(MAKEDIR)/src/civetweb/civetweb.c" /I"$(MAKEDIR)/src/civetweb/" $(TLS_CFLAG)
|
||||
CIVETWEB_DEFINE_FLAGS = /D NDEBUG /D NO_CACHING /D NO_CGI /D USE_WEBSOCKET
|
||||
WEBUI_BUILD_FLAGS = /Fo"webui.obj" /c /EHsc "$(MAKEDIR)/src/webui.c" /I"$(MAKEDIR)/include" /I"$(WEBUI_TLS_INCLUDE)" $(TLS_CFLAG)
|
||||
WARNING_RELEASE = /w
|
||||
WARNING_LOG = /W4
|
||||
|
||||
# Output Commands
|
||||
LIB_STATIC_OUT = /OUT:"$(WEBUI_OUT_LIB_NAME)-static.lib" "webui.obj" "civetweb.obj"
|
||||
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)
|
||||
|
||||
# == 2.TARGETS ================================================================
|
||||
|
||||
all: release
|
||||
|
||||
debug:
|
||||
@- mkdir dist\debug >nul 2>&1
|
||||
# Static with Debug info
|
||||
@- cd $(MAKEDIR)/dist/debug
|
||||
@echo Build WebUI Library (MSVC Debug Static)...
|
||||
@cl /Zl /Zi $(CIVETWEB_BUILD_FLAGS) $(CIVETWEB_DEFINE_FLAGS)
|
||||
@cl /Zl /Zi $(WEBUI_BUILD_FLAGS) $(WARNING_LOG) /D WEBUI_LOG
|
||||
@lib $(LIB_STATIC_OUT)
|
||||
# Dynamic with Debug info
|
||||
@echo Build WebUI Library (MSVC Debug Dynamic)...
|
||||
@cl /Zi $(CIVETWEB_BUILD_FLAGS) $(CIVETWEB_DEFINE_FLAGS)
|
||||
@cl /Zi $(WEBUI_BUILD_FLAGS) $(WARNING_LOG) /D WEBUI_LOG /D WEBUI_DYNAMIC
|
||||
@link $(LIB_DYN_OUT)
|
||||
# Clean
|
||||
@- del *.obj >nul 2>&1
|
||||
@- del *.ilk >nul 2>&1
|
||||
@- del *.exp >nul 2>&1
|
||||
@echo Done.
|
||||
|
||||
release:
|
||||
@- mkdir dist >nul 2>&1
|
||||
@- cd $(MAKEDIR)/dist
|
||||
# Static Release
|
||||
@echo Build WebUI Library (MSVC Release Static)...
|
||||
@cl /Zl $(CIVETWEB_BUILD_FLAGS) $(CIVETWEB_DEFINE_FLAGS)
|
||||
@cl /Zl $(WEBUI_BUILD_FLAGS) $(WARNING_RELEASE)
|
||||
@lib $(LIB_STATIC_OUT)
|
||||
# Dynamic Release
|
||||
@echo Build WebUI Library (MSVC Release Dynamic)...
|
||||
@cl $(CIVETWEB_BUILD_FLAGS) $(CIVETWEB_DEFINE_FLAGS)
|
||||
@cl $(WEBUI_BUILD_FLAGS) $(WARNING_RELEASE) /D WEBUI_DYNAMIC
|
||||
@link $(LIB_DYN_OUT)
|
||||
# Clean
|
||||
@- del *.pdb >nul 2>&1
|
||||
@- del *.obj >nul 2>&1
|
||||
@- del *.ilk >nul 2>&1
|
||||
@- del *.exp >nul 2>&1
|
||||
@- echo Done.
|
||||
|
||||
clean:
|
||||
@- cd $(BUILD_DIR)
|
||||
@- del *.pdb >nul 2>&1
|
||||
@- del *.obj >nul 2>&1
|
||||
@- del *.ilk >nul 2>&1
|
||||
@- del *.exp >nul 2>&1
|
||||
@- del *.dll >nul 2>&1
|
||||
@- del *.lib >nul 2>&1
|
||||
@- echo Done.
|
356
README.md
356
README.md
@ -1,140 +1,298 @@
|
||||

|
||||
<div align="center">
|
||||
|
||||
# WebUI v2.3.0
|
||||

|
||||
|
||||
[](https://github.com/webui-dev/webui) [](https://github.com/webui-dev/webui/issues) [](https://webui.me/)
|
||||
# WebUI v2.5.0-beta.4
|
||||
|
||||
> Use any web browser as GUI, with your preferred language in the backend and HTML5 in the frontend, all in a lightweight portable lib.
|
||||
[build-status]: https://img.shields.io/github/actions/workflow/status/webui-dev/webui/ci.yml?branch=main&style=for-the-badge&logo=githubactions&labelColor=414868&logoColor=C0CAF5
|
||||
[last-commit]: https://img.shields.io/github/last-commit/webui-dev/webui?style=for-the-badge&logo=github&logoColor=C0CAF5&labelColor=414868
|
||||
[release-version]: https://img.shields.io/github/v/tag/webui-dev/webui?style=for-the-badge&logo=webtrees&logoColor=C0CAF5&labelColor=414868&color=7664C6
|
||||
[license]: https://img.shields.io/github/license/webui-dev/webui?style=for-the-badge&logo=opensourcehardware&label=License&logoColor=C0CAF5&labelColor=414868&color=8c73cc
|
||||
|
||||

|
||||
[![][build-status]](https://github.com/webui-dev/webui/actions?query=branch%3Amain)
|
||||
[![][last-commit]](https://github.com/webui-dev/webui/pulse)
|
||||
[![][release-version]](https://github.com/webui-dev/webui/releases/latest)
|
||||
[![][license]](https://github.com/webui-dev/webui/blob/main/LICENSE)
|
||||
|
||||
> :warning: **Notice**:
|
||||
>
|
||||
> * WebUI it's not a web-server solution or a framework, but it's an lightweight portable lib to use any installed web browser as a user interface.
|
||||
>
|
||||
> * We are currently writing documentation.
|
||||
> 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.
|
||||
|
||||

|
||||
|
||||
</div>
|
||||
|
||||
## Download
|
||||
|
||||
- [Latest Stable Release](https://github.com/webui-dev/webui/releases)
|
||||
- [Nightly Build](https://github.com/webui-dev/webui/releases/tag/nightly)
|
||||
|
||||
## Contents
|
||||
|
||||
- [Features](#features)
|
||||
- [Showcase](#showcase)
|
||||
- [UI & The Web Technologies](#ui--the-web-technologies)
|
||||
- [Documentation](#documentation)
|
||||
- [Build](#build)
|
||||
- [Examples](#examples)
|
||||
- [Wrappers](#wrappers)
|
||||
- [Supported Web Browsers](#supported-web-browsers)
|
||||
- [License](#license)
|
||||
|
||||
## Features
|
||||
|
||||
- Written in Pure C
|
||||
- Fully Independent (*No need for any third-party runtimes*)
|
||||
- Lightweight (*~160 Kb using TCC*) & Small memory footprint
|
||||
- Fast binary communication protocol between WebUI and the browser (*Instead of JSON*)
|
||||
- Portable (*Needs only a web browser or a WebView at runtime*)
|
||||
- One header file
|
||||
- Lightweight (*Few Kb library*) & Small memory footprint
|
||||
- Fast binary communication protocol
|
||||
- Multi-platform & Multi-Browser
|
||||
- Using private profile for safety
|
||||
|
||||
## Screenshot
|
||||
|
||||
This [text editor example](https://github.com/webui-dev/webui/tree/main/examples/C/text-editor) is written in C using WebUI as the GUI library. The final executable is portable and has less than _1 MB_ in size (_+html and css files_).
|
||||
|
||||

|
||||
|
||||
## CppCon 2019 Presentation
|
||||
|
||||
[Borislav Stanimirov](https://ibob.bg/) discusses using HTML5 in the web browser as GUI at the [C++ Conference 2019 (*YouTube*)](https://www.youtube.com/watch?v=bbbcZd4cuxg).
|
||||
|
||||
<!-- <div align="center">
|
||||
<a href="https://www.youtube.com/watch?v=bbbcZd4cuxg"><img src="https://img.youtube.com/vi/bbbcZd4cuxg/0.jpg" alt="Embrace Modern Technology: Using HTML 5 for GUI in C++ - Borislav Stanimirov - CppCon 2019"></a>
|
||||
</div> -->
|
||||
|
||||

|
||||
- Cross-platform WebView
|
||||
|
||||
## UI & The Web Technologies
|
||||
|
||||
[Borislav Stanimirov](https://ibob.bg/) discusses using HTML5 in the web browser as GUI at the [C++ Conference 2019 (_YouTube_)](https://www.youtube.com/watch?v=bbbcZd4cuxg).
|
||||
|
||||
<div align="center">
|
||||
|
||||

|
||||
|
||||
</div>
|
||||
|
||||
Web application UI design is not just about how a product looks but how it works. Using web technologies in your UI makes your product modern and professional, And a well-designed web application will help you make a solid first impression on potential customers. Great web application design also assists you in nurturing leads and increasing conversions. In addition, it makes navigating and using your web app easier for your users.
|
||||
|
||||
## Why Use Web Browser?
|
||||
### Why Use Web Browsers?
|
||||
|
||||
Today's web browsers have everything a modern UI needs. Web browsers are very sophisticated and optimized. Therefore, using it as a GUI will be an excellent choice. While old legacy GUI lib is complex and outdated, a WebView-based app is still an option. However, a WebView needs a huge SDK to build and many dependencies to run, and it can only provide some features like a real web browser. That is why WebUI uses real web browsers to give you full features of comprehensive web technologies while keeping your software lightweight and portable.
|
||||
|
||||
## How does it work?
|
||||
### How Does it Work?
|
||||
|
||||

|
||||
<div align="center">
|
||||
|
||||

|
||||
|
||||
</div>
|
||||
|
||||
Think of WebUI like a WebView controller, but instead of embedding the WebView controller in your program, which makes the final program big in size, and non-portable as it needs the WebView runtimes. Instead, by using WebUI, you use a tiny static/dynamic library to run any installed web browser and use it as GUI, which makes your program small, fast, and portable. **All it needs is a web browser**.
|
||||
|
||||
## Runtime Dependencies Comparison
|
||||
### Runtime Dependencies Comparison
|
||||
|
||||
| | WebView | Qt | WebUI |
|
||||
| ------ | ------ | ------ | ------ |
|
||||
| Runtime Dependencies on Windows | *WebView2* | *QtCore, QtGui, QtWidgets* | ***A Web Browser*** |
|
||||
| Runtime Dependencies on Linux | *GTK3, WebKitGTK* | *QtCore, QtGui, QtWidgets* | ***A Web Browser*** |
|
||||
| Runtime Dependencies on macOS | *Cocoa, WebKit* | *QtCore, QtGui, QtWidgets* | ***A Web Browser*** |
|
||||
| | Tauri / WebView | Qt | WebUI |
|
||||
| ------------------------------- | ----------------- | -------------------------- | ------------------- |
|
||||
| Runtime Dependencies on Windows | _WebView2_ | _QtCore, QtGui, QtWidgets_ | **_A Web Browser_** |
|
||||
| Runtime Dependencies on Linux | _GTK3, WebKitGTK_ | _QtCore, QtGui, QtWidgets_ | **_A Web Browser_** |
|
||||
| Runtime Dependencies on macOS | _Cocoa, WebKit_ | _QtCore, QtGui, QtWidgets_ | **_A Web Browser_** |
|
||||
|
||||
## Documentation
|
||||
|
||||
- [Online Documentation - C](https://webui.me/docs/#/c_api)
|
||||
- [Online Documentation - C++](https://webui.me/docs/#/cpp_api)
|
||||
> **Note**
|
||||
> We are currently writing documentation.
|
||||
|
||||
## Build
|
||||
- [Online Documentation](https://webui.me/docs/)
|
||||
|
||||
- [Windows](https://github.com/webui-dev/webui/tree/main/build/Windows)
|
||||
- [Linux](https://github.com/webui-dev/webui/tree/main/build/Linux)
|
||||
- [macOS](https://github.com/webui-dev/webui/tree/main/build/macOS)
|
||||
## Build WebUI Library
|
||||
|
||||
## Examples
|
||||
### Windows
|
||||
|
||||
- [C](https://github.com/webui-dev/webui/tree/main/examples/C)
|
||||
- [C++](https://github.com/webui-dev/webui/tree/main/examples/C++)
|
||||
| Compiler | Command |
|
||||
|----------|---------|
|
||||
| GCC | `mingw32-make` |
|
||||
| MSVC | `nmake` |
|
||||
|
||||
## Wrappers
|
||||
<details>
|
||||
<summary><strong>Windows SSL/TLS (Optional)</strong></summary>
|
||||
|
||||
Download and install the OpenSSL pre-compiled binaries for Windows:
|
||||
|
||||
- [Python](https://github.com/webui-dev/python-webui)
|
||||
- [TypeScript / JavaScript](https://github.com/webui-dev/deno-webui)
|
||||
- [Go](https://github.com/webui-dev/go-webui)
|
||||
- [Rust](https://github.com/webui-dev/rust-webui) (*Not Complete*)
|
||||
- [V](https://github.com/webui-dev/v-webui)
|
||||
- [Nim](https://github.com/webui-dev/nim-webui)
|
||||
- [Zig](https://github.com/webui-dev/zig-webui) (*Not Complete*)
|
||||
- **MSVC**: [x64 OpenSSL v3.3.1](https://slproweb.com/download/Win64OpenSSL-3_3_1.msi) or [_32Bit_](https://slproweb.com/download/Win32OpenSSL-3_3_1.msi). See the [Wiki list](https://wiki.openssl.org/index.php/Binaries) for more info.
|
||||
- **MinGW**: [Curl for Windows with OpenSSL](https://curl.se/windows/)
|
||||
|
||||
```powershell
|
||||
# GCC
|
||||
mingw32-make WEBUI_USE_TLS=1 WEBUI_TLS_INCLUDE="C:\curl-xxx-xxx-mingw\curl-xxx-xxx-mingw\include" WEBUI_TLS_LIB="C:\curl-xxx-xxx-mingw\curl-xxx-xxx-mingw\lib"
|
||||
|
||||
# MSVC
|
||||
nmake WEBUI_USE_TLS=1 WEBUI_TLS_INCLUDE="C:\Program Files\OpenSSL-xxx\include" WEBUI_TLS_LIB="C:\Program Files\OpenSSL-xxx\lib"
|
||||
```
|
||||
</details>
|
||||
|
||||
### Linux
|
||||
|
||||
| Compiler | Command |
|
||||
|----------|---------|
|
||||
| GCC | `make` |
|
||||
| Clang | `make CC=clang` |
|
||||
|
||||
<details>
|
||||
<summary><strong>Linux SSL/TLS (Optional)</strong></summary>
|
||||
|
||||
```sh
|
||||
sudo apt update
|
||||
sudo apt install libssl-dev
|
||||
|
||||
# GCC
|
||||
make WEBUI_USE_TLS=1
|
||||
|
||||
# Clang
|
||||
make WEBUI_USE_TLS=1 CC=clang
|
||||
```
|
||||
</details>
|
||||
|
||||
### macOS
|
||||
|
||||
| Compiler | Command |
|
||||
|----------|---------|
|
||||
| Default | `make` |
|
||||
|
||||
<details>
|
||||
<summary><strong>macOS SSL/TLS (Optional)</strong></summary>
|
||||
|
||||
```sh
|
||||
brew install openssl
|
||||
make WEBUI_USE_TLS=1
|
||||
```
|
||||
</details>
|
||||
|
||||
## Minimal WebUI Application
|
||||
|
||||
- **C**
|
||||
|
||||
```c
|
||||
#include "webui.h"
|
||||
|
||||
int main() {
|
||||
size_t my_window = webui_new_window();
|
||||
webui_show(my_window, "<html><head><script src=\"webui.js\"></script></head> Hello World ! </html>");
|
||||
webui_wait();
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
- **C++**
|
||||
|
||||
```cpp
|
||||
#include "webui.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int main() {
|
||||
webui::window my_window;
|
||||
my_window.show("<html><head><script src=\"webui.js\"></script></head> C++ Hello World ! </html>");
|
||||
webui::wait();
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
- **More C/C++ Examples**
|
||||
|
||||
- [C](https://github.com/webui-dev/webui/tree/main/examples/C)
|
||||
- [C++](https://github.com/webui-dev/webui/tree/main/examples/C++)
|
||||
|
||||
- **Other Languages**
|
||||
|
||||
- [Wrappers List](#Wrappers)
|
||||
|
||||
## Build WebUI Application
|
||||
|
||||
### Windows
|
||||
|
||||
| Compiler | Type | Command |
|
||||
|----------|--------|---------|
|
||||
| GCC | Static | `gcc -Os -Wl,-subsystem=windows my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" -lwebui-2-static -lws2_32 -Wall -luser32 -static -lole32 -o my_application.exe` |
|
||||
| GCC | Dynamic | `gcc -Wl,-subsystem=windows my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" "webui-2.dll" -lws2_32 -Wall -luser32 -lole32 -o my_application.exe` |
|
||||
| MSVC | Static | `cl my_application.c /I"_PATH_TO_WEBUI_INCLUDE_" /link /LIBPATH:"_PATH_TO_WEBUI_LIB_" /SUBSYSTEM:WINDOWS webui-2-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:my_application.exe` |
|
||||
| MSVC | Dynamic | `cl my_application.c /I"_PATH_TO_WEBUI_INCLUDE_" /link /LIBPATH:"_PATH_TO_WEBUI_LIB_" /SUBSYSTEM:WINDOWS webui-2.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:my_application.exe` |
|
||||
|
||||
<details>
|
||||
<summary><strong>Windows With SSL/TLS (Optional)</strong></summary>
|
||||
|
||||
| Compiler | Type | Command |
|
||||
|----------|--------|---------|
|
||||
| GCC | Static | `gcc -Os -Wl,-subsystem=windows my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" -lwebui-2-secure-static -lws2_32 -Wall -luser32 -static -lole32 -o my_application.exe` |
|
||||
| GCC | Dynamic | `gcc -Wl,-subsystem=windows my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" "webui-2-secure.dll" -lws2_32 -Wall -luser32 -lole32 -o my_application.exe` |
|
||||
| MSVC | Static | `cl my_application.c /I"_PATH_TO_WEBUI_INCLUDE_" /link /LIBPATH:"_PATH_TO_WEBUI_LIB_" /SUBSYSTEM:WINDOWS webui-2-secure-static.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:my_application.exe` |
|
||||
| MSVC | Dynamic | `cl my_application.c /I"_PATH_TO_WEBUI_INCLUDE_" /link /LIBPATH:"_PATH_TO_WEBUI_LIB_" /SUBSYSTEM:WINDOWS webui-2-secure.lib user32.lib Advapi32.lib Shell32.lib Ole32.lib /OUT:my_application.exe` |
|
||||
</details>
|
||||
|
||||
### Linux
|
||||
|
||||
| Compiler | Type | Command |
|
||||
|----------|--------|---------|
|
||||
| GCC | Static | `gcc -Os my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" -lwebui-2-static -lpthread -lm -ldl -o my_application` |
|
||||
| GCC | Dynamic | `gcc my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" -lwebui-2 -lpthread -lm -ldl -o my_application` |
|
||||
| Clang | Static | `clang -Os my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" -lwebui-2-static -lpthread -lm -ldl -o my_application` |
|
||||
| Clang | Dynamic | `clang my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" -lwebui-2 -lpthread -lm -ldl -o my_application` |
|
||||
|
||||
<details>
|
||||
<summary><strong>Linux With SSL/TLS (Optional)</strong></summary>
|
||||
|
||||
| Compiler | Type | Command |
|
||||
|----------|--------|---------|
|
||||
| GCC | Static | `gcc -Os my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" -lwebui-2-secure-static -lpthread -lm -ldl -o my_application` |
|
||||
| GCC | Dynamic | `gcc my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" -lwebui-2-secure -lpthread -lm -ldl -o my_application` |
|
||||
| Clang | Static | `clang -Os my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" -lwebui-2-secure-static -lpthread -lm -ldl -o my_application` |
|
||||
| Clang | Dynamic | `clang my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" -lwebui-2-secure -lpthread -lm -ldl -o my_application` |
|
||||
</details>
|
||||
|
||||
### macOS
|
||||
|
||||
| Compiler | Type | Command |
|
||||
|----------|--------|---------|
|
||||
| Clang | Static | `clang -Os my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" -lwebui-2-static -lpthread -lm -framework Cocoa -framework WebKit -o my_application` |
|
||||
| Clang | Dynamic | `clang my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" -lwebui-2 -lpthread -lm -framework Cocoa -framework WebKit -o my_application` |
|
||||
|
||||
<details>
|
||||
<summary><strong>macOS With SSL/TLS (Optional)</strong></summary>
|
||||
|
||||
| Compiler | Type | Command |
|
||||
|----------|--------|---------|
|
||||
| Clang | Static | `clang -Os my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" -lwebui-2-secure-static -lpthread -lm -framework Cocoa -framework WebKit -o my_application` |
|
||||
| Clang | Dynamic | `clang my_application.c -I"_PATH_TO_WEBUI_INCLUDE_" -L"_PATH_TO_WEBUI_LIB_" -lwebui-2-secure -lpthread -lm -framework Cocoa -framework WebKit -o my_application` |
|
||||
</details>
|
||||
|
||||
## Wrappers
|
||||
|
||||
| Language | v2.4.0 API | v2.5.0 API | Link |
|
||||
| --------------- | --- | -------------- | --------------------------------------------------------- |
|
||||
| Python | ✔️ | _not complete_ | [Python-WebUI](https://github.com/webui-dev/python-webui) |
|
||||
| Go | ✔️ | _not complete_ | [Go-WebUI](https://github.com/webui-dev/go-webui) |
|
||||
| Zig | ✔️ | _not complete_ | [Zig-WebUI](https://github.com/webui-dev/zig-webui) |
|
||||
| Nim | ✔️ | _not complete_ | [Nim-WebUI](https://github.com/webui-dev/nim-webui) |
|
||||
| V | ✔️ | _not complete_ | [V-WebUI](https://github.com/webui-dev/v-webui) |
|
||||
| Rust | _not complete_ | _not complete_ | [Rust-WebUI](https://github.com/webui-dev/rust-webui) |
|
||||
| TS / JS (Deno) | ✔️ | _not complete_ | [Deno-WebUI](https://github.com/webui-dev/deno-webui) |
|
||||
| TS / JS (Bun) | _not complete_ | _not complete_ | [Bun-WebUI](https://github.com/webui-dev/bun-webui) |
|
||||
| Swift | _not complete_ | _not complete_ | [Swift-WebUI](https://github.com/webui-dev/swift-webui) |
|
||||
| Odin | _not complete_ | _not complete_ | [Odin-WebUI](https://github.com/webui-dev/odin-webui) |
|
||||
| Pascal | _not complete_ | _not complete_ | [Pascal-WebUI](https://github.com/webui-dev/pascal-webui) |
|
||||
| Purebasic | _not complete_ | _not complete_ | [Purebasic-WebUI](https://github.com/webui-dev/purebasic-webui)|
|
||||
| - | | |
|
||||
| Common Lisp | _not complete_ | _not complete_ | [cl-webui](https://github.com/garlic0x1/cl-webui) |
|
||||
| Delphi | _not complete_ | _not complete_ | [WebUI4Delphi](https://github.com/salvadordf/WebUI4Delphi) |
|
||||
| C# | _not complete_ | _not complete_ | [WebUI4CSharp](https://github.com/salvadordf/WebUI4CSharp) |
|
||||
| WebUI.NET | _not complete_ | _not complete_ | [WebUI.NET](https://github.com/Juff-Ma/WebUI.NET) |
|
||||
| QuickJS | _not complete_ | _not complete_ | [QuickUI](https://github.com/xland/QuickUI) |
|
||||
| PHP | _not complete_ | _not complete_ | [PHPWebUiComposer](https://github.com/KingBes/php-webui-composer) |
|
||||
|
||||
## Supported Web Browsers
|
||||
|
||||
| OS | Browser | Status |
|
||||
| ------ | ------ | ------ |
|
||||
| Windows | Mozilla Firefox | ✔️ |
|
||||
| Windows | Google Chrome | ✔️ |
|
||||
| Windows | Microsoft Edge | ✔️ |
|
||||
| Windows | Chromium | ✔️ |
|
||||
| Windows | Yandex | ✔️ |
|
||||
| Windows | Brave | ✔️ |
|
||||
| Windows | Vivaldi | ✔️ |
|
||||
| Windows | Epic | ✔️ |
|
||||
| Windows | Opera | *coming soon* |
|
||||
| - | - | - |
|
||||
| Linux | Mozilla Firefox | ✔️ |
|
||||
| Linux | Google Chrome | ✔️ |
|
||||
| Linux | Microsoft Edge | ✔️ |
|
||||
| Linux | Chromium | ✔️ |
|
||||
| Linux | Yandex | ✔️ |
|
||||
| Linux | Brave | ✔️ |
|
||||
| Linux | Vivaldi | ✔️ |
|
||||
| Linux | Epic | *Does Not Exist* |
|
||||
| Linux | Opera | *coming soon* |
|
||||
| - | - | - |
|
||||
| macOS | Mozilla Firefox | ✔️ |
|
||||
| macOS | Google Chrome | ✔️ |
|
||||
| macOS | Microsoft Edge | ✔️ |
|
||||
| macOS | Chromium | ✔️ |
|
||||
| macOS | Yandex | ✔️ |
|
||||
| macOS | Brave | ✔️ |
|
||||
| macOS | Vivaldi | ✔️ |
|
||||
| macOS | Epic | ✔️ |
|
||||
| macOS | Apple Safari | *coming soon* |
|
||||
| macOS | Opera | *coming soon* |
|
||||
| Browser | Windows | macOS | Linux |
|
||||
| --------------- | --------------- | ------------- | --------------- |
|
||||
| Mozilla Firefox | ✔️ | ✔️ | ✔️ |
|
||||
| Google Chrome | ✔️ | ✔️ | ✔️ |
|
||||
| Microsoft Edge | ✔️ | ✔️ | ✔️ |
|
||||
| Chromium | ✔️ | ✔️ | ✔️ |
|
||||
| Yandex | ✔️ | ✔️ | ✔️ |
|
||||
| Brave | ✔️ | ✔️ | ✔️ |
|
||||
| Vivaldi | ✔️ | ✔️ | ✔️ |
|
||||
| Epic | ✔️ | ✔️ | _not available_ |
|
||||
| Apple Safari | _not available_ | _coming soon_ | _not available_ |
|
||||
| Opera | _coming soon_ | _coming soon_ | _coming soon_ |
|
||||
|
||||
## Supported Languages
|
||||
## Supported WebView
|
||||
|
||||
| Language | Status | Link |
|
||||
| ------ | ------ | ------ |
|
||||
| C/C++ | ✔️ | [WebUI](https://github.com/webui-dev/webui) |
|
||||
| Python | ✔️ | [Python-WebUI](https://github.com/webui-dev/python-webui) |
|
||||
| TypeScript / JavaScript | ✔️ | [Deno-WebUI](https://github.com/webui-dev/deno-webui) |
|
||||
| Go | ✔️ | [Go-WebUI](https://github.com/webui-dev/go-webui) |
|
||||
| Rust | *Not Complete* | [Rust-WebUI](https://github.com/webui-dev/rust-webui) |
|
||||
| V | ✔️ | [V-WebUI](https://github.com/webui-dev/v-webui) |
|
||||
| Nim | ✔️ | [Nim-WebUI](https://github.com/webui-dev/nim-webui) |
|
||||
| Zig | *Not Complete* | [Zig-WebUI](https://github.com/webui-dev/zig-webui) |
|
||||
| WebView | Status |
|
||||
| --------------- | --------------- |
|
||||
| Windows WebView2 | ✔️ |
|
||||
| Linux GTK WebView | ✔️ |
|
||||
| macOS WKWebView | ✔️ |
|
||||
|
||||
### License
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,198 +0,0 @@
|
||||
/*
|
||||
WebUI Library 2.3.0
|
||||
http://webui.me
|
||||
https://github.com/webui-dev/webui
|
||||
Copyright (c) 2020-2023 Hassan Draga.
|
||||
Licensed under MIT License.
|
||||
All rights reserved.
|
||||
Canada.
|
||||
*/
|
||||
|
||||
#ifndef _WEBUI_H
|
||||
#define _WEBUI_H
|
||||
|
||||
#define WEBUI_VERSION "2.3.0"
|
||||
|
||||
// Dynamic Library Exports
|
||||
#if defined(_MSC_VER) || defined(__TINYC__)
|
||||
#ifndef WEBUI_EXPORT
|
||||
#define WEBUI_EXPORT __declspec(dllexport)
|
||||
#endif
|
||||
#else
|
||||
#ifndef WEBUI_EXPORT
|
||||
#define WEBUI_EXPORT extern
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// -- C STD ---------------------------
|
||||
#include <stdbool.h>
|
||||
#include <inttypes.h>
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stddef.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
#if defined(__GNUC__) || defined(__TINYC__)
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
|
||||
// -- Windows -------------------------
|
||||
#ifdef _WIN32
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#include <direct.h>
|
||||
#include <io.h>
|
||||
#include <tchar.h>
|
||||
#include <tlhelp32.h>
|
||||
#define WEBUI_GET_CURRENT_DIR _getcwd
|
||||
#define WEBUI_FILE_EXIST _access
|
||||
#define WEBUI_POPEN _popen
|
||||
#define WEBUI_PCLOSE _pclose
|
||||
#define WEBUI_MAX_PATH MAX_PATH
|
||||
#endif
|
||||
|
||||
// -- Linux ---------------------------
|
||||
#ifdef __linux__
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
#include <poll.h>
|
||||
#include <sys/time.h>
|
||||
#define WEBUI_GET_CURRENT_DIR getcwd
|
||||
#define WEBUI_FILE_EXIST access
|
||||
#define WEBUI_POPEN popen
|
||||
#define WEBUI_PCLOSE pclose
|
||||
#define WEBUI_MAX_PATH PATH_MAX
|
||||
#endif
|
||||
|
||||
// -- Apple ---------------------------
|
||||
#ifdef __APPLE__
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
#include <poll.h>
|
||||
#include <sys/syslimits.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/sysctl.h>
|
||||
#define WEBUI_GET_CURRENT_DIR getcwd
|
||||
#define WEBUI_FILE_EXIST access
|
||||
#define WEBUI_POPEN popen
|
||||
#define WEBUI_PCLOSE pclose
|
||||
#define WEBUI_MAX_PATH PATH_MAX
|
||||
#endif
|
||||
|
||||
// -- Enums ---------------------------
|
||||
enum webui_browsers {
|
||||
AnyBrowser = 0, // 0. Default recommended web browser
|
||||
Chrome, // 1. Google Chrome
|
||||
Firefox, // 2. Mozilla Firefox
|
||||
Edge, // 3. Microsoft Edge
|
||||
Safari, // 4. Apple Safari
|
||||
Chromium, // 5. The Chromium Project
|
||||
Opera, // 6. Opera Browser
|
||||
Brave, // 7. The Brave Browser
|
||||
Vivaldi, // 8. The Vivaldi Browser
|
||||
Epic, // 9. The Epic Browser
|
||||
Yandex, // 10. The Yandex Browser
|
||||
};
|
||||
|
||||
enum webui_runtimes {
|
||||
None = 0, // 0. Prevent WebUI from using any runtime for .js and .ts files
|
||||
Deno, // 1. Use Deno runtime for .js and .ts files
|
||||
NodeJS, // 2. Use Nodejs runtime for .js files
|
||||
};
|
||||
|
||||
enum webui_events {
|
||||
WEBUI_EVENT_DISCONNECTED = 0, // 0. Window disconnection event
|
||||
WEBUI_EVENT_CONNECTED, // 1. Window connection event
|
||||
WEBUI_EVENT_MULTI_CONNECTION, // 2. New window connection event
|
||||
WEBUI_EVENT_UNWANTED_CONNECTION, // 3. New unwanted window connection event
|
||||
WEBUI_EVENT_MOUSE_CLICK, // 4. Mouse click event
|
||||
WEBUI_EVENT_NAVIGATION, // 5. Window navigation event
|
||||
WEBUI_EVENT_CALLBACK, // 6. Function call event
|
||||
};
|
||||
|
||||
// -- Structs -------------------------
|
||||
typedef struct webui_event_t {
|
||||
size_t window; // Pointer to the window object
|
||||
unsigned int event_type; // Event type
|
||||
char* element; // HTML element ID
|
||||
char* data; // JavaScript data
|
||||
unsigned int event_number; // Internal WebUI
|
||||
} webui_event_t;
|
||||
|
||||
// -- Definitions ---------------------
|
||||
// Create a new webui window object.
|
||||
WEBUI_EXPORT size_t webui_new_window(void);
|
||||
// Bind a specific html element click event with a function. Empty element means all events.
|
||||
WEBUI_EXPORT unsigned int webui_bind(size_t window, const char* element, void (*func)(webui_event_t* e));
|
||||
// Show a window using a embedded HTML, or a file. If the window is already opened then it will be refreshed.
|
||||
WEBUI_EXPORT bool webui_show(size_t window, const char* content);
|
||||
// Same as webui_show(). But with a specific web browser.
|
||||
WEBUI_EXPORT bool webui_show_browser(size_t window, const char* content, unsigned int browser);
|
||||
// Set the window in Kiosk mode (Full screen)
|
||||
WEBUI_EXPORT void webui_set_kiosk(size_t window, bool status);
|
||||
// Wait until all opened windows get closed.
|
||||
WEBUI_EXPORT void webui_wait(void);
|
||||
// Close a specific window.
|
||||
WEBUI_EXPORT void webui_close(size_t window);
|
||||
// Close all opened windows. webui_wait() will break.
|
||||
WEBUI_EXPORT void webui_exit(void);
|
||||
|
||||
// -- Other ---------------------------
|
||||
// Check a specific window if it's still running
|
||||
WEBUI_EXPORT bool webui_is_shown(size_t window);
|
||||
// Set the maximum time in seconds to wait for browser to start
|
||||
WEBUI_EXPORT void webui_set_timeout(unsigned int second);
|
||||
// Set the default embedded HTML favicon
|
||||
WEBUI_EXPORT void webui_set_icon(size_t window, const char* icon, const char* icon_type);
|
||||
// Allow the window URL to be re-used in normal web browsers
|
||||
WEBUI_EXPORT void webui_set_multi_access(size_t window, bool status);
|
||||
|
||||
// -- JavaScript ----------------------
|
||||
// Run JavaScript quickly with no waiting for the response.
|
||||
WEBUI_EXPORT bool webui_run(size_t window, const char* script);
|
||||
// Run a JavaScript, and get the response back (Make sure your local buffer can hold the response).
|
||||
WEBUI_EXPORT bool webui_script(size_t window, const char* script, unsigned int timeout, char* buffer, size_t buffer_length);
|
||||
// Chose between Deno and Nodejs runtime for .js and .ts files.
|
||||
WEBUI_EXPORT void webui_set_runtime(size_t window, unsigned int runtime);
|
||||
// Parse argument as integer.
|
||||
WEBUI_EXPORT long long int webui_get_int(webui_event_t* e);
|
||||
// Parse argument as string.
|
||||
WEBUI_EXPORT const char* webui_get_string(webui_event_t* e);
|
||||
// Parse argument as boolean.
|
||||
WEBUI_EXPORT bool webui_get_bool(webui_event_t* e);
|
||||
// Return the response to JavaScript as integer.
|
||||
WEBUI_EXPORT void webui_return_int(webui_event_t* e, long long int n);
|
||||
// Return the response to JavaScript as string.
|
||||
WEBUI_EXPORT void webui_return_string(webui_event_t* e, char* s);
|
||||
// Return the response to JavaScript as boolean.
|
||||
WEBUI_EXPORT void webui_return_bool(webui_event_t* e, bool b);
|
||||
|
||||
// -- Interface -----------------------
|
||||
// Bind a specific html element click event with a function. Empty element means all events. This replace webui_bind(). The func is (Window, EventType, Element, Data, EventNumber)
|
||||
WEBUI_EXPORT unsigned int webui_interface_bind(size_t window, const char* element, void (*func)(size_t, unsigned int, char*, char*, unsigned int));
|
||||
// When using `webui_interface_bind()` you may need this function to easily set your callback response.
|
||||
WEBUI_EXPORT void webui_interface_set_response(size_t window, unsigned int event_number, const char* response);
|
||||
// Check if the app still running or not. This replace webui_wait().
|
||||
WEBUI_EXPORT bool webui_interface_is_app_running(void);
|
||||
// Get window unique ID
|
||||
WEBUI_EXPORT unsigned int webui_interface_get_window_id(size_t window);
|
||||
|
||||
#endif /* _WEBUI_H */
|
@ -1,153 +0,0 @@
|
||||
/*
|
||||
WebUI Library 2.3.0
|
||||
http://webui.me
|
||||
https://github.com/webui-dev/webui
|
||||
Copyright (c) 2020-2023 Hassan Draga.
|
||||
Licensed under MIT License.
|
||||
All rights reserved.
|
||||
Canada.
|
||||
*/
|
||||
|
||||
#ifndef _WEBUI_HPP
|
||||
#define _WEBUI_HPP
|
||||
|
||||
// C++ STD
|
||||
#include <string>
|
||||
|
||||
// WebUI C Header
|
||||
extern "C" {
|
||||
#include "webui.h"
|
||||
}
|
||||
|
||||
namespace webui {
|
||||
|
||||
// Create a new webui window object.
|
||||
size_t new_window(void) {
|
||||
return webui_new_window();
|
||||
}
|
||||
|
||||
// Bind a specific html element click event with a function. Empty element means all events.
|
||||
unsigned int bind(size_t window, std::string element, void (*func)(webui_event_t* e)) {
|
||||
return webui_bind(window, element.c_str(), func);
|
||||
}
|
||||
|
||||
// Show a window using a embedded HTML, or a file. If the window is already opened then it will be refreshed.
|
||||
bool show(size_t window, std::string content) {
|
||||
return webui_show(window, content.c_str());
|
||||
}
|
||||
|
||||
// Same as show(). But with a specific web browser.
|
||||
bool show_browser(size_t window, std::string content, unsigned int browser) {
|
||||
return webui_show_browser(window, content.c_str(), browser);
|
||||
}
|
||||
|
||||
// Wait until all opened windows get closed.
|
||||
void wait(void) {
|
||||
webui_wait();
|
||||
}
|
||||
|
||||
// Close a specific window.
|
||||
void close(size_t window) {
|
||||
webui_close(window);
|
||||
}
|
||||
|
||||
// Set the window in Kiosk mode (Full screen)
|
||||
void set_kiosk(size_t window, bool status) {
|
||||
webui_set_kiosk(window, status);
|
||||
}
|
||||
|
||||
// Close all opened windows. wait() will break.
|
||||
void exit(void) {
|
||||
webui_exit();
|
||||
}
|
||||
|
||||
// -- Other ---------------------------
|
||||
// Check a specific window if it's still running
|
||||
bool is_shown(size_t window) {
|
||||
return webui_is_shown(window);
|
||||
}
|
||||
|
||||
// Set the maximum time in seconds to wait for browser to start
|
||||
void set_timeout(unsigned int second) {
|
||||
webui_set_timeout(second);
|
||||
}
|
||||
|
||||
// Set the default embedded HTML favicon
|
||||
void set_icon(size_t window, std::string icon, std::string icon_type) {
|
||||
webui_set_icon(window, icon.c_str(), icon_type.c_str());
|
||||
}
|
||||
|
||||
// Allow the window URL to be re-used in normal web browsers
|
||||
void set_multi_access(size_t window, bool status) {
|
||||
webui_set_multi_access(window, status);
|
||||
}
|
||||
|
||||
// -- JavaScript ----------------------
|
||||
// Quickly run a JavaScript (no response waiting).
|
||||
bool run(size_t window, std::string script) {
|
||||
return webui_run(window, script.c_str());
|
||||
}
|
||||
|
||||
// Run a JavaScript, and get the response back (Make sure your local buffer can hold the response).
|
||||
bool script(size_t window, std::string script, unsigned int timeout, char* buffer, size_t buffer_length) {
|
||||
return webui_script(window, script.c_str(), timeout, buffer, buffer_length);
|
||||
}
|
||||
|
||||
// Chose between Deno and Nodejs runtime for .js and .ts files.
|
||||
void set_runtime(size_t window, unsigned int runtime) {
|
||||
webui_set_runtime(window, runtime);
|
||||
}
|
||||
|
||||
// Parse argument as integer.
|
||||
long long int get_int(webui_event_t* e) {
|
||||
return webui_get_int(e);
|
||||
}
|
||||
|
||||
// Parse argument as string.
|
||||
std::string get_string(webui_event_t* e) {
|
||||
return std::string(webui_get_string(e));
|
||||
}
|
||||
|
||||
// Parse argument as boolean.
|
||||
bool get_bool(webui_event_t* e) {
|
||||
return webui_get_bool(e);
|
||||
}
|
||||
|
||||
// Return the response to JavaScript as integer.
|
||||
void return_int(webui_event_t* e, long long int n) {
|
||||
webui_return_int(e, n);
|
||||
}
|
||||
|
||||
// Return the response to JavaScript as string.
|
||||
void return_string(webui_event_t* e, std::string s) {
|
||||
webui_return_string(e, &s[0]);
|
||||
}
|
||||
|
||||
// Return the response to JavaScript as boolean.
|
||||
void return_bool(webui_event_t* e, bool b) {
|
||||
webui_return_bool(e, b);
|
||||
}
|
||||
|
||||
// -- Interface -----------------------
|
||||
// Bind a specific html element click event with a function. Empty element means all events. This replace bind(). The func is (Window, EventType, Element, Data, EventNumber)
|
||||
unsigned int interface_bind(size_t window, std::string element, void (*func)(size_t, unsigned int, char*, char*, unsigned int)) {
|
||||
return webui_interface_bind(window, element.c_str(), func);
|
||||
}
|
||||
|
||||
// When using `interface_bind()` you need this function to easily set your callback response.
|
||||
void interface_set_response(size_t window, webui_event_t* e, std::string response) {
|
||||
webui_interface_set_response(window, e->event_number, response.c_str());
|
||||
}
|
||||
|
||||
// Check if the app still running or not. This replace wait().
|
||||
bool interface_is_app_running(void) {
|
||||
return webui_interface_is_app_running();
|
||||
}
|
||||
|
||||
// Get window unique ID
|
||||
unsigned int interface_get_window_id(size_t window) {
|
||||
return webui_interface_get_window_id(window);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _WEBUI_HPP */
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,215 +0,0 @@
|
||||
/*
|
||||
WebUI Library 2.3.0
|
||||
http://webui.me
|
||||
https://github.com/webui-dev/webui
|
||||
Copyright (c) 2020-2023 Hassan Draga.
|
||||
Licensed under MIT License.
|
||||
All rights reserved.
|
||||
Canada.
|
||||
*/
|
||||
|
||||
#ifndef _WEBUI_H
|
||||
#define _WEBUI_H
|
||||
|
||||
#define WEBUI_VERSION "2.3.0"
|
||||
#define WEBUI_MAX_IDS (512)
|
||||
|
||||
// Dynamic Library Exports
|
||||
#if defined(_MSC_VER) || defined(__TINYC__)
|
||||
#ifndef WEBUI_EXPORT
|
||||
#define WEBUI_EXPORT __declspec(dllexport)
|
||||
#endif
|
||||
#else
|
||||
#ifndef WEBUI_EXPORT
|
||||
#define WEBUI_EXPORT extern
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// -- C STD ---------------------------
|
||||
#include <stdbool.h>
|
||||
#include <inttypes.h>
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stddef.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
#if defined(__GNUC__) || defined(__TINYC__)
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
|
||||
// -- Windows -------------------------
|
||||
#ifdef _WIN32
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#include <direct.h>
|
||||
#include <io.h>
|
||||
#include <tchar.h>
|
||||
#include <tlhelp32.h>
|
||||
#define WEBUI_GET_CURRENT_DIR _getcwd
|
||||
#define WEBUI_FILE_EXIST _access
|
||||
#define WEBUI_POPEN _popen
|
||||
#define WEBUI_PCLOSE _pclose
|
||||
#define WEBUI_MAX_PATH MAX_PATH
|
||||
#endif
|
||||
|
||||
// -- Linux ---------------------------
|
||||
#ifdef __linux__
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
#include <poll.h>
|
||||
#include <sys/time.h>
|
||||
#include <signal.h>
|
||||
#define WEBUI_GET_CURRENT_DIR getcwd
|
||||
#define WEBUI_FILE_EXIST access
|
||||
#define WEBUI_POPEN popen
|
||||
#define WEBUI_PCLOSE pclose
|
||||
#define WEBUI_MAX_PATH PATH_MAX
|
||||
#endif
|
||||
|
||||
// -- Apple ---------------------------
|
||||
#ifdef __APPLE__
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
#include <poll.h>
|
||||
#include <sys/syslimits.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <signal.h>
|
||||
#define WEBUI_GET_CURRENT_DIR getcwd
|
||||
#define WEBUI_FILE_EXIST access
|
||||
#define WEBUI_POPEN popen
|
||||
#define WEBUI_PCLOSE pclose
|
||||
#define WEBUI_MAX_PATH PATH_MAX
|
||||
#endif
|
||||
|
||||
// -- Enums ---------------------------
|
||||
enum webui_browsers {
|
||||
AnyBrowser = 0, // 0. Default recommended web browser
|
||||
Chrome, // 1. Google Chrome
|
||||
Firefox, // 2. Mozilla Firefox
|
||||
Edge, // 3. Microsoft Edge
|
||||
Safari, // 4. Apple Safari
|
||||
Chromium, // 5. The Chromium Project
|
||||
Opera, // 6. Opera Browser
|
||||
Brave, // 7. The Brave Browser
|
||||
Vivaldi, // 8. The Vivaldi Browser
|
||||
Epic, // 9. The Epic Browser
|
||||
Yandex, // 10. The Yandex Browser
|
||||
};
|
||||
|
||||
enum webui_runtimes {
|
||||
None = 0, // 0. Prevent WebUI from using any runtime for .js and .ts files
|
||||
Deno, // 1. Use Deno runtime for .js and .ts files
|
||||
NodeJS, // 2. Use Nodejs runtime for .js files
|
||||
};
|
||||
|
||||
enum webui_events {
|
||||
WEBUI_EVENT_DISCONNECTED = 0, // 0. Window disconnection event
|
||||
WEBUI_EVENT_CONNECTED, // 1. Window connection event
|
||||
WEBUI_EVENT_MULTI_CONNECTION, // 2. New window connection event
|
||||
WEBUI_EVENT_UNWANTED_CONNECTION, // 3. New unwanted window connection event
|
||||
WEBUI_EVENT_MOUSE_CLICK, // 4. Mouse click event
|
||||
WEBUI_EVENT_NAVIGATION, // 5. Window navigation event
|
||||
WEBUI_EVENT_CALLBACK, // 6. Function call event
|
||||
};
|
||||
|
||||
// -- Structs -------------------------
|
||||
typedef struct webui_event_t {
|
||||
size_t window; // The window object number
|
||||
size_t event_type; // Event type
|
||||
char* element; // HTML element ID
|
||||
char* data; // JavaScript data
|
||||
size_t event_number; // Internal WebUI
|
||||
} webui_event_t;
|
||||
|
||||
// -- Definitions ---------------------
|
||||
// Create a new webui window object.
|
||||
WEBUI_EXPORT size_t webui_new_window(void);
|
||||
// Create a new webui window object.
|
||||
WEBUI_EXPORT void webui_new_window_id(size_t window_number);
|
||||
// Get a free window ID that can be used with `webui_new_window_id()`
|
||||
WEBUI_EXPORT size_t webui_get_new_window_id(void);
|
||||
// Bind a specific html element click event with a function. Empty element means all events.
|
||||
WEBUI_EXPORT size_t webui_bind(size_t window, const char* element, void (*func)(webui_event_t* e));
|
||||
// Show a window using a embedded HTML, or a file. If the window is already opened then it will be refreshed.
|
||||
WEBUI_EXPORT bool webui_show(size_t window, const char* content);
|
||||
// Same as webui_show(). But with a specific web browser.
|
||||
WEBUI_EXPORT bool webui_show_browser(size_t window, const char* content, size_t browser);
|
||||
// Set the window in Kiosk mode (Full screen)
|
||||
WEBUI_EXPORT void webui_set_kiosk(size_t window, bool status);
|
||||
// Wait until all opened windows get closed.
|
||||
WEBUI_EXPORT void webui_wait(void);
|
||||
// Close a specific window only. The window object will still exist.
|
||||
WEBUI_EXPORT void webui_close(size_t window);
|
||||
// Close a specific window and free all memory resources.
|
||||
WEBUI_EXPORT void webui_destroy(size_t window);
|
||||
// Close all opened windows. webui_wait() will break.
|
||||
WEBUI_EXPORT void webui_exit(void);
|
||||
|
||||
// -- Other ---------------------------
|
||||
// Check a specific window if it's still running
|
||||
WEBUI_EXPORT bool webui_is_shown(size_t window);
|
||||
// Set the maximum time in seconds to wait for browser to start
|
||||
WEBUI_EXPORT void webui_set_timeout(size_t second);
|
||||
// Set the default embedded HTML favicon
|
||||
WEBUI_EXPORT void webui_set_icon(size_t window, const char* icon, const char* icon_type);
|
||||
// Allow the window URL to be re-used in normal web browsers
|
||||
WEBUI_EXPORT void webui_set_multi_access(size_t window, bool status);
|
||||
|
||||
// -- JavaScript ----------------------
|
||||
// Run JavaScript quickly with no waiting for the response.
|
||||
WEBUI_EXPORT void webui_run(size_t window, const char* script);
|
||||
// Run a JavaScript, and get the response back (Make sure your local buffer can hold the response).
|
||||
WEBUI_EXPORT bool webui_script(size_t window, const char* script, size_t timeout, char* buffer, size_t buffer_length);
|
||||
// Chose between Deno and Nodejs runtime for .js and .ts files.
|
||||
WEBUI_EXPORT void webui_set_runtime(size_t window, size_t runtime);
|
||||
// Parse argument as integer.
|
||||
WEBUI_EXPORT long long int webui_get_int(webui_event_t* e);
|
||||
// Parse argument as string.
|
||||
WEBUI_EXPORT const char* webui_get_string(webui_event_t* e);
|
||||
// Parse argument as boolean.
|
||||
WEBUI_EXPORT bool webui_get_bool(webui_event_t* e);
|
||||
// Return the response to JavaScript as integer.
|
||||
WEBUI_EXPORT void webui_return_int(webui_event_t* e, long long int n);
|
||||
// Return the response to JavaScript as string.
|
||||
WEBUI_EXPORT void webui_return_string(webui_event_t* e, char* s);
|
||||
// Return the response to JavaScript as boolean.
|
||||
WEBUI_EXPORT void webui_return_bool(webui_event_t* e, bool b);
|
||||
// Base64 encoding. Use this to safely send text based data to the UI. If it fails it will return NULL.
|
||||
WEBUI_EXPORT char* webui_encode(const char* str);
|
||||
// Base64 decoding. Use this to safely decode received Base64 text from the UI. If it fails it will return NULL.
|
||||
WEBUI_EXPORT char* webui_decode(const char* str);
|
||||
// Safely free a buffer allocated by WebUI, for example when using webui_encode().
|
||||
WEBUI_EXPORT void webui_free(void* ptr);
|
||||
|
||||
// -- Interface -----------------------
|
||||
// Bind a specific html element click event with a function. Empty element means all events. This replace webui_bind(). The func is (Window, EventType, Element, Data, EventNumber)
|
||||
WEBUI_EXPORT size_t webui_interface_bind(size_t window, const char* element, void (*func)(size_t, size_t, char*, char*, size_t));
|
||||
// When using `webui_interface_bind()` you may need this function to easily set your callback response.
|
||||
WEBUI_EXPORT void webui_interface_set_response(size_t window, size_t event_number, const char* response);
|
||||
// Check if the app still running or not. This replace webui_wait().
|
||||
WEBUI_EXPORT bool webui_interface_is_app_running(void);
|
||||
// Get window unique ID
|
||||
WEBUI_EXPORT size_t webui_interface_get_window_id(size_t window);
|
||||
// Get a unique ID. Same ID as `webui_bind()`. Return > 0 if bind exist.
|
||||
WEBUI_EXPORT size_t webui_interface_get_bind_id(size_t window, const char* element);
|
||||
|
||||
#endif /* _WEBUI_H */
|
Binary file not shown.
Binary file not shown.
@ -1,198 +0,0 @@
|
||||
/*
|
||||
WebUI Library 2.3.0
|
||||
http://webui.me
|
||||
https://github.com/webui-dev/webui
|
||||
Copyright (c) 2020-2023 Hassan Draga.
|
||||
Licensed under MIT License.
|
||||
All rights reserved.
|
||||
Canada.
|
||||
*/
|
||||
|
||||
#ifndef _WEBUI_H
|
||||
#define _WEBUI_H
|
||||
|
||||
#define WEBUI_VERSION "2.3.0"
|
||||
|
||||
// Dynamic Library Exports
|
||||
#if defined(_MSC_VER) || defined(__TINYC__)
|
||||
#ifndef WEBUI_EXPORT
|
||||
#define WEBUI_EXPORT __declspec(dllexport)
|
||||
#endif
|
||||
#else
|
||||
#ifndef WEBUI_EXPORT
|
||||
#define WEBUI_EXPORT extern
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// -- C STD ---------------------------
|
||||
#include <stdbool.h>
|
||||
#include <inttypes.h>
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stddef.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
#if defined(__GNUC__) || defined(__TINYC__)
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
|
||||
// -- Windows -------------------------
|
||||
#ifdef _WIN32
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#include <direct.h>
|
||||
#include <io.h>
|
||||
#include <tchar.h>
|
||||
#include <tlhelp32.h>
|
||||
#define WEBUI_GET_CURRENT_DIR _getcwd
|
||||
#define WEBUI_FILE_EXIST _access
|
||||
#define WEBUI_POPEN _popen
|
||||
#define WEBUI_PCLOSE _pclose
|
||||
#define WEBUI_MAX_PATH MAX_PATH
|
||||
#endif
|
||||
|
||||
// -- Linux ---------------------------
|
||||
#ifdef __linux__
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
#include <poll.h>
|
||||
#include <sys/time.h>
|
||||
#define WEBUI_GET_CURRENT_DIR getcwd
|
||||
#define WEBUI_FILE_EXIST access
|
||||
#define WEBUI_POPEN popen
|
||||
#define WEBUI_PCLOSE pclose
|
||||
#define WEBUI_MAX_PATH PATH_MAX
|
||||
#endif
|
||||
|
||||
// -- Apple ---------------------------
|
||||
#ifdef __APPLE__
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
#include <poll.h>
|
||||
#include <sys/syslimits.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/sysctl.h>
|
||||
#define WEBUI_GET_CURRENT_DIR getcwd
|
||||
#define WEBUI_FILE_EXIST access
|
||||
#define WEBUI_POPEN popen
|
||||
#define WEBUI_PCLOSE pclose
|
||||
#define WEBUI_MAX_PATH PATH_MAX
|
||||
#endif
|
||||
|
||||
// -- Enums ---------------------------
|
||||
enum webui_browsers {
|
||||
AnyBrowser = 0, // 0. Default recommended web browser
|
||||
Chrome, // 1. Google Chrome
|
||||
Firefox, // 2. Mozilla Firefox
|
||||
Edge, // 3. Microsoft Edge
|
||||
Safari, // 4. Apple Safari
|
||||
Chromium, // 5. The Chromium Project
|
||||
Opera, // 6. Opera Browser
|
||||
Brave, // 7. The Brave Browser
|
||||
Vivaldi, // 8. The Vivaldi Browser
|
||||
Epic, // 9. The Epic Browser
|
||||
Yandex, // 10. The Yandex Browser
|
||||
};
|
||||
|
||||
enum webui_runtimes {
|
||||
None = 0, // 0. Prevent WebUI from using any runtime for .js and .ts files
|
||||
Deno, // 1. Use Deno runtime for .js and .ts files
|
||||
NodeJS, // 2. Use Nodejs runtime for .js files
|
||||
};
|
||||
|
||||
enum webui_events {
|
||||
WEBUI_EVENT_DISCONNECTED = 0, // 0. Window disconnection event
|
||||
WEBUI_EVENT_CONNECTED, // 1. Window connection event
|
||||
WEBUI_EVENT_MULTI_CONNECTION, // 2. New window connection event
|
||||
WEBUI_EVENT_UNWANTED_CONNECTION, // 3. New unwanted window connection event
|
||||
WEBUI_EVENT_MOUSE_CLICK, // 4. Mouse click event
|
||||
WEBUI_EVENT_NAVIGATION, // 5. Window navigation event
|
||||
WEBUI_EVENT_CALLBACK, // 6. Function call event
|
||||
};
|
||||
|
||||
// -- Structs -------------------------
|
||||
typedef struct webui_event_t {
|
||||
size_t window; // Pointer to the window object
|
||||
unsigned int event_type; // Event type
|
||||
char* element; // HTML element ID
|
||||
char* data; // JavaScript data
|
||||
unsigned int event_number; // Internal WebUI
|
||||
} webui_event_t;
|
||||
|
||||
// -- Definitions ---------------------
|
||||
// Create a new webui window object.
|
||||
WEBUI_EXPORT size_t webui_new_window(void);
|
||||
// Bind a specific html element click event with a function. Empty element means all events.
|
||||
WEBUI_EXPORT unsigned int webui_bind(size_t window, const char* element, void (*func)(webui_event_t* e));
|
||||
// Show a window using a embedded HTML, or a file. If the window is already opened then it will be refreshed.
|
||||
WEBUI_EXPORT bool webui_show(size_t window, const char* content);
|
||||
// Same as webui_show(). But with a specific web browser.
|
||||
WEBUI_EXPORT bool webui_show_browser(size_t window, const char* content, unsigned int browser);
|
||||
// Set the window in Kiosk mode (Full screen)
|
||||
WEBUI_EXPORT void webui_set_kiosk(size_t window, bool status);
|
||||
// Wait until all opened windows get closed.
|
||||
WEBUI_EXPORT void webui_wait(void);
|
||||
// Close a specific window.
|
||||
WEBUI_EXPORT void webui_close(size_t window);
|
||||
// Close all opened windows. webui_wait() will break.
|
||||
WEBUI_EXPORT void webui_exit(void);
|
||||
|
||||
// -- Other ---------------------------
|
||||
// Check a specific window if it's still running
|
||||
WEBUI_EXPORT bool webui_is_shown(size_t window);
|
||||
// Set the maximum time in seconds to wait for browser to start
|
||||
WEBUI_EXPORT void webui_set_timeout(unsigned int second);
|
||||
// Set the default embedded HTML favicon
|
||||
WEBUI_EXPORT void webui_set_icon(size_t window, const char* icon, const char* icon_type);
|
||||
// Allow the window URL to be re-used in normal web browsers
|
||||
WEBUI_EXPORT void webui_set_multi_access(size_t window, bool status);
|
||||
|
||||
// -- JavaScript ----------------------
|
||||
// Run JavaScript quickly with no waiting for the response.
|
||||
WEBUI_EXPORT bool webui_run(size_t window, const char* script);
|
||||
// Run a JavaScript, and get the response back (Make sure your local buffer can hold the response).
|
||||
WEBUI_EXPORT bool webui_script(size_t window, const char* script, unsigned int timeout, char* buffer, size_t buffer_length);
|
||||
// Chose between Deno and Nodejs runtime for .js and .ts files.
|
||||
WEBUI_EXPORT void webui_set_runtime(size_t window, unsigned int runtime);
|
||||
// Parse argument as integer.
|
||||
WEBUI_EXPORT long long int webui_get_int(webui_event_t* e);
|
||||
// Parse argument as string.
|
||||
WEBUI_EXPORT const char* webui_get_string(webui_event_t* e);
|
||||
// Parse argument as boolean.
|
||||
WEBUI_EXPORT bool webui_get_bool(webui_event_t* e);
|
||||
// Return the response to JavaScript as integer.
|
||||
WEBUI_EXPORT void webui_return_int(webui_event_t* e, long long int n);
|
||||
// Return the response to JavaScript as string.
|
||||
WEBUI_EXPORT void webui_return_string(webui_event_t* e, char* s);
|
||||
// Return the response to JavaScript as boolean.
|
||||
WEBUI_EXPORT void webui_return_bool(webui_event_t* e, bool b);
|
||||
|
||||
// -- Interface -----------------------
|
||||
// Bind a specific html element click event with a function. Empty element means all events. This replace webui_bind(). The func is (Window, EventType, Element, Data, EventNumber)
|
||||
WEBUI_EXPORT unsigned int webui_interface_bind(size_t window, const char* element, void (*func)(size_t, unsigned int, char*, char*, unsigned int));
|
||||
// When using `webui_interface_bind()` you may need this function to easily set your callback response.
|
||||
WEBUI_EXPORT void webui_interface_set_response(size_t window, unsigned int event_number, const char* response);
|
||||
// Check if the app still running or not. This replace webui_wait().
|
||||
WEBUI_EXPORT bool webui_interface_is_app_running(void);
|
||||
// Get window unique ID
|
||||
WEBUI_EXPORT unsigned int webui_interface_get_window_id(size_t window);
|
||||
|
||||
#endif /* _WEBUI_H */
|
@ -1,153 +0,0 @@
|
||||
/*
|
||||
WebUI Library 2.3.0
|
||||
http://webui.me
|
||||
https://github.com/webui-dev/webui
|
||||
Copyright (c) 2020-2023 Hassan Draga.
|
||||
Licensed under MIT License.
|
||||
All rights reserved.
|
||||
Canada.
|
||||
*/
|
||||
|
||||
#ifndef _WEBUI_HPP
|
||||
#define _WEBUI_HPP
|
||||
|
||||
// C++ STD
|
||||
#include <string>
|
||||
|
||||
// WebUI C Header
|
||||
extern "C" {
|
||||
#include "webui.h"
|
||||
}
|
||||
|
||||
namespace webui {
|
||||
|
||||
// Create a new webui window object.
|
||||
size_t new_window(void) {
|
||||
return webui_new_window();
|
||||
}
|
||||
|
||||
// Bind a specific html element click event with a function. Empty element means all events.
|
||||
unsigned int bind(size_t window, std::string element, void (*func)(webui_event_t* e)) {
|
||||
return webui_bind(window, element.c_str(), func);
|
||||
}
|
||||
|
||||
// Show a window using a embedded HTML, or a file. If the window is already opened then it will be refreshed.
|
||||
bool show(size_t window, std::string content) {
|
||||
return webui_show(window, content.c_str());
|
||||
}
|
||||
|
||||
// Same as show(). But with a specific web browser.
|
||||
bool show_browser(size_t window, std::string content, unsigned int browser) {
|
||||
return webui_show_browser(window, content.c_str(), browser);
|
||||
}
|
||||
|
||||
// Wait until all opened windows get closed.
|
||||
void wait(void) {
|
||||
webui_wait();
|
||||
}
|
||||
|
||||
// Close a specific window.
|
||||
void close(size_t window) {
|
||||
webui_close(window);
|
||||
}
|
||||
|
||||
// Set the window in Kiosk mode (Full screen)
|
||||
void set_kiosk(size_t window, bool status) {
|
||||
webui_set_kiosk(window, status);
|
||||
}
|
||||
|
||||
// Close all opened windows. wait() will break.
|
||||
void exit(void) {
|
||||
webui_exit();
|
||||
}
|
||||
|
||||
// -- Other ---------------------------
|
||||
// Check a specific window if it's still running
|
||||
bool is_shown(size_t window) {
|
||||
return webui_is_shown(window);
|
||||
}
|
||||
|
||||
// Set the maximum time in seconds to wait for browser to start
|
||||
void set_timeout(unsigned int second) {
|
||||
webui_set_timeout(second);
|
||||
}
|
||||
|
||||
// Set the default embedded HTML favicon
|
||||
void set_icon(size_t window, std::string icon, std::string icon_type) {
|
||||
webui_set_icon(window, icon.c_str(), icon_type.c_str());
|
||||
}
|
||||
|
||||
// Allow the window URL to be re-used in normal web browsers
|
||||
void set_multi_access(size_t window, bool status) {
|
||||
webui_set_multi_access(window, status);
|
||||
}
|
||||
|
||||
// -- JavaScript ----------------------
|
||||
// Quickly run a JavaScript (no response waiting).
|
||||
bool run(size_t window, std::string script) {
|
||||
return webui_run(window, script.c_str());
|
||||
}
|
||||
|
||||
// Run a JavaScript, and get the response back (Make sure your local buffer can hold the response).
|
||||
bool script(size_t window, std::string script, unsigned int timeout, char* buffer, size_t buffer_length) {
|
||||
return webui_script(window, script.c_str(), timeout, buffer, buffer_length);
|
||||
}
|
||||
|
||||
// Chose between Deno and Nodejs runtime for .js and .ts files.
|
||||
void set_runtime(size_t window, unsigned int runtime) {
|
||||
webui_set_runtime(window, runtime);
|
||||
}
|
||||
|
||||
// Parse argument as integer.
|
||||
long long int get_int(webui_event_t* e) {
|
||||
return webui_get_int(e);
|
||||
}
|
||||
|
||||
// Parse argument as string.
|
||||
std::string get_string(webui_event_t* e) {
|
||||
return std::string(webui_get_string(e));
|
||||
}
|
||||
|
||||
// Parse argument as boolean.
|
||||
bool get_bool(webui_event_t* e) {
|
||||
return webui_get_bool(e);
|
||||
}
|
||||
|
||||
// Return the response to JavaScript as integer.
|
||||
void return_int(webui_event_t* e, long long int n) {
|
||||
webui_return_int(e, n);
|
||||
}
|
||||
|
||||
// Return the response to JavaScript as string.
|
||||
void return_string(webui_event_t* e, std::string s) {
|
||||
webui_return_string(e, &s[0]);
|
||||
}
|
||||
|
||||
// Return the response to JavaScript as boolean.
|
||||
void return_bool(webui_event_t* e, bool b) {
|
||||
webui_return_bool(e, b);
|
||||
}
|
||||
|
||||
// -- Interface -----------------------
|
||||
// Bind a specific html element click event with a function. Empty element means all events. This replace bind(). The func is (Window, EventType, Element, Data, EventNumber)
|
||||
unsigned int interface_bind(size_t window, std::string element, void (*func)(size_t, unsigned int, char*, char*, unsigned int)) {
|
||||
return webui_interface_bind(window, element.c_str(), func);
|
||||
}
|
||||
|
||||
// When using `interface_bind()` you need this function to easily set your callback response.
|
||||
void interface_set_response(size_t window, webui_event_t* e, std::string response) {
|
||||
webui_interface_set_response(window, e->event_number, response.c_str());
|
||||
}
|
||||
|
||||
// Check if the app still running or not. This replace wait().
|
||||
bool interface_is_app_running(void) {
|
||||
return webui_interface_is_app_running();
|
||||
}
|
||||
|
||||
// Get window unique ID
|
||||
unsigned int interface_get_window_id(size_t window) {
|
||||
return webui_interface_get_window_id(window);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _WEBUI_HPP */
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
6
bridge/.gitignore
vendored
Normal file
6
bridge/.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
# Do not track Nodejs output files
|
||||
node_modules/
|
||||
*.json
|
||||
|
||||
# Do not track js2c.py output files
|
||||
*.js
|
47
bridge/README.md
Normal file
47
bridge/README.md
Normal file
@ -0,0 +1,47 @@
|
||||
# WebUI Bridge
|
||||
|
||||
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`.
|
||||
|
||||
### Windows
|
||||
|
||||
- Install [Python](https://www.python.org/downloads/)
|
||||
- Install [Node.js](https://nodejs.org/en/download)
|
||||
- cd `webui\bridge`
|
||||
- `npm install esbuild`
|
||||
- `.\node_modules\.bin\esbuild --bundle --target="chrome90,firefox90,safari15" --format=esm --tree-shaking=false --outdir=.\ .\webui.ts`
|
||||
- `python js2c.py`
|
||||
|
||||
### Windows PowerShell
|
||||
|
||||
- cd `webui\bridge`
|
||||
- `./build.ps1`
|
||||
- If you get _running scripts is disabled on this
|
||||
system_ error. Then run `Set-ExecutionPolicy RemoteSigned` to enable script execution. After done, you can roll back by running `Set-ExecutionPolicy Restricted`
|
||||
|
||||
### Linux
|
||||
|
||||
- Install [Python](https://www.python.org/downloads/)
|
||||
- Install [Node.js](https://nodejs.org/en/download)
|
||||
- cd `webui/bridge`
|
||||
- `npm install esbuild`
|
||||
- `./node_modules/.bin/esbuild --bundle --target="chrome90,firefox90,safari15" --format=esm --tree-shaking=false --outdir=./ ./webui.ts`
|
||||
- `python js2c.py`
|
||||
|
||||
### Linux Bash
|
||||
|
||||
- cd `webui\bridge`
|
||||
- sh `./build.sh`
|
||||
|
||||
### macOS
|
||||
|
||||
- Install [Python](https://www.python.org/downloads/)
|
||||
- Install [Node.js](https://nodejs.org/en/download)
|
||||
- cd `webui/bridge`
|
||||
- `npm install esbuild`
|
||||
- `./node_modules/.bin/esbuild --bundle --target="chrome90,firefox90,safari15" --format=esm --tree-shaking=false --outdir=./ ./webui.ts`
|
||||
- `python js2c.py`
|
||||
|
||||
### macOS Bash
|
||||
|
||||
- cd `webui\bridge`
|
||||
- sh `./build.sh`
|
45
bridge/build.bat
Normal file
45
bridge/build.bat
Normal file
@ -0,0 +1,45 @@
|
||||
@echo off
|
||||
SETLOCAL EnableDelayedExpansion
|
||||
|
||||
REM Get current location and project root
|
||||
cd %~dp0
|
||||
FOR /F "tokens=*" %%i IN ('git rev-parse --show-toplevel') DO SET project_root=%%i
|
||||
cd %project_root%/bridge
|
||||
|
||||
REM Check which python command is available
|
||||
SET python_cmd=python
|
||||
@REM python3 --version > NUL 2>&1
|
||||
@REM IF %errorlevel%==0 (
|
||||
@REM SET python_cmd=python3
|
||||
@REM ) ELSE (
|
||||
@REM python --version > NUL 2>&1
|
||||
@REM IF %errorlevel%==0 (
|
||||
@REM SET python_cmd=python
|
||||
@REM ) ELSE (
|
||||
@REM echo Error: Please install Python.
|
||||
@REM cd %cd%
|
||||
@REM exit /b
|
||||
@REM )
|
||||
@REM )
|
||||
|
||||
REM Check if node_modules\esbuild exists, if not, install using npm
|
||||
IF NOT EXIST "%project_root%\bridge\node_modules\esbuild\" (
|
||||
where npm > NUL 2>&1
|
||||
IF %errorlevel%==0 (
|
||||
echo Installing esbuild...
|
||||
npm install --prefix ./ esbuild
|
||||
) ELSE (
|
||||
echo Error: Please install NPM.
|
||||
cd %cd%
|
||||
exit /b
|
||||
)
|
||||
)
|
||||
|
||||
REM Transpile WebUI-Bridge (TS to JS) & Convert WebUI-Bridge (JS to C)
|
||||
echo Transpile and bundle WebUI-Bridge from TypeScript to JavaScript...
|
||||
.\node_modules\.bin\esbuild --bundle --target="chrome90,firefox90,safari15" --format=esm --tree-shaking=false --minify-syntax --minify-whitespace --outdir=. ./webui.ts & %python_cmd% js2c.py
|
||||
|
||||
echo Done.
|
||||
cd %cd%
|
||||
|
||||
ENDLOCAL
|
71
bridge/build.ps1
Normal file
71
bridge/build.ps1
Normal file
@ -0,0 +1,71 @@
|
||||
# https://webui.me
|
||||
# https://github.com/webui-dev/webui
|
||||
# Copyright (c) 2020-2025 Hassan Draga.
|
||||
# Licensed under MIT License.
|
||||
# All rights reserved.
|
||||
# Canada.
|
||||
#
|
||||
# Special Thanks to Turiiya (https://github.com/ttytm)
|
||||
|
||||
Set-StrictMode -version latest
|
||||
$ErrorActionPreference="Stop"
|
||||
|
||||
$current_location = Get-Location
|
||||
$project_root = git rev-parse --show-toplevel
|
||||
Set-Location $project_root/bridge
|
||||
$silent=$false
|
||||
$log_level=$null
|
||||
|
||||
# Arguments
|
||||
foreach ($opt in $args) {
|
||||
switch ($opt) {
|
||||
"--silent" { $silent = $true }
|
||||
default {
|
||||
Write-Host "Invalid option: $opt"
|
||||
exit
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($silent) { $log_level = "--log-level=warning" }
|
||||
|
||||
$ErrorActionPreference="SilentlyContinue"
|
||||
# Check which python command is available
|
||||
$commandResult = python3 --version 2>&1 > $null
|
||||
if (!$?) {
|
||||
$commandResult = python --version 2>&1 > $null
|
||||
if (!$?) {
|
||||
Write-Host "Error: Please install Python."
|
||||
Set-Location $current_location
|
||||
exit
|
||||
}
|
||||
else {
|
||||
$python_cmd = "python"
|
||||
}
|
||||
} else {
|
||||
$python_cmd = "python3"
|
||||
}
|
||||
$ErrorActionPreference="Stop"
|
||||
|
||||
# Check if node_modules\esbuild exists, if not, install using npm
|
||||
if (-not (Test-Path "$project_root\bridge\node_modules\esbuild")) {
|
||||
if (Get-Command npm -ErrorAction SilentlyContinue) {
|
||||
if (!$silent) { Write-Host "Installing esbuild..." }
|
||||
npm install --prefix ./ esbuild
|
||||
} else {
|
||||
Write-Host "Error: Please install NPM."
|
||||
Set-Location $current_location
|
||||
exit
|
||||
}
|
||||
}
|
||||
|
||||
# Transpile WebUI-Bridge (TS to JS)
|
||||
if (!$silent) { Write-Host "Transpile and bundle WebUI-Bridge from TypeScript to JavaScript..." }
|
||||
.\node_modules\.bin\esbuild --bundle --target="chrome90,firefox90,safari15" --format=esm --tree-shaking=false --minify-syntax --minify-whitespace --outdir=. ./webui.ts $log_level
|
||||
|
||||
# Convert WebUI-Bridge (JS to C)
|
||||
if (!$silent) { Write-Host "Convert WebUI-Bridge JavaScript to C Header..." }
|
||||
& $python_cmd js2c.py
|
||||
|
||||
# Done
|
||||
if (!$silent) { Write-Host "Done." }
|
||||
Set-Location $current_location
|
37
bridge/build.sh
Executable file
37
bridge/build.sh
Executable file
@ -0,0 +1,37 @@
|
||||
#!/bin/bash
|
||||
|
||||
# https://webui.me
|
||||
# https://github.com/webui-dev/webui
|
||||
# Copyright (c) 2020-2025 Hassan Draga.
|
||||
# Licensed under MIT License.
|
||||
# All rights reserved.
|
||||
# Canada.
|
||||
#
|
||||
# Special Thanks to Turiiya (https://github.com/ttytm)
|
||||
|
||||
project_root=$(git rev-parse --show-toplevel)
|
||||
cd $project_root/bridge
|
||||
|
||||
# Loop through all arguments
|
||||
for opt in "$@"; do
|
||||
case $opt in
|
||||
--silent)
|
||||
silent=true
|
||||
;;
|
||||
*)
|
||||
echo "Invalid option: $opt"
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
shift # Move to the next argument
|
||||
done
|
||||
|
||||
if [ "$silent" = true ]; then log_level=--log-level=warning; fi
|
||||
|
||||
if [ "$silent" != true ]; then echo "Transpile and bundle TS sources to webui.js"; fi
|
||||
esbuild --bundle --target="chrome90,firefox90,safari15" --format=esm --tree-shaking=false --minify-syntax --minify-whitespace --outdir=. ./webui.ts $log_level
|
||||
|
||||
if [ "$silent" != true ]; then echo "Convert JS source to C header"; fi
|
||||
python3 js2c.py
|
||||
|
||||
if [ "$silent" != true ]; then echo "Done."; fi
|
64
bridge/js2c.py
Normal file
64
bridge/js2c.py
Normal file
@ -0,0 +1,64 @@
|
||||
# https://webui.me
|
||||
# https://github.com/webui-dev/webui
|
||||
# Copyright (c) 2020-2025 Hassan Draga.
|
||||
# Licensed under MIT License.
|
||||
# All rights reserved.
|
||||
# Canada.
|
||||
#
|
||||
# WebUI JavaScript to C Header
|
||||
|
||||
def js_to_c_header(input_filename, output_filename):
|
||||
try:
|
||||
print(f"Converting '{input_filename}' to '{output_filename}'...")
|
||||
|
||||
# comment
|
||||
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"
|
||||
)
|
||||
|
||||
# Read JS file content
|
||||
with open(input_filename, 'r', encoding='utf-8') as file_js:
|
||||
content = file_js.read()
|
||||
file_js.close()
|
||||
|
||||
# Add comment to js
|
||||
new_content = comment + content
|
||||
with open(input_filename, 'w') as file_js:
|
||||
file_js.write(new_content)
|
||||
file_js.close()
|
||||
|
||||
# Convert each character in JS content to its hexadecimal value
|
||||
hex_values = ["0x{:02x}".format(ord(char)) for char in new_content]
|
||||
|
||||
# Prepare the content for the C header file
|
||||
header_content = (
|
||||
comment +
|
||||
"// --- PLEASE DO NOT EDIT THIS FILE -------\n"
|
||||
"// --- THIS FILE IS GENERATED BY JS2C.PY --\n\n"
|
||||
"#ifndef WEBUI_BRIDGE_H\n"
|
||||
"#define WEBUI_BRIDGE_H\n"
|
||||
"unsigned char webui_javascript_bridge[] = { "
|
||||
)
|
||||
|
||||
# Split the hexadecimal values to make the output more readable, adding a new line every 10 values
|
||||
for i in range(0, len(hex_values), 10):
|
||||
header_content += "\n " + ', '.join(hex_values[i:i+10]) + ','
|
||||
header_content += "\n 0x00\n};\n\n#endif // WEBUI_BRIDGE_H"
|
||||
|
||||
# Write the header content to the output file
|
||||
with open(output_filename, 'w', encoding='utf-8') as file_h:
|
||||
file_h.write(header_content)
|
||||
file_h.close()
|
||||
|
||||
except FileNotFoundError:
|
||||
print(f"Error: File '{input_filename}' not found.")
|
||||
return
|
||||
|
||||
# Main
|
||||
js_to_c_header('webui.js', 'webui_bridge.h')
|
56
bridge/utils.ts
Normal file
56
bridge/utils.ts
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
https://webui.me
|
||||
https://github.com/webui-dev/webui
|
||||
Copyright (c) 2020-2025 Hassan Draga.
|
||||
Licensed under MIT License.
|
||||
All rights reserved.
|
||||
Canada.
|
||||
|
||||
File: WebUI Bridge Utils
|
||||
Copyright (c) 2024 Oculi Julien.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Allows you to automatically bind an event listener to newly added
|
||||
* elements that match a specific selector within a given root element.
|
||||
* Track dom update to rebind event listeners automatically.
|
||||
*
|
||||
* @param {HTMLElement} root - The root element to observe for changes.
|
||||
* @param {string} targetSelector - Query selector matching elements that you want to bind the event listener to.
|
||||
* @param {K} type - Type of event listener to bind (same as for addEventListener).
|
||||
* @param listener - Event listener to bind (same as for addEventListener).
|
||||
* @param {boolean | AddEventListenerOptions} [options] - Event listener options (same as for addEventListener).
|
||||
* @returns the used observer to allow disconnect.
|
||||
*/
|
||||
export function addRefreshableEventListener<K extends keyof HTMLElementEventMap>(
|
||||
root: HTMLElement,
|
||||
targetSelector: string,
|
||||
type: K,
|
||||
listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => unknown,
|
||||
options?: boolean | AddEventListenerOptions,
|
||||
) {
|
||||
function rebindListener(mutations: MutationRecord[]) {
|
||||
for (const mutation of mutations) {
|
||||
for (const node of mutation.addedNodes) {
|
||||
if (!(node instanceof HTMLElement)) return; // Target only html elements
|
||||
if (node.matches(targetSelector)) {
|
||||
// Bind event on added nodes
|
||||
node.addEventListener<K>(type, listener, options);
|
||||
}
|
||||
for (const child of node.querySelectorAll(targetSelector)) {
|
||||
if (!(child instanceof HTMLElement)) continue; //Target only html elements
|
||||
child.addEventListener<K>(type, listener, options);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const observer = new MutationObserver(rebindListener); //Set mutation observer callback
|
||||
observer.observe(root, { subtree: true, childList: true }); // Observe root element and all his children
|
||||
return observer; // Allow user to stop observer for performance issues
|
||||
}
|
||||
|
||||
/**
|
||||
* Async function constructor
|
||||
*/
|
||||
export const AsyncFunction = async function () {}.constructor;
|
974
bridge/webui.ts
Normal file
974
bridge/webui.ts
Normal file
@ -0,0 +1,974 @@
|
||||
'use-strict'; // Force strict mode for transpiled
|
||||
|
||||
/*
|
||||
WebUI Bridge
|
||||
|
||||
https://webui.me
|
||||
https://github.com/webui-dev/webui
|
||||
Copyright (c) 2020-2025 Hassan Draga.
|
||||
Licensed under MIT License.
|
||||
All rights reserved.
|
||||
Canada.
|
||||
|
||||
Converted from JavaScript to TypeScript
|
||||
By Oculi Julien. Copyright (c) 2023.
|
||||
*/
|
||||
|
||||
//@ts-ignore use *.ts import real extension
|
||||
import { AsyncFunction, addRefreshableEventListener } from './utils.ts';
|
||||
|
||||
type DataTypes = string | number | boolean | Uint8Array;
|
||||
|
||||
class WebuiBridge {
|
||||
// WebUI Settings
|
||||
#secure: boolean;
|
||||
#token: number;
|
||||
#port: number;
|
||||
#log: boolean;
|
||||
#winX: number;
|
||||
#winY: number;
|
||||
#winW: number;
|
||||
#winH: number;
|
||||
// Frameless Dragging
|
||||
#isDragging: boolean = false;
|
||||
#initialMouseX: number = 0;
|
||||
#initialMouseY: number = 0;
|
||||
#initialWindowX: number = window.screenX || window.screenLeft;
|
||||
#initialWindowY: number = window.screenY || window.screenTop;
|
||||
#currentWindowX: number = window.screenX || window.screenLeft;
|
||||
#currentWindowY: number = window.screenY || window.screenTop;
|
||||
// Internals
|
||||
#ws: WebSocket;
|
||||
#wsStayAlive: boolean = true;
|
||||
#wsStayAliveTimeout: number = 500;
|
||||
#wsWasConnected: boolean = false;
|
||||
#TokenAccepted: boolean = false;
|
||||
#closeReason: number = 0;
|
||||
#closeValue: string;
|
||||
#AllEvents: boolean = false;
|
||||
#callPromiseID: Uint16Array = new Uint16Array(1);
|
||||
#callPromiseResolve: (((data: string) => unknown) | undefined)[] = [];
|
||||
#allowNavigation: boolean = true;
|
||||
#sendQueue: Uint8Array[] = [];
|
||||
#isSending: boolean = false;
|
||||
#bindsList: string[];
|
||||
// WebUI Const
|
||||
#WEBUI_SIGNATURE: number = 221;
|
||||
#CMD_JS: number = 254;
|
||||
#CMD_JS_QUICK: number = 253;
|
||||
#CMD_CLICK: number = 252;
|
||||
#CMD_NAVIGATION: number = 251;
|
||||
#CMD_CLOSE: number = 250;
|
||||
#CMD_CALL_FUNC: number = 249;
|
||||
#CMD_SEND_RAW: number = 248;
|
||||
#CMD_NEW_ID: number = 247;
|
||||
#CMD_MULTI: number = 246;
|
||||
#CMD_CHECK_TK: number = 245;
|
||||
#CMD_WINDOW_DRAG: number = 244;
|
||||
#CMD_WINDOW_RESIZED: number = 243;
|
||||
#MULTI_CHUNK_SIZE: number = 65500;
|
||||
#PROTOCOL_SIZE: number = 8; // Protocol header size in bytes
|
||||
#PROTOCOL_SIGN: number = 0; // Protocol byte position: Signature (1 Byte)
|
||||
#PROTOCOL_TOKEN: number = 1; // Protocol byte position: Token (4 Bytes)
|
||||
#PROTOCOL_ID: number = 5; // Protocol byte position: ID (2 Bytes)
|
||||
#PROTOCOL_CMD: number = 7; // Protocol byte position: Command (1 Byte)
|
||||
#PROTOCOL_DATA: number = 8; // Protocol byte position: Data (n Byte)
|
||||
#Token: Uint32Array = new Uint32Array(1);
|
||||
#Ping: Boolean = true;
|
||||
// Events
|
||||
#eventsCallback: ((event: number) => void) | null = null;
|
||||
event = {
|
||||
// TODO: Make `event` static and solve the ESBUILD `_WebuiBridge` issue.
|
||||
CONNECTED: 0,
|
||||
DISCONNECTED: 1,
|
||||
};
|
||||
// Constructor
|
||||
constructor({
|
||||
secure = false,
|
||||
token = 0,
|
||||
port = 0,
|
||||
log = false,
|
||||
winX = 0,
|
||||
winY = 0,
|
||||
winW = 0,
|
||||
winH = 0,
|
||||
}: {
|
||||
secure: boolean;
|
||||
token: number;
|
||||
port: number;
|
||||
log?: boolean;
|
||||
winX: number;
|
||||
winY: number;
|
||||
winW: number;
|
||||
winH: number;
|
||||
}) {
|
||||
// Constructor arguments are injected by webui.c
|
||||
this.#secure = secure;
|
||||
this.#token = token;
|
||||
this.#port = port;
|
||||
this.#log = log;
|
||||
this.#winX = winX;
|
||||
this.#winY = winY;
|
||||
this.#winW = winW;
|
||||
this.#winH = winH;
|
||||
// Token
|
||||
this.#Token[0] = this.#token;
|
||||
// Instance
|
||||
if ('webui' in globalThis) {
|
||||
throw new Error('Sorry. WebUI is already defined, only one instance is allowed.');
|
||||
}
|
||||
// Positioning the current window
|
||||
if (this.#winX !== undefined && this.#winY !== undefined) {
|
||||
// window.moveTo(this.#winX, this.#winY);
|
||||
}
|
||||
// Resize the current window
|
||||
if (this.#winW !== undefined && this.#winH !== undefined) {
|
||||
// window.resizeTo(this.#winW, this.#winH);
|
||||
}
|
||||
// WebSocket
|
||||
if (!('WebSocket' in window)) {
|
||||
alert('Sorry. WebSocket is not supported by your web browser.');
|
||||
if (!this.#log) globalThis.close();
|
||||
}
|
||||
// Connect to the backend application
|
||||
this.#start();
|
||||
// Navigation event listener
|
||||
if ('navigation' in globalThis) {
|
||||
globalThis.navigation.addEventListener('navigate', (event) => {
|
||||
if (!this.#allowNavigation) {
|
||||
if (this.#AllEvents && (this.#wsIsConnected())) {
|
||||
event.preventDefault();
|
||||
const url = new URL(event.destination.url);
|
||||
if (this.#log) console.log(`WebUI -> DOM -> Navigation Event [${url.href}]`);
|
||||
this.#sendEventNavigation(url.href);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// Click navigation event listener
|
||||
addRefreshableEventListener(document.body, 'a', 'click', (event) => {
|
||||
if (!this.#allowNavigation) {
|
||||
if (this.#AllEvents && (this.#wsIsConnected())) {
|
||||
event.preventDefault();
|
||||
const { href } = event.target as HTMLAnchorElement;
|
||||
if (this.#log) console.log(`WebUI -> DOM -> Navigation Click Event [${href}]`);
|
||||
this.#sendEventNavigation(href);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
// Prevent F5 refresh
|
||||
document.addEventListener('keydown', (event) => {
|
||||
if (this.#log) return; // Allowed in debug mode
|
||||
if (event.key === 'F5') event.preventDefault();
|
||||
});
|
||||
// Frameless Dragging
|
||||
document.addEventListener("mousemove", (e) => {
|
||||
// WebUI `-webkit-app-region: drag;` custom implementation
|
||||
if (e.buttons !== 1) {
|
||||
this.#isDragging = false;
|
||||
return;
|
||||
}
|
||||
if (!this.#isDragging) {
|
||||
let target = e.target;
|
||||
while (target) {
|
||||
if (window.getComputedStyle(target).getPropertyValue("-webkit-app-region") === "drag") {
|
||||
this.#initialMouseX = e.screenX;
|
||||
this.#initialMouseY = e.screenY;
|
||||
this.#initialWindowX = this.#currentWindowX;
|
||||
this.#initialWindowY = this.#currentWindowY;
|
||||
this.#isDragging = true;
|
||||
break;
|
||||
}
|
||||
target = target.parentElement;
|
||||
}
|
||||
return;
|
||||
}
|
||||
// Calculate window position relative to cursor movement
|
||||
const deltaX = e.screenX - this.#initialMouseX;
|
||||
const deltaY = e.screenY - this.#initialMouseY;
|
||||
let newX = this.#initialWindowX + deltaX;
|
||||
let newY = this.#initialWindowY + deltaY;
|
||||
// Fix out of screen
|
||||
if (newX < 0) newX = 0;
|
||||
if (newY < 0) newY = 0;
|
||||
// Move the window
|
||||
this.#sendDrag(newX, newY);
|
||||
// Update the last window position
|
||||
this.#currentWindowX = newX;
|
||||
this.#currentWindowY = newY;
|
||||
});
|
||||
// Stop frameless dragging on mouse release
|
||||
document.addEventListener("mouseup", () => {
|
||||
this.#isDragging = false;
|
||||
});
|
||||
onbeforeunload = () => {
|
||||
this.#close();
|
||||
};
|
||||
setTimeout(() => {
|
||||
if (!this.#wsWasConnected) {
|
||||
alert('Sorry. WebUI failed to connect to the backend application. Please try again.');
|
||||
}
|
||||
}, 1500);
|
||||
}
|
||||
// Methods
|
||||
#close(reason = 0, value = '') {
|
||||
this.#closeReason = reason;
|
||||
this.#closeValue = value;
|
||||
if (this.#wsIsConnected()) {
|
||||
this.#ws.close();
|
||||
}
|
||||
}
|
||||
#freezeUi() {
|
||||
setTimeout(() => {
|
||||
if (!this.#wsIsConnected()) {
|
||||
if (document.getElementById('webui-error-connection-lost')) return;
|
||||
const div = document.createElement('div');
|
||||
div.id = 'webui-error-connection-lost';
|
||||
Object.assign(div.style, {
|
||||
position: 'relative',
|
||||
top: '0',
|
||||
left: '0',
|
||||
width: '100%',
|
||||
backgroundColor: '#ff4d4d',
|
||||
color: '#fff',
|
||||
textAlign: 'center',
|
||||
padding: '2px 0',
|
||||
fontFamily: 'Arial, sans-serif',
|
||||
fontSize: '14px',
|
||||
zIndex: '1000',
|
||||
lineHeight: '1'
|
||||
});
|
||||
div.innerText = 'WebUI Error: Connection with the backend is lost.';
|
||||
document.body.insertBefore(div, document.body.firstChild);
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
#unfreezeUI() {
|
||||
const div = document.getElementById('webui-error-connection-lost');
|
||||
if (div) {
|
||||
div.remove();
|
||||
}
|
||||
}
|
||||
#isTextBasedCommand(cmd: number): Boolean {
|
||||
if (cmd !== this.#CMD_SEND_RAW) return true;
|
||||
return false;
|
||||
}
|
||||
#parseDimensions(input: string): {x: number; y: number; width: number; height: number} {
|
||||
try {
|
||||
const parts = input.split(',');
|
||||
if (parts.length !== 4) return {x: 0, y: 0, width: 0, height: 0};
|
||||
const x = parseFloat(parts[0]),
|
||||
y = parseFloat(parts[1]),
|
||||
width = parseFloat(parts[2]),
|
||||
height = parseFloat(parts[3]);
|
||||
return [x, y, width, height].some(isNaN) ? {x: 0, y: 0, width: 0, height: 0} : {x, y, width, height};
|
||||
} catch {
|
||||
return {x: 0, y: 0, width: 0, height: 0};
|
||||
}
|
||||
}
|
||||
#getDataStrFromPacket(buffer: Uint8Array, startIndex: number): string {
|
||||
let stringBytes: number[] = [];
|
||||
for (let i = startIndex; i < buffer.length; i++) {
|
||||
if (buffer[i] === 0) {
|
||||
// Check for null byte
|
||||
break;
|
||||
}
|
||||
stringBytes.push(buffer[i]);
|
||||
}
|
||||
// Convert the array of bytes to a string
|
||||
const stringText = new TextDecoder().decode(new Uint8Array(stringBytes));
|
||||
return stringText;
|
||||
}
|
||||
#getID(buffer: Uint8Array, index: number): number {
|
||||
if (index < 0 || index >= buffer.length - 1) {
|
||||
throw new Error('Index out of bounds or insufficient data.');
|
||||
}
|
||||
const firstByte = buffer[index];
|
||||
const secondByte = buffer[index + 1];
|
||||
const combined = (secondByte << 8) | firstByte; // Works only for little-endian
|
||||
return combined;
|
||||
}
|
||||
#addToken(buffer: Uint8Array, value: number, index: number): void {
|
||||
if (value < 0 || value > 0xffffffff) {
|
||||
throw new Error('Number is out of the range for 4 bytes representation.');
|
||||
}
|
||||
if (index < 0 || index > buffer.length - 4) {
|
||||
throw new Error('Index out of bounds or insufficient space in buffer.');
|
||||
}
|
||||
// WebUI expect Little-endian (Work for Little/Big endian platforms)
|
||||
buffer[index] = value & 0xff; // Least significant byte
|
||||
buffer[index + 1] = (value >>> 8) & 0xff;
|
||||
buffer[index + 2] = (value >>> 16) & 0xff;
|
||||
buffer[index + 3] = (value >>> 24) & 0xff; // Most significant byte
|
||||
}
|
||||
#addID(buffer: Uint8Array, value: number, index: number): void {
|
||||
if (value < 0 || value > 0xffff) {
|
||||
throw new Error('Number is out of the range for 2 bytes representation.');
|
||||
}
|
||||
if (index < 0 || index > buffer.length - 2) {
|
||||
throw new Error('Index out of bounds or insufficient space in buffer.');
|
||||
}
|
||||
// WebUI expect Little-endian (Work for Little/Big endian platforms)
|
||||
buffer[index] = value & 0xff; // Least significant byte
|
||||
buffer[index + 1] = (value >>> 8) & 0xff; // Most significant byte
|
||||
}
|
||||
#start() {
|
||||
this.#keepAlive();
|
||||
this.#callPromiseID[0] = 0;
|
||||
// Connect to the backend application
|
||||
this.#wsConnect();
|
||||
}
|
||||
#keepAlive = async () => {
|
||||
while (true) {
|
||||
if (this.#Ping) {
|
||||
// Some web browsers may close the connection
|
||||
// let's send a void message to keep WS open
|
||||
this.#sendData(new TextEncoder().encode('ping'));
|
||||
} else {
|
||||
// There is an active communication
|
||||
this.#Ping = true;
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 20000));
|
||||
}
|
||||
};
|
||||
#clicksListener() {
|
||||
document.querySelectorAll<HTMLElement>("[id]").forEach(e => {
|
||||
if (this.#AllEvents || ((e.id !== '') && (this.#bindsList.includes(e.id)))) {
|
||||
if (e.id && !e.dataset.webui_click_is_set) {
|
||||
e.dataset.webui_click_is_set = "true";
|
||||
e.addEventListener("click", () => this.#sendClick(e.id));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
async #sendData(packet: Uint8Array) {
|
||||
this.#Ping = false;
|
||||
if ((!this.#wsIsConnected()) || packet === undefined) return;
|
||||
// Enqueue the packet
|
||||
this.#sendQueue.push(packet);
|
||||
if (this.#isSending) return;
|
||||
this.#isSending = true;
|
||||
while (this.#sendQueue.length > 0) {
|
||||
const currentPacket = this.#sendQueue.shift()!;
|
||||
if (currentPacket.length < this.#MULTI_CHUNK_SIZE) {
|
||||
this.#ws.send(currentPacket.buffer);
|
||||
} else {
|
||||
// Pre-packet to let WebUI be ready for multi packet
|
||||
const pre_packet = Uint8Array.of(
|
||||
this.#WEBUI_SIGNATURE,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0, // Token (4 Bytes)
|
||||
0,
|
||||
0, // ID (2 Bytes)
|
||||
this.#CMD_MULTI,
|
||||
...new TextEncoder().encode(currentPacket.length.toString()),
|
||||
0,
|
||||
);
|
||||
this.#ws.send(pre_packet.buffer);
|
||||
// Send chunks
|
||||
let offset = 0;
|
||||
const sendChunk = async () => {
|
||||
if (offset < currentPacket.length) {
|
||||
const chunkSize = Math.min(this.#MULTI_CHUNK_SIZE, currentPacket.length - offset);
|
||||
const chunk = currentPacket.subarray(offset, offset + chunkSize);
|
||||
this.#ws.send(chunk);
|
||||
offset += chunkSize;
|
||||
await sendChunk();
|
||||
}
|
||||
};
|
||||
await sendChunk();
|
||||
}
|
||||
}
|
||||
this.#isSending = false;
|
||||
}
|
||||
#sendClick(elem: string) {
|
||||
if (this.#wsIsConnected()) {
|
||||
// Protocol
|
||||
// 0: [SIGNATURE]
|
||||
// 1: [TOKEN]
|
||||
// 2: [ID]
|
||||
// 3: [CMD]
|
||||
// 4: [Element]
|
||||
const packet =
|
||||
elem !== ''
|
||||
? Uint8Array.of(
|
||||
this.#WEBUI_SIGNATURE,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0, // Token (4 Bytes)
|
||||
0,
|
||||
0, // ID (2 Bytes)
|
||||
this.#CMD_CLICK,
|
||||
...new TextEncoder().encode(elem),
|
||||
0,
|
||||
)
|
||||
: Uint8Array.of(
|
||||
this.#WEBUI_SIGNATURE,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0, // Token (4 Bytes)
|
||||
0,
|
||||
0, // ID (2 Bytes)
|
||||
this.#CMD_CLICK,
|
||||
0,
|
||||
);
|
||||
this.#addToken(packet, this.#token, this.#PROTOCOL_TOKEN);
|
||||
// this.#addID(packet, 0, this.#PROTOCOL_ID)
|
||||
this.#sendData(packet);
|
||||
if (this.#log) console.log(`WebUI -> Send Click [${elem}]`);
|
||||
}
|
||||
}
|
||||
#checkToken() {
|
||||
if (this.#wsIsConnected()) {
|
||||
// Protocol
|
||||
// 0: [SIGNATURE]
|
||||
// 1: [TOKEN]
|
||||
// 2: [ID]
|
||||
// 3: [CMD]
|
||||
const packet =
|
||||
Uint8Array.of(
|
||||
this.#WEBUI_SIGNATURE,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0, // Token (4 Bytes)
|
||||
0,
|
||||
0, // ID (2 Bytes)
|
||||
this.#CMD_CHECK_TK,
|
||||
0,
|
||||
);
|
||||
this.#addToken(packet, this.#token, this.#PROTOCOL_TOKEN);
|
||||
// this.#addID(packet, 0, this.#PROTOCOL_ID)
|
||||
this.#sendData(packet);
|
||||
if (this.#log) console.log(`WebUI -> Send Token [0x${this.#token.toString(16).padStart(8, '0')}]`);
|
||||
}
|
||||
}
|
||||
#sendEventNavigation(url: string) {
|
||||
if (url !== '') {
|
||||
if (this.#wsIsConnected()) {
|
||||
if (this.#log) console.log(`WebUI -> Send Navigation Event [${url}]`);
|
||||
const packet = Uint8Array.of(
|
||||
// Protocol
|
||||
// 0: [SIGNATURE]
|
||||
// 1: [TOKEN]
|
||||
// 2: [ID]
|
||||
// 3: [CMD]
|
||||
// 4: [URL]
|
||||
this.#WEBUI_SIGNATURE,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0, // Token (4 Bytes)
|
||||
0,
|
||||
0, // ID (2 Bytes)
|
||||
this.#CMD_NAVIGATION,
|
||||
...new TextEncoder().encode(url),
|
||||
);
|
||||
this.#addToken(packet, this.#token, this.#PROTOCOL_TOKEN);
|
||||
// this.#addID(packet, 0, this.#PROTOCOL_ID)
|
||||
this.#sendData(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
#sendDrag(x: number, y: number) {
|
||||
if (this.#wsIsConnected()) {
|
||||
if (this.#log) console.log(`WebUI -> Send Drag Event [${x}, ${y}]`);
|
||||
const packet = Uint8Array.of(
|
||||
// Protocol
|
||||
// 0: [SIGNATURE]
|
||||
// 1: [TOKEN]
|
||||
// 2: [ID]
|
||||
// 3: [CMD]
|
||||
// 4: [X]
|
||||
// 4: [Y]
|
||||
this.#WEBUI_SIGNATURE,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0, // Token (4 Bytes)
|
||||
0,
|
||||
0, // ID (2 Bytes)
|
||||
this.#CMD_WINDOW_DRAG,
|
||||
...new Uint8Array(new Int32Array([x]).buffer), // X (4 Bytes)
|
||||
...new Uint8Array(new Int32Array([y]).buffer), // Y (4 Bytes)
|
||||
);
|
||||
this.#addToken(packet, this.#token, this.#PROTOCOL_TOKEN);
|
||||
// this.#addID(packet, 0, this.#PROTOCOL_ID)
|
||||
this.#sendData(packet);
|
||||
}
|
||||
}
|
||||
#closeWindowTimer() {
|
||||
setTimeout(function () {
|
||||
globalThis.close();
|
||||
}, 1000);
|
||||
}
|
||||
#updateBindsList() {
|
||||
if (this.#bindsList.includes('')) {
|
||||
this.#AllEvents = true;
|
||||
this.#allowNavigation = false;
|
||||
}
|
||||
this.#generateCallObjects();
|
||||
this.#clicksListener();
|
||||
}
|
||||
#toUint16(value: number): number {
|
||||
return value & 0xffff;
|
||||
}
|
||||
#generateCallObjects() {
|
||||
for (const bind of this.#bindsList) {
|
||||
if (bind.trim()) {
|
||||
const fn = bind;
|
||||
if (fn.trim()) {
|
||||
if (fn !== '__webui_core_api__') {
|
||||
if (typeof (window as any)[fn] === 'undefined') {
|
||||
this[fn] = (...args: DataTypes[]) => this.call(fn, ...args);
|
||||
(window as any)[fn] = (...args: string[]) => this.call(fn, ...args);
|
||||
if (this.#log) console.log(`WebUI -> Binding backend function [${fn}]`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#callPromise(fn: string, ...args: DataTypes[]) {
|
||||
--this.#callPromiseID[0];
|
||||
const callId = this.#toUint16(this.#callPromiseID[0]);
|
||||
// Combine lengths
|
||||
let argsLengths = args
|
||||
.map((arg) => {
|
||||
if (typeof arg === 'object') {
|
||||
// Uint8Array
|
||||
return arg.length;
|
||||
} else {
|
||||
// string, number, boolean
|
||||
return new TextEncoder().encode(arg.toString()).length;
|
||||
}
|
||||
})
|
||||
.join(';');
|
||||
// Combine values
|
||||
let argsValues: Uint8Array = new Uint8Array();
|
||||
for (const arg of args) {
|
||||
let buffer: Uint8Array;
|
||||
if (typeof arg === 'object') {
|
||||
buffer = arg; // Uint8Array
|
||||
} else {
|
||||
// string, number, boolean
|
||||
buffer = new TextEncoder().encode(arg.toString());
|
||||
}
|
||||
const temp = new Uint8Array(argsValues.length + buffer.length + 1);
|
||||
temp.set(argsValues, 0);
|
||||
temp.set(buffer, argsValues.length);
|
||||
temp[argsValues.length + buffer.length] = 0x00;
|
||||
argsValues = temp;
|
||||
}
|
||||
// Protocol
|
||||
// 0: [SIGNATURE]
|
||||
// 1: [TOKEN]
|
||||
// 2: [ID]
|
||||
// 3: [CMD]
|
||||
// 4: [Fn, Null, {LenLen...}, Null, {Data,Null,Data,Null...}]
|
||||
let packet = new Uint8Array(0);
|
||||
const packetPush = (data: Uint8Array) => {
|
||||
const newPacket = new Uint8Array(packet.length + data.length);
|
||||
newPacket.set(packet);
|
||||
newPacket.set(data, packet.length);
|
||||
packet = newPacket;
|
||||
};
|
||||
packetPush(new Uint8Array([this.#WEBUI_SIGNATURE]));
|
||||
packetPush(new Uint8Array([0, 0, 0, 0])); // Token (4 Bytes)
|
||||
packetPush(new Uint8Array([0, 0])); // ID (2 Bytes)
|
||||
packetPush(new Uint8Array([this.#CMD_CALL_FUNC]));
|
||||
packetPush(new TextEncoder().encode(fn));
|
||||
packetPush(new Uint8Array([0]));
|
||||
packetPush(new TextEncoder().encode(argsLengths));
|
||||
packetPush(new Uint8Array([0]));
|
||||
packetPush(new Uint8Array(argsValues));
|
||||
this.#addToken(packet, this.#token, this.#PROTOCOL_TOKEN);
|
||||
this.#addID(packet, callId, this.#PROTOCOL_ID);
|
||||
return new Promise((resolve) => {
|
||||
this.#callPromiseResolve[callId] = resolve;
|
||||
this.#sendData(packet);
|
||||
});
|
||||
}
|
||||
async callCore(fn: string, ...args: DataTypes[]): Promise<DataTypes> {
|
||||
return this.call('__webui_core_api__', fn, ...args);
|
||||
}
|
||||
// -- WebSocket ----------------------------
|
||||
#wsIsConnected(): boolean {
|
||||
return ((this.#ws) && (this.#ws.readyState === WebSocket.OPEN));
|
||||
}
|
||||
#wsConnect(): void {
|
||||
if (this.#wsIsConnected()) {
|
||||
this.#ws.close();
|
||||
}
|
||||
this.#TokenAccepted = false;
|
||||
const host = window.location.hostname;
|
||||
const url = this.#secure ? ('wss://' + host) : ('ws://' + host);
|
||||
this.#ws = new WebSocket(`${url}:${this.#port}/_webui_ws_connect`);
|
||||
this.#ws.binaryType = 'arraybuffer';
|
||||
this.#ws.onopen = this.#wsOnOpen.bind(this);
|
||||
this.#ws.onmessage = this.#wsOnMessage.bind(this);
|
||||
this.#ws.onclose = this.#wsOnClose.bind(this);
|
||||
this.#ws.onerror = this.#wsOnError.bind(this);
|
||||
}
|
||||
#wsOnOpen = (event: Event) => {
|
||||
this.#wsWasConnected = true;
|
||||
this.#unfreezeUI();
|
||||
if (this.#log) console.log('WebUI -> Connected');
|
||||
this.#checkToken();
|
||||
};
|
||||
#wsOnError = (event: Event) => {
|
||||
if (this.#log) console.log(`WebUI -> Connection failed.`);
|
||||
};
|
||||
#wsOnClose = (event: CloseEvent) => {
|
||||
if (this.#closeReason === this.#CMD_NAVIGATION) {
|
||||
this.#closeReason = 0;
|
||||
if (this.#log) console.log(`WebUI -> Connection lost. Navigation to [${this.#closeValue}]`);
|
||||
this.#allowNavigation = true;
|
||||
globalThis.location.replace(this.#closeValue);
|
||||
} else {
|
||||
if (this.#wsStayAlive) {
|
||||
// Re-connect
|
||||
if (this.#log) console.log(`WebUI -> Connection lost (${event.code}). Reconnecting...`);
|
||||
this.#freezeUi();
|
||||
setTimeout(() => this.#wsConnect(), this.#wsStayAliveTimeout);
|
||||
}
|
||||
else if (this.#log) {
|
||||
// Debug close
|
||||
console.log(`WebUI -> Connection lost (${event.code})`);
|
||||
this.#freezeUi();
|
||||
} else {
|
||||
// Release close
|
||||
this.#closeWindowTimer();
|
||||
}
|
||||
}
|
||||
// Event Callback
|
||||
if (this.#eventsCallback) {
|
||||
this.#eventsCallback(this.event.DISCONNECTED);
|
||||
}
|
||||
};
|
||||
#wsOnMessage = async (event: MessageEvent) => {
|
||||
const buffer8 = new Uint8Array(event.data);
|
||||
if (buffer8.length < this.#PROTOCOL_SIZE) return;
|
||||
if (buffer8[this.#PROTOCOL_SIGN] !== this.#WEBUI_SIGNATURE) return;
|
||||
if (this.#isTextBasedCommand(buffer8[this.#PROTOCOL_CMD])) {
|
||||
// UTF8 Text based commands
|
||||
const callId = this.#getID(buffer8, this.#PROTOCOL_ID);
|
||||
// Process Command
|
||||
switch (buffer8[this.#PROTOCOL_CMD]) {
|
||||
case this.#CMD_JS_QUICK:
|
||||
case this.#CMD_JS:
|
||||
{
|
||||
// Protocol
|
||||
// 0: [SIGNATURE]
|
||||
// 1: [TOKEN]
|
||||
// 2: [ID]
|
||||
// 3: [CMD]
|
||||
// 4: [Script]
|
||||
const script: string = this.#getDataStrFromPacket(buffer8, this.#PROTOCOL_DATA);
|
||||
const scriptSanitize = script.replace(/(?:\r\n|\r|\n)/g, '\n');
|
||||
if (this.#log) console.log(`WebUI -> CMD -> JS [${scriptSanitize}]`);
|
||||
// Get callback result
|
||||
let FunReturn = 'undefined';
|
||||
let FunError = false;
|
||||
try {
|
||||
FunReturn = await AsyncFunction(scriptSanitize)();
|
||||
} catch (e) {
|
||||
FunError = true;
|
||||
FunReturn = e.message;
|
||||
}
|
||||
// Stop if this is a quick call
|
||||
if (buffer8[this.#PROTOCOL_CMD] === this.#CMD_JS_QUICK) return;
|
||||
// Get the call return
|
||||
if (FunReturn === undefined) {
|
||||
FunReturn = 'undefined';
|
||||
}
|
||||
// Logging
|
||||
if (this.#log && !FunError) console.log(`WebUI -> CMD -> JS -> Return Success [${FunReturn}]`);
|
||||
if (this.#log && FunError) console.log(`WebUI -> CMD -> JS -> Return Error [${FunReturn}]`);
|
||||
// Protocol
|
||||
// 0: [SIGNATURE]
|
||||
// 1: [TOKEN]
|
||||
// 2: [ID]
|
||||
// 3: [CMD]
|
||||
// 4: [Error, Script Response]
|
||||
let packet = new Uint8Array(0);
|
||||
const packetPush = (data: Uint8Array) => {
|
||||
const newPacket = new Uint8Array(packet.length + data.length);
|
||||
newPacket.set(packet);
|
||||
newPacket.set(data, packet.length);
|
||||
packet = newPacket;
|
||||
};
|
||||
const packetPushStr = (data: string) => {
|
||||
const chunkSize = 1024 * 8;
|
||||
if (data.length > chunkSize) {
|
||||
const encoder = new TextEncoder();
|
||||
for (let i = 0; i < data.length; i += chunkSize) {
|
||||
const chunk = data.substring(i, Math.min(i + chunkSize, data.length));
|
||||
const encodedChunk = encoder.encode(chunk);
|
||||
packetPush(encodedChunk);
|
||||
}
|
||||
} else {
|
||||
packetPush(new TextEncoder().encode(data));
|
||||
}
|
||||
};
|
||||
packetPush(new Uint8Array([this.#WEBUI_SIGNATURE]));
|
||||
packetPush(new Uint8Array([0, 0, 0, 0])); // Token (4 Bytes)
|
||||
packetPush(new Uint8Array([0, 0])); // ID (2 Bytes)
|
||||
packetPush(new Uint8Array([this.#CMD_JS]));
|
||||
packetPush(new Uint8Array(FunError ? [1] : [0]));
|
||||
packetPushStr(FunReturn);
|
||||
packetPush(new Uint8Array([0]));
|
||||
this.#addToken(packet, this.#token, this.#PROTOCOL_TOKEN);
|
||||
this.#addID(packet, callId, this.#PROTOCOL_ID);
|
||||
this.#sendData(packet);
|
||||
}
|
||||
break;
|
||||
case this.#CMD_CALL_FUNC:
|
||||
{
|
||||
// Protocol
|
||||
// 0: [SIGNATURE]
|
||||
// 1: [TOKEN]
|
||||
// 2: [ID]
|
||||
// 3: [CMD]
|
||||
// 4: [Call Response]
|
||||
const callResponse: string = this.#getDataStrFromPacket(buffer8, this.#PROTOCOL_DATA);
|
||||
if (this.#log) {
|
||||
console.log(`WebUI -> CMD -> Call Response [${callResponse}]`);
|
||||
}
|
||||
if (this.#callPromiseResolve[callId]) {
|
||||
if (this.#log) {
|
||||
console.log(`WebUI -> CMD -> Resolving Response #${callId}...`);
|
||||
}
|
||||
this.#callPromiseResolve[callId]?.(callResponse);
|
||||
this.#callPromiseResolve[callId] = undefined;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case this.#CMD_NAVIGATION:
|
||||
// Protocol
|
||||
// 0: [SIGNATURE]
|
||||
// 1: [TOKEN]
|
||||
// 2: [ID]
|
||||
// 3: [CMD]
|
||||
// 4: [URL]
|
||||
const url: string = this.#getDataStrFromPacket(buffer8, this.#PROTOCOL_DATA);
|
||||
if (this.#log) console.log(`WebUI -> CMD -> Navigation [${url}]`);
|
||||
this.#close(this.#CMD_NAVIGATION, url);
|
||||
break;
|
||||
case this.#CMD_WINDOW_RESIZED:
|
||||
// Protocol
|
||||
// 0: [SIGNATURE]
|
||||
// 1: [TOKEN]
|
||||
// 2: [ID]
|
||||
// 3: [CMD]
|
||||
// 4: [x,y,width,height]
|
||||
const widthAndHeight: string = this.#getDataStrFromPacket(buffer8, this.#PROTOCOL_DATA);
|
||||
const { x, y, width, height } = this.#parseDimensions(widthAndHeight);
|
||||
// Update drag positions
|
||||
this.#currentWindowX = x;
|
||||
this.#currentWindowY = y;
|
||||
if (this.#log) console.log(`WebUI -> CMD -> Window Resized [x: ${x}, y: ${y}, width: ${width}, height: ${height}]`);
|
||||
break;
|
||||
case this.#CMD_NEW_ID:
|
||||
// Protocol
|
||||
// 0: [SIGNATURE]
|
||||
// 1: [TOKEN]
|
||||
// 2: [ID]
|
||||
// 3: [CMD]
|
||||
// 4: [New Element]
|
||||
const newElement: string = this.#getDataStrFromPacket(buffer8, this.#PROTOCOL_DATA);
|
||||
if (this.#log) console.log(`WebUI -> CMD -> New Bind ID [${newElement}]`);
|
||||
if (!this.#bindsList.includes(newElement)) this.#bindsList.push(newElement);
|
||||
// Generate objects
|
||||
this.#updateBindsList();
|
||||
break;
|
||||
case this.#CMD_CLOSE:
|
||||
// Protocol
|
||||
// 0: [SIGNATURE]
|
||||
// 1: [TOKEN]
|
||||
// 2: [ID]
|
||||
// 3: [CMD]
|
||||
if (this.#log) {
|
||||
// Debug Close
|
||||
console.log(`WebUI -> CMD -> Close`);
|
||||
if (this.#wsIsConnected()) {
|
||||
this.#wsStayAlive = false;
|
||||
this.#ws.close();
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Release Close
|
||||
globalThis.close();
|
||||
}
|
||||
break;
|
||||
case this.#CMD_CHECK_TK:
|
||||
// Protocol
|
||||
// 0: [SIGNATURE]
|
||||
// 1: [TOKEN]
|
||||
// 2: [ID]
|
||||
// 3: [CMD]
|
||||
// 4: [Status]
|
||||
// 5: [BindsList]
|
||||
const status = (buffer8[this.#PROTOCOL_DATA] == 0 ? false : true);
|
||||
const tokenHex = `0x${this.#token.toString(16).padStart(8, '0')}`;
|
||||
if (status) {
|
||||
if (this.#log) console.log(`WebUI -> CMD -> Token [${tokenHex}] Accepted`);
|
||||
this.#TokenAccepted = true;
|
||||
// Get binds list (CSV)
|
||||
let csv: string = this.#getDataStrFromPacket(buffer8, this.#PROTOCOL_DATA + 1);
|
||||
csv = csv.endsWith(',') ? csv.slice(0, -1) : csv;
|
||||
this.#bindsList = csv.split(',');
|
||||
// Generate objects
|
||||
this.#updateBindsList();
|
||||
// User event callback
|
||||
if (this.#eventsCallback) {
|
||||
this.#eventsCallback(this.event.CONNECTED);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (this.#log) console.log(`WebUI -> CMD -> Token [${tokenHex}] Not Accepted. Reload page...`);
|
||||
// Refresh the page to get a new token
|
||||
this.#allowNavigation = true;
|
||||
this.#wsStayAlive = false;
|
||||
globalThis.location.reload();
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// Raw-binary based commands
|
||||
switch (buffer8[this.#PROTOCOL_CMD]) {
|
||||
case this.#CMD_SEND_RAW:
|
||||
// Protocol
|
||||
// 0: [SIGNATURE]
|
||||
// 1: [TOKEN]
|
||||
// 2: [ID]
|
||||
// 3: [CMD]
|
||||
// 4: [Function,Null,Raw Data]
|
||||
// Get function name
|
||||
const functionName: string = this.#getDataStrFromPacket(buffer8, this.#PROTOCOL_DATA);
|
||||
// Get the raw data
|
||||
const rawDataIndex: number = this.#PROTOCOL_DATA + functionName.length + 1;
|
||||
const rawDataSize: number = (buffer8.length - rawDataIndex) - 1;
|
||||
const userRawData = buffer8.subarray(rawDataIndex, (rawDataIndex + rawDataSize));
|
||||
if (this.#log) console.log(`WebUI -> CMD -> Received Raw ${rawDataSize} bytes for [${functionName}()]`);
|
||||
// Call the user function, and pass the raw data
|
||||
if (typeof window[functionName] === 'function') window[functionName](userRawData);
|
||||
else await AsyncFunction(functionName + '(userRawData)')();
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
// -- Public APIs --------------------------
|
||||
/**
|
||||
* Call a backend function
|
||||
*
|
||||
* @param fn - binding name
|
||||
* @param data - data to be send to the backend function
|
||||
* @return - Response of the backend callback string
|
||||
* @example - const res = await webui.call("myID", 123, true, "Hi", new Uint8Array([0x42, 0x43, 0x44]))
|
||||
*/
|
||||
async call(fn: string, ...args: DataTypes[]): Promise<DataTypes> {
|
||||
if (!fn) return Promise.reject(new SyntaxError('No binding name is provided'));
|
||||
|
||||
if (!this.#wsIsConnected()) return Promise.reject(new Error('WebSocket is not connected'));
|
||||
|
||||
// Check binding list
|
||||
if (fn !== '__webui_core_api__') {
|
||||
if (!this.#AllEvents && !this.#bindsList.includes(`${fn}`))
|
||||
return Promise.reject(new ReferenceError(`No binding was found for "${fn}"`));
|
||||
}
|
||||
|
||||
// Call backend and wait for response
|
||||
if (this.#log) console.log(`WebUI -> Calling [${fn}(...)]`);
|
||||
const response = (await this.#callPromise(fn, ...args)) as string;
|
||||
|
||||
// WebUI lib accept `DataTypes` but return only string
|
||||
if (typeof response !== 'string') return '';
|
||||
|
||||
return response;
|
||||
}
|
||||
/**
|
||||
* Active or deactivate webui debug logging
|
||||
*
|
||||
* @param status - log status to set
|
||||
*/
|
||||
setLogging(status: boolean) {
|
||||
if (status) {
|
||||
console.log('WebUI -> Log Enabled.');
|
||||
this.#log = true;
|
||||
} else {
|
||||
console.log('WebUI -> Log Disabled.');
|
||||
this.#log = false;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Encode text into base64 string
|
||||
*
|
||||
* @param data - text string
|
||||
*/
|
||||
encode(data: string): string {
|
||||
return btoa(data);
|
||||
}
|
||||
/**
|
||||
* Decode base64 string into text
|
||||
*
|
||||
* @param data - base64 string
|
||||
*/
|
||||
decode(data: string): string {
|
||||
return atob(data);
|
||||
}
|
||||
/**
|
||||
* Set a callback to receive events like connect/disconnect
|
||||
*
|
||||
* @param callback - callback function `myCallback(e)`
|
||||
* @example - webui.setEventCallback((e) => {if(e == webui.event.CONNECTED){ ... }});
|
||||
*/
|
||||
setEventCallback(callback: (e: number) => void): void {
|
||||
this.#eventsCallback = callback;
|
||||
}
|
||||
/**
|
||||
* Check if UI is connected to the back-end. The connection
|
||||
* is done by including `webui.js` virtual file in the HTML.
|
||||
*
|
||||
* @return - Boolean `true` if connected
|
||||
*/
|
||||
isConnected(): boolean {
|
||||
return ((this.#wsIsConnected()) && (this.#TokenAccepted));
|
||||
}
|
||||
/**
|
||||
* Get OS high contrast preference.
|
||||
*
|
||||
* @return - Boolean `True` if OS is using high contrast theme
|
||||
*/
|
||||
async isHighContrast(): Promise<boolean> {
|
||||
// Call a core function and wait for response
|
||||
const response = await this.callCore("high_contrast") as boolean;
|
||||
if (this.#log) console.log(`Core Response: [${response}]`);
|
||||
return response;
|
||||
}
|
||||
/**
|
||||
* When binding all events on the backend, WebUI blocks all navigation events
|
||||
* and sends them to the backend. This API allows you to control that behavior.
|
||||
*
|
||||
* @param status - Boolean `True` means WebUI will allow navigations
|
||||
* @example - webui.allowNavigation(true); // Allow navigation
|
||||
* window.location.replace('www.test.com'); // This will now proceed as usual
|
||||
*/
|
||||
allowNavigation(status: boolean): void {
|
||||
this.#allowNavigation = status;
|
||||
}
|
||||
}
|
||||
// Export
|
||||
type webui = WebuiBridge;
|
||||
export default webui;
|
||||
export type { WebuiBridge };
|
||||
// Wait for the html to be parsed
|
||||
addEventListener('load', () => {
|
||||
document.body.addEventListener('contextmenu', (event) => event.preventDefault());
|
||||
addRefreshableEventListener(document.body, 'input', 'contextmenu', (event) => event.stopPropagation());
|
||||
});
|
1766
bridge/webui_bridge.h
Normal file
1766
bridge/webui_bridge.h
Normal file
File diff suppressed because it is too large
Load Diff
210
build.zig
Normal file
210
build.zig
Normal file
@ -0,0 +1,210 @@
|
||||
const std = @import("std");
|
||||
const builtin = @import("builtin");
|
||||
|
||||
const Build = std.Build;
|
||||
const OptimizeMode = std.builtin.OptimizeMode;
|
||||
const Compile = Build.Step.Compile;
|
||||
const Module = Build.Module;
|
||||
|
||||
const lib_name = "webui";
|
||||
var global_log_level: std.log.Level = .warn;
|
||||
|
||||
/// Vendored dependencies of webui.
|
||||
pub const Dependency = enum {
|
||||
civetweb,
|
||||
// TODO: Check and add all vendored dependencies, e.g. "webview"
|
||||
};
|
||||
|
||||
const DebugDependencies = std.EnumSet(Dependency);
|
||||
|
||||
pub fn build(b: *Build) !void {
|
||||
const target = b.standardTargetOptions(.{});
|
||||
const optimize = b.standardOptimizeOption(.{});
|
||||
|
||||
const is_dynamic = b.option(bool, "dynamic", "build the dynamic library") orelse false;
|
||||
const enable_tls = b.option(bool, "enable-tls", "enable TLS support") orelse false;
|
||||
const verbose = b.option(std.log.Level, "verbose", "set verbose output") orelse .warn;
|
||||
global_log_level = verbose;
|
||||
// TODO: Support list of dependencies once support is limited to >0.13.0
|
||||
const debug = b.option(Dependency, "debug", "enable dependency debug output");
|
||||
const debug_dependencies = DebugDependencies.initMany(if (debug) |d| &.{d} else &.{});
|
||||
|
||||
if (enable_tls and !target.query.isNative()) {
|
||||
log(.err, .WebUI, "cross compilation is not supported with TLS enabled", .{});
|
||||
return error.InvalidBuildConfiguration;
|
||||
}
|
||||
|
||||
log(.info, .WebUI, "Building {s} WebUI library{s}...", .{
|
||||
if (is_dynamic) "dynamic" else "static",
|
||||
if (enable_tls) " with TLS support" else "",
|
||||
});
|
||||
defer {
|
||||
log(.info, .WebUI, "Done.", .{});
|
||||
}
|
||||
|
||||
const webui = if (is_dynamic) b.addSharedLibrary(.{
|
||||
.name = lib_name,
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
.pic = true,
|
||||
}) else b.addStaticLibrary(.{
|
||||
.name = lib_name,
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
});
|
||||
try addLinkerFlags(b, webui, enable_tls, debug_dependencies);
|
||||
|
||||
b.installArtifact(webui);
|
||||
|
||||
try build_examples(b, webui);
|
||||
}
|
||||
|
||||
fn addLinkerFlags(
|
||||
b: *Build,
|
||||
webui: *Compile,
|
||||
enable_tls: bool,
|
||||
debug_dependencies: DebugDependencies,
|
||||
) !void {
|
||||
const webui_target = webui.rootModuleTarget();
|
||||
const is_windows = webui_target.os.tag == .windows;
|
||||
const is_darwin = webui_target.os.tag == .macos;
|
||||
const debug = webui.root_module.optimize.? == .Debug;
|
||||
|
||||
// Prepare compiler flags.
|
||||
const no_tls_flags: []const []const u8 = &.{"-DNO_SSL"};
|
||||
const tls_flags: []const []const u8 = &.{ "-DWEBUI_TLS", "-DNO_SSL_DL", "-DOPENSSL_API_1_1" };
|
||||
const civetweb_flags: []const []const u8 = &.{
|
||||
"-DNO_CACHING",
|
||||
"-DNO_CGI",
|
||||
"-DUSE_WEBSOCKET",
|
||||
"-Wno-error=date-time",
|
||||
};
|
||||
|
||||
if (debug) {
|
||||
webui.root_module.addCMacro("WEBUI_LOG", "");
|
||||
}
|
||||
webui.addCSourceFile(.{
|
||||
.file = b.path("src/webui.c"),
|
||||
.flags = if (enable_tls) tls_flags else no_tls_flags,
|
||||
});
|
||||
|
||||
const civetweb_debug = debug and debug_dependencies.contains(.civetweb);
|
||||
webui.addCSourceFile(.{
|
||||
.file = b.path("src/civetweb/civetweb.c"),
|
||||
.flags = if (enable_tls and !civetweb_debug)
|
||||
civetweb_flags ++ tls_flags ++ .{"-DNDEBUG"}
|
||||
else if (enable_tls and civetweb_debug)
|
||||
civetweb_flags ++ tls_flags
|
||||
else if (!enable_tls and !civetweb_debug)
|
||||
civetweb_flags ++ .{"-DUSE_WEBSOCKET"} ++ no_tls_flags ++ .{"-DNDEBUG"}
|
||||
else
|
||||
civetweb_flags ++ .{"-DUSE_WEBSOCKET"} ++ no_tls_flags,
|
||||
});
|
||||
webui.linkLibC();
|
||||
webui.addIncludePath(b.path("include"));
|
||||
webui.installHeader(b.path("include/webui.h"), "webui.h");
|
||||
if (is_darwin) {
|
||||
webui.addCSourceFile(.{
|
||||
.file = b.path("src/webview/wkwebview.m"),
|
||||
.flags = &.{},
|
||||
});
|
||||
webui.linkFramework("Cocoa");
|
||||
webui.linkFramework("WebKit");
|
||||
} else if (is_windows) {
|
||||
webui.linkSystemLibrary("ws2_32");
|
||||
webui.linkSystemLibrary("ole32");
|
||||
if (webui_target.abi == .msvc) {
|
||||
webui.linkSystemLibrary("Advapi32");
|
||||
webui.linkSystemLibrary("Shell32");
|
||||
webui.linkSystemLibrary("user32");
|
||||
}
|
||||
if (enable_tls) {
|
||||
webui.linkSystemLibrary("bcrypt");
|
||||
}
|
||||
}
|
||||
if (enable_tls) {
|
||||
webui.linkSystemLibrary("ssl");
|
||||
webui.linkSystemLibrary("crypto");
|
||||
}
|
||||
|
||||
for (webui.root_module.link_objects.items) |lo| {
|
||||
switch (lo) {
|
||||
.c_source_file => |csf| {
|
||||
log(.debug, .WebUI, "{s} linker flags: {s}", .{
|
||||
csf.file.src_path.sub_path,
|
||||
csf.flags,
|
||||
});
|
||||
},
|
||||
else => {},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn build_examples(b: *Build, webui: *Compile) !void {
|
||||
const build_examples_step = b.step("examples", "builds the library and its examples");
|
||||
const target = webui.root_module.resolved_target.?;
|
||||
const optimize = webui.root_module.optimize.?;
|
||||
|
||||
const examples_path = b.path("examples/C").getPath(b);
|
||||
var examples_dir = std.fs.cwd().openDir(
|
||||
examples_path,
|
||||
.{ .iterate = true },
|
||||
) catch |e| switch (e) {
|
||||
// Do not attempt building examples if directory does not exist.
|
||||
error.FileNotFound => return,
|
||||
else => return e,
|
||||
};
|
||||
defer examples_dir.close();
|
||||
|
||||
var paths = examples_dir.iterate();
|
||||
while (try paths.next()) |val| {
|
||||
if (val.kind != .directory) {
|
||||
continue;
|
||||
}
|
||||
const example_name = val.name;
|
||||
|
||||
const exe = b.addExecutable(.{
|
||||
.name = example_name,
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
});
|
||||
const path = try std.fmt.allocPrint(b.allocator, "examples/C/{s}/main.c", .{example_name});
|
||||
defer b.allocator.free(path);
|
||||
|
||||
exe.addCSourceFile(.{ .file = b.path(path), .flags = &.{} });
|
||||
exe.linkLibrary(webui);
|
||||
|
||||
const exe_install = b.addInstallArtifact(exe, .{});
|
||||
const exe_run = b.addRunArtifact(exe);
|
||||
const step_name = try std.fmt.allocPrint(b.allocator, "run_{s}", .{example_name});
|
||||
defer b.allocator.free(step_name);
|
||||
const step_desc = try std.fmt.allocPrint(b.allocator, "run example {s}", .{example_name});
|
||||
defer b.allocator.free(step_desc);
|
||||
|
||||
const cwd = try std.fmt.allocPrint(b.allocator, "src/examples/{s}", .{example_name});
|
||||
defer b.allocator.free(cwd);
|
||||
exe_run.setCwd(b.path(cwd));
|
||||
|
||||
exe_run.step.dependOn(&exe_install.step);
|
||||
build_examples_step.dependOn(&exe_install.step);
|
||||
b.step(step_name, step_desc).dependOn(&exe_run.step);
|
||||
}
|
||||
}
|
||||
|
||||
/// Function to runtime-scope log levels based on build flag, for all scopes.
|
||||
fn log(
|
||||
comptime level: std.log.Level,
|
||||
comptime scope: @TypeOf(.EnumLiteral),
|
||||
comptime format: []const u8,
|
||||
args: anytype,
|
||||
) void {
|
||||
const should_print: bool = @intFromEnum(global_log_level) >= @intFromEnum(level);
|
||||
if (should_print) {
|
||||
switch (comptime level) {
|
||||
.err => std.log.scoped(scope).err(format, args),
|
||||
.warn => std.log.scoped(scope).warn(format, args),
|
||||
.info => std.log.scoped(scope).info(format, args),
|
||||
.debug => std.log.scoped(scope).debug(format, args),
|
||||
}
|
||||
}
|
||||
}
|
14
build.zig.zon
Normal file
14
build.zig.zon
Normal file
@ -0,0 +1,14 @@
|
||||
.{
|
||||
.name = .webui,
|
||||
.version = "2.5.0-beta.4",
|
||||
.fingerprint = 0xac5d87f2e5831aa7,
|
||||
.paths = .{
|
||||
"src",
|
||||
"include",
|
||||
"bridge",
|
||||
"build.zig",
|
||||
"build.zig.zon",
|
||||
"LICENSE",
|
||||
"README.md",
|
||||
},
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
# WebUI Library
|
||||
# Linux - Clang
|
||||
|
||||
SOURCE=../../../src
|
||||
INCLUDE=../../../include
|
||||
INCLUDE_CIVETWEB=../../../src/civetweb
|
||||
|
||||
all: release
|
||||
|
||||
debug:
|
||||
# Static with Debug info
|
||||
@echo "Build WebUI Library (Clang Debug Static)..."
|
||||
@clang -g -m64 -o civetweb.o -I "$(INCLUDE)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
@clang -g -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -DWEBUI_LOG
|
||||
@llvm-ar rc libwebui-2-static-x64.a webui.o civetweb.o
|
||||
@llvm-ranlib libwebui-2-static-x64.a
|
||||
# Dynamic with Debug info
|
||||
@echo "Build WebUI Library (Clang Debug Dynamic)..."
|
||||
@clang -g -fPIC -m64 -o civetweb.o -I "$(INCLUDE)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
@clang -g -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -DWEBUI_LOG
|
||||
@clang -g -shared -o webui-2-x64.so webui.o civetweb.o
|
||||
# Clean
|
||||
@- rm -f *.o
|
||||
@echo "Done."
|
||||
|
||||
release:
|
||||
# Static Release
|
||||
@echo "Build WebUI Library (Clang Release Static)..."
|
||||
@clang -Os -m64 -o civetweb.o -I "$(INCLUDE)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
@clang -Os -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c"
|
||||
@llvm-ar rc libwebui-2-static-x64.a webui.o civetweb.o
|
||||
@llvm-ranlib libwebui-2-static-x64.a
|
||||
# Dynamic Release
|
||||
@echo "Build WebUI Library (Clang Release Dynamic)..."
|
||||
@clang -O3 -fPIC -m64 -o civetweb.o -I "$(INCLUDE)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
@clang -O3 -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c"
|
||||
@clang -shared -o webui-2-x64.so webui.o civetweb.o
|
||||
# Clean
|
||||
@- rm -f *.o
|
||||
@echo "Done."
|
||||
|
||||
clean:
|
||||
- rm -f *.o
|
||||
- rm -f *.so
|
||||
- rm -f *.a
|
Binary file not shown.
Binary file not shown.
@ -1,45 +0,0 @@
|
||||
# WebUI Library
|
||||
# Linux - GCC
|
||||
|
||||
SOURCE=../../../src
|
||||
INCLUDE=../../../include
|
||||
INCLUDE_CIVETWEB=../../../src/civetweb
|
||||
|
||||
all: release
|
||||
|
||||
debug:
|
||||
# Static with Debug info
|
||||
@echo "Build WebUI Library (GCC Debug Static)..."
|
||||
@gcc -g -m64 -o civetweb.o -I "$(INCLUDE)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
@gcc -g -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -DWEBUI_LOG
|
||||
@ar rc libwebui-2-static-x64.a webui.o civetweb.o
|
||||
@ranlib libwebui-2-static-x64.a
|
||||
# Dynamic with Debug info
|
||||
@echo "Build WebUI Library (GCC Debug Dynamic)..."
|
||||
@gcc -g -fPIC -m64 -o civetweb.o -I "$(INCLUDE)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
@gcc -g -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -DWEBUI_LOG
|
||||
@gcc -g -shared -o webui-2-x64.so webui.o civetweb.o
|
||||
# Clean
|
||||
@- rm -f *.o
|
||||
@echo "Done."
|
||||
|
||||
release:
|
||||
# Static Release
|
||||
@echo "Build WebUI Library (GCC Release Static)..."
|
||||
@gcc -Os -m64 -o civetweb.o -I "$(INCLUDE)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
@gcc -Os -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c"
|
||||
@ar rc libwebui-2-static-x64.a webui.o civetweb.o
|
||||
@ranlib libwebui-2-static-x64.a
|
||||
# Dynamic Release
|
||||
@echo "Build WebUI Library (GCC Release Dynamic)..."
|
||||
@gcc -O3 -fPIC -m64 -o civetweb.o -I "$(INCLUDE)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
@gcc -O3 -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c"
|
||||
@gcc -shared -o webui-2-x64.so webui.o civetweb.o
|
||||
# Clean
|
||||
@- rm -f *.o
|
||||
@echo "Done."
|
||||
|
||||
clean:
|
||||
- rm -f *.o
|
||||
- rm -f *.so
|
||||
- rm -f *.a
|
Binary file not shown.
Binary file not shown.
@ -1,15 +0,0 @@
|
||||
# Build WebUI Library - Linux
|
||||
|
||||
- **GCC**
|
||||
```sh
|
||||
git clone https://github.com/alifcommunity/webui.git
|
||||
cd webui\build\Linux\GCC
|
||||
make
|
||||
```
|
||||
|
||||
- **Clang**
|
||||
```sh
|
||||
git clone https://github.com/alifcommunity/webui.git
|
||||
cd webui\build\Linux\Clang
|
||||
make
|
||||
```
|
@ -1,27 +0,0 @@
|
||||
# Build WebUI Library
|
||||
|
||||
To build the WebUI you will need a `C99` compiler. No dependencies is needed.
|
||||
|
||||
### Manually build
|
||||
|
||||
[Windows](https://github.com/alifcommunity/webui/tree/main/build/Windows)
|
||||
|
||||
[Linux](https://github.com/alifcommunity/webui/tree/main/build/Linux)
|
||||
|
||||
[macOS](https://github.com/alifcommunity/webui/tree/main/build/macOS)
|
||||
|
||||
### Build WebUI in debug mode & Copy libs into examples folder
|
||||
|
||||
Windows: `windows_build debug`
|
||||
|
||||
Linux: `sh linux_build.sh debug`
|
||||
|
||||
macOS: `sh macos_build.sh debug`
|
||||
|
||||
### Build WebUI in release mode
|
||||
|
||||
Windows: `windows_build`
|
||||
|
||||
Linux: `sh linux_build.sh`
|
||||
|
||||
macOS: `sh macos_build.sh`
|
@ -1,47 +0,0 @@
|
||||
# WebUI Library
|
||||
# Windows - GNU Compiler Collection
|
||||
|
||||
SHELL=CMD
|
||||
SOURCE=../../../src
|
||||
INCLUDE=../../../include
|
||||
INCLUDE_CIVETWEB=../../../src/civetweb
|
||||
|
||||
all: release
|
||||
|
||||
debug:
|
||||
# Static with Debug info
|
||||
@echo Build WebUI Library (GCC Debug Static)...
|
||||
@gcc -g -m64 -o civetweb.o -I "$(INCLUDE_CIVETWEB)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET -DMUST_IMPLEMENT_CLOCK_GETTIME
|
||||
@gcc -g -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -DWEBUI_LOG
|
||||
@ar rc libwebui-2-static-x64.a webui.o civetweb.o
|
||||
@ranlib libwebui-2-static-x64.a
|
||||
# Dynamic with Debug info
|
||||
@echo Build WebUI Library (GCC Debug Dynamic)...
|
||||
@gcc -g -fPIC -m64 -o civetweb.o -I "$(INCLUDE_CIVETWEB)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET -DMUST_IMPLEMENT_CLOCK_GETTIME
|
||||
@gcc -g -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -DWEBUI_LOG
|
||||
@gcc -g -shared -o webui-2-x64.dll webui.o civetweb.o -lws2_32
|
||||
# Clean
|
||||
@- del *.o >nul 2>&1
|
||||
@echo Done.
|
||||
|
||||
release:
|
||||
# Static Release
|
||||
@echo Build WebUI Library (GCC Release Static)...
|
||||
@gcc -Os -m64 -o civetweb.o -I "$(INCLUDE_CIVETWEB)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET -DMUST_IMPLEMENT_CLOCK_GETTIME
|
||||
@gcc -Os -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c"
|
||||
@ar rc libwebui-2-static-x64.a webui.o civetweb.o
|
||||
@ranlib libwebui-2-static-x64.a
|
||||
# Dynamic Release
|
||||
@echo Build WebUI Library (GCC Release Dynamic)...
|
||||
@gcc -Os -fPIC -m64 -o civetweb.o -I "$(INCLUDE_CIVETWEB)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET -DMUST_IMPLEMENT_CLOCK_GETTIME
|
||||
@gcc -O3 -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c"
|
||||
@gcc -shared -o webui-2-x64.dll webui.o civetweb.o -lws2_32
|
||||
@strip --strip-unneeded webui-2-x64.dll
|
||||
# Clean
|
||||
@- del *.o >nul 2>&1
|
||||
@echo Done.
|
||||
|
||||
clean:
|
||||
- del *.o >nul 2>&1
|
||||
- del *.dll >nul 2>&1
|
||||
- del *.a >nul 2>&1
|
Binary file not shown.
Binary file not shown.
@ -1,45 +0,0 @@
|
||||
# WebUI Library
|
||||
# Windows - Microsoft Visual C
|
||||
|
||||
all: release
|
||||
|
||||
debug:
|
||||
# Static with Debug info
|
||||
@echo Build WebUI Library (MSVC Debug Static)...
|
||||
@cl /Zl /Zi /Focivetweb.obj /c /EHsc "../../../src/civetweb/civetweb.c" /I "../../../src/civetweb/" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET 1>NUL 2>&1
|
||||
@cl /Zl /Zi /Fowebui.obj /c /EHsc /DWEBUI_LOG "../../../src/webui.c" /I "../../../include" 1>NUL 2>&1
|
||||
@lib /OUT:webui-2-static-x64.lib webui.obj civetweb.obj 1>NUL 2>&1
|
||||
# Dynamic with Debug info
|
||||
@echo Build WebUI Library (MSVC Debug Dynamic)...
|
||||
@cl /Zi /Focivetweb.obj /c /EHsc "../../../src/civetweb/civetweb.c" /I "../../../src/civetweb/" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET 1>NUL 2>&1
|
||||
@cl /Zi /Fowebui.obj /c /EHsc /DWEBUI_LOG "../../../src/webui.c" /I "../../../include" 1>NUL 2>&1
|
||||
@link /DLL /OUT:webui-2-x64.dll webui.obj civetweb.obj user32.lib Advapi32.lib 1>NUL 2>&1
|
||||
# Clean
|
||||
@- del *.obj >nul 2>&1
|
||||
@echo Done.
|
||||
|
||||
release:
|
||||
# Static Release
|
||||
@echo Build WebUI Library (MSVC Release Static)...
|
||||
@cl /Zl /Focivetweb.obj /c /EHsc "../../../src/civetweb/civetweb.c" /I "../../../src/civetweb/" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET 1>NUL 2>&1
|
||||
@cl /Zl /Fowebui.obj /c /EHsc "../../../src/webui.c" /I "../../../include" 1>NUL 2>&1
|
||||
@lib /OUT:webui-2-static-x64.lib webui.obj civetweb.obj 1>NUL 2>&1
|
||||
# Dynamic Release
|
||||
@echo Build WebUI Library (MSVC Release Dynamic)...
|
||||
@cl /Focivetweb.obj /c /EHsc "../../../src/civetweb/civetweb.c" /I "../../../src/civetweb/" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET 1>NUL 2>&1
|
||||
@cl /Fowebui.obj /c /EHsc "../../../src/webui.c" /I "../../../include" 1>NUL 2>&1
|
||||
@link /DLL /OUT:webui-2-x64.dll webui.obj civetweb.obj user32.lib Advapi32.lib 1>NUL 2>&1
|
||||
# Clean
|
||||
@- del *.obj >nul 2>&1
|
||||
@- del *.ilk >nul 2>&1
|
||||
@- del *.pdb >nul 2>&1
|
||||
@- del *.exp >nul 2>&1
|
||||
@echo Done.
|
||||
|
||||
clean:
|
||||
- del *.obj >nul 2>&1
|
||||
- del *.dll >nul 2>&1
|
||||
- del *.ilk >nul 2>&1
|
||||
- del *.pdb >nul 2>&1
|
||||
- del *.lib >nul 2>&1
|
||||
- del *.exp >nul 2>&1
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,23 +0,0 @@
|
||||
# Build WebUI Library - Windows
|
||||
|
||||
- **Microsoft Visual Studio Build Tools**
|
||||
|
||||
```sh
|
||||
git clone https://github.com/alifcommunity/webui.git
|
||||
cd webui\build\Windows\MSVC
|
||||
nmake
|
||||
```
|
||||
|
||||
- **MinGW**
|
||||
```sh
|
||||
git clone https://github.com/alifcommunity/webui.git
|
||||
cd webui\build\Windows\GCC
|
||||
mingw32-make
|
||||
```
|
||||
|
||||
- **TCC**
|
||||
```sh
|
||||
git clone https://github.com/alifcommunity/webui.git
|
||||
cd webui\build\Windows\TCC
|
||||
mingw32-make
|
||||
```
|
@ -1,45 +0,0 @@
|
||||
# WebUI Library
|
||||
# Windows - Tiny C Compiler
|
||||
|
||||
SHELL=CMD
|
||||
SOURCE=../../../src
|
||||
INCLUDE=../../../include
|
||||
INCLUDE_CIVETWEB=../../../src/civetweb
|
||||
|
||||
all: release
|
||||
|
||||
debug:
|
||||
# Static with Debug info
|
||||
@echo Build WebUI Library (TCC Debug Static)...
|
||||
@tcc -g -m64 -o civetweb.o -I "$(INCLUDE_CIVETWEB)" -c "$(SOURCE)/civetweb/civetweb.c" -w -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
@tcc -g -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -DWEBUI_LOG -w
|
||||
@tcc -m64 -ar rcs libwebui-2-static-x64.a webui.o civetweb.o
|
||||
# Dynamic with Debug info
|
||||
# @echo Build WebUI Library (TCC Debug Dynamic)...
|
||||
# @tcc -g -fPIC -m64 -o civetweb.o -I "$(INCLUDE_CIVETWEB)" -c "$(SOURCE)/civetweb/civetweb.c" -w -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
# @tcc -g -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -DWEBUI_LOG -w
|
||||
# @tcc -g -shared -o webui-2-x64.dll webui.o civetweb.o -lws2_32 -lAdvapi32
|
||||
# Clean
|
||||
@- del *.o >nul 2>&1
|
||||
@echo Done.
|
||||
|
||||
release:
|
||||
# Static Release
|
||||
@echo Build WebUI Library (TCC Release Static)...
|
||||
@tcc -m64 -o civetweb.o -I "$(INCLUDE_CIVETWEB)" -c "$(SOURCE)/civetweb/civetweb.c" -w -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
@tcc -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -w
|
||||
@tcc -m64 -ar rcs libwebui-2-static-x64.a webui.o civetweb.o
|
||||
# Dynamic Release
|
||||
# @echo Build WebUI Library (TCC Release Dynamic)...
|
||||
# @tcc -fPIC -m64 -o civetweb.o -I "$(INCLUDE_CIVETWEB)" -c "$(SOURCE)/civetweb/civetweb.c" -w -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
# @tcc -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -w
|
||||
# @tcc -shared -o webui-2-x64.dll webui.o civetweb.o -lws2_32 -lAdvapi32
|
||||
# Clean
|
||||
@- del *.o >nul 2>&1
|
||||
@echo Done.
|
||||
|
||||
clean:
|
||||
- del *.o >nul 2>&1
|
||||
- del *.dll >nul 2>&1
|
||||
- del *.a >nul 2>&1
|
||||
- del *.def >nul 2>&1
|
Binary file not shown.
@ -1,85 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
WEBUI_VERSION=2.3.0
|
||||
|
||||
ARG1=$1
|
||||
if [ "$ARG1" = "debug" ]; then
|
||||
CLANG_CMD="make debug"
|
||||
GCC_CMD="make debug"
|
||||
else
|
||||
CLANG_CMD="make"
|
||||
GCC_CMD="make"
|
||||
fi
|
||||
|
||||
echo "";
|
||||
echo "WebUI v$WEBUI_VERSION Build Script"
|
||||
echo "Platform: Linux x64"
|
||||
echo "Compiler: GCC and Clang"
|
||||
|
||||
RootPath="$PWD/../"
|
||||
cd "$RootPath"
|
||||
|
||||
echo "";
|
||||
echo "Building WebUI using GCC...";
|
||||
echo "";
|
||||
|
||||
# Build WebUI Library using GCC
|
||||
cd "$RootPath"
|
||||
cd "build/Linux/GCC"
|
||||
$GCC_CMD
|
||||
|
||||
echo "";
|
||||
echo "Building WebUI using Clang...";
|
||||
echo "";
|
||||
|
||||
# Build WebUI Library using Clang
|
||||
cd "$RootPath"
|
||||
cd "build/Linux/Clang"
|
||||
$CLANG_CMD
|
||||
|
||||
echo "";
|
||||
echo "Copying WebUI libs to the examples folder..."
|
||||
echo "";
|
||||
|
||||
cd "$RootPath"
|
||||
|
||||
# C - Text Editor
|
||||
cp -f "include/webui.h" "examples/C/text-editor/webui.h"
|
||||
cp -f "build/Linux/GCC/webui-2-x64.so" "examples/C/text-editor/webui-2-x64.so"
|
||||
|
||||
echo "";
|
||||
if [ "$ARG1" = "" ]; then
|
||||
|
||||
echo "Copying WebUI libs to the release folder..."
|
||||
echo "";
|
||||
|
||||
# Release Linux Include
|
||||
cp -f "include/webui.h" "Release/Linux/include/webui.h"
|
||||
cp -f "include/webui.hpp" "Release/Linux/include/webui.hpp"
|
||||
|
||||
# Release Linux GCC
|
||||
cp -f "build/Linux/GCC/webui-2-x64.so" "Release/Linux/GCC/webui-2-x64.so"
|
||||
cp -f "build/Linux/GCC/libwebui-2-static-x64.a" "Release/Linux/GCC/libwebui-2-static-x64.a"
|
||||
|
||||
# Release Linux Clang
|
||||
cp -f "build/Linux/Clang/webui-2-x64.so" "Release/Linux/Clang/webui-2-x64.so"
|
||||
cp -f "build/Linux/Clang/libwebui-2-static-x64.a" "Release/Linux/Clang/libwebui-2-static-x64.a"
|
||||
|
||||
echo "";
|
||||
echo "Compressing the release folder..."
|
||||
echo "";
|
||||
|
||||
TAR_OUT="webui-linux-x64-v$WEBUI_VERSION.zip"
|
||||
cd "Release"
|
||||
sleep 2
|
||||
tar -c -f $TAR_OUT Linux/*
|
||||
cd "$RootPath"
|
||||
|
||||
echo "";
|
||||
echo "Cleaning..."
|
||||
echo "";
|
||||
|
||||
find ./ -type f -name "*.o" -exec rm -f {} \;
|
||||
fi
|
||||
|
||||
cd "build"
|
@ -1,45 +0,0 @@
|
||||
# WebUI Library
|
||||
# macOS - Clang
|
||||
|
||||
SOURCE=../../../src
|
||||
INCLUDE=../../../include
|
||||
INCLUDE_CIVETWEB=../../../src/civetweb
|
||||
|
||||
all: release
|
||||
|
||||
debug:
|
||||
# Static with Debug info
|
||||
@echo "Build WebUI Library (Clang Debug Static)..."
|
||||
@clang -g -m64 -o civetweb.o -I "$(INCLUDE)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
@clang -DWEBUI_LOG -g -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -DWEBUI_LOG
|
||||
@ar rc libwebui-2-static-x64.a webui.o civetweb.o
|
||||
@ranlib libwebui-2-static-x64.a
|
||||
# Dynamic with Debug info
|
||||
@echo "Build WebUI Library (Clang Debug Dynamic)..."
|
||||
@clang -g -fPIC -m64 -o civetweb.o -I "$(INCLUDE)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
@clang -DWEBUI_LOG -g -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c" -DWEBUI_LOG
|
||||
@clang -g -shared -o webui-2-x64.dyn webui.o civetweb.o
|
||||
#Clean
|
||||
@- rm -f *.o
|
||||
@echo "Done."
|
||||
|
||||
release:
|
||||
# Static Release
|
||||
@echo "Build WebUI Library (Clang Release Static)..."
|
||||
@clang -Os -m64 -o civetweb.o -I "$(INCLUDE)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
@clang -Os -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c"
|
||||
@ar rc libwebui-2-static-x64.a webui.o civetweb.o
|
||||
@ranlib libwebui-2-static-x64.a
|
||||
# Dynamic Release
|
||||
@echo "Build WebUI Library (Clang Release Dynamic)..."
|
||||
@clang -O3 -fPIC -m64 -o civetweb.o -I "$(INCLUDE)" -c "$(SOURCE)/civetweb/civetweb.c" -DNDEBUG -DNO_CACHING -DNO_CGI -DNO_SSL -DUSE_WEBSOCKET
|
||||
@clang -O3 -fPIC -m64 -o webui.o -I "$(INCLUDE)" -c "$(SOURCE)/webui.c"
|
||||
@clang -shared -o webui-2-x64.dyn webui.o civetweb.o
|
||||
# Clean
|
||||
@- rm -f *.o
|
||||
@echo "Done."
|
||||
|
||||
clean:
|
||||
- rm -f *.o
|
||||
- rm -f *.dylib
|
||||
- rm -f *.a
|
Binary file not shown.
Binary file not shown.
@ -1,9 +0,0 @@
|
||||
# Build WebUI Library - macOS
|
||||
|
||||
- **Clang**
|
||||
|
||||
```sh
|
||||
git clone https://github.com/alifcommunity/webui.git
|
||||
cd webui\build\macOS\Clang
|
||||
make
|
||||
```
|
@ -1,72 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
WEBUI_VERSION=2.3.0
|
||||
|
||||
ARG1=$1
|
||||
if [ "$ARG1" = "debug" ]; then
|
||||
CLANG_CMD="make debug"
|
||||
GCC_CMD="make debug"
|
||||
else
|
||||
CLANG_CMD="make"
|
||||
GCC_CMD="make"
|
||||
fi
|
||||
|
||||
echo "";
|
||||
echo "WebUI v$WEBUI_VERSION Build Script"
|
||||
echo "Platform: macOS x64"
|
||||
echo "Compiler: Clang"
|
||||
|
||||
RootPath="$PWD/../"
|
||||
cd "$RootPath"
|
||||
|
||||
echo "";
|
||||
echo "Building WebUI using Clang...";
|
||||
echo "";
|
||||
|
||||
# Build WebUI Library using Clang
|
||||
cd "$RootPath"
|
||||
cd "build/macOS/Clang"
|
||||
$CLANG_CMD
|
||||
|
||||
echo "";
|
||||
echo "Copying WebUI libs to the examples folder..."
|
||||
echo "";
|
||||
|
||||
cd "$RootPath"
|
||||
|
||||
# C - Text Editor
|
||||
cp -f "include/webui.h" "examples/C/text-editor/webui.h"
|
||||
cp -f "build/macOS/Clang/webui-2-x64.dyn" "examples/C/text-editor/webui-2-x64.dyn"
|
||||
|
||||
echo "";
|
||||
if [ "$ARG1" = "" ]; then
|
||||
|
||||
echo "Copying WebUI libs to the release folder..."
|
||||
echo "";
|
||||
|
||||
# Release macOS Include
|
||||
cp -f "include/webui.h" "Release/macOS/include/webui.h"
|
||||
cp -f "include/webui.hpp" "Release/macOS/include/webui.hpp"
|
||||
|
||||
# Release macOS Clang
|
||||
cp -f "build/macOS/Clang/webui-2-x64.dyn" "Release/macOS/Clang/webui-2-x64.dyn"
|
||||
cp -f "build/macOS/Clang/libwebui-2-static-x64.a" "Release/macOS/Clang/libwebui-2-static-x64.a"
|
||||
|
||||
echo "";
|
||||
echo "Compressing the release folder..."
|
||||
echo "";
|
||||
|
||||
TAR_OUT="webui-macos-x64-v$WEBUI_VERSION.zip"
|
||||
cd "Release"
|
||||
sleep 2
|
||||
tar -c -f $TAR_OUT macOS/*
|
||||
cd "$RootPath"
|
||||
|
||||
echo "";
|
||||
echo "Cleaning..."
|
||||
echo "";
|
||||
|
||||
find ./ -type f -name "*.o" -exec rm -f {} \;
|
||||
fi
|
||||
|
||||
cd "build"
|
@ -1,115 +0,0 @@
|
||||
@echo off
|
||||
|
||||
set WEBUI_VERSION=2.3.0
|
||||
|
||||
set ARG1=%1
|
||||
IF "%ARG1%"=="debug" (
|
||||
set MSVC_CMD=nmake debug
|
||||
set GCC_CMD=mingw32-make debug
|
||||
) else (
|
||||
set MSVC_CMD=nmake
|
||||
set GCC_CMD=mingw32-make
|
||||
)
|
||||
|
||||
echo.
|
||||
echo WebUI v%WEBUI_VERSION% Build Script
|
||||
echo Platform: Microsoft Windows x64
|
||||
echo Compiler: MSVC, GCC and TCC
|
||||
|
||||
Set RootPath=%CD%\..\
|
||||
cd "%RootPath%"
|
||||
|
||||
echo.
|
||||
echo Building WebUI using MSVC...
|
||||
|
||||
REM Build WebUI Library using MSVC
|
||||
cd "%RootPath%"
|
||||
cd "build\Windows\MSVC"
|
||||
%MSVC_CMD%
|
||||
|
||||
echo.
|
||||
echo Building WebUI using GCC...
|
||||
echo.
|
||||
|
||||
REM Build WebUI Library using GCC
|
||||
cd "%RootPath%"
|
||||
cd "build\Windows\GCC"
|
||||
%GCC_CMD%
|
||||
|
||||
echo.
|
||||
echo Building WebUI using TCC...
|
||||
echo.
|
||||
|
||||
REM Build WebUI Library using TCC
|
||||
cd "%RootPath%"
|
||||
cd "build\Windows\TCC"
|
||||
%GCC_CMD%
|
||||
|
||||
echo.
|
||||
echo Copying WebUI libs to the examples folder...
|
||||
echo.
|
||||
|
||||
cd "%RootPath%"
|
||||
|
||||
REM C++ (Visual Studio 2022)
|
||||
copy /Y "include\webui.h" "examples\C++\VS2022\serve_a_folder\my_webui_app\webui.h"
|
||||
copy /Y "include\webui.hpp" "examples\C++\VS2022\serve_a_folder\my_webui_app\webui.hpp"
|
||||
copy /Y "build\Windows\MSVC\webui-2-static-x64.lib" "examples\C++\VS2022\serve_a_folder\my_webui_app\webui-2-static-x64.lib"
|
||||
|
||||
REM C++ (Visual Studio 2019)
|
||||
copy /Y "include\webui.h" "examples\C++\VS2019\serve_a_folder\my_webui_app\webui.h"
|
||||
copy /Y "include\webui.hpp" "examples\C++\VS2019\serve_a_folder\my_webui_app\webui.hpp"
|
||||
copy /Y "build\Windows\MSVC\webui-2-static-x64.lib" "examples\C++\VS2019\serve_a_folder\my_webui_app\webui-2-static-x64.lib"
|
||||
|
||||
REM C - Text Editor
|
||||
copy /Y "include\webui.h" "examples\C\text-editor\webui.h"
|
||||
copy /Y "build\Windows\MSVC\webui-2-x64.dll" "examples\C\text-editor\webui-2-x64.dll"
|
||||
|
||||
echo.
|
||||
IF "%ARG1%"=="" (
|
||||
|
||||
echo Copying WebUI libs to the release folder...
|
||||
echo.
|
||||
|
||||
REM Release Windows Include
|
||||
copy /Y "include\webui.h" "Release\Windows\include\webui.h"
|
||||
|
||||
REM Release Windows MSVC
|
||||
copy /Y "build\Windows\MSVC\webui-2-x64.dll" "Release\Windows\MSVC\webui-2-x64.dll"
|
||||
copy /Y "build\Windows\MSVC\webui-2-x64.lib" "Release\Windows\MSVC\webui-2-x64.lib"
|
||||
copy /Y "build\Windows\MSVC\webui-2-static-x64.lib" "Release\Windows\MSVC\webui-2-static-x64.lib"
|
||||
|
||||
REM Release Windows GCC
|
||||
copy /Y "build\Windows\GCC\webui-2-x64.dll" "Release\Windows\GCC\webui-2-x64.dll"
|
||||
copy /Y "build\Windows\GCC\libwebui-2-static-x64.a" "Release\Windows\GCC\libwebui-2-static-x64.a"
|
||||
|
||||
REM Release Windows TCC
|
||||
REM copy /Y "build\Windows\TCC\webui-2-x64.dll" "Release\Windows\TCC\webui-2-x64.dll"
|
||||
REM copy /Y "build\Windows\TCC\webui-2-x64.def" "Release\Windows\TCC\webui-2-x64.def"
|
||||
copy /Y "build\Windows\TCC\libwebui-2-static-x64.a" "Release\Windows\TCC\libwebui-2-static-x64.a"
|
||||
|
||||
echo.
|
||||
echo Compressing the release folder...
|
||||
|
||||
set TAR_OUT=webui-windows-x64-v%WEBUI_VERSION%.zip
|
||||
cd "Release"
|
||||
timeout 2 > NUL
|
||||
tar.exe -c -f %TAR_OUT% Windows\*
|
||||
cd "%RootPath%"
|
||||
|
||||
echo.
|
||||
echo Cleaning...
|
||||
|
||||
DEL /Q /F /S "*.exe" >nul 2>&1
|
||||
DEL /Q /F /S "*.o" >nul 2>&1
|
||||
DEL /Q /F /S "*.exp" >nul 2>&1
|
||||
DEL /Q /F /S "*.pdb" >nul 2>&1
|
||||
DEL /Q /F /S "*.ilk" >nul 2>&1
|
||||
DEL /Q /F /S "*.obj" >nul 2>&1
|
||||
DEL /Q /F /S "*.iobj" >nul 2>&1
|
||||
DEL /Q /F /S "*.res" >nul 2>&1
|
||||
DEL /Q /F /S "*.bak" >nul 2>&1
|
||||
DEL /Q /F /S "*.DS_Store" >nul 2>&1
|
||||
)
|
||||
|
||||
cd "build"
|
BIN
cppcon_2019.png
BIN
cppcon_2019.png
Binary file not shown.
Before Width: | Height: | Size: 188 KiB |
37
examples/C++/README.md
Normal file
37
examples/C++/README.md
Normal file
@ -0,0 +1,37 @@
|
||||
# WebUI C++ Examples
|
||||
|
||||
Examples of how to create a WebUI application in C++.
|
||||
|
||||
The only requirement to build the examples is a a C++11 compiler.
|
||||
|
||||
- `minimal`: Creates a minimal WebUI application.
|
||||
- `call_c_from_js`: Calls C++ from JavaScript.
|
||||
- `call_js_from_c`: Calls JavaScript from C++.
|
||||
- `serve_a_folder`: Uses WebUI to serve a folder that contains multiple files.
|
||||
|
||||
To build an example, cd into its directory and run the make command.
|
||||
|
||||
- **Windows**
|
||||
|
||||
```sh
|
||||
# G++
|
||||
mingw32-make
|
||||
|
||||
# MSVC
|
||||
nmake
|
||||
```
|
||||
|
||||
- **Linux**
|
||||
|
||||
```sh
|
||||
# G++
|
||||
make
|
||||
|
||||
# Clang
|
||||
make CXX=clang
|
||||
```
|
||||
|
||||
- **macOS**
|
||||
```sh
|
||||
make
|
||||
```
|
@ -1,25 +0,0 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.33027.164
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "my_webui_app", "my_webui_app\my_webui_app.vcxproj", "{CC54CE9B-9584-4C08-8AB1-C08549E404FE}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x64 = Debug|x64
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{CC54CE9B-9584-4C08-8AB1-C08549E404FE}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{CC54CE9B-9584-4C08-8AB1-C08549E404FE}.Debug|x64.Build.0 = Debug|x64
|
||||
{CC54CE9B-9584-4C08-8AB1-C08549E404FE}.Release|x64.ActiveCfg = Release|x64
|
||||
{CC54CE9B-9584-4C08-8AB1-C08549E404FE}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {B59013B5-9B18-4E50-992A-5ABD6F569433}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
@ -1,39 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>WebUI - Serve a Folder Example (C++)</title>
|
||||
<style>
|
||||
body {
|
||||
color: white;
|
||||
background: #0F2027;
|
||||
background: -webkit-linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
background: linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h3 id="title">Serve a Folder Example (C++)</h3>
|
||||
<br>
|
||||
<p id="description">
|
||||
You can edit this HTML file as you need.<br>
|
||||
Also, you can config WebUI to use Deno or Nodejs runtime for your JS/TS files.<br>
|
||||
<br>
|
||||
Please click on the link to switch to the second page<br>
|
||||
Or click on the button to switch to the second page programmatically.
|
||||
</p>
|
||||
<br>
|
||||
<h4><a href="second.html">Second Page As A Simple Link</a></h4>
|
||||
<br>
|
||||
<button id="SwitchToSecondPage">Switch to The Second Page Programmatically</button>
|
||||
<br>
|
||||
<br>
|
||||
<button id="OpenNewWindow">Open The Second Window</button>
|
||||
</body>
|
||||
|
||||
<!-- Connect this window to the background app -->
|
||||
<script src="/webui.js"></script>
|
||||
|
||||
</html>
|
@ -1,103 +0,0 @@
|
||||
// Include the WebUI header
|
||||
#include "webui.hpp"
|
||||
|
||||
// Include C++ STD
|
||||
#include <iostream>
|
||||
|
||||
// Making this object global so show_second_window() can access it.
|
||||
webui::window my_second_window;
|
||||
|
||||
// Example of a simple Class
|
||||
class MyClass {
|
||||
public:
|
||||
|
||||
// This method gets called every time the
|
||||
// user clicks on "OpenNewWindow"
|
||||
void show_second_window(webui::event* e) {
|
||||
|
||||
// Show a new window, and navigate to `/second.html`
|
||||
// if the window is already opened, then switch in the same window
|
||||
my_second_window.show("second.html");
|
||||
}
|
||||
|
||||
// This method gets called every time the
|
||||
// user clicks on "SwitchToSecondPage"
|
||||
void switch_to_second_page(webui::event* e) {
|
||||
|
||||
// Switch to `/second.html` in the same opened window.
|
||||
e->window.show("second.html");
|
||||
}
|
||||
|
||||
// Example of a simple function (Not a method)
|
||||
// This function receives all events because
|
||||
// it's get bind with an empty HTML ID.
|
||||
void events(webui::event* e) {
|
||||
|
||||
if (e->event_type == webui::CONNECTED)
|
||||
std::cout << "Window Connected." << std::endl;
|
||||
else if (e->event_type == webui::DISCONNECTED)
|
||||
std::cout << "Window Disconnected." << std::endl;
|
||||
else if (e->event_type == webui::MOUSE_CLICK)
|
||||
std::cout << "Click on element: " << e->element << std::endl;
|
||||
else if (e->event_type == webui::NAVIGATION)
|
||||
std::cout << "Starting navigation to: " << e->data << std::endl;
|
||||
}
|
||||
|
||||
// Example of a simple function (Not a method)
|
||||
void exit_app(webui::event* e) {
|
||||
|
||||
// Close all opened windows
|
||||
webui::exit();
|
||||
}
|
||||
};
|
||||
|
||||
// Wrapper:
|
||||
// Because WebUI is written in C, so it can not
|
||||
// access `MyClass` directly. That's why we should
|
||||
// create a simple C++ wrapper.
|
||||
MyClass obj;
|
||||
void show_second_window_wrp(webui::event* e) { obj.show_second_window(e); }
|
||||
void switch_to_second_page_wrp(webui::event* e) { obj.switch_to_second_page(e); }
|
||||
void events_wrp(webui::event* e) { obj.events(e); }
|
||||
void exit_app_wrp(webui::event* e) { obj.exit_app(e); }
|
||||
|
||||
int main() {
|
||||
|
||||
// Print logs (debug build only)
|
||||
std::cout << "Starting..." << std::endl;
|
||||
|
||||
// Create a new window
|
||||
webui::window my_window;
|
||||
|
||||
// Bind HTML element IDs with a C functions
|
||||
my_window.bind("SwitchToSecondPage", switch_to_second_page_wrp);
|
||||
my_window.bind("OpenNewWindow", show_second_window_wrp);
|
||||
my_window.bind("Exit", exit_app_wrp);
|
||||
my_second_window.bind("Exit", exit_app_wrp);
|
||||
|
||||
// Bind all events
|
||||
my_window.bind("", events_wrp);
|
||||
|
||||
// Show a new window
|
||||
my_window.show("index.html"); // my_window.show_browser("index.html", Chrome);
|
||||
|
||||
// Wait until all windows get closed
|
||||
webui::wait();
|
||||
|
||||
// Print logs (debug build only)
|
||||
std::cout << "Thank you." << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
// Release build
|
||||
int WINAPI wWinMain(
|
||||
_In_ HINSTANCE hInstance,
|
||||
_In_opt_ HINSTANCE hPrevInstance,
|
||||
_In_ LPWSTR lpCmdLine,
|
||||
_In_ int nShowCmd
|
||||
) {
|
||||
return main();
|
||||
}
|
||||
#endif
|
@ -1,154 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>16.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{cc54ce9b-9584-4c08-8ab1-c08549e404fe}</ProjectGuid>
|
||||
<RootNamespace>mywebuiapp</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>webui-2-static-x64.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||
<AdditionalDependencies>webui-2-static-x64.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="my_webui_app.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="webui.h" />
|
||||
<ClInclude Include="webui.hpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
@ -1,30 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="my_webui_app.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="webui.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="webui.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -1,25 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>WebUI - Second Page (C++)</title>
|
||||
<style>
|
||||
body {
|
||||
color: white;
|
||||
background: #0F2027;
|
||||
background: -webkit-linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
background: linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h3 id="title">This is the second page !</h3>
|
||||
<br>
|
||||
<button id="Exit">Call Exit()</button>
|
||||
</body>
|
||||
|
||||
<!-- Connect this window to the background app -->
|
||||
<script src="/webui.js"></script>
|
||||
</html>
|
Binary file not shown.
@ -1,215 +0,0 @@
|
||||
/*
|
||||
WebUI Library 2.3.0
|
||||
http://webui.me
|
||||
https://github.com/webui-dev/webui
|
||||
Copyright (c) 2020-2023 Hassan Draga.
|
||||
Licensed under MIT License.
|
||||
All rights reserved.
|
||||
Canada.
|
||||
*/
|
||||
|
||||
#ifndef _WEBUI_H
|
||||
#define _WEBUI_H
|
||||
|
||||
#define WEBUI_VERSION "2.3.0"
|
||||
#define WEBUI_MAX_IDS (512)
|
||||
|
||||
// Dynamic Library Exports
|
||||
#if defined(_MSC_VER) || defined(__TINYC__)
|
||||
#ifndef WEBUI_EXPORT
|
||||
#define WEBUI_EXPORT __declspec(dllexport)
|
||||
#endif
|
||||
#else
|
||||
#ifndef WEBUI_EXPORT
|
||||
#define WEBUI_EXPORT extern
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// -- C STD ---------------------------
|
||||
#include <stdbool.h>
|
||||
#include <inttypes.h>
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stddef.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
#if defined(__GNUC__) || defined(__TINYC__)
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
|
||||
// -- Windows -------------------------
|
||||
#ifdef _WIN32
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#include <direct.h>
|
||||
#include <io.h>
|
||||
#include <tchar.h>
|
||||
#include <tlhelp32.h>
|
||||
#define WEBUI_GET_CURRENT_DIR _getcwd
|
||||
#define WEBUI_FILE_EXIST _access
|
||||
#define WEBUI_POPEN _popen
|
||||
#define WEBUI_PCLOSE _pclose
|
||||
#define WEBUI_MAX_PATH MAX_PATH
|
||||
#endif
|
||||
|
||||
// -- Linux ---------------------------
|
||||
#ifdef __linux__
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
#include <poll.h>
|
||||
#include <sys/time.h>
|
||||
#include <signal.h>
|
||||
#define WEBUI_GET_CURRENT_DIR getcwd
|
||||
#define WEBUI_FILE_EXIST access
|
||||
#define WEBUI_POPEN popen
|
||||
#define WEBUI_PCLOSE pclose
|
||||
#define WEBUI_MAX_PATH PATH_MAX
|
||||
#endif
|
||||
|
||||
// -- Apple ---------------------------
|
||||
#ifdef __APPLE__
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
#include <poll.h>
|
||||
#include <sys/syslimits.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <signal.h>
|
||||
#define WEBUI_GET_CURRENT_DIR getcwd
|
||||
#define WEBUI_FILE_EXIST access
|
||||
#define WEBUI_POPEN popen
|
||||
#define WEBUI_PCLOSE pclose
|
||||
#define WEBUI_MAX_PATH PATH_MAX
|
||||
#endif
|
||||
|
||||
// -- Enums ---------------------------
|
||||
enum webui_browsers {
|
||||
AnyBrowser = 0, // 0. Default recommended web browser
|
||||
Chrome, // 1. Google Chrome
|
||||
Firefox, // 2. Mozilla Firefox
|
||||
Edge, // 3. Microsoft Edge
|
||||
Safari, // 4. Apple Safari
|
||||
Chromium, // 5. The Chromium Project
|
||||
Opera, // 6. Opera Browser
|
||||
Brave, // 7. The Brave Browser
|
||||
Vivaldi, // 8. The Vivaldi Browser
|
||||
Epic, // 9. The Epic Browser
|
||||
Yandex, // 10. The Yandex Browser
|
||||
};
|
||||
|
||||
enum webui_runtimes {
|
||||
None = 0, // 0. Prevent WebUI from using any runtime for .js and .ts files
|
||||
Deno, // 1. Use Deno runtime for .js and .ts files
|
||||
NodeJS, // 2. Use Nodejs runtime for .js files
|
||||
};
|
||||
|
||||
enum webui_events {
|
||||
WEBUI_EVENT_DISCONNECTED = 0, // 0. Window disconnection event
|
||||
WEBUI_EVENT_CONNECTED, // 1. Window connection event
|
||||
WEBUI_EVENT_MULTI_CONNECTION, // 2. New window connection event
|
||||
WEBUI_EVENT_UNWANTED_CONNECTION, // 3. New unwanted window connection event
|
||||
WEBUI_EVENT_MOUSE_CLICK, // 4. Mouse click event
|
||||
WEBUI_EVENT_NAVIGATION, // 5. Window navigation event
|
||||
WEBUI_EVENT_CALLBACK, // 6. Function call event
|
||||
};
|
||||
|
||||
// -- Structs -------------------------
|
||||
typedef struct webui_event_t {
|
||||
size_t window; // The window object number
|
||||
size_t event_type; // Event type
|
||||
char* element; // HTML element ID
|
||||
char* data; // JavaScript data
|
||||
size_t event_number; // Internal WebUI
|
||||
} webui_event_t;
|
||||
|
||||
// -- Definitions ---------------------
|
||||
// Create a new webui window object.
|
||||
WEBUI_EXPORT size_t webui_new_window(void);
|
||||
// Create a new webui window object.
|
||||
WEBUI_EXPORT void webui_new_window_id(size_t window_number);
|
||||
// Get a free window ID that can be used with `webui_new_window_id()`
|
||||
WEBUI_EXPORT size_t webui_get_new_window_id(void);
|
||||
// Bind a specific html element click event with a function. Empty element means all events.
|
||||
WEBUI_EXPORT size_t webui_bind(size_t window, const char* element, void (*func)(webui_event_t* e));
|
||||
// Show a window using a embedded HTML, or a file. If the window is already opened then it will be refreshed.
|
||||
WEBUI_EXPORT bool webui_show(size_t window, const char* content);
|
||||
// Same as webui_show(). But with a specific web browser.
|
||||
WEBUI_EXPORT bool webui_show_browser(size_t window, const char* content, size_t browser);
|
||||
// Set the window in Kiosk mode (Full screen)
|
||||
WEBUI_EXPORT void webui_set_kiosk(size_t window, bool status);
|
||||
// Wait until all opened windows get closed.
|
||||
WEBUI_EXPORT void webui_wait(void);
|
||||
// Close a specific window only. The window object will still exist.
|
||||
WEBUI_EXPORT void webui_close(size_t window);
|
||||
// Close a specific window and free all memory resources.
|
||||
WEBUI_EXPORT void webui_destroy(size_t window);
|
||||
// Close all opened windows. webui_wait() will break.
|
||||
WEBUI_EXPORT void webui_exit(void);
|
||||
|
||||
// -- Other ---------------------------
|
||||
// Check a specific window if it's still running
|
||||
WEBUI_EXPORT bool webui_is_shown(size_t window);
|
||||
// Set the maximum time in seconds to wait for browser to start
|
||||
WEBUI_EXPORT void webui_set_timeout(size_t second);
|
||||
// Set the default embedded HTML favicon
|
||||
WEBUI_EXPORT void webui_set_icon(size_t window, const char* icon, const char* icon_type);
|
||||
// Allow the window URL to be re-used in normal web browsers
|
||||
WEBUI_EXPORT void webui_set_multi_access(size_t window, bool status);
|
||||
|
||||
// -- JavaScript ----------------------
|
||||
// Run JavaScript quickly with no waiting for the response.
|
||||
WEBUI_EXPORT void webui_run(size_t window, const char* script);
|
||||
// Run a JavaScript, and get the response back (Make sure your local buffer can hold the response).
|
||||
WEBUI_EXPORT bool webui_script(size_t window, const char* script, size_t timeout, char* buffer, size_t buffer_length);
|
||||
// Chose between Deno and Nodejs runtime for .js and .ts files.
|
||||
WEBUI_EXPORT void webui_set_runtime(size_t window, size_t runtime);
|
||||
// Parse argument as integer.
|
||||
WEBUI_EXPORT long long int webui_get_int(webui_event_t* e);
|
||||
// Parse argument as string.
|
||||
WEBUI_EXPORT const char* webui_get_string(webui_event_t* e);
|
||||
// Parse argument as boolean.
|
||||
WEBUI_EXPORT bool webui_get_bool(webui_event_t* e);
|
||||
// Return the response to JavaScript as integer.
|
||||
WEBUI_EXPORT void webui_return_int(webui_event_t* e, long long int n);
|
||||
// Return the response to JavaScript as string.
|
||||
WEBUI_EXPORT void webui_return_string(webui_event_t* e, char* s);
|
||||
// Return the response to JavaScript as boolean.
|
||||
WEBUI_EXPORT void webui_return_bool(webui_event_t* e, bool b);
|
||||
// Base64 encoding. Use this to safely send text based data to the UI. If it fails it will return NULL.
|
||||
WEBUI_EXPORT char* webui_encode(const char* str);
|
||||
// Base64 decoding. Use this to safely decode received Base64 text from the UI. If it fails it will return NULL.
|
||||
WEBUI_EXPORT char* webui_decode(const char* str);
|
||||
// Safely free a buffer allocated by WebUI, for example when using webui_encode().
|
||||
WEBUI_EXPORT void webui_free(void* ptr);
|
||||
|
||||
// -- Interface -----------------------
|
||||
// Bind a specific html element click event with a function. Empty element means all events. This replace webui_bind(). The func is (Window, EventType, Element, Data, EventNumber)
|
||||
WEBUI_EXPORT size_t webui_interface_bind(size_t window, const char* element, void (*func)(size_t, size_t, char*, char*, size_t));
|
||||
// When using `webui_interface_bind()` you may need this function to easily set your callback response.
|
||||
WEBUI_EXPORT void webui_interface_set_response(size_t window, size_t event_number, const char* response);
|
||||
// Check if the app still running or not. This replace webui_wait().
|
||||
WEBUI_EXPORT bool webui_interface_is_app_running(void);
|
||||
// Get window unique ID
|
||||
WEBUI_EXPORT size_t webui_interface_get_window_id(size_t window);
|
||||
// Get a unique ID. Same ID as `webui_bind()`. Return > 0 if bind exist.
|
||||
WEBUI_EXPORT size_t webui_interface_get_bind_id(size_t window, const char* element);
|
||||
|
||||
#endif /* _WEBUI_H */
|
@ -1,249 +0,0 @@
|
||||
/*
|
||||
WebUI Library 2.3.0
|
||||
http://webui.me
|
||||
https://github.com/webui-dev/webui
|
||||
Copyright (c) 2020-2023 Hassan Draga.
|
||||
Licensed under MIT License.
|
||||
All rights reserved.
|
||||
Canada.
|
||||
*/
|
||||
|
||||
#ifndef _WEBUI_HPP
|
||||
#define _WEBUI_HPP
|
||||
|
||||
// C++ STD
|
||||
#include <string>
|
||||
|
||||
// WebUI C Header
|
||||
extern "C" {
|
||||
#include "webui.h"
|
||||
}
|
||||
|
||||
namespace webui {
|
||||
|
||||
const int DISCONNECTED = 0; // 0. Window disconnection event
|
||||
const int CONNECTED = 1; // 1. Window connection event
|
||||
const int MULTI_CONNECTION = 2; // 2. New window connection event
|
||||
const int UNWANTED_CONNECTION = 3; // 3. New unwanted window connection event
|
||||
const int MOUSE_CLICK = 4; // 4. Mouse click event
|
||||
const int NAVIGATION = 5; // 5. Window navigation event
|
||||
const int CALLBACKS = 6; // 6. Function call event
|
||||
|
||||
class window;
|
||||
|
||||
// Event struct
|
||||
struct event {
|
||||
webui::window& window; // The window object
|
||||
unsigned int event_type; // Event type
|
||||
std::string element; // HTML element ID
|
||||
std::string data; // JavaScript data
|
||||
unsigned int event_number; // Internal WebUI
|
||||
|
||||
// Window object constructor that
|
||||
// initializes the reference, This
|
||||
// is to avoid creating copies.
|
||||
event(webui::window& window_obj) : window(window_obj) {}
|
||||
};
|
||||
|
||||
// List of callbacks: user_function(webui::event* e)
|
||||
void (*callback_list[512])(webui::event*);
|
||||
|
||||
// List of window objects: webui::window
|
||||
webui::window* window_list[512];
|
||||
|
||||
// Event handler
|
||||
// WebUI is written in C. So there is no way
|
||||
// to make C call a C++ class member. That's
|
||||
// why this function should be outside class
|
||||
void event_handler(webui_event_t* c_e) {
|
||||
|
||||
// Get a unique ID. Same ID as `webui_bind()`. Return > 0 if bind exist.
|
||||
unsigned int id = webui_interface_get_bind_id(c_e->window, c_e->element);
|
||||
|
||||
if(id < 1)
|
||||
return;
|
||||
|
||||
// Create a new event struct
|
||||
webui::event e(*window_list[id]);
|
||||
// `e.window` is already initialized by `e` constructor
|
||||
e.event_type = c_e->event_type;
|
||||
e.element = (c_e->element != NULL ? std::string(c_e->element) : std::string(""));
|
||||
e.data = (c_e->data != NULL ? std::string(c_e->data) : std::string(""));
|
||||
e.event_number = c_e->event_number;
|
||||
|
||||
// Call the user callback
|
||||
if(callback_list[id] != NULL)
|
||||
callback_list[id](&e);
|
||||
}
|
||||
|
||||
class window {
|
||||
private:
|
||||
size_t webui_window = 0;
|
||||
|
||||
webui_event_t* convert_event_to_webui_event(webui::event* e) {
|
||||
// Convert C++ `webui::event` to C `webui_event_t`
|
||||
webui_event_t* c_e = new webui_event_t;
|
||||
c_e->window = this->webui_window;
|
||||
c_e->event_type = e->event_type;
|
||||
c_e->element = (char*)e->element.c_str();
|
||||
c_e->data = (char*)e->data.c_str();
|
||||
c_e->event_number = e->event_number;
|
||||
return c_e;
|
||||
}
|
||||
public:
|
||||
// Constructor
|
||||
window() {
|
||||
this->webui_window = webui_new_window();
|
||||
}
|
||||
|
||||
// Destructor
|
||||
~window() {
|
||||
// Nothing to do.
|
||||
// No needs to call `webui_close()`
|
||||
}
|
||||
|
||||
// Bind a specific html element click event with a function. Empty element means all events.
|
||||
void bind(std::string element, void (*func)(webui::event* e)) {
|
||||
|
||||
// Get unique ID
|
||||
unsigned int id = webui_bind(this->webui_window, element.c_str(), webui::event_handler);
|
||||
|
||||
// Save window object
|
||||
window_list[id] = this;
|
||||
|
||||
// Save callback
|
||||
callback_list[id] = func;
|
||||
}
|
||||
|
||||
// Show a window using a embedded HTML, or a file. If the window is already opened then it will be refreshed.
|
||||
bool show(std::string content) {
|
||||
return webui_show(this->webui_window, content.c_str());
|
||||
}
|
||||
|
||||
// Same as show(). But with a specific web browser.
|
||||
bool show_browser(std::string content, unsigned int browser) {
|
||||
return webui_show_browser(this->webui_window, content.c_str(), browser);
|
||||
}
|
||||
|
||||
// Close a specific window.
|
||||
void close() {
|
||||
webui_close(this->webui_window);
|
||||
}
|
||||
|
||||
// Set the window in Kiosk mode (Full screen)
|
||||
void set_kiosk(bool status) {
|
||||
webui_set_kiosk(this->webui_window, status);
|
||||
}
|
||||
|
||||
// -- Other ---------------------------
|
||||
// Check a specific window if it's still running
|
||||
bool is_shown() {
|
||||
return webui_is_shown(this->webui_window);
|
||||
}
|
||||
|
||||
// Set the default embedded HTML favicon
|
||||
void set_icon(std::string icon, std::string icon_type) {
|
||||
webui_set_icon(this->webui_window, icon.c_str(), icon_type.c_str());
|
||||
}
|
||||
|
||||
// Allow the window URL to be re-used in normal web browsers
|
||||
void set_multi_access(bool status) {
|
||||
webui_set_multi_access(this->webui_window, status);
|
||||
}
|
||||
|
||||
// -- JavaScript ----------------------
|
||||
// Quickly run a JavaScript (no response waiting).
|
||||
void run(std::string script) {
|
||||
webui_run(this->webui_window, script.c_str());
|
||||
}
|
||||
|
||||
// Run a JavaScript, and get the response back (Make sure your local buffer can hold the response).
|
||||
bool script(std::string script, unsigned int timeout, char* buffer, size_t buffer_length) {
|
||||
return webui_script(this->webui_window, script.c_str(), timeout, buffer, buffer_length);
|
||||
}
|
||||
|
||||
// Chose between Deno and Nodejs runtime for .js and .ts files.
|
||||
void set_runtime(unsigned int runtime) {
|
||||
webui_set_runtime(this->webui_window, runtime);
|
||||
}
|
||||
|
||||
// Parse argument as integer.
|
||||
long long int get_int(webui::event* e) {
|
||||
webui_event_t* c_e = convert_event_to_webui_event(e);
|
||||
long long int ret = webui_get_int(c_e);
|
||||
delete c_e;
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Parse argument as string.
|
||||
std::string get_string(webui::event* e) {
|
||||
webui_event_t* c_e = convert_event_to_webui_event(e);
|
||||
std::string ret = std::string(webui_get_string(c_e));
|
||||
delete c_e;
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Parse argument as boolean.
|
||||
bool get_bool(webui::event* e) {
|
||||
webui_event_t* c_e = convert_event_to_webui_event(e);
|
||||
bool ret = webui_get_bool(c_e);
|
||||
delete c_e;
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Return the response to JavaScript as integer.
|
||||
void return_int(webui::event* e, long long int n) {
|
||||
webui_event_t* c_e = convert_event_to_webui_event(e);
|
||||
webui_return_int(c_e, n);
|
||||
delete c_e;
|
||||
}
|
||||
|
||||
// Return the response to JavaScript as string.
|
||||
void return_string(webui::event* e, std::string s) {
|
||||
webui_event_t* c_e = convert_event_to_webui_event(e);
|
||||
webui_return_string(c_e, &s[0]);
|
||||
delete c_e;
|
||||
}
|
||||
|
||||
// Return the response to JavaScript as boolean.
|
||||
void return_bool(webui::event* e, bool b) {
|
||||
webui_event_t* c_e = convert_event_to_webui_event(e);
|
||||
webui_return_bool(c_e, b);
|
||||
delete c_e;
|
||||
}
|
||||
};
|
||||
|
||||
// Wait until all opened windows get closed.
|
||||
void wait(void) {
|
||||
webui_wait();
|
||||
}
|
||||
|
||||
// Close all opened windows. wait() will break.
|
||||
void exit(void) {
|
||||
webui_exit();
|
||||
}
|
||||
|
||||
// Set the maximum time in seconds to wait for browser to start
|
||||
void set_timeout(unsigned int second) {
|
||||
webui_set_timeout(second);
|
||||
}
|
||||
|
||||
// Base64 encoding. Use this to safely send text based data to the UI. If it fails it will return NULL.
|
||||
std::string encode(std::string str) {
|
||||
std::string ret = std::string(webui_encode(str.c_str()));
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Base64 decoding. Use this to safely decode received Base64 text from the UI. If it fails it will return NULL.
|
||||
std::string decode(std::string str) {
|
||||
std::string ret = std::string(webui_decode(str.c_str()));
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Safely free a buffer allocated by WebUI, for example when using webui_encode().
|
||||
void free(void* ptr) {
|
||||
webui_free(ptr);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _WEBUI_HPP */
|
@ -1,39 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>WebUI - Serve a Folder Example (C++)</title>
|
||||
<style>
|
||||
body {
|
||||
color: white;
|
||||
background: #0F2027;
|
||||
background: -webkit-linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
background: linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h3 id="title">Serve a Folder Example (C++)</h3>
|
||||
<br>
|
||||
<p id="description">
|
||||
You can edit this HTML file as you need.<br>
|
||||
Also, you can config WebUI to use Deno or Nodejs runtime for your JS/TS files.<br>
|
||||
<br>
|
||||
Please click on the link to switch to the second page<br>
|
||||
Or click on the button to switch to the second page programmatically.
|
||||
</p>
|
||||
<br>
|
||||
<h4><a href="second.html">Second Page As A Simple Link</a></h4>
|
||||
<br>
|
||||
<button id="SwitchToSecondPage">Switch to The Second Page Programmatically</button>
|
||||
<br>
|
||||
<br>
|
||||
<button id="OpenNewWindow">Open The Second Window</button>
|
||||
</body>
|
||||
|
||||
<!-- Connect this window to the background app -->
|
||||
<script src="/webui.js"></script>
|
||||
|
||||
</html>
|
@ -1,25 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>WebUI - Second Page (C++)</title>
|
||||
<style>
|
||||
body {
|
||||
color: white;
|
||||
background: #0F2027;
|
||||
background: -webkit-linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
background: linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h3 id="title">This is the second page !</h3>
|
||||
<br>
|
||||
<button id="Exit">Call Exit()</button>
|
||||
</body>
|
||||
|
||||
<!-- Connect this window to the background app -->
|
||||
<script src="/webui.js"></script>
|
||||
</html>
|
@ -1,39 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>WebUI - Serve a Folder Example (C++)</title>
|
||||
<style>
|
||||
body {
|
||||
color: white;
|
||||
background: #0F2027;
|
||||
background: -webkit-linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
background: linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h3 id="title">Serve a Folder Example (C++)</h3>
|
||||
<br>
|
||||
<p id="description">
|
||||
You can edit this HTML file as you need.<br>
|
||||
Also, you can config WebUI to use Deno or Nodejs runtime for your JS/TS files.<br>
|
||||
<br>
|
||||
Please click on the link to switch to the second page<br>
|
||||
Or click on the button to switch to the second page programmatically.
|
||||
</p>
|
||||
<br>
|
||||
<h4><a href="second.html">Second Page As A Simple Link</a></h4>
|
||||
<br>
|
||||
<button id="SwitchToSecondPage">Switch to The Second Page Programmatically</button>
|
||||
<br>
|
||||
<br>
|
||||
<button id="OpenNewWindow">Open The Second Window</button>
|
||||
</body>
|
||||
|
||||
<!-- Connect this window to the background app -->
|
||||
<script src="/webui.js"></script>
|
||||
|
||||
</html>
|
@ -1,25 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>WebUI - Second Page (C++)</title>
|
||||
<style>
|
||||
body {
|
||||
color: white;
|
||||
background: #0F2027;
|
||||
background: -webkit-linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
background: linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h3 id="title">This is the second page !</h3>
|
||||
<br>
|
||||
<button id="Exit">Call Exit()</button>
|
||||
</body>
|
||||
|
||||
<!-- Connect this window to the background app -->
|
||||
<script src="/webui.js"></script>
|
||||
</html>
|
@ -1,25 +0,0 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.33027.164
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "my_webui_app", "my_webui_app\my_webui_app.vcxproj", "{CC54CE9B-9584-4C08-8AB1-C08549E404FE}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x64 = Debug|x64
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{CC54CE9B-9584-4C08-8AB1-C08549E404FE}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{CC54CE9B-9584-4C08-8AB1-C08549E404FE}.Debug|x64.Build.0 = Debug|x64
|
||||
{CC54CE9B-9584-4C08-8AB1-C08549E404FE}.Release|x64.ActiveCfg = Release|x64
|
||||
{CC54CE9B-9584-4C08-8AB1-C08549E404FE}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {B59013B5-9B18-4E50-992A-5ABD6F569433}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
@ -1,39 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>WebUI - Serve a Folder Example (C++)</title>
|
||||
<style>
|
||||
body {
|
||||
color: white;
|
||||
background: #0F2027;
|
||||
background: -webkit-linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
background: linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h3 id="title">Serve a Folder Example (C++)</h3>
|
||||
<br>
|
||||
<p id="description">
|
||||
You can edit this HTML file as you need.<br>
|
||||
Also, you can config WebUI to use Deno or Nodejs runtime for your JS/TS files.<br>
|
||||
<br>
|
||||
Please click on the link to switch to the second page<br>
|
||||
Or click on the button to switch to the second page programmatically.
|
||||
</p>
|
||||
<br>
|
||||
<h4><a href="second.html">Second Page As A Simple Link</a></h4>
|
||||
<br>
|
||||
<button id="SwitchToSecondPage">Switch to The Second Page Programmatically</button>
|
||||
<br>
|
||||
<br>
|
||||
<button id="OpenNewWindow">Open The Second Window</button>
|
||||
</body>
|
||||
|
||||
<!-- Connect this window to the background app -->
|
||||
<script src="/webui.js"></script>
|
||||
|
||||
</html>
|
@ -1,103 +0,0 @@
|
||||
// Include the WebUI header
|
||||
#include "webui.hpp"
|
||||
|
||||
// Include C++ STD
|
||||
#include <iostream>
|
||||
|
||||
// Making this object global so show_second_window() can access it.
|
||||
webui::window my_second_window;
|
||||
|
||||
// Example of a simple Class
|
||||
class MyClass {
|
||||
public:
|
||||
|
||||
// This method gets called every time the
|
||||
// user clicks on "OpenNewWindow"
|
||||
void show_second_window(webui::event* e) {
|
||||
|
||||
// Show a new window, and navigate to `/second.html`
|
||||
// if the window is already opened, then switch in the same window
|
||||
my_second_window.show("second.html");
|
||||
}
|
||||
|
||||
// This method gets called every time the
|
||||
// user clicks on "SwitchToSecondPage"
|
||||
void switch_to_second_page(webui::event* e) {
|
||||
|
||||
// Switch to `/second.html` in the same opened window.
|
||||
e->window.show("second.html");
|
||||
}
|
||||
|
||||
// Example of a simple function (Not a method)
|
||||
// This function receives all events because
|
||||
// it's get bind with an empty HTML ID.
|
||||
void events(webui::event* e) {
|
||||
|
||||
if (e->event_type == webui::CONNECTED)
|
||||
std::cout << "Window Connected." << std::endl;
|
||||
else if (e->event_type == webui::DISCONNECTED)
|
||||
std::cout << "Window Disconnected." << std::endl;
|
||||
else if (e->event_type == webui::MOUSE_CLICK)
|
||||
std::cout << "Click on element: " << e->element << std::endl;
|
||||
else if (e->event_type == webui::NAVIGATION)
|
||||
std::cout << "Starting navigation to: " << e->data << std::endl;
|
||||
}
|
||||
|
||||
// Example of a simple function (Not a method)
|
||||
void exit_app(webui::event* e) {
|
||||
|
||||
// Close all opened windows
|
||||
webui::exit();
|
||||
}
|
||||
};
|
||||
|
||||
// Wrapper:
|
||||
// Because WebUI is written in C, so it can not
|
||||
// access `MyClass` directly. That's why we should
|
||||
// create a simple C++ wrapper.
|
||||
MyClass obj;
|
||||
void show_second_window_wrp(webui::event* e) { obj.show_second_window(e); }
|
||||
void switch_to_second_page_wrp(webui::event* e) { obj.switch_to_second_page(e); }
|
||||
void events_wrp(webui::event* e) { obj.events(e); }
|
||||
void exit_app_wrp(webui::event* e) { obj.exit_app(e); }
|
||||
|
||||
int main() {
|
||||
|
||||
// Print logs (debug build only)
|
||||
std::cout << "Starting..." << std::endl;
|
||||
|
||||
// Create a new window
|
||||
webui::window my_window;
|
||||
|
||||
// Bind HTML element IDs with a C functions
|
||||
my_window.bind("SwitchToSecondPage", switch_to_second_page_wrp);
|
||||
my_window.bind("OpenNewWindow", show_second_window_wrp);
|
||||
my_window.bind("Exit", exit_app_wrp);
|
||||
my_second_window.bind("Exit", exit_app_wrp);
|
||||
|
||||
// Bind all events
|
||||
my_window.bind("", events_wrp);
|
||||
|
||||
// Show a new window
|
||||
my_window.show("index.html"); // my_window.show_browser("index.html", Chrome);
|
||||
|
||||
// Wait until all windows get closed
|
||||
webui::wait();
|
||||
|
||||
// Print logs (debug build only)
|
||||
std::cout << "Thank you." << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
// Release build
|
||||
int WINAPI wWinMain(
|
||||
_In_ HINSTANCE hInstance,
|
||||
_In_opt_ HINSTANCE hPrevInstance,
|
||||
_In_ LPWSTR lpCmdLine,
|
||||
_In_ int nShowCmd
|
||||
) {
|
||||
return main();
|
||||
}
|
||||
#endif
|
@ -1,154 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>16.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{cc54ce9b-9584-4c08-8ab1-c08549e404fe}</ProjectGuid>
|
||||
<RootNamespace>mywebuiapp</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>webui-2-static-x64.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||
<AdditionalDependencies>webui-2-static-x64.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="my_webui_app.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="webui.h" />
|
||||
<ClInclude Include="webui.hpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
@ -1,30 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="my_webui_app.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="webui.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="webui.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -1,25 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>WebUI - Second Page (C++)</title>
|
||||
<style>
|
||||
body {
|
||||
color: white;
|
||||
background: #0F2027;
|
||||
background: -webkit-linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
background: linear-gradient(to right, #43264c, #762f59, #501349);
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h3 id="title">This is the second page !</h3>
|
||||
<br>
|
||||
<button id="Exit">Call Exit()</button>
|
||||
</body>
|
||||
|
||||
<!-- Connect this window to the background app -->
|
||||
<script src="/webui.js"></script>
|
||||
</html>
|
Binary file not shown.
@ -1,215 +0,0 @@
|
||||
/*
|
||||
WebUI Library 2.3.0
|
||||
http://webui.me
|
||||
https://github.com/webui-dev/webui
|
||||
Copyright (c) 2020-2023 Hassan Draga.
|
||||
Licensed under MIT License.
|
||||
All rights reserved.
|
||||
Canada.
|
||||
*/
|
||||
|
||||
#ifndef _WEBUI_H
|
||||
#define _WEBUI_H
|
||||
|
||||
#define WEBUI_VERSION "2.3.0"
|
||||
#define WEBUI_MAX_IDS (512)
|
||||
|
||||
// Dynamic Library Exports
|
||||
#if defined(_MSC_VER) || defined(__TINYC__)
|
||||
#ifndef WEBUI_EXPORT
|
||||
#define WEBUI_EXPORT __declspec(dllexport)
|
||||
#endif
|
||||
#else
|
||||
#ifndef WEBUI_EXPORT
|
||||
#define WEBUI_EXPORT extern
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// -- C STD ---------------------------
|
||||
#include <stdbool.h>
|
||||
#include <inttypes.h>
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stddef.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
#if defined(__GNUC__) || defined(__TINYC__)
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
|
||||
// -- Windows -------------------------
|
||||
#ifdef _WIN32
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#include <direct.h>
|
||||
#include <io.h>
|
||||
#include <tchar.h>
|
||||
#include <tlhelp32.h>
|
||||
#define WEBUI_GET_CURRENT_DIR _getcwd
|
||||
#define WEBUI_FILE_EXIST _access
|
||||
#define WEBUI_POPEN _popen
|
||||
#define WEBUI_PCLOSE _pclose
|
||||
#define WEBUI_MAX_PATH MAX_PATH
|
||||
#endif
|
||||
|
||||
// -- Linux ---------------------------
|
||||
#ifdef __linux__
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
#include <poll.h>
|
||||
#include <sys/time.h>
|
||||
#include <signal.h>
|
||||
#define WEBUI_GET_CURRENT_DIR getcwd
|
||||
#define WEBUI_FILE_EXIST access
|
||||
#define WEBUI_POPEN popen
|
||||
#define WEBUI_PCLOSE pclose
|
||||
#define WEBUI_MAX_PATH PATH_MAX
|
||||
#endif
|
||||
|
||||
// -- Apple ---------------------------
|
||||
#ifdef __APPLE__
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
#include <poll.h>
|
||||
#include <sys/syslimits.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <signal.h>
|
||||
#define WEBUI_GET_CURRENT_DIR getcwd
|
||||
#define WEBUI_FILE_EXIST access
|
||||
#define WEBUI_POPEN popen
|
||||
#define WEBUI_PCLOSE pclose
|
||||
#define WEBUI_MAX_PATH PATH_MAX
|
||||
#endif
|
||||
|
||||
// -- Enums ---------------------------
|
||||
enum webui_browsers {
|
||||
AnyBrowser = 0, // 0. Default recommended web browser
|
||||
Chrome, // 1. Google Chrome
|
||||
Firefox, // 2. Mozilla Firefox
|
||||
Edge, // 3. Microsoft Edge
|
||||
Safari, // 4. Apple Safari
|
||||
Chromium, // 5. The Chromium Project
|
||||
Opera, // 6. Opera Browser
|
||||
Brave, // 7. The Brave Browser
|
||||
Vivaldi, // 8. The Vivaldi Browser
|
||||
Epic, // 9. The Epic Browser
|
||||
Yandex, // 10. The Yandex Browser
|
||||
};
|
||||
|
||||
enum webui_runtimes {
|
||||
None = 0, // 0. Prevent WebUI from using any runtime for .js and .ts files
|
||||
Deno, // 1. Use Deno runtime for .js and .ts files
|
||||
NodeJS, // 2. Use Nodejs runtime for .js files
|
||||
};
|
||||
|
||||
enum webui_events {
|
||||
WEBUI_EVENT_DISCONNECTED = 0, // 0. Window disconnection event
|
||||
WEBUI_EVENT_CONNECTED, // 1. Window connection event
|
||||
WEBUI_EVENT_MULTI_CONNECTION, // 2. New window connection event
|
||||
WEBUI_EVENT_UNWANTED_CONNECTION, // 3. New unwanted window connection event
|
||||
WEBUI_EVENT_MOUSE_CLICK, // 4. Mouse click event
|
||||
WEBUI_EVENT_NAVIGATION, // 5. Window navigation event
|
||||
WEBUI_EVENT_CALLBACK, // 6. Function call event
|
||||
};
|
||||
|
||||
// -- Structs -------------------------
|
||||
typedef struct webui_event_t {
|
||||
size_t window; // The window object number
|
||||
size_t event_type; // Event type
|
||||
char* element; // HTML element ID
|
||||
char* data; // JavaScript data
|
||||
size_t event_number; // Internal WebUI
|
||||
} webui_event_t;
|
||||
|
||||
// -- Definitions ---------------------
|
||||
// Create a new webui window object.
|
||||
WEBUI_EXPORT size_t webui_new_window(void);
|
||||
// Create a new webui window object.
|
||||
WEBUI_EXPORT void webui_new_window_id(size_t window_number);
|
||||
// Get a free window ID that can be used with `webui_new_window_id()`
|
||||
WEBUI_EXPORT size_t webui_get_new_window_id(void);
|
||||
// Bind a specific html element click event with a function. Empty element means all events.
|
||||
WEBUI_EXPORT size_t webui_bind(size_t window, const char* element, void (*func)(webui_event_t* e));
|
||||
// Show a window using a embedded HTML, or a file. If the window is already opened then it will be refreshed.
|
||||
WEBUI_EXPORT bool webui_show(size_t window, const char* content);
|
||||
// Same as webui_show(). But with a specific web browser.
|
||||
WEBUI_EXPORT bool webui_show_browser(size_t window, const char* content, size_t browser);
|
||||
// Set the window in Kiosk mode (Full screen)
|
||||
WEBUI_EXPORT void webui_set_kiosk(size_t window, bool status);
|
||||
// Wait until all opened windows get closed.
|
||||
WEBUI_EXPORT void webui_wait(void);
|
||||
// Close a specific window only. The window object will still exist.
|
||||
WEBUI_EXPORT void webui_close(size_t window);
|
||||
// Close a specific window and free all memory resources.
|
||||
WEBUI_EXPORT void webui_destroy(size_t window);
|
||||
// Close all opened windows. webui_wait() will break.
|
||||
WEBUI_EXPORT void webui_exit(void);
|
||||
|
||||
// -- Other ---------------------------
|
||||
// Check a specific window if it's still running
|
||||
WEBUI_EXPORT bool webui_is_shown(size_t window);
|
||||
// Set the maximum time in seconds to wait for browser to start
|
||||
WEBUI_EXPORT void webui_set_timeout(size_t second);
|
||||
// Set the default embedded HTML favicon
|
||||
WEBUI_EXPORT void webui_set_icon(size_t window, const char* icon, const char* icon_type);
|
||||
// Allow the window URL to be re-used in normal web browsers
|
||||
WEBUI_EXPORT void webui_set_multi_access(size_t window, bool status);
|
||||
|
||||
// -- JavaScript ----------------------
|
||||
// Run JavaScript quickly with no waiting for the response.
|
||||
WEBUI_EXPORT void webui_run(size_t window, const char* script);
|
||||
// Run a JavaScript, and get the response back (Make sure your local buffer can hold the response).
|
||||
WEBUI_EXPORT bool webui_script(size_t window, const char* script, size_t timeout, char* buffer, size_t buffer_length);
|
||||
// Chose between Deno and Nodejs runtime for .js and .ts files.
|
||||
WEBUI_EXPORT void webui_set_runtime(size_t window, size_t runtime);
|
||||
// Parse argument as integer.
|
||||
WEBUI_EXPORT long long int webui_get_int(webui_event_t* e);
|
||||
// Parse argument as string.
|
||||
WEBUI_EXPORT const char* webui_get_string(webui_event_t* e);
|
||||
// Parse argument as boolean.
|
||||
WEBUI_EXPORT bool webui_get_bool(webui_event_t* e);
|
||||
// Return the response to JavaScript as integer.
|
||||
WEBUI_EXPORT void webui_return_int(webui_event_t* e, long long int n);
|
||||
// Return the response to JavaScript as string.
|
||||
WEBUI_EXPORT void webui_return_string(webui_event_t* e, char* s);
|
||||
// Return the response to JavaScript as boolean.
|
||||
WEBUI_EXPORT void webui_return_bool(webui_event_t* e, bool b);
|
||||
// Base64 encoding. Use this to safely send text based data to the UI. If it fails it will return NULL.
|
||||
WEBUI_EXPORT char* webui_encode(const char* str);
|
||||
// Base64 decoding. Use this to safely decode received Base64 text from the UI. If it fails it will return NULL.
|
||||
WEBUI_EXPORT char* webui_decode(const char* str);
|
||||
// Safely free a buffer allocated by WebUI, for example when using webui_encode().
|
||||
WEBUI_EXPORT void webui_free(void* ptr);
|
||||
|
||||
// -- Interface -----------------------
|
||||
// Bind a specific html element click event with a function. Empty element means all events. This replace webui_bind(). The func is (Window, EventType, Element, Data, EventNumber)
|
||||
WEBUI_EXPORT size_t webui_interface_bind(size_t window, const char* element, void (*func)(size_t, size_t, char*, char*, size_t));
|
||||
// When using `webui_interface_bind()` you may need this function to easily set your callback response.
|
||||
WEBUI_EXPORT void webui_interface_set_response(size_t window, size_t event_number, const char* response);
|
||||
// Check if the app still running or not. This replace webui_wait().
|
||||
WEBUI_EXPORT bool webui_interface_is_app_running(void);
|
||||
// Get window unique ID
|
||||
WEBUI_EXPORT size_t webui_interface_get_window_id(size_t window);
|
||||
// Get a unique ID. Same ID as `webui_bind()`. Return > 0 if bind exist.
|
||||
WEBUI_EXPORT size_t webui_interface_get_bind_id(size_t window, const char* element);
|
||||
|
||||
#endif /* _WEBUI_H */
|
@ -1,249 +0,0 @@
|
||||
/*
|
||||
WebUI Library 2.3.0
|
||||
http://webui.me
|
||||
https://github.com/webui-dev/webui
|
||||
Copyright (c) 2020-2023 Hassan Draga.
|
||||
Licensed under MIT License.
|
||||
All rights reserved.
|
||||
Canada.
|
||||
*/
|
||||
|
||||
#ifndef _WEBUI_HPP
|
||||
#define _WEBUI_HPP
|
||||
|
||||
// C++ STD
|
||||
#include <string>
|
||||
|
||||
// WebUI C Header
|
||||
extern "C" {
|
||||
#include "webui.h"
|
||||
}
|
||||
|
||||
namespace webui {
|
||||
|
||||
const int DISCONNECTED = 0; // 0. Window disconnection event
|
||||
const int CONNECTED = 1; // 1. Window connection event
|
||||
const int MULTI_CONNECTION = 2; // 2. New window connection event
|
||||
const int UNWANTED_CONNECTION = 3; // 3. New unwanted window connection event
|
||||
const int MOUSE_CLICK = 4; // 4. Mouse click event
|
||||
const int NAVIGATION = 5; // 5. Window navigation event
|
||||
const int CALLBACKS = 6; // 6. Function call event
|
||||
|
||||
class window;
|
||||
|
||||
// Event struct
|
||||
struct event {
|
||||
webui::window& window; // The window object
|
||||
unsigned int event_type; // Event type
|
||||
std::string element; // HTML element ID
|
||||
std::string data; // JavaScript data
|
||||
unsigned int event_number; // Internal WebUI
|
||||
|
||||
// Window object constructor that
|
||||
// initializes the reference, This
|
||||
// is to avoid creating copies.
|
||||
event(webui::window& window_obj) : window(window_obj) {}
|
||||
};
|
||||
|
||||
// List of callbacks: user_function(webui::event* e)
|
||||
void (*callback_list[512])(webui::event*);
|
||||
|
||||
// List of window objects: webui::window
|
||||
webui::window* window_list[512];
|
||||
|
||||
// Event handler
|
||||
// WebUI is written in C. So there is no way
|
||||
// to make C call a C++ class member. That's
|
||||
// why this function should be outside class
|
||||
void event_handler(webui_event_t* c_e) {
|
||||
|
||||
// Get a unique ID. Same ID as `webui_bind()`. Return > 0 if bind exist.
|
||||
unsigned int id = webui_interface_get_bind_id(c_e->window, c_e->element);
|
||||
|
||||
if(id < 1)
|
||||
return;
|
||||
|
||||
// Create a new event struct
|
||||
webui::event e(*window_list[id]);
|
||||
// `e.window` is already initialized by `e` constructor
|
||||
e.event_type = c_e->event_type;
|
||||
e.element = (c_e->element != NULL ? std::string(c_e->element) : std::string(""));
|
||||
e.data = (c_e->data != NULL ? std::string(c_e->data) : std::string(""));
|
||||
e.event_number = c_e->event_number;
|
||||
|
||||
// Call the user callback
|
||||
if(callback_list[id] != NULL)
|
||||
callback_list[id](&e);
|
||||
}
|
||||
|
||||
class window {
|
||||
private:
|
||||
size_t webui_window = 0;
|
||||
|
||||
webui_event_t* convert_event_to_webui_event(webui::event* e) {
|
||||
// Convert C++ `webui::event` to C `webui_event_t`
|
||||
webui_event_t* c_e = new webui_event_t;
|
||||
c_e->window = this->webui_window;
|
||||
c_e->event_type = e->event_type;
|
||||
c_e->element = (char*)e->element.c_str();
|
||||
c_e->data = (char*)e->data.c_str();
|
||||
c_e->event_number = e->event_number;
|
||||
return c_e;
|
||||
}
|
||||
public:
|
||||
// Constructor
|
||||
window() {
|
||||
this->webui_window = webui_new_window();
|
||||
}
|
||||
|
||||
// Destructor
|
||||
~window() {
|
||||
// Nothing to do.
|
||||
// No needs to call `webui_close()`
|
||||
}
|
||||
|
||||
// Bind a specific html element click event with a function. Empty element means all events.
|
||||
void bind(std::string element, void (*func)(webui::event* e)) {
|
||||
|
||||
// Get unique ID
|
||||
unsigned int id = webui_bind(this->webui_window, element.c_str(), webui::event_handler);
|
||||
|
||||
// Save window object
|
||||
window_list[id] = this;
|
||||
|
||||
// Save callback
|
||||
callback_list[id] = func;
|
||||
}
|
||||
|
||||
// Show a window using a embedded HTML, or a file. If the window is already opened then it will be refreshed.
|
||||
bool show(std::string content) {
|
||||
return webui_show(this->webui_window, content.c_str());
|
||||
}
|
||||
|
||||
// Same as show(). But with a specific web browser.
|
||||
bool show_browser(std::string content, unsigned int browser) {
|
||||
return webui_show_browser(this->webui_window, content.c_str(), browser);
|
||||
}
|
||||
|
||||
// Close a specific window.
|
||||
void close() {
|
||||
webui_close(this->webui_window);
|
||||
}
|
||||
|
||||
// Set the window in Kiosk mode (Full screen)
|
||||
void set_kiosk(bool status) {
|
||||
webui_set_kiosk(this->webui_window, status);
|
||||
}
|
||||
|
||||
// -- Other ---------------------------
|
||||
// Check a specific window if it's still running
|
||||
bool is_shown() {
|
||||
return webui_is_shown(this->webui_window);
|
||||
}
|
||||
|
||||
// Set the default embedded HTML favicon
|
||||
void set_icon(std::string icon, std::string icon_type) {
|
||||
webui_set_icon(this->webui_window, icon.c_str(), icon_type.c_str());
|
||||
}
|
||||
|
||||
// Allow the window URL to be re-used in normal web browsers
|
||||
void set_multi_access(bool status) {
|
||||
webui_set_multi_access(this->webui_window, status);
|
||||
}
|
||||
|
||||
// -- JavaScript ----------------------
|
||||
// Quickly run a JavaScript (no response waiting).
|
||||
void run(std::string script) {
|
||||
webui_run(this->webui_window, script.c_str());
|
||||
}
|
||||
|
||||
// Run a JavaScript, and get the response back (Make sure your local buffer can hold the response).
|
||||
bool script(std::string script, unsigned int timeout, char* buffer, size_t buffer_length) {
|
||||
return webui_script(this->webui_window, script.c_str(), timeout, buffer, buffer_length);
|
||||
}
|
||||
|
||||
// Chose between Deno and Nodejs runtime for .js and .ts files.
|
||||
void set_runtime(unsigned int runtime) {
|
||||
webui_set_runtime(this->webui_window, runtime);
|
||||
}
|
||||
|
||||
// Parse argument as integer.
|
||||
long long int get_int(webui::event* e) {
|
||||
webui_event_t* c_e = convert_event_to_webui_event(e);
|
||||
long long int ret = webui_get_int(c_e);
|
||||
delete c_e;
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Parse argument as string.
|
||||
std::string get_string(webui::event* e) {
|
||||
webui_event_t* c_e = convert_event_to_webui_event(e);
|
||||
std::string ret = std::string(webui_get_string(c_e));
|
||||
delete c_e;
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Parse argument as boolean.
|
||||
bool get_bool(webui::event* e) {
|
||||
webui_event_t* c_e = convert_event_to_webui_event(e);
|
||||
bool ret = webui_get_bool(c_e);
|
||||
delete c_e;
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Return the response to JavaScript as integer.
|
||||
void return_int(webui::event* e, long long int n) {
|
||||
webui_event_t* c_e = convert_event_to_webui_event(e);
|
||||
webui_return_int(c_e, n);
|
||||
delete c_e;
|
||||
}
|
||||
|
||||
// Return the response to JavaScript as string.
|
||||
void return_string(webui::event* e, std::string s) {
|
||||
webui_event_t* c_e = convert_event_to_webui_event(e);
|
||||
webui_return_string(c_e, &s[0]);
|
||||
delete c_e;
|
||||
}
|
||||
|
||||
// Return the response to JavaScript as boolean.
|
||||
void return_bool(webui::event* e, bool b) {
|
||||
webui_event_t* c_e = convert_event_to_webui_event(e);
|
||||
webui_return_bool(c_e, b);
|
||||
delete c_e;
|
||||
}
|
||||
};
|
||||
|
||||
// Wait until all opened windows get closed.
|
||||
void wait(void) {
|
||||
webui_wait();
|
||||
}
|
||||
|
||||
// Close all opened windows. wait() will break.
|
||||
void exit(void) {
|
||||
webui_exit();
|
||||
}
|
||||
|
||||
// Set the maximum time in seconds to wait for browser to start
|
||||
void set_timeout(unsigned int second) {
|
||||
webui_set_timeout(second);
|
||||
}
|
||||
|
||||
// Base64 encoding. Use this to safely send text based data to the UI. If it fails it will return NULL.
|
||||
std::string encode(std::string str) {
|
||||
std::string ret = std::string(webui_encode(str.c_str()));
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Base64 decoding. Use this to safely decode received Base64 text from the UI. If it fails it will return NULL.
|
||||
std::string decode(std::string str) {
|
||||
std::string ret = std::string(webui_decode(str.c_str()));
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Safely free a buffer allocated by WebUI, for example when using webui_encode().
|
||||
void free(void* ptr) {
|
||||
webui_free(ptr);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _WEBUI_HPP */
|
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user