                                                    (danny--longest-line-length (funcall (danny--framed-ivy-source-collection source)
                                                                                         nil nil nil)))
                                               (1+ (length (danny--framed-ivy-source-prompt source)))))))))
+        (x-focus-frame frame)
         (ivy-read (danny--framed-ivy-source-prompt source)
                   (danny--framed-ivy-source-collection source)
                   :update-fn (lambda ()

(defun danny--create-move-action-fun (src-fpath)
  (lambda (dst-dpath)
    (let ((dst-fpath (f-join dst-dpath
                            (danny--read-string (format "Save as (%s): " (f-filename src-fpath))
                                                (f-filename src-fpath)
                                                20))))
      (when (equal src-fpath dst-fpath)
        (error "Moving to same location"))
      (if (f-exists-p dst-fpath)


(defvar danny-monitor-dir-path nil "Directory path to monitor.")

(defvar danny-destination-roots
  (list (make-danny-destination-root :name "Documents"
                                     :dpath "~/Documents"))
  "Root destination directories. For example:

  (list (make-danny-destination-root :name \"Documents\"
                                     :dpath \"~/Documents\")
        (make-danny-destination-root :name \"Stuff\"
                                     :dpath \"~/Stuff\"))")

(defvar danny--notify-descriptor nil "File notify descriptor.")

(defvar danny--history-hash (ht) "History hashtable.")

(defvar danny--history-path "~/.danny")

(cl-defstruct
    danny-destination-root
  name
  dpath
  recursive)

(defun danny-stop-monitoring ()
  (interactive)
