[gnome-calendar] window: handle reissue of in-app notification



commit 91defe22defc6831ae70c77d9b1dd19051d25f8c
Author: Erick Pérez Castellanos <erick red gmail com>
Date:   Mon Feb 16 00:01:26 2015 -0500

    window: handle reissue of in-app notification
    
    For now we throw the first one away, and show the second. Eventually we
    could handle this better.

 data/ui/window.ui |    2 +-
 src/gcal-window.c |   64 ++++++++++++++++++++++++++++++----------------------
 2 files changed, 38 insertions(+), 28 deletions(-)
---
diff --git a/data/ui/window.ui b/data/ui/window.ui
index cbe9734..c598547 100644
--- a/data/ui/window.ui
+++ b/data/ui/window.ui
@@ -162,7 +162,7 @@
                         <property name="receives_default">True</property>
                         <property name="relief">none</property>
                         <property name="focus_on_click">False</property>
-                        <signal name="clicked" handler="hide_notification" object="GcalWindow" swapped="no"/>
+                        <signal name="clicked" handler="hide_notification" object="GcalWindow" 
swapped="yes"/>
                         <child>
                           <object class="GtkImage">
                             <property name="visible">True</property>
diff --git a/src/gcal-window.c b/src/gcal-window.c
index 7fa4d94..7937670 100644
--- a/src/gcal-window.c
+++ b/src/gcal-window.c
@@ -53,6 +53,7 @@ typedef struct
 {
   /* timeout ids */
   guint                save_geometry_timeout_id;
+  guint                notification_timeout;
 
   /* upper level widgets */
   GtkWidget           *main_box;
@@ -171,8 +172,8 @@ static void           create_notification                (GcalWindow          *w
                                                           gchar               *message,
                                                           gchar               *button_label);
 
-static void           hide_notification                  (GtkWidget           *button,
-                                                          gpointer             user_data);
+static void           hide_notification                  (GcalWindow          *window,
+                                                          GtkWidget           *button);
 
 /* calendar management */
 static void           add_source                         (GcalManager         *manager,
@@ -705,16 +706,20 @@ create_notification (GcalWindow *window,
 }
 
 static void
-hide_notification (GtkWidget *button,
-                   gpointer   user_data)
+hide_notification (GcalWindow *window,
+                   GtkWidget  *button)
 {
-  GcalWindowPrivate *priv;
-
-  priv = gcal_window_get_instance_private (GCAL_WINDOW (user_data));
-  gtk_revealer_set_reveal_child (GTK_REVEALER (priv->notification),
-                                 FALSE);
+  GcalWindowPrivate *priv = gcal_window_get_instance_private (window);
+  gtk_revealer_set_reveal_child (GTK_REVEALER (priv->notification), FALSE);
+  priv->notification_timeout = 0;
 }
 
+static gboolean
+hide_notification_scheduled (gpointer window)
+{
+  hide_notification (GCAL_WINDOW (window), NULL);
+  return FALSE;
+}
 
 static void
 add_source (GcalManager *manager,
@@ -1023,22 +1028,26 @@ edit_dialog_closed (GtkDialog *dialog,
       break;
 
     case GCAL_RESPONSE_DELETE_EVENT:
-      /* delete the event */
-      create_notification (GCAL_WINDOW (user_data),
-                           _("Event deleted"),
-                           _("Undo"));
-      gtk_revealer_set_reveal_child (GTK_REVEALER (priv->notification),
-                                     TRUE);
-
-      /* FIXME: this will crash if the notification is still open */
       if (priv->event_to_delete != NULL)
-        g_free (priv->event_to_delete);
+        {
+          gcal_manager_remove_event (priv->manager, priv->event_to_delete->source, 
priv->event_to_delete->event_component);
+          g_clear_pointer (&(priv->event_to_delete), g_free);
+
+          create_notification (GCAL_WINDOW (user_data), _("Another event deleted"), _("Undo"));
+        }
+      else
+        {
+          create_notification (GCAL_WINDOW (user_data), _("Event deleted"), _("Undo"));
+        }
+
+      gtk_revealer_set_reveal_child (GTK_REVEALER (priv->notification), TRUE);
+      if (priv->notification_timeout != 0)
+        g_source_remove (priv->notification_timeout);
+      priv->notification_timeout = g_timeout_add_seconds (5, hide_notification_scheduled, user_data);
 
       priv->event_to_delete = g_new0 (GcalEventData, 1);
-      priv->event_to_delete->source =
-        gcal_edit_dialog_get_source (edit_dialog);
-      priv->event_to_delete->event_component =
-        gcal_edit_dialog_get_component (edit_dialog);
+      priv->event_to_delete->source = gcal_edit_dialog_get_source (edit_dialog);
+      priv->event_to_delete->event_component = gcal_edit_dialog_get_component (edit_dialog);
 
       uuid = gcal_edit_dialog_get_event_uuid (edit_dialog);
       /* hide widget of the event */
@@ -1112,9 +1121,9 @@ search_bar_revealer_toggled (GObject    *object,
 }
 
 static void
-remove_event (GtkWidget       *notification,
-                          GParamSpec      *spec,
-                          gpointer         user_data)
+remove_event (GtkWidget  *notification,
+              GParamSpec *spec,
+              gpointer    user_data)
 {
   GcalWindowPrivate *priv;
 
@@ -1149,12 +1158,13 @@ undo_remove_event (GtkButton *button,
       widgets = gcal_view_get_children_by_uuid (GCAL_VIEW (priv->views[priv->active_view]), uuid);
       g_list_foreach (widgets, (GFunc) gtk_widget_show, NULL);
 
+      g_object_unref (priv->event_to_delete->event_component);
       g_clear_pointer (&(priv->event_to_delete), g_free);
       g_list_free (widgets);
       g_free (uuid);
 
-      gtk_revealer_set_reveal_child (GTK_REVEALER (priv->notification),
-                                     FALSE);
+      g_source_remove (priv->notification_timeout);
+      hide_notification (GCAL_WINDOW (user_data), NULL);
     }
 
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]