Reduce flicker in StackTrace display when single stepping.

When asked to clear the current stack trace, delay actually doing so
by .25 seconds. If the stack trace is set to a new one in the meantime,
the operation is aborted so we don't reset the trace twice.

Thanks Ingo for the suggestion.
This commit is contained in:
Rene Gollent 2013-06-29 11:47:46 -04:00
parent 97a83952a1
commit fcf72bc4b4
2 changed files with 70 additions and 11 deletions

View File

@ -1,6 +1,6 @@
/*
* Copyright 2009-2012, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2011, Rene Gollent, rene@gollent.com.
* Copyright 2011-2013, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/
@ -12,6 +12,8 @@
#include <new>
#include <ControlLook.h>
#include <MessageRunner.h>
#include <Window.h>
#include "table/TableColumns.h"
@ -23,6 +25,11 @@
#include "UiUtils.h"
enum {
MSG_CLEAR_STACK_TRACE = 'clst'
};
// #pragma mark - FramesTableModel
@ -107,6 +114,7 @@ StackTraceView::StackTraceView(Listener* listener)
fStackTrace(NULL),
fFramesTable(NULL),
fFramesTableModel(NULL),
fTraceUpdateRunner(NULL),
fListener(listener)
{
SetName("Stack Trace");
@ -149,16 +157,23 @@ StackTraceView::SetStackTrace(StackTrace* stackTrace)
{
if (stackTrace == fStackTrace)
return;
if (fStackTrace != NULL)
fStackTrace->ReleaseReference();
fStackTrace = stackTrace;
if (fStackTrace != NULL)
fStackTrace->AcquireReference();
fFramesTableModel->SetStackTrace(fStackTrace);
else if (stackTrace == NULL) {
if (fTraceUpdateRunner == NULL) {
BMessage message(MSG_CLEAR_STACK_TRACE);
message.AddPointer("currentTrace", fStackTrace);
fTraceUpdateRunner = new(std::nothrow) BMessageRunner(this,
message, 250000, 1);
if (fTraceUpdateRunner != NULL
&& fTraceUpdateRunner->InitCheck() != B_OK) {
delete fTraceUpdateRunner;
fTraceUpdateRunner = NULL;
}
}
} else {
delete fTraceUpdateRunner;
fTraceUpdateRunner = NULL;
_SetStackTrace(stackTrace);
}
}
@ -204,6 +219,29 @@ StackTraceView::SaveSettings(BMessage& settings)
}
void
StackTraceView::MessageReceived(BMessage* message)
{
switch (message->what) {
case MSG_CLEAR_STACK_TRACE:
{
StackTrace* currentStackTrace;
if (message->FindPointer("currentTrace",
reinterpret_cast<void**>(&currentStackTrace))
== B_OK && currentStackTrace == fStackTrace) {
_SetStackTrace(NULL);
}
break;
}
default:
{
BGroupView::MessageReceived(message);
break;
}
}
}
void
StackTraceView::TableSelectionChanged(Table* table)
{
@ -243,6 +281,21 @@ StackTraceView::_Init()
}
void
StackTraceView::_SetStackTrace(StackTrace* stackTrace)
{
if (fStackTrace != NULL)
fStackTrace->ReleaseReference();
fStackTrace = stackTrace;
if (fStackTrace != NULL)
fStackTrace->AcquireReference();
fFramesTableModel->SetStackTrace(fStackTrace);
}
// #pragma mark - Listener

View File

@ -11,6 +11,7 @@
#include "Team.h"
class BMessageRunner;
class StackFrame;
@ -33,6 +34,8 @@ public:
void LoadSettings(const BMessage& settings);
status_t SaveSettings(BMessage& settings);
virtual void MessageReceived(BMessage* message);
private:
class FramesTableModel;
@ -42,10 +45,13 @@ private:
void _Init();
void _SetStackTrace(StackTrace* stackTrace);
private:
StackTrace* fStackTrace;
Table* fFramesTable;
FramesTableModel* fFramesTableModel;
BMessageRunner* fTraceUpdateRunner;
Listener* fListener;
};