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
@@ -1,6 +1,6 @@
/* /*
* Copyright 2009-2012, Ingo Weinhold, [email protected]. * Copyright 2009-2012, Ingo Weinhold, [email protected].
* Copyright 2011, Rene Gollent, [email protected]. * Copyright 2011-2013, Rene Gollent, [email protected].
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
@@ -12,6 +12,8 @@
#include <new> #include <new>
#include <ControlLook.h> #include <ControlLook.h>
#include <MessageRunner.h>
#include <Window.h>
#include "table/TableColumns.h" #include "table/TableColumns.h"
@@ -23,6 +25,11 @@
#include "UiUtils.h" #include "UiUtils.h"
enum {
MSG_CLEAR_STACK_TRACE = 'clst'
};
// #pragma mark - FramesTableModel // #pragma mark - FramesTableModel
@@ -107,6 +114,7 @@ StackTraceView::StackTraceView(Listener* listener)
fStackTrace(NULL), fStackTrace(NULL),
fFramesTable(NULL), fFramesTable(NULL),
fFramesTableModel(NULL), fFramesTableModel(NULL),
fTraceUpdateRunner(NULL),
fListener(listener) fListener(listener)
{ {
SetName("Stack Trace"); SetName("Stack Trace");
@@ -149,16 +157,23 @@ StackTraceView::SetStackTrace(StackTrace* stackTrace)
{ {
if (stackTrace == fStackTrace) if (stackTrace == fStackTrace)
return; return;
else if (stackTrace == NULL) {
if (fStackTrace != NULL) if (fTraceUpdateRunner == NULL) {
fStackTrace->ReleaseReference(); BMessage message(MSG_CLEAR_STACK_TRACE);
message.AddPointer("currentTrace", fStackTrace);
fStackTrace = stackTrace; fTraceUpdateRunner = new(std::nothrow) BMessageRunner(this,
message, 250000, 1);
if (fStackTrace != NULL) if (fTraceUpdateRunner != NULL
fStackTrace->AcquireReference(); && fTraceUpdateRunner->InitCheck() != B_OK) {
delete fTraceUpdateRunner;
fFramesTableModel->SetStackTrace(fStackTrace); 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 void
StackTraceView::TableSelectionChanged(Table* table) 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 // #pragma mark - Listener
@@ -11,6 +11,7 @@
#include "Team.h" #include "Team.h"
class BMessageRunner;
class StackFrame; class StackFrame;
@@ -33,6 +34,8 @@ public:
void LoadSettings(const BMessage& settings); void LoadSettings(const BMessage& settings);
status_t SaveSettings(BMessage& settings); status_t SaveSettings(BMessage& settings);
virtual void MessageReceived(BMessage* message);
private: private:
class FramesTableModel; class FramesTableModel;
@@ -42,10 +45,13 @@ private:
void _Init(); void _Init();
void _SetStackTrace(StackTrace* stackTrace);
private: private:
StackTrace* fStackTrace; StackTrace* fStackTrace;
Table* fFramesTable; Table* fFramesTable;
FramesTableModel* fFramesTableModel; FramesTableModel* fFramesTableModel;
BMessageRunner* fTraceUpdateRunner;
Listener* fListener; Listener* fListener;
}; };