Re: [evolution-patches] patch for crash in alarm notify
- From: Rodrigo Moya <rodrigo novell com>
- To: Evolution Patches <evolution-patches lists ximian com>
- Subject: Re: [evolution-patches] patch for crash in alarm notify
- Date: Thu, 03 Mar 2005 19:56:03 +0100
On Mon, 2005-02-28 at 13:16 +0100, Rodrigo Moya wrote:
> This removes use of g_assert and does a better management of the
> midnight_refresh
discard this one, this fix is now included in the attached patch, which
also fixes #72835 (crash in alarm daemon)
--
Rodrigo Moya <rodrigo novell com>
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/calendar/ChangeLog,v
retrieving revision 1.2680
diff -u -p -r1.2680 ChangeLog
--- ChangeLog 1 Mar 2005 01:14:56 -0000 1.2680
+++ ChangeLog 3 Mar 2005 18:56:52 -0000
@@ -1,3 +1,16 @@
+2005-xx-xx Rodrigo Moya <rodrigo novell com>
+
+ Fixes #72835
+
+ * gui/alarm-notify/alarm-notify-dialog.[ch] (alarm_notify_dialog):
+ changed to return the dialog we create, and to run in the background.
+
+ * gui/alarm-notify/alarm-queue.c (alarm_queue_done): don't g_assert,
+ just check for midnight_refresh pointer, and clear it up if not NULL.
+ (queue_midnight_refresh): ditto.
+ (open_alarm_dialog): store the dialog returned by alarm_notify_dialog().
+ (tray_icon_destroyed_cb): destroy the dialog if still around.
+
2005-02-28 Harish Krishnaswamy <kharish novell com>
Fixes #69556
Index: gui/alarm-notify/alarm-notify-dialog.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/alarm-notify/alarm-notify-dialog.c,v
retrieving revision 1.32
diff -u -p -r1.32 alarm-notify-dialog.c
--- gui/alarm-notify/alarm-notify-dialog.c 17 Dec 2004 18:03:22 -0000 1.32
+++ gui/alarm-notify/alarm-notify-dialog.c 3 Mar 2005 18:56:52 -0000
@@ -81,6 +81,35 @@ an_update_minutes_label (GtkSpinButton *
g_free (new_label);
}
+static void
+dialog_response_cb (GtkDialog *dialog, guint response_id, gpointer user_data)
+{
+ int snooze_timeout;
+ AlarmNotify *an = user_data;
+
+ switch (response_id) {
+ case AN_RESPONSE_EDIT:
+ (* an->func) (ALARM_NOTIFY_EDIT, -1, an->func_data);
+ break;
+ case AN_RESPONSE_SNOOZE:
+ snooze_timeout = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (an->snooze_time));
+ (* an->func) (ALARM_NOTIFY_SNOOZE, snooze_timeout, an->func_data);
+ break;
+ case GTK_RESPONSE_CLOSE:
+ case GTK_RESPONSE_DELETE_EVENT:
+ break;
+ }
+}
+
+static void
+dialog_destroyed_cb (GtkWidget *dialog, gpointer user_data)
+{
+ AlarmNotify *an = user_data;
+
+ g_object_unref (an->xml);
+ g_free (an);
+}
+
/**
* alarm_notify_dialog:
* @trigger: Trigger time for the alarm.
@@ -96,9 +125,9 @@ an_update_minutes_label (GtkSpinButton *
* Runs the alarm notification dialog. The specified @func will be used to
* notify the client about result of the actions in the dialog.
*
- * Return value: a pointer to the dialog structure if successful or NULL if an error occurs.
+ * Return value: a pointer to the dialog widget created or NULL if there is an error.
**/
-void
+GtkWidget *
alarm_notify_dialog (time_t trigger, time_t occur_start, time_t occur_end,
ECalComponentVType vtype, const char *summary,
const char *description, const char *location,
@@ -111,17 +140,15 @@ alarm_notify_dialog (time_t trigger, tim
char *start, *end;
char *icon_path;
GList *icon_list;
- int snooze_timeout;
- g_return_if_fail (trigger != -1);
+ g_return_val_if_fail (trigger != -1, NULL);
/* Only VEVENTs or VTODOs can have alarms */
- g_return_if_fail (vtype == E_CAL_COMPONENT_EVENT
- || vtype == E_CAL_COMPONENT_TODO);
- g_return_if_fail (summary != NULL);
- g_return_if_fail (description != NULL);
- g_return_if_fail (location != NULL);
- g_return_if_fail (func != NULL);
+ g_return_val_if_fail (vtype == E_CAL_COMPONENT_EVENT || vtype == E_CAL_COMPONENT_TODO, NULL);
+ g_return_val_if_fail (summary != NULL, NULL);
+ g_return_val_if_fail (description != NULL, NULL);
+ g_return_val_if_fail (location != NULL, NULL);
+ g_return_val_if_fail (func != NULL, NULL);
an = g_new0 (AlarmNotify, 1);
@@ -132,7 +159,7 @@ alarm_notify_dialog (time_t trigger, tim
if (!an->xml) {
g_message ("alarm_notify_dialog(): Could not load the Glade XML file!");
g_free (an);
- return;
+ return NULL;
}
an->dialog = glade_xml_get_widget (an->xml, "alarm-notify");
@@ -149,7 +176,7 @@ alarm_notify_dialog (time_t trigger, tim
g_message ("alarm_notify_dialog(): Could not find all widgets in Glade file!");
g_object_unref (an->xml);
g_free (an);
- return;
+ return NULL;
}
gtk_widget_realize (an->dialog);
@@ -199,20 +226,9 @@ alarm_notify_dialog (time_t trigger, tim
g_list_free (icon_list);
}
- switch (gtk_dialog_run (GTK_DIALOG (an->dialog))) {
- case AN_RESPONSE_EDIT:
- (* an->func) (ALARM_NOTIFY_EDIT, -1, an->func_data);
- break;
- case AN_RESPONSE_SNOOZE:
- snooze_timeout = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (an->snooze_time));
- (* an->func) (ALARM_NOTIFY_SNOOZE, snooze_timeout, an->func_data);
- break;
- case GTK_RESPONSE_CLOSE:
- case GTK_RESPONSE_DELETE_EVENT:
- break;
- }
- gtk_widget_destroy (an->dialog);
-
- g_object_unref (an->xml);
- g_free (an);
+ g_signal_connect (G_OBJECT (an->dialog), "response", G_CALLBACK (dialog_response_cb), an);
+ g_signal_connect (G_OBJECT (an->dialog), "destroy", G_CALLBACK (dialog_destroyed_cb), an);
+ gtk_widget_show (an->dialog);
+
+ return an->dialog;
}
Index: gui/alarm-notify/alarm-notify-dialog.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/alarm-notify/alarm-notify-dialog.h,v
retrieving revision 1.11
diff -u -p -r1.11 alarm-notify-dialog.h
--- gui/alarm-notify/alarm-notify-dialog.h 23 Nov 2004 06:24:57 -0000 1.11
+++ gui/alarm-notify/alarm-notify-dialog.h 3 Mar 2005 18:56:52 -0000
@@ -24,6 +24,7 @@
#include <time.h>
#include <glib.h>
#include <libecal/e-cal-component.h>
+#include <gtk/gtkwidget.h>
@@ -35,10 +36,10 @@ typedef enum {
typedef void (* AlarmNotifyFunc) (AlarmNotifyResult result, int snooze_mins, gpointer data);
-void alarm_notify_dialog (time_t trigger, time_t occur_start, time_t occur_end,
- ECalComponentVType vtype, const char *summary,
- const char *description, const char *location,
- AlarmNotifyFunc func, gpointer func_data);
+GtkWidget *alarm_notify_dialog (time_t trigger, time_t occur_start, time_t occur_end,
+ ECalComponentVType vtype, const char *summary,
+ const char *description, const char *location,
+ AlarmNotifyFunc func, gpointer func_data);
#endif
Index: gui/alarm-notify/alarm-queue.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/alarm-notify/alarm-queue.c,v
retrieving revision 1.79
diff -u -p -r1.79 alarm-queue.c
--- gui/alarm-notify/alarm-queue.c 22 Dec 2004 07:37:25 -0000 1.79
+++ gui/alarm-notify/alarm-queue.c 3 Mar 2005 18:56:52 -0000
@@ -147,7 +147,10 @@ queue_midnight_refresh (void)
time_t midnight;
icaltimezone *zone;
- g_assert (midnight_refresh_id == NULL);
+ if (midnight_refresh_id != NULL) {
+ alarm_remove (midnight_refresh_id);
+ midnight_refresh_id = NULL;
+ }
zone = config_data_get_timezone ();
@@ -180,7 +183,11 @@ midnight_refresh_cb (gpointer alarm_id,
/* Re-schedule the midnight update */
- midnight_refresh_id = NULL;
+ if (midnight_refresh_id != NULL) {
+ alarm_remove (midnight_refresh_id);
+ midnight_refresh_id = NULL;
+ }
+
queue_midnight_refresh ();
}
@@ -781,6 +788,11 @@ tray_icon_destroyed_cb (GtkWidget *tray,
if (tray_data->cqa != NULL)
remove_queued_alarm (tray_data->cqa, tray_data->alarm_id, TRUE, TRUE);
+ if (tray_data->alarm_dialog != NULL) {
+ gtk_widget_destroy (tray_data->alarm_dialog);
+ tray_data->alarm_dialog = NULL;
+ }
+
if (tray_data->summary != NULL) {
g_free (tray_data->summary);
tray_data->summary = NULL;
@@ -818,14 +830,14 @@ open_alarm_dialog (TrayIconData *tray_da
qa = lookup_queued_alarm (tray_data->cqa, tray_data->alarm_id);
if (qa) {
gtk_widget_hide (tray_data->tray_icon);
- alarm_notify_dialog (tray_data->trigger,
- qa->instance->occur_start,
- qa->instance->occur_end,
- e_cal_component_get_vtype (tray_data->comp),
- tray_data->summary,
- tray_data->description,
- tray_data->location,
- notify_dialog_cb, tray_data);
+ tray_data->alarm_dialog = alarm_notify_dialog (tray_data->trigger,
+ qa->instance->occur_start,
+ qa->instance->occur_end,
+ e_cal_component_get_vtype (tray_data->comp),
+ tray_data->summary,
+ tray_data->description,
+ tray_data->location,
+ notify_dialog_cb, tray_data);
}
return TRUE;
@@ -1257,9 +1269,10 @@ alarm_queue_done (void)
g_hash_table_destroy (client_alarms_hash);
client_alarms_hash = NULL;
- g_assert (midnight_refresh_id != NULL);
- alarm_remove (midnight_refresh_id);
- midnight_refresh_id = NULL;
+ if (midnight_refresh_id != NULL) {
+ alarm_remove (midnight_refresh_id);
+ midnight_refresh_id = NULL;
+ }
alarm_queue_inited = FALSE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]