Я попытался использовать wmctrl
команду toggle, но она не сработала в моем Ubuntu. Переключатель включается, но не выключается. (Я думаю, что это может быть из-за того, что я использую рабочую среду gnome, на которой wmctrl
AFAIK немного сломан).
В любом случае, после долгих исследований и разработки того, как написать правильный код в bash, я создал единственную команду, которая использует wmctrl
команды в слое логики для эффективного переключения состояния «всегда сверху» на текущем рабочем столе GNOME. Я опубликовал этот ответ в Ask Unix / Linux, но решил опубликовать его и здесь, на случай, если у кого-то возникнет такая же проблема
Вот команда:
bash -c 'wmctrl -r :ACTIVE: -b $([[ $(xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}") _NET_WM_STATE) =~ "ABOVE" ]] && echo "remove" || echo "add"),above'
Он проверяет свойство свойства активного окна «_NET_WM_STATE», используя его xprops
, и если оно содержит текст «ABOVE», это означает, что опция «всегда сверху» активна. Затем он просто запускает wmctrl
команду с параметром add
или по remove
мере необходимости.
Разбивка команды (каждая команда вставляется в следующую, заменяя ■
заполнитель):
Получить идентификатор активного окна:
xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}"
Получить состояние окна с xprop
помощью идентификатора:
xprop -id $(■) _NET_WM_STATE
Проверьте, содержит ли состояние «ABOVE», указывая, что окно установлено на «всегда сверху»:
[[ $(■) =~ "ABOVE" ]]
Верните «remove», если true, в противном случае верните «add»:
■ && echo "remove" || echo "add"
запустить wmctrl
команду, используя возвращаемое значение в качестве параметра:
wmctrl -r :ACTIVE: -b $(■),above
Отправьте все это, чтобы bash
вы могли использовать подстановку команд ${ ... }
, булевскую оценку [[ ... ]]
и оператор соответствия регулярному выражению =~
:
bash -c '■'
Этот последний шаг, в частности, занял у меня очень много времени, чтобы понять. До тех пор, пока я не понял, что сочетания клавиш не работают в bash по умолчанию, я не представлял, почему команды работали в консоли, так как я их тестировал, но молча терпел неудачу при запуске непосредственно в качестве сочетания клавиш. Это вело меня вверх по стене целую вечность!
Примечание: поскольку вам нужны кавычки вокруг команды, которую вы отправляете в bash, я должен был быть осторожен при написании команды, чтобы я никогда не заходил глубже, чем на один уровень (используя двойные кавычки). Любое дальнейшее вложение строк в кавычки потребовало бы множества запутанных обратных косых черт, чтобы избежать кавычек.