Принудительное открытие окна приложения в рабочей области, в которой оно было запущено
Чтобы открыть программу (например, 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".