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。私はこの問題を解決するために午後中ずっと苦労していましたが、あなたの関数は完璧に動作しました。

必要なキーバインディング「for」サイクル内で、単に「grab_focus()」を単独で呼び出すだけです。

私は 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

関連情報