summary refs log tree commit diff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--bin/gfb.c30
-rw-r--r--bin/gfcocoa.m7
-rw-r--r--bin/gfxx.c5
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;
 }