mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
* Don't store a list of unfinished notifications. Use a single one. If
the notification ID of the 'current' notification doesn't match the
previous, unfinished one, the 'current' notification replaces the
previous one, instead of updating it.
* Update xstrjoin() to take an optional delimiter (for example ','),
and use that when joining categories and 'alive IDs'.
* Rename ${action-arg} to ${action-argument}
* Update handling of the 'n' parameter (symbolic icon name); the spec
allows it to be used multiple times, and the terminal is supposed to
pick the first one it can resolve. Foot can't resolve icons at all,
neither can 'notify-send' or 'fyi' (which is what foot typically
executes to display a notification); it's the notification daemon that
resolves icons.
The spec _could_ be interpreted to mean the terminal should lookup
.desktop files, and use the value of the 'Icon' key from the first
matching .desktop files. But foot doesn't read .desktop files, and I
don't intend to implement XDG directory scanning and parsing of
.desktop files just to figure out which icon to use.
Instead, use a simple heuristics; use the *shortest* symbolic
names. The idea is pretty simple: plain icon names are typically
shorter than .desktop file IDs.
92 lines
2.6 KiB
C
92 lines
2.6 KiB
C
#pragma once
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <unistd.h>
|
|
|
|
#include <tllist.h>
|
|
|
|
struct terminal;
|
|
|
|
enum notify_when {
|
|
/* First, so that it can be left out of initializer and still be
|
|
the default */
|
|
NOTIFY_ALWAYS,
|
|
|
|
NOTIFY_UNFOCUSED,
|
|
NOTIFY_INVISIBLE
|
|
};
|
|
|
|
enum notify_urgency {
|
|
/* First, so that it can be left out of initializer and still be
|
|
the default */
|
|
NOTIFY_URGENCY_NORMAL,
|
|
|
|
NOTIFY_URGENCY_LOW,
|
|
NOTIFY_URGENCY_CRITICAL,
|
|
};
|
|
|
|
struct notification {
|
|
/*
|
|
* Set by caller of notify_notify()
|
|
*/
|
|
char *id; /* Internal notification ID */
|
|
|
|
char *app_id; /* Custom app-id, overrides the terminal's app-id if set */
|
|
char *title; /* Required */
|
|
char *body;
|
|
char *category;
|
|
|
|
enum notify_when when;
|
|
enum notify_urgency urgency;
|
|
int32_t expire_time;
|
|
|
|
tll(char *) actions;
|
|
|
|
char *icon_cache_id;
|
|
char *icon_symbolic_name;
|
|
uint8_t *icon_data;
|
|
size_t icon_data_sz;
|
|
|
|
bool focus; /* Focus the foot window when notification is activated */
|
|
bool may_be_programatically_closed; /* OSC-99: notification may be programatically closed by the client */
|
|
bool report_activated; /* OSC-99: report notification activation to client */
|
|
bool report_closed; /* OSC-99: report notification closed to client */
|
|
|
|
/*
|
|
* Used internally by notify
|
|
*/
|
|
|
|
uint32_t external_id; /* Daemon assigned notification ID */
|
|
bool activated; /* User 'activated' the notification */
|
|
uint32_t button_count; /* Number of buttons (custom actions) in notification */
|
|
uint32_t activated_button; /* User activated one of the custom actions */
|
|
char *xdg_token; /* XDG activation token, from daemon */
|
|
|
|
pid_t pid; /* Notifier command PID */
|
|
int stdout_fd; /* Notifier command's stdout */
|
|
|
|
char *stdout_data; /* Data we've reado from command's stdout */
|
|
size_t stdout_sz;
|
|
|
|
/* Used when notification provides raw icon data, and it's
|
|
bypassing the icon cache */
|
|
char *icon_path;
|
|
int icon_fd;
|
|
};
|
|
|
|
struct notification_icon {
|
|
char *id;
|
|
char *symbolic_name;
|
|
char *tmp_file_name;
|
|
int tmp_file_fd;
|
|
};
|
|
|
|
bool notify_notify(struct terminal *term, struct notification *notif);
|
|
void notify_close(struct terminal *term, const char *id);
|
|
void notify_free(struct terminal *term, struct notification *notif);
|
|
|
|
void notify_icon_add(struct terminal *term, const char *id,
|
|
const char *symbolic_name, const uint8_t *data,
|
|
size_t data_sz);
|
|
void notify_icon_del(struct terminal *term, const char *id);
|
|
void notify_icon_free(struct notification_icon *icon);
|