wmctrl переключатель Ubuntu 17.10, выше не переключения вниз

После попытки ответов в этом вопросе: Как запустить приложение с "Поверх остальных окон" набора?, особенно тот в комментариях @MichaelTunnell:

Это - наилучший вариант для меня, потому что я могу создать сценарий удара или сочетание клавиш (который я сделал), использующий эту команду и тот способ, которым я могу использовать его, когда мне нужен он, но не, когда я не делаю. Я действительно вносил изменение хотя... Я хотел, чтобы ярлык повернулся поверх остальных окон для активного окна и только когда мне было нужно, таким образом, вот моя команда. wmctrl -r :ACTIVE: -b toggle,above

Я смог переключиться поверх остальных окон в Ubuntu 16.10 или ниже, но не на Ubuntu 17.10, которая является той, которую я установил прямо сейчас и хотел бы иметь этот тот же ярлык

Я также попробовал это сообщение, которое является в основном более подробным сообщением комментария Michael Tunnell: Горячая клавиша для поверх остальных окон Ubuntu

Ярлык виден в изображении ниже, и это работает на установку окна Поверх остальных окон к Правда, но даже если я использую ту же команду снова для "выключения его", я не могу заставить активное приложение удалять то свойство.

enter image description here

Действительно ли это - ошибка в GNOME Ubuntu 17.10? Или я пропускаю какую-либо дополнительную конфигурацию в этой конкретной версии?

4
задан 21 February 2018 в 03:07

3 ответа

wmctrl не полностью совместимо с Уэйлендом, который является сессией по умолчанию на Ubuntu 17.10.

Как обходное решение Вы переключаете назад на сессию Xorg после этого Вопросы и ответы: Как Вы переключаетесь из Уэйленда назад к Xorg в Ubuntu 17.10?

2
ответ дан 1 December 2019 в 10:15

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

Примечание: потому что Вам нужны кавычки вокруг команды, которую Вы отправляете в удар, я должен был быть осторожным при записи команды, что я никогда не шел больше, чем еще один уровень глубоко (использующий двойные кавычки). Дальнейшее вложение строк в кавычках потребовало бы, чтобы много запутывающих обратных косых черт вышло из кавычек.

0
ответ дан 1 December 2019 в 10:15

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

0
ответ дан 25 November 2020 в 16:08

Другие вопросы по тегам:

Похожие вопросы: