tmisu

Notification to stdout daemon
git clone https://git.inz.fi/tmisu/
Log | Files | Refs | README | LICENSE

commit c3ba4d1bb1d556a06786951f1ad6685a5329fb01
parent e9b47710d8bfc5300f00b5088ee569be56ffd261
Author: Mark Gross <mark.gross2001@gmail.com>
Date:   Fri,  2 Oct 2020 21:01:12 -0700

Add a formatter for values of unknown type

The hints_output_iterator() function skips a hint if its value is not of
any of the types explicitly checked for in the if-else chain. However,
it prints a comma before this check, meaning values of unknown type
result in a trailing comma. By adding a formatter for such values, we
not only resolve the trailing comma issue, but also let the user know
that their notification contained a hint of an unknown type, rather than
hiding it.

Diffstat:
Msrc/output.c | 18++++++++++++------
Msrc/output.h | 2+-
2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/output.c b/src/output.c @@ -72,7 +72,8 @@ void output_notification(GVariant *parameters) { void hints_output_iterator(GVariant *hints, const char *str_format, const char *int_format, const char *uint_format, const char *double_format, const char *boolean_format, - const char *byte_format, const char *element_delimiter) { + const char *byte_format, const char *err_format, + const char *element_delimiter) { GVariantIter iterator; gchar *key; @@ -85,7 +86,6 @@ void hints_output_iterator(GVariant *hints, const char *str_format, while (g_variant_iter_loop(&iterator, "{sv}", &key, NULL)) { if (index) printf(element_delimiter); - /* Strings */ if ((value = g_variant_lookup_value(hints, key, GT_STRING))) { value_sanitized = sanitize(g_variant_get_string(value, NULL)); @@ -115,8 +115,12 @@ void hints_output_iterator(GVariant *hints, const char *str_format, /* Booleans */ else if ((value = g_variant_lookup_value(hints, key, GT_BOOL))) printf(boolean_format, key, g_variant_get_boolean(value)); - else + else { + // value is of unknown type + printf(err_format, key); + index++; continue; + } g_variant_unref(value); index++; @@ -140,7 +144,8 @@ void default_output(gchar *app_name, gchar *app_icon, guint32 replaces_id, *uint_format = calloc(64, sizeof(char)), *double_format = calloc(64, sizeof(char)), *boolean_format = calloc(64, sizeof(char)), - *byte_format = calloc(64, sizeof(char)); + *byte_format = calloc(64, sizeof(char)), + *err_format = calloc(64, sizeof(char)); sprintf(str_format, "\t%%s: %%s%s", delimiter); sprintf(int_format, "\t%%s: %%d%s", delimiter); @@ -148,10 +153,11 @@ void default_output(gchar *app_name, gchar *app_icon, guint32 replaces_id, sprintf(double_format, "\t%%s: %%f%s", delimiter); sprintf(boolean_format, "\t%%s: %%x%s", delimiter); sprintf(byte_format, "\t%%s: %%d%s", delimiter); + sprintf(err_format, "\t%%s:%s", delimiter); hints_output_iterator(hints, str_format, int_format, uint_format, double_format, boolean_format, - byte_format, ""); + byte_format, err_format, ""); free(str_format); free(int_format); @@ -186,7 +192,7 @@ void json_output(gchar *app_name, gchar *app_icon, guint32 replaces_id, printf("\"hints\": {"); hints_output_iterator(hints, "\"%s\": \"%s\"", "\"%s\": %d", "\"%s\": %u", - "\"%s\": %f", "\"%s\": %x", "\"%s\": %d", ", "); + "\"%s\": %f", "\"%s\": %x", "\"%s\": %d", "\"%s\": \"\"", ", "); printf("}, \"actions\": {"); unsigned int index = 0; diff --git a/src/output.h b/src/output.h @@ -18,7 +18,7 @@ char *sanitize(const char*); void output_notification(GVariant*); void hints_output_iterator(GVariant*, const char*, const char*, const char*, - const char*, const char*, const char*, const char*); + const char*, const char*, const char*, const char*, const char*); void default_output(gchar*, gchar*, guint32, gint32, GVariant*, gchar**, gchar*, gchar*); void json_output(gchar*, gchar*, guint32, gint32, GVariant*, gchar**, gchar*,