aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/redshift.c74
1 files changed, 65 insertions, 9 deletions
diff --git a/src/redshift.c b/src/redshift.c
index 00bf9f9..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);
}
@@ -1373,6 +1417,7 @@ main(int argc, char *argv[])
/* 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 };
@@ -1446,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) {
@@ -1501,6 +1556,7 @@ main(int argc, char *argv[])
}
/* Save temperature as previous */
+ prev_period = period;
memcpy(&prev_interp, &interp,
sizeof(color_setting_t));