From eb1bb493a771f9c8043fea7ce3daa15680d28999 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 29 Jul 2024 15:24:18 +0530 Subject: [PATCH] Ensure icon cache is cleared at exit --- kittens/notify/main.go | 4 +++- kitty/notifications.py | 9 ++++++++- kitty_tests/notifications.py | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/kittens/notify/main.go b/kittens/notify/main.go index 920e8e091..528ce032a 100644 --- a/kittens/notify/main.go +++ b/kittens/notify/main.go @@ -237,7 +237,9 @@ func (p *parsed_data) load_image_data() (err error) { } defer f.Close() _, imgfmt, err := image.DecodeConfig(f) - f.Seek(0, io.SeekStart) + if _, err = f.Seek(0, io.SeekStart); err != nil { + return err + } if err == nil && imgfmt != "" && strings.Contains("jpeg jpg gif png", strings.ToLower(imgfmt)) { p.image_data, err = io.ReadAll(f) return diff --git a/kitty/notifications.py b/kitty/notifications.py index 3427eb531..e77b8ee7c 100644 --- a/kitty/notifications.py +++ b/kitty/notifications.py @@ -671,7 +671,8 @@ class NotificationManager: channel: Channel = Channel(), log: Log = Log(), debug: bool = False, - base_cache_dir: str = '' + base_cache_dir: str = '', + cleanup_at_exit: bool = True, ): global debug_desktop_integration debug_desktop_integration = debug @@ -693,6 +694,9 @@ class NotificationManager: except Exception as e: self.log(f'Failed to load {script_path} with error: {e}') self.reset() + if cleanup_at_exit: + import atexit + atexit.register(self.cleanup) def reset(self) -> None: self.icon_data_cache.clear() @@ -892,3 +896,6 @@ class NotificationManager: parts = raw.split(';', 1) n.title, n.body = parts[0], (parts[1] if len(parts) > 1 else '') self.notify_with_command(n, channel_id) + + def cleanup(self) -> None: + del self.icon_data_cache diff --git a/kitty_tests/notifications.py b/kitty_tests/notifications.py index cb4c2be96..723460b34 100644 --- a/kitty_tests/notifications.py +++ b/kitty_tests/notifications.py @@ -90,7 +90,7 @@ class NotificationManager(NotificationManager): def do_test(self: 'TestNotifications', tdir: str) -> None: di = DesktopIntegration(None) ch = Channel() - nm = NotificationManager(di, ch, lambda *a, **kw: None, base_cache_dir=tdir) + nm = NotificationManager(di, ch, lambda *a, **kw: None, base_cache_dir=tdir, cleanup_at_exit=False) di.notification_manager = nm def reset():