Newsgroups: comp.windows.interviews
Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!sdd.hp.com!elroy.jpl.nasa.gov!decwrl!stanford.edu!cnm.us.es!juando
From: juando@cnm.us.es
Subject: "odd" Button state
Message-ID: <"<9105132259.AA23725@cnmus.cnm.us.es>
Sender: news@shelby.stanford.edu (USENET News System)
Organization: Internet-USENET Gateway at Stanford University
Date: Tue, 14 May 1991 04:58:36 GMT
Lines: 51

	Playing with alert, I found that if you press and hold any mouse button
outside the screen button and then move the pointer inside it and release, the
button enters an "odd" state: Although no mouse button is pressed, it is
highlighted whenever the pointer enters it. Looking at the code that implements
Button class you can see that it is "swallowing" mouse events. I could fix
that with the patch that follows, but I'm not sure if that is the desired
behavior for Button. Can you tell me if this is right?

Juan.

Apply with patch -p -N at the top level source directory

*** iv/src/lib/IV-look/button.c.orig	Thu Jan 24 21:59:00 1991
--- iv/src/lib/IV-look/button.c	Mon May 13 21:53:54 1991
***************
*** 60,74 ****
  }
  
  void Button::event(Event& e) {
      listener_->sensor()->motion(true);
      do {
!         if (listener_->picks(e.pointer_x(), e.pointer_y())) {
              if (telltale_ != nil) {
-                 telltale_->highlight(true);
-             }
-         } else {
-             if (telltale_ != nil) {
                  telltale_->highlight(false);
              }
          }
  	e.world()->read(e);
--- 60,78 ----
  }
  
  void Button::event(Event& e) {
+     if (e.type() != Event::down) {
+ 	return;
+     }
+     if (telltale_ != nil) {
+ 	telltale_->highlight(true);
+     }
      listener_->sensor()->motion(true);
      do {
!         if (!listener_->picks(e.pointer_x(), e.pointer_y())) {
              if (telltale_ != nil) {
                  telltale_->highlight(false);
+ 		listener_->sensor()->motion(false);
+ 		return;
              }
          }
  	e.world()->read(e);
