summaryrefslogtreecommitdiff
path: root/mate-panel/panel-toplevel.c
diff options
context:
space:
mode:
authormonsta <[email protected]>2019-05-07 17:26:50 +0300
committermonsta <[email protected]>2019-05-20 16:10:30 +0300
commitd03b63c4241ed8a8f2be15d05b15db36b871edc3 (patch)
tree765d19deea80ef5d475df03e70344fa2662f8d62 /mate-panel/panel-toplevel.c
parent8d4877daa8e1b27bbd38b766decbbac7be9d141e (diff)
downloadmate-panel-d03b63c4241ed8a8f2be15d05b15db36b871edc3.tar.bz2
mate-panel-d03b63c4241ed8a8f2be15d05b15db36b871edc3.tar.xz
fix random crashes on panel reset
- unref objects in toplevel's dispose function instead of finalize - disconnect from toplevel's GSettings objects before deleting them
Diffstat (limited to 'mate-panel/panel-toplevel.c')
-rw-r--r--mate-panel/panel-toplevel.c84
1 files changed, 43 insertions, 41 deletions
diff --git a/mate-panel/panel-toplevel.c b/mate-panel/panel-toplevel.c
index 0b338d07..83dfd59d 100644
--- a/mate-panel/panel-toplevel.c
+++ b/mate-panel/panel-toplevel.c
@@ -246,6 +246,8 @@ static void panel_toplevel_calculate_animation_end_geometry(PanelToplevel *tople
static void panel_toplevel_update_monitor(PanelToplevel* toplevel);
static void panel_toplevel_set_monitor_internal(PanelToplevel* toplevel, int monitor, gboolean force_resize);
+static void panel_toplevel_drag_threshold_changed (PanelToplevel *toplevel);
+
static void
update_style_classes (PanelToplevel *toplevel)
{
@@ -3102,6 +3104,37 @@ panel_toplevel_dispose (GObject *widget)
{
PanelToplevel *toplevel = (PanelToplevel *) widget;
+ if (toplevel->priv->settings_path) {
+ g_free (toplevel->priv->settings_path);
+ toplevel->priv->settings_path = NULL;
+ }
+
+ if (toplevel->settings) {
+ g_signal_handlers_disconnect_by_data (toplevel->settings, toplevel);
+ g_object_unref (toplevel->settings);
+ toplevel->settings = NULL;
+ }
+
+ if (toplevel->queued_settings) {
+ g_object_unref (toplevel->queued_settings);
+ toplevel->queued_settings = NULL;
+ }
+
+ if (toplevel->background_settings) {
+ g_signal_handlers_disconnect_by_data (toplevel->background_settings, toplevel);
+ g_object_unref (toplevel->background_settings);
+ toplevel->background_settings = NULL;
+ }
+
+ if (toplevel->priv->gtk_settings) {
+ g_signal_handlers_disconnect_by_func (toplevel->priv->gtk_settings,
+ G_CALLBACK (panel_toplevel_drag_threshold_changed),
+ toplevel);
+ toplevel->priv->gtk_settings = NULL;
+
+ panel_background_free (&toplevel->background);
+ }
+
if (toplevel->priv->attached) {
panel_toplevel_disconnect_attached (toplevel);
toplevel->priv->attached = FALSE;
@@ -3110,6 +3143,16 @@ panel_toplevel_dispose (GObject *widget)
toplevel->priv->attach_widget = NULL;
}
+ if (toplevel->priv->description) {
+ g_free (toplevel->priv->description);
+ toplevel->priv->description = NULL;
+ }
+
+ if (toplevel->priv->name) {
+ g_free (toplevel->priv->name);
+ toplevel->priv->name = NULL;
+ }
+
panel_toplevel_disconnect_timeouts (toplevel);
G_OBJECT_CLASS (panel_toplevel_parent_class)->dispose (widget);
@@ -4252,47 +4295,6 @@ panel_toplevel_finalize (GObject *object)
toplevel_list = g_slist_remove (toplevel_list, toplevel);
- if (toplevel->priv->settings_path) {
- g_free (toplevel->priv->settings_path);
- toplevel->priv->settings_path = NULL;
- }
-
- if (toplevel->settings) {
- g_object_unref (toplevel->settings);
- toplevel->settings = NULL;
- }
-
- if (toplevel->background_settings) {
- g_object_unref (toplevel->background_settings);
- toplevel->background_settings = NULL;
- }
-
- if (toplevel->priv->gtk_settings) {
- g_signal_handlers_disconnect_by_func (toplevel->priv->gtk_settings,
- G_CALLBACK (panel_toplevel_drag_threshold_changed),
- toplevel);
- toplevel->priv->gtk_settings = NULL;
-
- panel_background_free (&toplevel->background);
- }
-
- if (toplevel->priv->attached) {
- panel_toplevel_disconnect_attached (toplevel);
-
- toplevel->priv->attached = FALSE;
-
- toplevel->priv->attach_toplevel = NULL;
- toplevel->priv->attach_widget = NULL;
- }
-
- if (toplevel->priv->description)
- g_free (toplevel->priv->description);
- toplevel->priv->description = NULL;
-
- if (toplevel->priv->name)
- g_free (toplevel->priv->name);
- toplevel->priv->name = NULL;
-
G_OBJECT_CLASS (panel_toplevel_parent_class)->finalize (object);
}