Allow the user the ability to run a custom script file. This patch adds a menu item called "Run Custom Script". When the user selects it, a open-file dialog has the user select a text file with the custom scripts to run. This allows for virtually unlimited expandability. All monitor commands should work with this feature.
Signed-off-by: John Arbuckle <programmingk...@gmail.com> --- To test this patch, save this text "sendkey ctrl-alt-delete" in a text file. Then run a Windows guest to try out this feature. That is only a sample of what this patch could do. Mounting image files, debugging, and saving states are just a few of the things this patch can help the user to accomplish. ui/cocoa.m | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 75 insertions(+), 0 deletions(-) diff --git a/ui/cocoa.m b/ui/cocoa.m index 334e6f6..15a28f0 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -263,6 +263,44 @@ static void handleAnyDeviceErrors(Error * err) } } +/* Sends a command to the monitor console */ +static void sendMonitorCommand(const char *command_string) +{ + int index; + char *console_name; + static QemuConsole *monitor = NULL; + + /* If the monitor console hasn't been found yet */ + if(!monitor) { + index = 0; + /* Find the monitor console */ + while (qemu_console_lookup_by_index(index) != NULL) { + console_name = qemu_console_get_label( + qemu_console_lookup_by_index(index)); + if(strstr(console_name, "monitor")) { + monitor = qemu_console_lookup_by_index(index); + break; + } + index++; + } + } + + /* If the monitor console was not found */ + if(!monitor) { + NSBeep(); + QEMU_Alert(@"Sorry but the monitor isn't available."); + return; + } + + /* send each letter in the commandString to the monitor */ + for (index = 0; index < strlen(command_string); index++) { + kbd_put_keysym_console(monitor, command_string[index]); + } + + /* simulate the user pushing the return key */ + kbd_put_keysym_console(monitor, '\n'); +} + /* ------------------------------------------------------ QemuCocoaView @@ -829,6 +867,7 @@ QemuCocoaView *cocoaView; - (void)powerDownQEMU:(id)sender; - (void)ejectDeviceMedia:(id)sender; - (void)changeDeviceMedia:(id)sender; +- (void)runScript:(id)sender; @end @implementation QemuCocoaAppController @@ -1125,6 +1164,31 @@ QemuCocoaView *cocoaView; } } +/* Runs a user's custom script */ +- (void)runScript:(id)sender +{ + NSOpenPanel *openPanel = [NSOpenPanel openPanel]; + [openPanel setTitle: @"Select a script file"]; + if([openPanel runModal] == NSFileHandlingPanelOKButton) { + NSString *file_buffer, *file_path; + NSError *err = nil; + file_path = [[openPanel URL] path]; + file_buffer = [NSString stringWithContentsOfFile:file_path + encoding:NSASCIIStringEncoding + error:&err]; + + if(err) { + NSString *message = [NSString stringWithFormat: @"Error: %@", + [err localizedFailureReason]]; + NSBeep(); + QEMU_Alert(message); + return; + } + sendMonitorCommand([file_buffer cStringUsingEncoding: + NSASCIIStringEncoding]); + } +} + @end @@ -1184,6 +1248,17 @@ int main (int argc, const char * argv[]) { [[NSApp mainMenu] addItem:menuItem]; [NSApp performSelector:@selector(setAppleMenu:) withObject:menu]; // Workaround (this method is private since 10.4+) + // File menu + menu = [[NSMenu alloc] initWithTitle:@"File"]; + [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"Run custom script..." + action:@selector(runScript:) + keyEquivalent:@""] autorelease]]; + menuItem = [[[NSMenuItem alloc] initWithTitle:@"File" + action:nil keyEquivalent:@""] + autorelease]; + [menuItem setSubmenu:menu]; + [[NSApp mainMenu] addItem:menuItem]; + // Machine menu menu = [[NSMenu alloc] initWithTitle: @"Machine"]; [menu setAutoenablesItems: NO]; -- 1.7.5.4