commit
6d0e20e40b
93
src/dbus.c
93
src/dbus.c
@ -124,7 +124,7 @@ static void on_get_capabilities(GDBusConnection *connection,
|
||||
g_variant_builder_add(builder, "s", "body-markup");
|
||||
|
||||
value = g_variant_new("(as)", builder);
|
||||
g_variant_builder_unref(builder);
|
||||
g_clear_pointer(&builder, g_variant_builder_unref);
|
||||
g_dbus_method_invocation_return_value(invocation, value);
|
||||
|
||||
g_dbus_connection_flush(connection, NULL, NULL, NULL);
|
||||
@ -133,23 +133,10 @@ static void on_get_capabilities(GDBusConnection *connection,
|
||||
static notification *dbus_message_to_notification(const gchar *sender, GVariant *parameters)
|
||||
{
|
||||
|
||||
gchar *appname = NULL;
|
||||
guint replaces_id = 0;
|
||||
gchar *icon = NULL;
|
||||
gchar *summary = NULL;
|
||||
gchar *body = NULL;
|
||||
Actions *actions = g_malloc0(sizeof(Actions));
|
||||
gint timeout = -1;
|
||||
notification *n = notification_create();
|
||||
|
||||
/* hints */
|
||||
gint urgency = 1;
|
||||
gint progress = -1;
|
||||
gboolean transient = 0;
|
||||
gchar *fgcolor = NULL;
|
||||
gchar *bgcolor = NULL;
|
||||
gchar *frcolor = NULL;
|
||||
gchar *category = NULL;
|
||||
RawImage *raw_icon = NULL;
|
||||
n->actions = g_malloc0(sizeof(Actions));
|
||||
n->dbus_client = g_strdup(sender);
|
||||
|
||||
{
|
||||
GVariantIter *iter = g_variant_iter_new(parameters);
|
||||
@ -161,65 +148,65 @@ static notification *dbus_message_to_notification(const gchar *sender, GVariant
|
||||
switch (idx) {
|
||||
case 0:
|
||||
if (g_variant_is_of_type(content, G_VARIANT_TYPE_STRING))
|
||||
appname = g_variant_dup_string(content, NULL);
|
||||
n->appname = g_variant_dup_string(content, NULL);
|
||||
break;
|
||||
case 1:
|
||||
if (g_variant_is_of_type(content, G_VARIANT_TYPE_UINT32))
|
||||
replaces_id = g_variant_get_uint32(content);
|
||||
n->id = g_variant_get_uint32(content);
|
||||
break;
|
||||
case 2:
|
||||
if (g_variant_is_of_type(content, G_VARIANT_TYPE_STRING))
|
||||
icon = g_variant_dup_string(content, NULL);
|
||||
n->icon = g_variant_dup_string(content, NULL);
|
||||
break;
|
||||
case 3:
|
||||
if (g_variant_is_of_type(content, G_VARIANT_TYPE_STRING))
|
||||
summary = g_variant_dup_string(content, NULL);
|
||||
n->summary = g_variant_dup_string(content, NULL);
|
||||
break;
|
||||
case 4:
|
||||
if (g_variant_is_of_type(content, G_VARIANT_TYPE_STRING))
|
||||
body = g_variant_dup_string(content, NULL);
|
||||
n->body = g_variant_dup_string(content, NULL);
|
||||
break;
|
||||
case 5:
|
||||
if (g_variant_is_of_type(content, G_VARIANT_TYPE_STRING_ARRAY))
|
||||
actions->actions = g_variant_dup_strv(content, &(actions->count));
|
||||
n->actions->actions = g_variant_dup_strv(content, &(n->actions->count));
|
||||
break;
|
||||
case 6:
|
||||
if (g_variant_is_of_type(content, G_VARIANT_TYPE_DICTIONARY)) {
|
||||
|
||||
dict_value = g_variant_lookup_value(content, "urgency", G_VARIANT_TYPE_BYTE);
|
||||
if (dict_value) {
|
||||
urgency = g_variant_get_byte(dict_value);
|
||||
n->urgency = g_variant_get_byte(dict_value);
|
||||
g_variant_unref(dict_value);
|
||||
}
|
||||
|
||||
dict_value = g_variant_lookup_value(content, "fgcolor", G_VARIANT_TYPE_STRING);
|
||||
if (dict_value) {
|
||||
fgcolor = g_variant_dup_string(dict_value, NULL);
|
||||
n->colors[ColFG] = g_variant_dup_string(dict_value, NULL);
|
||||
g_variant_unref(dict_value);
|
||||
}
|
||||
|
||||
dict_value = g_variant_lookup_value(content, "bgcolor", G_VARIANT_TYPE_STRING);
|
||||
if (dict_value) {
|
||||
bgcolor = g_variant_dup_string(dict_value, NULL);
|
||||
n->colors[ColBG] = g_variant_dup_string(dict_value, NULL);
|
||||
g_variant_unref(dict_value);
|
||||
}
|
||||
|
||||
dict_value = g_variant_lookup_value(content, "frcolor", G_VARIANT_TYPE_STRING);
|
||||
if (dict_value) {
|
||||
frcolor = g_variant_dup_string(dict_value, NULL);
|
||||
n->colors[ColFrame] = g_variant_dup_string(dict_value, NULL);
|
||||
g_variant_unref(dict_value);
|
||||
}
|
||||
|
||||
dict_value = g_variant_lookup_value(content, "category", G_VARIANT_TYPE_STRING);
|
||||
if (dict_value) {
|
||||
category = g_variant_dup_string(dict_value, NULL);
|
||||
n->category = g_variant_dup_string(dict_value, NULL);
|
||||
g_variant_unref(dict_value);
|
||||
}
|
||||
|
||||
dict_value = g_variant_lookup_value(content, "image-path", G_VARIANT_TYPE_STRING);
|
||||
if (dict_value) {
|
||||
g_free(icon);
|
||||
icon = g_variant_dup_string(dict_value, NULL);
|
||||
g_free(n->icon);
|
||||
n->icon = g_variant_dup_string(dict_value, NULL);
|
||||
g_variant_unref(dict_value);
|
||||
}
|
||||
|
||||
@ -229,7 +216,7 @@ static notification *dbus_message_to_notification(const gchar *sender, GVariant
|
||||
if (!dict_value)
|
||||
dict_value = g_variant_lookup_value(content, "icon_data", G_VARIANT_TYPE("(iiibiiay)"));
|
||||
if (dict_value) {
|
||||
raw_icon = get_raw_image_from_data_hint(dict_value);
|
||||
n->raw_icon = get_raw_image_from_data_hint(dict_value);
|
||||
g_variant_unref(dict_value);
|
||||
}
|
||||
|
||||
@ -240,28 +227,28 @@ static notification *dbus_message_to_notification(const gchar *sender, GVariant
|
||||
* So let's check for int and boolean until notify-send is fixed.
|
||||
*/
|
||||
if((dict_value = g_variant_lookup_value(content, "transient", G_VARIANT_TYPE_BOOLEAN))) {
|
||||
transient = g_variant_get_boolean(dict_value);
|
||||
n->transient = g_variant_get_boolean(dict_value);
|
||||
g_variant_unref(dict_value);
|
||||
} else if((dict_value = g_variant_lookup_value(content, "transient", G_VARIANT_TYPE_UINT32))) {
|
||||
transient = g_variant_get_uint32(dict_value) > 0;
|
||||
n->transient = g_variant_get_uint32(dict_value) > 0;
|
||||
g_variant_unref(dict_value);
|
||||
} else if((dict_value = g_variant_lookup_value(content, "transient", G_VARIANT_TYPE_INT32))) {
|
||||
transient = g_variant_get_int32(dict_value) > 0;
|
||||
n->transient = g_variant_get_int32(dict_value) > 0;
|
||||
g_variant_unref(dict_value);
|
||||
}
|
||||
|
||||
if((dict_value = g_variant_lookup_value(content, "value", G_VARIANT_TYPE_INT32))) {
|
||||
progress = g_variant_get_int32(dict_value);
|
||||
n->progress = g_variant_get_int32(dict_value);
|
||||
g_variant_unref(dict_value);
|
||||
} else if((dict_value = g_variant_lookup_value(content, "value", G_VARIANT_TYPE_UINT32))) {
|
||||
progress = g_variant_get_uint32(dict_value);
|
||||
n->progress = g_variant_get_uint32(dict_value);
|
||||
g_variant_unref(dict_value);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
if (g_variant_is_of_type(content, G_VARIANT_TYPE_INT32))
|
||||
timeout = g_variant_get_int32(content);
|
||||
n->timeout = g_variant_get_int32(content) * 1000;
|
||||
break;
|
||||
}
|
||||
g_variant_unref(content);
|
||||
@ -273,30 +260,8 @@ static notification *dbus_message_to_notification(const gchar *sender, GVariant
|
||||
|
||||
fflush(stdout);
|
||||
|
||||
notification *n = notification_create();
|
||||
|
||||
n->id = replaces_id;
|
||||
n->appname = appname;
|
||||
n->summary = summary;
|
||||
n->body = body;
|
||||
n->icon = icon;
|
||||
n->raw_icon = raw_icon;
|
||||
n->timeout = timeout < 0 ? -1 : timeout * 1000;
|
||||
n->progress = progress;
|
||||
n->urgency = urgency;
|
||||
n->category = category;
|
||||
n->dbus_client = g_strdup(sender);
|
||||
n->transient = transient;
|
||||
|
||||
if (actions->count < 1) {
|
||||
actions_free(actions);
|
||||
actions = NULL;
|
||||
}
|
||||
n->actions = actions;
|
||||
|
||||
n->colors[ColFG] = fgcolor;
|
||||
n->colors[ColBG] = bgcolor;
|
||||
n->colors[ColFrame] = frcolor;
|
||||
if (n->actions->count < 1)
|
||||
g_clear_pointer(&n->actions, actions_free);
|
||||
|
||||
notification_init(n);
|
||||
return n;
|
||||
@ -484,8 +449,7 @@ static int dbus_get_fdn_daemon_info(GDBusConnection *connection,
|
||||
|
||||
if (error) {
|
||||
/* Ignore the error, we may still be able to retrieve the PID */
|
||||
g_error_free(error);
|
||||
error = NULL;
|
||||
g_clear_pointer(&error, g_error_free);
|
||||
} else {
|
||||
g_variant_get(daemoninfo, "(ssss)", name, vendor, NULL, NULL);
|
||||
}
|
||||
@ -617,8 +581,7 @@ int initdbus(void)
|
||||
|
||||
void dbus_tear_down(int owner_id)
|
||||
{
|
||||
if (introspection_data)
|
||||
g_dbus_node_info_unref(introspection_data);
|
||||
g_clear_pointer(&introspection_data, g_dbus_node_info_unref);
|
||||
|
||||
g_bus_unown_name(owner_id);
|
||||
}
|
||||
|
@ -625,10 +625,11 @@ void draw(void)
|
||||
|
||||
bool first = true;
|
||||
for (GSList *iter = layouts; iter; iter = iter->next) {
|
||||
if (iter->next)
|
||||
dim = layout_render(image_surface, iter->data, iter->next->data, dim, first, iter->next == NULL);
|
||||
else
|
||||
dim = layout_render(image_surface, iter->data, NULL, dim, first, iter->next == NULL);
|
||||
|
||||
colored_layout *cl_this = iter->data;
|
||||
colored_layout *cl_next = iter->next ? iter->next->data : NULL;
|
||||
|
||||
dim = layout_render(image_surface, cl_this, cl_next, dim, first, !cl_next);
|
||||
|
||||
first = false;
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ int dunst_main(int argc, char *argv[])
|
||||
|
||||
run(NULL);
|
||||
g_main_loop_run(mainloop);
|
||||
g_main_loop_unref(mainloop);
|
||||
g_clear_pointer(&mainloop, g_main_loop_unref);
|
||||
|
||||
/* remove signal handler watches */
|
||||
g_source_remove(pause_src);
|
||||
|
12
src/markup.c
12
src/markup.c
@ -13,7 +13,7 @@
|
||||
|
||||
static char *markup_quote(char *str)
|
||||
{
|
||||
assert(str != NULL);
|
||||
assert(str);
|
||||
|
||||
str = string_replace_all("&", "&", str);
|
||||
str = string_replace_all("\"", """, str);
|
||||
@ -26,7 +26,7 @@ static char *markup_quote(char *str)
|
||||
|
||||
static char *markup_unquote(char *str)
|
||||
{
|
||||
assert(str != NULL);
|
||||
assert(str);
|
||||
|
||||
str = string_replace_all(""", "\"", str);
|
||||
str = string_replace_all("'", "'", str);
|
||||
@ -39,7 +39,7 @@ static char *markup_unquote(char *str)
|
||||
|
||||
static char *markup_br2nl(char *str)
|
||||
{
|
||||
assert(str != NULL);
|
||||
assert(str);
|
||||
|
||||
str = string_replace_all("<br>", "\n", str);
|
||||
str = string_replace_all("<br/>", "\n", str);
|
||||
@ -230,9 +230,8 @@ void markup_strip_img(char **str, char **urls)
|
||||
*/
|
||||
char *markup_strip(char *str)
|
||||
{
|
||||
if (str == NULL) {
|
||||
if (!str)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* strip all tags */
|
||||
string_strip_delimited(str, '<', '>');
|
||||
@ -249,9 +248,8 @@ char *markup_strip(char *str)
|
||||
*/
|
||||
char *markup_transform(char *str, enum markup_mode markup_mode)
|
||||
{
|
||||
if (str == NULL) {
|
||||
if (!str)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
switch (markup_mode) {
|
||||
case MARKUP_NULL:
|
||||
|
@ -193,7 +193,7 @@ void dispatch_menu_result(const char *input)
|
||||
*/
|
||||
void context_menu(void)
|
||||
{
|
||||
if (settings.dmenu_cmd == NULL) {
|
||||
if (!settings.dmenu_cmd) {
|
||||
LOG_C("Unable to open dmenu: No dmenu command set.");
|
||||
return;
|
||||
}
|
||||
|
@ -42,10 +42,7 @@ const char *enum_to_string_fullscreen(enum behavior_fullscreen in)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* print a human readable representation
|
||||
* of the given notification to stdout.
|
||||
*/
|
||||
/* see notification.h */
|
||||
void notification_print(notification *n)
|
||||
{
|
||||
//TODO: use logging info for this
|
||||
@ -64,6 +61,7 @@ void notification_print(notification *n)
|
||||
printf("\tbg: %s\n", n->colors[ColBG]);
|
||||
printf("\tframe: %s\n", n->colors[ColFrame]);
|
||||
printf("\tfullscreen: %s\n", enum_to_string_fullscreen(n->fullscreen));
|
||||
printf("\tprogress: %d\n", n->progress);
|
||||
printf("\tid: %d\n", n->id);
|
||||
if (n->urls) {
|
||||
char *urls = string_replace_all("\n", "\t\t\n", g_strdup(n->urls));
|
||||
@ -88,19 +86,16 @@ void notification_print(notification *n)
|
||||
printf("}\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Run the script associated with the
|
||||
* given notification.
|
||||
*/
|
||||
/* see notification.h */
|
||||
void notification_run_script(notification *n)
|
||||
{
|
||||
if (!n->script || strlen(n->script) < 1)
|
||||
return;
|
||||
|
||||
char *appname = n->appname ? n->appname : "";
|
||||
char *summary = n->summary ? n->summary : "";
|
||||
char *body = n->body ? n->body : "";
|
||||
char *icon = n->icon ? n->icon : "";
|
||||
const char *appname = n->appname ? n->appname : "";
|
||||
const char *summary = n->summary ? n->summary : "";
|
||||
const char *body = n->body ? n->body : "";
|
||||
const char *icon = n->icon ? n->icon : "";
|
||||
|
||||
const char *urgency = notification_urgency_to_string(n->urgency);
|
||||
|
||||
@ -133,7 +128,7 @@ void notification_run_script(notification *n)
|
||||
/*
|
||||
* Helper function to convert an urgency to a string
|
||||
*/
|
||||
const char *notification_urgency_to_string(enum urgency urgency)
|
||||
const char *notification_urgency_to_string(const enum urgency urgency)
|
||||
{
|
||||
switch (urgency) {
|
||||
case URG_NONE:
|
||||
@ -149,18 +144,9 @@ const char *notification_urgency_to_string(enum urgency urgency)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper function to compare to given
|
||||
* notifications.
|
||||
*/
|
||||
int notification_cmp(const void *va, const void *vb)
|
||||
/* see notification.h */
|
||||
int notification_cmp(const notification *a, const notification *b)
|
||||
{
|
||||
notification *a = (notification *) va;
|
||||
notification *b = (notification *) vb;
|
||||
|
||||
if (!settings.sort)
|
||||
return 1;
|
||||
|
||||
if (a->urgency != b->urgency) {
|
||||
return b->urgency - a->urgency;
|
||||
} else {
|
||||
@ -168,20 +154,23 @@ int notification_cmp(const void *va, const void *vb)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Wrapper for notification_cmp to match glib's
|
||||
* compare functions signature.
|
||||
*/
|
||||
/* see notification.h */
|
||||
int notification_cmp_data(const void *va, const void *vb, void *data)
|
||||
{
|
||||
return notification_cmp(va, vb);
|
||||
notification *a = (notification *) va;
|
||||
notification *b = (notification *) vb;
|
||||
|
||||
if (!settings.sort)
|
||||
return 1;
|
||||
|
||||
return notification_cmp(a, b);
|
||||
}
|
||||
|
||||
int notification_is_duplicate(const notification *a, const notification *b)
|
||||
{
|
||||
//Comparing raw icons is not supported, assume they are not identical
|
||||
if (settings.icon_position != icons_off
|
||||
&& (a->raw_icon != NULL || b->raw_icon != NULL))
|
||||
&& (a->raw_icon || b->raw_icon))
|
||||
return false;
|
||||
|
||||
return strcmp(a->appname, b->appname) == 0
|
||||
@ -191,10 +180,7 @@ int notification_is_duplicate(const notification *a, const notification *b)
|
||||
&& a->urgency == b->urgency;
|
||||
}
|
||||
|
||||
/*
|
||||
* Free the actions element
|
||||
* @a: (nullable): Pointer to #Actions
|
||||
*/
|
||||
/* see notification.h */
|
||||
void actions_free(Actions *a)
|
||||
{
|
||||
if (!a)
|
||||
@ -205,10 +191,7 @@ void actions_free(Actions *a)
|
||||
g_free(a);
|
||||
}
|
||||
|
||||
/*
|
||||
* Free a #RawImage
|
||||
* @i: (nullable): pointer to #RawImage
|
||||
*/
|
||||
/* see notification.h */
|
||||
void rawimage_free(RawImage *i)
|
||||
{
|
||||
if (!i)
|
||||
@ -218,12 +201,12 @@ void rawimage_free(RawImage *i)
|
||||
g_free(i);
|
||||
}
|
||||
|
||||
/*
|
||||
* Free the memory used by the given notification.
|
||||
*/
|
||||
/* see notification.h */
|
||||
void notification_free(notification *n)
|
||||
{
|
||||
assert(n != NULL);
|
||||
if (!n)
|
||||
return;
|
||||
|
||||
g_free(n->appname);
|
||||
g_free(n->summary);
|
||||
g_free(n->body);
|
||||
@ -243,14 +226,7 @@ void notification_free(notification *n)
|
||||
g_free(n);
|
||||
}
|
||||
|
||||
/*
|
||||
* Replace the two chars where **needle points
|
||||
* with a quoted "replacement", according to the markup settings.
|
||||
*
|
||||
* The needle is a double pointer and gets updated upon return
|
||||
* to point to the first char, which occurs after replacement.
|
||||
*
|
||||
*/
|
||||
/* see notification.h */
|
||||
void notification_replace_single_field(char **haystack,
|
||||
char **needle,
|
||||
const char *replacement,
|
||||
@ -274,14 +250,7 @@ void notification_replace_single_field(char **haystack,
|
||||
g_free(input);
|
||||
}
|
||||
|
||||
/*
|
||||
* Create notification struct and initialise all fields with either
|
||||
* - the default (if it's not needed to be freed later)
|
||||
* - its undefined representation (NULL, -1)
|
||||
*
|
||||
* This function is guaranteed to return a valid pointer.
|
||||
* @Returns: The generated notification
|
||||
*/
|
||||
/* see notification.h */
|
||||
notification *notification_create(void)
|
||||
{
|
||||
notification *n = g_malloc0(sizeof(notification));
|
||||
@ -304,12 +273,7 @@ notification *notification_create(void)
|
||||
return n;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sanitize values of notification, apply all matching rules
|
||||
* and generate derived fields.
|
||||
*
|
||||
* @n: the notification to sanitize
|
||||
*/
|
||||
/* see notification.h */
|
||||
void notification_init(notification *n)
|
||||
{
|
||||
/* default to empty string to avoid further NULL faults */
|
||||
@ -557,11 +521,7 @@ void notification_update_text_to_render(notification *n)
|
||||
n->text_to_render = buf;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the notification has exactly one action, or one is marked as default,
|
||||
* invoke it. If there are multiple and no default, open the context menu. If
|
||||
* there are no actions, proceed similarly with urls.
|
||||
*/
|
||||
/* see notification.h */
|
||||
void notification_do_action(notification *n)
|
||||
{
|
||||
if (n->actions) {
|
||||
@ -578,10 +538,10 @@ void notification_do_action(notification *n)
|
||||
context_menu();
|
||||
|
||||
} else if (n->urls) {
|
||||
if (strstr(n->urls, "\n") == NULL)
|
||||
open_browser(n->urls);
|
||||
else
|
||||
if (strstr(n->urls, "\n"))
|
||||
context_menu();
|
||||
else
|
||||
open_browser(n->urls);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -84,24 +84,90 @@ typedef struct _notification {
|
||||
char *urls; /**< urllist delimited by '\\n' */
|
||||
} notification;
|
||||
|
||||
/**
|
||||
* Create notification struct and initialise all fields with either
|
||||
* - the default (if it's not needed to be freed later)
|
||||
* - its undefined representation (NULL, -1)
|
||||
*
|
||||
* This function is guaranteed to return a valid pointer.
|
||||
* @returns The generated notification
|
||||
*/
|
||||
notification *notification_create(void);
|
||||
|
||||
/**
|
||||
* Sanitize values of notification, apply all matching rules
|
||||
* and generate derived fields.
|
||||
*
|
||||
* @param n: the notification to sanitize
|
||||
*/
|
||||
void notification_init(notification *n);
|
||||
|
||||
/**
|
||||
* Free the actions structure
|
||||
*
|
||||
* @param a (nullable): Pointer to #Actions
|
||||
*/
|
||||
void actions_free(Actions *a);
|
||||
|
||||
/**
|
||||
* Free a #RawImage
|
||||
*
|
||||
* @param i (nullable): pointer to #RawImage
|
||||
*/
|
||||
void rawimage_free(RawImage *i);
|
||||
|
||||
/**
|
||||
* Free the memory used by the given notification.
|
||||
*
|
||||
* @param n (nullable): pointer to #notification
|
||||
*/
|
||||
void notification_free(notification *n);
|
||||
int notification_cmp(const void *a, const void *b);
|
||||
int notification_cmp_data(const void *a, const void *b, void *data);
|
||||
|
||||
/**
|
||||
* Helper function to compare two given notifications.
|
||||
*/
|
||||
int notification_cmp(const notification *a, const notification *b);
|
||||
|
||||
/**
|
||||
* Wrapper for notification_cmp to match glib's
|
||||
* compare functions signature.
|
||||
*/
|
||||
int notification_cmp_data(const void *va, const void *vb, void *data);
|
||||
|
||||
int notification_is_duplicate(const notification *a, const notification *b);
|
||||
|
||||
/**
|
||||
* Run the script associated with the
|
||||
* given notification.
|
||||
*/
|
||||
void notification_run_script(notification *n);
|
||||
/**
|
||||
* print a human readable representation
|
||||
* of the given notification to stdout.
|
||||
*/
|
||||
void notification_print(notification *n);
|
||||
|
||||
/**
|
||||
* Replace the two chars where **needle points
|
||||
* with a quoted "replacement", according to the markup settings.
|
||||
*
|
||||
* The needle is a double pointer and gets updated upon return
|
||||
* to point to the first char, which occurs after replacement.
|
||||
*/
|
||||
void notification_replace_single_field(char **haystack,
|
||||
char **needle,
|
||||
const char *replacement,
|
||||
enum markup_mode markup_mode);
|
||||
void notification_update_text_to_render(notification *n);
|
||||
|
||||
/**
|
||||
* If the notification has exactly one action, or one is marked as default,
|
||||
* invoke it. If there are multiple and no default, open the context menu. If
|
||||
* there are no actions, proceed similarly with urls.
|
||||
*/
|
||||
void notification_do_action(notification *n);
|
||||
|
||||
const char *notification_urgency_to_string(enum urgency urgency);
|
||||
const char *notification_urgency_to_string(const enum urgency urgency);
|
||||
|
||||
/**
|
||||
* Return the string representation for fullscreen behavior
|
||||
|
@ -66,9 +66,8 @@ void free_ini(void)
|
||||
g_free(sections[i].entries);
|
||||
g_free(sections[i].name);
|
||||
}
|
||||
g_free(sections);
|
||||
g_clear_pointer(§ions, g_free);
|
||||
section_count = 0;
|
||||
sections = NULL;
|
||||
}
|
||||
|
||||
section_t *get_section(const char *name)
|
||||
@ -84,9 +83,8 @@ section_t *get_section(const char *name)
|
||||
void add_entry(const char *section_name, const char *key, const char *value)
|
||||
{
|
||||
section_t *s = get_section(section_name);
|
||||
if (s == NULL) {
|
||||
if (!s)
|
||||
s = new_section(section_name);
|
||||
}
|
||||
|
||||
s->entry_count++;
|
||||
int len = s->entry_count;
|
||||
@ -139,19 +137,19 @@ gint64 ini_get_time(const char *section, const char *key, gint64 def)
|
||||
int ini_get_int(const char *section, const char *key, int def)
|
||||
{
|
||||
const char *value = get_value(section, key);
|
||||
if (value == NULL)
|
||||
return def;
|
||||
else
|
||||
if (value)
|
||||
return atoi(value);
|
||||
else
|
||||
return def;
|
||||
}
|
||||
|
||||
double ini_get_double(const char *section, const char *key, double def)
|
||||
{
|
||||
const char *value = get_value(section, key);
|
||||
if (value == NULL)
|
||||
return def;
|
||||
else
|
||||
if (value)
|
||||
return atof(value);
|
||||
else
|
||||
return def;
|
||||
}
|
||||
|
||||
bool ini_is_set(const char *ini_section, const char *ini_key)
|
||||
@ -164,9 +162,8 @@ const char *next_section(const char *section)
|
||||
if (section_count == 0)
|
||||
return NULL;
|
||||
|
||||
if (section == NULL) {
|
||||
if (!section)
|
||||
return sections[0].name;
|
||||
}
|
||||
|
||||
for (int i = 0; i < section_count; i++) {
|
||||
if (strcmp(section, sections[i].name) == 0) {
|
||||
@ -182,9 +179,7 @@ const char *next_section(const char *section)
|
||||
int ini_get_bool(const char *section, const char *key, int def)
|
||||
{
|
||||
const char *value = get_value(section, key);
|
||||
if (value == NULL)
|
||||
return def;
|
||||
else {
|
||||
if (value) {
|
||||
switch (value[0]) {
|
||||
case 'y':
|
||||
case 'Y':
|
||||
@ -201,6 +196,8 @@ int ini_get_bool(const char *section, const char *key, int def)
|
||||
default:
|
||||
return def;
|
||||
}
|
||||
} else {
|
||||
return def;
|
||||
}
|
||||
}
|
||||
|
||||
@ -351,10 +348,10 @@ char *cmdline_get_string(const char *key, const char *def, const char *descripti
|
||||
|
||||
if (str)
|
||||
return g_strdup(str);
|
||||
if (def == NULL)
|
||||
return NULL;
|
||||
else
|
||||
if (def)
|
||||
return g_strdup(def);
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *cmdline_get_path(const char *key, const char *def, const char *description)
|
||||
@ -386,10 +383,10 @@ int cmdline_get_int(const char *key, int def, const char *description)
|
||||
cmdline_usage_append(key, "int", description);
|
||||
const char *str = cmdline_get_value(key);
|
||||
|
||||
if (str == NULL)
|
||||
return def;
|
||||
else
|
||||
if (str)
|
||||
return atoi(str);
|
||||
else
|
||||
return def;
|
||||
}
|
||||
|
||||
double cmdline_get_double(const char *key, double def, const char *description)
|
||||
@ -397,10 +394,10 @@ double cmdline_get_double(const char *key, double def, const char *description)
|
||||
cmdline_usage_append(key, "double", description);
|
||||
const char *str = cmdline_get_value(key);
|
||||
|
||||
if (str == NULL)
|
||||
return def;
|
||||
else
|
||||
if (str)
|
||||
return atof(str);
|
||||
else
|
||||
return def;
|
||||
}
|
||||
|
||||
int cmdline_get_bool(const char *key, int def, const char *description)
|
||||
|
@ -27,8 +27,7 @@ void rule_apply(rule_t *r, notification *n)
|
||||
if (r->new_icon) {
|
||||
g_free(n->icon);
|
||||
n->icon = g_strdup(r->new_icon);
|
||||
rawimage_free(n->raw_icon);
|
||||
n->raw_icon = NULL;
|
||||
g_clear_pointer(&n->raw_icon, rawimage_free);
|
||||
}
|
||||
if (r->fg) {
|
||||
g_free(n->colors[ColFG]);
|
||||
|
@ -77,7 +77,7 @@ void load_settings(char *cmdline_config_path)
|
||||
|
||||
xdgInitHandle(&xdg);
|
||||
|
||||
if (cmdline_config_path != NULL) {
|
||||
if (cmdline_config_path) {
|
||||
if (0 == strcmp(cmdline_config_path, "-")) {
|
||||
config_file = stdin;
|
||||
} else {
|
||||
@ -88,14 +88,14 @@ void load_settings(char *cmdline_config_path)
|
||||
DIE("Cannot find config file: '%s'", cmdline_config_path);
|
||||
}
|
||||
}
|
||||
if (config_file == NULL) {
|
||||
if (!config_file) {
|
||||
config_file = xdgConfigOpen("dunst/dunstrc", "r", &xdg);
|
||||
}
|
||||
if (config_file == NULL) {
|
||||
if (!config_file) {
|
||||
/* Fall back to just "dunstrc", which was used before 2013-06-23
|
||||
* (before v0.2). */
|
||||
config_file = xdgConfigOpen("dunstrc", "r", &xdg);
|
||||
if (config_file == NULL) {
|
||||
if (!config_file) {
|
||||
LOG_W("No dunstrc found.");
|
||||
xdgWipeHandle(&xdg);
|
||||
}
|
||||
@ -669,7 +669,7 @@ void load_settings(char *cmdline_config_path)
|
||||
r = match;
|
||||
}
|
||||
|
||||
if (r == NULL) {
|
||||
if (!r) {
|
||||
r = g_malloc(sizeof(rule_t));
|
||||
rule_init(r);
|
||||
rules = g_slist_insert(rules, r, -1);
|
||||
@ -689,7 +689,7 @@ void load_settings(char *cmdline_config_path)
|
||||
"markup", NULL
|
||||
);
|
||||
|
||||
if (c != NULL) {
|
||||
if (c) {
|
||||
r->markup = parse_markup_mode(c);
|
||||
g_free(c);
|
||||
}
|
||||
|
@ -14,7 +14,7 @@
|
||||
char *string_replace_char(char needle, char replacement, char *haystack)
|
||||
{
|
||||
char *current = haystack;
|
||||
while ((current = strchr(current, needle)) != NULL)
|
||||
while ((current = strchr(current, needle)))
|
||||
*current++ = replacement;
|
||||
return haystack;
|
||||
}
|
||||
@ -49,9 +49,8 @@ char *string_replace(const char *needle, const char *replacement, char *haystack
|
||||
{
|
||||
char *start;
|
||||
start = strstr(haystack, needle);
|
||||
if (start == NULL) {
|
||||
if (!start)
|
||||
return haystack;
|
||||
}
|
||||
|
||||
return string_replace_at(haystack, (start - haystack), strlen(needle), replacement);
|
||||
}
|
||||
@ -70,7 +69,7 @@ char *string_replace_all(const char *needle, const char *replacement, char *hays
|
||||
start = strstr(haystack, needle);
|
||||
repl_len = strlen(replacement);
|
||||
|
||||
while (start != NULL) {
|
||||
while (start) {
|
||||
needle_pos = start - haystack;
|
||||
haystack = string_replace_at(haystack, needle_pos, needle_len, replacement);
|
||||
start = strstr(haystack + needle_pos + repl_len, needle);
|
||||
|
@ -46,7 +46,7 @@ static double get_xft_dpi_value(void)
|
||||
XrmInitialize();
|
||||
char *xRMS = XResourceManagerString(xctx.dpy);
|
||||
|
||||
if (xRMS == NULL) {
|
||||
if (!xRMS) {
|
||||
dpi = 0;
|
||||
return 0;
|
||||
}
|
||||
@ -144,10 +144,13 @@ static int autodetect_dpi(screen_info *scr)
|
||||
|
||||
void screen_check_event(XEvent event)
|
||||
{
|
||||
if (event.type == randr_event_base + RRScreenChangeNotify)
|
||||
if (event.type == randr_event_base + RRScreenChangeNotify) {
|
||||
LOG_D("XEvent: processing 'RRScreenChangeNotify'");
|
||||
randr_update();
|
||||
else
|
||||
LOG_D("XEvent: Ignored '%d'", event.type);
|
||||
|
||||
} else {
|
||||
LOG_D("XEvent: Ignoring '%d'", event.type);
|
||||
}
|
||||
}
|
||||
|
||||
void xinerama_update(void)
|
||||
|
12
src/x11/x.c
12
src/x11/x.c
@ -274,21 +274,23 @@ gboolean x_mainloop_fd_dispatch(GSource *source, GSourceFunc callback, gpointer
|
||||
unsigned int state;
|
||||
while (XPending(xctx.dpy) > 0) {
|
||||
XNextEvent(xctx.dpy, &ev);
|
||||
LOG_D("XEvent: processing '%d'", ev.type);
|
||||
|
||||
switch (ev.type) {
|
||||
case Expose:
|
||||
LOG_D("XEvent: processing 'Expose'");
|
||||
if (ev.xexpose.count == 0 && win->visible) {
|
||||
draw();
|
||||
}
|
||||
break;
|
||||
case ButtonRelease:
|
||||
LOG_D("XEvent: processing 'ButtonRelease'");
|
||||
if (ev.xbutton.window == win->xwin) {
|
||||
x_handle_click(ev);
|
||||
wake_up();
|
||||
}
|
||||
break;
|
||||
case KeyPress:
|
||||
LOG_D("XEvent: processing 'KeyPress'");
|
||||
state = ev.xkey.state;
|
||||
/* NumLock is also encoded in the state. Remove it. */
|
||||
state &= ~x_numlock_mod();
|
||||
@ -325,15 +327,21 @@ gboolean x_mainloop_fd_dispatch(GSource *source, GSourceFunc callback, gpointer
|
||||
}
|
||||
break;
|
||||
case FocusIn:
|
||||
LOG_D("XEvent: processing 'FocusIn'");
|
||||
wake_up();
|
||||
break;
|
||||
case FocusOut:
|
||||
LOG_D("XEvent: processing 'FocusOut'");
|
||||
wake_up();
|
||||
break;
|
||||
case CreateNotify:
|
||||
LOG_D("XEvent: processing 'CreateNotify'");
|
||||
if (win->visible &&
|
||||
ev.xcreatewindow.override_redirect == 0)
|
||||
XRaiseWindow(xctx.dpy, win->xwin);
|
||||
break;
|
||||
case PropertyNotify:
|
||||
LOG_D("XEvent: processing 'PropertyNotify'");
|
||||
fullscreen_now = have_fullscreen_window();
|
||||
scr = get_active_screen();
|
||||
|
||||
@ -815,7 +823,7 @@ static void x_shortcut_ungrab(keyboard_shortcut *ks)
|
||||
*/
|
||||
static void x_shortcut_init(keyboard_shortcut *ks)
|
||||
{
|
||||
if (ks == NULL || ks->str == NULL)
|
||||
if (!ks|| !ks->str)
|
||||
return;
|
||||
|
||||
if (!strcmp(ks->str, "none") || (!strcmp(ks->str, ""))) {
|
||||
|
@ -279,7 +279,7 @@ TEST test_option_get_bool(void)
|
||||
SUITE(suite_option_parser)
|
||||
{
|
||||
FILE *config_file = fopen("data/test-ini", "r");
|
||||
if (config_file == NULL) {
|
||||
if (!config_file) {
|
||||
fputs("\nTest config file 'data/test-ini' couldn't be opened, failing.\n", stderr);
|
||||
exit(1);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user