@@ -102,6 +102,7 @@ static void cocoa_switch(DisplayChangeListener *dcl,
static DisplayChangeListener dcl = {
.ops = &dcl_ops,
};
+static QKbdState *kbd;
static int cursor_hide = 1;
static int left_command_key_enabled = 1;
static bool swap_opt_cmd;
@@ -309,7 +310,6 @@ @interface QemuCocoaView : NSView
NSTrackingArea *trackingArea;
QEMUScreen screen;
pixman_image_t *pixman_image;
- QKbdState *kbd;
BOOL isMouseGrabbed;
BOOL isAbsoluteEnabled;
CFMachPortRef eventsTap;
@@ -361,7 +361,6 @@ - (id)initWithFrame:(NSRect)frameRect
screen.width = frameRect.size.width;
screen.height = frameRect.size.height;
- kbd = qkbd_state_init(dcl.con);
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_14_0
[self setClipsToBounds:YES];
#endif
@@ -378,8 +377,6 @@ - (void) dealloc
pixman_image_unref(pixman_image);
}
- qkbd_state_free(kbd);
-
if (eventsTap) {
CFRelease(eventsTap);
}
@@ -429,6 +426,20 @@ - (void) viewWillMoveToWindow:(NSWindow *)newWindow
[self removeTrackingRect];
}
+- (void) selectConsoleLocked:(unsigned int)index
+{
+ QemuConsole *con = qemu_console_lookup_by_index(index);
+ if (!con) {
+ return;
+ }
+
+ unregister_displaychangelistener(&dcl);
+ qkbd_state_switch_console(kbd, con);
+ dcl.con = con;
+ register_displaychangelistener(&dcl);
+ [self updateUIInfo];
+}
+
- (void) hideCursor
{
if (!cursor_hide) {
@@ -718,7 +729,8 @@ - (void) handleMonitorInput:(NSEvent *)event
}
if (keysym) {
- qemu_text_console_put_keysym(NULL, keysym);
+ QemuTextConsole *con = QEMU_TEXT_CONSOLE(dcl.con);
+ qemu_text_console_put_keysym(con, keysym);
}
}
@@ -898,7 +910,7 @@ - (bool) handleEventLocked:(NSEvent *)event
// enable graphic console
case '1' ... '9':
- console_select(key - '0' - 1); /* ascii math */
+ [self selectConsoleLocked:key - '0' - 1]; /* ascii math */
return true;
// release the mouse grab
@@ -909,7 +921,7 @@ - (bool) handleEventLocked:(NSEvent *)event
}
}
- if (qemu_console_is_graphic(NULL)) {
+ if (qemu_console_is_graphic(dcl.con)) {
qkbd_state_key_event(kbd, keycode, true);
} else {
[self handleMonitorInput: event];
@@ -924,7 +936,7 @@ - (bool) handleEventLocked:(NSEvent *)event
return true;
}
- if (qemu_console_is_graphic(NULL)) {
+ if (qemu_console_is_graphic(dcl.con)) {
qkbd_state_key_event(kbd, keycode, false);
}
return true;
@@ -1374,7 +1386,7 @@ - (void)toggleZoomInterpolation:(id) sender
- (void)displayConsole:(id)sender
{
with_bql(^{
- console_select([sender tag]);
+ [cocoaView selectConsoleLocked:[sender tag]];
});
}
@@ -1945,7 +1957,6 @@ static void cocoa_switch(DisplayChangeListener *dcl,
pixman_image_ref(image);
dispatch_async(dispatch_get_main_queue(), ^{
- [cocoaView updateUIInfo];
[cocoaView switchSurface:image];
});
}
@@ -1955,7 +1966,7 @@ static void cocoa_refresh(DisplayChangeListener *dcl)
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
COCOA_DEBUG("qemu_cocoa: cocoa_refresh\n");
- graphic_hw_update(NULL);
+ graphic_hw_update(dcl->con);
if (qemu_input_is_absolute(dcl->con)) {
dispatch_async(dispatch_get_main_queue(), ^{
@@ -2039,8 +2050,12 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts)
add_console_menu_entries();
addRemovableDevicesMenuItems();
+ dcl.con = qemu_console_lookup_default();
+ kbd = qkbd_state_init(dcl.con);
+
// register vga output callbacks
register_displaychangelistener(&dcl);
+ [cocoaView updateUIInfo];
qemu_event_init(&cbevent, false);
cbowner = [[QemuCocoaPasteboardTypeOwner alloc] init];