Пользователи Nvidia, просто отключите «Xinerama», перезапустите lightdm, а затем внесите изменения в Display и Enable Xinerama.
Шаги:
изменить /etc/X11/xorg.conf изменить Значение Xinerama от 1 до 0 service lightdm restart Системные настройки -> Дисплей -> Размещение пусковой установки -> выбрать редактирование монитора /etc/X11/xorg.conf изменить значение Xinerama от 0 до 1 перезапуск службы LightdmВы можете также отключите липкий край.
спасибо за решение! Мне удалось использовать сценарии, приведенные здесь, чтобы исправить мою проблему. Поскольку мне пришлось немного модифицировать их, здесь я присоединяюсь к улучшенной версии.
Причина, по которой исходные скрипты не работали для меня, состоит в том, что некоторые приложения могут иметь несколько экземпляров, то есть несколько PID, но, возможно, только один из них производит звук, и, таким образом, фактически подключен к Pulseaudio. Поскольку скрипт использовал только первый найденный PID, он обычно / не должен / отключал нужное приложение.
Итак, вот версия, в которой аргументом является имя приложения, зарегистрированное в PulseAudio. Вы можете найти это имя, запустив команду pacmd list-sink-inputs и найдите поле application.name.
Альтернативным решением было бы отключить / отключить все PID, которые имеют одинаковое имя приложения.
[ f1]Даже если вопрос требует сценария, я хотел оставить это здесь.
Я написал приложение C, которое делает это на Ubuntu. Еще лучше, он сидит на лотке индикатора (используя libappindicator) и проверяет, что Spotify играет, с короткими интервалами. Если он воспроизводит объявление (проверяет черный список), он отключает Spotify. Если воспроизводится новое объявление, вы просто нажимаете «Отключить звук» в меню индикатора и добавляет его в черный список.
Что он делает, ищет окно X, для которого XFetchName возвращает Spotify - Linux Preview. Затем он вызывает XGetWindowProperty, чтобы запросить свойство _NET_WM_ICON_NAME этого окна, которое возвращает строку в формате "Spotify – <Artist> – <Song>". При воспроизведении объявлений он возвращает что-то вроде этого:
"Spotify – Spotify – Premium Free Trial Cancel Any Time"
Он поддерживает тройное дерево поиска в списке объявлений, чтобы эффективно проверить, находится ли текущий заголовок в списке.
[d5 ] Он также использует асинхронный API PulseAudio для запроса sink-inputs и set-mute:pa_context_get_sink_input_info_list()
pa_context_set_sink_input_mute()
. Поскольку это простой код C, он имеет малый вес. Проверьте исходный код и пакет Ubuntu .deb на: PulseAudio Asynchronous API . Вероятно, это будет бить сценарий оболочки на 2-3 порядка.
Прежде всего, «более правильный» способ найти PID приложения, например spotify, заключается в использовании:
pidof spotify
Я создал скрипт, который выполняет эту работу, t знать, если это лучший способ сделать это, но он отлично работает:
#!/bin/bash
# Script to mute an application using PulseAudio, depending solely on
# process name, constructed as answer on askubuntu.com:
# http://askubuntu.com/questions/180612/script-to-mute-an-application
#It works as: mute_application.sh vlc mute OR mute_application.sh vlc unmute
if [ -z "$1" ]; then
echo "Please provide me with an application name"
exit 1
fi
if [ -z "$2" ]; then
echo "Please provide me with an action mute/unmute after the application name"
exit 1
fi
if ! [[ "$2" == "mute" || "$2" == "unmute" ]]; then
echo "The 2nd argument must be mute/unmute"
exit 1
fi
process_id=$(pidof "$1")
if [ $? -ne 0 ]; then
echo "There is no such process as "$1""
exit 1
fi
temp=$(mktemp)
pacmd list-sink-inputs > $temp
inputs_found=0;
current_index=-1;
while read line; do
if [ $inputs_found -eq 0 ]; then
inputs=$(echo -ne "$line" | awk '{print $2}')
if [[ "$inputs" == "to" ]]; then
continue
fi
inputs_found=1
else
if [[ "${line:0:6}" == "index:" ]]; then
current_index="${line:7}"
elif [[ "${line:0:25}" == "application.process.id = " ]]; then
if [[ "${line:25}" == "\"$process_id\"" ]]; then
#index found...
break;
fi
fi
fi
done < $temp
rm -f $temp
if [ $current_index -eq -1 ]; then
echo "Could not find "$1" in the processes that output sound."
exit 1
fi
#muting...
if [[ "$2" == "mute" ]]; then
pacmd set-sink-input-mute "$current_index" 1 > /dev/null 2>&1
else
pacmd set-sink-input-mute "$current_index" 0 > /dev/null 2>&1
fi
exit 0
Вы можете работать с:
./mute_application.sh spotify mute
или
[ f4]Протестировано с использованием Audacious и Vlc и отключением / отключением только одного из них.
Я действительно не могу писать сценарий, но я модифицировал сценарий hakermania для создания другого.
Этот будет увеличивать или уменьшать объем конкретного приложения с шагом 5%:
edit: на самом деле, он работает в постоянно меняющемся последнем открывшемся приложении. Идеи?
#!/bin/bash
# Script to increase or decrease an individual application's volume using PulseAudio, depending solely on
# process name, based on another script by hakermania, constructed as answer on askubuntu.com:
# http://askubuntu.com/questions/180612/script-to-mute-an-application
# It works as: change_app_volume.sh vlc increase OR change_app_volume.sh vlc decrease
# Set desired increments in lines #66 and #68
if [ -z "$1" ]; then
echo "Please provide me with an application name"
exit 1
fi
if [ -z "$2" ]; then
echo "Please provide me with an action increase/decrease after the application name"
exit 1
fi
if ! [[ "$2" == "increase" || "$2" == "decrease" ]]; then
echo "The 2nd argument must be increase/decrease"
exit 1
fi
process_id=$(pidof "$1")
if [ $? -ne 0 ]; then
echo "There is no such process as "$1""
exit 1
fi
temp=$(mktemp)
pacmd list-sink-inputs > $temp
inputs_found=0;
current_index=-1;
while read line; do
if [ $inputs_found -eq 0 ]; then
inputs=$(echo -ne "$line" | awk '{print $2}')
if [[ "$inputs" == "to" ]]; then
continue
fi
inputs_found=1
else
if [[ "${line:0:6}" == "index:" ]]; then
current_index="${line:7}"
elif [[ "${line:0:25}" == "application.process.id = " ]]; then
if [[ "${line:25}" == "\"$process_id\"" ]]; then
#index found...
break;
fi
fi
fi
done < $temp
rm -f $temp
if [ $current_index -eq -1 ]; then
echo "Could not find "$1" in the processes that output sound."
exit 1
fi
#increase/decrease...
if [[ "$2" == "increase" ]]; then
pactl set-sink-input-volume "$current_index" +5% > /dev/null 2>&1
else
pactl set-sink-input-volume "$current_index" -5% > /dev/null 2>&1
fi
exit 0
Отредактированный скрипт для отключения всех входов приложения (нескольких процессов) и по умолчанию для переключения:
#!/bin/bash
main() {
local action=toggle
while getopts :hu option; do
case "$option" in
h) usage 0 ;;
m) action=mute ;;
u) action=unmute ;;
?) usage 1 "invalid option: -$OPTARG" ;;
esac
done
shift $((OPTIND - 1))
if [[ "$1" ]]; then
$action "$1"
else
usage 1 "specify an application name"
fi
}
usage() {
[[ "$2" ]] && echo "error: $2"
echo "usage: $0 [-h] [-u] appname"
echo "where: -u = ummute , -m = mute (default action is to toggle)"
exit $1
}
mute() { adjust_muteness "$1" 1; }
unmute() { adjust_muteness "$1" 0; }
toggle() { adjust_muteness "$1" toggle; }
adjust_muteness() {
clients=$(pactl list clients short | awk '/[0-9]+.*'$1'.*/{print $1}')
inputs=$(pactl list sink-inputs short)
for c in $clients; do
for i in $(printf '%s' "$inputs" | awk '/[0-9]+\s[0-9]+\s'$c'/{print $1}'); do
pactl set-sink-input-mute $i $2 &
done
done
}
main "$@"