diff src/mac.c @ 56477:59a86f6ee1fb

Fixes for Ctrl-G support on carbon, replacing old timeout based polling with alarm based polling. mac.c (sys_select): Redo sys_select to use alarm-based polling instead of 1 sec timeouts (like solaris). macterm.c (x_make_frame_visible): Comment in polling on frame creation. keyboard.c: Undef SIGIO on Carbon atimer.c (alarm_signal_handler): Call alarm handlers after scheduling. eval.c (Feval): Remove quit_char test process.c (wait_reading_process_input): Remove clearing stdin for select call on process input
author Steven Tamm <steventamm@mac.com>
date Mon, 19 Jul 2004 04:42:43 +0000
parents 5544010b4c66
children 574f29ec464b
line wrap: on
line diff
--- a/src/mac.c	Mon Jul 19 01:00:19 2004 +0000
+++ b/src/mac.c	Mon Jul 19 04:42:43 2004 +0000
@@ -2782,12 +2782,9 @@
   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);
+  if (inhibit_window_system || noninteractive
+      || rfds == NULL || !FD_ISSET (0, rfds))
+    return select(n, rfds, wfds, efds, timeout);    
   else
     {
       EMACS_TIME end_time, now;
@@ -2798,30 +2795,36 @@
 
       do
 	{
+	  EMACS_TIME select_timeout
+	  SELECT_TYPE orfds = *rfds;
 	  int r;
-	  EMACS_TIME one_second;
-	  SELECT_TYPE orfds;
-
-	  FD_ZERO (&orfds);
-	  if (rfds)
+	  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)
 	    {
-	      orfds = *rfds;
+	      FD_ZERO (rfds);
+	      FD_SET (0, rfds);
+	      return 1;
 	    }
-
-	  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);
 	}