dotfiles

My dotfiles for Arch Linux
git clone git://git.janispagel.de/dotfiles.git
Log | Files | Refs | README

commit 15341c1c866122e21c06ecdeef461661e7884a97
parent f8f9b9c8195dc93105f700c28623a0194d92e058
Author: Janis Pagel <janis.pagel@ims.uni-stuttgart.de>
Date:   Fri, 11 Dec 2020 21:30:24 +0100

Add spt config and modified source code

Diffstat:
Aspt/.local/build/spt/config.h | 21+++++++++++++++++++++
Aspt/.local/build/spt/spt.c | 173+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 194 insertions(+), 0 deletions(-)

diff --git a/spt/.local/build/spt/config.h b/spt/.local/build/spt/config.h @@ -0,0 +1,21 @@ +/* See LICENSE file for copyright and license details. */ + +/* Notification, remove DNOTIFY in config.mk if you don't want it */ +static char *notifycmd = "notify-send"; /* Uses given command if not compiled by DNOTIFY */ +static char *notifyext = "aplay -q ~/.local/foghorn.wav"; /* Notify with extra command (eg. play an alarm) */ + +/* + * This is the array which defines all the timer that will be used. + * It will be repeated after all of it is executed. + */ +static Timers timers[] = { + /* timer(s) comment */ + { 1500, "💻 (1/4) Time to start working!"}, + { 300, "🫖 Time to start resting!"}, + { 1500, "💻 (2/4) Time to start working!"}, + { 300, "🫖 Time to start resting!"}, + { 1500, "💻 (3/4) Time to start working!"}, + { 300, "🫖 Time to start resting!"}, + { 1500, "💻 (4/4) Time to start working!"}, + { 900, "😴 Time to take some nap!"}, +}; diff --git a/spt/.local/build/spt/spt.c b/spt/.local/build/spt/spt.c @@ -0,0 +1,173 @@ +/* See LICENSE file for copyright and license details. */ +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <signal.h> +#include <time.h> +#ifdef NOTIFY +#include <libnotify/notify.h> +#endif /* NOTIFY */ + +#include "arg.h" + +char *argv0; + +/* macros */ +#define LEN(a) (sizeof(a) / sizeof(a[0])) + + +typedef struct { + unsigned int tmr; + char *cmt; +} Timers; + +#include "config.h" + +volatile static sig_atomic_t display, suspend; + +/* function declarations */ +static void die(const char *errstr, ...); +static void spawn(char *argv[]); +static void notify_send(char *cmt); +static void display_state(int remaining, int suspend); +static void toggle_display(int sigint); +static void toggle_suspend(int sigint); +static void usage(void); + +/* functions implementations */ +void +die(const char *errstr, ...) +{ + va_list ap; + + va_start(ap, errstr); + vfprintf(stderr, errstr, ap); + va_end(ap); + exit(1); +} + +void +spawn(char *argv[]) +{ + if (fork() == 0) { + setsid(); + execvp(argv[0], argv); + die("spt: execvp %s\n", argv[0]); + perror(" failed"); + exit(0); + } +} + +void +notify_send(char *cmt) +{ + if (strcmp(notifycmd, "")) + spawn((char *[]) { notifycmd, "spt", cmt, NULL }); +#ifdef NOTIFY + else { + notify_init("spt"); + NotifyNotification *n = notify_notification_new("spt", cmt, \ + "dialog-information"); + notify_notification_show(n, NULL); + g_object_unref(G_OBJECT(n)); + notify_uninit(); + } +#endif /* NOTIFY */ + + if (strcmp(notifyext, "")) /* extra commands to use */ + spawn((char *[]) { "/bin/sh", "-c", notifyext, NULL }); +} + +void +display_state(int remaining, int suspend) +{ + char buf[29]; + + snprintf(buf, 29, "Remaining: %02d:%02d %s", + remaining / 60, + remaining % 60, + (suspend) ? "◼" : "▶"); + + notify_send(buf); + display = 0; +} + +void +toggle_display(int sigint) +{ + display = 1; +} + +void +toggle_suspend(int sigint) +{ + suspend ^= 1; +} + +void +usage(void) +{ + die("usage: %s [-e notifyext] [-n notifycmd] [-v]\n", argv0); +} + +int +main(int argc, char *argv[]) +{ + struct timespec remaining; + struct sigaction sa; + sigset_t emptymask; + int i; + + ARGBEGIN { + case 'e': + notifyext = EARGF(usage()); + break; + case 'n': + notifycmd = EARGF(usage()); + break; + case 'v': + die("spt " VERSION " © 2015-2020 spt engineers, " + "see LICENSE for details\n"); + default: + usage(); + } ARGEND; + + /* add SIGUSR1 handler: remaining_time */ + sa.sa_handler = toggle_display; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + + if (sigaction(SIGUSR1, &sa, NULL) == -1) + die("cannot associate SIGUSR1 to handler\n"); + + /* add SIGUSR2 handler: toggle */ + sa.sa_handler = toggle_suspend; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + + if (sigaction(SIGUSR2, &sa, NULL) == -1) + die("cannot associate SIGUSR2 to handler\n"); + + sigemptyset(&emptymask); + + for (i = 0; ; i = (i + 1) % LEN(timers)) { + printf("%s\n", timers[i].cmt); + notify_send(timers[i].cmt); + remaining.tv_sec = timers[i].tmr; + remaining.tv_nsec = 0; + while (remaining.tv_sec) { + if (display) + display_state(remaining.tv_sec, suspend); + + if (suspend) + sigsuspend(&emptymask); + else + if (nanosleep(&remaining, &remaining) == 0) + remaining.tv_sec = remaining.tv_nsec = 0; + } + } + + return 0; +}