diff options
author | Karoly Lorentey <[email protected]> | 2006-06-27 15:06:36 +0000 |
---|---|---|
committer | Karoly Lorentey <[email protected]> | 2006-06-27 15:06:36 +0000 |
commit | 556b89447234f15d1784a23dadbfe429464463a8 (patch) | |
tree | d5b94bbdde7b399bb0ffdf03a01f3e8398ee0afa /src/dispnew.c | |
parent | 476e9367ec1f440aa23904b7bc482ea4a3b8041c (diff) | |
parent | 08b1eb21d5a3f935eb245acf0844a19acc42f57c (diff) |
Merged from [email protected]
Patches applied:
* [email protected]/emacs--devo--0--patch-305
Update from CVS
* [email protected]/emacs--devo--0--patch-306
Update from CVS
* [email protected]/emacs--devo--0--patch-307
Update from CVS: lispref/display.texi (Forcing Redisplay): Fix typo.
* [email protected]/emacs--devo--0--patch-308
Update from CVS
* [email protected]/emacs--devo--0--patch-309
Update from CVS
* [email protected]/emacs--devo--0--patch-310
Update from CVS
* [email protected]/emacs--devo--0--patch-311
Update from CVS
* [email protected]/emacs--devo--0--patch-312
Update from CVS
* [email protected]/emacs--devo--0--patch-313
Merge from gnus--rel--5.10
* [email protected]/emacs--devo--0--patch-314
Update from CVS
* [email protected]/emacs--devo--0--patch-315
Update from CVS
* [email protected]/emacs--devo--0--patch-316
Update from CVS
* [email protected]/emacs--devo--0--patch-317
Merge from gnus--rel--5.10
* [email protected]/emacs--devo--0--patch-318
Update from CVS
* [email protected]/emacs--devo--0--patch-319
Update from CVS
* [email protected]/emacs--devo--0--patch-320
Update from CVS
* [email protected]/emacs--devo--0--patch-321
Merge from gnus--rel--5.10
* [email protected]/emacs--devo--0--patch-322
Update from CVS
* [email protected]/emacs--devo--0--patch-323
lisp/play/cookie1.el (cookie): Work properly when there's only one entry
* [email protected]/emacs--devo--0--patch-324
Update from CVS
* [email protected]/emacs--devo--0--patch-325
Update from CVS
* [email protected]/emacs--devo--0--patch-326
Update from CVS
* [email protected]/emacs--devo--0--patch-327
Update from CVS
* [email protected]/emacs--devo--0--patch-328
Update from CVS
* [email protected]/emacs--devo--0--patch-329
Update from CVS
* [email protected]/emacs--devo--0--patch-330
Update from CVS
* [email protected]/gnus--rel--5.10--patch-105
Update from CVS
* [email protected]/gnus--rel--5.10--patch-106
Update from CVS
* [email protected]/gnus--rel--5.10--patch-107
Update from CVS
* [email protected]/gnus--rel--5.10--patch-108
Merge from emacs--devo--0
* [email protected]/gnus--rel--5.10--patch-109
Clean up merge mistakes
* [email protected]/gnus--rel--5.10--patch-110
Update from CVS
git-archimport-id: [email protected]/emacs--multi-tty--0--patch-571
Diffstat (limited to 'src/dispnew.c')
-rw-r--r-- | src/dispnew.c | 133 |
1 files changed, 124 insertions, 9 deletions
diff --git a/src/dispnew.c b/src/dispnew.c index c346e94a10..4f63bfa857 100644 --- a/src/dispnew.c +++ b/src/dispnew.c @@ -192,6 +192,28 @@ struct window *frame_row_to_window P_ ((struct window *, int)); int redisplay_dont_pause; +/* Define PERIODIC_PREEMPTION_CHECKING to 1, if micro-second timers + are supported, so we can check for input during redisplay at + regular intervals. */ +#ifdef EMACS_HAS_USECS +#define PERIODIC_PREEMPTION_CHECKING 1 +#else +#define PERIODIC_PREEMPTION_CHECKING 0 +#endif + +#if PERIODIC_PREEMPTION_CHECKING + +/* 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. */ @@ -3814,6 +3836,28 @@ update_frame (f, force_p, inhibit_hairy_id_p) int paused_p; struct window *root_window = XWINDOW (f->root_window); +#if PERIODIC_PREEMPTION_CHECKING + if (!force_p && NUMBERP (Vredisplay_preemption_period)) + { + EMACS_TIME tm; + double p = XFLOATINT (Vredisplay_preemption_period); + int sec, usec; + + if (detect_input_pending_ignore_squeezables ()) + { + paused_p = 1; + goto do_pause; + } + + 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 @@ -3895,6 +3939,7 @@ update_frame (f, force_p, inhibit_hairy_id_p) #endif } + do_pause: /* Reset flags indicating that a window should be updated. */ set_window_update_flags (root_window, 0); @@ -3949,6 +3994,22 @@ update_single_window (w, force_p) /* Record that this is not a frame-based redisplay. */ set_frame_matrix_frame (NULL); +#if PERIODIC_PREEMPTION_CHECKING + 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); @@ -4108,7 +4169,9 @@ update_window (w, force_p) { struct glyph_matrix *desired_matrix = w->desired_matrix; int paused_p; +#if !PERIODIC_PREEMPTION_CHECKING int preempt_count = baud_rate / 2400 + 1; +#endif extern int input_pending; extern Lisp_Object do_mouse_tracking; struct redisplay_interface *rif = FRAME_RIF (XFRAME (WINDOW_FRAME (w))); @@ -4120,8 +4183,13 @@ update_window (w, force_p) /* Check pending input the first time so that we can quickly return. */ if (redisplay_dont_pause) force_p = 1; - else +#if PERIODIC_PREEMPTION_CHECKING + else if (NILP (Vredisplay_preemption_period)) + force_p = 1; +#else + 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. */ @@ -4193,9 +4261,23 @@ update_window (w, force_p) detect_input_pending. If it's done too often, scrolling large windows with repeated scroll-up commands will too quickly pause redisplay. */ +#if PERIODIC_PREEMPTION_CHECKING + 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); + if (detect_input_pending_ignore_squeezables ()) + break; + } + } +#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); @@ -5151,11 +5233,16 @@ update_frame_1 (f, force_p, inhibit_id_p) if (redisplay_dont_pause) force_p = 1; +#if PERIODIC_PREEMPTION_CHECKING + else if (NILP (Vredisplay_preemption_period)) + force_p = 1; +#else 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 (!FRAME_LINE_INS_DEL_OK (f)) @@ -5206,8 +5293,23 @@ update_frame_1 (f, force_p, inhibit_id_p) } } - if ((i - 1) % preempt_count == 0) +#if PERIODIC_PREEMPTION_CHECKING + 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); + if (detect_input_pending_ignore_squeezables ()) + break; + } + } +#else + if (!force_p && (i - 1) % preempt_count == 0) detect_input_pending_ignore_squeezables (); +#endif update_frame_line (f, i); } @@ -6434,15 +6536,22 @@ Lisp_Object sit_for (sec, usec, reading, display, initial_display) int sec, usec, reading, display, initial_display; { + int preempt = (sec >= 0) || (sec == 0 && usec >= 0); + swallow_events (display); - if ((detect_input_pending_run_timers (display) - && !redisplay_dont_pause) + if ((detect_input_pending_run_timers (display) && preempt) || !NILP (Vexecuting_kbd_macro)) return Qnil; if (initial_display) - redisplay_preserve_echo_area (2); + { + int count = SPECPDL_INDEX (); + if (!preempt) + specbind (Qredisplay_dont_pause, Qt); + redisplay_preserve_echo_area (2); + unbind_to (count, Qnil); + } if (sec == 0 && usec == 0) return Qt; @@ -6468,8 +6577,7 @@ Redisplay is preempted as always if input arrives, and does not happen if input is available before it starts. Value is t if waited the full time with no input arriving. -Redisplay will occur even when input is available if you bind -`redisplay-dont-pause' to a non-nil value. +Redisplay will occur even when input is available if SECONDS is negative. An obsolete but still supported form is \(sit-for SECONDS &optional MILLISECONDS NODISP) @@ -7000,7 +7108,14 @@ See `buffer-display-table' for more information. */); 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. */ +#if PERIODIC_PREEMPTION_CHECKING + 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 |