From deea0b1e74d5d00a03f74f482380238b303a6202 Mon Sep 17 00:00:00 2001 From: Martin Date: Thu, 10 Feb 2022 21:14:17 +0100 Subject: [PATCH] IDE, Debugger: Add "copy address" to assembler window --- debugger/assemblerdlg.lfm | 4 ++++ debugger/assemblerdlg.pp | 24 ++++++++++++++++++++++++ ide/lazarusidestrconsts.pas | 1 + 3 files changed, 29 insertions(+) diff --git a/debugger/assemblerdlg.lfm b/debugger/assemblerdlg.lfm index e1deb5fe65..4c7be7e70d 100644 --- a/debugger/assemblerdlg.lfm +++ b/debugger/assemblerdlg.lfm @@ -162,6 +162,10 @@ object AssemblerDlg: TAssemblerDlg Action = actCopy OnClick = CopyToClipboardClick end + object popCopyAddr: TMenuItem + Caption = 'popCopyAddr' + OnClick = popCopyAddrClick + end end object ActionList1: TActionList Left = 104 diff --git a/debugger/assemblerdlg.pp b/debugger/assemblerdlg.pp index ebfa9da768..5e5acf63fc 100644 --- a/debugger/assemblerdlg.pp +++ b/debugger/assemblerdlg.pp @@ -56,6 +56,7 @@ type CopyToClipboard: TMenuItem; EditGotoAddr: TEdit; ImageList1: TImageList; + popCopyAddr: TMenuItem; pnlToolAddr: TPanel; pbAsm: TPaintBox; PopupMenu1: TPopupMenu; @@ -88,6 +89,7 @@ type {%H-}Y: Integer); procedure pbAsmMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; {%H-}MousePos: TPoint; var Handled: Boolean); procedure pbAsmPaint(Sender: TObject); + procedure popCopyAddrClick(Sender: TObject); procedure sbHorizontalChange(Sender: TObject); procedure sbVerticalChange(Sender: TObject); procedure sbVerticalScroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); @@ -159,6 +161,7 @@ type procedure DoBeginUpdate; override; procedure DoEndUpdate; override; procedure UpdateShowing; override; + function GetLinMapEntryForLine(ALine: Integer; out AnEntry: TAsmDlgLineEntry): Boolean; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; @@ -271,6 +274,7 @@ begin EditorOpts.AddHandlerAfterWrite(@DoEditorOptsChanged); Caption := lisMenuViewAssembler; CopyToClipboard.Caption := lisDbgAsmCopyToClipboard; + popCopyAddr.Caption := lisDbgAsmCopyAddressToClipboard; ToolBar1.Images := IDEImages.Images_16; @@ -581,6 +585,16 @@ begin end; end; +function TAssemblerDlg.GetLinMapEntryForLine(ALine: Integer; out + AnEntry: TAsmDlgLineEntry): Boolean; +begin + AnEntry := Default(TAsmDlgLineEntry); + ALine := ALine - FTopLine; + Result := (ALine > 0) and (ALine < length(FLineMap)); + if Result then + AnEntry := FLineMap[ALine]; +end; + procedure TAssemblerDlg.pbAsmMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button <> mbLeft then exit; @@ -687,6 +701,14 @@ begin end; end; +procedure TAssemblerDlg.popCopyAddrClick(Sender: TObject); +var + Entry: TAsmDlgLineEntry; +begin + if GetLinMapEntryForLine(FSelectLine, Entry) then + Clipboard.AsText := '$'+IntToHex(Entry.Addr); +end; + function TAssemblerDlg.FormatLine(ALine: TAsmDlgLineEntry; W: Integer) : String; begin Result := ''; @@ -728,11 +750,13 @@ end; procedure TAssemblerDlg.UpdateActionEnabled; var HasDisassembler: Boolean; + dummy: TAsmDlgLineEntry; begin HasDisassembler := (FDebugger <> nil) and (FDisassembler <> nil); actCurrentInstr.Enabled := HasDisassembler and (FLocation <> 0); actGotoAddr.Enabled := HasDisassembler and (StrToQWordDef(EditGotoAddr.Text, 0) <> 0); actCopy.Enabled := HasDisassembler; + popCopyAddr.Enabled := GetLinMapEntryForLine(FSelectLine, dummy); actStepOverInstr.Enabled := HasDisassembler; actStepIntoInstr.Enabled := HasDisassembler; end; diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index 027dc14ae4..1aa16bd47c 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -469,6 +469,7 @@ resourcestring lisMenuViewHistory = 'History'; lisMenuViewAssembler = 'Assembler'; lisDbgAsmCopyToClipboard = 'Copy to Clipboard'; + lisDbgAsmCopyAddressToClipboard = 'Copy address to Clipboard'; lisMenuViewDebugOutput = 'Debug Output'; lisMenuViewDebugEvents = 'Event Log'; lisMenuIDEInternals = 'IDE Internals';