changeset 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 094de440fa2e
children 574f29ec464b
files src/ChangeLog src/atimer.c src/eval.c src/keyboard.c src/mac.c src/macterm.c src/process.c
diffstat 7 files changed, 59 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Mon Jul 19 01:00:19 2004 +0000
+++ b/src/ChangeLog	Mon Jul 19 04:42:43 2004 +0000
@@ -1,3 +1,21 @@
+2004-07-18  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+	* 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.
+
 2004-07-18  Luc Teirlinck  <teirllm@auburn.edu>
 
 	* xdisp.c (syms_of_xdisp) <window-scroll-functions>: Correct
--- a/src/atimer.c	Mon Jul 19 01:00:19 2004 +0000
+++ b/src/atimer.c	Mon Jul 19 04:42:43 2004 +0000
@@ -375,7 +375,9 @@
 
       t = atimers;
       atimers = atimers->next;
+#ifndef MAC_OSX
       t->fn (t);
+#endif
 
       if (t->type == ATIMER_CONTINUOUS)
 	{
@@ -387,6 +389,10 @@
 	  t->next = free_atimers;
 	  free_atimers = t;
 	}
+#ifdef MAC_OSX
+      /* Fix for Ctrl-G.  Perhaps this should apply to all platforms. */
+      t->fn (t); 
+#endif
 
       EMACS_GET_TIME (now);
     }
--- a/src/eval.c	Mon Jul 19 01:00:19 2004 +0000
+++ b/src/eval.c	Mon Jul 19 04:42:43 2004 +0000
@@ -2145,9 +2145,6 @@
     val = call_debugger (Fcons (Qexit, Fcons (val, Qnil)));
   backtrace_list = backtrace.next;
 
-#ifdef HAVE_CARBON
-  mac_check_for_quit_char();
-#endif
   return val;
 }
 
--- a/src/keyboard.c	Mon Jul 19 01:00:19 2004 +0000
+++ b/src/keyboard.c	Mon Jul 19 04:42:43 2004 +0000
@@ -607,7 +607,7 @@
 
 /* We are unable to use interrupts if FIONREAD is not available,
    so flush SIGIO so we won't try.  */
-#ifndef FIONREAD
+#if !defined (FIONREAD) || defined(HAVE_CARBON)
 #ifdef SIGIO
 #undef SIGIO
 #endif
--- 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);
 	}
--- a/src/macterm.c	Mon Jul 19 01:00:19 2004 +0000
+++ b/src/macterm.c	Mon Jul 19 04:42:43 2004 +0000
@@ -5321,7 +5321,6 @@
 
   XFlush (FRAME_MAC_DISPLAY (f));
 
-#if 0 /* MAC_TODO */
   /* Synchronize to ensure Emacs knows the frame is visible
      before we do anything else.  We do this loop with input not blocked
      so that incoming events are handled.  */
@@ -5365,9 +5364,6 @@
 	FRAME_SAMPLE_VISIBILITY (f);
       }
   }
-#else
-  UNBLOCK_INPUT;
-#endif /* MAC_TODO */
 }
 
 /* Change from mapped state to withdrawn state.  */
--- a/src/process.c	Mon Jul 19 01:00:19 2004 +0000
+++ b/src/process.c	Mon Jul 19 04:42:43 2004 +0000
@@ -4190,12 +4190,13 @@
 	  SELECT_TYPE Atemp, Ctemp;
 
 	  Atemp = input_wait_mask;
-#ifdef MAC_OSX
-          /* On Mac OS X, the SELECT system call always says input is
+#if 0
+          /* On Mac OS X 10.0, the SELECT system call always says input is
              present (for reading) at stdin, even when none is.  This
              causes the call to SELECT below to return 1 and
              status_notify not to be called.  As a result output of
-             subprocesses are incorrectly discarded.  */
+             subprocesses are incorrectly discarded.  
+	  */
           FD_CLR (0, &Atemp);
 #endif
 	  Ctemp = connect_wait_mask;