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