@@ -829,6 +829,7 @@ QemuCocoaView *cocoaView;
- (void)powerDownQEMU:(id)sender;
- (void)ejectDeviceMedia:(id)sender;
- (void)changeDeviceMedia:(id)sender;
+- (void)useRealCDROM:(id)sender;
@end
@implementation QemuCocoaAppController
@@ -1125,6 +1126,16 @@ QemuCocoaView *cocoaView;
}
}
+/* Has QEMU use the real CDROM drive */
+- (void)useRealCDROM:(id)sender
+{
+ Error *err = NULL;
+ const char *device = [[sender representedObject] cStringUsingEncoding:
+ NSASCIIStringEncoding];
+ qmp_change_blockdev(device, "/dev/cdrom", "raw", &err);
+ handleAnyDeviceErrors(err);
+}
+
@end
@@ -1338,6 +1349,79 @@ static void add_console_menu_entries(void)
}
}
+/*
+ * Determines if the emulator has a CDROM drive.
+ * Can only be called after the addRemovableDevicesMenuItems() function has been
+ * called.
+ */
+static bool emulatorHasCDROM(void)
+{
+ int index;
+ NSString *title;
+ NSArray *menu_item_array;
+ NSMenu *menu;
+ menu = [[[NSApp mainMenu] itemWithTitle:@"Machine"] submenu];
+ menu_item_array = [menu itemArray];
+ if (!menu_item_array) {
+ NSBeep();
+ QEMU_Alert(@"Failed to obtain Machine menu items!");
+ return false;
+ }
+ /* Start at the first removable device menu item */
+ for (index = 7; index < [menu_item_array count]; index++) {
+ title = [[menu_item_array objectAtIndex: index] title];
+ if ([title rangeOfString: @"cd"].location != NSNotFound) {
+ return true;
+ }
+ }
+ return false;
+}
+
+/* Find the CDROM's name */
+static NSString *getCDName(void)
+{
+ int index, end_of_string_index;
+ NSString *title, *return_value;
+ NSArray *menu_item_array;
+ NSMenu *menu = [[[NSApp mainMenu] itemWithTitle:@"Machine"] submenu];
+ menu_item_array = [menu itemArray];
+ if (!menu_item_array) {
+ NSBeep();
+ QEMU_Alert(@"Failed to obtain Machine menu items!");
+ return nil;
+ }
+ /* Start at the first removable device menu item */
+ for (index = 7; index < [menu_item_array count]; index++) {
+ title = [[menu_item_array objectAtIndex: index] title];
+ if ([title rangeOfString: @"cd"].location != NSNotFound) {
+ return_value = [[title componentsSeparatedByString: @" "]
+ objectAtIndex: 1];
+ end_of_string_index = [return_value rangeOfString: @"."].location;
+ return_value = [return_value substringToIndex: end_of_string_index];
+ return return_value;
+ }
+ }
+ return nil;
+}
+
+/* Add the "Use Real CDROM" menu item */
+static void addRealCDMenuItem(void)
+{
+ NSMenu *machine_menu;
+ NSMenuItem *menu_item;
+ machine_menu = [[[NSApp mainMenu] itemWithTitle:@"Machine"] submenu];
+ if (!machine_menu) {
+ NSBeep();
+ QEMU_Alert(@"Could not find Machine Menu!");
+ return;
+ }
+ menu_item = [[NSMenuItem alloc] initWithTitle: @"Use Real CDROM"
+ action: @selector(useRealCDROM:)
+ keyEquivalent: @""];
+ [menu_item setRepresentedObject: getCDName()];
+ [machine_menu insertItem: menu_item atIndex: 7];
+}
+
/* Make menu items for all removable devices.
* Each device is given an 'Eject' and 'Change' menu item.
*/
@@ -1433,4 +1517,7 @@ void cocoa_display_init(DisplayState *ds, int full_screen)
* find out what removable devices it has.
*/
addRemovableDevicesMenuItems();
+ if(emulatorHasCDROM()) {
+ addRealCDMenuItem();
+ }
}
Add a menu item to the Machine menu called "Use Real CDROM". It gives the user the ability to use a real CDROM disc with QEMU by simply selecting a menu item. Signed-off-by: John Arbuckle <programmingkidx@gmail.com> --- ui/cocoa.m | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 87 insertions(+), 0 deletions(-)