Сосредоточьтесь на приложении при изменении рабочих пространств в awesome-wm

1503
Carlito

Я уже давно использую archlinux в сочетании с awesome-wm. Я до сих пор не понял, как автоматически сфокусироваться на приложении при смене рабочей области с помощью номера Mod +.

Например, у меня запущен firefox в рабочей области 2, а некоторые терминалы в рабочей области 1. Если я нахожусь в рабочей области 2 и нажимаю Mod + 1, чтобы перейти в рабочую область 1, ни один терминал не фокусируется. Я могу, конечно, щелкнуть по терминалу, чтобы захватить фокус, или нажать Mod + j или Mod + k, но я бы хотел, чтобы это происходило автоматически.

Как я могу сделать это возможным? Заранее спасибо!

4

6 ответов на вопрос

4
Carlito

Я понял это, поэтому я отвечу на свой вопрос. Возможно, это не самый лучший или самый эффективный способ, но он выполняет свою работу. Этот вопрос больше подходит для стекового потока, так как он больше сфокусирован на программировании.

Я написал эту функцию, которая фокусирует внимание на первом клиенте на экране (кроме 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 
1
Federico

Большое спасибо, Карлито, я целый день боролся за решение этой проблемы, и ваша функция работает отлично.

Я просто называю это "grab_focus ()" в цикле привязки клавиш "для" цикла, который я хочу.

Я использую Awesome 3.5 с Shifty, вот как я это исправил (обратите внимание на "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

I found the previously mentioned method to work poorly on multiscreen setups as the isvisible check also checks other screens.

After looking around the API documentation I arrived at this solution

Disclaimer: I don't have much experience with awesome and this is my first attempt at doing anything that isn't a copy-paste. So far for me it is working nicely though.

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

where 's' is the screen. Do this for each screen. I have it in the same loop as tag setup in the standard rc.lua.

Basically loop through the tags of a screen and add an event listener for when the tag gets selected, which then fires the function which gets the first client connected to the tag and sets it as the focused client.

I am using awesome 3.5 and there are some differences to be aware of if you are using previous versions. In 3.4 for example the connect_signal function is named add_signal.

This solution automatically works when switching tags through other means to as it connects a listener to the operation of switching tags itself.

Не забудьте правильно отформатировать свой ответ. Используйте правую угловую скобку `>` перед каждой строкой блочной кавычки и делайте отступы блоков кода с четырьмя пробелами bwDraco 9 лет назад 0
Благодарю. Я не очень знаком с правилами и лучшими практиками здесь. Reaver 9 лет назад 0
0
mperrin

Что мне не нравится в этих решениях, так это то, что они не всегда фокусируют клиента под мышью.

Лучшее решение, которое я нашел, это тот скрипт, который вы просто должны вставить в свой rc.lua:

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

Я использую что-то вроде этого, чтобы автоматически сфокусироваться на изменении тега

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

С последней версией 4.0 awesome ни одно из этих решений не работало.

Вот тот, который будет автоматически фокусироваться на том, какой клиент находится под вашей мышью, когда вы переключаете теги / рабочие пространства.

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) 

Похожие вопросы