将 Spotify window 分配给 StumpWM 中的一个组

Assigning Spotify window to a group in StumpWM

我目前正在开始设置 stumpwm,我想将特定的 window 分配给特定的组。 到目前为止我有这个:

(define-frame-preference "Spotify"
    (0 t t :class "Spotify")
    )

所以基本上,我希望这会将 windows 和 class Spotify 设置为 Spotify 组,但这并没有发生。

有人可以帮我解决这个问题吗? 谢谢!

因此,正如 coredump 所指出的,Spotify window 的定义方式似乎存在问题。 作为替代方案,幸运的是有很多方法可以通过第三方客户端控制 spotify (ArchWiki)

就我个人而言,多亏了这个项目,我发现你可以在 Emacs 上通过 Ivy 控制 spotify Ivy Spotify 这可能是我要使用的。

X11 windows 和 Linux 进程之间的关系很薄:事情是异步的,你启动一个进程,一段时间后零,一个或多个 windows 被创建。 你必须使用回调,没有简单的方法来创建一个进程并在 return.

中同步拥有它的所有 windows

有些进程非常好,可以在 windows 上设置 _NET_WM_PID 属性(看起来 "Spotify" 应用程序就是这样做的)。您可以按如下方式检索此 属性:

(first (xlib:get-property (window-xwin w) :_net_wm_pid))

考虑到 Spotify 如何未能足够早地设置 class 属性,放置规则在这里无济于事(请参阅评论和其他答案)。但是您可以使用自定义挂钩:

STUMPWM-USER> (let ((out *standard-output*))
                (push (lambda (&rest args) (print args out))
                      *new-window-hook*))
(#<CLOSURE (LAMBDA (&REST ARGS)) {101A92388B}>)

请注意我是如何首先计算 *standard-output* 以将其词法绑定到 out,以便该函数在打印信息时可以将其用作流。这是因为挂钩可能在另一个线程中 运行,其中标准输出的动态绑定可能不是我想要的(在我的例子中,这确保在 Slime REPL 中完成调试)。

当我启动例如 xclock 时,REPL 中会打印以下内容:

(#S(TILE-WINDOW "xclock" #x380000A)) 

所以我可以更改挂钩,以便 if 执行其他操作。这有点实验性,但例如,您可以临时修改 *new-window-hook* 以对特定 window 事件做出反应:

(in-package :stumpwm-user)

(let ((process (sb-ext:run-program "xclock" () :search t :wait nil))
      (hook))
  (sb-ext:process-kill process sb-unix:sigstop)
  (flet ((hook (w)
           (when (find
                  (sb-ext:process-pid process)
                  (xlib:get-property (window-xwin w) :_net_wm_pid))
             (move-window-to-group w (add-group (current-screen) "XCLOCK"))
             (setf *new-window-hook* (remove hook *new-window-hook*)))))
    (setf hook #'hook)
    (push #'hook *new-window-hook*))
  (sb-ext:process-kill process sb-unix:sigcont))

基本上:创建一个进程,停止它以最小化竞争条件,定义一个钩子来检查客户端中关联的 PID 是否与进程之一匹配,执行一些规则,然后从钩子列表中删除钩子.这是脆弱的,因为如果钩子永远不会 运行,它会保留在列表中,如果出现错误,它也会保留在列表中。在表达式的末尾添加钩子,进程恢复执行。