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

问题描述 投票:0回答:6

当我的垃圾邮件过滤器守护进程过滤一组邮件时,我使用

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 x11 zenity
6个回答
5
投票

我通过在子 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
投票

是的,在窗口管理器的适当帮助下这绝对是可能的。例如,使用 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 忽略这些提示



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


0
投票

老问题看起来仍然与devilspie相关+1

这是我的

~/.devilspie/zenity.ds

(if
  (is (window_class) "zenity")
  (begin
    (above)
    (center)
   )
)

这还添加了“上方”,因此您不会意外地被其他窗口覆盖。

© www.soinside.com 2019 - 2024. All rights reserved.