emacs-pretest-bug
[Top][All Lists]
Advanced

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

Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manua


From: Kim F. Storm
Subject: Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual
Date: Sun, 11 Jun 2006 23:55:28 +0200
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux)

Richard Stallman <address@hidden> writes:

>     > And how do you decide how fast a remote connection is, nowadays?
>
>     Fast!  And getting faster!!
>
> That is not always true.  I had to use a modem connection twice this
> weekend.  Even without dialup involved, international connections can
> be slow.
>
>     > We could just treat all terminals as fast unless the user specifies
>     > a slower speed.
>
>     That's basically what my patch does.
>
> To make that acceptable, we would need to do a lot more to inform
> users of what to do when the connection is not so fast.
>
> Ideally we would tell them to run stty, so that it will affect
> all Emacs sessions during one login session.
>
> The Linux console seems to say its speed is 38400 baud.  That is
> rather misleading, since even a typical modem is faster than that.

Here's an idea: adapt to the redisplay performance on the fly...

This could be done by checking for input every 0.10 seconds during
window redisplay (rather than every N lines).

This means that if redisplay is fast enough to complete within 0.10
seconds, it doesn't pre-empt.

This also means that there basically isn't anything for the user to
modify -- expect perhaps an option to choose the pre-emption
delay (default 0.10 seconds).


Here is a patch -- unfortunately, I don't have a slow connection that can
really prove this makes a difference....


*** dispnew.c   04 Jun 2006 20:58:14 +0200      1.366
--- dispnew.c   11 Jun 2006 23:43:55 +0200      
***************
*** 192,197 ****
--- 192,210 ----
  
  int redisplay_dont_pause;
  
+ #ifdef EMACS_HAS_USECS
+ 
+ /* If a number (float), check for user input every N seconds.  */
+ 
+ Lisp_Object Vredisplay_preemption_period;
+ 
+ /* Redisplay preemption timers.  */
+ 
+ static EMACS_TIME preemption_period;
+ static EMACS_TIME preemption_next_check;
+ 
+ #endif
+ 
  /* Nonzero upon entry to redisplay means do not assume anything about
     current contents of actual terminal frame; clear and redraw it.  */
  
***************
*** 3820,3825 ****
--- 3833,3854 ----
    int paused_p;
    struct window *root_window = XWINDOW (f->root_window);
  
+ #ifdef EMACS_HAS_USECS
+   if (!force_p && NUMBERP (Vredisplay_preemption_period))
+     {
+       EMACS_TIME tm;
+       double p = XFLOATINT (Vredisplay_preemption_period);
+       int sec, usec;
+ 
+       sec = (int) p;
+       usec = (p - sec) * 1000000;
+ 
+       EMACS_GET_TIME (tm);
+       EMACS_SET_SECS_USECS (preemption_period, sec, usec);
+       EMACS_ADD_TIME (preemption_next_check, tm, preemption_period);
+     }
+ #endif
+ 
    if (FRAME_WINDOW_P (f))
      {
        /* We are working on window matrix basis.  All windows whose
***************
*** 3952,3957 ****
--- 3981,4002 ----
        /* Record that this is not a frame-based redisplay.  */
        set_frame_matrix_frame (NULL);
  
+ #ifdef EMACS_HAS_USECS
+       if (!force_p && NUMBERP (Vredisplay_preemption_period))
+       {
+         EMACS_TIME tm;
+         double p = XFLOATINT (Vredisplay_preemption_period);
+         int sec, usec;
+ 
+         sec = (int) p;
+         usec = (p - sec) * 1000000;
+ 
+         EMACS_GET_TIME (tm);
+         EMACS_SET_SECS_USECS (preemption_period, sec, usec);
+         EMACS_ADD_TIME (preemption_next_check, tm, preemption_period);
+       }
+ #endif
+ 
        /* Update W.  */
        update_begin (f);
        update_window (w, force_p);
***************
*** 4107,4113 ****
--- 4152,4160 ----
  {
    struct glyph_matrix *desired_matrix = w->desired_matrix;
    int paused_p;
+ #ifndef EMACS_HAS_USECS
    int preempt_count = baud_rate / 2400 + 1;
+ #endif
    extern int input_pending;
    extern Lisp_Object do_mouse_tracking;
  #if GLYPH_DEBUG
***************
*** 4117,4126 ****
  #endif
  
    /* Check pending input the first time so that we can quickly return.  */
!   if (redisplay_dont_pause)
      force_p = 1;
!   else
      detect_input_pending_ignore_squeezables ();
  
    /* If forced to complete the update, or if no input is pending, do
       the update.  */
--- 4164,4175 ----
  #endif
  
    /* Check pending input the first time so that we can quickly return.  */
!   if (redisplay_dont_pause || NILP (Vredisplay_preemption_period))
      force_p = 1;
! #ifndef EMACS_HAS_USECS
!   else if (!force_p)
      detect_input_pending_ignore_squeezables ();
+ #endif
  
    /* If forced to complete the update, or if no input is pending, do
       the update.  */
***************
*** 4192,4200 ****
               detect_input_pending.  If it's done too often,
               scrolling large windows with repeated scroll-up
               commands will too quickly pause redisplay.  */
            if (!force_p && ++n_updated % preempt_count == 0)
              detect_input_pending_ignore_squeezables ();
! 
            changed_p |= update_window_line (w, vpos,
                                             &mouse_face_overwritten_p);
  
--- 4241,4262 ----
               detect_input_pending.  If it's done too often,
               scrolling large windows with repeated scroll-up
               commands will too quickly pause redisplay.  */
+ #ifdef EMACS_HAS_USECS
+           if (!force_p)
+             {
+               EMACS_TIME tm, dif;
+               EMACS_GET_TIME (tm);
+               EMACS_SUB_TIME (dif, preemption_next_check, tm);
+               if (EMACS_TIME_NEG_P (dif))
+                 {
+                   EMACS_ADD_TIME (preemption_next_check, tm, 
preemption_period);
+                   detect_input_pending_ignore_squeezables ();
+                 }
+             }
+ #else
            if (!force_p && ++n_updated % preempt_count == 0)
              detect_input_pending_ignore_squeezables ();
! #endif
            changed_p |= update_window_line (w, vpos,
                                             &mouse_face_overwritten_p);
  
***************
*** 5143,5155 ****
    if (preempt_count <= 0)
      preempt_count = 1;
  
!   if (redisplay_dont_pause)
      force_p = 1;
    else if (!force_p && detect_input_pending_ignore_squeezables ())
      {
        pause = 1;
        goto do_pause;
      }
  
    /* If we cannot insert/delete lines, it's no use trying it.  */
    if (!line_ins_del_ok)
--- 5205,5219 ----
    if (preempt_count <= 0)
      preempt_count = 1;
  
!   if (redisplay_dont_pause || NILP (Vredisplay_preemption_period))
      force_p = 1;
+ #ifndef EMACS_HAS_USECS
    else if (!force_p && detect_input_pending_ignore_squeezables ())
      {
        pause = 1;
        goto do_pause;
      }
+ #endif
  
    /* If we cannot insert/delete lines, it's no use trying it.  */
    if (!line_ins_del_ok)
***************
*** 5200,5207 ****
                }
            }
  
!         if ((i - 1) % preempt_count == 0)
            detect_input_pending_ignore_squeezables ();
  
          update_frame_line (f, i);
        }
--- 5264,5285 ----
                }
            }
  
! #ifdef EMACS_HAS_USECS
!         if (!force_p)
!           {
!             EMACS_TIME tm, dif;
!             EMACS_GET_TIME (tm);
!             EMACS_SUB_TIME (dif, preemption_next_check, tm);
!             if (EMACS_TIME_NEG_P (dif))
!               {
!                 EMACS_ADD_TIME (preemption_next_check, tm, preemption_period);
!                 detect_input_pending_ignore_squeezables ();
!               }
!           }
! #else
!         if (!force_p && (i - 1) % preempt_count == 0)
            detect_input_pending_ignore_squeezables ();
+ #endif
  
          update_frame_line (f, i);
        }
***************
*** 6936,6942 ****
               doc: /* *Non-nil means update isn't paused when input is 
detected.  */);
    redisplay_dont_pause = 0;
  
!   /* Initialize `window-system', unless init_display already decided it.  */
  #ifdef CANNOT_DUMP
    if (noninteractive)
  #endif
--- 7014,7027 ----
               doc: /* *Non-nil means update isn't paused when input is 
detected.  */);
    redisplay_dont_pause = 0;
  
! #ifdef EMACS_HAS_USECS
!   DEFVAR_LISP ("redisplay-preemption-period", &Vredisplay_preemption_period,
!              doc: /* *The period in seconds between checking for input during 
redisplay.
! If input is detected, redisplay is pre-empted, and the input is processed.
! If nil, never pre-empt redisplay.  */);
!   Vredisplay_preemption_period = make_float (0.10);
! #endif
! 
  #ifdef CANNOT_DUMP
    if (noninteractive)
  #endif


--
Kim F. Storm <address@hidden> http://www.cua.dk





reply via email to

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