Skip to content

Commit f7d00c9

Browse files
authored
Merge pull request amnweb#304 from Pitchaya-S/komorebi-stack
fix(komorebi_stack): fix background glitch / better animation
2 parents 2498e0e + 845952b commit f7d00c9

1 file changed

Lines changed: 27 additions & 39 deletions

File tree

src/core/widgets/komorebi/stack.py

Lines changed: 27 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -194,12 +194,11 @@ def __init__(
194194
self._label_shadow = label_shadow
195195
self._container_shadow = container_shadow
196196
self._komorebi_screen = None
197-
self._komorebi_focus_container = None
197+
self._curr_focus_container = None
198+
self._prev_focus_container = None
198199
self._komorebi_windows = []
199200
self._prev_workspace_index = None
200201
self._curr_workspace_index = None
201-
self._prev_container_index = None
202-
self._curr_container_index = None
203202
self._prev_window_index = None
204203
self._curr_window_index = None
205204
self._prev_num_windows = None
@@ -263,11 +262,11 @@ def _register_signals_and_events(self):
263262
def _reset(self):
264263
self._komorebi_state = None
265264
self._komorebi_screen = None
265+
self._curr_focus_container = None
266+
self._prev_focus_container = None
266267
self._komorebi_windows = []
267268
self._prev_workspace_index = None
268269
self._curr_workspace_index = None
269-
self._prev_container_index = None
270-
self._curr_container_index = None
271270
self._prev_window_index = None
272271
self._curr_window_index = None
273272
self._window_buttons = []
@@ -290,10 +289,7 @@ def _on_komorebi_update_event(self, event: dict, state: dict) -> None:
290289

291290
if self._update_komorebi_state(state):
292291

293-
if self._show_only_stack:
294-
self._no_window_text.hide()
295-
else:
296-
self._hide_no_window_text()
292+
self._hide_no_window_text()
297293

298294
if event['type'] in self._window_focus_events or self._has_active_window_index_changed():
299295
try:
@@ -306,31 +302,23 @@ def _on_komorebi_update_event(self, event: dict, state: dict) -> None:
306302
except (IndexError, TypeError):
307303
pass
308304

309-
if event['type'] in self._reset_buttons_events or self._has_active_container_index_changed() or self._has_active_workspace_index_changed():
310-
self._window_buttons = []
305+
elif event['type'] in self._reset_buttons_events or self._has_active_container_changed() or self._has_active_workspace_index_changed():
306+
while len(self._window_buttons) > len(self._komorebi_windows):
307+
self._try_remove_window_button(self._window_buttons[-1].window_index)
311308
self._add_or_update_buttons()
312309

313-
if event['type'] == KomorebiEvent.TitleUpdate.value:
310+
elif event['type'] == KomorebiEvent.TitleUpdate.value:
314311
hwnd = event['content'][1]['hwnd']
315312
for window_btn in self._window_buttons:
316313
window_btn_hwnd = self._komorebi_windows[window_btn.window_index]['hwnd']
317314
if window_btn_hwnd == hwnd:
318315
self._update_button_label(window_btn)
319316
window_btn.update_icon(ignore_cache=True)
320-
321-
if self._has_number_of_windows_changed():
322-
for window_btn in self._window_buttons:
323-
try:
324-
window = self._komorebi_windows[window_btn.window_index]
325-
except IndexError:
326-
self._try_remove_window_button(window_btn.window_index)
327-
self._add_or_update_buttons()
328317

329-
if self._show_only_stack:
330-
if len(self._window_buttons) <= 1:
331-
self._widget_container.hide()
332-
else:
333-
self._widget_container.show()
318+
if self._show_only_stack and len(self._window_buttons) <= 1:
319+
self.hide()
320+
else:
321+
self.show()
334322

335323
else:
336324
self._show_no_window_text()
@@ -349,16 +337,15 @@ def _update_komorebi_state(self, komorebi_state: dict) -> bool:
349337
self._komorebi_screen = self._komorebic.get_screen_by_hwnd(self._komorebi_state, self._screen_hwnd)
350338
focused_workspace = self._komorebic.get_focused_workspace(self._komorebi_screen)
351339
focused_container = self._komorebic.get_focused_container(focused_workspace, get_monocle=True)
352-
self._komorebi_focus_container = focused_container
353340
self._komorebi_windows = self._komorebic.get_windows(focused_container)
354341
focused_window = self._komorebic.get_focused_window(focused_container)
355342

356343
if focused_workspace:
357344
self._prev_workspace_index = self._curr_workspace_index
358345
self._curr_workspace_index = focused_workspace['index']
359346
if focused_container:
360-
self._prev_container_index = self._curr_container_index
361-
self._curr_container_index = focused_container['index']
347+
self._prev_focus_container = self._curr_focus_container
348+
self._curr_focus_container = focused_container
362349
if focused_window:
363350
self._prev_window_index = self._curr_window_index
364351
self._curr_window_index = focused_window['index']
@@ -369,14 +356,11 @@ def _update_komorebi_state(self, komorebi_state: dict) -> bool:
369356
except TypeError:
370357
return False
371358

372-
def _has_number_of_windows_changed(self):
373-
return self._prev_num_windows != self._curr_num_windows and not self._has_active_container_index_changed() and not self._has_active_workspace_index_changed()
374-
375359
def _has_active_window_index_changed(self):
376-
return self._prev_window_index != self._curr_window_index and not self._has_active_container_index_changed() and not self._has_active_workspace_index_changed()
360+
return self._prev_window_index != self._curr_window_index and not self._has_active_container_changed() and not self._has_active_workspace_index_changed()
377361

378-
def _has_active_container_index_changed(self):
379-
return self._prev_container_index != self._curr_container_index and not self._has_active_workspace_index_changed()
362+
def _has_active_container_changed(self):
363+
return self._prev_focus_container != self._curr_focus_container and not self._has_active_workspace_index_changed()
380364

381365
def _has_active_workspace_index_changed(self):
382366
return self._prev_workspace_index != self._curr_workspace_index
@@ -429,7 +413,7 @@ def _add_or_update_buttons(self) -> None:
429413
self._update_button_status(window_btn)
430414

431415
def _get_window_label(self, window_index):
432-
window = self._komorebic.get_window_by_index(self._komorebi_focus_container, window_index)
416+
window = self._komorebic.get_window_by_index(self._curr_focus_container, window_index)
433417
w_index = window_index if self._label_zero_index else window_index + 1
434418
process_name = window['exe'].removesuffix('.exe').removesuffix('.EXE')
435419
default_label = self._label_window.format(
@@ -464,7 +448,8 @@ def _try_add_window_button(self, window_index: int) -> WindowButton:
464448

465449
def _try_remove_window_button(self, window_index: int) -> None:
466450
with suppress(IndexError):
467-
self._window_buttons[window_index].hide()
451+
self._window_buttons[window_index].setParent(None)
452+
self._widget_container_layout.removeWidget(self._window_buttons[window_index])
468453
self._window_buttons.pop(window_index)
469454

470455
def _show_offline_status(self):
@@ -476,8 +461,11 @@ def _hide_offline_status(self):
476461
self._widget_container.show()
477462

478463
def _show_no_window_text(self):
479-
self._no_window_text.show()
480-
self._widget_container.hide()
464+
if self._no_window_text.text():
465+
self._no_window_text.show()
466+
self._widget_container.hide()
467+
else:
468+
self.hide()
481469

482470
def _hide_no_window_text(self):
483471
self._no_window_text.hide()
@@ -492,7 +480,7 @@ def wheelEvent(self, event):
492480
# Determine direction (consider reverse_scroll_direction setting)
493481
direction = -1 if (delta > 0) != self._reverse_scroll_direction else 1
494482

495-
windows = self._komorebic.get_windows(self._komorebi_focus_container)
483+
windows = self._komorebic.get_windows(self._curr_focus_container)
496484
if not windows:
497485
return
498486

0 commit comments

Comments
 (0)