diff options
Diffstat (limited to 'src/redshift.c')
| -rw-r--r-- | src/redshift.c | 111 | 
1 files changed, 77 insertions, 34 deletions
| diff --git a/src/redshift.c b/src/redshift.c index 5042bd6..2273d7c 100644 --- a/src/redshift.c +++ b/src/redshift.c @@ -76,6 +76,10 @@  # include "location-gnome-clock.h"  #endif +#ifdef ENABLE_GEOCLUE +# include "location-geoclue.h" +#endif +  /* Union of state data for gamma adjustment methods */  typedef union { @@ -139,11 +143,28 @@ typedef union {  #ifdef ENABLE_GNOME_CLOCK  	location_gnome_clock_state_t gnome_clock;  #endif +#ifdef ENABLE_GEOCLUE +	location_geoclue_state_t geoclue; +#endif  } location_state_t;  /* Location provider method structs */  static const location_provider_t location_providers[] = { +#ifdef ENABLE_GEOCLUE +	{ +		"geoclue", +		(location_provider_init_func *)location_geoclue_init, +		(location_provider_start_func *)location_geoclue_start, +		(location_provider_free_func *)location_geoclue_free, +		(location_provider_print_help_func *) +		location_geoclue_print_help, +		(location_provider_set_option_func *) +		location_geoclue_set_option, +		(location_provider_get_location_func *) +		location_geoclue_get_location +	}, +#endif  #ifdef ENABLE_GNOME_CLOCK  	{  		"gnome-clock", @@ -180,12 +201,15 @@ static const location_provider_t location_providers[] = {  #define MAX_LON   180.0  #define MIN_TEMP   1000  #define MAX_TEMP  10000 +#define MIN_BRIGHTNESS  0.1 +#define MAX_BRIGHTNESS  1.0  #define MIN_GAMMA   0.1  #define MAX_GAMMA  10.0  /* Default values for parameters. */  #define DEFAULT_DAY_TEMP    5500  #define DEFAULT_NIGHT_TEMP  3700 +#define DEFAULT_BRIGHTNESS   1.0  #define DEFAULT_GAMMA        1.0  /* The color temperature when no adjustment is applied. */ @@ -535,6 +559,8 @@ parse_gamma_string(const char *str, float gamma[])  		gamma[1] = atof(g_s); /* Blue */  		gamma[2] = atof(s); /* Green */  	} + +	return 0;  }  static const gamma_method_t * @@ -567,19 +593,6 @@ find_location_provider(const char *name)  	return provider;  } -/* Check Color Temperature */ -void -check_temp(int temp) -{ -	/* Color temperature at daytime */ -	if (temp < MIN_TEMP || temp > MAX_TEMP) { -		fprintf(stderr, -			_("Temperature must be between %uK and %uK.\n"), -			MIN_TEMP, MAX_TEMP); -		exit(EXIT_FAILURE); -	} -} -  int  main(int argc, char *argv[]) @@ -603,6 +616,7 @@ main(int argc, char *argv[])  	int temp_day = -1;  	int temp_night = -1;  	float gamma[3] = { NAN, NAN, NAN }; +	float brightness = NAN;  	const gamma_method_t *method = NULL;  	char *method_args = NULL; @@ -617,8 +631,11 @@ main(int argc, char *argv[])  	/* Parse command line arguments. */  	int opt; -	while ((opt = getopt(argc, argv, "c:g:hl:m:oO:rt:vx")) != -1) { +	while ((opt = getopt(argc, argv, "b:c:g:hl:m:oO:rt:vx")) != -1) {  		switch (opt) { +		case 'b': +			brightness = atof(optarg); +			break;  		case 'c':  			if (config_filepath != NULL) free(config_filepath);  			config_filepath = strdup(optarg); @@ -717,19 +734,7 @@ main(int argc, char *argv[])  			break;  		case 'O':  			mode = PROGRAM_MODE_MANUAL; - -			/* Remove K and k from argument just in case. */ -			char* s = optarg; //arg string -			char* p; // position -			char* k = "Kk"; -			for (int i = 0; i < strlen(k); i++) -			{ -				if (p = strchr(s, k[i]))  -					memmove(p, p+1, strlen(p)); -			} - -			temp_set = atoi(s); -			check_temp(temp_set); +			temp_set = atoi(optarg);  			break;  		case 'r':  			transition = 0; @@ -790,6 +795,11 @@ main(int argc, char *argv[])  				if (transition < 0) {  					transition = !!atoi(setting->value);  				} +			} else if (strcasecmp(setting->name, +					      "brightness") == 0) { +				if (isnan(brightness)) { +					brightness = atof(setting->value); +				}  			} else if (strcasecmp(setting->name, "gamma") == 0) {  				if (isnan(gamma[0])) {  					r = parse_gamma_string(setting->value, @@ -842,6 +852,7 @@ main(int argc, char *argv[])  	   the config file nor on the command line. */  	if (temp_day < 0) temp_day = DEFAULT_DAY_TEMP;  	if (temp_night < 0) temp_night = DEFAULT_NIGHT_TEMP; +	if (isnan(brightness)) brightness = DEFAULT_BRIGHTNESS;  	if (isnan(gamma[0])) gamma[0] = gamma[1] = gamma[2] = DEFAULT_GAMMA;  	if (transition < 0) transition = 1; @@ -853,7 +864,7 @@ main(int argc, char *argv[])  	location_state_t location_state;  	/* Location is not needed for reset mode -       or for manual temperature setting */ +	   or for manual temperature setting. */  	if (mode != PROGRAM_MODE_RESET && mode != PROGRAM_MODE_MANUAL) {  		if (provider != NULL) {  			/* Use provider specified on command line. */ @@ -923,12 +934,43 @@ main(int argc, char *argv[])  		}  		/* Color temperature at daytime */ -		check_temp(temp_day); +		if (temp_day < MIN_TEMP || temp_day >= MAX_TEMP) { +			fprintf(stderr, +				_("Temperature must be between %uK and %uK.\n"), +				MIN_TEMP, MAX_TEMP); +			exit(EXIT_FAILURE); +		}  		/* Color temperature at night */ -		check_temp(temp_night); +		if (temp_night < MIN_TEMP || temp_night >= MAX_TEMP) { +			fprintf(stderr, +				_("Temperature must be between %uK and %uK.\n"), +				MIN_TEMP, MAX_TEMP); +			exit(EXIT_FAILURE); +		} +	} + +	if (mode == PROGRAM_MODE_MANUAL) { +		/* Check color temperature to be set */ +		if (temp_set < MIN_TEMP || temp_set >= MAX_TEMP) { +			fprintf(stderr, +				_("Temperature must be between %uK and %uK.\n"), +				MIN_TEMP, MAX_TEMP); +			exit(EXIT_FAILURE); +		}  	} +	/* Brightness */ +	if (brightness < MIN_BRIGHTNESS || brightness > MAX_BRIGHTNESS) { +		fprintf(stderr, +			_("Brightness value must be between %.1f and %.1f.\n"), +			MIN_BRIGHTNESS, MAX_BRIGHTNESS); +		exit(EXIT_FAILURE); +	} + +	if (verbose) { +		printf(_("Brightness: %.2f\n"), brightness); +	}  	/* Gamma */  	if (gamma[0] < MIN_GAMMA || gamma[0] > MAX_GAMMA || @@ -1003,7 +1045,7 @@ main(int argc, char *argv[])  		if (verbose) printf(_("Color temperature: %uK\n"), temp);  		/* Adjust temperature */ -		r = method->set_temperature(&state, temp, gamma); +		r = method->set_temperature(&state, temp, brightness, gamma);  		if (r < 0) {  			fputs(_("Temperature adjustment failed.\n"), stderr);  			method->free(&state); @@ -1016,7 +1058,7 @@ main(int argc, char *argv[])  		if (verbose) printf(_("Color temperature: %uK\n"), temp_set);  		/* Adjust temperature */ -		r = method->set_temperature(&state, temp_set, gamma); +		r = method->set_temperature(&state, temp_set, brightness, gamma);  		if (r < 0) {  			fputs(_("Temperature adjustment failed.\n"), stderr);  			method->free(&state); @@ -1028,7 +1070,7 @@ main(int argc, char *argv[])  	case PROGRAM_MODE_RESET:  	{  		/* Reset screen */ -		r = method->set_temperature(&state, NEUTRAL_TEMP, gamma); +		r = method->set_temperature(&state, NEUTRAL_TEMP, 1.0, gamma);  		if (r < 0) {  			fputs(_("Temperature adjustment failed.\n"), stderr);  			method->free(&state); @@ -1192,7 +1234,8 @@ main(int argc, char *argv[])  			/* Adjust temperature */  			if (!disabled || short_trans) {  				r = method->set_temperature(&state, -							    temp, gamma); +							    temp, brightness, +							    gamma);  				if (r < 0) {  					fputs(_("Temperature adjustment"  						" failed.\n"), stderr); | 
