[Top][All Lists]
[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
- Re: redisplay-dont-pause is not mentioned in the Emacs manual, (continued)
- [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual, Kim F. Storm, 2006/06/08
- Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual, Richard Stallman, 2006/06/09
- Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual, Jan Djärv, 2006/06/09
- Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual, Richard Stallman, 2006/06/10
- Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual, Kim F. Storm, 2006/06/10
- Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual, Richard Stallman, 2006/06/11
- Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual,
Kim F. Storm <=
- Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual, Richard Stallman, 2006/06/12
- Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual, Kim F. Storm, 2006/06/12
- Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual, Kim F. Storm, 2006/06/12
- Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual, Richard Stallman, 2006/06/13
- Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual, Jan Djärv, 2006/06/13
- Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual, Kim F. Storm, 2006/06/13
- Re: [PATCH] Re: redisplay-dont-pause is not mentioned in the Emacs manual, Richard Stallman, 2006/06/13