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

6
我正在使用zenity发布一个简单的通知,当我的垃圾邮件过滤器守护程序过滤一组消息时。目前这条消息被发布在屏幕中央,这是很烦人的。我想将其发布到左上角。然而,zenity不支持-geometry选项,这个选项应该是所有X应用程序的标准,它的文档提供了控制窗口高度和宽度的选项,但没有位置选项。
有没有办法控制zenity窗口发布的(x,y)坐标?
如果没有,是否可以通过调整X资源或窗口管理器(我正在使用fvwm)来解决这个问题?
编辑:以下内容在~/.fvwm2rcfvwm版本2.5.26)中无效:
Style "Information" PositionPlacement -0 -0
Style "Zenity" PositionPlacement -0 -0

他们也不能使用man页面中建议的-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窗口没有边框...但仍然位于屏幕中央!

你尝试过使用EWMHIgnoreStateHints和EWMHIgnoreWindowType吗? - ADEpt
5个回答

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移动到左上角位置;其次,将其移动到当前工作区。在此处查看完整示例。


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

另外,只是提供信息,如果您想获取有关窗口的信息,可以使用FvwmIdent模块获取此信息(而不是xprop,尽管两者都可以正常工作)。


可怕。我可能不会尝试这个,但是+1用于大量的fvwm技巧。 - Norman Ramsey

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窗口的样式中,这应该会使fvwm忽略这些提示。


谢谢你的建议,但实际上它并不起作用,因为我已经编辑了我的问题以反映这一点。 - Norman Ramsey
没有运气。如果你有其他想法,请告诉我。 - Norman Ramsey
尝试去掉“zenity”周围的引号,像这样: Style zenity PositionPlacement -0 -0 - ADEpt
噢,还试着添加 EWMHIgnoreStateHints 吧。 - ADEpt
请问您能否提供一下您的xmonad一行代码吗?谢谢! - Paul Hedderly
Paul,请查看http://xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Hooks-Place.html以获取示例。 - ADEpt

0

你可以使用wmctrl获取窗口ID,然后使用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


我在你的示例中收到了错误信息 Warning: XTEST extension unavailable on '(null)'. Some functionality may be disabled; See 'man xdotool' for more info. Too few arguments (got 1, minimum is 2)。你知道出了什么问题吗? - Sulawesi


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接