You are not logged in.
knopwob wrote:progandy wrote:The U is AFAIK a bug. It should only show when the notification has associated URLs.
Edit: It is a bug in the URL detection. x.y is recognized as a link.exactly. an A would indicate an Action btw. and the url detection gets a lot of false positives. But I prefer this to wrongly not detected urls. patches that improve url detection are welcome. see menu.c
I added a commit to my fork, feel free to cherry-pick this and any other commit I made
https://github.com/progandy/dunst/commi … 78ee1a0288
I've picked most of your commits (not yet pushed to my github) except for the two icon related commits. I've not yet decided wether I want to merge those, since I'm thinking about adding real icon support. Anyway thank you for your efforts.
Offline
The last version in git broke -geometry x1 for me (no longer spans the whole monitor, behaves like 0x1).
This should be fixed.
Also, my script to send notifications via dbus doesn't work anymore (it works fine on 0.5.0):
dbus-send --type=method_call --dest='org.freedesktop.Notifications' \ /org/freedesktop/Notifications org.freedesktop.Notifications.Notify \ string:"$1" \ uint32:1 \ string:'' \ string:"$2" \ string:"$3" \ array:string:'' \ dict:string:string:'','' \ int32:1000
I use it instead of notify-send because with this script if there is a notification showing, it gets replaced by the new one (it doesn't wait for timeouts). Useful for volume/brightness shortcuts . In the git version I don't see anything when I use this script.
Yes, I know. The problem is that I now use glib for dbus which checks the types of the parameters to method calls. Your script doesn't work anymore because the interface specifies that the hints are a dictionary of strings and variants but dbus-send doesn't support this type. And I currently don't know of a way to disable this typechecking within glib.
As a workaround you can replace your script with this python script, which should work the same way:
#!/usr/bin/env python2
import pynotify
import sys
(appname, summary, body) = ("", "", "")
try:
appname = sys.argv[1]
summary = sys.argv[2]
body = sys.argv[3]
except:
pass
pynotify.init(appname)
n = pynotify.Notification(summary, body)
n.props.id = 1
n.show()
That script depends on python2-notify
Offline
As a workaround you can replace your script with this python script, which should work the same way
It works, but being a python script there is a significant lag between the execution and the notification, whereas with notify-send or dbus-send the notification is immediate. It gets a bit annoying when changing volume/brightness.
I've been trying to patch notify-send but there doesn't seem to be an interface to libnotify C to set the notification id (I don't know how dbus-send or python do it).
Oh well, I'll stay with dunst-0.5.0 for the time being.
Thanks.
Offline
@zequav Have a look at RELEASE_NOTES.next in the git repository. Especially the section about dunstify. It's a replacement for notify-send that I've written since notify-send lacks some features that I needed for testing. But since it uses private parts of libnotify it may break on any update on libnotify. That's why I regard it as unofficial and don't want to promote it much.
Offline
@zequav Have a look at RELEASE_NOTES.next in the git repository. Especially the section about dunstify. It's a replacement for notify-send that I've written since notify-send lacks some features that I needed for testing. But since it uses private parts of libnotify it may break on any update on libnotify. That's why I regard it as unofficial and don't want to promote it much.
Here is an example script that stores the first notification id and reuses it:
#!/bin/sh
nid_file="/tmp/persist_id_$UID.nid"
[ -f "$nid_file" ] && read notifyid < "$nid_file"
[ -n "$notifyid" ] && replace=" -r $notifyid " || replace=""
../dunstify $replace -p "$(date)" > $nid_file
| alias CUTF='LANG=en_XX.UTF-8@POSIX ' |
Online
@zequav Have a look at RELEASE_NOTES.next in the git repository. Especially the section about dunstify. It's a replacement for notify-send that I've written since notify-send lacks some features that I needed for testing. But since it uses private parts of libnotify it may break on any update on libnotify. That's why I regard it as unofficial and don't want to promote it much.
Here is an example script that stores the first notification id and reuses it
Yep, with dunstify everything works fine and fast, thank you both. I'm adding "doexe dunstify" to my dunst-9999.ebuild.
But... it flickers. I see you close the old notification and create a new one, instead of replacing its contents. I've had to patch notification.c to fix it (it also removes the dup count; I don't like it):
--- dunst.orig/notification.c 2013-03-09 17:48:22.144786639 +0100
+++ dunst/notification.c 2013-03-09 17:58:44.306710303 +0100
@@ -314,13 +314,14 @@
n->dup_count = 0;
- /* check if n is a duplicate */
+ /* check if n replaces another notif. */
for (GList * iter = g_queue_peek_head_link(queue); iter;
iter = iter->next) {
notification *orig = iter->data;
- if (strcmp(orig->appname, n->appname) == 0
- && strcmp(orig->msg, n->msg) == 0) {
- orig->dup_count++;
+ if (id == orig->id) {
+ char *msg = n->msg;
+ n->msg = orig->msg;
+ orig->msg = msg;
notification_free(n);
wake_up();
return orig->id;
@@ -330,9 +331,10 @@
for (GList * iter = g_queue_peek_head_link(displayed); iter;
iter = iter->next) {
notification *orig = iter->data;
- if (strcmp(orig->appname, n->appname) == 0
- && strcmp(orig->msg, n->msg) == 0) {
- orig->dup_count++;
+ if (id == orig->id) {
+ char *msg = n->msg;
+ n->msg = orig->msg;
+ orig->msg = msg;
orig->start = time(NULL);
notification_free(n);
wake_up();
Ugly hack (only updates msg, does not update color/urgency/urls/whatever), but I prefer simple patches, and it works for my use case
Offline
Any ideas on how to send notification to dunst from root?
Offline
Any ideas on how to send notification to dunst from root?
That is not directly possible. You will have to somehow find the dbus session address. Maybe use the environment file of a dbus process, use setuid and then send the dbus messages.
http://stackoverflow.com/questions/6496 … us-session
targetuid=1000
for x in $(pgrep --uid $targetuid dbus); do
dbus=$(cat /proc/$x/environ | grep -ao "DBUS_SESSION_BUS_ADDRESS[^\0]*")
[ -n "$dbus" ] && break
done
# works only in zsh (EUID read-only in bash)
EUID=$targetuid
eval "export $dbus"
notify-send "hello from root"
EUID=0
Last edited by progandy (2013-03-11 21:10:39)
| alias CUTF='LANG=en_XX.UTF-8@POSIX ' |
Online
Thanks progandy, but I think I'm onto something.
If I allow anyone from localhost to connect to X server with "xhost +localhost" and export DISPLAY=:0 as root, notification sent via notify-send is shown.
I have added DISPLAY=:0 as Environment variable in service file which calls the script sending notifications, but dunst segfaults instead of showing notification on event that triggers notify-send (plugging phone in and out).
[ 28.304860] usb 2-1.3: new high-speed USB device number 4 using ehci-pci
[ 28.563325] dunst[868]: segfault at 28 ip 00007f8c5f9f4c0d sp 00007fffd141fd10 error 4 in libxdg-basedir.so.1.2.0[7f8c5f9f3000+3000]
[ 28.650749] dunst[872]: segfault at 28 ip 00007f8628b86c0d sp 00007fff6acae0f0 error 4 in libxdg-basedir.so.1.2.0[7f8628b85000+3000]
[ 28.751983] systemd-journald[112]: Failed to write entry, ignoring: Argument list too long
[ 28.931422] systemd-journald[112]: Failed to write entry, ignoring: Argument list too long
[ 29.101964] fuse init (API version 7.20)
[ 32.212718] usb 2-1.3: USB disconnect, device number 4
[ 32.270969] dunst[1010]: segfault at 28 ip 00007f0b86b99c0d sp 00007fff10d2fb60 error 4 in libxdg-basedir.so.1.2.0[7f0b86b98000+3000]
[ 32.312428] dunst[1014]: segfault at 28 ip 00007fb4d51a5c0d sp 00007fff698a11b0 error 4 in libxdg-basedir.so.1.2.0[7fb4d51a4000+3000]
[ 32.396900] systemd-journald[112]: Failed to write entry, ignoring: Argument list too long
[ 32.474708] systemd-journald[112]: Failed to write entry, ignoring: Argument list too long
[ 35.213072] usb 2-1.3: new high-speed USB device number 5 using ehci-pci
[ 35.425459] dunst[1127]: segfault at 28 ip 00007f1bd7102c0d sp 00007fffb542b030 error 4 in libxdg-basedir.so.1.2.0[7f1bd7101000+3000]
[ 35.465523] dunst[1131]: segfault at 28 ip 00007f3051ac3c0d sp 00007fff467c3f60 error 4 in libxdg-basedir.so.1.2.0[7f3051ac2000+3000]
[ 35.525485] systemd-journald[112]: Failed to write entry, ignoring: Argument list too long
[ 35.603635] systemd-journald[112]: Failed to write entry, ignoring: Argument list too long
[ 37.073078] usb 2-1.3: USB disconnect, device number 5
[ 37.131764] dunst[1196]: segfault at 28 ip 00007fc4cbd2bc0d sp 00007fff3934fbc0 error 4 in libxdg-basedir.so.1.2.0[7fc4cbd2a000+3000]
[ 37.183781] dunst[1209]: segfault at 28 ip 00007fbccb6cec0d sp 00007fff3f8e2820 error 4 in libxdg-basedir.so.1.2.0[7fbccb6cd000+3000]
If I login as root and send some random notification, it stops segfaulting on notifications from my script.
EDIT: I will get some useful debugging info tomorrow, I'm off to sleep now.
Last edited by Šaran (2013-03-11 21:49:48)
Offline
it looks like it tries to start a new instance of dunst. And I assume, when you've got it "working" with root, that there are in fact two instances of dunst running, one for root and one for your user.
It might be easier to let your root-script write to a temporary file and watch that file with a script running as your user.
#!/bin/bash
watch_file=/tmp/foobar
#make sure $watch_file exists
touch $watch_file
while true; do
# this will block until $watch_file has been written to
# inotifywait is in inotify-tools package
inotifywait -e modify $watch_file
notify-send "$(tail -n 1 $watch_file)"
done
this is untested
Offline
Script works great, thanks.
I have been playing with notify-send some more to confirm your theory, but it doesn't add up.
Notifications get shown only if notification has already been sent from root via notify-send.
If I kill both root and user instances of dunst and logout from root, notifications still appear, but this doesn't
survive X restart.
Offline
Dunst works great, its the Notification Daemon that works well for me.
I had a question though, is it possible to change the background on a per app basis? Like for instance on a Bitlbee notification I want a blue background and for Facebook. and for say Irssi Notification I want a brown Background for IRC and maybe a purple one for twitter, and red for RemoteDesktopNotifier.
Obs for 3 varients u could use low, crit and urget... but I have 4-5 apps that notify and would like individual background colors for each. Is this possible?
Archlinx + DWM I love Wingo-WM Bring it back!!
Offline
That's possible. The config file has some examples.
Offline
Dunst works great, its the Notification Daemon that works well for me.
I had a question though, is it possible to change the background on a per app basis? Like for instance on a Bitlbee notification I want a blue background and for Facebook. and for say Irssi Notification I want a brown Background for IRC and maybe a purple one for twitter, and red for RemoteDesktopNotifier.
Obs for 3 varients u could use low, crit and urget... but I have 4-5 apps that notify and would like individual background colors for each. Is this possible?
You can use notify-send for this. I for example use `notify-send -t 50 -h string:fgcolor:red' for audio-notifications. Just look up the respective option on the notify-send manpage.
Offline
To change the color of a notification not sent with notify-send, use the rules in dunstrc. You can change timeout, urgency, foreground, background, format, and script. Match the notification with appname, summary, body, and/or icon using shell wildcard patterns.
Use e.g. appname to match the notification and then set "foreground" and "background".
Last edited by progandy (2013-04-04 16:03:45)
| alias CUTF='LANG=en_XX.UTF-8@POSIX ' |
Online
Question about fonts.
How is it that the 'Fixed' font is able to show Asian characters, but fonts like Arial and Dejavu can't?
Offline
Question about fonts.
How is it that the 'Fixed' font is able to show Asian characters, but fonts like Arial and Dejavu can't?
fixed, sans-serif, serif are font families. You should use e.g. "Arial,sans-serif". Then pango will first try arial, then search for the character in another sans-serif font.
PS: I use font = "fontawesome,unifont 16px" (font for icons and a universal font for most characters)
Last edited by progandy (2013-04-17 02:58:53)
| alias CUTF='LANG=en_XX.UTF-8@POSIX ' |
Online
fixed, sans-serif, serif are font families. You should use e.g. "Arial,sans-serif". Then pango will first try arial, then search for the character in another sans-serif font.
PS: I use font = "fontawesome,unifont 16px" (font for icons and a universal font for most characters)
That didn't seem to work.
Your syntax doesn't get picked up by dunst for some reason. Trying "fixed 10px" seems to just go to some fallback sans font.
Trying just "fixed" picks some random fixed font that can't display Asian fonts well (I see gibberish instead of boxes).
Trying fixed-10 gives me an ugly sans-serif font that can display Asian fonts well.
Trying arial,fixed-10 just uses arial and I still see boxes.
I guess dunst and dunst-git handles fonts differently. Works fine in dunst-git.
Last edited by Hspasta (2013-04-17 03:28:03)
Offline
Whenever I launch Dunst, it says "no dunstrc found -> skipping", but I do have a dunstrc file in my home directory?
Last edited by NorthAntrim (2013-04-28 10:32:29)
Offline
place your dunstrc in ~/.config/dunst
Offline
place your dunstrc in ~/.config/dunst
Derp, thanks.
Offline
I can't figure out what causes this, but with dunst-git (with and without a custom config.h) only shows
...
no matter what message I want to send, e.g. sending
notify-send test
Works just fine with dunst from the repos.
Did I miss something?
Offline
For some reason dunst doesn't seem to respect my timeouts consistently. Could my configuration be wrong?
I have the file stored in ~/.config/dunst/dunstrc
Here it is..
[global]
font = droid sans 12
# allow a small subset of html markup:
# <b>bold</b>
# <i>italic</i>
# <s>strikethrough<s/>
# <u>underline</u>
#
# for a complete reference see http://developer.gnome.org/pango/stable/PangoMarkupFormat.html
# If markup is not allowed, those tags will be stripped out of the message.
allow_markup = yes
# 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 = "<b>%s</b>\n%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 = left
# 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 = 60
# split notifications into multiple lines if they don't fit into geometry
word_wrap = yes
# ignore newlines '\n' in notifications
ignore_newline = no
# the geometry of the window
# geometry [{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 = "400x5-15+30"
# 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 = 20
# 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 = 120
# Which monitor should the notifications be displayed on.
monitor = 0
# 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 = 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 = 0
# Draw a line of 'separatpr_height' pixel height between two notifications.
# Set to 0 to disable
separator_height = 2
# padding between text and separator
padding = 8
# horizontal padding
horizontal_padding = 8
# 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 = foreground
# print a notification on startup
# This is mainly for error detection, since dbus (re-)starts dunst
# automatically after a crash.
startup_notification = false
# dmenu path
dmenu = /usr/bin/dmenu -p dunst:
# browser for opening urls in context menu
browser = /usr/bin/chromium
[frame]
width = 3
color = "#acacac"
[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 = ctrl+shift+period
[urgency_low]
# IMPORTANT: colors have to be defined in quotation marks.
# Otherwise the '#' and following would be interpreted as a comment.
background = "#000000"
foreground = "#cccccc"
timeout = 3
[urgency_normal]
background = "#000000"
foreground = "#cccccc"
timeout = 3
[urgency_critical]
background = "#000000"
foreground = "#cccccc"
timeout = 3
# 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' or 'icon'
# and you can override the 'timeout', 'urgency', 'foreground', 'background'
# 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
#
Offline
For some reason dunst doesn't seem to respect my timeouts consistently.
Hmm... I'm using 10 second timeouts for urgency low and normal and I could swear sometimes the message persists for about 3 x longer.
Haven't pinned it down consistently though.
Offline
r4 wrote:For some reason dunst doesn't seem to respect my timeouts consistently.
Hmm... I'm using 10 second timeouts for urgency low and normal and I could swear sometimes the message persists for about 3 x longer.
Haven't pinned it down consistently though.
I have seen it too. messages stay too long, until a new one pops up or sometimes forever. If I use the history function, the window doesn't update properly either. I cannot find the reason, though.
| alias CUTF='LANG=en_XX.UTF-8@POSIX ' |
Online