mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
osc: kitty notifications: updated support for icons
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.
This commit is contained in:
parent
c7cffea9ee
commit
ccb184ae64
7 changed files with 245 additions and 49 deletions
12
base64.c
12
base64.c
|
|
@ -42,7 +42,7 @@ static const char lookup[64] = {
|
|||
};
|
||||
|
||||
char *
|
||||
base64_decode(const char *s)
|
||||
base64_decode(const char *s, size_t *size)
|
||||
{
|
||||
const size_t len = strlen(s);
|
||||
if (unlikely(len % 4 != 0)) {
|
||||
|
|
@ -54,6 +54,9 @@ base64_decode(const char *s)
|
|||
if (unlikely(ret == NULL))
|
||||
return NULL;
|
||||
|
||||
if (unlikely(size != NULL))
|
||||
*size = len / 4 * 3;
|
||||
|
||||
for (size_t i = 0, o = 0; i < len; i += 4, o += 3) {
|
||||
unsigned a = reverse_lookup[(unsigned char)s[i + 0]];
|
||||
unsigned b = reverse_lookup[(unsigned char)s[i + 1]];
|
||||
|
|
@ -68,6 +71,13 @@ base64_decode(const char *s)
|
|||
if (unlikely(i + 4 != len || (a | b) & P || (c & P && !(d & P))))
|
||||
goto invalid;
|
||||
|
||||
if (unlikely(size != NULL)) {
|
||||
if (c & P)
|
||||
*size = len / 4 * 3 - 2;
|
||||
else
|
||||
*size = len / 4 * 3 - 1;
|
||||
}
|
||||
|
||||
c &= 63;
|
||||
d &= 63;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue