Скрипт для отключения приложения

Пользователи Nvidia, просто отключите «Xinerama», перезапустите lightdm, а затем внесите изменения в Display и Enable Xinerama.

Шаги:

изменить /etc/X11/xorg.conf изменить Значение Xinerama от 1 до 0 service lightdm restart Системные настройки -> Дисплей -> Размещение пусковой установки -> выбрать редактирование монитора /etc/X11/xorg.conf изменить значение Xinerama от 0 до 1 перезапуск службы Lightdm

Вы можете также отключите липкий край.

1
задан 27 August 2012 в 15:46

5 ответов

спасибо за решение! Мне удалось использовать сценарии, приведенные здесь, чтобы исправить мою проблему. Поскольку мне пришлось немного модифицировать их, здесь я присоединяюсь к улучшенной версии.

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

Итак, вот версия, в которой аргументом является имя приложения, зарегистрированное в PulseAudio. Вы можете найти это имя, запустив команду pacmd list-sink-inputs и найдите поле application.name.

Альтернативным решением было бы отключить / отключить все PID, которые имеют одинаковое имя приложения.

[ f1]
6
ответ дан 25 May 2018 в 07:09

Даже если вопрос требует сценария, я хотел оставить это здесь.

Я написал приложение 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 порядка.

5
ответ дан 25 May 2018 в 07:09

Прежде всего, «более правильный» способ найти 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 и отключением / отключением только одного из них.

4
ответ дан 25 May 2018 в 07:09

Я действительно не могу писать сценарий, но я модифицировал сценарий 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
1
ответ дан 25 May 2018 в 07:09

Отредактированный скрипт для отключения всех входов приложения (нескольких процессов) и по умолчанию для переключения:

#!/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 "$@"
0
ответ дан 25 May 2018 в 07:09

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

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