Как установить фокус на клиенте под курсором мыши при изменении тега?

Когда я переключаюсь на другой тег, выбирается новый клиент, но иногда это не тот клиент, на который я навожу курсор мыши. Чтобы сфокусировать клиент под моим указателем мыши, я должен либо щелкнуть где-нибудь на нем, либо переключиться на него с помощью Mod4+j / k, либо переместить курсор мыши и снова на этом клиенте.

Я хочу, чтобы awesome уделял внимание клиенту, находящемуся под курсором мыши, всякий раз, когда изменяется тег. Как я могу это сделать?

Я нашел функцию mouse.object_under_pointer(), которая находит клиент Мне нужно, но я не знаю, когда вызывать эту функцию. Должен ли я подключить обработчик к какому-то конкретному сигналу? Я пытался подключиться к различным сигналам со страницы Сигналы в вики и проверить с помощью naughty.notify(), правильно ли это. сигнал, но ни один из них не срабатывал, когда я переключался между тегами.


person gvlasov    schedule 06.06.2015    source источник


Ответы (3)


Этот код сделал свое дело, однако должен быть лучший способ сделать это, чем установка огромного таймера на 200 мс (меньшие тайм-ауты не сфокусировали должным образом некоторых клиентов для меня, но вы можете попробовать установить меньший).

tag.connect_signal(
  "property::selected",
  function (t)
    local selected = tostring(t.selected) == "false"
    if selected then
      local focus_timer = timer({ timeout = 0.2 })
      focus_timer:connect_signal("timeout", function()
        local c = awful.mouse.client_under_pointer()
        if not (c == nil) then
          client.focus = c
          c:raise()
        end
        focus_timer:stop()
      end)
      focus_timer:start()
    end
  end
)

tag – это этот глобальный объект, поэтому вам нужно просто поместить этот код в любом месте ваш rc.lua.

person gvlasov    schedule 06.06.2015
comment
Вот это да. Я пытался это сделать, но мой не работал, пока я не добавил задержку. Мой работает, если вы используете тайм-аут всего 1 мс. - person joeeey; 28.11.2015
comment
Вместо property::selected я использовал tag::history::update для клиентского объекта. Это означает, что он будет запускаться всякий раз, когда происходит изменение тегов (например, переключение тегов и т. д.). - person joeeey; 28.11.2015

Следует сделать две вещи:

Во-первых, вы должны удалить require("awful.autofocus") из своего конфига, чтобы этот модуль больше не пытался сфокусировать какой-либо клиент через историю фокуса при переключении тегов.

Тогда этот код работает для меня:

do
    local pending = false
    local glib = require("lgi").GLib
    tag.connect_signal("property::selected", function()
        if not pending then
            pending = true
            glib.idle_add(glib.PRIORITY_DEFAULT_IDLE, function()
                pending = false
                local c = mouse.current_client
                if c then
                    client.focus = c
                end
                return false
            end)
        end
    end)
end

Это использует GLib напрямую, чтобы получить обратный вызов, когда нет других ожидающих событий. Это должно означать, что «все остальное» было обработано.

person Uli Schlachter    schedule 18.10.2018

Я знаю, что это довольно старо, но это помогло мне придумать это

function focus_client_under_mouse()
gears.timer( {  timeout = 0.1,
                autostart = true,
                single_shot = true,
                callback =  function()
                                local n = mouse.object_under_pointer()
                                if n ~= nil and n ~= client.focus then
                                    client.focus = n end
                                end
              } )

end screen.connect_signal("tag::history::update", focus_client_under_mouse)

person David Sorkovsky    schedule 14.10.2018