
나는 꽤 오랫동안 awesome-wm과 함께 Archlinux를 사용하고 있습니다. Mod+번호를 통해 작업 영역을 변경할 때 자동으로 응용 프로그램에 초점을 맞추는 방법을 아직 찾지 못했습니다.
예를 들어, 작업 공간 2에서 Firefox가 실행되고 작업 공간 1에 일부 터미널이 있습니다. 작업 공간 2에 있고 Mod+1을 눌러 작업 공간 1로 이동하면 터미널에 초점이 맞춰지지 않습니다. 물론 터미널을 클릭하여 초점을 맞추거나 Mod+j 또는 Mod+k를 누를 수도 있지만 이 작업이 자동으로 수행되기를 바랍니다.
어떻게 하면 이것을 가능하게 할 수 있나요? 미리 감사드립니다!
답변1
나는 그것을 알아 냈으므로 내 질문에 대답하겠습니다. 이는 최선의 방법이나 가장 효율적인 방법은 아니지만 작업을 완료합니다. 이 질문은 프로그래밍에 더 중점을 두기 때문에 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
답변2
Carlito에게 정말 감사드립니다. 저는 이 문제를 해결하기 위해 오후 내내 애썼고 귀하의 기능은 완벽하게 작동합니다.
나는 단지 내가 원하는 키 바인딩 "for" 주기에 대해 "grab_focus()" 자체를 호출할 뿐입니다.
저는 Shifty와 함께 Awesome 3.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
답변3
isvisible 검사는 다른 화면도 검사하므로 이전에 언급한 방법이 다중 화면 설정에서 제대로 작동하지 않는다는 것을 알았습니다.
API 문서를 살펴본 후 이 솔루션에 도달했습니다.
면책 조항: 저는 awesome에 대한 경험이 많지 않으며 이것은 복사-붙여넣기가 아닌 작업을 수행하는 첫 번째 시도입니다. 지금까지는 잘 작동하고 있습니다.
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의 태그 설정과 동일한 루프에 있습니다.
기본적으로 화면의 태그를 반복하고 태그가 선택될 때 이벤트 리스너를 추가합니다. 그런 다음 첫 번째 클라이언트를 태그에 연결하고 이를 포커스 클라이언트로 설정하는 함수를 실행합니다.
저는 awesome 3.5를 사용하고 있으며 이전 버전을 사용하는 경우 알아야 할 몇 가지 차이점이 있습니다. 예를 들어 3.4에서는 connect_signal 함수의 이름이 add_signal입니다.
이 솔루션은 태그 자체를 전환하는 작업에 리스너를 연결하므로 다른 수단을 통해 태그를 전환할 때 자동으로 작동합니다.
답변4
나는 태그 변경에 자동으로 초점을 맞추기 위해 이와 같은 것을 사용합니다.
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