当input_passthrough为true时,awesome-wm wibox无法响应鼠标信号

时间:2019-03-09 09:13:29

标签: awesome-wm

基本上,我想做的是有一个侧边栏,当我将鼠标移到屏幕的左边缘时会显示它,而当我将鼠标移离屏幕太远时,侧边栏会消失。侧边栏。

所以我制作了三个小部件:

  • 一个边宽为一个像素的像素,当它检测到鼠标进入时,会显示侧边栏

  • 实际侧边栏

  • 以及一个比边栏宽的窗口小部件,它是完全透明的,并且将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
    })

2 个答案:

答案 0 :(得分:0)

  

我非常感谢您解释为什么会发生这种情况。

我认为X11服务器报告相对于窗口输入区域的鼠标进入/退出。使用input_passthrough,输入区域变为空。这意味着X11服务器现在将报告鼠标指针位于wibox下方的窗口内,而不是wibox本身内。

  

但是,如果将input_passthrough = true放在提供给wibox函数的表中,则一切工作正常,除了现在不允许输入通过。

换句话说:在这种情况下,未设置input_passthrough属性。似乎您找到了无法通过这种方式设置的属性之一。 ;-)


由于我猜您还想知道如何执行自己想做的事情:如果您正在运行合成管理器(xcompmgrcompton,...),则可以制作一个具有完全透明背景的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更好。