Pass arguments as string to adjustment methods.
This commit is contained in:
+38
-1
@@ -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 */
|
||||
|
||||
+1
-1
@@ -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]);
|
||||
|
||||
+14
-30
@@ -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);
|
||||
|
||||
+1
-1
@@ -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,
|
||||
|
||||
+29
-1
@@ -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 */
|
||||
|
||||
+1
-1
@@ -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]);
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
|
||||
+1
-1
@@ -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]);
|
||||
|
||||
Reference in New Issue
Block a user