adding option to choose background color

pull/1/head
Jan-Erik Rediger 2009-07-31 21:35:40 +02:00 committed by Michael Stapelberg
parent c1a91badbe
commit 9c4dee2e86
2 changed files with 42 additions and 4 deletions

View File

@ -21,10 +21,12 @@ i3lock \- slightly improved version of slock
.RB [\|\-d\|]
.RB [\|\-i
.IR image.xpm \|]
.RB [\|\-c
.IR color \|]
.SH DESCRIPTION
.B i3lock
locks your screen by making it white. To quit
locks your screen by making it white (default). To quit
.B i3lock
just enter your password.
@ -71,6 +73,10 @@ you did not disable this in your X server).
Display the given XPM image instead of a blank screen. You can convert an image to
XPM by using convert(1) from ImageMagick or GIMP for example.
.TP
.B \-c, \-\-color
Turns the screen into the given color instead of white. Color must be given in 6-byte format: rrggbb (i.e. ff0000 is red)
.SH AUTHOR
Michael Stapelberg <michael+i3lock at stapelberg dot de>

View File

@ -20,6 +20,7 @@
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
@ -44,6 +45,27 @@ static void die(const char *errstr, ...) {
exit(EXIT_FAILURE);
}
/*
* Returns the colorpixel to use for the given hex color (think of HTML).
*
* The hex_color may not start with #, for example FF00FF works.
*
* NOTE that get_colorpixel() does _NOT_ check the given color code for validity.
* This has to be done by the caller.
*
*/
uint32_t get_colorpixel(char *hex) {
char strgroups[3][3] = {{hex[0], hex[1], '\0'},
{hex[2], hex[3], '\0'},
{hex[4], hex[5], '\0'}};
uint32_t rgb16[3] = {(strtol(strgroups[0], NULL, 16)),
(strtol(strgroups[1], NULL, 16)),
(strtol(strgroups[2], NULL, 16))};
return (rgb16[0] << 16) + (rgb16[1] << 8) + rgb16[2];
}
/*
* Check if given file can be opened => exists
*
@ -131,6 +153,7 @@ int main(int argc, char *argv[]) {
bool dpms = false;
bool xpm_image = false;
char xpm_image_path[256];
char color[7] = "ffffff"; // white
Cursor invisible;
Display *dpy;
KeySym ksym;
@ -151,10 +174,11 @@ int main(int argc, char *argv[]) {
{"beep", no_argument, NULL, 'b'},
{"dpms", no_argument, NULL, 'd'},
{"image", required_argument, NULL, 'i'},
{"color", required_argument, NULL, 'c'},
{NULL, no_argument, NULL, 0}
};
while ((opt = getopt_long(argc, argv, "vnbdi:", long_options, &optind)) != -1) {
while ((opt = getopt_long(argc, argv, "vnbdi:c:", long_options, &optind)) != -1) {
switch (opt) {
case 'v':
die("i3lock-"VERSION", © 2009 Michael Stapelberg\n"
@ -172,8 +196,16 @@ int main(int argc, char *argv[]) {
strncpy(xpm_image_path, optarg, 255);
xpm_image = true;
break;
case 'c':
strncpy(color, optarg, 6);
color[6] = 0;
char parsed_color[7];
if (strlen(color) != 6 || sscanf(color, "%06[0-9a-fA-F]", parsed_color) != 1)
die("color is invalid, color must be given in 6-byte format: rrggbb\n");
break;
default:
die("i3lock: Unknown option. Syntax: i3lock [-v] [-n] [-b] [-d] [-i image.xpm]\n");
die("i3lock: Unknown option. Syntax: i3lock [-v] [-n] [-b] [-d] [-i image.xpm] [-c color]\n");
}
}
@ -196,7 +228,7 @@ int main(int argc, char *argv[]) {
/* init */
wa.override_redirect = 1;
wa.background_pixel = WhitePixel(dpy, screen);
wa.background_pixel = get_colorpixel(color);
w = XCreateWindow(dpy, root, 0, 0, DisplayWidth(dpy, screen), DisplayHeight(dpy, screen),
0, DefaultDepth(dpy, screen), CopyFromParent,
DefaultVisual(dpy, screen), CWOverrideRedirect | CWBackPixel, &wa);