I was finding that beagle was not picking up new files I placed in $HOME but was succesfully using inotify to detect new files created in $HOME/various-subdirs Using the "--allow-backend files" args solved this so its definately something wrong with some of the other query drivers. Here's the story: The FileSystemQueryable driver, presumably at some point, creates an inotify watch on $HOME, using an EventType mask to match new files, new subdirectories, deletions, etc, (the lot). However, a bit later, along come the other drivers. Tomboy does this: tomboy_wd = Inotify.Watch (PathFinder.HomeDir, Inotify.EventType.CreateSubdir); Tomboy has added *another* watch on the home directory, but has only specified to watch out for CreateSubdir events. Inotify.Watch first realises that there is already a watch on $HOME so it drops it completely. It then adds the new watch, with the CreateSubdir event mask only. So beagled is now totally blind to any new files, deletions, or anything like that in $HOME - not good! Luckily Fredrik has unintentionally "fixed" a series of offending drivers in CVS (Tomboy, Blam, ...) by dropping the inotify stuff and using a more appropriate simple poll. The others (Gaim, Evo) will probably have similar work applied soon. But the core issue is still here. If two inotify watches are created on the same directory with different flags, should the second completely replace the first, or should the flags be "added together" so that all requested events are listened out for? This patch causes the flags to be combined when two watches are created on the same directory. It will also just return the first watch if the first one provides all that the first one provides (and possibly more) Index: Util/Inotify.cs =================================================================== RCS file: /cvs/gnome/beagle/Util/Inotify.cs,v retrieving revision 1.25 diff -u -B -r1.25 Inotify.cs --- Util/Inotify.cs 21 Feb 2005 06:29:07 -0000 1.25 +++ Util/Inotify.cs 24 Feb 2005 00:23:48 -0000 @@ -208,8 +208,9 @@ watched = watched_by_path [path] as Watched; if (watched != null) { - if (watched.Mask == mask) + if (watched.Mask & mask == mask) return watched.Wd; + mask |= watched.Mask; Forget (watched); }