Remove NSEvent loop from ns_select (bug#25265)
* src/nsterm.m (ns_select): Remove event processing loop and replace with simple test for a new event.
This commit is contained in:
parent
eae5dcd57d
commit
3bd2e9e975
1 changed files with 37 additions and 41 deletions
78
src/nsterm.m
78
src/nsterm.m
|
@ -4108,6 +4108,9 @@ in certain situations (rapid incoming events).
|
|||
struct input_event event;
|
||||
char c;
|
||||
|
||||
NSDate *timeout_date = nil;
|
||||
NSEvent *ns_event;
|
||||
|
||||
NSTRACE_WHEN (NSTRACE_GROUP_EVENTS, "ns_select");
|
||||
|
||||
#ifdef HAVE_NATIVE_FS
|
||||
|
@ -4170,65 +4173,58 @@ in certain situations (rapid incoming events).
|
|||
{
|
||||
/* No file descriptor, just a timeout, no need to wake fd_handler */
|
||||
double time = timespectod (*timeout);
|
||||
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);
|
||||
timeout_date = [NSDate dateWithTimeIntervalSinceNow: time];
|
||||
}
|
||||
|
||||
block_input ();
|
||||
ns_init_events (&event);
|
||||
/* Listen for a new NSEvent. */
|
||||
ns_event = [NSApp nextEventMatchingMask: NSEventMaskAny
|
||||
untilDate: timeout_date
|
||||
inMode: NSDefaultRunLoopMode
|
||||
dequeue: NO];
|
||||
|
||||
[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 (t != NO_APPDEFINED_DATA)
|
||||
if (ns_event != nil)
|
||||
{
|
||||
last_appdefined_event_data = 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];
|
||||
}
|
||||
|
||||
if (t == -2)
|
||||
{
|
||||
/* The NX_APPDEFINED event we received was a timeout. */
|
||||
result = 0;
|
||||
}
|
||||
else if (t == -1)
|
||||
{
|
||||
/* The NX_APPDEFINED event we received was the result of
|
||||
at least one real input event arriving. */
|
||||
errno = EINTR;
|
||||
result = -1;
|
||||
/* Remove the NX_APPDEFINED event from the queue as it's no
|
||||
longer needed. */
|
||||
[NSApp nextEventMatchingMask: NSEventMaskAny
|
||||
untilDate: nil
|
||||
inMode: NSDefaultRunLoopMode
|
||||
dequeue: YES];
|
||||
}
|
||||
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;
|
||||
/* A real NSEvent came in. */
|
||||
errno = EINTR;
|
||||
result = -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
errno = EINTR;
|
||||
result = -1;
|
||||
/* Reading from the NSEvent queue timed out. */
|
||||
result = 0;
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
Loading…
Add table
Reference in a new issue