По сути, я пытаюсь создать боковую панель, чтобы она появлялась, когда я перемещаю мышь к левому краю экрана, а боковая панель исчезала, когда я слишком сильно отодвигал мышь от боковая панель.
Итак, я сделал три виджета:
тот, который шириной в один пиксель сбоку, и который, когда он обнаруживает ввод мыши, показывает боковую панель
фактическая боковая панель
и виджет, который шире боковой панели, является полностью прозрачным, для input_passthrough
установлено значение true
, и его единственная цель состоит в том, чтобы искать сигнал «мышь :: уходить» и когда мышь уходит , он сделает сам и боковая панель исчезнет.
У меня большая часть работы, но есть конкретная ошибка, которую я не могу решить:
Функция wibox
принимает в качестве аргумента таблицу полей. Если вы посмотрите код, который я предоставил, то заметите, что поле input_passthrough
в sidebar_visible_limit
не было помещено в тело таблицы, но было добавлено впоследствии, сразу после создания виджета.
Проблема в том, что он просто не закрывает боковую панель или саму себя, когда мышь уходит. Он не обнаруживает уход мыши.
НО, если поместить input_passthrough = true
в таблицу, предоставленную для функции wibox, например:
bar.sidebar_visible_limit = wibox({
x = 0,
y = 0,
ontop = false,
visible = false,
width = bar.sidebar.width + dpi(100),
height = bar.sidebar.height,
bg = '#000000',
opacity = 0.3, -- when it's all done this will be '0'
input_passthrough = true
})
тогда все работает нормально, за исключением того, что теперь он не позволяет вводу проходить.
Я был бы очень признателен за объяснение, почему это происходит.
Это код:
awful = require("awful")
local wibox = require("wibox")
local naughty = require("naughty")
local gears = require("gears")
local beautiful = require("beautiful")
xresources = require("beautiful.xresources")
dpi = xresources.apply_dpi
bar = {}
-- make the sidebar
bar.sidebar = wibox({
x = 0,
y = 0,
ontop = false,
visible = false,
width = beautiful.sidebar_width or dpi(450),
bg = beautiful.sidebar_bg or "#2f2e3a",
type = "dock",
height = beautiful.sidebar_height or awful.screen.focused().geometry.height,
})
-- Hide sidebar when mouse leaves too much from the sidebar
-- It's incorporated along in the same table with the sidebar so the users
-- can implement these however they want, e.g. in the 'keys.lua' module
bar.sidebar_visible_limit = wibox({
x = 0,
y = 0,
ontop = false,
visible = false,
width = bar.sidebar.width + dpi(100),
height = bar.sidebar.height,
bg = '#000000',
opacity = 0.3, --when it's all done this will be '0'
})
bar.sidebar_visible_limit.input_passthrough = true
-- Show sidebar when mouse touches edge
local sidebar_displayer = wibox({
x = 0,
y = 0,
height = bar.sidebar.height,
ontop = true,
width = 1,
visible = true,
opacity = 0,
input_passthrough = true
})
function toggle_bar()
-- they have to be in this order, so the sidebar will show first,
-- and then the wibox that will close the sidebar when the mouse leaves
-- second. If you do it the other way around, then if you go with the
-- mouse on the sidebar-closing wibox , then if you try to go back
-- to the sidebar, it will close it because it's 'left' the widget.
-- That's why you have the sidebar-closing wibox on top and allow
-- input_passthrough for the sidebar-closing wibox
bar.sidebar.visible = not bar.sidebar.visible
bar.sidebar.ontop = not bar.sidebar.ontop
bar.sidebar_visible_limit.visible = not bar.sidebar_visible_limit.visible
bar.sidebar_visible_limit.ontop = not bar.sidebar_visible_limit.ontop
end
bar.sidebar_visible_limit:connect_signal( "mouse::leave", toggle_bar )
sidebar_displayer:connect_signal( "mouse::enter", toggle_bar )