From 6972cce43dbf29d541ee676ebab79dcfbe34c020 Mon Sep 17 00:00:00 2001
From: Jiri Kalvoda <jirikalvoda@kam.mff.cuni.cz>
Date: Sun, 28 Aug 2022 23:18:32 +0200
Subject: [PATCH] Workspace swap: Move lock out of function

---
 woman/lib.py | 103 +++++++++++++++++++++++++--------------------------
 woman/qt.py  |  21 ++++++-----
 2 files changed, 62 insertions(+), 62 deletions(-)

diff --git a/woman/lib.py b/woman/lib.py
index b22c342..a5bfc08 100644
--- a/woman/lib.py
+++ b/woman/lib.py
@@ -86,58 +86,57 @@ def swap_workspace(a_master, a_slave, b_master, b_slave):
         event_workspace_is_on(b, shared.output_of_workspace[a_master][a_slave])
         event_workspace_deleted(a)
 
-    with shared.lock:
-        a = (a_master, a_slave)
-        b = (b_master, b_slave)
-        if a_master not in shared.output_of_workspace or a_slave not in shared.output_of_workspace[a_master]:
-            return rename_workspace(*b, *a)
-        if b_master not in shared.output_of_workspace or b_slave not in shared.output_of_workspace[b_master]:
-            return rename_workspace(*a, *b)
-        shared.i3_cmd(f'rename workspace {workspace(*a)} to tmp_swap')
-        try:
-            shared.i3_cmd(f'rename workspace {workspace(*b)} to {workspace(*a)}')
-        except I3CmdException as e:
-            shared.i3_cmd(f'rename workspace tmp_swap to {workspace(*a)}')
-            raise e
-        shared.i3_cmd(f'rename workspace tmp_swap to {workspace(*b)}')
-        for i in shared.workspace_on:
-            if shared.workspace_on[i] == a:
-                shared.workspace_on[i] = b
-            elif shared.workspace_on[i] == b:
-                shared.workspace_on[i] = a
-
-        if a_master == b_master and a_master is not None:
-            if shared.slave_for[a_master] == a_slave:
-                shared.slave_for[a_master] = b_slave
-            elif shared.slave_for[a_master] == b_slave:
-                shared.slave_for[a_master] = a_slave
-            for i in shared.slave_on_for:
-                if shared.slave_on_for[i][a_master] == a_slave:
-                    shared.slave_on_for[i][a_master] = b_slave
-                elif shared.slave_on_for[i][a_master] == b_slave:
-                    shared.slave_on_for[i][a_master] = a_slave
-        else:
-            for i in set(shared.slave_on).union(set(shared.master_on)):
-                def set_ws(master, slave):
-                    if master is None:
-                        shared.slave_on[i] = slave
-                    else:
-                        shared.master_on[i] = master
-                        shared.slave_on_for[i][b_master] = slave
-                if a == (None, shared.slave_on[i]):
-                    shared.slave_on[i] = None
-                    set_ws(*b)
-                elif b == (None, shared.slave_on[i]):
-                    shared.slave_on[i] = None
-                    set_ws(*a)
-                elif a == (shared.master_on[i], shared.slave_on_for[i][a_master]):
-                    set_ws(*b)
-                elif b == (shared.master_on[i], shared.slave_on_for[i][b_master]):
-                    set_ws(*a)
-
-        tmp = shared.output_of_workspace[a_master][a_slave]
-        shared.output_of_workspace[a_master][a_slave] = shared.output_of_workspace[b_master][b_slave]
-        shared.output_of_workspace[b_master][b_slave] = tmp
+    a = (a_master, a_slave)
+    b = (b_master, b_slave)
+    if a_master not in shared.output_of_workspace or a_slave not in shared.output_of_workspace[a_master]:
+        return rename_workspace(*b, *a)
+    if b_master not in shared.output_of_workspace or b_slave not in shared.output_of_workspace[b_master]:
+        return rename_workspace(*a, *b)
+    shared.i3_cmd(f'rename workspace {workspace(*a)} to tmp_swap')
+    try:
+        shared.i3_cmd(f'rename workspace {workspace(*b)} to {workspace(*a)}')
+    except I3CmdException as e:
+        shared.i3_cmd(f'rename workspace tmp_swap to {workspace(*a)}')
+        raise e
+    shared.i3_cmd(f'rename workspace tmp_swap to {workspace(*b)}')
+    for i in shared.workspace_on:
+        if shared.workspace_on[i] == a:
+            shared.workspace_on[i] = b
+        elif shared.workspace_on[i] == b:
+            shared.workspace_on[i] = a
+
+    if a_master == b_master and a_master is not None:
+        if shared.slave_for[a_master] == a_slave:
+            shared.slave_for[a_master] = b_slave
+        elif shared.slave_for[a_master] == b_slave:
+            shared.slave_for[a_master] = a_slave
+        for i in shared.slave_on_for:
+            if shared.slave_on_for[i][a_master] == a_slave:
+                shared.slave_on_for[i][a_master] = b_slave
+            elif shared.slave_on_for[i][a_master] == b_slave:
+                shared.slave_on_for[i][a_master] = a_slave
+    else:
+        for i in set(shared.slave_on).union(set(shared.master_on)):
+            def set_ws(master, slave):
+                if master is None:
+                    shared.slave_on[i] = slave
+                else:
+                    shared.master_on[i] = master
+                    shared.slave_on_for[i][b_master] = slave
+            if a == (None, shared.slave_on[i]):
+                shared.slave_on[i] = None
+                set_ws(*b)
+            elif b == (None, shared.slave_on[i]):
+                shared.slave_on[i] = None
+                set_ws(*a)
+            elif a == (shared.master_on[i], shared.slave_on_for[i][a_master]):
+                set_ws(*b)
+            elif b == (shared.master_on[i], shared.slave_on_for[i][b_master]):
+                set_ws(*a)
+
+    tmp = shared.output_of_workspace[a_master][a_slave]
+    shared.output_of_workspace[a_master][a_slave] = shared.output_of_workspace[b_master][b_slave]
+    shared.output_of_workspace[b_master][b_slave] = tmp
     shared.qt_task("ws_swap", a_master, a_slave, b_master, b_slave)
 
 
diff --git a/woman/qt.py b/woman/qt.py
index 10dcc5b..55da941 100755
--- a/woman/qt.py
+++ b/woman/qt.py
@@ -721,15 +721,15 @@ def qt_main():
                 f.move_to_workspace(target.workspace_widget.master, target.workspace_widget.slave)
 
         def move_to_workspace(self, master, slave, expand=False):
-            try:
-                with shared.lock:
-                    shared.output_of_workspace[master][slave]
-                    empty = False
-            except KeyError:
-                empty = True
-            if empty:
-                swap_workspace(self.master, self.slave, master, slave)
-            else:
+            with shared.lock:
+                try:
+                        shared.output_of_workspace[master][slave]
+                        empty = False
+                except KeyError:
+                    empty = True
+                if empty:
+                    swap_workspace(self.master, self.slave, master, slave)
+            if not empty:
                 if (w := self.root_i3_tree_widget()) is not None:
                     w.move_to_workspace(master, slave, expand=expand)
                 for f in self._tree.floating_nodes:
@@ -742,7 +742,8 @@ def qt_main():
                 f.quit_windows(*arg, **kvarg)
 
         def swap_with_workspace(self, master, slave):
-            swap_workspace(self.master, self.slave, master, slave)
+            with shared.lock:
+                swap_workspace(self.master, self.slave, master, slave)
 
         def clicked(self, pos, buttons):
             if buttons == Qt.RightButton:
-- 
GitLab