2020-08-04 23:28:16 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
2021-05-07 16:41:02 +02:00
|
|
|
#include <stdarg.h>
|
2020-08-04 23:28:16 +01:00
|
|
|
#include <stddef.h>
|
2024-01-23 20:33:46 +00:00
|
|
|
#include <string.h>
|
2020-10-09 19:43:04 +02:00
|
|
|
#include <wchar.h>
|
fcft: adapt to API changes in fcft-3.x
Fcft no longer uses wchar_t, but plain uint32_t to represent
codepoints.
Since we do a fair amount of string operations in foot, it still makes
sense to use something that actually _is_ a string (or character),
rather than an array of uint32_t.
For this reason, we switch out all wchar_t usage in foot to
char32_t. We also verify, at compile-time, that char32_t used
UTF-32 (which is what fcft expects).
Unfortunately, there are no string functions for char32_t. To avoid
having to re-implement all wcs*() functions, we add a small wrapper
layer of c32*() functions.
These wrapper functions take char32_t arguments, but then simply call
the corresponding wcs*() function.
For this to work, wcs*() must _also_ be UTF-32 compatible. We can
check for the presence of the __STDC_ISO_10646__ macro. If set,
wchar_t is at least 4 bytes and its internal representation is UTF-32.
FreeBSD does *not* define this macro, because its internal wchar_t
representation depends on the current locale. It _does_ use UTF-32
_if_ the current locale is UTF-8.
Since foot enforces UTF-8, we simply need to check if __FreeBSD__ is
defined.
Other fcft API changes:
* fcft_glyph_rasterize() -> fcft_codepoint_rasterize()
* font.space_advance has been removed
* ‘tags’ have been removed from fcft_grapheme_rasterize()
* ‘fcft_log_init()’ removed
* ‘fcft_init()’ and ‘fcft_fini()’ must be explicitly called
2021-08-21 14:50:42 +02:00
|
|
|
#include <uchar.h>
|
|
|
|
|
|
|
|
|
|
#include "char32.h"
|
2020-08-04 23:28:16 +01:00
|
|
|
#include "macros.h"
|
|
|
|
|
|
|
|
|
|
void *xmalloc(size_t size) XMALLOC;
|
|
|
|
|
void *xcalloc(size_t nmemb, size_t size) XMALLOC;
|
2020-08-07 01:05:04 +01:00
|
|
|
void *xrealloc(void *ptr, size_t size);
|
2025-01-30 09:06:24 +01:00
|
|
|
void *xreallocarray(void *ptr, size_t n, size_t size);
|
2020-08-04 23:28:16 +01:00
|
|
|
char *xstrdup(const char *str) XSTRDUP;
|
2020-08-07 01:05:04 +01:00
|
|
|
char *xstrndup(const char *str, size_t n) XSTRDUP;
|
2020-08-04 23:28:16 +01:00
|
|
|
char *xasprintf(const char *format, ...) PRINTF(1) XMALLOC;
|
2021-05-07 16:41:02 +02:00
|
|
|
char *xvasprintf(const char *format, va_list va) VPRINTF(1) XMALLOC;
|
fcft: adapt to API changes in fcft-3.x
Fcft no longer uses wchar_t, but plain uint32_t to represent
codepoints.
Since we do a fair amount of string operations in foot, it still makes
sense to use something that actually _is_ a string (or character),
rather than an array of uint32_t.
For this reason, we switch out all wchar_t usage in foot to
char32_t. We also verify, at compile-time, that char32_t used
UTF-32 (which is what fcft expects).
Unfortunately, there are no string functions for char32_t. To avoid
having to re-implement all wcs*() functions, we add a small wrapper
layer of c32*() functions.
These wrapper functions take char32_t arguments, but then simply call
the corresponding wcs*() function.
For this to work, wcs*() must _also_ be UTF-32 compatible. We can
check for the presence of the __STDC_ISO_10646__ macro. If set,
wchar_t is at least 4 bytes and its internal representation is UTF-32.
FreeBSD does *not* define this macro, because its internal wchar_t
representation depends on the current locale. It _does_ use UTF-32
_if_ the current locale is UTF-8.
Since foot enforces UTF-8, we simply need to check if __FreeBSD__ is
defined.
Other fcft API changes:
* fcft_glyph_rasterize() -> fcft_codepoint_rasterize()
* font.space_advance has been removed
* ‘tags’ have been removed from fcft_grapheme_rasterize()
* ‘fcft_log_init()’ removed
* ‘fcft_init()’ and ‘fcft_fini()’ must be explicitly called
2021-08-21 14:50:42 +02:00
|
|
|
char32_t *xc32dup(const char32_t *str) XSTRDUP;
|
2024-01-23 20:33:46 +00:00
|
|
|
|
2024-03-16 20:28:10 +00:00
|
|
|
static inline void *
|
|
|
|
|
xmemdup(const void *ptr, size_t size)
|
|
|
|
|
{
|
|
|
|
|
return memcpy(xmalloc(size), ptr, size);
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-23 20:33:46 +00:00
|
|
|
static inline char *
|
2024-08-03 08:12:13 +01:00
|
|
|
xstrjoin(const char *s1, const char *s2)
|
2024-01-23 20:33:46 +00:00
|
|
|
{
|
|
|
|
|
size_t n1 = strlen(s1);
|
2024-08-03 08:12:13 +01:00
|
|
|
size_t n2 = strlen(s2);
|
|
|
|
|
char *joined = xmalloc(n1 + n2 + 1);
|
|
|
|
|
memcpy(joined, s1, n1);
|
|
|
|
|
memcpy(joined + n1, s2, n2 + 1);
|
|
|
|
|
return joined;
|
|
|
|
|
}
|
osc: kitty notifications: cleanup and update to latest version of spec
* 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.
2024-08-02 08:07:13 +02:00
|
|
|
|
2024-08-03 08:12:13 +01:00
|
|
|
static inline char *
|
|
|
|
|
xstrjoin3(const char *s1, const char *s2, const char *s3)
|
|
|
|
|
{
|
|
|
|
|
size_t n1 = strlen(s1);
|
|
|
|
|
size_t n2 = strlen(s2);
|
|
|
|
|
size_t n3 = strlen(s3);
|
osc: kitty notifications: cleanup and update to latest version of spec
* 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.
2024-08-02 08:07:13 +02:00
|
|
|
char *joined = xmalloc(n1 + n2 + n3 + 1);
|
2024-01-23 20:33:46 +00:00
|
|
|
memcpy(joined, s1, n1);
|
2024-08-03 08:12:13 +01:00
|
|
|
memcpy(joined + n1, s2, n2);
|
|
|
|
|
memcpy(joined + n1 + n2, s3, n3 + 1);
|
2024-01-23 20:33:46 +00:00
|
|
|
return joined;
|
|
|
|
|
}
|