From b6409bf711c315bb910346fb4183717add00c843 Mon Sep 17 00:00:00 2001 From: June McEnroe Date: Wed, 7 Feb 2018 12:07:01 -0500 Subject: Exit by returning false from input to gf{b,cocoa} I haven't built gfb yet, so a fix commit is probably incoming. --- bin/gfb.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) (limited to 'bin/gfb.c') diff --git a/bin/gfb.c b/bin/gfb.c index 9925cc12..d7f32400 100644 --- a/bin/gfb.c +++ b/bin/gfb.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -27,18 +28,9 @@ #include extern int init(int argc, char *argv[]); +extern const char *status(void); extern void draw(uint32_t *buf, size_t xres, size_t yres); -extern void input(char in); - -static uint32_t *buf; -static struct fb_var_screeninfo info; - -static uint32_t saveBg; -static void restoreBg(void) { - for (size_t i = 0; i < info.xres * info.yres; ++i) { - buf[i] = saveBg; - } -} +extern bool input(char in); static struct termios saveTerm; static void restoreTerm(void) { @@ -57,16 +49,14 @@ int main(int argc, char *argv[]) { int fb = open(path, O_RDWR); if (fb < 0) err(EX_OSFILE, "%s", path); + struct fb_var_screeninfo info; error = ioctl(fb, FBIOGET_VSCREENINFO, &info); if (error) err(EX_IOERR, "%s", path); size_t size = 4 * info.xres * info.yres; - buf = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0); + uint32_t *buf = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0); if (buf == MAP_FAILED) err(EX_IOERR, "%s", path); - saveBg = buf[0]; - atexit(restoreBg); - error = tcgetattr(STDERR_FILENO, &saveTerm); if (error) err(EX_IOERR, "tcgetattr"); atexit(restoreTerm); @@ -76,6 +66,8 @@ int main(int argc, char *argv[]) { error = tcsetattr(STDERR_FILENO, TCSADRAIN, &term); if (error) err(EX_IOERR, "tcsetattr"); + uint32_t saveBg = buf[0]; + uint32_t back[info.xres * info.yres]; for (;;) { draw(back, info.xres, info.yres); @@ -86,6 +78,12 @@ int main(int argc, char *argv[]) { if (len < 0) err(EX_IOERR, "read"); if (!len) return EX_DATAERR; - input(in); + if (!input(in)) { + for (uint32_t i = 0; i < info.xres * info.yres; ++i) { + buf[i] = saveBg; + } + fprintf(stderr, "%s\n", status()); + return EX_OK; + } } } -- cgit 1.4.1