aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2025-03-23 15:08:45 +0100
committerMattias Andrée <m@maandree.se>2025-03-23 15:08:45 +0100
commit1ea4a4d1968b767912e70e18be8f0e1e22bf9c6f (patch)
treefdb5e2eb1fb03aa672281130ef71c579a262e81a
parentUpdate documentation reflect that the drm method now supports CRTC list (diff)
downloadredshift-ng-1ea4a4d1968b767912e70e18be8f0e1e22bf9c6f.tar.gz
redshift-ng-1ea4a4d1968b767912e70e18be8f0e1e22bf9c6f.tar.bz2
redshift-ng-1ea4a4d1968b767912e70e18be8f0e1e22bf9c6f.tar.xz
Use libgamma to determine available adjustment method configuration options
Signed-off-by: Mattias Andrée <m@maandree.se>
-rw-r--r--src/backend-direct.c46
-rw-r--r--src/common.h24
-rw-r--r--src/gamma-drm.c29
-rw-r--r--src/gamma-quartz.c25
-rw-r--r--src/gamma-randr.c32
-rw-r--r--src/gamma-vidmode.c28
-rw-r--r--src/gamma-w32gdi.c25
7 files changed, 98 insertions, 111 deletions
diff --git a/src/backend-direct.c b/src/backend-direct.c
index d0a53eb..5654947 100644
--- a/src/backend-direct.c
+++ b/src/backend-direct.c
@@ -197,6 +197,52 @@ direct_create(struct gamma_state **state_out, int method, const char *method_nam
}
+void
+direct_print_help(FILE *f, int method)
+{
+ struct libgamma_method_capabilities caps;
+
+ if (libgamma_method_capabilities(&caps, sizeof(caps), method)) {
+ fputs(_("Adjustment not available\n"), f);
+ fputs("\n", f);
+ return;
+ }
+
+ if (caps.multiple_partitions && caps.partitions_are_graphics_cards) {
+ /* TRANSLATORS: left column must not be translated */
+ fputs(_(" card=N Graphics card to apply adjustments to\n"), f);
+ } else if (caps.multiple_partitions) {
+ /* TRANSLATORS: left column must not be translated */
+ fputs(_(" screen=N X screen to apply adjustments to\n"), f);
+ }
+
+ if (caps.multiple_crtcs) {
+ /* TRANSLATORS: left column must not be translated */
+ fputs(_(" crtc=N List of comma-separated CRTCs to apply adjustments to\n"), f);
+ }
+
+ if (caps.multiple_partitions || caps.multiple_crtcs)
+ fputs("\n", f);
+}
+
+
+int
+direct_set_option(struct gamma_state *state, const char *key, const char *value)
+{
+ if (state->multiple_partitions && !strcasecmp(key, state->partitions_are_graphics_cards ? "card" : "screen")) {
+ return direct_set_partitions(state, key, value);
+ } else if (state->multiple_crtcs && !strcasecmp(key, "crtc")) {
+ return direct_set_crtcs(state, key, value);
+ } else if (!strcasecmp(key, "preserve")) {
+ weprintf(_("Deprecated method parameter ignored: `%s'."), key);
+ return 0;
+ } else {
+ weprintf(_("Unknown method parameter: `%s'."), key);
+ return -1;
+ }
+}
+
+
int
direct_set_partitions(struct gamma_state *state, const char *key, const char *value)
{
diff --git a/src/common.h b/src/common.h
index aa929ae..578a82d 100644
--- a/src/common.h
+++ b/src/common.h
@@ -1184,14 +1184,34 @@ extern int verbose;
/**
* Create an initialised state object for direct gamma adjustments
*
- * @param state_out Output parameter for the state object
- * @return 0 on success, -1 on failure
+ * @param state_out Output parameter for the state object
+ * @param method libgamma constant for the adjustment method
+ * @param method_name redshift's name for the adjustment method
+ * @return 0 on success, -1 on failure
*
* `*state_out` is set (potentially to `NULL`) on failure
*/
int direct_create(GAMMA_STATE **state_out, int method, const char *method_name);
/**
+ * Print help on options for the adjustment method using direct gamma adjustments
+ *
+ * @param f Output sink
+ * @param method libgamma constant for the adjustment method
+ */
+void direct_print_help(FILE *f, int method);
+
+/**
+ * Configure the adjustment method using direct gamma adjustments
+ *
+ * @param state State object for the adjustment method
+ * @param key Option to configure
+ * @param value Option value to set
+ * @return 0 on success, -1 on failure
+ */
+int direct_set_option(GAMMA_STATE *state, const char *key, const char *value);
+
+/**
* Select partitions to apply adjustments to using direct gamma adjustments
*
* @param state State object for the adjustment method
diff --git a/src/gamma-drm.c b/src/gamma-drm.c
index f5aef31..798fc84 100644
--- a/src/gamma-drm.c
+++ b/src/gamma-drm.c
@@ -32,30 +32,13 @@ drm_print_help(FILE *f)
{
fputs(_("Adjust gamma ramps with Direct Rendering Manager.\n"), f);
fputs("\n", f);
-
- /* TRANSLATORS: DRM help output left column must not be translated */
- fputs(_(" card=N Graphics card to apply adjustments to\n"), f);
- fputs(_(" crtc=N List of comma-separated CRTCs to apply adjustments to\n"), f);
- fputs("\n", f);
-}
-
-
-static int
-drm_set_option(struct gamma_state *state, const char *key, const char *value)
-{
- if (!strcasecmp(key, "card")) {
- return direct_set_partitions(state, key, value);
- } else if (!strcasecmp(key, "crtc")) {
- return direct_set_crtcs(state, key, value);
- } else {
- weprintf(_("Unknown method parameter: `%s'."), key);
- return -1;
- }
+ direct_print_help(f, LIBGAMMA_METHOD_LINUX_DRM);
}
-#define drm_start direct_start
-#define drm_apply direct_apply
-#define drm_restore direct_restore
-#define drm_free direct_free
+#define drm_set_option direct_set_option
+#define drm_start direct_start
+#define drm_apply direct_apply
+#define drm_restore direct_restore
+#define drm_free direct_free
const struct gamma_method drm_gamma_method = GAMMA_METHOD_INIT("drm", 0, 0, drm);
diff --git a/src/gamma-quartz.c b/src/gamma-quartz.c
index ba8a4c4..1750c98 100644
--- a/src/gamma-quartz.c
+++ b/src/gamma-quartz.c
@@ -32,26 +32,13 @@ quartz_print_help(FILE *f)
{
fputs(_("Adjust gamma ramps on macOS using Quartz.\n"), f);
fputs("\n", f);
+ direct_print_help(f, LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS);
}
-static int
-quartz_set_option(struct gamma_state *state, const char *key, const char *value)
-{
- (void) state;
- (void) value;
- if (!strcasecmp(key, "preserve")) {
- weprintf(_("Deprecated method parameter ignored: `%s'."), key);
- return 0;
- } else {
- weprintf(_("Unknown method parameter: `%s'."), key);
- return -1;
- }
-}
-
-
-#define quartz_start direct_start
-#define quartz_apply direct_apply
-#define quartz_restore direct_restore
-#define quartz_free direct_free
+#define quartz_set_option direct_set_option
+#define quartz_start direct_start
+#define quartz_apply direct_apply
+#define quartz_restore direct_restore
+#define quartz_free direct_free
const struct gamma_method quartz_gamma_method = GAMMA_METHOD_INIT("quartz", 1, 1, quartz);
diff --git a/src/gamma-randr.c b/src/gamma-randr.c
index 1132960..5580a4f 100644
--- a/src/gamma-randr.c
+++ b/src/gamma-randr.c
@@ -32,33 +32,13 @@ randr_print_help(FILE *f)
{
fputs(_("Adjust gamma ramps with the X RANDR extension.\n"), f);
fputs("\n", f);
-
- /* TRANSLATORS: RANDR help output left column must not be translated */
- fputs(_(" screen=N X screen to apply adjustments to\n"), f);
- fputs(_(" crtc=N List of comma-separated CRTCs to apply adjustments to\n"), f);
- fputs("\n", f);
-}
-
-
-static int
-randr_set_option(struct gamma_state *state, const char *key, const char *value)
-{
- if (!strcasecmp(key, "screen")) {
- return direct_set_partitions(state, key, value);
- } else if (!strcasecmp(key, "crtc")) {
- return direct_set_crtcs(state, key, value);
- } else if (!strcasecmp(key, "preserve")) {
- weprintf(_("Deprecated method parameter ignored: `%s'."), key);
- return 0;
- } else {
- weprintf(_("Unknown method parameter: `%s'."), key);
- return -1;
- }
+ direct_print_help(f, LIBGAMMA_METHOD_X_RANDR);
}
-#define randr_start direct_start
-#define randr_apply direct_apply
-#define randr_restore direct_restore
-#define randr_free direct_free
+#define randr_set_option direct_set_option
+#define randr_start direct_start
+#define randr_apply direct_apply
+#define randr_restore direct_restore
+#define randr_free direct_free
const struct gamma_method randr_gamma_method = GAMMA_METHOD_INIT("randr", 1, 0, randr);
diff --git a/src/gamma-vidmode.c b/src/gamma-vidmode.c
index e38de97..505fba0 100644
--- a/src/gamma-vidmode.c
+++ b/src/gamma-vidmode.c
@@ -32,29 +32,13 @@ vidmode_print_help(FILE *f)
{
fputs(_("Adjust gamma ramps with the X VidMode extension.\n"), f);
fputs("\n", f);
-
- fputs(_(" screen=N X screen to apply adjustments to\n"), f);
- fputs("\n", f);
-}
-
-
-static int
-vidmode_set_option(struct gamma_state *state, const char *key, const char *value)
-{
- if (!strcasecmp(key, "screen")) {
- return direct_set_partitions(state, key, value);
- } else if (!strcasecmp(key, "preserve")) {
- weprintf(_("Deprecated method parameter ignored: `%s'."), key);
- return 0;
- } else {
- weprintf(_("Unknown method parameter: `%s'."), key);
- return -1;
- }
+ direct_print_help(f, LIBGAMMA_METHOD_X_VIDMODE);
}
-#define vidmode_start direct_start
-#define vidmode_apply direct_apply
-#define vidmode_restore direct_restore
-#define vidmode_free direct_free
+#define vidmode_set_option direct_set_option
+#define vidmode_start direct_start
+#define vidmode_apply direct_apply
+#define vidmode_restore direct_restore
+#define vidmode_free direct_free
const struct gamma_method vidmode_gamma_method = GAMMA_METHOD_INIT("vidmode", 1, 0, vidmode);
diff --git a/src/gamma-w32gdi.c b/src/gamma-w32gdi.c
index d06f6b1..a09f768 100644
--- a/src/gamma-w32gdi.c
+++ b/src/gamma-w32gdi.c
@@ -32,26 +32,13 @@ w32gdi_print_help(FILE *f)
{
fputs(_("Adjust gamma ramps with the Windows GDI.\n"), f);
fputs("\n", f);
+ direct_print_help(f, LIBGAMMA_METHOD_W32_GDI);
}
-static int
-w32gdi_set_option(struct gamma_state *state, const char *key, const char *value)
-{
- (void) state;
- (void) value;
- if (!strcasecmp(key, "preserve")) {
- weprintf(_("Deprecated method parameter ignored: `%s'."), key);
- return 0;
- } else {
- weprintf(_("Unknown method parameter: `%s'."), key);
- return -1;
- }
-}
-
-
-#define w32gdi_start direct_start
-#define w32gdi_apply direct_apply
-#define w32gdi_restore direct_restore
-#define w32gdi_free direct_free
+#define w32gdi_set_option direct_set_option
+#define w32gdi_start direct_start
+#define w32gdi_apply direct_apply
+#define w32gdi_restore direct_restore
+#define w32gdi_free direct_free
const struct gamma_method w32gdi_gamma_method = GAMMA_METHOD_INIT("wingdi", 1, 0, w32gdi);