mac: add an option to prevent focusing of the window on open

on macOS 10.15 setting the activation policy behaves quite weirdly. the
call changes the current active App to a nameless process, which
probably also the reason that prevents the not focusing to work.
a workaround for that, is to refocus the previous active app.

Fixes #7725
This commit is contained in:
der richter 2020-09-14 17:27:43 +02:00
parent c535dfed66
commit 18a35f17e2
5 changed files with 22 additions and 3 deletions

View File

@ -2949,6 +2949,11 @@ Window
:desktop: On top of the Dekstop behind windows and Desktop icons.
:level: A level as integer.
``--focus-on-open``, ``--no-focus-on-open``
(macOS only)
Focus the video window on creation and makes it the front most window. This
is on by default.
``--border``, ``--no-border``
Play video with window border and decorations. Since this is on by
default, use ``--no-border`` to disable the standard window decorations.

View File

@ -121,6 +121,7 @@ static const m_option_t mp_vo_opt_list[] = {
{"window-scale", OPT_DOUBLE(window_scale), M_RANGE(0.001, 100)},
{"window-minimized", OPT_FLAG(window_minimized)},
{"window-maximized", OPT_FLAG(window_maximized)},
{"focus-on-open", OPT_BOOL(focus_on_open)},
{"force-window-position", OPT_FLAG(force_window_position)},
{"x11-name", OPT_STRING(winname)},
{"wayland-app-id", OPT_STRING(appid)},
@ -199,6 +200,7 @@ const struct m_sub_options vo_sub_opts = {
.ontop_level = -1,
.timing_offset = 0.050,
.swapchain_depth = 3,
.focus_on_open = true,
},
};

View File

@ -19,6 +19,7 @@ typedef struct mp_vo_opts {
int all_workspaces;
int window_minimized;
int window_maximized;
bool focus_on_open;
int screen_id;
int fsscreen_id;

View File

@ -73,8 +73,9 @@ class CocoaCB: Common {
}
func initBackend(_ vo: UnsafeMutablePointer<vo>) {
let previousActiveApp = getActiveApp()
initApp()
initWindow(vo)
initWindow(vo, previousActiveApp)
updateICCProfile()
initWindowState()

View File

@ -82,7 +82,7 @@ class Common: NSObject {
setAppIcon()
}
func initWindow(_ vo: UnsafeMutablePointer<vo>) {
func initWindow(_ vo: UnsafeMutablePointer<vo>, _ previousActiveApp: NSRunningApplication?) {
let (mpv, targetScreen, wr) = getInitProperties(vo)
guard let view = self.view else {
@ -115,7 +115,12 @@ class Common: NSObject {
window.orderFront(nil)
}
NSApp.activate(ignoringOtherApps: true)
NSApp.activate(ignoringOtherApps: mpv.opts.focus_on_open)
// workaround for macOS 10.15 to refocus the previous App
if (!mpv.opts.focus_on_open) {
previousActiveApp?.activate(options: .activateAllWindows)
}
}
func initView(_ vo: UnsafeMutablePointer<vo>, _ layer: CALayer) {
@ -419,6 +424,11 @@ class Common: NSObject {
return (mpv, targetScreen, wr)
}
// call before initApp, because on macOS +10.15 it changes the active App
func getActiveApp() -> NSRunningApplication? {
return NSWorkspace.shared.runningApplications.first(where: {$0.isActive})
}
func flagEvents(_ ev: Int) {
eventsLock.lock()
events |= ev