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

时间:2015-06-06 14:29:44

标签: awesome-wm

当我切换到另一个标签时,会选择一个新客户端,但有时候我的鼠标光标不是客户端。为了让我的鼠标指针聚焦的客户端,我必须单击它上面的某个地方,或者用 Mod4 + j / k 切换到它,或者移动鼠标光标回到那个客户端。

每当标签发生变化时,我都希望将焦点放在鼠标光标下的客户端上。我该怎么做?

我找到了一个找到我需要的客户端的函数mouse.object_under_pointer(),但我不知道何时调用该函数。我应该将处理程序连接到某个特定信号吗?我尝试连接来自Signals page on the wiki的各种信号,并检查naughty.notify()是否是正确的信号,但是当我在标签之间切换时,没有一个被触发。

3 个答案:

答案 0 :(得分: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
)

tagthis global object,因此您只需将此代码放在rc.lua的任意位置。

答案 1 :(得分:1)

应该完成两件事:

首先,您应该从配置中删除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来获取没有其他事件挂起时的回调。这应该意味着“其他所有东西”都已处理。

答案 2 :(得分:0)

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

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
              } )

结束 screen.connect_signal(“ tag :: history :: update”,focus_client_under_mouse)