wibox awesome-wm не реагирует на сигналы мыши, когда input_passthrough имеет значение true - PullRequest
0 голосов
/ 09 марта 2019

По сути, я пытаюсь создать боковую панель, чтобы она появлялась, когда я перемещаю мышь к левому краю экрана, а боковая панель исчезала, когда я слишком сильно отодвигал мышь от боковая панель.

Итак, я сделал три виджета:

  • тот, который шириной в один пиксель сбоку, и который, когда он обнаруживает ввод мыши, показывает боковую панель

  • фактическая боковая панель

  • и виджет, который шире боковой панели, является полностью прозрачным, для 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 )

Ответы [ 2 ]

0 голосов
/ 13 июля 2019

Вы можете использовать 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 на весь экран.

0 голосов
/ 09 марта 2019

Я был бы очень признателен за объяснение того, почему это происходит.

Я думаю, что сервер 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 и которая что-то делает с обоями. Не стесняйтесь спрашиватьдля более подробной информации, если это необходимо.)

...