Fixes #72835
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:
committed by
Rodrigo Moya
parent
255fb5979b
commit
a45b33e0db
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user