2005-03-04  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.
	(dialog_response_cb): response callback for the dialog.

	* 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.
	Also, traverse all clients with g_hash_table_foreach_remove.
	(free_client_alarms_cb, alarm_queue_remove_client, load_alarms): added
	missing cleanup code.
	(queue_midnight_refresh): don't g_assert, just check for midnigh_refresh
	pointer and clear it up if not NULL.
	(open_alarm_dialog): store the dialog returned by alarm_notify_dialog().
	(tray_icon_destroyed_cb): destroy the dialog if still around.

svn path=/trunk/; revision=28956
This commit is contained in:
Rodrigo Moya
2005-03-04 14:39:13 +00:00
committed by Rodrigo Moya
parent 255fb5979b
commit a45b33e0db
4 changed files with 127 additions and 54 deletions

View File

@ -1,3 +1,21 @@
2005-03-04 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.
(dialog_response_cb): response callback for the dialog.
* 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.
Also, traverse all clients with g_hash_table_foreach_remove.
(free_client_alarms_cb, alarm_queue_remove_client, load_alarms): added
missing cleanup code.
(queue_midnight_refresh): don't g_assert, just check for midnigh_refresh
pointer and clear it up if not NULL.
(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

View File

@ -81,6 +81,36 @@ an_update_minutes_label (GtkSpinButton *sb, gpointer data)
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:
(* an->func) (ALARM_NOTIFY_CLOSE, -1, an->func_data);
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 +126,9 @@ an_update_minutes_label (GtkSpinButton *sb, gpointer data)
* 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 +141,15 @@ alarm_notify_dialog (time_t trigger, time_t occur_start, time_t occur_end,
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 +160,7 @@ alarm_notify_dialog (time_t trigger, time_t occur_start, time_t occur_end,
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 +177,7 @@ alarm_notify_dialog (time_t trigger, time_t occur_start, time_t occur_end,
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 +227,9 @@ alarm_notify_dialog (time_t trigger, time_t occur_start, time_t occur_end,
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;
}

View File

@ -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

View File

@ -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, time_t trigger, gpointer data)
/* 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 ();
}
@ -408,6 +415,7 @@ load_alarms (ClientAlarms *ca, time_t start, time_t end)
/* create the live query */
if (ca->query) {
g_signal_handlers_disconnect_matched (ca->query, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, ca);
g_object_unref (ca->query);
ca->query = NULL;
}
@ -781,6 +789,11 @@ tray_icon_destroyed_cb (GtkWidget *tray, gpointer user_data)
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 +831,14 @@ open_alarm_dialog (TrayIconData *tray_data)
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;
@ -1227,15 +1240,32 @@ alarm_queue_init (void)
alarm_queue_inited = TRUE;
}
static void
static gboolean
free_client_alarms_cb (gpointer key, gpointer value, gpointer user_data)
{
ClientAlarms *ca = value;
if (ca) {
g_object_unref (ca->client);
remove_client_alarms (ca);
if (ca->client) {
g_signal_handlers_disconnect_matched (ca->client, G_SIGNAL_MATCH_DATA,
0, 0, NULL, NULL, ca);
g_object_unref (ca->client);
}
if (ca->query) {
g_signal_handlers_disconnect_matched (ca->query, G_SIGNAL_MATCH_DATA,
0, 0, NULL, NULL, ca);
g_object_unref (ca->query);
}
g_hash_table_destroy (ca->uid_alarms_hash);
g_free (ca);
return TRUE;
}
return FALSE;
}
/**
@ -1253,13 +1283,14 @@ alarm_queue_done (void)
/* All clients must be unregistered by now */
g_return_if_fail (g_hash_table_size (client_alarms_hash) == 0);
g_hash_table_foreach (client_alarms_hash, (GHFunc) free_client_alarms_cb, NULL);
g_hash_table_foreach_remove (client_alarms_hash, (GHRFunc) free_client_alarms_cb, NULL);
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;
}
@ -1373,13 +1404,19 @@ alarm_queue_remove_client (ECal *client)
/* Clean up */
g_signal_handlers_disconnect_matched (ca->client, G_SIGNAL_MATCH_DATA,
0, 0, NULL, NULL, ca);
if (ca->client) {
g_signal_handlers_disconnect_matched (ca->client, G_SIGNAL_MATCH_DATA,
0, 0, NULL, NULL, ca);
g_object_unref (ca->client);
ca->client = NULL;
}
g_object_unref (ca->query);
ca->query = NULL;
g_object_unref (ca->client);
ca->client = NULL;
if (ca->query) {
g_signal_handlers_disconnect_matched (ca->query, G_SIGNAL_MATCH_DATA,
0, 0, NULL, NULL, ca);
g_object_unref (ca->query);
ca->query = NULL;
}
g_hash_table_destroy (ca->uid_alarms_hash);
ca->uid_alarms_hash = NULL;