qemu-devel
[Top][All Lists]
Advanced

[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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]