强制应用程序窗口在其运行的工作区中打开

强制应用程序窗口在其运行的工作区中打开

打开一个程序(例如 Anki 或 Slack)需要一两秒钟,而且我经常同时打开多个程序——在不同的工作区中。以下是我希望发生的事情:

  • 按下Mod + R并输入“anki”Workspace 1
  • 切换到Workspace 2按下Mod + R并输入“discord”
  • 切换到Workspace 3按下Mod + R并输入“libreoffice”
  • 切换到Workspace 4Firefox 并浏览
  • 当我在查看时,Anki 打开了Workspace 1,Discord 打开了Workspace 2,Libre Office 打开了。Workspace 3Workspace 4

相反,最终发生的情况是,Workspace 4无论我在运行它们时正在查看哪个工作区,Anki、Discord 和 Libre Office 都会在 中打开。

有没有办法实现上述情况没有必须明确地将程序分配给工作区?(例如,我可能并不总是想要 Anki 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”上生成。

相关内容