From 00ec6889f2f8e0fa0eab8aa461266488a21965b5 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Tue, 17 Feb 2015 21:21:43 +1100 Subject: [PATCH 1/8] Intuitive mouse dragging on views supporting selection, improved click-through behaviour --- src/osd/modules/debugger/osx/debugview.m | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/osd/modules/debugger/osx/debugview.m b/src/osd/modules/debugger/osx/debugview.m index 8ce77b59cc3..7182ac3ee5c 100644 --- a/src/osd/modules/debugger/osx/debugview.m +++ b/src/osd/modules/debugger/osx/debugview.m @@ -432,7 +432,7 @@ static void debugwin_view_update(debug_view &view, void *osdprivate) - (void)mouseDown:(NSEvent *)event { NSPoint const location = [self convertPoint:[event locationInWindow] fromView:nil]; NSUInteger const modifiers = [event modifierFlags]; - view->process_click((modifiers & NSCommandKeyMask) ? DCK_RIGHT_CLICK + view->process_click(((modifiers & NSCommandKeyMask) && [[self window] isMainWindow]) ? DCK_RIGHT_CLICK : (modifiers & NSAlternateKeyMask) ? DCK_MIDDLE_CLICK : DCK_LEFT_CLICK, [self convertLocation:location]); @@ -440,6 +440,20 @@ static void debugwin_view_update(debug_view &view, void *osdprivate) } +- (void)mouseDragged:(NSEvent *)event { + NSPoint const location = [self convertPoint:[event locationInWindow] fromView:nil]; + NSUInteger const modifiers = [event modifierFlags]; + if (view->cursor_supported() + && !(modifiers & NSAlternateKeyMask) + && (!(modifiers & NSCommandKeyMask) || ![[self window] isMainWindow])) + { + view->set_cursor_position([self convertLocation:location]); + view->set_cursor_visible(true); + [self setNeedsDisplay:YES]; + } +} + + - (void)rightMouseDown:(NSEvent *)event { NSPoint const location = [self convertPoint:[event locationInWindow] fromView:nil]; if (view->cursor_supported()) From 073e19b89dd2e6c1877c5376dddb79baa7337be2 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Tue, 17 Feb 2015 21:52:48 +1100 Subject: [PATCH 2/8] Allow breakpoint toggle and run-to-cursor on non-current CPUs in Qt debugger --- src/osd/modules/debugger/qt/dasmwindow.c | 56 +++++++++++++++++------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/src/osd/modules/debugger/qt/dasmwindow.c b/src/osd/modules/debugger/qt/dasmwindow.c index b88ace8613a..df171952052 100644 --- a/src/osd/modules/debugger/qt/dasmwindow.c +++ b/src/osd/modules/debugger/qt/dasmwindow.c @@ -128,25 +128,26 @@ void DasmWindow::toggleBreakpointAtCursor(bool changedTo) { if (m_dasmView->view()->cursor_visible()) { - if (debug_cpu_get_visible_cpu(*m_machine) == m_dasmView->view()->source()->device()) + offs_t address = downcast(m_dasmView->view())->selected_address(); + device_t *device = m_dasmView->view()->source()->device(); + device_debug *cpuinfo = device->debug(); + + // Find an existing breakpoint at this address + INT32 bpindex = -1; + for (device_debug::breakpoint* bp = cpuinfo->breakpoint_first(); + bp != NULL; + bp = bp->next()) { - offs_t address = downcast(m_dasmView->view())->selected_address(); - device_debug *cpuinfo = m_dasmView->view()->source()->device()->debug(); - - // Find an existing breakpoint at this address - INT32 bpindex = -1; - for (device_debug::breakpoint* bp = cpuinfo->breakpoint_first(); - bp != NULL; - bp = bp->next()) + if (address == bp->address()) { - if (address == bp->address()) - { - bpindex = bp->index(); - break; - } + bpindex = bp->index(); + break; } + } - // If none exists, add a new one + // If none exists, add a new one + if (debug_cpu_get_visible_cpu(*m_machine) == device) + { astring command; if (bpindex == -1) { @@ -158,6 +159,21 @@ void DasmWindow::toggleBreakpointAtCursor(bool changedTo) } debug_console_execute_command(*m_machine, command, 1); } + else + { + if (bpindex == -1) + { + bpindex = cpuinfo->breakpoint_set(address, NULL, NULL); + debug_console_printf(*m_machine, "Breakpoint %X set\n", bpindex); + } + else + { + cpuinfo->breakpoint_clear(bpindex); + debug_console_printf(*m_machine, "Breakpoint %X cleared\n", bpindex); + } + m_machine->debug_view().update_all(); + debugger_refresh_display(*m_machine); + } } refreshAll(); @@ -168,13 +184,19 @@ void DasmWindow::runToCursor(bool changedTo) { if (m_dasmView->view()->cursor_visible()) { - if (debug_cpu_get_visible_cpu(*m_machine) == m_dasmView->view()->source()->device()) + offs_t address = downcast(m_dasmView->view())->selected_address(); + device_t *device = m_dasmView->view()->source()->device(); + + if (debug_cpu_get_visible_cpu(*m_machine) == device) { - offs_t address = downcast(m_dasmView->view())->selected_address(); astring command; command.printf("go 0x%X", address); debug_console_execute_command(*m_machine, command, 1); } + else + { + device->debug()->go(address); + } } } From 69c1475dbf5e302377a3986747771824701ffe4c Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Wed, 18 Feb 2015 18:21:36 +1100 Subject: [PATCH 3/8] Move breakpoint control code out of view class - it doesn't really belong there --- src/osd/modules/debugger/osx/debugconsole.h | 4 + src/osd/modules/debugger/osx/debugconsole.m | 129 +++++++- src/osd/modules/debugger/osx/debugview.h | 4 + src/osd/modules/debugger/osx/debugview.m | 15 + .../modules/debugger/osx/debugwindowhandler.h | 3 + .../modules/debugger/osx/debugwindowhandler.m | 12 +- .../modules/debugger/osx/disassemblyview.h | 8 +- .../modules/debugger/osx/disassemblyview.m | 292 ++++-------------- .../modules/debugger/osx/disassemblyviewer.h | 4 + .../modules/debugger/osx/disassemblyviewer.m | 124 +++++++- src/osd/modules/debugger/osx/memoryview.m | 20 +- 11 files changed, 348 insertions(+), 267 deletions(-) diff --git a/src/osd/modules/debugger/osx/debugconsole.h b/src/osd/modules/debugger/osx/debugconsole.h index bf210458ed7..8bfeb521529 100644 --- a/src/osd/modules/debugger/osx/debugconsole.h +++ b/src/osd/modules/debugger/osx/debugconsole.h @@ -37,6 +37,10 @@ - (IBAction)doCommand:(id)sender; +- (IBAction)debugToggleBreakpoint:(id)sender; +- (IBAction)debugToggleBreakpointEnable:(id)sender; +- (IBAction)debugRunToCursor:(id)sender; + - (IBAction)debugNewMemoryWindow:(id)sender; - (IBAction)debugNewDisassemblyWindow:(id)sender; - (IBAction)debugNewErrorLogWindow:(id)sender; diff --git a/src/osd/modules/debugger/osx/debugconsole.m b/src/osd/modules/debugger/osx/debugconsole.m index bc290db2df8..3266026cf27 100644 --- a/src/osd/modules/debugger/osx/debugconsole.m +++ b/src/osd/modules/debugger/osx/debugconsole.m @@ -53,9 +53,7 @@ [regView release]; // create the disassembly view - dasmView = [[MAMEDisassemblyView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100) - machine:*machine - useConsole:YES]; + dasmView = [[MAMEDisassemblyView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100) machine:*machine]; [dasmView setExpression:@"curpc"]; dasmScroll = [[NSScrollView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)]; [dasmScroll setDrawsBackground:YES]; @@ -215,10 +213,13 @@ - (IBAction)doCommand:(id)sender { NSString *command = [sender stringValue]; - if ([command length] == 0) { + if ([command length] == 0) + { debug_cpu_get_visible_cpu(*machine)->debug()->single_step(); [history reset]; - } else { + } + else + { debug_console_execute_command(*machine, [command UTF8String], 1); [history add:command]; [history edit]; @@ -227,6 +228,54 @@ } +- (IBAction)debugToggleBreakpoint:(id)sender { + device_t &device = [dasmView source]->device(); + if ([dasmView cursorVisible] && (debug_cpu_get_visible_cpu(*machine) == &device)) + { + offs_t const address = [dasmView selectedAddress]; + device_debug::breakpoint *bp = [[self class] findBreakpointAtAddress:address + forDevice:device]; + + // if it doesn't exist, add a new one + NSString *command; + if (bp == NULL) + command = [NSString stringWithFormat:@"bpset %lX", (unsigned long)address]; + else + command = [NSString stringWithFormat:@"bpclear %X", (unsigned)bp->index()]; + debug_console_execute_command(*machine, [command UTF8String], 1); + } +} + + +- (IBAction)debugToggleBreakpointEnable:(id)sender { + device_t &device = [dasmView source]->device(); + if ([dasmView cursorVisible] && (debug_cpu_get_visible_cpu(*machine) == &device)) + { + device_debug::breakpoint *bp = [[self class] findBreakpointAtAddress:[dasmView selectedAddress] + forDevice:device]; + if (bp != NULL) + { + NSString *command; + if (bp->enabled()) + command = [NSString stringWithFormat:@"bpdisable %X", (unsigned)bp->index()]; + else + command = [NSString stringWithFormat:@"bpenable %X", (unsigned)bp->index()]; + debug_console_execute_command(*machine, [command UTF8String], 1); + } + } +} + + +- (IBAction)debugRunToCursor:(id)sender { + device_t &device = [dasmView source]->device(); + if ([dasmView cursorVisible] && (debug_cpu_get_visible_cpu(*machine) == &device)) + { + NSString *command = [NSString stringWithFormat:@"go 0x%lX", (unsigned long)[dasmView selectedAddress]]; + debug_console_execute_command(*machine, [command UTF8String], 1); + } +} + + - (IBAction)debugNewMemoryWindow:(id)sender { MAMEMemoryViewer *win = [[MAMEMemoryViewer alloc] initWithMachine:*machine console:self]; [auxiliaryWindows addObject:win]; @@ -419,4 +468,74 @@ [[[sender subviews] objectAtIndex:1] setFrame:second]; } + +- (BOOL)validateMenuItem:(NSMenuItem *)item { + SEL const action = [item action]; + BOOL const inContextMenu = ([item menu] == [dasmView menu]); + BOOL const haveCursor = [dasmView cursorVisible]; + BOOL const isCurrent = (debug_cpu_get_visible_cpu(*machine) == &[dasmView source]->device()); + + device_debug::breakpoint *breakpoint = NULL; + if (haveCursor) + { + breakpoint = [[self class] findBreakpointAtAddress:[dasmView selectedAddress] + forDevice:[dasmView source]->device()]; + } + + if (action == @selector(debugToggleBreakpoint:)) + { + if (haveCursor) + { + if (breakpoint != NULL) + { + if (inContextMenu) + [item setTitle:@"Clear Breakpoint"]; + else + [item setTitle:@"Clear Breakpoint at Cursor"]; + } + else + { + if (inContextMenu) + [item setTitle:@"Set Breakpoint"]; + else + [item setTitle:@"Set Breakpoint at Cursor"]; + } + } + else + { + if (inContextMenu) + [item setTitle:@"Toggle Breakpoint"]; + else + [item setTitle:@"Toggle Breakpoint at Cursor"]; + } + return haveCursor && isCurrent; + } + else if (action == @selector(debugToggleBreakpointEnable:)) + { + if ((breakpoint != NULL) && !breakpoint->enabled()) + { + if (inContextMenu) + [item setTitle:@"Enable Breakpoint"]; + else + [item setTitle:@"Enable Breakpoint at Cursor"]; + } + else + { + if (inContextMenu) + [item setTitle:@"Disable Breakpoint"]; + else + [item setTitle:@"Disable Breakpoint at Cursor"]; + } + return (breakpoint != NULL) && isCurrent; + } + else if (action == @selector(debugRunToCursor:)) + { + return isCurrent; + } + else + { + return YES; + } +} + @end diff --git a/src/osd/modules/debugger/osx/debugview.h b/src/osd/modules/debugger/osx/debugview.h index abb53efb852..a95d81a85c6 100644 --- a/src/osd/modules/debugger/osx/debugview.h +++ b/src/osd/modules/debugger/osx/debugview.h @@ -44,6 +44,10 @@ - (NSFont *)font; - (void)setFont:(NSFont *)f; +- (BOOL)cursorSupported; +- (BOOL)cursorVisible; +- (debug_view_xy)cursorPosition; + - (void)windowDidBecomeKey:(NSNotification *)notification; - (void)windowDidResignKey:(NSNotification *)notification; diff --git a/src/osd/modules/debugger/osx/debugview.m b/src/osd/modules/debugger/osx/debugview.m index 7182ac3ee5c..7e79909ef3b 100644 --- a/src/osd/modules/debugger/osx/debugview.m +++ b/src/osd/modules/debugger/osx/debugview.m @@ -286,6 +286,21 @@ static void debugwin_view_update(debug_view &view, void *osdprivate) } +- (BOOL)cursorSupported { + return view->cursor_supported(); +} + + +- (BOOL)cursorVisible { + return view->cursor_visible(); +} + + +- (debug_view_xy)cursorPosition { + return view->cursor_position(); +} + + - (void)windowDidBecomeKey:(NSNotification *)notification { NSWindow *win = [notification object]; if ((win == [self window]) && ([win firstResponder] == self) && view->cursor_supported()) diff --git a/src/osd/modules/debugger/osx/debugwindowhandler.h b/src/osd/modules/debugger/osx/debugwindowhandler.h index 56f3c98f9df..2764dc4046c 100644 --- a/src/osd/modules/debugger/osx/debugwindowhandler.h +++ b/src/osd/modules/debugger/osx/debugwindowhandler.h @@ -12,6 +12,7 @@ #import "debugosx.h" #include "emu.h" +#include "debug/debugcpu.h" #import @@ -34,6 +35,8 @@ extern NSString *const MAMEAuxiliaryDebugWindowWillCloseNotification; + (void)addCommonActionItems:(NSMenu *)menu; + (NSPopUpButton *)newActionButtonWithFrame:(NSRect)frame; ++ (device_debug::breakpoint *)findBreakpointAtAddress:(offs_t)address forDevice:(device_t &)device; + - (id)initWithMachine:(running_machine &)m title:(NSString *)t; - (void)activate; diff --git a/src/osd/modules/debugger/osx/debugwindowhandler.m b/src/osd/modules/debugger/osx/debugwindowhandler.m index ba0a0d83351..924208a33cd 100644 --- a/src/osd/modules/debugger/osx/debugwindowhandler.m +++ b/src/osd/modules/debugger/osx/debugwindowhandler.m @@ -14,8 +14,6 @@ #import "debugcommandhistory.h" #import "debugview.h" -#include "debug/debugcpu.h" - //============================================================ // NOTIFICATIONS @@ -128,6 +126,14 @@ NSString *const MAMEAuxiliaryDebugWindowWillCloseNotification = @"MAMEAuxiliaryD } ++ (device_debug::breakpoint *)findBreakpointAtAddress:(offs_t)address forDevice:(device_t &)device { + device_debug *const cpuinfo = device.debug(); + device_debug::breakpoint *bp = cpuinfo->breakpoint_first(); + while ((bp != NULL) && (address != bp->address())) bp = bp->next(); + return bp; +} + + - (id)initWithMachine:(running_machine &)m title:(NSString *)t { if (!(self = [super init])) return nil; @@ -421,4 +427,4 @@ NSString *const MAMEAuxiliaryDebugWindowWillCloseNotification = @"MAMEAuxiliaryD return NO; } -@end \ No newline at end of file +@end diff --git a/src/osd/modules/debugger/osx/disassemblyview.h b/src/osd/modules/debugger/osx/disassemblyview.h index 40d2b04f379..7b2a501bfc6 100644 --- a/src/osd/modules/debugger/osx/disassemblyview.h +++ b/src/osd/modules/debugger/osx/disassemblyview.h @@ -21,10 +21,9 @@ @interface MAMEDisassemblyView : MAMEDebugView { - BOOL useConsole; } -- (id)initWithFrame:(NSRect)f machine:(running_machine &)m useConsole:(BOOL)uc; +- (id)initWithFrame:(NSRect)f machine:(running_machine &)m; - (NSSize)maximumFrameSize; @@ -38,10 +37,7 @@ - (void)setExpression:(NSString *)exp; - (debug_view_disasm_source const *)source; - -- (IBAction)debugToggleBreakpoint:(id)sender; -- (IBAction)debugToggleBreakpointEnable:(id)sender; -- (IBAction)debugRunToCursor:(id)sender; +- (offs_t)selectedAddress; - (IBAction)showRightColumn:(id)sender; diff --git a/src/osd/modules/debugger/osx/disassemblyview.m b/src/osd/modules/debugger/osx/disassemblyview.m index f5e5864372b..6f7eec6e5d5 100644 --- a/src/osd/modules/debugger/osx/disassemblyview.m +++ b/src/osd/modules/debugger/osx/disassemblyview.m @@ -11,21 +11,11 @@ #import "disassemblyview.h" -#include "debugger.h" -#include "debug/debugcon.h" -#include "debug/debugcpu.h" #include "debug/debugvw.h" @implementation MAMEDisassemblyView -- (device_debug::breakpoint *)findBreakpointAtAddress:(offs_t)address forDevice:(device_t &)device { - device_debug *cpuinfo = device.debug(); - device_debug::breakpoint *bp; - for (bp = cpuinfo->breakpoint_first(); (bp != NULL) && (address != bp->address()); bp = bp->next()) { } - return bp; -} - - (void)createContextMenu { NSMenu *contextMenu = [[NSMenu allocWithZone:[NSMenu menuZone]] initWithTitle:@"Disassembly"]; NSMenuItem *item; @@ -34,13 +24,11 @@ action:@selector(debugToggleBreakpoint:) keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF9FunctionKey]]; [item setKeyEquivalentModifierMask:0]; - [item setTarget:self]; item = [contextMenu addItemWithTitle:@"Disable Breakpoint" action:@selector(debugToggleBreakpointEnable:) keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF9FunctionKey]]; [item setKeyEquivalentModifierMask:NSShiftKeyMask]; - [item setTarget:self]; [contextMenu addItem:[NSMenuItem separatorItem]]; @@ -48,7 +36,6 @@ action:@selector(debugRunToCursor:) keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF4FunctionKey]]; [item setKeyEquivalentModifierMask:0]; - [item setTarget:self]; [contextMenu addItem:[NSMenuItem separatorItem]]; @@ -75,10 +62,9 @@ } -- (id)initWithFrame:(NSRect)f machine:(running_machine &)m useConsole:(BOOL)uc { +- (id)initWithFrame:(NSRect)f machine:(running_machine &)m { if (!(self = [super initWithFrame:f type:DVT_DISASSEMBLY machine:m])) return nil; - useConsole = uc; [self createContextMenu]; return self; } @@ -91,68 +77,8 @@ - (BOOL)validateMenuItem:(NSMenuItem *)item { SEL const action = [item action]; - BOOL const inContextMenu = ([item menu] == [self menu]); - BOOL haveCursor = view->cursor_visible(); - BOOL const isCurrent = (debug_cpu_get_visible_cpu(*machine) == view->source()->device()); - device_debug::breakpoint *breakpoint = NULL; - if (haveCursor) - { - offs_t const address = downcast(view)->selected_address(); - breakpoint = [self findBreakpointAtAddress:address forDevice:[self source]->device()]; - } - - if (action == @selector(debugToggleBreakpoint:)) - { - if (haveCursor) - { - if (breakpoint != NULL) - { - if (inContextMenu) - [item setTitle:@"Clear Breakpoint"]; - else - [item setTitle:@"Clear Breakpoint at Cursor"]; - } - else - { - if (inContextMenu) - [item setTitle:@"Set Breakpoint"]; - else - [item setTitle:@"Set Breakpoint at Cursor"]; - } - } - else - { - if (inContextMenu) - [item setTitle:@"Toggle Breakpoint"]; - else - [item setTitle:@"Toggle Breakpoint at Cursor"]; - } - return haveCursor && (!useConsole || isCurrent); - } - else if (action == @selector(debugToggleBreakpointEnable:)) - { - if ((breakpoint != NULL) && !breakpoint->enabled()) - { - if (inContextMenu) - [item setTitle:@"Enable Breakpoint"]; - else - [item setTitle:@"Enable Breakpoint at Cursor"]; - } - else - { - if (inContextMenu) - [item setTitle:@"Disable Breakpoint"]; - else - [item setTitle:@"Disable Breakpoint at Cursor"]; - } - return (breakpoint != NULL) && (!useConsole || isCurrent); - } - else if (action == @selector(debugRunToCursor:)) - { - return !useConsole || isCurrent; - } - else if (action == @selector(showRightColumn:)) + if (action == @selector(showRightColumn:)) { [item setState:((downcast(view)->right_column() == [item tag]) ? NSOnState : NSOffState)]; return YES; @@ -166,17 +92,13 @@ - (NSSize)maximumFrameSize { debug_view_xy max(0, 0); - const debug_view_source *source = view->source(); - - for (const debug_view_source *source = view->source_list().first(); source != NULL; source = source->next()) + debug_view_source const *source = view->source(); + for (debug_view_source const *source = view->first_source(); source != NULL; source = source->next()) { - debug_view_xy current; view->set_source(*source); - current = view->total_size(); - if (current.x > max.x) - max.x = current.x; - if (current.y > max.y) - max.y = current.y; + debug_view_xy const current = view->total_size(); + max.x = MAX(max.x, current.x); + max.y = MAX(max.y, current.y); } view->set_source(*source); return NSMakeSize(max.x * fontWidth, max.y * fontHeight); @@ -267,101 +189,8 @@ } -- (IBAction)debugToggleBreakpoint:(id)sender { - if (view->cursor_visible()) - { - device_t &device = [self source]->device(); - if (!useConsole || (debug_cpu_get_visible_cpu(*machine) == &device)) - { - offs_t const address = downcast(view)->selected_address(); - device_debug::breakpoint *bp = [self findBreakpointAtAddress:address forDevice:device]; - - // if it doesn't exist, add a new one - if (useConsole) - { - NSString *command; - if (bp == NULL) - command = [NSString stringWithFormat:@"bpset %lX", (unsigned long)address]; - else - command = [NSString stringWithFormat:@"bpclear %X", (unsigned)bp->index()]; - debug_console_execute_command(*machine, [command UTF8String], 1); - } - else - { - if (bp == NULL) - { - UINT32 const bpnum = device.debug()->breakpoint_set(address, NULL, NULL); - debug_console_printf(*machine, "Breakpoint %X set\n", bpnum); - } - else - { - int const bpnum = bp->index(); - device.debug()->breakpoint_clear(bpnum); - debug_console_printf(*machine, "Breakpoint %X cleared\n", (UINT32)bpnum); - } - } - - // fail to do this and the display doesn't update - machine->debug_view().update_all(); - debugger_refresh_display(*machine); - } - } -} - - -- (IBAction)debugToggleBreakpointEnable:(id)sender { - if (view->cursor_visible()) - { - device_t &device = [self source]->device(); - if (!useConsole || (debug_cpu_get_visible_cpu(*machine) == &device)) - { - offs_t const address = downcast(view)->selected_address(); - device_debug::breakpoint *bp = [self findBreakpointAtAddress:address forDevice:device]; - if (bp != NULL) - { - if (useConsole) - { - NSString *command; - if (bp->enabled()) - command = [NSString stringWithFormat:@"bpdisable %X", (unsigned)bp->index()]; - else - command = [NSString stringWithFormat:@"bpenable %X", (unsigned)bp->index()]; - debug_console_execute_command(*machine, [command UTF8String], 1); - } - else - { - device.debug()->breakpoint_enable(bp->index(), !bp->enabled()); - debug_console_printf(*machine, - "Breakpoint %X %s\n", - (UINT32)bp->index(), - bp->enabled() ? "enabled" : "disabled"); - } - machine->debug_view().update_all(); - debugger_refresh_display(*machine); - } - } - } -} - - -- (IBAction)debugRunToCursor:(id)sender { - if (view->cursor_visible()) - { - device_t &device = [self source]->device(); - if (!useConsole || (debug_cpu_get_visible_cpu(*machine) == &device)) - { - offs_t const address = downcast(view)->selected_address(); - if (useConsole) - { - NSString *command = [NSString stringWithFormat:@"go 0x%lX", (unsigned long)address]; - debug_console_execute_command(*machine, [command UTF8String], 1); - } - else - { - device.debug()->go(address); - } - } - } +- (offs_t)selectedAddress { + return downcast(view)->selected_address(); } @@ -371,64 +200,55 @@ - (void)insertActionItemsInMenu:(NSMenu *)menu atIndex:(NSInteger)index { - { - NSMenuItem *breakItem = [menu insertItemWithTitle:@"Toggle Breakpoint at Cursor" - action:@selector(debugToggleBreakpoint:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF9FunctionKey] - atIndex:index++]; - [breakItem setKeyEquivalentModifierMask:0]; - [breakItem setTarget:self]; - } - { - NSMenuItem *disableItem = [menu insertItemWithTitle:@"Disable Breakpoint at Cursor" - action:@selector(debugToggleBreakpointEnable:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF9FunctionKey] - atIndex:index++]; - [disableItem setKeyEquivalentModifierMask:NSShiftKeyMask]; - [disableItem setAlternate:YES]; - [disableItem setTarget:self]; - } - { - NSMenu *runMenu = [[menu itemWithTitle:@"Run"] submenu]; - NSMenuItem *runItem; - if (runMenu != nil) { - runItem = [runMenu addItemWithTitle:@"to Cursor" - action:@selector(debugRunToCursor:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF4FunctionKey]]; - } else { - runItem = [menu insertItemWithTitle:@"Run to Cursor" - action:@selector(debugRunToCursor:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF4FunctionKey] - atIndex:index++]; - } - [runItem setKeyEquivalentModifierMask:0]; - [runItem setTarget:self]; + NSMenuItem *breakItem = [menu insertItemWithTitle:@"Toggle Breakpoint at Cursor" + action:@selector(debugToggleBreakpoint:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF9FunctionKey] + atIndex:index++]; + [breakItem setKeyEquivalentModifierMask:0]; + + NSMenuItem *disableItem = [menu insertItemWithTitle:@"Disable Breakpoint at Cursor" + action:@selector(debugToggleBreakpointEnable:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF9FunctionKey] + atIndex:index++]; + [disableItem setKeyEquivalentModifierMask:NSShiftKeyMask]; + + NSMenu *runMenu = [[menu itemWithTitle:@"Run"] submenu]; + NSMenuItem *runItem; + if (runMenu != nil) { + runItem = [runMenu addItemWithTitle:@"to Cursor" + action:@selector(debugRunToCursor:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF4FunctionKey]]; + } else { + runItem = [menu insertItemWithTitle:@"Run to Cursor" + action:@selector(debugRunToCursor:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF4FunctionKey] + atIndex:index++]; } + [runItem setKeyEquivalentModifierMask:0]; + [menu insertItem:[NSMenuItem separatorItem] atIndex:index++]; - { - NSMenuItem *rawItem = [menu insertItemWithTitle:@"Show Raw Opcodes" - action:@selector(showRightColumn:) - keyEquivalent:@"r" - atIndex:index++]; - [rawItem setTarget:self]; - [rawItem setTag:DASM_RIGHTCOL_RAW]; - } - { - NSMenuItem *encItem = [menu insertItemWithTitle:@"Show Encrypted Opcodes" - action:@selector(showRightColumn:) - keyEquivalent:@"e" - atIndex:index++]; - [encItem setTarget:self]; - [encItem setTag:DASM_RIGHTCOL_ENCRYPTED]; - } - { - NSMenuItem *commentsItem = [menu insertItemWithTitle:@"Show Comments" - action:@selector(showRightColumn:) - keyEquivalent:@"n" - atIndex:index++]; - [commentsItem setTarget:self]; - [commentsItem setTag:DASM_RIGHTCOL_COMMENTS]; - } + + NSMenuItem *rawItem = [menu insertItemWithTitle:@"Show Raw Opcodes" + action:@selector(showRightColumn:) + keyEquivalent:@"r" + atIndex:index++]; + [rawItem setTarget:self]; + [rawItem setTag:DASM_RIGHTCOL_RAW]; + + NSMenuItem *encItem = [menu insertItemWithTitle:@"Show Encrypted Opcodes" + action:@selector(showRightColumn:) + keyEquivalent:@"e" + atIndex:index++]; + [encItem setTarget:self]; + [encItem setTag:DASM_RIGHTCOL_ENCRYPTED]; + + NSMenuItem *commentsItem = [menu insertItemWithTitle:@"Show Comments" + action:@selector(showRightColumn:) + keyEquivalent:@"n" + atIndex:index++]; + [commentsItem setTarget:self]; + [commentsItem setTag:DASM_RIGHTCOL_COMMENTS]; + if (index < [menu numberOfItems]) [menu insertItem:[NSMenuItem separatorItem] atIndex:index++]; } diff --git a/src/osd/modules/debugger/osx/disassemblyviewer.h b/src/osd/modules/debugger/osx/disassemblyviewer.h index 27099aa9dc7..732975c5ddd 100644 --- a/src/osd/modules/debugger/osx/disassemblyviewer.h +++ b/src/osd/modules/debugger/osx/disassemblyviewer.h @@ -31,6 +31,10 @@ - (BOOL)selectSubviewForDevice:(device_t *)device; - (BOOL)selectSubviewForSpace:(address_space *)space; +- (IBAction)debugToggleBreakpoint:(id)sender; +- (IBAction)debugToggleBreakpointEnable:(id)sender; +- (IBAction)debugRunToCursor:(id)sender; + - (IBAction)changeSubview:(id)sender; @end diff --git a/src/osd/modules/debugger/osx/disassemblyviewer.m b/src/osd/modules/debugger/osx/disassemblyviewer.m index 7fcbb842b2d..6f7d9176082 100644 --- a/src/osd/modules/debugger/osx/disassemblyviewer.m +++ b/src/osd/modules/debugger/osx/disassemblyviewer.m @@ -15,6 +15,8 @@ #import "debugview.h" #import "disassemblyview.h" +#include "debugger.h" +#include "debug/debugcon.h" #include "debug/debugcpu.h" @@ -69,9 +71,7 @@ [expressionContainer release]; // create the disassembly view - dasmView = [[MAMEDisassemblyView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100) - machine:*machine - useConsole:NO]; + dasmView = [[MAMEDisassemblyView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100) machine:*machine]; [dasmView insertSubviewItemsInMenu:[subviewButton menu] atIndex:0]; dasmScroll = [[NSScrollView alloc] initWithFrame:NSMakeRect(0, 0, @@ -161,9 +161,127 @@ } +- (IBAction)debugToggleBreakpoint:(id)sender { + if ([dasmView cursorVisible]) + { + device_t &device = [dasmView source]->device(); + offs_t const address = [dasmView selectedAddress]; + device_debug::breakpoint *bp = [[self class] findBreakpointAtAddress:address forDevice:device]; + + // if it doesn't exist, add a new one + if (bp == NULL) + { + UINT32 const bpnum = device.debug()->breakpoint_set(address, NULL, NULL); + debug_console_printf(*machine, "Breakpoint %X set\n", bpnum); + } + else + { + int const bpnum = bp->index(); + device.debug()->breakpoint_clear(bpnum); + debug_console_printf(*machine, "Breakpoint %X cleared\n", (UINT32)bpnum); + } + + // fail to do this and the display doesn't update + machine->debug_view().update_all(); + debugger_refresh_display(*machine); + } +} + + +- (IBAction)debugToggleBreakpointEnable:(id)sender { + if ([dasmView cursorVisible]) + { + device_t &device = [dasmView source]->device(); + offs_t const address = [dasmView selectedAddress]; + device_debug::breakpoint *bp = [[self class] findBreakpointAtAddress:address forDevice:device]; + if (bp != NULL) + { + device.debug()->breakpoint_enable(bp->index(), !bp->enabled()); + debug_console_printf(*machine, + "Breakpoint %X %s\n", + (UINT32)bp->index(), + bp->enabled() ? "enabled" : "disabled"); + machine->debug_view().update_all(); + debugger_refresh_display(*machine); + } + } +} + + +- (IBAction)debugRunToCursor:(id)sender { + if ([dasmView cursorVisible]) + [dasmView source]->device().debug()->go([dasmView selectedAddress]); +} + + - (IBAction)changeSubview:(id)sender { [dasmView selectSubviewAtIndex:[[sender selectedItem] tag]]; [window setTitle:[NSString stringWithFormat:@"Disassembly: %@", [dasmView selectedSubviewName]]]; } + +- (BOOL)validateMenuItem:(NSMenuItem *)item { + SEL const action = [item action]; + BOOL const inContextMenu = ([item menu] == [dasmView menu]); + BOOL const haveCursor = [dasmView cursorVisible]; + + device_debug::breakpoint *breakpoint = NULL; + if (haveCursor) + { + breakpoint = [[self class] findBreakpointAtAddress:[dasmView selectedAddress] + forDevice:[dasmView source]->device()]; + } + + if (action == @selector(debugToggleBreakpoint:)) + { + if (haveCursor) + { + if (breakpoint != NULL) + { + if (inContextMenu) + [item setTitle:@"Clear Breakpoint"]; + else + [item setTitle:@"Clear Breakpoint at Cursor"]; + } + else + { + if (inContextMenu) + [item setTitle:@"Set Breakpoint"]; + else + [item setTitle:@"Set Breakpoint at Cursor"]; + } + } + else + { + if (inContextMenu) + [item setTitle:@"Toggle Breakpoint"]; + else + [item setTitle:@"Toggle Breakpoint at Cursor"]; + } + return haveCursor; + } + else if (action == @selector(debugToggleBreakpointEnable:)) + { + if ((breakpoint != NULL) && !breakpoint->enabled()) + { + if (inContextMenu) + [item setTitle:@"Enable Breakpoint"]; + else + [item setTitle:@"Enable Breakpoint at Cursor"]; + } + else + { + if (inContextMenu) + [item setTitle:@"Disable Breakpoint"]; + else + [item setTitle:@"Disable Breakpoint at Cursor"]; + } + return breakpoint != NULL; + } + else + { + return YES; + } +} + @end diff --git a/src/osd/modules/debugger/osx/memoryview.m b/src/osd/modules/debugger/osx/memoryview.m index 0f02fac83ef..be2cf107535 100644 --- a/src/osd/modules/debugger/osx/memoryview.m +++ b/src/osd/modules/debugger/osx/memoryview.m @@ -56,22 +56,14 @@ - (NSSize)maximumFrameSize { - debug_view_xy max; - device_t *curcpu = debug_cpu_get_visible_cpu(*machine); - debug_view_source const *source = view->source_for_device(curcpu); - - max.x = max.y = 0; - for (const debug_view_source *source = view->source_list().first(); - source != NULL; - source = source->next()) + debug_view_xy max(0, 0); + debug_view_source const *source = view->source(); + for (debug_view_source const *source = view->first_source(); source != NULL; source = source->next()) { - debug_view_xy current; view->set_source(*source); - current = view->total_size(); - if (current.x > max.x) - max.x = current.x; - if (current.y > max.y) - max.y = current.y; + debug_view_xy const current = view->total_size(); + max.x = MAX(max.x, current.x); + max.y = MAX(max.y, current.y); } view->set_source(*source); return NSMakeSize(max.x * fontWidth, max.y * fontHeight); From fc66643879c606d6cfb44ed6c2e4feffe3b6856d Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Thu, 19 Feb 2015 00:42:26 +1100 Subject: [PATCH 4/8] Add preliminary device detail windows --- src/osd/modules/debugger/osx/debugconsole.h | 1 + src/osd/modules/debugger/osx/debugconsole.m | 11 + src/osd/modules/debugger/osx/debugview.m | 1 + .../modules/debugger/osx/deviceinfoviewer.h | 30 +++ .../modules/debugger/osx/deviceinfoviewer.m | 195 ++++++++++++++++++ src/osd/modules/debugger/osx/devicesviewer.h | 2 + src/osd/modules/debugger/osx/devicesviewer.m | 9 +- src/osd/sdl/sdl.mak | 1 + 8 files changed, 249 insertions(+), 1 deletion(-) create mode 100644 src/osd/modules/debugger/osx/deviceinfoviewer.h create mode 100644 src/osd/modules/debugger/osx/deviceinfoviewer.m diff --git a/src/osd/modules/debugger/osx/debugconsole.h b/src/osd/modules/debugger/osx/debugconsole.h index 8bfeb521529..4cae426ce9e 100644 --- a/src/osd/modules/debugger/osx/debugconsole.h +++ b/src/osd/modules/debugger/osx/debugconsole.h @@ -49,6 +49,7 @@ - (void)debugNewMemoryWindowForSpace:(address_space *)space device:(device_t *)device expression:(NSString *)expression; - (void)debugNewDisassemblyWindowForSpace:(address_space *)space device:(device_t *)device expression:(NSString *)expression; +- (void)debugNewInfoWindowForDevice:(device_t &)device; - (void)showDebugger:(NSNotification *)notification; - (void)auxiliaryWindowWillClose:(NSNotification *)notification; diff --git a/src/osd/modules/debugger/osx/debugconsole.m b/src/osd/modules/debugger/osx/debugconsole.m index 3266026cf27..130699b0ab5 100644 --- a/src/osd/modules/debugger/osx/debugconsole.m +++ b/src/osd/modules/debugger/osx/debugconsole.m @@ -14,6 +14,7 @@ #import "debugcommandhistory.h" #import "consoleview.h" #import "debugview.h" +#import "deviceinfoviewer.h" #import "devicesviewer.h" #import "disassemblyview.h" #import "disassemblyviewer.h" @@ -350,6 +351,16 @@ } +- (void)debugNewInfoWindowForDevice:(device_t &)device { + MAMEDeviceInfoViewer *win = [[MAMEDeviceInfoViewer alloc] initWithDevice:device + machine:*machine + console:self]; + [auxiliaryWindows addObject:win]; + [win release]; + [win activate]; +} + + - (void)showDebugger:(NSNotification *)notification { device_t *device = (device_t * )[[[notification userInfo] objectForKey:@"MAMEDebugDevice"] pointerValue]; if (&device->machine() == machine) diff --git a/src/osd/modules/debugger/osx/debugview.m b/src/osd/modules/debugger/osx/debugview.m index 7e79909ef3b..52c34077546 100644 --- a/src/osd/modules/debugger/osx/debugview.m +++ b/src/osd/modules/debugger/osx/debugview.m @@ -456,6 +456,7 @@ static void debugwin_view_update(debug_view &view, void *osdprivate) - (void)mouseDragged:(NSEvent *)event { + [self autoscroll:event]; NSPoint const location = [self convertPoint:[event locationInWindow] fromView:nil]; NSUInteger const modifiers = [event modifierFlags]; if (view->cursor_supported() diff --git a/src/osd/modules/debugger/osx/deviceinfoviewer.h b/src/osd/modules/debugger/osx/deviceinfoviewer.h new file mode 100644 index 00000000000..41243a954de --- /dev/null +++ b/src/osd/modules/debugger/osx/deviceinfoviewer.h @@ -0,0 +1,30 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +//============================================================ +// +// deviceinfoviewer.h - MacOS X Cocoa debug window handling +// +// Copyright (c) 1996-2015, Nicola Salmoria and the MAME Team. +// Visit http://mamedev.org for licensing and usage restrictions. +// +//============================================================ + +#import "debugosx.h" + +#import "debugwindowhandler.h" + +#include "emu.h" + +#import + + +@class MAMEDebugConsole, MAMEDeviceWrapper; + +@interface MAMEDeviceInfoViewer : MAMEAuxiliaryDebugWindowHandler +{ + device_t *device; +} + +- (id)initWithDevice:(device_t &)d machine:(running_machine &)m console:(MAMEDebugConsole *)c; + +@end diff --git a/src/osd/modules/debugger/osx/deviceinfoviewer.m b/src/osd/modules/debugger/osx/deviceinfoviewer.m new file mode 100644 index 00000000000..eb729091021 --- /dev/null +++ b/src/osd/modules/debugger/osx/deviceinfoviewer.m @@ -0,0 +1,195 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +//============================================================ +// +// deviceinfoviewer.m - MacOS X Cocoa debug window handling +// +// Copyright (c) 1996-2015, Nicola Salmoria and the MAME Team. +// Visit http://mamedev.org for licensing and usage restrictions. +// +//============================================================ + +#import "deviceinfoviewer.h" + + +@implementation MAMEDeviceInfoViewer + +- (NSTextField *)makeLabel:(NSString *)text { + NSTextField *const result = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 100, 14)]; + [result setAutoresizingMask:NSViewMinYMargin]; + [[result cell] setControlSize:NSSmallControlSize]; + [result setEditable:NO]; + [result setSelectable:NO]; + [result setBezeled:NO]; + [result setBordered:NO]; + [result setDrawsBackground:NO]; + [result setAlignment:NSRightTextAlignment]; + [result setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]]; + [result setStringValue:text]; + [result sizeToFit]; + return result; +} + + +- (NSTextField *)makeField:(NSString *)text { + NSTextField *const result = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 100, 14)]; + [result setAutoresizingMask:(NSViewWidthSizable | NSViewMinYMargin)]; + [[result cell] setControlSize:NSSmallControlSize]; + [result setEditable:NO]; + [result setSelectable:YES]; + [result setBezeled:NO]; + [result setBordered:NO]; + [result setDrawsBackground:NO]; + [result setAlignment:NSLeftTextAlignment]; + [result setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]]; + [result setStringValue:text]; + [result sizeToFit]; + return result; +} + + +- (NSBox *)makeBox:(NSString *)t toFit:(NSView *)v { + NSBox *const result = [[NSBox alloc] initWithFrame:NSMakeRect(0, 0, [v frame].size.width - 34, 32)]; + [result setAutoresizingMask:(NSViewWidthSizable | NSViewMinYMargin)]; + [result setTitle:t]; + [result setBoxType:NSBoxPrimary]; + [result setBorderType:NSLineBorder]; + [result setContentViewMargins:NSMakeSize(0, 0)]; + [result setAutoresizesSubviews:YES]; + return result; +} + + +- (void)addLabel:(NSString *)l withWidth:(CGFloat)w andField:(NSString *)f toView:(NSView *)v { + NSTextField *const label = [self makeLabel:l]; + NSTextField *const field = [self makeField:f]; + CGFloat const height = MAX([label frame].size.height, [field frame].size.height); + NSSize space = [v bounds].size; + space.width = MAX(space.width, [field frame].size.width + w + 52); + space.height += height + 8; + [label setFrame:NSMakeRect(25, 20, w, height)]; + [field setFrame:NSMakeRect(w + 27, 20, space.width - w - 52, height)]; + [v setFrameSize:space]; + [v addSubview:label]; + [v addSubview:field]; + [label release]; + [field release]; +} + + +- (void)addField:(NSString *)f toBox:(NSBox *)b { + NSTextField *const field = [self makeField:f]; + NSSize space = [b frame].size; + space.width = MAX(space.width, [field frame].size.width + 32); + space.height += [field frame].size.height + 8; + [field setFrame:NSMakeRect(15, 14, space.width - 32, [field frame].size.height)]; + [b setFrameSize:space]; + [[b contentView] addSubview:field]; + [field release]; +} + + +- (void)addBox:(NSBox *)b toView:(NSView *)v { + [b setFrameOrigin:NSMakePoint(17, 16)]; + NSSize space = [v frame].size; + space.width = MAX(space.width, [b frame].size.width + 34); + space.height += [b frame].size.height + 4; + [v setFrameSize:space]; + [v addSubview:b]; +} + + +- (id)initWithDevice:(device_t &)d machine:(running_machine &)m console:(MAMEDebugConsole *)c { + NSView *contentView; + NSScrollView *contentScroll; + + if (!(self = [super initWithMachine:m + title:[NSString stringWithFormat:@"Device %s", d.tag()] + console:c])) + { + return nil; + } + device = &d; + + // Create a view to hold everything + contentView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 320, 32)]; + [contentView setAutoresizingMask:(NSViewMaxXMargin | NSViewMinYMargin)]; + [contentView setAutoresizesSubviews:YES]; + + // add the stuff that's always present + [self addLabel:@"Tag:" + withWidth:100 + andField:[NSString stringWithUTF8String:device->tag()] + toView:contentView]; + [self addLabel:@"Name:" + withWidth:100 + andField:[NSString stringWithUTF8String:device->name()] + toView:contentView]; + [self addLabel:@"Shortname:" + withWidth:100 + andField:[NSString stringWithUTF8String:device->shortname()] + toView:contentView]; + + // add interfaces if present + device_interface *interface = device->first_interface(); + if (interface != NULL) + { + NSBox *const interfacesBox = [self makeBox:@"Interfaces" toFit:contentView]; + while (interface != NULL) + { + [self addField:[NSString stringWithUTF8String:interface->interface_type()] + toBox:interfacesBox]; + interface = interface->interface_next(); + } + [self addBox:interfacesBox toView:contentView]; + [interfacesBox release]; + } + + // add memory maps if present + device_memory_interface *memory; + if (device->interface(memory)) + { + NSBox *memoryBox = nil; + for (address_spacenum i = AS_0; i < ADDRESS_SPACES; i++) + { + if (memory->has_space(i)) + { + if (memoryBox == nil) + memoryBox = [self makeBox:@"Memory maps" toFit:contentView]; + [self addField:[NSString stringWithUTF8String:memory->space_config(i)->name()] + toBox:memoryBox]; + } + } + if (memoryBox != nil) + { + [self addBox:memoryBox toView:contentView]; + [memoryBox release]; + } + } + + // create a scroll view for holding everything + NSSize desired = [NSScrollView frameSizeForContentSize:[contentView frame].size + hasHorizontalScroller:YES + hasVerticalScroller:YES + borderType:NSNoBorder]; + [window setContentSize:desired]; + contentScroll = [[NSScrollView alloc] initWithFrame:[[window contentView] bounds]]; + [contentScroll setDrawsBackground:NO]; + [contentScroll setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; + [contentScroll setHasHorizontalScroller:YES]; + [contentScroll setHasVerticalScroller:YES]; + [contentScroll setAutohidesScrollers:YES]; + [contentScroll setBorderType:NSNoBorder]; + [contentScroll setDocumentView:contentView]; + [contentView release]; + [[window contentView] addSubview:contentScroll]; + [contentScroll release]; + + // calculate the optimal size for everything + [self cascadeWindowWithDesiredSize:NSMakeSize(320, 240) forView:contentScroll]; + + // don't forget the result + return self; +} + +@end \ No newline at end of file diff --git a/src/osd/modules/debugger/osx/devicesviewer.h b/src/osd/modules/debugger/osx/devicesviewer.h index 3737a497163..24a2a2dc415 100644 --- a/src/osd/modules/debugger/osx/devicesviewer.h +++ b/src/osd/modules/debugger/osx/devicesviewer.h @@ -28,4 +28,6 @@ - (id)initWithMachine:(running_machine &)m console:(MAMEDebugConsole *)c; +- (IBAction)showDeviceDetail:(id)sender; + @end diff --git a/src/osd/modules/debugger/osx/devicesviewer.m b/src/osd/modules/debugger/osx/devicesviewer.m index 29910c57c40..5cf2d33eedd 100644 --- a/src/osd/modules/debugger/osx/devicesviewer.m +++ b/src/osd/modules/debugger/osx/devicesviewer.m @@ -11,6 +11,8 @@ #import "devicesviewer.h" +#import "debugconsole.h" + @interface MAMEDeviceWrapper : NSObject { @@ -138,9 +140,9 @@ [nameColumn release]; [devicesView setOutlineTableColumn:tagColumn]; [devicesView setAutoresizesOutlineColumn:YES]; + [devicesView setDoubleAction:@selector(showDeviceDetail:)]; [devicesView setDataSource:self]; devicesScroll = [[NSScrollView alloc] initWithFrame:[[window contentView] bounds]]; - [devicesScroll setDrawsBackground:YES]; [devicesScroll setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; [devicesScroll setHasHorizontalScroller:YES]; [devicesScroll setHasVerticalScroller:YES]; @@ -175,6 +177,11 @@ } +- (IBAction)showDeviceDetail:(id)sender { + [console debugNewInfoWindowForDevice:[(MAMEDeviceWrapper *)[sender itemAtRow:[sender clickedRow]] device]]; +} + + - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { return [(MAMEDeviceWrapper *)item children] > 0; } diff --git a/src/osd/sdl/sdl.mak b/src/osd/sdl/sdl.mak index 3843880da61..760b66f9f7e 100644 --- a/src/osd/sdl/sdl.mak +++ b/src/osd/sdl/sdl.mak @@ -295,6 +295,7 @@ DEBUGOBJS = \ $(OSDOBJ)/modules/debugger/osx/debugconsole.o \ $(OSDOBJ)/modules/debugger/osx/debugview.o \ $(OSDOBJ)/modules/debugger/osx/debugwindowhandler.o \ + $(OSDOBJ)/modules/debugger/osx/deviceinfoviewer.o \ $(OSDOBJ)/modules/debugger/osx/devicesviewer.o \ $(OSDOBJ)/modules/debugger/osx/disassemblyview.o \ $(OSDOBJ)/modules/debugger/osx/disassemblyviewer.o \ From 5810647ed1b81badb1a0bc5181815f6876bdfa7e Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Thu, 19 Feb 2015 01:36:11 +1100 Subject: [PATCH 5/8] Make resizing the device info windows work nicely --- .../modules/debugger/osx/deviceinfoviewer.m | 63 +++++++++++++++---- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/src/osd/modules/debugger/osx/deviceinfoviewer.m b/src/osd/modules/debugger/osx/deviceinfoviewer.m index eb729091021..3fc757721cf 100644 --- a/src/osd/modules/debugger/osx/deviceinfoviewer.m +++ b/src/osd/modules/debugger/osx/deviceinfoviewer.m @@ -12,11 +12,48 @@ #import "deviceinfoviewer.h" +@interface MAMEDeviceInfoView : NSView +{ + CGFloat minWidth; +} + +- (id)initWithFrame:(NSRect)frame; + +- (void)setMinWidth:(CGFloat)aWidth; + +@end + + +@implementation MAMEDeviceInfoView + +- (id)initWithFrame:(NSRect)frame { + if (!(self = [super initWithFrame:frame])) + return nil; + minWidth = 0; + return self; +} + +- (void)setMinWidth:(CGFloat)aWidth { + minWidth = aWidth; +} + +- (BOOL)isFlipped { + return YES; +} + +- (void)resizeWithOldSuperviewSize:(NSSize)oldBoundsSize { + NSSize const newBoundsSize = [[self superview] bounds].size; + [self setFrameSize:NSMakeSize(MAX(newBoundsSize.width, minWidth), [self frame].size.height)]; +} + +@end + + @implementation MAMEDeviceInfoViewer - (NSTextField *)makeLabel:(NSString *)text { NSTextField *const result = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 100, 14)]; - [result setAutoresizingMask:NSViewMinYMargin]; + [result setAutoresizingMask:(NSViewMaxYMargin | NSViewMaxXMargin)]; [[result cell] setControlSize:NSSmallControlSize]; [result setEditable:NO]; [result setSelectable:NO]; @@ -33,7 +70,7 @@ - (NSTextField *)makeField:(NSString *)text { NSTextField *const result = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 100, 14)]; - [result setAutoresizingMask:(NSViewWidthSizable | NSViewMinYMargin)]; + [result setAutoresizingMask:(NSViewWidthSizable | NSViewMaxYMargin)]; [[result cell] setControlSize:NSSmallControlSize]; [result setEditable:NO]; [result setSelectable:YES]; @@ -50,7 +87,7 @@ - (NSBox *)makeBox:(NSString *)t toFit:(NSView *)v { NSBox *const result = [[NSBox alloc] initWithFrame:NSMakeRect(0, 0, [v frame].size.width - 34, 32)]; - [result setAutoresizingMask:(NSViewWidthSizable | NSViewMinYMargin)]; + [result setAutoresizingMask:(NSViewWidthSizable | NSViewMaxYMargin)]; [result setTitle:t]; [result setBoxType:NSBoxPrimary]; [result setBorderType:NSLineBorder]; @@ -67,8 +104,8 @@ NSSize space = [v bounds].size; space.width = MAX(space.width, [field frame].size.width + w + 52); space.height += height + 8; - [label setFrame:NSMakeRect(25, 20, w, height)]; - [field setFrame:NSMakeRect(w + 27, 20, space.width - w - 52, height)]; + [label setFrame:NSMakeRect(25, space.height - height - 20, w, height)]; + [field setFrame:NSMakeRect(w + 27, space.height - height - 20, space.width - w - 52, height)]; [v setFrameSize:space]; [v addSubview:label]; [v addSubview:field]; @@ -79,6 +116,7 @@ - (void)addField:(NSString *)f toBox:(NSBox *)b { NSTextField *const field = [self makeField:f]; + [field setAutoresizingMask:(NSViewWidthSizable | NSViewMinYMargin)]; NSSize space = [b frame].size; space.width = MAX(space.width, [field frame].size.width + 32); space.height += [field frame].size.height + 8; @@ -90,18 +128,18 @@ - (void)addBox:(NSBox *)b toView:(NSView *)v { - [b setFrameOrigin:NSMakePoint(17, 16)]; NSSize space = [v frame].size; space.width = MAX(space.width, [b frame].size.width + 34); space.height += [b frame].size.height + 4; + [b setFrameOrigin:NSMakePoint(17, space.height - [b frame].size.height - 16)]; [v setFrameSize:space]; [v addSubview:b]; } - (id)initWithDevice:(device_t &)d machine:(running_machine &)m console:(MAMEDebugConsole *)c { - NSView *contentView; - NSScrollView *contentScroll; + MAMEDeviceInfoView *contentView; + NSScrollView *contentScroll; if (!(self = [super initWithMachine:m title:[NSString stringWithFormat:@"Device %s", d.tag()] @@ -112,8 +150,7 @@ device = &d; // Create a view to hold everything - contentView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 320, 32)]; - [contentView setAutoresizingMask:(NSViewMaxXMargin | NSViewMinYMargin)]; + contentView = [[MAMEDeviceInfoView alloc] initWithFrame:NSMakeRect(0, 0, 320, 32)]; [contentView setAutoresizesSubviews:YES]; // add the stuff that's always present @@ -167,6 +204,10 @@ } } + // lock minimum content size + [contentView setMinWidth:[contentView frame].size.width]; + [contentView setAutoresizingMask:NSViewWidthSizable]; + // create a scroll view for holding everything NSSize desired = [NSScrollView frameSizeForContentSize:[contentView frame].size hasHorizontalScroller:YES @@ -186,7 +227,7 @@ [contentScroll release]; // calculate the optimal size for everything - [self cascadeWindowWithDesiredSize:NSMakeSize(320, 240) forView:contentScroll]; + [self cascadeWindowWithDesiredSize:[contentScroll frame].size forView:contentScroll]; // don't forget the result return self; From c46847b551a099861677f677cf60013e3165ba41 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Thu, 19 Feb 2015 01:55:24 +1100 Subject: [PATCH 6/8] Better autosizing for windows --- src/osd/modules/debugger/debugosx.m | 3 +-- src/osd/modules/debugger/osx/debugview.m | 4 ++-- src/osd/modules/debugger/osx/disassemblyview.m | 3 ++- src/osd/modules/debugger/osx/memoryview.m | 3 ++- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/osd/modules/debugger/debugosx.m b/src/osd/modules/debugger/debugosx.m index 491aefbedda..d57d82826bc 100644 --- a/src/osd/modules/debugger/debugosx.m +++ b/src/osd/modules/debugger/debugosx.m @@ -12,10 +12,9 @@ // TODO: // * Automatic scrolling for console and log views -// * Keyboard shortcuts in error log and devices windows +// * Keyboard shortcuts in error log and device windows // * Don't accept keyboard input while the game is running // * Interior focus rings - standard/exterior focus rings look really ugly here -// * Improve automatic window sizing - it isn't working all that well // * Updates causing debug views' widths to change are sometimes obscured by the scroll views' opaque backgrounds // * Scroll views with content narrower than clipping area are flaky under Tiger - nothing I can do about this diff --git a/src/osd/modules/debugger/osx/debugview.m b/src/osd/modules/debugger/osx/debugview.m index 52c34077546..cc5ad4f24aa 100644 --- a/src/osd/modules/debugger/osx/debugview.m +++ b/src/osd/modules/debugger/osx/debugview.m @@ -264,8 +264,8 @@ static void debugwin_view_update(debug_view &view, void *osdprivate) - (NSSize)maximumFrameSize { debug_view_xy const max = view->total_size(); - return NSMakeSize((max.x * fontWidth) + (2 * [textContainer lineFragmentPadding]), - max.y * fontHeight); + return NSMakeSize(ceil((max.x * fontWidth) + (2 * [textContainer lineFragmentPadding])), + ceil(max.y * fontHeight)); } diff --git a/src/osd/modules/debugger/osx/disassemblyview.m b/src/osd/modules/debugger/osx/disassemblyview.m index 6f7eec6e5d5..12c3f540675 100644 --- a/src/osd/modules/debugger/osx/disassemblyview.m +++ b/src/osd/modules/debugger/osx/disassemblyview.m @@ -101,7 +101,8 @@ max.y = MAX(max.y, current.y); } view->set_source(*source); - return NSMakeSize(max.x * fontWidth, max.y * fontHeight); + return NSMakeSize(ceil((max.x * fontWidth) + (2 * [textContainer lineFragmentPadding])), + ceil(max.y * fontHeight)); } diff --git a/src/osd/modules/debugger/osx/memoryview.m b/src/osd/modules/debugger/osx/memoryview.m index be2cf107535..ff6e827f22e 100644 --- a/src/osd/modules/debugger/osx/memoryview.m +++ b/src/osd/modules/debugger/osx/memoryview.m @@ -66,7 +66,8 @@ max.y = MAX(max.y, current.y); } view->set_source(*source); - return NSMakeSize(max.x * fontWidth, max.y * fontHeight); + return NSMakeSize(ceil((max.x * fontWidth) + (2 * [textContainer lineFragmentPadding])), + ceil(max.y * fontHeight)); } From 9770a7aa9c514b96a90c3bb8449dee4712e1e838 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Thu, 19 Feb 2015 02:47:41 +1100 Subject: [PATCH 7/8] Allow copying visible portion of debug view to OS clipboard --- src/osd/modules/debugger/osx/debugview.h | 4 + src/osd/modules/debugger/osx/debugview.m | 67 +++++++++++++ .../modules/debugger/osx/disassemblyview.m | 94 +++++++++---------- src/osd/modules/debugger/osx/memoryview.m | 16 ++-- 4 files changed, 126 insertions(+), 55 deletions(-) diff --git a/src/osd/modules/debugger/osx/debugview.h b/src/osd/modules/debugger/osx/debugview.h index a95d81a85c6..1a58975cc79 100644 --- a/src/osd/modules/debugger/osx/debugview.h +++ b/src/osd/modules/debugger/osx/debugview.h @@ -48,9 +48,13 @@ - (BOOL)cursorVisible; - (debug_view_xy)cursorPosition; +- (IBAction)copyVisible:(id)sender; + - (void)windowDidBecomeKey:(NSNotification *)notification; - (void)windowDidResignKey:(NSNotification *)notification; +- (void)addContextMenuItemsToMenu:(NSMenu *)menu; + @end diff --git a/src/osd/modules/debugger/osx/debugview.m b/src/osd/modules/debugger/osx/debugview.m index cc5ad4f24aa..2e90e8b0598 100644 --- a/src/osd/modules/debugger/osx/debugview.m +++ b/src/osd/modules/debugger/osx/debugview.m @@ -224,6 +224,11 @@ static void debugwin_view_update(debug_view &view, void *osdprivate) [self setFont:[[self class] defaultFont]]; + NSMenu *contextMenu = [[NSMenu allocWithZone:[NSMenu menuZone]] initWithTitle:@"Context"]; + [self addContextMenuItemsToMenu:contextMenu]; + [self setMenu:contextMenu]; + [contextMenu release]; + return self; } @@ -301,6 +306,58 @@ static void debugwin_view_update(debug_view &view, void *osdprivate) } +- (IBAction)copyVisible:(id)sender { + debug_view_xy const size = view->visible_size(); + debug_view_char const *data = view->viewdata(); + if (!data) + { + NSBeep(); + return; + } + + for (UINT32 row = 0; row < size.y; row++, data += size.x) + { + int attr = -1; + NSUInteger start = [text length], length = 0; + for (UINT32 col = 0; col < size.x; col++) + { + [[text mutableString] appendFormat:@"%c", data[col].byte]; + if ((start < length) && (attr != (data[col].attrib & ~DCA_SELECTED))) + { + NSRange const run = NSMakeRange(start, length - start); + [text addAttribute:NSForegroundColorAttributeName + value:[self foregroundForAttribute:attr] + range:run]; + [text addAttribute:NSBackgroundColorAttributeName + value:[self backgroundForAttribute:attr] + range:run]; + start = length; + } + attr = data[col].attrib & ~DCA_SELECTED; + length = [text length]; + } + if (start < length) + { + NSRange const run = NSMakeRange(start, length - start); + [text addAttribute:NSForegroundColorAttributeName + value:[self foregroundForAttribute:attr] + range:run]; + [text addAttribute:NSBackgroundColorAttributeName + value:[self backgroundForAttribute:attr] + range:run]; + } + [[text mutableString] appendString:@"\n"]; + } + + NSRange const run = NSMakeRange(0, [text length]); + [text addAttribute:NSFontAttributeName value:font range:run]; + NSPasteboard *const board = [NSPasteboard generalPasteboard]; + [board declareTypes:[NSArray arrayWithObject:NSRTFPboardType] owner:nil]; + [board setData:[text RTFFromRange:run documentAttributes:nil] forType:NSRTFPboardType]; + [text deleteCharactersInRange:run]; +} + + - (void)windowDidBecomeKey:(NSNotification *)notification { NSWindow *win = [notification object]; if ((win == [self window]) && ([win firstResponder] == self) && view->cursor_supported()) @@ -315,6 +372,16 @@ static void debugwin_view_update(debug_view &view, void *osdprivate) } +- (void)addContextMenuItemsToMenu:(NSMenu *)menu { + NSMenuItem *item; + + item = [menu addItemWithTitle:@"Copy Visible" + action:@selector(copyVisible:) + keyEquivalent:@""]; + [item setTarget:self]; +} + + - (BOOL)acceptsFirstResponder { return view->cursor_supported(); } diff --git a/src/osd/modules/debugger/osx/disassemblyview.m b/src/osd/modules/debugger/osx/disassemblyview.m index 12c3f540675..317f2e99b77 100644 --- a/src/osd/modules/debugger/osx/disassemblyview.m +++ b/src/osd/modules/debugger/osx/disassemblyview.m @@ -16,56 +16,9 @@ @implementation MAMEDisassemblyView -- (void)createContextMenu { - NSMenu *contextMenu = [[NSMenu allocWithZone:[NSMenu menuZone]] initWithTitle:@"Disassembly"]; - NSMenuItem *item; - - item = [contextMenu addItemWithTitle:@"Toggle Breakpoint" - action:@selector(debugToggleBreakpoint:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF9FunctionKey]]; - [item setKeyEquivalentModifierMask:0]; - - item = [contextMenu addItemWithTitle:@"Disable Breakpoint" - action:@selector(debugToggleBreakpointEnable:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF9FunctionKey]]; - [item setKeyEquivalentModifierMask:NSShiftKeyMask]; - - [contextMenu addItem:[NSMenuItem separatorItem]]; - - item = [contextMenu addItemWithTitle:@"Run to Cursor" - action:@selector(debugRunToCursor:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF4FunctionKey]]; - [item setKeyEquivalentModifierMask:0]; - - [contextMenu addItem:[NSMenuItem separatorItem]]; - - item = [contextMenu addItemWithTitle:@"Raw Opcodes" - action:@selector(showRightColumn:) - keyEquivalent:@"r"]; - [item setTarget:self]; - [item setTag:DASM_RIGHTCOL_RAW]; - - item = [contextMenu addItemWithTitle:@"Encrypted Opcodes" - action:@selector(showRightColumn:) - keyEquivalent:@"e"]; - [item setTarget:self]; - [item setTag:DASM_RIGHTCOL_ENCRYPTED]; - - item = [contextMenu addItemWithTitle:@"Comments" - action:@selector(showRightColumn:) - keyEquivalent:@"n"]; - [item setTarget:self]; - [item setTag:DASM_RIGHTCOL_COMMENTS]; - - [self setMenu:contextMenu]; - [contextMenu release]; -} - - - (id)initWithFrame:(NSRect)f machine:(running_machine &)m { if (!(self = [super initWithFrame:f type:DVT_DISASSEMBLY machine:m])) return nil; - [self createContextMenu]; return self; } @@ -106,6 +59,53 @@ } +- (void)addContextMenuItemsToMenu:(NSMenu *)menu { + NSMenuItem *item; + + [super addContextMenuItemsToMenu:menu]; + + if ([menu numberOfItems] > 0) + [menu addItem:[NSMenuItem separatorItem]]; + + item = [menu addItemWithTitle:@"Toggle Breakpoint" + action:@selector(debugToggleBreakpoint:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF9FunctionKey]]; + [item setKeyEquivalentModifierMask:0]; + + item = [menu addItemWithTitle:@"Disable Breakpoint" + action:@selector(debugToggleBreakpointEnable:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF9FunctionKey]]; + [item setKeyEquivalentModifierMask:NSShiftKeyMask]; + + [menu addItem:[NSMenuItem separatorItem]]; + + item = [menu addItemWithTitle:@"Run to Cursor" + action:@selector(debugRunToCursor:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF4FunctionKey]]; + [item setKeyEquivalentModifierMask:0]; + + [menu addItem:[NSMenuItem separatorItem]]; + + item = [menu addItemWithTitle:@"Raw Opcodes" + action:@selector(showRightColumn:) + keyEquivalent:@"r"]; + [item setTarget:self]; + [item setTag:DASM_RIGHTCOL_RAW]; + + item = [menu addItemWithTitle:@"Encrypted Opcodes" + action:@selector(showRightColumn:) + keyEquivalent:@"e"]; + [item setTarget:self]; + [item setTag:DASM_RIGHTCOL_ENCRYPTED]; + + item = [menu addItemWithTitle:@"Comments" + action:@selector(showRightColumn:) + keyEquivalent:@"n"]; + [item setTarget:self]; + [item setTag:DASM_RIGHTCOL_COMMENTS]; +} + + - (NSString *)selectedSubviewName { const debug_view_source *source = view->source(); if (source != NULL) diff --git a/src/osd/modules/debugger/osx/memoryview.m b/src/osd/modules/debugger/osx/memoryview.m index ff6e827f22e..4ac5e28559b 100644 --- a/src/osd/modules/debugger/osx/memoryview.m +++ b/src/osd/modules/debugger/osx/memoryview.m @@ -18,16 +18,8 @@ @implementation MAMEMemoryView - (id)initWithFrame:(NSRect)f machine:(running_machine &)m { - NSMenu *contextMenu; - if (!(self = [super initWithFrame:f type:DVT_MEMORY machine:m])) return nil; - - contextMenu = [[NSMenu allocWithZone:[NSMenu menuZone]] initWithTitle:@"Memory"]; - [self insertActionItemsInMenu:contextMenu atIndex:0]; - [self setMenu:contextMenu]; - [contextMenu release]; - return self; } @@ -71,6 +63,14 @@ } +- (void)addContextMenuItemsToMenu:(NSMenu *)menu { + [super addContextMenuItemsToMenu:menu]; + if ([menu numberOfItems] > 0) + [menu addItem:[NSMenuItem separatorItem]]; + [self insertActionItemsInMenu:menu atIndex:[menu numberOfItems]]; +} + + - (NSString *)selectedSubviewName { debug_view_source const *source = view->source(); if (source != NULL) From 099df52e3876e5183391f6f5047f6f15cc37b5fa Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Thu, 19 Feb 2015 03:19:33 +1100 Subject: [PATCH 8/8] Allow paste from OS clipboard to debugger windows (use context menu) --- src/osd/modules/debugger/osx/debugview.h | 1 + src/osd/modules/debugger/osx/debugview.m | 37 +++++++++++++++++++ .../modules/debugger/osx/disassemblyview.m | 2 +- src/osd/modules/debugger/osx/memoryview.m | 17 ++++++--- 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/osd/modules/debugger/osx/debugview.h b/src/osd/modules/debugger/osx/debugview.h index 1a58975cc79..6d393072bb4 100644 --- a/src/osd/modules/debugger/osx/debugview.h +++ b/src/osd/modules/debugger/osx/debugview.h @@ -49,6 +49,7 @@ - (debug_view_xy)cursorPosition; - (IBAction)copyVisible:(id)sender; +- (IBAction)paste:(id)sender; - (void)windowDidBecomeKey:(NSNotification *)notification; - (void)windowDidResignKey:(NSNotification *)notification; diff --git a/src/osd/modules/debugger/osx/debugview.m b/src/osd/modules/debugger/osx/debugview.m index 2e90e8b0598..dbe0bc271a8 100644 --- a/src/osd/modules/debugger/osx/debugview.m +++ b/src/osd/modules/debugger/osx/debugview.m @@ -358,6 +358,23 @@ static void debugwin_view_update(debug_view &view, void *osdprivate) } +- (IBAction)paste:(id)sender { + NSPasteboard *const board = [NSPasteboard generalPasteboard]; + NSString *const avail = [board availableTypeFromArray:[NSArray arrayWithObject:NSStringPboardType]]; + if (avail == nil) + { + NSBeep(); + return; + } + + NSData *const data = [[board stringForType:avail] dataUsingEncoding:NSASCIIStringEncoding + allowLossyConversion:YES]; + char const *const bytes = (char const *)[data bytes]; + for (NSUInteger i = 0, l = [data length]; i < l; i++) + view->process_char(bytes[i]); +} + + - (void)windowDidBecomeKey:(NSNotification *)notification { NSWindow *win = [notification object]; if ((win == [self window]) && ([win firstResponder] == self) && view->cursor_supported()) @@ -379,6 +396,11 @@ static void debugwin_view_update(debug_view &view, void *osdprivate) action:@selector(copyVisible:) keyEquivalent:@""]; [item setTarget:self]; + + item = [menu addItemWithTitle:@"Paste" + action:@selector(paste:) + keyEquivalent:@""]; + [item setTarget:self]; } @@ -653,4 +675,19 @@ static void debugwin_view_update(debug_view &view, void *osdprivate) } } + +- (BOOL)validateMenuItem:(NSMenuItem *)item { + SEL action = [item action]; + + if (action == @selector(paste:)) + { + NSPasteboard *const board = [NSPasteboard generalPasteboard]; + return [board availableTypeFromArray:[NSArray arrayWithObject:NSStringPboardType]] != nil; + } + else + { + return YES; + } +} + @end diff --git a/src/osd/modules/debugger/osx/disassemblyview.m b/src/osd/modules/debugger/osx/disassemblyview.m index 317f2e99b77..0be36d9f5f9 100644 --- a/src/osd/modules/debugger/osx/disassemblyview.m +++ b/src/osd/modules/debugger/osx/disassemblyview.m @@ -38,7 +38,7 @@ } else { - return YES; + return [super validateMenuItem:item]; } } diff --git a/src/osd/modules/debugger/osx/memoryview.m b/src/osd/modules/debugger/osx/memoryview.m index 4ac5e28559b..fa52689454d 100644 --- a/src/osd/modules/debugger/osx/memoryview.m +++ b/src/osd/modules/debugger/osx/memoryview.m @@ -34,16 +34,23 @@ NSInteger tag = [item tag]; debug_view_memory *memview = downcast(view); - if (action == @selector(showChunkSize:)) { + if (action == @selector(showChunkSize:)) + { [item setState:((tag == memview->bytes_per_chunk()) ? NSOnState : NSOffState)]; - } else if (action == @selector(showPhysicalAddresses:)) { + } + else if (action == @selector(showPhysicalAddresses:)) + { [item setState:((tag == memview->physical()) ? NSOnState : NSOffState)]; - } else if (action == @selector(showReverseView:)) { + } + else if (action == @selector(showReverseView:)) + { [item setState:((tag == memview->reverse()) ? NSOnState : NSOffState)]; - } else if (action == @selector(showReverseViewToggle:)) { + } + else if (action == @selector(showReverseViewToggle:)) + { [item setState:(memview->reverse() ? NSOnState : NSOffState)]; } - return YES; + return [super validateMenuItem:item]; }