macos: Set activation policy in osxvideosink and glimagesink

Upon creating a window, glimagesink and osxvideosink now set the policy to
NSApplicationActivationPolicyRegular, which lets us show an icon in the Dock
for convenience and appear in the top menu bar like other apps.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4573>
This commit is contained in:
Piotr Brzeziński 2023-05-11 20:01:45 +02:00
parent 1815061e26
commit 5e45a1b1bd
2 changed files with 17 additions and 8 deletions

View file

@ -236,6 +236,8 @@ gst_gl_window_cocoa_create_window (GstGLWindowCocoa *window_cocoa)
gst_gl_window_cocoa_set_window_handle (window, gst_gl_window_cocoa_set_window_handle (window,
(guintptr) priv->external_view); (guintptr) priv->external_view);
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
return TRUE; return TRUE;
} }

View file

@ -84,7 +84,6 @@ static void
gst_osx_video_sink_call_from_main_thread(GstOSXVideoSink *osxvideosink, gst_osx_video_sink_call_from_main_thread(GstOSXVideoSink *osxvideosink,
NSObject * object, SEL function, NSObject *data, BOOL waitUntilDone) NSObject * object, SEL function, NSObject *data, BOOL waitUntilDone)
{ {
NSThread *thread; NSThread *thread;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
@ -139,15 +138,19 @@ gst_osx_video_sink_osxwindow_create (GstOSXVideoSink * osxvideosink, gint width,
* from the main thread * from the main thread
*/ */
GST_INFO_OBJECT (osxvideosink, "we have a superview, adding our view to it"); GST_INFO_OBJECT (osxvideosink, "we have a superview, adding our view to it");
gst_osx_video_sink_call_from_main_thread(osxvideosink, osxwindow->gstview, gst_osx_video_sink_call_from_main_thread (osxvideosink, osxwindow->gstview,
@selector(addToSuperview:), osxvideosink->superview, NO); @selector(addToSuperview:), osxvideosink->superview, NO);
} else { } else {
gst_osx_video_sink_call_from_main_thread(osxvideosink, gst_osx_video_sink_call_from_main_thread (osxvideosink,
osxvideosink->osxvideosinkobject, osxvideosink->osxvideosinkobject,
@selector(createInternalWindow), nil, YES); @selector(createInternalWindow), nil, YES);
GST_INFO_OBJECT (osxvideosink, "No superview, creating an internal window."); GST_INFO_OBJECT (osxvideosink, "No superview, creating an internal window.");
} }
gst_osx_video_sink_call_from_main_thread (osxvideosink, osxvideosink->osxvideosinkobject,
@selector(setActivationPolicy), nil, YES);
[osxwindow->gstview setNavigation: GST_NAVIGATION(osxvideosink)]; [osxwindow->gstview setNavigation: GST_NAVIGATION(osxvideosink)];
[osxvideosink->osxwindow->gstview setKeepAspectRatio: osxvideosink->keep_par]; [osxvideosink->osxwindow->gstview setKeepAspectRatio: osxvideosink->keep_par];
@ -164,7 +167,7 @@ gst_osx_video_sink_osxwindow_destroy (GstOSXVideoSink * osxvideosink)
g_return_if_fail (GST_IS_OSX_VIDEO_SINK (osxvideosink)); g_return_if_fail (GST_IS_OSX_VIDEO_SINK (osxvideosink));
pool = [[NSAutoreleasePool alloc] init]; pool = [[NSAutoreleasePool alloc] init];
gst_osx_video_sink_call_from_main_thread(osxvideosink, gst_osx_video_sink_call_from_main_thread (osxvideosink,
osxvideosink->osxvideosinkobject, osxvideosink->osxvideosinkobject,
@selector(destroy), (id) nil, YES); @selector(destroy), (id) nil, YES);
[pool release]; [pool release];
@ -292,7 +295,7 @@ gst_osx_video_sink_show_frame (GstBaseSink * bsink, GstBuffer * buf)
GST_DEBUG ("show_frame"); GST_DEBUG ("show_frame");
bufferobject = [[GstBufferObject alloc] initWithBuffer:buf]; bufferobject = [[GstBufferObject alloc] initWithBuffer:buf];
gst_osx_video_sink_call_from_main_thread(osxvideosink, gst_osx_video_sink_call_from_main_thread (osxvideosink,
osxvideosink->osxvideosinkobject, osxvideosink->osxvideosinkobject,
@selector(showFrame:), bufferobject, NO); @selector(showFrame:), bufferobject, NO);
[pool release]; [pool release];
@ -521,7 +524,7 @@ gst_osx_video_sink_set_window_handle (GstVideoOverlay * overlay, guintptr handle
GstOSXVideoSink *osxvideosink = GST_OSX_VIDEO_SINK (overlay); GstOSXVideoSink *osxvideosink = GST_OSX_VIDEO_SINK (overlay);
NSView *view = (NSView *) handle_id; NSView *view = (NSView *) handle_id;
gst_osx_video_sink_call_from_main_thread(osxvideosink, gst_osx_video_sink_call_from_main_thread (osxvideosink,
osxvideosink->osxvideosinkobject, osxvideosink->osxvideosinkobject,
@selector(setView:), view, YES); @selector(setView:), view, YES);
} }
@ -604,7 +607,7 @@ gst_osx_video_sink_get_type (void)
if (!osxvideosink->osxwindow->closed) { if (!osxvideosink->osxwindow->closed) {
osxvideosink->osxwindow->closed = TRUE; osxvideosink->osxwindow->closed = TRUE;
GST_ELEMENT_ERROR (osxvideosink, RESOURCE, NOT_FOUND, ("Output window was closed"), (NULL)); GST_ELEMENT_ERROR (osxvideosink, RESOURCE, NOT_FOUND, ("Output window was closed"), (NULL));
gst_osx_video_sink_osxwindow_destroy(osxvideosink); gst_osx_video_sink_osxwindow_destroy (osxvideosink);
} }
} }
@ -659,6 +662,11 @@ gst_osx_video_sink_get_type (void)
} }
- (void) setActivationPolicy
{
[NSApp setActivationPolicy: NSApplicationActivationPolicyRegular];
}
- (void) setView: (NSView*)view - (void) setView: (NSView*)view
{ {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
@ -814,7 +822,6 @@ no_texture_buffer:
static gboolean static gboolean
plugin_init (GstPlugin * plugin) plugin_init (GstPlugin * plugin)
{ {
if (!gst_element_register (plugin, "osxvideosink", if (!gst_element_register (plugin, "osxvideosink",
GST_RANK_MARGINAL, GST_TYPE_OSX_VIDEO_SINK)) GST_RANK_MARGINAL, GST_TYPE_OSX_VIDEO_SINK))
return FALSE; return FALSE;