aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJon Lund Steffensen <jonlst@gmail.com>2014-12-27 21:29:27 -0500
committerJon Lund Steffensen <jonlst@gmail.com>2014-12-27 21:29:27 -0500
commite7815756437b749dc35936cc58d2c9eeb7401aaa (patch)
tree1c09dd0e43577fc1a3f000bb3157d50a9591b7bd /src
parentredshift: Change duration of sleep to macro (diff)
parentredshift: Only print period information when it changes (diff)
downloadredshift-ng-e7815756437b749dc35936cc58d2c9eeb7401aaa.tar.gz
redshift-ng-e7815756437b749dc35936cc58d2c9eeb7401aaa.tar.bz2
redshift-ng-e7815756437b749dc35936cc58d2c9eeb7401aaa.tar.xz
Merge branch 'less-verbose'
Diffstat (limited to 'src')
-rw-r--r--src/redshift.c96
1 files changed, 85 insertions, 11 deletions
diff --git a/src/redshift.c b/src/redshift.c
index 1c8723c..fa791bd 100644
--- a/src/redshift.c
+++ b/src/redshift.c
@@ -294,6 +294,20 @@ typedef enum {
PROGRAM_MODE_MANUAL
} program_mode_t;
+/* Periods of day. */
+typedef enum {
+ PERIOD_DAYTIME = 0,
+ PERIOD_NIGHT,
+ PERIOD_TRANSITION
+} period_t;
+
+/* Names of periods of day */
+static const char *period_names[] = {
+ "Daytime",
+ "Night",
+ "Transition"
+};
+
#if defined(HAVE_SIGNAL_H) && !defined(__WIN32__)
static volatile sig_atomic_t exiting = 0;
@@ -325,18 +339,46 @@ static float transition_low = TRANSITION_LOW;
static float transition_high = TRANSITION_HIGH;
-/* Print which period (night, day or transition) we're currently in. */
-static void
-print_period(double elevation)
+/* Determine which period we are currently in. */
+static period_t
+get_period(double elevation)
+{
+ if (elevation < transition_low) {
+ return PERIOD_NIGHT;
+ } else if (elevation < transition_high) {
+ return PERIOD_TRANSITION;
+ } else {
+ return PERIOD_DAYTIME;
+ }
+}
+
+/* Determine how far through the transition we are. */
+static double
+get_transition_progress(double elevation)
{
if (elevation < transition_low) {
- printf(_("Period: Night\n"));
+ return 0.0;
} else if (elevation < transition_high) {
- float a = (transition_low - elevation) /
+ return (transition_low - elevation) /
(transition_low - transition_high);
- printf(_("Period: Transition (%.2f%% day)\n"), a*100);
} else {
- printf(_("Period: Daytime\n"));
+ return 1.0;
+ }
+}
+
+/* Print verbose description of the given period. */
+static void
+print_period(period_t period, double transition)
+{
+ switch (period) {
+ case PERIOD_NIGHT:
+ case PERIOD_DAYTIME:
+ printf(_("Period: %s\n"), period_names[period]);
+ break;
+ case PERIOD_TRANSITION:
+ printf(_("Period: %s (%.2f%% day)\n"),
+ period_names[period], transition*100);
+ break;
}
}
@@ -1289,7 +1331,9 @@ main(int argc, char *argv[])
interpolate_color_settings(elevation, &day, &night, &interp);
if (verbose || mode == PROGRAM_MODE_PRINT) {
- print_period(elevation);
+ period_t period = get_period(elevation);
+ double transition = get_transition_progress(elevation);
+ print_period(period, transition);
printf(_("Color temperature: %uK\n"), interp.temperature);
printf(_("Brightness: %.2f\n"), interp.brightness);
}
@@ -1370,6 +1414,13 @@ main(int argc, char *argv[])
printf("Status: %s\n", "Enabled");
}
+ /* Save previous colors so we can avoid
+ printing status updates if the values
+ did not change. */
+ period_t prev_period = -1;
+ color_setting_t prev_interp =
+ { -1, { NAN, NAN, NAN }, NAN };
+
/* Continuously adjust color temperature */
int done = 0;
int disabled = 0;
@@ -1440,7 +1491,17 @@ main(int argc, char *argv[])
color_setting_t interp;
interpolate_color_settings(elevation, &day, &night, &interp);
- if (verbose) print_period(elevation);
+ /* Print period if it changed during this update,
+ or if we are in transition. In transition we
+ print the progress, so we always print it in
+ that case. */
+ period_t period = get_period(elevation);
+ if (verbose && (period != prev_period ||
+ period == PERIOD_TRANSITION)) {
+ double transition =
+ get_transition_progress(elevation);
+ print_period(period, transition);
+ }
/* Ongoing short transition */
if (short_trans_delta) {
@@ -1471,8 +1532,16 @@ main(int argc, char *argv[])
if (done && !short_trans_delta) break;
if (verbose) {
- printf(_("Color temperature: %uK\n"), interp.temperature);
- printf(_("Brightness: %.2f\n"), interp.brightness);
+ if (interp.temperature !=
+ prev_interp.temperature) {
+ printf(_("Color temperature: %uK\n"),
+ interp.temperature);
+ }
+ if (interp.brightness !=
+ prev_interp.brightness) {
+ printf(_("Brightness: %.2f\n"),
+ interp.brightness);
+ }
}
/* Adjust temperature */
@@ -1486,6 +1555,11 @@ main(int argc, char *argv[])
}
}
+ /* Save temperature as previous */
+ prev_period = period;
+ memcpy(&prev_interp, &interp,
+ sizeof(color_setting_t));
+
/* Sleep for 5 seconds or 0.1 second. */
#ifndef _WIN32
if (short_trans_delta) usleep(SLEEP_DURATION_SHORT*1000);