From fcf72bc4b4ceedb7bcacd25942ce273213969718 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sat, 29 Jun 2013 11:47:46 -0400 Subject: [PATCH] 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. --- .../gui/team_window/StackTraceView.cpp | 75 ++++++++++++++++--- .../gui/team_window/StackTraceView.h | 6 ++ 2 files changed, 70 insertions(+), 11 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/StackTraceView.cpp b/src/apps/debugger/user_interface/gui/team_window/StackTraceView.cpp index c36ac9b742..5850f879ca 100644 --- a/src/apps/debugger/user_interface/gui/team_window/StackTraceView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/StackTraceView.cpp @@ -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 #include +#include +#include #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(¤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 diff --git a/src/apps/debugger/user_interface/gui/team_window/StackTraceView.h b/src/apps/debugger/user_interface/gui/team_window/StackTraceView.h index 5ce2fbe9bb..87e8a28bc4 100644 --- a/src/apps/debugger/user_interface/gui/team_window/StackTraceView.h +++ b/src/apps/debugger/user_interface/gui/team_window/StackTraceView.h @@ -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; };