aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJon Lund Steffensen <jonlst@gmail.com>2010-05-24 21:26:06 +0200
committerJon Lund Steffensen <jonlst@gmail.com>2010-05-24 21:26:06 +0200
commit1d88c2b10ca295ddd8636cc0338bb07d76bfae04 (patch)
treec0d676c0fa818cba8c5b883ae4094707cb7c651d /src
parentMove gamma method spec structs to redshift.h (diff)
downloadredshift-ng-1d88c2b10ca295ddd8636cc0338bb07d76bfae04.tar.gz
redshift-ng-1d88c2b10ca295ddd8636cc0338bb07d76bfae04.tar.bz2
redshift-ng-1d88c2b10ca295ddd8636cc0338bb07d76bfae04.tar.xz
Pass arguments as string to adjustment methods.
Diffstat (limited to 'src')
-rw-r--r--src/randr.c39
-rw-r--r--src/randr.h2
-rw-r--r--src/redshift.c44
-rw-r--r--src/redshift.h2
-rw-r--r--src/vidmode.c30
-rw-r--r--src/vidmode.h2
-rw-r--r--src/w32gdi.c2
-rw-r--r--src/w32gdi.h2
8 files changed, 86 insertions, 37 deletions
diff --git a/src/randr.c b/src/randr.c
index 3ee0f42..4ee1756 100644
--- a/src/randr.c
+++ b/src/randr.c
@@ -19,6 +19,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stdint.h>
#include <string.h>
#ifdef ENABLE_NLS
@@ -40,8 +41,44 @@
int
-randr_init(randr_state_t *state, int screen_num, int crtc_num)
+randr_init(randr_state_t *state, char *args)
{
+ int screen_num = -1;
+ int crtc_num = -1;
+
+ /* Parse arguments. */
+ while (args != NULL) {
+ char *next_arg = strchr(args, ':');
+ if (next_arg != NULL) *(next_arg++) = '\0';
+
+ char *value = strchr(args, '=');
+ if (value != NULL) *(value++) = '\0';
+
+ if (strcasecmp(args, "screen") == 0) {
+ if (value == NULL) {
+ fprintf(stderr, _("Missing value for"
+ " parameter: `%s'.\n"),
+ args);
+ return -1;
+ }
+ screen_num = atoi(value);
+ } else if (strcasecmp(args, "crtc") == 0) {
+ if (value == NULL) {
+ fprintf(stderr, _("Missing value for"
+ " parameter: `%s'.\n"),
+ args);
+ return -1;
+ }
+ crtc_num = atoi(value);
+ } else {
+ fprintf(stderr, _("Unknown method parameter: `%s'.\n"),
+ args);
+ return -1;
+ }
+
+ args = next_arg;
+ }
+
xcb_generic_error_t *error;
/* Open X server connection */
diff --git a/src/randr.h b/src/randr.h
index 8e8e56e..3ad83bf 100644
--- a/src/randr.h
+++ b/src/randr.h
@@ -43,7 +43,7 @@ typedef struct {
} randr_state_t;
-int randr_init(randr_state_t *state, int screen_num, int crtc_num);
+int randr_init(randr_state_t *state, char *args);
void randr_free(randr_state_t *state);
void randr_restore(randr_state_t *state);
int randr_set_temperature(randr_state_t *state, int temp, float gamma[3]);
diff --git a/src/redshift.c b/src/redshift.c
index c39c033..869714f 100644
--- a/src/redshift.c
+++ b/src/redshift.c
@@ -81,15 +81,6 @@ typedef union {
} gamma_state_t;
-/* Enum of gamma adjustment methods */
-typedef enum {
- GAMMA_METHOD_RANDR,
- GAMMA_METHOD_VIDMODE,
- GAMMA_METHOD_WINGDI,
- GAMMA_METHOD_MAX
-} gamma_method_t;
-
-
/* Gamma adjustment method structs */
static const gamma_method_spec_t gamma_methods[] = {
#ifdef ENABLE_RANDR
@@ -283,9 +274,8 @@ main(int argc, char *argv[])
float gamma[3] = { DEFAULT_GAMMA, DEFAULT_GAMMA, DEFAULT_GAMMA };
const gamma_method_spec_t *method = NULL;
+ char *method_args = NULL;
- int screen_num = -1;
- int crtc_num = -1;
int transition = 1;
int one_shot = 0;
int verbose = 0;
@@ -293,11 +283,8 @@ main(int argc, char *argv[])
/* Parse arguments. */
int opt;
- while ((opt = getopt(argc, argv, "c:g:hl:m:ors:t:v")) != -1) {
+ while ((opt = getopt(argc, argv, "g:hl:m:ort:v")) != -1) {
switch (opt) {
- case 'c':
- crtc_num = atoi(optarg);
- break;
case 'g':
s = strchr(optarg, ':');
if (s == NULL) {
@@ -347,6 +334,13 @@ main(int argc, char *argv[])
exit(EXIT_SUCCESS);
}
+ /* Split off method arguments. */
+ s = strchr(optarg, ':');
+ if (s != NULL) {
+ *(s++) = '\0';
+ method_args = s;
+ }
+
/* Lookup argument in gamma methods table */
for (int i = 0; gamma_methods[i].name != NULL; i++) {
const gamma_method_spec_t *m =
@@ -370,9 +364,6 @@ main(int argc, char *argv[])
case 'r':
transition = 0;
break;
- case 's':
- screen_num = atoi(optarg);
- break;
case 't':
s = strchr(optarg, ':');
if (s == NULL) {
@@ -457,30 +448,23 @@ main(int argc, char *argv[])
gamma[0], gamma[1], gamma[2]);
}
- /* CRTC can only be selected for RANDR */
- if (crtc_num > -1 && method != GAMMA_METHOD_RANDR) {
- fprintf(stderr, _("CRTC can only be selected"
- " with the RANDR method.\n"));
- exit(EXIT_FAILURE);
- }
-
- /* Initialize gamma adjustment method. If method is negative
+ /* Initialize gamma adjustment method. If method is NULL
try all methods until one that works is found. */
gamma_state_t state;
if (method != NULL) {
- /* Use method specified on command line */
- r = method->init(&state, screen_num, crtc_num);
+ /* Use method specified on command line. */
+ r = method->init(&state, method_args);
if (r < 0) {
fprintf(stderr, _("Initialization of %s failed.\n"),
method->name);
exit(EXIT_FAILURE);
}
} else {
- /* Try all methods, use the first that works */
+ /* Try all methods, use the first that works. */
for (int i = 0; gamma_methods[i].name != NULL; i++) {
const gamma_method_spec_t *m = &gamma_methods[i];
- r = m->init(&state, screen_num, crtc_num);
+ r = m->init(&state, method_args);
if (r < 0) {
fprintf(stderr, _("Initialization of %s"
" failed.\n"), m->name);
diff --git a/src/redshift.h b/src/redshift.h
index 84e7818..3cfe738 100644
--- a/src/redshift.h
+++ b/src/redshift.h
@@ -21,7 +21,7 @@
#define _REDSHIFT_REDSHIFT_H
-typedef int gamma_method_init_func(void *state, int screen_num, int crtc_num);
+typedef int gamma_method_init_func(void *state, char *args);
typedef void gamma_method_free_func(void *state);
typedef void gamma_method_restore_func(void *state);
typedef int gamma_method_set_temperature_func(void *state, int temp,
diff --git a/src/vidmode.c b/src/vidmode.c
index 12bec8b..df66f8c 100644
--- a/src/vidmode.c
+++ b/src/vidmode.c
@@ -20,6 +20,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
+#include <string.h>
#ifdef ENABLE_NLS
# include <libintl.h>
@@ -36,8 +37,35 @@
int
-vidmode_init(vidmode_state_t *state, int screen_num, int crtc_num)
+vidmode_init(vidmode_state_t *state, char *args)
{
+ int screen_num = -1;
+
+ /* Parse arguments. */
+ while (args != NULL) {
+ char *next_arg = strchr(args, ':');
+ if (next_arg != NULL) *(next_arg++) = '\0';
+
+ char *value = strchr(args, '=');
+ if (value != NULL) *(value++) = '\0';
+
+ if (strcasecmp(args, "screen") == 0) {
+ if (value == NULL) {
+ fprintf(stderr, _("Missing value for"
+ " parameter: `%s'.\n"),
+ args);
+ return -1;
+ }
+ screen_num = atoi(value);
+ } else {
+ fprintf(stderr, _("Unknown method parameter: `%s'.\n"),
+ args);
+ return -1;
+ }
+
+ args = next_arg;
+ }
+
int r;
/* Open display */
diff --git a/src/vidmode.h b/src/vidmode.h
index 0386adc..2b6796d 100644
--- a/src/vidmode.h
+++ b/src/vidmode.h
@@ -31,7 +31,7 @@ typedef struct {
uint16_t *saved_ramps;
} vidmode_state_t;
-int vidmode_init(vidmode_state_t *state, int screen_num, int crtc_num);
+int vidmode_init(vidmode_state_t *state, char *args);
void vidmode_free(vidmode_state_t *state);
void vidmode_restore(vidmode_state_t *state);
int vidmode_set_temperature(vidmode_state_t *state, int temp, float gamma[3]);
diff --git a/src/w32gdi.c b/src/w32gdi.c
index e130d03..f15746e 100644
--- a/src/w32gdi.c
+++ b/src/w32gdi.c
@@ -38,7 +38,7 @@
int
-w32gdi_init(w32gdi_state_t *state, int screen_num, int crtc_num)
+w32gdi_init(w32gdi_state_t *state, char *args)
{
BOOL r;
diff --git a/src/w32gdi.h b/src/w32gdi.h
index 6a7c1c2..99ba3ee 100644
--- a/src/w32gdi.h
+++ b/src/w32gdi.h
@@ -29,7 +29,7 @@ typedef struct {
WORD *saved_ramps;
} w32gdi_state_t;
-int w32gdi_init(w32gdi_state_t *state, int screen_num, int crtc_num);
+int w32gdi_init(w32gdi_state_t *state, char *args);
void w32gdi_free(w32gdi_state_t *state);
void w32gdi_restore(w32gdi_state_t *state);
int w32gdi_set_temperature(w32gdi_state_t *state, int temp, float gamma[3]);