Fix memory leak colors given via hints
The hints given via DBus are not constants. Therefore the color fields have to get freed during notification cleanup. As it's not possible to disinguish, which field is constant, we have to duplicate the settings on assignment.
This commit is contained in:
parent
98d905b8e4
commit
b97a49c09b
@ -214,6 +214,9 @@ void notification_free(notification *n)
|
|||||||
g_free(n->category);
|
g_free(n->category);
|
||||||
g_free(n->text_to_render);
|
g_free(n->text_to_render);
|
||||||
g_free(n->urls);
|
g_free(n->urls);
|
||||||
|
g_free(n->colors[ColFG]);
|
||||||
|
g_free(n->colors[ColBG]);
|
||||||
|
g_free(n->colors[ColFrame]);
|
||||||
|
|
||||||
actions_free(n->actions);
|
actions_free(n->actions);
|
||||||
rawimage_free(n->raw_icon);
|
rawimage_free(n->raw_icon);
|
||||||
@ -312,11 +315,11 @@ void notification_init(notification *n)
|
|||||||
|
|
||||||
/* Color hints */
|
/* Color hints */
|
||||||
if (!n->colors[ColFG])
|
if (!n->colors[ColFG])
|
||||||
n->colors[ColFG] = xctx.colors[ColFG][n->urgency];
|
n->colors[ColFG] = g_strdup(xctx.colors[ColFG][n->urgency]);
|
||||||
if (!n->colors[ColBG])
|
if (!n->colors[ColBG])
|
||||||
n->colors[ColBG] = xctx.colors[ColBG][n->urgency];
|
n->colors[ColBG] = g_strdup(xctx.colors[ColBG][n->urgency]);
|
||||||
if (!n->colors[ColFrame])
|
if (!n->colors[ColFrame])
|
||||||
n->colors[ColFrame] = xctx.colors[ColFrame][n->urgency];
|
n->colors[ColFrame] = g_strdup(xctx.colors[ColFrame][n->urgency]);
|
||||||
|
|
||||||
/* Sanitize misc hints */
|
/* Sanitize misc hints */
|
||||||
if (n->progress < 0 || n->progress > 100)
|
if (n->progress < 0 || n->progress > 100)
|
||||||
|
@ -55,8 +55,8 @@ typedef struct _notification {
|
|||||||
|
|
||||||
enum markup_mode markup;
|
enum markup_mode markup;
|
||||||
const char *format;
|
const char *format;
|
||||||
const char *colors[3];
|
|
||||||
const char *script;
|
const char *script;
|
||||||
|
char *colors[3];
|
||||||
|
|
||||||
/* Hints */
|
/* Hints */
|
||||||
bool transient; /* timeout albeit user is idle */
|
bool transient; /* timeout albeit user is idle */
|
||||||
|
12
src/rules.c
12
src/rules.c
@ -28,10 +28,14 @@ void rule_apply(rule_t *r, notification *n)
|
|||||||
rawimage_free(n->raw_icon);
|
rawimage_free(n->raw_icon);
|
||||||
n->raw_icon = NULL;
|
n->raw_icon = NULL;
|
||||||
}
|
}
|
||||||
if (r->fg)
|
if (r->fg) {
|
||||||
n->colors[ColFG] = r->fg;
|
g_free(n->colors[ColFG]);
|
||||||
if (r->bg)
|
n->colors[ColFG] = g_strdup(r->fg);
|
||||||
n->colors[ColBG] = r->bg;
|
}
|
||||||
|
if (r->bg) {
|
||||||
|
g_free(n->colors[ColBG]);
|
||||||
|
n->colors[ColBG] = g_strdup(r->bg);
|
||||||
|
}
|
||||||
if (r->format)
|
if (r->format)
|
||||||
n->format = r->format;
|
n->format = r->format;
|
||||||
if (r->script)
|
if (r->script)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user