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:
parent
97a83952a1
commit
fcf72bc4b4
@ -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**>(¤tStackTrace))
|
||||
== 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
|
||||
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user