После попытки ответов в этом вопросе: Как запустить приложение с "Поверх остальных окон" набора?, особенно тот в комментариях @MichaelTunnell:
Это - наилучший вариант для меня, потому что я могу создать сценарий удара или сочетание клавиш (который я сделал), использующий эту команду и тот способ, которым я могу использовать его, когда мне нужен он, но не, когда я не делаю. Я действительно вносил изменение хотя... Я хотел, чтобы ярлык повернулся поверх остальных окон для активного окна и только когда мне было нужно, таким образом, вот моя команда.
wmctrl -r :ACTIVE: -b toggle,above
Я смог переключиться поверх остальных окон в Ubuntu 16.10 или ниже, но не на Ubuntu 17.10, которая является той, которую я установил прямо сейчас и хотел бы иметь этот тот же ярлык
Я также попробовал это сообщение, которое является в основном более подробным сообщением комментария Michael Tunnell: Горячая клавиша для поверх остальных окон Ubuntu
Ярлык виден в изображении ниже, и это работает на установку окна Поверх остальных окон к Правда, но даже если я использую ту же команду снова для "выключения его", я не могу заставить активное приложение удалять то свойство.
Действительно ли это - ошибка в GNOME Ubuntu 17.10? Или я пропускаю какую-либо дополнительную конфигурацию в этой конкретной версии?
wmctrl
не полностью совместимо с Уэйлендом, который является сессией по умолчанию на Ubuntu 17.10.
Как обходное решение Вы переключаете назад на сессию Xorg после этого Вопросы и ответы: Как Вы переключаетесь из Уэйленда назад к Xorg в Ubuntu 17.10?
После большого исследования и удающийся, как написать надлежащий код в ударе, я создал единственную команду, которая использует команды wmctrl на слое логики для переключения 'поверх остальных окон' состояние эффективно на текущем рабочем столе GNOME! Созерцайте:
bash -c 'wmctrl -r :ACTIVE: -b $([[ $(xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \[110]\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}") _NET_WM_STATE) =~ "ABOVE" ]] && echo "remove" || echo "add"),above'
Это проверяет государственную собственность активного окна "_NET_WM_STATE" использование xprops
, и если это содержит текст "ВЫШЕ" этого, означает 'поверх остальных окон', опция активна. Затем это просто работает эти wmctrl
команда с параметром add
или remove
как соответствующее.
разбивка Команды (каждая команда вставляется в следующее, заменяя ■
заполнитель):
Получают идентификатор активного окна:
xprop -root -f _NET_ACTIVE_WINDOW 0x " \[116]\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}"
Получают статус окна от xprop использование идентификатора:
xprop -id $(■) _NET_WM_STATE
Проверка, если состояние содержит 'ВЫШЕ', указывая, что окно установлено на 'поверх остальных окон':
[[ $(■) =~ "ABOVE" ]]
Возврат "удаляет" если это правда, иначе возвращается, "добавьте":
■ && echo "remove" || echo "add"
работает, команда wmctrl с помощью возвращенного значения в качестве параметра
wmctrl -r :ACTIVE: -b $(■),above
Отправляют все это в [1 111] так, чтобы можно было использовать замену команды ${ ... }
, колотить булеву оценку [[ ... ]]
и оператор =~
bash -c '■'
соответствия regex, который Этот последний шаг в особенности взял меня очень долгое время для выяснения. Пока я не понял, что сочетания клавиш не работали в ударе по умолчанию, я понятия не имел, почему команды работали в консоли, поскольку я протестировал их, но тихо перестал работать, когда выполнено непосредственно как сочетание клавиш. Это управляло мной стена целую вечность!
Примечание: потому что Вам нужны кавычки вокруг команды, которую Вы отправляете в удар, я должен был быть осторожным при записи команды, что я никогда не шел больше, чем еще один уровень глубоко (использующий двойные кавычки). Дальнейшее вложение строк в кавычках потребовало бы, чтобы много запутывающих обратных косых черт вышло из кавычек.
Я думаю, что решение Джеффа отличное, но я хотел что-то более читабельное/адаптируемое, поэтому я написал этот быстрый скрипт bash, который работает очень похоже, но использует xdotool
для получения идентификатора for xprop
#!/bin/bash
# check if window is currently "ABOVE"
xprop -id $(xdotool getactivewindow) | grep NET_WM_STATE | grep -q ABOVE
if [ $? -eq 0 ]; then
wmctrl -r :ACTIVE: -b remove,above
else
wmctrl -r :ACTIVE: -b add,above
fi
Теперь я просто указываю ярлык на этот скрипт, и он у меня работает.
Я думаю, это довольно очевидно. Единственная часть, которая может потребовать объяснения, — это $?
, которая просто возвращает код выхода предыдущей команды (в данном случае grep: 0, если она совпала, 1, если она не удалась). Обратите внимание, что, вероятно, не рекомендуется использовать код выхода таким образом, поскольку grep
может завершиться ошибкой по какой-то другой причине, но этот сбой скрипта представляет собой довольно низкий риск ;)