steve@HPLSG.HP.COM (Steve Greenbaum) (09/22/89)
Hello, Function x-get-mouse-event in file x11fns.c in 18.55 has an "Fcond" that should be "Fcons": Vx_mouse_abs_pos = Fcond (tempx, Fcons (tempy, Qnil)); ^ There are a few more problems. One is an inconsistency with x-proc-mouse-event in the way the meta bit is coded. The most serious problem results from this piece of code: if (NULL (arg)) while (!XXm_queue_num) sleep(1); /*** ??? Surely you don't mean to busy wait??? */ I don't know the details of emacs' interrupt handling, but exercising this code, done with "(x-get-mouse-event nil)", hangs emacs. The button handling in x11term.c does increment XXm_queue_num, but it acts as if it is not getting called. Perhaps It is relevant that I am running HPUX 6.5 on an HP 9000/370. I changed sleep to Fsit_for, which works ok if no keypress occurs between the call to x-get-mouse-event (with nil) and the mouse click. But if you press a key before clicking the mouse, it hangs. Below in my version of x-get-mouse-event, and below that is a a diff of my x11fns.c with the 18.55's (I call it x11fns.c-dist). ++++++++++++++++++++ New version of x-get-mouse-event ++++++++++++++++++++++++ DEFUN ("x-get-mouse-event", Fx_get_mouse_event, Sx_get_mouse_event, 1, 1, 0, "Get next mouse event out of mouse event buffer (com-letter (x y)).\n\ ARG non-nil means return nil immediately if no pending event;\n\ otherwise, wait for an event.") (arg) Lisp_Object arg; { XEvent event; register char com_letter; register char key_mask; register Lisp_Object tempx; register Lisp_Object tempy; check_xterm (); if (NULL (arg)) while (!XXm_queue_num) /* Bug: if a non-mouse event (from keyboard) occurs */ /* before the mouse event, this hangs. */ Fsit_for(1, Qnil); /* This always hangs: sleep(1); */ /*** ??? 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; /* Report meta in 2 bit, not in 8 bit. */ if (key_mask & 0x80) { key_mask |= 0x20; 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_root); XSET (tempy, Lisp_Int, event.xbutton.y_root); Vx_mouse_abs_pos = Fcons (tempx, Fcons (tempy, Qnil)); Vx_mouse_item = make_number (com_letter); return Fcons (com_letter, Fcons (Vx_mouse_pos, Qnil)); } return Qnil; } ++++++++++++++++++ diff -c x11fns.c x11fns.c-dist +++++++++++++++++++++++++++ *** x11fns.c Thu Sep 21 09:05:14 1989 --- x11fns.c-dist Thu Sep 21 08:28:53 1989 *************** *** 610,618 **** if (NULL (arg)) while (!XXm_queue_num) ! /* Bug: if a non-mouse event (from keyboard) occurs */ ! /* before the mouse event, this hangs. */ ! Fsit_for(1, Qnil); /* This always hangs: sleep(1); */ /*** ??? Surely you don't mean to busy wait??? */ if (XXm_queue_num) { --- 610,616 ---- if (NULL (arg)) while (!XXm_queue_num) ! sleep(1); /*** ??? Surely you don't mean to busy wait??? */ if (XXm_queue_num) { *************** *** 622,633 **** 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) - { - key_mask |= 0x20; - key_mask &= ~0x80; - } com_letter |= key_mask; if (event.type == ButtonRelease) com_letter |= 0x04; --- 620,625 ---- *************** *** 642,649 **** Vx_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil)); XSET (tempx, Lisp_Int, event.xbutton.x_root); XSET (tempy, Lisp_Int, event.xbutton.y_root); ! Vx_mouse_abs_pos = Fcons (tempx, Fcons (tempy, Qnil)); ! Vx_mouse_item = make_number (com_letter); return Fcons (com_letter, Fcons (Vx_mouse_pos, Qnil)); } return Qnil; --- 634,640 ---- Vx_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil)); XSET (tempx, Lisp_Int, event.xbutton.x_root); XSET (tempy, Lisp_Int, event.xbutton.y_root); ! Vx_mouse_abs_pos = Fcond (tempx, Fcons (tempy, Qnil)); return Fcons (com_letter, Fcons (Vx_mouse_pos, Qnil)); } return Qnil; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Thanks, -Steve Steve Greenbaum HP Labs 3500 Deer Creek Road Palo Alto, CA 94304 (415) 857-5181 greenbaum@hplabs.hp.com