diff options
author | Jon Lund Steffensen <jonlst@gmail.com> | 2009-12-28 15:00:47 +0100 |
---|---|---|
committer | Jon Lund Steffensen <jonlst@gmail.com> | 2009-12-28 15:00:47 +0100 |
commit | b3cbfa061dd7489cc54cbdbd9c6965be9c0104d4 (patch) | |
tree | 19365da3a204af6c1f1f1c634c3e549213033129 /src | |
parent | Use struct timespec instead of time_t for increased time precision. (diff) | |
download | redshift-ng-b3cbfa061dd7489cc54cbdbd9c6965be9c0104d4.tar.gz redshift-ng-b3cbfa061dd7489cc54cbdbd9c6965be9c0104d4.tar.bz2 redshift-ng-b3cbfa061dd7489cc54cbdbd9c6965be9c0104d4.tar.xz |
Use clock_gettime() to read current time.
Diffstat (limited to 'src')
-rw-r--r-- | src/redshift.c | 60 |
1 files changed, 50 insertions, 10 deletions
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); } } |