例如,rofi 运行为_NET_WM_WINDOW_TYPE_NORMAL
(或者,正如我认为我从代码中理解的那样,否则从父窗口继承),但我希望它是_NET_WM_WINDOW_TYPE_POPUP_MENU
为了在 i3 和 picom 配置中做一些比匹配其更通用的事情班级名称。
我知道我可以xprop -set
,但是我应该如何/在哪里做到这一点?或者这完全是一种滥用,我应该采取不同的做法?
答案1
在与 Manuele Torre(emanuele6)在 Matrix/IRC 频道上交谈后,他提供了这个解决方案:
rofi -show &
rofi_pid=$! rofi_wid=$(xdo id -mp "$rofi_pid") &&
xprop -id "$rofi_wid" \
-f _NET_WM_WINDOW_TYPE 32a \
-set _NET_WM_WINDOW_TYPE _NET_WM_WINDOW_TYPE_POPUP_MENU
引用埃马纽埃尔6:
所以基本上 exec rofi ... & 是你的 rofi 命令 rofi_pid=$!是新 rofi 进程的 pid rofi_wid=$(xdo id -mp "$rofi_pid") 等待直到具有该 _NET_WM_PID 的窗口存在,然后输出其 wid,最后 xprop 将原子设置为您想要的
这确实设置了_NET_WM_WINDOW_TYPE
,但是(至少对我来说)picom 不会应用动画(不确定窗口是否已经映射)。
其他选项是使用 rofi 标志-normal-window
我将 bspwm 与 一起使用rofi ... -normal-window
,因此在 external_rules 中我设置了:
# rofi set _NET_WM_WINDOW_TYPE
# bspwm doesn't manage these windows because rofi overrides redirect by default
case "$class" in
(*Rofi*)
#echo "manage=off" #this will break rofi focus don't use this
echo "layer=above"
echo "focus=on"
echo "state=floating"
xprop -id "$wid" \
-f _NET_WM_WINDOW_TYPE 32a \
-set _NET_WM_WINDOW_TYPE _NET_WM_WINDOW_TYPE_POPUP_MENU
;;
esac