
Estoy usando archlinux en combinación con awesome-wm desde hace bastante tiempo. Todavía no he descubierto cómo captar automáticamente el foco en una aplicación al cambiar el espacio de trabajo a través del número Mod+.
Por ejemplo, tengo Firefox ejecutándose en el espacio de trabajo 2 y algunos terminales en el espacio de trabajo 1. Si estoy en el espacio de trabajo 2 y presiono Mod+1 para ir al espacio de trabajo 1, no hay ningún terminal enfocado. Por supuesto, puedo hacer clic en una terminal para enfocar, o presionar Mod+j o Mod+k, pero me gustaría que esto suceda automáticamente.
¿Cómo puedo hacer esto posible? ¡Gracias de antemano!
Respuesta1
Lo descubrí, así que responderé mi propia pregunta. Puede que esta no sea la mejor manera o la más eficiente, pero hace el trabajo. Esta pregunta podría encajar más en stackoverflow ya que está más centrada en la programación.
Escribí esta función, que se centra en el primer cliente en la pantalla (excepto Conky, el monitor del sistema que uso).
-- 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
Ahora llamo a esta función en rc.lua donde se asignan las teclas numeradas:
-- Bind all key numbers to tags.
...
if tags[screen][i] then
awful.tag.viewonly(tags[screen][i])
grab_focus()
end
Respuesta2
Muchas gracias Carlito, llevo toda la tarde luchando para solucionar este problema y tu función funciona perfectamente.
Simplemente lo llamo por sí solo "grab_focus()" en el ciclo de combinación de teclas "para" que quiero.
Utilizo Awesome 3.5 con Shifty, así es como lo solucioné (tenga en cuenta "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
Respuesta3
Descubrí que el método mencionado anteriormente funciona mal en configuraciones multipantalla ya que la verificación de visibilidad también verifica otras pantallas.
Después de mirar la documentación de la API, llegué a esta solución.
Descargo de responsabilidad: no tengo mucha experiencia con Awesome y este es mi primer intento de hacer algo que no sea copiar y pegar. Hasta ahora para mí está funcionando bien.
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
donde 's' es la pantalla. Haga esto para cada pantalla. Lo tengo en el mismo bucle que la configuración de etiquetas en el rc.lua estándar.
Básicamente, recorre las etiquetas de una pantalla y agrega un detector de eventos para cuando se selecciona la etiqueta, que luego activa la función que conecta el primer cliente a la etiqueta y lo establece como el cliente enfocado.
Estoy usando Awesome 3.5 y hay algunas diferencias que debes tener en cuenta si estás usando versiones anteriores. En 3.4, por ejemplo, la función connect_signal se denomina add_signal.
Esta solución funciona automáticamente al cambiar etiquetas a través de otros medios, ya que conecta a un oyente con la operación de cambio de etiquetas.
Respuesta4
Utilizo algo como esto para enfocarme automáticamente en el cambio de etiqueta.
tag.connect_signal("property::selected", function() focus_on_last_in_history(mouse.screen) end)
y este para reenfocar al cerrar una ventana en una etiqueta
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