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

Use marks instead of line numbers for captured output locations. Generalize...

Use marks instead of line numbers for captured output locations. Generalize marks to an iTermMark base class and protocol.
parent 04d97b36
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -9,13 +9,14 @@
#import "Trigger.h"
 
@class CaptureTrigger;
@class iTermCapturedOutputMark;
 
@interface CapturedOutput : NSObject
@property(nonatomic, copy) NSString *line;
@property(nonatomic, copy) NSArray *values;
@property(nonatomic, retain) CaptureTrigger *trigger;
@property(nonatomic, assign) long long absoluteLineNumber;
@property(nonatomic, assign) BOOL state; // user-defined state
@property(nonatomic, retain) iTermCapturedOutputMark *mark;
@end
 
@interface CaptureTrigger : Trigger
Loading
Loading
Loading
Loading
@@ -12,6 +12,7 @@
#import "iTermApplicationDelegate.h"
#import "PTYSession.h"
#import "ToolbeltView.h"
#import "VT100ScreenMark.h"
 
// This one cannot be suppressed.
static NSString *const kTwoCoprocessesCanNotRunAtOnceAnnouncmentIdentifier =
Loading
Loading
@@ -27,6 +28,7 @@ static NSString *const kSuppressCaptureOutputToolNotVisibleWarning =
- (void)dealloc {
[_values release];
[_trigger release];
[_mark release];
[super dealloc];
}
 
Loading
Loading
@@ -79,7 +81,7 @@ static NSString *const kSuppressCaptureOutputToolNotVisibleWarning =
output.line = string;
output.trigger = self;
output.values = values;
output.absoluteLineNumber = absoluteLineNumber;
output.mark = [aSession markAddedAtCursorOfClass:[iTermCapturedOutputMark class]];
[aSession addCapturedOutput:output];
return NO;
}
Loading
Loading
Loading
Loading
@@ -434,10 +434,8 @@ typedef enum {
- (void)showHideNotes;
- (void)previousMarkOrNote;
- (void)nextMarkOrNote;
- (void)scrollToMark:(VT100ScreenMark *)mark;
// Scroll to and highlight a line. Basically, a more general version of scrollToMark:.
- (void)highlightAbsoluteLineNumber:(long long)absoluteLineNumber;
- (void)scrollToMark:(id<iTermMark>)mark;
- (id<iTermMark>)markAddedAtCursorOfClass:(Class)theClass;
 
// Select this session and tab and bring window to foreground.
- (void)reveal;
Loading
Loading
Loading
Loading
@@ -3318,7 +3318,7 @@ static long long timeInTenthsOfSeconds(struct timeval t)
}
 
- (void)highlightMarkOrNote:(id<IntervalTreeObject>)obj {
if ([obj isKindOfClass:[VT100ScreenMark class]]) {
if ([obj isKindOfClass:[iTermMark class]]) {
[_textview highlightMarkOnLine:VT100GridRangeMax([_screen lineNumberRangeOfInterval:obj.entry.interval])];
} else {
PTYNoteViewController *note = (PTYNoteViewController *)obj;
Loading
Loading
@@ -3375,15 +3375,7 @@ static long long timeInTenthsOfSeconds(struct timeval t)
}
}
 
- (void)highlightAbsoluteLineNumber:(long long)absoluteLineNumber {
VT100GridRange range = VT100GridRangeMake(absoluteLineNumber - [_screen totalScrollbackOverflow], 1);
if (range.location >= 0 && range.location < [_screen numberOfLines]) {
[_textview scrollLineNumberRangeIntoView:range];
[_textview highlightMarkOnLine:range.location];
}
}
- (void)scrollToMark:(VT100ScreenMark *)mark {
- (void)scrollToMark:(id<iTermMark>)mark {
if ([_screen containsMark:mark]) {
VT100GridRange range = [_screen lineNumberRangeOfInterval:mark.entry.interval];
[_textview scrollLineNumberRangeIntoView:range];
Loading
Loading
@@ -5254,14 +5246,15 @@ static long long timeInTenthsOfSeconds(struct timeval t)
[[self tab] setActiveSession:self];
}
 
- (void)screenAddMarkOnLine:(int)line {
- (id)markAddedAtLine:(int)line ofClass:(Class)markClass {
[_textview refresh]; // In case text was appended
if (_lastMark.command && !_lastMark.endDate) {
_lastMark.endDate = [NSDate date];
}
[_lastMark release];
_lastMark = [[_screen addMarkStartingAtAbsoluteLine:[_screen totalScrollbackOverflow] + line
oneLine:YES] retain];
oneLine:YES
ofClass:markClass] retain];
self.currentMarkOrNotePosition = _lastMark.entry.interval;
if (self.alertOnNextMark) {
if (NSRunAlertPanel(@"Alert",
Loading
Loading
@@ -5274,6 +5267,11 @@ static long long timeInTenthsOfSeconds(struct timeval t)
}
self.alertOnNextMark = NO;
}
return _lastMark;
}
- (void)screenAddMarkOnLine:(int)line {
[self markAddedAtLine:line ofClass:[VT100ScreenMark class]];
}
 
// Save the current scroll position
Loading
Loading
@@ -5282,10 +5280,16 @@ static long long timeInTenthsOfSeconds(struct timeval t)
[_textview refresh]; // In case text was appended
[_lastMark release];
_lastMark = [[_screen addMarkStartingAtAbsoluteLine:[_textview absoluteScrollPosition]
oneLine:NO] retain];
oneLine:NO
ofClass:[VT100ScreenMark class]] retain];
self.currentMarkOrNotePosition = _lastMark.entry.interval;
}
 
- (VT100ScreenMark *)markAddedAtCursorOfClass:(Class)theClass {
return [self markAddedAtLine:[_screen numberOfScrollbackLines] + _screen.cursorY - 1
ofClass:theClass];
}
- (void)screenActivateWindow {
[NSApp activateIgnoringOtherApps:YES];
}
Loading
Loading
Loading
Loading
@@ -244,7 +244,7 @@ static const CGFloat kMargin = 4;
 
if (capturedOutput) {
ToolWrapper *wrapper = (ToolWrapper *)[[self superview] superview];
[[wrapper.term currentSession] highlightAbsoluteLineNumber:capturedOutput.absoluteLineNumber];
[wrapper.term.currentSession scrollToMark:capturedOutput.mark];
}
}
 
Loading
Loading
Loading
Loading
@@ -14,6 +14,7 @@
@class VT100Grid;
@class VT100RemoteHost;
@class VT100ScreenMark;
@protocol iTermMark;
@class VT100Terminal;
 
// Dictionary keys for -highlightTextMatchingRegex:
Loading
Loading
@@ -26,8 +27,7 @@ extern int kVT100ScreenMinRows;
PTYNoteViewControllerDelegate,
PTYTextViewDataSource,
VT100GridDelegate,
VT100TerminalDelegate>
{
VT100TerminalDelegate> {
NSMutableSet* tabStops_;
VT100Terminal *terminal_;
id<VT100ScreenDelegate> delegate_; // PTYSession implements this
Loading
Loading
@@ -204,7 +204,9 @@ extern int kVT100ScreenMinRows;
 
- (VT100ScreenMark *)lastMark;
- (BOOL)markIsValid:(VT100ScreenMark *)mark;
- (VT100ScreenMark *)addMarkStartingAtAbsoluteLine:(long long)line oneLine:(BOOL)oneLine;
- (id<iTermMark>)addMarkStartingAtAbsoluteLine:(long long)line
oneLine:(BOOL)oneLine
ofClass:(Class)markClass;
- (VT100GridRange)lineNumberRangeOfInterval:(Interval *)interval;
 
// These methods normally only return one object, but if there is a tie, all of the equally-positioned marks/notes are returned.
Loading
Loading
@@ -212,7 +214,7 @@ extern int kVT100ScreenMinRows;
- (NSArray *)firstMarksOrNotes;
- (NSArray *)marksOrNotesBefore:(Interval *)location;
- (NSArray *)marksOrNotesAfter:(Interval *)location;
- (BOOL)containsMark:(VT100ScreenMark *)mark;
- (BOOL)containsMark:(id<iTermMark>)mark;
 
- (void)setWorkingDirectory:(NSString *)workingDirectory onLine:(int)line;
- (NSString *)workingDirectoryOnLine:(int)line;
Loading
Loading
Loading
Loading
@@ -1712,8 +1712,10 @@ static NSString *const kInlineFileBase64String = @"base64 string"; // NSMutable
return [intervalTree_ containsObject:mark];
}
 
- (VT100ScreenMark *)addMarkStartingAtAbsoluteLine:(long long)line oneLine:(BOOL)oneLine {
VT100ScreenMark *mark = [[[VT100ScreenMark alloc] init] autorelease];
- (id<iTermMark>)addMarkStartingAtAbsoluteLine:(long long)line
oneLine:(BOOL)oneLine
ofClass:(Class)markClass {
id<iTermMark> mark = [[[markClass alloc] init] autorelease];
mark.sessionID = [delegate_ screenSessionID];
int nonAbsoluteLine = line - [self totalScrollbackOverflow];
VT100GridCoordRange range;
Loading
Loading
@@ -1783,7 +1785,7 @@ static NSString *const kInlineFileBase64String = @"base64 string"; // NSMutable
NSEnumerator *enumerator = [intervalTree_ reverseLimitEnumerator];
NSArray *objects = [enumerator nextObject];
while (objects) {
for (id<IntervalTreeObject> obj in objects) {
for (id obj in objects) {
if ([obj isKindOfClass:[VT100ScreenMark class]]) {
return obj;
}
Loading
Loading
@@ -1841,7 +1843,7 @@ static NSString *const kInlineFileBase64String = @"base64 string"; // NSMutable
return objects;
}
 
- (BOOL)containsMark:(VT100ScreenMark *)mark {
- (BOOL)containsMark:(id<iTermMark>)mark {
for (id obj in [intervalTree_ objectsInInterval:mark.entry.interval]) {
if (obj == mark) {
return YES;
Loading
Loading
Loading
Loading
@@ -11,7 +11,7 @@
 
@class CapturedOutput;
 
@interface VT100ScreenMark : NSObject <IntervalTreeObject>
@protocol iTermMark <NSObject, IntervalTreeObject>
 
// Return code of command on the line for this mark.
@property(nonatomic, assign) int code;
Loading
Loading
@@ -35,3 +35,15 @@
- (void)addCapturedOutput:(CapturedOutput *)capturedOutput;
 
@end
// This is a base class for marks but should never be used directly.
@interface iTermMark : NSObject<iTermMark>
@end
// Visible marks that can be navigated.
@interface VT100ScreenMark : iTermMark
@end
// Invisible marks used for keep track of the location of captured output.
@interface iTermCapturedOutputMark : iTermMark
@end
Loading
Loading
@@ -8,11 +8,17 @@
 
#import "VT100ScreenMark.h"
 
@implementation VT100ScreenMark {
@implementation iTermMark {
NSMutableArray *_capturedOutput;
}
 
@synthesize entry;
@synthesize code = _code;
@synthesize command = _command;
@synthesize sessionID = _sessionID;
@synthesize startDate = _startDate;
@synthesize endDate = _endDate;
@synthesize capturedOutput = _capturedOutput;
 
- (void)dealloc {
[_command release];
Loading
Loading
@@ -41,3 +47,9 @@
}
 
@end
@implementation VT100ScreenMark
@end
@implementation iTermCapturedOutputMark
@end
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