Author: matt
Date: 2008-02-20 09:59:13 -0800 (Wed, 20 Feb 2008)
New Revision: 6031
Log:
STR 1719: fixed inconsistencies with FL_WHEN_NOT_CHANGED

Modified:
   branches/branch-1.1/CHANGES
   branches/branch-1.1/FL/Fl_Input_Choice.H
   branches/branch-1.1/src/Fl_Button.cxx
   branches/branch-1.1/src/Fl_Input.cxx
   branches/branch-1.1/src/Fl_Input_.cxx

Modified: branches/branch-1.1/CHANGES
===================================================================
--- branches/branch-1.1/CHANGES 2008-02-20 17:42:08 UTC (rev 6030)
+++ branches/branch-1.1/CHANGES 2008-02-20 17:59:13 UTC (rev 6031)
@@ -6,6 +6,7 @@
          STR #1742, STR #1777, STR #1794, STR #1827, STR #1843,
          STR #1796, STR #1815, STR #1726, STR #1753, STR #1855,
          STR #1862, STR #1867, STR #1874)
+       - Fixed inconsistencies with CHANGED flags (STR #1719)
        - Fixed message sent to hidden widgets (STR #1849)
        - Fixed width calculation in Fl_Help_ViewA (STR #1868)
        - Fixed offset bug in OS X pixmap code (STR #1856)

Modified: branches/branch-1.1/FL/Fl_Input_Choice.H
===================================================================
--- branches/branch-1.1/FL/Fl_Input_Choice.H    2008-02-20 17:42:08 UTC (rev 
6030)
+++ branches/branch-1.1/FL/Fl_Input_Choice.H    2008-02-20 17:59:13 UTC (rev 
6031)
@@ -38,6 +38,7 @@
 #include <FL/Fl_Input.H>
 #include <FL/Fl_Menu_Button.H>
 #include <FL/fl_draw.H>
+#include <string.h>
 
 class Fl_Input_Choice : public Fl_Group {
   // Private class to handle slightly 'special' behavior of menu button
@@ -60,19 +61,41 @@
   static void menu_cb(Fl_Widget*, void *data) { 
     Fl_Input_Choice *o=(Fl_Input_Choice *)data;
     const Fl_Menu_Item *item = o->menubutton()->mvalue();
-    if ( item && item->flags & (FL_SUBMENU|FL_SUBMENU_POINTER) ) return;       
// ignore submenus
-    o->inp_->value(o->menu_->text());
-    o->inp_->set_changed();
-    o->do_callback();
+    if (item && item->flags & (FL_SUBMENU|FL_SUBMENU_POINTER)) return; // 
ignore submenus
+    if (!strcmp(o->inp_->value(), o->menu_->text()))
+    {
+      o->Fl_Widget::clear_changed();
+      if (o->when() & FL_WHEN_NOT_CHANGED)
+       o->do_callback();
+    }
+    else
+    {
+      o->inp_->value(o->menu_->text());
+      o->inp_->set_changed();
+      o->Fl_Widget::set_changed();
+      if (o->when() & (FL_WHEN_CHANGED|FL_WHEN_RELEASE))
+       o->do_callback();
+    }
+
+    if (o->callback() != default_callback)
+    {
+      o->Fl_Widget::clear_changed();
+      o->inp_->clear_changed();
+    }
   }
 
   static void inp_cb(Fl_Widget*, void *data) { 
     Fl_Input_Choice *o=(Fl_Input_Choice *)data;
-    if (o->inp_->changed()) 
+    if (o->inp_->changed()) {
       o->Fl_Widget::set_changed();
-    else
+      if (o->when() & (FL_WHEN_CHANGED|FL_WHEN_RELEASE))
+       o->do_callback();
+    } else {
       o->Fl_Widget::clear_changed();
-    o->do_callback();
+      if (o->when() & FL_WHEN_NOT_CHANGED)
+       o->do_callback();
+    }
+
     if (o->callback() != default_callback)
       o->Fl_Widget::clear_changed();
   }
@@ -96,6 +119,7 @@
                        inp_w(), inp_h());
     inp_->callback(inp_cb, (void*)this);
     inp_->box(FL_FLAT_BOX);            // cosmetic
+    inp_->when(FL_WHEN_CHANGED|FL_WHEN_NOT_CHANGED);
     menu_ = new InputMenuButton(menu_x(), menu_y(),
                                menu_w(), menu_h());
     menu_->callback(menu_cb, (void*)this);

Modified: branches/branch-1.1/src/Fl_Button.cxx
===================================================================
--- branches/branch-1.1/src/Fl_Button.cxx       2008-02-20 17:42:08 UTC (rev 
6030)
+++ branches/branch-1.1/src/Fl_Button.cxx       2008-02-20 17:59:13 UTC (rev 
6031)
@@ -85,7 +85,10 @@
       if (type() == FL_RADIO_BUTTON) newval = 1;
       else newval = !oldval;
     } else
+    {
+      clear_changed();
       newval = oldval;
+    }
     if (newval != value_) {
       value_ = newval;
       set_changed();
@@ -103,6 +106,7 @@
     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();

Modified: branches/branch-1.1/src/Fl_Input.cxx
===================================================================
--- branches/branch-1.1/src/Fl_Input.cxx        2008-02-20 17:42:08 UTC (rev 
6030)
+++ branches/branch-1.1/src/Fl_Input.cxx        2008-02-20 17:59:13 UTC (rev 
6031)
@@ -409,9 +409,10 @@
       // user double or triple clicked to select word or whole text
       copy(0);
     }
-    // For output widgets, do the callback so the app knows the user
-    // did something with the mouse...
-    if (readonly()) do_callback();
+
+    // perform the RELEASE callback
+    if (when() & FL_WHEN_RELEASE)
+      maybe_do_callback();
     return 1;
 
   case FL_DND_ENTER:

Modified: branches/branch-1.1/src/Fl_Input_.cxx
===================================================================
--- branches/branch-1.1/src/Fl_Input_.cxx       2008-02-20 17:42:08 UTC (rev 
6030)
+++ branches/branch-1.1/src/Fl_Input_.cxx       2008-02-20 17:59:13 UTC (rev 
6031)
@@ -715,7 +715,9 @@
     } else //if (Fl::selection_owner() != this)
       minimal_update(mark_, position_);
   case FL_HIDE:
-    if (when() & FL_WHEN_RELEASE) maybe_do_callback();
+    if (!readonly() &&
+       (when() & (FL_WHEN_RELEASE | FL_WHEN_NOT_CHANGED)))
+      maybe_do_callback();
     return 1;
 
   case FL_PUSH:

_______________________________________________
fltk-commit mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-commit

Reply via email to