From ccf7fa422ed3899aae22f8b41a325b6a7f399a38 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Sun, 12 Apr 2020 12:54:05 -0400 Subject: [PATCH] Fix unreliable variable expansion after debugger steps. --- CHANGES | 1 + Source/DebuggerController.m | 26 +++++++------------------- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/CHANGES b/CHANGES index deb1db6..f1450eb 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ MacGDBp CHANGE LOG 2.0.2 ##################### - Fix: Crash when selecting stack frames after disconnecting. +- Fix: Expanded variables would not reliably re-open after debugger steps. 2.0.1 ##################### diff --git a/Source/DebuggerController.m b/Source/DebuggerController.m index a34a6b6..6e14057 100644 --- a/Source/DebuggerController.m +++ b/Source/DebuggerController.m @@ -100,6 +100,10 @@ forKeyPath:@"selection.source" options:NSKeyValueObservingOptionNew context:nil]; + [_variablesTreeController addObserver:self + forKeyPath:@"arrangedObjects" + options:NSKeyValueObservingOptionNew + context:nil]; self.connection.autoAttach = [_attachedCheckbox state] == NSOnState; // Load view controllers into the tab views. @@ -140,6 +144,8 @@ [_connection loadStackFrame:frame]; } else if (object == _stackArrayController && [keyPath isEqualToString:@"selection.source"]) { [self updateSourceViewer]; + } else if (object == _variablesTreeController) { + [self expandVariables]; } else if (object == _model) { if ([keyPath isEqualToString:@"connected"]) { if ([change[NSKeyValueChangeNewKey] boolValue]) { @@ -207,6 +213,7 @@ [self stepIn:self]; // Do not cache the file between debugger executions. _sourceViewer.file = nil; + [_expandedVariables removeAllObjects]; } /** @@ -273,25 +280,6 @@ [_connection stop]; } -/** - * NSTableView delegate method that informs the controller that the stack selection did change and that - * we should update the source viewer - */ -- (void)tableViewSelectionDidChange:(NSNotification*)notif -{ - // TODO: This is very, very hacky because it's nondeterministic. The issue - // is that calling |-[NSOutlineView expandItem:]| while the table is still - // doing its redraw will translate to a no-op. Instead, we need to restructure - // this controller so that when everything has been laid out we call - // |-expandVariables|; but NSOutlineView doesn't have a |-didFinishDoingCrap:| - // method. The other issue is that we need to call this method from - // selectionDidChange but ONLY when it was the result of a user-initiated - // action and not the stack viewer updating causing a selection change. - // If it happens in the latter, then we run into the same issue that causes - // this to no-op. - [self performSelector:@selector(expandVariables) withObject:nil afterDelay:0.05]; -} - /** * Called whenver an item is expanded. This allows us to determine if we need to fetch deeper */ -- 2.22.5