diff --git a/DOCS/man/context_menu.rst b/DOCS/man/context_menu.rst index 7f6438b79b..9dff03e601 100644 --- a/DOCS/man/context_menu.rst +++ b/DOCS/man/context_menu.rst @@ -42,7 +42,8 @@ On platforms without integration with the native context menu, ``context_menu.lua`` can be disabled entirely using the ``--load-context-menu=no`` option. On platforms where the integration is implemented, it is already disabled by default, and ``--load-context-menu=yes`` -will make ``select.lua`` use it. +will make ``select.lua`` use it. It is also loaded when ``--d3d11-exclusive-fs`` +is enabled, and ``select.lua`` uses it in exclusive fullscreen. Script messages --------------- diff --git a/player/lua/select.lua b/player/lua/select.lua index 9720aad68b..78e3b5dd13 100644 --- a/player/lua/select.lua +++ b/player/lua/select.lua @@ -1423,6 +1423,14 @@ if options.populate_menu_data then mp.observe_property("vo-configured", "native", parse_menu_conf) end +-- The native menu can't be shown over a D3D11 exclusive fullscreen output. +local function use_context_menu_lua() + return mp.get_property_native("load-context-menu") or + (mp.get_property("current-gpu-context") == "d3d11" and + mp.get_property_native("fullscreen") and + mp.get_property_native("d3d11-exclusive-fs")) +end + mp.add_key_binding(nil, "context-menu", function (info) if info.event == "repeat" then return @@ -1430,11 +1438,11 @@ mp.add_key_binding(nil, "context-menu", function (info) if not info.is_mouse then if info.event == "down" or info.event == "press" then - mp.command(mp.get_property_native("load-context-menu") + mp.command(use_context_menu_lua() and "script-message-to context_menu open" or "context-menu") end - elseif mp.get_property_native("load-context-menu") then + elseif use_context_menu_lua() then mp.commandv("script-message-to", "context_menu", info.event == "down" and "open" or "select") elseif info.event == (platform == "windows" and "up" or "down") then diff --git a/player/scripting.c b/player/scripting.c index 95c623217a..e3f5bfdfdb 100644 --- a/player/scripting.c +++ b/player/scripting.c @@ -270,7 +270,11 @@ void mp_load_builtin_scripts(struct MPContext *mpctx) load_builtin_script(mpctx, 5, mpctx->opts->lua_load_select, "@select.lua"); load_builtin_script(mpctx, 6, mpctx->opts->lua_load_positioning, "@positioning.lua"); load_builtin_script(mpctx, 7, mpctx->opts->lua_load_commands, "@commands.lua"); - load_builtin_script(mpctx, 8, mpctx->opts->lua_load_context_menu, "@context_menu.lua"); + + // select.lua uses context_menu.lua in D3D11 exclusive fullscreen. + struct m_config_option *co = m_config_get_co(mpctx->mconfig, bstr0("d3d11-exclusive-fs")); + bool context_menu = mpctx->opts->lua_load_context_menu || (co && *(bool *)co->data); + load_builtin_script(mpctx, 8, context_menu, "@context_menu.lua"); } bool mp_load_scripts(struct MPContext *mpctx) diff --git a/video/out/d3d11/context.c b/video/out/d3d11/context.c index 3afe21f363..b41705fbad 100644 --- a/video/out/d3d11/context.c +++ b/video/out/d3d11/context.c @@ -86,7 +86,8 @@ const struct m_sub_options d3d11_conf = { {"bt.2020", DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020}), .flags = UPDATE_VO, }, - {"d3d11-exclusive-fs", OPT_BOOL(exclusive_fs)}, + {"d3d11-exclusive-fs", OPT_BOOL(exclusive_fs), + .flags = UPDATE_BUILTIN_SCRIPTS}, {"d3d11-output-mode", OPT_CHOICE(output_mode, {"auto", -1}, {"window", 0},