Есть ли опция «не беспокоить», чтобы временно скрыть уведомления, как в MacBook?

13

Существует ли режим «Не беспокоить», как для устройства OSX, где вы можете решить, когда уведомление может беспокоить вас или нет ..

Я только что установил Chrome, и я обычно получаю спам от групповых текстов и других уведомлений, которые могут раздражать, когда я пытаюсь работать. На моем MacBook у меня есть возможность включить «Не беспокоить», который отключает все формы уведомлений .. Существует ли что-то подобное для Ubuntu?

Lamda
источник
Есть опция для Firefox, но я не пользователь Chrome, поэтому не могу сказать об этом
Сергей Колодяжный
Проблема не в хроме, а в уведомлениях вообще ...
Lamda
2
Разработали скрипт. Пока это на моем github: github.com/SergKolo/sergrep/blob/master/notify-block.sh Я обновлю свой ответ, как только у меня будет время сегодня. Также будет включен приятный ярлык, который можно закрепить на лаунчере
Сергей Колодяжный
1
Ответ отредактирован, пожалуйста, просмотрите. Дайте мне знать, если есть дополнительные функции, которые вы хотите, чтобы я добавил
Сергей Колодяжный

Ответы:

9

1. Основные обновления

Только что закончил полностью переписанную версию индикатора (0.9.0). Опции теперь включают в себя:

  • подавление только уведомлений, содержащих определенные строки
  • подавление звука
  • регистрация пропущенных уведомлений
  • работает при запуске
  • запоминание последнего состояния (подавление или нет) при следующем запуске

Кроме того, много, много улучшений интерфейса и поведения.

введите описание изображения здесь введите описание изображения здесь

Установка без изменений (ppa):

sudo apt-add-repository  ppa:vlijm/nonotifs
sudo apt-get update
sudo apt-get install nonotifs

2. Старый ответ

Индикатор отключения / отображения уведомлений

С помощью индикатора ниже вы можете временно отключить уведомления:

введите описание изображения здесь

или показывать уведомления:

введите описание изображения здесь

Как это устроено

Уловка - простая команда, использующая, dbus-monitorчтобы перехватить предстоящие уведомления и остановить их, прежде чем они появятся.
Индикатор является удобной «оберткой» для включения и выключения.

Как настроить


Как сейчас ( для Трасти, Вивид, Вилли, Ксениал ):

sudo apt-add-repository  ppa:vlijm/nonotifs
sudo apt-get update
sudo apt-get install nonotifs

Это установит глобально (включая пусковую установку). Установка через ppa предпочтительнее, поскольку она поддерживает последнюю версию и регулярно обновляется.
Индикатор появится в Dash как NoNotifications

Если вы установили ppa, но предварительно установили вручную снизу, rm ~/.local/share/applications/nonotif.desktopсначала запустите, чтобы удалить локальный .desktopфайл.


Или вручную:

Решение состоит из нескольких элементов, которые вам просто необходимо хранить вместе в одном и том же каталоге.

  1. Создайте каталог или папку (может быть где угодно в вашем домашнем каталоге, например)
  2. Индикатор: скопируйте приведенный ниже скрипт в пустой файл, сохраните его как nonotif_indicator.py:

    #!/usr/bin/env python3
    import os
    import signal
    import gi
    import subprocess
    gi.require_version('Gtk', '3.0')
    gi.require_version('AppIndicator3', '0.1')
    from gi.repository import Gtk, AppIndicator3
    
    currpath = os.path.dirname(os.path.realpath(__file__))
    proc = "nonotifs.sh"
    
    def run(path):
        try: 
            pid = subprocess.check_output(["pgrep", "-f", proc]).decode("utf-8").strip()
        except subprocess.CalledProcessError:
            subprocess.Popen(path+"/"+proc)
    
    def show():
        try:
            pid = subprocess.check_output(["pgrep", "-f", proc]).decode("utf-8").strip()
            subprocess.Popen(["pkill", "-P", pid])
        except subprocess.CalledProcessError:
            pass
    
    class Indicator():
        def __init__(self):
            self.app = 'nonotif'
            iconpath = currpath+"/grey.png"
            self.testindicator = AppIndicator3.Indicator.new(
                self.app, iconpath,
                AppIndicator3.IndicatorCategory.OTHER)
            self.testindicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
            self.testindicator.set_menu(self.create_menu())
    
        def create_menu(self):
            menu = Gtk.Menu()
            item_quit = Gtk.MenuItem('Quit')
            item_quit.connect('activate', self.stop)
            item_silent = Gtk.MenuItem("Don't disturb")
            item_silent.connect('activate', self.silent)
            item_show = Gtk.MenuItem("Show notifications")
            item_show.connect('activate', self.show)
            menu.append(item_quit)
            menu.append(item_silent)
            menu.append(item_show)
            menu.show_all()
            return menu
    
        def stop(self, source):
            Gtk.main_quit()
    
        def silent(self, source):
            self.testindicator.set_icon(currpath+"/red.png")
            run(currpath)
    
        def show(self, source):
            self.testindicator.set_icon(currpath+"/green.png")
            show()
    
    Indicator()
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    Gtk.main()
  3. dbus-monitorСценарий; сохраните его (точно) nonotifs.sh в том же каталоге, что и первый скрипт:

    #!/bin/bash
    dbus-monitor "interface='org.freedesktop.Notifications'" | xargs -I '{}' pkill notify-osd

    Сделайте этот скрипт исполняемым

  4. Три иконы; щелкните правой кнопкой мыши по каждому из них и сохраните их вместе с двумя сценариями как (точно):

    введите описание изображения здесь <- green.png

    введите описание изображения здесь <- red.png

    введите описание изображения здесь<- grey.png

  5. Вот и все. Теперь протестируйте индикатор с помощью команды:

    python3 /path/to/nonotif_indicator.py

    и включить уведомления на / из

гранатомет

Если вам нужен лаунчер с индикатором:

введите описание изображения здесь

  • Скопируйте значок ниже, сохраните его как nonotificon.png:

    введите описание изображения здесь

  • Скопируйте приведенный ниже код в пустой файл:

    [Desktop Entry]
    Type=Application
    Name=No Notifications
    Exec=python3 /path/to/nonotif_indicator.py
    Icon=/path/to/nonotificon.png
    Type=Application
  • Отредактируйте строки:

    Exec=python3 /path/to/nonotif_indicator.py

    и

    Icon=/path/to/nonotificon.png

    в соответствии с фактическими путями, и сохраните файл как nonotif.desktopв~/.local/share/applications

Добавьте индикатор в Startup Applications

Вы можете добавить индикатор в Startup Applications: Dash> Startup Applications> Add. Добавьте команду:

/bin/bash -c "sleep 15 && python3 /path/to/nonotif_indicator.py"
Якоб Влейм
источник
Ты удивительный! :-)
Fabby
Он @ Fabby так рад видеть тебя!
Джейкоб Влейм
Еще один замечательный сценарий, Джейкоб! Идея: может ли скрипт также блокировать звуковые уведомления, которые сопровождают уведомления-osd?
Орширо
@orschiro спасибо! Это тоже уведомления-osd? Не уверен, на какие уведомления вы ссылаетесь.
Джейкоб Влейм
1
@RobertOrzanna, это одна из вещей, которая изменилась в версии 1.0 :)
Джейкоб Влейм
11

Вступление

Скрипт ниже позволяет отключить любые уведомления, появляющиеся на экране. Существует два основных варианта -mотключения звука и -uвключения звука . Оба собраны в .desktopфайл для запуска.

Когда -mиспользуется, notify-osd отправит окончательное уведомление перед блокировкой. Если запущен другой экземпляр скрипта, он покажет графическое всплывающее окно, которое сообщит пользователю, что скрипт уже выполняет свою работу.

При вызове с -uпараметром скрипт прекратит блокировать уведомления и подтвердит это, показав одно. Если предыдущий экземпляр скрипта не запущен, пользователь будет уведомлен о том, что сейчас ничего не заблокировано.

Источник скрипта

Исходный код скрипта доступен здесь. Для более актуальной версии вы всегда можете найти ее на моем github . Вы можете установить git sudo apt-get install gitи клонировать весь репозиторий с помощью git clone https://github.com/SergKolo/sergrep.gitили использовать

wget https://raw.githubusercontent.com/SergKolo/sergrep/master/notify-block.sh  && chmod +x notify-block.sh

чтобы получить только сам скрипт.

#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: 1047481448@qq.com 
# Date: May 10th 2016
# Purpose: Notification blocker for Ubuntu
# Written for: 
# Tested on:  Ubuntu 14.04 LTS
###########################################################
# Copyright: Serg Kolo ,2016 
#    
#     Permission to use, copy, modify, and distribute this software is hereby granted
#     without fee, provided that  the copyright notice above and this permission statement
#     appear in all copies.
#
#     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
#     THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#     DEALINGS IN THE SOFTWARE.

ARGV0="$0"
ARGC=$#

mute_notifications()
{ 

  self=${ARGV0##*/}
  CHECK_PID_NUMS=$(pgrep -f  "$self -m" | wc -l )
  if [ "$CHECK_PID_NUMS" -gt 2 ]; then
     zenity --info --text "Notifications already disabled"
     exit 0
  else  
     killall notify-osd 2> /dev/null # ensure we have PID
     notify-send 'All notifications will be muted after this one' 
     sleep 1
     while true 
     do 
        PID=$(pgrep notify-osd)
        [  "x$PID" != "x" ]  && 
        kill -TERM $PID 
        sleep 0.25
     done
  fi
}

unmute()
{
  echo $0
  self=${0##*/}

  MUTE_PID=$(pgrep -f  "$self -m" ) #match self with -m option
  if [ "x$MUTE_PID" != "x"   ];then
     kill -TERM "$MUTE_PID" &&
     sleep 1 && # ensure the previous process exits
     notify-send "UNMUTED"
     exit 0
  else 
     notify-send "NOTIFICATIONS ALREADY UNMUTED"
     exit 0
  fi  
}

print_usage()
{
  cat > /dev/stderr <<EOF
  usage: notify-block.sh [-m|-u]
EOF
exit 1
}
main()
{
  [ $# -eq 0  ] && print_usage

  while getopts "mu" options
  do

     case ${options} in
          m) mute_notifications & ;;
          u) unmute ;;
          \?) print_usage ;;
     esac

  done
}
main "$@"

Шаблон ярлыка .desktop

Это всего лишь пример того, что я лично использую. Замените каждую Exec=строку соответствующим путем к сценарию в вашей среде. Конечно, вам Icon=также придется измениться. Желательно хранить этот файл в своей ~/.local/share/applicationsпапке

[Desktop Entry]
Name=Notification Blocker
Comment=blocks any on-screen notifications
Terminal=false
Actions=Mute;Unmute
Type=Application
Exec=/home/xieerqi/sergrep/notify-block.sh -m
Icon=/home/xieerqi/Desktop/no-notif2.png

[Desktop Action Mute]
Name=Mute Notifications
Exec=/home/xieerqi/sergrep/notify-block.sh -m
Terminal=false

[Desktop Action Unmute]
Name=Unmute Notifications
Exec=/home/xieerqi/sergrep/notify-block.sh -u
Terminal=false

Скриншоты

image1

Файл ярлыка заблокирован для запуска

введите описание изображения здесь

Окончательное уведомление перед отключением звука

Сергей Колодяжный
источник
Кажется, у меня есть проблемы с включением звука? .. Я должен каждый раз вручную убивать процесс или?
Ламда
Нет, опция включения звука делает именно это, убивает предыдущий экземпляр процесса. В чем конкретно заключается проблема?
Сергей Колодяжный
Нет сообщений, происходят. Я могу отключить звук, но не
включить звук,
@ Ламда ОК, внутри unmuteфункции, не могли бы вы добавить set -xпосле echo $0строки и запустить программу в терминале? Это будет отображать определенный вывод. Скопируйте и вставьте это в paste.ubuntu.com и предоставьте ссылку на эту вставку в комментариях здесь. Спасибо
Сергей Колодяжный