Commit graph

3298 commits

Author SHA1 Message Date
Daniel Eklöf
a0afae747b
config: add new option ‘selection-target’
This option controls the clipboard target that selected text should be
copied to.
2021-02-12 10:55:06 +01:00
Daniel Eklöf
79e3a46943
reaper: monitor SIGCHLD using the FDM instead of via a signalfd
In addition to letting the FDM do the low-level signal watching, this
patch also fixes a bug; multiple SIGCHLDs, be it delivered either through a
signal, or via a signalfd, can be coalesced, like all signals.

This means we need to loop on waitpid() with WNOHANG until there are
no more processes to reap.

This in turn requires a small change to the way reaper callbacks are
implemented.

Previously, the callback was allowed to do the wait(). This was
signalled back to the reaper through the callback’s return value.

Now, since we’ve already wait():ed, the process’ exit status is passed
as an argument to the reaper callback.

The callback for the client application has been updated accordingly;
it sets a flag in the terminal struct, telling term_destroy() that the
process has already been wait():ed on, and also stores the exit
status.
2021-02-12 10:53:10 +01:00
Daniel Eklöf
37220fc189
render: block all signals in the rendering threads 2021-02-12 10:53:10 +01:00
Daniel Eklöf
89f49b5bc7
main: monitor SIGINT+SIGTERM using the FDM 2021-02-12 10:53:10 +01:00
Daniel Eklöf
cf1335f258
fdm: add support for managing signals
Add fdm_signal_add() and fdm_signal_del(). Signals added to the fdm
will be monitored, and the provided callback called as “soon as
possible” from the main context (i.e not from the signal handler
context).

Monitored signals are *blocked* by default. We use epoll_pwait() to
unblock them while we’re polling. This allows us to do race-free
signal detection.

We use a single handler for all monitored signals; the handler simply
updates the signal’s slot in a global array (sized to fit SIGRTMAX
signals).

When epoll_pwait() returns EINTR, we loop the global array. The
callback associated with each signal that fired is called.
2021-02-12 10:53:10 +01:00
Daniel Eklöf
ac46e58448
install: add -Dterminfo to list of compile-time options 2021-02-12 10:48:17 +01:00
Daniel Eklöf
a60b7babd3
changelog: -Dterminfo changed from boolean to feature option 2021-02-12 10:48:13 +01:00
Daniel Eklöf
c49eac2147
meson: convert -Dterminfo from a boolean to a feature option
Patch from Jan Beich
2021-02-12 10:48:06 +01:00
Tadeo Kondrak
8a32c5c5c1
ime: Reset terminal's IME state on text_input.leave
To reproduce issue:
- Launch an IME from inside foot
- Type in some preedit text
- Use Ctrl-C to close the IME
- IME text stays in terminal until focus is changed
2021-02-12 10:45:43 +01:00
Daniel Eklöf
6e94da182c
changelog: add section for 1.6.4 2021-02-12 10:44:42 +01:00
Daniel Eklöf
4c168b84cf
meson/pkgbuild: bump version to 1.6.3 2021-01-29 19:53:10 +01:00
Daniel Eklöf
efd1e05b48
changelog: prepare for 1.6.3 2021-01-29 19:52:27 +01:00
Tadeo Kondrak
8f0a3ee7a9
Send text_input_rectangle requests for text-input 2021-01-29 19:39:48 +01:00
Daniel Eklöf
9411054b50
ci: freebsd: don’t need -Wno-missing-braces anymore
builds.sr.ht has been updated to FreeBSD-12.2
2021-01-29 10:57:32 +01:00
Daniel Eklöf
7049c95b62
selection: don’t replace \r\n and \n with \r in bracketed paste mode 2021-01-27 10:54:37 +01:00
Daniel Eklöf
567071e48a
selection: no xassert() in the releases/1.6 branch 2021-01-26 20:48:56 +01:00
Daniel Eklöf
5db389da21
search: match composed characters when extending the search string to the next word boundary 2021-01-26 20:47:51 +01:00
Daniel Eklöf
709d6deeae
search: fix matching of multi-column characters
We were matching the sub-sequence SPACERs as if they were regular
characters, which obviously failed.
2021-01-26 20:47:43 +01:00
Daniel Eklöf
7611a6c7fc
selection: remove duplicate ‘ESC’ in switch case 2021-01-26 20:47:37 +01:00
Daniel Eklöf
c8fdd3a214
selection: DEL is 0x7f, not 0x1f 2021-01-26 20:47:35 +01:00
Daniel Eklöf
94d587fa6a
selection: codespell: stript -> strip 2021-01-26 20:47:32 +01:00
Daniel Eklöf
9f8856ee7d
selection: strip non-formatting C0, BS, HT and DEL from pasted text 2021-01-26 20:47:22 +01:00
Daniel Eklöf
579f3cf8e3
selection: unbreak text/uri-list decoding: we’re not using \r, not \n
Before passing the pasted text to the decoder, we now replace \r\n,
and \n, with \r.

The URI decoder was looking for a \n, which meant we failed to split
up the list and instead pasted a single “multi-line” URI.
2021-01-26 20:47:19 +01:00
Daniel Eklöf
f32b924241
selection: replace \r\n and \n with \r, and strip \e from pasted text
Closes #305
Closes #306
2021-01-26 20:47:14 +01:00
Daniel Eklöf
adbf036053
ime: fix rendering of pre-edit cursor when positioned after the pre-edit string
We failed to convert the byte-indices to cell indices, resulting in a
box cursor covering the entire pre-edit string.

Note that in addition to fixing the translation from byte index to
cell index, the rendered had to be updated to dirty one extra cell
from the original grid.

Without this, we left trailing cursors behind us when the user deleted
text from the pre-edit string.
2021-01-26 20:46:59 +01:00
Daniel Eklöf
f9a43209f2
search: ad-hoc workaround for combining characters with positive x-offsets
When rendering the search input box, do the same ad-hoc workaround for
combining characters with a positive x-offset as we do when rendering
normal grid cells.

In this case, we don’t *know* when we’re dealing with combining
characters. But we can detect zero-width characters. For these, check
their glyph’s x-offset. If positive, adjust it like we do when
rendering combining glyphs in the main grid, to ensure the glyph is
positioned over the _previous_ character, not the next.
2021-01-26 20:46:50 +01:00
Daniel Eklöf
569795a529
changelog: high cpu usage while holding down e.g. arrow keys in search mode 2021-01-26 20:45:42 +01:00
Daniel Eklöf
9d51f2cb1a
search: don’t re-scan the scrollback unless the search string actually has changed 2021-01-26 20:45:35 +01:00
Daniel Eklöf
8df49c7f84
search: fix matching against composed characters 2021-01-26 20:43:18 +01:00
Daniel Eklöf
b4448d2c03
changelog: search input box no longer accepts non-printables 2021-01-26 20:43:06 +01:00
Daniel Eklöf
96af3971de
search: filter out non-printable characters
Don’t allow non-printable characters in the search input string.
2021-01-26 20:42:09 +01:00
Daniel Eklöf
3252131dd4
terminal: fix encoding of mouse buttons 6 and 7 in mouse events
These two buttons were encoded using the *exact* same numbers as
button 4 and 5 (scroll wheel up/down), making it impossible to
distinguish them.

The relevant section from XTerm’s control sequences documentation is:

    Some wheel mice can send additional button events, e.g., by tilting the
    scroll wheel left and right.

    Additional buttons are encoded like the wheel mice,

    o  by adding 64 (for buttons 6 and 7), or

    o  by adding 128 (for buttons 8 through 11).
2021-01-26 20:41:25 +01:00
Daniel Eklöf
30ef3fe4b6
changelog: add bug ref to the ‘FreeBSD support’ entry 2021-01-23 10:20:32 +01:00
Daniel Eklöf
07bb18847d
changelog: freebsd support 2021-01-23 10:18:59 +01:00
Daniel Eklöf
207fdaf06c
ci: freebsd-x64: compile with -Wno-missing-braces
The freebsd/latest image is still FreeBSD-12, with clang-8. It
generate false positive warnings:

../../foot/search.c:357:21: error: suggest braces around initialization of subobject [-Werror,-Wmissing-braces]
    mbstate_t ps = {0};
2021-01-23 10:18:33 +01:00
Daniel Eklöf
1f745655ac
shm: don’t check for __i386__ and __x86_64__ - there are other architectures out there
Instead, check for __SIZEOF_POINTER__ == 8, since what we’re really
interested in is whether we have enough virtual address space or not.
2021-01-23 10:18:30 +01:00
Daniel Eklöf
c70694bd8f
client: explicitly use a 64-bit type for ‘total_len’
This fixes an out-of-range comparison in 32-bit builds:

 client.c:289:19: error: result of comparison of constant 4294967296 with expression of type 'size_t' (aka 'unsigned int') is always false [-Werror,-Wtautological-constant-out-of-range-compare]
        if (total_len >= 1llu << (8 * sizeof(uint32_t)) ||
            ~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2021-01-23 10:18:26 +01:00
Jan Beich
ab040d0d6f
completions/zsh: unbreak with BSD find(1)
find: -printf: unknown primary or operator
2021-01-23 10:18:23 +01:00
Jan Beich
d31cc9b5ef
ci: enable freebsd-x64 job
- Add missing dependencies
- Disable terminfo to match downstream
2021-01-23 10:18:19 +01:00
Jan Beich
8b092256d1
meson: optionalize terminfo dependency
ncurses on FreeBSD still uses termcap(5) while foot works fine with
xterm-256color sans status line and visible bell. Having more than
one ncurses version installed may break other applications.

Document -Dterminfo=false uses --term=xterm-256color by default
2021-01-23 10:18:09 +01:00
Jan Beich
0b07bf78f0
meson: depend on wayland-client when using wayland-protocols
Base compiler on BSDs doesn't look where packages are installed to
avoid tainting build environment. When system fcft is installed to
the same prefix as wayland-client it passes CFLAGS that satisfy both
but when using subprojects/fcft there's a build error.

xdg-shell.c:33:10: fatal error: 'wayland-util.h' file not found
xdg-decoration-unstable-v1.c:28:10: fatal error: 'wayland-util.h' file not found
xdg-output-unstable-v1.c:28:10: fatal error: 'wayland-util.h' file not found
presentation-time.c:28:10: fatal error: 'wayland-util.h' file not found
primary-selection-unstable-v1.c:28:10: fatal error: 'wayland-util.h' file not found
text-input-unstable-v3.c:33:10: fatal error: 'wayland-util.h' file not found
In file included from ../../foot/grid.c:1:
In file included from ../../foot/grid.h:5:
In file included from ../../foot/terminal.h:19:
../../foot/wayland.h:8:10: fatal error: 'wayland-client.h' file not found
In file included from ../../foot/selection.c:1:
../../foot/selection.h:4:10: fatal error: 'wayland-client.h' file not found
2021-01-23 10:16:52 +01:00
Jan Beich
3ac107ce82
meson: require epoll-shim on BSDs
epoll/timerfd are Linux-only but BSDs have a shim via kqueue.
libwayland on FreeBSD uses epoll-shim by default, so the build may
fail at linking instead of compilation stage.

csi.c:13:10: fatal error: 'sys/timerfd.h' file not found
 #include <sys/timerfd.h>
          ^~~~~~~~~~~~~~~
selection.c:10:10: fatal error: 'sys/epoll.h' file not found
 #include <sys/epoll.h>
          ^~~~~~~~~~~~~
terminal.c:15:10: fatal error: 'sys/epoll.h' file not found
 #include <sys/epoll.h>
          ^~~~~~~~~~~~~
ld: error: undefined symbol: timerfd_create
>>> referenced by pgo.c:154 (pgo/pgo.c:154)
>>>               pgo.p/pgo_pgo.c.o:(main)
>>> referenced by pgo.c:158 (pgo/pgo.c:158)
>>>               pgo.p/pgo_pgo.c.o:(main)
>>> referenced by terminal.c:2022 (terminal.c:2022)
>>>               terminal.c.o:(cursor_blink_rearm_timer) in archive libpgolib.a
>>> referenced 7 more times

ld: error: undefined symbol: epoll_shim_close
>>> referenced by pgo.c:160 (pgo/pgo.c:160)
>>>               pgo.p/pgo_pgo.c.o:(main)
>>> referenced by pgo.c:258 (pgo/pgo.c:258)
>>>               pgo.p/pgo_pgo.c.o:(main)
>>> referenced by pgo.c:277 (pgo/pgo.c:277)
>>>               pgo.p/pgo_pgo.c.o:(main)
>>> referenced 14 more times

ld: error: undefined symbol: epoll_shim_read
>>> referenced by pgo.c:251 (pgo/pgo.c:251)
>>>               pgo.p/pgo_pgo.c.o:(main)
>>> referenced by terminal.c:237 (terminal.c:237)
>>>               terminal.c.o:(fdm_ptmx) in archive libpgolib.a
>>> referenced by terminal.c:363 (terminal.c:363)
>>>               terminal.c.o:(fdm_blink) in archive libpgolib.a
>>> referenced 8 more times

ld: error: undefined symbol: timerfd_settime
>>> referenced by terminal.c:301 (terminal.c:301)
>>>               terminal.c.o:(fdm_ptmx) in archive libpgolib.a
>>> referenced by terminal.c:309 (terminal.c:309)
>>>               terminal.c.o:(fdm_ptmx) in archive libpgolib.a
>>> referenced by terminal.c:2041 (terminal.c:2041)
>>>               terminal.c.o:(cursor_blink_rearm_timer) in archive libpgolib.a
>>> referenced 11 more times

ld: error: undefined symbol: timerfd_gettime
>>> referenced by selection.c:1165 (selection.c:1165)
>>>               selection.c.o:(selection_start_scroll_timer) in archive libpgolib.a
2021-01-23 10:16:48 +01:00
Jan Beich
796301f228
meson: libpthread may lack C11 threads e.g., on FreeBSD
ld: error: undefined symbol: mtx_init
>>> referenced by terminal.c:579 (terminal.c:579)
>>>               terminal.c.o:(initialize_render_workers) in archive libpgolib.a

ld: error: undefined symbol: thrd_create
>>> referenced by terminal.c:595 (terminal.c:595)
>>>               terminal.c.o:(initialize_render_workers) in archive libpgolib.a
>>> referenced by terminal.c:935 (terminal.c:935)
>>>               terminal.c.o:(reload_fonts) in archive libpgolib.a
>>> did you mean: thr_create
>>> defined in: /lib/libc.so.7

ld: error: undefined symbol: mtx_lock
>>> referenced by terminal.c:1410 (terminal.c:1410)
>>>               terminal.c.o:(term_destroy) in archive libpgolib.a

ld: error: undefined symbol: mtx_unlock
>>> referenced by terminal.c:1427 (terminal.c:1427)
>>>               terminal.c.o:(term_destroy) in archive libpgolib.a

ld: error: undefined symbol: thrd_join
>>> referenced by terminal.c:1462 (terminal.c:1462)
>>>               terminal.c.o:(term_destroy) in archive libpgolib.a
>>> referenced by terminal.c:947 (terminal.c:947)
>>>               terminal.c.o:(reload_fonts) in archive libpgolib.a

ld: error: undefined symbol: mtx_destroy
>>> referenced by terminal.c:1466 (terminal.c:1466)
>>>               terminal.c.o:(term_destroy) in archive libpgolib.a
2021-01-23 10:16:46 +01:00
Jan Beich
909938b83c
meson: don't force POSIX compliance
foot uses a number of functions not in any POSIX version. On non-glibc
systems defining _POSIX_C_SOURCE usually hides non-compliant interfaces.

In file included from grid.c:1:
In file included from grid.h:4:
terminal.h:45:15: error: expected parameter declarator
static_assert(sizeof(struct attributes) == 8, "bad size");
              ^
terminal.h:45:15: error: expected ')'
terminal.h:45:14: note: to match this '('
static_assert(sizeof(struct attributes) == 8, "bad size");
             ^
terminal.h:45:1: error: type specifier missing, defaults to 'int' [-Werror,-Wimplicit-int]
static_assert(sizeof(struct attributes) == 8, "bad size");
^
terminal.h:55:15: error: expected parameter declarator
static_assert(sizeof(struct cell) == 12, "bad size");
              ^
terminal.h:55:15: error: expected ')'
terminal.h:55:14: note: to match this '('
static_assert(sizeof(struct cell) == 12, "bad size");
             ^
terminal.h:55:1: error: type specifier missing, defaults to 'int' [-Werror,-Wimplicit-int]
static_assert(sizeof(struct cell) == 12, "bad size");
^
grid.c:317:32: error: implicit declaration of function 'wcwidth' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
            int width = max(1, wcwidth(wc));
                               ^
grid.c:317:32: note: did you mean '__wcwidth'?
/usr/include/_ctype.h:161:1: note: '__wcwidth' declared here
__wcwidth(__ct_rune_t _c)
^
selection.c:1695:9: error: implicit declaration of function 'pipe2' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    if (pipe2(fds, O_CLOEXEC) == -1) {
        ^
selection.c:1695:9: note: did you mean 'pipe'?
/usr/include/unistd.h:358:6: note: 'pipe' declared here
int      pipe(int *);
         ^
selection.c:1842:9: error: implicit declaration of function 'pipe2' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    if (pipe2(fds, O_CLOEXEC) == -1) {
        ^
selection.c:2129:9: error: implicit declaration of function 'pipe2' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    if (pipe2(fds, O_CLOEXEC) == -1) {
        ^
vt.c:241:12: error: implicit declaration of function 'wcwidth' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    assert(wcwidth(c) == 1);
           ^
vt.c:241:12: note: did you mean '__wcwidth'?
/usr/include/_ctype.h:161:1: note: '__wcwidth' declared here
__wcwidth(__ct_rune_t _c)
^
vt.c:544:17: error: implicit declaration of function 'wcwidth' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    int width = wcwidth(wc);
                ^
csi.c:713:35: error: implicit declaration of function 'wcwidth' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
                const int width = wcwidth(term->vt.last_printed);
                                  ^
csi.c:713:35: note: did you mean '__wcwidth'?
/usr/include/_ctype.h:161:1: note: '__wcwidth' declared here
__wcwidth(__ct_rune_t _c)
^
ime.c:169:25: error: implicit declaration of function 'wcwidth' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        int width = max(wcwidth(term->ime.preedit.text[i]), 1);
                        ^
ime.c:169:25: note: did you mean '__wcwidth'?
/usr/include/_ctype.h:161:1: note: '__wcwidth' declared here
__wcwidth(__ct_rune_t _c)
^
quirks.c:81:22: error: implicit declaration of function 'strcasestr' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
            is_kde = strcasestr(cur_desktop, "kde") != NULL;
                     ^
quirks.c:81:53: error: comparison between pointer and integer ('int' and 'void *') [-Werror,-Wpointer-integer-compare]
            is_kde = strcasestr(cur_desktop, "kde") != NULL;
                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~
config.c:89:15: error: expected ')'
static_assert(ALEN(binding_action_map) == BIND_ACTION_COUNT,
              ^
util.h:5:18: note: expanded from macro 'ALEN'
 #define ALEN(v) (sizeof(v) / sizeof((v)[0]))
                  ^
config.c:358:12: error: implicit declaration of function 'strcasecmp' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    return strcasecmp(s, "on") == 0 ||
           ^
config.c:358:12: note: did you mean 'wcscasecmp'?
/usr/include/wchar.h:223:5: note: 'wcscasecmp' declared here
int     wcscasecmp(const wchar_t *, const wchar_t *);
        ^
config.c:510:23: error: implicit declaration of function 'strcasecmp' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        bool center = strcasecmp(mode, "center") == 0;
                      ^
config.c:1243:13: error: implicit declaration of function 'strcasecmp' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        if (strcasecmp(value, "none") == 0) {
            ^
config.c:1330:13: error: implicit declaration of function 'strcasecmp' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        if (strcasecmp(value, "none") == 0) {
            ^
config.c:1534:13: error: implicit declaration of function 'strcasecmp' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        if (strcasecmp(value, "none") == 0) {
            ^
spawn.c:20:9: error: implicit declaration of function 'pipe2' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    if (pipe2(pipe_fds, O_CLOEXEC) < 0) {
        ^
spawn.c:20:9: note: did you mean 'pipe'?
/usr/include/unistd.h:358:6: note: 'pipe' declared here
int      pipe(int *);
         ^
spawn.c:52:5: error: implicit declaration of function 'static_assert' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    static_assert(sizeof(_errno) == sizeof(errno), "errno size mismatch");
    ^
server.c:309:21: error: implicit declaration of function 'accept4' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    int client_fd = accept4(
                    ^
server.c:309:21: note: did you mean 'accept'?
/usr/include/sys/socket.h:679:5: note: 'accept' declared here
int     accept(int, struct sockaddr * __restrict, socklen_t * __restrict);
        ^
server.c:310:59: error: use of undeclared identifier 'SOCK_CLOEXEC'
        server->fd, (struct sockaddr *)&addr, &addr_size, SOCK_CLOEXEC | SOCK_NONBLOCK);
                                                          ^
server.c:310:74: error: use of undeclared identifier 'SOCK_NONBLOCK'
        server->fd, (struct sockaddr *)&addr, &addr_size, SOCK_CLOEXEC | SOCK_NONBLOCK);
                                                                         ^
server.c:341:44: error: use of undeclared identifier 'SOCK_CLOEXEC'
    int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0);
                                           ^
server.c:341:59: error: use of undeclared identifier 'SOCK_NONBLOCK'
    int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0);
                                                          ^
server.c:371:44: error: use of undeclared identifier 'SOCK_CLOEXEC'
    int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0);
                                           ^
server.c:371:59: error: use of undeclared identifier 'SOCK_NONBLOCK'
    int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0);
                                                          ^
shm.c:138:26: error: use of undeclared identifier '_SC_PAGE_SIZE'
        long n = sysconf(_SC_PAGE_SIZE);
                         ^
shm.c:279:15: error: implicit declaration of function 'memfd_create' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    pool_fd = memfd_create("foot-wayland-shm-buffer-pool", MFD_CLOEXEC | MFD_ALLOW_SEALING);
              ^
shm.c:279:15: note: did you mean 'timer_create'?
/usr/include/time.h:170:5: note: 'timer_create' declared here
int timer_create(clockid_t, struct sigevent *__restrict, timer_t *__restrict);
    ^
shm.c:279:60: error: use of undeclared identifier 'MFD_CLOEXEC'
    pool_fd = memfd_create("foot-wayland-shm-buffer-pool", MFD_CLOEXEC | MFD_ALLOW_SEALING);
                                                           ^
shm.c:279:74: error: use of undeclared identifier 'MFD_ALLOW_SEALING'
    pool_fd = memfd_create("foot-wayland-shm-buffer-pool", MFD_CLOEXEC | MFD_ALLOW_SEALING);
                                                                         ^
shm.c:350:15: error: use of undeclared identifier 'F_SEAL_GROW'
              F_SEAL_GROW | F_SEAL_SHRINK | /*F_SEAL_FUTURE_WRITE |*/ F_SEAL_SEAL) < 0)
              ^
shm.c:350:29: error: use of undeclared identifier 'F_SEAL_SHRINK'
              F_SEAL_GROW | F_SEAL_SHRINK | /*F_SEAL_FUTURE_WRITE |*/ F_SEAL_SEAL) < 0)
                            ^
shm.c:350:71: error: use of undeclared identifier 'F_SEAL_SEAL'
              F_SEAL_GROW | F_SEAL_SHRINK | /*F_SEAL_FUTURE_WRITE |*/ F_SEAL_SEAL) < 0)
                                                                      ^
shm.c:349:24: error: use of undeclared identifier 'F_ADD_SEALS'
    if (fcntl(pool_fd, F_ADD_SEALS,
                       ^
slave.c:151:28: error: implicit declaration of function 'ptsname' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    const char *pts_name = ptsname(ptmx);
                           ^
slave.c:151:28: note: did you mean 'ttyname'?
/usr/include/unistd.h:371:7: note: 'ttyname' declared here
char    *ttyname(int);
         ^
slave.c:151:17: error: incompatible integer to pointer conversion initializing 'const char *' with an expression of type 'int' [-Werror,-Wint-conversion]
    const char *pts_name = ptsname(ptmx);
                ^          ~~~~~~~~~~~~~
slave.c:153:9: error: implicit declaration of function 'grantpt' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    if (grantpt(ptmx) == -1) {
        ^
slave.c:157:9: error: implicit declaration of function 'unlockpt' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    if (unlockpt(ptmx) == -1) {
        ^
slave.c:252:9: error: implicit declaration of function 'pipe2' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    if (pipe2(fork_pipe, O_CLOEXEC) < 0) {
        ^
slave.c:252:9: note: did you mean 'pipe'?
/usr/include/unistd.h:358:6: note: 'pipe' declared here
int      pipe(int *);
         ^
render.c:1166:28: error: implicit declaration of function 'wcwidth' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        int width = max(1, wcwidth(cell->wc));
                           ^
render.c:1166:28: note: did you mean '__wcwidth'?
/usr/include/_ctype.h:161:1: note: '__wcwidth' declared here
__wcwidth(__ct_rune_t _c)
^
render.c:1932:9: error: implicit declaration of function 'gettimeofday' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        gettimeofday(&start_time, NULL);
        ^
render.c:2240:28: error: implicit declaration of function 'wcwidth' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        widths[i] = max(1, wcwidth(text[i]));
                           ^
render.c:2243:32: error: implicit declaration of function 'wcswidth' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    const size_t total_cells = wcswidth(text, text_len);
                               ^
render.c:2243:32: note: did you mean 'wcwidth'?
render.c:1166:28: note: 'wcwidth' declared here
        int width = max(1, wcwidth(cell->wc));
                           ^
util.h:7:27: note: expanded from macro 'max'
 #define max(x, y) ((x) > (y) ? (x) : (y))
                           ^
input.c:1540:9: error: implicit declaration of function 'gettimeofday' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        gettimeofday(&now, NULL);
        ^
2021-01-23 10:16:43 +01:00
Jan Beich
9b09049c1c
render: set thread name in a portable way
prctl is Linux-only but pthread_setname_np is same as PR_SET_NAME.
Solaris and FreeBSD >= 13 have pthread_setname_np similar to Linux.
DragonFly, OpenBSD, FreeBSD < 13 lack pthread_setname_np but provide
pthread_set_name_np which doesn't return a value. NetBSD requires 3
arguments for pthread_setname_np where the last one is void *.

render.c:8:10: fatal error: 'sys/prctl.h' file not found
 #include <sys/prctl.h>
          ^~~~~~~~~~~~~
render.c🔢9: error: implicit declaration of function 'prctl' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    if (prctl(PR_SET_NAME, proc_title, 0, 0, 0) < 0)
        ^
render.c🔢15: error: use of undeclared identifier 'PR_SET_NAME'
    if (prctl(PR_SET_NAME, proc_title, 0, 0, 0) < 0)
              ^
2021-01-23 10:16:40 +01:00
Jan Beich
fcf3f124d6
shm: unbreak build without memfd_create
New FreeBSD versions have memfd_create but other BSDs don't.

pgo/pgo.c:260:22: error: implicit declaration of function 'memfd_create' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        int mem_fd = memfd_create("foot-pgo-ptmx", MFD_CLOEXEC);
                     ^
pgo/pgo.c:260:52: error: use of undeclared identifier 'MFD_CLOEXEC'
        int mem_fd = memfd_create("foot-pgo-ptmx", MFD_CLOEXEC);
                                                   ^
shm.c:13:10: fatal error: 'linux/mman.h' file not found
 #include <linux/mman.h>
          ^~~~~~~~~~~~~~
shm.c:277:15: error: implicit declaration of function 'memfd_create' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    pool_fd = memfd_create("foot-wayland-shm-buffer-pool", MFD_CLOEXEC | MFD_ALLOW_SEALING);
              ^
shm.c:277:60: error: use of undeclared identifier 'MFD_CLOEXEC'
    pool_fd = memfd_create("foot-wayland-shm-buffer-pool", MFD_CLOEXEC | MFD_ALLOW_SEALING);
                                                           ^
shm.c:277:74: error: use of undeclared identifier 'MFD_ALLOW_SEALING'
    pool_fd = memfd_create("foot-wayland-shm-buffer-pool", MFD_CLOEXEC | MFD_ALLOW_SEALING);
                                                                         ^
shm.c:339:15: error: use of undeclared identifier 'F_SEAL_GROW'
              F_SEAL_GROW | F_SEAL_SHRINK | /*F_SEAL_FUTURE_WRITE |*/ F_SEAL_SEAL) < 0)
              ^
shm.c:339:29: error: use of undeclared identifier 'F_SEAL_SHRINK'
              F_SEAL_GROW | F_SEAL_SHRINK | /*F_SEAL_FUTURE_WRITE |*/ F_SEAL_SEAL) < 0)
                            ^
shm.c:339:71: error: use of undeclared identifier 'F_SEAL_SEAL'
              F_SEAL_GROW | F_SEAL_SHRINK | /*F_SEAL_FUTURE_WRITE |*/ F_SEAL_SEAL) < 0)
                                                                      ^
shm.c:338:24: error: use of undeclared identifier 'F_ADD_SEALS'
    if (fcntl(pool_fd, F_ADD_SEALS,
                       ^
2021-01-23 10:16:37 +01:00
Jan Beich
93fd77e01b
shm: disable fallocate optimization if not supported
shm.c:301:26: error: implicit declaration of function 'fallocate' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        can_punch_hole = fallocate(
                         ^
shm.c:302:22: error: use of undeclared identifier 'FALLOC_FL_PUNCH_HOLE'
            pool_fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 1) == 0;
                     ^
shm.c:302:45: error: use of undeclared identifier 'FALLOC_FL_KEEP_SIZE'
            pool_fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 1) == 0;
                                            ^
shm.c:432:9: error: implicit declaration of function 'fallocate' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    if (fallocate(
        ^
shm.c:434:13: error: use of undeclared identifier 'FALLOC_FL_PUNCH_HOLE'
            FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
            ^
shm.c:434:36: error: use of undeclared identifier 'FALLOC_FL_KEEP_SIZE'
            FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
                                   ^
shm.c:501:9: error: implicit declaration of function 'fallocate' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    if (fallocate(
        ^
shm.c:503:13: error: use of undeclared identifier 'FALLOC_FL_PUNCH_HOLE'
            FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
            ^
shm.c:503:36: error: use of undeclared identifier 'FALLOC_FL_KEEP_SIZE'
            FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
                                   ^
shm.c:597:9: error: implicit declaration of function 'fallocate' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    if (fallocate(
        ^
shm.c:599:13: error: use of undeclared identifier 'FALLOC_FL_PUNCH_HOLE'
            FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
            ^
shm.c:599:36: error: use of undeclared identifier 'FALLOC_FL_KEEP_SIZE'
            FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
                                   ^
2021-01-23 10:16:34 +01:00
Jan Beich
6626ef5807
shm: silence -Wunused-function on i386
shm.c:134:1: error: unused function 'page_size' [-Werror,-Wunused-function]
page_size(void)
^
2021-01-23 10:16:31 +01:00
Jan Beich
e462419e34
slave: skip e310487dae if not supported
slave.c:188:26: error: use of undeclared identifier 'IUTF8'
        flags.c_iflag |= IUTF8;
                         ^
2021-01-23 10:16:29 +01:00
Jan Beich
fb660262ab
uri: switch to conservative maximum hostname length
Current maximum is provided by sysconf(_SC_HOST_NAME_MAX) instead.

uri.c:269:20: error: use of undeclared identifier 'HOST_NAME_MAX'
    char this_host[HOST_NAME_MAX];
                   ^
2021-01-23 10:16:25 +01:00