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

389
AmagicalFishy

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

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

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

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

0

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

0
ploth

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

Что мы делаем? При выполнении 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 = }, properties = { titlebars_enabled = false } -- or true }, 

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

{ rule_any = }, 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() ), 

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

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

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

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

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