PSPPIRE: Avoid memory leaks from popup memnus
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 27 Jun 2020 05:27:25 +0000 (07:27 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 27 Jun 2020 05:27:25 +0000 (07:27 +0200)
src/ui/gui/psppire-data-sheet.c
src/ui/gui/psppire-variable-sheet.c

index 83bc892e15ceadcb54346de4d037ac81c1bb86bc..c5ea4b644ae9fff50c48d4564ea8935270486f56 100644 (file)
@@ -163,6 +163,10 @@ create_data_row_header_popup_menu (PsppireDataSheet *sheet)
 {
   GtkWidget *menu = gtk_menu_new ();
 
+  /* gtk_menu_shell_append does not sink/ref this object,
+     so we must do it ourselves (and remember to unref it).  */
+  g_object_ref_sink (menu);
+
   GtkWidget *item =
     gtk_menu_item_new_with_mnemonic  (_("_Insert Case"));
 
@@ -288,13 +292,15 @@ psppire_data_sheet_delete_variables (PsppireDataSheet *sheet)
   gtk_widget_queue_draw (GTK_WIDGET (sheet));
 }
 
-
-
 static GtkWidget *
 create_data_column_header_popup_menu (PsppireDataSheet *sheet)
 {
   GtkWidget *menu = gtk_menu_new ();
 
+  /* gtk_menu_shell_append does not sink/ref this object,
+     so we must do it ourselves (and remember to unref it).  */
+  g_object_ref_sink (menu);
+
   GtkWidget *item =
     gtk_menu_item_new_with_mnemonic  (_("_Insert Variable"));
   g_signal_connect_swapped (item, "activate", G_CALLBACK (insert_new_variable),
@@ -345,13 +351,16 @@ static gboolean dispose_has_run = FALSE;
 static void
 psppire_data_sheet_dispose (GObject *obj)
 {
-  //  PsppireDataSheet *sheet = PSPPIRE_DATA_SHEET (obj);
+  PsppireDataSheet *sheet = PSPPIRE_DATA_SHEET (obj);
 
   if (dispose_has_run)
     return;
 
   dispose_has_run = TRUE;
 
+  g_object_unref (sheet->data_sheet_cases_column_popup);
+  g_object_unref (sheet->data_sheet_cases_row_popup);
+
   /* Chain up to the parent class */
   G_OBJECT_CLASS (parent_class)->dispose (obj);
 }
index 149403743aa16fe5404a1212b5ee02271708a5d2..05c3aaf5dab6ef0a76040b1a3fd25f588315f1a0 100644 (file)
@@ -266,6 +266,10 @@ create_var_row_header_popup_menu (PsppireVariableSheet *var_sheet)
 {
   GtkWidget *menu = gtk_menu_new ();
 
+  /* gtk_menu_shell_append does not sink/ref this object,
+     so we must do it ourselves (and remember to unref it).  */
+  g_object_ref_sink (menu);
+
   GtkWidget *item =
     gtk_menu_item_new_with_mnemonic  (_("_Insert Variable"));
   g_signal_connect_swapped (item, "activate", G_CALLBACK (insert_new_variable_var),
@@ -432,6 +436,7 @@ psppire_variable_sheet_dispose (GObject *obj)
   g_object_unref (sheet->value_label_renderer);
   g_object_unref (sheet->missing_values_renderer);
   g_object_unref (sheet->var_type_renderer);
+  g_object_unref (sheet->row_popup);
 
   /* Chain up to the parent class */
   G_OBJECT_CLASS (parent_class)->dispose (obj);
@@ -593,7 +598,6 @@ psppire_variable_sheet_init (PsppireVariableSheet *sheet)
 
   sheet->row_popup = create_var_row_header_popup_menu (sheet);
 
-
   g_signal_connect (sheet, "selection-changed",
                    G_CALLBACK (set_var_popup_sensitivity), sheet);