[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;