web-dev-qa-db-ja.com

awesome-wmでワークスペースを変更するときは、アプリケーションに焦点を合わせます

私はarchlinuxをawesome-wmと組み合わせてかなり長い間使用しています。 Mod + numberを使用してワークスペースを変更するときに、アプリケーションのフォーカスを自動的に取得する方法をまだ理解していません。

たとえば、Firefoxをワークスペース2で実行し、いくつかの端末をワークスペース1で実行しています。ワークスペース2にいて、Mod +1を押してワークスペース1に移動した場合、端末はフォーカスされません。もちろん、端末をクリックしてフォーカスを取得するか、Mod + jまたはMod + kを押すことはできますが、これを自動的に実行したいと思います。

どうすればこれを可能にできますか?前もって感謝します!

4
Carlito

私はそれを理解したので、私は自分の質問に答えます。これは最善または最も効率的な方法ではないかもしれませんが、それは仕事を成し遂げます。この質問はプログラミングに重点を置いているため、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
4
Carlito

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です。

このソリューションは、他の方法でタグを切り替えるときに、リスナーをタグ自体の切り替え操作に接続するときに自動的に機能します。

1
Reaver

カーリートさん、どうもありがとうございました。私はこの問題を解決するために午後中ずっと苦労してきました。あなたの機能は完璧に機能しています。

私はそれ自体を「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
1
Federico

これらのソリューションで私が気に入らないのは、常にクライアントをマウスの下に集中させるとは限らないことです。

私が見つけた最良の解決策 は、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)
0
mperrin

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)
0
Sembiance

私はこのようなものを使用して、タグの変更に自動的に焦点を合わせます

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
0
user2588033