]> git.mdlowis.com Git - projs/tide.git/commitdiff
Added X event handling as a job
authorMichael D. Lowis <mike.lowis@gentex.com>
Mon, 26 Mar 2018 12:49:03 +0000 (08:49 -0400)
committerMichael D. Lowis <mike.lowis@gentex.com>
Mon, 26 Mar 2018 12:49:03 +0000 (08:49 -0400)
lib/job.c
lib/x11.c

index d6601747c9e91934d22064c9838414b354da0bf3..262fc5a5c0912d540b4f98c8d90b4f8b1c79f9bf 100644 (file)
--- 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);
 }
index 6ce53ad79bd496f83df37141968ddc8b34a67937..831b8d9187ff91d67859b17bce126d10a7e9d329 100644 (file)
--- 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;