基本上,我想做的是有一个侧边栏,当我将鼠标移到屏幕的左边缘时会显示它,而当我将鼠标移离屏幕太远时,侧边栏会消失。侧边栏。
所以我制作了三个小部件:
一个边宽为一个像素的像素,当它检测到鼠标进入时,会显示侧边栏
实际侧边栏
以及一个比边栏宽的窗口小部件,它是完全透明的,并且将input_passthrough
设置为true
,其唯一目的是寻找“ mouse :: leave”信号并当鼠标离开时,它会使自己和侧边栏消失。
我大部分都可以使用,但是有一个我无法解决的特殊错误:
wibox
函数将一个字段表作为参数。如果仔细阅读我提供的代码,您会发现input_passthrough
的{{1}}字段没有放在表的主体中,而是在创建小部件之后立即提供的
问题在于,鼠标离开时,它根本不会关闭侧边栏或自身。它无法检测到鼠标离开。
但如果将sidebar_visible_limit
放在wibox函数提供的表中,则像这样:
input_passthrough = true
然后一切正常,除了现在不允许输入通过。
我非常感谢您解释为什么会发生这种情况。
这是代码:
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
})
答案 0 :(得分:0)
我非常感谢您解释为什么会发生这种情况。
我认为X11服务器报告相对于窗口输入区域的鼠标进入/退出。使用input_passthrough
,输入区域变为空。这意味着X11服务器现在将报告鼠标指针位于wibox下方的窗口内,而不是wibox本身内。
但是,如果将input_passthrough = true放在提供给wibox函数的表中,则一切工作正常,除了现在不允许输入通过。
换句话说:在这种情况下,未设置input_passthrough
属性。似乎您找到了无法通过这种方式设置的属性之一。 ;-)
由于我猜您还想知道如何执行自己想做的事情:如果您正在运行合成管理器(xcompmgr
,compton
,...),则可以制作一个具有完全透明背景的wibox。这样,X11服务器将“认为”该窗口在那里,并报告与之相关的输入事件,但是wibox实际上不会在屏幕上可见。
(如果您没有合成管理器,请制作一个小部件,以适当的偏移量显示墙纸。可以通过阅读/usr/share/awesome/lib/wibox/drawable.lua
找到有关如何执行此操作的提示,该部分以if not capi.awesome.composite_manager_running then
并可以处理墙纸。如有必要,请随时询问更多详细信息。)
答案 1 :(得分:0)
您可以使用mousegrabber
来检测鼠标的位置:
bar.sidebar.ontop = true
function show_sidebar()
bar.sidebar.visible = true
mousegrabber.run(function(mouse)
if mouse.x > bar.sidebar.width + dpi(100) then
hide_sidebar()
return false
end
return true
end)
end
function hide_sidebar()
bar.sidebar.visible = false
end
或者,您也可以使用相同的mousegrabber
来决定何时显示侧边栏:
bar.sidebar.ontop = true
function show_sidebar()
bar.sidebar.visible = true
end
function hide_sidebar()
bar.sidebar.visible = false
end
mousegrabber.run(function(mouse)
if bar.sidebar.visible then
if mouse.x > bar.sidebar.width + dpi(100) then
hide_sidebar()
end
else
if mouse.x == 1 then
show_sidebar()
end
end
return true
end)
我认为这比在整个屏幕上创建一个不可见的wibox更好。