emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] Changes to emacs/src/mac.c


From: Steven Tamm
Subject: [Emacs-diffs] Changes to emacs/src/mac.c
Date: Mon, 19 Jul 2004 02:41:25 -0400

Index: emacs/src/mac.c
diff -c emacs/src/mac.c:1.20 emacs/src/mac.c:1.21
*** emacs/src/mac.c:1.20        Mon Jul 19 05:20:01 2004
--- emacs/src/mac.c     Mon Jul 19 06:38:14 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,2863 ****
     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 || noninteractive
        || rfds == NULL || !FD_ISSET (0, rfds))
!     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
!       {
!         EMACS_TIME select_timeout;
!         SELECT_TYPE orfds = *rfds;
!         int r;
!         OSErr err;
! 
!         EMACS_SET_SECS (select_timeout, 0);
!         EMACS_SET_USECS (select_timeout, 100);
!         
!         if (timeout && EMACS_TIME_LT (*timeout, select_timeout))
!           select_timeout = *timeout;
!         
!         r = select (n, &orfds, wfds, efds, &select_timeout);
!         err = ReceiveNextEvent (0, NULL, kEventDurationNoWait, false, NULL);
!         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;
            }
!         
!         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,




reply via email to

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