emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 726c6c9 3/3: Revert "Remove NSEvent loop from ns_se


From: Alan Third
Subject: [Emacs-diffs] master 726c6c9 3/3: Revert "Remove NSEvent loop from ns_select (bug#25265)"
Date: Tue, 14 Mar 2017 10:47:59 -0400 (EDT)

branch: master
commit 726c6c97ca8f14ad6db67b8d526aca93e88432de
Author: Alan Third <address@hidden>
Commit: Alan Third <address@hidden>

    Revert "Remove NSEvent loop from ns_select (bug#25265)"
    
    This reverts commit 3bd2e9e975ed29daaf03ca7559e4664aade0674f.
---
 src/nsterm.m | 76 ++++++++++++++++++++++++++++++++----------------------------
 1 file changed, 40 insertions(+), 36 deletions(-)

diff --git a/src/nsterm.m b/src/nsterm.m
index 4748cd3..b03ad52 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -4108,9 +4108,6 @@ ns_select (int nfds, fd_set *readfds, fd_set *writefds,
   struct input_event event;
   char c;
 
-  NSDate *timeout_date = nil;
-  NSEvent *ns_event;
-
   NSTRACE_WHEN (NSTRACE_GROUP_EVENTS, "ns_select");
 
 #ifdef HAVE_NATIVE_FS
@@ -4173,58 +4170,65 @@ ns_select (int nfds, fd_set *readfds, fd_set *writefds,
     {
       /* No file descriptor, just a timeout, no need to wake fd_handler  */
       double time = timespectod (*timeout);
-      timeout_date = [NSDate dateWithTimeIntervalSinceNow: time];
+      timed_entry = [[NSTimer scheduledTimerWithTimeInterval: time
+                                                      target: NSApp
+                                                    selector:
+                                  @selector (timeout_handler:)
+                                                    userInfo: 0
+                                                     repeats: NO]
+                      retain];
+    }
+  else /* No timeout and no file descriptors, can this happen?  */
+    {
+      /* Send appdefined so we exit from the loop */
+      ns_send_appdefined (-1);
     }
 
-  /* Listen for a new NSEvent. */
-  ns_event = [NSApp nextEventMatchingMask: NSEventMaskAny
-                                untilDate: timeout_date
-                                   inMode: NSDefaultRunLoopMode
-                                  dequeue: NO];
+  block_input ();
+  ns_init_events (&event);
+
+  [NSApp run];
 
+  ns_finish_events ();
   if (nr > 0 && readfds)
     {
       c = 's';
       emacs_write_sig (selfds[1], &c, 1);
     }
+  unblock_input ();
+
+  t = last_appdefined_event_data;
 
-  if (ns_event != nil)
+  if (t != NO_APPDEFINED_DATA)
     {
-      if ([ns_event type] == NSEventTypeApplicationDefined)
-        {
-          if ([ns_event data1] < 0)
-            {
-              /* The NX_APPDEFINED event we received was a timeout. */
-              result = 0;
-            }
-          else
-            {
-              /* Received back from select () in fd_handler; copy the results 
*/
-              pthread_mutex_lock (&select_mutex);
-              if (readfds) *readfds = select_readfds;
-              if (writefds) *writefds = select_writefds;
-              pthread_mutex_unlock (&select_mutex);
-              result = [ns_event data1];
-            }
+      last_appdefined_event_data = NO_APPDEFINED_DATA;
 
-          /* Remove the NX_APPDEFINED event from the queue as it's no
-             longer needed. */
-          [NSApp nextEventMatchingMask: NSEventMaskAny
-                             untilDate: nil
-                                inMode: NSDefaultRunLoopMode
-                               dequeue: YES];
+      if (t == -2)
+        {
+          /* The NX_APPDEFINED event we received was a timeout. */
+          result = 0;
         }
-      else
+      else if (t == -1)
         {
-          /* A real NSEvent came in. */
+          /* The NX_APPDEFINED event we received was the result of
+             at least one real input event arriving.  */
           errno = EINTR;
           result = -1;
         }
+      else
+        {
+          /* Received back from select () in fd_handler; copy the results */
+          pthread_mutex_lock (&select_mutex);
+          if (readfds) *readfds = select_readfds;
+          if (writefds) *writefds = select_writefds;
+          pthread_mutex_unlock (&select_mutex);
+          result = t;
+        }
     }
   else
     {
-      /* Reading from the NSEvent queue timed out. */
-      result = 0;
+      errno = EINTR;
+      result = -1;
     }
 
   return result;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]