Author: matt
Date: 2011-01-10 08:27:25 -0800 (Mon, 10 Jan 2011)
New Revision: 8242
Log:
Virtual wrapping seems to work now.

Modified:
   branches/branch-3.0-2011/fltk3/Wrapper.h
   branches/branch-3.0-2011/src/Fl_Widget.cxx

Modified: branches/branch-3.0-2011/fltk3/Wrapper.h
===================================================================
--- branches/branch-3.0-2011/fltk3/Wrapper.h    2011-01-10 14:02:38 UTC (rev 
8241)
+++ branches/branch-3.0-2011/fltk3/Wrapper.h    2011-01-10 16:27:25 UTC (rev 
8242)
@@ -31,6 +31,52 @@
 #ifndef FLTK3_Wrapper_H
 #define FLTK3_Wrapper_H
 
+#define FLTK3_WRAPPER_VCALLS_OBJECT(proto, call, flag) \
+  virtual void proto { \
+    if ( pVCalls & pVCallWidget##flag ) { \
+    } else { \
+      pVCalls |= pVCallWidget##flag; \
+      ((fltk3::Widget*)_p)->call; \
+      pVCalls &= ~pVCallWidget##flag; \
+    } \
+  }
+
+#define FLTK3_OBJECT_VCALLS_WRAPPER(call, flag) \
+  if (pWrapper) { \
+    if ( pWrapper->pVCalls & Wrapper::pVCallWidget##flag ) { \
+    } else { \
+      pWrapper->pVCalls |= Wrapper::pVCallWidgetResize; \
+      ((WidgetWrapper*)pWrapper)->call; \
+      if ( !(pWrapper->pVCalls & Wrapper::pVCallWidget##flag) ) \
+        return; \
+    } \
+    pWrapper->pVCalls &= ~Wrapper::pVCallWidgetResize; \
+  }
+
+#define FLTK3_WRAPPER_VCALLS_OBJECT_INT(proto, call, flag) \
+  virtual int proto { \
+    int ret = 0; \
+    if ( pVCalls & pVCallWidget##flag ) { \
+    } else { \
+      pVCalls |= pVCallWidget##flag; \
+      ret = ((fltk3::Widget*)_p)->call; \
+      pVCalls &= ~pVCallWidget##flag; \
+    } \
+    return ret; \
+  }
+
+#define FLTK3_OBJECT_VCALLS_WRAPPER_INT(call, flag) \
+  if (pWrapper) { \
+    if ( pWrapper->pVCalls & Wrapper::pVCallWidget##flag ) { \
+    } else { \
+      pWrapper->pVCalls |= Wrapper::pVCallWidgetResize; \
+      int ret = ((WidgetWrapper*)pWrapper)->call; \
+      if ( !(pWrapper->pVCalls & Wrapper::pVCallWidget##flag) ) \
+        return ret; \
+    } \
+    pWrapper->pVCalls &= ~Wrapper::pVCallWidgetResize; \
+  }
+
 namespace fltk3 {
   
   class Object; 
@@ -43,7 +89,7 @@
     Object *_p;
   public:
     Wrapper() 
-    : _p(0L) { }
+    : _p(0L), pVCalls(0) { }
     virtual ~Wrapper() { }
     
     unsigned int pVCalls;
@@ -52,7 +98,7 @@
     static const unsigned int pVCallWidgetResize = 1<<2;
     static const unsigned int pVCallWidgetShow   = 1<<3;
     static const unsigned int pVCallWidgetHide   = 1<<4;
-    
+
     virtual void draw() { /* call _p->draw() with a flag set */ }
   };
   
@@ -60,32 +106,21 @@
   class WidgetWrapper : public Wrapper {
   public:
     virtual ~WidgetWrapper() {}
-    virtual void draw() {
-      pVCalls |= pVCallWidgetDraw;
-      ((fltk3::Widget*)_p)->draw();
-      pVCalls &= ~pVCallWidgetDraw;
-    }
-    virtual int handle(int event) { 
-      pVCalls |= pVCallWidgetHandle;
-      int ret = ((fltk3::Widget*)_p)->handle(event);
-      pVCalls &= ~pVCallWidgetHandle;
-      return ret;
-    }
-    virtual void resize(int x, int y, int w, int h) {
-      pVCalls |= pVCallWidgetResize;
-      ((fltk3::Widget*)_p)->resize(x, y, w, h);
-      pVCalls &= ~pVCallWidgetResize;
-    }
-    virtual void show() {
-      pVCalls |= pVCallWidgetShow;
-      ((fltk3::Widget*)_p)->show();
-      pVCalls &= ~pVCallWidgetShow;
-    }
-    virtual void hide() {
-      pVCalls |= pVCallWidgetHide;
-      ((fltk3::Widget*)_p)->hide();
-      pVCalls &= ~pVCallWidgetHide;
-    }
+    FLTK3_WRAPPER_VCALLS_OBJECT(draw(),
+                                draw(),
+                                Draw)
+    FLTK3_WRAPPER_VCALLS_OBJECT_INT(handle(int event),
+                                handle(event),
+                                Handle)
+    FLTK3_WRAPPER_VCALLS_OBJECT(resize(int x, int y, int w, int h),
+                                resize(x, y, w, h),
+                                Resize)
+    FLTK3_WRAPPER_VCALLS_OBJECT(show(),
+                                show(),
+                                Show)
+    FLTK3_WRAPPER_VCALLS_OBJECT(hide(),
+                                hide(),
+                                Hide)
   };
   
   

Modified: branches/branch-3.0-2011/src/Fl_Widget.cxx
===================================================================
--- branches/branch-3.0-2011/src/Fl_Widget.cxx  2011-01-10 14:02:38 UTC (rev 
8241)
+++ branches/branch-3.0-2011/src/Fl_Widget.cxx  2011-01-10 16:27:25 UTC (rev 
8242)
@@ -105,14 +105,7 @@
 ////////////////////////////////////////////////////////////////
 
 int fltk3::Widget::handle(int event) {
-  if (pWrapper) {
-    int ret = 0;
-    if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetHandle) )
-      ret = ((WidgetWrapper*)pWrapper)->handle(event);
-    if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetHandle) )
-      return ret;
-    pWrapper->pVCalls &= ~Wrapper::pVCallWidgetHandle;
-  }
+  FLTK3_OBJECT_VCALLS_WRAPPER_INT(handle(event), Handle);
   return 0;
 }
 
@@ -147,15 +140,7 @@
 }
 
 void fltk3::Widget::resize(int X, int Y, int W, int H) {
-  /*
-  if (pWrapper) {
-    if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetResize) )
-      ((WidgetWrapper*)pWrapper)->resize(X, Y, W, H);
-    if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetResize) )
-      return;
-    pWrapper->pVCalls &= ~Wrapper::pVCallWidgetResize;
-  }
-  */
+  FLTK3_OBJECT_VCALLS_WRAPPER(resize(X, Y, W, H), Resize);
   x_ = X; y_ = Y; w_ = W; h_ = H;
 }
 
@@ -277,13 +262,7 @@
 }
 
 void fltk3::Widget::show() {
-  if (pWrapper) {
-    if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetShow) )
-      ((WidgetWrapper*)pWrapper)->show();
-    if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetShow) )
-      return;
-    pWrapper->pVCalls &= ~Wrapper::pVCallWidgetShow;
-  }
+  FLTK3_OBJECT_VCALLS_WRAPPER(show(), Show);
   if (!visible()) {
     clear_flag(INVISIBLE);
     if (visible_r()) {
@@ -296,6 +275,7 @@
 }
 
 void fltk3::Widget::hide() {
+  FLTK3_OBJECT_VCALLS_WRAPPER(hide(), Hide);
   if (pWrapper) {
     if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetHide) )
       ((WidgetWrapper*)pWrapper)->hide();
@@ -373,13 +353,7 @@
 }
 
 void fltk3::Widget::draw() {
-  if (pWrapper) {
-    if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetDraw) )
-      pWrapper->draw();
-    if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetDraw) )
-      return;
-    pWrapper->pVCalls &= ~Wrapper::pVCallWidgetDraw;
-  }
+  FLTK3_OBJECT_VCALLS_WRAPPER(draw(), Draw);
   draw_box();
   draw_label();
 }

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

Reply via email to