假设我想在一个工作区中运行
sleep 10 && zenity --warning --text 'Wake up!'
然后我在不同的工作区中处理其他东西。如何在我输入的工作空间中弹出此zenity窗口而不是我输入命令的原始工作空间?或者是否更容易在所有工作区中弹出它?
答案 0 :(得分:3)
我还没有找到一种优雅的方式让所有工作区同时弹出这样的对话框(多路复用),但是在一些摆弄之后发现wmctrl
可以设置窗口的位置,大小和(最重要的是)让它在当前活动的工作区上升起。
在我的具体情况下,我需要将此工作用于通过cron
和at
安排的通知,这需要稍微不同的方法,如以下shellcript所示:
#!/usr/bin/env bash
## demo of how to raise a zenity-notification on the active workspace
## license: MIT copyright: antiplex
export DISPLAY=:0.0
## start wmctrl with a delay in subshell
(sleep 1; wmctrl -r TimedWarning -e 0,40,30,-1,-1; wmctrl -R TimedWarning) &
## launch a zenity dialogue of your choice
zenity --warning --title="TimedWarning" --text="Time is up!" --display=:0.0
出于一些奇怪的原因,上面的脚本还会在我使用at
进行调度时以及当终端仍处于打开状态时,将我计划执行的终端窗口拉到活动工作区。
这是使用通知守护程序/ libnotify(在基于debian的系统上检查包libnotify-bin
)的另一个变体,它不会在活动工作区上引发终端:
#!/usr/bin/env bash
## demo of how to raise a non-volatile libnotify-notification
## on the currently active workspace
## license: MIT copyright: antiplex
export DISPLAY=:0.0
## critical notifications with expire time 0 need to be manually confirmed
notify-send --expire-time 0 -u critical TimedWarning "Time is up!"
## rename window title as notify-send would name all its windows 'notify-send'
wmctrl -r notify-send -T TimedWarning
## set new position in upper left corner, keeping the windows size
wmctrl -r TimedWarning -e "0,40,30,-1,-1"
## raise window on currently active workspace
wmctrl -R TimedWarning
答案 1 :(得分:0)
我根据反复数词的答案找到了更好的方法:
function alert {
# https://stackoverflow.com/questions/18880524/how-do-i-raise-window-to-all-workspaces-automatically-in-gnome2-metacity/19990162#19990162
export DISPLAY=:0.0
name="TimedWarning"
text="Time is up!"
function set-properties() {
while [ x"$(wmctrl -l | grep -i "$name")" = "x" ] ; do
sleep 0.001
done
wmctrl -r $name -b add,sticky,above
}
zenity --warning --title="$name" --text="$text" --display=:0.0 &
set-properties &
}