Konzentrieren Sie sich beim Ändern von Arbeitsbereichen in Awesome-WM auf die Anwendung

Konzentrieren Sie sich beim Ändern von Arbeitsbereichen in Awesome-WM auf die Anwendung

Ich verwende Archlinux jetzt schon eine ganze Weile in Kombination mit Awesome-WM. Ich habe immer noch nicht herausgefunden, wie ich den Fokus automatisch auf eine Anwendung lenken kann, wenn ich den Arbeitsbereich über Mod+Nummer ändere.

Beispielsweise läuft bei mir Firefox auf Arbeitsbereich 2 und einige Terminals auf Arbeitsbereich 1. Wenn ich in Arbeitsbereich 2 bin und Mod+1 drücke, um zu Arbeitsbereich 1 zu gelangen, ist kein Terminal fokussiert. Ich kann natürlich auf ein Terminal klicken, um den Fokus zu erhalten, oder Mod+j oder Mod+k drücken, aber ich möchte, dass dies automatisch geschieht.

Wie kann ich das ermöglichen? Vielen Dank im Voraus!

Antwort1

Ich habe es herausgefunden, also werde ich meine Frage selbst beantworten. Das ist vielleicht nicht der beste oder effizienteste Weg, aber er erledigt die Arbeit. Diese Frage passt vielleicht eher zu Stackoverflow, da sie sich mehr auf die Programmierung konzentriert.

Ich habe diese Funktion geschrieben, die den Fokus auf den ersten Client auf dem Bildschirm legt (mit Ausnahme von Conky, dem Systemmonitor, den ich verwende).

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

Diese Funktion rufe ich nun in rc.lua auf, wo die nummerierten Tasten zugeordnet werden:

-- Bind all key numbers to tags.
...
if tags[screen][i] then
    awful.tag.viewonly(tags[screen][i])
    grab_focus()
end

Antwort2

Vielen Dank, Carlito, ich habe den ganzen Nachmittag damit verbracht, dieses Problem zu lösen, und Ihre Funktion funktioniert perfekt.

Ich rufe es einfach selbst auf, indem ich „grab_focus()“ in den gewünschten Keybinding-Zyklus „for“ einfüge.

Ich verwende Awesome 3.5 mit Shifty und habe es folgendermaßen behoben (beachten Sie bitte „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

Antwort3

Ich habe festgestellt, dass die zuvor erwähnte Methode bei Multiscreen-Setups schlecht funktioniert, da bei der Isvisible-Prüfung auch andere Bildschirme geprüft werden.

Nachdem ich mich in der API-Dokumentation umgesehen hatte, kam ich zu dieser Lösung

Haftungsausschluss: Ich habe nicht viel Erfahrung mit Awesome und dies ist mein erster Versuch, etwas anderes als Kopieren und Einfügen zu machen. Bislang funktioniert es bei mir aber gut.

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

wobei „s“ der Bildschirm ist. Machen Sie das für jeden Bildschirm. Ich habe es in derselben Schleife wie das Tag-Setup im Standard-rc.lua.

Gehen Sie grundsätzlich alle Tags eines Bildschirms durch und fügen Sie einen Ereignislistener für den Fall hinzu, dass das Tag ausgewählt wird. Dieser löst dann die Funktion aus, die den ersten Client mit dem Tag verbindet und ihn als fokussierten Client festlegt.

Ich verwende Awesome 3.5 und es gibt einige Unterschiede, die Sie beachten sollten, wenn Sie frühere Versionen verwenden. In 3.4 heißt die Funktion connect_signal beispielsweise add_signal.

Diese Lösung funktioniert automatisch, wenn Tags über andere Mittel gewechselt werden, da sie einen Listener mit dem Vorgang des Tag-Wechsels selbst verbindet.

Antwort4

Ich verwende so etwas, um bei Tag-Änderungen automatisch den Fokus zu erfassen

tag.connect_signal("property::selected", function() focus_on_last_in_history(mouse.screen) end)

und dieses zum Neufokussieren beim Schließen eines Fensters auf einem Tag

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

verwandte Informationen