aboutsummaryrefslogblamecommitdiffstats
path: root/src/test/user.c
blob: 7a1fd78f9dc8982b0f4c5670e102bb4f2191cae0 (plain) (tree)
1
2
3
4
5
6
7
8
                                                         

                 
 


                    
                                                                


                       





                          
 

                                                                
 





                                     
 
                                          
 




                                 

      


   
                                                                  
   



                                                     
   



                                                               
 

































                                                                     
 























































                                                                                              
/* See LICENSE file for copyright and license details. */
#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 *restrict dest, const void *restrict 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;
	for (; *s; s++)
		if (*s == find)
			return 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)
		*tmp = '\0';
	if (!buf[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);
		libgamma_perror("error", r);
		return 1;
	}


	/* -- Partition -- */

	/* Check that the site has at least one partition */
	if (!site_state->partitions_available) {
		libgamma_site_free(site_state);
		printf("No partitions found\n");
		return 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);
		libgamma_perror("error", r);
		return 1;
	}


	/* -- CRTC -- */

	/* Check that the partition has at least one CRTC */
	if (!part_state->crtcs_available) {
		libgamma_partition_free(part_state);
		libgamma_site_free(site_state);
		printf("No CRTC:s found\n");
		return 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);
		libgamma_perror("error", r);
		return 1;
	}

	printf("\n");
	return 0;
}