swaync(5) # NAME swaync - Configuration file # CONFIGURATION Using a text editor with a JSON language server is recommended when editing the config file to be able to detect config errors *positionX* ++ type: string ++ default: right ++ values: left, right, center ++ description: Horizontal position of control center and notification window *positionY* ++ type: string ++ default: top ++ values: top, center, bottom ++ description: Vertical position of control center and notification window *layer* ++ type: string ++ default: overlay ++ values: background, bottom, top, overlay ++ description: Layer of notification window relative to normal windows. ++ background is below all windows, overlay is above all windows. *layer-shell* ++ type: bool ++ default: true ++ description: Wether or not the windows should be opened as layer-shell ++ surfaces. Note: Requires swaync restart to apply *cssPriority* ++ type: string ++ default: application ++ values: application, user ++ description: Which GTK priority to use when loading the default and user ++ CSS files. Pick "user" to override *XDG_CONFIG_HOME/gtk-3.0/gtk.css* *control-center-margin-top* ++ type: integer ++ default: 0 ++ description: The margin (in pixels) at the top of the notification center. 0 to disable *control-center-margin-bottom* ++ type: integer ++ default: 0 ++ description: The margin (in pixels) at the bottom of the notification center. 0 to disable *control-center-margin-right* ++ type: integer ++ default: 0 ++ description: The margin (in pixels) at the right of the notification center. 0 to disable *control-center-margin-left* ++ type: integer ++ default: 0 ++ description: The margin (in pixels) at the left of the notification center. 0 to disable *control-center-layer* ++ type: string ++ default: top ++ values: background, bottom, top, overlay ++ description: Layer of control center window relative to normal windows. ++ background is below all windows, overlay is above all windows. *notification-2fa-action* ++ type: bool ++ default: true ++ description: If each notification should display a 'COPY \"1234\"' action *timeout* ++ type: integer ++ default: 10 ++ description: The notification timeout for notifications with normal priority *timeout-low* ++ type: integer ++ default: 5 ++ description: The notification timeout for notifications with low priority *timeout-critical* ++ type: integer ++ default: 0 ++ description: The notification timeout for notifications with critical priority. 0 to disable *notification-window-width* ++ type: integer ++ default: 500 ++ description: Width of the notification in pixels *keyboard-shortcuts* ++ type: bool ++ default: true ++ description: If control center should use keyboard shortcuts *image-visibility* ++ type: string ++ default: always ++ values: always, when-available, never ++ description: An explanation about the purpose of this instance. *transition-time* ++ type: integer ++ default: 200 ++ description: The notification animation duration. 0 to disable *hide-on-clear* ++ type: bool ++ default: false ++ description: Hides the control center after pressing "Clear All" *hide-on-action* ++ type: bool ++ default: true ++ description: Hides the control center when clicking on notification action *fit-to-screen* ++ type: bool ++ default: true ++ description: Whether the control center should expand vertically to fill the screen *relative-timestamps* ++ type: bool ++ default: true ++ description: Display notification timestamps relative to now e.g. \"26 minutes ago\". ++ If false, a local iso8601-formatted absolute timestamp is displayed. *control-center-height* ++ type: integer ++ default: 500 ++ description: The control center height in pixels ++ This setting is ignored when _fit-to-screen_ is set to "true". *control-center-width* ++ type: integer ++ default: 500 ++ description: The control center width in pixels *notification-visibility* ++ type: object ++ visibility object properties: ++ *state*++ type: string ++ optional: false ++ default: enabled ++ values: ignored, muted, transient, enabled ++ description: The notification visibility state. ++ *override-urgency*++ type: string ++ optional: true ++ default: unset ++ values: unset, low, normal, critical ++ description: The new urgency for the notification if set.++ *app-name*++ type: string ++ optional: true ++ description: The app-name. Uses Regex.++ *desktop-entry*++ type: string ++ optional: true ++ description: The desktop-entry. Uses Regex.++ *summary*++ type: string ++ optional: true ++ description: The summary of the notification. Uses Regex.++ *body*++ type: string ++ optional: true ++ description: The body of the notification. Uses Regex.++ *urgency*++ type: string ++ optional: true ++ default: Normal ++ values: Low, Normal, Critical ++ description: The urgency of the notification.++ *category*++ type: string ++ optional: true ++ description: Which category the notification belongs to. Uses Regex.++ description: Set the visibility or override urgency of each incoming ++ notification. ++ If the notification doesn't include one of the properties, that ++ property will be ignored. All properties (except for state) use ++ regex. If all properties match the given notification, the ++ notification will be follow the provided state. ++ Only the first matching object will be used. ++ example: ``` { "notification-visibility": { "example-name": { "state": "The notification state", "app-name": "Notification app-name Regex", "summary": "Notification summary Regex", "body": "Notification body Regex", "urgency": "Low or Normal or Critical", "category": "Notification category Regex" } } } ``` *widgets* ++ type: array ++ Default values: ["title", "dnd", "notifications"] ++ Valid array values (see *widget-config* for more information): ++ *notifications*++ required: true ++ optional: false ++ *title*++ optional: true ++ *dnd*++ optional: true ++ *label*++ optional: true ++ *mpris*++ optional: true ++ *menubar*++ optional: true ++ *buttons-grid*++ optional: true ++ #START pulse-audio *volume*++ optional: true ++ #END pulse-audio *backlight*++ optional: true ++ *inhibitors*++ optional: true ++ description: ++ Which order and which widgets to display. ++ If the \"notifications\" widget isn't specified, it ++ will be placed at the bottom. ++ multiple of same widget: ++ Append a # with any value to the end of the widget name. ++ Example: "title#TheMainTitle" ++ To address this widget specifically in the css file use the css class .TheMainTitle ++ example: ``` { "widgets": [ "inhibitors", "title", "dnd", "notifications" ] } ``` *widget-config* ++ type: object ++ description: Configure specific widget properties. ++ multiple of same widget: ++ Append a # with any value to the end of the widget name. ++ Example: "title#TheMainTitle" ++ To address this widget specifically in the css file use the css class .TheMainTitle ++ Widgets to customize: ++ *title*++ type: object ++ css class: widget-title ++ properties: ++ text: ++ type: string ++ optional: true ++ default: "Notifications" ++ description: The title of the widget ++ clear-all-button: ++ type: bool ++ optional: true ++ default: true ++ description: Whether to display a "Clear All" button ++ button-text: ++ type: string ++ optional: true ++ default: "Clear All" ++ description: "Clear All" button text ++ description: The notification visibility state. ++ *dnd*++ type: object ++ css class: widget-dnd ++ properties: ++ text: ++ type: string ++ optional: true ++ default: "Do Not Disturb" ++ description: The title of the widget ++ description: Control Center Do Not Disturb Widget. ++ *label*++ type: object ++ css class: widget-label ++ properties: ++ text: ++ type: string ++ optional: true ++ default: "Label Text" ++ description: The text content of the widget ++ clear-all-button: ++ type: integer ++ optional: true ++ default: 5 ++ description: The maximum lines ++ description: A generic widget that allows the user to add custom text. ++ *mpris*++ type: object ++ css classes: ++ widget-mpris ++ widget-mpris-player ++ widget-mpris-title ++ widget-mpris-subtitle ++ properties: ++ image-size: ++ type: integer ++ optional: true ++ default: 96 ++ description: The size of the album art. ++ image-radius: ++ type: integer ++ optional: true ++ default: 12 ++ description: The border radius of the album art. ++ description: A widget that displays multiple music players. ++ *menubar*++ type: object ++ css classes: ++ widget-menubar ++ .widget-menubar>box>.menu-button-bar ++ name of element given after menu or buttons with # ++ patternProperties: ++ menu#: ++ type: object ++ properties: ++ label: ++ type: string ++ optional: true ++ default: "Menu" ++ description: Label of button to show/hide menu dropdown ++ position: ++ type: string ++ optional: true ++ default: "right" ++ description: Horizontal position of the button in the bar ++ enum: ["right", "left"] ++ animation-type: ++ type: string ++ optional: true ++ default: "slide_down" ++ description: Animation type for menu++ enum: ["slide_down", "slide_up", "none"] ++ animation-duration: ++ type: integer ++ optional: true ++ default: 250 ++ description: Duration of animation in milliseconds ++ actions: ++ type: array ++ Default values: [] ++ Valid array values: ++ type: object ++ properties: ++ label: ++ type: string ++ default: "label" ++ description: Text to be displayed in button ++ command: ++ type: string ++ default: "" ++ description: "Command to be executed on click" ++ description: A list of actions containing a label and a command ++ description: A button to reveal a dropdown with action-buttons ++ buttons#: ++ type: object ++ properties: ++ position: ++ type: string ++ optional: true ++ default: "right" ++ description: Horizontal position of the buttons in the bar ++ enum: ["right", "left"] ++ actions: ++ type: array ++ Default values: [] ++ Valid array values: ++ type: object ++ properties: ++ label: ++ type: string ++ default: "label" ++ description: Text to be displayed in button ++ command: ++ type: string ++ default: "" ++ description: "Command to be executed on click" ++ description: A list of actions containing a label and a command ++ description: A list of buttons to be displayed in the menu-button-bar ++ *buttons-grid*++ type: object ++ css class: widget-buttons (access buttons with >flowbox>flowboxchild>button) ++ properties: ++ actions: ++ type: array ++ Default values: [] ++ Valid array values: ++ type: object ++ properties: ++ label: ++ type: string ++ default: "label" ++ description: Text to be displayed in button ++ command: ++ type: string ++ default: "" ++ description: "Command to be executed on click" ++ description: A list of actions containing a label and a command ++ description: A grid of buttons that execute shell commands ++ #START pulse-audio *volume*++ type: object ++ css class: ++ widget-volume ++ per-app-volume ++ properties: ++ label: ++ type: string ++ optional: true ++ default: "Volume" ++ description: Text displayed in front of the volume slider ++ show-per-app: ++ type: bool ++ optional: true ++ default: false ++ description: Show per app volume control ++ empty-list-label: ++ type: string ++ optional: true ++ default: "No active sink input" ++ description: Text displayed when there are not active sink inputs ++ expand-button-label: ++ type: string ++ optional: true ++ default: "⇧" ++ description: Label displayed on button to show per app volume control ++ collapse-button-label: ++ type: string ++ optional: true ++ default: "⇩" ++ description: Label displayed on button to hide per app volume control ++ icon-size: ++ type: integer ++ optional: true ++ default: 24 ++ description: Size of the application icon in per app volume control ++ animation-type: ++ type: string ++ optional: true ++ default: "slide_down" ++ description: Animation type for the per app volume control ++ enum: ["slide_down", "slide_up", "none"] ++ animation-duration: ++ type: integer ++ optional: true ++ default: 250 ++ description: Duration of animation in milliseconds ++ description: Slider to control pulse volume ++ #END pulse-audio *backlight*++ type: object ++ css class: widget-backlight ++ properties: ++ label: ++ type: string ++ optional: true ++ default: "Brightness" ++ description: Text displayed in front of the backlight slider ++ device: ++ type: string ++ optional: true ++ default: "intel_backlight" ++ description: Device in `/sys/class/backlight` or `/sys/class/leds` ++ subsystem: ++ type: string ++ optional: true ++ default: "backlight" ++ description: Kernel subsystem for brightness control ++ enum: ["backlight", "leds"] ++ min: ++ type: integer ++ optional: true ++ default: 0 ++ description: Lowest possible value for brightness ++ description: Slider to control screen brightness ++ *inhibitors*++ type: object ++ css class: widget-inhibitors ++ properties: ++ text: ++ type: string ++ optional: true ++ default: "Inhibitors" ++ description: The title of the widget ++ clear-all-button: ++ type: bool ++ optional: true ++ default: true ++ description: Whether to display a "Clear All" button ++ button-text: ++ type: string ++ optional: true ++ default: "Clear All" ++ description: "Clear All" button text ++ description: Displayed if notifications are inhibited. example: ``` { "widget-config": { "title": { "text": "Notifications", "clear-all-button": true, "button-text": "Clear All" }, "dnd": { "text": "Do Not Disturb" }, "label": { "max-lines": 5, "text": "Label Text" }, "mpris": { "image-size": 96, "image-radius": 12 }, "menubar": { "menu#power": { "label": "Power", "position": "right", "actions": [ { "label": "Shut down", "command": "systemctl poweroff" }, ... ] }, "buttons#screenshot": { "position": "left", "actions": [ { "label": "Screenshot", "command": "grim" }, ... ] } }, "buttons": { "actions": [ { "label": "wifi", "command": "rofi-wifi-menu" }, ... ] } } } ``` #START scripting # Scripts *script-fail-notify* ++ type: bool ++ default: true ++ description: Sends a notification if a script fails to run *scripts* ++ type: object ++ script object properties: ++ *exec*++ type: string ++ optional: false ++ description: The script to run. Can also run regular shell commands.++ *app-name*++ type: string ++ optional: true ++ description: The app-name. Uses Regex.++ *desktop-entry*++ type: string ++ optional: true ++ description: The desktop-entry. Uses Regex.++ *summary*++ type: string ++ optional: true ++ description: The summary of the notification. Uses Regex.++ *body*++ type: string ++ optional: true ++ description: The body of the notification. Uses Regex.++ *urgency*++ type: string ++ optional: true ++ default: Normal ++ values: Low, Normal, Critical ++ description: The urgency of the notification.++ *category*++ type: string ++ optional: true ++ description: Which category the notification belongs to. Uses Regex.++ *run-on*++ type: string ++ optional: true ++ values: action, receive ++ default: receive ++ description: Whether to run this action when the notification is ++ received, or when an action is taken on it. ++ description: Which scripts to check and potentially run for every ++ notification. If the notification doesn't include one of the properties, ++ that property will be ignored. All properties (except for exec) use regex. ++ If all properties match the given notification, the script will be run. ++ Only the first matching script will be run. ++ example: ``` { "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" } } } ``` You can also use these environment variables in your script: ``` SWAYNC_BODY="Notification body content" SWAYNC_DESKTOP_ENTRY="Desktop entry" SWAYNC_URGENCY="Notification urgency" SWAYNC_TIME="Notification time" SWAYNC_APP_NAME="Notification app name" SWAYNC_CATEGORY="SwayNC notification category" SWAYNC_REPLACES_ID="ID of notification to replace" SWAYNC_ID="SwayNC notification ID" SWAYNC_SUMMARY="Notification summary" ``` #END scripting