haskell - 如果尚未在特定工作区启动应用程序,则在该工作区启动应用程序

标签 haskell window x11 xmonad

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

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

<小时/>

关于什么不起作用,以下是有效:
(几乎)

在我的工作区列表中,我保存了包含工作区名称的对以及切换到那里时要启动的程序列表:

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_ 要求第二个参数是 String 而不是 [String]。我想映射 filtered_commands 中的字符串上生成,知道为什么这不起作用吗?)

最后缺少的部分是 isNotOpen 函数,该函数应搜索当前工作区中窗口的 className 并返回是否 command已经在那里了。

<小时/>

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

但是没有。 Window 实际上是...Word64 的别名!!!好吧,我想。 Google xmonad 获取窗口属性。没有什么。 xmonad 从窗口 ID 获取类名。没有什么。 xmonad 窗口信息。还有十几种其他方式来表达类似的内容 - 没有任何有用的结果。我得到的只是 xmonad 主页、常见问题解答或“Xmonad 配置提示”。
我也在 hayoo! 中尝试过这些,我能得到的最接近的是“fromClassName - 根据窗口的类名对窗口进行着色。”。哈哈。

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

最佳答案

您可能喜欢dynamic projectstopic spaces作为预烘焙的替代品。它们并不完全按照您的建议进行,但也许其中一个足够接近,仍然有用,并且需要较少的配置工作。

I want to map spawn over the strings in filtered_commands, any idea why this doesn't work?

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

filtered_commands >>= mapM_ spawn

或者,因为您已经处于 do block 中:

result_of_filtered_commands <- filtered_commands
mapM_ spawn result_of_filtered_commands

So, how can I get a window's className (or any other attributes) outside of ManageHook?

看看the source of className :

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

您可以仅将 liftX 的参数作为 X 操作而不是 Query 操作。关键函数是getClassHint来自 X11 包。该包还提供对窗口其他属性的访问。

关于haskell - 如果尚未在特定工作区启动应用程序,则在该工作区启动应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45908110/

相关文章:

Haskell HasCallStack 意外行为

haskell - 组合器的类型签名与其等效 Lambda 函数的类型签名不匹配

linux - 如何获取X11子窗口中的事件?

haskell - 使用 ghc 专门研究类型类

haskell - 为多态模式同义词编写完整的编译指示?

Qt 4 : Move window without title bar

php - 需要一种在页面刷新后返回滚动窗口位置的方法

css - 当页面大于屏幕时如何将div定位在屏幕中间

linux - 调试用户输入时启用断点 (gdb/linux)

terminal - Urxvt 中使用 Zsh 动态窗口标题?