Skip to content

Commit e7e0b03

Browse files
committed
Qt/Debugger: Auto refresh memory every 100ms
1 parent bed8100 commit e7e0b03

File tree

4 files changed

+42
-12
lines changed

4 files changed

+42
-12
lines changed

src/duckstation-qt/debuggerwindow.cpp

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#include <QtWidgets/QFileDialog>
1616
#include <QtWidgets/QMessageBox>
1717

18+
static constexpr int TIMER_REFRESH_INTERVAL_MS = 100;
19+
1820
DebuggerWindow::DebuggerWindow(QWidget* parent /* = nullptr */)
1921
: QMainWindow(parent), m_active_memory_region(Bus::MemoryRegion::Count)
2022
{
@@ -64,11 +66,16 @@ void DebuggerWindow::onDebuggerMessageReported(const QString& message)
6466
m_ui.statusbar->showMessage(message, 0);
6567
}
6668

69+
void DebuggerWindow::timerRefresh()
70+
{
71+
m_ui.memoryView->forceRefresh();
72+
}
73+
6774
void DebuggerWindow::refreshAll()
6875
{
6976
m_registers_model->updateValues();
7077
m_stack_model->invalidateView();
71-
m_ui.memoryView->repaint();
78+
m_ui.memoryView->forceRefresh();
7279

7380
m_code_model->setPC(CPU::g_state.pc);
7481
scrollToPC();
@@ -478,6 +485,9 @@ void DebuggerWindow::connectSignals()
478485

479486
connect(m_ui.memorySearch, &QPushButton::clicked, this, &DebuggerWindow::onMemorySearchTriggered);
480487
connect(m_ui.memorySearchString, &QLineEdit::textChanged, this, &DebuggerWindow::onMemorySearchStringChanged);
488+
489+
connect(&m_refresh_timer, &QTimer::timeout, this, &DebuggerWindow::timerRefresh);
490+
m_refresh_timer.setInterval(TIMER_REFRESH_INTERVAL_MS);
481491
}
482492

483493
void DebuggerWindow::disconnectSignals()
@@ -514,28 +524,35 @@ void DebuggerWindow::createModels()
514524

515525
void DebuggerWindow::setUIEnabled(bool enabled, bool allow_pause)
516526
{
527+
const bool memory_view_enabled = (enabled || allow_pause);
528+
517529
m_ui.actionPause->setEnabled(allow_pause);
518530

519531
// Disable all UI elements that depend on execution state
520532
m_ui.codeView->setEnabled(enabled);
521533
m_ui.registerView->setEnabled(enabled);
522534
m_ui.stackView->setEnabled(enabled);
523-
m_ui.memoryView->setEnabled(enabled);
535+
m_ui.memoryView->setEnabled(memory_view_enabled);
524536
m_ui.actionRunToCursor->setEnabled(enabled);
525537
m_ui.actionAddBreakpoint->setEnabled(enabled);
526538
m_ui.actionToggleBreakpoint->setEnabled(enabled);
527539
m_ui.actionClearBreakpoints->setEnabled(enabled);
528-
m_ui.actionDumpAddress->setEnabled(enabled);
540+
m_ui.actionDumpAddress->setEnabled(memory_view_enabled);
529541
m_ui.actionStepInto->setEnabled(enabled);
530542
m_ui.actionStepOver->setEnabled(enabled);
531543
m_ui.actionStepOut->setEnabled(enabled);
532544
m_ui.actionGoToAddress->setEnabled(enabled);
533545
m_ui.actionGoToPC->setEnabled(enabled);
534546
m_ui.actionTrace->setEnabled(enabled);
535-
m_ui.memoryRegionRAM->setEnabled(enabled);
536-
m_ui.memoryRegionEXP1->setEnabled(enabled);
537-
m_ui.memoryRegionScratchpad->setEnabled(enabled);
538-
m_ui.memoryRegionBIOS->setEnabled(enabled);
547+
m_ui.memoryRegionRAM->setEnabled(memory_view_enabled);
548+
m_ui.memoryRegionEXP1->setEnabled(memory_view_enabled);
549+
m_ui.memoryRegionScratchpad->setEnabled(memory_view_enabled);
550+
m_ui.memoryRegionBIOS->setEnabled(memory_view_enabled);
551+
552+
// Partial/timer refreshes only active when not paused.
553+
const bool timer_active = (!enabled && allow_pause);
554+
if (m_refresh_timer.isActive() != timer_active)
555+
timer_active ? m_refresh_timer.start() : m_refresh_timer.stop();
539556
}
540557

541558
void DebuggerWindow::saveCurrentState()

src/duckstation-qt/debuggerwindow.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "core/cpu_core.h"
99
#include "core/types.h"
1010

11+
#include <QtCore/QTimer>
1112
#include <QtWidgets/QMainWindow>
1213
#include <memory>
1314
#include <optional>
@@ -41,6 +42,7 @@ private Q_SLOTS:
4142
void onSystemResumed();
4243
void onDebuggerMessageReported(const QString& message);
4344

45+
void timerRefresh();
4446
void refreshAll();
4547

4648
void scrollToPC();
@@ -89,6 +91,8 @@ private Q_SLOTS:
8991
std::unique_ptr<DebuggerRegistersModel> m_registers_model;
9092
std::unique_ptr<DebuggerStackModel> m_stack_model;
9193

94+
QTimer m_refresh_timer;
95+
9296
Bus::MemoryRegion m_active_memory_region;
9397

9498
PhysicalMemoryAddress m_next_memory_search_address = 0;

src/duckstation-qt/memoryviewwidget.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ void MemoryViewWidget::keyPressEvent(QKeyEvent* event)
125125
{
126126
m_selected_address--;
127127
m_editing_nibble = -1;
128-
viewport()->update();
128+
forceRefresh();
129129
}
130130
}
131131
else
@@ -139,7 +139,7 @@ void MemoryViewWidget::keyPressEvent(QKeyEvent* event)
139139
expandCurrentDataToInclude(m_selected_address);
140140
std::memcpy(static_cast<unsigned char*>(m_data) + m_selected_address, &ch, sizeof(unsigned char));
141141
m_selected_address = std::min(m_selected_address + 1, m_data_size - 1);
142-
viewport()->update();
142+
forceRefresh();
143143
}
144144
else
145145
{
@@ -165,7 +165,7 @@ void MemoryViewWidget::keyPressEvent(QKeyEvent* event)
165165
m_selected_address = std::min(m_selected_address + 1, m_data_size - 1);
166166
}
167167

168-
viewport()->update();
168+
forceRefresh();
169169
}
170170
}
171171
}
@@ -381,7 +381,7 @@ void MemoryViewWidget::updateSelectedByte(const QPoint& pos)
381381
m_selected_address = new_selection;
382382
m_selection_was_ascii = new_ascii;
383383
m_editing_nibble = -1;
384-
viewport()->update();
384+
forceRefresh();
385385
}
386386
}
387387

@@ -419,6 +419,11 @@ void MemoryViewWidget::saveCurrentData()
419419
m_last_data_start_offset = m_start_offset;
420420
m_last_data.resize(size);
421421
std::memcpy(m_last_data.data(), static_cast<const u8*>(m_data) + m_start_offset, size);
422+
forceRefresh();
423+
}
424+
425+
void MemoryViewWidget::forceRefresh()
426+
{
422427
viewport()->update();
423428
}
424429

@@ -447,5 +452,8 @@ void MemoryViewWidget::adjustContent()
447452
verticalScrollBar()->setRange(0, lineCount - m_rows_visible);
448453
verticalScrollBar()->setPageStep(m_rows_visible);
449454

450-
viewport()->update();
455+
expandCurrentDataToInclude(m_start_offset);
456+
expandCurrentDataToInclude(m_end_offset);
457+
458+
forceRefresh();
451459
}

src/duckstation-qt/memoryviewwidget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class MemoryViewWidget : public QAbstractScrollArea
3434

3535
public Q_SLOTS:
3636
void saveCurrentData();
37+
void forceRefresh();
3738

3839
private Q_SLOTS:
3940
void adjustContent();

0 commit comments

Comments
 (0)