@@ -522,8 +522,9 @@ QemuCocoaView *cocoaView;
}
}
-- (void) updateUIInfo
+- (void) updateUIInfoLocked
{
+ /* Must be called with the iothread lock, i.e. via updateUIInfo */
NSSize frameSize;
QemuUIInfo info;
@@ -554,6 +555,25 @@ QemuCocoaView *cocoaView;
dpy_set_ui_info(dcl.con, &info, TRUE);
}
+- (void) updateUIInfo
+{
+ if (!allow_events) {
+ /*
+ * Don't try to tell QEMU about UI information in the application
+ * startup phase -- we haven't yet registered dcl with the QEMU UI
+ * layer, and also trying to take the iothread lock would deadlock.
+ * When cocoa_display_init() does register the dcl, the UI layer
+ * will call cocoa_switch(), which will call updateUIInfo, so
+ * we don't lose any information here.
+ */
+ return;
+ }
+
+ with_iothread_lock(^{
+ [self updateUIInfoLocked];
+ });
+}
+
- (void)viewDidMoveToWindow
{
[self updateUIInfo];
@@ -1985,8 +2005,6 @@ static void cocoa_switch(DisplayChangeListener *dcl,
COCOA_DEBUG("qemu_cocoa: cocoa_switch\n");
- [cocoaView updateUIInfo];
-
// The DisplaySurface will be freed as soon as this callback returns.
// We take a reference to the underlying pixman image here so it does
// not disappear from under our feet; the switchSurface method will
@@ -1994,6 +2012,7 @@ static void cocoa_switch(DisplayChangeListener *dcl,
pixman_image_ref(image);
dispatch_async(dispatch_get_main_queue(), ^{
+ [cocoaView updateUIInfo];
[cocoaView switchSurface:image];
});
[pool release];