diff --git a/man/compton.1.asciidoc b/man/compton.1.asciidoc index aa0b5fbd..10a87552 100644 --- a/man/compton.1.asciidoc +++ b/man/compton.1.asciidoc @@ -199,7 +199,11 @@ OPTIONS WIDTH,HEIGHT,ELE1,ELE2,ELE3,ELE4,ELE5... ---- + -The element in the center must not be included, it will be forever 1.0 or changing based on opacity, depending on whether you have `--blur-background-fixed`. Yet the automatic adjustment of blur factor may not work well with a custom blur kernel. +In other words, the matrix is formatted as a list of comma separated numbers. The first two numbers must be integers, which specify the width and height of the matrix. They must be odd numbers. Then, the following 'width * height - 1' numbers specifies the numbers in the matrix, row by row, excluding the center element. ++ +The elements are finite floating point numbers. The decimal pointer has to be '.' (a period), and scientific notation is not supported. ++ +The element in the center will either be 1.0 or changing based on opacity, depending on whether you have `--blur-background-fixed`. Yet the automatic adjustment of blur factor may not work well with a custom blur kernel. + A 7x7 Gaussian blur kernel (sigma = 0.84089642) looks like: + diff --git a/src/config.c b/src/config.c index 58bf1a30..0c923835 100644 --- a/src/config.c +++ b/src/config.c @@ -47,8 +47,8 @@ parse_long(const char *s, long *dest) { */ const char * parse_matrix_readnum(const char *src, double *dest) { - char *pc = NULL; - double val = strtod(src, &pc); + const char *pc = NULL; + double val = strtod_simple(src, &pc); if (!pc || pc == src) { log_error("No number found: %s", src); return src; diff --git a/src/string_utils.c b/src/string_utils.c index df0ac8dd..6b3a8d2a 100644 --- a/src/string_utils.c +++ b/src/string_utils.c @@ -40,3 +40,34 @@ void mstrextend(char **psrc1, const char *src2) { strncpy(*psrc1 + len1, src2, len2); (*psrc1)[len - 1] = '\0'; } + +/// Parse a floating point number of form (+|-)?[0-9]*(\.[0-9]*) +double strtod_simple(const char *src, const char **end) { + double neg = 1; + if (*src == '-') { + neg = -1; + src++; + } else if (*src == '+') { + src++; + } + + double ret = 0; + while (*src >= '0' && *src <= '9') { + ret = ret * 10 + (*src - '0'); + src++; + } + + if (*src == '.') { + double frac = 0, mult = 0.1; + src++; + while (*src >= '0' && *src <= '9') { + frac += mult * (*src - '0'); + mult *= 0.1; + src++; + } + ret += frac; + } + + *end = src; + return ret * neg; +} diff --git a/src/string_utils.h b/src/string_utils.h index bff0bd6e..8581104a 100644 --- a/src/string_utils.h +++ b/src/string_utils.h @@ -11,6 +11,9 @@ char * mstrjoin3(const char *src1, const char *src2, const char *src3); void mstrextend(char **psrc1, const char *src2); +/// Parse a floating point number of form (+|-)?[0-9]*(\.[0-9]*) +double strtod_simple(const char *, const char **); + static inline int uitostr(unsigned int n, char *buf) { int ret = 0; unsigned int tmp = n;