当我的垃圾邮件过滤器守护进程过滤一组邮件时,我使用
zenity
发布简单的通知。 目前这条消息被发布到屏幕中间,显得很突兀。 我想把它贴到左上角。 但是,zenity
不支持 -geometry
选项,该选项应该是所有 X 应用程序的标准选项,并且其文档提供了用于控制窗口高度和宽度的选项,但没有提供控制位置的选项。
有没有办法控制
zenity
窗口发布的 (x,y) 坐标?
如果没有,有没有办法通过修改 X 资源或窗口管理器来解决这个问题(我正在使用
fvwm
)?
编辑:以下内容在
~/.fvwm2rc
(fvwm
版本2.5.26)中不起作用:
Style "Information" PositionPlacement -0 -0
Style "Zenity" PositionPlacement -0 -0
它们也不适用于删除的
-0 -0
,如手册页中建议的那样。
(zenity --info
的窗口标题是“信息”。)
有趣的是,
zenity
忽略了我之前的窗口管理器指令,即默认情况下应手动放置窗口。
编辑:
在许多其他令人着迷的信息中,
xprop(1)
报告了有关 zenity
窗口的信息:
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG
WM_NORMAL_HINTS(WM_SIZE_HINTS):
program specified location: 0, 0
program specified minimum size: 307 by 128
program specified maximum size: 307 by 128
window gravity: NorthWest
WM_CLASS(STRING) = "zenity", "Zenity"
WM_ICON_NAME(STRING) = "Information"
WM_NAME(STRING) = "Information"
尽管这个报告显然令人鼓舞,但该窗口实际上并未发布在位置 0,0 :-(
我知道
Style
命令正在生效,因为我添加了 !Borders
选项,果然 zenity
窗口没有边框……但仍然位于该死的屏幕中央!
我通过在子 shell 中使用
wmctrl
来做到这一点。示例:
((sleep .4;wmctrl -r TeaTimer -R TeaTimer -e 0,50,20,-1,-1)
for ((a=$LIMIT; a > 0; a--)); do
# for loop generates text, not shown
done
wmctrl -R TeaTimer
) | zenity --progress --title="TeaTimer" --percentage=0
第一个
wmctrl
将 zenity 移动到左上角,第二个将其移动到
当前工作区。查看完整示例。
您可以尝试使用“旧”方法来执行此操作,即使用 FvwmEvent。
AddToFunc StartFunction I Module FvwmEvent FvwmEvent-MoveWindow
DestroyModuleConfig FvwmEvent-MoveWindow: *
*FvwmEvent-MoveWindow: Cmd Function
*FvwmEvent-MoveWindow: add_window MoveZenity
DestroyFunc MoveZenity
AddToFunc MoveZenity
+ I ThisWindow ("zenity") Move -0 -0
如果这仍然不起作用(或者您决心使用 PositionPlacement 让它发挥作用),您可以尝试
BugOpts ExplainWindowPlacement
Fvwm 然后会将调试输出写入其日志文件(或控制台,具体取决于您的设置),解释它如何放置窗口(以及为什么这样做)。
仅供参考,如果您想获取有关窗口的信息,您可以使用 FvwmIdent 模块来获取此信息(而不是 xprop,尽管两者都可以正常工作)。
是的,在窗口管理器的适当帮助下这绝对是可能的。例如,使用 xmonad 这将是一行代码...
我的 fvwm 有点生疏了,但看起来像是这样的:
Style "zenity" PositionPlacement -0 -0
在你的 fvwm2rc 中应该可以解决问题。
编辑:请注意小写的“zenity”,因为根据文档,它不仅应该匹配窗口标题,还应该匹配窗口类(您可以使用“xprop”实用程序找到它:启动它并指向有问题的窗口) .
根据 xprop,zenity 窗口有两个有趣的属性:
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG
,说明这是一个对话框窗口WM_TRANSIENT_FOR(WINDOW): window id # <some window id here>
,表示它是一个对话框的主窗口(在我的例子中 - xterm 窗口)因此,如果我的建议不起作用,那么几乎可以肯定是因为 fvwm 以特殊方式处理对话框 - 要么是由于配置,要么是由于硬编码行为。
您可以尝试将“
EWMHIgnoreWindowType
”添加到 zenity 窗口的样式中,这应该会让 fvwm 忽略这些提示
尝试 Devilspie:http://burtonini.com/blog/computers/devilspie/
您可以使用
wmctrl
获取 windowid,然后使用 xdotool
将其放置在您想要的任何位置。简单且适用于多种类型的环境。
## Arg 1 - Pid of window to move.
## Arg 2 - X-Coord.
## Arg 3 - Y-Coord.
function move_win() {
xdotool windowmove $(wmctrl -lp | grep ${1} | cut -d' ' -f1) ${2} ${3}
}
例如
$> move_win $(pidof zenity) 0 0
老问题看起来仍然与devilspie相关+1
这是我的
~/.devilspie/zenity.ds
:
(if
(is (window_class) "zenity")
(begin
(above)
(center)
)
)
这还添加了“上方”,因此您不会意外地被其他窗口覆盖。