summaryrefslogtreecommitdiff
path: root/src/xterm.c
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1993-03-08 05:38:53 +0000
committerRichard M. Stallman <rms@gnu.org>1993-03-08 05:38:53 +0000
commit10e6549c5f805d026a44988da71d3cc88226bee1 (patch)
tree29f37f5660d43c1c9bc54dd4f01006c3a0b80a04 /src/xterm.c
parentd63de416be4b4732ff5307ac62c3ff3d057df4d9 (diff)
downloademacs-10e6549c5f805d026a44988da71d3cc88226bee1.tar.gz
(XTread_socket):
Don't reverse the chars that XLookupString returns. Use all of them. Save last 100 chars and keysyms in temp_buffer.
Diffstat (limited to 'src/xterm.c')
-rw-r--r--src/xterm.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/src/xterm.c b/src/xterm.c
index 5ccb3c49525..57028257e0e 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -2435,6 +2435,11 @@ Atom Xatom_wm_delete_window;
Atom Xatom_wm_configure_denied; /* When our config request is denied */
Atom Xatom_wm_window_moved; /* When the WM moves us. */
+/* Record the last 100 characters stored
+ to help debug the loss-of-chars-during-GC problem. */
+int temp_index;
+short temp_buffer[100];
+
/* Read events coming from the X server.
This routine is called by the SIGIO handler.
We return as soon as there are no more events to be read.
@@ -2749,6 +2754,9 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
|| IsKeypadKey (keysym) /* 0xff80 <= x < 0xffbe */
|| IsFunctionKey (keysym)) /* 0xffbe <= x < 0xffe1 */
{
+ if (temp_index == sizeof temp_buffer / sizeof (short))
+ temp_index = 0;
+ temp_buffer[temp_index++] = keysym;
bufp->kind = non_ascii_keystroke;
XSET (bufp->code, Lisp_Int, (unsigned) keysym - 0xff00);
XSET (bufp->frame_or_window, Lisp_Frame, f);
@@ -2762,30 +2770,27 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
{
register int i;
- if (nbytes == 1)
+ for (i = 0; i < nbytes; i++)
{
+ if (temp_index == sizeof temp_buffer / sizeof (short))
+ temp_index = 0;
+ temp_buffer[temp_index++] = copy_buffer[i];
bufp->kind = ascii_keystroke;
- XSET (bufp->code, Lisp_Int, *copy_buffer);
+ XSET (bufp->code, Lisp_Int, copy_buffer[i]);
XSET (bufp->frame_or_window, Lisp_Frame, f);
bufp->modifiers = x_convert_modifiers (modifiers);
bufp->timestamp = event.xkey.time;
bufp++;
}
- else
- for (i = nbytes - 1; i > 1; i--)
- {
- bufp->kind = ascii_keystroke;
- XSET (bufp->code, Lisp_Int, copy_buffer[i]);
- XSET (bufp->frame_or_window, Lisp_Frame, f);
- bufp->modifiers = x_convert_modifiers (modifiers);
- bufp->timestamp = event.xkey.time;
- bufp++;
- }
count += nbytes;
numchars -= nbytes;
}
+ else
+ abort ();
}
+ else
+ abort ();
}
break;
#else /* ! defined (HAVE_X11) */