From c8c380b4f1a1df7d57ee63b5b2cfb1814e49de8d Mon Sep 17 00:00:00 2001 From: najdek Date: Wed, 27 May 2026 00:12:22 +0200 Subject: [PATCH] feat: add favicon and app icons - Update favicon to match the LogoIcon. - Serve icons from the native C web server. - Ignore generated asset headers in .gitignore. --- .gitignore | 4 +--- Makefile | 15 +++++++++++++-- frontend/index.html | 2 ++ frontend/public/apple-touch-icon.png | Bin 0 -> 6154 bytes frontend/public/favicon-16x16.png | Bin 0 -> 1102 bytes frontend/public/favicon-32x32.png | Bin 0 -> 1579 bytes frontend/public/favicon.svg | 17 ++++++++++++++++- frontend/public/icon-192.png | Bin 0 -> 6556 bytes frontend/public/icon.png | Bin 0 -> 13803 bytes src/main.c | 19 +++++++++++++++++-- 10 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 frontend/public/apple-touch-icon.png create mode 100644 frontend/public/favicon-16x16.png create mode 100644 frontend/public/favicon-32x32.png create mode 100644 frontend/public/icon-192.png create mode 100644 frontend/public/icon.png diff --git a/.gitignore b/.gitignore index 3d76381..5b2ff74 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,7 @@ *.o # Generated Asset Headers -include/assets_index_html.h -include/assets_cache_appcache.h -include/assets_cacert_pem.h +include/assets_*.h # Frontend build artifacts frontend/dist/ diff --git a/Makefile b/Makefile index 91d4334..3bc0315 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,9 @@ ASSET_HEADER := include/assets_index_html.h CA_HEADER := include/assets_cacert_pem.h MANIFEST_HEADER := include/assets_cache_appcache.h FRONTEND_MANIFEST := frontend/dist/cache.appcache +FAVICON_SVG_HEADER := include/assets_favicon_svg.h +ICON_PNG_HEADER := include/assets_icon_png.h + @@ -56,6 +59,14 @@ $(MANIFEST_HEADER): $(FRONTEND_DIST) @echo "Generating Manifest asset header..." $(PYTHON) tools/gen_assets.py $(FRONTEND_MANIFEST) $(MANIFEST_HEADER) cache_appcache +$(FAVICON_SVG_HEADER): $(FRONTEND_DIST) + @echo "Generating Favicon SVG asset header..." + $(PYTHON) tools/gen_assets.py frontend/dist/favicon.svg $(FAVICON_SVG_HEADER) favicon_svg + +$(ICON_PNG_HEADER): $(FRONTEND_DIST) + @echo "Generating Icon PNG asset header..." + $(PYTHON) tools/gen_assets.py frontend/dist/icon.png $(ICON_PNG_HEADER) icon_png + $(CA_HEADER): @echo "Downloading CA bundle..." wget -O include/cacert.pem https://curl.se/ca/cacert.pem @@ -67,14 +78,14 @@ $(FRONTEND_DIST): @echo "Please run 'make frontend-build' locally on your host machine first." @exit 1 -$(ELF): $(ASSET_HEADER) $(MANIFEST_HEADER) $(CA_HEADER) $(SRCS) +$(ELF): $(ASSET_HEADER) $(MANIFEST_HEADER) $(CA_HEADER) $(FAVICON_SVG_HEADER) $(ICON_PNG_HEADER) $(SRCS) @echo "Building $(ELF)..." $(CC) $(CFLAGS) $(LDFLAGS) -o $(ELF) $(SRCS) $(LIBS) @echo "Stripping $(ELF)..." $(STRIP) $(ELF) clean: - rm -f $(ELF) $(ASSET_HEADER) $(MANIFEST_HEADER) $(CA_HEADER) src/*.o + rm -f $(ELF) $(ASSET_HEADER) $(MANIFEST_HEADER) $(CA_HEADER) $(FAVICON_SVG_HEADER) $(ICON_PNG_HEADER) src/*.o diff --git a/frontend/index.html b/frontend/index.html index 9fd61ee..a142bda 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,6 +4,8 @@ + + [[TITLE_PLACEHOLDER]] diff --git a/frontend/public/apple-touch-icon.png b/frontend/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..af73d8620349089fcc9219f3982a0ab7ed3d400a GIT binary patch literal 6154 zcmbtY2T+quw+_KjLNB3%k={d1RZ*Do#$2@(FU z^npkMUtMum(Nh5co@bDqJA&|SsI!)_9sm%*3jiP!0Dx0Ggj@pv?uY>Z8x8<~d@caM z7*N=5q=;vzxms$w>FEIk@iYm50Obj|f~N@Zg#}*#0747_fDm63Tw)mDKin4>!hg}1 zg63n7!tr8*o~D)vOFdnAXMbN&M;Cu5SJ5!vfJ*^@VwgOh^mRozLc@H0{DS4flsNxL z$m8it7{&?xBZBZ&;AHp$A#4niZFC+hLN6j_ZImj~r;py)O zy|nA-@3Uge9ouNp7<$Aj*VfN_w0f4?(AFRRYZx}KBqR6jU6zz@%B=cz9sf$S zyw8PeHMwdakwf*{aWWf`W)>f>Nh1fLlu!K4H8eUb4X>F*q^|n5klWlvJT#M-^14;s zYL0SOoK&U`r$jMnIAJ><&Bj(jur6rTI>+~l`!m?}L{+4W*6@e|z zmoRAGn_VKFY8I)?F)>W`4!FaC0$a5jLzX5A>UwCoJ&T@8zb%>sL{!i4I^(RK*I3Tl zbi%(*tH$k6@E>~WFPfZr8am!DYFP?VNnFRNl>xsOxTGEA?+GORULrVk>tK|pe+?X3 zUO;>QJa}3Lz9Ix~C@50k%^taSa#y!u{EFr-m67tu!J!f0gmNEEEC=m71ufZ!DcOL) zneg~oZnDMN`uLV&6aCr=y9~dB!>}-%=LFGWOygm8iBR5rE&}O-B1iK`m?f$2jkHWF zU=Jl|K&>-v!EbE*y{h1C;E`8B-tUVt>sP!^5?}U9X$NEYraPdYUoUtsNo_mj4%99Z zLMFyRd0_VwXT@AAcBVeMZt}H`t=W;`@GD|hH>32zXg}GRLCrz!oG*FvlIPtSv5@hB z22T|6)WJ{&;i@zJYQwHqYa@NYlVXrTw7#VQ`*+Pn`VIz*0YY%F)rS(a9%LayUEZ)! zlStK4Y$R&8h4}`cW1w;)PnEw)WyuU_*s-NY-^k?f2L5%~QQM+z=!AeNGq>0rL~Dek z+Q34s$i-rpHn+I~HJ9a{8EwuKlWFN1R0ER*7TV`D0*(n4qryu~l}nZO={txyXA>ho zfP)1N_QU!Fy4~4b(7NqD%>|*Jm;x8z%(>&#n1_XoQf?B^@9SM%eg22hXLjk@htz40 z3KAnfzMS}C8n?v{cM>7@n2PVXx?J-$m27-m^*15mo;R)~J<=jK_2AR6rx2WX@&H=m z@)A1*ypVItL1bmWtTuY~AZ92XxD}CU)M)Ke8^`9R+HX(i=_$81sP$a;_i_G^)?-YVC;W=x7KGmzNo9i-p7a%GTx0e9rDSu} zpV4LXHKYWoV6)*9$n3WcI|_NU%#v0K!|x1NfdvT#CL!+e=L>bHW|u3rp)%2emR7!% zrHR0(k((j?Vnd**5C(mmyR;c*mwus^LV~>d4VI@aMNI2#_W{MuKCz}+ffZ6TChp{@T&PsInAQLh z?_HRL_cRv+w*5?fOuXKZfm>(O7o!+r?nQiy7d&lof?#rp2KPtqfDygdOBgya$TQZ4 zI!TAs=`#Ex4VWY0cU?o|Zq{m(_+d-HTva*z zTWxQ3XBQapPzK-Zlj(Eq3kxoMZ62QITfnx;A(STV*+i=vl2Xs3Z6CJ=YLCZ9j zt6#p+df#kK_D`|BLAB%SQVH3RvJuG+FP}#x9bNPT&^GD&sJsowhH6^{EtekZD1L;B zgg`Zepa|#_h~;+3H@_c4svoL;55{qx{X8kV>C0hy!=_O(VT%=PC*KP2+9 z57o&*Q)Yu}7Mf-|lc5YZNN}D@@pOHybjR`DKbyWPMH8H09m;kIK zEFy)xpf)Q(0_~*rDj`pR;1@xLW?=piv#~;JW{@>=g&>H2t;$QkHVs%yZu$@iMwm&L zo4y_gAwM)Ti5X&ubB7%O%YLwCNlVI0R zAtg~zXpMOG>&i>tUpHaHa7tAfSPsjf9^6g8 zD_ET_`nIbl$_eM}eEvbwPb;)7yW)t_UWHPhD9mX_^eB(6%rf7O9;pk{){8}xm8Eue zuy}%0C@_?B>Ns?^8fEW%#rs{VzI(lrr^)9YN!ThqEddfQT=Y$QG_gkVRx+7j%0YKa ze{m~Gm^d5N_WPlCE%f_Rrzy!h|6O%??4C*7oL@(V&UE%xBh z_hRHWltXi!;VO-yakm*p#tww3-2A&{ey_io%tN5;g z<1Qp=xFq@8_ntLmo45iQBuAtNV%WB-)8fhICzNUgIwt=SUXjNj!9vH0X`}M&srJQb zw(PfrvA3*p8L#4gc@oUZAhN9H35BAR|JH<6-OSDS zQaUKeXX;Bjpl~Z%cNxdxVe(um>JVaxX`0utzDWq8_aJ;O`Ga_gsQ zYC&7^M0@1?f@|sc^Epw{74J7vZeE&ii@&jby%43WH>)e(uUaKS2MlmsX%IQ zY_vgwMR=*1=xz;s8ZM}bRXx7jY2O`(voTaS3ZMKq1eLgqe|c>T`}xm*is z6T1O{yvJKB&uo|jM_XZa)NFNSnGC1NVK>oRZLU{BKgo z$Sc0Z#9Of$q_Cw67!f;m6|L9oxFVP4g~T`WKcDJ#1<@P^4&}x$Ksn+%&vp{lq!%H$ znw_KZl+L)$mLI6w6P*N7^|Sq{GtARb_c{33a?{*b$@fA5KW)yhJ2^S-X^e2|#g(;t zkazKZHw$aGAZQt_A?sd@>ZNw) zz#??gh|@cKsAJDa&%dQXZ-|lnL~WfGh9{OsjZFIQ0VA$XO;d;MGOQC2?r?pUR*UZL zMzOFF)2u9Nv>i1J_7~jwn5$!o8RfODZIXN-8&yvkvp<_9V==NbqB%d5lhn7;v49T! zqB-xsJbE;ps5#F}U=v3)#C6DUav^p;OGmZE8DT{!*1j$s>Z7q%9)mqABvkWbVu>#D zpw!Pl%flY*&58>=+0|e(4<3T29lsr?a@KmvM9de+HgKnYK@Z55R51Qo-(XQP$S(ZW z7jy?;<2YKqtXNcnc1})kNLYeVH1=3c_}7J9)B^koRFx^owJ?Z5$vw|1WIXQ9PdnCj zLta4iUO;HveubE%K%L9!TlqAQoGK2`ImfwOim)ofp9ziaWLMWs&6FPp;6O|FituR? zgiVOL*A`ulM4|JgMcK4F4tAD&^91^>_Y5|Kg0?ZTL3ch+)T6NPN*1V{s&wRd2H`XV z0x`^i1Y?yR6Fd8YT=zqs($=I>y-NmQV9NYmWR-^Ge;pN7HBBlcU+Tn5L7dt7(X(iE zqQmz_wql;vb#WX?f!*2@M|pLR8}Xq@8yZ}$UnrjdJ9D`wUOI+zMjOs7e6QioioLNi z`2!Hqb3Wa#{+W~?-024@vxjAADF^KPc|z$LhFQ=R26Ln?lf3=5gi6cHyN^bE zOWX$I+|3>OhAEZ`>B>xjG#SB%;7wCn!S3epCM+2~JlDP%s1E*(QZwNdT-kCqALEwO zWsF!cLH8+(CDXGV-Vydan>Zsu?d!076#v(SU>&tP&H1?Zd>hecbNt>0)%iz#*++lx z#j!P!=;=k2E=TGf7#4opMd@qu;n_y7T$1BN5QD~>uYNgt zl`3FYUn0ef5qN@re!Eh#GlR%7@fXf&_?~S9iTUTggs}_pA}r#~-U_Q)@h_5Ms@q;X zN{=6hielr$c9wv$i`wYtsN}*qgJ=FSO`f{8Kh6omdQpqpJ9bNTlI&nX+{Jm&kb2Zj z7sXwUF-?~Y>mO^OGz!N zgGGy(;~Z*OdfcuLMfWJF=Rr>vke6bxVsjLBk#su`T5#PE!!Ka>X>343+&hkF(d7(wkYKNB`e4o2TCVG6w> zdLVkB`(`!pcDS?HFdI4eH&e-&Zra_rvU+$LLdW0Og<@I-{4Di~;(iYDM5D9d-Me3{ zS~%6N&s?*g3h1rghGYWQx#AX$j$k47if_f6W5yG%rM8F;eRK$V-MG<)pw|jje9`ie zDMQgE6rK8`im1zNNI^N24j#Klh9=HQ8TxevEh}G>qH!w1~9!oh=qdABSE*Dw^ zJqo=Umi}I4AD?KDf*Pec+D(b?1qfkz@(rmXA^eG%GHKtdf%wb>XeX{$3Zl4-)*3t% zCgNb~wVvVH6oD5ErV#!o-R3~{Jr;SM#!qjn;JaWS?h)^UV!z#6-jt+53v;V>Iv7^^ zwS?YrT((6wsQn3%&^KWtO!ilsU@c1m#*Tnf0XkSO zL99pWroN~thTUlY^)1tGP{cK>kWi6uW>FhGNQEv4E6SYI2A`I&$alGWSR&M<6l~{p z__+TMTHjMdi3Z89=4MrxJpg`}Jpmo_XeHSoyGEA)rF<{0+8OCpCYA#0bYgDWCMl8F z>~h;4$q&;&bRpPgU_#zd)+|Ht$tp^ymS|tK__Lp;3d==7IA~%P+T_yG+f49*u=$+X z|E|-KsvZQ}1$22h6j38R($TLAP*QkgQ5r5WicjG~K*#boF4M|!mbJZFH|p5bx3Bmz zzgGeCOpsl9HCa{}FNyN`LUNd)vH2068MoRCL_oGXiXR+bR=D`$^I4k}8DzWB)fe=Y zrB^>&AgPS8yv!oIABAmgFyV;819?t8W0;=!7l~5jW)YuUTC+*RVVqmHXi$^SqZay& z5Yx}9>-_LsJ6?ZLGvp_DMsw@4V@P@=jJ?XVJ;D}p&w@Y#TSt_KnDmi}jy3JGtcRjW z_4^W{8Kupj6d-Id+5VMl*~+U_Qe5dO_7P1pC3aL-AqS?7;8wf)k!%cvL13b(Mju_@ zHWtGhcVFXoUY{U*)%LKC;m^~8WZbAZm!Fe;d>piiegmL>fQSN9yGdvsVjW1xh^6RQ zyldY_ukWGX=qAc1G_pKX1li`g%MYPnWioJh@P;M6q?LIw4EkciUU7hO(#n&z^Z;QW zknNeGq$S)P+~AUqw?*s+!#`4~Q_f2oyupOANLhe0c_hZTLlx4P!&c+7OxN12YP=uFrpKr@>sR@zY4GLR$GhGMh@*h}U()QZftDxvd&^p$;Ft zoa0EL_wRo4Il=zg{sg|i=fEqI+fVfqExJgdtX(>-vTuAJFN5;er>@UM^OrC5ElDHK zWcQzol>eB5OqNA(9BHu>v6W{|?9zUBm`UP`9Zm|jbmFu)hcgD<82--Phy4jSlVFpl zu|soIToHP9u@$c|_A3Vg`JNCM((JH{H7760<$(>9)Vk-t<53TSN9u%?+o3YtofKH7 z9c(LSi#}2keAC#ek za)9YC4elctmy5Ni#eKlN=T{TflP|1&I_Jh3O8|D1eTUR@RL}o;xFjsztz8nt cctVbTpLiGT$r&YnzI-;!lvI6-E$sR$z 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 literal 0 HcmV?d00001 diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg index 6893eb1..f3c3a03 100644 --- a/frontend/public/favicon.svg +++ b/frontend/public/favicon.svg @@ -1 +1,16 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/icon-192.png b/frontend/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..e6da7f273322206710133f22fc20ff45e39514b0 GIT binary patch literal 6556 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 QCm%BOw2U-gVeG>G1$0osqW}N^ literal 0 HcmV?d00001 diff --git a/frontend/public/icon.png b/frontend/public/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..15120c5756e10e348a994a7e792452eaafc9fb5a GIT binary patch literal 13803 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 literal 0 HcmV?d00001 diff --git a/src/main.c b/src/main.c index faf21cf..ed9ca72 100644 --- a/src/main.c +++ b/src/main.c @@ -17,6 +17,8 @@ #include "assets_index_html.h" #include "assets_cache_appcache.h" +#include "assets_favicon_svg.h" +#include "assets_icon_png.h" #include "pldmgr.h" @@ -720,9 +722,10 @@ static enum MHD_Result on_request(void *cls, struct MHD_Connection *conn, } } - /* Only log significant requests, not pollers like /log */ + /* Only log significant requests, not pollers like /log or static assets */ if (strcmp(url, ROUTE_LOG) != 0 && strcmp(url, ROUTE_INDEX) != 0 && - strcmp(url, ROUTE_INDEX_HTML) != 0) { + strcmp(url, ROUTE_INDEX_HTML) != 0 && strcmp(url, "/favicon.svg") != 0 && + strcmp(url, "/icon.png") != 0) { pldmgr_log("[PLDMGR] Request: %s %s\n", method, url); } @@ -801,6 +804,18 @@ static enum MHD_Result on_request(void *cls, struct MHD_Connection *conn, MHD_RESPMEM_PERSISTENT); MHD_add_response_header(resp, "Content-Type", "text/cache-manifest"); MHD_add_response_header(resp, "Cache-Control", "no-cache, must-revalidate"); + } else if (strcmp(url, "/favicon.svg") == 0) { + resp = MHD_create_response_from_buffer(assets_favicon_svg_len, + (void *)assets_favicon_svg, + MHD_RESPMEM_PERSISTENT); + MHD_add_response_header(resp, "Content-Type", "image/svg+xml"); + MHD_add_response_header(resp, "Cache-Control", "max-age=604800"); + } else if (strcmp(url, "/icon.png") == 0) { + resp = MHD_create_response_from_buffer(assets_icon_png_len, + (void *)assets_icon_png, + MHD_RESPMEM_PERSISTENT); + MHD_add_response_header(resp, "Content-Type", "image/png"); + MHD_add_response_header(resp, "Cache-Control", "max-age=604800"); } else if (strcmp(url, ROUTE_CHECK) == 0) {