在 awesome-wm 中更改工作区时聚焦应用程序

在 awesome-wm 中更改工作区时聚焦应用程序

我已经将 archlinux 与 awesome-wm 结合使用了一段时间。我仍然没有弄清楚如何在通过 Mod+number 更改工作区时自动获取应用程序的焦点。

例如,我在工作区 2 上运行 Firefox,在工作区 1 上运行一些终端。如果我在工作区 2 中并按 Mod+1 转到工作区 1,则没有终端获得焦点。我当然可以单击终端来获取焦点,或者按 Mod+j 或 Mod+k,但我希望这自动发生。

我怎样才能实现这一点?提前致谢!

答案1

我搞清楚了,所以我会回答我自己的问题。这可能不是最好或最有效的方法,但它能完成工作。这个问题可能更适合在 stackoverflow 上,因为它更侧重于编程。

我编写了这个函数,它将焦点放在屏幕上的第一个客户端上(除了我使用的系统监视器 Conky)。

-- Grab focus on first client on screen
function grab_focus()
    local all_clients = client.get()
    for i, c in pairs(all_clients) do
        if c:isvisible() and c.class ~= "Conky" then
            client.focus = c
        end
    end
end

我现在在 rc.lua 中调用此函数,其中数字键被映射:

-- Bind all key numbers to tags.
...
if tags[screen][i] then
    awful.tag.viewonly(tags[screen][i])
    grab_focus()
end

答案2

非常感谢 Carlito,我整个下午都在努力解决这个问题,而您的功能非常完美。

我只是将它本身调用“grab_focus()”进入我想要的键绑定“for”循环中。

我使用带有 Shifty 的 Awesome 3.5,这是我修复它的方法(请注意“grab_focus()”):

-- Bind all key numbers to tags.
-- Be careful: we use keycodes to make it works on any keyboard layout.
-- This should map on the top row of your keyboard, usually 1 to 9.

   for i = 1, (shifty.config.maxtags or 9) do
    globalkeys = awful.util.table.join(globalkeys,
        awful.key({ modkey }, "#" .. i + 9,
                  function ()
                      awful.tag.viewonly(shifty.getpos(i))
                      grab_focus()
                end),
        awful.key({ modkey, "Control" }, "#" .. i + 9,
                  function ()
                      awful.tag.viewtoggle(shifty.getpos(i))
                  end),
        awful.key({ modkey, "Shift" }, "#" .. i + 9,
                  function ()
                      if client.focus then
                          local t = shifty.getpos(i)
                          awful.client.movetotag(t)
                          awful.tag.viewonly(t)
                       end
                  end),
        awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
                  function ()
                      if client.focus then
                          awful.client.toggletag(shifty.getpos(i))
                      end
                  end))
end

答案3

我发现前面提到的方法在多屏设置下效果不佳,因为 isvisible 检查也会检查其他屏幕。

在查看了 API 文档后,我找到了这个解决方案

免责声明:我对 awesome 的使用经验不多,这是我第一次尝试做非复制粘贴的事情。不过到目前为止,它对我来说效果很好。

for k,t in pairs(awful.tag.gettags(s)) do t:connect_signal("property::selected", function(t) local c = t.clients(t)[1] if c then client.focus = c end end) end

其中 's' 是屏幕。对每个屏幕执行此操作。我将其放在与标准 rc.lua 中的标签设置相同的循环中。

基本上循环遍历屏幕的标签并在选择标签时添加事件监听器,然后触发获取连接到标签的第一个客户端并将其设置为焦点客户端的函数。

我使用的是 awesome 3.5,如果你使用的是以前的版本,请注意一些差异。例如,在 3.4 中,connect_signal 函数名为 add_signal。

此解决方案在通过其他方式切换标签时自动起作用,因为它将侦听器连接到切换标签本身的操作。

答案4

我使用类似这样的东西来自动抓住标签变化的焦点

tag.connect_signal("property::selected", function() focus_on_last_in_history(mouse.screen) end)

关闭标签窗口时重新聚焦

client.connect_signal("unmanage", function() focus_on_last_in_history(mouse.screen) end)

function focus_on_last_in_history( screen )
  local c = awful.client.focus.history.get(screen, 0)
  if not (c == nil) then
    client.focus = c
    c:raise()
  end
end

相关内容