[Xfce4-commits] [apps/xfce4-notifyd] 02/29: Improve logging and integrate it in the UI

noreply at xfce.org noreply at xfce.org
Sun Jan 29 20:51:52 CET 2017


This is an automated email from the git hooks/post-receive script.

ochosi pushed a commit to branch master
in repository apps/xfce4-notifyd.

commit 5b358698c26cfb95d53a290e55c05c2b608bae4f
Author: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>
Date:   Sun Oct 16 23:53:36 2016 +0200

    Improve logging and integrate it in the UI
    
    Note: There may still be encoding issues and this is not feature-complete
---
 Makefile.am                                     |   4 +
 xfce4-notifyd-config/main.c                     | 109 ++++++-
 xfce4-notifyd-config/xfce4-notifyd-config.glade | 381 +++++++++++++++++-------
 xfce4-notifyd/xfce-notify-daemon.c              |  22 +-
 xfce4-notifyd/xfce-notify-log.c                 |  85 ++++--
 xfce4-notifyd/xfce-notify-log.h                 |  11 +-
 6 files changed, 466 insertions(+), 146 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index eca9772..db5381c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -28,6 +28,8 @@ xfce4_notifyd_xfce4_notifyd_SOURCES = \
 	xfce4-notifyd/xfce-notify-daemon.h \
 	xfce4-notifyd/xfce-notify-enum-types.c \
 	xfce4-notifyd/xfce-notify-enum-types.h \
+	xfce4-notifyd/xfce-notify-log.c \
+	xfce4-notifyd/xfce-notify-log.h \
 	xfce4-notifyd/xfce-notify-marshal.c \
 	xfce4-notifyd/xfce-notify-marshal.h \
 	xfce4-notifyd/xfce-notify-window.c \
@@ -35,6 +37,8 @@ xfce4_notifyd_xfce4_notifyd_SOURCES = \
 
 xfce4_notifyd_config_xfce4_notifyd_config_SOURCES = \
 	xfce4-notifyd-config/main.c \
+	xfce4-notifyd/xfce-notify-log.c \
+	xfce4-notifyd/xfce-notify-log.h \
 	xfce4-notifyd-config/xfce4-notifyd-config.ui.h
 
 common_cflags = \
diff --git a/xfce4-notifyd-config/main.c b/xfce4-notifyd-config/main.c
index 2e48891..4ab7562 100644
--- a/xfce4-notifyd-config/main.c
+++ b/xfce4-notifyd-config/main.c
@@ -36,6 +36,7 @@
 #include <libxfce4ui/libxfce4ui.h>
 #include <libnotify/notify.h>
 
+#include "xfce4-notifyd/xfce-notify-log.h"
 #include "xfce4-notifyd-config.ui.h"
 
 #define KNOWN_APPLICATIONS_PROP       "/applications/known_applications"
@@ -365,7 +366,6 @@ xfce4_notifyd_known_applications_changed (XfconfChannel *channel,
     GtkWidget *hbox;
     GtkWidget *label;
     GtkWidget *mute_switch;
-    GtkWidget *separator;
     GtkCallback func = listbox_remove_all;
     GPtrArray *known_applications;
     GPtrArray *muted_applications;
@@ -428,6 +428,89 @@ xfce4_notifyd_do_not_disturb_activated (GtkSwitch *do_not_disturb_switch,
     gtk_switch_set_active (GTK_SWITCH (do_not_disturb_switch), state);
 }
 
+
+static void
+xfce4_notifyd_log_activated (GtkSwitch *log_switch,
+                             gboolean state,
+                             gpointer user_data)
+{
+    GtkWidget *log_tab = user_data;
+
+    if (state == TRUE)
+        gtk_widget_show (log_tab);
+    else
+        gtk_widget_hide (log_tab);
+    gtk_switch_set_active (GTK_SWITCH (log_switch), state);
+}
+
+static void
+xfce4_notifyd_log_populate (GtkWidget *log_listbox)
+{
+    GKeyFile *notify_log;
+    GtkCallback func = listbox_remove_all;
+    gint i;
+
+    gtk_container_foreach (GTK_CONTAINER (log_listbox), func, log_listbox);
+    notify_log = xfce_notify_log_get();
+
+    if (notify_log) {
+        gchar **groups;
+        groups = g_key_file_get_groups (notify_log, NULL);
+
+        /* Do this asynchronously in a separate thread */
+        for (i = 0; groups && groups[i]; i += 1) {
+            GtkWidget *grid, *box;
+            GtkWidget *summary, *body, *app_icon, *expire_timeout;
+            const gchar *group = groups[i];
+            const char *format = "<b>\%s</b>";
+            const char *tooltip_format = "<b>\%s</b>: \%s";
+            char *markup;
+
+            markup = g_markup_printf_escaped (format, g_key_file_get_string (notify_log, group, "summary", NULL));
+            summary = gtk_label_new (NULL);
+            gtk_label_set_markup (GTK_LABEL (summary), markup);
+            gtk_label_set_xalign (GTK_LABEL (summary), 0);
+            g_free (markup);
+            body = gtk_label_new (g_key_file_get_string (notify_log, group, "body", NULL));
+            gtk_label_set_xalign (GTK_LABEL (body), 0);
+            gtk_label_set_ellipsize (GTK_LABEL (body), PANGO_ELLIPSIZE_END);
+            app_icon = gtk_image_new_from_icon_name (g_key_file_get_string (notify_log, group, "app_icon", NULL), GTK_ICON_SIZE_LARGE_TOOLBAR);
+            gtk_widget_set_margin_start (app_icon, 3);
+            expire_timeout = gtk_label_new (g_key_file_get_string (notify_log, group, "expire-timeout", NULL));
+            // TODO: actions and timeout are missing (timeout is only interesting for urgent messages) - do we need that?
+            grid = gtk_grid_new ();
+            gtk_grid_set_column_spacing (GTK_GRID (grid), 6);
+            gtk_grid_attach (GTK_GRID (grid), GTK_WIDGET (app_icon), 0, 0 , 1, 2);
+
+            /* Handle icon-only notifications */
+            if (g_strcmp0 (g_key_file_get_string (notify_log, group, "body", NULL), "") == 0) {
+                gtk_grid_attach (GTK_GRID (grid), GTK_WIDGET (summary), 1, 0, 1, 2);
+                gtk_widget_set_tooltip_text (grid, group);
+            }
+            else {
+                gtk_grid_attach (GTK_GRID (grid), GTK_WIDGET (summary), 1, 0, 1, 1);
+                gtk_grid_attach (GTK_GRID (grid), GTK_WIDGET (body), 1, 1, 1, 1);
+                markup = g_strdup_printf (tooltip_format, group, g_key_file_get_string (notify_log, group, "body", NULL));
+                gtk_widget_set_tooltip_markup (grid, markup);
+                g_free (markup);
+            }
+            gtk_list_box_insert (GTK_LIST_BOX (log_listbox), grid, -1);
+        }
+        g_key_file_free (notify_log);
+    }
+
+    gtk_widget_show_all (log_listbox);
+}
+
+static void xfce_notify_clear_log_button_clicked (GtkButton *button, gpointer user_data) {
+    GtkWidget *log_listbox = user_data;
+    GtkCallback func = listbox_remove_all;
+
+    /* Clear the log file and empty the listbox widget */
+    gtk_container_foreach (GTK_CONTAINER (log_listbox), func, log_listbox);
+    xfce_notify_log_clear();
+}
+
 static void xfce4_notifyd_show_help(GtkButton *button,
                                     GtkWidget *dialog)
 {
@@ -445,14 +528,21 @@ xfce4_notifyd_config_setup_dialog(GtkBuilder *builder)
     GtkWidget *theme_combo;
     GtkWidget *position_combo;
     GtkWidget *help_button;
+    GtkWidget *notify_notebook;
     GtkWidget *known_applications_scrolled_window;
     GtkWidget *known_applications_listbox;
     GtkWidget *placeholder_label;
     GtkWidget *do_not_disturb_switch;
     GtkWidget *do_not_disturb_info;
+    GtkWidget *log_switch;
+    GtkWidget *log_tab;
+    GtkWidget *log_scrolled_window;
+    GtkWidget *log_listbox;
+    GtkWidget *clear_log_button;
     GtkAdjustment *adj;
     GError *error = NULL;
     gchar *current_theme;
+    GKeyFile *notification_log;
 
     gtk_builder_connect_signals(builder, NULL);
 
@@ -544,6 +634,23 @@ xfce4_notifyd_config_setup_dialog(GtkBuilder *builder)
                       "property-changed::" KNOWN_APPLICATIONS_PROP,
                       G_CALLBACK (xfce4_notifyd_known_applications_changed), known_applications_listbox);
 
+    notify_notebook = GTK_WIDGET (gtk_builder_get_object (builder, "notify_notebook"));
+    log_tab = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notify_notebook), -1);
+    log_switch = GTK_WIDGET (gtk_builder_get_object (builder, "log_switch"));
+    xfconf_g_property_bind (channel, "/notification-log", G_TYPE_BOOLEAN,
+                            G_OBJECT (log_switch), "active");
+    g_signal_connect (G_OBJECT (log_switch), "state-set",
+                      G_CALLBACK (xfce4_notifyd_log_activated), log_tab);
+    log_scrolled_window = GTK_WIDGET (gtk_builder_get_object (builder, "log_scrolled_window"));
+    log_listbox = gtk_list_box_new ();
+    gtk_container_add (GTK_CONTAINER (log_scrolled_window), log_listbox);
+    gtk_list_box_set_header_func (GTK_LIST_BOX (log_listbox), display_header_func, NULL, NULL);
+    xfce4_notifyd_log_populate (log_listbox);
+
+    clear_log_button = GTK_WIDGET (gtk_builder_get_object (builder, "clear_log_button"));
+    g_signal_connect (G_OBJECT (clear_log_button), "clicked",
+                      G_CALLBACK (xfce_notify_clear_log_button_clicked), log_listbox);
+
     help_button = GTK_WIDGET(gtk_builder_get_object(builder, "help_btn"));
     g_signal_connect(G_OBJECT(help_button), "clicked",
                      G_CALLBACK(xfce4_notifyd_show_help), dlg);
diff --git a/xfce4-notifyd-config/xfce4-notifyd-config.glade b/xfce4-notifyd-config/xfce4-notifyd-config.glade
index 1f7e96c..08a25fb 100644
--- a/xfce4-notifyd-config/xfce4-notifyd-config.glade
+++ b/xfce4-notifyd-config/xfce4-notifyd-config.glade
@@ -17,6 +17,11 @@
     <property name="page_increment">0.10000000000000001</property>
     <property name="page_size">0.01</property>
   </object>
+  <object class="GtkImage" id="image2">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-clear</property>
+  </object>
   <object class="GtkListStore" id="model1">
     <columns>
       <!-- column-name gchararray -->
@@ -102,10 +107,191 @@
             <property name="can_focus">False</property>
             <property name="border_width">6</property>
             <child>
-              <object class="GtkNotebook" id="notebook1">
+              <object class="GtkNotebook" id="notify_notebook">
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <child>
+                  <object class="GtkGrid" id="grid3">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="margin_left">12</property>
+                    <property name="margin_right">12</property>
+                    <property name="margin_top">12</property>
+                    <property name="margin_bottom">12</property>
+                    <property name="row_spacing">6</property>
+                    <property name="column_spacing">12</property>
+                    <child>
+                      <object class="GtkSwitch" id="primary_switch">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="primary_label">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="tooltip_text" translatable="yes">By default the notification bubbles will be shown on the display on which the mouse pointer is located.</property>
+                        <property name="label" translatable="yes">Always show notifications on primary display</property>
+                        <property name="ellipsize">end</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="do_not_disturb_label">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="hexpand">True</property>
+                        <property name="label" translatable="yes">Do not disturb</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkSwitch" id="do_not_disturb">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkRevealer" id="do_not_disturb_info">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="transition_type">none</property>
+                        <property name="reveal_child">True</property>
+                        <child>
+                          <object class="GtkInfoBar" id="infobar1">
+                            <property name="visible">True</property>
+                            <property name="app_paintable">True</property>
+                            <property name="can_focus">False</property>
+                            <child internal-child="action_area">
+                              <object class="GtkButtonBox" id="infobar-action_area">
+                                <property name="can_focus">False</property>
+                                <property name="spacing">6</property>
+                                <property name="layout_style">start</property>
+                                <child>
+                                  <placeholder/>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child internal-child="content_area">
+                              <object class="GtkBox" id="infobar-content_area">
+                                <property name="name">8</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkBox" id="box1">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="spacing">18</property>
+                                    <child>
+                                      <object class="GtkImage" id="image1">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="icon_name">dialog-information-symbolic</property>
+                                        <property name="icon_size">1</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkLabel" id="label10">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="label" translatable="yes"><b>Currently no notifications are shown</b>
+except for messages marked as urgent.</property>
+                                        <property name="use_markup">True</property>
+                                        <property name="ellipsize">end</property>
+                                        <property name="xalign">0</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">0</property>
+                        <property name="width">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="log_label">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Enable notification log</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkSwitch" id="log_switch">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">2</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+                <child type="tab">
+                  <object class="GtkLabel" id="label11">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">General</property>
+                  </object>
+                  <packing>
+                    <property name="tab_fill">False</property>
+                  </packing>
+                </child>
+                <child>
                   <object class="GtkGrid" id="grid1">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
@@ -127,7 +313,7 @@
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
-                        <property name="top_attach">3</property>
+                        <property name="top_attach">4</property>
                       </packing>
                     </child>
                     <child>
@@ -141,7 +327,7 @@
                       </object>
                       <packing>
                         <property name="left_attach">0</property>
-                        <property name="top_attach">4</property>
+                        <property name="top_attach">5</property>
                         <property name="width">2</property>
                       </packing>
                     </child>
@@ -269,10 +455,36 @@
                       </object>
                       <packing>
                         <property name="left_attach">0</property>
+                        <property name="top_attach">4</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label13">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Fade out:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkSwitch" id="switch2">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="halign">end</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
                         <property name="top_attach">3</property>
                       </packing>
                     </child>
                   </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
                 </child>
                 <child type="tab">
                   <object class="GtkLabel" id="label6">
@@ -281,6 +493,7 @@
                     <property name="label" translatable="yes">Appearance</property>
                   </object>
                   <packing>
+                    <property name="position">1</property>
                     <property name="tab_fill">False</property>
                   </packing>
                 </child>
@@ -293,161 +506,101 @@
                     <property name="margin_top">12</property>
                     <property name="margin_bottom">12</property>
                     <child>
-                      <object class="GtkSwitch" id="do_not_disturb">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                      </object>
-                      <packing>
-                        <property name="left_attach">1</property>
-                        <property name="top_attach">0</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkLabel" id="label8">
+                      <object class="GtkLabel" id="label9">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="hexpand">True</property>
-                        <property name="label" translatable="yes">Do not disturb</property>
+                        <property name="margin_bottom">6</property>
+                        <property name="label" translatable="yes"><b>Show notifications for</b></property>
+                        <property name="use_markup">True</property>
                         <property name="xalign">0</property>
                       </object>
                       <packing>
                         <property name="left_attach">0</property>
                         <property name="top_attach">0</property>
+                        <property name="width">2</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkLabel" id="label9">
+                      <object class="GtkScrolledWindow" id="known_applications_scrolled_window">
                         <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="margin_top">12</property>
-                        <property name="margin_bottom">6</property>
+                        <property name="can_focus">True</property>
                         <property name="hexpand">True</property>
-                        <property name="label" translatable="yes"><b>Show notifications for</b></property>
-                        <property name="use_markup">True</property>
-                        <property name="xalign">0</property>
+                        <property name="vexpand">True</property>
+                        <property name="shadow_type">in</property>
                       </object>
                       <packing>
                         <property name="left_attach">0</property>
-                        <property name="top_attach">2</property>
+                        <property name="top_attach">1</property>
                         <property name="width">2</property>
                       </packing>
                     </child>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child type="tab">
+                  <object class="GtkLabel" id="label7">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Applications</property>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                    <property name="tab_fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkGrid" id="grid4">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="margin_left">12</property>
+                    <property name="margin_right">12</property>
+                    <property name="margin_top">12</property>
+                    <property name="margin_bottom">12</property>
+                    <property name="row_spacing">6</property>
                     <child>
-                      <object class="GtkRevealer" id="do_not_disturb_info">
+                      <object class="GtkScrolledWindow" id="log_scrolled_window">
                         <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="margin_top">6</property>
-                        <property name="margin_bottom">12</property>
-                        <property name="transition_type">none</property>
-                        <property name="reveal_child">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="hexpand">True</property>
+                        <property name="vexpand">True</property>
+                        <property name="shadow_type">in</property>
                         <child>
-                          <object class="GtkInfoBar" id="infobar1">
-                            <property name="visible">True</property>
-                            <property name="app_paintable">True</property>
-                            <property name="can_focus">False</property>
-                            <child internal-child="action_area">
-                              <object class="GtkButtonBox" id="infobar-action_area1">
-                                <property name="can_focus">False</property>
-                                <property name="spacing">6</property>
-                                <property name="layout_style">start</property>
-                                <child>
-                                  <placeholder/>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="expand">True</property>
-                                <property name="fill">True</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                            <child internal-child="content_area">
-                              <object class="GtkBox" id="infobar-content_area1">
-                                <property name="name">8</property>
-                                <property name="can_focus">False</property>
-                                <property name="margin_left">12</property>
-                                <child>
-                                  <object class="GtkBox" id="box1">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="spacing">18</property>
-                                    <child>
-                                      <object class="GtkImage" id="image1">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">False</property>
-                                        <property name="icon_name">dialog-information-symbolic</property>
-                                        <property name="icon_size">1</property>
-                                      </object>
-                                      <packing>
-                                        <property name="expand">False</property>
-                                        <property name="fill">True</property>
-                                        <property name="position">0</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkLabel" id="label10">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">False</property>
-                                        <property name="label" translatable="yes"><b>Currently no notifications are shown</b>
-except for messages marked as urgent.</property>
-                                        <property name="use_markup">True</property>
-                                        <property name="ellipsize">end</property>
-                                        <property name="xalign">0</property>
-                                      </object>
-                                      <packing>
-                                        <property name="expand">True</property>
-                                        <property name="fill">True</property>
-                                        <property name="position">1</property>
-                                      </packing>
-                                    </child>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">True</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                          </object>
+                          <placeholder/>
                         </child>
                       </object>
                       <packing>
                         <property name="left_attach">0</property>
-                        <property name="top_attach">1</property>
-                        <property name="width">2</property>
+                        <property name="top_attach">0</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkScrolledWindow" id="known_applications_scrolled_window">
+                      <object class="GtkButton" id="clear_log_button">
+                        <property name="label" translatable="yes">Clear log</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
-                        <property name="vexpand">True</property>
-                        <property name="shadow_type">in</property>
+                        <property name="receives_default">True</property>
+                        <property name="image">image2</property>
                       </object>
                       <packing>
                         <property name="left_attach">0</property>
-                        <property name="top_attach">3</property>
-                        <property name="width">2</property>
+                        <property name="top_attach">1</property>
                       </packing>
                     </child>
                   </object>
                   <packing>
-                    <property name="position">1</property>
+                    <property name="position">3</property>
                   </packing>
                 </child>
                 <child type="tab">
-                  <object class="GtkLabel" id="label7">
+                  <object class="GtkLabel" id="label8">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Applications</property>
+                    <property name="label" translatable="yes">Log</property>
                   </object>
                   <packing>
-                    <property name="position">1</property>
+                    <property name="position">3</property>
                     <property name="tab_fill">False</property>
                   </packing>
                 </child>
diff --git a/xfce4-notifyd/xfce-notify-daemon.c b/xfce4-notifyd/xfce-notify-daemon.c
index ab3c548..9a4a555 100644
--- a/xfce4-notifyd/xfce-notify-daemon.c
+++ b/xfce4-notifyd/xfce-notify-daemon.c
@@ -63,6 +63,7 @@ struct _XfceNotifyDaemon
     gboolean do_fadeout;
     gboolean primary_monitor;
     gboolean do_not_disturb;
+    gboolean notification_log;
 
     GtkCssProvider *css_provider;
     gboolean is_default_theme;
@@ -1219,8 +1220,6 @@ notify_notify (XfceNotifyGBus *skeleton,
 
             xndaemon->close_timeout = 0;
 
-            xfce_notify_log_insert_line (new_app_name);
-
             xfce_notify_gbus_complete_notify(skeleton, invocation, OUT_id);
             return TRUE;
         }
@@ -1281,7 +1280,7 @@ notify_notify (XfceNotifyGBus *skeleton,
         xfce_notify_window_set_icon_name (window, image_path);
     }
     else if (app_icon && (g_strcmp0 (app_icon, "") != 0)) {
-        xfce_notify_window_set_icon_name(window, app_icon);
+        xfce_notify_window_set_icon_name (window, app_icon);
     }
     else {
         if(desktop_id) {
@@ -1314,6 +1313,14 @@ notify_notify (XfceNotifyGBus *skeleton,
         }
     }
 
+    // for a complete notification we need:
+    // summary, body, app_icon, expire_timeout, actions
+    // TODO: icons need to be handled, app_icon is bad - what shall be done with image_data??
+    if (xndaemon->notification_log == TRUE)
+        xfce_notify_log_insert (summary, body, app_icon, expire_timeout, actions);
+    else
+        g_warning ("log deactivated");
+
     xfce_notify_window_set_icon_only(window, x_canonical);
 
     xfce_notify_window_set_do_fadeout(window, xndaemon->do_fadeout);
@@ -1535,6 +1542,10 @@ xfce_notify_daemon_settings_changed(XfconfChannel *channel,
         xndaemon->do_not_disturb = G_VALUE_TYPE(value)
                                  ? g_value_get_boolean(value)
                                  : FALSE;
+    } else if(!strcmp(property, "/notification-log")) {
+        xndaemon->notification_log = G_VALUE_TYPE(value)
+                                     ? g_value_get_boolean(value)
+                                     : FALSE;
     }
 }
 
@@ -1568,12 +1579,17 @@ xfce_notify_daemon_load_config (XfceNotifyDaemon *xndaemon,
 
     xndaemon->do_fadeout = xfconf_channel_get_bool(xndaemon->settings,
                                                 "/do-fadeout", TRUE);
+
     xndaemon->primary_monitor = xfconf_channel_get_bool(xndaemon->settings,
                                                         "/primary-monitor", FALSE);
 
     xndaemon->do_not_disturb = xfconf_channel_get_bool(xndaemon->settings,
                                                        "/do-not-disturb",
                                                        FALSE);
+
+    xndaemon->notification_log = xfconf_channel_get_bool(xndaemon->settings,
+                                                         "/notification-log",
+                                                         FALSE);
     /* Clean up old notifications from the backlog */
     xfconf_channel_reset_property (xndaemon->settings, "/backlog", TRUE);
 
diff --git a/xfce4-notifyd/xfce-notify-log.c b/xfce4-notifyd/xfce-notify-log.c
index 33e3727..f51a616 100644
--- a/xfce4-notifyd/xfce-notify-log.c
+++ b/xfce4-notifyd/xfce-notify-log.c
@@ -35,44 +35,81 @@
 
 #include "xfce-notify-log.h"
 
-gchar **
+GKeyFile *
 xfce_notify_log_get (void)
 {
-    gchar **lines = NULL;
-    gchar *notify_log = NULL;
-    gchar *contents = NULL;
-    gsize length = 0;
+    GKeyFile *notify_log;
+    gchar *notify_log_path = NULL;
 
-    notify_log = xfce_resource_lookup (XFCE_RESOURCE_CACHE, XFCE_NOTIFY_LOG_FILE);
+    notify_log_path = xfce_resource_lookup (XFCE_RESOURCE_CACHE, XFCE_NOTIFY_LOG_FILE);
 
-    if (notify_log && g_file_get_contents (notify_log, &contents, &length, NULL))
+    if (notify_log_path)
     {
-        lines = g_strsplit (contents, "\n", -1);
-        g_free (contents);
+        notify_log = g_key_file_new ();
+        if (g_key_file_load_from_file (notify_log, notify_log_path, G_KEY_FILE_NONE, NULL) == FALSE)
+            return NULL;
     }
+    else
+        return NULL;
+    g_free (notify_log_path);
 
-    g_free (notify_log);
-
-    return lines;
+    return notify_log;
 }
 
-void xfce_notify_log_insert_line (const gchar *line)
+void xfce_notify_log_insert (const gchar *summary,
+                             const gchar *body,
+                             const gchar *app_icon,
+                             gint expire_timeout,
+                             const gchar **actions)
 {
-    gchar *notify_log = NULL;
-
-    notify_log = xfce_resource_save_location (XFCE_RESOURCE_CACHE,
-                                              XFCE_NOTIFY_LOG_FILE, TRUE);
-
-    if (notify_log)
+    GKeyFile *notify_log;
+    gchar *notify_log_path;
+    const gchar *timeout;
+    const gchar *group;
+    gchar **groups;
+    gint i;
+    gint j = 0;
+    GDateTime *now;
+    gchar *timestamp;
+    int current_time;
+
+    notify_log_path = xfce_resource_save_location (XFCE_RESOURCE_CACHE,
+                                                   XFCE_NOTIFY_LOG_FILE, TRUE);
+
+    if (notify_log_path)
     {
-        FILE *f;
-        f = fopen (notify_log, "a");
-        fprintf (f, "%s\n", line);
-        fclose (f);
-        g_free (notify_log);
+        notify_log = g_key_file_new ();
+        if (g_key_file_load_from_file (notify_log, notify_log_path, G_KEY_FILE_NONE, NULL) == FALSE)
+        {
+            g_warning ("No file found in cache, creating a new log.");
+        }
+
+        now = g_date_time_new_now_local ();
+        timestamp = g_date_time_format (now, "%F-%T");
+        group = g_strdup_printf ("%s", timestamp);
+
+        g_key_file_set_value (notify_log, group, "summary", summary);
+        g_key_file_set_value (notify_log, group, "body", body);
+        g_key_file_set_value (notify_log, group, "app_icon", app_icon);
+        timeout = g_strdup_printf ("%d", expire_timeout);
+        g_key_file_set_value (notify_log, group, "expire-timeout", timeout);
+        for (i = 0; actions && actions[i]; i += 2) {
+            const gchar *cur_action_id = actions[i];
+            const gchar *cur_button_text = actions[i+1];
+            gchar *action_id_num = g_strdup_printf ("%s-%d", "action-id", j);
+            gchar *action_label_num = g_strdup_printf ("%s-%d", "action-label", j);
+            g_key_file_set_value (notify_log, group, action_id_num, cur_action_id);
+            g_key_file_set_value (notify_log, group, action_label_num, cur_button_text);
+            j++;
+        }
+
+        g_key_file_save_to_file (notify_log, notify_log_path, NULL);
+        g_key_file_free (notify_log);
     }
     else
         g_warning ("Unable to open cache file");
+
+    g_free (notify_log_path);
 }
 
 void xfce_notify_log_clear (void)
diff --git a/xfce4-notifyd/xfce-notify-log.h b/xfce4-notifyd/xfce-notify-log.h
index 810fc5f..d722106 100644
--- a/xfce4-notifyd/xfce-notify-log.h
+++ b/xfce4-notifyd/xfce-notify-log.h
@@ -23,9 +23,12 @@
 
 #define XFCE_NOTIFY_LOG_FILE "xfce4/notifyd/log"
 
-gchar **
-xfce_notify_log_get (void);
-void xfce_notify_log_insert_line (const gchar *line);
-void xfce_notify_log_clear (void);
+GKeyFile   *xfce_notify_log_get (void);
+void    xfce_notify_log_insert (const gchar *summary,
+                             const gchar *body,
+                             const gchar *app_icon,
+                             gint expire_timeout,
+                             const gchar **actions);
+void    xfce_notify_log_clear (void);
 
 #endif /* __XFCE_NOTIFY_LOG_H_ */

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list