[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/mac.c [lexbind]
From: |
Miles Bader |
Subject: |
[Emacs-diffs] Changes to emacs/src/mac.c [lexbind] |
Date: |
Fri, 23 Jul 2004 00:51:32 -0400 |
Index: emacs/src/mac.c
diff -c emacs/src/mac.c:1.3.2.3 emacs/src/mac.c:1.3.2.4
*** emacs/src/mac.c:1.3.2.3 Sun Dec 28 05:20:01 2003
--- emacs/src/mac.c Fri Jul 23 04:42:23 2004
***************
*** 2769,2774 ****
--- 2769,2776 ----
extern int inhibit_window_system;
extern int noninteractive;
+ #include "blockinput.h"
+
/* When Emacs is started from the Finder, SELECT always immediately
returns as if input is present when file descriptor 0 is polled for
input. Strangely, when Emacs is run as a GUI application from the
***************
*** 2776,2860 ****
the system call SELECT corrects this discrepancy. */
int
sys_select (n, rfds, wfds, efds, timeout)
! int n;
! SELECT_TYPE *rfds;
! SELECT_TYPE *wfds;
! SELECT_TYPE *efds;
! struct timeval *timeout;
{
! if (!inhibit_window_system && rfds && FD_ISSET (0, rfds))
! return 1;
! else if (inhibit_window_system || noninteractive ||
! (timeout && (EMACS_SECS(*timeout)==0) &&
! (EMACS_USECS(*timeout)==0)))
! return select(n, rfds, wfds, efds, timeout);
! else
! {
! EMACS_TIME end_time, now;
!
! EMACS_GET_TIME (end_time);
! if (timeout)
! EMACS_ADD_TIME (end_time, end_time, *timeout);
!
! do
! {
! int r;
! EMACS_TIME one_second;
! SELECT_TYPE orfds;
!
! FD_ZERO (&orfds);
! if (rfds)
{
! orfds = *rfds;
}
! EMACS_SET_SECS (one_second, 1);
! EMACS_SET_USECS (one_second, 0);
!
! if (timeout && EMACS_TIME_LT(*timeout, one_second))
! one_second = *timeout;
!
! if ((r = select (n, &orfds, wfds, efds, &one_second)) > 0)
{
! *rfds = orfds;
! return r;
}
! mac_check_for_quit_char();
!
EMACS_GET_TIME (now);
! EMACS_SUB_TIME (now, end_time, now);
}
- while (!timeout || !EMACS_TIME_NEG_P (now));
-
- return 0;
}
! }
! #undef read
! int sys_read (fds, buf, nbyte)
! int fds;
! char *buf;
! unsigned int nbyte;
! {
! SELECT_TYPE rfds;
! EMACS_TIME one_second;
! int r;
!
! /* Use select to block on IO while still checking for quit_char */
! if (!inhibit_window_system && !noninteractive &&
! ! (fcntl(fds, F_GETFL, 0) & O_NONBLOCK))
! {
! FD_ZERO (&rfds);
! FD_SET (fds, &rfds);
! if (sys_select (fds+1, &rfds, 0, 0, NULL) < 0)
! return -1;
! }
!
! return read (fds, buf, nbyte);
}
-
/* Set up environment variables so that Emacs can correctly find its
support files when packaged as an application bundle. Directories
placed in /usr/local/share/emacs/<emacs-version>/, /usr/local/bin,
--- 2778,2877 ----
the system call SELECT corrects this discrepancy. */
int
sys_select (n, rfds, wfds, efds, timeout)
! int n;
! SELECT_TYPE *rfds;
! SELECT_TYPE *wfds;
! SELECT_TYPE *efds;
! struct timeval *timeout;
{
! OSErr err;
! EMACS_TIME end_time, now, remaining_time;
!
! if (inhibit_window_system || noninteractive
! || rfds == NULL || !FD_ISSET (0, rfds))
! return select (n, rfds, wfds, efds, timeout);
!
! if (wfds == NULL && efds == NULL)
! {
! int i;
!
! for (i = 1; i < n; i++)
! if (FD_ISSET (i, rfds))
! break;
! if (i == n)
! {
! EventTimeout timeout_sec =
! (timeout
! ? (EMACS_SECS (*timeout) * kEventDurationSecond
! + EMACS_USECS (*timeout) * kEventDurationMicrosecond)
! : kEventDurationForever);
!
! BLOCK_INPUT;
! err = ReceiveNextEvent (0, NULL, timeout_sec,
! kEventLeaveInQueue, NULL);
! UNBLOCK_INPUT;
! if (err == noErr)
{
! FD_ZERO (rfds);
! FD_SET (0, rfds);
! return 1;
}
+ else
+ return 0;
+ }
+ }
! if (timeout)
! {
! remaining_time = *timeout;
! EMACS_GET_TIME (now);
! EMACS_ADD_TIME (end_time, now, remaining_time);
! }
! FD_CLR (0, rfds);
! do
! {
! EMACS_TIME select_timeout;
! SELECT_TYPE orfds = *rfds;
! int r;
!
! EMACS_SET_SECS_USECS (select_timeout, 0, 20000);
!
! if (timeout && EMACS_TIME_LT (remaining_time, select_timeout))
! select_timeout = remaining_time;
!
! r = select (n, &orfds, wfds, efds, &select_timeout);
! BLOCK_INPUT;
! err = ReceiveNextEvent (0, NULL, kEventDurationNoWait,
! kEventLeaveInQueue, NULL);
! UNBLOCK_INPUT;
! if (r > 0)
! {
! *rfds = orfds;
! if (err == noErr)
{
! FD_SET (0, rfds);
! r++;
}
+ return r;
+ }
+ else if (err == noErr)
+ {
+ FD_ZERO (rfds);
+ FD_SET (0, rfds);
+ return 1;
+ }
! if (timeout)
! {
EMACS_GET_TIME (now);
! EMACS_SUB_TIME (remaining_time, end_time, now);
}
}
! while (!timeout || EMACS_TIME_LT (now, end_time));
! return 0;
}
/* Set up environment variables so that Emacs can correctly find its
support files when packaged as an application bundle. Directories
placed in /usr/local/share/emacs/<emacs-version>/, /usr/local/bin,
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] Changes to emacs/src/mac.c [lexbind],
Miles Bader <=