mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-25 01:40:19 -05:00
notify: try to read the daemon assigned notification ID from stdout
And document the things we recognize in the notification helper's stdout.
This commit is contained in:
parent
e271027c0c
commit
f56da385fe
3 changed files with 56 additions and 3 deletions
43
notify.c
43
notify.c
|
|
@ -34,6 +34,27 @@ notify_free(struct terminal *term, struct notification *notif)
|
|||
free(notif->stdout_data);
|
||||
}
|
||||
|
||||
static bool
|
||||
to_integer(const char *line, size_t len, uint32_t *res)
|
||||
{
|
||||
bool is_id = true;
|
||||
uint32_t maybe_id = 0;
|
||||
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
char digit = line[i];
|
||||
if (digit < '0' || digit > '9') {
|
||||
is_id = false;
|
||||
break;
|
||||
}
|
||||
|
||||
maybe_id *= 10;
|
||||
maybe_id += digit - '0';
|
||||
}
|
||||
|
||||
*res = maybe_id;
|
||||
return is_id;
|
||||
}
|
||||
|
||||
static void
|
||||
consume_stdout(struct notification *notif, bool eof)
|
||||
{
|
||||
|
|
@ -54,10 +75,26 @@ consume_stdout(struct notification *notif, bool eof)
|
|||
} else if (!eof)
|
||||
break;
|
||||
|
||||
if (strcmp(line, "default") == 0)
|
||||
notif->activated = true;
|
||||
uint32_t maybe_id = 0;
|
||||
|
||||
/* Check for 'xdgtoken=xyz' */
|
||||
/* Check for daemon assigned ID, either '123', or 'id=123' */
|
||||
if (to_integer(line, len, &maybe_id) ||
|
||||
(len > 3 && memcmp(line, "id=", 3) == 0 &&
|
||||
to_integer(&line[3], len - 3, &maybe_id)))
|
||||
{
|
||||
notif->external_id = maybe_id;
|
||||
LOG_DBG("external ID: %u", notif->external_id);
|
||||
}
|
||||
|
||||
/* Check for triggered action, either 'default' or 'action=default' */
|
||||
else if ((len == 7 && memcmp(line, "default", 7) == 0) ||
|
||||
(len == 7 + 7 && memcmp(line, "action=default", 7 + 7) == 0))
|
||||
{
|
||||
notif->activated = true;
|
||||
LOG_DBG("notification's default action was triggered");
|
||||
}
|
||||
|
||||
/* Check for XDG activation token, 'xdgtoken=xyz' */
|
||||
else if (len > 9 && memcmp(line, "xdgtoken=", 9) == 0) {
|
||||
notif->xdg_token = xstrndup(&line[9], len - 9);
|
||||
LOG_DBG("XDG token: \"%s\"", notif->xdg_token);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue