From 4d9323397b4ae92a99f82427d70e0c56cf51a0b7 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Wed, 30 Oct 2019 22:20:10 -0400 Subject: [PATCH] refactored io and telemetry apis and fixed a bug in event handling --- inc/edit.h | 4 ---- inc/io.h | 5 +++++ inc/x11.h | 2 +- src/fetch.c | 1 + src/lib/argv0.c | 1 + src/lib/gapbuf.c | 14 ++------------ src/lib/job.c | 1 + src/lib/telem.c | 12 +----------- src/lib/writefd.c | 12 ++++++++++++ src/lib/x11.c | 11 ++++++++++- src/tide.c | 6 +++++- 11 files changed, 39 insertions(+), 30 deletions(-) create mode 100644 inc/io.h create mode 100644 src/lib/argv0.c create mode 100644 src/lib/writefd.c diff --git a/inc/edit.h b/inc/edit.h index a8b35bc..41d1447 100644 --- a/inc/edit.h +++ b/inc/edit.h @@ -1,7 +1,3 @@ -/* Debug Telemetry - *****************************************************************************/ -void telem_send(char* fmt, ...); - /* Buffer management functions *****************************************************************************/ /* undo/redo list item */ diff --git a/inc/io.h b/inc/io.h new file mode 100644 index 0000000..82875e1 --- /dev/null +++ b/inc/io.h @@ -0,0 +1,5 @@ +/* + Helper functions for reading and writing file descriptors as well as outputting telemetry data. +*/ +void telem_send(char* fmt, ...); +long writefd(int fd, char* data, long towrite); diff --git a/inc/x11.h b/inc/x11.h index 3527646..d32fb26 100644 --- a/inc/x11.h +++ b/inc/x11.h @@ -134,7 +134,7 @@ void x11_resize(XConf* x, XEvent* e); void x11_mkwin(XConf* x, int width, int height, int evmask); void x11_mkdialog(XConf* x, int width, int height, int evmask); -void x11_process_events(XConf* x); +bool x11_process_events(XConf* x); void x11_event_loop(XConf* x, void (*redraw)(XConf* x)); int x11_getptr(XConf* x, int* ptrx, int* ptry); uint32_t x11_getkey(XConf* x, XEvent* e); diff --git a/src/fetch.c b/src/fetch.c index f1b77c9..15676aa 100644 --- a/src/fetch.c +++ b/src/fetch.c @@ -1,4 +1,5 @@ #include +#include #include #include #include diff --git a/src/lib/argv0.c b/src/lib/argv0.c new file mode 100644 index 0000000..9adafa9 --- /dev/null +++ b/src/lib/argv0.c @@ -0,0 +1 @@ +char* ARGV0 = NULL; \ No newline at end of file diff --git a/src/lib/gapbuf.c b/src/lib/gapbuf.c index 95ac264..d1d046b 100644 --- a/src/lib/gapbuf.c +++ b/src/lib/gapbuf.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -89,18 +90,6 @@ void gapbuf_init(GapBuf* buf) buf->gapend = buf->bufend; } -static long writefd(int fd, char* data, long towrite) -{ - require(fd >= 0); - long nwrite = 0; - while (towrite && ((nwrite = write(fd, data, towrite)) > 0)) - { - data += nwrite; - towrite -= nwrite; - } - return nwrite; -} - long gapbuf_save(GapBuf* buf, char* path) { require(buf != NULL); @@ -138,6 +127,7 @@ void gapbuf_load(GapBuf* buf, char* path) buf->bufend = buf->bufstart + buf->bufsize; buf->gapstart = buf->bufstart; buf->gapend = buf->bufend; + /* Read the file into the buffer */ while (sb.st_size && (nread = read(fd, buf->gapstart, sb.st_size)) > 0) buf->gapstart += nread, sb.st_size -= nread; diff --git a/src/lib/job.c b/src/lib/job.c index a2094d2..1ec1f64 100644 --- a/src/lib/job.c +++ b/src/lib/job.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include diff --git a/src/lib/telem.c b/src/lib/telem.c index b58c94a..bfb96dc 100644 --- a/src/lib/telem.c +++ b/src/lib/telem.c @@ -2,21 +2,11 @@ #include #include #include +#include static int TelemFd = -1; static char TelemBuf[16384]; -static long writefd(int fd, char* data, long towrite) -{ - long nwrite = 0; - while (towrite && ((nwrite = write(fd, data, towrite)) > 0)) - { - data += nwrite; - towrite -= nwrite; - } - return nwrite; -} - static int open_telem(char* path) { static unsigned long prev = 0; diff --git a/src/lib/writefd.c b/src/lib/writefd.c new file mode 100644 index 0000000..3ee2947 --- /dev/null +++ b/src/lib/writefd.c @@ -0,0 +1,12 @@ +#include + +long writefd(int fd, char* data, long towrite) +{ + long nwrite = 0; + while (towrite && ((nwrite = write(fd, data, towrite)) > 0)) + { + data += nwrite; + towrite -= nwrite; + } + return nwrite; +} diff --git a/src/lib/x11.c b/src/lib/x11.c index 9599e1f..74fe61d 100644 --- a/src/lib/x11.c +++ b/src/lib/x11.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -93,8 +94,9 @@ static void update_state(XConf* x, XEvent* e) } } -void x11_process_events(XConf* x) +bool x11_process_events(XConf* x) { + bool has_event = false; int nevents; /* reap zombie background processes */ for (int status; waitpid(-1, &status, WNOHANG) > 0;); @@ -104,14 +106,21 @@ void x11_process_events(XConf* x) XGetMotionEvents(x->display, x->self, CurrentTime, CurrentTime, &nevents); for (XEvent e; XPending(x->display);) { + has_event = true; XNextEvent(x->display, &e); update_state(x, &e); if (!XFilterEvent(&e, None) && x->eventfns[e.type]) { + telem_send("EV_HANDLE(type: %d)\n", e.type); (x->eventfns[e.type])(x, &e); } + else + { + telem_send("EV_IGNORE(type: %d)\n", e.type); + } } } + return has_event; } void x11_event_loop(XConf* x, void (*redraw)(XConf* x)) diff --git a/src/tide.c b/src/tide.c index 69dc868..96816d0 100644 --- a/src/tide.c +++ b/src/tide.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -280,7 +281,10 @@ static void xupdate(Job* job) { /* redraw if we have changes or if we have input from a job */ x11_process_events(&X); - if (!job) xredraw(&X); + if (x11_process_events(&X) || !job) + { + xredraw(&X); + } } void win_init(void) -- 2.51.0