someblocks

default description
git clone https://git.awy.one/someblocks.git
Log | Files | Refs | README | LICENSE

commit a7082d30d7e243878b138866df4c4cc78e4ea45a
parent c7113fedf841c9307bf0943125de722154e2015b
Author: awy <awy@awy.one>
Date:   Wed, 12 Nov 2025 18:53:07 +0300

left click

Diffstat:
Mblocks.def.h | 6+++---
Msomeblocks.c | 411+++++++++++++++++++++++++++++++++++++++++++------------------------------------
2 files changed, 229 insertions(+), 188 deletions(-)

diff --git a/blocks.def.h b/blocks.def.h @@ -1,8 +1,8 @@ //Modify this file to change what commands output to your statusbar, and recompile using the make command. static const Block blocks[] = { - /*Icon*/ /*Command*/ /*Update Interval*/ /*Update Signal*/ - {"", "gde-sbclock day", 60, 0}, - {"", "gde-sbclock time", 60, 0}, + /*Icon*/ /*Command*/ /*Update Interval*/ /*Update Signal*/ /*Left Click*/ + {"", "date", 1, 0, "foot -e calcurse"}, + {"", "echo something", 20, 0, "notify-send wow"}, }; diff --git a/someblocks.c b/someblocks.c @@ -1,249 +1,290 @@ #define _POSIX_C_SOURCE 200809L -#include<stdlib.h> -#include<stdio.h> -#include<string.h> -#include<unistd.h> -#include<fcntl.h> -#include<errno.h> -#include<signal.h> -#include<stdbool.h> -#include<sys/socket.h> -#include<sys/un.h> +#include <errno.h> +#include <fcntl.h> +#include <signal.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/socket.h> +#include <sys/un.h> +#include <unistd.h> #ifdef __OpenBSD__ -#define SIGPLUS SIGUSR1+1 -#define SIGMINUS SIGUSR1-1 +#define SIGPLUS SIGUSR1 + 1 +#define SIGMINUS SIGUSR1 - 1 #else -#define SIGPLUS SIGRTMIN -#define SIGMINUS SIGRTMIN +#define SIGPLUS SIGRTMIN +#define SIGMINUS SIGRTMIN #endif -#define LENGTH(X) (sizeof(X) / sizeof (X[0])) -#define CMDLENGTH 50 -#define MIN( a, b ) ( ( a < b) ? a : b ) -#define STATUSLENGTH (LENGTH(blocks) * CMDLENGTH + 1) - -typedef struct { - char* icon; - char* command; - unsigned int interval; - unsigned int signal; +#define LENGTH(X) (sizeof (X) / sizeof (X[0])) +#define CMDLENGTH 150 +#define MIN(a, b) ((a < b) ? a : b) +#define STATUSLENGTH (LENGTH (blocks) * CMDLENGTH + 1) + +typedef struct +{ + char *icon; + char *command; + unsigned int interval; + unsigned int signal; + char *lclick; } Block; #ifndef __OpenBSD__ -void dummysighandler(int num); +void dummysighandler (int num); #endif -void sighandler(int num); -void getcmds(int time); -void getsigcmds(unsigned int signal); -void setupsignals(); -void sighandler(int signum); -int getstatus(char *str, char *last); -void statusloop(); -void termhandler(int signum); -void pstdout(); -void psomebar(); +void sighandler (int num); +void getcmds (int time); +void getsigcmds (unsigned int signal); +void setupsignals (); +void sighandler (int signum); +int getstatus (char *str, char *last); +void statusloop (); +void termhandler (int signum); +void pstdout (); +void psomebar (); static void (*writestatus) () = psomebar; #include "blocks.h" -static char statusbar[LENGTH(blocks)][CMDLENGTH] = {0}; +static char statusbar[LENGTH (blocks)][CMDLENGTH] = { 0 }; static char statusstr[2][STATUSLENGTH]; static int statusContinue = 1; static int returnStatus = 0; static char somebarPath[128]; static int somebarFd = -1; -//opens process *cmd and stores output in *output -void getcmd(const Block *block, char *output) +// opens process *cmd and stores output in *output +void +getcmd (const Block *block, char *output) { - strcpy(output, block->icon); - FILE *cmdf = popen(block->command, "r"); - if (!cmdf) - return; - int i = strlen(block->icon); - fgets(output+i, CMDLENGTH-i-delimLen, cmdf); - i = strlen(output); - if (i == 0) { - //return if block and command output are both empty - pclose(cmdf); - return; - } - if (delim[0] != '\0') { - //only chop off newline if one is present at the end - i = output[i-1] == '\n' ? i-1 : i; - strncpy(output+i, delim, delimLen); - } - else - output[i++] = '\0'; - pclose(cmdf); + char tmp[CMDLENGTH] = { 0 }; + FILE *cmdf = popen (block->command, "r"); + if (!cmdf) + return; + fgets (tmp, sizeof (tmp) - delimLen, cmdf); + pclose (cmdf); + + int len = strlen (tmp); + if (len == 0) + return; + if (tmp[len - 1] == '\n') + tmp[len - 1] = '\0'; + + // Add your clickable markup here + if (block->lclick) + snprintf (output, CMDLENGTH, "^lm(sh -c '%s')%s%s^lm()", block->lclick, + block->icon ? block->icon : "", tmp); + else + snprintf (output, CMDLENGTH, "%s%s", block->icon ? block->icon : "", tmp); + + // Add delimiter + strncat (output, delim, delimLen); } -void getcmds(int time) +void +getcmds (int time) { - const Block* current; - for (unsigned int i = 0; i < LENGTH(blocks); i++) { - current = blocks + i; - if ((current->interval != 0 && time % current->interval == 0) || time == -1) - getcmd(current,statusbar[i]); - } + const Block *current; + for (unsigned int i = 0; i < LENGTH (blocks); i++) + { + current = blocks + i; + if ((current->interval != 0 && time % current->interval == 0) + || time == -1) + getcmd (current, statusbar[i]); + } } -void getsigcmds(unsigned int signal) +void +getsigcmds (unsigned int signal) { - const Block *current; - for (unsigned int i = 0; i < LENGTH(blocks); i++) { - current = blocks + i; - if (current->signal == signal) - getcmd(current,statusbar[i]); - } + const Block *current; + for (unsigned int i = 0; i < LENGTH (blocks); i++) + { + current = blocks + i; + if (current->signal == signal) + getcmd (current, statusbar[i]); + } } -void setupsignals() +void +setupsignals () { - struct sigaction sa = {0}; + struct sigaction sa = { 0 }; #ifndef __OpenBSD__ - /* initialize all real time signals with dummy handler */ - sa.sa_handler = dummysighandler; - for (int i = SIGRTMIN; i <= SIGRTMAX; i++) - sigaction(i, &sa, NULL); + /* initialize all real time signals with dummy handler */ + sa.sa_handler = dummysighandler; + for (int i = SIGRTMIN; i <= SIGRTMAX; i++) + sigaction (i, &sa, NULL); #endif - sa.sa_handler = sighandler; - for (unsigned int i = 0; i < LENGTH(blocks); i++) { - if (blocks[i].signal > 0) - sigaction(SIGMINUS+blocks[i].signal, &sa, NULL); - } - + sa.sa_handler = sighandler; + for (unsigned int i = 0; i < LENGTH (blocks); i++) + { + if (blocks[i].signal > 0) + sigaction (SIGMINUS + blocks[i].signal, &sa, NULL); + } } -int getstatus(char *str, char *last) +int +getstatus (char *str, char *last) { - strcpy(last, str); - str[0] = '\0'; - for (unsigned int i = 0; i < LENGTH(blocks); i++) - strcat(str, statusbar[i]); - str[strlen(str)-strlen(delim)] = '\0'; - return strcmp(str, last);//0 if they are the same + strcpy (last, str); + str[0] = '\0'; + for (unsigned int i = 0; i < LENGTH (blocks); i++) + strcat (str, statusbar[i]); + str[strlen (str) - strlen (delim)] = '\0'; + return strcmp (str, last); // 0 if they are the same } -void pstdout() +void +pstdout () { - if (!getstatus(statusstr[0], statusstr[1]))//Only write out if text has changed. - return; - printf("%s\n",statusstr[0]); - fflush(stdout); + if (!getstatus (statusstr[0], + statusstr[1])) // Only write out if text has changed. + return; + printf ("%s\n", statusstr[0]); + fflush (stdout); } - -void psomebar() +void +psomebar () { - if (!getstatus(statusstr[0], statusstr[1]))//Only write out if text has changed. - return; - if (somebarFd < 0) { - somebarFd = open(somebarPath, O_WRONLY|O_CLOEXEC); - if (somebarFd < 0 && errno == ENOENT) { - // assume somebar is not ready yet - sleep(1); - somebarFd = open(somebarPath, O_WRONLY|O_CLOEXEC); - } - if (somebarFd < 0) { - perror("open"); - return; - } - } - dprintf(somebarFd, "status %s\n", statusstr[0]); + if (!getstatus (statusstr[0], + statusstr[1])) // Only write out if text has changed. + return; + if (somebarFd < 0) + { + somebarFd = open (somebarPath, O_WRONLY | O_CLOEXEC); + if (somebarFd < 0 && errno == ENOENT) + { + // assume somebar is not ready yet + sleep (1); + somebarFd = open (somebarPath, O_WRONLY | O_CLOEXEC); + } + if (somebarFd < 0) + { + perror ("open"); + return; + } + } + dprintf (somebarFd, "status %s\n", statusstr[0]); } -void pdwlb() +void +pdwlb () { - int dwlbSock = -1; - struct sockaddr_un sockaddr; - - if (!getstatus(statusstr[0], statusstr[1]))//Only write out if text has changed. - return; - - if ((dwlbSock = socket(AF_UNIX, SOCK_STREAM, 1)) == -1) { - perror("socket"); - return; - } - snprintf(sockaddr.sun_path, sizeof(sockaddr.sun_path), "%s", somebarPath); - sockaddr.sun_family = AF_UNIX; - - /* Try a couple times dwlb may not be ready */ - for (int i = 0; i < 5; i++) { - if (connect(dwlbSock, (struct sockaddr *)&sockaddr, sizeof(struct sockaddr_un)) == -1) { - sleep(1); - continue; - } - break; - } - dprintf(dwlbSock, "all status %s", statusstr[0]); - close(dwlbSock); + int dwlbSock = -1; + struct sockaddr_un sockaddr; + + if (!getstatus (statusstr[0], + statusstr[1])) // Only write out if text has changed. + return; + + if ((dwlbSock = socket (AF_UNIX, SOCK_STREAM, 1)) == -1) + { + perror ("socket"); + return; + } + snprintf (sockaddr.sun_path, sizeof (sockaddr.sun_path), "%s", somebarPath); + sockaddr.sun_family = AF_UNIX; + + /* Try a couple times dwlb may not be ready */ + for (int i = 0; i < 5; i++) + { + if (connect (dwlbSock, (struct sockaddr *)&sockaddr, + sizeof (struct sockaddr_un)) + == -1) + { + sleep (1); + continue; + } + break; + } + dprintf (dwlbSock, "all status %s", statusstr[0]); + close (dwlbSock); } -void statusloop() +void +statusloop () { - setupsignals(); - int i = 0; - getcmds(-1); - while (1) { - getcmds(i++); - writestatus(); - if (!statusContinue) - break; - sleep(1.0); - } + setupsignals (); + int i = 0; + getcmds (-1); + while (1) + { + getcmds (i++); + writestatus (); + if (!statusContinue) + break; + sleep (1.0); + } } #ifndef __OpenBSD__ /* this signal handler should do nothing */ -void dummysighandler(int signum) +void +dummysighandler (int signum) { - return; + return; } #endif -void sighandler(int signum) +void +sighandler (int signum) { - getsigcmds(signum-SIGPLUS); - writestatus(); + getsigcmds (signum - SIGPLUS); + writestatus (); } -void termhandler(int signum) +void +termhandler (int signum) { - statusContinue = 0; + statusContinue = 0; } -void sigpipehandler(int signum) +void +sigpipehandler (int signum) { - close(somebarFd); - somebarFd = -1; + close (somebarFd); + somebarFd = -1; } -int main(int argc, char** argv) +int +main (int argc, char **argv) { - for (int i = 0; i < argc; i++) {//Handle command line arguments - if (!strcmp("-d",argv[i])) { - strncpy(delim, argv[++i], delimLen); - } else if (!strcmp("-p",argv[i])) { - writestatus = pstdout; - } else if (!strcmp("-b",argv[i])) { - writestatus = pdwlb; - strcpy(somebarPath, getenv("XDG_RUNTIME_DIR")); - strcat(somebarPath, "/dwlb/dwlb-0"); - } else if (!strcmp("-s",argv[i])) { - strcpy(somebarPath, argv[++i]); - } - } - - if (!strlen(somebarPath)) { - strcpy(somebarPath, getenv("XDG_RUNTIME_DIR")); - strcat(somebarPath, "/somebar-0"); - } - - delimLen = MIN(delimLen, strlen(delim)); - delim[delimLen++] = '\0'; - signal(SIGTERM, termhandler); - signal(SIGINT, termhandler); - signal(SIGPIPE, sigpipehandler); - statusloop(); - return 0; + for (int i = 0; i < argc; i++) + { // Handle command line arguments + if (!strcmp ("-d", argv[i])) + { + strncpy (delim, argv[++i], delimLen); + } + else if (!strcmp ("-p", argv[i])) + { + writestatus = pstdout; + } + else if (!strcmp ("-b", argv[i])) + { + writestatus = pdwlb; + strcpy (somebarPath, getenv ("XDG_RUNTIME_DIR")); + strcat (somebarPath, "/dwlb/dwlb-0"); + } + else if (!strcmp ("-s", argv[i])) + { + strcpy (somebarPath, argv[++i]); + } + } + + if (!strlen (somebarPath)) + { + strcpy (somebarPath, getenv ("XDG_RUNTIME_DIR")); + strcat (somebarPath, "/somebar-0"); + } + + delimLen = MIN (delimLen, strlen (delim)); + delim[delimLen++] = '\0'; + signal (SIGTERM, termhandler); + signal (SIGINT, termhandler); + signal (SIGPIPE, sigpipehandler); + statusloop (); + return 0; }