DO NOT REPLY TO THIS MESSAGE.  INSTEAD, POST ANY RESPONSES TO THE LINK BELOW.

[STR New]

Link: http://www.fltk.org/str.php?L2026
Version: 1.3-current





Link: http://www.fltk.org/str.php?L2026
Version: 1.3-current
Index: Fl_Button.cxx
===================================================================
--- Fl_Button.cxx       (révision 6542)
+++ Fl_Button.cxx       (copie de travail)
@@ -84,88 +84,125 @@
 int Fl_Button::handle(int event) {
   int newval;
   switch (event) {
-  case FL_ENTER:
-  case FL_LEAVE:
-//  if ((value_?selection_color():color())==FL_GRAY) redraw();
-    return 1;
-  case FL_PUSH:
-    if (Fl::visible_focus() && handle(FL_FOCUS)) Fl::focus(this);
-  case FL_DRAG:
-    if (Fl::event_inside(this)) {
-      if (type() == FL_RADIO_BUTTON) newval = 1;
-      else newval = !oldval;
-    } else
-    {
-      clear_changed();
-      newval = oldval;
-    }
-    if (newval != value_) {
-      value_ = newval;
+    case FL_ENTER:
+    case FL_LEAVE:
+      //  if ((value_?selection_color():color())==FL_GRAY) redraw();
+      return 1;
+    case FL_PUSH:
+      if (Fl::visible_focus() && handle(FL_FOCUS)) Fl::focus(this);
+    case FL_DRAG:
+      if (Fl::event_inside(this)) {
+        if (type() == FL_RADIO_BUTTON) newval = 1;
+        else newval = !oldval;
+      } else
+      {
+        clear_changed();
+        newval = oldval;
+      }
+      if (newval != value_) {
+        value_ = newval;
+        set_changed();
+        redraw();
+        if (when() & FL_WHEN_CHANGED) do_callback();
+      }
+      return 1;
+    case FL_RELEASE:
+      if (value_ == oldval) {
+        if (when() & FL_WHEN_NOT_CHANGED) do_callback();
+        return 1;
+      }
       set_changed();
-      redraw();
-      if (when() & FL_WHEN_CHANGED) do_callback();
-    }
-    return 1;
-  case FL_RELEASE:
-    if (value_ == oldval) {
-      if (when() & FL_WHEN_NOT_CHANGED) do_callback();
+      if (type() == FL_RADIO_BUTTON) setonly();
+      else if (type() == FL_TOGGLE_BUTTON) oldval = value_;
+      else {
+        value(oldval);
+        set_changed();
+        if (when() & FL_WHEN_CHANGED) do_callback();
+      }
+      if (when() & FL_WHEN_RELEASE) do_callback();
       return 1;
-    }
-    set_changed();
-    if (type() == FL_RADIO_BUTTON) setonly();
-    else if (type() == FL_TOGGLE_BUTTON) oldval = value_;
-    else {
-      value(oldval);
-      set_changed();
-      if (when() & FL_WHEN_CHANGED) do_callback();
-    }
-    if (when() & FL_WHEN_RELEASE) do_callback();
-    return 1;
-  case FL_SHORTCUT:
-    if (!(shortcut() ?
-         Fl::test_shortcut(shortcut()) : test_shortcut())) return 0;
-    
-    if (Fl::visible_focus() && handle(FL_FOCUS)) Fl::focus(this);
+    case FL_SHORTCUT:
+      if (!(shortcut() ?
+            Fl::test_shortcut(shortcut()) : test_shortcut())) return 0;
 
-    if (type() == FL_RADIO_BUTTON && !value_) {
-      setonly();
-      set_changed();
-      if (when() & FL_WHEN_CHANGED) do_callback();
-    } else if (type() == FL_TOGGLE_BUTTON) {
-      value(!value());
-      set_changed();
-      if (when() & FL_WHEN_CHANGED) do_callback();
-    } else if (when() & FL_WHEN_RELEASE) do_callback();
-    return 1;
-  case FL_FOCUS :
-  case FL_UNFOCUS :
-    if (Fl::visible_focus()) {
-      if (box() == FL_NO_BOX) {
-       // Widgets with the FL_NO_BOX boxtype need a parent to
-       // redraw, since it is responsible for redrawing the
-       // background...
-       int X = x() > 0 ? x() - 1 : 0;
-       int Y = y() > 0 ? y() - 1 : 0;
-       if (window()) window()->damage(FL_DAMAGE_ALL, X, Y, w() + 2, h() + 2);
-      } else redraw();
-      return 1;
-    } else return 0;
-  case FL_KEYBOARD :
-    if (Fl::focus() == this && Fl::event_key() == ' ' &&
-        !(Fl::event_state() & (FL_SHIFT | FL_CTRL | FL_ALT | FL_META))) {
-      set_changed();
+      if (Fl::visible_focus() && handle(FL_FOCUS)) Fl::focus(this);
+
       if (type() == FL_RADIO_BUTTON && !value_) {
-       setonly();
-       if (when() & FL_WHEN_CHANGED) do_callback();
+        setonly();
+        set_changed();
+        if (when() & FL_WHEN_CHANGED) do_callback();
       } else if (type() == FL_TOGGLE_BUTTON) {
-       value(!value());
-       if (when() & FL_WHEN_CHANGED) do_callback();
+        value(!value());
+        set_changed();
+        if (when() & FL_WHEN_CHANGED) do_callback();
+      } else if ( (type() == FL_NORMAL_BUTTON) && when()&FL_WHEN_CHANGED) {
+        //  Not already active by GUI push
+        if ( !value_ ) {
+          value_ = !oldval;
+          set_changed();
+          do_callback();
+        }
+      } else if (when() & FL_WHEN_RELEASE) do_callback();
+      return 1;
+    case FL_FOCUS :
+    case FL_UNFOCUS :
+      if (Fl::visible_focus()) {
+        if (box() == FL_NO_BOX) {
+          // Widgets with the FL_NO_BOX boxtype need a parent to
+          // redraw, since it is responsible for redrawing the
+          // background...
+          int X = x() > 0 ? x() - 1 : 0;
+          int Y = y() > 0 ? y() - 1 : 0;
+          if (window()) window()->damage(FL_DAMAGE_ALL, X, Y, w() + 2, h() + 
2);
+        } else redraw();
+        return 1;
+      } else return 0;
+    case FL_KEYBOARD :
+      if (Fl::focus() == this && Fl::event_key() == ' ' &&
+          !(Fl::event_state() & (FL_SHIFT | FL_CTRL | FL_ALT | FL_META))) {
+        set_changed();
+        if (type() == FL_RADIO_BUTTON && !value_) {
+          setonly();
+          if (when() & FL_WHEN_CHANGED) do_callback();
+        } else if (type() == FL_TOGGLE_BUTTON) {
+          value(!value());
+          if (when() & FL_WHEN_CHANGED) do_callback();
+        }
+        if (when() & FL_WHEN_RELEASE) do_callback();
+        return 1;
       }
-      if (when() & FL_WHEN_RELEASE) do_callback();
-      return 1;
-    }
-  default:
-    return 0;
+      return 0;
+
+    case FL_KEYUP :
+      if ( (type() == FL_NORMAL_BUTTON) && when()&FL_WHEN_CHANGED) {
+
+        int key = Fl::event_key();
+
+        // Check for a shortcut that includes state keys(FL_SHIFT, FL_CTRL or 
FL_ALT) and 
+        // the state key is released
+        if ( (shortcut()&FL_SHIFT && ((key == FL_Shift_L) || (key == 
FL_Shift_R))) ||
+             (shortcut()&FL_CTRL && ((key == FL_Control_L) || (key == 
FL_Control_R))) || 
+             (shortcut()&FL_ALT && ((key == FL_Alt_L) || (key == FL_Alt_R))) ) 
{
+          value(oldval);
+          set_changed();
+          do_callback();
+          return 0;   //  In case multiple shortcut keys are pressed that use 
state keys
+        }
+        // shortcut key alone
+        else if (  !(shortcut() ?  Fl::test_shortcut(shortcut()) : 
test_shortcut())) {
+          return 0;
+        }
+        // disable button
+        else if ( value_ ) {
+          value(oldval);
+          set_changed();
+          do_callback();
+          return 1;
+        }
+      }
+
+    default:
+      return 0;
   }
 }
 
_______________________________________________
fltk-bugs mailing list
fltk-bugs@easysw.com
http://lists.easysw.com/mailman/listinfo/fltk-bugs

Reply via email to