Сочетание клавиш GNOME 3 «Всегда поверх всех окон» не отключается

Сочетание клавиш GNOME 3 «Всегда поверх всех окон» не отключается

Это не большая проблема, но немного раздражает и, прежде всего, интригует. Я уже некоторое время работаю на стабильной машине 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, мне пришлось быть осторожным при написании команды, чтобы не уходить глубже, чем на один уровень (используя двойные кавычки). Любое дальнейшее вложение строк в кавычки потребовало бы множества запутанных обратных косых черт для экранирования кавычек.

Связанный контент