我现在开始设置stumpwm,我想为特定的组指定一个特定的窗口。到目前为止我有这样的想法:
(define-frame-preference "Spotify"
(0 t t :class "Spotify")
)因此,从本质上说,我预计这会将Spotify类的窗口设置为Spotify组,但这不会发生。
有人能帮我吗?谢谢!
发布于 2020-05-11 12:53:04
X11窗口和Linux进程之间的关系很弱:事情是异步的,启动一个进程,过了一段时间,就创建了一个或多个窗口。您必须使用回调,没有一种简单的方法可以创建进程并同步拥有它的所有窗口作为回报。
有些进程足够好,可以在windows上设置_NET_WM_PID属性(看起来像"Spotify“应用程序这样做)。您可以如下所示检索此属性:
(first (xlib:get-property (window-xwin w) :_net_wm_pid))考虑到Spotify如何没有足够早地设置类属性(请参阅注释和其他答案),位置规则在这里起不了作用。但您可以使用自定义钩子:
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中完成调试)。
例如,在启动xclock时,将在REPL中打印以下内容:
(#S(TILE-WINDOW "xclock" #x380000A)) 因此,我可以改变钩子,这样如果做了其他的事情。这有点实验性,但例如,您可以临时修改*new-window-hook*以对特定的窗口事件作出反应:
(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是否与进程中的PID匹配,执行一些规则,然后从钩子列表中删除钩子。这是脆弱的,因为如果钩子从未运行,它就会留在列表中,如果出现错误,它也会留在列表中。在表达式的末尾,添加钩子,然后进程继续执行。
发布于 2020-05-11 10:30:18
因此,就像coredump指出的,Spotify窗口的定义方式存在一些问题。幸运的是,有很多方法可以通过第三方客户端(ArchWiki)控制spotify。
就我个人而言,我发现由于这个项目常春藤Spotify,您可以通过Emacs上的常春藤控制spotify,这可能就是我将要使用的。
https://stackoverflow.com/questions/61716270
复制相似问题