/**
* libgamma -- Display server abstraction layer for gamma ramp adjustments
* Copyright (C) 2014 Mattias Andrée (maandree@member.fsf.org)
*
* This library is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#include "user.h"
#include "methods.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
* Let the user select adjustment method, site, partition and CRTC.
*
* @param site_state Output slot for the site.
* @param part_state Output slot for the partition.
* @param crtc_state Output slot for the CRTC.
* @return Zero on and only on success.
*/
int select_monitor(libgamma_site_state_t* restrict site_state,
libgamma_partition_state_t* restrict part_state,
libgamma_crtc_state_t* restrict crtc_state)
{
int method;
char* site;
char* tmp;
char buf[256];
int r;
/* -- Adjustment method -- */
/* Let the user select adjustment method. */
printf("Select adjustment method:\n");
for (method = 0; method < LIBGAMMA_METHOD_COUNT; method++)
printf(" %i: %s\n", method, method_name(method));
printf("> ");
fflush(stdout);
fgets(buf, sizeof(buf) / sizeof(char), stdin);
method = atoi(buf);
/* -- Site -- */
/* Let the user select site. */
printf("Select site: ");
fflush(stdout);
fgets(buf, sizeof(buf) / sizeof(char), stdin);
tmp = strchr(buf, '\n');
if (tmp != NULL)
*tmp = '\0';
if (buf[0] == '\0')
site = NULL;
else
{
site = malloc((strlen(buf) + 1) * sizeof(char));
memcpy(site, buf, strlen(buf) + 1);
}
/* Initialise site state. */
if ((r = libgamma_site_initialise(site_state, method, site)))
{
free(site);
return libgamma_perror("error", r), 1;
}
/* -- Partition -- */
/* Check that the site has at least one partition. */
if (site_state->partitions_available == 0)
{
libgamma_site_free(site_state);
return printf("No partitions found\n"), 1;
}
/* Let the user select partition. */
printf("Select partition [0, %lu]: ", site_state->partitions_available - 1);
fflush(stdout);
fgets(buf, sizeof(buf) / sizeof(char), stdin);
/* Initialise partition state. */
if ((r = libgamma_partition_initialise(part_state, site_state, (size_t)atoll(buf))))
{
libgamma_site_free(site_state);
return libgamma_perror("error", r), 1;
}
/* -- CRTC -- */
/* Check that the partition has at least one CRTC. */
if (part_state->crtcs_available == 0)
{
libgamma_partition_free(part_state);
libgamma_site_free(site_state);
return printf("No CRTC:s found\n"), 1;
}
/* Let the user select CRTC. */
printf("Select CRTC [0, %lu]: ", part_state->crtcs_available - 1);
fflush(stdout);
fgets(buf, sizeof(buf) / sizeof(char), stdin);
/* Initialise CRTC state. */
if ((r = libgamma_crtc_initialise(crtc_state, part_state, (size_t)atoll(buf))))
{
libgamma_partition_free(part_state);
libgamma_site_free(site_state);
return libgamma_perror("error", r), 1;
}
printf("\n");
return 0;
}