From 15e4b51bb1e46f8559dc8cdf611fbbf24675ea6c Mon Sep 17 00:00:00 2001
From: Michal Srb <xixixao@seznam.cz>
Date: Thu, 3 Sep 2020 16:12:01 +0200
Subject: [PATCH] Fix binding disabling when taking screenshots on macOS
 (#2129)

* Fix binding disabling when taking screenshots on macOS
* Update snapshot for cmd+click test
---
 src/components/App.tsx                                | 11 +++++++++++
 src/element/binding.ts                                |  7 +++++++
 src/tests/__snapshots__/regressionTests.test.tsx.snap |  2 +-
 3 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/components/App.tsx b/src/components/App.tsx
index 83d7b48060..dcc89c7eaf 100644
--- a/src/components/App.tsx
+++ b/src/components/App.tsx
@@ -171,6 +171,7 @@ import {
   isLinearElementSimpleAndAlreadyBound,
   isBindingEnabled,
   updateBoundElements,
+  shouldEnableBindingForPointerEvent,
 } from "../element/binding";
 import { MaybeTransformHandleType } from "../element/transformHandles";
 
@@ -2220,6 +2221,7 @@ class App extends React.Component<ExcalidrawProps, AppState> {
     }
 
     this.clearSelectionIfNotUsingSelection();
+    this.updateBindingEnabledOnPointerMove(event);
 
     if (this.handleSelectionOnPointerDown(event, pointerDownState)) {
       return;
@@ -3484,6 +3486,15 @@ class App extends React.Component<ExcalidrawProps, AppState> {
     });
   }
 
+  private updateBindingEnabledOnPointerMove = (
+    event: React.PointerEvent<HTMLCanvasElement>,
+  ) => {
+    const shouldEnableBinding = shouldEnableBindingForPointerEvent(event);
+    if (this.state.isBindingEnabled !== shouldEnableBinding) {
+      this.setState({ isBindingEnabled: shouldEnableBinding });
+    }
+  };
+
   private maybeSuggestBindingAtCursor = (pointerCoords: {
     x: number;
     y: number;
diff --git a/src/element/binding.ts b/src/element/binding.ts
index 5599866c62..deb1cc0e7a 100644
--- a/src/element/binding.ts
+++ b/src/element/binding.ts
@@ -21,6 +21,7 @@ import { mutateElement } from "./mutateElement";
 import Scene from "../scene/Scene";
 import { LinearElementEditor } from "./linearElementEditor";
 import { tupleToCoors } from "../utils";
+import { KEYS } from "../keys";
 
 export type SuggestedBinding =
   | NonDeleted<ExcalidrawBindableElement>
@@ -32,6 +33,12 @@ export type SuggestedPointBinding = [
   NonDeleted<ExcalidrawBindableElement>,
 ];
 
+export const shouldEnableBindingForPointerEvent = (
+  event: React.PointerEvent<HTMLCanvasElement>,
+) => {
+  return !event[KEYS.CTRL_OR_CMD];
+};
+
 export const isBindingEnabled = (appState: AppState): boolean => {
   return appState.isBindingEnabled;
 };
diff --git a/src/tests/__snapshots__/regressionTests.test.tsx.snap b/src/tests/__snapshots__/regressionTests.test.tsx.snap
index 20a220918c..93fbb5e81b 100644
--- a/src/tests/__snapshots__/regressionTests.test.tsx.snap
+++ b/src/tests/__snapshots__/regressionTests.test.tsx.snap
@@ -907,7 +907,7 @@ Object {
   "exportBackground": true,
   "gridSize": null,
   "height": 768,
-  "isBindingEnabled": true,
+  "isBindingEnabled": false,
   "isCollaborating": false,
   "isLibraryOpen": false,
   "isLoading": false,