Gibt es die Option "Nicht stören", um Benachrichtigungen vorübergehend auszublenden, wie dies bei Macbooks der Fall ist?

13

Gibt es einen "Nicht stören-Modus" wie bei einem OSX-Gerät, bei dem Sie entscheiden können, wann die Benachrichtigung Sie stören soll oder nicht?

Ich habe gerade Chrome installiert und werde normalerweise von Gruppentexten und anderen Benachrichtigungen überflutet. Dies kann beim Versuch, zu arbeiten, ärgerlich sein. Auf meinem MacBook habe ich die Option, "Nicht stören" zu aktivieren, wodurch jede Art von Benachrichtigung stummgeschaltet wird. Gibt es so etwas für Ubuntu?

Lamda
quelle
Es gibt eine Option für Firefox, aber ich bin kein Chrome-Nutzer, also kann ich das nicht
beurteilen
Das Problem ist nicht spezifisch für Chrome, sondern für Benachrichtigungen im Allgemeinen.
Lamda
2
Habe ein Drehbuch entwickelt. Bisher ist es auf meinem Github: github.com/SergKolo/sergrep/blob/master/notify-block.sh Ich werde meine Antwort aktualisieren, sobald ich heute Zeit habe.
Enthält
1
Antwort bearbeitet, bitte überprüfen. Lassen Sie mich wissen, wenn es zusätzliche Funktionen gibt, die ich hinzufügen soll
Sergiy Kolodyazhnyy

Antworten:

9

1. Großes Update

Ich habe gerade eine komplett überarbeitete Version des Indikators (0.9.0) fertiggestellt. Zu den Optionen gehören jetzt:

  • Nur Benachrichtigungen unterdrücken, die bestimmte Zeichenfolgen enthalten
  • Unterdrückung (Stummschaltung) des Tons
  • Protokollierung verpasster Benachrichtigungen
  • läuft beim Start
  • Erinnern des letzten Zustands (unterdrücken oder nicht) beim nächsten Durchlauf

Darüber hinaus wurden viele Verbesserungen an der Benutzeroberfläche und am Verhalten vorgenommen.

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Die Installation ist unverändert (ppa):

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

2. Alte (r) Antwort

Anzeige zum Stummschalten / Anzeigen von Benachrichtigungen

Mit dem Indikator unten können Sie festlegen, dass Benachrichtigungen vorübergehend deaktiviert werden sollen:

Bildbeschreibung hier eingeben

oder Benachrichtigungen anzeigen:

Bildbeschreibung hier eingeben

Wie es funktioniert

Der Trick ist ein einfacher Befehl, mit dbus-monitordem anstehende Benachrichtigungen abgefangen und angehalten werden, bevor sie angezeigt werden.
Der Indikator ist ein benutzerfreundlicher "Wrapper" zum Ein- und Ausschalten.

Wie stellt man das ein


Ab sofort ( für Trusty, Vivid, Wily, Xenial ):

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

Dies wird global installiert (einschließlich des Launchers). Die Installation über ppa wird bevorzugt, da die neueste Version beibehalten und regelmäßig aktualisiert wird.
Der Indikator wird in Dash als NoNotifications angezeigt

Wenn Sie von ppa installieren, aber zuvor manuell von unten installiert haben, führen Sie rm ~/.local/share/applications/nonotif.desktopzunächst die Installation aus, um die lokale .desktopDatei zu entfernen .


Oder manuell:

Die Lösung besteht aus einer Reihe von Elementen, die Sie einfach in ein und demselben Verzeichnis speichern müssen.

  1. Erstellen Sie ein Verzeichnis oder einen Ordner (kann sich an einer beliebigen Stelle in Ihrem Home-Verzeichnis befinden, z. B.)
  2. Der Indikator: Kopieren Sie das Skript unten in eine leere Datei, speichern Sie es als 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. Das dbus-monitorDrehbuch; Speichern Sie es (genau) nonotifs.sh in ein und demselben Verzeichnis wie das erste Skript:

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

    Machen Sie dieses Skript ausführbar

  4. Drei Ikonen; Klicken Sie mit der rechten Maustaste darauf und speichern Sie sie zusammen mit den beiden Skripten als (genau):

    Bildbeschreibung hier eingeben <- green.png

    Bildbeschreibung hier eingeben <- red.png

    Bildbeschreibung hier eingeben<- grey.png

  5. Das ist es. Testen Sie nun den Indikator mit dem Befehl:

    python3 /path/to/nonotif_indicator.py

    und schalte Benachrichtigungen ein / aus

Startprogramm

Falls Sie einen Launcher mit dem Indikator möchten:

Bildbeschreibung hier eingeben

  • Kopieren Sie das Symbol unten und speichern Sie es unter nonotificon.png:

    Bildbeschreibung hier eingeben

  • Kopieren Sie den folgenden Code in eine leere Datei:

    [Desktop Entry]
    Type=Application
    Name=No Notifications
    Exec=python3 /path/to/nonotif_indicator.py
    Icon=/path/to/nonotificon.png
    Type=Application
  • Bearbeiten Sie die Zeilen:

    Exec=python3 /path/to/nonotif_indicator.py

    und

    Icon=/path/to/nonotificon.png

    entsprechend den tatsächlichen Pfaden, und speichern Sie die Datei wie nonotif.desktopin~/.local/share/applications

Fügen Sie den Indikator zu Startup Applications hinzu

Sie können den Indikator zu Startup Applications hinzufügen: Dash> Startup Applications> Add. Fügen Sie den Befehl hinzu:

/bin/bash -c "sleep 15 && python3 /path/to/nonotif_indicator.py"
Jacob Vlijm
quelle
Du bist wunderbar! :-)
Fabby
Er @ Fabby so toll, dich zu sehen!
Jacob Vlijm
Noch ein großartiges Drehbuch, Jacob! Idee: Kann das Skript auch Audio-Benachrichtigungen blockieren, die mit denen von notify-osd übereinstimmen?
Orschiro
@orschiro danke! Sind das auch notify-osd-Benachrichtigungen? Nicht sicher, auf welche Benachrichtigungen Sie sich beziehen.
Jacob Vlijm
1
@RobertOrzanna das ist eines der Dinge, die in Version 1.0 geändert wird :)
Jacob Vlijm
11

Einführung

Das unten stehende Skript ermöglicht die Stummschaltung von Benachrichtigungen auf dem Bildschirm. Es gibt zwei grundlegende Optionen -mzum Stummschalten und -uzum Aufheben der Stummschaltung. Beide werden zu einer .desktopDatei zusammengefügt, um als Startprogramm zu dienen.

Wenn -mverwendet, sendet der notify-osd eine endgültige Benachrichtigung, bevor er blockiert wird. Wenn eine andere Instanz des Skripts ausgeführt wird, wird ein grafisches Popup angezeigt, das einen Benutzer darüber informiert, dass das Skript seine Arbeit bereits ausführt.

Bei Aufruf mit -u das Skript Option wird, blockiert es keine Benachrichtigungen mehr und bestätigt dies, indem es eine anzeigt. Wenn keine vorherige Skriptinstanz ausgeführt wird, wird der Benutzer darüber informiert, dass derzeit nichts blockiert ist.

Skriptquelle

Die Skriptquelle finden Sie hier. Für eine aktuellere Version findest du sie immer auf meinem Github . Sie können git mit installieren sudo apt-get install gitund das gesamte Repository mit klonen git clone https://github.com/SergKolo/sergrep.gitoder verwenden

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

um nur das Skript selbst zu bekommen.

#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: [email protected] 
# 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-Verknüpfungsvorlage

Dies ist nur ein Beispiel für das, was ich persönlich benutze. Ersetzen Sie jede Exec=Zeile durch den entsprechenden Pfad zum Skript in Ihrer Umgebung. Natürlich muss auch dein Icon=Wille geändert werden. Bewahren Sie diese Datei vorzugsweise in Ihrem ~/.local/share/applicationsOrdner auf

[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

Screenshots

image1

Die Verknüpfungsdatei ist für den Launcher gesperrt

Bildbeschreibung hier eingeben

Letzte Benachrichtigung vor Stummschaltung

Sergiy Kolodyazhnyy
quelle
Ich habe anscheinend Probleme, die Stummschaltung aufzuheben. Sollte ich den Vorgang jedes Mal manuell beenden, oder?
Lamda
Nein, die Option zum Aufheben der Stummschaltung bewirkt genau das und beendet die vorherige Prozessinstanz. Was genau ist das Problem, das passiert?
Sergiy Kolodyazhnyy
Keine Nachricht, tritt auf. Ich kann die Stummschaltung aufheben, aber nicht aufheben, indem ich auf die Taste zum Aufheben der Stummschaltung drücke.
Lamda,
@Lamda OK, innerhalb der unmuteFunktion, kannst du bitte set -xnach der echo $0Zeile hinzufügen und das Programm im Terminal ausführen? Es wird eine bestimmte Ausgabe angezeigt. Kopieren Sie diese und fügen Sie sie in paste.ubuntu.com ein. Geben Sie in den Kommentaren hier den Link zu dieser Einfügung ein. Danke
Sergiy Kolodyazhnyy