在特定工作区上启动应用程序(如果尚未启动)



简而言之:当我切换到工作区X时,我希望某些程序自动启动,但前提是它们尚未启动。

这与不同工作区上的 XMonad 启动不同,因为我不想将窗口移动到特定的工作区(就像总是将 xterm 移动到工作区 2(。
这对我也不起作用:xmonad 在不同的工作区中启动时生成。我不希望所有应用程序在我登录时立即启动,如果我关闭它并再次切换到工作区 2,这也不会自动启动,例如 xterm。


关于不起作用的内容已经足够了,这是有效的
(几乎(

在我的工作区列表中,我保留了带有工作区名称和列表的程序,以便在我在那里切换时启动:

myWorkspaces = [ ("VIM", ["gvim"]), ("TERM",[myTerminal ++ " -e tmux"]) ]
-- In my keybindings:
[ ((mod4Mask, key), loadWorkspace workspace cmd)
| (key, (workspace, cmd)) <- zip [xK_1..] myWorkspaces
]

我定义了一个函数来切换到工作区并生成给定的程序:

loadWorkspace :: String -> [String] -> X()
loadWorkspace workspace commands =
do windows $ W.greedyView workspace
mapM_ spawn filtered_commands
where filtered_commands :: X [String]
filtered_commands = filterM isNotOpen commands
isNotOpen :: String -> X Bool
isNotOpen command = return True

(出于某种原因mapM_要求第二个参数是字符串而不是[字符串]。我想在filtered_commands的字符串上映射spawn,知道为什么这不起作用吗?

最后一个缺失的部分是isNotOpen函数,它应该搜索当前工作区中窗口的className,并返回command是否已经存在。


我发现(与其他语言和技术相比(搜索XMonad的做事方式非常困难。对于这种情况,我只能找到如何在当前的WS - https://superuser.com/a/852152/481701 中获取窗口。好的,我想,这给了我一个 Window 对象,我可以查询它以获取一些属性。

但是没有。窗口实际上是...Word64!!!的别名好的,我想。Googlexmonad 获取窗口属性。无。XMONAD 从窗口 ID 获取类名。无。XMONAD 窗口信息。还有其他十几种说类似的话的方法 - 没有有用的结果。我得到的只是xmonad主页,FAQ或"Xmonad配置提示"。
我也在hayoo!中尝试了这些,我能得到的最接近的是"fromClassName - 根据它的className为窗口着色"。哈哈。

那么,如何在ManageHook之外获取窗口的类名(或任何其他属性(呢?

您可能喜欢动态项目或主题空间作为预烘焙的替代方案。它们并不完全按照您的建议进行操作,但也许其中一个足够接近,仍然有用,并且需要较少的配置工作。

我想在filtered_commands的字符串上映射生成,知道为什么这不起作用吗?

是的,您需要提升mapM_来处理一元参数(而不是一元函数或返回值(。因此:

filtered_commands >>= mapM_ spawn

或者,由于您已经在do块中:

result_of_filtered_commands <- filtered_commands
mapM_ spawn result_of_filtered_commands

那么,如何在ManageHook之外获取窗口的className(或任何其他属性(?

看看className的来源:

className = ask >>= (w -> liftX $ withDisplay $ d -> fmap resClass $ io $ getClassHint d w)

您可以将要liftX的参数作为X操作,而不是Query操作。关键功能是从 X11 封装中getClassHint的。该包还提供对窗口其他属性的访问。

安装 wmctrl

sudo apt install wmctrl

并创建一个脚本(在本例中为第二个工作区上的 thunderbird (-t 1((:

#!/bin/sh
(thunderbird &)  & sleep 5 && 
sh -c "wmctrl -i -r `wmctrl -l | grep Thunderbird` -t 1"

要在 wmctrl 上知道您的应用程序名称,您可以通过点击您的终端来查看它:

wmctrl -l

并将其替换为脚本中的正确名称。

用大写字母装满("雷鸟"而不是"雷鸟"(!!

在 3D 工作区上使用 Firefox 的其他示例 (-t 2(:

#!/bin/sh
(firefox &)  & sleep 5 && 
sh -c "wmctrl -i -r `wmctrl -l | grep Firefox` -t 2"

奖金:

这是启动时要执行的命令:

sh -c "thunderbird  & sleep 5 && wmctrl -i -r `wmctrl -l | grep Thunderbird` -t 1"

与肉桂一起制作Debain 10。但应该为所有人工作

相关内容

最新更新