mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
First, icons have been finalized in the specification. There were only
three things we needed to adjust:
* symbolic names are base64 encoded
* there are a couple of OSC-99 defined symbolic names that need to be
translated to the corresponding XDG icon name.
* allow in-band icons without a cache ID (that is, allow applications
to use p=icon without having to cache the icon first).
Second, add support for the following new additions to the protocol:
* 'f': custom app-name, overrides the terminal's app-id
* 't': categories
* 'p=alive': lets applications poll for currently active notifications
* 'id' is now 'unset' by default, rather than "0"
* 'w': expire time (i.e. notification timeout)
* "buttons": aka actions. This lets applications add additional (to
the terminal defined "default" action) actions. The 'activated' event
has been updated to report which button/action was used to activate
the notification.
To support button/actions, desktop-notifications.command had to be
reworked a bit.
There's now a new config option:
desktop-notifications.command-action-arg. It has two template
arguments ${action-name} and ${action-label}.
command-action-arg gets expanded for *each* action.
${action-name} and ${action-label} has been replaced by ${action-arg}
in command. This is a somewhat special template, in that it gets
replaced by *all* instances of the expanded actions.
89 lines
2.2 KiB
C
89 lines
2.2 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;
|
|
char *title;
|
|
char *body;
|
|
char *category;
|
|
|
|
char *app_id; /* Custm app-id, overrides the terminal's app-id */
|
|
char *icon_id;
|
|
char *icon_symbolic_name;
|
|
uint8_t *icon_data;
|
|
size_t icon_data_sz;
|
|
|
|
enum notify_when when;
|
|
enum notify_urgency urgency;
|
|
int32_t expire_time;
|
|
tll(char *) actions;
|
|
|
|
bool focus;
|
|
bool may_be_programatically_closed;
|
|
bool report_activated;
|
|
bool report_closed;
|
|
|
|
/*
|
|
* Used internally by notify
|
|
*/
|
|
|
|
uint32_t external_id; /* Daemon assigned notification ID */
|
|
bool activated; /* User 'activated' the 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);
|