diff options
author | Jon Lund Steffensen <jonlst@gmail.com> | 2010-05-24 21:26:06 +0200 |
---|---|---|
committer | Jon Lund Steffensen <jonlst@gmail.com> | 2010-05-24 21:26:06 +0200 |
commit | 1d88c2b10ca295ddd8636cc0338bb07d76bfae04 (patch) | |
tree | c0d676c0fa818cba8c5b883ae4094707cb7c651d /src | |
parent | Move gamma method spec structs to redshift.h (diff) | |
download | redshift-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.c | 39 | ||||
-rw-r--r-- | src/randr.h | 2 | ||||
-rw-r--r-- | src/redshift.c | 44 | ||||
-rw-r--r-- | src/redshift.h | 2 | ||||
-rw-r--r-- | src/vidmode.c | 30 | ||||
-rw-r--r-- | src/vidmode.h | 2 | ||||
-rw-r--r-- | src/w32gdi.c | 2 | ||||
-rw-r--r-- | src/w32gdi.h | 2 |
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]); |