![让 Zenity 对话框始终位于前台顶部](https://linux22.com/image/54747/%E8%AE%A9%20Zenity%20%E5%AF%B9%E8%AF%9D%E6%A1%86%E5%A7%8B%E7%BB%88%E4%BD%8D%E4%BA%8E%E5%89%8D%E5%8F%B0%E9%A1%B6%E9%83%A8.png)
有没有办法检测对话框Zenity
是否失去焦点?
我想将对话框保留在前台,除非用户按下ESC。
我正在尝试将其添加到这个脚本:
#!/bin/bash
# requires these packages from ubuntu repository:
# wmctrl, zenity, x11-utils
# and the script mouse-speed
# This procect on git: https://github.com/rubo77/mouse-speed
######## configuration ##########
# seconds between micro breaks
microbreak_time=$(( 10 * 60 ))
# micro break duration in seconds
microbreak_duration=15
# seconds between long breaks
longbreak_time=$(( 120 * 60 ))
# message to display
message="Try focussing a far object outside the window with the eye to relax!"
longbreak_message="Change your seating or continue work in a standing/sitting position"
#postpone label
postpone="Postpone"
window_title="typebreak"
# global zoom of your window manager:
ZOOM=2
# height in px of the top system-bar:
TOPMARGIN=57
# sum in px of all horizontal borders:
HORIZONTALMARGIN=40
# get width of screen and height of screen
SCREEN_WIDTH=$(xwininfo -root | awk '$1=="Width:" {print $2}')
SCREEN_HEIGHT=$(xwininfo -root | awk '$1=="Height:" {print $2}')
# width and height
W=$(( $SCREEN_WIDTH / $ZOOM - 2 * $HORIZONTALMARGIN ))
H=$(( $SCREEN_HEIGHT / $ZOOM - 2 * $TOPMARGIN ))
function slow_down(){
#zenity --warning --text "slow down mouse";
mouse-speed -d 30
}
while true; do
# short loop every few minutes to look around
sleep $microbreak_time
(
echo "99"
sleep $(( $microbreak_duration - 2 ))
echo "# Mouse speed reset to 100%"
sleep 2
echo "100"
) | if ( sleep 1 && wmctrl -F -a "$window_title" -b add,maximized_vert,maximized_horz && sleep 3 && wmctrl -F -a "$window_title" -b add,above ) & ( zenity --progress --text "$message" --percentage=0 --auto-close --height=$H --width=$W --pulsate --title="$window_title" --cancel-label="$postpone" ); then
#zenity --info --text "Maus normal speed!"
mouse-speed -r
else
slow_down
fi
done &
while true; do
# second long loop to change seat position
sleep $longbreak_time
zenity --warning --text "$longbreak_message" --title="$window_title - long break"
done
答案1
#!/bin/bash
# This will wait one second and then steal focus and make the Zenity dialog box always-on-top (aka. 'above').
(sleep 1 && wmctrl -F -a "I am on top" -b add,above) &
(zenity --info --title="I am on top" --text="How to help Zenity to get focus and be always on top")
来源:
答案2
如果将其作为 cron 作业运行,则可能会遇到问题。 Cron 的环境不知道您的 X 显示、dbus 或桌面,并且不会显示 zenity 框或将其保留在顶部。在之前添加 DISPLAY=:0两个都wmctrl 和 zenity 解决了该问题:
(sleep 1 && DISPLAY=:0 wmctrl -F -a "I am on top" -b add,above) & (DISPLAY=:0 zenity --info --title="I am on top" --text="How to help Zenity to get focus and be always on top")
答案3
此解决方案与@Jan 的解决方案基本相同,但使用 PID 而不是窗口标题来识别窗口,此外与 Bourne Shell 兼容(-> 不需要 bash)。
#!/bin/sh
# This will wait 200ms, steal focus and set the Zenity dialog box
# to "always-on-top".
modify_win_by_pid() {
pid=$1
sleep 0.2
win_id=`wmctrl -l -p | grep ${pid} | awk '{print $1}'`
wmctrl -i - ${win_id} -b add,above
}
zenity --info --title="I am on top" --text="I received focus and will stay on top" &
modify_win_by_pid $!