在 xmonad 中的自定义桌面上打开应用程序

在 xmonad 中的自定义桌面上打开应用程序

假设我shell-commandemacs例如打电话(shell-command "evince")。是否可以将evince以此方式启动的应用程序(在本示例中)自动移动5xmonad.

答案1

本着做一件事并把它做好,魔鬼派是为了解决这类问题而创建的与任何符合标准WM例如正确配置的 XMonad,另见常见问题解答)。

一些配置沿线(采用本教程,我不知道这种匹配 Evince 的方式是否真的有效,也许需要其他方式(参见文档))

(if
  (is (application_name) "Evince")
    (begin
    (set_workspace 5)
    (maximize)
  )
)

应该做这项工作。请注意,魔鬼派这里经常被提到,只需点击一下即可获得更多有用的信息。

答案2

纯 xmonad 配置可以实现这一点。在你的程序中,.xmonad/xmonad.hs你需要为此设置一个manageHook。我故意加入了不止一条“规则”。

theManageHook = composeAll [
    -- send applications to the right workspace
    className =? "Evince" --> doShift "5",
    className =? "Pidgin" --> doShift "4"
    --- more settings ...
]

main = do
    xmonad $ gnomeConfig { 
        manageHook = theManageHook <+> manageHook gnomeConfig
    }

xprop您可以通过单击所需的窗口来查看给定窗口的类名称。 className 指的是 xprop 输出中的第二个条目。如果您只想要一些 xproperties,xprop请接受它们作为参数:

~ $ xprop WM_CLASS WM_NAME
WM_CLASS(STRING) = "evince", "Evince"
WM_NAME(STRING) = "Document Viewer"

更多相关内容可以在Xmonad 常见问题解答

答案3

这是一种方法,用于xdotool更改窗口的类,然后您可以5使用XMonad或 Devil's pie 将其移动到桌面。

#!/bin/sh
$1 &
NEW_WINDOW_PID=$!

WINDOW_EXISTENCE=$(xdotool search --pid ${NEW_WINDOW_PID} 2> /dev/null) #is empty if the window hasn't finished opening.
COUNTER=0
while [[ -z $WINDOW_EXISTENCE && $COUNTER < 6 ]] #waits for the window to open
do
    WINDOW_EXISTENCE=$(xdotool search --pid ${NEW_WINDOW_PID} 2> /dev/null)
    sleep 1
    (( COUNTER++ ))
done

if [ $COUNTER != "6" ]; then
    NEW_WINDOW_ID=$(xdotool search --onlyvisible --pid ${NEW_WINDOW_PID}) #finds the window that was just opened
    xdotool set_window --class yay ${NEW_WINDOW_ID}; #change the class of the window to yay
fi

然后在emacs中写一个函数

(defun window-in-desktop-5 (cmd)
  "start shell command on desktop 5"
  (interactive "sshell-command: ")
  (shell-command  (concat "/path/to/xdotoolscript " cmd)))

每当您通过 emacs 函数调用程序时,只要窗口的 PID 与调用它的函数相同,它就会更改窗口的类名,否则脚本将在六秒后超时。

相关内容