私はarchlinuxをawesome-wmと組み合わせてかなり長い間使用しています。 Mod + numberを使用してワークスペースを変更するときに、アプリケーションのフォーカスを自動的に取得する方法をまだ理解していません。
たとえば、Firefoxをワークスペース2で実行し、いくつかの端末をワークスペース1で実行しています。ワークスペース2にいて、Mod +1を押してワークスペース1に移動した場合、端末はフォーカスされません。もちろん、端末をクリックしてフォーカスを取得するか、Mod + jまたはMod + kを押すことはできますが、これを自動的に実行したいと思います。
どうすればこれを可能にできますか?前もって感謝します!
私はそれを理解したので、私は自分の質問に答えます。これは最善または最も効率的な方法ではないかもしれませんが、それは仕事を成し遂げます。この質問はプログラミングに重点を置いているため、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
Isvisibleチェックは他の画面もチェックするため、前述の方法はマルチスクリーン設定ではうまく機能しないことがわかりました。
APIドキュメントを見回した後、私はこのソリューションにたどり着きました
免責事項:私は素晴らしい経験があまりありません。これは、コピー&ペースト以外のことを行う最初の試みです。これまでのところ、それはうまく機能しています。
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のタグ設定と同じループにあります。
基本的に、画面のタグをループし、タグが選択されたときのイベントリスナーを追加します。これにより、最初のクライアントがタグに接続され、フォーカスされたクライアントとして設定される関数が起動されます。
私は素晴らしい3.5を使用していますが、以前のバージョンを使用している場合は注意すべきいくつかの違いがあります。たとえば3.4では、connect_signal関数の名前はadd_signalです。
このソリューションは、他の方法でタグを切り替えるときに、リスナーをタグ自体の切り替え操作に接続するときに自動的に機能します。
カーリートさん、どうもありがとうございました。私はこの問題を解決するために午後中ずっと苦労してきました。あなたの機能は完璧に機能しています。
私はそれ自体を「grab_focus()」と呼び、キーバインディングの「for」サイクルに入れます。
ShiftyでAwesome3.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
これらのソリューションで私が気に入らないのは、常にクライアントをマウスの下に集中させるとは限らないことです。
私が見つけた最良の解決策 は、rc.luaに配置する必要があるスクリプトです:
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)
Awesomeの最新の4.0バージョンでは、これらのソリューションはどれも機能していませんでした。
これは、タグ/ワークスペースを切り替えるたびに、マウスの下にあるクライアントに自動的に焦点を合わせるものです。
tag.connect_signal("property::selected", function (t)
local selected = tostring(t.selected) == "true"
if selected then
local mouseX = mouse.coords().x
local mouseY = mouse.coords().y
for k,v in pairs(t.screen.all_clients) do
if v.first_tag.index==t.index and mouseX>=v.x and mouseX<=(v.x+v.width) and mouseY>=v.y and mouseY<=(v.y+v.height) then
client.focus = v
v:raise()
end
end
end
end)
私はこのようなものを使用して、タグの変更に自動的に焦点を合わせます
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