             (do
               (rs/emit! (uds/deselect-all)
                         (uds/select-shape id))
-              (rlocks/acquire! :shape/move))))
+              (start-move))))
 
         :else
         (do
           (dom/stop-propagation event)
-          (rlocks/acquire! :shape/move))))))
+          (start-move))))))

        (do
          (dom/stop-propagation event)
          (rs/emit! (uds/select-shape id))
          (rlocks/acquire! :shape/move))

        (and (not selected?) (not (empty? selected)))
        (do

(def selected-ref
  (-> (l/in [:workspace :selected])
      (l/derive st/state)))

;; --- Movement

(defn start-move
  []
  (letfn [(on-start [shape]
            (let [stoper (->> (rx/map first wb/events-s)
                              (rx/filter #(= % :mouse/up))
                              (rx/take 1))
                  stream (rx/take-until stoper wb/mouse-delta-s)
                  on-move #(rs/emit! (uds/move-shape shape %))
                  on-stop #(rlocks/release! :shape/move)]
              (when @wb/alignment-ref
                (rs/emit! (uds/initial-align-shape shape)))
              (rx/subscribe stream on-move nil on-stop)))]

    (rlocks/acquire! :shape/move)
    (run! on-start @selected-ref)))

;; --- Events

