Как автоматически поднять окно на все рабочие пространства в GNOME2 / metacity?
Допустим, я хочу работать в одном рабочем пространстве
sleep 10 && zenity --warning --text 'Wake up!'
а потом я работаю над другими вещами в другом рабочем пространстве. Как получить всплывающее окно zenity в любом рабочем пространстве вместо исходного рабочего пространства, в котором я набрал команду? Или это проще сделать во всех рабочих пространствах?
2 ответа
Я не нашел изящного способа, чтобы такой диалог появлялся во всех рабочих пространствах одновременно (мультиплекс), но нашел после некоторого возни с этим wmctrl
позволяет установить положение, размер окна и (что наиболее важно) поднять его в активной в данный момент рабочей области.
в моем конкретном случае мне нужно, чтобы это работало также для уведомлений, запланированных через cron
а также at
который требует немного другого подхода, как показано в следующем шеллскрипте:
#!/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 (проверьте пакет libnotify-bin
в системах на основе Debian), которые также не поднимают терминал в активной рабочей области:
#!/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
Я нашел немного лучший способ, основываясь на ответе антиплекса:
function alert {
# https://stackru.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 &
}