aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Lund Steffensen <jonlst@gmail.com>2010-05-04 23:42:10 +0200
committerJon Lund Steffensen <jonlst@gmail.com>2010-05-04 23:42:10 +0200
commitebd6c7b80a1bbacec01ef0ca603ef8fbd19234fe (patch)
tree97b02da852f256420a7367b55736b81fe8425363
parentUpdate INSTALL (diff)
parentAdd support for changing the temperature of a specific CRTC (randr only). (diff)
downloadredshift-ng-ebd6c7b80a1bbacec01ef0ca603ef8fbd19234fe.tar.gz
redshift-ng-ebd6c7b80a1bbacec01ef0ca603ef8fbd19234fe.tar.bz2
redshift-ng-ebd6c7b80a1bbacec01ef0ca603ef8fbd19234fe.tar.xz
Merge slightly altered patch from Alexandros Frantzis that allows adjusting individual CRTCs.
-rw-r--r--AUTHORS11
-rw-r--r--src/randr.c93
-rw-r--r--src/randr.h3
-rw-r--r--src/redshift.c18
4 files changed, 89 insertions, 36 deletions
diff --git a/AUTHORS b/AUTHORS
index 0559f96..689f2e4 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,8 +1,15 @@
+Maintainer
+--------------------
Jon Lund Steffensen <jonlst@gmail.com>
-Original gtk-redshift script contributed by Martin Koelewijn.
-The redshift icon is based on artwork by the Tango Desktop Project.
+
+Contributors
+--------------------
+Alexandros Frantzis
+Martin Koelewijn
+Tango Desktop Project provided artwork for the redshift icon.
+
Translators
--------------------
diff --git a/src/randr.c b/src/randr.c
index 7c05b26..f401190 100644
--- a/src/randr.c
+++ b/src/randr.c
@@ -36,7 +36,7 @@
int
-randr_init(randr_state_t *state, int screen_num)
+randr_init(randr_state_t *state, int screen_num, int crtc_num)
{
xcb_generic_error_t *error;
@@ -108,6 +108,7 @@ randr_init(randr_state_t *state, int screen_num)
return -1;
}
+ state->crtc_num = crtc_num;
state->crtc_count = res_reply->num_crtcs;
state->crtcs = malloc(state->crtc_count * sizeof(randr_crtc_state_t));
if (state->crtcs == NULL) {
@@ -248,45 +249,77 @@ randr_free(randr_state_t *state)
xcb_disconnect(state->conn);
}
-int
-randr_set_temperature(randr_state_t *state, int temp, float gamma[3])
+static int
+randr_set_temperature_for_crtc(randr_state_t *state, int crtc_num, int temp,
+ float gamma[3])
{
xcb_generic_error_t *error;
+
+ if (crtc_num >= state->crtc_count || crtc_num < 0) {
+ fprintf(stderr, _("CRTC %d does not exist. "),
+ state->crtc_num);
+ if (state->crtc_count > 1) {
+ fprintf(stderr, _("Valid CRTCs are [0-%d].\n"),
+ state->crtc_count-1);
+ } else {
+ fprintf(stderr, _("Only CRTC 0 exists.\n"));
+ }
- /* Set temperature on all CRTCs */
- for (int i = 0; i < state->crtc_count; i++) {
- xcb_randr_crtc_t crtc = state->crtcs[i].crtc;
- unsigned int ramp_size = state->crtcs[i].ramp_size;
+ return -1;
+ }
- /* Create new gamma ramps */
- uint16_t *gamma_ramps = malloc(3*ramp_size*sizeof(uint16_t));
- if (gamma_ramps == NULL) {
- perror("malloc");
- return -1;
- }
+ xcb_randr_crtc_t crtc = state->crtcs[crtc_num].crtc;
+ unsigned int ramp_size = state->crtcs[crtc_num].ramp_size;
- uint16_t *gamma_r = &gamma_ramps[0*ramp_size];
- uint16_t *gamma_g = &gamma_ramps[1*ramp_size];
- uint16_t *gamma_b = &gamma_ramps[2*ramp_size];
+ /* Create new gamma ramps */
+ uint16_t *gamma_ramps = malloc(3*ramp_size*sizeof(uint16_t));
+ if (gamma_ramps == NULL) {
+ perror("malloc");
+ return -1;
+ }
- colorramp_fill(gamma_r, gamma_g, gamma_b, ramp_size,
- temp, gamma);
+ uint16_t *gamma_r = &gamma_ramps[0*ramp_size];
+ uint16_t *gamma_g = &gamma_ramps[1*ramp_size];
+ uint16_t *gamma_b = &gamma_ramps[2*ramp_size];
- /* Set new gamma ramps */
- xcb_void_cookie_t gamma_set_cookie =
- xcb_randr_set_crtc_gamma_checked(state->conn, crtc,
- ramp_size, gamma_r,
- gamma_g, gamma_b);
- error = xcb_request_check(state->conn, gamma_set_cookie);
+ colorramp_fill(gamma_r, gamma_g, gamma_b, ramp_size,
+ temp, gamma);
- if (error) {
- fprintf(stderr, _("`%s' returned error %d\n"),
- "RANDR Set CRTC Gamma", error->error_code);
- free(gamma_ramps);
- return -1;
- }
+ /* Set new gamma ramps */
+ xcb_void_cookie_t gamma_set_cookie =
+ xcb_randr_set_crtc_gamma_checked(state->conn, crtc,
+ ramp_size, gamma_r,
+ gamma_g, gamma_b);
+ error = xcb_request_check(state->conn, gamma_set_cookie);
+ if (error) {
+ fprintf(stderr, _("`%s' returned error %d\n"),
+ "RANDR Set CRTC Gamma", error->error_code);
free(gamma_ramps);
+ return -1;
+ }
+
+ free(gamma_ramps);
+
+ return 0;
+}
+
+int
+randr_set_temperature(randr_state_t *state, int temp, float gamma[3])
+{
+ int r;
+
+ /* If no CRTC number has been specified,
+ set temperature on all CRTCs. */
+ if (state->crtc_num < 0) {
+ for (int i = 0; i < state->crtc_count; i++) {
+ r = randr_set_temperature_for_crtc(state, i,
+ temp, gamma);
+ if (r < 0) return -1;
+ }
+ } else {
+ return randr_set_temperature_for_crtc(state, state->crtc_num,
+ temp, gamma);
}
return 0;
diff --git a/src/randr.h b/src/randr.h
index 94d653f..6e11274 100644
--- a/src/randr.h
+++ b/src/randr.h
@@ -34,12 +34,13 @@ typedef struct {
typedef struct {
xcb_connection_t *conn;
xcb_screen_t *screen;
+ int crtc_num;
unsigned int crtc_count;
randr_crtc_state_t *crtcs;
} randr_state_t;
-int randr_init(randr_state_t *state, int screen_num);
+int randr_init(randr_state_t *state, int screen_num, int crtc_num);
void randr_free(randr_state_t *state);
void randr_restore(randr_state_t *state);
int randr_set_temperature(randr_state_t *state, int temp, float gamma[3]);
diff --git a/src/redshift.c b/src/redshift.c
index 9c3f404..abb0bfd 100644
--- a/src/redshift.c
+++ b/src/redshift.c
@@ -216,11 +216,12 @@ print_help(const char *program_name)
fputs(_(" -g R:G:B\tAdditional gamma correction to apply\n"
" -l LAT:LON\tYour current location\n"
" -m METHOD\tMethod to use to set color temperature"
- " (randr or vidmode)\n"
+ " (RANDR or VidMode)\n"
" -o\t\tOne shot mode (do not continously adjust"
" color temperature)\n"
" -r\t\tDisable initial temperature transition\n"
" -s SCREEN\tX screen to apply adjustments to\n"
+ " -c CRTC\tCRTC to apply adjustments to (RANDR only)\n"
" -t DAY:NIGHT\tColor temperature to set at daytime/night\n"),
stdout);
fputs("\n", stdout);
@@ -253,6 +254,7 @@ main(int argc, char *argv[])
float gamma[3] = { DEFAULT_GAMMA, DEFAULT_GAMMA, DEFAULT_GAMMA };
int use_randr = -1;
int screen_num = -1;
+ int crtc_num = -1;
int transition = 1;
int one_shot = 0;
int verbose = 0;
@@ -260,8 +262,11 @@ main(int argc, char *argv[])
/* Parse arguments. */
int opt;
- while ((opt = getopt(argc, argv, "g:hl:m:ors:t:v")) != -1) {
+ while ((opt = getopt(argc, argv, "c:g:hl:m:ors:t:v")) != -1) {
switch (opt) {
+ case 'c':
+ crtc_num = atoi(optarg);
+ break;
case 'g':
s = strchr(optarg, ':');
if (s == NULL) {
@@ -426,13 +431,20 @@ main(int argc, char *argv[])
gamma[0], gamma[1], gamma[2]);
}
+ /* CRTC can only be selected for RANDR */
+ if (crtc_num > -1 && !use_randr) {
+ fprintf(stderr, _("CRTC can only be selected"
+ " with the RANDR method.\n"));
+ exit(EXIT_FAILURE);
+ }
+
/* Initialize gamma adjustment method. If use_randr is negative
try all methods until one that works is found. */
gamma_state_t state;
#ifdef ENABLE_RANDR
if (use_randr < 0 || use_randr == 1) {
/* Initialize RANDR state */
- r = randr_init(&state.randr, screen_num);
+ r = randr_init(&state.randr, screen_num, crtc_num);
if (r < 0) {
fputs(_("Initialization of RANDR failed.\n"), stderr);
if (use_randr < 0) {