generate-alt-random: wait for SIGWINCH if width/height is 0

If width/height (that is, the *pixel* values) are 0, that means we are
early (or that foot is slow) - we’ve managed to reach this point
before the foot window has been mapped.

Or rather, before foot has loaded the primary fonts and calculated the
cell geometry. But that, and the initial mapping of the window is
tightly coupled.

To handle this case, detect when width or height is 0, an then wait
for SIGWINCH before trying again.
This commit is contained in:
Daniel Eklöf 2021-04-22 10:57:43 +02:00
parent da5a3bae3e
commit 44b8bd2364
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

View file

@ -2,8 +2,9 @@
import argparse
import enum
import fcntl
import struct
import random
import signal
import struct
import sys
import termios
@ -38,11 +39,28 @@ def main():
out = opts.out if opts.out is not None else sys.stdout
try:
lines, cols, height, width = struct.unpack(
'HHHH',
fcntl.ioctl(sys.stdout.fileno(),
termios.TIOCGWINSZ,
struct.pack('HHHH', 0, 0, 0, 0)))
def dummy(*args):
"""Need a handler installed for sigwait() to trigger."""
pass
signal.signal(signal.SIGWINCH, dummy)
while True:
lines, cols, height, width = struct.unpack(
'HHHH',
fcntl.ioctl(sys.stdout.fileno(),
termios.TIOCGWINSZ,
struct.pack('HHHH', 0, 0, 0, 0)))
if width > 0 and height > 0:
break
# Were early; the foot window hasnt been mapped yet. Or,
# to be more precise, fonts havent yet been loaded,
# meaning it doesnt have any cell geometry yet.
signal.sigwait([signal.SIGWINCH])
signal.signal(signal.SIGWINCH, signal.SIG_DFL)
except OSError:
lines = None
cols = None