mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
This implements the suggested protocol discussed in https://github.com/kovidgoyal/kitty/issues/7657. Icons are handled by loading a cache. Both in-band PNG data, and symbolic names are allowed. Applications use a graphical ID to reference the icon both when loading the cache, and when showing a notification. * 'g' is the graphical ID * 'n' is optional, and assigns a symbolic name to the icon * 'p=icon' - the payload is icon PNG data. It needs to be base64 encoded, but this is *not* implied. I.e. the application *must* use e=1 explicitly. To load an icon (in-band PNG data): printf '\e]99;g=123:p=icon;<base64-encoded-png-data>\e\\' or (symbolic name) printf '\e]99;g=123:n=firefox:p=icon;\e\\' Of course, we can combine the two, assigning *both* a symbolic name, *and* PNG data: printf '\e]99;g=123:n=firefox:p=icon;<base64-encoded-png>\e\\' Then, to use the icon in a notification: printf '\e]99;g=123;this is a notification\e\\' Foot also allows a *symbolic* icon to be defined and used at the same time: printf '\e]99;g=123:n=firefox;this is a notification\e\\' This obviously won't work with PNG data, since it uses the payload portion of the escape sequence.
70 lines
1.6 KiB
C
70 lines
1.6 KiB
C
#pragma once
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <unistd.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 *icon_id;
|
|
char *icon_symbolic_name;
|
|
uint8_t *icon_data;
|
|
size_t icon_data_sz;
|
|
|
|
enum notify_when when;
|
|
enum notify_urgency urgency;
|
|
bool focus;
|
|
bool report;
|
|
|
|
/*
|
|
* Used internally by notify
|
|
*/
|
|
|
|
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;
|
|
};
|
|
|
|
struct notification_icon {
|
|
char *id;
|
|
char *symbolic_name;
|
|
char *tmp_file_on_disk;
|
|
};
|
|
|
|
bool notify_notify(const struct terminal *term, struct notification *notif);
|
|
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);
|