Author: AlbrechtS
Date: 2010-03-27 09:35:14 -0700 (Sat, 27 Mar 2010)
New Revision: 7347
Log:
Replaced Fl::readqueue() in fl_color_chooser() by real callbacks.


Modified:
   branches/branch-1.3/src/Fl_Color_Chooser.cxx

Modified: branches/branch-1.3/src/Fl_Color_Chooser.cxx
===================================================================
--- branches/branch-1.3/src/Fl_Color_Chooser.cxx        2010-03-27 09:09:17 UTC 
(rev 7346)
+++ branches/branch-1.3/src/Fl_Color_Chooser.cxx        2010-03-27 16:35:14 UTC 
(rev 7347)
@@ -516,7 +516,7 @@
           h()-Fl::box_dh(box()),r,g,b);
 }
 
-static void chooser_cb(Fl_Object* o, void* vv) {
+static void chooser_cb(Fl_Widget* o, void* vv) {
   Fl_Color_Chooser* c = (Fl_Color_Chooser*)o;
   ColorChip* v = (ColorChip*)vv;
   v->r = uchar(255*c->r()+.5);
@@ -528,6 +528,27 @@
 extern const char* fl_ok;
 extern const char* fl_cancel;
 
+// fl_color_chooser's callback for ok_button (below)
+//  [in] o is a pointer to okay_button (below) 
+//  [in] p is a pointer to an int to receive the return value (1)
+// closes the fl_color_chooser window
+static void cc_ok_cb (Fl_Widget *o, void *p) {
+  *((int *)p) = 1; // set return value
+  o->window()->hide();
+}
+
+// fl_color_chooser's callback for cancel_button and window close
+//  [in] o is a pointer to cancel_button (below) _or_ the dialog window
+//  [in] p is a pointer to an int to receive the return value (0)
+// closes the fl_color_chooser window
+static void cc_cancel_cb (Fl_Widget *o, void *p) {
+  *((int *)p) = 0; // set return value
+  if (o->window()) // cancel button
+    o->window()->hide();
+  else // window close
+    o->hide();
+}
+
 /** \addtogroup  group_comdlg 
     @{ */
 /**
@@ -541,15 +562,19 @@
   \relates Fl_Color_Chooser
  */
 int fl_color_chooser(const char* name, double& r, double& g, double& b) {
+  int ret = 0;
   Fl_Window window(215,200,name);
+  window.callback(cc_cancel_cb,&ret);
   Fl_Color_Chooser chooser(10, 10, 195, 115);
   ColorChip ok_color(10, 130, 95, 25);
   Fl_Return_Button ok_button(10, 165, 95, 25, fl_ok);
+  ok_button.callback(cc_ok_cb,&ret);
   ColorChip cancel_color(110, 130, 95, 25);
   cancel_color.r = uchar(255*r+.5); ok_color.r = cancel_color.r;
   ok_color.g = cancel_color.g = uchar(255*g+.5);
   ok_color.b = cancel_color.b = uchar(255*b+.5);
   Fl_Button cancel_button(110, 165, 95, 25, fl_cancel);
+  cancel_button.callback(cc_cancel_cb,&ret);
   window.resizable(chooser);
   chooser.rgb(r,g,b);
   chooser.callback(chooser_cb, &ok_color);
@@ -557,21 +582,13 @@
   window.set_modal();
   window.hotspot(window);
   window.show();
-  while (window.shown()) {
-    Fl::wait();
-    for (;;) {
-      Fl_Widget* o = Fl::readqueue();
-      if (!o) break;
-      if (o == &ok_button) {
-       r = chooser.r();
-       g = chooser.g();
-       b = chooser.b();
-       return 1;
-      }
-      if (o == &window || o == &cancel_button) return 0;
-    }
+  while (window.shown()) Fl::wait();
+  if (ret) { // ok_button or Enter
+    r = chooser.r();
+    g = chooser.g();
+    b = chooser.b();
   }
-  return 0;
+  return ret;
 }
 
 /**

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

Reply via email to