如何在 bash 中获取标题栏的高度

如何在 bash 中获取标题栏的高度

我正在开发一个宠物项目,其中涉及了解不同 Linux Mint PC 上标题栏的高度,我意识到尺寸取决于窗口标题字体,可能还取决于一些 CSS,因此它可能会因 PC 的不同而变化。我一直在寻找答案,但我似乎无法确定它,我确信它很容易找到,但是在哪里!

我当前运行的是 Mint 21.3 并安装了 xdotool。我对 Bash 脚本非常陌生,而且我也遇到了一些问题,所以对我来说没有什么是容易的,但经过一些研究和大约八个小时的反复试验,我想出了这个......


sleep .05
id=$(xdotool getactivewindow)
xdotool windowmove $id 0 0
sleep .05
y=$(xprop -root '_NET_WORKAREA')
y=$(($(xwininfo -id $id|grep -oP "(?<=Absolute upper-left Y:).*") - $(echo ${y#=}|cut -d, -f2)))

read -n1 -p "Title Bar = $y"

这确实有效,我sleep .05也需要添加这两个,以确保 xdotool、xprop 和 wininfo 不会执行太快并导致窗口移动失败和/或结果为“0”,在我添加它们之前偶尔会出现这种情况。也许有更简单的方法可以做到这一点,请告诉我echo $TITLEBAR

我需要在脚本开始时睡眠,因为它id=$(xdotool getactivewindow)给出了上一个窗口的 id,此时该窗口仍然是活动窗口,我需要等待我的终端成为活动窗口,我的脚本 100% 失败不睡觉的时间。 Bash 对我来说非常陌生,因此欢迎任何提示和技巧,我将在变量中添加引号。我需要${y#=}从变量“y”中删除“=”之前的所有内容,可能有许多更好的方法来获取“=”之后的值,但这是我知道的唯一方法。至于我的脚本的可读性,我确实倾向于压缩所有内容,(对此感到抱歉!)最后的读取以显示结果只是我几周前暂停脚本以查看结果的方式我什至无法让新手的“Hello World”工作,它正在工作,但是窗口运行并在黑色闪烁中关闭,我不知道出了什么问题!

我已按照您的建议进行了更改,这是我的第二次尝试。

#!/bin/bash

id=$(xdotool getactivewindow)
echo "Id = "$id" Wrong One!!"

sleep .08 # .05 was not quite enough, it occasionally failed.
id=$(xdotool getactivewindow)
echo -e "Id = "$id"\n"

xdotool windowmove $id 0 0

sleep .05 # Prevent xprop from giving pre-move results.
workarea=$(xprop -root "_NET_WORKAREA")

# Strip everything before the values.
workarea=${workarea#*=}

top_panel=$(echo "$workarea" | cut -d, -f2)
echo "Top Panel = "$top_panel

# Get height of top panel + header bar
y=$(xwininfo -id "$id" | grep -oP "(?<=Absolute upper-left Y:).*")
echo -e "Top panel + Header Bar ="$y"\n"

headerbar=$(( y - top_panel ))
echo "Title Bar = "$headerbar"px"

read -n1 -p "Any key to exit"

结果:
Id = 46137366 错误!!
Id = 83886086
顶部面板 = 32
顶部面板 + 标题栏 = 82
标题栏 = 50px

任意键退出

似乎需要很多装备才能找到一个小小的数字!什么是“简单”方法?

这是我原始脚本的更新版本。

#!/bin/bash

sleep .08 # Allow time for the active window to become this window.
id=$(xdotool getactivewindow)

# Move the window to the top of the screen so that xprop gives
# the exact size of the window header bar including top panel.
xdotool windowmove "$id" "0" "0"

sleep .05 # Allow time for xdotool to move this window.
xprop=$(xprop -root "_NET_WORKAREA")

# Cut out the desired value and trim the space before the value.
top_panel=$(echo "$xprop" | cut -d, -f2 | xargs)

# Get the size between the top of screen and the start of this window.
xwininfo=$(xwininfo -id "$id" | grep -oP "(?<=Absolute upper-left Y:).*")
headerbar=$(( xwininfo - top_panel ))

echo -e "Top panel  = $top_panel""px""\nHeader Bar = $headerbar""px""\n"

# Remove the variables from memory.
unset id xprop top_panel xwininfo headerbar
read -n1 -p "Any key to exit."

现在应该已经接近脚本的内容了!尽管如此,我仍然会在我的脚本中使用不带引号的无空格变量,如下图所示,因为我有诵读困难,这确实使阅读行对 echo -e "Top panel = $top_panel""px""\nHeader Bar = $headerbar""px""\n"我来说很难阅读。

在 bash 脚本中错误地使用了引号,但对阅读困难的人阅读很有帮助

相关内容