maglight

Device brightness utility for MacBook Pro

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int	usage(void);
char*	append_filename(char *path, char *filename);
int	get_max_brightness(char *path);
int	get_brightness(char *path);
void	print_brightness(char *path);
void	set_brightness(char *path, char *brightness);
void	add_brightness(char *path, char *brightness);
void	sub_brightness(char *path, char *brightness);
void	set_percentage(char *path, char *percentage);
void	inc_percentage(char *path, char *percentage);
void	dec_percentage(char *path, char *percentage);


int main(int argc, char *argv[])
{
	char *dsp_path = "/sys/class/backlight/intel_backlight/";
	char *kbd_path = "/sys/class/leds/smc::kbd_backlight/";
	char *path;

	if (argc < 2)
		return usage();

	switch (argv[1][0])
	{
		case 'k':
			path = kbd_path;
			break;
		case 'd':
			path = dsp_path;
			break;
		default:
			return usage();
	}

	if (argc < 3) {
		print_brightness(path);
		return (0);
	}

	switch (argv[2][0])
	{
		case 'g':
			print_brightness(path);
			break;
		case 's':
			set_brightness(path, argv[3]);
			break;
		case 'a':
			add_brightness(path, argv[3]);
			break;
		case 'u':
			sub_brightness(path, argv[3]);
			break;
		case 'p':
			set_percentage(path, argv[3]);
			break;
		case 'i':
			inc_percentage(path, argv[3]);
			break;
		case 'd':
			dec_percentage(path, argv[3]);
			break;
		default:
			return usage();
	}

	return (0);
}

char* append_filename(char *path, char *filename)
{
	char *filepath = malloc(strlen(path) + strlen(filename) + 1);
	strcpy(filepath, path);
	return strcat(filepath, filename);
}

int get_max_brightness(char *path)
{
	char *filepath = append_filename(path, "max_brightness");
	FILE *f = fopen(filepath, "r");
	char buff[255];
	fgets(buff, 255, f);
	fclose(f);
	return (atoi(buff));
}

int get_brightness(char *path)
{
	char *filepath = append_filename(path, "brightness");
	FILE *f = fopen(filepath, "r");
	char buff[255];
	fgets(buff, 255, f);
	fclose(f);
	return (atoi(buff));
}

void print_brightness(char *path)
{
	int brightness = get_brightness(path);
	int max_brightness = get_max_brightness(path);
	float percentage = (float)brightness / max_brightness * 100;
	printf("%i/%i - %.0f%%\n", brightness, max_brightness, percentage);
}

void set_brightness(char *path, char *brightness)
{
	char *filepath = append_filename(path, "brightness");
	FILE *f = fopen(filepath, "w");
	fputs(brightness, f);
	fclose(f);
}

void add_brightness(char *path, char *brightness)
{
	int newBrightness = (get_brightness(path) + atoi(brightness));
	char number[10];
	sprintf(number, "%i", newBrightness);
	set_brightness(path, number);
}

void sub_brightness(char *path, char *brightness)
{
	int newBrightness = (get_brightness(path) - atoi(brightness));
	char number[10];
	sprintf(number, "%i", newBrightness);
	set_brightness(path, number);
}

void set_percentage(char *path, char *percentage)
{
	int brightness = (atoi(percentage) * 0.01) * get_max_brightness(path);
	char number[10];
	sprintf(number, "%i", brightness);
	set_brightness(path, number);
}

void inc_percentage(char *path, char *percentage)
{
	int inc = (atoi(percentage) * 0.01) * get_max_brightness(path);
	int brightness = get_brightness(path) + inc;
	char number[10];
	sprintf(number, "%i", brightness);
	set_brightness(path, number);
}

void dec_percentage(char *path, char *percentage)
{
	int dec = (atoi(percentage) * 0.01) * get_max_brightness(path);
	int brightness = get_brightness(path) - dec;
	char number[10];
	sprintf(number, "%i", brightness);
	set_brightness(path, number);
}

int usage(void)
{
printf(
"Usage: maglight [device] [command] <arguments>\n\
\n\
Devices:\n\
- [k]eyboard\n\
- [d]isplay\n\
\n\
Commands:\n\
- [g]et\t\t\tGet a device's brightness level\n\
- [s]et <num>\t\tSet a device's brightness level\n\
- [a]dd <num>\t\tIncrease a device's brightness by number\n\
- s[u]b <num>\t\tDecrease a device's brightness by number\n\
- [p]ercent <num>\tSet a device's brightness to percentage\n\
- [i]nc <per>\t\tIncrease a device's brightness level by percentage\n\
- [d]ec <per>\t\tDecrease a device's brightness level by percentage\n"
);
return (0);
}