commit a7082d30d7e243878b138866df4c4cc78e4ea45a
parent c7113fedf841c9307bf0943125de722154e2015b
Author: awy <awy@awy.one>
Date: Wed, 12 Nov 2025 18:53:07 +0300
left click
Diffstat:
| M | blocks.def.h | | | 6 | +++--- |
| M | someblocks.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;
}