[3667] in Athena Bugs
patch for emacs X paste problem
daemon@ATHENA.MIT.EDU (John T Kohl)
Thu Nov 16 18:13:03 1989
Date: Thu, 16 Nov 89 18:12:13 EST
From: John T Kohl <jtkohl@ATHENA.MIT.EDU>
To: bugs@ATHENA.MIT.EDU
Here's a patch to fix the earlier reported problem with failure to paste
from ICCCM-compliant X programs
(applies to sources in emacsdev locker,
PARIS.MIT.EDU:/u2/projects/gnuemacs.devel):
*** x11fns.c.~1~ Thu Nov 16 17:25:24 1989
--- x11fns.c Thu Nov 16 18:11:35 1989
***************
*** 415,420 ****
--- 415,423 ----
return tem;
}
+ static XEvent last_event;
+ static int last_event_valid = 0;
+
DEFUN ("x-proc-mouse-event", Fx_proc_mouse_event, Sx_proc_mouse_event,
0, 0, 0,
"Pulls a mouse event out of the mouse event buffer and dispatches\n\
***************
*** 421,427 ****
the appropriate function to act upon this event.")
()
{
- XEvent event;
register Lisp_Object mouse_cmd;
register char com_letter;
register char key_mask;
--- 424,429 ----
***************
*** 433,444 ****
check_xterm ();
if (XXm_queue_num) {
! event = *XXm_queue[XXm_queue_out];
free (XXm_queue[XXm_queue_out]);
XXm_queue_out = (XXm_queue_out + 1) % XMOUSEBUFSIZE;
XXm_queue_num--;
! com_letter = 3-(event.xbutton.button & 3);
! key_mask = (event.xbutton.state & 15) << 4;
/* Report meta in 2 bit, not in 8 bit. */
if (key_mask & 0x80)
{
--- 435,447 ----
check_xterm ();
if (XXm_queue_num) {
! last_event = *XXm_queue[XXm_queue_out];
! last_event_valid = 1;
free (XXm_queue[XXm_queue_out]);
XXm_queue_out = (XXm_queue_out + 1) % XMOUSEBUFSIZE;
XXm_queue_num--;
! com_letter = 3-(last_event.xbutton.button & 3);
! key_mask = (last_event.xbutton.state & 15) << 4;
/* Report meta in 2 bit, not in 8 bit. */
if (key_mask & 0x80)
{
***************
*** 446,470 ****
key_mask &= ~0x80;
}
com_letter |= key_mask;
! if (event.type == ButtonRelease)
com_letter |= 0x04;
XSET (tempx, Lisp_Int,
min (screen_width-1,
! max (0, (event.xbutton.x-XXInternalBorder)/
XXfontw)));
XSET (tempy, Lisp_Int,
min (screen_height-1,
! max (0, (event.xbutton.y-XXInternalBorder)/
XXfonth)));
Vx_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil));
! /* XSET (tempx, Lisp_Int, event.xbutton.x+XXxoffset);
! * XSET (tempy, Lisp_Int, event.xbutton.y+XXyoffset);*/
Vx_mouse_abs_pos = Fcons (tempx, Fcons (tempy, Qnil));
Vx_mouse_item = make_number (com_letter);
mouse_cmd
= get_keyelt (access_keymap (MouseMap, com_letter));
if (NULL (mouse_cmd)) {
! if (event.type != ButtonRelease)
Ding ();
Vx_mouse_pos = Qnil;
}
--- 449,473 ----
key_mask &= ~0x80;
}
com_letter |= key_mask;
! if (last_event.type == ButtonRelease)
com_letter |= 0x04;
XSET (tempx, Lisp_Int,
min (screen_width-1,
! max (0, (last_event.xbutton.x-XXInternalBorder)/
XXfontw)));
XSET (tempy, Lisp_Int,
min (screen_height-1,
! max (0, (last_event.xbutton.y-XXInternalBorder)/
XXfonth)));
Vx_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil));
! /* XSET (tempx, Lisp_Int, last_event.xbutton.x+XXxoffset);
! * XSET (tempy, Lisp_Int, last_event.xbutton.y+XXyoffset);*/
Vx_mouse_abs_pos = Fcons (tempx, Fcons (tempy, Qnil));
Vx_mouse_item = make_number (com_letter);
mouse_cmd
= get_keyelt (access_keymap (MouseMap, com_letter));
if (NULL (mouse_cmd)) {
! if (last_event.type != ButtonRelease)
Ding ();
Vx_mouse_pos = Qnil;
}
***************
*** 482,488 ****
(arg)
Lisp_Object arg;
{
- XEvent event;
register char com_letter;
register char key_mask;
--- 485,490 ----
***************
*** 497,522 ****
/*** ??? Surely you don't mean to busy wait??? */
if (XXm_queue_num) {
! event = *XXm_queue[XXm_queue_out];
free (XXm_queue[XXm_queue_out]);
XXm_queue_out = (XXm_queue_out + 1) % XMOUSEBUFSIZE;
XXm_queue_num--;
! com_letter = 3-(event.xbutton.button & 3);
! key_mask = (event.xbutton.state & 15) << 4;
com_letter |= key_mask;
! if (event.type == ButtonRelease)
com_letter |= 0x04;
XSET (tempx, Lisp_Int,
min (screen_width-1,
! max (0, (event.xbutton.x-XXInternalBorder)/
XXfontw)));
XSET (tempy, Lisp_Int,
min (screen_height-1,
! max (0, (event.xbutton.y-XXInternalBorder)/
XXfonth)));
Vx_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil));
! /* XSET (tempx, Lisp_Int, event.xbutton.x+XXxoffset);
! * XSET (tempy, Lisp_Int, event.xbutton.y+XXyoffset);*/
Vx_mouse_abs_pos = Fcond (tempx, Fcons (tempy, Qnil));
return Fcons (com_letter, Fcons (Vx_mouse_pos, Qnil));
}
--- 499,525 ----
/*** ??? Surely you don't mean to busy wait??? */
if (XXm_queue_num) {
! last_event = *XXm_queue[XXm_queue_out];
! last_event_valid = 1;
free (XXm_queue[XXm_queue_out]);
XXm_queue_out = (XXm_queue_out + 1) % XMOUSEBUFSIZE;
XXm_queue_num--;
! com_letter = 3-(last_event.xbutton.button & 3);
! key_mask = (last_event.xbutton.state & 15) << 4;
com_letter |= key_mask;
! if (last_event.type == ButtonRelease)
com_letter |= 0x04;
XSET (tempx, Lisp_Int,
min (screen_width-1,
! max (0, (last_event.xbutton.x-XXInternalBorder)/
XXfontw)));
XSET (tempy, Lisp_Int,
min (screen_height-1,
! max (0, (last_event.xbutton.y-XXInternalBorder)/
XXfonth)));
Vx_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil));
! /* XSET (tempx, Lisp_Int, last_event.xbutton.x+XXxoffset);
! * XSET (tempy, Lisp_Int, last_event.xbutton.y+XXyoffset);*/
Vx_mouse_abs_pos = Fcond (tempx, Fcons (tempy, Qnil));
return Fcons (com_letter, Fcons (Vx_mouse_pos, Qnil));
}
***************
*** 587,597 ****
register Lisp_Object string;
BLOCK_INPUT_DECLARE ();
BLOCK_INPUT ();
/* XXX CurrentTime not valid here either? */
XXSelectionWaiting = 1;
XtGetSelectionValue(XXemacswidget, XA_PRIMARY, XA_STRING,
! EmacsGetSelection, 0, CurrentTime);
UNBLOCK_INPUT ();
XFlush(XXdisplay);
kill(XXpid, SIGIO);
--- 590,605 ----
register Lisp_Object string;
BLOCK_INPUT_DECLARE ();
+ if (!last_event_valid) {
+ string = make_string ("", 0);
+ return string;
+ }
+
BLOCK_INPUT ();
/* XXX CurrentTime not valid here either? */
XXSelectionWaiting = 1;
XtGetSelectionValue(XXemacswidget, XA_PRIMARY, XA_STRING,
! EmacsGetSelection, 0, last_event.xbutton.time);
UNBLOCK_INPUT ();
XFlush(XXdisplay);
kill(XXpid, SIGIO);