         return
 
     _on_pointer_move: (event) =>
+        if @_prevent_defaults
+            event.preventDefault()
         # TODO: Use pointerIDs, both for deltas and for viewport/object over/out
         x = event.pageX - @context.root_rect.left
         y = event.pageY - @context.root_rect.top
         prev = @_prev_events['mouse']
         if not prev?
             prev = @_prev_events['mouse'] = {x, y}
-        delta_x = x - prev.x
-        delta_y = y - prev.y
+        if @locked
+            delta_x = event.movementX
+            delta_y = event.movementY
+        else
+            delta_x = x - prev.x
+            delta_y = y - prev.y
         prev.x = x; prev.y = y
         {button, buttons, shiftKey, ctrlKey, altKey, metaKey} = event
         # TODO: Should we only lock outside the window?

            if @_menu_prevent_default?
                @_root.addEventListener 'contextmenu', @_menu_prevent_default
            @_enabled = true

    disable: ->
        if @_enabled

        @_root = @context.root
        @context.behaviours.push @
        @init_time = performance.now()
        @locked = false
        @_prevent_defaults = false
        @_enabled = false
        @_object_under_pointer = {}
        @_last_hit = {}
