From 9109c06d55f04db17508ce249c96fa5e661e35b7 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Mon, 26 Mar 2018 08:49:03 -0400 Subject: [PATCH] Added X event handling as a job --- lib/job.c | 8 ++++---- lib/x11.c | 46 +++++++--------------------------------------- 2 files changed, 11 insertions(+), 43 deletions(-) diff --git a/lib/job.c b/lib/job.c index d660174..262fc5a 100644 --- a/lib/job.c +++ b/lib/job.c @@ -40,7 +40,7 @@ bool job_poll(int fd, int ms) { printf("poll(..., %d, %d)", njobs, ms); long ret = poll(JobFds, njobs, ms); printf(" => %ld\n", ret); - for (int i = 1; i < njobs; i++) + for (int i = 0; i < njobs; i++) job_process(JobFds[i].fd, JobFds[i].revents); /* reap zombie processes */ for (int status; waitpid(-1, &status, WNOHANG) > 0;); @@ -69,19 +69,19 @@ void job_start(char** cmd, char* data, size_t ndata, View* dest) { } static void job_process(int fd, int events) { -#if 0 Job* job = JobList; // Get job by fd + while (job && job->fd != fd) + job = job->next; if (job->readfn && (events & POLLIN)) job->readfn(job); if (job->writefn && (events & POLLOUT)) job->writefn(job); if (!job->readfn && !job->writefn) job_finish(job); -#endif } static void job_finish(Job* job) { - close(job->fd); + //close(job->fd); // delete job // free(job); } diff --git a/lib/x11.c b/lib/x11.c index 6ce53ad..831b8d9 100644 --- a/lib/x11.c +++ b/lib/x11.c @@ -402,55 +402,23 @@ void win_save(char* path) { } static void xupdate(Job* job) { - bool pending = job_poll(ConnectionNumber(X.display), Timeout); - int nevents = XEventsQueued(X.display, QueuedAfterFlush); - if (pending || nevents) { - for (XEvent e; XPending(X.display);) { - XNextEvent(X.display, &e); - if (!XFilterEvent(&e, None) && EventHandlers[e.type]) - (EventHandlers[e.type])(&e); - } - onredraw(X.width, X.height); - XCopyArea(X.display, X.pixmap, X.self, X.gc, 0, 0, X.width, X.height, 0, 0); + for (XEvent e; XPending(X.display);) { + XNextEvent(X.display, &e); + if (!XFilterEvent(&e, None) && EventHandlers[e.type]) + (EventHandlers[e.type])(&e); } + onredraw(X.width, X.height); + XCopyArea(X.display, X.pixmap, X.self, X.gc, 0, 0, X.width, X.height, 0, 0); XFlush(X.display); } void win_loop(void) { -#if 0 XMapWindow(X.display, X.self); + XFlush(X.display); job_spawn(ConnectionNumber(X.display), xupdate, 0, 0); while (1) job_poll(-1, Timeout); -#else - XMapWindow(X.display, X.self); - while (Running) { - bool pending = job_poll(ConnectionNumber(X.display), Timeout); - int nevents = XEventsQueued(X.display, QueuedAfterFlush); - if (pending || nevents) { - for (XEvent e; XPending(X.display);) { - XNextEvent(X.display, &e); - if (!XFilterEvent(&e, None) && EventHandlers[e.type]) - (EventHandlers[e.type])(&e); - } - onredraw(X.width, X.height); - XCopyArea(X.display, X.pixmap, X.self, X.gc, 0, 0, X.width, X.height, 0, 0); - } - XFlush(X.display); - } - XCloseDisplay(X.display); - - /* we're exiting now. If we own the clipboard, make sure it persists */ - if (Selections[CLIPBOARD].text) { - char* text = Selections[CLIPBOARD].text; - size_t len = strlen(text); - job_start((char*[]){ "xcpd", NULL }, text, len, NULL); - while (job_poll(-1, 100)); - } -#endif } - - void win_settext(WinRegion id, char* text) { View* view = win_view(id); view->buffer.gapstart = view->buffer.bufstart; -- 2.54.0