![窗口管理器(或 X11)如何处理任务栏?](https://linux22.com/image/197283/%E7%AA%97%E5%8F%A3%E7%AE%A1%E7%90%86%E5%99%A8%EF%BC%88%E6%88%96%20X11%EF%BC%89%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E4%BB%BB%E5%8A%A1%E6%A0%8F%EF%BC%9F.png)
我正在使用 openbox 和 plank。每当我打开(并最大化)应用程序时,窗口将自动避免与木板区域碰撞。
我的问题是,是否可以将一个窗口指定为“任务栏”?例如,我可以将记事本设置为占据屏幕的 25% 宽度,而我打开的其他任何内容(包括其他记事本实例)会自动最大化到其余 75% 区域吗?
答案1
任务栏客户端通常使用_NET_WM_STRUT财产告诉一个欧洲WMH兼容的窗口管理器,它希望一些屏幕真实状态只属于它自己。
_NET_WM_STRUT, left, right, top, bottom, CARDINAL[4]/32
此属性相当于 _NET_WM_STRUT_PARTIAL 属性,其中所有起始值为 0,所有结束值为逻辑屏幕的高度或宽度。
_NET_WM_STRUT_PARTIAL, left, right, top, bottom, left_start_y, left_end_y, right_start_y, right_end_y, top_start_x, top_end_x, bottom_start_x, bottom_end_x, CARDINAL[12]/32
该属性包含 4 个基数,指定屏幕每个边框处的保留区域的宽度,另外 8 个基数指定对应于四个支柱中的每一个的开始和结束。
然后,为给定窗口保留 300 像素的宽度(此后称为码头), 跑步
xprop -f _NET_WM_STRUT 32c -set _NET_WM_STRUT '300, 0, 0, 0'
然后单击该窗口;现在,即使最大化,普通窗口也应限制在剩余空间内。
确实如此不是自动将停靠窗口定位到其保留空间。不过,您可以使用 Xdotool 自动化该过程:
xlogo #Dock window example
xprop -id "$(xdotool search xlogo)" -f _NET_WM_STRUT 32c -set _NET_WM_STRUT '300, 0, 0, 0'
xdotool search xlogo windowmove 0 0 windowsize 300 100%
Icewm 是一个窗口管理器,它巧妙地抽象了这个任务;看man icewm-winoptions
。所有你需要的是
==> ~/.icewm/winoptions <==
xlogo.layer: Dock
xlogo.geometry: 300x700+0+0
这样每个新的 Xlogo 窗口都会成为一个停靠点,并在生成时正确定位。
答案2
窗口管理器 (WM) 可以拦截应用程序与 X 服务器的某些交互。
其中一项操作是调整大小(最大化就是调整大小)。因此应用程序会说“我必须喜欢这个窗口的大小”,然后 WM 开始处理请求并会说“好的,这就是您获得的大小和位置”。
所以原则上,WM 可以将 25% 的屏幕指定给一个特定窗口,将 75% 的屏幕指定给所有其他窗口。
但是,我不知道有任何 WM 可以在其中配置类似的内容。因此您可能必须编写自己的 WM,或者修改现有的 WM。
我确实知道有所谓的平铺 WM,但它们通常会平铺所有窗口,因此,这可能不是您想要的。
OTOH,我不熟悉 openbox 和 plank,所以也许他们可以......