Это не большая проблема, но немного раздражает и, прежде всего, интригует. Я уже некоторое время работаю на стабильной машине Debian 9 с Xfce 4.12 и параллельно настраиваю рабочий стол GNOME, чтобы попробовать.
В Xfce у меня есть пользовательское сочетание клавиш wmctrl -r :ACTIVE: -b toggle,above
, которое работает всегда и переключает сфокусированные окна на верхние и на один уровень с другими.
Я попробовал то же самое на GNOME 3.22 в Системных настройках / Клавиатура, я могу только переключить сфокусированное окно поверх других, оно не переключает его обратно на тот же уровень, что и другие окна. Мне нужно щелкнуть правой кнопкой мыши по рамке окна и снять флажок «Всегда поверх».
Есть ли у кого-нибудь идеи, почему это могло произойти?
решение1
Я тоже это заметил в апреле 2016 года, мой обходной путь — использовать 2 клавиши для переключения, например:
wmctrl -r :ACTIVE: -b add,above
wmctrl -r :ACTIVE: -b remove,above
решение2
Ну, после долгих исследований и проработки того, как правильно писать код в bash, я создал одну команду, которая использует команды wmctrl в слое логики для эффективного переключения состояния «всегда поверх» на текущем рабочем столе GNOME! Вот:
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[[ ... ]]
и оператор сопоставления регулярных выражений=~
bash -c '■'
В частности, этот последний шаг занял у меня очень много времени, чтобы разобраться. Пока я не понял, что сочетания клавиш не работают в bash по умолчанию, я понятия не имел, почему команды работали в консоли, когда я их тестировал, но молча терпели неудачу, когда запускались напрямую как сочетание клавиш. Это сводило меня с ума на протяжении многих лет!
Примечание: поскольку вам нужны кавычки вокруг команды, которую вы отправляете в bash, мне пришлось быть осторожным при написании команды, чтобы не уходить глубже, чем на один уровень (используя двойные кавычки). Любое дальнейшее вложение строк в кавычки потребовало бы множества запутанных обратных косых черт для экранирования кавычек.