
私はかなり長い間、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