diff options
-rw-r--r-- | bin/gfb.c | 30 | ||||
-rw-r--r-- | bin/gfcocoa.m | 7 | ||||
-rw-r--r-- | bin/gfxx.c | 5 |
3 files changed, 22 insertions, 20 deletions
diff --git a/bin/gfb.c b/bin/gfb.c index 3606bb05..d843c694 100644 --- a/bin/gfb.c +++ b/bin/gfb.c @@ -17,6 +17,7 @@ #include <err.h> #include <fcntl.h> #include <linux/fb.h> +#include <stdbool.h> #include <stdint.h> #include <stdlib.h> #include <string.h> @@ -27,18 +28,9 @@ #include <unistd.h> 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; + } } } diff --git a/bin/gfcocoa.m b/bin/gfcocoa.m index 1839bcd0..ece79fb5 100644 --- a/bin/gfcocoa.m +++ b/bin/gfcocoa.m @@ -16,6 +16,7 @@ #import <Cocoa/Cocoa.h> #import <err.h> +#import <stdbool.h> #import <stdint.h> #import <stdlib.h> #import <sysexits.h> @@ -25,7 +26,7 @@ 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); +extern bool input(char in); @interface BufferView : NSView { size_t bufSize; @@ -94,7 +95,9 @@ extern void input(char in); remainingRange: NULL ]; if (converted) { - input(in); + if (!input(in)) { + [NSApp terminate: self]; + } [self setWindowTitle]; [self draw]; } diff --git a/bin/gfxx.c b/bin/gfxx.c index e70dffb4..051d4591 100644 --- a/bin/gfxx.c +++ b/bin/gfxx.c @@ -348,11 +348,11 @@ static void setPreset(void) { } } -extern void input(char in) { +extern bool input(char in) { size_t pixel = (BITS_TOTAL + 7) / 8; size_t row = width * pixel; switch (in) { - case 'q': formatOptions(); printf("%s\n", options); exit(EX_OK); + case 'q': return false; break; case 'o': formatOptions(); printf("%s\n", options); break; case '[': if (!space--) space = COLOR__MAX - 1; break; case ']': if (++space == COLOR__MAX) space = 0; @@ -380,4 +380,5 @@ extern void input(char in) { break; case '-': if (scale > 1) scale--; break; default: if (in >= '0' && in <= '9') setBit(in); } + return true; } |