diff options
author | Chenthill Palanisamy <pchen@src.gnome.org> | 2006-01-25 18:48:16 +0800 |
---|---|---|
committer | Chenthill Palanisamy <pchen@src.gnome.org> | 2006-01-25 18:48:16 +0800 |
commit | ec86e3f4d5d20bd6ce273030f7f6201fa6cc9851 (patch) | |
tree | ec2fdc7652c058d0d4a0a2e24291ebbef72d3d96 /calendar/gui/alarm-notify/alarm-queue.c | |
parent | c31d93ccb23c2c7ba2faa82668d0a45a7bddf369 (diff) | |
download | gsoc2013-evolution-ec86e3f4d5d20bd6ce273030f7f6201fa6cc9851.tar.gz gsoc2013-evolution-ec86e3f4d5d20bd6ce273030f7f6201fa6cc9851.tar.zst gsoc2013-evolution-ec86e3f4d5d20bd6ce273030f7f6201fa6cc9851.zip |
fixes #325762
svn path=/trunk/; revision=31308
Diffstat (limited to 'calendar/gui/alarm-notify/alarm-queue.c')
-rw-r--r-- | calendar/gui/alarm-notify/alarm-queue.c | 328 |
1 files changed, 36 insertions, 292 deletions
diff --git a/calendar/gui/alarm-notify/alarm-queue.c b/calendar/gui/alarm-notify/alarm-queue.c index 0f15ce342d..73e6be43f9 100644 --- a/calendar/gui/alarm-notify/alarm-queue.c +++ b/calendar/gui/alarm-notify/alarm-queue.c @@ -102,6 +102,7 @@ static GList *tray_icons_list = NULL; /* Top Tray Image */ #ifndef USE_GTK_STATUS_ICON +static GtkWidget *tray_icon = NULL; static GtkWidget *tray_image = NULL; static GtkWidget *tray_event_box = NULL; #else @@ -964,27 +965,15 @@ open_alarm_dialog (TrayIconData *tray_data) qa = lookup_queued_alarm (tray_data->cqa, tray_data->alarm_id); if (qa) { - GdkPixbuf *pixbuf; - GtkTooltips *tooltips = gtk_tooltips_new (); - - pixbuf = e_icon_factory_get_icon ("stock_appointment-reminder", E_ICON_SIZE_LARGE_TOOLBAR); - -#ifndef USE_GTK_STATUS_ICON - gtk_image_set_from_pixbuf (GTK_IMAGE (tray_image), pixbuf); -#else - gtk_status_icon_set_from_pixbuf (tray_icon, pixbuf); -#endif - g_object_unref (pixbuf); if (tray_blink_id > -1) g_source_remove (tray_blink_id); tray_blink_id = -1; -#ifndef USE_GTK_STATUS_ICON - gtk_tooltips_set_tip (tooltips, tray_event_box, NULL, NULL); -#else - gtk_status_icon_set_tooltip (tray_icon, NULL); -#endif + gtk_widget_destroy (tray_icon); + tray_icon = NULL; + tray_image = NULL; + if (!alarm_notifications_dialog) alarm_notifications_dialog = notified_alarms_dialog_new (); @@ -1018,204 +1007,6 @@ open_alarm_dialog (TrayIconData *tray_data) return TRUE; } -static void -alarm_quit (EPopup *ep, EPopupItem *pitem, void *data) -{ - bonobo_main_quit (); -} - -static void -menu_item_toggle_callback (GtkToggleButton *item, void *data) -{ - gboolean state = gtk_toggle_button_get_active (item); - ESource *source = e_source_copy ((ESource *) data); - GSList *groups, *sel_groups, *p; - - if (e_source_get_uri ((ESource *)data)) { - g_free (e_source_get_uri (source)); - e_source_set_absolute_uri (source, g_strdup (e_source_get_uri ((ESource *)data))); - } - - if (state) { - const char *uid = e_source_peek_uid (source); - ESourceList *selected_cal = alarm_notify_get_selected_calendars (an); - ESourceList *all_cal; - ESourceGroup *group = NULL, *sel_group = NULL; - const char *grp_uid = NULL; - char * check_grp_uid = NULL; - ESource *source_got = NULL; - gboolean found_grp = FALSE; - - e_cal_get_sources (&all_cal, E_CAL_SOURCE_TYPE_EVENT, NULL); - - alarm_notify_add_calendar (an, E_CAL_SOURCE_TYPE_EVENT, source, FALSE); - - /* Browse the list of all calendars for the newly added calendar*/ - groups = e_source_list_peek_groups (all_cal); - for (p = groups; p != NULL; p = p->next) { - group = E_SOURCE_GROUP (p->data); - source_got = e_source_group_peek_source_by_uid (group, uid); - - if (source_got) { /* You have got the group */ - break; - } - } - - /* Ensure that the source is under some source group in all calendar list */ - if (group == NULL){ - g_warning ("Source Group selected is *NOT* in all calendar list"); - g_object_unref (all_cal); - return; - } - - /* Get the group id from the above */ - grp_uid = e_source_group_peek_uid (group); - - /* Look for the particular group in the original selected calendars list */ - sel_groups = e_source_list_peek_groups (selected_cal); - for (p = sel_groups; p != NULL; p = p->next) { - sel_group = E_SOURCE_GROUP (p->data); - check_grp_uid = g_strdup ((const char *)e_source_group_peek_uid (sel_group)); - if (!strcmp (grp_uid, check_grp_uid)) { - g_free (check_grp_uid); - found_grp = TRUE; - break; - } - g_free (check_grp_uid); - } - - if (found_grp != TRUE) { - g_warning ("Did not find the source group to add the source in the selected calendars"); - g_object_unref (all_cal); - return; - } - - e_source_group_add_source (sel_group, source, -1); - - g_object_unref (all_cal); - - } else { - const char *uid = e_source_peek_uid (source); - ESourceList *selected_cal = alarm_notify_get_selected_calendars (an); - alarm_notify_remove_calendar (an, E_CAL_SOURCE_TYPE_EVENT, e_source_get_uri (source)); - - /* Browse the calendar for alarms and remove the source */ - groups = e_source_list_peek_groups (selected_cal); - for (p = groups; p != NULL; p = p->next) { - ESourceGroup *group = E_SOURCE_GROUP (p->data); - ESource *del_source; - - del_source = e_source_group_peek_source_by_uid (group, uid); - if (del_source) { - e_source_group_remove_source_by_uid (group, uid); - break; - } - } - } - -} - -static GtkWidget * -populate () -{ - GtkWidget *frame = gtk_frame_new (NULL); - GtkWidget *label1 = gtk_label_new (NULL); - GtkWidget *box = gtk_vbox_new(FALSE, 0); - ESourceList *selected_cal = alarm_notify_get_selected_calendars (an); - GSList *groups; - GSList *p; - ESourceList *source_list; - - gtk_label_set_markup (GTK_LABEL(label1), _("<b>Calendars</b>")); - gtk_frame_set_label_widget (GTK_FRAME(frame), label1); - - if (!e_cal_get_sources (&source_list, E_CAL_SOURCE_TYPE_EVENT, NULL)) { - g_message (G_STRLOC ": Could not get the list of sources to load"); - - return NULL; - } - - groups = e_source_list_peek_groups (source_list); - - for (p = groups; p != NULL; p = p->next) { - ESourceGroup *group = E_SOURCE_GROUP (p->data); - char *txt = g_strdup_printf ("<b>%s</b>", e_source_group_peek_name (group)); - GtkWidget *item = gtk_label_new (NULL); - GSList *q; - GtkWidget *hbox, *image; - - hbox = gtk_hbox_new (FALSE, 0); - image = e_icon_factory_get_image ("stock_appointment-reminder", E_ICON_SIZE_SMALL_TOOLBAR); - - gtk_box_pack_start ((GtkBox *)hbox, image, FALSE, FALSE, 2); - gtk_box_pack_start ((GtkBox *)hbox, item, FALSE, FALSE, 2); - - gtk_label_set_markup (GTK_LABEL(item), txt); - gtk_label_set_justify (GTK_LABEL(item), GTK_JUSTIFY_LEFT); - g_free (txt); - - gtk_box_pack_start (GTK_BOX(box), hbox, TRUE, TRUE, 4); - gtk_widget_show_all (hbox); - - for (q = e_source_group_peek_sources (group); q != NULL; q = q->next) { - ESource *source = E_SOURCE (q->data); - GtkWidget *hbox = gtk_hbox_new (FALSE, 0); - GtkWidget *item = gtk_check_button_new_with_label (e_source_peek_name (source)); - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(item), e_source_list_peek_source_by_uid (selected_cal, e_source_peek_uid (source)) ? TRUE:FALSE); - - gtk_box_pack_start ((GtkBox *)hbox, item, FALSE, FALSE, 24); - gtk_object_set_data_full (GTK_OBJECT (item), "ESourceMenu", source, - (GtkDestroyNotify) g_object_unref); - - g_signal_connect (item, "toggled", G_CALLBACK (menu_item_toggle_callback), source); - - gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 2); - gtk_widget_show_all (hbox); - } - } - - gtk_container_add (GTK_CONTAINER(frame), box); - gtk_container_set_border_width (GTK_CONTAINER(frame), 6); - return frame; -} - -static void -alarm_pref_response (GtkWidget *widget, int response, gpointer dummy) -{ - gtk_widget_destroy (widget); -} - -static void -alarms_configure (EPopup *ep, EPopupItem *pitem, void *data) -{ - GtkWidget *box = populate (); - GtkWidget *dialog; - - dialog = gtk_dialog_new_with_buttons (_("Preferences"), - NULL,0, - GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, - GTK_STOCK_HELP, GTK_RESPONSE_HELP, - NULL); - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), box); - gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE); - g_signal_connect (dialog, "response", G_CALLBACK (alarm_pref_response), NULL); - gtk_widget_show_all (dialog); -} - -static EPopupItem tray_items[] = { - { E_POPUP_ITEM, "00.configure", N_("_Configure Alarms"), alarms_configure, NULL, GTK_STOCK_PREFERENCES }, - { E_POPUP_BAR , "10.bar" }, - { E_POPUP_ITEM, "10.quit", N_("_Quit"), alarm_quit, NULL, GTK_STOCK_QUIT }, -}; - -static void -tray_popup_free(EPopup *ep, GSList *items, void *data) -{ - g_slist_free(items); -} - static gint tray_icon_clicked_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { @@ -1230,42 +1021,14 @@ tray_icon_clicked_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_da return TRUE; } else if (event->button == 3) { - GtkMenu *menu; - GSList *menus = NULL; - EPopup *ep; - int i; - GdkPixbuf *pixbuf; - GtkTooltips *tooltips = gtk_tooltips_new (); - tray_blink_state = FALSE; - pixbuf = e_icon_factory_get_icon (tray_blink_state == TRUE ? - "stock_appointment-reminder-excl" : - "stock_appointment-reminder", - E_ICON_SIZE_LARGE_TOOLBAR); - -#ifndef USE_GTK_STATUS_ICON - gtk_image_set_from_pixbuf (GTK_IMAGE (tray_image), pixbuf); -#else - gtk_status_icon_set_from_pixbuf (tray_icon, pixbuf); -#endif - g_object_unref (pixbuf); - if (tray_blink_id > -1) g_source_remove (tray_blink_id); tray_blink_id = -1; -#ifndef USE_GTK_STATUS_ICON - gtk_tooltips_set_tip (tooltips, tray_event_box, NULL, NULL); -#else - gtk_status_icon_set_tooltip (tray_icon, NULL); -#endif - - ep = e_popup_new("org.gnome.evolution.alarmNotify.popup"); - for (i=0;i<sizeof(tray_items)/sizeof(tray_items[0]);i++) - menus = g_slist_prepend(menus, &tray_items[i]); - e_popup_add_items(ep, menus, NULL, tray_popup_free, tray_data); - menu = e_popup_create_menu_once(ep, NULL, 0); - gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event->button, event->time); + gtk_widget_destroy (tray_icon); + tray_icon = NULL; + tray_image = NULL; return TRUE; } @@ -1286,20 +1049,6 @@ icon_activated (GtkStatusIcon *icon) tray_icon_clicked_cb (NULL, &event, NULL); } - -static void -popup_menu (GtkStatusIcon *icon, - guint button, - guint32 activate_time) -{ - GdkEventButton event; - - event.type = GDK_BUTTON_PRESS; - event.button = button; - event.time = activate_time; - - tray_icon_clicked_cb (NULL, &event, NULL); -} #endif static gboolean @@ -1315,9 +1064,11 @@ tray_icon_blink_cb (gpointer data) E_ICON_SIZE_LARGE_TOOLBAR); #ifndef USE_GTK_STATUS_ICON - gtk_image_set_from_pixbuf (GTK_IMAGE (tray_image), pixbuf); + if (tray_icon && tray_image) + gtk_image_set_from_pixbuf (GTK_IMAGE (tray_image), pixbuf); #else - gtk_status_icon_set_from_pixbuf (tray_icon, pixbuf); + if (tray_icon) + gtk_status_icon_set_from_pixbuf (tray_icon, pixbuf); #endif g_object_unref (pixbuf); @@ -1333,7 +1084,7 @@ display_notification (time_t trigger, CompQueuedAlarms *cqa, ECalComponent *comp; const char *summary, *description, *location; #ifndef USE_GTK_STATUS_ICON - GtkWidget *tray_icon=NULL, *image=NULL; + GtkWidget *image=NULL; GtkTooltips *tooltips; #endif TrayIconData *tray_data; @@ -1378,8 +1129,27 @@ display_notification (time_t trigger, CompQueuedAlarms *cqa, /* create the tray icon */ #ifndef USE_GTK_STATUS_ICON + if (tray_icon == NULL) { + tray_icon = GTK_WIDGET (egg_tray_icon_new ("Evolution Alarm")); + tray_image = e_icon_factory_get_image ("stock_appointment-reminder", E_ICON_SIZE_LARGE_TOOLBAR); + tray_event_box = gtk_event_box_new (); + gtk_container_add (GTK_CONTAINER (tray_event_box), tray_image); + gtk_container_add (GTK_CONTAINER (tray_icon), tray_event_box); + g_signal_connect (G_OBJECT (tray_event_box), "button_press_event", + G_CALLBACK (tray_icon_clicked_cb), NULL); + gtk_widget_show_all (tray_icon); + } tooltips = gtk_tooltips_new (); + +#else + if (tray_icon == NULL) { + tray_icon = gtk_status_icon_new (); + gtk_status_icon_set_from_pixbuf (tray_icon, e_icon_factory_get_icon ("stock_appointment-reminder", E_ICON_SIZE_LARGE_TOOLBAR)); + g_signal_connect (G_OBJECT (tray_icon), "activate", + G_CALLBACK (icon_activated), NULL); + } #endif + current_zone = config_data_get_timezone (); alarm_str = timet_to_str_with_zone (trigger, current_zone); start_str = timet_to_str_with_zone (qa->instance->occur_start, current_zone); @@ -1425,7 +1195,7 @@ display_notification (time_t trigger, CompQueuedAlarms *cqa, #ifndef USE_GTK_STATUS_ICON gtk_tooltips_set_tip (GTK_TOOLTIPS (tooltips), tray_event_box, str, NULL); #else - gtk_status_icon_set_tooltip (tray_icon, NULL); + gtk_status_icon_set_tooltip (tray_icon, str); #endif } @@ -1447,7 +1217,7 @@ display_notification (time_t trigger, CompQueuedAlarms *cqa, if (tray_blink_id == -1) tray_blink_id = g_timeout_add (500, tray_icon_blink_cb, tray_data); } - } +} #ifdef HAVE_LIBNOTIFY static void @@ -1462,7 +1232,6 @@ popup_notification (time_t trigger, CompQueuedAlarms *cqa, char *str, *start_str, *end_str, *alarm_str, *time_str; icaltimezone *current_zone; ECalComponentOrganizer organiser; - char *filename; char *body; comp = cqa->alarms->comp; @@ -1471,8 +1240,6 @@ popup_notification (time_t trigger, CompQueuedAlarms *cqa, return; if (!notify_is_initted ()) notify_init("Evolution Alarm Notify"); - GdkPixbuf *icon = e_icon_factory_get_icon("stock_appointment-reminder", E_ICON_SIZE_DIALOG); - g_free (filename); /* get a sensible description for the event */ e_cal_component_get_summary (comp, &text); @@ -1509,10 +1276,9 @@ popup_notification (time_t trigger, CompQueuedAlarms *cqa, body = g_strdup_printf ("%s %s\n%s %s", _("Location:"), location, start_str, time_str); else body = g_strdup_printf ("%s %s", start_str, time_str); -} + } - NotifyNotification *n = notify_notification_new (summary, body, "", NULL); - notify_notification_set_icon_data_from_pixbuf (n, icon); + NotifyNotification *n = notify_notification_new (summary, body, "stock_appointment-reminder", NULL); if (!notify_notification_show(n, NULL)) g_warning ("Could not send notification to daemon\n"); @@ -1727,9 +1493,6 @@ check_midnight_refresh (gpointer user_data) void alarm_queue_init (gpointer data) { -#ifndef USE_GTK_STATUS_ICON - GtkWidget *tray_icon; -#endif an = data; g_return_if_fail (alarm_queue_inited == FALSE); @@ -1745,24 +1508,6 @@ alarm_queue_init (gpointer data) /* install timeout handler (every 30 mins) for not missing the midnight refresh */ g_timeout_add (1800000, (GSourceFunc) check_midnight_refresh, NULL); -#ifndef USE_GTK_STATUS_ICON - tray_icon = GTK_WIDGET (egg_tray_icon_new ("Evolution Alarm")); - tray_image = e_icon_factory_get_image ("stock_appointment-reminder", E_ICON_SIZE_LARGE_TOOLBAR); - tray_event_box = gtk_event_box_new (); - gtk_container_add (GTK_CONTAINER (tray_event_box), tray_image); - gtk_container_add (GTK_CONTAINER (tray_icon), tray_event_box); - g_signal_connect (G_OBJECT (tray_event_box), "button_press_event", - G_CALLBACK (tray_icon_clicked_cb), NULL); - gtk_widget_show_all (tray_icon); -#else - tray_icon = gtk_status_icon_new (); - gtk_status_icon_set_from_pixbuf (tray_icon, e_icon_factory_get_icon ("stock_appointment-reminder", E_ICON_SIZE_LARGE_TOOLBAR)); - g_signal_connect (G_OBJECT (tray_icon), "activate", - G_CALLBACK (icon_activated), NULL); - g_signal_connect (G_OBJECT (tray_icon), "popup-menu", - G_CALLBACK (popup_menu), NULL); -#endif - #ifdef HAVE_LIBNOTIFY notify_init("Evolution Alarms"); #endif @@ -1929,7 +1674,6 @@ alarm_queue_remove_client (ECal *client) remove_client_alarms (ca); /* Clean up */ - if (ca->client) { g_signal_handlers_disconnect_matched (ca->client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, ca); |