Ticket #9841: reduce_flicker_v2.patch

File reduce_flicker_v2.patch, 6.2 KB (added by anevilyak, 8 years ago)

Reduces source and stack trace view flicker

  • src/apps/debugger/user_interface/gui/team_window/SourceView.cpp

    diff --git a/src/apps/debugger/user_interface/gui/team_window/SourceView.cpp b/src/apps/debugger/user_interface/gui/team_window/SourceView.cpp
    index 3e3a4f9..958edb3 100644
    a b SourceView::TextView::TextView(SourceView* sourceView, MarkerManager* manager,  
    10451045    fScrollRunner(NULL),
    10461046    fMarkerManager(manager)
    10471047{
    1048     SetViewColor(ui_color(B_DOCUMENT_BACKGROUND_COLOR));
     1048    SetViewColor(B_TRANSPARENT_COLOR);
    10491049    fTextColor = ui_color(B_DOCUMENT_TEXT_COLOR);
    10501050    SetFlags(Flags() | B_NAVIGABLE);
    10511051}
    SourceView::TextView::MaxSize()  
    10851085void
    10861086SourceView::TextView::Draw(BRect updateRect)
    10871087{
    1088     if (fSourceCode == NULL)
     1088    if (fSourceCode == NULL) {
     1089        SetLowColor(ui_color(B_DOCUMENT_BACKGROUND_COLOR));
     1090        FillRect(updateRect, B_SOLID_LOW);
    10891091        return;
     1092    }
    10901093
    10911094    // get the lines intersecting with the update rect
    10921095    int32 minLine, maxLine;
    SourceView::TextView::Draw(BRect updateRect)  
    11011104    SourceView::MarkerManager::InstructionPointerMarker* ipMarker;
    11021105    int32 markerIndex = 0;
    11031106    for (int32 i = minLine; i <= maxLine; i++) {
    1104         SetLowColor(ViewColor());
     1107        SetLowColor(ui_color(B_DOCUMENT_BACKGROUND_COLOR));
    11051108        float y = i * fFontInfo->lineHeight;
    11061109        BString lineString;
    11071110        _FormatLine(fSourceCode->LineAt(i), lineString);
    11081111
     1112        FillRect(BRect(0.0, y, kLeftTextMargin, y + fFontInfo->lineHeight),
     1113            B_SOLID_LOW);
    11091114        for (int32 j = markerIndex; j < markers.CountItems(); j++) {
    11101115            marker = markers.ItemAt(j);
    11111116             if (marker->Line() < (uint32)i) {
    SourceView::TextView::Draw(BRect updateRect)  
    11231128
    11241129                } else
    11251130                    SetLowColor(255, 255, 0, 255);
    1126                 FillRect(BRect(kLeftTextMargin, y, Bounds().right,
    1127                     y + fFontInfo->lineHeight), B_SOLID_LOW);
    11281131                break;
    11291132             } else
    11301133                break;
    11311134        }
    11321135
     1136        FillRect(BRect(kLeftTextMargin, y, Bounds().right,
     1137            y + fFontInfo->lineHeight), B_SOLID_LOW);
    11331138        DrawString(lineString,
    11341139            BPoint(kLeftTextMargin, y + fFontInfo->fontHeight.ascent));
    11351140    }
    SourceView::SetStackTrace(StackTrace* stackTrace, Thread* activeThread)  
    20532058
    20542059    fMarkerManager->SetStackTrace(fStackTrace);
    20552060    fMarkerView->SetStackTrace(fStackTrace);
    2056     fTextView->Invalidate();
    20572061}
    20582062
    20592063
    20602064void
    20612065SourceView::SetStackFrame(StackFrame* stackFrame)
    20622066{
     2067    TRACE_GUI("SourceView::SetStackFrame(%p)\n", stackFrame);
    20632068    if (stackFrame == fStackFrame)
    20642069        return;
    20652070
  • src/apps/debugger/user_interface/gui/team_window/StackTraceView.cpp

    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 c36ac9b..5850f87 100644
    a b  
    11/*
    22 * Copyright 2009-2012, Ingo Weinhold, ingo_weinhold@gmx.de.
    3  * Copyright 2011, Rene Gollent, rene@gollent.com.
     3 * Copyright 2011-2013, Rene Gollent, rene@gollent.com.
    44 * Distributed under the terms of the MIT License.
    55 */
    66
     
    1212#include <new>
    1313
    1414#include <ControlLook.h>
     15#include <MessageRunner.h>
     16#include <Window.h>
    1517
    1618#include "table/TableColumns.h"
    1719
     
    2325#include "UiUtils.h"
    2426
    2527
     28enum {
     29    MSG_CLEAR_STACK_TRACE   = 'clst'
     30};
     31
     32
    2633// #pragma mark - FramesTableModel
    2734
    2835
    StackTraceView::StackTraceView(Listener* listener)  
    107114    fStackTrace(NULL),
    108115    fFramesTable(NULL),
    109116    fFramesTableModel(NULL),
     117    fTraceUpdateRunner(NULL),
    110118    fListener(listener)
    111119{
    112120    SetName("Stack Trace");
    StackTraceView::SetStackTrace(StackTrace* stackTrace)  
    149157{
    150158    if (stackTrace == fStackTrace)
    151159        return;
    152 
    153     if (fStackTrace != NULL)
    154         fStackTrace->ReleaseReference();
    155 
    156     fStackTrace = stackTrace;
    157 
    158     if (fStackTrace != NULL)
    159         fStackTrace->AcquireReference();
    160 
    161     fFramesTableModel->SetStackTrace(fStackTrace);
     160    else if (stackTrace == NULL) {
     161        if (fTraceUpdateRunner == NULL) {
     162            BMessage message(MSG_CLEAR_STACK_TRACE);
     163            message.AddPointer("currentTrace", fStackTrace);
     164            fTraceUpdateRunner = new(std::nothrow) BMessageRunner(this,
     165                message, 250000, 1);
     166            if (fTraceUpdateRunner != NULL
     167                && fTraceUpdateRunner->InitCheck() != B_OK) {
     168                delete fTraceUpdateRunner;
     169                fTraceUpdateRunner = NULL;
     170            }
     171        }
     172    } else {
     173        delete fTraceUpdateRunner;
     174        fTraceUpdateRunner = NULL;
     175        _SetStackTrace(stackTrace);
     176    }
    162177}
    163178
    164179
    StackTraceView::SaveSettings(BMessage& settings)  
    205220
    206221
    207222void
     223StackTraceView::MessageReceived(BMessage* message)
     224{
     225    switch (message->what) {
     226        case MSG_CLEAR_STACK_TRACE:
     227        {
     228            StackTrace* currentStackTrace;
     229            if (message->FindPointer("currentTrace",
     230                    reinterpret_cast<void**>(&currentStackTrace))
     231                    == B_OK && currentStackTrace == fStackTrace) {
     232                _SetStackTrace(NULL);
     233            }
     234            break;
     235        }
     236        default:
     237        {
     238            BGroupView::MessageReceived(message);
     239            break;
     240        }
     241    }
     242}
     243
     244
     245void
    208246StackTraceView::TableSelectionChanged(Table* table)
    209247{
    210248    if (fListener == NULL)
    StackTraceView::_Init()  
    243281}
    244282
    245283
     284void
     285StackTraceView::_SetStackTrace(StackTrace* stackTrace)
     286{
     287    if (fStackTrace != NULL)
     288        fStackTrace->ReleaseReference();
     289
     290    fStackTrace = stackTrace;
     291
     292    if (fStackTrace != NULL)
     293        fStackTrace->AcquireReference();
     294
     295    fFramesTableModel->SetStackTrace(fStackTrace);
     296}
     297
     298
    246299// #pragma mark - Listener
    247300
    248301
  • src/apps/debugger/user_interface/gui/team_window/StackTraceView.h

    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 5ce2fbe..87e8a28 100644
    a b  
    1111#include "Team.h"
    1212
    1313
     14class BMessageRunner;
    1415class StackFrame;
    1516
    1617
    public:  
    3334            void                LoadSettings(const BMessage& settings);
    3435            status_t            SaveSettings(BMessage& settings);
    3536
     37    virtual void                MessageReceived(BMessage* message);
     38
    3639private:
    3740            class FramesTableModel;
    3841
    private:  
    4245
    4346            void                _Init();
    4447
     48            void                _SetStackTrace(StackTrace* stackTrace);
     49
    4550private:
    4651            StackTrace*         fStackTrace;
    4752            Table*              fFramesTable;
    4853            FramesTableModel*   fFramesTableModel;
     54            BMessageRunner*     fTraceUpdateRunner;
    4955            Listener*           fListener;
    5056};
    5157