From 0767abd1d0a1607fee4b81443926599d198bac36 Mon Sep 17 00:00:00 2001 From: Kingcom Date: Wed, 31 Jul 2013 20:33:50 +0200 Subject: [PATCH] Edit breakpoints --- Windows/Debugger/BreakpointWindow.cpp | 17 ++-- Windows/Debugger/Debugger_Lists.cpp | 111 +++++++++++++++++--------- Windows/Debugger/Debugger_Lists.h | 1 + Windows/ppsspp.rc | 5 ++ Windows/resource.h | Bin 21578 -> 21770 bytes 5 files changed, 92 insertions(+), 42 deletions(-) diff --git a/Windows/Debugger/BreakpointWindow.cpp b/Windows/Debugger/BreakpointWindow.cpp index eb87dac799..72c1947ed5 100644 --- a/Windows/Debugger/BreakpointWindow.cpp +++ b/Windows/Debugger/BreakpointWindow.cpp @@ -235,7 +235,7 @@ void BreakpointWindow::loadFromMemcheck(MemCheck& memcheck) read = write = false; break; } - + switch (memcheck.result) { case MEMCHECK_BOTH: @@ -258,14 +258,19 @@ void BreakpointWindow::loadFromMemcheck(MemCheck& memcheck) size = memcheck.end-address; } -void BreakpointWindow::loadFromBreakpoint(BreakPoint& memcheck) +void BreakpointWindow::loadFromBreakpoint(BreakPoint& breakpoint) { memory = false; - address = memcheck.addr; - enabled = memcheck.enabled; + enabled = breakpoint.enabled; + address = breakpoint.addr; + enabled = breakpoint.enabled; size = 1; - // todo: cond - condition[0] = 0; + if (breakpoint.hasCond) + { + strcpy(condition,breakpoint.cond.expressionString); + } else { + condition[0] = 0; + } } diff --git a/Windows/Debugger/Debugger_Lists.cpp b/Windows/Debugger/Debugger_Lists.cpp index e3cf90350c..0b10fc5bb5 100644 --- a/Windows/Debugger/Debugger_Lists.cpp +++ b/Windows/Debugger/Debugger_Lists.cpp @@ -6,6 +6,7 @@ #include "Windows/Debugger/CtrlDisAsmView.h" #include "Windows/resource.h" #include "Windows/main.h" +#include "BreakpointWindow.h" typedef struct { @@ -37,6 +38,7 @@ ListViewColumn breakpointColumns[BPL_COLUMNCOUNT] = { const int POPUP_SUBMENU_ID_BREAKPOINTLIST = 5; const int POPUP_SUBMENU_ID_THREADLIST = 6; +const int POPUP_SUBMENU_ID_NEWBREAKPOINT = 7; // // CtrlThreadList @@ -340,7 +342,7 @@ LRESULT CALLBACK CtrlBreakpointList::wndProc(HWND hwnd, UINT message, WPARAM wPa if(wParam == VK_RETURN) { int index = ListView_GetSelectionMark(hwnd); - bp->gotoBreakpointAddress(index); + bp->editBreakpoint(index); return 0; } else if (wParam == VK_DELETE) { @@ -360,7 +362,7 @@ LRESULT CALLBACK CtrlBreakpointList::wndProc(HWND hwnd, UINT message, WPARAM wPa case WM_GETDLGCODE: if (lParam && ((MSG*)lParam)->message == WM_KEYDOWN) { - if (wParam == VK_TAB) return DLGC_WANTMESSAGE; + if (wParam == VK_TAB || wParam == VK_RETURN) return DLGC_WANTMESSAGE; } break; }; @@ -401,23 +403,44 @@ void CtrlBreakpointList::update() UpdateWindow(wnd); } +void CtrlBreakpointList::editBreakpoint(int itemIndex) +{ + bool isMemory; + int index = getBreakpointIndex(itemIndex, isMemory); + if (index == -1) return; + + BreakpointWindow win(wnd,cpu); + if (isMemory) + { + auto mem = displayedMemChecks_[index]; + win.loadFromMemcheck(mem); + if (win.exec()) + { + CBreakPoints::RemoveMemCheck(mem.start,mem.end); + win.addBreakpoint(); + } + } else { + auto bp = displayedBreakPoints_[index]; + win.loadFromBreakpoint(bp); + if (win.exec()) + { + CBreakPoints::RemoveBreakPoint(bp.addr); + win.addBreakpoint(); + } + } +} + void CtrlBreakpointList::toggleEnabled(int itemIndex) { bool isMemory; int index = getBreakpointIndex(itemIndex, isMemory); if (index == -1) return; - MemCheck mcPrev; - BreakPoint bpPrev; - if (isMemory) { - mcPrev = displayedMemChecks_[index]; - } else { - bpPrev = displayedBreakPoints_[index]; - } - if (isMemory) { + MemCheck mcPrev = displayedMemChecks_[index]; CBreakPoints::ChangeMemCheck(mcPrev.start, mcPrev.end, mcPrev.cond, MemCheckResult(mcPrev.result ^ MEMCHECK_BREAK)); } else { + BreakPoint bpPrev = displayedBreakPoints_[index]; CBreakPoints::ChangeBreakPoint(bpPrev.addr, !bpPrev.enabled); } } @@ -632,36 +655,52 @@ void CtrlBreakpointList::handleNotify(LPARAM lParam) void CtrlBreakpointList::showBreakpointMenu(int itemIndex, const POINT &pt) { - bool isMemory; - int index = getBreakpointIndex(itemIndex, isMemory); - if (index == -1) return; - - MemCheck mcPrev; - BreakPoint bpPrev; - if (isMemory) { - mcPrev = displayedMemChecks_[index]; - } else { - bpPrev = displayedBreakPoints_[index]; - } - POINT screenPt(pt); ClientToScreen(wnd, &screenPt); - HMENU subMenu = GetSubMenu(g_hPopupMenus, POPUP_SUBMENU_ID_BREAKPOINTLIST); - if (isMemory) { - CheckMenuItem(subMenu, ID_DISASM_DISABLEBREAKPOINT, MF_BYCOMMAND | (mcPrev.result & MEMCHECK_BREAK ? MF_CHECKED : MF_UNCHECKED)); - } else { - CheckMenuItem(subMenu, ID_DISASM_DISABLEBREAKPOINT, MF_BYCOMMAND | (bpPrev.enabled ? MF_CHECKED : MF_UNCHECKED)); - } - - switch (TrackPopupMenuEx(subMenu, TPM_RIGHTBUTTON | TPM_RETURNCMD, screenPt.x, screenPt.y, wnd, 0)) + bool isMemory; + int index = getBreakpointIndex(itemIndex, isMemory); + if (index == -1) { - case ID_DISASM_DISABLEBREAKPOINT: - if (isMemory) { - CBreakPoints::ChangeMemCheck(mcPrev.start, mcPrev.end, mcPrev.cond, MemCheckResult(mcPrev.result ^ MEMCHECK_BREAK)); - } else { - CBreakPoints::ChangeBreakPoint(bpPrev.addr, !bpPrev.enabled); + HMENU subMenu = GetSubMenu(g_hPopupMenus, POPUP_SUBMENU_ID_NEWBREAKPOINT); + + switch (TrackPopupMenuEx(subMenu, TPM_RIGHTBUTTON | TPM_RETURNCMD, screenPt.x, screenPt.y, wnd, 0)) + { + case ID_DISASM_ADDNEWBREAKPOINT: + { + BreakpointWindow bpw(wnd,cpu); + if (bpw.exec()) bpw.addBreakpoint(); + } + break; + } + } else { + MemCheck mcPrev; + BreakPoint bpPrev; + if (isMemory) { + mcPrev = displayedMemChecks_[index]; + } else { + bpPrev = displayedBreakPoints_[index]; + } + + HMENU subMenu = GetSubMenu(g_hPopupMenus, POPUP_SUBMENU_ID_BREAKPOINTLIST); + if (isMemory) { + CheckMenuItem(subMenu, ID_DISASM_DISABLEBREAKPOINT, MF_BYCOMMAND | (mcPrev.result & MEMCHECK_BREAK ? MF_CHECKED : MF_UNCHECKED)); + } else { + CheckMenuItem(subMenu, ID_DISASM_DISABLEBREAKPOINT, MF_BYCOMMAND | (bpPrev.enabled ? MF_CHECKED : MF_UNCHECKED)); + } + + switch (TrackPopupMenuEx(subMenu, TPM_RIGHTBUTTON | TPM_RETURNCMD, screenPt.x, screenPt.y, wnd, 0)) + { + case ID_DISASM_DISABLEBREAKPOINT: + if (isMemory) { + CBreakPoints::ChangeMemCheck(mcPrev.start, mcPrev.end, mcPrev.cond, MemCheckResult(mcPrev.result ^ MEMCHECK_BREAK)); + } else { + CBreakPoints::ChangeBreakPoint(bpPrev.addr, !bpPrev.enabled); + } + break; + case ID_DISASM_EDITBREAKPOINT: + editBreakpoint(index); + break; } - break; } } diff --git a/Windows/Debugger/Debugger_Lists.h b/Windows/Debugger/Debugger_Lists.h index b34b04bbdb..cac7d0ea30 100644 --- a/Windows/Debugger/Debugger_Lists.h +++ b/Windows/Debugger/Debugger_Lists.h @@ -32,6 +32,7 @@ class CtrlBreakpointList DebugInterface* cpu; CtrlDisAsmView* disasm; + void editBreakpoint(int itemIndex); void gotoBreakpointAddress(int itemIndex); void removeBreakpoint(int itemIndex); int getTotalBreakpointCount(); diff --git a/Windows/ppsspp.rc b/Windows/ppsspp.rc index 3ecdb55b26..e823b7ed62 100644 --- a/Windows/ppsspp.rc +++ b/Windows/ppsspp.rc @@ -473,12 +473,17 @@ BEGIN POPUP "breakpointlist" BEGIN MENUITEM "&Enable", ID_DISASM_DISABLEBREAKPOINT + MENUITEM "E&dit", ID_DISASM_EDITBREAKPOINT END POPUP "threadlist" BEGIN MENUITEM "Force &Resume", ID_DISASM_THREAD_FORCERUN MENUITEM "&Terminate", ID_DISASM_THREAD_KILL END + POPUP "newbreakpoint" + BEGIN + MENUITEM "&Add new", ID_DISASM_ADDNEWBREAKPOINT + END END #endif // English (United States) resources diff --git a/Windows/resource.h b/Windows/resource.h index 5d72a7d68bcd8a9c28b1c0d5b72a7a57dd561eda..3fb53d72f60e9ad4ce608bfa49a11aa7b0c2d7e5 100644 GIT binary patch delta 64 zcmX@Lg0X8A