|
@@ -73,6 +73,8 @@
|
|
|
int height;
|
|
|
} QEMUScreen;
|
|
|
|
|
|
+@class QemuCocoaPasteboardTypeOwner;
|
|
|
+
|
|
|
static void cocoa_update(DisplayChangeListener *dcl,
|
|
|
int x, int y, int w, int h);
|
|
|
|
|
@@ -107,6 +109,7 @@ static void cocoa_switch(DisplayChangeListener *dcl,
|
|
|
static NSInteger cbchangecount = -1;
|
|
|
static QemuClipboardInfo *cbinfo;
|
|
|
static QemuEvent cbevent;
|
|
|
+static QemuCocoaPasteboardTypeOwner *cbowner;
|
|
|
|
|
|
// Utility functions to run specified code block with the BQL held
|
|
|
typedef void (^CodeBlock)(void);
|
|
@@ -1326,8 +1329,10 @@ - (void) dealloc
|
|
|
{
|
|
|
COCOA_DEBUG("QemuCocoaAppController: dealloc\n");
|
|
|
|
|
|
- if (cocoaView)
|
|
|
- [cocoaView release];
|
|
|
+ [cocoaView release];
|
|
|
+ [cbowner release];
|
|
|
+ cbowner = nil;
|
|
|
+
|
|
|
[super dealloc];
|
|
|
}
|
|
|
|
|
@@ -1943,8 +1948,6 @@ - (void)pasteboard:(NSPasteboard *)sender provideDataForType:(NSPasteboardType)t
|
|
|
|
|
|
@end
|
|
|
|
|
|
-static QemuCocoaPasteboardTypeOwner *cbowner;
|
|
|
-
|
|
|
static void cocoa_clipboard_notify(Notifier *notifier, void *data);
|
|
|
static void cocoa_clipboard_request(QemuClipboardInfo *info,
|
|
|
QemuClipboardType type);
|
|
@@ -2007,43 +2010,8 @@ static void cocoa_clipboard_request(QemuClipboardInfo *info,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * The startup process for the OSX/Cocoa UI is complicated, because
|
|
|
- * OSX insists that the UI runs on the initial main thread, and so we
|
|
|
- * need to start a second thread which runs the qemu_default_main():
|
|
|
- * in main():
|
|
|
- * in cocoa_display_init():
|
|
|
- * assign cocoa_main to qemu_main
|
|
|
- * create application, menus, etc
|
|
|
- * in cocoa_main():
|
|
|
- * create qemu-main thread
|
|
|
- * enter OSX run loop
|
|
|
- */
|
|
|
-
|
|
|
-static void *call_qemu_main(void *opaque)
|
|
|
-{
|
|
|
- int status;
|
|
|
-
|
|
|
- COCOA_DEBUG("Second thread: calling qemu_default_main()\n");
|
|
|
- bql_lock();
|
|
|
- status = qemu_default_main();
|
|
|
- bql_unlock();
|
|
|
- COCOA_DEBUG("Second thread: qemu_default_main() returned, exiting\n");
|
|
|
- [cbowner release];
|
|
|
- exit(status);
|
|
|
-}
|
|
|
-
|
|
|
static int cocoa_main(void)
|
|
|
{
|
|
|
- QemuThread thread;
|
|
|
-
|
|
|
- COCOA_DEBUG("Entered %s()\n", __func__);
|
|
|
-
|
|
|
- bql_unlock();
|
|
|
- qemu_thread_create(&thread, "qemu_main", call_qemu_main,
|
|
|
- NULL, QEMU_THREAD_DETACHED);
|
|
|
-
|
|
|
- // Start the main event loop
|
|
|
COCOA_DEBUG("Main thread: entering OSX run loop\n");
|
|
|
[NSApp run];
|
|
|
COCOA_DEBUG("Main thread: left OSX run loop, which should never happen\n");
|
|
@@ -2125,8 +2093,6 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts)
|
|
|
|
|
|
COCOA_DEBUG("qemu_cocoa: cocoa_display_init\n");
|
|
|
|
|
|
- qemu_main = cocoa_main;
|
|
|
-
|
|
|
// Pull this console process up to being a fully-fledged graphical
|
|
|
// app with a menubar and Dock icon
|
|
|
ProcessSerialNumber psn = { 0, kCurrentProcess };
|
|
@@ -2190,6 +2156,12 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts)
|
|
|
qemu_clipboard_peer_register(&cbpeer);
|
|
|
|
|
|
[pool release];
|
|
|
+
|
|
|
+ /*
|
|
|
+ * The Cocoa UI will run the NSApplication runloop on the main thread
|
|
|
+ * rather than the default Core Foundation one.
|
|
|
+ */
|
|
|
+ qemu_main = cocoa_main;
|
|
|
}
|
|
|
|
|
|
static QemuDisplay qemu_display_cocoa = {
|