4

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

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

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

6 ответов6

4

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

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

Я обнаружил, что ранее упомянутый метод плохо работает на многоэкранных установках, так как проверка невидимости также проверяет другие экраны.

После просмотра документации по 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.

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

Я использую удивительный 3.5 и есть некоторые различия, о которых нужно знать, если вы используете предыдущие версии. Например, в версии 3.4 функция connect_signal называется add_signal.

Это решение автоматически работает при переключении тегов с помощью других средств, поскольку оно подключает слушателя к операции переключения тегов.

1

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

Я просто называю это "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
0

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

Лучшее решение, которое я нашел, это тот скрипт, который вы просто должны вставить в свой 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

С последней версией 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)
0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .