Принудительное открытие окна приложения в рабочей области, в которой оно было запущено

Чтобы открыть программу (например, Anki или Slack), требуется секунда или две, и я часто открываю несколько программ одновременно - в разных рабочих пространствах. Вот что я хотел бы случиться:

  • Нажмите Mod + R и введите "анки" в Workspace 1
  • Переключиться на Workspace 2 Нажмите Mod + R и введите "разлад"
  • Переключиться на Workspace 3 Нажмите Mod + R и введите "libreoffice"
  • Переключиться на Workspace 4 и просматривать Firefox
  • Анки открывается в Workspace 1, Discord открывается в Workspace 2, Libre Office открывается в Workspace 3, все время я просматриваю Workspace 4,

Вместо этого происходит то, что Anki, Discord и Libre Office открываются в Workspace 4независимо от того, какое рабочее пространство я просматривал, когда запускал их.

Есть ли способ достижения вышеупомянутой маркированной ситуации без необходимости явного назначения программы рабочей области? (Я не всегда хочу Анки в Workspace 1, например; Я хочу, чтобы он открывался в рабочей области, которую я просматривал, когда набирал "anki".)

1 ответ

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

Что мы делаем? При выполнении Mod4 + r мы сохраняем текущий выделенный тег в список. При применении правил к появившимся окнам мы выталкиваем соответствующий тег из списка. Нам нужна функция Once, потому что в настоящее время в awesome есть ошибка, и она дважды применяет правила к окну. Мы должны исключить наш эмулятор терминала (и все другие программы, которые мы запускаем с привязкой клавиш), потому что в противном случае он открывается в теге, где мы в последний раз нажимали Mod4 + r,

Вам нужны следующие функции в вашем rc.lua.

local rule_count = 0
local tag_count = 0
local run_tag = {}

local function once()
  if rule_count == 1 then
    rule_count = 0
  else
    rule_count = 1
  end
  return rule_count
end

local function get_run_tag()
  if once() == 1 then
    if tag_count > 0 then
      tag_count = tag_count - 1
      return table.remove(run_tag)
    else
      return "1"
    end
  end
end

local function push_run_tag(tag)
  table.insert(run_tag, tag)
  tag_count = tag_count + 1
end

Затем найдите следующую часть в вашем rc.lua:

{ rule_any = {type = { "normal", "dialog" }},
    properties = { titlebars_enabled = false } -- or true
},

И добавьте несколько строк, чтобы они выглядели так:

{ rule_any = {type = { "normal", "dialog" }},
    except_any = { class = { "Termite" }},
    properties = { titlebars_enabled = false, tag = function() return 
get_run_tag() end}
},

Вы должны заменить Termite с эмулятором консоли, с которого вы обычно начинаете Mod4 + return, В дополнение к этому вам нужно добавить каждую программу в таблицу классов, которую вы хотите начать с привязки клавиш.

Тогда ищи Mod4 + r связывание ключей. На данный момент ему должно понравиться это:

awful.key({ modkey }, "r", awful.screen.focused().mypromptbox:run()
          {description = "run prompt", group = "launcher"}),

Измените это так, чтобы это выглядело так:

awful.key({ modkey }, "r", function ()
  awful.screen.focused().mypromptbox:run()
  push_run_tag(awful.screen.focused().selected_tag.name)
end,
          {description = "run prompt", group = "launcher"}),

Буду признателен за лучшие решения!

PS: это не будет работать для приложений, таких как Steam, потому что он всплывает несколько окон. Первый получает правильный тег. Следующее нерестится на теге "1".

Другие вопросы по тегам