[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] ui/cocoa.m: run custom script menu item
From: |
Programmingkid |
Subject: |
[Qemu-devel] [PATCH] ui/cocoa.m: run custom script menu item |
Date: |
Tue, 29 Sep 2015 13:03:27 -0400 |
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 <address@hidden>
---
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
- [Qemu-devel] [PATCH] ui/cocoa.m: run custom script menu item,
Programmingkid <=