From abf3e4b64ba4121e47308d52af6542cccea978b1 Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Mon, 24 Jun 2024 18:06:49 +0200 Subject: [PATCH] Fix launcher mem leak --- src/Launcher.vala | 26 ++++++++++++++++++++------ src/LauncherManager.vala | 2 ++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/Launcher.vala b/src/Launcher.vala index 9b9c8210..abdb4a9e 100644 --- a/src/Launcher.vala +++ b/src/Launcher.vala @@ -40,6 +40,8 @@ public class Dock.Launcher : Gtk.Box { private Gtk.Overlay overlay; private Gtk.PopoverMenu popover; + private Binding current_count_binding; + private int drag_offset_x = 0; private int drag_offset_y = 0; @@ -188,7 +190,7 @@ public class Dock.Launcher : Gtk.Box { settings.bind ("icon-size", image, "pixel-size", DEFAULT); app.bind_property ("count-visible", badge_revealer, "reveal-child", SYNC_CREATE); - app.bind_property ("current_count", badge, "label", SYNC_CREATE, + current_count_binding = app.bind_property ("current_count", badge, "label", SYNC_CREATE, (binding, srcval, ref targetval) => { var src = (int64) srcval; @@ -209,16 +211,18 @@ public class Dock.Launcher : Gtk.Box { add_controller (drop_target_file); drop_target_file.enter.connect ((x, y) => { - if (launcher_manager.added_launcher != null) { - calculate_dnd_move (launcher_manager.added_launcher, x, y); + var _launcher_manager = LauncherManager.get_default (); + if (_launcher_manager.added_launcher != null) { + calculate_dnd_move (_launcher_manager.added_launcher, x, y); } return COPY; }); drop_target_file.drop.connect (() => { - if (launcher_manager.added_launcher != null) { - launcher_manager.added_launcher.moving = false; - launcher_manager.added_launcher = null; + var _launcher_manager = LauncherManager.get_default (); + if (_launcher_manager.added_launcher != null) { + _launcher_manager.added_launcher.moving = false; + _launcher_manager.added_launcher = null; } }); } @@ -228,6 +232,16 @@ public class Dock.Launcher : Gtk.Box { popover.dispose (); } + /** + * If the launcher isn't needed anymore call this otherwise it won't be freed. + */ + public void cleanup () { + timed_animation = null; + bounce_down = null; + bounce_up = null; + current_count_binding.unbind (); + } + private void on_click_released (int n_press, double x, double y) { var event_display = gesture_click.get_current_event ().get_display (); var context = event_display.get_app_launch_context (); diff --git a/src/LauncherManager.vala b/src/LauncherManager.vala index 94dd638b..23491846 100644 --- a/src/LauncherManager.vala +++ b/src/LauncherManager.vala @@ -191,6 +191,8 @@ resize_animation.value_from = get_width (); resize_animation.value_to = launchers.length () * get_launcher_size (); resize_animation.play (); + + launcher.cleanup (); } private void update_launcher_entry (string sender_name, GLib.Variant parameters, bool is_retry = false) {