aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2018-01-15 20:08:52 +0100
committerMattias Andrée <maandree@kth.se>2018-01-15 20:08:52 +0100
commit2e0ea42092d06457fbf669f85104951e510879cd (patch)
treea8808ba599a3c6bd518fef3a4929751d6d212264
parentFix manuals (diff)
downloadcg-tools-2e0ea42092d06457fbf669f85104951e510879cd.tar.gz
cg-tools-2e0ea42092d06457fbf669f85104951e510879cd.tar.bz2
cg-tools-2e0ea42092d06457fbf669f85104951e510879cd.tar.xz
Add cg-shallow, minor fixes, and bump year1.3
Signed-off-by: Mattias Andrée <maandree@kth.se>
-rw-r--r--COPYING2
-rw-r--r--Makefile6
-rw-r--r--man/cg-brilliance.14
-rw-r--r--man/cg-darkroom.14
-rw-r--r--man/cg-gamma.14
-rw-r--r--man/cg-icc.14
-rw-r--r--man/cg-limits.16
-rw-r--r--man/cg-linear.12
-rw-r--r--man/cg-negative.14
-rw-r--r--man/cg-rainbow.14
-rw-r--r--man/cg-shallow.1130
-rw-r--r--man/cg-sleepmode.14
-rw-r--r--src/cg-base.c2
-rw-r--r--src/cg-brilliance.c6
-rw-r--r--src/cg-darkroom.c6
-rw-r--r--src/cg-gamma.c4
-rw-r--r--src/cg-icc.c2
-rw-r--r--src/cg-limits.c8
-rw-r--r--src/cg-linear.c2
-rw-r--r--src/cg-negative.c4
-rw-r--r--src/cg-query.c2
-rw-r--r--src/cg-rainbow.c6
-rw-r--r--src/cg-remove.c2
-rw-r--r--src/cg-shallow.c279
-rw-r--r--src/cg-sleepmode.c6
25 files changed, 457 insertions, 46 deletions
diff --git a/COPYING b/COPYING
index ba7853a..890de82 100644
--- a/COPYING
+++ b/COPYING
@@ -1,5 +1,5 @@
cg-tools -- Cooperative gamma-enabled tools
-Copyright (C) 2016 Mattias Andrée (maandree@kth.se)
+Copyright (C) 2016, 2018 Mattias Andrée (maandree@kth.se)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/Makefile b/Makefile
index 3ca76e2..1861df5 100644
--- a/Makefile
+++ b/Makefile
@@ -20,7 +20,8 @@ BIN = bin/cg-brilliance \
bin/cg-query \
bin/cg-rainbow \
bin/cg-remove \
- bin/cg-sleepmode
+ bin/cg-sleepmode \
+ bin/cg-shallow
MAN1 = man/cg-brilliance.1 \
man/cg-darkroom.1 \
@@ -32,7 +33,8 @@ MAN1 = man/cg-brilliance.1 \
man/cg-query.1 \
man/cg-rainbow.1 \
man/cg-remove.1 \
- man/cg-sleepmode.1
+ man/cg-sleepmode.1 \
+ man/cg-shallow.1
MAN7 = man/cg-tools.7
diff --git a/man/cg-brilliance.1 b/man/cg-brilliance.1
index 187bff2..a79583e 100644
--- a/man/cg-brilliance.1
+++ b/man/cg-brilliance.1
@@ -75,8 +75,8 @@ all available adjustment methods are printed.
.BR \-p " "\fIpriority\fP
Set the priority of the filter. Filters with higher priority
are applied before filters with lower priority. The value
-must be a signed 64-bit integer (between -9223372036854775807
-and 9223372036854775808).
+must be a signed 64-bit integer (between \-9223372036854775807
+and 9223372036854775807).
.BR cg-brilliance 's
default priority is 2305843009213693952.
diff --git a/man/cg-darkroom.1 b/man/cg-darkroom.1
index 2b0802e..106f62f 100644
--- a/man/cg-darkroom.1
+++ b/man/cg-darkroom.1
@@ -68,8 +68,8 @@ all available adjustment methods are printed.
.BR \-p " "\fIpriority\fP
Set the priority of the filter. Filters with higher priority
are applied before filters with lower priority. The value
-must be a signed 64-bit integer (between -9223372036854775807
-and 9223372036854775808).
+must be a signed 64-bit integer (between \-9223372036854775807
+and 9223372036854775807).
.BR cg-darkroom 's
default priority is 6917529027641081856.
diff --git a/man/cg-gamma.1 b/man/cg-gamma.1
index 0c9d8e7..47681f7 100644
--- a/man/cg-gamma.1
+++ b/man/cg-gamma.1
@@ -93,8 +93,8 @@ all available adjustment methods are printed.
.BR \-p " "\fIpriority\fP
Set the priority of the filter. Filters with higher priority
are applied before filters with lower priority. The value
-must be a signed 64-bit integer (between -9223372036854775807
-and 9223372036854775808).
+must be a signed 64-bit integer (between \-9223372036854775807
+and 9223372036854775807).
.BR cg-gamma 's
default priority is 0.
diff --git a/man/cg-icc.1 b/man/cg-icc.1
index c9ee179..8de9b82 100644
--- a/man/cg-icc.1
+++ b/man/cg-icc.1
@@ -78,8 +78,8 @@ all available adjustment methods are printed.
.BR \-p " "\fIpriority\fP
Set the priority of the filter. Filters with higher priority
are applied before filters with lower priority. The value
-must be a signed 64-bit integer (between -9223372036854775807
-and 9223372036854775808).
+must be a signed 64-bit integer (between \-9223372036854775807
+and 9223372036854775807).
.BR cg-icc 's
default priority is 0.
diff --git a/man/cg-limits.1 b/man/cg-limits.1
index c21ae32..363190d 100644
--- a/man/cg-limits.1
+++ b/man/cg-limits.1
@@ -108,10 +108,10 @@ all available adjustment methods are printed.
.BR \-p " "\fIpriority\fP
Set the priority of the filter. Filters with higher priority
are applied before filters with lower priority. The value
-must be a signed 64-bit integer (between -9223372036854775807
-and 9223372036854775808).
+must be a signed 64-bit integer (between \-9223372036854775807
+and 9223372036854775807).
.BR cg-limits 's
-default priority is -4611686018427387904.
+default priority is \-4611686018427387904.
If
.I priority
diff --git a/man/cg-linear.1 b/man/cg-linear.1
index f101eab..cb19307 100644
--- a/man/cg-linear.1
+++ b/man/cg-linear.1
@@ -85,7 +85,7 @@ lower priority. This means that normally you want the
to be higher than
.IR stop-priority .
The value must be a signed 64-bit integer (between
--9223372036854775807 and 9223372036854775808).
+\-9223372036854775807 and 9223372036854775807).
.TP
.BR \-R " "\fIrule-base\fP
Set the rule base of of the filters to
diff --git a/man/cg-negative.1 b/man/cg-negative.1
index b11ecb9..098cc1b 100644
--- a/man/cg-negative.1
+++ b/man/cg-negative.1
@@ -72,8 +72,8 @@ all available adjustment methods are printed.
.BR \-p " "\fIpriority\fP
Set the priority of the filter. Filters with higher priority
are applied before filters with lower priority. The value
-must be a signed 64-bit integer (between -9223372036854775807
-and 9223372036854775808).
+must be a signed 64-bit integer (between \-9223372036854775807
+and 9223372036854775807).
.BR cg-negative 's
default priority is 4611686018427387904.
diff --git a/man/cg-rainbow.1 b/man/cg-rainbow.1
index 761d436..cd397f8 100644
--- a/man/cg-rainbow.1
+++ b/man/cg-rainbow.1
@@ -77,8 +77,8 @@ all available adjustment methods are printed.
.BR \-p " "\fIpriority\fP
Set the priority of the filter. Filters with higher priority
are applied before filters with lower priority. The value
-must be a signed 64-bit integer (between -9223372036854775807
-and 9223372036854775808).
+must be a signed 64-bit integer (between \-9223372036854775807
+and 9223372036854775807).
.BR cg-rainbow 's
default priority is 1152921504606846976.
diff --git a/man/cg-shallow.1 b/man/cg-shallow.1
new file mode 100644
index 0000000..8b80263
--- /dev/null
+++ b/man/cg-shallow.1
@@ -0,0 +1,130 @@
+.TH CG-SHALLOW 1 CG-TOOLS
+.SH NAME
+cg-shallow - Emulate low colour resolution on the monitors
+.SH SYNOPSIS
+.B cg-shallow
+.RB [ \-M
+.IR method ]
+.RB [ \-S
+.IR site ]
+.RB [ \-c
+.IR crtc "]... ["\fB\-R\fP
+.IR rule ]
+.RB ( \-x
+|
+.RB [ \-p
+.IR priority ]
+.RB [ \-d ]
+.RI [ all
+|
+.I red
+.I green
+.IR blue ])
+.SH DESCRIPTION
+.B cg-shallow
+degrades the colour resolution on the monitors, to
+.I all
+values on each channel, or to
+.IR red ,
+.IR green ,
+and
+.I blue
+to the red, green, and blue channels independently, respectively.
+A value of 0 means the resolution will not be changes. The values
+are encodingly equidistantly distributed with black and full colour
+remaining as is, unless the value 1 is specified, in which case
+it undefined which brightness the channel will be fixed at.
+.PP
+If neither
+.I all
+or
+.IR red ,
+.IR green ,
+and
+.I blue
+are specified, the value 2 for all channels is selected by default.
+.SH OPTIONS
+.TP
+.BR \-c " "\fIcrtc\fP
+Apply the filter to the CRTC with the monitor whose EDID is
+.IR crtc .
+By default, the filter is applied to all monitors.
+
+If
+.I crtc
+is
+.RB ' ? ',
+all available CRTC's are listed.
+.TP
+.B \-d
+Keep the process alive and remove the filter on death.
+.TP
+.BR \-M " "\fImethod\fP
+Adjustment method name or number. Recognised names include:
+.TS
+tab(:);
+l l.
+\fBdummy\fP:Dummy method
+\fBrandr\fP:X RAndR
+\fBvidmode\fP:X VidMode
+\fBdrm\fP:Linux DRM
+\fBgdi\fP:Windows GDI
+\fBquartz\fP:Quartz Core Graphics
+.TE
+
+The adjustment methods are supported via
+.BR libgamma (7).
+Only methods that were enabled when
+.B libgamma
+was compiled will be supported.
+
+If
+.I method
+is
+.RB ' ? ',
+all available adjustment methods are printed.
+.TP
+.BR \-p " "\fIpriority\fP
+Set the priority of the filter. Filters with higher priority
+are applied before filters with lower priority. The value
+must be a signed 64-bit integer (between \-9223372036854775807
+and 9223372036854775807).
+.BR cg-brilliance 's
+default priority is \-6917529027641081856.
+
+If
+.I priority
+is
+.RB ' ? ',
+the utility's default priority is printed.
+.TP
+.BR \-R " "\fIrule\fP
+Set the rule of of the filter to
+.IR rule .
+This is the last part of the filter's identifier (class).
+The default rule is
+.BR standard .
+
+If
+.I rule
+is
+.RB ' ? '
+the utility's default rule is printed. If
+.I rule
+is
+.RB ' ?? '
+the utility's default class is printed.
+.TP
+.BR \-S " "\fIsite\fP
+Select the site to which to connect. For example
+.RB ' :0 ',
+for local display 0 when using
+.BR X .
+.TP
+.B \-x
+Remove the currently applied filter.
+.SH "SEE ALSO"
+.BR cg-tools (7)
+.SH BUGS
+Please report bugs to https://github.com/maandree/cg-tools/issues
+or to maandree@kth.se
diff --git a/man/cg-sleepmode.1 b/man/cg-sleepmode.1
index f5bc0ca..c750ea0 100644
--- a/man/cg-sleepmode.1
+++ b/man/cg-sleepmode.1
@@ -96,8 +96,8 @@ all available adjustment methods are printed.
.BR \-p " "\fIpriority\fP
Set the priority of the filter. Filters with higher priority
are applied before filters with lower priority. The value
-must be a signed 64-bit integer (between -9223372036854775807
-and 9223372036854775808).
+must be a signed 64-bit integer (between \-9223372036854775807
+and 9223372036854775807).
.BR cg-sleepmode 's
default priority is 1729382256910270464.
diff --git a/src/cg-base.c b/src/cg-base.c
index b44c065..9f77937 100644
--- a/src/cg-base.c
+++ b/src/cg-base.c
@@ -1,6 +1,6 @@
/**
* cg-tools -- Cooperative gamma-enabled tools
- * Copyright (C) 2016 Mattias Andrée (maandree@kth.se)
+ * Copyright (C) 2016, 2018 Mattias Andrée (maandree@kth.se)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/src/cg-brilliance.c b/src/cg-brilliance.c
index 40d74a7..3541d03 100644
--- a/src/cg-brilliance.c
+++ b/src/cg-brilliance.c
@@ -1,6 +1,6 @@
/**
* cg-tools -- Cooperative gamma-enabled tools
- * Copyright (C) 2016 Mattias Andrée (maandree@kth.se)
+ * Copyright (C) 2016, 2018 Mattias Andrée (maandree@kth.se)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -30,7 +30,7 @@
/**
* The default filter priority for the program
*/
-const int64_t default_priority = ((int64_t)1) << 61;
+const int64_t default_priority = (int64_t)1 << 61;
/**
* The default class for the program
@@ -128,7 +128,7 @@ int handle_opt(char* opt, char* arg)
*
* @param out Output parameter for the value
* @param str The string
- * @retunr Zero on success, -1 if the string is invalid
+ * @return Zero on success, -1 if the string is invalid
*/
static int parse_double(double* restrict out, const char* restrict str)
{
diff --git a/src/cg-darkroom.c b/src/cg-darkroom.c
index 2151e1b..9990aa3 100644
--- a/src/cg-darkroom.c
+++ b/src/cg-darkroom.c
@@ -1,6 +1,6 @@
/**
* cg-tools -- Cooperative gamma-enabled tools
- * Copyright (C) 2016 Mattias Andrée (maandree@kth.se)
+ * Copyright (C) 2016, 2018 Mattias Andrée (maandree@kth.se)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -30,7 +30,7 @@
/**
* The default filter priority for the program
*/
-const int64_t default_priority = ((int64_t)3) << 61;
+const int64_t default_priority = (int64_t)3 << 61;
/**
* The default class for the program
@@ -118,7 +118,7 @@ int handle_opt(char* opt, char* arg)
*
* @param out Output parameter for the value
* @param str The string
- * @retunr Zero on success, -1 if the string is invalid
+ * @return Zero on success, -1 if the string is invalid
*/
static int parse_double(double* restrict out, const char* restrict str)
{
diff --git a/src/cg-gamma.c b/src/cg-gamma.c
index 62b35df..1d24d07 100644
--- a/src/cg-gamma.c
+++ b/src/cg-gamma.c
@@ -1,6 +1,6 @@
/**
* cg-tools -- Cooperative gamma-enabled tools
- * Copyright (C) 2016 Mattias Andrée (maandree@kth.se)
+ * Copyright (C) 2016, 2018 Mattias Andrée (maandree@kth.se)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -213,7 +213,7 @@ static char* get_conf_file(const char* restrict confname)
*
* @param out Output parameter for the value
* @param str The string
- * @retunr Zero on success, -1 if the string is invalid
+ * @return Zero on success, -1 if the string is invalid
*/
static int parse_double(double* restrict out, const char* restrict str)
{
diff --git a/src/cg-icc.c b/src/cg-icc.c
index f1a6be7..5970930 100644
--- a/src/cg-icc.c
+++ b/src/cg-icc.c
@@ -1,6 +1,6 @@
/**
* cg-tools -- Cooperative gamma-enabled tools
- * Copyright (C) 2016 Mattias Andrée (maandree@kth.se)
+ * Copyright (C) 2016, 2018 Mattias Andrée (maandree@kth.se)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/src/cg-limits.c b/src/cg-limits.c
index 390059e..8390385 100644
--- a/src/cg-limits.c
+++ b/src/cg-limits.c
@@ -1,6 +1,6 @@
/**
* cg-tools -- Cooperative gamma-enabled tools
- * Copyright (C) 2016 Mattias Andrée (maandree@kth.se)
+ * Copyright (C) 2016, 2018 Mattias Andrée (maandree@kth.se)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -33,7 +33,7 @@
/**
* The default filter priority for the program
*/
-const int64_t default_priority = -(((int64_t)1) << 62);
+const int64_t default_priority = -((int64_t)1 << 62);
/**
* The default class for the program
@@ -272,7 +272,7 @@ static char* get_conf_file(const char* restrict confname)
*
* @param out Output parameter for the value
* @param str The string
- * @retunr Zero on success, -1 if the string is invalid
+ * @return Zero on success, -1 if the string is invalid
*/
static int parse_double(double* restrict out, const char* restrict str)
{
@@ -293,7 +293,7 @@ static int parse_double(double* restrict out, const char* restrict str)
* @param left Output parameter for the first value
* @param right Output parameter for the second value
* @param str The string
- * @retunr Zero on success, -1 if the string is invalid
+ * @return Zero on success, -1 if the string is invalid
*/
static int parse_twidouble(double* restrict left, double* restrict right, const char* restrict str)
{
diff --git a/src/cg-linear.c b/src/cg-linear.c
index 9423014..1ce9a5d 100644
--- a/src/cg-linear.c
+++ b/src/cg-linear.c
@@ -1,6 +1,6 @@
/**
* cg-tools -- Cooperative gamma-enabled tools
- * Copyright (C) 2016 Mattias Andrée (maandree@kth.se)
+ * Copyright (C) 2016, 2018 Mattias Andrée (maandree@kth.se)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/src/cg-negative.c b/src/cg-negative.c
index 90b0df2..8a98959 100644
--- a/src/cg-negative.c
+++ b/src/cg-negative.c
@@ -1,6 +1,6 @@
/**
* cg-tools -- Cooperative gamma-enabled tools
- * Copyright (C) 2016 Mattias Andrée (maandree@kth.se)
+ * Copyright (C) 2016, 2018 Mattias Andrée (maandree@kth.se)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -30,7 +30,7 @@
/**
* The default filter priority for the program
*/
-const int64_t default_priority = ((int64_t)1) << 62;
+const int64_t default_priority = (int64_t)1 << 62;
/**
* The default class for the program
diff --git a/src/cg-query.c b/src/cg-query.c
index 23b6349..a24ef11 100644
--- a/src/cg-query.c
+++ b/src/cg-query.c
@@ -1,6 +1,6 @@
/**
* cg-tools -- Cooperative gamma-enabled tools
- * Copyright (C) 2016 Mattias Andrée (maandree@kth.se)
+ * Copyright (C) 2016, 2018 Mattias Andrée (maandree@kth.se)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/src/cg-rainbow.c b/src/cg-rainbow.c
index 2cfb581..067785f 100644
--- a/src/cg-rainbow.c
+++ b/src/cg-rainbow.c
@@ -1,6 +1,6 @@
/**
* cg-tools -- Cooperative gamma-enabled tools
- * Copyright (C) 2016 Mattias Andrée (maandree@kth.se)
+ * Copyright (C) 2016, 2018 Mattias Andrée (maandree@kth.se)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -33,7 +33,7 @@
/**
* The default filter priority for the program
*/
-const int64_t default_priority = ((int64_t)1) << 60;
+const int64_t default_priority = (int64_t)1 << 60;
/**
* The default class for the program
@@ -123,7 +123,7 @@ int handle_opt(char* opt, char* arg)
*
* @param out Output parameter for the value
* @param str The string
- * @retunr Zero on success, -1 if the string is invalid
+ * @return Zero on success, -1 if the string is invalid
*/
static int parse_double(double* restrict out, const char* restrict str)
{
diff --git a/src/cg-remove.c b/src/cg-remove.c
index e7315e8..d942f87 100644
--- a/src/cg-remove.c
+++ b/src/cg-remove.c
@@ -1,6 +1,6 @@
/**
* cg-tools -- Cooperative gamma-enabled tools
- * Copyright (C) 2016 Mattias Andrée (maandree@kth.se)
+ * Copyright (C) 2016, 2018 Mattias Andrée (maandree@kth.se)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/src/cg-shallow.c b/src/cg-shallow.c
new file mode 100644
index 0000000..230da88
--- /dev/null
+++ b/src/cg-shallow.c
@@ -0,0 +1,279 @@
+/**
+ * cg-tools -- Cooperative gamma-enabled tools
+ * Copyright (C) 2016, 2018 Mattias Andrée (maandree@kth.se)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "cg-base.h"
+
+#include <libclut.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+
+
+/**
+ * The default filter priority for the program
+ */
+const int64_t default_priority = -((int64_t)3 << 61);
+
+/**
+ * The default class for the program
+ */
+char default_class[] = PKGNAME "::cg-shallow::standard";
+
+/**
+ * Class suffixes
+ */
+const char* const* class_suffixes = (const char* const[]){NULL};
+
+
+
+/**
+ * -d: keep process alive and remove filter on death
+ */
+static int dflag = 0;
+
+/**
+ * -x: remove filter rather than adding it
+ */
+static int xflag = 0;
+
+/**
+ * The emulated red resolution, 0 for unchanged.
+ */
+static size_t rres = 2;
+
+/**
+ * The emulated green resolution, 0 for unchanged.
+ */
+static size_t gres = 2;
+
+/**
+ * The emulated blue resolution, 0 for unchanged.
+ */
+static size_t bres = 2;
+
+
+/**
+ * Print usage information and exit
+ */
+void usage(void)
+{
+ fprintf(stderr,
+ "Usage: %s [-M method] [-S site] [-c crtc]... [-R rule] "
+ "(-x | [-p priority] [-d] [all | red green blue])\n",
+ argv0);
+ exit(1);
+}
+
+
+/**
+ * Handle a command line option
+ *
+ * @param opt The option, it is a NUL-terminate two-character
+ * string starting with either '-' or '+', if the
+ * argument is not recognised, call `usage`. This
+ * string will not be "-M", "-S", "-c", "-p", or "-R".
+ * @param arg The argument associated with `opt`,
+ * `NULL` there is no next argument, if this
+ * parameter is `NULL` but needed, call `usage`
+ * @return 0 if `arg` was not used,
+ * 1 if `arg` was used,
+ * -1 on error
+ */
+int handle_opt(char* opt, char* arg)
+{
+ if (opt[0] == '-')
+ switch (opt[1])
+ {
+ case 'd':
+ if (dflag || xflag)
+ usage();
+ dflag = 1;
+ break;
+ case 'x':
+ if (xflag || dflag)
+ usage();
+ xflag = 1;
+ break;
+ default:
+ usage();
+ }
+ else
+ usage();
+ return 0;
+ (void) arg;
+}
+
+
+/**
+ * Parse a non-negative integer encoded as a string
+ *
+ * @param out Output parameter for the value
+ * @param str The string
+ * @return Zero on success, -1 if the string is invalid
+ */
+static int parse_int(size_t* restrict out, const char* restrict str)
+{
+ char* end;
+ errno = 0;
+ if (!isdigit(*str))
+ return -1;
+ *out = strtoul(str, &end, 10);
+ if (errno || *end)
+ return -1;
+ return 0;
+}
+
+
+/**
+ * This function is called after the last
+ * call to `handle_opt`
+ *
+ * @param argc The number of unparsed arguments
+ * @param argv `NULL` terminated list of unparsed arguments
+ * @param prio The argument associated with the "-p" option
+ * @return Zero on success, -1 on error
+ */
+int handle_args(int argc, char* argv[], char* prio)
+{
+ char* red = NULL;
+ char* green = NULL;
+ char* blue = NULL;
+ int q = xflag + (dflag | (argc > 0));
+ if ((q > 1) || (xflag && (prio != NULL)))
+ usage();
+ if (argc == 1)
+ red = green = blue = argv[0];
+ else if (argc == 3)
+ {
+ red = argv[0];
+ green = argv[1];
+ blue = argv[2];
+ }
+ else if (argc && !xflag)
+ usage();
+ if (argc)
+ {
+ if (parse_int(&rres, red) < 0)
+ usage();
+ if (parse_int(&gres, blue) < 0)
+ usage();
+ if (parse_int(&bres, green) < 0)
+ usage();
+ }
+ return 0;
+ (void) argv;
+}
+
+
+/**
+ * Fill a filter
+ *
+ * @param filter The filter to fill
+ */
+static void fill_filter(libcoopgamma_filter_t* restrict filter)
+{
+ switch (filter->depth)
+ {
+#define X(CONST, MEMBER, MAX, TYPE)\
+ case CONST:\
+ libclut_lower_resolution(&(filter->ramps.MEMBER), MAX, TYPE, 0, rres, 0, gres, 0, bres);\
+ break;
+LIST_DEPTHS
+#undef X
+ default:
+ abort();
+ }
+}
+
+
+/**
+ * The main function for the program-specific code
+ *
+ * @return 0: Success
+ * -1: Error, `errno` set
+ * -2: Error, `cg.error` set
+ * -3: Error, message already printed
+ */
+int start(void)
+{
+ int r;
+ size_t i, j;
+
+ if (xflag)
+ for (i = 0; i < filters_n; i++)
+ crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE;
+ else if (dflag)
+ for (i = 0; i < filters_n; i++)
+ crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_DEATH;
+ else
+ for (i = 0; i < filters_n; i++)
+ crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL;
+
+ if (!xflag)
+ if ((r = make_slaves()) < 0)
+ return r;
+
+ for (i = 0, r = 1; i < filters_n; i++)
+ {
+ if (!(crtc_updates[i].master) || !(crtc_info[crtc_updates[i].crtc].supported))
+ continue;
+ if (!xflag)
+ fill_filter(&(crtc_updates[i].filter));
+ r = update_filter(i, 0);
+ if ((r == -2) || ((r == -1) && (errno != EAGAIN)))
+ return r;
+ if (crtc_updates[i].slaves != NULL)
+ for (j = 0; crtc_updates[i].slaves[j] != 0; j++)
+ {
+ r = update_filter(crtc_updates[i].slaves[j], 0);
+ if ((r == -2) || ((r == -1) && (errno != EAGAIN)))
+ return r;
+ }
+ }
+
+ while (r != 1)
+ if ((r = synchronise(-1)) < 0)
+ return r;
+
+ if (!dflag)
+ return 0;
+
+ if (libcoopgamma_set_nonblocking(&cg, 0) < 0)
+ return -1;
+ for (;;)
+ if (libcoopgamma_synchronise(&cg, NULL, 0, &j) < 0)
+ switch (errno)
+ {
+ case 0:
+ break;
+ case ENOTRECOVERABLE:
+ goto enotrecoverable;
+ default:
+ return -1;
+ }
+
+ enotrecoverable:
+ for (;;)
+ if (pause() < 0)
+ return -1;
+}
+
diff --git a/src/cg-sleepmode.c b/src/cg-sleepmode.c
index 1ec2e1d..3248d58 100644
--- a/src/cg-sleepmode.c
+++ b/src/cg-sleepmode.c
@@ -1,6 +1,6 @@
/**
* cg-tools -- Cooperative gamma-enabled tools
- * Copyright (C) 2016 Mattias Andrée (maandree@kth.se)
+ * Copyright (C) 2016, 2018 Mattias Andrée (maandree@kth.se)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -36,7 +36,7 @@
/**
* The default filter priority for the program
*/
-const int64_t default_priority = ((int64_t)3) << 59;
+const int64_t default_priority = (int64_t)3 << 59;
/**
* The default class for the program
@@ -174,7 +174,7 @@ int handle_opt(char* opt, char* arg)
*
* @param out Output parameter for the value
* @param str The string
- * @retunr Zero on success, -1 if the string is invalid
+ * @return Zero on success, -1 if the string is invalid
*/
static int parse_double(double* restrict out, const char* restrict str)
{