Konzentrieren Sie sich auf die Anwendung, wenn Sie Arbeitsbereiche in awesome-wm ändern

1691
Carlito

Ich verwende Archlinux seit geraumer Zeit in Kombination mit awesome-wm. Ich habe immer noch nicht herausgefunden, wie ich den Fokus einer Anwendung automatisch fokussieren kann, wenn der Arbeitsbereich durch die Mod + -Nummer geändert wird.

Ich habe beispielsweise Firefox auf Arbeitsbereich 2 und einige Terminals auf Arbeitsbereich 1 ausgeführt. Wenn ich in Arbeitsbereich 2 bin und Mod + 1 drücke, um zu Arbeitsbereich 1 zu wechseln, 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 möglich machen? Danke im Voraus!

4

6 Antworten auf die Frage

4
Carlito

Ich habe es herausgefunden und werde meine eigene Frage beantworten. Dies ist möglicherweise nicht der beste oder effizienteste Weg, aber die Arbeit wird erledigt. Diese Frage könnte mehr auf stackoverflow zutreffen, da sie sich mehr auf die Programmierung konzentriert.

Ich habe diese Funktion geschrieben, die sich auf den ersten Client am Bildschirm fokussiert (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 

Ich rufe diese Funktion jetzt in rc.lua auf, wo die nummerierten Tasten zugeordnet sind:

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

Vielen Dank, Carlito. Ich habe den ganzen Nachmittag herum gekämpft, um dieses Problem zu lösen, und Ihre Funktion funktioniert einwandfrei.

Ich nenne es einfach "grab_focus ()" in die Tastenkombination "für" den Zyklus, den ich möchte.

Ich verwende Awesome 3.5 mit Shifty, so habe ich es repariert (bitte beachten Sie "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
Reaver

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

Nachdem ich mir die API-Dokumentation angesehen hatte, kam ich zu dieser Lösung

Haftungsausschluss: Ich habe nicht viel Erfahrung mit Awesome und dies ist mein erster Versuch, etwas zu tun, das kein Copy-Paste ist. Bisher funktioniert es für mich 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

wo 's' ist der Bildschirm. Tun Sie dies für jeden Bildschirm. Ich habe es in der gleichen Schleife wie das Tag-Setup in der Standardversion von rc.lua.

Durchlaufen Sie im Wesentlichen die Tags eines Bildschirms und fügen Sie einen Ereignis-Listener hinzu, wenn das Tag ausgewählt wird. Anschließend wird die Funktion ausgelöst, die den ersten Client mit dem Tag verbindet und als fokussierten Client festlegt.

Ich verwende awesome 3.5 und es gibt einige Unterschiede, die zu beachten sind, wenn Sie vorherige Versionen verwenden. In 3.4 wird beispielsweise die Funktion connect_signal als add_signal bezeichnet.

Diese Lösung funktioniert automatisch, wenn Tags auf andere Weise umgeschaltet werden, da sie einen Listener mit dem Umschalten der Tags selbst verbindet.

Denken Sie daran, Ihre Antwort richtig zu formatieren. Verwenden Sie vor jeder Zeile eines Block-Anführungszeichens eine spitze Klammer `>`, und ziehen Sie Codeblöcke mit vier Leerzeichen ein bwDraco vor 9 Jahren 0
Vielen Dank. Ich bin mit den Regeln und Best Practices hier nicht so bekannt. Reaver vor 9 Jahren 0
0
mperrin

Was mir an diesen Lösungen nicht gefällt, ist, dass sie den Kunden nicht immer unter der Maus fokussieren.

Die beste Lösung, die ich gefunden habe, ist das Skript, das Sie einfach in Ihre rc.lua einfügen müssen:

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
user2588033

Ich verwende so etwas, um mich automatisch auf die Tag-Änderung zu konzentrieren

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

und dieses zum Scharfstellen, wenn ein Fenster auf ein Tag geschlossen wird

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
Sembiance

Mit der neuesten Version 4.0 von awesome funktionierte keine dieser Lösungen.

Hier ist einer, der automatisch den jeweiligen Client unter der Maus fokussiert, wenn Sie Tags / Arbeitsbereiche wechseln.

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)