[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