更改标签时如何将焦点设置在鼠标光标下的客户端上?

How to set focus on a client under mouse cursor when a tag is changed?

当我切换到另一个标签时,会选择一个新的客户端,但有时我的鼠标光标不会悬停在该客户端上。为了让我的鼠标指针下的客户端聚焦,我必须点击它的某个地方,或者用 Mod4+j / k 切换到它,或在该客户端上前后移动鼠标光标。

我想要 awesome 将焦点放在每当更改标签时鼠标光标下的客户端。我该怎么做?

我找到了一个函数 mouse.object_under_pointer() that finds the client I need, but I don't know when to call that function. Should I connect a handler to some particular signal? I tried connecting to various signals from Signals page on the wiki 并用 naughty.notify() 检查了它是否是正确的信号,但是当我在标签之间切换时触发了其中的 none 个。

这段代码成功了,但是应该有比设置一个巨大的 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
)

tagthis global object,因此您应该将此代码放在 rc.lua.

中的任意位置

我知道这已经很老了,但它帮助我想出了这个

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 )

应该做两件事:

首先,您应该从配置中删除 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 在没有其他事件挂起时获得回调。这应该意味着 "everything else" 已被处理。