From e467ea29e9b9cbe385cda17e425e4722829ab04e Mon Sep 17 00:00:00 2001 From: Julien Isorce Date: Mon, 27 Jul 2009 09:58:20 +0200 Subject: [PATCH] [365/906] Cocoa backend: make sure that nsapp is initialized gst-launch-0.10 videotestsrc ! tee name=t ! queue ! glimagesink t. ! queue ! glimagesink now works properly on MacOSX --- gst-libs/gst/gl/gstglwindow_cocoa.m | 77 ++++++++++++++++++----------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/gst-libs/gst/gl/gstglwindow_cocoa.m b/gst-libs/gst/gl/gstglwindow_cocoa.m index 3d71dca103..c00e5752b6 100755 --- a/gst-libs/gst/gl/gstglwindow_cocoa.m +++ b/gst-libs/gst/gl/gstglwindow_cocoa.m @@ -122,6 +122,7 @@ struct _GstGLWindowPrivate NSWindow *parent; NSThread *thread; gboolean running; + guint source_id; }; G_DEFINE_TYPE (GstGLWindow, gst_gl_window, G_TYPE_OBJECT); @@ -148,22 +149,59 @@ gst_gl_window_log_handler (const gchar * domain, GLogLevelFlags flags, } gboolean -gst_gl_window_nsapp_init (gpointer data) +gst_gl_window_nsapp_init (GCond *nsapp_init_cond) { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; [NSApplication sharedApplication]; + [pool release]; + g_cond_signal (nsapp_init_cond); + return FALSE; } +gboolean +gst_gl_window_nsapp_iteration (gpointer data) +{ + NSEvent *event = nil; + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + if ([NSThread isMainThread]) { + + while ((event = ([NSApp nextEventMatchingMask:NSAnyEventMask + untilDate:[NSDate dateWithTimeIntervalSinceNow:0.5] + inMode:NSDefaultRunLoopMode dequeue:YES])) != nil) + + [NSApp sendEvent:event]; + + [pool release]; + + } + + return TRUE; +} + + static void gst_gl_window_class_init (GstGLWindowClass * klass) { GObjectClass *obj_class = G_OBJECT_CLASS (klass); - g_idle_add (gst_gl_window_nsapp_init, NULL); - + GMutex *nsapp_init_mutex = g_mutex_new (); + GCond *nsapp_init_cond = g_cond_new (); + + g_mutex_lock (nsapp_init_mutex); + + g_idle_add ((GSourceFunc) gst_gl_window_nsapp_init, nsapp_init_cond); + + g_cond_wait (nsapp_init_cond, nsapp_init_mutex); + g_mutex_unlock (nsapp_init_mutex); + + g_mutex_free (nsapp_init_mutex); + g_cond_free (nsapp_init_cond); + g_type_class_add_private (klass, sizeof (GstGLWindowPrivate)); obj_class->finalize = gst_gl_window_finalize; @@ -245,6 +283,8 @@ gst_gl_window_new (gint width, gint height, gulong external_gl_context) [NSApp setDelegate: priv->internal_win_id]; [pool release]; + + priv->source_id = g_timeout_add_seconds (1, gst_gl_window_nsapp_iteration, priv->internal_win_id); return window; } @@ -259,6 +299,8 @@ void gst_gl_window_set_external_window_id (GstGLWindow * window, gulong id) { GstGLWindowPrivate *priv = window->priv; + + g_source_remove (priv->source_id); if (GSRegisterCurrentThread()) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; @@ -343,26 +385,6 @@ gst_gl_window_draw (GstGLWindow * window) g_debug ("failed to register current thread, cannot draw"); } -gboolean -gst_gl_window_nsapp_iteration (gpointer data) -{ - NSEvent *event = nil; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - if ([NSThread isMainThread]) { - - while ((event = ([NSApp nextEventMatchingMask:NSAnyEventMask - untilDate:[NSDate dateWithTimeIntervalSinceNow:0.5] - inMode:NSDefaultRunLoopMode dequeue:YES])) != nil) - [NSApp sendEvent:event]; - - [pool release]; - } - - return FALSE; -} - void gst_gl_window_run_loop (GstGLWindow * window) { @@ -371,15 +393,10 @@ gst_gl_window_run_loop (GstGLWindow * window) NSRunLoop *run_loop = [NSRunLoop currentRunLoop]; g_debug ("begin loop: %lud\n", (gulong) run_loop); - + if (priv->internal_win_id != nil) { - while(priv->running) { - + while(priv->running) [run_loop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]]; - - if (!priv->parent) - g_idle_add (gst_gl_window_nsapp_iteration, priv->internal_win_id); - } [priv->internal_win_id release]; priv->internal_win_id = nil;