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

Added pref migration for prompt on close. Added code for jobs tableview....

Added pref migration for prompt on close. Added code for jobs tableview. Tweaked prompt on close global prefs. Prmopt on quit logic improved, message improved, that code refactored.
parent 0d1ad09c
No related branches found
No related tags found
No related merge requests found
Loading
@@ -24,8 +24,12 @@
Loading
@@ -24,8 +24,12 @@
   
#import <iTerm/ITAddressBookMgr.h> #import <iTerm/ITAddressBookMgr.h>
#import <iTerm/BookmarkModel.h> #import <iTerm/BookmarkModel.h>
#import "PreferencePanel.h"
   
id gAltOpenAllRepresentedObject; id gAltOpenAllRepresentedObject;
// Set to true if a bookmark was changed automatically due to migration to a new
// standard.
int gMigrated;
   
@implementation BookmarkModel @implementation BookmarkModel
   
Loading
@@ -34,6 +38,11 @@ id gAltOpenAllRepresentedObject;
Loading
@@ -34,6 +38,11 @@ id gAltOpenAllRepresentedObject;
gAltOpenAllRepresentedObject = [[NSObject alloc] init]; gAltOpenAllRepresentedObject = [[NSObject alloc] init];
} }
   
+ (BOOL)migrated
{
return gMigrated;
}
- (BookmarkModel*)init - (BookmarkModel*)init
{ {
bookmarks_ = [[NSMutableArray alloc] init]; bookmarks_ = [[NSMutableArray alloc] init];
Loading
@@ -186,6 +195,25 @@ id gAltOpenAllRepresentedObject;
Loading
@@ -186,6 +195,25 @@ id gAltOpenAllRepresentedObject;
[self addBookmark:bookmark inSortedOrder:NO]; [self addBookmark:bookmark inSortedOrder:NO];
} }
   
+ (void)migratePromptOnCloseInMutableBookmark:(NSMutableDictionary *)dict
{
// Migrate global "prompt on close" to per-profile prompt enum
if (![dict objectForKey:KEY_PROMPT_CLOSE]) {
BOOL promptOnClose = [[[NSUserDefaults standardUserDefaults] objectForKey:@"PromptOnClose"] boolValue];
NSNumber *newValue = [NSNumber numberWithBool:promptOnClose ? PROMPT_ALWAYS : PROMPT_NEVER];
[dict setObject:newValue forKey:KEY_PROMPT_CLOSE];
gMigrated = YES;
}
// This is a required field to avoid setting nil values in the bookmark
// dict later on.
if (![dict objectForKey:KEY_JOBS]) {
[dict setObject:[NSArray arrayWithObjects:@"rlogin", @"ssh", @"slogin", @"telnet", nil]
forKey:KEY_JOBS];
gMigrated = YES;
}
}
- (void)addBookmark:(Bookmark*)bookmark inSortedOrder:(BOOL)sort - (void)addBookmark:(Bookmark*)bookmark inSortedOrder:(BOOL)sort
{ {
   
Loading
@@ -210,6 +238,7 @@ id gAltOpenAllRepresentedObject;
Loading
@@ -210,6 +238,7 @@ id gAltOpenAllRepresentedObject;
if (![newBookmark objectForKey:KEY_DEFAULT_BOOKMARK]) { if (![newBookmark objectForKey:KEY_DEFAULT_BOOKMARK]) {
[newBookmark setObject:@"No" forKey:KEY_DEFAULT_BOOKMARK]; [newBookmark setObject:@"No" forKey:KEY_DEFAULT_BOOKMARK];
} }
[BookmarkModel migratePromptOnCloseInMutableBookmark:newBookmark];
   
bookmark = [[newBookmark copy] autorelease]; bookmark = [[newBookmark copy] autorelease];
   
Loading
Loading
This diff is collapsed.
Loading
@@ -49,6 +49,8 @@ typedef struct {
Loading
@@ -49,6 +49,8 @@ typedef struct {
+ (BookmarkModel*)sharedInstance; + (BookmarkModel*)sharedInstance;
+ (BookmarkModel*)sessionsInstance; + (BookmarkModel*)sessionsInstance;
+ (NSString*)freshGuid; + (NSString*)freshGuid;
+ (void)migratePromptOnCloseInMutableBookmark:(NSMutableDictionary *)dict;
+ (BOOL)migrated;
- (int)numberOfBookmarks; - (int)numberOfBookmarks;
- (int)numberOfBookmarksWithFilter:(NSString*)filter; - (int)numberOfBookmarksWithFilter:(NSString*)filter;
- (NSArray*)bookmarkIndicesMatchingFilter:(NSString*)filter; - (NSArray*)bookmarkIndicesMatchingFilter:(NSString*)filter;
Loading
Loading
Loading
@@ -202,7 +202,7 @@ static const float kBackgroundSessionIntervalSec = 1;
Loading
@@ -202,7 +202,7 @@ static const float kBackgroundSessionIntervalSec = 1;
   
// Time session was created // Time session was created
NSDate* creationDate_; NSDate* creationDate_;
// After receiving new output, we keep running the updateDisplay timer for a few seconds to catch // After receiving new output, we keep running the updateDisplay timer for a few seconds to catch
// changes in job name. // changes in job name.
NSDate* updateDisplayUntil_; NSDate* updateDisplayUntil_;
Loading
@@ -297,6 +297,11 @@ static const float kBackgroundSessionIntervalSec = 1;
Loading
@@ -297,6 +297,11 @@ static const float kBackgroundSessionIntervalSec = 1;
// misc // misc
- (void)setWidth:(int)width height:(int)height; - (void)setWidth:(int)width height:(int)height;
   
// Do we need to prompt on close for this session?
- (BOOL)promptOnClose;
// Array of subprocessess names.
- (NSArray *)childJobNames;
   
// Contextual menu // Contextual menu
- (void)menuForEvent:(NSEvent *)theEvent menu: (NSMenu *)theMenu; - (void)menuForEvent:(NSEvent *)theEvent menu: (NSMenu *)theMenu;
Loading
Loading
Loading
@@ -43,6 +43,14 @@
Loading
@@ -43,6 +43,14 @@
#define MOD_TAG_LEFT_COMMAND 7 #define MOD_TAG_LEFT_COMMAND 7
#define MOD_TAG_RIGHT_COMMAND 8 #define MOD_TAG_RIGHT_COMMAND 8
   
// Constants for KEY_PROMPT_CLOSE
// Never prompt on close
#define PROMPT_NEVER 0
// Always prompt on close
#define PROMPT_ALWAYS 1
// Prompt on close if jobs (excluding some in a list) are running.
#define PROMPT_EX_JOBS 2
@class iTermController; @class iTermController;
   
typedef enum { CURSOR_UNDERLINE, CURSOR_VERTICAL, CURSOR_BOX } ITermCursorType; typedef enum { CURSOR_UNDERLINE, CURSOR_VERTICAL, CURSOR_BOX } ITermCursorType;
Loading
@@ -88,10 +96,6 @@ typedef enum { CURSOR_UNDERLINE, CURSOR_VERTICAL, CURSOR_BOX } ITermCursorType;
Loading
@@ -88,10 +96,6 @@ typedef enum { CURSOR_UNDERLINE, CURSOR_VERTICAL, CURSOR_BOX } ITermCursorType;
IBOutlet id hideTab; IBOutlet id hideTab;
BOOL defaultHideTab; BOOL defaultHideTab;
   
// Warn me when a session closes
IBOutlet id promptOnClose;
BOOL defaultPromptOnClose;
// Warn when quitting // Warn when quitting
IBOutlet id promptOnQuit; IBOutlet id promptOnQuit;
BOOL defaultPromptOnQuit; BOOL defaultPromptOnQuit;
Loading
@@ -402,15 +406,9 @@ typedef enum { CURSOR_UNDERLINE, CURSOR_VERTICAL, CURSOR_BOX } ITermCursorType;
Loading
@@ -402,15 +406,9 @@ typedef enum { CURSOR_UNDERLINE, CURSOR_VERTICAL, CURSOR_BOX } ITermCursorType;
IBOutlet NSButton* disablePrinting; IBOutlet NSButton* disablePrinting;
IBOutlet NSButton* scrollbackWithStatusBar; IBOutlet NSButton* scrollbackWithStatusBar;
IBOutlet NSButton* bookmarkGrowlNotifications; IBOutlet NSButton* bookmarkGrowlNotifications;
IBOutlet NSButton *autoLog;
IBOutlet NSTextField *logDir;
IBOutlet NSButton *changeLogDir;
IBOutlet NSImageView *logDirWarning;
IBOutlet NSTextField* scrollbackLines; IBOutlet NSTextField* scrollbackLines;
IBOutlet NSButton* unlimitedScrollback; IBOutlet NSButton* unlimitedScrollback;
IBOutlet NSComboBox* terminalType; IBOutlet NSComboBox* terminalType;
IBOutlet NSButton* sendCodeWhenIdle;
IBOutlet NSTextField* idleCode;
IBOutlet NSPopUpButton* characterEncoding; IBOutlet NSPopUpButton* characterEncoding;
   
// Keyboard tab // Keyboard tab
Loading
@@ -439,6 +437,17 @@ typedef enum { CURSOR_UNDERLINE, CURSOR_VERTICAL, CURSOR_BOX } ITermCursorType;
Loading
@@ -439,6 +437,17 @@ typedef enum { CURSOR_UNDERLINE, CURSOR_VERTICAL, CURSOR_BOX } ITermCursorType;
IBOutlet NSPopUpButton* bookmarksPopup; IBOutlet NSPopUpButton* bookmarksPopup;
IBOutlet NSButton* addNewMapping; IBOutlet NSButton* addNewMapping;
   
// Session --------------------------------
IBOutlet NSTableView *jobsTable_;
IBOutlet NSButton *autoLog;
IBOutlet NSTextField *logDir;
IBOutlet NSButton *changeLogDir;
IBOutlet NSImageView *logDirWarning;
IBOutlet NSButton* sendCodeWhenIdle;
IBOutlet NSTextField* idleCode;
IBOutlet NSButton* removeJobButton_;
IBOutlet NSMatrix* promptBeforeClosing_;
// Copy Bookmark Settings... // Copy Bookmark Settings...
IBOutlet NSTextField* bulkCopyLabel; IBOutlet NSTextField* bulkCopyLabel;
IBOutlet NSPanel* copyPanel; IBOutlet NSPanel* copyPanel;
Loading
@@ -493,6 +502,7 @@ typedef enum {
Loading
@@ -493,6 +502,7 @@ typedef enum {
+ (PreferencePanel*)sharedInstance; + (PreferencePanel*)sharedInstance;
+ (PreferencePanel*)sessionsInstance; + (PreferencePanel*)sessionsInstance;
+ (BOOL)migratePreferences; + (BOOL)migratePreferences;
+ (BOOL)loadingPrefsFromCustomFolder;
- (BOOL)loadPrefs; - (BOOL)loadPrefs;
- (id)initWithDataSource:(BookmarkModel*)model userDefaults:(NSUserDefaults*)userDefaults; - (id)initWithDataSource:(BookmarkModel*)model userDefaults:(NSUserDefaults*)userDefaults;
- (void)setOneBokmarkOnly; - (void)setOneBokmarkOnly;
Loading
@@ -500,6 +510,8 @@ typedef enum {
Loading
@@ -500,6 +510,8 @@ typedef enum {
- (void)handleWindowWillCloseNotification:(NSNotification *)notification; - (void)handleWindowWillCloseNotification:(NSNotification *)notification;
- (void)genericCloseSheet:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (void)genericCloseSheet:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo;
- (void)editKeyMapping:(id)sender; - (void)editKeyMapping:(id)sender;
- (IBAction)addJob:(id)sender;
- (IBAction)removeJob:(id)sender;
- (IBAction)saveKeyMapping:(id)sender; - (IBAction)saveKeyMapping:(id)sender;
- (BOOL)keySheetIsOpen; - (BOOL)keySheetIsOpen;
- (WindowArrangements *)arrangements; - (WindowArrangements *)arrangements;
Loading
@@ -529,7 +541,6 @@ typedef enum {
Loading
@@ -529,7 +541,6 @@ typedef enum {
- (void)setTabViewType:(NSTabViewType)type; - (void)setTabViewType:(NSTabViewType)type;
- (NSTabViewType)tabViewType; - (NSTabViewType)tabViewType;
- (int)windowStyle; - (int)windowStyle;
- (BOOL)promptOnClose;
- (BOOL)promptOnQuit; - (BOOL)promptOnQuit;
- (BOOL)onlyWhenMoreTabs; - (BOOL)onlyWhenMoreTabs;
- (BOOL)focusFollowsMouse; - (BOOL)focusFollowsMouse;
Loading
@@ -662,3 +673,8 @@ typedef enum {
Loading
@@ -662,3 +673,8 @@ typedef enum {
   
@end @end
   
@interface PreferencePanel (KeyValueCoding)
- (BOOL)haveJobsForCurrentBookmark;
- (void)setHaveJobsForCurrentBookmark:(BOOL)value;
@end
Loading
@@ -405,6 +405,9 @@ typedef enum {
Loading
@@ -405,6 +405,9 @@ typedef enum {
// Can progress indicators be shown? They're turned off during animation of the tabbar. // Can progress indicators be shown? They're turned off during animation of the tabbar.
- (BOOL)disableProgressIndicators; - (BOOL)disableProgressIndicators;
   
// Does any session want to be prompted for closing?
- (BOOL)promptOnClose;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// NSTextField Delegate Methods // NSTextField Delegate Methods
   
Loading
Loading
Loading
@@ -132,10 +132,14 @@
Loading
@@ -132,10 +132,14 @@
#define KEY_SCROLLBACK_LINES @"Scrollback Lines" #define KEY_SCROLLBACK_LINES @"Scrollback Lines"
#define KEY_UNLIMITED_SCROLLBACK @"Unlimited Scrollback" #define KEY_UNLIMITED_SCROLLBACK @"Unlimited Scrollback"
#define KEY_TERMINAL_TYPE @"Terminal Type" #define KEY_TERMINAL_TYPE @"Terminal Type"
#define KEY_SEND_CODE_WHEN_IDLE @"Send Code When Idle"
#define KEY_IDLE_CODE @"Idle Code" // Session
#define KEY_AUTOLOG @"Automatically Log" #define KEY_AUTOLOG @"Automatically Log"
#define KEY_LOGDIR @"Log Directory" #define KEY_LOGDIR @"Log Directory"
#define KEY_SEND_CODE_WHEN_IDLE @"Send Code When Idle"
#define KEY_IDLE_CODE @"Idle Code"
#define KEY_PROMPT_CLOSE @"Prompt Before Closing"
#define KEY_JOBS @"Jobs to Ignore"
   
// Keyboard // Keyboard
#define KEY_KEYBOARD_MAP @"Keyboard Map" #define KEY_KEYBOARD_MAP @"Keyboard Map"
Loading
Loading
Loading
@@ -424,6 +424,48 @@ static NSString* SESSION_ARRANGEMENT_WORKING_DIRECTORY = @"Working Directory";
Loading
@@ -424,6 +424,48 @@ static NSString* SESSION_ARRANGEMENT_WORKING_DIRECTORY = @"Working Directory";
[TEXTVIEW clearHighlights]; [TEXTVIEW clearHighlights];
} }
   
- (NSArray *)childJobNames
{
int skip = 0;
pid_t thePid = [SHELL pid];
if ([[[ProcessCache sharedInstance] getNameOfPid:thePid isForeground:nil] isEqualToString:@"login"]) {
skip = 1;
}
NSMutableArray *names = [NSMutableArray array];
for (NSNumber *n in [[ProcessCache sharedInstance] childrenOfPid:thePid levelsToSkip:skip]) {
pid_t pid = [n intValue];
NSDictionary *info = [[ProcessCache sharedInstance] dictionaryOfTaskInfoForPid:pid];
[names addObject:[info objectForKey:PID_INFO_NAME]];
}
return names;
}
- (BOOL)promptOnClose
{
if (EXIT) {
return NO;
}
switch ([[addressBookEntry objectForKey:KEY_PROMPT_CLOSE] intValue]) {
case PROMPT_ALWAYS:
return YES;
case PROMPT_NEVER:
return NO;
case PROMPT_EX_JOBS: {
NSArray *jobsThatDontRequirePrompting = [addressBookEntry objectForKey:KEY_JOBS];
for (NSString *childName in [self childJobNames]) {
if ([jobsThatDontRequirePrompting indexOfObject:childName] == NSNotFound) {
// This job is not in the ignore list.
return YES;
}
}
// All jobs were in the ignore list.
return NO;
}
}
}
- (void)setNewOutput:(BOOL)value - (void)setNewOutput:(BOOL)value
{ {
newOutput = value; newOutput = value;
Loading
@@ -2499,12 +2541,18 @@ static NSString* SESSION_ARRANGEMENT_WORKING_DIRECTORY = @"Working Directory";
Loading
@@ -2499,12 +2541,18 @@ static NSString* SESSION_ARRANGEMENT_WORKING_DIRECTORY = @"Working Directory";
   
- (void)setAddressBookEntry:(NSDictionary*)entry - (void)setAddressBookEntry:(NSDictionary*)entry
{ {
NSMutableDictionary *dict = [[entry mutableCopy] autorelease];
// This is the most practical way to migrate the bopy of a
// profile that's stored in a saved window arrangement. It doesn't get
// saved back into the arrangement, unfortunately.
[BookmarkModel migratePromptOnCloseInMutableBookmark:dict];
if (!originalAddressBookEntry) { if (!originalAddressBookEntry) {
originalAddressBookEntry = [NSDictionary dictionaryWithDictionary:entry]; originalAddressBookEntry = [NSDictionary dictionaryWithDictionary:dict];
[originalAddressBookEntry retain]; [originalAddressBookEntry retain];
} }
[addressBookEntry release]; [addressBookEntry release];
addressBookEntry = [entry retain]; addressBookEntry = [dict retain];
} }
   
- (NSDictionary *)addressBookEntry - (NSDictionary *)addressBookEntry
Loading
Loading
Loading
@@ -186,6 +186,8 @@ static const int MIN_SESSION_COLUMNS = 2;
Loading
@@ -186,6 +186,8 @@ static const int MIN_SESSION_COLUMNS = 2;
- (BOOL)hasMaximizedPane; - (BOOL)hasMaximizedPane;
- (void)maximize; - (void)maximize;
- (void)unmaximize; - (void)unmaximize;
// Does any session in this tab require prompt on close?
- (BOOL)promptOnClose;
   
#pragma mark NSSplitView delegate methods #pragma mark NSSplitView delegate methods
- (void)splitViewDidResizeSubviews:(NSNotification *)aNotification; - (void)splitViewDidResizeSubviews:(NSNotification *)aNotification;
Loading
Loading
Loading
@@ -1955,6 +1955,16 @@ static NSString* FormatRect(NSRect r) {
Loading
@@ -1955,6 +1955,16 @@ static NSString* FormatRect(NSRect r) {
[[root_ window] makeFirstResponder:[activeSession_ TEXTVIEW]]; [[root_ window] makeFirstResponder:[activeSession_ TEXTVIEW]];
} }
   
- (BOOL)promptOnClose
{
for (PTYSession *aSession in [self sessions]) {
if ([aSession promptOnClose]) {
return YES;
}
}
return NO;
}
#pragma mark NSSplitView delegate methods #pragma mark NSSplitView delegate methods
   
// Prevent any session from becoming smaller than its minimum size because of // Prevent any session from becoming smaller than its minimum size because of
Loading
Loading
Loading
@@ -97,8 +97,8 @@ static float versionNumber;
Loading
@@ -97,8 +97,8 @@ static float versionNumber;
Static method to copy old preferences file, iTerm.plist or net.sourceforge.iTerm.plist, to new Static method to copy old preferences file, iTerm.plist or net.sourceforge.iTerm.plist, to new
preferences file, com.googlecode.iterm2.plist preferences file, com.googlecode.iterm2.plist
*/ */
+ (BOOL) migratePreferences { + (BOOL)migratePreferences
{
NSString *prefDir = [[NSHomeDirectory() NSString *prefDir = [[NSHomeDirectory()
stringByAppendingPathComponent:@"Library"] stringByAppendingPathComponent:@"Library"]
stringByAppendingPathComponent:@"Preferences"]; stringByAppendingPathComponent:@"Preferences"];
Loading
@@ -972,7 +972,6 @@ static float versionNumber;
Loading
@@ -972,7 +972,6 @@ static float versionNumber;
defaultPasteFromClipboard=[prefs objectForKey:@"PasteFromClipboard"]?[[prefs objectForKey:@"PasteFromClipboard"] boolValue]:YES; defaultPasteFromClipboard=[prefs objectForKey:@"PasteFromClipboard"]?[[prefs objectForKey:@"PasteFromClipboard"] boolValue]:YES;
defaultHideTab=[prefs objectForKey:@"HideTab"]?[[prefs objectForKey:@"HideTab"] boolValue]: YES; defaultHideTab=[prefs objectForKey:@"HideTab"]?[[prefs objectForKey:@"HideTab"] boolValue]: YES;
defaultPromptOnQuit = [prefs objectForKey:@"PromptOnQuit"]?[[prefs objectForKey:@"PromptOnQuit"] boolValue]: YES; defaultPromptOnQuit = [prefs objectForKey:@"PromptOnQuit"]?[[prefs objectForKey:@"PromptOnQuit"] boolValue]: YES;
defaultPromptOnClose = [prefs objectForKey:@"PromptOnClose"]?[[prefs objectForKey:@"PromptOnClose"] boolValue]: YES;
defaultOnlyWhenMoreTabs = [prefs objectForKey:@"OnlyWhenMoreTabs"]?[[prefs objectForKey:@"OnlyWhenMoreTabs"] boolValue]: YES; defaultOnlyWhenMoreTabs = [prefs objectForKey:@"OnlyWhenMoreTabs"]?[[prefs objectForKey:@"OnlyWhenMoreTabs"] boolValue]: YES;
defaultFocusFollowsMouse = [prefs objectForKey:@"FocusFollowsMouse"]?[[prefs objectForKey:@"FocusFollowsMouse"] boolValue]: NO; defaultFocusFollowsMouse = [prefs objectForKey:@"FocusFollowsMouse"]?[[prefs objectForKey:@"FocusFollowsMouse"] boolValue]: NO;
defaultHotkeyTogglesWindow = [prefs objectForKey:@"HotKeyTogglesWindow"]?[[prefs objectForKey:@"HotKeyTogglesWindow"] boolValue]: NO; defaultHotkeyTogglesWindow = [prefs objectForKey:@"HotKeyTogglesWindow"]?[[prefs objectForKey:@"HotKeyTogglesWindow"] boolValue]: NO;
Loading
@@ -1036,29 +1035,6 @@ static float versionNumber;
Loading
@@ -1036,29 +1035,6 @@ static float versionNumber;
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"SUFeedURLForFinal"]; [[NSBundle mainBundle] objectForInfoDictionaryKey:@"SUFeedURLForFinal"];
[prefs setObject:appCast forKey:@"SUFeedURL"]; [prefs setObject:appCast forKey:@"SUFeedURL"];
   
if ([[prefs objectForKey:@"DeleteSendsCtrlH"] boolValue]) {
// Migrate legacy global "delete sends ^h setting" to each bookmark's
// keymap. We change the array while looping over it, but only in a
// safe way--modifying the pointer of an item we'll never look at again.
// To avoid bogus errors, we enumerate it manually.
// The legacy setting existed only around Alpha 17.
NSArray* bookmarks = [[BookmarkModel sharedInstance] bookmarks];
for (int i = 0; i < [bookmarks count]; i++) {
Bookmark* bookmark = [bookmarks objectAtIndex:i];
NSString* text;
if ([iTermKeyBindingMgr localActionForKeyCode:0x7f
modifiers:0
text:&text
keyMappings:[bookmark objectForKey:KEY_KEYBOARD_MAP]] == -1) {
// Bookmark does not map delete key at all. Add a ^H map.
NSMutableDictionary* temp = [NSMutableDictionary dictionaryWithDictionary:bookmark];
[self _setDeleteKeyMapToCtrlH:YES inBookmark:temp];
[[BookmarkModel sharedInstance] setBookmark:temp atIndex:i];
}
}
[prefs removeObjectForKey:@"DeleteSendsCtrlH"];
}
// Migrate old-style (iTerm 0.x) URL handlers. // Migrate old-style (iTerm 0.x) URL handlers.
// make sure bookmarks are loaded // make sure bookmarks are loaded
[ITAddressBookMgr sharedInstance]; [ITAddressBookMgr sharedInstance];
Loading
@@ -1113,7 +1089,6 @@ static float versionNumber;
Loading
@@ -1113,7 +1089,6 @@ static float versionNumber;
[prefs setInteger:defaultWindowStyle forKey:@"WindowStyle"]; [prefs setInteger:defaultWindowStyle forKey:@"WindowStyle"];
[prefs setInteger:defaultTabViewType forKey:@"TabViewType"]; [prefs setInteger:defaultTabViewType forKey:@"TabViewType"];
[prefs setBool:defaultPromptOnQuit forKey:@"PromptOnQuit"]; [prefs setBool:defaultPromptOnQuit forKey:@"PromptOnQuit"];
[prefs setBool:defaultPromptOnClose forKey:@"PromptOnClose"];
[prefs setBool:defaultOnlyWhenMoreTabs forKey:@"OnlyWhenMoreTabs"]; [prefs setBool:defaultOnlyWhenMoreTabs forKey:@"OnlyWhenMoreTabs"];
[prefs setBool:defaultFocusFollowsMouse forKey:@"FocusFollowsMouse"]; [prefs setBool:defaultFocusFollowsMouse forKey:@"FocusFollowsMouse"];
[prefs setBool:defaultHotkeyTogglesWindow forKey:@"HotKeyTogglesWindow"]; [prefs setBool:defaultHotkeyTogglesWindow forKey:@"HotKeyTogglesWindow"];
Loading
@@ -1196,10 +1171,8 @@ static float versionNumber;
Loading
@@ -1196,10 +1171,8 @@ static float versionNumber;
[selectionCopiesText setState:defaultCopySelection?NSOnState:NSOffState]; [selectionCopiesText setState:defaultCopySelection?NSOnState:NSOffState];
[middleButtonPastesFromClipboard setState:defaultPasteFromClipboard?NSOnState:NSOffState]; [middleButtonPastesFromClipboard setState:defaultPasteFromClipboard?NSOnState:NSOffState];
[hideTab setState:defaultHideTab?NSOnState:NSOffState]; [hideTab setState:defaultHideTab?NSOnState:NSOffState];
[promptOnClose setState:defaultPromptOnClose?NSOnState:NSOffState];
[promptOnQuit setState:defaultPromptOnQuit?NSOnState:NSOffState]; [promptOnQuit setState:defaultPromptOnQuit?NSOnState:NSOffState];
[onlyWhenMoreTabs setState:defaultOnlyWhenMoreTabs?NSOnState:NSOffState]; [onlyWhenMoreTabs setState:defaultOnlyWhenMoreTabs?NSOnState:NSOffState];
[onlyWhenMoreTabs setEnabled: defaultPromptOnClose];
[focusFollowsMouse setState: defaultFocusFollowsMouse?NSOnState:NSOffState]; [focusFollowsMouse setState: defaultFocusFollowsMouse?NSOnState:NSOffState];
[hotkeyTogglesWindow setState: defaultHotkeyTogglesWindow?NSOnState:NSOffState]; [hotkeyTogglesWindow setState: defaultHotkeyTogglesWindow?NSOnState:NSOffState];
[self _populateHotKeyBookmarksMenu]; [self _populateHotKeyBookmarksMenu];
Loading
@@ -1467,10 +1440,8 @@ static float versionNumber;
Loading
@@ -1467,10 +1440,8 @@ static float versionNumber;
defaultFsTabDelay = [fsTabDelay floatValue]; defaultFsTabDelay = [fsTabDelay floatValue];
defaultCopySelection=([selectionCopiesText state]==NSOnState); defaultCopySelection=([selectionCopiesText state]==NSOnState);
defaultPasteFromClipboard=([middleButtonPastesFromClipboard state]==NSOnState); defaultPasteFromClipboard=([middleButtonPastesFromClipboard state]==NSOnState);
defaultPromptOnClose = ([promptOnClose state] == NSOnState);
defaultPromptOnQuit = ([promptOnQuit state] == NSOnState); defaultPromptOnQuit = ([promptOnQuit state] == NSOnState);
defaultOnlyWhenMoreTabs = ([onlyWhenMoreTabs state] == NSOnState); defaultOnlyWhenMoreTabs = ([onlyWhenMoreTabs state] == NSOnState);
[onlyWhenMoreTabs setEnabled: defaultPromptOnClose];
defaultFocusFollowsMouse = ([focusFollowsMouse state] == NSOnState); defaultFocusFollowsMouse = ([focusFollowsMouse state] == NSOnState);
defaultHotkeyTogglesWindow = ([hotkeyTogglesWindow state] == NSOnState); defaultHotkeyTogglesWindow = ([hotkeyTogglesWindow state] == NSOnState);
[defaultHotKeyBookmarkGuid release]; [defaultHotKeyBookmarkGuid release];
Loading
@@ -1626,11 +1597,6 @@ static float versionNumber;
Loading
@@ -1626,11 +1597,6 @@ static float versionNumber;
return defaultWindowStyle; return defaultWindowStyle;
} }
   
- (BOOL)promptOnClose
{
return defaultPromptOnClose;
}
- (BOOL)promptOnQuit - (BOOL)promptOnQuit
{ {
return defaultPromptOnQuit; return defaultPromptOnQuit;
Loading
@@ -1960,6 +1926,11 @@ static float versionNumber;
Loading
@@ -1960,6 +1926,11 @@ static float versionNumber;
return remotePrefs; return remotePrefs;
} }
   
+ (BOOL)loadingPrefsFromCustomFolder
{
return [[NSUserDefaults standardUserDefaults] objectForKey:@"LoadPrefsFromCustomFolder"] ? [[[NSUserDefaults standardUserDefaults] objectForKey:@"LoadPrefsFromCustomFolder"] boolValue] : NO;
}
- (BOOL)loadPrefs - (BOOL)loadPrefs
{ {
static BOOL done; static BOOL done;
Loading
@@ -1968,7 +1939,7 @@ static float versionNumber;
Loading
@@ -1968,7 +1939,7 @@ static float versionNumber;
} }
done = YES; done = YES;
   
BOOL doLoad = [prefs objectForKey:@"LoadPrefsFromCustomFolder"] ? [[prefs objectForKey:@"LoadPrefsFromCustomFolder"] boolValue] : NO; BOOL doLoad = [PreferencePanel loadingPrefsFromCustomFolder];
if (!doLoad) { if (!doLoad) {
return YES; return YES;
} }
Loading
@@ -2152,6 +2123,14 @@ static float versionNumber;
Loading
@@ -2152,6 +2123,14 @@ static float versionNumber;
return [iTermKeyBindingMgr numberOfMappingsForBookmark:bookmark]; return [iTermKeyBindingMgr numberOfMappingsForBookmark:bookmark];
} else if (aTableView == globalKeyMappings) { } else if (aTableView == globalKeyMappings) {
return [[iTermKeyBindingMgr globalKeyMap] count]; return [[iTermKeyBindingMgr globalKeyMap] count];
} else if (aTableView == jobsTable_) {
NSString* guid = [bookmarksTableView selectedGuid];
if (!guid) {
return 0;
}
Bookmark* bookmark = [dataSource bookmarkWithGuid:guid];
NSArray *jobNames = [bookmark objectForKey:KEY_JOBS];
return [jobNames count];
} }
// We can only get here while loading the nib (on some machines, this function is called // We can only get here while loading the nib (on some machines, this function is called
// before the IBOutlets are populated). // before the IBOutlets are populated).
Loading
@@ -2201,6 +2180,21 @@ static float versionNumber;
Loading
@@ -2201,6 +2180,21 @@ static float versionNumber;
[keyMappings reloadData]; [keyMappings reloadData];
} }
   
- (void)tableView:(NSTableView *)aTableView
setObjectValue:(id)anObject
forTableColumn:(NSTableColumn *)aTableColumn
row:(NSInteger)rowIndex
{
if (aTableView == jobsTable_) {
NSString* guid = [bookmarksTableView selectedGuid];
Bookmark* bookmark = [dataSource bookmarkWithGuid:guid];
NSMutableArray *jobs = [NSMutableArray arrayWithArray:[bookmark objectForKey:KEY_JOBS]];
[jobs replaceObjectAtIndex:rowIndex withObject:anObject];
[dataSource setObject:jobs forKey:KEY_JOBS inBookmark:bookmark];
}
[self bookmarkSettingChanged:nil];
}
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex
{ {
if (aTableView == keyMappings) { if (aTableView == keyMappings) {
Loading
@@ -2220,6 +2214,10 @@ static float versionNumber;
Loading
@@ -2220,6 +2214,10 @@ static float versionNumber;
} else if (aTableColumn == globalActionColumn) { } else if (aTableColumn == globalActionColumn) {
return [iTermKeyBindingMgr formatAction:[iTermKeyBindingMgr globalMappingAtIndex:rowIndex]]; return [iTermKeyBindingMgr formatAction:[iTermKeyBindingMgr globalMappingAtIndex:rowIndex]];
} }
} else if (aTableView == jobsTable_) {
NSString* guid = [bookmarksTableView selectedGuid];
Bookmark* bookmark = [dataSource bookmarkWithGuid:guid];
return [[bookmark objectForKey:KEY_JOBS] objectAtIndex:rowIndex];
} }
// Shouldn't get here but must return something to avoid a warning. // Shouldn't get here but must return something to avoid a warning.
return nil; return nil;
Loading
@@ -2565,6 +2563,9 @@ static float versionNumber;
Loading
@@ -2565,6 +2563,9 @@ static float versionNumber;
BOOL sendCH = [self _deleteSendsCtrlHInBookmark:dict]; BOOL sendCH = [self _deleteSendsCtrlHInBookmark:dict];
[deleteSendsCtrlHButton setState:sendCH ? NSOnState : NSOffState]; [deleteSendsCtrlHButton setState:sendCH ? NSOnState : NSOffState];
   
// Session tab
[promptBeforeClosing_ selectCellWithTag:[[dict objectForKey:KEY_PROMPT_CLOSE] intValue]];
// Epilogue // Epilogue
[bookmarksTableView reloadData]; [bookmarksTableView reloadData];
[copyTo reloadData]; [copyTo reloadData];
Loading
@@ -2973,6 +2974,13 @@ static float versionNumber;
Loading
@@ -2973,6 +2974,13 @@ static float versionNumber;
BOOL sendCH = [self _deleteSendsCtrlHInBookmark:newDict]; BOOL sendCH = [self _deleteSendsCtrlHInBookmark:newDict];
[deleteSendsCtrlHButton setState:sendCH ? NSOnState : NSOffState]; [deleteSendsCtrlHButton setState:sendCH ? NSOnState : NSOffState];
} }
// Session tab
[newDict setObject:[NSNumber numberWithInt:[[promptBeforeClosing_ selectedCell] tag]]
forKey:KEY_PROMPT_CLOSE];
[newDict setObject:[origBookmark objectForKey:KEY_JOBS] ? [origBookmark objectForKey:KEY_JOBS] : [NSArray array]
forKey:KEY_JOBS];
// Epilogue // Epilogue
[dataSource setBookmark:newDict withGuid:guid]; [dataSource setBookmark:newDict withGuid:guid];
[bookmarksTableView reloadData]; [bookmarksTableView reloadData];
Loading
@@ -3039,6 +3047,7 @@ static float versionNumber;
Loading
@@ -3039,6 +3047,7 @@ static float versionNumber;
[self updateBookmarkFields:[dataSource bookmarkWithGuid:guid]]; [self updateBookmarkFields:[dataSource bookmarkWithGuid:guid]];
} }
} }
[self setHaveJobsForCurrentBookmark:[self haveJobsForCurrentBookmark]];
} }
   
- (void)bookmarkTableRowSelected:(id)bookmarkTable - (void)bookmarkTableRowSelected:(id)bookmarkTable
Loading
@@ -3064,9 +3073,64 @@ static float versionNumber;
Loading
@@ -3064,9 +3073,64 @@ static float versionNumber;
} else { } else {
[globalRemoveMappingButton setEnabled:NO]; [globalRemoveMappingButton setEnabled:NO];
} }
} else if ([aNotification object] == jobsTable_) {
[self setHaveJobsForCurrentBookmark:[self haveJobsForCurrentBookmark]];
} }
} }
   
- (IBAction)addJob:(id)sender
{
NSString* guid = [bookmarksTableView selectedGuid];
if (!guid) {
return;
}
Bookmark* bookmark = [dataSource bookmarkWithGuid:guid];
NSArray *jobNames = [bookmark objectForKey:KEY_JOBS];
NSMutableArray *augmented;
if (jobNames) {
augmented = [NSMutableArray arrayWithArray:jobNames];
[augmented addObject:@"Job Name"];
} else {
augmented = [NSArray arrayWithObject:@"Job Name"];
}
[dataSource setObject:augmented forKey:KEY_JOBS inBookmark:bookmark];
[jobsTable_ reloadData];
[jobsTable_ selectRowIndexes:[NSIndexSet indexSetWithIndex:[augmented count] - 1]
byExtendingSelection:NO];
[jobsTable_ editColumn:0
row:[self numberOfRowsInTableView:jobsTable_] - 1
withEvent:nil
select:YES];
[self setHaveJobsForCurrentBookmark:[self haveJobsForCurrentBookmark]];
[self bookmarkSettingChanged:nil];
}
- (IBAction)removeJob:(id)sender
{
// Causes editing to end. If you try to remove a cell that is being edited,
// it tries to dereference the deleted cell. There doesn't seem to be an
// API that explicitly ends editing.
[jobsTable_ reloadData];
NSInteger selectedIndex = [jobsTable_ selectedRow];
if (selectedIndex < 0) {
return;
}
NSString* guid = [bookmarksTableView selectedGuid];
if (!guid) {
return;
}
Bookmark* bookmark = [dataSource bookmarkWithGuid:guid];
NSArray *jobNames = [bookmark objectForKey:KEY_JOBS];
NSMutableArray *mod = [NSMutableArray arrayWithArray:jobNames];
[mod removeObjectAtIndex:selectedIndex];
[dataSource setObject:mod forKey:KEY_JOBS inBookmark:bookmark];
[jobsTable_ reloadData];
[self setHaveJobsForCurrentBookmark:[self haveJobsForCurrentBookmark]];
[self bookmarkSettingChanged:nil];
}
- (IBAction)showGlobalTabView:(id)sender - (IBAction)showGlobalTabView:(id)sender
{ {
[tabView selectTabViewItem:globalTabViewItem]; [tabView selectTabViewItem:globalTabViewItem];
Loading
@@ -3815,3 +3879,28 @@ static float versionNumber;
Loading
@@ -3815,3 +3879,28 @@ static float versionNumber;
} }
   
@end @end
@implementation PreferencePanel (KeyValueCoding)
// An experiment with cocoa bindings. This is bound to the "enabled" status of
// the "remove job" button.
- (BOOL)haveJobsForCurrentBookmark
{
if ([jobsTable_ selectedRow] < 0) {
return NO;
}
NSString* guid = [bookmarksTableView selectedGuid];
if (!guid) {
return NO;
}
Bookmark* bookmark = [dataSource bookmarkWithGuid:guid];
NSArray *jobNames = [bookmark objectForKey:KEY_JOBS];
return [jobNames count] > 0;
}
- (void)setHaveJobsForCurrentBookmark:(BOOL)value
{
// observed but has no effect because the getter does all the computation.
}
@end
Loading
@@ -527,13 +527,42 @@ NSString *sessionsKey = @"sessions";
Loading
@@ -527,13 +527,42 @@ NSString *sessionsKey = @"sessions";
return windowType_; return windowType_;
} }
   
- (void)closeTab:(PTYTab*)aTab - (BOOL)confirmCloseForSessions:(NSArray *)sessions
{ identifier:(NSString*)identifier
NSTabViewItem *aTabViewItem; genericName:(NSString *)genericName
int numberOfTabs; {
NSMutableArray *names = [NSMutableArray array];
for (PTYSession *aSession in sessions) {
if (![aSession exited]) {
[names addObjectsFromArray:[aSession childJobNames]];
}
}
NSString *message;
NSArray *sortedNames = [names sortedArrayUsingSelector:@selector(compare:)];
if ([sortedNames count] == 1) {
message = [NSString stringWithFormat:@"%@ is running \"%@\".", identifier, [sortedNames objectAtIndex:0]];
} else if ([sortedNames count] > 1 && [sortedNames count] <= 10) {
message = [NSString stringWithFormat:@"%@ is running the following jobs: %@.", identifier, [sortedNames componentsJoinedByString:@", "]];
} else if ([sortedNames count] > 10) {
message = [NSString stringWithFormat:@"%@ is running the following jobs: %@, plus %d %@.",
identifier,
[[sortedNames subarrayWithRange:NSMakeRange(0, 10)] componentsJoinedByString:@", "],
[sortedNames count] - 10,
[sortedNames count] == 11 ? @"other" : @"others"];
} else {
message = [NSString stringWithFormat:@"%@ will be closed.", identifier];
}
return NSRunAlertPanel([NSString stringWithFormat:@"Close %@?", genericName],
message,
@"OK",
@"Cancel",
nil) == NSAlertDefaultReturn;
}
   
- (BOOL)confirmCloseTab:(PTYTab *)aTab
{
if ([TABVIEW indexOfTabViewItemWithIdentifier:aTab] == NSNotFound) { if ([TABVIEW indexOfTabViewItemWithIdentifier:aTab] == NSNotFound) {
return; return NO;
} }
   
int numClosing = 0; int numClosing = 0;
Loading
@@ -544,70 +573,37 @@ NSString *sessionsKey = @"sessions";
Loading
@@ -544,70 +573,37 @@ NSString *sessionsKey = @"sessions";
} }
   
BOOL mustAsk = NO; BOOL mustAsk = NO;
if (numClosing > 0 && [[PreferencePanel sharedInstance] promptOnClose]) { if (numClosing > 0 && [aTab promptOnClose]) {
if (numClosing == 1) { mustAsk = YES;
if (![[PreferencePanel sharedInstance] onlyWhenMoreTabs]) { }
mustAsk = YES; if (numClosing > 1 &&
} [[PreferencePanel sharedInstance] onlyWhenMoreTabs]) {
} else { mustAsk = YES;
mustAsk = YES;
}
} }
   
if (mustAsk) { if (mustAsk) {
BOOL okToClose; BOOL okToClose;
if (numClosing == 1) { if (numClosing == 1) {
int skip = 0; okToClose = [self confirmCloseForSessions:[aTab sessions]
pid_t thePid = [[[aTab activeSession] SHELL] pid]; identifier:@"This tab"
if ([[[ProcessCache sharedInstance] getNameOfPid:thePid isForeground:nil] isEqualToString:@"login"]) { genericName:[NSString stringWithFormat:@"tab #%d",
skip = 1; [aTab realObjectCount]]];
}
NSMutableArray *names = [NSMutableArray array];
for (NSNumber *n in [[ProcessCache sharedInstance] childrenOfPid:thePid levelsToSkip:skip]) {
pid_t pid = [n intValue];
NSDictionary *info = [[ProcessCache sharedInstance] dictionaryOfTaskInfoForPid:pid];
[names addObject:[info objectForKey:PID_INFO_NAME]];
}
NSString *message;
NSArray *sortedNames = [names sortedArrayUsingSelector:@selector(compare:)];
if ([sortedNames count] == 1) {
message = [NSString stringWithFormat:@"This tab is running \"%@\". Close it?", [sortedNames objectAtIndex:0]];
} else if ([sortedNames count] > 1) {
message = [NSString stringWithFormat:@"This tab is running the following jobs: %@. Close it?", [sortedNames componentsJoinedByString:@", "]];
} else {
message = @"This tab will be closed.";
}
okToClose = NSRunAlertPanel([NSString stringWithFormat:@"%@ #%d",
[[aTab activeSession] name],
[aTab realObjectCount]],
message,
@"OK",
@"Cancel",
nil) == NSAlertDefaultReturn;
} else { } else {
okToClose = NSRunAlertPanel([NSString stringWithFormat:@"Close multiple panes in tab #%d", okToClose = [self confirmCloseForSessions:[aTab sessions]
[aTab realObjectCount]], identifier:@"This multi-pane tab"
[NSString stringWithFormat: genericName:[NSString stringWithFormat:@"tab #%d",
NSLocalizedStringFromTableInBundle(@"%d sessions will be closed.", [aTab realObjectCount]]];
@"iTerm",
[NSBundle bundleForClass:[self class]],
@"Close Session"), numClosing],
NSLocalizedStringFromTableInBundle(@"OK",
@"iTerm",
[NSBundle bundleForClass:[self class]],
@"OK"),
NSLocalizedStringFromTableInBundle(@"Cancel",
@"iTerm",
[NSBundle bundleForClass:[self class]],
@"Cancel"),
nil) == NSAlertDefaultReturn;
}
if (!okToClose) {
return;
} }
return okToClose;
} }
return YES;
}
   
numberOfTabs = [TABVIEW numberOfTabViewItems]; - (void)closeTab:(PTYTab*)aTab
{
NSTabViewItem *aTabViewItem;
int numberOfTabs = [TABVIEW numberOfTabViewItems];
for (PTYSession* session in [aTab sessions]) { for (PTYSession* session in [aTab sessions]) {
[session terminate]; [session terminate];
} }
Loading
@@ -658,7 +654,9 @@ NSString *sessionsKey = @"sessions";
Loading
@@ -658,7 +654,9 @@ NSString *sessionsKey = @"sessions";
   
- (IBAction)closeCurrentTab:(id)sender - (IBAction)closeCurrentTab:(id)sender
{ {
[self closeTab:[self currentTab]]; if ([self tabView:TABVIEW shouldCloseTabViewItem:[TABVIEW selectedTabViewItem]]) {
[self closeTab:[self currentTab]];
}
} }
   
- (IBAction)closeCurrentSession:(id)sender - (IBAction)closeCurrentSession:(id)sender
Loading
@@ -675,10 +673,12 @@ NSString *sessionsKey = @"sessions";
Loading
@@ -675,10 +673,12 @@ NSString *sessionsKey = @"sessions";
[self closeCurrentTab:self]; [self closeCurrentTab:self];
return; return;
} }
if ([aSession exited] || BOOL okToClose = NO;
![[PreferencePanel sharedInstance] promptOnClose] || if ([aSession exited]) {
[[PreferencePanel sharedInstance] onlyWhenMoreTabs] || okToClose = YES;
(NSRunAlertPanel([NSString stringWithFormat:@"%@ #%d", } else if (![aSession promptOnClose]) {
okToClose = YES;
} else if (NSRunAlertPanel([NSString stringWithFormat:@"%@ #%d",
[aSession name], [aSession name],
[[aSession tab] realObjectCount]], [[aSession tab] realObjectCount]],
NSLocalizedStringFromTableInBundle(@"This session will be closed.", NSLocalizedStringFromTableInBundle(@"This session will be closed.",
Loading
@@ -693,7 +693,10 @@ NSString *sessionsKey = @"sessions";
Loading
@@ -693,7 +693,10 @@ NSString *sessionsKey = @"sessions";
@"iTerm", @"iTerm",
[NSBundle bundleForClass:[self class]], [NSBundle bundleForClass:[self class]],
@"Cancel"), @"Cancel"),
nil) == NSAlertDefaultReturn)) { nil) == NSAlertDefaultReturn) {
okToClose = YES;
}
if (okToClose) {
// Just in case IR is open, close it first. // Just in case IR is open, close it first.
[self closeInstantReplay:self]; [self closeInstantReplay:self];
[self closeSession:aSession]; [self closeSession:aSession];
Loading
@@ -1128,16 +1131,39 @@ NSString *sessionsKey = @"sessions";
Loading
@@ -1128,16 +1131,39 @@ NSString *sessionsKey = @"sessions";
userInfo:nil]; userInfo:nil];
} }
   
- (BOOL)promptOnClose
{
for (PTYSession *aSession in [self sessions]) {
if ([aSession promptOnClose]) {
return YES;
}
}
return NO;
}
- (int)numRunningSessions
{
int n = 0;
for (PTYSession *aSession in [self sessions]) {
if (![aSession exited]) {
++n;
}
}
return n;
}
- (BOOL)windowShouldClose:(NSNotification *)aNotification - (BOOL)windowShouldClose:(NSNotification *)aNotification
{ {
#if DEBUG_METHOD_TRACE BOOL needPrompt = NO;
NSLog(@"%s(%d):-[PseudoTerminal windowShouldClose:%@]", if ([self promptOnClose]) {
__FILE__, __LINE__, aNotification); needPrompt = YES;
#endif }
if ([[PreferencePanel sharedInstance] onlyWhenMoreTabs] &&
[self numRunningSessions] > 1) {
needPrompt = YES;
}
   
if ([[PreferencePanel sharedInstance] promptOnClose] && if (needPrompt) {
(![[PreferencePanel sharedInstance] onlyWhenMoreTabs] ||
[TABVIEW numberOfTabViewItems] > 1)) {
return [self showCloseWindow]; return [self showCloseWindow];
} else { } else {
return YES; return YES;
Loading
@@ -1146,11 +1172,6 @@ NSString *sessionsKey = @"sessions";
Loading
@@ -1146,11 +1172,6 @@ NSString *sessionsKey = @"sessions";
   
- (void)windowWillClose:(NSNotification *)aNotification - (void)windowWillClose:(NSNotification *)aNotification
{ {
#if DEBUG_METHOD_TRACE
NSLog(@"%s(%d):-[PseudoTerminal windowWillClose:%@]",
__FILE__, __LINE__, aNotification);
#endif
// Close popups. // Close popups.
[pbHistoryView close]; [pbHistoryView close];
[autocompleteView close]; [autocompleteView close];
Loading
@@ -1217,7 +1238,7 @@ NSString *sessionsKey = @"sessions";
Loading
@@ -1217,7 +1238,7 @@ NSString *sessionsKey = @"sessions";
- (void)windowDidBecomeKey:(NSNotification *)aNotification - (void)windowDidBecomeKey:(NSNotification *)aNotification
{ {
isOrderedOut_ = NO; isOrderedOut_ = NO;
#if DEBUG_METHOD_TRACE #if DEBUG_METHOD_TRACE
NSLog(@"%s(%d):-[PseudoTerminal windowDidBecomeKey:%@]", NSLog(@"%s(%d):-[PseudoTerminal windowDidBecomeKey:%@]",
__FILE__, __LINE__, aNotification); __FILE__, __LINE__, aNotification);
Loading
@@ -2106,27 +2127,7 @@ NSString *sessionsKey = @"sessions";
Loading
@@ -2106,27 +2127,7 @@ NSString *sessionsKey = @"sessions";
- (BOOL)tabView:(NSTabView*)tabView shouldCloseTabViewItem:(NSTabViewItem *)tabViewItem - (BOOL)tabView:(NSTabView*)tabView shouldCloseTabViewItem:(NSTabViewItem *)tabViewItem
{ {
PTYTab *aTab = [tabViewItem identifier]; PTYTab *aTab = [tabViewItem identifier];
return [self confirmCloseTab:aTab];
return ([aTab allSessionsExited] ||
![[PreferencePanel sharedInstance] promptOnClose] ||
[[PreferencePanel sharedInstance] onlyWhenMoreTabs] ||
(NSRunAlertPanel([NSString stringWithFormat:@"%@ #%d",
[[aTab activeSession] name],
[[[aTab activeSession] tab] realObjectCount]],
NSLocalizedStringFromTableInBundle(@"This session will be closed.",
@"iTerm",
[NSBundle bundleForClass:[self class]],
@"Close Session"),
NSLocalizedStringFromTableInBundle(@"OK",
@"iTerm",
[NSBundle bundleForClass:[self class]],
@"OK"),
NSLocalizedStringFromTableInBundle(@"Cancel",
@"iTerm",
[NSBundle bundleForClass:[self class]],
@"Cancel"),
nil) == NSAlertDefaultReturn));
} }
   
- (BOOL)tabView:(NSTabView*)aTabView shouldDragTabViewItem:(NSTabViewItem *)tabViewItem fromTabBar:(PSMTabBarControl *)tabBarControl - (BOOL)tabView:(NSTabView*)aTabView shouldDragTabViewItem:(NSTabViewItem *)tabViewItem fromTabBar:(PSMTabBarControl *)tabBarControl
Loading
@@ -2385,7 +2386,7 @@ NSString *sessionsKey = @"sessions";
Loading
@@ -2385,7 +2386,7 @@ NSString *sessionsKey = @"sessions";
[[term window] makeKeyAndOrderFront:nil]; [[term window] makeKeyAndOrderFront:nil];
[term hideMenuBar]; [term hideMenuBar];
} }
return [term tabBarControl]; return [term tabBarControl];
} }
   
Loading
@@ -2650,7 +2651,7 @@ NSString *sessionsKey = @"sessions";
Loading
@@ -2650,7 +2651,7 @@ NSString *sessionsKey = @"sessions";
   
- (BOOL)sendInputToAllSessions - (BOOL)sendInputToAllSessions
{ {
return broadcastMode_ != BROADCAST_OFF; return broadcastMode_ != BROADCAST_OFF;
} }
   
-(void)replaySession:(PTYSession *)oldSession -(void)replaySession:(PTYSession *)oldSession
Loading
@@ -4316,15 +4317,9 @@ NSString *sessionsKey = @"sessions";
Loading
@@ -4316,15 +4317,9 @@ NSString *sessionsKey = @"sessions";
// Close Window // Close Window
- (BOOL)showCloseWindow - (BOOL)showCloseWindow
{ {
#if DEBUG_METHOD_TRACE return ([self confirmCloseForSessions:[self sessions]
NSLog(@"%s(%d):-[PseudoTerminal showCloseWindow]", __FILE__, __LINE__); identifier:@"This window"
#endif genericName:[NSString stringWithFormat:@"Window #%d", number_+1]]);
return (NSRunAlertPanel(NSLocalizedStringFromTableInBundle(@"Close Window?",@"iTerm", [NSBundle bundleForClass: [self class]], @"Close window"),
NSLocalizedStringFromTableInBundle(@"All sessions will be closed",@"iTerm", [NSBundle bundleForClass: [self class]], @"Close window"),
NSLocalizedStringFromTableInBundle(@"OK",@"iTerm", [NSBundle bundleForClass: [self class]], @"OK"),
NSLocalizedStringFromTableInBundle(@"Cancel",@"iTerm", [NSBundle bundleForClass: [self class]], @"Cancel")
,nil) == NSAlertDefaultReturn);
} }
   
- (PSMTabBarControl*)tabBarControl - (PSMTabBarControl*)tabBarControl
Loading
@@ -4515,7 +4510,7 @@ NSString *sessionsKey = @"sessions";
Loading
@@ -4515,7 +4510,7 @@ NSString *sessionsKey = @"sessions";
{ {
[[NSNotificationCenter defaultCenter] postNotificationName:@"iTermLoadFindStringFromSharedPasteboard" [[NSNotificationCenter defaultCenter] postNotificationName:@"iTermLoadFindStringFromSharedPasteboard"
object:nil object:nil
userInfo:nil]; userInfo:nil];
} }
   
@end @end
Loading
@@ -4914,7 +4909,7 @@ NSString *sessionsKey = @"sessions";
Loading
@@ -4914,7 +4909,7 @@ NSString *sessionsKey = @"sessions";
// TODO: this should work with fullscreen // TODO: this should work with fullscreen
} }
[iTermController switchToSpaceInBookmark:abEntry]; [iTermController switchToSpaceInBookmark:abEntry];
[self initWithSmartLayout:NO [self initWithSmartLayout:NO
windowType:windowType windowType:windowType
screen:-1]; screen:-1];
toggle = ([self windowType] == WINDOW_TYPE_FULL_SCREEN) || toggle = ([self windowType] == WINDOW_TYPE_FULL_SCREEN) ||
Loading
Loading
Loading
@@ -261,27 +261,30 @@ static BOOL hasBecomeActive = NO;
Loading
@@ -261,27 +261,30 @@ static BOOL hasBecomeActive = NO;
NSArray *terminals; NSArray *terminals;
   
terminals = [[iTermController sharedInstance] terminals]; terminals = [[iTermController sharedInstance] terminals];
int numSessions = 0;
BOOL shouldShowAlert = NO;
for (PseudoTerminal *term in terminals) {
numSessions += [[term sessions] count];
if ([term promptOnClose]) {
shouldShowAlert = YES;
}
}
   
// Display prompt if we need to // Display prompt if we need to
if (!quittingBecauseLastWindowClosed_ && // cmd-q
int numTerminals = [terminals count]; [terminals count] > 0 && // there are terminal windows
int numNontrivialWindows = numTerminals; [[PreferencePanel sharedInstance] promptOnQuit]) { // preference is to prompt on quit cmd
BOOL promptOnQuit = quittingBecauseLastWindowClosed_ ? NO : (numNontrivialWindows > 0 && [[PreferencePanel sharedInstance] promptOnQuit]); shouldShowAlert = YES;
}
quittingBecauseLastWindowClosed_ = NO; quittingBecauseLastWindowClosed_ = NO;
BOOL promptOnClose = [[PreferencePanel sharedInstance] promptOnClose]; if ([[PreferencePanel sharedInstance] onlyWhenMoreTabs] && numSessions > 1) {
BOOL onlyWhenMoreTabs = [[PreferencePanel sharedInstance] onlyWhenMoreTabs]; // closing multiple sessions
int numTabs = 0; shouldShowAlert = YES;
if (numTerminals > 0) {
numTabs = [[[[iTermController sharedInstance] currentTerminal] tabView] numberOfTabViewItems];
} }
BOOL shouldShowAlert = (!onlyWhenMoreTabs ||
numTerminals > 1 || if (shouldShowAlert) {
numTabs > 1);
if (promptOnQuit || (promptOnClose &&
numTerminals &&
shouldShowAlert)) {
BOOL stayput = NSRunAlertPanel(@"Quit iTerm2?", BOOL stayput = NSRunAlertPanel(@"Quit iTerm2?",
@"All sessions will be closed", @"All sessions will be closed.",
@"OK", @"OK",
@"Cancel", @"Cancel",
nil) != NSAlertDefaultReturn; nil) != NSAlertDefaultReturn;
Loading
@@ -307,8 +310,17 @@ static BOOL hasBecomeActive = NO;
Loading
@@ -307,8 +310,17 @@ static BOOL hasBecomeActive = NO;
nil, nil,
nil); nil);
} else { } else {
NSString *format;
if ([BookmarkModel migrated]) {
format = @"Your preferences were modified by iTerm2 as part of an upgrade process (and you might have changed them, too). "
@"Since you load prefs from a custom location, your local preferences will be lost if not copied to %@.";
} else {
format = @"Your preferences are loaded from a custom location and differ from your local preferences."
@"Your local preferences will be lost if not copied to %@.";
}
switch (NSRunAlertPanel(@"Preference Changes Will be Lost!", switch (NSRunAlertPanel(@"Preference Changes Will be Lost!",
[NSString stringWithFormat:@"Your preferences are loaded from a custom location and differ from your local preferences. Your local preferences will be lost if not copied to %@.", remote], [NSString stringWithFormat:format,
remote],
@"Copy", @"Copy",
@"Lose Changes", @"Lose Changes",
nil)) { nil)) {
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment