osc: handle deadzone and barmargin for window controls

I missed these due to only testing with my personal osc config.

The deadzone needs to be correctly handled for the window controls,
or they will fail to appear when the mouse is close to or over them.

In the process of doing that, I realised that the controls should
respect the barmargin, if set. This is because the controls should
remain aligned when layout=topbar and as the control bar is top
aligned, it should be equally affected if the user needs to set
the barmargin.

I also fixed a mistake in trying to the use the mpv-osd-symbols font
for the window controls.
This commit is contained in:
Philip Langdale 2019-11-29 20:35:05 +08:00 committed by wm4
parent d520258ffb
commit 2b4c867505
1 changed files with 28 additions and 6 deletions

View File

@ -87,7 +87,7 @@ local osc_styles = {
timePosBar = "{\\blur0\\bord".. user_opts.tooltipborder .."\\1c&HFFFFFF\\3c&H000000\\fs30}", timePosBar = "{\\blur0\\bord".. user_opts.tooltipborder .."\\1c&HFFFFFF\\3c&H000000\\fs30}",
vidtitleBar = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs18\\q2}", vidtitleBar = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs18\\q2}",
wcButtons = "{\\1c&HFFFFFF\\fs24\\fnmpv-osd-symbols}", wcButtons = "{\\1c&HFFFFFF\\fs24}",
wcBar = "{\\1c&H000000}", wcBar = "{\\1c&H000000}",
} }
@ -969,7 +969,7 @@ end
function window_controls(alignment, topbar) function window_controls(alignment, topbar)
local wc_geo = { local wc_geo = {
x = 0, x = 0,
y = 30, y = 30 + user_opts.barmargin,
an = 1, an = 1,
w = osc_param.playresx, w = osc_param.playresx,
h = 30, h = 30,
@ -1006,12 +1006,13 @@ function window_controls(alignment, topbar)
lo.style = osc_styles.wcBar lo.style = osc_styles.wcBar
lo.alpha[1] = user_opts.boxalpha lo.alpha[1] = user_opts.boxalpha
local button_y = wc_geo.y - (wc_geo.h / 2)
local first_geo = local first_geo =
{x = controlbox_left + 5, y = 15, an = 4, w = 25, h = 25} {x = controlbox_left + 5, y = button_y, an = 4, w = 25, h = 25}
local second_geo = local second_geo =
{x = controlbox_left + 30, y = 15, an = 4, w = 25, h = 25} {x = controlbox_left + 30, y = button_y, an = 4, w = 25, h = 25}
local third_geo = local third_geo =
{x = controlbox_left + 55, y = 15, an = 4, w = 25, h = 25} {x = controlbox_left + 55, y = button_y, an = 4, w = 25, h = 25}
-- Close -- Close
ne = new_element("close", "button") ne = new_element("close", "button")
@ -1039,9 +1040,17 @@ function window_controls(alignment, topbar)
lo = add_layout("maximize") lo = add_layout("maximize")
lo.geometry = alignment == "left" and third_geo or second_geo lo.geometry = alignment == "left" and third_geo or second_geo
-- At least with default Ubuntu fonts, this symbol is differently aligned -- At least with default Ubuntu fonts, this symbol is differently aligned
lo.geometry.y = 13 lo.geometry.y = lo.geometry.y - 2
lo.style = osc_styles.wcButtons lo.style = osc_styles.wcButtons
-- deadzone below window controls
local sh_area_y0, sh_area_y1
sh_area_y0 = user_opts.barmargin
sh_area_y1 = (wc_geo.y + (wc_geo.h / 2)) +
get_align(1 - (2 * user_opts.deadzonesize),
osc_param.playresy - (wc_geo.y + (wc_geo.h / 2)), 0, 0)
add_area("showhide_wc", wc_geo.x, sh_area_y0, wc_geo.w, sh_area_y1)
if topbar then if topbar then
-- The title is already there as part of the top bar -- The title is already there as part of the top bar
return return
@ -2201,6 +2210,9 @@ function render()
for k,cords in pairs(osc_param.areas["showhide"]) do for k,cords in pairs(osc_param.areas["showhide"]) do
set_virt_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "showhide") set_virt_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "showhide")
end end
for k,cords in pairs(osc_param.areas["showhide_wc"]) do
set_virt_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "showhide_wc")
end
do_enable_keybindings() do_enable_keybindings()
--mouse input area --mouse input area
@ -2228,6 +2240,9 @@ function render()
for _,cords in ipairs(osc_param.areas["window-controls"]) do for _,cords in ipairs(osc_param.areas["window-controls"]) do
if state.osc_visible then -- activate only when OSC is actually visible if state.osc_visible then -- activate only when OSC is actually visible
set_virt_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "window-controls") set_virt_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "window-controls")
mp.enable_key_bindings("window-controls")
else
mp.disable_key_bindings("window-controls")
end end
if (mouse_hit_coords(cords.x1, cords.y1, cords.x2, cords.y2)) then if (mouse_hit_coords(cords.x1, cords.y1, cords.x2, cords.y2)) then
@ -2379,6 +2394,7 @@ function tick()
if state.showhide_enabled then if state.showhide_enabled then
mp.disable_key_bindings("showhide") mp.disable_key_bindings("showhide")
mp.disable_key_bindings("showhide_wc")
state.showhide_enabled = false state.showhide_enabled = false
end end
@ -2398,6 +2414,7 @@ function do_enable_keybindings()
if state.enabled then if state.enabled then
if not state.showhide_enabled then if not state.showhide_enabled then
mp.enable_key_bindings("showhide", "allow-vo-dragging+allow-hide-cursor") mp.enable_key_bindings("showhide", "allow-vo-dragging+allow-hide-cursor")
mp.enable_key_bindings("showhide_wc", "allow-vo-dragging+allow-hide-cursor")
end end
state.showhide_enabled = true state.showhide_enabled = true
end end
@ -2411,6 +2428,7 @@ function enable_osc(enable)
hide_osc() -- acts immediately when state.enabled == false hide_osc() -- acts immediately when state.enabled == false
if state.showhide_enabled then if state.showhide_enabled then
mp.disable_key_bindings("showhide") mp.disable_key_bindings("showhide")
mp.disable_key_bindings("showhide_wc")
end end
state.showhide_enabled = false state.showhide_enabled = false
end end
@ -2465,6 +2483,10 @@ mp.set_key_bindings({
{"mouse_move", function(e) process_event("mouse_move", nil) end}, {"mouse_move", function(e) process_event("mouse_move", nil) end},
{"mouse_leave", mouse_leave}, {"mouse_leave", mouse_leave},
}, "showhide", "force") }, "showhide", "force")
mp.set_key_bindings({
{"mouse_move", function(e) process_event("mouse_move", nil) end},
{"mouse_leave", mouse_leave},
}, "showhide_wc", "force")
do_enable_keybindings() do_enable_keybindings()
--mouse input bindings --mouse input bindings