From f6f4a73bcf229809c8b4ac13b0b74f8a95a0f67e Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Tue, 25 Jun 2013 14:33:21 +0200 Subject: Bug #641711 - Crash in remove_queued_alarm --- calendar/alarm-notify/alarm-queue.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/calendar/alarm-notify/alarm-queue.c b/calendar/alarm-notify/alarm-queue.c index c10dbe6a0b..93dfed9d64 100644 --- a/calendar/alarm-notify/alarm-queue.c +++ b/calendar/alarm-notify/alarm-queue.c @@ -684,6 +684,9 @@ remove_alarms (CompQueuedAlarms *cqa, GSList *l; debug (("Removing for %p", cqa)); + + tray_list_remove_cqa (cqa); + for (l = cqa->queued_alarms; l;) { QueuedAlarm *qa; @@ -1077,6 +1080,7 @@ typedef struct { ECalClientView *view; GdkPixbuf *image; GtkTreeIter iter; + gboolean is_in_tree; } TrayIconData; static void @@ -1194,10 +1198,11 @@ tray_list_remove_cqa_async (struct _tray_cqa_msg *msg) if (tray_data->cqa == cqa) { debug (("Found")); tray_icons_list = g_list_delete_link (tray_icons_list, tmp); - if (alarm_notifications_dialog) { + if (alarm_notifications_dialog && tray_data->is_in_tree) { model = gtk_tree_view_get_model ( GTK_TREE_VIEW (alarm_notifications_dialog->treeview)); gtk_list_store_remove (GTK_LIST_STORE (model), &(tray_data->iter)); + tray_data->is_in_tree = FALSE; } free_tray_icon_data (tray_data); } @@ -1217,10 +1222,11 @@ tray_list_remove_cqa_async (struct _tray_cqa_msg *msg) model = gtk_tree_view_get_model ( GTK_TREE_VIEW (alarm_notifications_dialog->treeview)); - gtk_tree_model_get_iter_first (model, &iter); - sel = gtk_tree_view_get_selection ( - GTK_TREE_VIEW (alarm_notifications_dialog->treeview)); - gtk_tree_selection_select_iter (sel, &iter); + if (gtk_tree_model_get_iter_first (model, &iter)) { + sel = gtk_tree_view_get_selection ( + GTK_TREE_VIEW (alarm_notifications_dialog->treeview)); + gtk_tree_selection_select_iter (sel, &iter); + } } } @@ -1255,6 +1261,11 @@ tray_list_remove_async (Message *msg) gboolean status; tray_icons_list = g_list_remove_link (tray_icons_list, list); + if (alarm_notifications_dialog && tray_data->is_in_tree) { + GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (alarm_notifications_dialog->treeview)); + gtk_list_store_remove (GTK_LIST_STORE (model), &tray_data->iter); + tray_data->is_in_tree = FALSE; + } status = remove_queued_alarm ( tray_data->cqa, tray_data->alarm_id, FALSE, TRUE); @@ -1350,6 +1361,7 @@ notify_dialog_cb (AlarmNotifyResult result, /* We can also use tray_data->iter */ if (gtk_tree_selection_get_selected (selection, &model, &iter)) { gtk_list_store_remove (GTK_LIST_STORE (model), &iter); + tray_data->is_in_tree = FALSE; if (!gtk_tree_model_get_iter_first (model, &iter)) { /* We removed the last one */ gtk_widget_destroy (alarm_notifications_dialog->dialog); @@ -1376,12 +1388,13 @@ notify_dialog_cb (AlarmNotifyResult result, break; case ALARM_NOTIFY_DISMISS: - if (alarm_notifications_dialog) { + if (alarm_notifications_dialog && tray_data->is_in_tree) { GtkTreeModel *model; model = gtk_tree_view_get_model ( GTK_TREE_VIEW (alarm_notifications_dialog->treeview)); gtk_list_store_remove (GTK_LIST_STORE (model), &tray_data->iter); + tray_data->is_in_tree = FALSE; } break; @@ -1462,6 +1475,8 @@ open_alarm_dialog (TrayIconData *tray_data) tray_data->location, notify_dialog_cb, tray_data); + tray_data->is_in_tree = TRUE; + gtk_tree_selection_select_iter ( selection, &tray_data->iter); @@ -1691,11 +1706,12 @@ display_notification (time_t trigger, tray_data->trigger = trigger; tray_data->cqa = cqa; tray_data->alarm_id = alarm_id; - tray_data->comp = g_object_ref (e_cal_component_clone (comp)); + tray_data->comp = e_cal_component_clone (comp); tray_data->cal_client = cqa->parent_client->cal_client; tray_data->view = g_object_ref (cqa->parent_client->view); tray_data->blink_state = FALSE; tray_data->snooze_set = FALSE; + tray_data->is_in_tree = FALSE; g_object_ref (tray_data->cal_client); /* Task to add tray_data to the global tray_icon_list */ -- cgit