Control Monitor Brightness through the Terminal
This feature is particularly useful in combination with a portable SSH capable device, such as an iPod.
Copy this code and paste it into TextEdit and save it as brightness.c. If you paste this into vim and use a standward terminal width of 80, be prepared for a wrapping issue on line 56.
#include <stdio.h>
#include <unistd.h>
#include <IOKit/graphics/IOGraphicsLib.h>
#include <ApplicationServices/ApplicationServices.h>
const int kMaxDisplays = 16;
const CFStringRef kDisplayBrightness = CFSTR(kIODisplayBrightnessKey);
const char *APP_NAME;
void errexit(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
fprintf(stderr, "%s: ", APP_NAME);
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
exit(1);
}
void usage() {
fprintf(stderr, "usage: %s [-m|-d display] [-v] <brightness>\n", APP_NAME);
fprintf(stderr, " or: %s -l [-v]\n", APP_NAME);
exit(1);
}
int main(int argc, char * const argv[]) {
APP_NAME = argv[0];
if (argc == 1)
usage();
int verbose = 0;
unsigned long displayToSet = 0;
enum { ACTION_LIST, ACTION_SET_ALL, ACTION_SET_ONE } action = ACTION_SET_ALL;
extern char *optarg;
extern int optind;
int ch;
while ( (ch = getopt(argc, argv, "lmvd:")) != -1) {
switch (ch) {
case 'l':
if (action == ACTION_SET_ONE) usage();
action = ACTION_LIST;
break;
case 'v':
verbose = 1;
break;
case 'm':
if (action != ACTION_SET_ALL) usage();
action = ACTION_SET_ONE;
displayToSet = (unsigned long)CGMainDisplayID();
break;
case 'd':
if (action != ACTION_SET_ALL) usage();
action = ACTION_SET_ONE;
errno = 0;
displayToSet = strtoul(optarg, NULL, 0);
if (errno == EINVAL || errno == ERANGE)
errexit("display must be an integer index (0) or a hexadecimal ID (0x4270a80)");
break;
default: usage();
}
}
argc -= optind;
argv += optind;
float brightness;
if (action == ACTION_LIST) {
if (argc > 0) usage();
} else {
if (argc != 1) usage();
errno = 0;
brightness = strtof(argv[0], NULL);
if (errno == ERANGE)
usage();
if (brightness < 0 || brightness > 1)
errexit("brightness must be between 0 and 1");
}
CGDirectDisplayID display[kMaxDisplays];
CGDisplayCount numDisplays;
CGDisplayErr err;
err = CGGetActiveDisplayList(kMaxDisplays, display, &numDisplays);
if (err != CGDisplayNoErr)
errexit("cannot get list of displays (error %d)\n", err);
CFWriteStreamRef stdoutStream = NULL;
if (verbose) {
CFURLRef devStdout =
CFURLCreateWithFileSystemPath(NULL, CFSTR("/dev/stdout"),
kCFURLPOSIXPathStyle, false);
stdoutStream = CFWriteStreamCreateWithFile(NULL, devStdout);
if (stdoutStream == NULL)
errexit("cannot create CFWriteStream for /dev/stdout");
if (!CFWriteStreamOpen(stdoutStream))
errexit("cannot open CFWriteStream for /dev/stdout");
}
for (CGDisplayCount i = 0; i < numDisplays; ++i) {
CGDirectDisplayID dspy = display[i];
CFDictionaryRef originalMode = CGDisplayCurrentMode(dspy);
if (originalMode == NULL)
continue;
if (action == ACTION_LIST) {
printf("display %d: ", i);
if (CGMainDisplayID() == dspy)
printf("main display, ");
printf("ID 0x%x\n", (unsigned int)dspy);
if (verbose) {
CFStringRef error = NULL;
CFPropertyListWriteToStream(originalMode, stdoutStream,
kCFPropertyListXMLFormat_v1_0, &error);
if (error != NULL)
errexit("failed to write display info (%s)",
CFStringGetCStringPtr(error,
CFStringGetFastestEncoding(error)));
}
}
io_service_t service = CGDisplayIOServicePort(dspy);
switch (action) {
case ACTION_SET_ONE:
if ((CGDirectDisplayID)displayToSet != dspy && displayToSet != i)
continue;
case ACTION_SET_ALL:
err = IODisplaySetFloatParameter(service, kNilOptions, kDisplayBrightness,
brightness);
if (err != kIOReturnSuccess) {
fprintf(stderr,
"%s: failed to set brightness of display 0x%x (error %d)",
APP_NAME, (unsigned int)dspy, err);
continue;
}
if (!verbose) continue;
case ACTION_LIST:
err = IODisplayGetFloatParameter(service, kNilOptions, kDisplayBrightness,
&brightness);
if (err != kIOReturnSuccess) {
fprintf(stderr,
"%s: failed to get brightness of display 0x%x (error %d)",
APP_NAME, (unsigned int)dspy, err);
continue;
}
printf("display %d: brightness %f\n", i, brightness);
}
}
return 0;
}
Open the Terminal application and navigate to the directory containing brightness.c
copy the following code and run it
gcc -std=c99 -o brightness brightness.c -framework IOKit -framework ApplicationServices
Note: as of this writing, using gcc version 4.2.1 (Apple Inc. build 5646) (dot 1) will yield a warning about a deprecated ‘CGDisplayCurrentMode’ at line 101. You can ignore this.
I recommend placing this in your /usr/local/bin directory. To do this, mv the file into the directory as root.
sudo mv brightness /usr/local/bin
Grab your favorite SSH capable device and control your screen brightness from your bed or from a keyboard which doesn’t have brightness keys.
To adjust, type:
<code>brightness .5</code>
Brightness can be adjusted anywhere from 0 to 1, with any decimal inbetween, allowing you a more descrete range than even the keys or slider bar can achieve.
Code author: Nicholas Riley