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

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

使用:Linux Mint 13 (Maya) 64 Cinnamon 2.0.14,wmctrl v.1.07

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

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

使用 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_LEFT 和 XPOS_RIGHT 添加或减去额外的 3,以及为 YPOS_UP 和 YPOS_DOWN 添加或减去额外的 24 进行手动补偿,使移动值达到应有的 100。但是,当将 +8 或 +7 添加到适当的 xPos 或 yPos 值并将 wmctrl 命令更改为使用“-e 0,$xPos,$yPos,-1,-1”时,相反轴上的 -8 和 -7 仍然存在”.

有人可以向我解释发生了什么事以及如何解决这个问题吗?

非常感谢。

#!/bin/bash

# commandArg ($1) can have any of the following values:
# HEIGHT_GROW, HEIGHT_SHRINK, WIDTH_GROW, WIDTH_SHRINK,
# YPOS_UP, YPOS_DOWN, XPOS_LEFT, XPOS_RIGHT
commandArg="$1"

amountToResize="50"
amountToMove="100"

# Get Window ID of the currently active window using xprop.
winID=$(xprop -root '_NET_ACTIVE_WINDOW' | grep --only-matching '0x.*')

# Alter $winID for usage with wmctrl because it requires a leading 0
# in the hex number. e.g. 0x2600006 --> 0x02600006
winIDForWmCtrl=$(echo $winID | sed 's/^0x/0x0/g')

# Get position and dimensions using wmctrl.
xPos=$(wmctrl -G -l | grep $winIDForWmCtrl | awk '{ print $3 }')
yPos=$(wmctrl -G -l | grep $winIDForWmCtrl | awk '{ print $4 }')
width=$(wmctrl -G -l | grep $winIDForWmCtrl | awk '{ print $5 }')
height=$(wmctrl -G -l | grep $winIDForWmCtrl | awk '{ print $6 }')

# Alter the appropriate dimension or positional value and call wmctrl,
# depending of which argument was used when calling the script.

if [ "$commandArg" = "HEIGHT_GROW" ]; then
    let 'height = height + amountToResize'
    wmctrl -ir $winIDForWmCtrl -e 0,-1,-1,-1,$height

elif [ "$commandArg" = "HEIGHT_SHRINK" ]; then
    let 'height = height - amountToResize'
    wmctrl -ir $winIDForWmCtrl -e 0,-1,-1,-1,$height

elif [ "$commandArg" = "WIDTH_GROW" ]; then
    let 'width = width + amountToResize'
    wmctrl -ir $winIDForWmCtrl -e 0,-1,-1,$width,-1

elif [ "$commandArg" = "WIDTH_SHRINK" ]; then
    let 'width = width - amountToResize'
    wmctrl -ir $winIDForWmCtrl -e 0,-1,-1,$width,-1

elif [ "$commandArg" = "YPOS_UP" ]; then
    let 'yPos = yPos - amountToMove'
    wmctrl -ir $winIDForWmCtrl -e 0,-1,$yPos,-1,-1

elif [ "$commandArg" = "YPOS_DOWN" ]; then
    let 'yPos = yPos + amountToMove'
    wmctrl -ir $winIDForWmCtrl -e 0,-1,$yPos,-1,-1

elif [ "$commandArg" = "XPOS_LEFT" ]; then
    let 'xPos = xPos - amountToMove'
    wmctrl -ir $winIDForWmCtrl -e 0,$xPos,-1,-1,-1

elif [ "$commandArg" = "XPOS_RIGHT" ]; then
    let 'xPos = xPos + amountToMove'
    wmctrl -ir $winIDForWmCtrl -e 0,$xPos,-1,-1,-1
fi

exit 0
bash x11
1个回答
0
投票

我正在编写的类似脚本也遇到了同样的问题。您是否找到了准确获取位置的解决方案?

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