
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