在 Awesome-wm 中更改工作空間時關注應用程式

在 Awesome-wm 中更改工作空間時關注應用程式

我將 archlinux 與 Awesome-wm 結合使用已經有一段時間了。我仍然沒有弄清楚如何在透過 Mod+number 更改工作區時自動抓住應用程式的焦點。

例如,我在工作區 2 上執行 Firefox,在工作區 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

非常感謝卡利托,我整個下午都在努力解決這個問題,你的功能運作得很好。

我只是將其本身稱為“grab_focus()”,進入我想要的鍵綁定“for”循環。

我將 Awesome 3.5 與 Shifty 一起使用,這就是我修復它的方法(請注意“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

我發現前面提到的方法在多螢幕設定上效果不佳,因為可見檢查也會檢查其他螢幕。

查看 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

相關內容