6

当我zenity的垃圾邮件过滤器守护程序过滤一组邮件时,我会发布一个简单的通知。目前,此消息发布在屏幕中间,显得突兀。我想把它贴到左上角。但是,zenity它不-geometry支持所有 X 应用程序的标准选项,其文档提供了用于控制窗口高度和宽度的选项,但不提供位置。

有没有办法控制zenity发布窗口的 (x,y) 坐标?

如果没有,有没有办法通过修补 X 资源或窗口管理器(我正在使用fvwm)来解决这个问题?


编辑:以下不适用于~/.fvwm2rcfvwm版本 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窗口没有边框……但仍然在该死的屏幕中央!

4

5 回答 5

4

我通过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 移动到左上角,然后将其移动到当前工作区。查看完整示例

于 2012-11-08T18:42:39.243 回答
2

You could try using the "old" way of doing this, using 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

If this still doesn't work (or you are determined to get it working using PositionPlacement) you could try

BugOpts ExplainWindowPlacement

Fvwm will then write debugging output to it's logfile (or to the console, depending on your setup) explaining how it is placing windows (and why it is doing so).

Also just fyi, if you want to get information about a window you can use the FvwmIdent module to get this information (instead of xprop, though both work fine).

于 2011-01-06T13:27:58.827 回答
1

是的,在窗口管理器的适当帮助下,这绝对是可能的。例如,使用 xmonad 它将是一行代码......

我的 fvwm 有点生锈,但它看起来像这样的东西:

Style "zenity" PositionPlacement -0 -0

在您的 fvwm2rc 中应该可以解决问题。

编辑:注意小写的“zenity”,因为根据文档,它不仅应该匹配窗口标题,还应该匹配窗口类(您可以使用“xprop”实用程序找到它:启动它并指向有问题的窗口)。

根据 xprop,zenity 窗口有两个有趣的属性:

  1. 它有_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG,表示它是一个对话窗口
  2. 它有WM_TRANSIENT_FOR(WINDOW): window id # <some window id here>,表示它是一个对话框的主窗口(在我的例子中 - xterm 窗口)

所以,如果我的建议不起作用,那么几乎可以肯定是因为 fvwm 以一种特殊的方式处理对话框——要么是由于配置,要么是由于硬编码的行为。

您可以尝试EWMHIgnoreWindowType在 zenity windows 的样式中添加“”,这应该可以让 fvwm 忽略这些提示

于 2009-11-12T14:33:20.837 回答
1

试试devilspie: http ://burtonini.com/blog/computers/devilspie/

于 2010-01-24T12:39:10.847 回答
0

您可以使用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

于 2015-12-11T21:46:15.343 回答