remove historical cruft and exchange homegrown statusbar to polybar

the statusbar program is being reworked. until then, we'll just use polybar.
This commit is contained in:
randomuser 2023-07-10 21:04:29 -05:00
parent 16c071c9a3
commit 4b2b07b960
20 changed files with 24 additions and 1455 deletions

View File

@ -1,75 +0,0 @@
include config.mk
all: mkc
install: man sh c all
.PHONY: man sh mkc c
man:
mkdir -p $(DESTDIR)$(PREFIX)/man/man1
cp -f man/* $(DESTDIR)$(PREFIX)/man/man1
sh:
mkdir -p $(DESTDIR)$(PREFIX)/bin
cp -f sh/paste $(DESTDIR)$(PREFIX)/bin
cp -f sh/snapcad $(DESTDIR)$(PREFIX)/bin
cp -f sh/sfeed_yt_add $(DESTDIR)$(PREFIX)/bin
cp -f sh/disp $(DESTDIR)$(PREFIX)/bin
cp -f sh/wallpaper $(DESTDIR)$(PREFIX)/bin
cp -f sh/connect $(DESTDIR)$(PREFIX)/bin
cp -f sh/nws $(DESTDIR)$(PREFIX)/bin
cp -f sh/vol $(DESTDIR)$(PREFIX)/bin
cp -f sh/pco $(DESTDIR)$(PREFIX)/bin
cp -f sh/git-survey $(DESTDIR)$(PREFIX)/bin
cp -f sh/vim-swap-handler $(DESTDIR)$(PREFIX)/bin
cp -f sh/status $(DESTDIR)$(PREFIX)/bin
cp -f sh/statusbar $(DESTDIR)$(PREFIX)/bin
cp -f sh/cfg $(DESTDIR)$(PREFIX)/bin
cp -f sh/fire $(DESTDIR)$(PREFIX)/bin
cp -f sh/pash-dmenu $(DESTDIR)$(PREFIX)/bin
cp -f sh/pash-dmenu-backend $(DESTDIR)$(PREFIX)/bin
cp -f sh/tmenu $(DESTDIR)$(PREFIX)/bin
cp -f sh/tmenu-backend $(DESTDIR)$(PREFIX)/bin
cp -f sh/tmenu_run $(DESTDIR)$(PREFIX)/bin
cp -f sh/ss $(DESTDIR)$(PREFIX)/bin
cp -f sh/net $(DESTDIR)$(PREFIX)/bin
cp -f sh/bspwm-toggle-gaps $(DESTDIR)$(PREFIX)/bin
cp -f sh/machine $(DESTDIR)$(PREFIX)/bin
cp -f sh/brightness $(DESTDIR)$(PREFIX)/bin
cp -f sh/git-credential-gitpass $(DESTDIR)$(PREFIX)/bin
cp -f sh/capture $(DESTDIR)$(PREFIX)/bin
cp -f sh/toggle-contingency-mode $(DESTDIR)$(PREFIX)/bin
cp -f sh/keyboard $(DESTDIR)$(PREFIX)/bin
ln -sf $(DESTDIR)$(PREFIX)/bin/tmenu_run $(DESTDIR)$(PREFIX)/bin/regenerate
cp -f sh/discord $(DESTDIR)$(PREFIX)/bin
check:
shellcheck sh/*
mkc: c/scream c/timer c/boid c/anaconda c/colors c/xgetnewwindow c/tmessage
c/boid:
cc c/boid.c -o c/boid -lm -lX11
c/anaconda:
cc c/anaconda.c -o c/anaconda -lm -lX11
c/xgetnewwindow:
cc c/xgetnewwindow.c -o c/xgetnewwindow -lX11
c:
cp -f c/scream $(DESTDIR)$(PREFIX)/bin
cp -f c/timer $(DESTDIR)$(PREFIX)/bin
cp -f c/boid $(DESTDIR)$(PREFIX)/bin
cp -f c/anaconda $(DESTDIR)$(PREFIX)/bin
cp -f c/colors $(DESTDIR)$(PREFIX)/bin
cp -f c/xgetnewwindow $(DESTDIR)$(PREFIX)/bin
cp -f c/tmessage $(DESTDIR)$(PREFIX)/bin
clean:
rm -f c/scream
rm -f c/timer
rm -f c/boid
rm -f c/anaconda
rm -f c/colors
rm -f c/simplestatus
rm -f c/xgetnewwindow
rm -f c/tmessage

View File

@ -1,247 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <X11/Xlib.h>
typedef struct point {
double x;
double y;
struct point *next;
} point;
typedef struct anaconda {
int score;
double rot;
struct point *chain;
} anaconda;
Display *d;
Window w;
XEvent e;
int s;
GC gc;
void xinit(void) {
d = XOpenDisplay(NULL);
s = DefaultScreen(d);
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1,
BlackPixel(d, s), WhitePixel(d, s));
XSelectInput(d, w, ExposureMask | KeyPressMask | PointerMotionMask);
XMapWindow(d, w);
gc = XCreateGC(d, w, 0, NULL);
}
/* thanks to
* https://stackoverflow.com/questions/3838329/how-can-i-check-if-two-segments-intersect/9997374#9997374
* for functions ccw and intersect
*/
int ccw(point *a, point *b, point *c) {
return (c->y - a->y) * (b->x - a->x) >
(b->y - a->y) * (c->x - a->x);
}
int intersect(point *a, point *b, point *c, point *d) {
return (ccw(a, c, d) != ccw(b, c, d)) && (ccw(a, b, c) != ccw(a, b, d));
}
int randrange(int b, int s) {
return rand() % (b - s + 1) + s;
}
int eucliddist(point *a, point *b) {
return sqrt(pow(a->x - b->x, 2) + pow(a->y - b->y, 2));
}
point *mkPoint(double x, double y) {
point *ret = malloc(sizeof *ret);
ret->x = x;
ret->y = y;
ret->next = NULL;
return ret;
}
point *rotate(point *p, double rot) {
double rad = rot * M_PI/180;
return mkPoint(
p->x * cos(rad) - p->y * sin(rad),
p->x * sin(rad) + p->y * cos(rad)
);
}
void appendPoint(point *dest, point *origin) {
while(dest->next) dest = dest->next;
dest->next = origin;
}
int updateAnaconda(anaconda *anaconda, point *basepoint, int w, int h, point *apple) {
point *temp, *new, *ptr;
new = anaconda->chain;
temp = rotate(basepoint, anaconda->rot);
new = mkPoint(
new->x + temp->x,
new->y + temp->y
);
new->next = anaconda->chain;
anaconda->chain = new;
free(temp);
if(eucliddist(new, apple) <= 30) {
anaconda->score += 30;
apple->x = randrange(20, w / 2);
apple->y = randrange(20, h / 2);
} else {
ptr = new;
while(1) {
if(ptr->next) {
if(ptr->next->next) ptr = ptr->next;
else break;
} else break;
}
free(ptr->next);
ptr->next = NULL;
}
ptr = anaconda->chain;
for(int i = 0; i < 3; i++) {
if(ptr->next) ptr = ptr->next;
else return 1; /* we're fine, the snake is too short to intersect itself */
}
while(ptr->next) {
if(intersect(new, new->next, ptr, ptr->next)) return 0;
ptr = ptr->next;
}
if(
new->x >= w || new->x <= 0 ||
new->y >= h || new->y <= 0
) return 0;
if(eucliddist(new, apple) <= 30) {
anaconda->score += 30;
apple->x = randrange(20, w / 2);
apple->y = randrange(20, h / 2);
}
return 1;
}
void freeAnaconda(anaconda *anaconda) {
point *current = anaconda->chain;
point *next = NULL;
for(;;) {
if(!current) break;
next = current->next;
free(current);
current = next;
}
free(anaconda);
return;
}
point *generateChain(int length) {
point *ret = mkPoint(100, 100);
point *head = ret;
for(int i = 1; i < length - 1; i++) {
ret->next = mkPoint(
10 * i + 100,
5 * i + 100
);
ret = ret->next;
}
return head;
}
anaconda *mkAnaconda(point *point, double rot) {
anaconda *ret = malloc(sizeof *ret);
ret->chain = point;
ret->rot = rot;
ret->score = 0;
return ret;
}
int main(void) {
anaconda *anaconda = mkAnaconda(generateChain(30), 0);
point *basepoint = mkPoint(10, 0);
char scorebuffer[30];
xinit();
srand(time(0));
int width = DisplayWidth(d, s);
int height = DisplayHeight(d, s);
point *apple = mkPoint(randrange(20, width / 2 - 20), randrange(20, height / 2 - 20));
int exposed = 0;
while(1) {
if(exposed) {
if(!updateAnaconda(anaconda, basepoint, width, height, apple)) {
freeAnaconda(anaconda);
free(apple);
free(basepoint);
return 0;
}
XClearWindow(d, w);
point *ptr = anaconda->chain;
while(ptr->next) {
XDrawLine(d, w, gc, ptr->x, ptr->y, ptr->next->x, ptr->next->y);
ptr = ptr->next;
}
XDrawArc(d, w, gc, apple->x - (5/2), apple->y - (5/2), 5, 5, 0, 360*64);
int len = snprintf(&scorebuffer, 30, "%i", anaconda->score);
XDrawString(d, w, gc, 25, 25, &scorebuffer, len);
}
while(XPending(d)) {
XNextEvent(d, &e);
switch(e.type) {
case KeyPress:
switch(e.xkey.keycode) {
case 113: /* left arrow key */
anaconda->rot += 10;
break;
case 114: /* right arrow key */
anaconda->rot -= 10;
break;
}
break;
case Expose:
/* hold off drawing until we get an expose event */
exposed = 1;
width = e.xexpose.width;
height = e.xexpose.height;
if(apple->x > width) {
free(apple);
apple = mkPoint(randrange(20, width / 2 - 20), randrange(20, height / 2 - 20));
} else if (apple->y > height) {
free(apple);
apple = mkPoint(randrange(20, width / 2 - 20), randrange(20, height / 2 - 20));
}
break;
}
}
usleep(100000);
}
freeAnaconda(anaconda);
free(apple);
free(basepoint);
return 0;
}

View File

@ -1,206 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <X11/Xlib.h>
#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
const double sprite[][2] = {
{0, 1},
{-0.5, -1},
{0, -0.5},
{0.5, -1},
};
#define SIZE sizeof sprite / sizeof sprite[0]
double buffer[SIZE][2];
int boidcounter = 0;
Display *d;
Window w;
XEvent e;
int s;
GC gc;
typedef struct point {
double x;
double y;
} point;
typedef struct boid {
int id;
point *p;
double rot;
struct boid *next;
} boid;
void xinit(void) {
d = XOpenDisplay(NULL);
s = DefaultScreen(d);
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1,
BlackPixel(d, s), WhitePixel(d, s));
XSelectInput(d, w, ExposureMask | KeyPressMask | PointerMotionMask);
XMapWindow(d, w);
gc = XCreateGC(d, w, 0, NULL);
}
int sign(double x) {
return (x > 0) - (x < 0);
}
point *rotate(double x, double y, double rot) {
point *ret = malloc(sizeof ret);
double rad = rot * M_PI/180;
ret->x = x * cos(rad) - y * sin(rad);
ret->y = x * sin(rad) + y * cos(rad);
return ret;
}
double distance(point *a, point *b) {
return sqrt(pow(a->x - b->x, 2) + pow(a->y - b->y, 2));
}
void calculateRender(
double x,
double y,
double rot,
int scale
) {
memcpy(&buffer, &sprite, SIZE);
for(int i = 0; i < SIZE; i++) {
point *p = rotate(sprite[i][0], sprite[i][1], rot);
buffer[i][0] = p->x * scale + x;
buffer[i][1] = p->y * scale + y;
free(p);
}
}
void renderBuffer(void) {
for(int i = 0; i < SIZE - 1; i++) {
XDrawLine(d, w, gc,
buffer[i][0], buffer[i][1],
buffer[i + 1][0], buffer[i + 1][1]);
}
XDrawLine(d, w, gc,
buffer[0][0], buffer[0][1],
buffer[SIZE - 1][0], buffer[SIZE - 1][1]);
}
void renderBoid(boid *boid) {
calculateRender(
boid->p->x,
boid->p->y,
boid->rot,
5
);
renderBuffer();
}
boid *mkBoid(double x, double y, double rot) {
boid *b = malloc(sizeof b);
point *p = malloc(sizeof p);
b->p = p;
b->p->x = x;
b->p->y = y;
b->rot = rot;
b->next = NULL;
b->id = boidcounter++;
return b;
}
void appendBoid(boid *destination, boid *source) {
destination->next = source;
}
double averageHeading(boid *b) {
boid *c = b;
double sum;
int count;
while(c) {
sum += c->rot;
count++;
c = c->next;
}
return sum / count;
}
void randomBoids(boid *b, int num) {
srand(time(0));
boid *ptr = b;
for(int i = 0; i < num; i++) {
int w = rand() % DisplayWidth(d, s) + 1;
int h = rand() % DisplayHeight(d, s) + 1;
int deg = rand() % 360;
appendBoid(ptr, mkBoid(w, h, deg));
ptr = ptr->next;
}
}
void updateBoid(boid *b, boid *chain, int id, double average) {
point *p = rotate(5, 0, b->rot + 90);
b->p->x = b->p->x + p->x;
b->p->y = b->p->y + p->y;
double toTurn = 0;
boid *c = chain;
while(c) {
if(c->id != id) {
int dist = distance(c->p, b->p);
if(dist < 50) toTurn += dist / 75;
}
int w = DisplayWidth(d, s);
int h = DisplayHeight(d, s);
int centerw = w / 2 - b->p->x;
int centerh = h / 2 - b->p->y;
double deg = atan((double)centerh / (double)centerw) * 180/M_PI;
toTurn += sign(deg) * 0.5;
toTurn += (average - c->rot) * 0.4;
if(b->p->x > w) b->p->x = 0;
else if(b->p->x < 0) b->p->x = w;
if(b->p->y > h) b->p->y = 0;
else if(b->p->y < 0) b->p->y = h;
toTurn = MIN(toTurn / 4, 30);
b->rot += toTurn;
c = c->next;
}
free(p);
}
int main() {
xinit();
boid *b = mkBoid(100, 100, 0);
randomBoids(b, 100);
while(1) {
XClearWindow(d, w);
boid *ptr = b;
while(ptr) {
updateBoid(ptr, b, ptr->id, averageHeading(b));
renderBoid(ptr);
XFlush(d);
ptr = ptr->next;
}
while(XPending(d)) {
XNextEvent(d, &e);
switch(e.type) {
case KeyPress:
break;
}
}
usleep(50000);
}
return 0;
}

View File

@ -1,286 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <errno.h>
#include <time.h>
#include <stddef.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
struct color {
int r;
int g;
int b;
};
void init_random(void) {
srand(time(0));
}
int rand_range(int u, int l) {
return (rand() % (u - l + 1)) + l;
}
void exec_with_stdout(char *file, char *args[], char *buf, int length) {
int pfds[2];
pipe(pfds);
int status = fork();
if(status == 0) {
close(1);
dup(pfds[1]);
close(pfds[0]);
execvp(file, args);
} else {
if(!buf) return; /* don't read anything */
int readin = read(pfds[0], buf, length - 1);
buf[readin] = '\0';
}
}
void imagemagick(char *filename, char *buffer, int size) {
char *execargs[] = {
"convert",
filename,
"-resize",
"25%",
"-colors",
"16",
"-unique-colors",
"-quiet",
"txt:-",
NULL
};
char *name = "convert";
exec_with_stdout(name, execargs, buffer, size);
}
struct color *get_raw_colors(char *image) {
char buf[2048];
imagemagick(image, (char *)&buf, 2048);
int hcount = 0;
char cbuf[3][3];
static struct color colors[16];
for(int i = 0; (unsigned int)i < sizeof buf; i++) {
if(buf[i] == '#') {
hcount++; /* we have to ignore a comment, that's why there's a special case */
if(hcount >= 2 && hcount - 2 < 16 && (unsigned int)(i + 6) < sizeof buf) {
memcpy((char *)&cbuf[0], buf + i + 1, 2);
memcpy((char *)&cbuf[1], buf + i + 3, 2);
memcpy((char *)&cbuf[2], buf + i + 5, 2);
cbuf[0][2] = '\0';
cbuf[1][2] = '\0';
cbuf[2][2] = '\0';
colors[hcount - 2].r = (int)strtol((char *)&cbuf[0], NULL, 16);
colors[hcount - 2].g = (int)strtol((char *)&cbuf[1], NULL, 16);
colors[hcount - 2].b = (int)strtol((char *)&cbuf[2], NULL, 16);
}
}
}
return (struct color *)&colors;
}
void blend_color(struct color *a, struct color *b, struct color *c) {
c->r = (int)(0.5 * a->r + 0.5 * b->r);
c->g = (int)(0.5 * a->g + 0.5 * b->g);
c->b = (int)(0.5 * a->b + 0.5 * b->b);
}
void darken_color(struct color *a, struct color *b, double percentage) {
b->r = (int)(a->r * (1 - percentage));
b->g = (int)(a->g * (1 - percentage));
b->b = (int)(a->b * (1 - percentage));
}
void adjust_colors(struct color *colors) {
/* #eeeeee */
struct color e = {238, 238, 238};
/* if top digit != 0 */
if(colors[0].r > 15)
darken_color(&colors[0], &colors[0], 0.40);
blend_color(&colors[7], &e, &colors[7]);
darken_color(&colors[7], &colors[8], 0.30);
blend_color(&colors[15], &e, &colors[15]);
}
int check_colors(struct color *colors) {
int j = 0;
for(int i = 0; i < 16; i++) {
if(colors[i].r + colors[i].g + colors[i].b == 0) j++;
}
if(j > 0) return 0;
return 1;
}
struct color *get_colors(char *filename) {
/* check for permission */
if(access(filename, F_OK | R_OK) != 0) {
errno = ENOENT;
return NULL;
}
struct color *col = get_raw_colors(filename);
adjust_colors(col);
return col;
}
/* generalized function ,
* used by get_conf_file and get_wal_dir */
char *get_file_gen(char *initvar, char *backvar, char *postfix, char *file) {
static char buffer[256];
int extension = 0;
char *path = getenv(initvar);
if(!path) {
path = getenv(backvar);
extension = 1;
}
if(!path) {
fprintf(stderr, "error: both initvar and backvar are undefined.\n");
exit(1);
}
snprintf(buffer, 256, "%s%s/%s", path, extension ? postfix : "", file);
return buffer;
}
char *get_conf_file(char *file) {
return get_file_gen("XDG_CONFIG_HOME", "HOME", "/.config/cwal", file);
}
/* pass NULL to get the base dir name, not specific file */
char *get_wal_dir(char *file) {
if(!file) file = "";
return get_file_gen("XDG_DATA_HOME", "HOME", "/.local/share/wallpapers", file);
}
char *select_random_rel(void) {
DIR *dir = opendir(get_wal_dir(NULL));
struct dirent *file;
/* probably should move hardcoded constants somewhere that makes sense */
static char names[50][256];
int i = 0, random;
init_random();
while(file = readdir(dir)) {
if(i == 50) break;
if(file->d_type != DT_REG) continue;
memcpy(&names[i], file->d_name, 256);
i++;
}
random = rand_range(i - 1, 0);
return names[random];
}
void print_color(struct color *color) {
printf("#%02x%02x%02x\n", color->r, color->g, color->b);
}
void run_handler(struct color *colors, char *wal) {
char chars[16][8];
char *argv[19];
for(int i = 0; i < 16; i++) {
snprintf(&chars[i], 8, "#%02x%02x%02x", colors[i].r, colors[i].g, colors[i].b);
}
for(int i = 0; i < 16; i++) {
argv[i + 1] = &chars[i];
}
argv[17] = wal;
argv[18] = NULL;
char *conf = get_conf_file("handler");
argv[0] = "handler";
if(access(conf, F_OK | R_OK | X_OK) != 0) {
printf("couldn't find %s!\n", conf);
return;
}
exec_with_stdout(conf, argv, NULL, 0);
}
struct settings {
int h:1; /* running hooks or not */
int e:1; /* echo colors */
int c:1; /* enable color check */
int f:1; /* print filename used */
char *wal; /* custom file if provided */
} settings = {
.h = 1,
.e = 0,
.c = 0,
.f = 0,
.wal = NULL,
};
char *select_random_file(char *file) {
if(!file) file = select_random_rel();
static char ret[256];
file = get_wal_dir(file);
memcpy(&ret, file, 256);
return ret;
}
int main(int argc, char **argv) {
int c;
while((c = getopt(argc, argv, "hefcw:")) != -1) {
switch(c) {
case 'h':
settings.h = 0;
break;
case 'w':
settings.wal = optarg;
break;
case 'e':
settings.e = 1;
break;
case 'c':
settings.c = 1;
break;
case 'f':
settings.f = 1;
break;
}
}
if(settings.h == 0) settings.e = 1;
char *file = select_random_file(settings.wal);
struct color *colors = get_colors(file);
if(settings.f) printf("%s\n", file);
if(settings.e) {
for(int i = 0; i < 16; i++) {
print_color(&colors[i]);
}
}
if(settings.c) {
c = check_colors(colors);
if(c == 0) {
return 1;
}
}
if(settings.h) run_handler(colors, file);
return 0;
}

View File

@ -1,21 +0,0 @@
#include <stdio.h>
#include <ctype.h>
/* written on new year's eve 2020
* good night and good riddance */
char newchar(char c, int i) {
if(i % 2) {
if(islower(c)) return c - 32;
} else if(isupper(c)) return c + 32;
if(c == 33) return -2;
return c;
}
int main(void) {
char c;
int i = 0;
while((c = getchar()) != EOF) {
putchar(newchar(c, i));
i++;
}
}

View File

@ -1,174 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <poll.h>
#include <string.h>
struct timer {
int s; /* seconds */
int d; /* data storage */
void (*u)(struct timer *t); /* update function */
int (*c)(struct timer *t); /* stop check function */
int (*p)(struct timer *t); /* pause check function */
};
struct settings {
unsigned int e:1; /* use escape (v assumed) */
unsigned int v:1; /* verbose */
unsigned int d:1; /* count down/up (1/0) */
unsigned int b:1; /* ascii bel when done */
unsigned int f:1; /* display hours */
unsigned int t:1; /* tomato timer */
unsigned int p:1; /* stop after tomato timer cycle finished */
int s; /* seconds */
} s = {
.e = 0,
.v = 0,
.d = 0,
.b = 0,
.f = 0,
.t = 0,
.p = 0,
.s = 0
};
void timerdec(struct timer *t) { if (t->s) t->s--; }
void timerinc(struct timer *t) { t->s++; }
void timerupdate(struct timer *t) { if(t->u) t->u(t); }
int timerstate(int (*f)(struct timer *t), struct timer *t) {
if(f) {
if(f(t)) return 1;
else return 0;
}
return 0;
}
int timerstop(struct timer *t) { return timerstate(t->c, t); }
int timerpause(struct timer *t) { return timerstate(t->p, t); }
int timerzero(struct timer *t) {
if(!t->s) return 1;
return 0;
}
int seconds(int t) { return t % 60; }
int minutes(int t) { return (t / 60) % 60; }
int minute(int t) { return t / 60; }
int hours(int t) { return (t / 60) / 60; }
struct timer *timerinit(void) {
struct timer *t = malloc(sizeof *t);
t->s = 0;
t->d = 0;
t->u = NULL;
t->c = NULL;
t->p = NULL;
return t;
}
int timerissettings(struct timer *t) {
if(!t->s) return 0;
if(s.s == t->s) return 1;
return 0;
}
int tomatotimer(struct timer *t) {
if(t->s) return 0;
if(t->d % 2) t->s = s.s / 2;
else t->s = s.s;
t->d++;
if(s.b) putchar('\a');
if(s.p) return 0;
return 1;
}
char *timerdisp(struct timer *t) {
char *str = malloc(20);
if(s.f) snprintf(str, 20, "%02i:%02i:%02i",
hours(t->s), minutes(t->s), seconds(t->s));
/* TODO: give minute(...) and minutes(...) better names */
else snprintf(str, 20, "%02i:%02i", minute(t->s), seconds(t->s));
return str;
}
void defaultSettings(struct settings s) {
s.e = 1;
s.b = 1;
s.f = 1;
}
void timerloop() {
struct timer *t = timerinit();
if(s.d) {
t->u = timerdec;
t->s = s.s;
t->c = timerzero;
} else {
t->u = timerinc;
t->c = timerissettings;
}
if(s.t) {
t->u = timerdec;
if(s.s == 0) s.s = 20 * 60;
t->s = s.s;
t->d = 1;
t->p = tomatotimer;
t->c = NULL;
}
char *c;
int e;
struct pollfd p = { .fd = STDIN_FILENO, .events = POLLIN };
for(;;) {
poll(&p, 1, 60);
if((e = (p.revents == POLLIN)) || timerpause(t)) {
/* TODO: make this nicer */
if(e) getchar();
if(s.e) {
c = timerdisp(t);
if(e) printf("\r\e[1A* %s", c);
else printf("\r* %s", c);
}
getchar();
/* TODO: stop relying on hard assumptions */
if(s.e) printf("\r\e[1A \r");
}
c = timerdisp(t);
if(s.e) {
printf("%s\r", c);
fflush(stdout);
}
else if(s.v) printf("%s\n", c);
if(timerstop(t)) break;
free(c);
timerupdate(t);
sleep(1);
}
if(s.b) putchar('\a');
free(t);
free(c);
}
int main(int argc, char **argv) {
char c;
while((c = getopt(argc, argv, "evdbftpzh:m:s:")) != -1) {
switch(c) {
break; case 'e': s.e = 1;
break; case 'v': s.v = 1;
break; case 'd': s.d = 1;
break; case 'b': s.b = 1;
break; case 'f': s.f = 1;
break; case 't': s.t = 1;
break; case 'p': s.p = 1;
break; case 'z': s.e = 1; s.b = 1; s.f = 1;
break; case 'h': s.s = s.s + (atoi(optarg) * 3600);
break; case 'm': s.s = s.s + (atoi(optarg) * 60);
break; case 's': s.s = s.s + atoi(optarg);
break; case '?': return 1;
break; default: abort();
}
}
timerloop();
return 0;
}

View File

@ -1,148 +0,0 @@
#include <sys/ioctl.h>
#include <ctype.h>
#include <termios.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#define ESC_CLEAR "\033[2J"
#define ESC_CUSHOME "\033[H"
#define ESC_NEWLINE "\033[E\033[1C"
const char MSG_OK[] = "(O)k";
const char MSG_CANCEL[] = "(C)ancel";
typedef struct winsize ws;
int lines, cols;
char *message;
size_t message_len;
struct termios original_termios;
void render(char *message, int message_len, int lines, int cols);
void rawmode_start() {
tcgetattr(STDIN_FILENO, &original_termios);
struct termios raw = original_termios;
raw.c_lflag &= ~(ECHO | ICANON);
tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw);
}
void rawmode_stop() {
tcsetattr(STDIN_FILENO, TCSAFLUSH, &original_termios);
printf("\n\n");
fflush(stdout);
}
ws *getWinSize(void) {
/* we're only going to use these values once per invocation,
* so it's fine that it's static. */
static ws w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
return &w;
}
void handler(int signal, siginfo_t *info, void *context) {
ws *w = getWinSize();
lines = w->ws_row;
cols = w->ws_col;
render(message, message_len, lines, cols);
return;
}
void termhandler(int signal, siginfo_t *info, void *context) {
rawmode_stop();
return;
}
int calculate_number_of_lines(int length, int cols) {
/* cols - 1 accounts for right padding */
return length / (cols - 1) + 1;
}
void go_to_initial_message_printing_pos(void) {
printf(ESC_CUSHOME "\033[1B\033[1C");
}
void print_message(char *message, int messagelen, int cols) {
int linecount = calculate_number_of_lines(messagelen, cols);
int adjcols = cols - 2;
int offset = 1;
for(int character = 0; character < messagelen; character++) {
if(character == adjcols * offset) {
printf(ESC_NEWLINE);
offset++;
}
putchar(message[character]);
}
}
void render(char *message, int messagelen, int lines, int cols) {
int cancel_length = sizeof(MSG_CANCEL) / sizeof(MSG_CANCEL[0]);
/* print the stuff */
printf(ESC_CLEAR "" ESC_CUSHOME);
go_to_initial_message_printing_pos();
print_message(message, message_len, cols);
printf(ESC_NEWLINE);
printf(ESC_NEWLINE);
printf("%s", MSG_OK);
printf("\033[1D\033[%iC\033[%iD%s", cols, cancel_length, MSG_CANCEL);
fflush(stdout);
}
int main(int argc, char **argv) {
int cancel_length = strlen(MSG_CANCEL);
char c;
struct sigaction resizeaction = {};
struct sigaction termaction = {};
ws *w;
/* check if we have a message */
if(argc > 1) {
message = argv[1]; /* second argument's a message */
message_len = strlen(message);
} else {
return 1;
}
/* setup sigaction handlers */
resizeaction.sa_sigaction = &handler;
if(sigaction(SIGWINCH, &resizeaction, NULL) == -1) {
return 1;
}
termaction.sa_sigaction = &termhandler;
if(sigaction(SIGTERM, &termaction, NULL) == -1) {
return 1;
}
rawmode_start();
/* get window properties */
w = getWinSize();
lines = w->ws_row;
cols = w->ws_col;
render(message, message_len, lines, cols);
for(;;) {
read(STDIN_FILENO, &c, 1);
if(c == 'o') {
return 2;
rawmode_stop();
} else if(c == 'c') {
return 3;
rawmode_stop();
}
}
return 0;
}

View File

@ -1,29 +0,0 @@
#include <X11/Xlib.h>
#include <stdio.h>
int main(void) {
Display* display = XOpenDisplay(NULL);
if(!display) {
printf("Error: Unable to open display.\n");
return 1;
}
int screen = DefaultScreen(display);
Window root = RootWindow(display, screen);
/* SubstructureNotifyMask allows us to be notified of CreateNotify events */
XSelectInput(display, root, SubstructureNotifyMask);
XEvent event;
for(;;) {
XNextEvent(display, &event);
if(event.type == CreateNotify) {
/* print window id */
printf("0x%x\n", event.xcreatewindow.window);
break;
}
}
XCloseDisplay(display);
return 0;
}

View File

@ -1,2 +0,0 @@
DESTDIR=$(HOME)/.local

View File

@ -1,3 +0,0 @@
#!/bin/sh
chromium --app=https://discord.com/login --profile-directory="Profile 1"

View File

@ -1,12 +0,0 @@
#!/bin/sh
for i in *; do
cd "$i" || continue
exists=$(
git status |
grep -c 'Your branch is ahead of '
)
[ "$exists" -eq 0 ] || printf "> %s\n" "$i"
cd ..
done

View File

@ -1,4 +0,0 @@
#!/bin/sh
# designed to be called from sxhkd (x session)
pgrep NetworkManager && st -e nmtui

View File

@ -1,88 +0,0 @@
#!/bin/sh
# script for interfacing with planning center online
appid=$(cat "$HOME/.local/share/pco/appid")
token=$(cat "$HOME/.local/share/pco/token")
userid=$(cat "$HOME/.local/share/pco/userid")
get_blockouts_online () {
curl -su "$appid:$token" "https://api.planningcenteronline.com/services/v2/people/$userid/blockouts" | \
jq .data[].attributes.ends_at | \
awk -F'"|-|T' '
function y(x) {
if (x == 1) return "Jan"
if (x == 2) return "Feb"
if (x == 3) return "Mar"
if (x == 4) return "Apr"
if (x == 5) return "May"
if (x == 6) return "Jun"
if (x == 7) return "Jul"
if (x == 8) return "Aug"
if (x == 9) return "Sep"
if (x == 10) return "Oct"
if (x == 11) return "Nov"
if (x == 12) return "Dec"
return "Unk"
}
{print y($3) " " $4 " " $2}' | \
tr '\n' '|' | \
sed 's/.\{1\}$//'
}
get_blockouts_local () {
grep "MSG Blockout date" "$DOTREMINDERS" | \
awk -F' ' '{print $2 " " $3 " " $4}'
}
get_blockouts () {
all_dates=$(get_blockouts_online)
OLDIFS="$IFS"
IFS="|"
for i in $all_dates; do
results=$(grep -c "^REM $i MSG Blockout date" "$DOTREMINDERS")
[ "$results" -eq 0 ] && \
printf "REM %s MSG Blockout date\n" "$i" >> "$DOTREMINDERS" && \
printf "added %s to calendar\n" "$i" || \
printf "omitted %s from the calendar, it's already there\n" "$i"
done
IFS="$OLDIFS"
}
push_blockouts () {
file=$(mktemp)
get_blockouts_online | tr '|' '\n' >> "$file"
local=$(get_blockouts_local)
# don't mess with the spacing
OLDIFS=$IFS
IFS="
"
printf "temp file: %s\n" "$file"
for i in $local; do
count=$(grep -c "^$i$" "$file")
if [ "$count" -eq 0 ]; then
printf "push: %s\n" "$i"
stddate=$(date --date="$i" "+%Y-%m-%dT06:00:00Z")
curl -X POST -H "Content-Type: application/json" -d "
{
\"data\": {
\"attributes\": {
\"reason\": \"n/a\",
\"repeat_frequency\": \"no_repeat\",
\"starts_at\": \"$stddate\",
\"ends_at\": \"$stddate\"
}
}
}" -su "$appid:$token" "https://api.planningcenteronline.com/services/v2/people/$userid/blockouts"
fi
done
IFS=$OLDIFS
rm "$file"
}
get_blockouts
push_blockouts

View File

@ -1,4 +0,0 @@
#!/bin/sh
# opens snapcad
wine ~/.wine/drive_c/Program\ Files\ \(x86\)/VEX\ Robotics/SnapCAD/SnapCAD.exe

View File

@ -1,12 +0,0 @@
#!/bin/sh
scripts="$(
find /home/usr/git/utils/sh /home/usr/git/utils/c -type f |
grep -v '\.git' |
xargs file |
grep 'C source \|POSIX shell script' |
awk -F':' '{print $1}' |
fzy
)"
[ -z "$scripts" ] || nvim "$scripts"

View File

@ -1,100 +0,0 @@
#!/bin/sh
power_prefix="/sys/class/power_supply/"
[ -d "${power_prefix}sbs-20-000b" ] && bat="sbs-20-000b"
[ -d "${power_prefix}BAT0" ] && bat="BAT0"
[ "$(pgrep -c pulseaudio)" -eq 1 ] && ss="pulse" || ss="alsa"
mod_bspwm () {
used_desk=$(bspc query -D -d .occupied --names | tr '\n' ' ')
current_desk=$(bspc query -D -d .focused --names)
final_string=""
current_printed=0
cur_char='>'
for i in $used_desk; do
[ "$i" = "$current_desk" ] && \
final_string=${final_string}"$cur_char$i " && \
current_printed=1 || \
final_string=${final_string}"$i "
done
[ $current_printed -eq 0 ] &&
final_string=${final_string}"$cur_char$current_desk "
printf "%s" "$final_string"
}
mod_period () {
nextclass
}
mod_sensors () {
sensors | grep 'Core 0' | awk -F' ' '{print $3}' | tr -d '\n'
}
mod_power () {
[ -z "$bat" ] ||
tr -d '\n' < /sys/class/power_supply/$bat/capacity
sed 's/Charging/↑/g;s/Not charging/-/g;s/Discharging/↓/g;s/Full/-/g' < /sys/class/power_supply/$bat/status
}
mod_vol () {
[ "$ss" = "pulse" ] && pactl list sinks | awk -F' ' '$1 == "Volume:" {print "pv" $5}'
[ "$ss" = "alsa" ] && amixer | grep '^ Front' | awk -F'[' '{ORS = ""; print "av" substr($2, 1, 3); exit}'
}
mod_date_time () {
date '+%m%d-%H:%M' | tr '\n' ' '
}
update_mod () {
output="$(eval "mod_$1")"
eval "output_$1=\"$output\""
}
get_mod () {
eval "printf '%s' \${output_$1}"
}
echo_bar () {
left="$(get_mod "bspwm")"
right="$(get_mod "date_time")$(get_mod "period") $(get_mod "sensors") $(get_mod "power") $(get_mod "vol")"
width="$(tput cols)"
rightwidth="${#right}"
# print left side
printf "\033[2J\033[H%s" "$left"
# print right side
printf "\033[1;%if%s" "$((width - rightwidth + 1))" "$right"
}
register_sigs () {
trap "update_mod vol" USR2
trap "update_mod bspwm" USR1
}
update_all () {
update_mod power
update_mod vol
update_mod bspwm
update_mod date_time
update_mod period
update_mod sensors
}
tput civis
register_sigs
update_all
i=0
while true; do
sleep 0.25
[ "$i" -eq $((29 * 4)) ] && update_all && i=0
echo_bar
i="$((i + 1))"
done

View File

@ -1,23 +0,0 @@
#!/bin/sh
barwidth=20
# remove all current statusbars
# pgrep doesn't handle arguments for running commands
# shellcheck disable=2009
processes="$(ps aux | grep 'st -c' | grep 'status' | awk -F' ' '{print $2}')"
for i in $processes; do
pkill -P "$i" >/dev/null 2>&1
kill "$i"
done
# get all screens
screens="$(xrandr | grep ' connected' | sed 's/ primary//g' | awk -F' ' '{print $1 " " $3}')"
# for every screen, create a statusbar
IFS="
"
for i in $screens; do
screenstring=$(echo "$i" | awk -v a="$barwidth" -F'[ x+]' '{print $2 "x" a "+" $4 "+" $5}')
st -c statusbar -p -g "$screenstring" -e status &
done

View File

@ -1,19 +0,0 @@
#!/bin/sh
pulse=$(pgrep -c pulseaudio)
[ "$1" = "inc" ] && sign="+"
[ "$1" = "dec" ] && sign="-"
[ "$#" -eq 0 ] && exit 1
if [ "$pulse" -eq 1 ]; then
for SINK in $(pacmd list-sinks | grep 'index:' | cut -b12-)
do
pactl set-sink-volume "$SINK" "${sign}5%"
done
else
amixer -c 0 set Master "5%${sign}"
fi
killall -12 status

View File

@ -4,7 +4,7 @@
# post-wm boilerplate
wallpaper
disp
statusbar &
polybar &
# set up the color scheme
bspc config normal_border_color "#161510"

View File

@ -24,12 +24,34 @@ in {
sound.enable = true;
hardware.pulseaudio.enable = true;
nixpkgs.config = {
allowUnfree = true;
};
environment.systemPackages = with pkgs; [
sx
lynx
fzy
gnupg
xclip
polybar
ncpamixer
tig
cmus
neomutt
mpv
yt-dlp
zathura
tmux
lynx
feh
elinks
sc-im
ledger
remind
python3
discord
(pkgs.callPackage ./builds/utils.nix {})
(pkgs.callPackage ./builds/st.nix {})