ErikReider / SwayNotificationCenter

A simple GTK based notification daemon for SwayWM
GNU General Public License v3.0
1.4k stars 63 forks source link
gtk3 linux notification notification-center notification-server sway swaywm vala wayland wlroots

SwayNotificationCenter

Check PKGBUILD builds for Arch. Check build for Fedora. Check build for latest Ubuntu LTS. Linting

A simple notification daemon with a GTK gui for notifications and the control center

Note: SwayNotificationCenter only supports Desktops / Window Managers that support wlr_layer_shell_unstable_v1 like Sway or anything wlroots based

Note 2: SwayNotificationCenter does not support third-party GTK3 themes and is only tested with the default GTK Adwaita theme. Usage of any third-party theme might require extra tweaks to the default CSS style file

Demo

https://github.com/ErikReider/SwayNotificationCenter/assets/35975961/93ff072f-e653-4064-8200-1c90590b83ef

Screenshot of panel

Table of Contents

Want to show off your sick config?

Post your setup here: Config flex 💪

Features

Available Widgets

These widgets can be customized, added, removed and even reordered

Planned Features

Install

Alpine Linux

apk add swaync

Arch

sudo pacman -S swaync

Alternatively, swaync-git is available on the AUR.

Fedora

The package is available on COPR:

dnf copr enable erikreider/SwayNotificationCenter
dnf install SwayNotificationCenter

Fedora Silverblue (and other rpm-ostree variants)

The package can be layered over the base image after adding the Copr repo as an ostree repo:

sudo curl -sL -o /etc/yum.repos.d/_copr:copr.fedorainfracloud.org:erikreider:SwayNotificationCenter.repo https://copr.fedorainfracloud.org/coprs/erikreider/SwayNotificationCenter/repo/fedora-$(rpm -E %fedora)/erikreider-SwayNotificationCenter-fedora-$(rpm -E %fedora).repo 
rpm-ostree install SwayNotificationCenter

Gentoo

An unofficial ebuild is available in GURU

eselect repository enable guru
emaint sync --repo guru
emerge --ask gui-apps/swaync

OpenSUSE Tumbleweed

sudo zypper install SwayNotificationCenter

Ubuntu

Lunar and later:

sudo apt install sway-notification-center

Debian

Bookworm and later:

sudo apt install sway-notification-center

Guix

The simplest way is to install it to user's profile:

guix install swaynotificationcenter

But we recommend to use Guix Home to manage packages and their configurations declaratively.

rde

(use-modules (rde features wm))

;; Include the following code into the list of your rde features:
(feature-swaynotificationcenter)

Other

Dependencies

Optional Dependencies
meson setup build --prefix=/usr
ninja -C build
meson install -C build

Sway Usage

# Notification Daemon
exec swaync

# Toggle control center
bindsym $mod+Shift+n exec swaync-client -t -sw

Run

To start the daemon (remember to kill any other notification daemon before running)

./build/src/swaync

To toggle the panel

./build/src/swaync-client -t

To reload the config

./build/src/swaync-client -R

To reload css after changes

./build/src/swaync-client -rs

Control Center Shortcuts

Configuring

The main config file is located in /etc/xdg/swaync/config.json. Copy it over to your .config/swaync/ folder to customize without needing root access. See swaync(5) man page for more information

To reload the config, you'll need to run swaync-client --reload-config

The main CSS style file is located in /etc/xdg/swaync/style.css. Copy it over to your ~/.config/swaync/ folder to customize without needing root access. For more advanced/larger themes, I recommend that you use the SCSS files from source and customize them instead. To use the SCSS files, compile with sassc.

Tip: running swaync with GTK_DEBUG=interactive swaync will open a inspector window that'll allow you to see all of the CSS classes + other information.

Toggle Buttons

To add toggle buttons to your control center you can set the "type" in any acton to "toggle". The toggle button supports different commands depending on the state of the button and an "update-command" to update the state in case of changes from outside swaync. The update-command is called every time the control center is opened. The active toggle button also gains the css-class ".toggle:checked"

config.json example:

{
  "buttons-grid": { // also works with actions in menubar widget
    "actions": [
      {
        "label": "WiFi",
        "type": "toggle",
        "active": true,
        "command": "sh -c '[[ $SWAYNC_TOGGLE_STATE == true ]] && nmcli radio wifi on || nmcli radio wifi off'",
        "update-command": "sh -c '[[ $(nmcli radio wifi) == \"enabled\" ]] && echo true || echo false'"
      }
    ]
  }
}

Notification Inhibition

Notifications can be inhibited through the provided swaync-client executable or through the DBus interface org.erikreider.swaync.cc.

Here's an example of notification inhibition while screen sharing through xdg-desktop-portal-wlr

# xdg-desktop-portal-wlr config
[screencast]
exec_before=swaync-client --inhibitor-add "xdg-desktop-portal-wlr"
exec_after=swaync-client --inhibitor-remove "xdg-desktop-portal-wlr"

Scripting

Scripting rules and logic:

. Only one script can be fired per notification . Each script requires exec and at least one of the other properties . All listed properties must match the notification for the script to be ran . If any of the properties doesn't match, the script will be skipped . If a notification doesn't include one of the properties, that property will be skipped · If a script has run-on set to action, the script will only run when an action is taken on the notification

More information can be found in the swaync(5) man page

Notification information can be printed into a terminal by running G_MESSAGES_DEBUG=all swaync (when a notification appears).

Config properties:

{
  "scripts": {
    "example-script": {
      "exec": "Your shell command or script here...",
      "app-name": "Notification app-name Regex",
      "summary": "Notification summary Regex",
      "body": "Notification body Regex",
      "urgency": "Low or Normal or Critical",
      "category": "Notification category Regex"
    }
  }
  // other non scripting properties...
}

config.json example:

{
  "scripts": {
    // This script will only run when Spotify sends a notification containing
    // that exact summary and body
    "example-script": {
      "exec": "/path/to/myRickRollScript.sh",
      "app-name": "Spotify"
      "summary": "Never Gonna Give You Up",
      "body": "Rick Astley - Whenever You Need Somebody"
    }
  }
  // other non scripting properties...
}

Disable scripting

To completely disable scripting, the project needs to be built like so:

meson build -Dscripting=false
ninja -C build
meson install -C build

i3status-rs Example

Note Ths requires i3status-rs version 0.31.0+

i3status-rs config

[[block]]
block = "notify"
format = " $icon {($notification_count.eng(w:1)) |}"
driver = "swaync"
[[block.click]]
button = "left"
action = "show"
[[block.click]]
button = "right"
action = "toggle_paused"

Waybar Example

This example requires NotoSansMono Nerd Font to get the icons looking right

Waybar config

  "custom/notification": {
    "tooltip": false,
    "format": "{icon}",
    "format-icons": {
      "notification": "ï‚¢<span foreground='red'><sup>ï‘„</sup></span>",
      "none": "ï‚¢",
      "dnd-notification": "<span foreground='red'><sup></sup></span>",
      "dnd-none": "",
      "inhibited-notification": "ï‚¢<span foreground='red'><sup>ï‘„</sup></span>",
      "inhibited-none": "ï‚¢",
      "dnd-inhibited-notification": "<span foreground='red'><sup></sup></span>",
      "dnd-inhibited-none": ""
    },
    "return-type": "json",
    "exec-if": "which swaync-client",
    "exec": "swaync-client -swb",
    "on-click": "swaync-client -t -sw",
    "on-click-right": "swaync-client -d -sw",
    "escape": true
  },

Waybar css file

#custom-notification {
  font-family: "NotoSansMono Nerd Font";
}

Alternatively, the number of notifications can be shown by adding {} anywhere in the format field in the Waybar config

  "custom/notification": {
    "format": "{} {icon}",
    // ...
  },