将 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 是否与进程之一匹配,执行一些规则,然后从钩子列表中删除钩子.这是脆弱的,因为如果钩子永远不会 运行,它会保留在列表中,如果出现错误,它也会保留在列表中。在表达式的末尾添加钩子,进程恢复执行。
我目前正在开始设置 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 是否与进程之一匹配,执行一些规则,然后从钩子列表中删除钩子.这是脆弱的,因为如果钩子永远不会 运行,它会保留在列表中,如果出现错误,它也会保留在列表中。在表达式的末尾添加钩子,进程恢复执行。