我的shell脚本如何控制zenity窗口的位置?

时间:2009-11-11 21:20:21

标签: shell x11 zenity

当我的垃圾邮件过滤器守护程序过滤一组邮件时,我正在使用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窗口的帖子没有边框......但仍然在该死的中心屏幕!

5 个答案:

答案 0 :(得分:4)

我是通过在子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移动到左上角,第二个移动到 当前工作空间请参阅full example

答案 1 :(得分:2)

您可以尝试使用“旧”方式,使用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会将调试输出写入其日志文件(或控制台,具体取决于您的设置),解释它是如何放置窗口的(以及为什么会这样做)。

同样只是fyi,如果你想获得有关窗口的信息,你可以使用FvwmIdent模块来获取这些信息(而不是xprop,虽然两者都可以正常工作)。

答案 2 :(得分: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窗口)
  3. 所以,如果我的建议不起作用,那几乎可以肯定,因为fvwm以一种特殊的方式处理对话 - 无论是由于配置还是由于硬编码的行为。

    您可以尝试将“EWMHIgnoreWindowType”添加到zenity窗口的样式中,这应该希望fvwm忽略这些提示

答案 3 :(得分:1)

答案 4 :(得分: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}
} 

E.g。 $> move_win $(pidof zenity) 0 0