void BreakpointList::keydownEvent(wxKeyEvent& evt) { int sel = GetFirstSelected(); switch (evt.GetKeyCode()) { case WXK_DELETE: if (sel+1 == GetItemCount()) Select(sel-1); removeBreakpoint(sel); break; case WXK_UP: if (sel > 0) Select(sel-1); break; case WXK_DOWN: if (sel+1 < GetItemCount()) Select(sel+1); break; case WXK_RETURN: editBreakpoint(sel); break; case WXK_SPACE: toggleEnabled(sel); break; } }
void CtrlBreakpointList::showBreakpointMenu(int itemIndex, const POINT &pt) { POINT screenPt(pt); ClientToScreen(wnd, &screenPt); bool isMemory; int index = getBreakpointIndex(itemIndex, isMemory); if (index == -1) { 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; case ID_DISASM_ADDNEWBREAKPOINT: { BreakpointWindow bpw(wnd,cpu); if (bpw.exec()) bpw.addBreakpoint(); } break; } } }
bool CtrlBreakpointList::WindowMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT& returnValue) { switch(msg) { case WM_KEYDOWN: returnValue = 0; if(wParam == VK_RETURN) { int index = GetSelectedIndex(); editBreakpoint(index); return true; } else if (wParam == VK_DELETE) { int index = GetSelectedIndex(); removeBreakpoint(index); return true; } else if (wParam == VK_TAB) { SendMessage(GetParent(GetHandle()),WM_DEB_TABPRESSED,0,0); return true; } else if (wParam == VK_SPACE) { int index = GetSelectedIndex(); toggleEnabled(index); return true; } break; case WM_GETDLGCODE: if (lParam && ((MSG*)lParam)->message == WM_KEYDOWN) { if (wParam == VK_TAB || wParam == VK_RETURN) { returnValue = DLGC_WANTMESSAGE; return true; } } break; } return false; }
/*! Defines the actions used by the BreakpointsTreeView context menu. */ void BreakpointsTreeView::createActions() { /* Go to file action */ mpGotoFileAction = new QAction(QIcon(":/Resources/icons/next.svg"), tr("Go to File"), this); mpGotoFileAction->setStatusTip(tr("Goto file location")); connect(mpGotoFileAction, SIGNAL(triggered()), SLOT(gotoFile())); /* Add breakpoint action */ mpAddBreakpointAction = new QAction(QIcon(":/Resources/icons/add-icon.svg"), Helper::add, this); mpAddBreakpointAction->setStatusTip(tr("Adds a breakpoint")); connect(mpAddBreakpointAction, SIGNAL(triggered()), SLOT(addBreakpoint())); /* Edit breakpoint action */ mpEditBreakpointAction = new QAction(QIcon(":/Resources/icons/edit-icon.svg"), Helper::edit, this); mpEditBreakpointAction->setStatusTip(tr("Edits a breakpoint")); connect(mpEditBreakpointAction, SIGNAL(triggered()), SLOT(editBreakpoint())); /* Remove breakpoint action */ mpDeleteBreakpointAction = new QAction(QIcon(":/Resources/icons/delete.svg"), Helper::deleteStr, this); mpDeleteBreakpointAction->setStatusTip(tr("Deletes a breakpoint")); connect(mpDeleteBreakpointAction, SIGNAL(triggered()), SLOT(deleteBreakpoint())); /* remove all breakpoints action */ mpDeleteAllBreakpointsAction = new QAction(tr("Delete All"), this); mpDeleteAllBreakpointsAction->setStatusTip(tr("Deletes all the breakpoints")); connect(mpDeleteAllBreakpointsAction, SIGNAL(triggered()), SLOT(deleteAllBreakpoints())); }
void CtrlDisAsmView::onKeyDown(WPARAM wParam, LPARAM lParam) { dontRedraw = false; u32 windowEnd = manager.getNthNextAddress(windowStart,visibleRows); keyTaken = true; if (KeyDownAsync(VK_CONTROL)) { switch (tolower(wParam & 0xFFFF)) { case 'f': case 's': search(false); break; case 'c': case VK_INSERT: copyInstructions(selectRangeStart, selectRangeEnd, true); break; case 'x': disassembleToFile(); break; case 'a': assembleOpcode(curAddress,""); break; case 'g': { u32 addr; if (executeExpressionWindow(wnd,debugger,addr) == false) return; gotoAddr(addr); } break; case 'e': // edit breakpoint editBreakpoint(); break; case 'd': // toogle breakpoint enabled toggleBreakpoint(true); break; case VK_UP: scrollWindow(-1); scanFunctions(); break; case VK_DOWN: scrollWindow(1); scanFunctions(); break; case VK_NEXT: setCurAddress(manager.getNthPreviousAddress(windowEnd,1),KeyDownAsync(VK_SHIFT)); break; case VK_PRIOR: setCurAddress(windowStart,KeyDownAsync(VK_SHIFT)); break; } } else { switch (wParam & 0xFFFF) { case VK_DOWN: setCurAddress(manager.getNthNextAddress(curAddress,1), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); break; case VK_UP: setCurAddress(manager.getNthPreviousAddress(curAddress,1), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); break; case VK_NEXT: if (manager.getNthNextAddress(curAddress,1) != windowEnd && curAddressIsVisible()) { setCurAddress(manager.getNthPreviousAddress(windowEnd,1), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } else { setCurAddress(manager.getNthNextAddress(windowEnd,visibleRows-1), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } break; case VK_PRIOR: if (curAddress != windowStart && curAddressIsVisible()) { setCurAddress(windowStart, KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } else { setCurAddress(manager.getNthPreviousAddress(windowStart,visibleRows), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } break; case VK_LEFT: if (jumpStack.empty()) { gotoPC(); } else { u32 addr = jumpStack[jumpStack.size()-1]; jumpStack.pop_back(); gotoAddr(addr); } return; case VK_RIGHT: followBranch(); return; case VK_TAB: displaySymbols = !displaySymbols; break; case VK_SPACE: debugger->toggleBreakpoint(curAddress); break; case VK_F3: search(true); break; default: keyTaken = false; return; } } redraw(); }