From a010015c89b7115259d34dc5635a458bd47817c0 Mon Sep 17 00:00:00 2001 From: Ingolf Wagner Date: Sat, 28 Mar 2020 18:50:50 +0800 Subject: [PATCH] dunst: add notify server --- system/desktop/home-manager.nix | 1 + system/desktop/home-manager/dunst.nix | 264 ++++++++++++++++++ system/desktop/home-manager/xmonad.nix | 1 + system/desktop/home-manager/xmonad/Main.hs | 17 +- .../home-manager/xmonad/NixCommands.hs | 1 + system/desktop/packages.nix | 3 +- 6 files changed, 283 insertions(+), 4 deletions(-) create mode 100644 system/desktop/home-manager/dunst.nix diff --git a/system/desktop/home-manager.nix b/system/desktop/home-manager.nix index 1a4fab8..594a9be 100644 --- a/system/desktop/home-manager.nix +++ b/system/desktop/home-manager.nix @@ -28,6 +28,7 @@ let in { imports = [ + ./home-manager/dunst.nix ./home-manager/spacemacs.nix ./home-manager/spacevim.nix ./home-manager/ssh.nix diff --git a/system/desktop/home-manager/dunst.nix b/system/desktop/home-manager/dunst.nix new file mode 100644 index 0000000..9290879 --- /dev/null +++ b/system/desktop/home-manager/dunst.nix @@ -0,0 +1,264 @@ +{ pkgs, ... }: { + home-manager.users.mainUser = { + + services.dunst = { + enable = true; + settings = { + global = { + font = "Iosevka Term 11"; + # Allow a small subset of html markup: + # bold + # italic + # strikethrough + # underline + # + # For a complete reference see + # . + # If markup is not allowed, those tags will be stripped out of the + # message. + markup = "yes"; + plain_text = "no"; + + # The format of the message. Possible variables are: + # %a appname + # %s summary + # %b body + # %i iconname (including its path) + # %I iconname (without its path) + # %p progress value if set ([ 0%] to [100%]) or nothing + # Markup is allowed + format = '' + %a + %s + %b''; + + # Sort messages by urgency. + sort = "yes"; + + # Show how many messages are currently hidden (because of geometry). + indicate_hidden = "yes"; + + # Alignment of message text. + # Possible values are "left", "center" and "right". + alignment = "center"; + + # The frequency with wich text that is longer than the notification + # window allows bounces back and forth. + # This option conflicts with "word_wrap". + # Set to 0 to disable. + bounce_freq = 0; + + # Show age of message if message is older than show_age_threshold + # seconds. + # Set to -1 to disable. + show_age_threshold = 1; + + # Split notifications into multiple lines if they don't fit into + # geometry. + word_wrap = "yes"; + + # Ignore newlines '\n' in notifications. + ignore_newline = "no"; + + # Hide duplicate's count and stack them + stack_duplicates = "yes"; + hide_duplicates_count = "no"; + + # The geometry of the window: + # [{width}]x{height}[+/-{x}+/-{y}] + # The geometry of the message window. + # The height is measured in number of notifications everything else + # in pixels. If the width is omitted but the height is given + # ("-geometry x2"), the message window expands over the whole screen + # (dmenu-like). If width is 0, the window expands to the longest + # message displayed. A positive x is measured from the left, a + # negative from the right side of the screen. Y is measured from + # the top and down respectevly. + # The width can be negative. In this case the actual width is the + # screen width minus the width defined in within the geometry option. + geometry = "500x10-0+0"; + + # Shrink window if it's smaller than the width. Will be ignored if + # width is 0. + shrink = "no"; + + # Don't remove messages, if the user is idle (no mouse or keyboard input) + # for longer than idle_threshold seconds. + # Set to 0 to disable. + idle_threshold = 0; + + # The transparency of the window. Range: [0; 100]. + # This option will only work if a compositing windowmanager is + # present (e.g. xcompmgr, compiz, etc.). + # transparency = 5 + + # Which monitor should the notifications be displayed on. + #monitor = keyboard + + # Display notification on focused monitor. Possible modes are: + # mouse: follow mouse pointer + # keyboard: follow window with keyboard focus + # none: don't follow anything + # + # "keyboard" needs a windowmanager that exports the + # _NET_ACTIVE_WINDOW property. + # This should be the case for almost all modern windowmanagers. + # + # If this option is set to mouse or keyboard, the monitor option + # will be ignored. + follow = "none"; + + # Should a notification popped up from history be sticky or timeout + # as if it would normally do. + sticky_history = "yes"; + + # Maximum amount of notifications kept in history + history_length = 15; + + # Display indicators for URLs (U) and actions (A). + show_indicators = "no"; + + # The height of a single line. If the height is smaller than the + # font height, it will get raised to the font height. + # This adds empty space above and under the text. + line_height = 3; + + # Draw a line of "separatpr_height" pixel height between two + # notifications. + # Set to 0 to disable. + separator_height = 1; + + # Padding between text and separator. + padding = 1; + + # Horizontal padding. + horizontal_padding = 1; + + # Define a color for the separator. + # possible values are: + # * auto: dunst tries to find a color fitting to the background; + # * foreground: use the same color as the foreground; + # * frame: use the same color as the frame; + # * anything else will be interpreted as a X color. + separator_color = "frame"; + + # Print a notification on startup. + # This is mainly for error detection, since dbus (re-)starts dunst + # automatically after a crash. + startup_notification = true; + + # dmenu path. + dmenu = "${pkgs.dmenu}/bin/dmenu -p dunst:"; + + # Browser for opening urls in context menu. + # browser = /usr/bin/firefox -new-tab + + # Align icons left/right/off + icon_position = "off"; + max_icon_size = 80; + + frame_width = 2; + frame_color = "#8EC07C"; + + }; + shortcuts = { + + # Shortcuts are specified as [modifier+][modifier+]...key + # Available modifiers are "ctrl", "mod1" (the alt-key), "mod2", + # "mod3" and "mod4" (windows-key). + # Xev might be helpful to find names for keys. + + # Close notification. + close = "ctrl+space"; + + # Close all notifications. + close_all = "ctrl+shift+space"; + + # Redisplay last message(s). + # On the US keyboard layout "grave" is normally above TAB and left + # of "1". + #history = "ctrl+grave"; + + # Context menu. + context = "mod4+u"; + }; + + urgency_low = { + frame_color = "#268bd2"; + foreground = "#002b36"; + background = "#fdf6e3"; + #timeout = 1; + }; + + urgency_normal = { + frame_color = "#b58900"; + foreground = "#002b36"; + background = "#fdf6e3"; + #timeout = 1; + }; + + urgency_critical = { + frame_color = "#dc322f"; + foreground = "#002b36"; + background = "#fdf6e3"; + #timeout = 1; + }; + }; + + # Every section that isn't one of the above is interpreted as a rules to + # override settings for certain messages. + # Messages can be matched by "appname", "summary", "body", "icon", "category", + # "msg_urgency" and you can override the "timeout", "urgency", "foreground", + # "background", "new_icon" and "format". + # Shell-like globbing will get expanded. + # + # SCRIPTING + # You can specify a script that gets run when the rule matches by + # setting the "script" option. + # The script will be called as follows: + # script appname summary body icon urgency + # where urgency can be "LOW", "NORMAL" or "CRITICAL". + # + # NOTE: if you don't want a notification to be displayed, set the format + # to "". + # NOTE: It might be helpful to run dunst -print in a terminal in order + # to find fitting options for rules. + + #[espeak] + # summary = "*" + # script = dunst_espeak.sh + + #[script-test] + # summary = "*script*" + # script = dunst_test.sh + + #[ignore] + # # This notification will not be displayed + # summary = "foobar" + # format = "" + + #[signed_on] + # appname = Pidgin + # summary = "*signed on*" + # urgency = low + # + #[signed_off] + # appname = Pidgin + # summary = *signed off* + # urgency = low + # + #[says] + # appname = Pidgin + # summary = *says* + # urgency = critical + # + #[twitter] + # appname = Pidgin + # summary = *twitter.com* + # urgency = normal + # + # vim: ft=cfg + + }; + }; +} diff --git a/system/desktop/home-manager/xmonad.nix b/system/desktop/home-manager/xmonad.nix index 1846099..68ba2e9 100644 --- a/system/desktop/home-manager/xmonad.nix +++ b/system/desktop/home-manager/xmonad.nix @@ -31,6 +31,7 @@ let nixAlsaRaiseVolume = "${pkgs.alsaUtils}/bin/amixer set Master 5%+" nixAlsaLowerVolume = "${pkgs.alsaUtils}/bin/amixer set Master 5%-" nixAlsaMute = "${pkgs.alsaUtils}/bin/amixer set Master toggle" + nixNotifySend = "${pkgs.libnotify}/bin/notify-send" ''; in { diff --git a/system/desktop/home-manager/xmonad/Main.hs b/system/desktop/home-manager/xmonad/Main.hs index 92ed612..1dc9a34 100644 --- a/system/desktop/home-manager/xmonad/Main.hs +++ b/system/desktop/home-manager/xmonad/Main.hs @@ -2,6 +2,8 @@ module Main where +import XMonad.Util.NamedWindows (getName) +import XMonad.Util.Run (safeSpawn) import BoringWindows (BoringMessage (..), boringWindows, clearBoring, focusDown, focusUp) @@ -31,8 +33,8 @@ import XMonad.Hooks.DynamicLog (dynamicLog) import XMonad.Hooks.ManageDebug (debugManageHook) import XMonad.Hooks.ManageHelpers (doCenterFloat) import XMonad.Hooks.SetWMName (setWMName) -import XMonad.Hooks.UrgencyHook (SpawnUrgencyHook (..), - withUrgencyHook) +import XMonad.Hooks.UrgencyHook (withUrgencyHook, + UrgencyHook(..)) import XMonad.Layout.Mosaic (Aspect (Reset)) import XMonad.Layout.NoBorders (noBorders, smartBorders) import XMonad.Layout.ResizableTile (MirrorResize (MirrorExpand, MirrorShrink), @@ -452,7 +454,7 @@ startUp main :: IO () main = do xmonad $ - withUrgencyHook (SpawnUrgencyHook "echo emit Urgency ") $ + withUrgencyHook LibNotifyUrgencyHook $ dynamicProjects projects $ -- debugManageHook $ defaults @@ -518,3 +520,12 @@ myXPConfig = , promptBorderWidth = 0 , font = "xft:inconsolata:pixelsize=18:antialias=true:hinting=true" } + +data LibNotifyUrgencyHook = LibNotifyUrgencyHook deriving (Read, Show) + +instance UrgencyHook LibNotifyUrgencyHook where + urgencyHook LibNotifyUrgencyHook w = do + name <- getName w + Just idx <- fmap (W.findTag w) $ gets windowset + + safeSpawn nixNotifySend [show name, "workspace " ++ idx] diff --git a/system/desktop/home-manager/xmonad/NixCommands.hs b/system/desktop/home-manager/xmonad/NixCommands.hs index 3a32047..a8cfe3e 100644 --- a/system/desktop/home-manager/xmonad/NixCommands.hs +++ b/system/desktop/home-manager/xmonad/NixCommands.hs @@ -17,3 +17,4 @@ nixStartTerminal = "" nixAlsaRaiseVolume = "" nixAlsaLowerVolume = "" nixAlsaMute = "" +nixNotifySend = "" diff --git a/system/desktop/packages.nix b/system/desktop/packages.nix index 3bcf01c..fecc8c3 100644 --- a/system/desktop/packages.nix +++ b/system/desktop/packages.nix @@ -44,7 +44,6 @@ let "$@" ''; - connectToSpeaker = name: id: pkgs.writeShellScriptBin "connect-to-speaker-${name}" # sh '' @@ -275,6 +274,8 @@ in { ' '') + nix-index + nethogs netsniff-ng iftop