From b3cbfa061dd7489cc54cbdbd9c6965be9c0104d4 Mon Sep 17 00:00:00 2001 From: Jon Lund Steffensen Date: Mon, 28 Dec 2009 15:00:47 +0100 Subject: Use clock_gettime() to read current time. --- Makefile.am | 2 +- src/redshift.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/Makefile.am b/Makefile.am index b8d196f..7aae610 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,7 +12,7 @@ EXTRA_redshift_SOURCES = \ src/vidmode.c src/vidmode.h AM_CFLAGS = -redshift_LDADD = -lm +redshift_LDADD = -lm -lrt if ENABLE_RANDR redshift_SOURCES += src/randr.c src/randr.h diff --git a/src/redshift.c b/src/redshift.c index be6dfca..c9904d2 100644 --- a/src/redshift.c +++ b/src/redshift.c @@ -140,7 +140,7 @@ adjust_temperature(int screen_num, int use_randr, int temp, float gamma[3]) if (!use_randr || failed) { failed = 0; /* Check VidMode extension */ - r = vidmode_check_extension(); + int r = vidmode_check_extension(); if (r < 0) { fprintf(stderr, "VidMode extension is" " not available.\n"); @@ -158,8 +158,10 @@ adjust_temperature(int screen_num, int use_randr, int temp, float gamma[3]) if (failed) { fprintf(stderr, "Color temperature adjustment failed.\n"); - exit(EXIT_FAILURE); + return -1; } + + return 0; } @@ -345,7 +347,13 @@ main(int argc, char *argv[]) if (one_shot) { /* Current angular elevation of the sun */ - time_t now = time(NULL); + struct timespec now; + r = clock_gettime(CLOCK_REALTIME, &now); + if (r < 0) { + perror("clock_gettime"); + exit(EXIT_FAILURE); + } + double elevation = solar_elevation(now, lat, lon); if (verbose) { @@ -360,15 +368,32 @@ main(int argc, char *argv[]) if (verbose) printf("Color temperature: %uK\n", temp); /* Adjust temperature */ - adjust_temperature(screen_num, use_randr, temp, gamma); + r = adjust_temperature(screen_num, use_randr, temp, gamma); + if (r < 0) { + fprintf(stderr, "Temperature adjustment failed.\n"); + exit(EXIT_FAILURE); + } } else { /* Make a 10 second initial transition */ + struct timespec short_trans_end; + r = clock_gettime(CLOCK_REALTIME, &short_trans_end); + if (r < 0) { + perror("clock_gettime"); + exit(EXIT_FAILURE); + } + int short_trans_len = 10; - time_t short_trans_end = time(NULL) + short_trans_len; + short_trans_end.tv_sec += short_trans_len; while (1) { /* Current angular elevation of the sun */ - time_t now = time(NULL); + struct timespec now; + r = clock_gettime(CLOCK_REALTIME, &now); + if (r < 0) { + perror("clock_gettime"); + exit(EXIT_FAILURE); + } + double elevation = solar_elevation(now, lat, lon); /* Use elevation of sun to set color temperature */ @@ -376,17 +401,32 @@ main(int argc, char *argv[]) temp_night, verbose); if (init_trans) { - float alpha = (short_trans_end - now) / + double start = now.tv_sec + + now.tv_nsec / 1000000000.0; + double end = short_trans_end.tv_sec + + short_trans_end.tv_nsec / + 1000000000.0; + double alpha = (end - start) / (float)short_trans_len; if (alpha < 0) init_trans = 0; /* Done */ else temp = alpha*6500 + (1.0-alpha)*temp; } + if (verbose) { + printf("Temperature: %iK\n", temp); + } + /* Adjust temperature */ - adjust_temperature(screen_num, use_randr, temp, gamma); + r = adjust_temperature(screen_num, use_randr, + temp, gamma); + if (r < 0) { + fprintf(stderr, "Temperature adjustment" + " failed.\n"); + exit(EXIT_FAILURE); + } - if (init_trans) sleep(1); - else sleep(5); + if (init_trans) usleep(100000); + else usleep(5000000); } } -- cgit v1.2.3-70-g09d2