Expanded Player fix

This commit is contained in:
tr1x_em committed 2025-08-07 11:28:01 +05:30
1 parent 84af1ab3bc
commit d2db8883ab
2 files changed
+58 -25

No files matched your search

+46 -12
View File
@@ -244,6 +244,27 @@ class EmbeddedExpandedPlayer(Box):
finally:
super().destroy()
def _periodic_cleanup(self):
"""Light cleanup for EmbeddedExpandedPlayer reuse"""
try:
logger.debug("🧹 EmbeddedExpandedPlayer light cleanup starting")
# Only clean up the player content lightly
if hasattr(self, 'player_content') and hasattr(self.player_content, '_periodic_cleanup'):
self.player_content._periodic_cleanup()
# Clean global caches but don't destroy core functionality
global _artwork_cache
_artwork_cache.clear()
# Light garbage collection
gc.collect()
logger.debug("🧹 EmbeddedExpandedPlayer light cleanup completed")
except Exception as e:
logger.warning(f"Error during EmbeddedExpandedPlayer light cleanup: {e}")
class PlayerBoxStack(Box):
"""Memory-optimized widget that displays current player information."""
@@ -298,26 +319,39 @@ class PlayerBoxStack(Box):
self._cleanup_source_id = GLib.timeout_add_seconds(300, self._periodic_cleanup) # Every 5 minutes
def _periodic_cleanup(self):
"""Periodic cleanup to prevent memory leaks."""
"""Light cleanup for widget reuse - preserve functionality."""
try:
# Clean artwork cache
logger.debug("Starting light expanded player cleanup for reuse")
# Clean artwork cache to reduce memory
cleanup_artwork_cache()
# Remove destroyed widgets from tracking
destroyed_keys = []
for key, widget in self._player_widgets.items():
if not widget or not widget.get_parent():
destroyed_keys.append(key)
# Reset visual state but preserve connections and core functionality
# Only clear the player widgets that can be recreated
for widget in list(self._player_widgets.values()):
try:
if widget and hasattr(widget, "get_parent") and widget.get_parent():
# Only remove from parent, don't destroy (let GTK handle it)
widget.get_parent().remove(widget)
except Exception:
pass
# Don't clear the _player_widgets dict - just let them be recreated
for key in destroyed_keys:
if key in self._player_widgets:
del self._player_widgets[key]
# Reset stack to show no_media_box without destroying children
try:
if hasattr(self, 'player_stack') and hasattr(self, 'no_media_box'):
self.player_stack.set_visible_child(self.no_media_box)
self.current_stack_pos = 0
except Exception:
pass
# Force garbage collection
# Light garbage collection
gc.collect()
logger.debug("Light expanded player cleanup completed")
except Exception as e:
logger.warning(f"Error during periodic cleanup: {e}")
logger.warning(f"Error during light cleanup: {e}")
return True # Continue timer
+12 -13
View File
@@ -425,21 +425,20 @@ class ModusControlCenter(Window):
except Exception:
pass
# Clean up expanded player widget - BUT preserve for reuse
if self._expanded_player_widget and hasattr(
self._expanded_player_widget, "destroy"
):
# Clean up expanded player widget - aggressive cleanup for reuse
if self._expanded_player_widget:
try:
# DON'T destroy the widget, just clean its internal state
if hasattr(self._expanded_player_widget, 'player_content'):
# Clean up only the player content, keep the widget shell
if hasattr(self._expanded_player_widget.player_content, '_periodic_cleanup'):
self._expanded_player_widget.player_content._periodic_cleanup()
# Call cleanup directly on the player content (PlayerBoxStack)
if hasattr(self._expanded_player_widget, 'player_content') and \
hasattr(self._expanded_player_widget.player_content, '_periodic_cleanup'):
self._expanded_player_widget.player_content._periodic_cleanup()
# Also clean any EmbeddedExpandedPlayer specific state
if hasattr(self._expanded_player_widget, '_periodic_cleanup'):
self._expanded_player_widget._periodic_cleanup()
logger.debug("Cleaned expanded player internal state (preserved for reuse)")
# DON'T set to None - keep for reuse!
# self._expanded_player_widget = None
# self.expanded_player_widgets = None
# self.expanded_player_center_box = None
# DON'T destroy or set to None - keep for reuse!
except Exception as e:
logger.warning(f"Failed to clean expanded player state: {e}")