Skip to content
Snippets Groups Projects
Commit 239084dc authored by George Nachman's avatar George Nachman
Browse files

Try adding support for ambient light sensor

parent 7d3834a5
No related branches found
No related tags found
No related merge requests found
//
// LightSensor.h
// iTerm
//
// Created by George Nachman on 4/10/13.
//
//
#import <Foundation/Foundation.h>
#include <IOKit/IOKitLib.h>
#import <Foundation/Foundation.h>
@class LightSensor;
@protocol LightSensorTarget <NSObject>
- (void)lightSensorMeasuredDarkness:(LightSensor *)lightSensor;
- (void)lightSensorMeasuredLightness:(LightSensor *)lightSensor;
@end
@interface LightSensor : NSObject {
io_connect_t connection_;
NSTimer *timer_; // weak
int64_t darkTriggerLevel_;
int64_t lightTriggerLevel_;
id<LightSensorTarget> target_; // weak
enum {
LightSensorStateLight,
LightSensorStateDark
} state_;
}
- (void)startMonitoringWithDarkTriggerLevel:(int64_t)darkTriggerLevel
lightTriggerLevel:(int64_t)lightTriggerLevel
target:(id<LightSensorTarget>)target;
- (void)stopMonitoring;
- (int64_t)brightness;
@end
//
// LightSensor.m
// iTerm
//
// Created by George Nachman on 4/10/13.
//
//
#import "LightSensor.h"
#import <mach/mach.h>
#import <CoreFoundation/CoreFoundation.h>
static NSString * const kLightSensorServiceName = @"AppleLMUController";
@implementation LightSensor
+ (io_service_t)ioServiceWithName:(NSString *)serviceName {
return IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching([serviceName UTF8String]));
}
- (id)init {
self = [super init];
if (self) {
io_service_t ioService;
BOOL ok = NO;
ioService = [[self class] ioServiceWithName:kLightSensorServiceName];
if (ioService) {
kern_return_t status = IOServiceOpen(ioService, mach_task_self(), 0, &connection_);
if (status == KERN_SUCCESS) {
ok = YES;
}
IOObjectRelease(ioService);
}
if (!ok) {
[self autorelease];
return nil;
}
}
return self;
}
- (void)notifyTargetOfChange {
switch (state_) {
case LightSensorStateLight:
[target_ lightSensorMeasuredLightness:self];
break;
case LightSensorStateDark:
[target_ lightSensorMeasuredDarkness:self];
break;
}
}
- (void)_update:(NSTimer *)timer {
int64_t brightness = [self brightness];
NSLog(@"Brightness is %lld", brightness);
if (brightness > lightTriggerLevel_ && state_ == LightSensorStateDark) {
state_ = LightSensorStateLight;
[self notifyTargetOfChange];
} else if (brightness < darkTriggerLevel_ && state_ == LightSensorStateLight) {
state_ = LightSensorStateDark;
[self notifyTargetOfChange];
}
}
- (void)startMonitoringWithDarkTriggerLevel:(int64_t)darkTriggerLevel
lightTriggerLevel:(int64_t)lightTriggerLevel
target:(id<LightSensorTarget>)target {
darkTriggerLevel_ = darkTriggerLevel;
lightTriggerLevel_ = lightTriggerLevel;
if ([self brightness] > (darkTriggerLevel_ + lightTriggerLevel_) / 2) {
state_ = LightSensorStateLight;
} else {
state_ = LightSensorStateDark;
}
target_ = target;
[timer_ invalidate];
timer_ = [NSTimer scheduledTimerWithTimeInterval:2
target:self
selector:@selector(_update:)
userInfo:nil
repeats:YES];
[self notifyTargetOfChange];
}
- (void)stopMonitoring {
[timer_ invalidate];
timer_ = nil;
target_ = nil;
}
- (int64_t)brightness {
uint32_t outputs = 2;
uint64_t values[outputs];
kern_return_t status = IOConnectCallMethod(connection_, 0, nil, 0, nil, 0, values, &outputs, nil, 0);
if (status == KERN_SUCCESS) {
return values[0] / 2 + values[1] / 2;
} else {
return -1;
}
}
@end
Loading
Loading
@@ -257,6 +257,9 @@
1D7C1AD31276FD6E00461E55 /* PasteboardHistory.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1D7C1AD11276FD6E00461E55 /* PasteboardHistory.xib */; };
1D7C1D1212772ECC00461E55 /* NSDateFormatterExtras.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D7C1D1012772ECC00461E55 /* NSDateFormatterExtras.h */; };
1D7C1D1312772ECC00461E55 /* NSDateFormatterExtras.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D7C1D1112772ECC00461E55 /* NSDateFormatterExtras.m */; };
1D7EE094171679FF0035BAD2 /* LightSensor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D7EE092171679FF0035BAD2 /* LightSensor.h */; };
1D7EE095171679FF0035BAD2 /* LightSensor.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D7EE093171679FF0035BAD2 /* LightSensor.m */; };
1D7EE097171682040035BAD2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D7EE096171682040035BAD2 /* IOKit.framework */; };
1D823C4812F92B3F0028422B /* screen.png in Resources */ = {isa = PBXBuildFile; fileRef = 1D823C4712F92B3F0028422B /* screen.png */; };
1D8255F714649F8E007CAE78 /* PrefsMouse.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 1D8255F614649F8E007CAE78 /* PrefsMouse.tiff */; };
1D8255F9146869D8007CAE78 /* DefaultPointerActions.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1D8255F8146869D8007CAE78 /* DefaultPointerActions.plist */; };
Loading
Loading
@@ -568,6 +571,9 @@
1D7C1AD21276FD6E00461E55 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/PasteboardHistory.xib; sourceTree = "<group>"; };
1D7C1D1012772ECC00461E55 /* NSDateFormatterExtras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDateFormatterExtras.h; sourceTree = "<group>"; };
1D7C1D1112772ECC00461E55 /* NSDateFormatterExtras.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDateFormatterExtras.m; sourceTree = "<group>"; };
1D7EE092171679FF0035BAD2 /* LightSensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LightSensor.h; sourceTree = "<group>"; };
1D7EE093171679FF0035BAD2 /* LightSensor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LightSensor.m; sourceTree = "<group>"; };
1D7EE096171682040035BAD2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/IOKit.framework; sourceTree = DEVELOPER_DIR; };
1D823C4712F92B3F0028422B /* screen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = screen.png; path = images/screen.png; sourceTree = "<group>"; };
1D8255F614649F8E007CAE78 /* PrefsMouse.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = PrefsMouse.tiff; path = images/PrefsMouse.tiff; sourceTree = "<group>"; };
1D8255F8146869D8007CAE78 /* DefaultPointerActions.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = DefaultPointerActions.plist; sourceTree = "<group>"; };
Loading
Loading
@@ -845,6 +851,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
1D7EE097171682040035BAD2 /* IOKit.framework in Frameworks */,
874206530564169600CFC3F1 /* AppKit.framework in Frameworks */,
F6E2DEDA0AE2F67200D20B3B /* Sparkle.framework in Frameworks */,
1D13EADC12113A2D00909F9C /* libncurses.dylib in Frameworks */,
Loading
Loading
@@ -861,6 +868,7 @@
0464AB0D006CD2EC7F000001 /* JTerminal */ = {
isa = PBXGroup;
children = (
1D7EE096171682040035BAD2 /* IOKit.framework */,
0464AB0E006CD2EC7F000001 /* Classes */,
0464AB15006CD2EC7F000001 /* Headers */,
0464AB1F006CD2EC7F000001 /* Other Sources */,
Loading
Loading
@@ -919,6 +927,8 @@
F69E788C0AB7AC6D001EC0FF /* iTermGrowlDelegate.m */,
DDDB7ABD05D7736600E197C2 /* iTermKeyBindingMgr.m */,
1DAED99112EDF923005E49ED /* iTermSearchField.m */,
1D7EE092171679FF0035BAD2 /* LightSensor.h */,
1D7EE093171679FF0035BAD2 /* LightSensor.m */,
1D72438C11F416E500BD4924 /* LineBuffer.m */,
1D29732614082676004C5DBE /* MovePaneController.m */,
1D085F8416F02E7400B7FCE9 /* PasteContext.h */,
Loading
Loading
@@ -1650,6 +1660,7 @@
1D085F9A16F1135F00B7FCE9 /* PasteEvent.h in Headers */,
1D085F9E16F137D900B7FCE9 /* RoundedRectView.h in Headers */,
1D085FA216F138A100B7FCE9 /* ToastWindowController.h in Headers */,
1D7EE094171679FF0035BAD2 /* LightSensor.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Loading
Loading
@@ -1972,6 +1983,7 @@
1D085F9B16F1135F00B7FCE9 /* PasteEvent.m in Sources */,
1D085F9F16F137D900B7FCE9 /* RoundedRectView.m in Sources */,
1D085FA316F138A100B7FCE9 /* ToastWindowController.m in Sources */,
1D7EE095171679FF0035BAD2 /* LightSensor.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Loading
Loading
Loading
Loading
@@ -28,6 +28,7 @@
#import "iTermApplicationDelegate.h"
#import "iTermController.h"
#import "ITAddressBookMgr.h"
#import "LightSensor.h"
#import "PreferencePanel.h"
#import "PseudoTerminal.h"
#import "PTYSession.h"
Loading
Loading
@@ -587,7 +588,9 @@ static BOOL hasBecomeActive = NO;
- (id)init
{
self = [super init];
LightSensor *ls = [[LightSensor alloc] init];
[ls startMonitoringWithDarkTriggerLevel:100 lightTriggerLevel:200 target:nil];
// Add ourselves as an observer for notifications.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reloadMenus:)
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment