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:
@@ -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**>(¤tStackTrace))
|
||||||
|
== 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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user