aboutsummaryrefslogblamecommitdiffstats
path: root/src/test/user.c
blob: f2a1d5018e79d6f2501ad61eb343b81fe4377073 (plain) (tree)


















                                                                          
 

































                                                                 










































































































                                                                                      
/**
 * 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"


#ifdef __GCC__
# include <string.h>
#else
/* Hack to circumvent that the funcions are defined multiples. */
# define strlen strlen_
# define memcpy memcpy_
# define strchr strchr_
static size_t strlen_(const char* str)
{
  size_t n = 0;
  while (str[n])
    n++;
  return n;
}
static void* memcpy_(void* dest, const void* src, size_t n)
{
  char* restrict d = dest;
  const char* restrict s = src;
  size_t i;
  for (i = 0; i < n; i++)
    d[i] = s[i];
  return dest;
}
static char* strchr_(const char* s, int c)
{
  char find = (char)c;
  while (*s)
    if (*s == find)
      return s;
    else
      s++;
  return NULL;
}
#endif


/**
 * 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;
}