From 48668eaba46d65279e628f1c2c199db730203a99 Mon Sep 17 00:00:00 2001 From: coast Date: Thu, 29 May 2025 22:52:15 +0200 Subject: [PATCH] Upload files to ".suckless/slstatus/components" --- .suckless/slstatus/components/keymap.c | 86 +++++++++++++++ .suckless/slstatus/components/keymap.o | Bin 0 -> 4016 bytes .suckless/slstatus/components/load_avg.c | 19 ++++ .suckless/slstatus/components/load_avg.o | Bin 0 -> 1864 bytes .suckless/slstatus/components/netspeeds.c | 129 ++++++++++++++++++++++ 5 files changed, 234 insertions(+) create mode 100644 .suckless/slstatus/components/keymap.c create mode 100644 .suckless/slstatus/components/keymap.o create mode 100644 .suckless/slstatus/components/load_avg.c create mode 100644 .suckless/slstatus/components/load_avg.o create mode 100644 .suckless/slstatus/components/netspeeds.c diff --git a/.suckless/slstatus/components/keymap.c b/.suckless/slstatus/components/keymap.c new file mode 100644 index 0000000..22224f3 --- /dev/null +++ b/.suckless/slstatus/components/keymap.c @@ -0,0 +1,86 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include +#include +#include +#include + +#include "../slstatus.h" +#include "../util.h" + +static int +valid_layout_or_variant(char *sym) +{ + size_t i; + /* invalid symbols from xkb rules config */ + static const char *invalid[] = { "evdev", "inet", "pc", "base" }; + + for (i = 0; i < LEN(invalid); i++) + if (!strncmp(sym, invalid[i], strlen(invalid[i]))) + return 0; + + return 1; +} + +static char * +get_layout(char *syms, int grp_num) +{ + char *tok, *layout; + int grp; + + layout = NULL; + tok = strtok(syms, "+:_"); + for (grp = 0; tok && grp <= grp_num; tok = strtok(NULL, "+:_")) { + if (!valid_layout_or_variant(tok)) { + continue; + } else if (strlen(tok) == 1 && isdigit(tok[0])) { + /* ignore :2, :3, :4 (additional layout groups) */ + continue; + } + layout = tok; + grp++; + } + + return layout; +} + +const char * +keymap(const char *unused) +{ + Display *dpy; + XkbDescRec *desc; + XkbStateRec state; + char *symbols; + const char *layout; + + layout = NULL; + + if (!(dpy = XOpenDisplay(NULL))) { + warn("XOpenDisplay: Failed to open display"); + return NULL; + } + if (!(desc = XkbAllocKeyboard())) { + warn("XkbAllocKeyboard: Failed to allocate keyboard"); + goto end; + } + if (XkbGetNames(dpy, XkbSymbolsNameMask, desc)) { + warn("XkbGetNames: Failed to retrieve key symbols"); + goto end; + } + if (XkbGetState(dpy, XkbUseCoreKbd, &state)) { + warn("XkbGetState: Failed to retrieve keyboard state"); + goto end; + } + if (!(symbols = XGetAtomName(dpy, desc->names->symbols))) { + warn("XGetAtomName: Failed to get atom name"); + goto end; + } + layout = bprintf("%s", get_layout(symbols, state.group)); + XFree(symbols); +end: + XkbFreeKeyboard(desc, XkbSymbolsNameMask, 1); + if (XCloseDisplay(dpy)) + warn("XCloseDisplay: Failed to close display"); + + return layout; +} diff --git a/.suckless/slstatus/components/keymap.o b/.suckless/slstatus/components/keymap.o new file mode 100644 index 0000000000000000000000000000000000000000..d565c9a015393abd11347c930643464e8c40e098 GIT binary patch literal 4016 zcmb`JUuYaf9LMMKr-_xg ziHQwXOe-ws)nf6%H+>L&5ETRk!H_ns2qIMRK`2svYe^yaVqe7b_nV!$Ox9Zj@dvvz z^O^7OH?uQ4zul9g@v){rfJh6FC&@-jQbInvZKFQKt3xD2I*D<_c+QwK4o^Geez#_f0cIG3>=>RecE;cn}^`}7Li zUU!XNah+ShnL6vVdN|y>j1yKP8O}u*@5k}VXaqHtQb_F`cfNt?u+KZch=qG;bpYoS zcW#bGYfdcO;VPX~diqM|sn?+^wl@>*SUf?iTTw_WQR>9Q-PE~B9TpaWD^R1(RhT(< zhv);e0;+hml{+n+Z;$UiKYIZ*Zv5J}v-57PbGeIF$RDvofp%tz+0@r<_4;hBRuc~& zcm5Jf2eYNlD))~&>tEq^@fC9;I&#@&TdDKQT6cZzc=y_xQM)+qTwOayE3xokhVE?P z8^&5)@1={BI@g{*YP?_^HI5m{)xQ8j zS4=-`Eu@O3ol%7*c9_i4W<)2d4_NG=nYYTS(6*SJwdS}`D=*|z#avlvCm00q)AA9u zGD=7S0voKD$Ka~|xWzORxK@A;vU6XO?10!KxnkLB@N8-1^@p?OGS(c)7A!_eX_7L_ z7H;al*@2OfeOljvgOd+y(E&ZGN45S)|3GASKY!r}zTp~N_=13lG?BmxGTcnGfTw+j zi%H;>XGvf_6zJ(_Yd;I(IPiN#-*4zV91OkHG#uxs1sx8C8zBgNqVC0Q0MsRSc zEf#z&(0nNn9E=4cMz9YgAO)AiHY?6xk+TX|6w>(;NhZ^5p=2dfNl23KA5rw`{HGLshZ3ix=rNbdd7e=CJqoWXyhq{hC>)Sd|v!> zlKf*uukQPI3cpX$LzNqLH^bE=bnoNL{5_yb{P zis*Q3c{wd>wv{t=X3aCAXG~@iJyk9f-7aDSOd`Cm+fD7Xe2Utl-vkXsP>eG*Nsm31s} z@A2Ipf=ji_m<+%!i$%me$8qF7$@T9Q9QRVS2RAMLMvvIOI(P(X81ujSN5L0k_QR!` z9DloKK-rY#C^%u=JN}>mni>@9-u4i%M(g(;CMmEN`Q1G;xJTagO8~?1BSI&Ogcx7u z70KniWobf(tV<1+%= z>&KHh^vU-O-#^Tc(qHmMV}p!@FesROe}hoR%j=Kdo<>Xct2j_MpkFob`r)^ORx literal 0 HcmV?d00001 diff --git a/.suckless/slstatus/components/load_avg.c b/.suckless/slstatus/components/load_avg.c new file mode 100644 index 0000000..f278a40 --- /dev/null +++ b/.suckless/slstatus/components/load_avg.c @@ -0,0 +1,19 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include + +#include "../slstatus.h" +#include "../util.h" + +const char * +load_avg(const char *unused) +{ + double avgs[3]; + + if (getloadavg(avgs, 3) < 0) { + warn("getloadavg: Failed to obtain load average"); + return NULL; + } + + return bprintf("%.2f %.2f %.2f", avgs[0], avgs[1], avgs[2]); +} diff --git a/.suckless/slstatus/components/load_avg.o b/.suckless/slstatus/components/load_avg.o new file mode 100644 index 0000000000000000000000000000000000000000..3be39fcdf04358fb32782d336d478c9fba2c01d2 GIT binary patch literal 1864 zcmbW1-D(q25XWbe)<&!~mLi1;-HTM>N7rnys6{2v+OAMUq=H_BO|to*$!^`OwN=53 z;zcP!AHgROpFje7;hR*@3-wy4^WU7=q}vpv11EFlHy`KZ%-Qqy{>oB9(?~?4d(^Xp z5`9bd=7n%tpfNg2*7ncrXZR}C?wy$|Ppq9cnMrGB|2v}Ib+*RMj`jX7jF6a}AJc!% zrB^d){$0tWl$#z2W$F&7m11U)7@@qUD8!c|E)Q@X2M}oHIOJphIK?gx%lXh8rYnarU0{2>uTHopX45>yHr~D8*WggVzC|A<+WnDzE-SqgK3KEL(q#;JpLYZB@4)s;DPHW zd=`)e@gqEhF9Nb49zNlZ09nA$B;gJq3pjc%T<19ibuc0^+FPx_E|Jj={I0Ic%y*i$ z5jdLx85KLQ$tbnkWcVHog!64AqwKX>j>{pg7dQrA!P)R6lwEUQ80)^b?)bqLr=p-! zFIIiKB^!-4atEvl)I4dv$+@VR=g}{+{_TFqb6H<>L9tvcZeQ8*CWu?|L_bjZ;uoEi z00BzJ@iXSQ?}zRr+bIT3O8Fj(;Z;q{B>qh`GKjOeNQLl%raQDq~7_j6FbrQqu*vO9_A{{uYM!N&jq literal 0 HcmV?d00001 diff --git a/.suckless/slstatus/components/netspeeds.c b/.suckless/slstatus/components/netspeeds.c new file mode 100644 index 0000000..cde6fa9 --- /dev/null +++ b/.suckless/slstatus/components/netspeeds.c @@ -0,0 +1,129 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include + +#include "../slstatus.h" +#include "../util.h" + +#if defined(__linux__) + #include + + #define NET_RX_BYTES "/sys/class/net/%s/statistics/rx_bytes" + #define NET_TX_BYTES "/sys/class/net/%s/statistics/tx_bytes" + + const char * + netspeed_rx(const char *interface) + { + uintmax_t oldrxbytes; + static uintmax_t rxbytes; + extern const unsigned int interval; + char path[PATH_MAX]; + + oldrxbytes = rxbytes; + + if (esnprintf(path, sizeof(path), NET_RX_BYTES, interface) < 0) + return NULL; + if (pscanf(path, "%ju", &rxbytes) != 1) + return NULL; + if (oldrxbytes == 0) + return NULL; + + return fmt_human((rxbytes - oldrxbytes) * 1000 / interval, + 1024); + } + + const char * + netspeed_tx(const char *interface) + { + uintmax_t oldtxbytes; + static uintmax_t txbytes; + extern const unsigned int interval; + char path[PATH_MAX]; + + oldtxbytes = txbytes; + + if (esnprintf(path, sizeof(path), NET_TX_BYTES, interface) < 0) + return NULL; + if (pscanf(path, "%ju", &txbytes) != 1) + return NULL; + if (oldtxbytes == 0) + return NULL; + + return fmt_human((txbytes - oldtxbytes) * 1000 / interval, + 1024); + } +#elif defined(__OpenBSD__) | defined(__FreeBSD__) + #include + #include + #include + #include + #include + + const char * + netspeed_rx(const char *interface) + { + struct ifaddrs *ifal, *ifa; + struct if_data *ifd; + uintmax_t oldrxbytes; + static uintmax_t rxbytes; + extern const unsigned int interval; + int if_ok = 0; + + oldrxbytes = rxbytes; + + if (getifaddrs(&ifal) < 0) { + warn("getifaddrs failed"); + return NULL; + } + rxbytes = 0; + for (ifa = ifal; ifa; ifa = ifa->ifa_next) + if (!strcmp(ifa->ifa_name, interface) && + (ifd = (struct if_data *)ifa->ifa_data)) + rxbytes += ifd->ifi_ibytes, if_ok = 1; + + freeifaddrs(ifal); + if (!if_ok) { + warn("reading 'if_data' failed"); + return NULL; + } + if (oldrxbytes == 0) + return NULL; + + return fmt_human((rxbytes - oldrxbytes) * 1000 / interval, + 1024); + } + + const char * + netspeed_tx(const char *interface) + { + struct ifaddrs *ifal, *ifa; + struct if_data *ifd; + uintmax_t oldtxbytes; + static uintmax_t txbytes; + extern const unsigned int interval; + int if_ok = 0; + + oldtxbytes = txbytes; + + if (getifaddrs(&ifal) < 0) { + warn("getifaddrs failed"); + return NULL; + } + txbytes = 0; + for (ifa = ifal; ifa; ifa = ifa->ifa_next) + if (!strcmp(ifa->ifa_name, interface) && + (ifd = (struct if_data *)ifa->ifa_data)) + txbytes += ifd->ifi_obytes, if_ok = 1; + + freeifaddrs(ifal); + if (!if_ok) { + warn("reading 'if_data' failed"); + return NULL; + } + if (oldtxbytes == 0) + return NULL; + + return fmt_human((txbytes - oldtxbytes) * 1000 / interval, + 1024); + } +#endif