Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions config.def.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,23 @@ static const char *colorname[NUMCOLS] = {
[INIT] = "black", /* after initialization */
[INPUT] = "#005577", /* during input */
[FAILED] = "#CC3333", /* wrong password */
[BLOCKS] = "#ffffff", /* key feedback block */
};

/* treat a cleared input like a wrong password (color) */
static const int failonclear = 1;


// ### Blocks bar ###
static short int blocks_enabled = 1; // 0 = don't show blocks
static const int blocks_width = 0; // 0 = full width
static const int blocks_height = 16;

// position
static const int blocks_x = 0;
static const int blocks_y = 0;

// Number of blocks
static const int blocks_count = 10;
// ### \Blocks bar ###

46 changes: 44 additions & 2 deletions slock.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <X11/extensions/Xrandr.h>
#include <X11/keysym.h>
Expand All @@ -28,7 +29,8 @@ enum {
INIT,
INPUT,
FAILED,
NUMCOLS
BLOCKS,
NUMCOLS,
};

struct lock {
Expand Down Expand Up @@ -83,7 +85,40 @@ dontkillme(void)
}
#endif

static const char *
static void
draw_key_feedback(Display *dpy, struct lock **locks, int screen)
{
XGCValues gr_values;

Window win = locks[screen]->win;
Window root_win;

gr_values.foreground = locks[screen]->colors[BLOCKS];
GC gc = XCreateGC(dpy, win, GCForeground, &gr_values);

int width = blocks_width,
height = blocks_height,
x = blocks_x,
y = blocks_y;

if (height == 0 || width == 0) {
int _x, _y;
unsigned int screen_width, screen_height, _b, _d;
XGetGeometry(dpy, win, &root_win, &_x, &_y, &screen_width, &screen_height, &_b, &_d);
width = width ? width : screen_width;
height = height ? height : screen_height;
}

unsigned int block_width = width / blocks_count;
unsigned int position = rand() % blocks_count;

XClearWindow(dpy, win);
XFillRectangle(dpy, win, gc, x + position*block_width, y, block_width, height);

XFreeGC(dpy, gc);
}

static const char *
gethash(void)
{
const char *hash;
Expand Down Expand Up @@ -185,6 +220,9 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
memcpy(passwd + len, buf, num);
len += num;
}
if (blocks_enabled)
for (screen = 0; screen < nscreens; screen++)
draw_key_feedback(dpy, locks, screen);
break;
}
color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT);
Expand Down Expand Up @@ -355,6 +393,10 @@ main(int argc, char **argv) {
if (setuid(duid) < 0)
die("slock: setuid: %s\n", strerror(errno));

time_t t;
srand((unsigned) time(&t));


/* check for Xrandr support */
rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase);

Expand Down