Bash 使用wmCtrl移动窗口会导致定位不准确

Bash 使用wmCtrl移动窗口会导致定位不准确,bash,x11,Bash,X11,使用:Linux Mint 13(Maya)64肉桂2.0.14,wmctrl v。1.07 由于身体残疾,我希望能够使用键盘移动和调整窗口大小,但调整大小和移动跳跃要比使用标准移动和调整大小键盘控件实现的微小增量大得多 为了实现这一点,我编写了一个Bash脚本,根据给定的参数,它将增大或缩小窗口的宽度或高度,或将窗口向上、向下、向左或向右移动。脚本由各种全局肉桂热键调用,每个热键使用不同的参数调用脚本 使用wmctrl调整窗口的大小(增加或减少高度或宽度)非常有效。没问题 我遇到的问题是,当我

使用:Linux Mint 13(Maya)64肉桂2.0.14,wmctrl v。1.07

由于身体残疾,我希望能够使用键盘移动和调整窗口大小,但调整大小和移动跳跃要比使用标准移动和调整大小键盘控件实现的微小增量大得多

为了实现这一点,我编写了一个Bash脚本,根据给定的参数,它将增大或缩小窗口的宽度或高度,或将窗口向上、向下、向左或向右移动。脚本由各种全局肉桂热键调用,每个热键使用不同的参数调用脚本

使用wmctrl调整窗口的大小(增加或减少高度或宽度)非常有效。没问题

我遇到的问题是,当我向上、向下、向左或向右移动车窗时。使用wmctrl向上或向下移动窗口时,窗口也将稍微向左移动,向左或向右移动时,窗口也将稍微向上移动。此外,不接受100像素的移动值

Values are: x, y, width, height.

XPOS_LEFT
WmCtrl (before move) : 560, 291, 795, 681
WmCtrl (after move)  : 463, 283, 795, 681 [-97, -8] should be [-100, 0]

XPOS_RIGHT
WmCtrl (before move) : 764, 289, 795, 681
WmCtrl (after move)  : 867, 281, 795, 681 [+103, -8] should be [+100, 0]

YPOS_UP
WmCtrl (before move) : 770, 273, 795, 681
WmCtrl (after move)  : 763, 197, 795, 681 [-7, -76] should be [0, -100]

YPOS_DOWN
WmCtrl (before move) : 763, 197, 795, 681
WmCtrl (after move)  : 756, 321, 795, 681 [-7, +124] should be [0, +100]

Growing and shrinking the width and height work perfectly.
起初,我认为问题可能在于使用wmctrl检索的初始窗口位置值。因此,我编写了使用xwininfo检索窗口位置的代码。由于某些原因,使用wmctrl和xwininfo检索的x、y位置值略有不同,但错误移动的数量保持不变,无论使用wmctrl还是xwininfo初始位置值,都没有任何区别-相同的数量仍然存在相同的问题

请注意,我使用wmctrl-e的-1值表示不更改,使用“-e 0、$xPos、$yPos、$width、$height”并不能解决这种情况。事实上,这样做会使情况变得更糟,因为在调整窗口大小时,窗口的位置会发生类似的变化

手动补偿通过为XPOS_左侧和XPOS_右侧添加或减去额外的3,以及为YPOS_向上和YPOS_向下添加或减去额外的24,使移动值达到100,这是应该的。但是当+8或+7被添加到相应的xPos或yPos值并将wmctrl命令更改为使用“-e 0,$xPos,$yPos,-1,-1”时,相反轴中的-8和-7仍然存在

有人能给我解释一下发生了什么事以及我如何解决这个问题吗

非常感谢

#/bin/bash
#commandArg($1)可以具有以下任意值:
#高度增长,高度收缩,宽度增长,宽度收缩,
#向上,向下,向左,向右
commandArg=“$1”
amountToResize=“50”
amountToMove=“100”
#使用xprop获取当前活动窗口的窗口ID。
winID=$(xprop-root“\u NET\u ACTIVE\u WINDOW”\grep——仅匹配“0x.*”)
#将$winID改为与wmctrl一起使用,因为它需要前导0
#在十六进制数中。e、 g.0x2600006-->0x02600006
winIDForWmCtrl=$(回显$winID | sed's/^0x/0x0/g')
#使用wmctrl获取位置和尺寸。
xPos=$(wmctrl-G-l | grep$winIDForWmCtrl | awk'{print$3}')
yPos=$(wmctrl-G-l | grep$winIDForWmCtrl | awk'{print$4}')
宽度=$(wmctrl-G-l | grep$winIDForWmCtrl | awk'{print$5}')
高度=$(wmctrl-G-l | grep$winIDForWmCtrl | awk'{print$6}')
#更改适当的尺寸或位置值并调用wmctrl,
#取决于调用脚本时使用的参数。
如果[“$commandArg”=“高度增长”];然后
让‘高度=高度+数量大小’
wmctrl-ir$winIDForWmCtrl-e 0,-1,-1,$height
elif[“$commandArg”=“高度收缩”];然后
让‘高度=高度-数量大小’
wmctrl-ir$winIDForWmCtrl-e 0,-1,-1,$height
elif[“$commandArg”=“宽度增长”];然后
让“宽度=宽度+数量大小”
wmctrl-ir$winIDForWmCtrl-e 0,-1,-1,$width,-1
elif[“$commandArg”=“宽度收缩”];然后
让“宽度=宽度-数量大小”
wmctrl-ir$winIDForWmCtrl-e 0,-1,-1,$width,-1
elif[“$commandArg”=“YPOS_UP”];然后
让'yPos=yPos-amountomove'
wmctrl-ir$winIDForWmCtrl-e 0,-1,$yPos,-1,-1
elif[“$commandArg”=“YPOS_DOWN”];然后
让'yPos=yPos+amountToMove'
wmctrl-ir$winIDForWmCtrl-e 0,-1,$yPos,-1,-1
elif[“$commandArg”=“XPOS_左”];然后
让'xPos=xPos-amountToMove'
wmctrl-ir$winIDForWmCtrl-e0$xPos,-1,-1
elif[“$commandArg”=“XPOS_RIGHT”];然后
让'xPos=xPos+amountToMove'
wmctrl-ir$winIDForWmCtrl-e0$xPos,-1,-1
fi
出口0

需要进一步了解这一点,但我猜您一定看到了窗口管理器框架的偏移量,因为您得到了客户端窗口的原始大小。另外,我建议用肉桂填充bug,让增量可控,并可能研究我刚才在研究肉桂时提到的平铺/网格支持。取一个最大化窗口,用wmctrl确定其坐标。左上角是否位于(0,0)?如果是,wmctrl不考虑WM装饰。现在尝试将一些窗口移动到(0,0)。它是将WM帧的左上角移动到(0,0)还是客户端区域的左上角?这里可能有出入。如果是这种情况,请使用wmctrl提交一个bug。您可以使用
xwininfo
来解决这个问题,它允许您选择是否需要WM帧(参数
-frame
).如果我运行xwininfo-stats,然后再次使用-frame并同时获取宽度和高度,那么我可以通过从一个宽度减去另一个宽度以及高度来计算出帧大小。结果值与差异完全对应。但是:man xwininfo-frame“此选项导致在手动选择窗口时考虑窗口管理器框架”。如果不在运行鼠标的情况下手动选择窗口,则无法获得-frame输出:“xwininfo-frame-id WinId”只提供默认值(-stats)。有没有其他方法可以让我得到相框的尺寸?谢谢。我不知道
-框架
不能与
-