diff --git a/Core/Debugger/Breakpoints.cpp b/Core/Debugger/Breakpoints.cpp index 256d5c7ee4..8b5cd9810d 100644 --- a/Core/Debugger/Breakpoints.cpp +++ b/Core/Debugger/Breakpoints.cpp @@ -78,6 +78,14 @@ bool CBreakPoints::IsAddressBreakPoint(u32 addr) return bp != INVALID_BREAKPOINT && breakPoints_[bp].enabled; } +bool CBreakPoints::IsAddressBreakPoint(u32 addr, bool* enabled) +{ + size_t bp = FindBreakpoint(addr); + if (bp == INVALID_BREAKPOINT) return false; + if (enabled != NULL) *enabled = breakPoints_[bp].enabled; + return true; +} + bool CBreakPoints::IsTempBreakPoint(u32 addr) { size_t bp = FindBreakpoint(addr, true, true); diff --git a/Core/Debugger/Breakpoints.h b/Core/Debugger/Breakpoints.h index 3d6801bd30..54558cdfa4 100644 --- a/Core/Debugger/Breakpoints.h +++ b/Core/Debugger/Breakpoints.h @@ -100,6 +100,7 @@ public: static const size_t INVALID_MEMCHECK = -1; static bool IsAddressBreakPoint(u32 addr); + static bool IsAddressBreakPoint(u32 addr, bool* enabled); static bool IsTempBreakPoint(u32 addr); static void AddBreakPoint(u32 addr, bool temp = false); static void RemoveBreakPoint(u32 addr); diff --git a/Windows/Debugger/CtrlDisAsmView.cpp b/Windows/Debugger/CtrlDisAsmView.cpp index db971a0722..3dab1f8ab0 100644 --- a/Windows/Debugger/CtrlDisAsmView.cpp +++ b/Windows/Debugger/CtrlDisAsmView.cpp @@ -354,11 +354,12 @@ void CtrlDisAsmView::onPaint(WPARAM wParam, LPARAM lParam) DeleteObject(backgroundPen); // display address/symbol - if (debugger->isBreakpoint(address)) + bool enabled; + if (CBreakPoints::IsAddressBreakPoint(address,&enabled)) { - textColor = 0x0000FF; + if (enabled) textColor = 0x0000FF; int yOffset = max(-1,(rowHeight-14+1)/2); - DrawIconEx(hdc,2,rowY1+1+yOffset,breakPoint,32,32,0,0,DI_NORMAL); + DrawIconEx(hdc,2,rowY1+1+yOffset,enabled ? breakPoint : breakPointDisable,32,32,0,0,DI_NORMAL); } SetTextColor(hdc,textColor); @@ -613,6 +614,29 @@ void CtrlDisAsmView::redraw() UpdateWindow(wnd); } +void CtrlDisAsmView::toggleBreakpoint() +{ + bool enabled; + if (CBreakPoints::IsAddressBreakPoint(curAddress,&enabled)) + { + if (!enabled) + { + // enable disabled breakpoints + CBreakPoints::ChangeBreakPoint(curAddress,true); + } else if (CBreakPoints::GetBreakPointCondition(curAddress) != NULL) + { + // don't just delete a breakpoint with a custom condition + int ret = MessageBox(wnd,"This breakpoint has a custom condition.\nDo you want to remove it?","Confirmation",MB_YESNO); + if (ret != IDYES) return; + CBreakPoints::RemoveBreakPoint(curAddress); + } else { + // otherwise just remove breakpoint + CBreakPoints::RemoveBreakPoint(curAddress); + } + } else { + CBreakPoints::AddBreakPoint(curAddress); + } +} void CtrlDisAsmView::onMouseDown(WPARAM wParam, LPARAM lParam, int button) { @@ -624,7 +648,7 @@ void CtrlDisAsmView::onMouseDown(WPARAM wParam, LPARAM lParam, int button) { if (newAddress == curAddress && hasFocus) { - debugger->toggleBreakpoint(curAddress); + toggleBreakpoint(); } } @@ -650,7 +674,7 @@ void CtrlDisAsmView::onMouseUp(WPARAM wParam, LPARAM lParam, int button) case ID_DISASM_ADDHLE: break; case ID_DISASM_TOGGLEBREAKPOINT: - debugger->toggleBreakpoint(curAddress); + toggleBreakpoint(); redraw(); break; case ID_DISASM_COPYINSTRUCTIONDISASM: diff --git a/Windows/Debugger/CtrlDisAsmView.h b/Windows/Debugger/CtrlDisAsmView.h index 52b78bb38f..ccfd096727 100644 --- a/Windows/Debugger/CtrlDisAsmView.h +++ b/Windows/Debugger/CtrlDisAsmView.h @@ -128,11 +128,7 @@ public: showHex=s; } - void toggleBreakpoint() - { - debugger->toggleBreakpoint(curAddress); - redraw(); - } + void toggleBreakpoint(); void scrollWindow(int lines) {