[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] /srv/bzr/emacs/emacs-23 r100152: Backport fix for Bug#6571
From: |
Jan D. |
Subject: |
[Emacs-diffs] /srv/bzr/emacs/emacs-23 r100152: Backport fix for Bug#6571 from trunk. NOTE: May cause merge conflicts. |
Date: |
Mon, 01 Nov 2010 12:30:33 +0100 |
User-agent: |
Bazaar (2.0.3) |
------------------------------------------------------------
revno: 100152
committer: Jan D. <address@hidden>
branch nick: emacs-23
timestamp: Mon 2010-11-01 12:30:33 +0100
message:
Backport fix for Bug#6571 from trunk. NOTE: May cause merge conflicts.
* src/keyboard.c (input_available_signal): Declare.
(kbd_buffer_nr_stored): New function.
(kbd_buffer_store_event_hold): If kbd_buffer_nr_stored returns
more than KBD_BUFFER_SIZE/2, stop reding input (Bug#6571).
(kbd_buffer_get_event): If input is suspended and kbd_buffer_nr_stored
returns less than KBD_BUFFER_SIZE/4, resume reding input (Bug#6571).
(tty_read_avail_input): If input is on hold, return.
Don't read more that free slots in kbd_buffer (Bug#6571).
* src/process.c (kbd_is_on_hold): New variable.
(hold_keyboard_input, unhold_keyboard_input, kbd_on_hold_p):
New functions.
(wait_reading_process_output): If kbd_on_hold_p returns non-zero,
select on empty input mask.
(init_process): Initialize kbd_is_on_hold to 0.
* src/process.h (hold_keyboard_input, unhold_keyboard_input)
(kbd_on_hold_p): Declare.
modified:
src/ChangeLog
src/keyboard.c
src/process.c
src/process.h
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog 2010-10-31 03:33:56 +0000
+++ b/src/ChangeLog 2010-11-01 11:30:33 +0000
@@ -1,3 +1,24 @@
+2010-11-01 Jan Djärv <address@hidden>
+
+ * process.c (kbd_is_on_hold): New variable.
+ (hold_keyboard_input, unhold_keyboard_input, kbd_on_hold_p):
+ New functions.
+ (wait_reading_process_output): If kbd_on_hold_p returns non-zero,
+ select on empty input mask.
+ (init_process): Initialize kbd_is_on_hold to 0.
+
+ * process.h (hold_keyboard_input, unhold_keyboard_input)
+ (kbd_on_hold_p): Declare.
+
+ * keyboard.c (input_available_signal): Declare.
+ (kbd_buffer_nr_stored): New function.
+ (kbd_buffer_store_event_hold): If kbd_buffer_nr_stored returns
+ more than KBD_BUFFER_SIZE/2, stop reding input (Bug#6571).
+ (kbd_buffer_get_event): If input is suspended and kbd_buffer_nr_stored
+ returns less than KBD_BUFFER_SIZE/4, resume reding input (Bug#6571).
+ (tty_read_avail_input): If input is on hold, return.
+ Don't read more that free slots in kbd_buffer (Bug#6571).
+
2010-10-31 Chong Yidong <address@hidden>
* xterm.c (x_connection_closed): Print informative error message
=== modified file 'src/keyboard.c'
--- a/src/keyboard.c 2010-09-28 13:39:22 +0000
+++ b/src/keyboard.c 2010-11-01 11:30:33 +0000
@@ -642,6 +642,9 @@
static void clear_event P_ ((struct input_event *));
static Lisp_Object restore_kboard_configuration P_ ((Lisp_Object));
static SIGTYPE interrupt_signal P_ ((int signalnum));
+#ifdef SIGIO
+static SIGTYPE input_available_signal (int signo);
+#endif
static void handle_interrupt P_ ((void));
static void timer_start_idle P_ ((void));
static void timer_stop_idle P_ ((void));
@@ -3780,6 +3783,18 @@
return FRAME_KBOARD (XFRAME (frame));
}
+/* Return the number of slots occupied in kbd_buffer. */
+
+static int
+kbd_buffer_nr_stored (void)
+{
+ return kbd_fetch_ptr == kbd_store_ptr
+ ? 0
+ : (kbd_fetch_ptr < kbd_store_ptr
+ ? kbd_store_ptr - kbd_fetch_ptr
+ : ((kbd_buffer + KBD_BUFFER_SIZE) - kbd_fetch_ptr
+ + (kbd_store_ptr - kbd_buffer)));
+}
Lisp_Object Vthrow_on_input;
@@ -3903,6 +3918,17 @@
{
*kbd_store_ptr = *event;
++kbd_store_ptr;
+ if (kbd_buffer_nr_stored () > KBD_BUFFER_SIZE/2 && ! kbd_on_hold_p ())
+ {
+ /* Don't read keyboard input until we have processed kbd_buffer.
+ This happens when pasting text longer than KBD_BUFFER_SIZE/2. */
+ hold_keyboard_input ();
+#ifdef SIGIO
+ if (!noninteractive)
+ signal (SIGIO, SIG_IGN);
+#endif
+ stop_polling ();
+ }
}
/* If we're inside while-no-input, and this event qualifies
@@ -4071,6 +4097,18 @@
register int c;
Lisp_Object obj;
+ if (kbd_on_hold_p () && kbd_buffer_nr_stored () < KBD_BUFFER_SIZE/4)
+ {
+ /* Start reading input again, we have processed enough so we can
+ accept new events again. */
+ unhold_keyboard_input ();
+#ifdef SIGIO
+ if (!noninteractive)
+ signal (SIGIO, input_available_signal);
+#endif /* SIGIO */
+ start_polling ();
+ }
+
if (noninteractive
/* In case we are running as a daemon, only do this before
detaching from the terminal. */
@@ -7270,6 +7308,10 @@
int n_to_read, i;
struct tty_display_info *tty = terminal->display_info.tty;
int nread = 0;
+ int buffer_free = KBD_BUFFER_SIZE - kbd_buffer_nr_stored () - 1;
+
+ if (kbd_on_hold_p () || buffer_free <= 0)
+ return 0;
if (!terminal->name) /* Don't read from a dead terminal. */
return 0;
@@ -7351,6 +7393,10 @@
#endif
#endif
+ /* Don't read more than we can store. */
+ if (n_to_read > buffer_free)
+ n_to_read = buffer_free;
+
/* Now read; for one reason or another, this will not block.
NREAD is set to the number of chars read. */
do
=== modified file 'src/process.c'
--- a/src/process.c 2010-09-30 04:28:34 +0000
+++ b/src/process.c 2010-11-01 11:30:33 +0000
@@ -346,6 +346,9 @@
/* The largest descriptor currently in use for gpm mouse input. */
static int max_gpm_desc;
+/* Non-zero if keyboard input is on hold, zero otherwise. */
+static int kbd_is_on_hold;
+
/* Nonzero means delete a process right away if it exits. */
static int delete_exited_processes;
@@ -4795,7 +4798,11 @@
SELECT_TYPE Ctemp;
#endif
- Atemp = input_wait_mask;
+ if (kbd_on_hold_p ())
+ FD_ZERO (&Atemp);
+ else
+ Atemp = input_wait_mask;
+
IF_NON_BLOCKING_CONNECT (Ctemp = connect_wait_mask);
EMACS_SET_SECS_USECS (timeout, 0, 0);
@@ -7224,6 +7231,31 @@
return 0;
}
+
+/* Stop reading input from keyboard sources. */
+
+void
+hold_keyboard_input (void)
+{
+ kbd_is_on_hold = 1;
+}
+
+/* Resume reading input from keyboard sources. */
+
+void
+unhold_keyboard_input (void)
+{
+ kbd_is_on_hold = 0;
+}
+
+/* Return non-zero if keyboard input is on hold, zero otherwise. */
+
+int
+kbd_on_hold_p (void)
+{
+ return kbd_is_on_hold;
+}
+
/* Enumeration of and access to system processes a-la ps(1). */
@@ -8039,6 +8071,7 @@
void
init_process ()
{
+ kbd_is_on_hold = 0;
}
void
=== modified file 'src/process.h'
--- a/src/process.h 2010-01-13 08:35:10 +0000
+++ b/src/process.h 2010-11-01 11:30:33 +0000
@@ -170,5 +170,9 @@
extern Lisp_Object list_system_processes (void);
extern Lisp_Object system_process_attributes (Lisp_Object);
+extern void hold_keyboard_input (void);
+extern void unhold_keyboard_input (void);
+extern int kbd_on_hold_p (void);
+
/* arch-tag: dffedfc4-d7bc-4b58-a26f-c16155449c72
(do not change this comment) */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] /srv/bzr/emacs/emacs-23 r100152: Backport fix for Bug#6571 from trunk. NOTE: May cause merge conflicts.,
Jan D. <=