[3667] in Athena Bugs

home help back first fref pref prev next nref lref last post

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);

home help back first fref pref prev next nref lref last post