forked from mirror/smcFanControl
2.4 Beta
Initial Commit
This commit is contained in:
144
Classes/FanControl.h
Normal file
144
Classes/FanControl.h
Normal file
@ -0,0 +1,144 @@
|
||||
/*
|
||||
* FanControl
|
||||
*
|
||||
* Copyright (c) 2006 Hendrik Holtmann
|
||||
*
|
||||
* FanControl.h - MacBook(Pro) FanControl application
|
||||
*
|
||||
* This program 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import "NSFileManager+DirectoryLocations.h"
|
||||
#import <smc.h>
|
||||
#import <smcWrapper.h>
|
||||
#import <MachineDefaults.h>
|
||||
|
||||
#import <Power.h>
|
||||
#include <mach/mach_port.h>
|
||||
#include <mach/mach_interface.h>
|
||||
#include <mach/mach_init.h>
|
||||
|
||||
#include <IOKit/pwr_mgt/IOPMLib.h>
|
||||
#include <IOKit/IOMessage.h>
|
||||
|
||||
|
||||
#define kMenuBarHeight 22
|
||||
|
||||
|
||||
@interface FanControl : NSObject
|
||||
|
||||
{
|
||||
IBOutlet id currentSpeed;
|
||||
IBOutlet id currentSpeed1;
|
||||
|
||||
IBOutlet id slider1;
|
||||
IBOutlet id slider2;
|
||||
|
||||
IBOutlet id field1;
|
||||
IBOutlet id field2;
|
||||
|
||||
IBOutlet id mainwindow;
|
||||
|
||||
IBOutlet id tabview;
|
||||
|
||||
IBOutlet id applybutton;
|
||||
|
||||
IBOutlet id programinfo;
|
||||
|
||||
IBOutlet id copyright;
|
||||
|
||||
IBOutlet id syncslider;
|
||||
|
||||
IBOutlet id TemperatureController;
|
||||
|
||||
IBOutlet id levelIndicator;
|
||||
|
||||
IBOutlet id newfavoritewindow;
|
||||
|
||||
IBOutlet id newfavorite_title;
|
||||
|
||||
IBOutlet id autochange;
|
||||
|
||||
|
||||
IBOutlet NSMenu *theMenu;
|
||||
|
||||
IBOutlet id faqWindow;
|
||||
|
||||
IBOutlet id faqText;
|
||||
|
||||
IBOutlet id sliderCell;
|
||||
|
||||
IBOutlet id sync;
|
||||
|
||||
IBOutlet id colorSelector;
|
||||
|
||||
NSStatusItem *statusItem;
|
||||
|
||||
NSMutableArray* s_menus;
|
||||
|
||||
NSTimer *_readTimer;
|
||||
|
||||
Power *pw;
|
||||
|
||||
IBOutlet id FavoritesController;
|
||||
IBOutlet id FanController;
|
||||
IBOutlet id DefaultsController;
|
||||
|
||||
MachineDefaults *mdefaults;
|
||||
NSDictionary *s_sed;
|
||||
|
||||
NSDictionary *undo_dic;
|
||||
|
||||
NSImage *menu_image;
|
||||
NSImage *menu_image_alt;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
-(void)terminate:(id)sender;
|
||||
|
||||
- (IBAction)paypal:(id)sender;
|
||||
- (IBAction)visitHomepage:(id)sender;
|
||||
|
||||
- (IBAction)closePreferences:(id)sender;
|
||||
- (IBAction)savePreferences:(id)sender;
|
||||
- (IBAction)updateCheck:(id)sender;
|
||||
|
||||
- (void)init_statusitem;
|
||||
|
||||
//new ones, check old later
|
||||
- (IBAction)loginItem:(id)sender;
|
||||
- (IBAction)add_favorite:(id)sender;
|
||||
- (IBAction)close_favorite:(id)sender;
|
||||
- (IBAction)save_favorite:(id)sender;
|
||||
- (IBAction)delete_favorite:(id)sender;
|
||||
- (IBAction)syncSliders:(id)sender;
|
||||
- (void)apply_quickselect:(id)sender;
|
||||
- (void)apply_settings:(id)sender controllerindex:(int)cIndex;
|
||||
+ (void)setRights;
|
||||
- (void) syncBinder:(Boolean)bind;
|
||||
- (IBAction) changeMenu:(id)sender;
|
||||
- (IBAction)menuSelect:(id)sender;
|
||||
@end
|
||||
|
||||
|
||||
@interface NSNumber (NumberAdditions)
|
||||
- (NSString *) tohex;
|
||||
- (NSNumber*) celsius_fahrenheit;
|
||||
|
||||
@end
|
||||
|
||||
721
Classes/FanControl.m
Normal file
721
Classes/FanControl.m
Normal file
@ -0,0 +1,721 @@
|
||||
/*
|
||||
* FanControl
|
||||
*
|
||||
* Copyright (c) 2006 Hendrik Holtmann
|
||||
*
|
||||
* FanControl.m - MacBook(Pro) FanControl application
|
||||
*
|
||||
* This program 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
#import "FanControl.h"
|
||||
#import "MachineDefaults.h"
|
||||
#import <Security/Authorization.h>
|
||||
#import <Security/AuthorizationDB.h>
|
||||
#import <Security/AuthorizationTags.h>
|
||||
#import <Sparkle/SUUpdater.h>
|
||||
#import "SystemVersion.h"
|
||||
|
||||
@implementation FanControl
|
||||
|
||||
io_connect_t conn;
|
||||
kern_return_t result;
|
||||
SMCVal_t val;
|
||||
NSUserDefaults *defaults;
|
||||
Boolean supported=false;
|
||||
extern char *optarg;
|
||||
SMCVal_t val;
|
||||
OSStatus status;
|
||||
NSDictionary* machine_defaults;
|
||||
NSString *authpw;
|
||||
|
||||
|
||||
|
||||
#pragma mark **Init-Methods**
|
||||
|
||||
+(void) initialize {
|
||||
|
||||
//avoid Zombies when starting external app
|
||||
signal(SIGCHLD, SIG_IGN);
|
||||
|
||||
[FanControl copyMachinesIfNecessary];
|
||||
//check owner and suid rights
|
||||
[FanControl setRights];
|
||||
|
||||
//talk to smc
|
||||
[smcWrapper init];
|
||||
|
||||
//app in foreground for update notifications
|
||||
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
|
||||
|
||||
}
|
||||
|
||||
+(void)copyMachinesIfNecessary
|
||||
{
|
||||
NSString *path = [[[NSFileManager defaultManager] applicationSupportDirectory] stringByAppendingPathComponent:@"Machines.plist"];
|
||||
if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
|
||||
[[NSFileManager defaultManager] copyItemAtPath:[[NSBundle mainBundle] pathForResource:@"Machines" ofType:@"plist"] toPath:path error:nil];
|
||||
}
|
||||
}
|
||||
|
||||
-(void)upgradeFavorites
|
||||
{
|
||||
//upgrade favorites
|
||||
NSArray *rfavorites = [FavoritesController arrangedObjects];
|
||||
int j;
|
||||
int i;
|
||||
for (i=0;i<[rfavorites count];i++)
|
||||
{
|
||||
BOOL selected = NO;
|
||||
NSArray *fans = [[rfavorites objectAtIndex:i] objectForKey:@"FanData"];
|
||||
for (j=0;j<[fans count];j++) {
|
||||
if ([[[fans objectAtIndex:j] objectForKey:@"menu"] boolValue] == YES ) {
|
||||
selected = YES;
|
||||
}
|
||||
}
|
||||
if (selected==NO) {
|
||||
[[[[rfavorites objectAtIndex:i] objectForKey:@"FanData"] objectAtIndex:0] setObject:[NSNumber numberWithBool:YES] forKey:@"menu"];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
-(void) awakeFromNib {
|
||||
|
||||
s_sed = nil;
|
||||
pw=[[Power alloc] init];
|
||||
[pw setDelegate:self];
|
||||
[pw registerForSleepWakeNotification];
|
||||
[pw registerForPowerChange];
|
||||
|
||||
//load defaults
|
||||
|
||||
[DefaultsController setAppliesImmediately:NO];
|
||||
|
||||
mdefaults=[[MachineDefaults alloc] init:nil];
|
||||
|
||||
s_sed=[mdefaults get_machine_defaults];
|
||||
|
||||
|
||||
NSMutableArray *favorites=[NSMutableArray arrayWithObjects:
|
||||
[NSMutableDictionary dictionaryWithObjectsAndKeys:
|
||||
@"Default", @"Title",
|
||||
[s_sed objectForKey:@"Fans"], @"FanData",nil],nil];
|
||||
NSRange range=[[MachineDefaults computerModel] rangeOfString:@"MacBook"];
|
||||
if (range.length>0) {
|
||||
//for macbooks add a second default
|
||||
MachineDefaults *msdefaults=[[MachineDefaults alloc] init:nil];
|
||||
NSMutableDictionary *sec_fav=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"Higher RPM", @"Title",
|
||||
[[msdefaults get_machine_defaults] objectForKey:@"Fans"], @"FanData",nil];
|
||||
[favorites addObject:sec_fav];
|
||||
int i;
|
||||
for (i=0;i<[[s_sed objectForKey:@"Fans"] count];i++) {
|
||||
int min_value=([[[[s_sed objectForKey:@"Fans"] objectAtIndex:i] valueForKey:@"Minspeed"] intValue])*2;
|
||||
[[[[favorites objectAtIndex:1] objectForKey:@"FanData"] objectAtIndex:i] setObject:[NSNumber numberWithInt:min_value] forKey:@"selspeed"];
|
||||
|
||||
}
|
||||
[msdefaults release];
|
||||
}
|
||||
|
||||
//sync option for Macbook Pro's
|
||||
NSRange range_mbp=[[MachineDefaults computerModel] rangeOfString:@"MacBookPro"];
|
||||
if (range_mbp.length>0) {
|
||||
[sync setHidden:NO];
|
||||
}
|
||||
|
||||
|
||||
NSString *feedURL = nil;
|
||||
if ([SystemVersion isTiger]) {
|
||||
feedURL = @"http://www.eidac.de/smcfancontrol/smcfancontrol_tiger.xml";
|
||||
} else {
|
||||
feedURL = @"http://www.eidac.de/smcfancontrol/smcfancontrol.xml";
|
||||
}
|
||||
|
||||
//load user defaults
|
||||
defaults = [NSUserDefaults standardUserDefaults];
|
||||
[defaults registerDefaults:
|
||||
[NSMutableDictionary dictionaryWithObjectsAndKeys:
|
||||
[NSNumber numberWithInt:0], @"Unit",
|
||||
[NSNumber numberWithInt:0], @"SelDefault",
|
||||
[NSNumber numberWithBool:NO], @"AutoStart",
|
||||
[NSNumber numberWithBool:NO],@"AutomaticChange",
|
||||
[NSNumber numberWithInt:0],@"selbatt",
|
||||
[NSNumber numberWithInt:0],@"selac",
|
||||
[NSNumber numberWithInt:0],@"selload",
|
||||
[NSNumber numberWithInt:0],@"MenuBar",
|
||||
feedURL,@"SUFeedURL",
|
||||
[NSArchiver archivedDataWithRootObject:[NSColor blackColor]],@"MenuColor",
|
||||
favorites,@"Favorites",
|
||||
nil]];
|
||||
|
||||
|
||||
|
||||
|
||||
s_menus=[[NSMutableArray alloc] init];
|
||||
[s_menus autorelease];
|
||||
int i;
|
||||
for(i=0;i<[smcWrapper get_fan_num];i++){
|
||||
NSMenuItem *mitem=[[NSMenuItem alloc] initWithTitle:[NSString stringWithFormat:@"Fan: %d",i] action:NULL keyEquivalent:@""];
|
||||
[mitem setTag:(i+1)*10];
|
||||
[s_menus insertObject:mitem atIndex:i];
|
||||
[mitem release];
|
||||
}
|
||||
|
||||
[FavoritesController bind:@"content"
|
||||
toObject:[NSUserDefaultsController sharedUserDefaultsController]
|
||||
withKeyPath:@"values.Favorites"
|
||||
options:nil];
|
||||
[FavoritesController setEditable:YES];
|
||||
|
||||
// set slider sync - only for MBP
|
||||
for (i=0;i<[[FavoritesController arrangedObjects] count];i++) {
|
||||
if([[[[FavoritesController arrangedObjects] objectAtIndex:i] objectForKey:@"sync"] boolValue]==YES) {
|
||||
[FavoritesController setSelectionIndex:i];
|
||||
[self syncBinder:[[[[FavoritesController arrangedObjects] objectAtIndex:i] objectForKey:@"sync"] boolValue]];
|
||||
}
|
||||
}
|
||||
|
||||
//init statusitem
|
||||
[self init_statusitem];
|
||||
|
||||
|
||||
[programinfo setStringValue: [NSString stringWithFormat:@"%@ %@",[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]
|
||||
,[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"] ]];
|
||||
//
|
||||
[copyright setStringValue:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSHumanReadableCopyright"]];
|
||||
|
||||
|
||||
//power controls only available on portables
|
||||
if (range.length>0) {
|
||||
[autochange setEnabled:true];
|
||||
} else {
|
||||
[autochange setEnabled:false];
|
||||
}
|
||||
[faqText replaceCharactersInRange:NSMakeRange(0,0) withRTF: [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"F.A.Q" ofType:@"rtf"]]];
|
||||
[self apply_settings:nil controllerindex:[[defaults objectForKey:@"SelDefault"] intValue]];
|
||||
[[[[theMenu itemWithTag:1] submenu] itemAtIndex:[[defaults objectForKey:@"SelDefault"] intValue]] setState:NSOnState];
|
||||
[[sliderCell dataCell] setControlSize:NSSmallControlSize];
|
||||
[self changeMenu:nil];
|
||||
|
||||
//seting toolbar image
|
||||
menu_image=[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"smc" ofType:@"png"]];
|
||||
menu_image_alt=[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"smcover" ofType:@"png"]];
|
||||
|
||||
//release MachineDefaults class first call
|
||||
//add timer for reading to RunLoop
|
||||
_readTimer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(readFanData:) userInfo:nil repeats:YES];
|
||||
[_readTimer fire];
|
||||
//autoapply settings if valid
|
||||
[self upgradeFavorites];
|
||||
|
||||
//autostart
|
||||
[[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithBool:[self isInAutoStart]] forKey:@"AutoStart"];
|
||||
|
||||
}
|
||||
|
||||
|
||||
-(void)init_statusitem{
|
||||
statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength: NSVariableStatusItemLength] retain];
|
||||
[statusItem setMenu: theMenu];
|
||||
[statusItem setEnabled: YES];
|
||||
[statusItem setHighlightMode:YES];
|
||||
[statusItem setTitle:@"smc..."];
|
||||
int i;
|
||||
for(i=0;i<[s_menus count];i++) {
|
||||
[theMenu insertItem:[s_menus objectAtIndex:i] atIndex:i];
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#pragma mark **Action-Methods**
|
||||
- (IBAction)loginItem:(id)sender{
|
||||
if ([sender state]==NSOnState) {
|
||||
[self setStartAtLogin:YES];
|
||||
} else {
|
||||
[self setStartAtLogin:NO];
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)add_favorite:(id)sender{
|
||||
[[NSApplication sharedApplication] beginSheet:newfavoritewindow
|
||||
modalForWindow: mainwindow
|
||||
modalDelegate: nil
|
||||
didEndSelector: nil
|
||||
contextInfo: nil];
|
||||
}
|
||||
|
||||
- (IBAction)close_favorite:(id)sender{
|
||||
[newfavoritewindow close];
|
||||
[[NSApplication sharedApplication] endSheet:newfavoritewindow];
|
||||
}
|
||||
|
||||
- (IBAction)save_favorite:(id)sender{
|
||||
MachineDefaults *msdefaults=[[MachineDefaults alloc] init:nil];
|
||||
if ([[newfavorite_title stringValue] length]>0) {
|
||||
NSMutableDictionary *toinsert=[[NSMutableDictionary alloc] initWithObjectsAndKeys:[newfavorite_title stringValue],@"Title",[[msdefaults get_machine_defaults] objectForKey:@"Fans"],@"FanData",nil]; //default as template
|
||||
[toinsert setValue:[NSNumber numberWithInt:0] forKey:@"Standard"];
|
||||
[FavoritesController addObject:toinsert];
|
||||
[toinsert release];
|
||||
[newfavoritewindow close];
|
||||
[[NSApplication sharedApplication] endSheet:newfavoritewindow];
|
||||
}
|
||||
[msdefaults release];
|
||||
[self upgradeFavorites];
|
||||
}
|
||||
|
||||
|
||||
-(void) check_deletion:(id)combo{
|
||||
if ([FavoritesController selectionIndex]==[[defaults objectForKey:combo] intValue]) {
|
||||
[defaults setObject:[NSNumber numberWithInt:0] forKey:combo];
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)delete_favorite:(id)sender{
|
||||
int pressesButton=NSRunCriticalAlertPanelRelativeToWindow(
|
||||
NSLocalizedString(@"Delete favorite",nil),
|
||||
[NSString stringWithFormat:NSLocalizedString(@"Do you really want to delete the favorite %@?",nil), [ [ [FavoritesController arrangedObjects] objectAtIndex:[FavoritesController selectionIndex]] objectForKey:@"Title"] ],
|
||||
NSLocalizedString(@"No",nil),
|
||||
NSLocalizedString(@"Yes",nil),nil,mainwindow);
|
||||
if (pressesButton==0) {
|
||||
//delete favorite, but resets presets before
|
||||
[self check_deletion:@"selbatt"];
|
||||
[self check_deletion:@"selac"];
|
||||
[self check_deletion:@"selload"];
|
||||
[FavoritesController removeObjects:[FavoritesController selectedObjects]];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//reads fan data and updates the gui
|
||||
-(void) readFanData:(NSTimer*)timer{
|
||||
|
||||
NSString *temp;
|
||||
NSString *fan;
|
||||
|
||||
|
||||
//on init handling
|
||||
if (s_sed==nil) {
|
||||
return;
|
||||
}
|
||||
|
||||
//populate Menu Items with recent Data
|
||||
int i;
|
||||
for(i=0;i<[smcWrapper get_fan_num];i++){
|
||||
NSString *fandesc=[[[s_sed objectForKey:@"Fans"] objectAtIndex:i] objectForKey:@"Description"];
|
||||
[[theMenu itemWithTag:(i+1)*10] setTitle:[NSString stringWithFormat:@"%@: %@ rpm",fandesc,[[NSNumber numberWithInt:[smcWrapper get_fan_rpm:i]] stringValue]]];
|
||||
}
|
||||
|
||||
|
||||
float c_temp=[smcWrapper get_maintemp];
|
||||
if ([[defaults objectForKey:@"Unit"] intValue]==0) {
|
||||
temp=[NSString stringWithFormat:@"%@%CC",[NSNumber numberWithFloat:c_temp],(unsigned short)0xb0];
|
||||
} else {
|
||||
NSNumberFormatter *ncf=[[[NSNumberFormatter alloc] init] autorelease];
|
||||
[ncf setFormat:@"00;00;-00"];
|
||||
temp=[NSString stringWithFormat:@"%@%CF",[ncf stringForObjectValue:[[NSNumber numberWithFloat:c_temp] celsius_fahrenheit]],(unsigned short)0xb0];
|
||||
}
|
||||
NSNumberFormatter *nc=[[[NSNumberFormatter alloc] init] autorelease];
|
||||
//avoid jumping in menu bar
|
||||
[nc setFormat:@"000;000;-000"];
|
||||
|
||||
int selected = 0;
|
||||
NSArray *fans = [[[FavoritesController arrangedObjects] objectAtIndex:[FavoritesController selectionIndex]] objectForKey:@"FanData"];
|
||||
for (i=0;i<[fans count];i++)
|
||||
{
|
||||
if ([[[fans objectAtIndex:i] objectForKey:@"menu"] boolValue]==YES) {
|
||||
selected = i;
|
||||
}
|
||||
}
|
||||
|
||||
fan=[NSString stringWithFormat:@"%@rpm",[nc stringForObjectValue:[NSNumber numberWithFloat:[smcWrapper get_fan_rpm:selected]]]];
|
||||
|
||||
if ([[defaults objectForKey:@"MenuBar"] intValue]<=1) {
|
||||
NSString *add;
|
||||
int fsize;
|
||||
if ([[defaults objectForKey:@"MenuBar"] intValue]==0) {
|
||||
add=@"\n";
|
||||
fsize=9;
|
||||
[statusItem setLength:53];
|
||||
} else {
|
||||
add=@" ";
|
||||
fsize=11;
|
||||
[statusItem setLength:96];
|
||||
}
|
||||
NSMutableAttributedString *s_status=[[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@%@%@",temp,add,fan]];
|
||||
NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
|
||||
[paragraphStyle setAlignment:NSLeftTextAlignment];
|
||||
[s_status addAttribute:NSFontAttributeName value:[NSFont fontWithName:@"Lucida Grande" size:fsize] range:NSMakeRange(0,[s_status length])];
|
||||
[s_status addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0,[s_status length])];
|
||||
[s_status addAttribute:NSForegroundColorAttributeName value:(NSColor*)[NSUnarchiver unarchiveObjectWithData:[defaults objectForKey:@"MenuColor"]] range:NSMakeRange(0,[s_status length])];
|
||||
[statusItem setAttributedTitle:s_status];
|
||||
[statusItem setImage:nil];
|
||||
[statusItem setAlternateImage:nil];
|
||||
[paragraphStyle release];
|
||||
[s_status release];
|
||||
}
|
||||
|
||||
|
||||
if ([[defaults objectForKey:@"MenuBar"] intValue]==2) {
|
||||
[statusItem setLength:26];
|
||||
[statusItem setTitle:nil];
|
||||
[statusItem setToolTip:[NSString stringWithFormat:@"%@\n%@",temp,fan]];
|
||||
[statusItem setImage:menu_image];
|
||||
[statusItem setAlternateImage:menu_image_alt];
|
||||
|
||||
}
|
||||
|
||||
if ([[defaults objectForKey:@"MenuBar"] intValue]==3) {
|
||||
[statusItem setLength:46];
|
||||
NSMutableAttributedString *s_status=[[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@",temp]];
|
||||
[s_status addAttribute:NSFontAttributeName value:[NSFont fontWithName:@"Lucida Grande" size:12] range:NSMakeRange(0,[s_status length])];
|
||||
[s_status addAttribute:NSForegroundColorAttributeName value:(NSColor*)[NSUnarchiver unarchiveObjectWithData:[defaults objectForKey:@"MenuColor"]] range:NSMakeRange(0,[s_status length])];
|
||||
[statusItem setAttributedTitle:s_status];
|
||||
[statusItem setImage:nil];
|
||||
[statusItem setAlternateImage:nil];
|
||||
[s_status release];
|
||||
|
||||
}
|
||||
if ([[defaults objectForKey:@"MenuBar"] intValue]==4) {
|
||||
[statusItem setLength:65];
|
||||
NSMutableAttributedString *s_status=[[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@",fan]];
|
||||
[s_status addAttribute:NSFontAttributeName value:[NSFont fontWithName:@"Lucida Grande" size:12] range:NSMakeRange(0,[s_status length])];
|
||||
[s_status addAttribute:NSForegroundColorAttributeName value:(NSColor*)[NSUnarchiver unarchiveObjectWithData:[defaults objectForKey:@"MenuColor"]] range:NSMakeRange(0,[s_status length])];
|
||||
[statusItem setAttributedTitle:s_status];
|
||||
[statusItem setImage:nil];
|
||||
[statusItem setAlternateImage:nil];
|
||||
[s_status release];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (IBAction)savePreferences:(id)sender{
|
||||
[(NSUserDefaultsController *)DefaultsController save:sender];
|
||||
[defaults setValue:[FavoritesController content] forKey:@"Favorites"];
|
||||
[defaults synchronize];
|
||||
[mainwindow close];
|
||||
[self apply_settings:sender controllerindex:[FavoritesController selectionIndex]];
|
||||
undo_dic=[NSDictionary dictionaryWithDictionary:[defaults dictionaryRepresentation]];
|
||||
}
|
||||
|
||||
|
||||
|
||||
- (IBAction)closePreferences:(id)sender{
|
||||
[mainwindow close];
|
||||
[DefaultsController revert:sender];
|
||||
}
|
||||
|
||||
|
||||
//set the new fan settings
|
||||
|
||||
-(void)apply_settings:(id)sender controllerindex:(int)cIndex{
|
||||
int i;
|
||||
[FanControl setRights];
|
||||
[FavoritesController setSelectionIndex:cIndex];
|
||||
for (i=0;i<[[[[FavoritesController arrangedObjects] objectAtIndex:cIndex] objectForKey:@"FanData"] count];i++) {
|
||||
[smcWrapper setKey_external:[NSString stringWithFormat:@"F%dMn",i] value:[[[[FanController arrangedObjects] objectAtIndex:i] objectForKey:@"selspeed"] tohex]];
|
||||
}
|
||||
NSMenu *submenu = [[[NSMenu alloc] init] autorelease];
|
||||
|
||||
for(i=0;i<[[FavoritesController arrangedObjects] count];i++){
|
||||
NSMenuItem *submenuItem = [[[NSMenuItem alloc] initWithTitle:[[[FavoritesController arrangedObjects] objectAtIndex:i] objectForKey:@"Title"] action:@selector(apply_quickselect:) keyEquivalent:@""] autorelease];
|
||||
[submenuItem setTag:i*100]; //for later manipulation
|
||||
[submenuItem setEnabled:YES];
|
||||
[submenuItem setTarget:self];
|
||||
[submenuItem setRepresentedObject:[[FavoritesController arrangedObjects] objectAtIndex:i]];
|
||||
[submenu addItem:submenuItem];
|
||||
}
|
||||
|
||||
[[theMenu itemWithTag:1] setSubmenu:submenu];
|
||||
for (i=0;i<[[[theMenu itemWithTag:1] submenu] numberOfItems];i++) {
|
||||
[[[[theMenu itemWithTag:1] submenu] itemAtIndex:i] setState:NSOffState];
|
||||
}
|
||||
[[[[theMenu itemWithTag:1] submenu] itemAtIndex:cIndex] setState:NSOnState];
|
||||
[defaults setObject:[NSNumber numberWithInt:cIndex] forKey:@"SelDefault"];
|
||||
//change active setting display
|
||||
[[theMenu itemWithTag:1] setTitle:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Active Setting",nil),[ [ [FavoritesController arrangedObjects] objectAtIndex:[FavoritesController selectionIndex]] objectForKey:@"Title"] ]];
|
||||
}
|
||||
|
||||
|
||||
|
||||
-(void)apply_quickselect:(id)sender{
|
||||
int i;
|
||||
[FanControl setRights];
|
||||
//set all others items to off
|
||||
for (i=0;i<[[[theMenu itemWithTag:1] submenu] numberOfItems];i++) {
|
||||
[[[[theMenu itemWithTag:1] submenu] itemAtIndex:i] setState:NSOffState];
|
||||
}
|
||||
[sender setState:NSOnState];
|
||||
[[theMenu itemWithTag:1] setTitle:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Active Setting",nil),[sender title]]];
|
||||
[self apply_settings:sender controllerindex:[[[theMenu itemWithTag:1] submenu] indexOfItem:sender]];
|
||||
}
|
||||
|
||||
|
||||
-(void)terminate:(id)sender{
|
||||
//get last active selection
|
||||
[defaults synchronize];
|
||||
SMCClose(conn);
|
||||
[_readTimer invalidate];
|
||||
[pw deregisterForSleepWakeNotification];
|
||||
[pw deregisterForPowerChange];
|
||||
[pw release];
|
||||
[menu_image release];
|
||||
[menu_image_alt release];
|
||||
//[mdefaults release];
|
||||
//[statusItem release];
|
||||
//[s_menus release];
|
||||
//[theMenu release];
|
||||
[[NSApplication sharedApplication] terminate:self];
|
||||
}
|
||||
|
||||
|
||||
|
||||
- (IBAction)syncSliders:(id)sender{
|
||||
if ([sender state]) {
|
||||
[self syncBinder:YES];
|
||||
} else {
|
||||
[self syncBinder:NO];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (IBAction) changeMenu:(id)sender{
|
||||
if ([[[[NSUserDefaultsController sharedUserDefaultsController] values] valueForKey:@"MenuBar"] intValue]==2) {
|
||||
[colorSelector setEnabled:NO];
|
||||
} else {
|
||||
[colorSelector setEnabled:YES];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
- (IBAction)menuSelect:(id)sender{
|
||||
//deactivate all other radio buttons
|
||||
int i;
|
||||
for (i=0;i<[[FanController arrangedObjects] count];i++) {
|
||||
if (i!=[sender selectedRow]) {
|
||||
[[[FanController arrangedObjects] objectAtIndex:i] setValue:[NSNumber numberWithBool:NO] forKey:@"menu"];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#pragma mark **Helper-Methods**
|
||||
|
||||
//just a helper to bringt update-info-window to the front
|
||||
- (IBAction)updateCheck:(id)sender{
|
||||
[[[SUUpdater alloc] init] checkForUpdates:sender];
|
||||
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
|
||||
}
|
||||
|
||||
- (IBAction)visitHomepage:(id)sender{
|
||||
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.eidac.de/products"]];
|
||||
}
|
||||
|
||||
|
||||
- (IBAction)paypal:(id)sender{
|
||||
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=holtmann%40campus%2dvirtuell%2ede&no_shipping=0&no_note=1&tax=0¤cy_code=EUR&bn=PP%2dDonationsBF&charset=UTF%2d8&country=US"]];
|
||||
}
|
||||
|
||||
-(void) syncBinder:(Boolean)bind{
|
||||
//in case plist is corrupt, don't bind
|
||||
if ([[FanController arrangedObjects] count]>1 ) {
|
||||
if (bind==YES) {
|
||||
[[[FanController arrangedObjects] objectAtIndex:1] bind:@"selspeed" toObject:[[FanController arrangedObjects] objectAtIndex:0] withKeyPath:@"selspeed" options:nil];
|
||||
[[[FanController arrangedObjects] objectAtIndex:0] bind:@"selspeed" toObject:[[FanController arrangedObjects] objectAtIndex:1] withKeyPath:@"selspeed" options:nil];
|
||||
} else {
|
||||
[[[FanController arrangedObjects] objectAtIndex:1] unbind:@"selspeed"];
|
||||
[[[FanController arrangedObjects] objectAtIndex:0] unbind:@"selspeed"];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#pragma mark **Power Watchdog-Methods**
|
||||
|
||||
- (void)systemDidWakeFromSleep:(id)sender{
|
||||
[self apply_settings:nil controllerindex:[[defaults objectForKey:@"SelDefault"] intValue]];
|
||||
}
|
||||
|
||||
|
||||
- (void)powerChangeToBattery:(id)sender{
|
||||
|
||||
if ([[defaults objectForKey:@"AutomaticChange"] boolValue]==YES) {
|
||||
[self apply_settings:nil controllerindex:[[defaults objectForKey:@"selbatt"] intValue]];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)powerChangeToAC:(id)sender{
|
||||
if ([[defaults objectForKey:@"AutomaticChange"] boolValue]==YES) {
|
||||
[self apply_settings:nil controllerindex:[[defaults objectForKey:@"selac"] intValue]];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
- (void)powerChangeToACLoading:(id)sender{
|
||||
if ([[defaults objectForKey:@"AutomaticChange"] boolValue]==YES) {
|
||||
[self apply_settings:nil controllerindex:[[defaults objectForKey:@"selload"] intValue]];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Start-at-login control
|
||||
|
||||
- (BOOL)isInAutoStart
|
||||
{
|
||||
BOOL found = NO;
|
||||
LSSharedFileListRef loginItems = LSSharedFileListCreate(kCFAllocatorDefault, kLSSharedFileListSessionLoginItems, /*options*/ NULL);
|
||||
NSString *path = [[NSBundle mainBundle] bundlePath];
|
||||
CFURLRef URLToToggle = (CFURLRef)[NSURL fileURLWithPath:path];
|
||||
LSSharedFileListItemRef existingItem = NULL;
|
||||
|
||||
UInt32 seed = 0U;
|
||||
NSArray *currentLoginItems = [NSMakeCollectable(LSSharedFileListCopySnapshot(loginItems, &seed)) autorelease];
|
||||
|
||||
for (id itemObject in currentLoginItems) {
|
||||
LSSharedFileListItemRef item = (LSSharedFileListItemRef)itemObject;
|
||||
|
||||
UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes;
|
||||
CFURLRef URL = NULL;
|
||||
OSStatus err = LSSharedFileListItemResolve(item, resolutionFlags, &URL, /*outRef*/ NULL);
|
||||
if (err == noErr) {
|
||||
Boolean foundIt = CFEqual(URL, URLToToggle);
|
||||
CFRelease(URL);
|
||||
|
||||
if (foundIt) {
|
||||
existingItem = item;
|
||||
found = YES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
- (void) setStartAtLogin:(BOOL)enabled {
|
||||
|
||||
LSSharedFileListRef loginItems = LSSharedFileListCreate(kCFAllocatorDefault, kLSSharedFileListSessionLoginItems, /*options*/ NULL);
|
||||
|
||||
|
||||
NSString *path = [[NSBundle mainBundle] bundlePath];
|
||||
|
||||
OSStatus status;
|
||||
CFURLRef URLToToggle = (CFURLRef)[NSURL fileURLWithPath:path];
|
||||
LSSharedFileListItemRef existingItem = NULL;
|
||||
|
||||
UInt32 seed = 0U;
|
||||
NSArray *currentLoginItems = [NSMakeCollectable(LSSharedFileListCopySnapshot(loginItems, &seed)) autorelease];
|
||||
|
||||
for (id itemObject in currentLoginItems) {
|
||||
LSSharedFileListItemRef item = (LSSharedFileListItemRef)itemObject;
|
||||
|
||||
UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes;
|
||||
CFURLRef URL = NULL;
|
||||
OSStatus err = LSSharedFileListItemResolve(item, resolutionFlags, &URL, /*outRef*/ NULL);
|
||||
if (err == noErr) {
|
||||
Boolean foundIt = CFEqual(URL, URLToToggle);
|
||||
CFRelease(URL);
|
||||
|
||||
if (foundIt) {
|
||||
existingItem = item;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (enabled && (existingItem == NULL)) {
|
||||
NSString *displayName = [[NSFileManager defaultManager] displayNameAtPath:path];
|
||||
IconRef icon = NULL;
|
||||
FSRef ref;
|
||||
Boolean gotRef = CFURLGetFSRef(URLToToggle, &ref);
|
||||
if (gotRef) {
|
||||
status = GetIconRefFromFileInfo(&ref,
|
||||
/*fileNameLength*/ 0, /*fileName*/ NULL,
|
||||
kFSCatInfoNone, /*catalogInfo*/ NULL,
|
||||
kIconServicesNormalUsageFlag,
|
||||
&icon,
|
||||
/*outLabel*/ NULL);
|
||||
if (status != noErr)
|
||||
icon = NULL;
|
||||
}
|
||||
|
||||
LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemBeforeFirst, (CFStringRef)displayName, icon, URLToToggle, /*propertiesToSet*/ NULL, /*propertiesToClear*/ NULL);
|
||||
} else if (!enabled && (existingItem != NULL))
|
||||
LSSharedFileListItemRemove(loginItems, existingItem);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#pragma mark **SMC-Binary Owner/Right Check**
|
||||
//call smc binary with sudo rights and apply
|
||||
+(void)setRights{
|
||||
NSString *smcpath = [[NSBundle mainBundle] pathForResource:@"smc" ofType:@""];
|
||||
NSFileManager *fmanage=[NSFileManager defaultManager];
|
||||
NSDictionary *fdic = [fmanage attributesOfItemAtPath:smcpath error:nil];
|
||||
if ([[fdic valueForKey:@"NSFileOwnerAccountName"] isEqualToString:@"root"] && [[fdic valueForKey:@"NSFileGroupOwnerAccountName"] isEqualToString:@"admin"] && ([[fdic valueForKey:@"NSFilePosixPermissions"] intValue]==3437)) {
|
||||
return;
|
||||
}
|
||||
FILE *commPipe;
|
||||
AuthorizationRef authorizationRef;
|
||||
AuthorizationItem gencitem = { "system.privilege.admin", 0, NULL, 0 };
|
||||
AuthorizationRights gencright = { 1, &gencitem };
|
||||
int flags = kAuthorizationFlagExtendRights | kAuthorizationFlagInteractionAllowed;
|
||||
status = AuthorizationCreate(&gencright, kAuthorizationEmptyEnvironment, flags, &authorizationRef);
|
||||
NSString *tool=@"/usr/sbin/chown";
|
||||
NSArray *argsArray = [NSArray arrayWithObjects: @"root:admin",smcpath,nil];
|
||||
int i;
|
||||
char *args[255];
|
||||
for(i = 0;i < [argsArray count];i++){
|
||||
args[i] = (char *)[[argsArray objectAtIndex:i]cString];
|
||||
}
|
||||
args[i] = NULL;
|
||||
status=AuthorizationExecuteWithPrivileges(authorizationRef,[tool UTF8String],0,args,&commPipe);
|
||||
//second call for suid-bit
|
||||
tool=@"/bin/chmod";
|
||||
argsArray = [NSArray arrayWithObjects: @"6555",smcpath,nil];
|
||||
for(i = 0;i < [argsArray count];i++){
|
||||
args[i] = (char *)[[argsArray objectAtIndex:i]cString];
|
||||
}
|
||||
args[i] = NULL;
|
||||
status=AuthorizationExecuteWithPrivileges(authorizationRef,[tool UTF8String],0,args,&commPipe);
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
|
||||
@implementation NSNumber (NumberAdditions)
|
||||
|
||||
- (NSString*) tohex{
|
||||
return [NSString stringWithFormat:@"%0.4x",[self intValue]<<2];
|
||||
}
|
||||
|
||||
|
||||
- (NSNumber*) celsius_fahrenheit{
|
||||
float celsius=[self floatValue];
|
||||
float fahrenheit=(celsius*9)/5+32;
|
||||
return [NSNumber numberWithFloat:fahrenheit];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
37
Classes/MachineDefaults.h
Normal file
37
Classes/MachineDefaults.h
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* FanControl
|
||||
*
|
||||
* Copyright (c) 2006 Hendrik Holtmann
|
||||
*
|
||||
* MachineDefaults.m - MacBook(Pro) FanControl application
|
||||
*
|
||||
* This program 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <smcWrapper.h>
|
||||
|
||||
|
||||
@interface MachineDefaults : NSObject {
|
||||
NSString *machine;
|
||||
NSArray *supported_machines;
|
||||
Boolean supported;
|
||||
int machine_num;
|
||||
}
|
||||
|
||||
+ (NSString *)computerModel;
|
||||
- (id)init:(NSString*)p_machine;
|
||||
-(NSDictionary*)get_machine_defaults;
|
||||
- (void)dealloc;
|
||||
@end
|
||||
139
Classes/MachineDefaults.m
Normal file
139
Classes/MachineDefaults.m
Normal file
@ -0,0 +1,139 @@
|
||||
/*
|
||||
* FanControl
|
||||
*
|
||||
* Copyright (c) 2006 Hendrik Holtmann
|
||||
*
|
||||
* MachineDefaults.m - MacBook(Pro) FanControl application
|
||||
*
|
||||
* This program 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#import "MachineDefaults.h"
|
||||
#import "NSFileManager+DirectoryLocations.h"
|
||||
|
||||
@implementation MachineDefaults
|
||||
|
||||
|
||||
- (id)init:(NSString*)p_machine{
|
||||
machine=[MachineDefaults computerModel];
|
||||
supported_machines=[[NSArray alloc] initWithContentsOfFile:[[[NSFileManager defaultManager] applicationSupportDirectory] stringByAppendingPathComponent:@"Machines.plist"]];
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
-(Boolean)is_supported{
|
||||
int i;
|
||||
supported=NO;
|
||||
for(i=0;i<[supported_machines count];i++) {
|
||||
if ([machine isEqualToString:[[supported_machines objectAtIndex:i] objectForKey:@"Machine"]]) {
|
||||
supported=YES;
|
||||
machine_num=i;
|
||||
}
|
||||
}
|
||||
return supported;
|
||||
}
|
||||
|
||||
|
||||
|
||||
-(NSDictionary*) readfrom_plist{
|
||||
if (!supported) {return nil;}
|
||||
return [supported_machines objectAtIndex:machine_num];
|
||||
}
|
||||
|
||||
|
||||
|
||||
-(NSDictionary*) readfrom_smc{
|
||||
if (supported) {return nil;}
|
||||
int num_fans,i;
|
||||
[smcWrapper init];
|
||||
num_fans=[smcWrapper get_fan_num];
|
||||
NSString *desc;
|
||||
NSNumber *min,*max;
|
||||
NSData *xmldata;
|
||||
NSString *error;
|
||||
NSMutableArray *fans=[[NSMutableArray alloc] init];
|
||||
for (i = 0; i < num_fans; i++) {
|
||||
min=[NSNumber numberWithInt:[smcWrapper get_min_speed:i]];
|
||||
max=[NSNumber numberWithInt:[smcWrapper get_max_speed:i]];
|
||||
desc=[smcWrapper get_fan_descr:i];
|
||||
[fans addObject:[NSDictionary dictionaryWithObjectsAndKeys:desc,@"Description",min,@"Minspeed",max,@"Maxspeed",min,@"selspeed",nil]];
|
||||
}
|
||||
//save to plist for future
|
||||
NSMutableArray *supported_m=[[NSMutableArray alloc] initWithContentsOfFile:[[[NSFileManager defaultManager] applicationSupportDirectory] stringByAppendingPathComponent:@"Machines.plist"]];
|
||||
NSDictionary *new_machine= [NSDictionary dictionaryWithObjectsAndKeys:fans,@"Fans",[NSNumber numberWithInt:num_fans],@"NumFans",machine,@"Machine",@"Autogenerated",@"Comment",nil];
|
||||
[fans release];
|
||||
[supported_m addObject:new_machine];
|
||||
|
||||
//save to plist
|
||||
xmldata = [NSPropertyListSerialization dataFromPropertyList:supported_m
|
||||
format:NSPropertyListXMLFormat_v1_0
|
||||
errorDescription:&error];
|
||||
[xmldata writeToFile:[[[NSFileManager defaultManager] applicationSupportDirectory] stringByAppendingPathComponent:@"Machines.plist"] atomically:YES];
|
||||
[supported_m release];
|
||||
//return new machine-live-data
|
||||
return [new_machine retain];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
-(NSDictionary*)get_machine_defaults{
|
||||
NSDictionary *m_defaults=nil;
|
||||
if ([self is_supported]) {
|
||||
m_defaults=[self readfrom_plist];
|
||||
int i;
|
||||
//localize fan-descriptions
|
||||
for (i=0;i<[[m_defaults objectForKey:@"Fans"] count];i++) {
|
||||
NSString *newvalue=NSLocalizedString([[[m_defaults objectForKey:@"Fans"] objectAtIndex:i] objectForKey:@"Description"],nil);
|
||||
[[[m_defaults objectForKey:@"Fans"] objectAtIndex:i] setValue:newvalue forKey:@"Description"];
|
||||
}
|
||||
} else {
|
||||
NSAlert *alert = [NSAlert alertWithMessageText:NSLocalizedString(@"Alert!",nil)
|
||||
defaultButton:NSLocalizedString(@"Continue",nil) alternateButton:NSLocalizedString(@"Quit",nil) otherButton:nil
|
||||
informativeTextWithFormat:NSLocalizedString(@"smcFanControl has not been tested on this machine yet, but it should run if you follow the instructions. \n\nIf you choose to continue, please make you have no other FanControl-software running. Otherwise please quit, deinstall the other software, restart your machine and rerun smcFanControl!",nil)];
|
||||
int code=[alert runModal];
|
||||
if (code==NSAlertDefaultReturn) {
|
||||
m_defaults=[self readfrom_smc];
|
||||
} else {
|
||||
[[NSApplication sharedApplication] terminate:nil];
|
||||
}
|
||||
|
||||
}
|
||||
return m_defaults;
|
||||
}
|
||||
|
||||
+ (NSString *)computerModel
|
||||
{
|
||||
static NSString *computerModel = nil;
|
||||
if (!computerModel) {
|
||||
io_service_t pexpdev;
|
||||
if ((pexpdev = IOServiceGetMatchingService (kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"))))
|
||||
{
|
||||
NSData *data;
|
||||
if ((data = (id)IORegistryEntryCreateCFProperty(pexpdev, CFSTR("model"), kCFAllocatorDefault, 0))) {
|
||||
computerModel = [[NSString allocWithZone:NULL] initWithCString:[data bytes] encoding:NSASCIIStringEncoding];
|
||||
[data release];
|
||||
}
|
||||
}
|
||||
}
|
||||
return computerModel;
|
||||
}
|
||||
|
||||
- (void)dealloc{
|
||||
[super dealloc];
|
||||
//[supported_machines release];
|
||||
}
|
||||
|
||||
@end
|
||||
36
Classes/NSFileManager+DirectoryLocations.h
Normal file
36
Classes/NSFileManager+DirectoryLocations.h
Normal file
@ -0,0 +1,36 @@
|
||||
//
|
||||
// NSFileManager+DirectoryLocations.h
|
||||
//
|
||||
// Created by Matt Gallagher on 06 May 2010
|
||||
//
|
||||
// This software is provided 'as-is', without any express or implied
|
||||
// warranty. In no event will the authors be held liable for any damages
|
||||
// arising from the use of this software. Permission is granted to anyone to
|
||||
// use this software for any purpose, including commercial applications, and to
|
||||
// alter it and redistribute it freely, subject to the following restrictions:
|
||||
//
|
||||
// 1. The origin of this software must not be misrepresented; you must not
|
||||
// claim that you wrote the original software. If you use this software
|
||||
// in a product, an acknowledgment in the product documentation would be
|
||||
// appreciated but is not required.
|
||||
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||
// misrepresented as being the original software.
|
||||
// 3. This notice may not be removed or altered from any source
|
||||
// distribution.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
//
|
||||
// DirectoryLocations is a set of global methods for finding the fixed location
|
||||
// directoriess.
|
||||
//
|
||||
@interface NSFileManager (DirectoryLocations)
|
||||
|
||||
- (NSString *)findOrCreateDirectory:(NSSearchPathDirectory)searchPathDirectory
|
||||
inDomain:(NSSearchPathDomainMask)domainMask
|
||||
appendPathComponent:(NSString *)appendComponent
|
||||
error:(NSError **)errorOut;
|
||||
- (NSString *)applicationSupportDirectory;
|
||||
|
||||
@end
|
||||
155
Classes/NSFileManager+DirectoryLocations.m
Normal file
155
Classes/NSFileManager+DirectoryLocations.m
Normal file
@ -0,0 +1,155 @@
|
||||
//
|
||||
// NSFileManager+DirectoryLocations.m
|
||||
//
|
||||
// Created by Matt Gallagher on 06 May 2010
|
||||
//
|
||||
// This software is provided 'as-is', without any express or implied
|
||||
// warranty. In no event will the authors be held liable for any damages
|
||||
// arising from the use of this software. Permission is granted to anyone to
|
||||
// use this software for any purpose, including commercial applications, and to
|
||||
// alter it and redistribute it freely, subject to the following restrictions:
|
||||
//
|
||||
// 1. The origin of this software must not be misrepresented; you must not
|
||||
// claim that you wrote the original software. If you use this software
|
||||
// in a product, an acknowledgment in the product documentation would be
|
||||
// appreciated but is not required.
|
||||
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||
// misrepresented as being the original software.
|
||||
// 3. This notice may not be removed or altered from any source
|
||||
// distribution.
|
||||
//
|
||||
|
||||
#import "NSFileManager+DirectoryLocations.h"
|
||||
|
||||
enum
|
||||
{
|
||||
DirectoryLocationErrorNoPathFound,
|
||||
DirectoryLocationErrorFileExistsAtLocation
|
||||
};
|
||||
|
||||
NSString * const DirectoryLocationDomain = @"DirectoryLocationDomain";
|
||||
|
||||
@implementation NSFileManager (DirectoryLocations)
|
||||
|
||||
//
|
||||
// findOrCreateDirectory:inDomain:appendPathComponent:error:
|
||||
//
|
||||
// Method to tie together the steps of:
|
||||
// 1) Locate a standard directory by search path and domain mask
|
||||
// 2) Select the first path in the results
|
||||
// 3) Append a subdirectory to that path
|
||||
// 4) Create the directory and intermediate directories if needed
|
||||
// 5) Handle errors by emitting a proper NSError object
|
||||
//
|
||||
// Parameters:
|
||||
// searchPathDirectory - the search path passed to NSSearchPathForDirectoriesInDomains
|
||||
// domainMask - the domain mask passed to NSSearchPathForDirectoriesInDomains
|
||||
// appendComponent - the subdirectory appended
|
||||
// errorOut - any error from file operations
|
||||
//
|
||||
// returns the path to the directory (if path found and exists), nil otherwise
|
||||
//
|
||||
- (NSString *)findOrCreateDirectory:(NSSearchPathDirectory)searchPathDirectory
|
||||
inDomain:(NSSearchPathDomainMask)domainMask
|
||||
appendPathComponent:(NSString *)appendComponent
|
||||
error:(NSError **)errorOut
|
||||
{
|
||||
//
|
||||
// Search for the path
|
||||
//
|
||||
NSArray* paths = NSSearchPathForDirectoriesInDomains(
|
||||
searchPathDirectory,
|
||||
domainMask,
|
||||
YES);
|
||||
if ([paths count] == 0)
|
||||
{
|
||||
if (errorOut)
|
||||
{
|
||||
NSDictionary *userInfo =
|
||||
[NSDictionary dictionaryWithObjectsAndKeys:
|
||||
NSLocalizedStringFromTable(
|
||||
@"No path found for directory in domain.",
|
||||
@"Errors",
|
||||
nil),
|
||||
NSLocalizedDescriptionKey,
|
||||
[NSNumber numberWithInteger:searchPathDirectory],
|
||||
@"NSSearchPathDirectory",
|
||||
[NSNumber numberWithInteger:domainMask],
|
||||
@"NSSearchPathDomainMask",
|
||||
nil];
|
||||
*errorOut =
|
||||
[NSError
|
||||
errorWithDomain:DirectoryLocationDomain
|
||||
code:DirectoryLocationErrorNoPathFound
|
||||
userInfo:userInfo];
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
//
|
||||
// Normally only need the first path returned
|
||||
//
|
||||
NSString *resolvedPath = [paths objectAtIndex:0];
|
||||
|
||||
//
|
||||
// Append the extra path component
|
||||
//
|
||||
if (appendComponent)
|
||||
{
|
||||
resolvedPath = [resolvedPath
|
||||
stringByAppendingPathComponent:appendComponent];
|
||||
}
|
||||
|
||||
//
|
||||
// Create the path if it doesn't exist
|
||||
//
|
||||
NSError *error = nil;
|
||||
BOOL success = [self
|
||||
createDirectoryAtPath:resolvedPath
|
||||
withIntermediateDirectories:YES
|
||||
attributes:nil
|
||||
error:&error];
|
||||
if (!success)
|
||||
{
|
||||
if (errorOut)
|
||||
{
|
||||
*errorOut = error;
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
//
|
||||
// If we've made it this far, we have a success
|
||||
//
|
||||
if (errorOut)
|
||||
{
|
||||
*errorOut = nil;
|
||||
}
|
||||
return resolvedPath;
|
||||
}
|
||||
|
||||
//
|
||||
// applicationSupportDirectory
|
||||
//
|
||||
// Returns the path to the applicationSupportDirectory (creating it if it doesn't
|
||||
// exist).
|
||||
//
|
||||
- (NSString *)applicationSupportDirectory
|
||||
{
|
||||
NSString *executableName =
|
||||
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleExecutable"];
|
||||
NSError *error;
|
||||
NSString *result =
|
||||
[self
|
||||
findOrCreateDirectory:NSApplicationSupportDirectory
|
||||
inDomain:NSUserDomainMask
|
||||
appendPathComponent:executableName
|
||||
error:&error];
|
||||
if (!result)
|
||||
{
|
||||
NSLog(@"Unable to find or create application support directory:\n%@", error);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@end
|
||||
70
Classes/Power.h
Normal file
70
Classes/Power.h
Normal file
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* FanControl
|
||||
*
|
||||
* Copyright (c) 2006 Hendrik Holtmann
|
||||
*
|
||||
* Power.h - MacBook(Pro) FanControl application
|
||||
*
|
||||
* This program 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <IOKit/ps/IOPSKeys.h>
|
||||
#include <IOKit/ps/IOPowerSources.h>
|
||||
#include <IOKit/pwr_mgt/IOPMLib.h>
|
||||
#include <IOKit/IOMessage.h>
|
||||
|
||||
|
||||
@interface Power : NSObject {
|
||||
|
||||
io_connect_t root_port;
|
||||
io_object_t notifier;
|
||||
IONotificationPortRef notificationPort;
|
||||
id _delegate;
|
||||
|
||||
}
|
||||
|
||||
- (id)init;
|
||||
|
||||
- (id)delegate;
|
||||
- (void)setDelegate:(id)new_delegate;
|
||||
|
||||
- (void)registerForSleepWakeNotification;
|
||||
- (void)deregisterForSleepWakeNotification;
|
||||
|
||||
- (void)registerForPowerChange;
|
||||
- (void)deregisterForPowerChange;
|
||||
|
||||
//internal
|
||||
- (void)powerMessageReceived:(natural_t)messageType withArgument:(void *) messageArgument;
|
||||
- (void)powerSourceMesssageReceived:(NSDictionary *)n_description;
|
||||
|
||||
|
||||
@end
|
||||
|
||||
|
||||
//delegate Prototypes
|
||||
@interface NSObject (PowerDelegate)
|
||||
|
||||
- (void)systemDidWakeFromSleep:(id)sender;
|
||||
|
||||
- (void)powerChangeToBattery:(id)sender;
|
||||
|
||||
- (void)powerChangeToAC:(id)sender;
|
||||
|
||||
- (void)powerChangeToACLoading:(id)sender;
|
||||
|
||||
@end
|
||||
177
Classes/Power.m
Normal file
177
Classes/Power.m
Normal file
@ -0,0 +1,177 @@
|
||||
/*
|
||||
* FanControl
|
||||
*
|
||||
* Copyright (c) 2006 Hendrik Holtmann
|
||||
*
|
||||
* Power.m - MacBook(Pro) FanControl application
|
||||
*
|
||||
* This program 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#import "Power.h"
|
||||
|
||||
|
||||
static CFRunLoopSourceRef powerNotifierRunLoopSource = NULL;
|
||||
|
||||
static int lastsource=0;
|
||||
|
||||
@implementation Power
|
||||
|
||||
|
||||
void SleepWatcher( void * refCon, io_service_t service, natural_t messageType, void * messageArgument ){
|
||||
[(Power *)refCon powerMessageReceived: messageType withArgument: messageArgument];
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void powerSourceChanged(void * refCon)
|
||||
{
|
||||
CFTypeRef powerBlob = IOPSCopyPowerSourcesInfo();
|
||||
CFArrayRef powerSourcesList = IOPSCopyPowerSourcesList(powerBlob);
|
||||
unsigned count = CFArrayGetCount(powerSourcesList);
|
||||
unsigned int i;
|
||||
for (i = 0U; i < count; ++i) { //in case we have several powersources
|
||||
CFTypeRef powerSource;
|
||||
CFDictionaryRef description;
|
||||
powerSource = CFArrayGetValueAtIndex(powerSourcesList, i);
|
||||
description = IOPSGetPowerSourceDescription(powerBlob, powerSource);
|
||||
//work with NSArray from here
|
||||
NSDictionary *n_description = (NSDictionary *)description;
|
||||
[(Power *)refCon powerSourceMesssageReceived:n_description];
|
||||
}
|
||||
CFRelease(powerBlob);
|
||||
CFRelease(powerSourcesList);
|
||||
}
|
||||
|
||||
- (id)init{
|
||||
[super init];
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
- (void)registerForSleepWakeNotification
|
||||
{
|
||||
root_port = IORegisterForSystemPower(self, ¬ificationPort, SleepWatcher, ¬ifier);
|
||||
CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(notificationPort), kCFRunLoopDefaultMode);
|
||||
}
|
||||
|
||||
|
||||
- (void)registerForPowerChange
|
||||
{
|
||||
powerNotifierRunLoopSource = IOPSNotificationCreateRunLoopSource(powerSourceChanged,self);
|
||||
if (powerNotifierRunLoopSource) {
|
||||
CFRunLoopAddSource(CFRunLoopGetCurrent(), powerNotifierRunLoopSource, kCFRunLoopDefaultMode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void)deregisterForSleepWakeNotification
|
||||
{
|
||||
CFRunLoopRemoveSource( CFRunLoopGetCurrent(),
|
||||
IONotificationPortGetRunLoopSource(notificationPort),
|
||||
kCFRunLoopCommonModes );
|
||||
IODeregisterForSystemPower(¬ifier);
|
||||
IOServiceClose(root_port);
|
||||
IONotificationPortDestroy(notificationPort);
|
||||
}
|
||||
|
||||
- (void)deregisterForPowerChange{
|
||||
CFRunLoopRemoveSource(CFRunLoopGetCurrent(), powerNotifierRunLoopSource, kCFRunLoopDefaultMode);
|
||||
CFRelease(powerNotifierRunLoopSource);
|
||||
}
|
||||
|
||||
|
||||
|
||||
- (void)powerMessageReceived:(natural_t)messageType withArgument:(void *) messageArgument
|
||||
{
|
||||
switch (messageType)
|
||||
{
|
||||
case kIOMessageSystemWillSleep:
|
||||
IOAllowPowerChange(root_port, (long)messageArgument);
|
||||
break;
|
||||
case kIOMessageCanSystemSleep:
|
||||
IOAllowPowerChange(root_port, (long)messageArgument);
|
||||
break;
|
||||
case kIOMessageSystemHasPoweredOn:
|
||||
if ([_delegate respondsToSelector:@selector(systemDidWakeFromSleep:)])
|
||||
[_delegate systemDidWakeFromSleep:self];
|
||||
else
|
||||
{
|
||||
[NSException raise:NSInternalInconsistencyException format:@"Delegate doesn't respond to ourDelegate"];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)powerSourceMesssageReceived:(NSDictionary *)n_description{
|
||||
if (([[n_description objectForKey:@"Power Source State"] isEqualToString:@"AC Power"] && [[n_description objectForKey:@"Is Charging"] intValue]==1) && lastsource!=1) {
|
||||
lastsource=1;
|
||||
if ([_delegate respondsToSelector:@selector(powerChangeToACLoading:)])
|
||||
[_delegate powerChangeToACLoading:self];
|
||||
else
|
||||
{
|
||||
[NSException raise:NSInternalInconsistencyException format:@"Delegate doesn't respond to ourDelegate"];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (([[n_description objectForKey:@"Power Source State"] isEqualToString:@"AC Power"] && [[n_description objectForKey:@"Is Charging"] intValue]==0) && lastsource!=2) {
|
||||
lastsource=2;
|
||||
if ([_delegate respondsToSelector:@selector(powerChangeToAC:)])
|
||||
[_delegate powerChangeToAC:self];
|
||||
else
|
||||
{
|
||||
[NSException raise:NSInternalInconsistencyException format:@"Delegate doesn't respond to ourDelegate"];
|
||||
}
|
||||
}
|
||||
|
||||
if (([[n_description objectForKey:@"Power Source State"] isEqualToString:@"Battery Power"]) && lastsource!=3) {
|
||||
lastsource=3;
|
||||
if ([_delegate respondsToSelector:@selector(powerChangeToBattery:)])
|
||||
[_delegate powerChangeToBattery:self];
|
||||
else
|
||||
{
|
||||
[NSException raise:NSInternalInconsistencyException format:@"Delegate doesn't respond to ourDelegate"];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
- (id)delegate
|
||||
{
|
||||
return _delegate;
|
||||
}
|
||||
|
||||
- (void)setDelegate:(id)new_delegate
|
||||
{
|
||||
|
||||
_delegate = new_delegate;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
||||
|
||||
if (_delegate)
|
||||
[nc removeObserver:_delegate name:nil object:self];
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
||||
|
||||
@end
|
||||
31
Classes/StatusItemWindow.h
Normal file
31
Classes/StatusItemWindow.h
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* FanControl
|
||||
*
|
||||
* Copyright (c) 2006 Hendrik Holtmann
|
||||
*
|
||||
* StatusItemWindow.h - MacBook(Pro) FanControl application
|
||||
*
|
||||
* This program 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
|
||||
@interface StatusItemWindow : NSWindow {
|
||||
}
|
||||
|
||||
- (void)makeKeyAndOrderFront:(id)sender;
|
||||
|
||||
@end
|
||||
32
Classes/StatusItemWindow.m
Normal file
32
Classes/StatusItemWindow.m
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* FanControl
|
||||
*
|
||||
* Copyright (c) 2006 Hendrik Holtmann
|
||||
*
|
||||
* StatusItemWindow.m - MacBook(Pro) FanControl application
|
||||
*
|
||||
* This program 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#import "StatusItemWindow.h"
|
||||
|
||||
|
||||
@implementation StatusItemWindow
|
||||
|
||||
- (void)makeKeyAndOrderFront:(id)sender {
|
||||
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
|
||||
[super makeKeyAndOrderFront:sender];
|
||||
}
|
||||
|
||||
@end
|
||||
70
Classes/SystemVersion.h
Normal file
70
Classes/SystemVersion.h
Normal file
@ -0,0 +1,70 @@
|
||||
//
|
||||
// GTMSystemVersion.h
|
||||
//
|
||||
// Copyright 2007-2008 Google Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
// use this file except in compliance with the License. You may obtain a copy
|
||||
// of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
// License for the specific language governing permissions and limitations under
|
||||
// the License.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
// A class for getting information about what system we are running on
|
||||
@interface SystemVersion : NSObject
|
||||
|
||||
// Returns the current system version major.minor.bugFix
|
||||
+ (void)getMajor:(SInt32*)major minor:(SInt32*)minor bugFix:(SInt32*)bugFix;
|
||||
|
||||
// Returns the build number of the OS. Useful when looking for bug fixes
|
||||
// in new OSes which all have a set system version.
|
||||
// eg 10.5.5's build number is 9F33. Easy way to check the build number
|
||||
// is to choose "About this Mac" from the Apple menu and click on the version
|
||||
// number.
|
||||
+ (NSString*)build;
|
||||
|
||||
+ (BOOL)isBuildLessThan:(NSString*)build;
|
||||
+ (BOOL)isBuildLessThanOrEqualTo:(NSString*)build;
|
||||
+ (BOOL)isBuildGreaterThan:(NSString*)build;
|
||||
+ (BOOL)isBuildGreaterThanOrEqualTo:(NSString*)build;
|
||||
+ (BOOL)isBuildEqualTo:(NSString *)build;
|
||||
|
||||
// Returns YES if running on 10.3, NO otherwise.
|
||||
+ (BOOL)isPanther;
|
||||
|
||||
// Returns YES if running on 10.4, NO otherwise.
|
||||
+ (BOOL)isTiger;
|
||||
|
||||
// Returns YES if running on 10.5, NO otherwise.
|
||||
+ (BOOL)isLeopard;
|
||||
|
||||
// Returns YES if running on 10.6, NO otherwise.
|
||||
+ (BOOL)isSnowLeopard;
|
||||
|
||||
// Returns a YES/NO if the system is 10.3 or better
|
||||
+ (BOOL)isPantherOrGreater;
|
||||
|
||||
// Returns a YES/NO if the system is 10.4 or better
|
||||
+ (BOOL)isTigerOrGreater;
|
||||
|
||||
// Returns a YES/NO if the system is 10.5 or better
|
||||
+ (BOOL)isLeopardOrGreater;
|
||||
|
||||
// Returns a YES/NO if the system is 10.6 or better
|
||||
+ (BOOL)isSnowLeopardOrGreater;
|
||||
// GTM_MACOS_SDK
|
||||
|
||||
// Returns one of the achitecture strings below. Note that this is the
|
||||
// architecture that we are currently running as, not the hardware architecture.
|
||||
+ (NSString *)runtimeArchitecture;
|
||||
@end
|
||||
|
||||
|
||||
217
Classes/SystemVersion.m
Normal file
217
Classes/SystemVersion.m
Normal file
@ -0,0 +1,217 @@
|
||||
//
|
||||
// GTMSystemVersion.m
|
||||
//
|
||||
// Copyright 2007-2008 Google Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
// use this file except in compliance with the License. You may obtain a copy
|
||||
// of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
// License for the specific language governing permissions and limitations under
|
||||
// the License.
|
||||
//
|
||||
|
||||
#import "SystemVersion.h"
|
||||
#if GTM_MACOS_SDK
|
||||
#import <CoreServices/CoreServices.h>
|
||||
#endif
|
||||
|
||||
static SInt32 sGTMSystemVersionMajor = 0;
|
||||
static SInt32 sGTMSystemVersionMinor = 0;
|
||||
static SInt32 sGTMSystemVersionBugFix = 0;
|
||||
static NSString *sBuild = nil;
|
||||
|
||||
NSString *const kGTMArch_iPhone = @"iPhone";
|
||||
NSString *const kGTMArch_ppc = @"ppc";
|
||||
NSString *const kGTMArch_ppc64 = @"ppc64";
|
||||
NSString *const kGTMArch_x86_64 = @"x86_64";
|
||||
NSString *const kGTMArch_i386 = @"i386";
|
||||
|
||||
static NSString *const kSystemVersionPlistPath = @"/System/Library/CoreServices/SystemVersion.plist";
|
||||
|
||||
@implementation SystemVersion
|
||||
+ (void)initialize {
|
||||
if (self == [SystemVersion class]) {
|
||||
// Gestalt is the recommended way of getting the OS version (despite a
|
||||
// comment to the contrary in the 10.4 headers and docs; see
|
||||
// <http://lists.apple.com/archives/carbon-dev/2007/Aug/msg00089.html>).
|
||||
// The iPhone doesn't have Gestalt though, so use the plist there.
|
||||
#if GTM_MACOS_SDK
|
||||
require_noerr(Gestalt(gestaltSystemVersionMajor, &sGTMSystemVersionMajor), failedGestalt);
|
||||
require_noerr(Gestalt(gestaltSystemVersionMinor, &sGTMSystemVersionMinor), failedGestalt);
|
||||
require_noerr(Gestalt(gestaltSystemVersionBugFix, &sGTMSystemVersionBugFix), failedGestalt);
|
||||
|
||||
return;
|
||||
|
||||
failedGestalt:
|
||||
;
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_3
|
||||
// gestaltSystemVersionMajor et al are only on 10.4 and above, so they
|
||||
// could fail when running on 10.3.
|
||||
SInt32 binaryCodedDec;
|
||||
OSStatus err = err = Gestalt(gestaltSystemVersion, &binaryCodedDec);
|
||||
|
||||
// Note that this code will return x.9.9 for any system rev parts that are
|
||||
// greater than 9 (i.e., 10.10.10 will be 10.9.9). This shouldn't ever be a
|
||||
// problem as the code above takes care of 10.4+.
|
||||
SInt32 msb = (binaryCodedDec & 0x0000F000L) >> 12;
|
||||
msb *= 10;
|
||||
SInt32 lsb = (binaryCodedDec & 0x00000F00L) >> 8;
|
||||
sGTMSystemVersionMajor = msb + lsb;
|
||||
sGTMSystemVersionMinor = (binaryCodedDec & 0x000000F0L) >> 4;
|
||||
sGTMSystemVersionBugFix = (binaryCodedDec & 0x0000000FL);
|
||||
#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_3
|
||||
|
||||
#else // GTM_MACOS_SDK
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
NSDictionary *systemVersionPlist
|
||||
= [NSDictionary dictionaryWithContentsOfFile:kSystemVersionPlistPath];
|
||||
NSString *version = [systemVersionPlist objectForKey:@"ProductVersion"];
|
||||
NSArray *versionInfo = [version componentsSeparatedByString:@"."];
|
||||
int length = [versionInfo count];
|
||||
sGTMSystemVersionMajor = [[versionInfo objectAtIndex:0] intValue];
|
||||
sGTMSystemVersionMinor = [[versionInfo objectAtIndex:1] intValue];
|
||||
if (length == 3) {
|
||||
sGTMSystemVersionBugFix = [[versionInfo objectAtIndex:2] intValue];
|
||||
}
|
||||
[pool release];
|
||||
#endif // GTM_MACOS_SDK
|
||||
}
|
||||
}
|
||||
|
||||
+ (void)getMajor:(SInt32*)major minor:(SInt32*)minor bugFix:(SInt32*)bugFix {
|
||||
if (major) {
|
||||
*major = sGTMSystemVersionMajor;
|
||||
}
|
||||
if (minor) {
|
||||
*minor = sGTMSystemVersionMinor;
|
||||
}
|
||||
if (bugFix) {
|
||||
*bugFix = sGTMSystemVersionBugFix;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString*)build {
|
||||
@synchronized(self) {
|
||||
// Not cached at initialization time because we don't expect "real"
|
||||
// software to want this, and it costs a bit to get at startup.
|
||||
// This will mainly be for unit test cases.
|
||||
if (!sBuild) {
|
||||
NSDictionary *systemVersionPlist
|
||||
= [NSDictionary dictionaryWithContentsOfFile:kSystemVersionPlistPath];
|
||||
sBuild = [[systemVersionPlist objectForKey:@"ProductBuildVersion"] retain];
|
||||
}
|
||||
}
|
||||
return sBuild;
|
||||
}
|
||||
|
||||
+ (BOOL)isBuildLessThan:(NSString*)build {
|
||||
NSComparisonResult result
|
||||
= [[self build] compare:build
|
||||
options:NSNumericSearch | NSCaseInsensitiveSearch];
|
||||
return result == NSOrderedAscending;
|
||||
}
|
||||
|
||||
+ (BOOL)isBuildLessThanOrEqualTo:(NSString*)build {
|
||||
NSComparisonResult result
|
||||
= [[self build] compare:build
|
||||
options:NSNumericSearch | NSCaseInsensitiveSearch];
|
||||
return result != NSOrderedDescending;
|
||||
}
|
||||
|
||||
+ (BOOL)isBuildGreaterThan:(NSString*)build {
|
||||
NSComparisonResult result
|
||||
= [[self build] compare:build
|
||||
options:NSNumericSearch | NSCaseInsensitiveSearch];
|
||||
return result == NSOrderedDescending;
|
||||
}
|
||||
|
||||
+ (BOOL)isBuildGreaterThanOrEqualTo:(NSString*)build {
|
||||
NSComparisonResult result
|
||||
= [[self build] compare:build
|
||||
options:NSNumericSearch | NSCaseInsensitiveSearch];
|
||||
return result != NSOrderedAscending;
|
||||
}
|
||||
|
||||
+ (BOOL)isBuildEqualTo:(NSString *)build {
|
||||
NSComparisonResult result
|
||||
= [[self build] compare:build
|
||||
options:NSNumericSearch | NSCaseInsensitiveSearch];
|
||||
return result == NSOrderedSame;
|
||||
}
|
||||
|
||||
+ (BOOL)isPanther {
|
||||
return sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor == 3;
|
||||
}
|
||||
|
||||
+ (BOOL)isTiger {
|
||||
return sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor == 4;
|
||||
}
|
||||
|
||||
+ (BOOL)isLeopard {
|
||||
return sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor == 5;
|
||||
}
|
||||
|
||||
+ (BOOL)isSnowLeopard {
|
||||
return sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor == 6;
|
||||
}
|
||||
|
||||
+ (BOOL)isPantherOrGreater {
|
||||
return (sGTMSystemVersionMajor > 10) ||
|
||||
(sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor >= 3);
|
||||
}
|
||||
|
||||
+ (BOOL)isTigerOrGreater {
|
||||
return (sGTMSystemVersionMajor > 10) ||
|
||||
(sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor >= 4);
|
||||
}
|
||||
|
||||
+ (BOOL)isLeopardOrGreater {
|
||||
return (sGTMSystemVersionMajor > 10) ||
|
||||
(sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor >= 5);
|
||||
}
|
||||
|
||||
+ (BOOL)isSnowLeopardOrGreater {
|
||||
return (sGTMSystemVersionMajor > 10) ||
|
||||
(sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor >= 6);
|
||||
}
|
||||
|
||||
|
||||
+ (NSString *)runtimeArchitecture {
|
||||
NSString *architecture = nil;
|
||||
#if GTM_IPHONE_SDK
|
||||
architecture = kGTMArch_iPhone;
|
||||
#else // !GTM_IPHONE_SDK
|
||||
// In reading arch(3) you'd thing this would work:
|
||||
//
|
||||
// const NXArchInfo *localInfo = NXGetLocalArchInfo();
|
||||
// _GTMDevAssert(localInfo && localInfo->name, @"Couldn't get NXArchInfo");
|
||||
// const NXArchInfo *genericInfo = NXGetArchInfoFromCpuType(localInfo->cputype, 0);
|
||||
// _GTMDevAssert(genericInfo && genericInfo->name, @"Couldn't get generic NXArchInfo");
|
||||
// extensions[0] = [NSString stringWithFormat:@".%s", genericInfo->name];
|
||||
//
|
||||
// but on 64bit it returns the same things as on 32bit, so...
|
||||
#if __POWERPC__
|
||||
#if __LP64__
|
||||
architecture = kGTMArch_ppc64;
|
||||
#else // !__LP64__
|
||||
architecture = kGTMArch_ppc;
|
||||
#endif // __LP64__
|
||||
#else // !__POWERPC__
|
||||
#if __LP64__
|
||||
architecture = kGTMArch_x86_64;
|
||||
#else // !__LP64__
|
||||
architecture = kGTMArch_i386;
|
||||
#endif // __LP64__
|
||||
#endif // !__POWERPC__
|
||||
|
||||
#endif // GTM_IPHONE_SDK
|
||||
return architecture;
|
||||
}
|
||||
|
||||
@end
|
||||
40
Classes/smcWrapper.h
Normal file
40
Classes/smcWrapper.h
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* FanControl
|
||||
*
|
||||
* Copyright (c) 2006 Hendrik Holtmann
|
||||
*
|
||||
* smcWrapper.m - MacBook(Pro) FanControl application
|
||||
*
|
||||
* This program 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <openssl/evp.h>
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <smc.h>
|
||||
#import <MachineDefaults.h>
|
||||
|
||||
@interface smcWrapper : NSObject {
|
||||
}
|
||||
|
||||
+(int) get_fan_rpm:(int)fan_number;
|
||||
+(float) get_maintemp;
|
||||
+(float) get_mptemp;
|
||||
+(int) get_fan_num;
|
||||
+(int) get_min_speed:(int)fan_number;
|
||||
+(int) get_max_speed:(int)fan_number;
|
||||
+(void)setKey_external:(NSString *)key value:(NSString *)value;
|
||||
+(NSString*) get_fan_descr:(int)fan_number;
|
||||
|
||||
@end
|
||||
187
Classes/smcWrapper.m
Normal file
187
Classes/smcWrapper.m
Normal file
@ -0,0 +1,187 @@
|
||||
/*
|
||||
* FanControl
|
||||
*
|
||||
* Copyright (c) 2006 Hendrik Holtmann
|
||||
*
|
||||
* smcWrapper.m - MacBook(Pro) FanControl application
|
||||
*
|
||||
* This program 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#import "smcWrapper.h"
|
||||
#import <CommonCrypto/CommonDigest.h>
|
||||
|
||||
NSString * const smc_checksum=@"0becdb25cdf64eb74b001c8a77c5e6b7";
|
||||
static NSDictionary *tsensors = nil;
|
||||
|
||||
@implementation smcWrapper
|
||||
io_connect_t conn;
|
||||
|
||||
+(void)init{
|
||||
SMCOpen(&conn);
|
||||
tsensors = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"tsensors" ofType:@"plist"]];
|
||||
}
|
||||
|
||||
+(float) get_maintemp{
|
||||
float c_temp;
|
||||
|
||||
NSRange range_pro=[[MachineDefaults computerModel] rangeOfString:@"MacPro"];
|
||||
if (range_pro.length > 0) {
|
||||
//special readout for MacPro
|
||||
c_temp=[smcWrapper get_mptemp];
|
||||
} else {
|
||||
SMCVal_t val;
|
||||
NSMutableArray *allTSensors = [[tsensors allKeys] mutableCopy];
|
||||
NSString *foundKey = [tsensors objectForKey:[MachineDefaults computerModel]];
|
||||
if (foundKey !=nil) {
|
||||
foundKey = [MachineDefaults computerModel];
|
||||
} else {
|
||||
foundKey = @"standard";
|
||||
}
|
||||
[allTSensors removeObject:foundKey];
|
||||
SMCReadKey2((char*)[[tsensors objectForKey:foundKey] UTF8String], &val,conn);
|
||||
c_temp= ((val.bytes[0] * 256 + val.bytes[1]) >> 2)/64;
|
||||
|
||||
if (c_temp<=0) {
|
||||
for (NSString *key in allTSensors) {
|
||||
SMCReadKey2((char*)[[tsensors objectForKey:key] UTF8String], &val,conn);
|
||||
c_temp= ((val.bytes[0] * 256 + val.bytes[1]) >> 2)/64;
|
||||
if (c_temp>0) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return c_temp;
|
||||
}
|
||||
|
||||
|
||||
//temperature-readout for MacPro contributed by Victor Boyer
|
||||
+(float) get_mptemp{
|
||||
UInt32Char_t keyA;
|
||||
UInt32Char_t keyB;
|
||||
SMCVal_t valA;
|
||||
SMCVal_t valB;
|
||||
// kern_return_t resultA;
|
||||
// kern_return_t resultB;
|
||||
sprintf(keyA, "TCAH");
|
||||
SMCReadKey2(keyA, &valA,conn);
|
||||
sprintf(keyB, "TCBH");
|
||||
SMCReadKey2(keyB, &valB,conn);
|
||||
float c_tempA= ((valA.bytes[0] * 256 + valA.bytes[1]) >> 2)/64.0;
|
||||
float c_tempB= ((valB.bytes[0] * 256 + valB.bytes[1]) >> 2)/64.0;
|
||||
int i_tempA, i_tempB;
|
||||
if (c_tempA < c_tempB)
|
||||
{
|
||||
i_tempB = round(c_tempB);
|
||||
return i_tempB;
|
||||
}
|
||||
else
|
||||
{
|
||||
i_tempA = round(c_tempA);
|
||||
return i_tempA;
|
||||
}
|
||||
}
|
||||
|
||||
+(int) get_fan_rpm:(int)fan_number{
|
||||
UInt32Char_t key;
|
||||
SMCVal_t val;
|
||||
//kern_return_t result;
|
||||
sprintf(key, "F%dAc", fan_number);
|
||||
SMCReadKey2(key, &val,conn);
|
||||
int running= _strtof(val.bytes, val.dataSize, 2);
|
||||
return running;
|
||||
}
|
||||
|
||||
+(int) get_fan_num{
|
||||
// kern_return_t result;
|
||||
SMCVal_t val;
|
||||
int totalFans;
|
||||
SMCReadKey2("FNum", &val,conn);
|
||||
totalFans = _strtoul(val.bytes, val.dataSize, 10);
|
||||
return totalFans;
|
||||
}
|
||||
|
||||
+(NSString*) get_fan_descr:(int)fan_number{
|
||||
UInt32Char_t key;
|
||||
char temp;
|
||||
SMCVal_t val;
|
||||
//kern_return_t result;
|
||||
NSMutableString *desc;
|
||||
// desc=[[NSMutableString alloc] initWithFormat:@"Fan #%d: ",fan_number+1];
|
||||
desc=[[[NSMutableString alloc]init] autorelease];
|
||||
sprintf(key, "F%dID", fan_number);
|
||||
SMCReadKey2(key, &val,conn);
|
||||
int i;
|
||||
for (i = 0; i < val.dataSize; i++) {
|
||||
if ((int)val.bytes[i]>32) {
|
||||
temp=(unsigned char)val.bytes[i];
|
||||
[desc appendFormat:@"%c",temp];
|
||||
}
|
||||
}
|
||||
return desc;
|
||||
}
|
||||
|
||||
|
||||
+(int) get_min_speed:(int)fan_number{
|
||||
UInt32Char_t key;
|
||||
SMCVal_t val;
|
||||
//kern_return_t result;
|
||||
sprintf(key, "F%dMn", fan_number);
|
||||
SMCReadKey2(key, &val,conn);
|
||||
int min= _strtof(val.bytes, val.dataSize, 2);
|
||||
return min;
|
||||
}
|
||||
|
||||
+(int) get_max_speed:(int)fan_number{
|
||||
UInt32Char_t key;
|
||||
SMCVal_t val;
|
||||
//kern_return_t result;
|
||||
sprintf(key, "F%dMx", fan_number);
|
||||
SMCReadKey2(key, &val,conn);
|
||||
int max= _strtof(val.bytes, val.dataSize, 2);
|
||||
return max;
|
||||
}
|
||||
|
||||
|
||||
+ (NSString*)createCheckSum:(NSString*)path {
|
||||
NSData *d=[NSData dataWithContentsOfMappedFile:path];
|
||||
unsigned char result[CC_MD5_DIGEST_LENGTH];
|
||||
CC_MD5((void *)[d bytes], [d length], result);
|
||||
NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];
|
||||
for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
|
||||
[ret appendFormat:@"%02x",result[i]];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//call smc binary with setuid rights and apply
|
||||
+(void)setKey_external:(NSString *)key value:(NSString *)value{
|
||||
NSString *launchPath = [[NSBundle mainBundle] pathForResource:@"smc" ofType:@""];
|
||||
//first check if it's the right binary (security)
|
||||
NSString *checksum=[smcWrapper createCheckSum:launchPath];
|
||||
if (![checksum isEqualToString:smc_checksum]) {
|
||||
NSLog(@"smcFanControl: Security Error: smc-binary is not the distributed one");
|
||||
return;
|
||||
}
|
||||
NSArray *argsArray = [NSArray arrayWithObjects: @"-k",key,@"-w",value,nil];
|
||||
NSTask *task;
|
||||
task = [[NSTask alloc] init];
|
||||
[task setLaunchPath: launchPath];
|
||||
[task setArguments: argsArray];
|
||||
[task launch];
|
||||
[task release];
|
||||
}
|
||||
|
||||
@end
|
||||
36
Info.plist
Normal file
36
Info.plist
Normal file
@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>smcFanControl</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>smcFanControl 2.4, Hendrik Holtmann (GPL)</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>smcfancontrol_v2</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.eidac.smcFanControl2</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>smcFanControl</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2.4</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2.4</string>
|
||||
<key>LSUIElement</key>
|
||||
<string>1</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>Hendrik Holtmann(GPL)</string>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MainMenu</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>NSApplication</string>
|
||||
</dict>
|
||||
</plist>
|
||||
107
Ressources/Dutch.lproj/F.A.Q.rtf
Normal file
107
Ressources/Dutch.lproj/F.A.Q.rtf
Normal file
@ -0,0 +1,107 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf1187
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1}
|
||||
{\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2}}
|
||||
{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}}
|
||||
\viewkind0
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
|
||||
|
||||
\f0\fs62 \cf0 F.A.Q for smcFanControl 2.4\
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
|
||||
|
||||
\fs24 \cf0 \
|
||||
|
||||
\b How do install and uninstall smcFanControl?\
|
||||
|
||||
\b0 smcFanControl is just an application. So after downloading, and unzipping it, drag it to wherever you want (e.g. the Application Folder). To uninstall it, just drag it into the trash. smcFanControl installs no permanent background processes or daemons. \
|
||||
All changes smcFanControl does to the fan controlling get lost after you shutdown your computer (power off, not restart) or enter standby mode (as far as you don't have smcFanControl running) . Minimum fan speed then falls back to the system defaults values.\
|
||||
\
|
||||
|
||||
\b When I run smcFanControl and set a new minimum speed, will my fan speed still increase if the CPU load gets higher?\
|
||||
|
||||
\b0 Yes, fan speed will increase as defined by Apple. smcFanControl lets the fans stay in automatic mode and just sets the minimum fan speed. However, the higher you set the minimum fan speed, the longer it will take for the fan speed to increase.\
|
||||
\
|
||||
|
||||
\b Why does smcFanControl asks for a login and password and which login/password do I have to enter?\
|
||||
|
||||
\b0 smcFanControl needs the credentials of an admin-user to set the appropriate rights to be able to change fanspeed. You only have to enter it one time. The entered login and password are not saved by smcFanControl. They are just used for setting the appropriate rights.\
|
||||
\
|
||||
|
||||
\b I get a "smcFanControl has not been tested on this machine" warning. What does that mean?\
|
||||
|
||||
\b0 Technically smcFanControl supports every intel mac, but it does not come with defaults for every machine. If you get the warning, smcFanControl tries to read out the fan-details directly from the System Management Controller. If you follow the instructions (no other fan control software is running etc.) you should have no problem running smcFanControl on a machine it has not been tested on.\
|
||||
\
|
||||
|
||||
\b How can I restore the Apple defaults for fanspeed?\
|
||||
|
||||
\b0 Move the sliders to the left and hit apply. The lowest settings smcFanControl allows are the Apple defaults. The minimum default speed after Apple's latest SMC firmware update is 1000rpm for the MBP 15,4", 1500rpm for the MB 13,3". 2000rpm for the Core2Duo MBP and 1800rpm for the Core2Duo MB.\
|
||||
|
||||
\b \
|
||||
Why can't I set my minimum fan speed to 0 rpm?\
|
||||
|
||||
\b0 smcFanControl only lets you set the fan speed in the range of Apple's min and max values. Setting it to zero is possible from the technical perspective but could probably damage your machine.\
|
||||
\
|
||||
|
||||
\b When will the new settings for minimum fan speed get lost?\
|
||||
|
||||
\b0 The settings you chose for minimum fan speed will get lost in two cases and the machine will fall back to default values:\
|
||||
a) You enter standby mode and smcFanControl is not running (If its running it watches for standby and reapplies your settings when you wake up the machine).\
|
||||
b) You power off the machine.\
|
||||
\
|
||||
|
||||
\b Which sensor is read out for the temperature?\
|
||||
|
||||
\b0 It's not the sensor on the CoreDuo CPU's. The advantage is, that there is no Kernel Extension loaded for temperature readout and temperature should always be reported (some CoreDuo's stop temperature reporting after some minutes unfortunately). The sensor readout is very close to what CoreDuoTemp reports, but its not exactly the same cause of different sensors.
|
||||
\b \
|
||||
|
||||
\b0 \
|
||||
|
||||
\b What about fan-control when I am in Windows XP running Bootcamp?\
|
||||
|
||||
\b0 At the moment you can not set minimum fan speed when you are in Windows XP (cause smcFanControl is a native OS X application). However if you set up a new minimum fan speed in OS X using smcFanControl and then restart into Windows XP, your settings don't get lost and that new minimum fan speed is used on Windows XP for that session. Some people have reported usage of this to make their MBP cooler and not crashing when running games under Windows XP.\
|
||||
|
||||
\b \
|
||||
Will there be a version of smcFanControl for Powerbooks or other PPC based Macs?\
|
||||
|
||||
\b0 No, PPC based macs don't have an SMC controller. So the approach of smcFanControl does not work. It's possible that there are solutions to control fan speed on PPC based macs, but I am not aware of any.\
|
||||
\
|
||||
|
||||
\b Will there be a dashboard widget for smcFanControl?\
|
||||
|
||||
\b0 Well, I think this is a nice idea. I am currently working on improving smcFanControl as an application. But maybe someone else is a good dashboard developer. The GPL sources of smcFanControl should be a good starting point.\
|
||||
\
|
||||
|
||||
\b Wouldn't it be even better to read out the temperature and set the fan speeds depending on the readout than just set the minimum fan speed and let automatic fan control as defined by apple do the rest?\
|
||||
|
||||
\b0 Yes, that approach is even better and could make your machine running cooler, when you are at higher loads. BUT: I did not take this route for smcFanControl, cause it has some risks. Adjusting the fan speed to CPU temperature requires you have a program running in the background (e.g. a daemon) that adjust fan speed continuously . If that program ever crashes or becomes incompatible cause of a System Update (or the readouts of the temperature sensor get inappropriate) , the fans could get set to a wrong (too low) speed and this could probably damage the machine. In addition to that the fan-control-logic is quite complicate. An intel mac has about 10 temperature sensors, that are continuously read out and are used for monitoring and setting the right fan speeds. So it would be "not so great" to read out just the CPU temperature as a foundation for the fan-controlling.\
|
||||
\
|
||||
|
||||
\b I have got a MBP and smcFanControl is reporting 0rpm for one of my fans?\
|
||||
|
||||
\b0 In that case the fan did not report any data to smcFanControl.
|
||||
\b
|
||||
\b0 It is possible that one of your fan's is dead.
|
||||
\b
|
||||
\b0 Please check your computer with the Apple Hardware Test (it's on the DVD that comes with your computer) and see if it reports a failure with one of your fans. \
|
||||
\
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
|
||||
|
||||
\b \cf0 What are the main-differences between Version 1.2x and Version 2.x of smcFanControl?\
|
||||
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural
|
||||
\ls1\ilvl0
|
||||
\b0 \cf0 {\listtext \'95 }Version 2.x is a completely rewritten application.\
|
||||
{\listtext \'95 }Version 1.x was a "regular" application located in the dock. Version 2.x sits in the menubar for quicker access to the fan settings, easier monitoring and a better overall user-experience\
|
||||
{\listtext \'95 }Version 2.x supports every intel mac\
|
||||
{\listtext \'95 }In Version 2.x you can save different fan-settings as favorites and active them with just one mouse-click\
|
||||
{\listtext \'95 }On portables you can autoapply different fan-settings, when the powersource changes. So you can cool down your macbook automatically when its loading the battery (and is typically running hotter).\
|
||||
{\listtext \'95 }Version 2.x has got an "add to login-items option" now\
|
||||
{\listtext \'95 }Version 2.x uses standard OS X authentication now\
|
||||
{\listtext \'95 }Version 2.x uses the Sparkle-Framework to automatically check for updates
|
||||
\b \
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
|
||||
|
||||
\b0 \cf0 \
|
||||
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural
|
||||
\ls2\ilvl0\cf0 \
|
||||
}
|
||||
BIN
Ressources/Dutch.lproj/InfoPlist.strings
Normal file
BIN
Ressources/Dutch.lproj/InfoPlist.strings
Normal file
Binary file not shown.
23
Ressources/Dutch.lproj/Localizable.strings
Normal file
23
Ressources/Dutch.lproj/Localizable.strings
Normal file
@ -0,0 +1,23 @@
|
||||
"Do you really want to delete the favorite %@?" = "Weet je zeker dat je de favoriet %@ wilt wissen?";
|
||||
|
||||
"Yes" = "Ja";
|
||||
|
||||
"No" = "Nee";
|
||||
|
||||
"Delete favorite" = "Verwijder Favoriet";
|
||||
|
||||
"MainFan" = "Hoofd Fan";
|
||||
|
||||
"Left Fan" = "Linker Fan";
|
||||
|
||||
"Right Fan" = "Rechter Fan";
|
||||
|
||||
"smcFanControl has not been tested on this machine yet, but it should run if you follow the instructions. \n\nIf you choose to continue, please make you have no other FanControl-software running. Otherwise please quit, deinstall the other software, restart your machine and rerun smcFanControl!" = "smcFanControl is nog niet getest op deze machine, maar het zou moeten werken als je de instructies volgt. \n\nAls je doorgaat, zorg dan dat er geen andere FanControl-software draait. Als dat wel zo is, de-installeer deze software dan, stop smcFanControl en restart je computer voor je smcFanControl installeert!";
|
||||
|
||||
"Continue" = "Doorgaan";
|
||||
|
||||
"Quit" = "Stop";
|
||||
|
||||
"Alert!" = "Let op!";
|
||||
|
||||
"Active Setting" = "Actieve Instelling";
|
||||
4783
Ressources/Dutch.lproj/MainMenu.nib/designable.nib
generated
Normal file
4783
Ressources/Dutch.lproj/MainMenu.nib/designable.nib
generated
Normal file
File diff suppressed because it is too large
Load Diff
BIN
Ressources/Dutch.lproj/MainMenu.nib/keyedobjects.nib
generated
Normal file
BIN
Ressources/Dutch.lproj/MainMenu.nib/keyedobjects.nib
generated
Normal file
Binary file not shown.
102
Ressources/English.lproj/F.A.Q.rtf
Normal file
102
Ressources/English.lproj/F.A.Q.rtf
Normal file
@ -0,0 +1,102 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf1187
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1}}
|
||||
{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}}
|
||||
\viewkind0
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
|
||||
|
||||
\f0\fs62 \cf0 F.A.Q for smcFanControl 2.4\
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
|
||||
|
||||
\fs24 \cf0 \
|
||||
|
||||
\b How do install and uninstall smcFanControl?\
|
||||
|
||||
\b0 smcFanControl is just an application. So after downloading, and unzipping it, drag it to wherever you want (e.g. the Application Folder). To uninstall it, just drag it into the trash. smcFanControl installs no permanent background processes or daemons. \
|
||||
All changes smcFanControl does to the fan controlling get lost after you shutdown your computer (power off, not restart) or enter standby mode (as far as you don't have smcFanControl running) . Minimum fan speed then falls back to the system defaults values.\
|
||||
\
|
||||
|
||||
\b When I run smcFanControl and set a new minimum speed, will my fan speed still increase if the CPU load gets higher?\
|
||||
|
||||
\b0 Yes, fan speed will increase as defined by Apple. smcFanControl lets the fans stay in automatic mode and just sets the minimum fan speed. However, the higher you set the minimum fan speed, the longer it will take for the fan speed to increase.\
|
||||
\
|
||||
|
||||
\b Why does smcFanControl asks for a login and password and which login/password do I have to enter?\
|
||||
|
||||
\b0 smcFanControl needs the credentials of an admin-user to set the appropriate rights to be able to change fanspeed. You only have to enter it one time. The entered login and password are not saved by smcFanControl. They are just used for setting the appropriate rights.\
|
||||
\
|
||||
|
||||
\b I get a "smcFanControl has not been tested on this machine" warning. What does that mean?\
|
||||
|
||||
\b0 Technically smcFanControl supports every intel mac, but it does not come with defaults for every machine. If you get the warning, smcFanControl tries to read out the fan-details directly from the System Management Controller. If you follow the instructions (no other fan control software is running etc.) you should have no problem running smcFanControl on a machine it has not been tested on.\
|
||||
\
|
||||
|
||||
\b How can I restore the Apple defaults for fanspeed?\
|
||||
|
||||
\b0 Move the sliders to the left and hit apply. The lowest settings smcFanControl allows are the Apple defaults. The minimum default speed after Apple's latest SMC firmware update is 1000rpm for the MBP 15,4", 1500rpm for the MB 13,3". 2000rpm for the Core2Duo MBP and 1800rpm for the Core2Duo MB.\
|
||||
|
||||
\b \
|
||||
Why can't I set my minimum fan speed to 0 rpm?\
|
||||
|
||||
\b0 smcFanControl only lets you set the fan speed in the range of Apple's min and max values. Setting it to zero is possible from the technical perspective but could probably damage your machine.\
|
||||
\
|
||||
|
||||
\b When will the new settings for minimum fan speed get lost?\
|
||||
|
||||
\b0 The settings you chose for minimum fan speed will get lost in two cases and the machine will fall back to default values:\
|
||||
a) You enter standby mode and smcFanControl is not running (If its running it watches for standby and reapplies your settings when you wake up the machine).\
|
||||
b) You power off the machine.\
|
||||
\
|
||||
|
||||
\b Which sensor is read out for the temperature?\
|
||||
|
||||
\b0 It's not the sensor on the CoreDuo CPU's. The advantage is, that there is no Kernel Extension loaded for temperature readout and temperature should always be reported (some CoreDuo's stop temperature reporting after some minutes unfortunately). The sensor readout is very close to what CoreDuoTemp reports, but its not exactly the same cause of different sensors.
|
||||
\b \
|
||||
|
||||
\b0 \
|
||||
|
||||
\b What about fan-control when I am in Windows runnig Bootcamp?\
|
||||
|
||||
\b0 At the moment you can not set minimum fan speed when you are in Windows (cause smcFanControl is a native OS X application). However if you set up a new minimum fan speed in OS X using smcFanControl and then restart into Windows, your settings don't get lost and that new minimum fan speed is used on Windows for that session. Some people have reported usage of this to make their MBP cooler and not crashing when running games under Windows.\
|
||||
|
||||
\b \
|
||||
Will there be a version of smcFanControl for Powerbooks or other PPC based Macs?\
|
||||
|
||||
\b0 No, PPC based macs don't have an SMC controller. So the approach of smcFanControl does not work. It's possible that there are solutions to control fan speed on PPC based macs, but I am not aware of any.\
|
||||
\
|
||||
|
||||
\b Will there be a dashboard widget for smcFanControl?\
|
||||
|
||||
\b0 Well, I think this is a nice idea. I am currently working on improving smcFanControl as an application. But maybe someone else is a good dashboard developer. The GPL sources of smcFanControl should be a good starting point.\
|
||||
\
|
||||
|
||||
\b Wouldn't it be even better to read out the temperature and set the fan speeds depending on the readout than just set the minimum fan speed and let automatic fan control as defined by apple do the rest?\
|
||||
|
||||
\b0 Yes, that approach is even better and could make your machine running cooler, when you are at higher loads. BUT: I did not take this route for smcFanControl, cause it has some risks. Adjusting the fan speed to CPU temperature requires you have a program running in the background (e.g. a daemon) that adjust fan speed continuously . If that program ever crashes or becomes incompatible cause of a System Update (or the readouts of the temperature sensor get inappropriate) , the fans could get set to a wrong (too low) speed and this could probably damage the machine. In addition to that the fan-control-logic is quite complicate. An intel mac has about 10 temperature sensors, that are continuously read out and are used for monitoring and setting the right fan speeds. So it would be "not so great" to read out just the CPU temperature as a foundation for the fan-controlling.\
|
||||
\
|
||||
|
||||
\b I have got a MBP and smcFanControl is reporting 0rpm for one of my fans?\
|
||||
|
||||
\b0 In that case the fan did not report any data to smcFanControl.
|
||||
\b
|
||||
\b0 It is possible that one of your fan's is dead.
|
||||
\b
|
||||
\b0 Please check your computer with the Apple Hardware Test (it's on the DVD that comes with your computer) and see if it reports a failure with one of your fans.
|
||||
\b \
|
||||
|
||||
\b0 \
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
|
||||
\ls1\ilvl0
|
||||
\b \cf0 What are the main-differences between Version 1.2x and Version 2.x of smcFanControl?\
|
||||
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural
|
||||
\ls1\ilvl0
|
||||
\b0 \cf0 {\listtext \'95 }Version 2.x is a completely rewritten application.\
|
||||
{\listtext \'95 }Version 1.x was a "regular" application located in the dock. Version 2.x sits in the menubar for quicker access to the fan settings, easier monitoring and a better overall user-experience\
|
||||
{\listtext \'95 }Version 2.x supports every intel mac\
|
||||
{\listtext \'95 }In Version 2.x you can save different fan-settings as favorites and active them with just one mouse-click\
|
||||
{\listtext \'95 }On portables you can autoapply different fan-settings, when the powersource changes. So you can cool down your macbook automatically when its loading the battery (and is typically running hotter).\
|
||||
{\listtext \'95 }Version 2.x has got an "add to login-items option" now\
|
||||
{\listtext \'95 }Version 2.x uses standard OS X authentication now\
|
||||
{\listtext \'95 }Version 2.x uses the Sparkle-Framework to automatically check for updates\
|
||||
}
|
||||
BIN
Ressources/English.lproj/InfoPlist.strings
Normal file
BIN
Ressources/English.lproj/InfoPlist.strings
Normal file
Binary file not shown.
0
Ressources/English.lproj/Localizable.strings
Normal file
0
Ressources/English.lproj/Localizable.strings
Normal file
4652
Ressources/English.lproj/MainMenu.nib/designable.nib
generated
Normal file
4652
Ressources/English.lproj/MainMenu.nib/designable.nib
generated
Normal file
File diff suppressed because it is too large
Load Diff
BIN
Ressources/English.lproj/MainMenu.nib/keyedobjects.nib
generated
Normal file
BIN
Ressources/English.lproj/MainMenu.nib/keyedobjects.nib
generated
Normal file
Binary file not shown.
104
Ressources/German.lproj/F.A.Q.rtf
Normal file
104
Ressources/German.lproj/F.A.Q.rtf
Normal file
@ -0,0 +1,104 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf1187
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1}
|
||||
{\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2}}
|
||||
{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}}
|
||||
\viewkind0
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
|
||||
|
||||
\f0\fs62 \cf0 F.A.Q for smcFanControl 2.4\
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
|
||||
|
||||
\fs24 \cf0 \
|
||||
|
||||
\b How do install and uninstall smcFanControl?\
|
||||
|
||||
\b0 smcFanControl is just an application. So after downloading, and unzipping it, drag it to wherever you want (e.g. the Application Folder). To uninstall it, just drag it into the trash. smcFanControl installs no permanent background processes or daemons. \
|
||||
All changes smcFanControl does to the fan controlling get lost after you shutdown your computer (power off, not restart) or enter standby mode (as far as you don't have smcFanControl running) . Minimum fan speed then falls back to the system defaults values.\
|
||||
\
|
||||
|
||||
\b When I run smcFanControl and set a new minimum speed, will my fan speed still increase if the CPU load gets higher?\
|
||||
|
||||
\b0 Yes, fan speed will increase as defined by Apple. smcFanControl lets the fans stay in automatic mode and just sets the minimum fan speed. However, the higher you set the minimum fan speed, the longer it will take for the fan speed to increase.\
|
||||
\
|
||||
|
||||
\b Why does smcFanControl asks for a login and password and which login/password do I have to enter?\
|
||||
|
||||
\b0 smcFanControl needs the credentials of an admin-user to set the appropriate rights to be able to change fanspeed. You only have to enter it one time. The entered login and password are not saved by smcFanControl. They are just used for setting the appropriate rights.\
|
||||
\
|
||||
|
||||
\b I get a "smcFanControl has not been tested on this machine" warning. What does that mean?\
|
||||
|
||||
\b0 Technically smcFanControl supports every intel mac, but it does not come with defaults for every machine. If you get the warning, smcFanControl tries to read out the fan-details directly from the System Management Controller. If you follow the instructions (no other fan control software is running etc.) you should have no problem running smcFanControl on a machine it has not been tested on.\
|
||||
\
|
||||
|
||||
\b How can I restore the Apple defaults for fanspeed?\
|
||||
|
||||
\b0 Move the sliders to the left and hit apply. The lowest settings smcFanControl allows are the Apple defaults. The minimum default speed after Apple's latest SMC firmware update is 1000rpm for the MBP 15,4", 1500rpm for the MB 13,3". 2000rpm for the Core2Duo MBP and 1800rpm for the Core2Duo MB.\
|
||||
|
||||
\b \
|
||||
Why can't I set my minimum fan speed to 0 rpm?\
|
||||
|
||||
\b0 smcFanControl only lets you set the fan speed in the range of Apple's min and max values. Setting it to zero is possible from the technical perspective but could probably damage your machine.\
|
||||
\
|
||||
|
||||
\b When will the new settings for minimum fan speed get lost?\
|
||||
|
||||
\b0 The settings you chose for minimum fan speed will get lost in two cases and the machine will fall back to default values:\
|
||||
a) You enter standby mode and smcFanControl is not running (If its running it watches for standby and reapplies your settings when you wake up the machine).\
|
||||
b) You power off the machine.\
|
||||
\
|
||||
|
||||
\b Which sensor is read out for the temperature?\
|
||||
|
||||
\b0 It's not the sensor on the CoreDuo CPU's. The advantage is, that there is no Kernel Extension loaded for temperature readout and temperature should always be reported (some CoreDuo's stop temperature reporting after some minutes unfortunately). The sensor readout is very close to what CoreDuoTemp reports, but its not exactly the same cause of different sensors.
|
||||
\b \
|
||||
|
||||
\b0 \
|
||||
|
||||
\b What about fan-control when I am in Windows XP running Bootcamp?\
|
||||
|
||||
\b0 At the moment you can not set minimum fan speed when you are in Windows XP (cause smcFanControl is a native OS X application). However if you set up a new minimum fan speed in OS X using smcFanControl and then restart into Windows XP, your settings don't get lost and that new minimum fan speed is used on Windows XP for that session. Some people have reported usage of this to make their MBP cooler and not crashing when running games under Windows XP.\
|
||||
|
||||
\b \
|
||||
Will there be a version of smcFanControl for Powerbooks or other PPC based Macs?\
|
||||
|
||||
\b0 No, PPC based macs don't have an SMC controller. So the approach of smcFanControl does not work. It's possible that there are solutions to control fan speed on PPC based macs, but I am not aware of any.\
|
||||
\
|
||||
|
||||
\b Will there be a dashboard widget for smcFanControl?\
|
||||
|
||||
\b0 Well, I think this is a nice idea. I am currently working on improving smcFanControl as an application. But maybe someone else is a good dashboard developer. The GPL sources of smcFanControl should be a good starting point.\
|
||||
\
|
||||
|
||||
\b Wouldn't it be even better to read out the temperature and set the fan speeds depending on the readout than just set the minimum fan speed and let automatic fan control as defined by apple do the rest?\
|
||||
|
||||
\b0 Yes, that approach is even better and could make your machine running cooler, when you are at higher loads. BUT: I did not take this route for smcFanControl, cause it has some risks. Adjusting the fan speed to CPU temperature requires you have a program running in the background (e.g. a daemon) that adjust fan speed continuously . If that program ever crashes or becomes incompatible cause of a System Update (or the readouts of the temperature sensor get inappropriate) , the fans could get set to a wrong (too low) speed and this could probably damage the machine. In addition to that the fan-control-logic is quite complicate. An intel mac has about 10 temperature sensors, that are continuously read out and are used for monitoring and setting the right fan speeds. So it would be "not so great" to read out just the CPU temperature as a foundation for the fan-controlling.\
|
||||
\
|
||||
|
||||
\b I have got a MBP and smcFanControl is reporting 0rpm for one of my fans?\
|
||||
|
||||
\b0 In that case the fan did not report any data to smcFanControl.
|
||||
\b
|
||||
\b0 It is possible that one of your fan's is dead.
|
||||
\b
|
||||
\b0 Please check your computer with the Apple Hardware Test (it's on the DVD that comes with your computer) and see if it reports a failure with one of your fans.
|
||||
\b \
|
||||
|
||||
\b0 \
|
||||
|
||||
\b What are the main-differences between Version 1.2x and Version 2.x of smcFanControl?\
|
||||
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural
|
||||
\ls1\ilvl0
|
||||
\b0 \cf0 {\listtext \'95 }Version 2.x is a completely rewritten application.\
|
||||
{\listtext \'95 }Version 1.x was a "regular" application located in the dock. Version 2.x sits in the menubar for quicker access to the fan settings, easier monitoring and a better overall user-experience\
|
||||
{\listtext \'95 }Version 2.x supports every intel mac\
|
||||
{\listtext \'95 }In Version 2.x you can save different fan-settings as favorites and active them with just one mouse-click\
|
||||
{\listtext \'95 }On portables you can autoapply different fan-settings, when the powersource changes. So you can cool down your macbook automatically when its loading the battery (and is typically running hotter).\
|
||||
{\listtext \'95 }Version 2.x has got an "add to login-items option" now\
|
||||
{\listtext \'95 }Version 2.x uses standard OS X authentication now\
|
||||
{\listtext \'95 }Version 2.x uses the Sparkle-Framework to automatically check for updates\
|
||||
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural
|
||||
\ls2\ilvl0\cf0 \
|
||||
}
|
||||
BIN
Ressources/German.lproj/InfoPlist.strings
Normal file
BIN
Ressources/German.lproj/InfoPlist.strings
Normal file
Binary file not shown.
23
Ressources/German.lproj/Localizable.strings
Normal file
23
Ressources/German.lproj/Localizable.strings
Normal file
@ -0,0 +1,23 @@
|
||||
"Do you really want to delete the favorite %@?" = "Wollen Sie den Favoriten %@ wirklich löschen?";
|
||||
|
||||
"Yes" = "Ja";
|
||||
|
||||
"No" = "Nein";
|
||||
|
||||
"Delete favorite" = "Favoriten löschen";
|
||||
|
||||
"MainFan" = "Hauptlüfter";
|
||||
|
||||
"Left Fan" = "Linker Lüfter";
|
||||
|
||||
"Right Fan" = "Rechter Lüfter";
|
||||
|
||||
"smcFanControl has not been tested on this machine yet, but it should run if you follow the instructions. \n\nIf you choose to continue, please make you have no other FanControl-software running. Otherwise please quit, deinstall the other software, restart your machine and rerun smcFanControl!" = "smcFanControl wurde auf Ihrem Computermodel noch nicht getestet! Es sollte jedoch problemlos funktionieren, wenn Sie die Hinweise beachten.\n\nBevor Sie auf Weiter klicken, stellen Sie sicher das keine andere FanControl-Software läuft. Sollte dies noch der Fall sein, wählen Sie Abbrechen, deinstallieren Sie die andere Software, starten Sie Ihren Rechner neu und rufen Sie smcFanControl erneut auf!";
|
||||
|
||||
"Continue" = "Weiter";
|
||||
|
||||
"Quit" = "Abbrechen";
|
||||
|
||||
"Alert!" = "Achtung!";
|
||||
|
||||
"Active Setting" = "Aktive Einstellung";
|
||||
4511
Ressources/German.lproj/MainMenu.nib/designable.nib
generated
Normal file
4511
Ressources/German.lproj/MainMenu.nib/designable.nib
generated
Normal file
File diff suppressed because it is too large
Load Diff
BIN
Ressources/German.lproj/MainMenu.nib/keyedobjects.nib
generated
Normal file
BIN
Ressources/German.lproj/MainMenu.nib/keyedobjects.nib
generated
Normal file
Binary file not shown.
576
Ressources/Machines.plist
Normal file
576
Ressources/Machines.plist
Normal file
@ -0,0 +1,576 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<array>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Left Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1000</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Right Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1000</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBookPro1,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1000</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Left Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1000</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Right Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1000</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBookPro1,2</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1000</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Left Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>2000</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Right Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>2000</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBookPro2,2</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Left Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>2000</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Right Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>2000</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBookPro2,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Left Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>2000</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Right Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>2000</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBookPro3,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Left Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>2000</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Right Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>2000</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBookPro4,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Left Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>2000</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Right Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>2000</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBookPro5,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Left Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>2000</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Right Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>2000</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBookPro5,2</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6000</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>MainFan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6200</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1500</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1500</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBook1,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<string>6200</string>
|
||||
<key>Minspeed</key>
|
||||
<integer>1500</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>MainFan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6200</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1800</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1800</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBook2,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<string>6200</string>
|
||||
<key>Minspeed</key>
|
||||
<integer>1800</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>MainFan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6200</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1800</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1800</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBook3,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<string>6200</string>
|
||||
<key>Minspeed</key>
|
||||
<integer>1800</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>MainFan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6200</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1800</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1800</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBook4,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<string>6200</string>
|
||||
<key>Minspeed</key>
|
||||
<integer>1800</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>MainFan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6200</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1800</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1800</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBook5,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<string>6000</string>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>MainFan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6200</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1800</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1800</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBook5,2</string>
|
||||
<key>Maxspeed</key>
|
||||
<string>6200</string>
|
||||
<key>Minspeed</key>
|
||||
<integer>1800</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>MainFan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6200</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1800</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1800</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBookAir1,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<string>6200</string>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>MainFan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>6200</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1800</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1800</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacBookAir2,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<string>6200</string>
|
||||
<key>Minspeed</key>
|
||||
<integer>2000</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>MainFan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>5500</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1500</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1500</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacMini1,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<string>5500</string>
|
||||
<key>Minspeed</key>
|
||||
<integer>1500</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>MainFan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>5500</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1500</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1500</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacMini2,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<string>5500</string>
|
||||
<key>Minspeed</key>
|
||||
<integer>1500</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>MainFan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>5500</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>1500</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>1500</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacMini3,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<string>5500</string>
|
||||
<key>Minspeed</key>
|
||||
<integer>1500</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Fans</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>CPU Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>2900</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>500</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>500</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>PCIe/HDD Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>2900</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>500</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>500</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Rear Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>2900</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>500</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>500</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>Power Supply Fan</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>2800</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>600</integer>
|
||||
<key>selspeed</key>
|
||||
<integer>600</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Machine</key>
|
||||
<string>MacPro1,1</string>
|
||||
<key>Maxspeed</key>
|
||||
<integer>2900</integer>
|
||||
<key>Minspeed</key>
|
||||
<integer>500</integer>
|
||||
<key>NumFans</key>
|
||||
<integer>4</integer>
|
||||
</dict>
|
||||
</array>
|
||||
</plist>
|
||||
97
Ressources/Spanish.lproj/F.A.Q.rtf
Normal file
97
Ressources/Spanish.lproj/F.A.Q.rtf
Normal file
@ -0,0 +1,97 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf1187
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1}}
|
||||
{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}}
|
||||
\viewkind0
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
|
||||
|
||||
\f0\fs62 \cf0 F.A.Q para smcFanControl 2.4\
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
|
||||
|
||||
\fs24 \cf0 \
|
||||
|
||||
\b \'bfC\'f3mo instalar y desinstalar smcFanControl?\
|
||||
|
||||
\b0 smcFanControl es uns aplicaci\'f3n simple, tras bajarla descompr\'edmala en donde prefiera (por ejemplo la carpeta de aplicaciones) Para desinstalarlo, arr\'e1strelo a la papelera. smcFanControl no instala procesos en segundo plano o daemons. \
|
||||
Todos los cambios realizados por smcFanControl se pierden al apagar el ordenador (apagar equipo, no reiniciar) o al entrar en standby (mientras smcFanControl no est\'e9 funcionando) Las velocidades m\'ednimas de ventilador volver\'e1n a los valores por defecto del sistema.\
|
||||
\
|
||||
|
||||
\b \'bfPorqu\'e9 la velocidad del ventilador aumenta cuando aumento la carga de la CPU si he cambiado la velocidad m\'ednima en smcFanControl?\
|
||||
|
||||
\b0 La velocidad del ventilador aumentar\'e1 seg\'fan lo establecido por Apple. smcFanControl deja los ventiladores en modo autom\'e1tico y se limita a cambiar la velocidad m\'ednima. Eso si, cuanto m\'e1s alta ponga la velocidad m\'ednima m\'e1s tardar\'e1 en acelerarse.\
|
||||
\
|
||||
|
||||
\b \'bfPorqu\'e9 smcFanControl pide una contrase\'f1a? \'bfQu\'e9 usuario/contrase\'f1a debo usar?\
|
||||
|
||||
\b0 smcFanControl necesita funcionar como administrador para tener los suicientes permisos para cambiar la velocidad de losventiladores. Basta con introducirlo una vez para que adquiera los permisos adecuados (smcFanControl no guarda el usario/contrase\'f1a introducidos)\
|
||||
\
|
||||
|
||||
\b Me sale el aviso "smcFanControl no ha sido probado en esta m\'e1quina". \'bfQu\'e9 significa?\
|
||||
|
||||
\b0 T\'e9cnicamente smcFanControl funciona en todos los mac Intel, pero no trae los valores por defecto para todos los modelos. Si sale este aviso smcFanControl tratar\'e1 de leer los valores por defecto del SMC (System Management Controller) Si sigue las instrucciones (no hay otro controlador de ventiladoes, etc) no deber\'eda de tener ning\'fan problema en usarlo en un modelo en el que no haya sido probado a\'fan.\
|
||||
\
|
||||
|
||||
\b \'bfComo puedo recobrar los valores por defecto de Apple para la velocidad de los ventiladores?\
|
||||
|
||||
\b0 Desplace todas las barras hacia la izquierda y pulse Aplicar. Los valores m\'e1s bajos que smcFanControl amite son los valores por defecto de Apple. Los valores m\'ednimos tras la \'faltima actualizaci\'f3n del firmware de SMC de Apple son 1000rpm para el MBP 15,4", 1500rpm para el MB 13,3". 2000rpm para el Core2Duo MBP y 1800rpm para Core2Duo MB.\
|
||||
|
||||
\b \
|
||||
\'bfPorqu\'e9 no puedo poner la velocidad m\'ednima a 0 0 rpm?\
|
||||
|
||||
\b0 smcFanControl s\'f3lo permite fijar la velocidad m\'ednima entre los valores establecidos por Apple de velocidad m\'ednima y m\'e1xima. Ponerla a 0 puede que tenga sentido, pero lo m\'e1s seguro es que da\'f1ase la m\'e1quina.\
|
||||
\
|
||||
|
||||
\b \'bfCu\'e1ndo se puierden las nuevas configuraciones de velocidad?\
|
||||
|
||||
\b0 La configuraci\'f3n fijada de velocidad m\'ednima se pierde en 2 casos, en los que la m\'e1quina volver\'e1 a las opciones por defecto:\
|
||||
a) Se entra en standby y smcFanControl no est\'e1 iniciado (Si est\'e1 corriendo establecer\'e1 su configuraci\'f3n cuando la m\'e1quina despierte)\
|
||||
b) La m\'e1quina se apaga.\
|
||||
\
|
||||
|
||||
\b \'bfQu\'e9 sensor de temperatura es le\'eddo?\
|
||||
|
||||
\b0 Las CoreDuo CPUs no tienen sensor de temperatura. La ventaja es que no es necesario una extensi\'f3n del kernel cargada para obtener la temperatura y \'e9sta es siempre le\'edda (desgraciadamente algunos CoreDuos dejan de proporcionar la tempreratura tras unos minutos) La temperatura es muy pr\'f3xima a la que devuelve CoreDuoTemp, la diferencia es causada por los diferentes sensores usados.
|
||||
\b \
|
||||
|
||||
\b0 \
|
||||
|
||||
\b \'bfSe puede controlar los ventiladores desde Windows XP usando Bootcamp?\
|
||||
|
||||
\b0 Por el momento no es posible controlar la velocidad m\'ednima desde Windows XP (smcFanControl es una aplicaci\'f3n nativa de OS X). Puede establecer una velocidad con smcFanControl desde OS X y luego reiniciar en Windows XP ya que el ajuste no se perder\'e1 para esa sesi\'f3n. Alguna gente dice usar esto para enfriar su MBP y que no se cuelge cuando usan juegos en Windows XP.\
|
||||
|
||||
\b \
|
||||
\'bfHabr\'e1 una versi\'f3n de smcFanControl para Powerbooks o otros Macs PPC?\
|
||||
|
||||
\b0 No, los macs basados en PPC no tienen SMC. La t\'e9cnica empleada por smcFanControl no funciona. Es posible que haya formas de controlar la velocidad de los ventiladores para Macs PPC, pero no conozco ninguna.\
|
||||
\
|
||||
|
||||
\b \'bfHay un dashboard widget para smcFanControl?\
|
||||
|
||||
\b0 Pienso que es una buena idea. Ahora mismo estoy trabajando en mejorar smcFanControl como aplicaci\'f3n, pero puede que otros sean buenos desarrolladores de dashboard. La licencia GPL de smcFanControl es un buen comienzo.\
|
||||
\
|
||||
|
||||
\b \'bfNo ser\'eda mejor leer los valores de temperaura y ajustar la velocidad que limitarse a cambiar el valor m\'ednimo y dejar que el control autom\'e1tico de ventiladores de Apple haga el resto?\
|
||||
|
||||
\b0 Si, ese camino es mejor y puede que haga que la m\'e1quina funcione m\'e1s fresca cuando la carga es alta... PERO: No eleg\'ed este camino por los los riesgos que tiene. Requiere un programa en segundo plano (un daemon) ajustando constantemente la velocidad. Si este programa es incompatible con una fuura actualiaci\'f3n del sistema o se cuelga puede fijar la velocidad a un valor demasiado bajo y estropear la m\'e1quina. Adem\'e1s la l\'f3gica que hay que a\'f1adir es muy complicada, un mac intel tiene en torno a 10 sensores de temperatura, con lo que simplemente "leer la temperatura de la CPU y ajustar el ventilador" no es tan buena idea.\
|
||||
\
|
||||
|
||||
\b \'bfTengo un MBP y smcFanControl dice que un ventilador gira a 0rpm?\
|
||||
|
||||
\b0 El ventilador no es\'e1 informando a smcFanControl, puede ser que uno de los ventiladores est\'e9 roto. Comprebe su ordenador con el
|
||||
\b
|
||||
\b0 Apple Hardware Test (est\'e1 en el DVDque ven\'eda con el mac) y compruebe si informa de un fallo en uno de sus ventiladores.\
|
||||
\
|
||||
|
||||
\b \'bfCuales son las principales diferencias entre las versiones 1.2.x y 2.x de smcFanControl?\
|
||||
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural
|
||||
\ls1\ilvl0
|
||||
\b0 \cf0 {\listtext \'95 }La versi\'f3n 2.x est\'e1 completamente rescrita.\
|
||||
{\listtext \'95 }La versi\'f3n 1.x era una aplicaci\'f3n "regular" en el dock. La versi\'f3n 2.x se coloca en la barra de menu, por lo que se accede r\'e1pidamente a los ajustes de los ventiladores, al control de temperatura y en general un uso m\'e1s agradable\
|
||||
{\listtext \'95 }La versi\'f3n 2.x funciona en todos los Mac Intel\
|
||||
{\listtext \'95 }En la versi\'f3n 2.x se pueden guardar diferentes configuraciones como favoritos y acivarlos con un click\
|
||||
{\listtext \'95 }En un port\'e1til se pueden ejecutar autom\'e1ticamente diferentes configuraciones cuando la fuente de alimentaci\'f3n cambia. As\'ed se puede enfriar autom\'e1ticamente el macbook cuando est\'e9 cargando la bater\'eda.\
|
||||
{\listtext \'95 }La versi\'f3n 2.x tiene la opci\'f3n de "a\'f1adir a los elementos de inicio"\
|
||||
{\listtext \'95 }La versi\'f3n 2.x usa la autenticaci\'f3n est\'e1ndard de OS X\
|
||||
{\listtext \'95 }La versi\'f3n 2.x usa el "Sparkle-Framework" para busca autom\'e1ticamente actualizaciones\
|
||||
}
|
||||
3
Ressources/Spanish.lproj/InfoPlist.strings
Normal file
3
Ressources/Spanish.lproj/InfoPlist.strings
Normal file
@ -0,0 +1,3 @@
|
||||
/* Localized versions of Info.plist keys */
|
||||
|
||||
NSHumanReadableCopyright = "by Hendrik Holtmann, 2009 (GPL License)";
|
||||
23
Ressources/Spanish.lproj/Localizable.strings
Normal file
23
Ressources/Spanish.lproj/Localizable.strings
Normal file
@ -0,0 +1,23 @@
|
||||
"Do you really want to delete the favorite %@?" = "¿Seguro qu desea eliminar el favorito: %@?";
|
||||
|
||||
"Yes" = "Si";
|
||||
|
||||
"No" = "No";
|
||||
|
||||
"Delete favorite" = "Favorito eliminado";
|
||||
|
||||
"MainFan" = "Ventilador principal";
|
||||
|
||||
"Left Fan" = "Ventilador izquierdo";
|
||||
|
||||
"Right Fan" = "Ventilador derecho";
|
||||
|
||||
"smcFanControl has not been tested on this machine yet, but it should run if you follow the instructions. \n\nIf you choose to continue, please make you have no other FanControl-software running. Otherwise please quit, deinstall the other software, restart your machine and rerun smcFanControl!" = "smcFanControl no ha sido probado en esta máquina, pero debería de funcionar si sigue esta insrucciones. \n\nSi decide continuar aseguresé de que no hay otro programa de control de ventiladores; si no salga, desinstale los otros programas, reinicie y lance otra vez smcFanControl";
|
||||
|
||||
"Continue" = "Continuar";
|
||||
|
||||
"Quit" = "Salir";
|
||||
|
||||
"Alert!" = "¡Atención!";
|
||||
|
||||
"Active Setting" = "Configuración activa";
|
||||
4594
Ressources/Spanish.lproj/MainMenu.nib/designable.nib
generated
Normal file
4594
Ressources/Spanish.lproj/MainMenu.nib/designable.nib
generated
Normal file
File diff suppressed because it is too large
Load Diff
BIN
Ressources/Spanish.lproj/MainMenu.nib/keyedobjects.nib
generated
Normal file
BIN
Ressources/Spanish.lproj/MainMenu.nib/keyedobjects.nib
generated
Normal file
Binary file not shown.
BIN
Ressources/paypal.gif
Normal file
BIN
Ressources/paypal.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 857 B |
BIN
Ressources/smc.png
Normal file
BIN
Ressources/smc.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.5 KiB |
BIN
Ressources/smcfancontrol_v2.icns
Normal file
BIN
Ressources/smcfancontrol_v2.icns
Normal file
Binary file not shown.
BIN
Ressources/smcover.png
Normal file
BIN
Ressources/smcover.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
16
Ressources/tsensors.plist
Normal file
16
Ressources/tsensors.plist
Normal file
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>standard</key>
|
||||
<string>TC0D</string>
|
||||
<key>lastAlternative</key>
|
||||
<string>TCAH</string>
|
||||
<key>MacBookPro10,1</key>
|
||||
<string>TC0F</string>
|
||||
<key>iMac12,2</key>
|
||||
<string>TC0H</string>
|
||||
<key>iMac12,1</key>
|
||||
<string>TC0H</string>
|
||||
</dict>
|
||||
</plist>
|
||||
1
Sparkle.framework/Headers
Symbolic link
1
Sparkle.framework/Headers
Symbolic link
@ -0,0 +1 @@
|
||||
Versions/Current/Headers
|
||||
1
Sparkle.framework/Resources
Symbolic link
1
Sparkle.framework/Resources
Symbolic link
@ -0,0 +1 @@
|
||||
Versions/Current/Resources
|
||||
1
Sparkle.framework/Sparkle
Symbolic link
1
Sparkle.framework/Sparkle
Symbolic link
@ -0,0 +1 @@
|
||||
Versions/Current/Sparkle
|
||||
@ -0,0 +1,13 @@
|
||||
//
|
||||
// NSApplication+AppCopies.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 3/16/06.
|
||||
// Copyright 2006 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface NSApplication (SUAppCopies)
|
||||
- (int)copiesRunning;
|
||||
@end
|
||||
@ -0,0 +1,11 @@
|
||||
//
|
||||
// NSFileManager+Authentication.m
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 3/9/06.
|
||||
// Copyright 2006 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
@interface NSFileManager (SUAuthenticationAdditions)
|
||||
- (BOOL)movePathWithAuthentication:(NSString *)src toPath:(NSString *)dst;
|
||||
@end
|
||||
@ -0,0 +1,15 @@
|
||||
//
|
||||
// NSFileManager+Verification.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 3/16/06.
|
||||
// Copyright 2006 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
// For the paranoid folks!
|
||||
@interface NSFileManager (SUVerification)
|
||||
- (BOOL)validatePath:(NSString *)path withMD5Hash:(NSString *)hash;
|
||||
- (BOOL)validatePath:(NSString *)path withEncodedDSASignature:(NSString *)encodedSignature;
|
||||
@end
|
||||
61
Sparkle.framework/Versions/A/Headers/NSString+extras.h
Executable file
61
Sparkle.framework/Versions/A/Headers/NSString+extras.h
Executable file
@ -0,0 +1,61 @@
|
||||
/*
|
||||
|
||||
BSD License
|
||||
|
||||
Copyright (c) 2002, Brent Simmons
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the name of ranchero.com or Brent Simmons nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
NSString+extras.h
|
||||
NetNewsWire
|
||||
|
||||
Created by Brent Simmons on Fri Jun 14 2002.
|
||||
Copyright (c) 2002 Brent Simmons. All rights reserved.
|
||||
*/
|
||||
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <CoreFoundation/CoreFoundation.h>
|
||||
|
||||
|
||||
@interface NSString (extras)
|
||||
|
||||
- (NSString *)stringWithSubstitute:(NSString *)subs forCharactersFromSet:(NSCharacterSet *)set;
|
||||
|
||||
- (NSString *) trimWhiteSpace;
|
||||
|
||||
- (NSString *) stripHTML;
|
||||
|
||||
- (NSString *) ellipsizeAfterNWords: (int) n;
|
||||
|
||||
+ (BOOL) stringIsEmpty: (NSString *) s;
|
||||
|
||||
|
||||
@end
|
||||
98
Sparkle.framework/Versions/A/Headers/RSS.h
Executable file
98
Sparkle.framework/Versions/A/Headers/RSS.h
Executable file
@ -0,0 +1,98 @@
|
||||
/*
|
||||
|
||||
BSD License
|
||||
|
||||
Copyright (c) 2002, Brent Simmons
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the name of ranchero.com or Brent Simmons nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
RSS.h
|
||||
A class for reading RSS feeds.
|
||||
|
||||
Created by Brent Simmons on Wed Apr 17 2002.
|
||||
Copyright (c) 2002 Brent Simmons. All rights reserved.
|
||||
*/
|
||||
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <CoreFoundation/CoreFoundation.h>
|
||||
#import "NSString+extras.h"
|
||||
|
||||
|
||||
@interface RSS : NSObject {
|
||||
|
||||
NSDictionary *headerItems;
|
||||
NSMutableArray *newsItems;
|
||||
NSString *version;
|
||||
|
||||
BOOL flRdf;
|
||||
BOOL normalize;
|
||||
}
|
||||
|
||||
|
||||
/*Public*/
|
||||
|
||||
- (RSS *) initWithTitle: (NSString *) title andDescription: (NSString *) description;
|
||||
|
||||
- (RSS *) initWithData: (NSData *) rssData normalize: (BOOL) fl;
|
||||
|
||||
- (RSS *) initWithURL: (NSURL *) url normalize: (BOOL) fl;
|
||||
- (RSS *) initWithURL: (NSURL *) url normalize: (BOOL) fl userAgent:(NSString *)userAgent;
|
||||
|
||||
- (NSDictionary *) headerItems;
|
||||
|
||||
- (NSMutableArray *) newsItems;
|
||||
|
||||
- (NSString *) version;
|
||||
|
||||
// AMM's extensions for Sparkle
|
||||
- (NSDictionary *)newestItem;
|
||||
|
||||
|
||||
/*Private*/
|
||||
|
||||
- (void) createheaderdictionary: (CFXMLTreeRef) tree;
|
||||
|
||||
- (void) createitemsarray: (CFXMLTreeRef) tree;
|
||||
|
||||
- (void) setversionstring: (CFXMLTreeRef) tree;
|
||||
|
||||
- (void) flattenimagechildren: (CFXMLTreeRef) tree into: (NSMutableDictionary *) dictionary;
|
||||
|
||||
- (void) flattensourceattributes: (CFXMLNodeRef) node into: (NSMutableDictionary *) dictionary;
|
||||
|
||||
- (CFXMLTreeRef) getchanneltree: (CFXMLTreeRef) tree;
|
||||
|
||||
- (CFXMLTreeRef) getnamedtree: (CFXMLTreeRef) currentTree name: (NSString *) name;
|
||||
|
||||
- (void) normalizeRSSItem: (NSMutableDictionary *) rssItem;
|
||||
|
||||
- (NSString *) getelementvalue: (CFXMLTreeRef) tree;
|
||||
|
||||
@end
|
||||
27
Sparkle.framework/Versions/A/Headers/SUAppcast.h
Normal file
27
Sparkle.framework/Versions/A/Headers/SUAppcast.h
Normal file
@ -0,0 +1,27 @@
|
||||
//
|
||||
// SUAppcast.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 3/12/06.
|
||||
// Copyright 2006 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@class RSS, SUAppcastItem;
|
||||
@interface SUAppcast : NSObject {
|
||||
NSArray *items;
|
||||
id delegate;
|
||||
}
|
||||
|
||||
- (void)fetchAppcastFromURL:(NSURL *)url;
|
||||
- (void)setDelegate:delegate;
|
||||
|
||||
- (SUAppcastItem *)newestItem;
|
||||
- (NSArray *)items;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSObject (SUAppcastDelegate)
|
||||
- appcastDidFinishLoading:(SUAppcast *)appcast;
|
||||
@end
|
||||
57
Sparkle.framework/Versions/A/Headers/SUAppcastItem.h
Normal file
57
Sparkle.framework/Versions/A/Headers/SUAppcastItem.h
Normal file
@ -0,0 +1,57 @@
|
||||
//
|
||||
// SUAppcastItem.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 3/12/06.
|
||||
// Copyright 2006 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
|
||||
@interface SUAppcastItem : NSObject {
|
||||
NSString *title;
|
||||
NSDate *date;
|
||||
NSString *description;
|
||||
|
||||
NSURL *releaseNotesURL;
|
||||
|
||||
NSString *DSASignature;
|
||||
NSString *MD5Sum;
|
||||
|
||||
NSURL *fileURL;
|
||||
NSString *fileVersion;
|
||||
NSString *versionString;
|
||||
}
|
||||
|
||||
// Initializes with data from a dictionary provided by the RSS class.
|
||||
- initWithDictionary:(NSDictionary *)dict;
|
||||
|
||||
- (NSString *)title;
|
||||
- (void)setTitle:(NSString *)aTitle;
|
||||
|
||||
- (NSDate *)date;
|
||||
- (void)setDate:(NSDate *)aDate;
|
||||
|
||||
- (NSString *)description;
|
||||
- (void)setDescription:(NSString *)aDescription;
|
||||
|
||||
- (NSURL *)releaseNotesURL;
|
||||
- (void)setReleaseNotesURL:(NSURL *)aReleaseNotesURL;
|
||||
|
||||
- (NSString *)DSASignature;
|
||||
- (void)setDSASignature:(NSString *)aDSASignature;
|
||||
|
||||
- (NSString *)MD5Sum;
|
||||
- (void)setMD5Sum:(NSString *)aMd5Sum;
|
||||
|
||||
- (NSURL *)fileURL;
|
||||
- (void)setFileURL:(NSURL *)aFileURL;
|
||||
|
||||
- (NSString *)fileVersion;
|
||||
- (void)setFileVersion:(NSString *)aFileVersion;
|
||||
|
||||
- (NSString *)versionString;
|
||||
- (void)setVersionString:(NSString *)versionString;
|
||||
|
||||
@end
|
||||
@ -0,0 +1,21 @@
|
||||
//
|
||||
// SUAutomaticUpdateAlert.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 3/18/06.
|
||||
// Copyright 2006 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@class SUAppcastItem;
|
||||
@interface SUAutomaticUpdateAlert : NSWindowController {
|
||||
SUAppcastItem *updateItem;
|
||||
}
|
||||
|
||||
- initWithAppcastItem:(SUAppcastItem *)item;
|
||||
|
||||
- (IBAction)relaunchNow:sender;
|
||||
- (IBAction)relaunchLater:sender;
|
||||
|
||||
@end
|
||||
20
Sparkle.framework/Versions/A/Headers/SUConstants.h
Normal file
20
Sparkle.framework/Versions/A/Headers/SUConstants.h
Normal file
@ -0,0 +1,20 @@
|
||||
//
|
||||
// SUConstants.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 3/16/06.
|
||||
// Copyright 2006 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
extern NSString *SUUpdaterWillRestartNotification;
|
||||
|
||||
extern NSString *SUCheckAtStartupKey;
|
||||
extern NSString *SUFeedURLKey;
|
||||
extern NSString *SUShowReleaseNotesKey;
|
||||
extern NSString *SUSkippedVersionKey;
|
||||
extern NSString *SUScheduledCheckIntervalKey;
|
||||
extern NSString *SULastCheckTimeKey;
|
||||
extern NSString *SUExpectsDSASignatureKey;
|
||||
extern NSString *SUPublicDSAKeyKey;
|
||||
extern NSString *SUAutomaticallyUpdateKey;
|
||||
extern NSString *SUAllowsAutomaticUpdatesKey;
|
||||
26
Sparkle.framework/Versions/A/Headers/SUStatusChecker.h
Normal file
26
Sparkle.framework/Versions/A/Headers/SUStatusChecker.h
Normal file
@ -0,0 +1,26 @@
|
||||
//
|
||||
// SUStatusChecker.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Evan Schoenberg on 7/6/06.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <Sparkle/SUUpdater.h>
|
||||
|
||||
@class SUStatusChecker;
|
||||
|
||||
@protocol SUStatusCheckerDelegate <NSObject>
|
||||
//versionString will be nil and isNewVersion will be NO if version checking fails.
|
||||
- (void)statusChecker:(SUStatusChecker *)statusChecker foundVersion:(NSString *)versionString isNewVersion:(BOOL)isNewVersion;
|
||||
@end
|
||||
|
||||
@interface SUStatusChecker : SUUpdater {
|
||||
id<SUStatusCheckerDelegate> scDelegate;
|
||||
}
|
||||
|
||||
// Create a status checker which will notifiy delegate once the appcast version is determined.
|
||||
// Notification occurs via the method defined in the SUStatusCheckerDelegate informal protocol.
|
||||
+ (SUStatusChecker *)statusCheckerForDelegate:(id<SUStatusCheckerDelegate>)delegate;
|
||||
|
||||
@end
|
||||
33
Sparkle.framework/Versions/A/Headers/SUStatusController.h
Normal file
33
Sparkle.framework/Versions/A/Headers/SUStatusController.h
Normal file
@ -0,0 +1,33 @@
|
||||
//
|
||||
// SUStatusController.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 3/14/06.
|
||||
// Copyright 2006 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
|
||||
@interface SUStatusController : NSWindowController {
|
||||
double progressValue, maxProgressValue;
|
||||
NSString *title, *statusText, *buttonTitle;
|
||||
IBOutlet NSButton *actionButton;
|
||||
}
|
||||
|
||||
// Pass 0 for the max progress value to get an indeterminate progress bar.
|
||||
// Pass nil for the status text to not show it.
|
||||
- (void)beginActionWithTitle:(NSString *)title maxProgressValue:(double)maxProgressValue statusText:(NSString *)statusText;
|
||||
|
||||
// If isDefault is YES, the button's key equivalent will be \r.
|
||||
- (void)setButtonTitle:(NSString *)buttonTitle target:target action:(SEL)action isDefault:(BOOL)isDefault;
|
||||
- (void)setButtonEnabled:(BOOL)enabled;
|
||||
|
||||
- (double)progressValue;
|
||||
- (void)setProgressValue:(double)value;
|
||||
- (double)maxProgressValue;
|
||||
- (void)setMaxProgressValue:(double)value;
|
||||
|
||||
- (void)setStatusText:(NSString *)statusText;
|
||||
|
||||
@end
|
||||
25
Sparkle.framework/Versions/A/Headers/SUUnarchiver.h
Normal file
25
Sparkle.framework/Versions/A/Headers/SUUnarchiver.h
Normal file
@ -0,0 +1,25 @@
|
||||
//
|
||||
// SUUnarchiver.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 3/16/06.
|
||||
// Copyright 2006 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
|
||||
@interface SUUnarchiver : NSObject {
|
||||
id delegate;
|
||||
}
|
||||
|
||||
- (void)unarchivePath:(NSString *)path;
|
||||
- (void)setDelegate:delegate;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSObject (SUUnarchiverDelegate)
|
||||
- (void)unarchiver:(SUUnarchiver *)unarchiver extractedLength:(long)length;
|
||||
- (void)unarchiverDidFinish:(SUUnarchiver *)unarchiver;
|
||||
- (void)unarchiverDidFail:(SUUnarchiver *)unarchiver;
|
||||
@end
|
||||
40
Sparkle.framework/Versions/A/Headers/SUUpdateAlert.h
Normal file
40
Sparkle.framework/Versions/A/Headers/SUUpdateAlert.h
Normal file
@ -0,0 +1,40 @@
|
||||
//
|
||||
// SUUpdateAlert.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 3/12/06.
|
||||
// Copyright 2006 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SUInstallUpdateChoice,
|
||||
SURemindMeLaterChoice,
|
||||
SUSkipThisVersionChoice
|
||||
} SUUpdateAlertChoice;
|
||||
|
||||
@class WebView, SUAppcastItem;
|
||||
@interface SUUpdateAlert : NSWindowController {
|
||||
SUAppcastItem *updateItem;
|
||||
id delegate;
|
||||
|
||||
IBOutlet WebView *releaseNotesView;
|
||||
IBOutlet NSTextField *description;
|
||||
NSProgressIndicator *releaseNotesSpinner;
|
||||
BOOL webViewFinishedLoading;
|
||||
}
|
||||
|
||||
- initWithAppcastItem:(SUAppcastItem *)item;
|
||||
- (void)setDelegate:delegate;
|
||||
|
||||
- (IBAction)installUpdate:sender;
|
||||
- (IBAction)skipThisVersion:sender;
|
||||
- (IBAction)remindMeLater:sender;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSObject (SUUpdateAlertDelegate)
|
||||
- (void)updateAlert:(SUUpdateAlert *)updateAlert finishedWithChoice:(SUUpdateAlertChoice)updateChoice;
|
||||
@end
|
||||
55
Sparkle.framework/Versions/A/Headers/SUUpdater.h
Normal file
55
Sparkle.framework/Versions/A/Headers/SUUpdater.h
Normal file
@ -0,0 +1,55 @@
|
||||
//
|
||||
// SUUpdater.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 1/4/06.
|
||||
// Copyright 2006 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
// Before you use Sparkle in your app, you must set SUFeedURL in Info.plist to the
|
||||
// address of the appcast on your webserver. If you don't already have an
|
||||
// appcast, please see the Sparkle documentation to learn about how to set one up.
|
||||
|
||||
// .zip, .dmg, .tar, .tbz, .tgz archives are supported at this time.
|
||||
|
||||
// By default, Sparkle offers to show the user the release notes of the build they'll be
|
||||
// getting, which it assumes are in the description (or body) field of the relevant RSS item.
|
||||
// Set SUShowReleaseNotes to <false/> in Info.plist to hide the button.
|
||||
|
||||
@class SUAppcastItem, SUUpdateAlert, SUStatusController;
|
||||
@interface SUUpdater : NSObject {
|
||||
SUAppcastItem *updateItem;
|
||||
|
||||
SUStatusController *statusController;
|
||||
SUUpdateAlert *updateAlert;
|
||||
|
||||
NSURLDownload *downloader;
|
||||
NSString *downloadPath;
|
||||
|
||||
NSTimer *checkTimer;
|
||||
NSTimeInterval checkInterval;
|
||||
|
||||
BOOL verbose;
|
||||
BOOL updateInProgress;
|
||||
}
|
||||
|
||||
// This IBAction is meant for a main menu item. Hook up any menu item to this action,
|
||||
// and Sparkle will check for updates and report back its findings verbosely.
|
||||
- (IBAction)checkForUpdates:sender;
|
||||
|
||||
// This method is similar to the above, but it's intended for updates initiated by
|
||||
// the computer instead of by the user. It does not alert the user when he is up to date,
|
||||
// and it remains silent about network errors in fetching the feed. This is what you
|
||||
// want to call to update programmatically; only use checkForUpdates: with buttons and menu items.
|
||||
- (void)checkForUpdatesInBackground;
|
||||
|
||||
// This method allows you to schedule a check to run every time interval. You can
|
||||
// pass 0 to this method to cancel a previously scheduled timer. You probably don't want
|
||||
// to call this directly: if you set a SUScheduledCheckInterval key in Info.plist or
|
||||
// the user defaults, Sparkle will set this up for you automatically on startup. You might
|
||||
// just want to call this every time the user changes the setting in the preferences.
|
||||
- (void)scheduleCheckWithInterval:(NSTimeInterval)interval;
|
||||
|
||||
@end
|
||||
20
Sparkle.framework/Versions/A/Headers/SUUtilities.h
Normal file
20
Sparkle.framework/Versions/A/Headers/SUUtilities.h
Normal file
@ -0,0 +1,20 @@
|
||||
//
|
||||
// SUUtilities.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 3/12/06.
|
||||
// Copyright 2006 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
id SUInfoValueForKey(NSString *key);
|
||||
NSString *SUHostAppName();
|
||||
NSString *SUHostAppDisplayName();
|
||||
NSString *SUHostAppVersion();
|
||||
NSString *SUHostAppVersionString();
|
||||
|
||||
NSComparisonResult SUStandardVersionComparison(NSString * versionA, NSString * versionB);
|
||||
|
||||
// If running make localizable-strings for genstrings, ignore the error on this line.
|
||||
NSString *SULocalizedString(NSString *key, NSString *comment);
|
||||
22
Sparkle.framework/Versions/A/Headers/Sparkle.h
Normal file
22
Sparkle.framework/Versions/A/Headers/Sparkle.h
Normal file
@ -0,0 +1,22 @@
|
||||
//
|
||||
// Sparkle.h
|
||||
// Sparkle
|
||||
//
|
||||
// Created by Andy Matuschak on 3/16/06.
|
||||
// Copyright 2006 Andy Matuschak. All rights reserved.
|
||||
//
|
||||
|
||||
#import "SUUpdater.h"
|
||||
#import "SUUtilities.h"
|
||||
#import "SUConstants.h"
|
||||
#import "SUAppcast.h"
|
||||
#import "SUAppcastItem.h"
|
||||
#import "SUUpdateAlert.h"
|
||||
#import "SUAutomaticUpdateAlert.h"
|
||||
#import "SUStatusController.h"
|
||||
#import "SUUnarchiver.h"
|
||||
#import "SUStatusChecker.h"
|
||||
|
||||
#import "NSApplication+AppCopies.h"
|
||||
#import "NSFileManager+Authentication.h"
|
||||
#import "NSFileManager+Verification.h"
|
||||
38
Sparkle.framework/Versions/A/Resources/Info.plist
Normal file
38
Sparkle.framework/Versions/A/Resources/Info.plist
Normal file
@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>BuildMachineOSBuild</key>
|
||||
<string>12A269</string>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>Sparkle</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>org.andymatuschak.Sparkle</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Sparkle</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.1</string>
|
||||
<key>DTCompiler</key>
|
||||
<string>com.apple.compilers.llvmgcc42</string>
|
||||
<key>DTPlatformBuild</key>
|
||||
<string>4F1003</string>
|
||||
<key>DTPlatformVersion</key>
|
||||
<string>GM</string>
|
||||
<key>DTSDKBuild</key>
|
||||
<string>9L31a</string>
|
||||
<key>DTSDKName</key>
|
||||
<string>macosx10.5</string>
|
||||
<key>DTXcode</key>
|
||||
<string>0441</string>
|
||||
<key>DTXcodeBuild</key>
|
||||
<string>4F1003</string>
|
||||
</dict>
|
||||
</plist>
|
||||
BIN
Sparkle.framework/Versions/A/Resources/SUStatus.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/SUStatus.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/ca.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/ca.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/ca.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/ca.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/ca.lproj/Sparkle.strings
Normal file
BIN
Sparkle.framework/Versions/A/Resources/ca.lproj/Sparkle.strings
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings
Normal file
BIN
Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/cy.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/cy.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/cy.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/cy.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/cy.lproj/Sparkle.strings
Normal file
BIN
Sparkle.framework/Versions/A/Resources/cy.lproj/Sparkle.strings
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings
Normal file
BIN
Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings
Normal file
BIN
Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings
Normal file
BIN
Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings
Normal file
BIN
Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/fi.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/fi.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/fi.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/fi.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/fi.lproj/Sparkle.strings
Normal file
BIN
Sparkle.framework/Versions/A/Resources/fi.lproj/Sparkle.strings
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings
Normal file
BIN
Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/he.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/he.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/he.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/he.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/he.lproj/Sparkle.strings
Normal file
BIN
Sparkle.framework/Versions/A/Resources/he.lproj/Sparkle.strings
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/hu.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/hu.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/hu.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/hu.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/hu.lproj/Sparkle.strings
Normal file
BIN
Sparkle.framework/Versions/A/Resources/hu.lproj/Sparkle.strings
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/id.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/id.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/id.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/id.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/id.lproj/Sparkle.strings
Normal file
BIN
Sparkle.framework/Versions/A/Resources/id.lproj/Sparkle.strings
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib
generated
Normal file
Binary file not shown.
BIN
Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib
generated
Normal file
BIN
Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib
generated
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user